summary refs log tree commit diff
diff options
context:
space:
mode:
authorIrene Knapp <ireneista@irenes.space>2025-11-08 15:17:05 -0800
committerIrene Knapp <ireneista@irenes.space>2025-11-08 15:17:05 -0800
commitf5a6ad84e6c3ae1efd2802a01044cc548968cee4 (patch)
tree3a3dd198549273406f12f447ecfc2b7b62a24dc1
parentc879ce48776e75c45792ef1f85c7de2264b6a959 (diff)
added assembly-in-forth unroll, and mov_indexed_reg64_reg64
missed that instruction. oops. well, we have it now.

Force-Push: yes
Change-Id: I22583d6c6bda3cb66ad67a69a644aeb777114085
-rw-r--r--quine.asm31
1 files changed, 26 insertions, 5 deletions
diff --git a/quine.asm b/quine.asm
index b4edf5b..9e5da26 100644
--- a/quine.asm
+++ b/quine.asm
@@ -2040,8 +2040,16 @@ cold_start:
   ; unroll sounds nicer and it's only a single character longer. You might say
   ; it rolls off the tongue better.
   dq litstring, "unroll", early_create, early_self_codeword, early_here, fetch
-  ; TODO
-  dq lit, 8, packalign, early_here_store
+  dq rcx, pop_reg64
+  dq rcx, dec_reg64
+  dq rcx, rdx, mov_reg64_reg64
+  dq rsp, rbp, mov_reg64_indirect_reg64
+  dq rsi, push_reg64
+  dq rsp, lit, 16, rsi, lea_reg64_disp8_reg64
+  dq rsp, lit, 8, rdi, lea_reg64_disp8_reg64
+  dq rep_movs64
+  dq rbx, rsp, rdx, lit, 8, mov_indexed_reg64_reg64
+  dq pack_next, lit, 8, packalign, early_here_store
 
   ; This was "roll3".
   dq litstring, "3roll", early_create, early_self_codeword, early_here, fetch
@@ -3683,7 +3691,7 @@ defword mov_reg64_disp8_reg64, 0
 
 ; Stack:
 ;   output point
-;   source register name
+;   source base register name
 ;   source index register name
 ;   source index scale factor, as a count of bytes
 ;   target register name
@@ -3696,6 +3704,19 @@ defword mov_reg64_indexed_reg64, 0
 ; Stack:
 ;   output point
 ;   source register name
+;   target base register name
+;   target index register name
+;   target index scale factor, as a count of bytes
+defword mov_indexed_reg64_reg64, 0
+  dq docol
+  dq lit, 5, roll, rex_w, lit, 0x89, pack8, lit, 5, unroll
+  dq lit, 4, roll, reg64, lit, 4, unroll
+  dq unroll3, swap, addressing_indexed_reg64
+  dq exit
+
+; Stack:
+;   output point
+;   source register name
 ;   target register name
 defword mov_indirect_reg64_reg32, 0
   dq docol
@@ -3832,7 +3853,7 @@ defword lea_reg64_disp8_reg64, 0
 
 ; Stack:
 ;   output point
-;   source register name
+;   source base register name
 ;   source index register name
 ;   source index scale factor, as a count of bytes
 ;   target register name
@@ -3844,7 +3865,7 @@ defword lea_reg64_indexed_reg64, 0
 
 ; Stack:
 ;   output point
-;   source register name
+;   source base register name
 ;   source index register name
 ;   source index scale factor, as a count of bytes
 ;   source displacement value