summary refs log tree commit diff
path: root/quine.asm
diff options
context:
space:
mode:
authorIrene Knapp <ireneista@irenes.space>2025-11-06 14:33:55 -0800
committerIrene Knapp <ireneista@irenes.space>2025-11-06 14:33:55 -0800
commit7c0227c5b6466b911add5afec0accaca368131a5 (patch)
tree3b280f963594c9865ccaab1067a06b4066679154 /quine.asm
parent082852f882c7dd64f18fe81193771f4d15dc48da (diff)
rename all the modrm_* words to addressing_*
also re-order "sib" to be before them

we were about to add one for indexed modes, and realized that really, these words are responsible for both the ModRM and SIB bytes, it's just that some modes only need one of them. this makes their responsibilities clearer, and as a bonus it draws a stronger distinction between these high-level words and the low-level "modrm", which omits consistency checking. having it called something else reduces the likelihood of inappropriately using the low-level one when a high-level one would be more suitable.

their names are a bit long now, but that's probably also good, it will incentivize building higher-level abstractions that define multiple variants of instructions rather than writing each one by hand. someday.

Force-Push: yes
Change-Id: Ia8f8fcc0e092f94e66f17a3fa55e8bf3e927fdff
Diffstat (limited to 'quine.asm')
-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: