summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--quine.asm62
1 files changed, 59 insertions, 3 deletions
diff --git a/quine.asm b/quine.asm
index cc75f6b..b0fedcb 100644
--- a/quine.asm
+++ b/quine.asm
@@ -2491,6 +2491,29 @@ cold_start:
   dq rbx, push_reg64
   dq pack_next, lit, 8, packalign, early_here_store
 
+  dq litstring, "stringcmp", early_create, early_self_codeword
+  dq early_here, fetch
+  dq rsi, rdx, mov_reg64_reg64
+  dq rsi, pop_reg64
+  dq rdi, pop_reg64
+  dq rbx, rbx, xor_reg64_reg64
+  dq rax, rax, xor_reg64_reg64
+  dq rsi, rcx, mov_reg64_indirect_reg64
+  dq cl, al, mov_reg8_reg8
+  dq cmps8
+  dq lit, 15, cc_equal, jmp_cc_rel_imm8
+  dq cc_above, bl, set_reg8_cc
+  dq lit, 0, rbx, sbb_reg64_imm8
+  dq rbx, push_reg64
+  dq rdx, rsi, mov_reg64_reg64
+  dq pack_next
+  dq rax, rax, test_reg64_reg64
+  dq lit, -28, cc_not_equal, jmp_cc_rel_imm8
+  dq lit, 0, push_imm32_extended64
+  dq rdx, rsi, mov_reg64_reg64
+  dq pack_next
+  dq lit, 8, packalign, early_here_store
+
   dq litstring, "branch", early_create, early_self_codeword, early_here, fetch
   ; Save the address we're packing to; it will be the label we jump to from
   ; zbranch.
@@ -2723,7 +2746,6 @@ cold_start:
   ;;;   memcopy, stringlen
   ;;;   reverse_stringlen, reverse_padding_len
   ;;;   stringcmp
-  ;;;     TODO needs heap impl
   ;;;     no dependencies except next for any of these
   ;;;   branch, zbranch
   ;;;     sorta needs a label but might be avoidable
@@ -2781,7 +2803,7 @@ cold_start:
   ;;;   mov_reg8_indirect_reg64, mov_reg8_disp8_reg64,
   ;;;   lea_reg64_disp8_reg64, lea_reg64_indexed_reg64,
   ;;;   lea_reg64_disp8_indexed_reg64,
-  ;;;   push_reg64, pop_reg64,
+  ;;;   push_reg64, pop_reg64, push_imm32_extended,
   ;;;   movs8, movs16, movs32, movs64,
   ;;;   rep_movs8, rep_movs16, rep_movs32, rep_movs64,
   ;;;   lods8, lods16, lods32, lods64,
@@ -2797,7 +2819,7 @@ cold_start:
   ;;;   add_reg64_reg64, add_indirect_reg64_reg64, add_reg64_indirect_reg64,
   ;;;   add_reg64_imm8,
   ;;;   sub_reg64_reg64, sub_indirect_reg64_reg64,
-  ;;;   sub_reg64_imm8,
+  ;;;   sub_reg64_imm8, sbb_reg64_imm8
   ;;;   mul_reg64, divmod_reg64, idivmod_reg64, inc_reg64, dec_reg64,
   ;;;   and_reg64_reg64, and_reg64_imm8,
   ;;;   or_reg64_reg64, or_reg64_imm8,
@@ -4546,6 +4568,13 @@ defword addressing_disp8_indexed_reg64, 0
 
 ; Stack:
 ;   output point
+;   reg/op field value (raw number)
+;   reg/mem field register name
+defword addressing_reg8, 0
+  dq docol, reg8, lit, 3, unroll3, modrm, exit
+
+; Stack:
+;   output point
 defword cld, 0
   dq docol, lit, 0xFC, pack8, exit
 
@@ -4821,6 +4850,16 @@ defword lea_reg64_disp8_indexed_reg64, 0
 ; Stack:
 ;   output point
 ;   source register name
+;   target register name
+defword mov_reg8_reg8, 0
+  dq docol
+  dq roll3, lit, 0x88, pack8, unroll3
+  dq swap, reg8, swap, addressing_reg8
+  dq exit
+
+; Stack:
+;   output point
+;   source register name
 defword push_reg64, 0
   dq docol, reg64, lit, 0x50, opcodereg, exit
 
@@ -4830,6 +4869,13 @@ defword push_reg64, 0
 defword pop_reg64, 0
   dq docol, reg64, lit, 0x58, opcodereg, exit
 
+; Stack:
+;   output point
+;   immediate value
+defword push_imm32_extended64, 0
+  dq docol, swap, lit, 0x68, pack8, swap, pack32, exit
+
+
 ;;;
 ;;; String instructions
 ;;;
@@ -5038,6 +5084,16 @@ defword sub_reg64_imm8, 0
   dq swap, pack8
   dq exit
 
+; Stack:
+;   output point
+;   source value
+;   target register name
+defword sbb_reg64_imm8, 0
+  dq docol
+  dq roll3, rex_w, lit, 0x83, pack8, swap, lit, 3, swap, addressing_reg64
+  dq swap, pack8
+  dq exit
+
 ;   The target register is always rax.
 ;
 ; Stack: