From 29a6a3d47169be476e94557c77cd047059363c64 Mon Sep 17 00:00:00 2001 From: zongor Date: Sat, 14 Jun 2025 14:54:38 -0400 Subject: [PATCH] refactor to reduce repeats --- src/vm.c | 47 +++++++++++++++++------------------------------ 1 file changed, 17 insertions(+), 30 deletions(-) diff --git a/src/vm.c b/src/vm.c index ebfab29..a40eb3e 100644 --- a/src/vm.c +++ b/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;