From 4e64f1fe235ffaed6f2eb6fdb228b480c4dfcb1b Mon Sep 17 00:00:00 2001
From: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Wed, 1 Nov 2023 21:14:04 +0000
Subject: DUP implementation is now part of WORD_ROUTINES

As PUSH_REGISTER and MOV have the same signature of taking a word as
input, DUP may as well be part of it.

This leads to a larger discussion about how signatures of functions
matter: I may need to do a cleanup at some point.
---
 vm/runtime.c | 10 +++-------
 vm/runtime.h | 21 +++++++++------------
 2 files changed, 12 insertions(+), 19 deletions(-)

diff --git a/vm/runtime.c b/vm/runtime.c
index 0fbea05..ce8281a 100644
--- a/vm/runtime.c
+++ b/vm/runtime.c
@@ -68,10 +68,11 @@ err_t vm_execute(vm_t *vm)
     return PUSH_ROUTINES[instruction.opcode](vm, instruction.operand);
   }
   else if (OPCODE_IS_TYPE(instruction.opcode, OP_MOV) ||
-           OPCODE_IS_TYPE(instruction.opcode, OP_PUSH_REGISTER))
+           OPCODE_IS_TYPE(instruction.opcode, OP_PUSH_REGISTER) ||
+           OPCODE_IS_TYPE(instruction.opcode, OP_DUP))
   {
     prog->ptr++;
-    return REG_ROUTINES[instruction.opcode](vm, instruction.operand.as_byte);
+    return WORD_ROUTINES[instruction.opcode](vm, instruction.operand.as_word);
   }
   else if (OPCODE_IS_TYPE(instruction.opcode, OP_POP))
   {
@@ -94,11 +95,6 @@ err_t vm_execute(vm_t *vm)
     }
     return ERR_OK;
   }
-  else if (OPCODE_IS_TYPE(instruction.opcode, OP_DUP))
-  {
-    prog->ptr++;
-    return DUP_ROUTINES[instruction.opcode](vm, instruction.operand.as_word);
-  }
   else if (OPCODE_IS_TYPE(instruction.opcode, OP_NOT) ||
            OPCODE_IS_TYPE(instruction.opcode, OP_OR) ||
            OPCODE_IS_TYPE(instruction.opcode, OP_AND) ||
diff --git a/vm/runtime.h b/vm/runtime.h
index 6c6042a..c4d28d8 100644
--- a/vm/runtime.h
+++ b/vm/runtime.h
@@ -96,26 +96,23 @@ err_t vm_mov_byte(vm_t *, word);
 err_t vm_mov_hword(vm_t *, word);
 err_t vm_mov_word(vm_t *, word);
 
-typedef err_t (*reg_f)(vm_t *, word);
-static const reg_f REG_ROUTINES[] = {
+err_t vm_dup_byte(vm_t *, word);
+err_t vm_dup_hword(vm_t *, word);
+err_t vm_dup_word(vm_t *, word);
+
+typedef err_t (*word_f)(vm_t *, word);
+static const word_f WORD_ROUTINES[] = {
     [OP_PUSH_REGISTER_BYTE]  = vm_push_byte_register,
     [OP_PUSH_REGISTER_HWORD] = vm_push_hword_register,
     [OP_PUSH_REGISTER_WORD]  = vm_push_word_register,
     [OP_MOV_BYTE]            = vm_mov_byte,
     [OP_MOV_HWORD]           = vm_mov_hword,
     [OP_MOV_WORD]            = vm_mov_word,
+    [OP_DUP_BYTE]            = vm_dup_byte,
+    [OP_DUP_HWORD]           = vm_dup_hword,
+    [OP_DUP_WORD]            = vm_dup_word,
 };
 
-err_t vm_dup_byte(vm_t *, word);
-err_t vm_dup_hword(vm_t *, word);
-err_t vm_dup_word(vm_t *, word);
-
-typedef err_t (*dup_f)(vm_t *, word);
-static const dup_f DUP_ROUTINES[] = {
-    [OP_DUP_BYTE]  = vm_dup_byte,
-    [OP_DUP_HWORD] = vm_dup_hword,
-    [OP_DUP_WORD]  = vm_dup_word,
-};
 
 err_t vm_not_byte(vm_t *);
 err_t vm_not_hword(vm_t *);
-- 
cgit v1.2.3-13-gbd6f