diff options
author | Mike Pall <mike> | 2011-10-22 01:35:57 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2011-10-22 01:35:57 +0200 |
commit | ff7f7a7180d25da9d425671a48867b50bb7e7ac2 (patch) | |
tree | 61cf1f88db777d2485c125c06d752fe61d6c6d3f /src | |
parent | e80478c44b7e4bf32a509c480edb39bd39ede51b (diff) | |
download | luajit-ff7f7a7180d25da9d425671a48867b50bb7e7ac2.tar.gz luajit-ff7f7a7180d25da9d425671a48867b50bb7e7ac2.tar.bz2 luajit-ff7f7a7180d25da9d425671a48867b50bb7e7ac2.zip |
Cleanup various endianess issues in assembler backend.
Diffstat (limited to 'src')
-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 | ||