summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--quine.asm83
1 files changed, 45 insertions, 38 deletions
diff --git a/quine.asm b/quine.asm
index 13c28a1..9dedc18 100644
--- a/quine.asm
+++ b/quine.asm
@@ -177,6 +177,8 @@ end macro
 ;
 ; "Above" and "below" are for unsigned comparisons. "Greater" and "less" are
 ; for signed comparisons.
+;
+; This is documented on the individual opcode pages, and also in B.1.4.7.
 macro conditioncode cc, condition
   match =above, condition
     cc = 0x07
@@ -2917,6 +2919,14 @@ defword opcodereg, 0
 defword modrm, 0
   dq docol, swap, lit, 8, mul, or, swap, lit, 64, mul, or, pack8, exit
 
+; Stack
+;   output point
+;   scale field
+;   index field
+;   base field
+defword sib, 0
+  dq docol, swap, lit, 8, mul, or, swap, lit, 64, mul, or, pack8, exit
+
 ;   The simplest of the modrm modes: Direct register addressing. There are no
 ; special cases to check.
 ;
@@ -2930,7 +2940,7 @@ defword modrm, 0
 ;   output point
 ;   reg/op field value (raw number)
 ;   reg/mem field register name
-defword modrm_reg64, 0
+defword addressing_reg64, 0
   dq docol, reg64, lit, 3, unroll3, modrm, exit
 
 ;   This is a helper for assembly instructions that want to do a form of
@@ -2947,7 +2957,7 @@ defword modrm_reg64, 0
 ;   output point
 ;   reg/op field value (raw number)
 ;   reg/mem field register name
-defword modrm_indirect_reg64, 0
+defword addressing_indirect_reg64, 0
   dq docol
   ; Exit with an error if the R/M register is rbp.
   dq dup, rbp, ne, zbranch, 23*8
@@ -2957,7 +2967,8 @@ defword modrm_indirect_reg64, 0
   ; If the R/M register was rsp, we need an SIB byte; otherwise, skip it.
   dq swap, zbranch, 8*8, lit, 0, lit, 4, rsp, reg64, sib
   dq exit
-  dq litstring, "R/M parameter to modrm_indirect_reg64 is rbp.", emitstring
+  dq litstring, "R/M parameter to addressing_indirect_reg64 is rbp."
+  dq emitstring
   dq lit, 1, sys_exit
 
 ;   This mode can do rbp fine, rsp is the only unusual case.
@@ -2967,7 +2978,7 @@ defword modrm_indirect_reg64, 0
 ;   reg/op field value (raw number)
 ;   reg/mem field register name
 ;   displacement value
-defword modrm_disp8_reg64, 0
+defword addressing_disp8_reg64, 0
   dq docol
   ; Check whether the R/M register is rsp; save the test result for later.
   dq swap, dup, rsp, eq, lit, 5, unroll, swap
@@ -2980,14 +2991,6 @@ defword modrm_disp8_reg64, 0
   dq swap, pack8
   dq exit
 
-; Stack
-;   output point
-;   scale field
-;   index field
-;   base field
-defword sib, 0
-  dq docol, swap, lit, 8, mul, or, swap, lit, 64, mul, or, pack8, exit
-
 ; Stack:
 ;   output point
 defword cld, 0
@@ -3018,7 +3021,7 @@ defword mov_extrareg64_imm64, 0
 defword mov_reg64_reg64, 0
   dq docol
   dq roll3, rex_w, lit, 0x89, pack8, unroll3
-  dq swap, reg64, swap, modrm_reg64
+  dq swap, reg64, swap, addressing_reg64
   dq exit
 
 ; Stack:
@@ -3028,7 +3031,7 @@ defword mov_reg64_reg64, 0
 defword mov_indirect_reg64_reg64, 0
   dq docol
   dq roll3, rex_w, lit, 0x89, pack8, unroll3
-  dq swap, reg64, swap, modrm_indirect_reg64
+  dq swap, reg64, swap, addressing_indirect_reg64
   dq exit
 
 ; Stack:
@@ -3039,7 +3042,7 @@ defword mov_indirect_reg64_reg64, 0
 defword mov_disp8_reg64_reg64, 0
   dq docol
   dq lit, 4, roll, rex_w, lit, 0x89, pack8, lit, 4, unroll
