refactor to reduce repeats
This commit is contained in:
parent
bf2609c6ee
commit
29a6a3d471
47
src/vm.c
47
src/vm.c
|
@ -14,6 +14,13 @@ const char radix_set[11] = "0123456789";
|
|||
return pc; \
|
||||
} while (0)
|
||||
|
||||
#define MATH_OP(accessor, op) \
|
||||
do { \
|
||||
memory[dest_addr].accessor = \
|
||||
memory[src1_addr].accessor op memory[src2_addr].accessor; \
|
||||
return pc; \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
* String copy in data memory.
|
||||
*/
|
||||
|
@ -47,45 +54,25 @@ uint32_t step_vm(Word *memory, uint32_t memory_size, uint32_t pc) {
|
|||
case OP_HALT:
|
||||
return 0;
|
||||
case OP_ADD_INT:
|
||||
memory[dest_addr].u = memory[src1_addr].i + memory[src2_addr].i;
|
||||
return pc;
|
||||
|
||||
MATH_OP(i, +);
|
||||
case OP_SUB_INT:
|
||||
memory[dest_addr].u = memory[src1_addr].i - memory[src2_addr].i;
|
||||
return pc;
|
||||
|
||||
MATH_OP(i, -);
|
||||
case OP_MUL_INT:
|
||||
memory[dest_addr].u = memory[src1_addr].i * memory[src2_addr].i;
|
||||
return pc;
|
||||
|
||||
MATH_OP(i, *);
|
||||
case OP_DIV_INT:
|
||||
memory[dest_addr].u = memory[src1_addr].i / memory[src2_addr].i;
|
||||
return pc;
|
||||
|
||||
MATH_OP(i, /);
|
||||
case OP_ADD_UINT:
|
||||
memory[dest_addr].u = memory[src1_addr].u + memory[src2_addr].u;
|
||||
return pc;
|
||||
|
||||
MATH_OP(u, +);
|
||||
case OP_SUB_UINT:
|
||||
memory[dest_addr].u = memory[src1_addr].u - memory[src2_addr].u;
|
||||
return pc;
|
||||
|
||||
MATH_OP(u, -);
|
||||
case OP_MUL_UINT:
|
||||
memory[dest_addr].u = memory[src1_addr].u * memory[src2_addr].u;
|
||||
return pc;
|
||||
|
||||
MATH_OP(u, *);
|
||||
case OP_DIV_UINT:
|
||||
memory[dest_addr].u = memory[src1_addr].u / memory[src2_addr].u;
|
||||
return pc;
|
||||
|
||||
MATH_OP(u, /);
|
||||
case OP_ADD_REAL:
|
||||
memory[dest_addr].q = memory[src1_addr].q + memory[src2_addr].q;
|
||||
return pc;
|
||||
|
||||
MATH_OP(q, +);
|
||||
case OP_SUB_REAL:
|
||||
memory[dest_addr].q = memory[src1_addr].q - memory[src2_addr].q;
|
||||
return pc;
|
||||
|
||||
MATH_OP(q, -);
|
||||
case OP_MUL_REAL: {
|
||||
int32_t a = memory[src1_addr].q;
|
||||
int32_t b = memory[src2_addr].q;
|
||||
|
|
Loading…
Reference in New Issue