ARM: Unify rotates to simplify assembler backend.

This commit is contained in:
Mike Pall 2011-05-23 20:20:34 +02:00
parent 7b21a660a8
commit 185554b682
3 changed files with 13 additions and 2 deletions

View File

@ -137,6 +137,7 @@
#define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ #define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */
#define LJ_TARGET_MASKSHIFT 0 #define LJ_TARGET_MASKSHIFT 0
#define LJ_TARGET_MASKROT 1 #define LJ_TARGET_MASKROT 1
#define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */
#define LJ_ARCH_DUALNUM 2 #define LJ_ARCH_DUALNUM 2
#define LJ_ARCH_NOJIT 1 #define LJ_ARCH_NOJIT 1
@ -158,6 +159,7 @@
#define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ #define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */
#define LJ_TARGET_MASKSHIFT 0 #define LJ_TARGET_MASKSHIFT 0
#define LJ_TARGET_MASKROT 1 #define LJ_TARGET_MASKROT 1
#define LJ_TARGET_UNIFYROT 1 /* Want only IR_BROL. */
#define LJ_ARCH_DUALNUM 0 #define LJ_ARCH_DUALNUM 0
#define LJ_ARCH_NOFFI 1 /* NYI: comparisons, calls. */ #define LJ_ARCH_NOFFI 1 /* NYI: comparisons, calls. */
#define LJ_ARCH_NOJIT 1 #define LJ_ARCH_NOJIT 1

View File

@ -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 tr = lj_opt_narrow_tobit(J, J->base[0]);
TRef tsh = lj_opt_narrow_tobit(J, J->base[1]); 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)) !tref_isk(tsh))
tsh = emitir(IRTI(IR_BAND), tsh, lj_ir_kint(J, 31)); 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 --------------------------------------- */ /* -- String library fast functions --------------------------------------- */

View File

@ -1303,11 +1303,13 @@ LJFOLDF(simplify_shift_ik)
fins->op2 = (IRRef1)lj_ir_kint(J, k); fins->op2 = (IRRef1)lj_ir_kint(J, k);
return RETRYFOLD; return RETRYFOLD;
} }
#ifndef LJ_TARGET_UNIFYROT
if (fins->o == IR_BROR) { /* bror(i, k) ==> brol(i, (-k)&mask) */ if (fins->o == IR_BROR) { /* bror(i, k) ==> brol(i, (-k)&mask) */
fins->o = IR_BROL; fins->o = IR_BROL;
fins->op2 = (IRRef1)lj_ir_kint(J, (-k)&mask); fins->op2 = (IRRef1)lj_ir_kint(J, (-k)&mask);
return RETRYFOLD; return RETRYFOLD;
} }
#endif
return NEXTFOLD; return NEXTFOLD;
} }