aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorWojciech Kosior <kwojtus@protonmail.com>2020-09-21 13:43:29 +0200
committerWojciech Kosior <kwojtus@protonmail.com>2020-09-21 13:43:29 +0200
commitc75dcab5988f5c0b5e0629015f384e5aa1440690 (patch)
tree0fa4d4dece1a6710e62cf25bde4605918cf9f4a4 /tools
parentf462785ee0894432e1e1d07793aba73b5ec20134 (diff)
downloadAGH-engineering-thesis-c75dcab5988f5c0b5e0629015f384e5aa1440690.tar.gz
AGH-engineering-thesis-c75dcab5988f5c0b5e0629015f384e5aa1440690.zip
enable translation of few arithmetic operations (testbench included)
Diffstat (limited to 'tools')
-rw-r--r--tools/stack_machine_instruction.h3
-rw-r--r--tools/translate.c25
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;