From 7c0227c5b6466b911add5afec0accaca368131a5 Mon Sep 17 00:00:00 2001 From: Irene Knapp Date: Thu, 6 Nov 2025 14:33:55 -0800 Subject: 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 --- quine.asm | 83 ++++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 45 insertions(+), 38 deletions(-) (limited to 'quine.asm') 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: -- cgit 1.4.1