-  dq roll3, reg64, unroll3, modrm_disp8_reg64
+  dq roll3, reg64, unroll3, addressing_disp8_reg64
   dq exit
 
 ; Stack:
@@ -3049,7 +3052,7 @@ defword mov_disp8_reg64_reg64, 0
 defword mov_reg64_indirect_reg64, 0
   dq docol
   dq roll3, rex_w, lit, 0x8B, pack8, unroll3
-  dq reg64, swap, modrm_indirect_reg64
+  dq reg64, swap, addressing_indirect_reg64
   dq exit
 
 ; Stack:
@@ -3060,7 +3063,7 @@ defword mov_reg64_indirect_reg64, 0
 defword mov_reg64_disp8_reg64, 0
   dq docol
   dq lit, 4, roll, rex_w, lit, 0x8B, pack8, lit, 4, unroll
-  dq reg64, unroll3, modrm_disp8_reg64
+  dq reg64, unroll3, addressing_disp8_reg64
   dq exit
 
 ; Stack:
@@ -3071,7 +3074,7 @@ defword mov_reg64_disp8_reg64, 0
 defword lea_reg64_disp8_reg64, 0
   dq docol
   dq lit, 4, roll, rex_w, lit, 0x8D, pack8, lit, 4, unroll
-  dq reg64, unroll3, modrm_disp8_reg64
+  dq reg64, unroll3, addressing_disp8_reg64
   dq exit
 
 ; Stack:
@@ -3098,7 +3101,7 @@ defword lodsq, 0
 defword add_reg64_reg64, 0
   dq docol
   dq roll3, rex_w, lit, 0x01, pack8, unroll3
-  dq swap, reg64, swap, modrm_reg64
+  dq swap, reg64, swap, addressing_reg64
   dq exit
 
 ; Stack:
@@ -3108,7 +3111,7 @@ defword add_reg64_reg64, 0
 defword add_indirect_reg64_reg64, 0
   dq docol
   dq roll3, rex_w, lit, 0x01, pack8, unroll3
-  dq swap, reg64, swap, modrm_indirect_reg64
+  dq swap, reg64, swap, addressing_indirect_reg64
   dq exit
 
 ; Stack:
@@ -3118,7 +3121,7 @@ defword add_indirect_reg64_reg64, 0
 defword add_reg64_indirect_reg64, 0
   dq docol
   dq roll3, rex_w, lit, 0x03, pack8, unroll3
-  dq reg64, swap, modrm_indirect_reg64
+  dq reg64, swap, addressing_indirect_reg64
   dq exit
 
 ; Stack:
@@ -3127,7 +3130,7 @@ defword add_reg64_indirect_reg64, 0
 ;   target register name
 defword add_reg64_imm8, 0
   dq docol
-  dq roll3, rex_w, lit, 0x83, pack8, swap, lit, 0, swap, modrm_reg64
+  dq roll3, rex_w, lit, 0x83, pack8, swap, lit, 0, swap, addressing_reg64
   dq swap, pack8
   dq exit
 
@@ -3138,7 +3141,7 @@ defword add_reg64_imm8, 0
 defword sub_reg64_reg64, 0
   dq docol
   dq roll3, rex_w, lit, 0x2B, pack8, unroll3
-  dq swap, reg64, swap, modrm_reg64
+  dq swap, reg64, swap, addressing_reg64
 
 ; Stack:
 ;   output point
@@ -3147,7 +3150,7 @@ defword sub_reg64_reg64, 0
 defword sub_indirect_reg64_reg64, 0
   dq docol
   dq roll3, rex_w, lit, 0x2B, pack8, unroll3
-  dq swap, reg64, swap, modrm_indirect_reg64
+  dq swap, reg64, swap, addressing_indirect_reg64
 
 ; Stack:
 ;   output point
@@ -3156,7 +3159,7 @@ defword sub_indirect_reg64_reg64, 0
 defword mul_reg64_reg64, 0
   dq docol
   dq roll3, rex_w, lit, 0xF7, pack8, unroll3
-  dq swap, reg64, swap, modrm_reg64
+  dq swap, reg64, swap, addressing_reg64
   dq exit
 
 ;   The dividend is 128 bits, and is formed from rdx as the high half and rax
@@ -3172,7 +3175,7 @@ defword mul_reg64_reg64, 0
 defword divmod_reg64, 0
   dq docol
   dq swap, rex_w, lit, 0xF7, pack8, swap
