From 52d15ae92dd0be68b0432a47e69c15fe29f663bf Mon Sep 17 00:00:00 2001 From: Hojun-Cho Date: Tue, 2 Jun 2026 22:33:06 +0900 Subject: [PATCH] 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). --- selfhost/cmd/w6a/asm.ww | 30 ++++++++++++++++-------------- selfhost/cmd/w6a/main.combined.ww | 30 ++++++++++++++++-------------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/selfhost/cmd/w6a/asm.ww b/selfhost/cmd/w6a/asm.ww index cf9d6953..aebaab45 100644 --- a/selfhost/cmd/w6a/asm.ww +++ b/selfhost/cmd/w6a/asm.ww @@ -804,20 +804,22 @@ export fn encode(a: *asm_) i32 = { // Conditional jumps. 0x0F + cc + rel32. let cc: u8 = 0u8; let isjcc: bool = true; - if (op == A_JE) { cc = 132u8; } // 0x84 - else { if (op == A_JZ) { cc = 132u8; } - else { if (op == A_JNE) { cc = 133u8; } - else { if (op == A_JNZ) { cc = 133u8; } - else { if (op == A_JL) { cc = 140u8; } - else { if (op == A_JLE) { cc = 142u8; } - else { if (op == A_JG) { cc = 143u8; } - else { if (op == A_JGE) { cc = 141u8; } - else { if (op == A_JB) { cc = 130u8; } - else { if (op == A_JBE) { cc = 134u8; } - else { if (op == A_JA) { cc = 135u8; } - else { if (op == A_JAE) { cc = 131u8; } - else { if (op == A_JP) { cc = 138u8; } // 0x8A, UCOMISD unordered (#97) - else { isjcc = false; };};};};};};};};};};};};}; + switch (op) { + case A_JE: cc = 132u8; // 0x84 + case A_JZ: cc = 132u8; + case A_JNE: cc = 133u8; + case A_JNZ: cc = 133u8; + case A_JL: cc = 140u8; + case A_JLE: cc = 142u8; + case A_JG: cc = 143u8; + case A_JGE: cc = 141u8; + case A_JB: cc = 130u8; + case A_JBE: cc = 134u8; + case A_JA: cc = 135u8; + case A_JAE: cc = 131u8; + case A_JP: cc = 138u8; // 0x8A, UCOMISD unordered (#97) + case: isjcc = false; + }; if (isjcc) { emitbyte(a, 15u8); emitbyte(a, cc); diff --git a/selfhost/cmd/w6a/main.combined.ww b/selfhost/cmd/w6a/main.combined.ww index bdc12b93..2a910a0c 100644 --- a/selfhost/cmd/w6a/main.combined.ww +++ b/selfhost/cmd/w6a/main.combined.ww @@ -4526,20 +4526,22 @@ export fn encode(a: *asm_) i32 = { // Conditional jumps. 0x0F + cc + rel32. let cc: u8 = 0u8; let isjcc: bool = true; - if (op == A_JE) { cc = 132u8; } // 0x84 - else { if (op == A_JZ) { cc = 132u8; } - else { if (op == A_JNE) { cc = 133u8; } - else { if (op == A_JNZ) { cc = 133u8; } - else { if (op == A_JL) { cc = 140u8; } - else { if (op == A_JLE) { cc = 142u8; } - else { if (op == A_JG) { cc = 143u8; } - else { if (op == A_JGE) { cc = 141u8; } - else { if (op == A_JB) { cc = 130u8; } - else { if (op == A_JBE) { cc = 134u8; } - else { if (op == A_JA) { cc = 135u8; } - else { if (op == A_JAE) { cc = 131u8; } - else { if (op == A_JP) { cc = 138u8; } // 0x8A, UCOMISD unordered (#97) - else { isjcc = false; };};};};};};};};};};};};}; + switch (op) { + case A_JE: cc = 132u8; // 0x84 + case A_JZ: cc = 132u8; + case A_JNE: cc = 133u8; + case A_JNZ: cc = 133u8; + case A_JL: cc = 140u8; + case A_JLE: cc = 142u8; + case A_JG: cc = 143u8; + case A_JGE: cc = 141u8; + case A_JB: cc = 130u8; + case A_JBE: cc = 134u8; + case A_JA: cc = 135u8; + case A_JAE: cc = 131u8; + case A_JP: cc = 138u8; // 0x8A, UCOMISD unordered (#97) + case: isjcc = false; + }; if (isjcc) { emitbyte(a, 15u8); emitbyte(a, cc);