diff options
| -rw-r--r-- | src/lj_asm.c | 31 | ||||
| -rw-r--r-- | src/lj_asm_arm.h | 6 | ||||
| -rw-r--r-- | src/lj_asm_x86.h | 4 | ||||
| -rw-r--r-- | src/lj_ir.h | 2 | ||||
| -rw-r--r-- | src/lj_opt_split.c | 2 | ||||
| -rw-r--r-- | src/lj_target_arm.h | 1 | ||||
| -rw-r--r-- | src/lj_target_x86.h | 1 |
7 files changed, 26 insertions, 21 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c index b12b7466..4187a1d9 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c | |||
| @@ -703,14 +703,14 @@ static void ra_leftov(ASMState *as, Reg dest, IRRef lref) | |||
| 703 | #endif | 703 | #endif |
| 704 | 704 | ||
| 705 | #if !LJ_TARGET_X86ORX64 | 705 | #if !LJ_TARGET_X86ORX64 |
| 706 | /* Force a RID_RET/RID_RETHI destination register pair (marked as free). */ | 706 | /* Force a RID_RETLO/RID_RETHI destination register pair (marked as free). */ |
| 707 | static void ra_destpair(ASMState *as, IRIns *ir) | 707 | static void ra_destpair(ASMState *as, IRIns *ir) |
| 708 | { | 708 | { |
| 709 | Reg destlo = ir->r, desthi = (ir+1)->r; | 709 | Reg destlo = ir->r, desthi = (ir+1)->r; |
| 710 | /* First spill unrelated refs blocking the destination registers. */ | 710 | /* First spill unrelated refs blocking the destination registers. */ |
| 711 | if (!rset_test(as->freeset, RID_RET) && | 711 | if (!rset_test(as->freeset, RID_RETLO) && |
| 712 | destlo != RID_RET && desthi != RID_RET) | 712 | destlo != RID_RETLO && desthi != RID_RETLO) |
| 713 | ra_restore(as, regcost_ref(as->cost[RID_RET])); | 713 | ra_restore(as, regcost_ref(as->cost[RID_RETLO])); |
| 714 | if (!rset_test(as->freeset, RID_RETHI) && | 714 | if (!rset_test(as->freeset, RID_RETHI) && |
| 715 | destlo != RID_RETHI && desthi != RID_RETHI) | 715 | destlo != RID_RETHI && desthi != RID_RETHI) |
| 716 | ra_restore(as, regcost_ref(as->cost[RID_RETHI])); | 716 | ra_restore(as, regcost_ref(as->cost[RID_RETHI])); |
| @@ -719,7 +719,7 @@ static void ra_destpair(ASMState *as, IRIns *ir) | |||
| 719 | ra_free(as, destlo); | 719 | ra_free(as, destlo); |
| 720 | ra_modified(as, destlo); | 720 | ra_modified(as, destlo); |
| 721 | } else { | 721 | } else { |
| 722 | destlo = RID_RET; | 722 | destlo = RID_RETLO; |
| 723 | } | 723 | } |
| 724 | if (ra_hasreg(desthi)) { | 724 | if (ra_hasreg(desthi)) { |
| 725 | ra_free(as, desthi); | 725 | ra_free(as, desthi); |
| @@ -729,24 +729,24 @@ static void ra_destpair(ASMState *as, IRIns *ir) | |||
| 729 | } | 729 | } |
| 730 | /* Check for conflicts and shuffle the registers as needed. */ | 730 | /* Check for conflicts and shuffle the registers as needed. */ |
| 731 | if (destlo == RID_RETHI) { | 731 | if (destlo == RID_RETHI) { |
| 732 | if (desthi == RID_RET) { | 732 | if (desthi == RID_RETLO) { |
| 733 | emit_movrr(as, ir, RID_RETHI, RID_TMP); | 733 | emit_movrr(as, ir, RID_RETHI, RID_TMP); |
| 734 | emit_movrr(as, ir, RID_RET, RID_RETHI); | 734 | emit_movrr(as, ir, RID_RETLO, RID_RETHI); |
| 735 | emit_movrr(as, ir, RID_TMP, RID_RET); | 735 | emit_movrr(as, ir, RID_TMP, RID_RETLO); |
| 736 | } else { | 736 | } else { |
| 737 | emit_movrr(as, ir, RID_RETHI, RID_RET); | 737 | emit_movrr(as, ir, RID_RETHI, RID_RETLO); |
| 738 | if (desthi != RID_RETHI) emit_movrr(as, ir, desthi, RID_RETHI); | 738 | if (desthi != RID_RETHI) emit_movrr(as, ir, desthi, RID_RETHI); |
| 739 | } | 739 | } |
| 740 | } else if (desthi == RID_RET) { | 740 | } else if (desthi == RID_RETLO) { |
| 741 | emit_movrr(as, ir, RID_RET, RID_RETHI); | 741 | emit_movrr(as, ir, RID_RETLO, RID_RETHI); |
| 742 | if (destlo != RID_RET) emit_movrr(as, ir, destlo, RID_RET); | 742 | if (destlo != RID_RETLO) emit_movrr(as, ir, destlo, RID_RETLO); |
| 743 | } else { | 743 | } else { |
| 744 | if (desthi != RID_RETHI) emit_movrr(as, ir, desthi, RID_RETHI); | 744 | if (desthi != RID_RETHI) emit_movrr(as, ir, desthi, RID_RETHI); |
| 745 | if (destlo != RID_RET) emit_movrr(as, ir, destlo, RID_RET); | 745 | if (destlo != RID_RETLO) emit_movrr(as, ir, destlo, RID_RETLO); |
| 746 | } | 746 | } |
| 747 | /* Restore spill slots (if any). */ | 747 | /* Restore spill slots (if any). */ |
| 748 | if (ra_hasspill((ir+1)->s)) ra_save(as, ir+1, RID_RETHI); | 748 | if (ra_hasspill((ir+1)->s)) ra_save(as, ir+1, RID_RETHI); |
| 749 | if (ra_hasspill(ir->s)) ra_save(as, ir, RID_RET); | 749 | if (ra_hasspill(ir->s)) ra_save(as, ir, RID_RETLO); |
| 750 | } | 750 | } |
| 751 | #endif | 751 | #endif |
| 752 | 752 | ||
| @@ -1520,6 +1520,9 @@ static void asm_setup_regsp(ASMState *as) | |||
| 1520 | #if LJ_SOFTFP | 1520 | #if LJ_SOFTFP |
| 1521 | case IR_MIN: case IR_MAX: | 1521 | case IR_MIN: case IR_MAX: |
| 1522 | #endif | 1522 | #endif |
| 1523 | #if LJ_BE | ||
| 1524 | (ir-1)->prev = REGSP_HINT(RID_RETLO); | ||
| 1525 | #endif | ||
| 1523 | ir->prev = REGSP_HINT(RID_RETHI); | 1526 | ir->prev = REGSP_HINT(RID_RETHI); |
| 1524 | continue; | 1527 | continue; |
| 1525 | default: | 1528 | default: |
diff --git a/src/lj_asm_arm.h b/src/lj_asm_arm.h index 9da618ce..20c5d40a 100644 --- a/src/lj_asm_arm.h +++ b/src/lj_asm_arm.h | |||
| @@ -516,7 +516,7 @@ static void asm_href(ASMState *as, IRIns *ir, IROp merge) | |||
| 516 | int destused = ra_used(ir); | 516 | int destused = ra_used(ir); |
| 517 | Reg dest = ra_dest(as, ir, allow); | 517 | Reg dest = ra_dest(as, ir, allow); |
| 518 | Reg tab = ra_alloc1(as, ir->op1, rset_clear(allow, dest)); | 518 | Reg tab = ra_alloc1(as, ir->op1, rset_clear(allow, dest)); |
| 519 | Reg key = 0, keyhi = 0, keynumhi = RID_NONE, tmp = RID_LR; | 519 | Reg key = 0, keyhi = 0, keynumhi = RID_NONE, tmp = RID_TMP; |
| 520 | IRRef refkey = ir->op2; | 520 | IRRef refkey = ir->op2; |
| 521 | IRIns *irkey = IR(refkey); | 521 | IRIns *irkey = IR(refkey); |
| 522 | IRType1 kt = irkey->t; | 522 | IRType1 kt = irkey->t; |
| @@ -1213,7 +1213,7 @@ static void asm_fpmin_max(ASMState *as, IRIns *ir, int cc) | |||
| 1213 | ra_evictset(as, drop); | 1213 | ra_evictset(as, drop); |
| 1214 | ra_destpair(as, ir); | 1214 | ra_destpair(as, ir); |
| 1215 | emit_dm(as, ARMF_CC(ARMI_MOV, cc), RID_RETHI, RID_R3); | 1215 | emit_dm(as, ARMF_CC(ARMI_MOV, cc), RID_RETHI, RID_R3); |
| 1216 | emit_dm(as, ARMF_CC(ARMI_MOV, cc), RID_RET, RID_R2); | 1216 | emit_dm(as, ARMF_CC(ARMI_MOV, cc), RID_RETLO, RID_R2); |
| 1217 | emit_call(as, (void *)ci->func); | 1217 | emit_call(as, (void *)ci->func); |
| 1218 | for (r = RID_R0; r <= RID_R3; r++) | 1218 | for (r = RID_R0; r <= RID_R3; r++) |
| 1219 | ra_leftov(as, r, args[r-RID_R0]); | 1219 | ra_leftov(as, r, args[r-RID_R0]); |
| @@ -1407,7 +1407,7 @@ static void asm_hiop(ASMState *as, IRIns *ir) | |||
| 1407 | case IR_CALLS: | 1407 | case IR_CALLS: |
| 1408 | case IR_CALLXS: | 1408 | case IR_CALLXS: |
| 1409 | if (!uselo) | 1409 | if (!uselo) |
| 1410 | ra_allocref(as, ir->op1, RID2RSET(RID_RET)); /* Mark lo op as used. */ | 1410 | ra_allocref(as, ir->op1, RID2RSET(RID_RETLO)); /* Mark lo op as used. */ |
| 1411 | break; | 1411 | break; |
| 1412 | case IR_ASTORE: case IR_HSTORE: case IR_USTORE: | 1412 | case IR_ASTORE: case IR_HSTORE: case IR_USTORE: |
| 1413 | case IR_TOSTR: case IR_CNEWI: | 1413 | case IR_TOSTR: case IR_CNEWI: |
diff --git a/src/lj_asm_x86.h b/src/lj_asm_x86.h index 21ab7c25..ae90309b 100644 --- a/src/lj_asm_x86.h +++ b/src/lj_asm_x86.h | |||
| @@ -479,7 +479,7 @@ static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci) | |||
| 479 | dest, RID_ESP, ofs); | 479 | dest, RID_ESP, ofs); |
| 480 | } | 480 | } |
| 481 | if ((ci->flags & CCI_CASTU64)) { | 481 | if ((ci->flags & CCI_CASTU64)) { |
| 482 | emit_movtomro(as, RID_RET, RID_ESP, ofs); | 482 | emit_movtomro(as, RID_RETLO, RID_ESP, ofs); |
| 483 | emit_movtomro(as, RID_RETHI, RID_ESP, ofs+4); | 483 | emit_movtomro(as, RID_RETHI, RID_ESP, ofs+4); |
| 484 | } else { | 484 | } else { |
| 485 | emit_rmro(as, irt_isnum(ir->t) ? XO_FSTPq : XO_FSTPd, | 485 | emit_rmro(as, irt_isnum(ir->t) ? XO_FSTPq : XO_FSTPd, |
| @@ -2180,7 +2180,7 @@ static void asm_hiop(ASMState *as, IRIns *ir) | |||
| 2180 | case IR_CALLXS: | 2180 | case IR_CALLXS: |
| 2181 | ra_destreg(as, ir, RID_RETHI); | 2181 | ra_destreg(as, ir, RID_RETHI); |
| 2182 | if (!uselo) | 2182 | if (!uselo) |
| 2183 | ra_allocref(as, ir->op1, RID2RSET(RID_RET)); /* Mark call as used. */ | 2183 | ra_allocref(as, ir->op1, RID2RSET(RID_RETLO)); /* Mark call as used. */ |
| 2184 | break; | 2184 | break; |
| 2185 | case IR_CNEWI: | 2185 | case IR_CNEWI: |
| 2186 | /* Nothing to do here. Handled by CNEWI itself. */ | 2186 | /* Nothing to do here. Handled by CNEWI itself. */ |
diff --git a/src/lj_ir.h b/src/lj_ir.h index 1c9c90d7..7a9f1a9c 100644 --- a/src/lj_ir.h +++ b/src/lj_ir.h | |||
| @@ -195,7 +195,7 @@ IRFPMDEF(FPMENUM) | |||
| 195 | _(CDATA_TYPEID, offsetof(GCcdata, typeid)) \ | 195 | _(CDATA_TYPEID, offsetof(GCcdata, typeid)) \ |
| 196 | _(CDATA_PTR, sizeof(GCcdata)) \ | 196 | _(CDATA_PTR, sizeof(GCcdata)) \ |
| 197 | _(CDATA_INT64, sizeof(GCcdata)) \ | 197 | _(CDATA_INT64, sizeof(GCcdata)) \ |
| 198 | _(CDATA_INT64HI, sizeof(GCcdata) + 4) | 198 | _(CDATA_INT64_4, sizeof(GCcdata) + 4) |
| 199 | 199 | ||
| 200 | typedef enum { | 200 | typedef enum { |
| 201 | #define FLENUM(name, ofs) IRFL_##name, | 201 | #define FLENUM(name, ofs) IRFL_##name, |
diff --git a/src/lj_opt_split.c b/src/lj_opt_split.c index 1ea2c057..61275b03 100644 --- a/src/lj_opt_split.c +++ b/src/lj_opt_split.c | |||
| @@ -411,7 +411,7 @@ static void split_ir(jit_State *J) | |||
| 411 | break; | 411 | break; |
| 412 | case IR_FLOAD: | 412 | case IR_FLOAD: |
| 413 | lua_assert(ir->op2 == IRFL_CDATA_INT64); | 413 | lua_assert(ir->op2 == IRFL_CDATA_INT64); |
| 414 | hi = split_emit(J, IRTI(IR_FLOAD), nir->op1, IRFL_CDATA_INT64HI); | 414 | hi = split_emit(J, IRTI(IR_FLOAD), nir->op1, IRFL_CDATA_INT64_4); |
| 415 | #if LJ_BE | 415 | #if LJ_BE |
| 416 | ir->prev = hi; hi = nref; | 416 | ir->prev = hi; hi = nref; |
| 417 | #endif | 417 | #endif |
diff --git a/src/lj_target_arm.h b/src/lj_target_arm.h index 78a5679d..210fe497 100644 --- a/src/lj_target_arm.h +++ b/src/lj_target_arm.h | |||
| @@ -28,6 +28,7 @@ enum { | |||
| 28 | 28 | ||
| 29 | /* Calling conventions. */ | 29 | /* Calling conventions. */ |
| 30 | RID_RET = RID_R0, | 30 | RID_RET = RID_R0, |
| 31 | RID_RETLO = RID_R0, | ||
| 31 | RID_RETHI = RID_R1, | 32 | RID_RETHI = RID_R1, |
| 32 | RID_FPRET = RID_R0, | 33 | RID_FPRET = RID_R0, |
| 33 | 34 | ||
diff --git a/src/lj_target_x86.h b/src/lj_target_x86.h index 34b247d4..c4445ba4 100644 --- a/src/lj_target_x86.h +++ b/src/lj_target_x86.h | |||
| @@ -37,6 +37,7 @@ enum { | |||
| 37 | #if LJ_64 | 37 | #if LJ_64 |
| 38 | RID_FPRET = RID_XMM0, | 38 | RID_FPRET = RID_XMM0, |
| 39 | #else | 39 | #else |
| 40 | RID_RETLO = RID_EAX, | ||
| 40 | RID_RETHI = RID_EDX, | 41 | RID_RETHI = RID_EDX, |
| 41 | #endif | 42 | #endif |
| 42 | 43 | ||
