w6a/asm: Jcc if-pyramid -> switch (Wave-2 structural)

Fold the 13-arm Jcc else-if pyramid in encode() to a single switch (op)
with the terminal else (isjcc=false) as the empty-label default case.
Pure op->cc value mapping, so a switch expresses it exactly.

Not byte-id-neutral (if-chain -> switch dispatch changes the asm). The
ladder<->switch byte-emission equivalence is pinned by 991_w6a_ww, whose
corpus (wwdump/w6l/w6a main.s) emits all 13 Jcc conditions, and was
independently reproduced at landing (all 13 mnemonics assemble
byte-identical C-w6a vs w6a_ww).

Regenerates the w6a combined.ww amalgamation (Jcc region only).
This commit is contained in:
2026-06-02 22:33:06 +09:00
parent 11e41ecea3
commit 52d15ae92d
2 changed files with 32 additions and 28 deletions

View File

@@ -804,20 +804,22 @@ export fn encode(a: *asm_) i32 = {
// Conditional jumps. 0x0F + cc + rel32. // Conditional jumps. 0x0F + cc + rel32.
let cc: u8 = 0u8; let cc: u8 = 0u8;
let isjcc: bool = true; let isjcc: bool = true;
if (op == A_JE) { cc = 132u8; } // 0x84 switch (op) {
else { if (op == A_JZ) { cc = 132u8; } case A_JE: cc = 132u8; // 0x84
else { if (op == A_JNE) { cc = 133u8; } case A_JZ: cc = 132u8;
else { if (op == A_JNZ) { cc = 133u8; } case A_JNE: cc = 133u8;
else { if (op == A_JL) { cc = 140u8; } case A_JNZ: cc = 133u8;
else { if (op == A_JLE) { cc = 142u8; } case A_JL: cc = 140u8;
else { if (op == A_JG) { cc = 143u8; } case A_JLE: cc = 142u8;
else { if (op == A_JGE) { cc = 141u8; } case A_JG: cc = 143u8;
else { if (op == A_JB) { cc = 130u8; } case A_JGE: cc = 141u8;
else { if (op == A_JBE) { cc = 134u8; } case A_JB: cc = 130u8;
else { if (op == A_JA) { cc = 135u8; } case A_JBE: cc = 134u8;
else { if (op == A_JAE) { cc = 131u8; } case A_JA: cc = 135u8;
else { if (op == A_JP) { cc = 138u8; } // 0x8A, UCOMISD unordered (#97) case A_JAE: cc = 131u8;
else { isjcc = false; };};};};};};};};};};};};}; case A_JP: cc = 138u8; // 0x8A, UCOMISD unordered (#97)
case: isjcc = false;
};
if (isjcc) { if (isjcc) {
emitbyte(a, 15u8); emitbyte(a, 15u8);
emitbyte(a, cc); emitbyte(a, cc);

View File

@@ -4526,20 +4526,22 @@ export fn encode(a: *asm_) i32 = {
// Conditional jumps. 0x0F + cc + rel32. // Conditional jumps. 0x0F + cc + rel32.
let cc: u8 = 0u8; let cc: u8 = 0u8;
let isjcc: bool = true; let isjcc: bool = true;
if (op == A_JE) { cc = 132u8; } // 0x84 switch (op) {
else { if (op == A_JZ) { cc = 132u8; } case A_JE: cc = 132u8; // 0x84
else { if (op == A_JNE) { cc = 133u8; } case A_JZ: cc = 132u8;
else { if (op == A_JNZ) { cc = 133u8; } case A_JNE: cc = 133u8;
else { if (op == A_JL) { cc = 140u8; } case A_JNZ: cc = 133u8;
else { if (op == A_JLE) { cc = 142u8; } case A_JL: cc = 140u8;
else { if (op == A_JG) { cc = 143u8; } case A_JLE: cc = 142u8;
else { if (op == A_JGE) { cc = 141u8; } case A_JG: cc = 143u8;
else { if (op == A_JB) { cc = 130u8; } case A_JGE: cc = 141u8;
else { if (op == A_JBE) { cc = 134u8; } case A_JB: cc = 130u8;
else { if (op == A_JA) { cc = 135u8; } case A_JBE: cc = 134u8;
else { if (op == A_JAE) { cc = 131u8; } case A_JA: cc = 135u8;
else { if (op == A_JP) { cc = 138u8; } // 0x8A, UCOMISD unordered (#97) case A_JAE: cc = 131u8;
else { isjcc = false; };};};};};};};};};};};};}; case A_JP: cc = 138u8; // 0x8A, UCOMISD unordered (#97)
case: isjcc = false;
};
if (isjcc) { if (isjcc) {
emitbyte(a, 15u8); emitbyte(a, 15u8);
emitbyte(a, cc); emitbyte(a, cc);