aboutsummaryrefslogtreecommitdiff
path: root/src/lj_asm_arm.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lj_asm_arm.h44
1 files changed, 23 insertions, 21 deletions
diff --git a/src/lj_asm_arm.h b/src/lj_asm_arm.h
index 37bfa40f..e222e541 100644
--- a/src/lj_asm_arm.h
+++ b/src/lj_asm_arm.h
@@ -979,7 +979,7 @@ static ARMIns asm_fxloadins(IRIns *ir)
979 case IRT_I16: return ARMI_LDRSH; 979 case IRT_I16: return ARMI_LDRSH;
980 case IRT_U16: return ARMI_LDRH; 980 case IRT_U16: return ARMI_LDRH;
981 case IRT_NUM: lua_assert(!LJ_SOFTFP); return ARMI_VLDR_D; 981 case IRT_NUM: lua_assert(!LJ_SOFTFP); return ARMI_VLDR_D;
982 case IRT_FLOAT: if (!LJ_SOFTFP) return ARMI_VLDR_S; 982 case IRT_FLOAT: if (!LJ_SOFTFP) return ARMI_VLDR_S; /* fallthrough */
983 default: return ARMI_LDR; 983 default: return ARMI_LDR;
984 } 984 }
985} 985}
@@ -990,7 +990,7 @@ static ARMIns asm_fxstoreins(IRIns *ir)
990 case IRT_I8: case IRT_U8: return ARMI_STRB; 990 case IRT_I8: case IRT_U8: return ARMI_STRB;
991 case IRT_I16: case IRT_U16: return ARMI_STRH; 991 case IRT_I16: case IRT_U16: return ARMI_STRH;
992 case IRT_NUM: lua_assert(!LJ_SOFTFP); return ARMI_VSTR_D; 992 case IRT_NUM: lua_assert(!LJ_SOFTFP); return ARMI_VSTR_D;
993 case IRT_FLOAT: if (!LJ_SOFTFP) return ARMI_VSTR_S; 993 case IRT_FLOAT: if (!LJ_SOFTFP) return ARMI_VSTR_S; /* fallthrough */
994 default: return ARMI_STR; 994 default: return ARMI_STR;
995 } 995 }
996} 996}
@@ -1412,14 +1412,29 @@ static void asm_intop(ASMState *as, IRIns *ir, ARMIns ai)
1412 emit_dn(as, ai^m, dest, left); 1412 emit_dn(as, ai^m, dest, left);
1413} 1413}
1414 1414
1415static void asm_intop_s(ASMState *as, IRIns *ir, ARMIns ai) 1415/* Try to drop cmp r, #0. */
1416static ARMIns asm_drop_cmp0(ASMState *as, ARMIns ai)
1416{ 1417{
1417 if (as->flagmcp == as->mcp) { /* Drop cmp r, #0. */ 1418 if (as->flagmcp == as->mcp) {
1419 uint32_t cc = (as->mcp[1] >> 28);
1418 as->flagmcp = NULL; 1420 as->flagmcp = NULL;
1419 as->mcp++; 1421 if (cc <= CC_NE) {
1420 ai |= ARMI_S; 1422 as->mcp++;
1423 ai |= ARMI_S;
1424 } else if (cc == CC_GE) {
1425 *++as->mcp ^= ((CC_GE^CC_PL) << 28);
1426 ai |= ARMI_S;
1427 } else if (cc == CC_LT) {
1428 *++as->mcp ^= ((CC_LT^CC_MI) << 28);
1429 ai |= ARMI_S;
1430 } /* else: other conds don't work in general. */
1421 } 1431 }
1422 asm_intop(as, ir, ai); 1432 return ai;
1433}
1434
1435static void asm_intop_s(ASMState *as, IRIns *ir, ARMIns ai)
1436{
1437 asm_intop(as, ir, asm_drop_cmp0(as, ai));
1423} 1438}
1424 1439
1425static void asm_intneg(ASMState *as, IRIns *ir, ARMIns ai) 1440static void asm_intneg(ASMState *as, IRIns *ir, ARMIns ai)
@@ -1514,20 +1529,7 @@ static void asm_neg(ASMState *as, IRIns *ir)
1514 1529
1515static void asm_bitop(ASMState *as, IRIns *ir, ARMIns ai) 1530static void asm_bitop(ASMState *as, IRIns *ir, ARMIns ai)
1516{ 1531{
1517 if (as->flagmcp == as->mcp) { /* Try to drop cmp r, #0. */ 1532 ai = asm_drop_cmp0(as, ai);
1518 uint32_t cc = (as->mcp[1] >> 28);
1519 as->flagmcp = NULL;
1520 if (cc <= CC_NE) {
1521 as->mcp++;
1522 ai |= ARMI_S;
1523 } else if (cc == CC_GE) {
1524 *++as->mcp ^= ((CC_GE^CC_PL) << 28);
1525 ai |= ARMI_S;
1526 } else if (cc == CC_LT) {
1527 *++as->mcp ^= ((CC_LT^CC_MI) << 28);
1528 ai |= ARMI_S;
1529 } /* else: other conds don't work with bit ops. */
1530 }
1531 if (ir->op2 == 0) { 1533 if (ir->op2 == 0) {
1532 Reg dest = ra_dest(as, ir, RSET_GPR); 1534 Reg dest = ra_dest(as, ir, RSET_GPR);
1533 uint32_t m = asm_fuseopm(as, ai, ir->op1, RSET_GPR); 1535 uint32_t m = asm_fuseopm(as, ai, ir->op1, RSET_GPR);