aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-10-22 01:35:57 +0200
committerMike Pall <mike>2011-10-22 01:35:57 +0200
commitff7f7a7180d25da9d425671a48867b50bb7e7ac2 (patch)
tree61cf1f88db777d2485c125c06d752fe61d6c6d3f /src
parente80478c44b7e4bf32a509c480edb39bd39ede51b (diff)
downloadluajit-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.c31
-rw-r--r--src/lj_asm_arm.h6
-rw-r--r--src/lj_asm_x86.h4
-rw-r--r--src/lj_ir.h2
-rw-r--r--src/lj_opt_split.c2
-rw-r--r--src/lj_target_arm.h1
-rw-r--r--src/lj_target_x86.h1
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). */
707static void ra_destpair(ASMState *as, IRIns *ir) 707static 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
200typedef enum { 200typedef 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