diff options
-rw-r--r-- | src/lj_arch.h | 2 | ||||
-rw-r--r-- | src/lj_ffrecord.c | 11 | ||||
-rw-r--r-- | src/lj_opt_fold.c | 2 |
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 | ||