From 1f60eb45742962ec5e86675b4fc7561cdca9d290 Mon Sep 17 00:00:00 2001 From: Benjamin Oldenburg Date: Fri, 20 Mar 2026 18:53:40 +0700 Subject: [PATCH] arm64-asm.c: deduplicate branch condition mapping asm_branch() had two identical 15-case switch blocks (30 lines total) that duplicated condition code mapping. This also duplicated the logic in the existing parse_condition() helper. Added get_branch_condition() helper that: 1. Maps branch tokens (TOK_ASM_beq) to condition tokens (TOK_ASM_eq) 2. Calls the existing parse_condition() helper 3. Returns the condition code (0-13) or -1 for non-conditional branches This reduces code duplication from 30 lines to a single 29-line helper function, and ensures all condition mapping logic is in one place. --- arm64-asm.c | 73 +++++++++++++++++++++++------------------------------ 1 file changed, 31 insertions(+), 42 deletions(-) diff --git a/arm64-asm.c b/arm64-asm.c index a0078bc7..6058d65e 100644 --- a/arm64-asm.c +++ b/arm64-asm.c @@ -1090,6 +1090,35 @@ static void asm_sysreg(TCCState *s1, int token) gen_msr(op.reg, sysreg); } +/* Get condition code from branch instruction token */ +static int get_branch_condition(int branch_token) +{ + int cond_token; + + /* Map branch token to condition token (strip 'b' prefix) */ + switch (branch_token) { + case TOK_ASM_beq: cond_token = TOK_ASM_eq; break; + case TOK_ASM_bne: cond_token = TOK_ASM_ne; break; + case TOK_ASM_bcs: + case TOK_ASM_bhs: cond_token = TOK_ASM_cs; break; + case TOK_ASM_bcc: + case TOK_ASM_blo: cond_token = TOK_ASM_cc; break; + case TOK_ASM_bmi: cond_token = TOK_ASM_mi; break; + case TOK_ASM_bpl: cond_token = TOK_ASM_pl; break; + case TOK_ASM_bvs: cond_token = TOK_ASM_vs; break; + case TOK_ASM_bvc: cond_token = TOK_ASM_vc; break; + case TOK_ASM_bhi: cond_token = TOK_ASM_hi; break; + case TOK_ASM_bls: cond_token = TOK_ASM_ls; break; + case TOK_ASM_bge: cond_token = TOK_ASM_ge; break; + case TOK_ASM_blt: cond_token = TOK_ASM_lt; break; + case TOK_ASM_bgt: cond_token = TOK_ASM_gt; break; + case TOK_ASM_ble: cond_token = TOK_ASM_le; break; + default: return -1; + } + + return parse_condition(cond_token); +} + /* Handle branch instructions */ static void asm_branch(TCCState *s1, int token) { @@ -1112,27 +1141,7 @@ static void asm_branch(TCCState *s1, int token) /* Symbolic address - emit relocation */ offset = 0; - /* Check for conditional branch */ - cond = -1; - switch (token) { - case TOK_ASM_beq: cond = 0; break; - case TOK_ASM_bne: cond = 1; break; - case TOK_ASM_bcs: - case TOK_ASM_bhs: cond = 2; break; - case TOK_ASM_bcc: - case TOK_ASM_blo: cond = 3; break; - case TOK_ASM_bmi: cond = 4; break; - case TOK_ASM_bpl: cond = 5; break; - case TOK_ASM_bvs: cond = 6; break; - case TOK_ASM_bvc: cond = 7; break; - case TOK_ASM_bhi: cond = 8; break; - case TOK_ASM_bls: cond = 9; break; - case TOK_ASM_bge: cond = 10; break; - case TOK_ASM_blt: cond = 11; break; - case TOK_ASM_bgt: cond = 12; break; - case TOK_ASM_ble: cond = 13; break; - } - + cond = get_branch_condition(token); if (cond >= 0) { /* Conditional branch - use CONDBR19 relocation */ gen_b_cond(cond, 0); @@ -1154,27 +1163,7 @@ static void asm_branch(TCCState *s1, int token) } else { offset = (int32_t)op.e.v - ind; - /* Check for conditional branch */ - cond = -1; - switch (token) { - case TOK_ASM_beq: cond = 0; break; - case TOK_ASM_bne: cond = 1; break; - case TOK_ASM_bcs: - case TOK_ASM_bhs: cond = 2; break; - case TOK_ASM_bcc: - case TOK_ASM_blo: cond = 3; break; - case TOK_ASM_bmi: cond = 4; break; - case TOK_ASM_bpl: cond = 5; break; - case TOK_ASM_bvs: cond = 6; break; - case TOK_ASM_bvc: cond = 7; break; - case TOK_ASM_bhi: cond = 8; break; - case TOK_ASM_bls: cond = 9; break; - case TOK_ASM_bge: cond = 10; break; - case TOK_ASM_blt: cond = 11; break; - case TOK_ASM_bgt: cond = 12; break; - case TOK_ASM_ble: cond = 13; break; - } - + cond = get_branch_condition(token); if (cond >= 0) { gen_b_cond(cond, offset); } else {