ARM64: Use the correct FUSE check.

Oops, my bad.
This commit is contained in:
Mike Pall 2016-12-09 18:24:48 +01:00
parent 44b99ff14d
commit 4ccd876a65

View File

@ -232,7 +232,7 @@ static uint32_t asm_fuseopm(ASMState *as, A64Ins ai, IRRef ref, RegSet allow)
irl->o == IR_CONV && irl->o == IR_CONV &&
irl->op2 == ((IRT_I64<<IRCONV_DSH)|IRT_INT|IRCONV_SEXT) && irl->op2 == ((IRT_I64<<IRCONV_DSH)|IRT_INT|IRCONV_SEXT) &&
shift <= 4 && shift <= 4 &&
!neverfuse(as)) { canfuse(as, irl)) {
Reg m = ra_alloc1(as, irl->op1, allow); Reg m = ra_alloc1(as, irl->op1, allow);
return A64F_M(m) | A64F_EXSH(A64EX_SXTW, shift); return A64F_M(m) | A64F_EXSH(A64EX_SXTW, shift);
} else { } else {
@ -278,7 +278,7 @@ static void asm_fusexref(ASMState *as, A64Ins ai, Reg rd, IRRef ref,
} }
if (irl->o == IR_CONV && if (irl->o == IR_CONV &&
irl->op2 == ((IRT_I64<<IRCONV_DSH)|IRT_INT|IRCONV_SEXT) && irl->op2 == ((IRT_I64<<IRCONV_DSH)|IRT_INT|IRCONV_SEXT) &&
!neverfuse(as)) { canfuse(as, irl)) {
lref = irl->op1; lref = irl->op1;
ai |= A64I_LS_SXTWx; ai |= A64I_LS_SXTWx;
} else { } else {
@ -351,10 +351,10 @@ static int asm_fusemadd(ASMState *as, IRIns *ir, A64Ins ai, A64Ins air)
/* Fuse BAND + BSHL/BSHR into UBFM. */ /* Fuse BAND + BSHL/BSHR into UBFM. */
static int asm_fuseandshift(ASMState *as, IRIns *ir) static int asm_fuseandshift(ASMState *as, IRIns *ir)
{ {
lua_assert(ir->o == IR_BAND);
if (!neverfuse(as) && irref_isk(ir->op2)) {
uint64_t mask = get_k64val(IR(ir->op2));
IRIns *irl = IR(ir->op1); IRIns *irl = IR(ir->op1);
lua_assert(ir->o == IR_BAND);
if (canfuse(as, irl) && irref_isk(ir->op2)) {
uint64_t mask = get_k64val(IR(ir->op2));
if (irref_isk(irl->op2) && (irl->o == IR_BSHR || irl->o == IR_BSHL)) { if (irref_isk(irl->op2) && (irl->o == IR_BSHR || irl->o == IR_BSHL)) {
int32_t shmask = irt_is64(irl->t) ? 63 : 31; int32_t shmask = irt_is64(irl->t) ? 63 : 31;
int32_t shift = (IR(irl->op2)->i & shmask); int32_t shift = (IR(irl->op2)->i & shmask);
@ -383,7 +383,8 @@ static int asm_fuseorshift(ASMState *as, IRIns *ir)
{ {
IRIns *irl = IR(ir->op1), *irr = IR(ir->op2); IRIns *irl = IR(ir->op1), *irr = IR(ir->op2);
lua_assert(ir->o == IR_BOR); lua_assert(ir->o == IR_BOR);
if (!neverfuse(as) && ((irl->o == IR_BSHR && irr->o == IR_BSHL) || if (canfuse(as, irl) && canfuse(as, irr) &&
((irl->o == IR_BSHR && irr->o == IR_BSHL) ||
(irl->o == IR_BSHL && irr->o == IR_BSHR))) { (irl->o == IR_BSHL && irr->o == IR_BSHR))) {
if (irref_isk(irl->op2) && irref_isk(irr->op2)) { if (irref_isk(irl->op2) && irref_isk(irr->op2)) {
IRRef lref = irl->op1, rref = irr->op1; IRRef lref = irl->op1, rref = irr->op1;
@ -1511,11 +1512,11 @@ static void asm_bitshift(ASMState *as, IRIns *ir, A64Ins ai, A64Shift sh)
if (irref_isk(ir->op2)) { /* Constant shifts. */ if (irref_isk(ir->op2)) { /* Constant shifts. */
Reg left, dest = ra_dest(as, ir, RSET_GPR); Reg left, dest = ra_dest(as, ir, RSET_GPR);
int32_t shift = (IR(ir->op2)->i & shmask); int32_t shift = (IR(ir->op2)->i & shmask);
IRIns *irl = IR(ir->op1);
if (shmask == 63) ai += A64I_UBFMx - A64I_UBFMw; if (shmask == 63) ai += A64I_UBFMx - A64I_UBFMw;
/* Fuse BSHL + BSHR/BSAR into UBFM/SBFM aka UBFX/SBFX/UBFIZ/SBFIZ. */ /* Fuse BSHL + BSHR/BSAR into UBFM/SBFM aka UBFX/SBFX/UBFIZ/SBFIZ. */
if (!neverfuse(as) && (sh == A64SH_LSR || sh == A64SH_ASR)) { if ((sh == A64SH_LSR || sh == A64SH_ASR) && canfuse(as, irl)) {
IRIns *irl = IR(ir->op1);
if (irl->o == IR_BSHL && irref_isk(irl->op2)) { if (irl->o == IR_BSHL && irref_isk(irl->op2)) {
int32_t shift2 = (IR(irl->op2)->i & shmask); int32_t shift2 = (IR(irl->op2)->i & shmask);
shift = ((shift - shift2) & shmask); shift = ((shift - shift2) & shmask);