summary refs log tree commit diff
path: root/quine.asm
diff options
context:
space:
mode:
Diffstat (limited to 'quine.asm')
-rw-r--r--quine.asm37
1 files changed, 23 insertions, 14 deletions
diff --git a/quine.asm b/quine.asm
index 54e9d2f..b4edf5b 100644
--- a/quine.asm
+++ b/quine.asm
@@ -2007,25 +2007,34 @@ cold_start:
 
   dq litstring, "exit", early_create, early_self_codeword, early_here, fetch
   dq rsi, pack_popcontrol, pack_next
-  ; TODO
   dq lit, 8, packalign, early_here_store
 
   dq litstring, "swap", early_create, early_self_codeword, early_here, fetch
-  ; TODO
-  dq lit, 8, packalign, early_here_store
+  dq rax, pop_reg64, rbx, pop_reg64, rax, push_reg64, rbx, push_reg64
+  dq pack_next, lit, 8, packalign, early_here_store
 
   dq litstring, "drop", early_create, early_self_codeword, early_here, fetch
-  ; TODO
-  dq lit, 8, packalign, early_here_store
+  dq rax, pop_reg64
+  dq pack_next, lit, 8, packalign, early_here_store
 
   ; This was "drop2".
   dq litstring, "2drop", early_create, early_self_codeword, early_here, fetch
-  ; TODO
-  dq lit, 8, packalign, early_here_store
+  dq rax, pop_reg64, rax, pop_reg64
+  dq pack_next, lit, 8, packalign, early_here_store
 
   dq litstring, "roll", 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 rsp, rcx, lit, 8, rbx, mov_reg64_indexed_reg64
+  dq rsi, push_reg64
+  dq rsp, rcx, lit, 8, rsi, lea_reg64_indexed_reg64
+  dq rsp, rcx, lit, 8, lit, 8, rdi, lea_reg64_disp8_indexed_reg64
+  dq std
+  dq rep_movs64
+  dq cld
+  dq rsi, pop_reg64
+  dq rbx, rsi, mov_reg64_indirect_reg64
+  dq pack_next, lit, 8, packalign, early_here_store
 
   ; Jonesforth calls this "-roll" and we could do that, but honestly the name
   ; unroll sounds nicer and it's only a single character longer. You might say
@@ -3423,10 +3432,10 @@ defword reg8, 0
 ;   2-bit encoded value for scale field in SIB byte
 defword scalefield, 0
   dq docol
-  dq dup, 1, eq, zbranch, 5*8, drop, lit, 0, exit
-  dq dup, 2, eq, zbranch, 5*8, drop, lit, 1, exit
-  dq dup, 4, eq, zbranch, 5*8, drop, lit, 2, exit
-  dq dup, 8, eq, zbranch, 5*8, drop, lit, 3, exit
+  dq dup, lit, 1, eq, zbranch, 5*8, drop, lit, 0, exit
+  dq dup, lit, 2, eq, zbranch, 5*8, drop, lit, 1, exit
+  dq dup, lit, 4, eq, zbranch, 5*8, drop, lit, 2, exit
+  dq dup, lit, 8, eq, zbranch, 5*8, drop, lit, 3, exit
   dq litstring, "Parameter to scalefield is not 1, 2, 4, or 8.", emitstring
   dq lit, 1, sys_exit
 
@@ -3572,7 +3581,7 @@ defword addressing_disp8_reg64, 0
 defword addressing_indexed_reg64, 0
   dq docol
   ; Exit with an error if the base register is rbp.
-  dq dup, rbp, ne, zbranch, 17*8
+  dq dup, rbp, ne, zbranch, 5*8;, 17*8
   ; Reg/mem value 4 means to use an SIB byte (at least, with this mode).
   dq lit, 5, roll, lit, 0, lit, 6, roll, lit, 4, modrm, lit, 4, unroll
   dq reg64, unroll3, reg64, unroll3, scalefield, unroll3, sib