summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--quine.asm230
1 files changed, 224 insertions, 6 deletions
diff --git a/quine.asm b/quine.asm
index 77360f8..b828b90 100644
--- a/quine.asm
+++ b/quine.asm
@@ -2858,6 +2858,54 @@ defword r14, 0
   dq docol, lit, r14, exit
 defword r15, 0
   dq docol, lit, r15, exit
+defword eax, 0
+  dq docol, lit, rax, exit
+defword ecx, 0
+  dq docol, lit, rcx, exit
+defword edx, 0
+  dq docol, lit, rdx, exit
+defword ebx, 0
+  dq docol, lit, rbx, exit
+defword esp, 0
+  dq docol, lit, rsp, exit
+defword ebp, 0
+  dq docol, lit, rbp, exit
+defword esi, 0
+  dq docol, lit, rsi, exit
+defword edi, 0
+  dq docol, lit, rdi, exit
+defword ax, 0
+  dq docol, lit, rax, exit
+defword cx, 0
+  dq docol, lit, rcx, exit
+defword dx, 0
+  dq docol, lit, rdx, exit
+defword bx, 0
+  dq docol, lit, rbx, exit
+defword sp, 0
+  dq docol, lit, rsp, exit
+defword bp, 0
+  dq docol, lit, rbp, exit
+defword si, 0
+  dq docol, lit, rsi, exit
+defword di, 0
+  dq docol, lit, rdi, exit
+defword al, 0
+  dq docol, lit, rax, exit
+defword cl, 0
+  dq docol, lit, rcx, exit
+defword dl, 0
+  dq docol, lit, rdx, exit
+defword bl, 0
+  dq docol, lit, rbx, exit
+defword ah, 0
+  dq docol, lit, rsp, exit
+defword ch, 0
+  dq docol, lit, rbp, exit
+defword dh, 0
+  dq docol, lit, rsi, exit
+defword bh, 0
+  dq docol, lit, rdi, exit
 
 ; Stack in:
 ;   register name
@@ -2894,6 +2942,56 @@ defword extrareg64, 0
   dq lit, 1, sys_exit
 
 ; Stack in:
+;   register name
+; Stack out:
+;   3-bit encoded value for register
+defword reg32, 0
+  dq docol
+  dq dup, eax, eq, zbranch, 5*8, drop, lit, 0, exit
+  dq dup, ecx, eq, zbranch, 5*8, drop, lit, 1, exit
+  dq dup, edx, eq, zbranch, 5*8, drop, lit, 2, exit
+  dq dup, ebx, eq, zbranch, 5*8, drop, lit, 3, exit
+  dq dup, esp, eq, zbranch, 5*8, drop, lit, 4, exit
+  dq dup, ebp, eq, zbranch, 5*8, drop, lit, 5, exit
+  dq dup, esi, eq, zbranch, 5*8, drop, lit, 6, exit
+  dq dup, edi, eq, zbranch, 5*8, drop, lit, 7, exit
+  dq litstring, "Parameter to reg32 is not a reg32.", emitstring
+  dq lit, 1, sys_exit
+
+; Stack in:
+;   register name
+; Stack out:
+;   3-bit encoded value for register
+defword reg16, 0
+  dq docol
+  dq dup, ax, eq, zbranch, 5*8, drop, lit, 0, exit
+  dq dup, cx, eq, zbranch, 5*8, drop, lit, 1, exit
+  dq dup, dx, eq, zbranch, 5*8, drop, lit, 2, exit
+  dq dup, bx, eq, zbranch, 5*8, drop, lit, 3, exit
+  dq dup, sp, eq, zbranch, 5*8, drop, lit, 4, exit
+  dq dup, bp, eq, zbranch, 5*8, drop, lit, 5, exit
+  dq dup, si, eq, zbranch, 5*8, drop, lit, 6, exit
+  dq dup, di, eq, zbranch, 5*8, drop, lit, 7, exit
+  dq litstring, "Parameter to reg16 is not a reg16.", emitstring
+  dq lit, 1, sys_exit
+
+; Stack in:
+;   register name
+; Stack out:
+;   3-bit encoded value for register
+defword reg8, 0
+  dq dup, al, eq, zbranch, 5*8, drop, lit, 0, exit
+  dq dup, cl, eq, zbranch, 5*8, drop, lit, 1, exit
+  dq dup, dl, eq, zbranch, 5*8, drop, lit, 2, exit
+  dq dup, bl, eq, zbranch, 5*8, drop, lit, 3, exit
+  dq dup, ah, eq, zbranch, 5*8, drop, lit, 4, exit
+  dq dup, ch, eq, zbranch, 5*8, drop, lit, 5, exit
+  dq dup, dh, eq, zbranch, 5*8, drop, lit, 6, exit
+  dq dup, bh, eq, zbranch, 5*8, drop, lit, 7, exit
+  dq litstring, "Parameter to reg8 is not a reg8.", emitstring
+  dq lit, 1, sys_exit
+
+; Stack in:
 ;   scale factor, as a count of bytes
 ; Stack out:
 ;   2-bit encoded value for scale field in SIB byte
@@ -3127,6 +3225,132 @@ defword mov_reg64_indexed_reg64, 0
 ; Stack:
 ;   output point
 ;   source register name
+;   target register name
+defword mov_indirect_reg64_reg32, 0
+  dq docol
+  dq roll3, lit, 0x89, pack8, unroll3
+  dq swap, reg32, swap, addressing_indirect_reg64
+  dq exit
+
+; Stack:
+;   output point
+;   source register name
+;   target register name
+;   target displacement value
+defword mov_disp8_reg64_reg32, 0
+  dq docol
+  dq lit, 4, roll, lit, 0x89, pack8, lit, 4, unroll
+  dq roll3, reg32, unroll3, addressing_disp8_reg64
+  dq exit
+
+; Stack:
+;   output point
+;   source register name
+;   target register name
+defword mov_reg32_indirect_reg64, 0
+  dq docol
+  dq roll3, lit, 0x8B, pack8, unroll3
+  dq reg32, swap, addressing_indirect_reg64
+  dq exit
+
+; Stack:
+;   output point
+;   source register name
+;   source displacement value
+;   target register name
+defword mov_reg32_disp8_reg64, 0
+  dq docol
+  dq lit, 4, roll, lit, 0x8B, pack8, lit, 4, unroll
+  dq reg32, unroll3, addressing_disp8_reg64
+  dq exit
+
+; Stack:
+;   output point
+;   source register name
+;   target register name
+defword mov_indirect_reg64_reg16, 0
+  dq docol
+  dq roll3, lit, 0x66, pack8, lit, 0x89, pack8, unroll3
+  dq swap, reg16, swap, addressing_indirect_reg64
+  dq exit
+
+; Stack:
+;   output point
+;   source register name
+;   target register name
+;   target displacement value
+defword mov_disp8_reg64_reg16, 0
+  dq docol
+  dq lit, 4, roll, lit, 0x66, pack8, lit, 0x89, pack8, lit, 4, unroll
+  dq roll3, reg16, unroll3, addressing_disp8_reg64
+  dq exit
+
+; Stack:
+;   output point
+;   source register name
+;   target register name
+defword mov_reg16_indirect_reg64, 0
+  dq docol
+  dq roll3, lit, 0x66, pack8, lit, 0x8B, pack8, unroll3
+  dq reg16, swap, addressing_indirect_reg64
+  dq exit
+
+; Stack:
+;   output point
+;   source register name
+;   source displacement value
+;   target register name
+defword mov_reg16_disp8_reg64, 0
+  dq docol
+  dq lit, 4, roll, lit, 0x66, pack8, lit, 0x8B, pack8, lit, 4, unroll
+  dq reg16, unroll3, addressing_disp8_reg64
+  dq exit
+
+; Stack:
+;   output point
+;   source register name
+;   target register name
+defword mov_indirect_reg64_reg8, 0
+  dq docol
+  dq roll3, lit, 0x88, pack8, unroll3
+  dq swap, reg8, swap, addressing_indirect_reg64
+  dq exit
+
+; Stack:
+;   output point
+;   source register name
+;   target register name
+;   target displacement value
+defword mov_disp8_reg64_reg8, 0
+  dq docol
+  dq lit, 4, roll, lit, 0x88, pack8, lit, 4, unroll
+  dq roll3, reg8, unroll3, addressing_disp8_reg64
+  dq exit
+
+; Stack:
+;   output point
+;   source register name
+;   target register name
+defword mov_reg8_indirect_reg64, 0
+  dq docol
+  dq roll3, pack8, lit, 0x8A, pack8, unroll3
+  dq reg8, swap, addressing_indirect_reg64
+  dq exit
+
+; Stack:
+;   output point
+;   source register name
+;   source displacement value
+;   target register name
+defword mov_reg8_disp8_reg64, 0
+  dq docol
+  dq lit, 4, roll, pack8, lit, 0x8A, pack8, lit, 4, unroll
+  dq reg8, unroll3, addressing_disp8_reg64
+  dq exit
+
+; Stack:
+;   output point
+;   source register name
 ;   source displacement value
 ;   target register name
 defword lea_reg64_disp8_reg64, 0
@@ -3382,12 +3606,6 @@ defword jmp_abs_indirect_reg64, 0
 defword syscall, 0
   dq docol, lit, 0x0F, pack8, lit, 0x05, pack8, exit
 
-; TODO mov_indirect_reg64_reg8
-; TODO mov_reg8_indirect_qreg
-; TODO mov_indirect_reg64_reg16
-; TODO mov_reg16_indirect_reg64
-; TODO mov_indirect_reg64_reg32
-; TODO mov_reg32_indirect_reg64
 ; TODO rep movsb
 ; TODO rep movsq
 ; TODO repnz scasb