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:
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user