diff options
| -rw-r--r-- | quine.asm | 230 |
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 |