-  dq lit, 6, swap, modrm_reg64
+  dq lit, 6, swap, addressing_reg64
 
 ; Same as divmod, but signed.
 ;
@@ -3182,19 +3185,23 @@ defword divmod_reg64, 0
 defword idivmod_reg64, 0
   dq docol
   dq swap, rex_w, lit, 0xF7, pack8, swap
-  dq lit, 7, swap, modrm_reg64
+  dq lit, 7, swap, addressing_reg64
 
 ; Stack:
 ;   output point
 ;   target register name
 defword inc_reg64, 0
-  dq docol, swap, rex_w, lit, 0xFF, pack8, swap, lit, 0, swap, modrm_reg64
+  dq docol
+  dq swap, rex_w, lit, 0xFF, pack8, swap, lit, 0, swap, addressing_reg64
+  dq exit
 
 ; Stack:
 ;   output point
 ;   target register name
 defword dec_reg64, 0
-  dq docol, swap, rex_w, lit, 0xFF, pack8, swap, lit, 1, swap, modrm_reg64
+  dq docol
+  dq swap, rex_w, lit, 0xFF, pack8, swap, lit, 1, swap, addressing_reg64
+  dq exit
 
 ; Stack:
 ;   output point
@@ -3203,7 +3210,7 @@ defword dec_reg64, 0
 defword and_reg64_reg64, 0
   dq docol
   dq roll3, rex_w, lit, 0x23, pack8, unroll3
-  dq reg64, swap, modrm_reg64
+  dq reg64, swap, addressing_reg64
   dq exit
 
 ; Stack:
@@ -3213,7 +3220,7 @@ defword and_reg64_reg64, 0
 defword and_reg64_imm8, 0
   dq docol
   dq roll3, rex_w, lit, 0x83, pack8, swap
-  dq lit, 4, swap, modrm_reg64
+  dq lit, 4, swap, addressing_reg64
   dq swap, pack8
   dq exit
 
@@ -3224,7 +3231,7 @@ defword and_reg64_imm8, 0
 defword or_reg64_reg64, 0
   dq docol
   dq roll3, rex_w, lit, 0x0B, pack8, unroll3
-  dq reg64, swap, modrm_reg64
+  dq reg64, swap, addressing_reg64
   dq exit
 
 ; Stack:
@@ -3234,7 +3241,7 @@ defword or_reg64_reg64, 0
 defword or_reg64_imm8, 0
   dq docol
   dq roll3, rex_w, lit, 0x83, pack8, swap
-  dq lit, 1, swap, modrm_reg64
+  dq lit, 1, swap, addressing_reg64
   dq swap, pack8
   dq exit
 
@@ -3245,7 +3252,7 @@ defword or_reg64_imm8, 0
 defword xor_reg64_reg64, 0
   dq docol
   dq roll3, rex_w, lit, 0x33, pack8, unroll3
-  dq reg64, swap, modrm_reg64
+  dq reg64, swap, addressing_reg64
   dq exit
 
 ; Stack:
@@ -3254,7 +3261,7 @@ defword xor_reg64_reg64, 0
 defword not_reg64, 0
   dq docol
   dq swap, rex_w, lit, 0xF7, pack8
-  dq swap, lit, 2, swap, modrm_reg64
+  dq swap, lit, 2, swap, addressing_reg64
   dq exit
 
 ; Stack:
@@ -3264,7 +3271,7 @@ defword not_reg64, 0
 defword cmp_reg64_reg64, 0
   dq docol
   dq roll3, rex_w, 0x3B, pack8, unroll3
-  dq swap, reg64, swap, modrm_reg64
+  dq swap, reg64, swap, addressing_reg64
   dq exit
 
 ; Stack:
@@ -3274,7 +3281,7 @@ defword cmp_reg64_reg64, 0
 defword test_reg64_reg64, 0
   dq docol
   dq roll3, rex_w, 0x85, pack8, unroll3
-  dq swap, reg64, swap, modrm_reg64
+  dq swap, reg64, swap, addressing_reg64
   dq exit
 
 ; Stack:
@@ -3283,7 +3290,7 @@ defword test_reg64_reg64, 0
 defword jmp_abs_indirect_reg64, 0
   dq docol
   dq swap, lit, 0xFF, pack8, swap
-  dq lit, 4, swap, modrm_indirect_reg64
+  dq lit, 4, swap, addressing_indirect_reg64
   dq exit
 
 ; Stack: