Chromium Code Reviews| Index: src/IceTargetLoweringARM32.cpp |
| diff --git a/src/IceTargetLoweringARM32.cpp b/src/IceTargetLoweringARM32.cpp |
| index e3f46eafd72cde5c683b64d37ca2bdf668ac3b0c..f2be2dde70fa5db09a8e1702a5f087fc58eac9d6 100644 |
| --- a/src/IceTargetLoweringARM32.cpp |
| +++ b/src/IceTargetLoweringARM32.cpp |
| @@ -468,24 +468,24 @@ void TargetARM32::genTargetHelperCallFor(Inst *Instr) { |
| // Technically, ARM has its own aeabi routines, but we can use the |
| // non-aeabi routine as well. LLVM uses __aeabi_ldivmod for div, but uses |
| // the more standard __moddi3 for rem. |
| - Operand *TargetHelper = nullptr; |
| + RuntimeHelperFuncKind HelperName = H_Num; |
|
Jim Stichnoth
2016/03/10 00:24:46
Nit: it's more of a HelperID than a HelperName.
Karl
2016/03/16 22:50:52
Changed to HelperID.
|
| switch (Op) { |
| default: |
| return; |
| case InstArithmetic::Udiv: |
| - TargetHelper = Ctx->getConstantExternSym(H_udiv_i64); |
| + HelperName = H_udiv_i64; |
| break; |
| case InstArithmetic::Sdiv: |
| - TargetHelper = Ctx->getConstantExternSym(H_sdiv_i64); |
| + HelperName = H_sdiv_i64; |
| break; |
| case InstArithmetic::Urem: |
| - TargetHelper = Ctx->getConstantExternSym(H_urem_i64); |
| + HelperName = H_urem_i64; |
| break; |
| case InstArithmetic::Srem: |
| - TargetHelper = Ctx->getConstantExternSym(H_srem_i64); |
| + HelperName = H_srem_i64; |
| break; |
| } |
| - assert(TargetHelper != nullptr); |
| + Operand *TargetHelper = getRuntimeHelperFunc(HelperName); |
| ARM32HelpersPreamble[TargetHelper] = &TargetARM32::preambleDivRem; |
| constexpr SizeT MaxArgs = 2; |
| auto *Call = Context.insert<InstCall>(MaxArgs, Dest, TargetHelper, |
| @@ -500,33 +500,29 @@ void TargetARM32::genTargetHelperCallFor(Inst *Instr) { |
| case IceType_i8: { |
| const bool HasHWDiv = hasCPUFeature(TargetARM32Features::HWDivArm); |
| InstCast::OpKind CastKind; |
| - Operand *TargetHelper; |
| + RuntimeHelperFuncKind HelperName = H_Num; |
| switch (Op) { |
| default: |
| return; |
| case InstArithmetic::Udiv: |
| - TargetHelper = |
| - HasHWDiv ? nullptr : Ctx->getConstantExternSym(H_udiv_i32); |
| + HelperName = HasHWDiv ? H_Num : H_udiv_i32; |
| CastKind = InstCast::Zext; |
| break; |
| case InstArithmetic::Sdiv: |
| - TargetHelper = |
| - HasHWDiv ? nullptr : Ctx->getConstantExternSym(H_sdiv_i32); |
| + HelperName = HasHWDiv ? H_Num : H_sdiv_i32; |
| CastKind = InstCast::Sext; |
| break; |
| case InstArithmetic::Urem: |
| - TargetHelper = |
| - HasHWDiv ? nullptr : Ctx->getConstantExternSym(H_urem_i32); |
| + HelperName = HasHWDiv ? H_Num : H_urem_i32; |
| CastKind = InstCast::Zext; |
| break; |
| case InstArithmetic::Srem: |
| - TargetHelper = |
| - HasHWDiv ? nullptr : Ctx->getConstantExternSym(H_srem_i32); |
| + HelperName = HasHWDiv ? H_Num : H_srem_i32; |
| CastKind = InstCast::Sext; |
| break; |
| } |
| - if (TargetHelper == nullptr) { |
| - // TargetHelper should only ever be nullptr when the processor does not |
| + if (HelperName == H_Num) { |
| + // HelperName should only ever be undefined when the processor does not |
| // have a hardware divider. If any other helpers are ever introduced, |
| // the following assert will have to be modified. |
| assert(HasHWDiv); |
| @@ -560,7 +556,7 @@ void TargetARM32::genTargetHelperCallFor(Inst *Instr) { |
| Src1 = Src1_32; |
| } |
| } |
| - assert(TargetHelper != nullptr); |
| + Operand *TargetHelper = getRuntimeHelperFunc(HelperName); |
| ARM32HelpersPreamble[TargetHelper] = &TargetARM32::preambleDivRem; |
| constexpr SizeT MaxArgs = 2; |
| auto *Call = Context.insert<InstCall>(MaxArgs, Dest, TargetHelper, |
| @@ -578,8 +574,8 @@ void TargetARM32::genTargetHelperCallFor(Inst *Instr) { |
| return; |
| } |
| constexpr SizeT MaxArgs = 2; |
| - Operand *TargetHelper = Ctx->getConstantExternSym( |
| - DestTy == IceType_f32 ? H_frem_f32 : H_frem_f64); |
| + Operand *TargetHelper = |
| + getRuntimeHelperFunc(DestTy == IceType_f32 ? H_frem_f32 : H_frem_f64); |
| auto *Call = Context.insert<InstCall>(MaxArgs, Dest, TargetHelper, |
| NoTailCall, IsTargetHelperCall); |
| Call->addArg(Instr->getSrc(0)); |
| @@ -619,7 +615,7 @@ void TargetARM32::genTargetHelperCallFor(Inst *Instr) { |
| } |
| const bool DestIsSigned = CastKind == InstCast::Fptosi; |
| const bool Src0IsF32 = isFloat32Asserting32Or64(SrcTy); |
| - Operand *TargetHelper = Ctx->getConstantExternSym( |
| + Operand *TargetHelper = getRuntimeHelperFunc( |
| Src0IsF32 ? (DestIsSigned ? H_fptosi_f32_i64 : H_fptoui_f32_i64) |
| : (DestIsSigned ? H_fptosi_f64_i64 : H_fptoui_f64_i64)); |
| static constexpr SizeT MaxArgs = 1; |
| @@ -636,7 +632,7 @@ void TargetARM32::genTargetHelperCallFor(Inst *Instr) { |
| } |
| const bool SourceIsSigned = CastKind == InstCast::Sitofp; |
| const bool DestIsF32 = isFloat32Asserting32Or64(Dest->getType()); |
| - Operand *TargetHelper = Ctx->getConstantExternSym( |
| + Operand *TargetHelper = getRuntimeHelperFunc( |
| DestIsF32 ? (SourceIsSigned ? H_sitofp_i64_f32 : H_uitofp_i64_f32) |
| : (SourceIsSigned ? H_sitofp_i64_f64 : H_uitofp_i64_f64)); |
| static constexpr SizeT MaxArgs = 1; |
| @@ -651,7 +647,7 @@ void TargetARM32::genTargetHelperCallFor(Inst *Instr) { |
| return; |
| } |
| Variable *CallDest = Dest; |
| - const char *HelperName = nullptr; |
| + RuntimeHelperFuncKind HelperName = H_Num; |
| switch (DestTy) { |
| default: |
| return; |
| @@ -682,7 +678,6 @@ void TargetARM32::genTargetHelperCallFor(Inst *Instr) { |
| Src0 = Src0AsI32; |
| } break; |
| } |
| - assert(HelperName != nullptr); |
| constexpr SizeT MaxSrcs = 1; |
| InstCall *Call = makeHelperCall(HelperName, CallDest, MaxSrcs); |
| Call->addArg(Src0); |
| @@ -706,7 +701,7 @@ void TargetARM32::genTargetHelperCallFor(Inst *Instr) { |
| return; |
| case Intrinsics::Ctpop: { |
| Operand *Src0 = IntrinsicCall->getArg(0); |
| - Operand *TargetHelper = Ctx->getConstantExternSym( |
| + Operand *TargetHelper = getRuntimeHelperFunc( |
| isInt32Asserting32Or64(Src0->getType()) ? H_call_ctpop_i32 |
| : H_call_ctpop_i64); |
| static constexpr SizeT MaxArgs = 1; |
| @@ -722,7 +717,7 @@ void TargetARM32::genTargetHelperCallFor(Inst *Instr) { |
| case Intrinsics::Longjmp: { |
| static constexpr SizeT MaxArgs = 2; |
| static constexpr Variable *NoDest = nullptr; |
| - Operand *TargetHelper = Ctx->getConstantExternSym(H_call_longjmp); |
| + Operand *TargetHelper = getRuntimeHelperFunc(H_call_longjmp); |
| auto *Call = Context.insert<InstCall>(MaxArgs, NoDest, TargetHelper, |
| NoTailCall, IsTargetHelperCall); |
| Call->addArg(IntrinsicCall->getArg(0)); |
| @@ -735,7 +730,7 @@ void TargetARM32::genTargetHelperCallFor(Inst *Instr) { |
| // for intrinsic calls w/ a known length. |
| static constexpr SizeT MaxArgs = 3; |
| static constexpr Variable *NoDest = nullptr; |
| - Operand *TargetHelper = Ctx->getConstantExternSym(H_call_memcpy); |
| + Operand *TargetHelper = getRuntimeHelperFunc(H_call_memcpy); |
| auto *Call = Context.insert<InstCall>(MaxArgs, NoDest, TargetHelper, |
| NoTailCall, IsTargetHelperCall); |
| Call->addArg(IntrinsicCall->getArg(0)); |
| @@ -747,7 +742,7 @@ void TargetARM32::genTargetHelperCallFor(Inst *Instr) { |
| case Intrinsics::Memmove: { |
| static constexpr SizeT MaxArgs = 3; |
| static constexpr Variable *NoDest = nullptr; |
| - Operand *TargetHelper = Ctx->getConstantExternSym(H_call_memmove); |
| + Operand *TargetHelper = getRuntimeHelperFunc(H_call_memmove); |
| auto *Call = Context.insert<InstCall>(MaxArgs, NoDest, TargetHelper, |
| NoTailCall, IsTargetHelperCall); |
| Call->addArg(IntrinsicCall->getArg(0)); |
| @@ -769,7 +764,7 @@ void TargetARM32::genTargetHelperCallFor(Inst *Instr) { |
| // decide to use __aeabi_memset. |
| static constexpr SizeT MaxArgs = 3; |
| static constexpr Variable *NoDest = nullptr; |
| - Operand *TargetHelper = Ctx->getConstantExternSym(H_call_memset); |
| + Operand *TargetHelper = getRuntimeHelperFunc(H_call_memset); |
| auto *Call = Context.insert<InstCall>(MaxArgs, NoDest, TargetHelper, |
| NoTailCall, IsTargetHelperCall); |
| Call->addArg(IntrinsicCall->getArg(0)); |
| @@ -783,9 +778,9 @@ void TargetARM32::genTargetHelperCallFor(Inst *Instr) { |
| return; |
| } |
| static constexpr SizeT MaxArgs = 0; |
| - const char *ReadTP = |
| - SandboxingType == ST_Nonsfi ? "__aeabi_read_tp" : H_call_read_tp; |
| - Operand *TargetHelper = Ctx->getConstantExternSym(ReadTP); |
| + Operand *TargetHelper = SandboxingType == ST_Nonsfi |
| + ? Ctx->getConstantExternSym("__aeabi_read_tp") |
| + : getRuntimeHelperFunc(H_call_read_tp); |
| Context.insert<InstCall>(MaxArgs, Dest, TargetHelper, NoTailCall, |
| IsTargetHelperCall); |
| Instr->setDeleted(); |
| @@ -793,7 +788,7 @@ void TargetARM32::genTargetHelperCallFor(Inst *Instr) { |
| } |
| case Intrinsics::Setjmp: { |
| static constexpr SizeT MaxArgs = 1; |
| - Operand *TargetHelper = Ctx->getConstantExternSym(H_call_setjmp); |
| + Operand *TargetHelper = getRuntimeHelperFunc(H_call_setjmp); |
| auto *Call = Context.insert<InstCall>(MaxArgs, Dest, TargetHelper, |
| NoTailCall, IsTargetHelperCall); |
| Call->addArg(IntrinsicCall->getArg(0)); |
| @@ -2719,7 +2714,7 @@ void TargetARM32::lowerInt64Arithmetic(InstArithmetic::OpKind Op, |
| } |
| Operand *_0 = |
| - legalize(Ctx->getConstantZero(IceType_i32), Legal_Reg | Legal_Flex); |
| + legalize(getConstantZero(IceType_i32), Legal_Reg | Legal_Flex); |
| _mov(T_Lo, _0); |
| _mov(DestLo, T_Lo); |
| return; |
| @@ -2772,7 +2767,7 @@ void TargetARM32::lowerInt64Arithmetic(InstArithmetic::OpKind Op, |
| // saturate to the range 0-32, so the negative value will saturate to 32. |
| Operand *_32 = legalize(Ctx->getConstantInt32(32), Legal_Reg | Legal_Flex); |
| Operand *_0 = |
| - legalize(Ctx->getConstantZero(IceType_i32), Legal_Reg | Legal_Flex); |
| + legalize(getConstantZero(IceType_i32), Legal_Reg | Legal_Flex); |
| Variable *T0 = makeReg(IceType_i32); |
| Variable *T1 = makeReg(IceType_i32); |
| Variable *T2 = makeReg(IceType_i32); |
| @@ -2824,8 +2819,8 @@ void TargetARM32::lowerInt64Arithmetic(InstArithmetic::OpKind Op, |
| Operand *_31 = shAmtImm(31); |
| _asr(T_Hi, Src0RHi, _31); |
| } else { |
| - Operand *_0 = legalize(Ctx->getConstantZero(IceType_i32), |
| - Legal_Reg | Legal_Flex); |
| + Operand *_0 = |
| + legalize(getConstantZero(IceType_i32), Legal_Reg | Legal_Flex); |
| _mov(T_Hi, _0); |
| } |
| _mov(DestHi, T_Hi); |
| @@ -2878,7 +2873,7 @@ void TargetARM32::lowerInt64Arithmetic(InstArithmetic::OpKind Op, |
| // These are incompatible, therefore we mimic pnacl-llc. |
| Operand *_32 = legalize(Ctx->getConstantInt32(32), Legal_Reg | Legal_Flex); |
| Operand *_0 = |
| - legalize(Ctx->getConstantZero(IceType_i32), Legal_Reg | Legal_Flex); |
| + legalize(getConstantZero(IceType_i32), Legal_Reg | Legal_Flex); |
| Variable *T0 = makeReg(IceType_i32); |
| Variable *T1 = makeReg(IceType_i32); |
| Variable *T2 = makeReg(IceType_i32); |
| @@ -3344,8 +3339,7 @@ void TargetARM32::lowerArithmetic(const InstArithmetic *Instr) { |
| int32_t Const = Srcs.getConstantValue(); |
| const bool Invert = Const < 0; |
| const bool MultiplyByZero = Const == 0; |
| - Operand *_0 = |
| - legalize(Ctx->getConstantZero(DestTy), Legal_Reg | Legal_Flex); |
| + Operand *_0 = legalize(getConstantZero(DestTy), Legal_Reg | Legal_Flex); |
| if (MultiplyByZero) { |
| _mov(T, _0); |
| @@ -3865,7 +3859,7 @@ void TargetARM32::lowerCast(const InstCast *Instr) { |
| Variable *Src0R = legalizeToReg(Src0); |
| _sxt(T_Lo, Src0R); |
| } else { |
| - Operand *_0 = Ctx->getConstantZero(IceType_i32); |
| + Operand *_0 = getConstantZero(IceType_i32); |
| Operand *_m1 = Ctx->getConstantInt32(-1); |
| lowerInt1ForSelect(T_Lo, Src0, _m1, _0); |
| } |
| @@ -3886,7 +3880,7 @@ void TargetARM32::lowerCast(const InstCast *Instr) { |
| _sxt(T, Src0R); |
| _mov(Dest, T); |
| } else { |
| - Constant *_0 = Ctx->getConstantZero(IceType_i32); |
| + Constant *_0 = getConstantZero(IceType_i32); |
| Operand *_m1 = Ctx->getConstantInt(Dest->getType(), -1); |
| Variable *T = makeReg(Dest->getType()); |
| lowerInt1ForSelect(T, Src0, _m1, _0); |
| @@ -3900,7 +3894,7 @@ void TargetARM32::lowerCast(const InstCast *Instr) { |
| } else if (Dest->getType() == IceType_i64) { |
| // t1=uxtb src; dst.lo=t1; dst.hi=0 |
| Operand *_0 = |
| - legalize(Ctx->getConstantZero(IceType_i32), Legal_Reg | Legal_Flex); |
| + legalize(getConstantZero(IceType_i32), Legal_Reg | Legal_Flex); |
| auto *DestLo = llvm::cast<Variable>(loOperand(Dest)); |
| auto *DestHi = llvm::cast<Variable>(hiOperand(Dest)); |
| Variable *T_Lo = makeReg(DestLo->getType()); |
| @@ -4253,8 +4247,7 @@ void TargetARM32::lowerFcmp(const InstFcmp *Instr) { |
| Variable *T = makeReg(IceType_i1); |
| Operand *_1 = legalize(Ctx->getConstantInt32(1), Legal_Reg | Legal_Flex); |
| - Operand *_0 = |
| - legalize(Ctx->getConstantZero(IceType_i32), Legal_Reg | Legal_Flex); |
| + Operand *_0 = legalize(getConstantZero(IceType_i32), Legal_Reg | Legal_Flex); |
| CondWhenTrue Cond = lowerFcmpCond(Instr); |
| @@ -4551,8 +4544,7 @@ void TargetARM32::lowerIcmp(const InstIcmp *Instr) { |
| return; |
| } |
| - Operand *_0 = |
| - legalize(Ctx->getConstantZero(IceType_i32), Legal_Reg | Legal_Flex); |
| + Operand *_0 = legalize(getConstantZero(IceType_i32), Legal_Reg | Legal_Flex); |
| Operand *_1 = legalize(Ctx->getConstantInt32(1), Legal_Reg | Legal_Flex); |
| Variable *T = makeReg(IceType_i1); |
| @@ -4608,7 +4600,7 @@ void TargetARM32::lowerLoadLinkedStoreExclusive( |
| { // scoping for loop highlighting. |
| Variable *Success = makeReg(IceType_i32); |
| Variable *Tmp = (Ty == IceType_i64) ? makeI64RegPair() : makeReg(Ty); |
| - auto *_0 = Ctx->getConstantZero(IceType_i32); |
| + auto *_0 = getConstantZero(IceType_i32); |
| Context.insert<InstFakeDef>(Tmp); |
| Context.insert<InstFakeUse>(Tmp); |
| @@ -4773,8 +4765,7 @@ void TargetARM32::postambleCtpop64(const InstCall *Instr) { |
| // user doesn't do that in the IR or doesn't toss the bits via truncate. |
| auto *DestHi = llvm::cast<Variable>(hiOperand(Instr->getDest())); |
| Variable *T = makeReg(IceType_i32); |
| - Operand *_0 = |
| - legalize(Ctx->getConstantZero(IceType_i32), Legal_Reg | Legal_Flex); |
| + Operand *_0 = legalize(getConstantZero(IceType_i32), Legal_Reg | Legal_Flex); |
| _mov(T, _0); |
| _mov(DestHi, T); |
| } |
| @@ -5064,7 +5055,7 @@ void TargetARM32::lowerIntrinsicCall(const InstIntrinsicCall *Instr) { |
| } |
| Variable *TP = legalizeToReg(OperandARM32Mem::create( |
| Func, getPointerType(), getPhysicalRegister(RegARM32::Reg_r9), |
| - llvm::cast<ConstantInteger32>(Ctx->getConstantZero(IceType_i32)))); |
| + llvm::cast<ConstantInteger32>(getConstantZero(IceType_i32)))); |
| _mov(Dest, TP); |
| return; |
| } |
| @@ -5107,7 +5098,7 @@ void TargetARM32::lowerCLZ(Variable *Dest, Variable *ValLoR, Variable *ValHiR) { |
| auto *DestLo = llvm::cast<Variable>(loOperand(Dest)); |
| auto *DestHi = llvm::cast<Variable>(hiOperand(Dest)); |
| Operand *Zero = |
| - legalize(Ctx->getConstantZero(IceType_i32), Legal_Reg | Legal_Flex); |
| + legalize(getConstantZero(IceType_i32), Legal_Reg | Legal_Flex); |
| Operand *ThirtyTwo = |
| legalize(Ctx->getConstantInt32(32), Legal_Reg | Legal_Flex); |
| _cmp(ValHiR, Zero); |
| @@ -6051,7 +6042,7 @@ Operand *TargetARM32::legalizeUndef(Operand *From, RegNumT RegNum) { |
| // lo and hi components will need to go in uninitialized registers. |
| if (isVectorType(Ty)) |
| return makeVectorOfZeros(Ty, RegNum); |
| - return Ctx->getConstantZero(Ty); |
| + return getConstantZero(Ty); |
| } |
| return From; |
| } |
| @@ -6071,7 +6062,7 @@ OperandARM32Mem *TargetARM32::formMemoryOperand(Operand *Operand, Type Ty) { |
| legalize(Operand, Legal_Reg | Legal_Rematerializable)); |
| return OperandARM32Mem::create( |
| Func, Ty, Base, |
| - llvm::cast<ConstantInteger32>(Ctx->getConstantZero(IceType_i32))); |
| + llvm::cast<ConstantInteger32>(getConstantZero(IceType_i32))); |
| } |
| Variable64On32 *TargetARM32::makeI64RegPair() { |
| @@ -6294,8 +6285,7 @@ TargetARM32::SafeBoolChain TargetARM32::lowerInt1(Variable *Dest, |
| Operand *Boolean) { |
| assert(Boolean->getType() == IceType_i1); |
| Variable *T = makeReg(IceType_i1); |
| - Operand *_0 = |
| - legalize(Ctx->getConstantZero(IceType_i1), Legal_Reg | Legal_Flex); |
| + Operand *_0 = legalize(getConstantZero(IceType_i1), Legal_Reg | Legal_Flex); |
| Operand *_1 = legalize(Ctx->getConstantInt1(1), Legal_Reg | Legal_Flex); |
| SafeBoolChain Safe = SBC_Yes; |