runtime: add definitions for bshell vm bytecode

This commit is contained in:
2026-05-17 15:33:20 +01:00
parent 1f8b9ff0d3
commit 2cee984092
2 changed files with 108 additions and 0 deletions
+27
View File
@@ -0,0 +1,27 @@
#include "opcode.h"
#include <fx/int.h>
#define OPCODE_MAX 0xFF
#define ARG_MAX 0xFFFFFF
bshell_instruction bshell_instruction_encode(
enum bshell_opcode opcode,
uint32_t arg)
{
if (opcode > OPCODE_MAX) {
return BSHELL_INSTRUCTION_INVALID;
}
return fx_u32_htob((opcode & OPCODE_MAX) | (arg & ARG_MAX) << 8);
}
void bshell_instruction_decode(
bshell_instruction instr,
enum bshell_opcode *out_opcode,
uint32_t *out_arg)
{
instr = fx_u32_btoh(instr);
*out_opcode = (instr & OPCODE_MAX);
*out_arg = ((instr >> 8) & ARG_MAX);
}
+81
View File
@@ -0,0 +1,81 @@
#ifndef RUNTIME_OPCODE_H_
#define RUNTIME_OPCODE_H_
#include <stdint.h>
#define BSHELL_INSTRUCTION_INVALID 0xFFFFFFFF
typedef uint32_t bshell_instruction;
enum bshell_opcode {
OPCODE_NOP = 0,
OPCODE_LDC_INT,
OPCODE_LDC_STR,
OPCODE_LDGLOBAL,
OPCODE_LDLOCAL,
OPCODE_LDBLOCK,
OPCODE_LDENV,
OPCODE_LDSTATIC,
OPCODE_LDARG,
OPCODE_LDPROP,
OPCODE_LDELEM,
OPCODE_LDELEM_C,
OPCODE_STLOCAL,
OPCODE_STPROP,
OPCODE_STELEM,
OPCODE_LDCMD,
OPCODE_PEXEC,
OPCODE_CALL,
OPCODE_MK_STR,
OPCODE_MK_ARRAY,
OPCODE_MK_HTAB,
OPCODE_POP,
OPCODE_ADD,
OPCODE_SUB,
OPCODE_MUL,
OPCODE_DIV,
OPCODE_ADD_IP,
OPCODE_MOD,
OPCODE_INC,
OPCODE_DEC,
OPCODE_SHL,
OPCODE_SHR,
OPCODE_BAND,
OPCODE_BOR,
OPCODE_BXOR,
OPCODE_BNOT,
OPCODE_CMP_NULL,
OPCODE_CMP_EQ,
OPCODE_CMP_NE,
OPCODE_CMP_LT,
OPCODE_CMP_GT,
OPCODE_CMP_LE,
OPCODE_CMP_GE,
OPCODE_LAND,
OPCODE_LOR,
OPCODE_LXOR,
OPCODE_LNOT,
OPCODE_BR,
OPCODE_BR_TRUE,
OPCODE_RANGE,
OPCODE_MATCH,
OPCODE_REPLACE,
OPCODE_LIKE,
OPCODE_IN,
OPCODE_FMT,
OPCODE_CONTAINS,
OPCODE_SPLIT,
OPCODE_JOIN,
OPCODE_IS,
OPCODE_AS,
};
extern bshell_instruction bshell_instruction_encode(
enum bshell_opcode opcode,
uint32_t arg);
extern void bshell_instruction_decode(
bshell_instruction instr,
enum bshell_opcode *out_opcode,
uint32_t *out_arg);
#endif