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; \
|
return pc; \
|
||||||
} while (0)
|
} 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.
|
* 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:
|
case OP_HALT:
|
||||||
return 0;
|
return 0;
|
||||||
case OP_ADD_INT:
|
case OP_ADD_INT:
|
||||||
memory[dest_addr].u = memory[src1_addr].i + memory[src2_addr].i;
|
MATH_OP(i, +);
|
||||||
return pc;
|
|
||||||
|
|
||||||
case OP_SUB_INT:
|
case OP_SUB_INT:
|
||||||
memory[dest_addr].u = memory[src1_addr].i - memory[src2_addr].i;
|
MATH_OP(i, -);
|
||||||
return pc;
|
|
||||||
|
|
||||||
case OP_MUL_INT:
|
case OP_MUL_INT:
|
||||||
memory[dest_addr].u = memory[src1_addr].i * memory[src2_addr].i;
|
MATH_OP(i, *);
|
||||||
return pc;
|
|
||||||
|
|
||||||
case OP_DIV_INT:
|
case OP_DIV_INT:
|
||||||
memory[dest_addr].u = memory[src1_addr].i / memory[src2_addr].i;
|
MATH_OP(i, /);
|
||||||
return pc;
|
|
||||||
|
|
||||||
case OP_ADD_UINT:
|
case OP_ADD_UINT:
|
||||||
memory[dest_addr].u = memory[src1_addr].u + memory[src2_addr].u;
|
MATH_OP(u, +);
|
||||||
return pc;
|
|
||||||
|
|
||||||
case OP_SUB_UINT:
|
case OP_SUB_UINT:
|
||||||
memory[dest_addr].u = memory[src1_addr].u - memory[src2_addr].u;
|
MATH_OP(u, -);
|
||||||
return pc;
|
|
||||||
|
|
||||||
case OP_MUL_UINT:
|
case OP_MUL_UINT:
|
||||||
memory[dest_addr].u = memory[src1_addr].u * memory[src2_addr].u;
|
MATH_OP(u, *);
|
||||||
return pc;
|
|
||||||
|
|
||||||
case OP_DIV_UINT:
|
case OP_DIV_UINT:
|
||||||
memory[dest_addr].u = memory[src1_addr].u / memory[src2_addr].u;
|
MATH_OP(u, /);
|
||||||
return pc;
|
|
||||||
|
|
||||||
case OP_ADD_REAL:
|
case OP_ADD_REAL:
|
||||||
memory[dest_addr].q = memory[src1_addr].q + memory[src2_addr].q;
|
MATH_OP(q, +);
|
||||||
return pc;
|
|
||||||
|
|
||||||
case OP_SUB_REAL:
|
case OP_SUB_REAL:
|
||||||
memory[dest_addr].q = memory[src1_addr].q - memory[src2_addr].q;
|
MATH_OP(q, -);
|
||||||
return pc;
|
|
||||||
|
|
||||||
case OP_MUL_REAL: {
|
case OP_MUL_REAL: {
|
||||||
int32_t a = memory[src1_addr].q;
|
int32_t a = memory[src1_addr].q;
|
||||||
int32_t b = memory[src2_addr].q;
|
int32_t b = memory[src2_addr].q;
|
||||||
|
|
Loading…
Reference in New Issue