| Index: src/IceTargetLoweringARM32.cpp
|
| diff --git a/src/IceTargetLoweringARM32.cpp b/src/IceTargetLoweringARM32.cpp
|
| index 45efac20d2f8bef91cb33afce2d24f5441959a61..9657c1dd0c28a25ddf0b42a30fbc90b617e970e5 100644
|
| --- a/src/IceTargetLoweringARM32.cpp
|
| +++ b/src/IceTargetLoweringARM32.cpp
|
| @@ -1300,11 +1300,9 @@ void TargetARM32::div0Check(Type Ty, Operand *SrcLo, Operand *SrcHi) {
|
| llvm::report_fatal_error("Unexpected type");
|
| case IceType_i8:
|
| case IceType_i16: {
|
| - Operand *ShAmtF =
|
| - legalize(Ctx->getConstantInt32(32 - getScalarIntBitWidth(Ty)),
|
| - Legal_Reg | Legal_Flex);
|
| + Operand *ShAmtImm = shAmtImm(32 - getScalarIntBitWidth(Ty));
|
| Variable *T = makeReg(IceType_i32);
|
| - _lsls(T, SrcLoReg, ShAmtF);
|
| + _lsls(T, SrcLoReg, ShAmtImm);
|
| Context.insert(InstFakeUse::create(Func, T));
|
| } break;
|
| case IceType_i32: {
|
| @@ -1454,10 +1452,6 @@ public:
|
| return legalizeToReg(Target, Swapped ? Src0 : Src1);
|
| }
|
|
|
| - Operand *unswappedSrc1RF(TargetARM32 *Target) const {
|
| - return legalizeToRegOrFlex(Target, Swapped ? Src0 : Src1);
|
| - }
|
| -
|
| protected:
|
| Operand *const Src0;
|
| Operand *const Src1;
|
| @@ -1522,6 +1516,13 @@ class Int32Operands : public NumericOperands<ConstantInteger32> {
|
| public:
|
| Int32Operands(Operand *S0, Operand *S1) : NumericOperands(S0, S1) {}
|
|
|
| + Operand *unswappedSrc1RShAmtImm(TargetARM32 *Target) const {
|
| + if (!swappedOperands() && hasConstOperand()) {
|
| + return Target->shAmtImm(getConstantValue() & 0x1F);
|
| + }
|
| + return legalizeToReg(Target, Swapped ? Src0 : Src1);
|
| + }
|
| +
|
| bool immediateIsFlexEncodable() const {
|
| uint32_t Rotate, Imm8;
|
| return OperandARM32FlexImm::canHoldImm(getConstantValue(), &Rotate, &Imm8);
|
| @@ -1738,8 +1739,7 @@ void TargetARM32::lowerInt64Arithmetic(InstArithmetic::OpKind Op,
|
| if (ShAmtImm == 32) {
|
| _mov(DestHi, Src0RLo);
|
| } else {
|
| - Operand *ShAmtOp = legalize(Ctx->getConstantInt32(ShAmtImm - 32),
|
| - Legal_Reg | Legal_Flex);
|
| + Operand *ShAmtOp = shAmtImm(ShAmtImm - 32);
|
| _lsl(T_Hi, Src0RLo, ShAmtOp);
|
| _mov(DestHi, T_Hi);
|
| }
|
| @@ -1752,10 +1752,8 @@ void TargetARM32::lowerInt64Arithmetic(InstArithmetic::OpKind Op,
|
| }
|
|
|
| Variable *Src0RHi = SrcsHi.src0R(this);
|
| - Operand *ShAmtOp =
|
| - legalize(Ctx->getConstantInt32(ShAmtImm), Legal_Reg | Legal_Flex);
|
| - Operand *ComplShAmtOp = legalize(Ctx->getConstantInt32(32 - ShAmtImm),
|
| - Legal_Reg | Legal_Flex);
|
| + Operand *ShAmtOp = shAmtImm(ShAmtImm);
|
| + Operand *ComplShAmtOp = shAmtImm(32 - ShAmtImm);
|
| _lsl(T_Hi, Src0RHi, ShAmtOp);
|
| _orr(T_Hi, T_Hi,
|
| OperandARM32FlexReg::create(Func, IceType_i32, Src0RLo,
|
| @@ -1828,30 +1826,28 @@ void TargetARM32::lowerInt64Arithmetic(InstArithmetic::OpKind Op,
|
| if (!SrcsLo.swappedOperands() && SrcsLo.hasConstOperand()) {
|
| Variable *Src0RHi = SrcsHi.src0R(this);
|
| // Truncating the ShAmt to [0, 63] because that's what ARM does anyway.
|
| - const int32_t ShAmtImm = SrcsLo.getConstantValue() & 0x3F;
|
| - if (ShAmtImm == 0) {
|
| + const int32_t ShAmt = SrcsLo.getConstantValue() & 0x3F;
|
| + if (ShAmt == 0) {
|
| _mov(DestHi, Src0RHi);
|
| _mov(DestLo, SrcsLo.src0R(this));
|
| return;
|
| }
|
|
|
| - if (ShAmtImm >= 32) {
|
| - if (ShAmtImm == 32) {
|
| + if (ShAmt >= 32) {
|
| + if (ShAmt == 32) {
|
| _mov(DestLo, Src0RHi);
|
| } else {
|
| - Operand *ShAmtOp = legalize(Ctx->getConstantInt32(ShAmtImm - 32),
|
| - Legal_Reg | Legal_Flex);
|
| + Operand *ShAmtImm = shAmtImm(ShAmt - 32);
|
| if (ASR) {
|
| - _asr(T_Lo, Src0RHi, ShAmtOp);
|
| + _asr(T_Lo, Src0RHi, ShAmtImm);
|
| } else {
|
| - _lsr(T_Lo, Src0RHi, ShAmtOp);
|
| + _lsr(T_Lo, Src0RHi, ShAmtImm);
|
| }
|
| _mov(DestLo, T_Lo);
|
| }
|
|
|
| if (ASR) {
|
| - Operand *_31 = legalize(Ctx->getConstantZero(IceType_i32),
|
| - Legal_Reg | Legal_Flex);
|
| + Operand *_31 = shAmtImm(31);
|
| _asr(T_Hi, Src0RHi, _31);
|
| } else {
|
| Operand *_0 = legalize(Ctx->getConstantZero(IceType_i32),
|
| @@ -1863,20 +1859,18 @@ void TargetARM32::lowerInt64Arithmetic(InstArithmetic::OpKind Op,
|
| }
|
|
|
| Variable *Src0RLo = SrcsLo.src0R(this);
|
| - Operand *ShAmtOp =
|
| - legalize(Ctx->getConstantInt32(ShAmtImm), Legal_Reg | Legal_Flex);
|
| - Operand *ComplShAmtOp = legalize(Ctx->getConstantInt32(32 - ShAmtImm),
|
| - Legal_Reg | Legal_Flex);
|
| - _lsr(T_Lo, Src0RLo, ShAmtOp);
|
| + Operand *ShAmtImm = shAmtImm(ShAmt);
|
| + Operand *ComplShAmtImm = shAmtImm(32 - ShAmt);
|
| + _lsr(T_Lo, Src0RLo, ShAmtImm);
|
| _orr(T_Lo, T_Lo,
|
| OperandARM32FlexReg::create(Func, IceType_i32, Src0RHi,
|
| - OperandARM32::LSL, ComplShAmtOp));
|
| + OperandARM32::LSL, ComplShAmtImm));
|
| _mov(DestLo, T_Lo);
|
|
|
| if (ASR) {
|
| - _asr(T_Hi, Src0RHi, ShAmtOp);
|
| + _asr(T_Hi, Src0RHi, ShAmtImm);
|
| } else {
|
| - _lsr(T_Hi, Src0RHi, ShAmtOp);
|
| + _lsr(T_Hi, Src0RHi, ShAmtImm);
|
| }
|
| _mov(DestHi, T_Hi);
|
| return;
|
| @@ -2151,7 +2145,7 @@ void TargetARM32::lowerArithmetic(const InstArithmetic *Inst) {
|
| }
|
| case InstArithmetic::Shl: {
|
| Variable *Src0R = Srcs.unswappedSrc0R(this);
|
| - Operand *Src1R = Srcs.unswappedSrc1RF(this);
|
| + Operand *Src1R = Srcs.unswappedSrc1RShAmtImm(this);
|
| _lsl(T, Src0R, Src1R);
|
| _mov(Dest, T);
|
| return;
|
| @@ -2161,7 +2155,7 @@ void TargetARM32::lowerArithmetic(const InstArithmetic *Inst) {
|
| if (Dest->getType() != IceType_i32) {
|
| _uxt(Src0R, Src0R);
|
| }
|
| - _lsr(T, Src0R, Srcs.unswappedSrc1RF(this));
|
| + _lsr(T, Src0R, Srcs.unswappedSrc1RShAmtImm(this));
|
| _mov(Dest, T);
|
| return;
|
| }
|
| @@ -2170,7 +2164,7 @@ void TargetARM32::lowerArithmetic(const InstArithmetic *Inst) {
|
| if (Dest->getType() != IceType_i32) {
|
| _sxt(Src0R, Src0R);
|
| }
|
| - _asr(T, Src0R, Srcs.unswappedSrc1RF(this));
|
| + _asr(T, Src0R, Srcs.unswappedSrc1RShAmtImm(this));
|
| _mov(Dest, T);
|
| return;
|
| }
|
| @@ -3185,22 +3179,21 @@ TargetARM32::lowerInt8AndInt16IcmpCond(InstIcmp::ICond Condition, Operand *Src0,
|
|
|
| if (!Srcs.hasConstOperand()) {
|
| Variable *Src0R = makeReg(IceType_i32);
|
| - Operand *ShAmtF =
|
| - legalize(Ctx->getConstantInt32(ShAmt), Legal_Reg | Legal_Flex);
|
| - _lsl(Src0R, legalizeToReg(Src0), ShAmtF);
|
| + Operand *ShAmtImm = shAmtImm(ShAmt);
|
| + _lsl(Src0R, legalizeToReg(Src0), ShAmtImm);
|
|
|
| Variable *Src1R = legalizeToReg(Src1);
|
| OperandARM32FlexReg *Src1F = OperandARM32FlexReg::create(
|
| - Func, IceType_i32, Src1R, OperandARM32::LSL, ShAmtF);
|
| + Func, IceType_i32, Src1R, OperandARM32::LSL, ShAmtImm);
|
| _cmp(Src0R, Src1F);
|
| return CondWhenTrue(getIcmp32Mapping(Condition));
|
| }
|
|
|
| const int32_t Value = Srcs.getConstantValue();
|
| if ((Condition == InstIcmp::Eq || Condition == InstIcmp::Ne) && Value == 0) {
|
| - Operand *ShAmtOp = Ctx->getConstantInt32(ShAmt);
|
| + Operand *ShAmtImm = shAmtImm(ShAmt);
|
| Variable *T = makeReg(IceType_i32);
|
| - _lsls(T, Srcs.src0R(this), ShAmtOp);
|
| + _lsls(T, Srcs.src0R(this), ShAmtImm);
|
| Context.insert(InstFakeUse::create(Func, T));
|
| return CondWhenTrue(getIcmp32Mapping(Condition));
|
| }
|
| @@ -3777,9 +3770,8 @@ void TargetARM32::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
|
| Variable *T = makeReg(Ty);
|
| _rev(T, ValR);
|
| if (Val->getType() == IceType_i16) {
|
| - Operand *Sixteen =
|
| - legalize(Ctx->getConstantInt32(16), Legal_Reg | Legal_Flex);
|
| - _lsr(T, T, Sixteen);
|
| + Operand *_16 = shAmtImm(16);
|
| + _lsr(T, T, _16);
|
| }
|
| _mov(Dest, T);
|
| }
|
| @@ -4573,9 +4565,9 @@ void TargetARM32::lowerSwitch(const InstSwitch *Inst) {
|
| const size_t ShiftAmt = 32 - getScalarIntBitWidth(Src0->getType());
|
| assert(ShiftAmt < 32);
|
| if (ShiftAmt > 0) {
|
| - Operand *ShiftConst = Ctx->getConstantInt32(ShiftAmt);
|
| + Operand *ShAmtImm = shAmtImm(ShiftAmt);
|
| Variable *T = makeReg(IceType_i32);
|
| - _lsl(T, Src0Var, ShiftConst);
|
| + _lsl(T, Src0Var, ShAmtImm);
|
| Src0Var = T;
|
| }
|
|
|
|
|