diff options
| author | Irene Knapp <ireneista@irenes.space> | 2026-04-08 21:44:44 -0700 |
|---|---|---|
| committer | Irene Knapp <ireneista@irenes.space> | 2026-04-08 21:44:44 -0700 |
| commit | a72ce8fa7ced1abfadddd981b7adc21d8a197b0f (patch) | |
| tree | 0fd06c9e813c621ca8a076b4b436f93f44d18303 | |
| parent | 88d0db591d2d9f6014fa98a9007dc5d05b4bb114 (diff) | |
heap impl of stringcmp, also a couple more Forth asm words
Force-Push: yes Change-Id: I10a098e9f6660ebec6a0beea6eda0a318c5e7f53
| -rw-r--r-- | quine.asm | 62 |
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: |