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 @@ #define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ #define LJ_TARGET_MASKSHIFT 0 #define LJ_TARGET_MASKROT 1 +#define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */ #define LJ_ARCH_DUALNUM 2 #define LJ_ARCH_NOJIT 1 @@ -158,6 +159,7 @@ #define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ #define LJ_TARGET_MASKSHIFT 0 #define LJ_TARGET_MASKROT 1 +#define LJ_TARGET_UNIFYROT 1 /* Want only IR_BROL. */ #define LJ_ARCH_DUALNUM 0 #define LJ_ARCH_NOFFI 1 /* NYI: comparisons, calls. */ #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) { TRef tr = lj_opt_narrow_tobit(J, J->base[0]); TRef tsh = lj_opt_narrow_tobit(J, J->base[1]); - if (!(rd->data < IR_BROL ? LJ_TARGET_MASKSHIFT : LJ_TARGET_MASKROT) && + IROp op = (IROp)rd->data; + if (!(op < IR_BROL ? LJ_TARGET_MASKSHIFT : LJ_TARGET_MASKROT) && !tref_isk(tsh)) tsh = emitir(IRTI(IR_BAND), tsh, lj_ir_kint(J, 31)); - J->base[0] = emitir(IRTI(rd->data), tr, tsh); +#ifdef LJ_TARGET_UNIFYROT + if (op == (LJ_TARGET_UNIFYROT == 1 ? IR_BROR : IR_BROL)) { + op = LJ_TARGET_UNIFYROT == 1 ? IR_BROL : IR_BROR; + tsh = emitir(IRTI(IR_NEG), tsh, tsh); + } +#endif + J->base[0] = emitir(IRTI(op), tr, tsh); } /* -- 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) fins->op2 = (IRRef1)lj_ir_kint(J, k); return RETRYFOLD; } +#ifndef LJ_TARGET_UNIFYROT if (fins->o == IR_BROR) { /* bror(i, k) ==> brol(i, (-k)&mask) */ fins->o = IR_BROL; fins->op2 = (IRRef1)lj_ir_kint(J, (-k)&mask); return RETRYFOLD; } +#endif return NEXTFOLD; }