aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lj_arch.h2
-rw-r--r--src/lj_ffrecord.c11
-rw-r--r--src/lj_opt_fold.c2
3 files changed, 13 insertions, 2 deletions
diff --git a/src/lj_arch.h b/src/lj_arch.h
index 978ccd1f..a234a400 100644
--- a/src/lj_arch.h
+++ b/src/lj_arch.h
@@ -137,6 +137,7 @@
137#define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ 137#define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */
138#define LJ_TARGET_MASKSHIFT 0 138#define LJ_TARGET_MASKSHIFT 0
139#define LJ_TARGET_MASKROT 1 139#define LJ_TARGET_MASKROT 1
140#define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */
140#define LJ_ARCH_DUALNUM 2 141#define LJ_ARCH_DUALNUM 2
141#define LJ_ARCH_NOJIT 1 142#define LJ_ARCH_NOJIT 1
142 143
@@ -158,6 +159,7 @@
158#define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ 159#define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */
159#define LJ_TARGET_MASKSHIFT 0 160#define LJ_TARGET_MASKSHIFT 0
160#define LJ_TARGET_MASKROT 1 161#define LJ_TARGET_MASKROT 1
162#define LJ_TARGET_UNIFYROT 1 /* Want only IR_BROL. */
161#define LJ_ARCH_DUALNUM 0 163#define LJ_ARCH_DUALNUM 0
162#define LJ_ARCH_NOFFI 1 /* NYI: comparisons, calls. */ 164#define LJ_ARCH_NOFFI 1 /* NYI: comparisons, calls. */
163#define LJ_ARCH_NOJIT 1 165#define LJ_ARCH_NOJIT 1
diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c
index 0de54f04..8cc42406 100644
--- a/src/lj_ffrecord.c
+++ b/src/lj_ffrecord.c
@@ -570,10 +570,17 @@ static void LJ_FASTCALL recff_bit_shift(jit_State *J, RecordFFData *rd)
570{ 570{
571 TRef tr = lj_opt_narrow_tobit(J, J->base[0]); 571 TRef tr = lj_opt_narrow_tobit(J, J->base[0]);
572 TRef tsh = lj_opt_narrow_tobit(J, J->base[1]); 572 TRef tsh = lj_opt_narrow_tobit(J, J->base[1]);
573 if (!(rd->data < IR_BROL ? LJ_TARGET_MASKSHIFT : LJ_TARGET_MASKROT) && 573 IROp op = (IROp)rd->data;
574 if (!(op < IR_BROL ? LJ_TARGET_MASKSHIFT : LJ_TARGET_MASKROT) &&
574 !tref_isk(tsh)) 575 !tref_isk(tsh))
575 tsh = emitir(IRTI(IR_BAND), tsh, lj_ir_kint(J, 31)); 576 tsh = emitir(IRTI(IR_BAND), tsh, lj_ir_kint(J, 31));
576 J->base[0] = emitir(IRTI(rd->data), tr, tsh); 577#ifdef LJ_TARGET_UNIFYROT
578 if (op == (LJ_TARGET_UNIFYROT == 1 ? IR_BROR : IR_BROL)) {
579 op = LJ_TARGET_UNIFYROT == 1 ? IR_BROL : IR_BROR;
580 tsh = emitir(IRTI(IR_NEG), tsh, tsh);
581 }
582#endif
583 J->base[0] = emitir(IRTI(op), tr, tsh);
577} 584}
578 585
579/* -- String library fast functions --------------------------------------- */ 586/* -- String library fast functions --------------------------------------- */
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c
index c8b4edfe..2e61abe4 100644
--- a/src/lj_opt_fold.c
+++ b/src/lj_opt_fold.c
@@ -1303,11 +1303,13 @@ LJFOLDF(simplify_shift_ik)
1303 fins->op2 = (IRRef1)lj_ir_kint(J, k); 1303 fins->op2 = (IRRef1)lj_ir_kint(J, k);
1304 return RETRYFOLD; 1304 return RETRYFOLD;
1305 } 1305 }
1306#ifndef LJ_TARGET_UNIFYROT
1306 if (fins->o == IR_BROR) { /* bror(i, k) ==> brol(i, (-k)&mask) */ 1307 if (fins->o == IR_BROR) { /* bror(i, k) ==> brol(i, (-k)&mask) */
1307 fins->o = IR_BROL; 1308 fins->o = IR_BROL;
1308 fins->op2 = (IRRef1)lj_ir_kint(J, (-k)&mask); 1309 fins->op2 = (IRRef1)lj_ir_kint(J, (-k)&mask);
1309 return RETRYFOLD; 1310 return RETRYFOLD;
1310 } 1311 }
1312#endif
1311 return NEXTFOLD; 1313 return NEXTFOLD;
1312} 1314}
1313 1315