diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc index 2e0914a1..dd4b7c89 100644 --- a/src/buildvm_arm.dasc +++ b/src/buildvm_arm.dasc @@ -935,8 +935,8 @@ static void build_subroutines(BuildCtx *ctx) | ldrd CARG34, NODE:INS->key // STALL: early NODE:INS. | ldrd CARG12, NODE:INS->val | ldr NODE:INS, NODE:INS->next - | cmp CARG3, STR:RC - | checktpeq CARG4, LJ_TSTR + | checktp CARG4, LJ_TSTR + | cmpeq CARG3, STR:RC | beq >5 | cmp NODE:INS, #0 | bne <3 @@ -3111,8 +3111,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | ldrd CARG12, NODE:INS->key // STALL: early NODE:INS. | ldrd CARG34, NODE:INS->val | ldr NODE:INS, NODE:INS->next - | cmp CARG1, STR:RC - | checktpeq CARG2, LJ_TSTR + | checktp CARG2, LJ_TSTR + | cmpeq CARG1, STR:RC | bne >4 | checktp CARG4, LJ_TNIL | beq >5 @@ -3242,8 +3242,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | ldrd CARG12, NODE:INS->key | ldr CARG4, NODE:INS->val.it | ldr NODE:CARG3, NODE:INS->next - | cmp CARG1, STR:RC - | checktpeq CARG2, LJ_TSTR + | checktp CARG2, LJ_TSTR + | cmpeq CARG1, STR:RC | bne >5 | ldrb CARG2, TAB:RB->marked | checktp CARG4, LJ_TNIL // Key found, but nil value? diff --git a/src/buildvm_arm.h b/src/buildvm_arm.h index 2c97cee0..81229181 100644 --- a/src/buildvm_arm.h +++ b/src/buildvm_arm.h @@ -796,9 +796,9 @@ static const unsigned int build_actionlist[5777] = { 0x000c8100, 0xe51ee000, 0x000d8180, -0xe152000b, -0x03730000, +0xe3730000, 0x000a0000, +0x0152000b, 0x0a000000, 0x00050005, 0xe35e0000, @@ -4613,9 +4613,9 @@ static const unsigned int build_actionlist[5777] = { 0x000c8100, 0xe51ee000, 0x000d8180, -0xe150000b, -0x03710000, +0xe3710000, 0x000a0000, +0x0150000b, 0x1a000000, 0x00050004, 0xe3730000, @@ -4807,9 +4807,9 @@ static const unsigned int build_actionlist[5777] = { 0x000d8180, 0xe51e2000, 0x000d8180, -0xe150000b, -0x03710000, +0xe3710000, 0x000a0000, +0x0150000b, 0x1a000000, 0x00050005, 0xe55c1000, diff --git a/src/lj_asm_arm.h b/src/lj_asm_arm.h index a618c8a9..77751ca9 100644 --- a/src/lj_asm_arm.h +++ b/src/lj_asm_arm.h @@ -584,8 +584,8 @@ static void asm_href(ASMState *as, IRIns *ir, IROp merge) else emit_branch(as, ARMF_CC(ARMI_B, CC_EQ), l_end); if (!irt_ispri(kt)) { - emit_nm(as, ARMF_CC(ARMI_CMP, CC_EQ)^khi, tmp+1, keyhi); - emit_nm(as, ARMI_CMP^k, tmp, key); + emit_nm(as, ARMF_CC(ARMI_CMP, CC_EQ)^k, tmp, key); + emit_nm(as, ARMI_CMP^khi, tmp+1, keyhi); emit_lsox(as, ARMI_LDRD, tmp, dest, (int32_t)offsetof(Node, key)); } else { emit_n(as, ARMI_CMP^khi, tmp); @@ -674,10 +674,9 @@ static void asm_hrefk(ASMState *as, IRIns *ir) (int32_t)ir_knum(irkey)->u32.hi, allow); emit_opk(as, ARMI_CMP, 0, key, (int32_t)ir_knum(irkey)->u32.lo, allow); - } else if (ra_hasreg(key)) { - emit_n(as, ARMF_CC(ARMI_CMN, CC_EQ)|ARMI_K12|-irt_toitype(irkey->t), type); - emit_opk(as, ARMI_CMP, 0, key, irkey->i, allow); } else { + if (ra_hasreg(key)) + emit_opk(as, ARMF_CC(ARMI_CMP, CC_EQ), 0, key, irkey->i, allow); emit_n(as, ARMI_CMN|ARMI_K12|-irt_toitype(irkey->t), type); } emit_lso(as, ARMI_LDR, type, idx, kofs+4);