From 90742d91c27d185b70d1b4a6343fb6b7c26002db Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sat, 9 Sep 2023 20:57:46 +0200 Subject: [PATCH] ARM64: Don't fuse sign extensions into logical operands. Thanks to Peter Cawley. #1076 --- src/lj_asm_arm64.h | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/lj_asm_arm64.h b/src/lj_asm_arm64.h index 05bdc78a..04834f57 100644 --- a/src/lj_asm_arm64.h +++ b/src/lj_asm_arm64.h @@ -216,16 +216,13 @@ static Reg asm_fuseahuref(ASMState *as, IRRef ref, int32_t *ofsp, RegSet allow, static uint32_t asm_fuseopm(ASMState *as, A64Ins ai, IRRef ref, RegSet allow) { IRIns *ir = IR(ref); + int logical = (ai & 0x1f000000) == 0x0a000000; if (ra_hasreg(ir->r)) { ra_noweak(as, ir->r); return A64F_M(ir->r); } else if (irref_isk(ref)) { - uint32_t m; int64_t k = get_k64val(as, ref); - if ((ai & 0x1f000000) == 0x0a000000) - m = emit_isk13(k, irt_is64(ir->t)); - else - m = emit_isk12(k); + uint32_t m = logical ? emit_isk13(k, irt_is64(ir->t)) : emit_isk12(k); if (m) return m; } else if (mayfuse(as, ref)) { @@ -237,7 +234,7 @@ static uint32_t asm_fuseopm(ASMState *as, A64Ins ai, IRRef ref, RegSet allow) (IR(ir->op2)->i & (irt_is64(ir->t) ? 63 : 31)); IRIns *irl = IR(ir->op1); if (sh == A64SH_LSL && - irl->o == IR_CONV && + irl->o == IR_CONV && !logical && irl->op2 == ((IRT_I64<op1, allow); return A64F_M(m) | A64F_SH(sh, shift); } - } else if (ir->o == IR_CONV && + } else if (ir->o == IR_CONV && !logical && ir->op2 == ((IRT_I64<op1, allow); return A64F_M(m) | A64F_EX(A64EX_SXTW);