diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/stack_machine_instruction.h | 3 | ||||
-rw-r--r-- | tools/translate.c | 25 |
2 files changed, 27 insertions, 1 deletions
diff --git a/tools/stack_machine_instruction.h b/tools/stack_machine_instruction.h index 5fd20fc..7b22c83 100644 --- a/tools/stack_machine_instruction.h +++ b/tools/stack_machine_instruction.h @@ -139,7 +139,10 @@ Y(tee, 0x1000) /* 0001_0000_0000_0000 */ Y(get_frame, 0x1001) /* 0001_0000_0000_0001 */ X(const, 0x5000) /* 0101_0000_0xxx_xxxx */ X(call, 0x5080) /* 0101_0000_1xxx_xxxx */ +Y(add, 0x3000) /* 0011_0000_0000_0000 */ Y(sub, 0x3001) /* 0011_0000_0000_0001 */ +Y(div, 0x3002) /* 0011_0000_0000_0010 */ +Y(mul, 0x3003) /* 0011_0000_0000_0011 */ Y(drop, 0x3004) /* 0011_0000_0000_0100 */ Y(ret, 0x3080) /* 0011_0000_1000_0000 */ Y(halt, 0x0000) /* 0000_0000_0000_0000 */ diff --git a/tools/translate.c b/tools/translate.c index 4361d6f..bf13bd1 100644 --- a/tools/translate.c +++ b/tools/translate.c @@ -4,7 +4,9 @@ /* WebAssembly opcodes */ #define WASM_END 0x0B #define WASM_CALL 0x10 + #define WASM_LOCAL_GET 0x20 + #define WASM_I32_LOAD 0x28 #define WASM_I32_LOAD8_S 0x2C #define WASM_I32_LOAD8_U 0x2D @@ -14,8 +16,14 @@ #define WASM_I32_STORE8 0x3A #define WASM_I32_STORE16 0x3B #define WASM_I64_STORE32 0x3E + #define WASM_I32_CONST 0x41 + +#define WASM_I32_ADD 0x6A #define WASM_I32_SUB 0x6B +#define WASM_I32_MUL 0x6C +#define WASM_I32_DIV_U 0x6E + int translate(FILE *handle, struct function *function, struct module *module) { @@ -59,11 +67,26 @@ int translate(FILE *handle, struct function *function, struct module *module) // TODO: make a function for each instruction type, // call them through some table... - if (wasm_opcode == WASM_I32_SUB) { + if (wasm_opcode == WASM_I32_ADD) { + if (i_add(&expr)) + goto fail; + + matched = 1; + } else if (wasm_opcode == WASM_I32_SUB) { if (i_sub(&expr)) goto fail; matched = 1; + } else if (wasm_opcode == WASM_I32_MUL) { + if (i_mul(&expr)) + goto fail; + + matched = 1; + } else if (wasm_opcode == WASM_I32_DIV_U) { + if (i_div(&expr)) + goto fail; + + matched = 1; } else if (wasm_opcode == WASM_CALL) { uint32_t funcidx; struct instruction **target; |