Index: src/IceTargetLoweringX8632.cpp |
diff --git a/src/IceTargetLoweringX8632.cpp b/src/IceTargetLoweringX8632.cpp |
index ec0dc3fbde9727ab525d0704691df34df228519c..4fdc272190241b0daa7688222151cd2fe746dbdd 100644 |
--- a/src/IceTargetLoweringX8632.cpp |
+++ b/src/IceTargetLoweringX8632.cpp |
@@ -512,6 +512,14 @@ void TargetX8632::emitVariable(const Variable *Var, const Cfg *Func) const { |
Str << "]"; |
} |
+x86::Address TargetX8632::stackVarToAsmOperand(const Variable *Var) const { |
+ assert(!Var->hasReg()); |
+ int32_t Offset = Var->getStackOffset(); |
+ if (!hasFramePointer()) |
+ Offset += getStackAdjustment(); |
+ return x86::Address(x86::Register(getFrameOrStackReg()), Offset); |
+} |
+ |
void TargetX8632::lowerArguments() { |
VarList &Args = Func->getArgs(); |
// The first four arguments of vector type, regardless of their |
@@ -600,7 +608,7 @@ void TargetX8632::finishArgumentLowering(Variable *Arg, Variable *FramePtr, |
assert(Ty != IceType_i64); |
OperandX8632Mem *Mem = OperandX8632Mem::create( |
Func, Ty, FramePtr, |
- Ctx->getConstantInt(IceType_i32, Arg->getStackOffset())); |
+ Ctx->getConstantInt32(IceType_i32, Arg->getStackOffset())); |
if (isVectorType(Arg->getType())) { |
_movp(Arg, Mem); |
} else { |
@@ -799,7 +807,7 @@ void TargetX8632::addProlog(CfgNode *Node) { |
// Generate "sub esp, SpillAreaSizeBytes" |
if (SpillAreaSizeBytes) |
_sub(getPhysicalRegister(Reg_esp), |
- Ctx->getConstantInt(IceType_i32, SpillAreaSizeBytes)); |
+ Ctx->getConstantInt32(IceType_i32, SpillAreaSizeBytes)); |
resetStackAdjustment(); |
@@ -915,7 +923,7 @@ void TargetX8632::addEpilog(CfgNode *Node) { |
} else { |
// add esp, SpillAreaSizeBytes |
if (SpillAreaSizeBytes) |
- _add(esp, Ctx->getConstantInt(IceType_i32, SpillAreaSizeBytes)); |
+ _add(esp, Ctx->getConstantInt32(IceType_i32, SpillAreaSizeBytes)); |
} |
// Add pop instructions for preserved registers. |
@@ -1033,9 +1041,9 @@ Operand *TargetX8632::loOperand(Operand *Operand) { |
split64(Var); |
return Var->getLo(); |
} |
- if (ConstantInteger *Const = llvm::dyn_cast<ConstantInteger>(Operand)) { |
- uint64_t Mask = (1ull << 32) - 1; |
- return Ctx->getConstantInt(IceType_i32, Const->getValue() & Mask); |
+ if (ConstantInteger64 *Const = llvm::dyn_cast<ConstantInteger64>(Operand)) { |
+ return Ctx->getConstantInt32(IceType_i32, |
+ static_cast<uint32_t>(Const->getValue())); |
} |
if (OperandX8632Mem *Mem = llvm::dyn_cast<OperandX8632Mem>(Operand)) { |
return OperandX8632Mem::create(Func, IceType_i32, Mem->getBase(), |
@@ -1054,16 +1062,17 @@ Operand *TargetX8632::hiOperand(Operand *Operand) { |
split64(Var); |
return Var->getHi(); |
} |
- if (ConstantInteger *Const = llvm::dyn_cast<ConstantInteger>(Operand)) { |
- return Ctx->getConstantInt(IceType_i32, Const->getValue() >> 32); |
+ if (ConstantInteger64 *Const = llvm::dyn_cast<ConstantInteger64>(Operand)) { |
+ return Ctx->getConstantInt32( |
+ IceType_i32, static_cast<uint32_t>(Const->getValue() >> 32)); |
} |
if (OperandX8632Mem *Mem = llvm::dyn_cast<OperandX8632Mem>(Operand)) { |
Constant *Offset = Mem->getOffset(); |
if (Offset == NULL) |
- Offset = Ctx->getConstantInt(IceType_i32, 4); |
- else if (ConstantInteger *IntOffset = |
- llvm::dyn_cast<ConstantInteger>(Offset)) { |
- Offset = Ctx->getConstantInt(IceType_i32, 4 + IntOffset->getValue()); |
+ Offset = Ctx->getConstantInt32(IceType_i32, 4); |
+ else if (ConstantInteger32 *IntOffset = |
+ llvm::dyn_cast<ConstantInteger32>(Offset)) { |
+ Offset = Ctx->getConstantInt32(IceType_i32, 4 + IntOffset->getValue()); |
} else if (ConstantRelocatable *SymOffset = |
llvm::dyn_cast<ConstantRelocatable>(Offset)) { |
Offset = Ctx->getConstantSym(IceType_i32, 4 + SymOffset->getOffset(), |
@@ -1131,20 +1140,20 @@ void TargetX8632::lowerAlloca(const InstAlloca *Inst) { |
uint32_t Alignment = std::max(AlignmentParam, X86_STACK_ALIGNMENT_BYTES); |
if (Alignment > X86_STACK_ALIGNMENT_BYTES) { |
- _and(esp, Ctx->getConstantInt(IceType_i32, -Alignment)); |
+ _and(esp, Ctx->getConstantInt32(IceType_i32, -Alignment)); |
} |
- if (ConstantInteger *ConstantTotalSize = |
- llvm::dyn_cast<ConstantInteger>(TotalSize)) { |
+ if (ConstantInteger32 *ConstantTotalSize = |
+ llvm::dyn_cast<ConstantInteger32>(TotalSize)) { |
uint32_t Value = ConstantTotalSize->getValue(); |
Value = applyAlignment(Value, Alignment); |
- _sub(esp, Ctx->getConstantInt(IceType_i32, Value)); |
+ _sub(esp, Ctx->getConstantInt32(IceType_i32, Value)); |
} else { |
// Non-constant sizes need to be adjusted to the next highest |
// multiple of the required alignment at runtime. |
Variable *T = makeReg(IceType_i32); |
_mov(T, TotalSize); |
- _add(T, Ctx->getConstantInt(IceType_i32, Alignment - 1)); |
- _and(T, Ctx->getConstantInt(IceType_i32, -Alignment)); |
+ _add(T, Ctx->getConstantInt32(IceType_i32, Alignment - 1)); |
+ _and(T, Ctx->getConstantInt32(IceType_i32, -Alignment)); |
_sub(esp, T); |
} |
_mov(Dest, esp); |
@@ -1254,7 +1263,7 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) { |
// a.lo = t2 |
// a.hi = t3 |
Variable *T_1 = NULL, *T_2 = NULL, *T_3 = NULL; |
- Constant *BitTest = Ctx->getConstantInt(IceType_i32, 0x20); |
+ Constant *BitTest = Ctx->getConstantInt32(IceType_i32, 0x20); |
Constant *Zero = Ctx->getConstantZero(IceType_i32); |
InstX8632Label *Label = InstX8632Label::create(Func, this); |
_mov(T_1, Src1Lo, Reg_ecx); |
@@ -1290,7 +1299,7 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) { |
// a.lo = t2 |
// a.hi = t3 |
Variable *T_1 = NULL, *T_2 = NULL, *T_3 = NULL; |
- Constant *BitTest = Ctx->getConstantInt(IceType_i32, 0x20); |
+ Constant *BitTest = Ctx->getConstantInt32(IceType_i32, 0x20); |
Constant *Zero = Ctx->getConstantZero(IceType_i32); |
InstX8632Label *Label = InstX8632Label::create(Func, this); |
_mov(T_1, Src1Lo, Reg_ecx); |
@@ -1326,8 +1335,8 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) { |
// a.lo = t2 |
// a.hi = t3 |
Variable *T_1 = NULL, *T_2 = NULL, *T_3 = NULL; |
- Constant *BitTest = Ctx->getConstantInt(IceType_i32, 0x20); |
- Constant *SignExtend = Ctx->getConstantInt(IceType_i32, 0x1f); |
+ Constant *BitTest = Ctx->getConstantInt32(IceType_i32, 0x20); |
+ Constant *SignExtend = Ctx->getConstantInt32(IceType_i32, 0x1f); |
InstX8632Label *Label = InstX8632Label::create(Func, this); |
_mov(T_1, Src1Lo, Reg_ecx); |
_mov(T_2, Src0Lo); |
@@ -1448,7 +1457,7 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) { |
// Mask that directs pshufd to create a vector with entries |
// Src[1, 0, 3, 0] |
const unsigned Constant1030 = 0x31; |
- Constant *Mask1030 = Ctx->getConstantInt(IceType_i8, Constant1030); |
+ Constant *Mask1030 = Ctx->getConstantInt32(IceType_i8, Constant1030); |
// Mask that directs shufps to create a vector with entries |
// Dest[0, 2], Src[0, 2] |
const unsigned Mask0202 = 0x88; |
@@ -1464,8 +1473,8 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) { |
_pshufd(T3, Src1, Mask1030); |
_pmuludq(T1, Src1); |
_pmuludq(T2, T3); |
- _shufps(T1, T2, Ctx->getConstantInt(IceType_i8, Mask0202)); |
- _pshufd(T4, T1, Ctx->getConstantInt(IceType_i8, Mask0213)); |
+ _shufps(T1, T2, Ctx->getConstantInt32(IceType_i8, Mask0202)); |
+ _pshufd(T4, T1, Ctx->getConstantInt32(IceType_i8, Mask0213)); |
_movp(Dest, T4); |
} else { |
assert(Dest->getType() == IceType_v16i8); |
@@ -1758,7 +1767,8 @@ void TargetX8632::lowerCall(const InstCall *Instr) { |
ParameterAreaSizeBytes = applyStackAlignment(ParameterAreaSizeBytes); |
} |
Variable *esp = Func->getTarget()->getPhysicalRegister(Reg_esp); |
- Constant *Loc = Ctx->getConstantInt(IceType_i32, ParameterAreaSizeBytes); |
+ Constant *Loc = |
+ Ctx->getConstantInt32(IceType_i32, ParameterAreaSizeBytes); |
StackArgLocations.push_back(OperandX8632Mem::create(Func, Ty, esp, Loc)); |
ParameterAreaSizeBytes += typeWidthInBytesOnStack(Arg->getType()); |
} |
@@ -1855,7 +1865,7 @@ void TargetX8632::lowerCall(const InstCall *Instr) { |
// of resetting the stack offset during emission. |
if (ParameterAreaSizeBytes) { |
Variable *esp = Func->getTarget()->getPhysicalRegister(Reg_esp); |
- _add(esp, Ctx->getConstantInt(IceType_i32, ParameterAreaSizeBytes)); |
+ _add(esp, Ctx->getConstantInt32(IceType_i32, ParameterAreaSizeBytes)); |
} |
// Insert a register-kill pseudo instruction. |
@@ -1940,7 +1950,8 @@ void TargetX8632::lowerCast(const InstCast *Inst) { |
// width = width(elty) - 1; dest = (src << width) >> width |
SizeT ShiftAmount = |
X86_CHAR_BIT * typeWidthInBytes(typeElementType(DestTy)) - 1; |
- Constant *ShiftConstant = Ctx->getConstantInt(IceType_i8, ShiftAmount); |
+ Constant *ShiftConstant = |
+ Ctx->getConstantInt32(IceType_i8, ShiftAmount); |
Variable *T = makeReg(DestTy); |
_movp(T, Src0RM); |
_psll(T, ShiftConstant); |
@@ -1949,7 +1960,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) { |
} |
} else if (Dest->getType() == IceType_i64) { |
// t1=movsx src; t2=t1; t2=sar t2, 31; dst.lo=t1; dst.hi=t2 |
- Constant *Shift = Ctx->getConstantInt(IceType_i32, 31); |
+ Constant *Shift = Ctx->getConstantInt32(IceType_i32, 31); |
Variable *DestLo = llvm::cast<Variable>(loOperand(Dest)); |
Variable *DestHi = llvm::cast<Variable>(hiOperand(Dest)); |
Variable *T_Lo = makeReg(DestLo->getType()); |
@@ -1975,7 +1986,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) { |
// sar t1, dst_bitwidth - 1 |
// dst = t1 |
size_t DestBits = X86_CHAR_BIT * typeWidthInBytes(Dest->getType()); |
- Constant *ShiftAmount = Ctx->getConstantInt(IceType_i32, DestBits - 1); |
+ Constant *ShiftAmount = Ctx->getConstantInt32(IceType_i32, DestBits - 1); |
Variable *T = makeReg(Dest->getType()); |
if (typeWidthInBytes(Dest->getType()) <= |
typeWidthInBytes(Src0RM->getType())) { |
@@ -2018,14 +2029,14 @@ void TargetX8632::lowerCast(const InstCast *Inst) { |
_movzx(Tmp, Src0RM); |
} |
if (Src0RM->getType() == IceType_i1) { |
- Constant *One = Ctx->getConstantInt(IceType_i32, 1); |
+ Constant *One = Ctx->getConstantInt32(IceType_i32, 1); |
_and(Tmp, One); |
} |
_mov(DestLo, Tmp); |
_mov(DestHi, Zero); |
} else if (Src0RM->getType() == IceType_i1) { |
// t = Src0RM; t &= 1; Dest = t |
- Constant *One = Ctx->getConstantInt(IceType_i32, 1); |
+ Constant *One = Ctx->getConstantInt32(IceType_i32, 1); |
Variable *T = makeReg(IceType_i32); |
_movzx(T, Src0RM); |
_and(T, One); |
@@ -2057,7 +2068,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) { |
Variable *T = NULL; |
_mov(T, Src0RM); |
if (Dest->getType() == IceType_i1) |
- _and(T, Ctx->getConstantInt(IceType_i1, 1)); |
+ _and(T, Ctx->getConstantInt32(IceType_i1, 1)); |
_mov(Dest, T); |
} |
break; |
@@ -2102,7 +2113,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) { |
_cvtt(T_1, Src0RM); |
_mov(T_2, T_1); // T_1 and T_2 may have different integer types |
if (Dest->getType() == IceType_i1) |
- _and(T_2, Ctx->getConstantInt(IceType_i1, 1)); |
+ _and(T_2, Ctx->getConstantInt32(IceType_i1, 1)); |
_mov(Dest, T_2); |
T_2->setPreferredRegister(T_1, true); |
} |
@@ -2139,7 +2150,7 @@ void TargetX8632::lowerCast(const InstCast *Inst) { |
_cvtt(T_1, Src0RM); |
_mov(T_2, T_1); // T_1 and T_2 may have different integer types |
if (Dest->getType() == IceType_i1) |
- _and(T_2, Ctx->getConstantInt(IceType_i1, 1)); |
+ _and(T_2, Ctx->getConstantInt32(IceType_i1, 1)); |
_mov(Dest, T_2); |
T_2->setPreferredRegister(T_1, true); |
} |
@@ -2350,8 +2361,8 @@ void TargetX8632::lowerCast(const InstCast *Inst) { |
void TargetX8632::lowerExtractElement(const InstExtractElement *Inst) { |
Operand *SourceVectNotLegalized = Inst->getSrc(0); |
- ConstantInteger *ElementIndex = |
- llvm::dyn_cast<ConstantInteger>(Inst->getSrc(1)); |
+ ConstantInteger32 *ElementIndex = |
+ llvm::dyn_cast<ConstantInteger32>(Inst->getSrc(1)); |
// Only constant indices are allowed in PNaCl IR. |
assert(ElementIndex); |
@@ -2366,7 +2377,7 @@ void TargetX8632::lowerExtractElement(const InstExtractElement *Inst) { |
Ty == IceType_v8i16 || Ty == IceType_v8i1 || InstructionSet >= SSE4_1; |
if (CanUsePextr && Ty != IceType_v4f32) { |
// Use pextrb, pextrw, or pextrd. |
- Constant *Mask = Ctx->getConstantInt(IceType_i8, Index); |
+ Constant *Mask = Ctx->getConstantInt32(IceType_i8, Index); |
Variable *SourceVectR = legalizeToVar(SourceVectNotLegalized); |
_pextr(ExtractedElementR, SourceVectR, Mask); |
} else if (Ty == IceType_v4i32 || Ty == IceType_v4f32 || Ty == IceType_v4i1) { |
@@ -2375,7 +2386,7 @@ void TargetX8632::lowerExtractElement(const InstExtractElement *Inst) { |
if (Index) { |
// The shuffle only needs to occur if the element to be extracted |
// is not at the lowest index. |
- Constant *Mask = Ctx->getConstantInt(IceType_i8, Index); |
+ Constant *Mask = Ctx->getConstantInt32(IceType_i8, Index); |
T = makeReg(Ty); |
_pshufd(T, legalize(SourceVectNotLegalized, Legal_Reg | Legal_Mem), Mask); |
} else { |
@@ -2514,7 +2525,7 @@ void TargetX8632::lowerFcmp(const InstFcmp *Inst) { |
_ucomiss(T, Src1RM); |
} |
Constant *Default = |
- Ctx->getConstantInt(IceType_i32, TableFcmp[Index].Default); |
+ Ctx->getConstantInt32(IceType_i32, TableFcmp[Index].Default); |
_mov(Dest, Default); |
if (HasC1) { |
InstX8632Label *Label = InstX8632Label::create(Func, this); |
@@ -2524,7 +2535,7 @@ void TargetX8632::lowerFcmp(const InstFcmp *Inst) { |
} |
Context.insert(InstFakeUse::create(Func, Dest)); |
Constant *NonDefault = |
- Ctx->getConstantInt(IceType_i32, !TableFcmp[Index].Default); |
+ Ctx->getConstantInt32(IceType_i32, !TableFcmp[Index].Default); |
_mov(Dest, NonDefault); |
Context.insert(Label); |
} |
@@ -2665,7 +2676,7 @@ void TargetX8632::lowerIcmp(const InstIcmp *Inst) { |
// a=icmp cond, b, c ==> cmp b,c; a=1; br cond,L1; FakeUse(a); a=0; L1: |
Constant *Zero = Ctx->getConstantZero(IceType_i32); |
- Constant *One = Ctx->getConstantInt(IceType_i32, 1); |
+ Constant *One = Ctx->getConstantInt32(IceType_i32, 1); |
if (Src0->getType() == IceType_i64) { |
InstIcmp::ICond Condition = Inst->getCondition(); |
size_t Index = static_cast<size_t>(Condition); |
@@ -2716,8 +2727,8 @@ void TargetX8632::lowerIcmp(const InstIcmp *Inst) { |
void TargetX8632::lowerInsertElement(const InstInsertElement *Inst) { |
Operand *SourceVectNotLegalized = Inst->getSrc(0); |
Operand *ElementToInsertNotLegalized = Inst->getSrc(1); |
- ConstantInteger *ElementIndex = |
- llvm::dyn_cast<ConstantInteger>(Inst->getSrc(2)); |
+ ConstantInteger32 *ElementIndex = |
+ llvm::dyn_cast<ConstantInteger32>(Inst->getSrc(2)); |
// Only constant indices are allowed in PNaCl IR. |
assert(ElementIndex); |
unsigned Index = ElementIndex->getValue(); |
@@ -2747,9 +2758,9 @@ void TargetX8632::lowerInsertElement(const InstInsertElement *Inst) { |
Variable *T = makeReg(Ty); |
_movp(T, SourceVectRM); |
if (Ty == IceType_v4f32) |
- _insertps(T, ElementRM, Ctx->getConstantInt(IceType_i8, Index << 4)); |
+ _insertps(T, ElementRM, Ctx->getConstantInt32(IceType_i8, Index << 4)); |
else |
- _pinsr(T, ElementRM, Ctx->getConstantInt(IceType_i8, Index)); |
+ _pinsr(T, ElementRM, Ctx->getConstantInt32(IceType_i8, Index)); |
_movp(Inst->getDest(), T); |
} else if (Ty == IceType_v4i32 || Ty == IceType_v4f32 || Ty == IceType_v4i1) { |
// Use shufps or movss. |
@@ -2800,8 +2811,10 @@ void TargetX8632::lowerInsertElement(const InstInsertElement *Inst) { |
const unsigned char Mask1[3] = {0, 192, 128}; |
const unsigned char Mask2[3] = {227, 196, 52}; |
- Constant *Mask1Constant = Ctx->getConstantInt(IceType_i8, Mask1[Index - 1]); |
- Constant *Mask2Constant = Ctx->getConstantInt(IceType_i8, Mask2[Index - 1]); |
+ Constant *Mask1Constant = |
+ Ctx->getConstantInt32(IceType_i8, Mask1[Index - 1]); |
+ Constant *Mask2Constant = |
+ Ctx->getConstantInt32(IceType_i8, Mask2[Index - 1]); |
if (Index == 1) { |
_shufps(ElementR, SourceVectRM, Mask1Constant); |
@@ -2841,12 +2854,12 @@ void TargetX8632::lowerIntrinsicCall(const InstIntrinsicCall *Instr) { |
switch (Instr->getIntrinsicInfo().ID) { |
case Intrinsics::AtomicCmpxchg: { |
if (!Intrinsics::VerifyMemoryOrder( |
- llvm::cast<ConstantInteger>(Instr->getArg(3))->getValue())) { |
+ llvm::cast<ConstantInteger32>(Instr->getArg(3))->getValue())) { |
Func->setError("Unexpected memory ordering (success) for AtomicCmpxchg"); |
return; |
} |
if (!Intrinsics::VerifyMemoryOrder( |
- llvm::cast<ConstantInteger>(Instr->getArg(4))->getValue())) { |
+ llvm::cast<ConstantInteger32>(Instr->getArg(4))->getValue())) { |
Func->setError("Unexpected memory ordering (failure) for AtomicCmpxchg"); |
return; |
} |
@@ -2861,7 +2874,7 @@ void TargetX8632::lowerIntrinsicCall(const InstIntrinsicCall *Instr) { |
} |
case Intrinsics::AtomicFence: |
if (!Intrinsics::VerifyMemoryOrder( |
- llvm::cast<ConstantInteger>(Instr->getArg(0))->getValue())) { |
+ llvm::cast<ConstantInteger32>(Instr->getArg(0))->getValue())) { |
Func->setError("Unexpected memory ordering for AtomicFence"); |
return; |
} |
@@ -2879,7 +2892,7 @@ void TargetX8632::lowerIntrinsicCall(const InstIntrinsicCall *Instr) { |
// byte size, this opens up DCE opportunities. |
Operand *ByteSize = Instr->getArg(0); |
Variable *Dest = Instr->getDest(); |
- if (ConstantInteger *CI = llvm::dyn_cast<ConstantInteger>(ByteSize)) { |
+ if (ConstantInteger32 *CI = llvm::dyn_cast<ConstantInteger32>(ByteSize)) { |
Constant *Result; |
switch (CI->getValue()) { |
default: |
@@ -2893,7 +2906,7 @@ void TargetX8632::lowerIntrinsicCall(const InstIntrinsicCall *Instr) { |
case 2: |
case 4: |
case 8: |
- Result = Ctx->getConstantInt(IceType_i32, 1); |
+ Result = Ctx->getConstantInt32(IceType_i32, 1); |
break; |
} |
_mov(Dest, Result); |
@@ -2907,7 +2920,7 @@ void TargetX8632::lowerIntrinsicCall(const InstIntrinsicCall *Instr) { |
// We require the memory address to be naturally aligned. |
// Given that is the case, then normal loads are atomic. |
if (!Intrinsics::VerifyMemoryOrder( |
- llvm::cast<ConstantInteger>(Instr->getArg(1))->getValue())) { |
+ llvm::cast<ConstantInteger32>(Instr->getArg(1))->getValue())) { |
Func->setError("Unexpected memory ordering for AtomicLoad"); |
return; |
} |
@@ -2940,18 +2953,18 @@ void TargetX8632::lowerIntrinsicCall(const InstIntrinsicCall *Instr) { |
} |
case Intrinsics::AtomicRMW: |
if (!Intrinsics::VerifyMemoryOrder( |
- llvm::cast<ConstantInteger>(Instr->getArg(3))->getValue())) { |
+ llvm::cast<ConstantInteger32>(Instr->getArg(3))->getValue())) { |
Func->setError("Unexpected memory ordering for AtomicRMW"); |
return; |
} |
lowerAtomicRMW(Instr->getDest(), |
- static_cast<uint32_t>(llvm::cast<ConstantInteger>( |
- Instr->getArg(0))->getValue()), |
+ static_cast<uint32_t>(llvm::cast<ConstantInteger32>( |
+ Instr->getArg(0))->getValue()), |
Instr->getArg(1), Instr->getArg(2)); |
return; |
case Intrinsics::AtomicStore: { |
if (!Intrinsics::VerifyMemoryOrder( |
- llvm::cast<ConstantInteger>(Instr->getArg(2))->getValue())) { |
+ llvm::cast<ConstantInteger32>(Instr->getArg(2))->getValue())) { |
Func->setError("Unexpected memory ordering for AtomicStore"); |
return; |
} |
@@ -2999,7 +3012,7 @@ void TargetX8632::lowerIntrinsicCall(const InstIntrinsicCall *Instr) { |
} else { |
assert(Val->getType() == IceType_i16); |
Val = legalize(Val); |
- Constant *Eight = Ctx->getConstantInt(IceType_i16, 8); |
+ Constant *Eight = Ctx->getConstantInt32(IceType_i16, 8); |
Variable *T = NULL; |
_mov(T, Val); |
_rol(T, Eight); |
@@ -3482,12 +3495,12 @@ void TargetX8632::lowerCountZeros(bool Cttz, Type Ty, Variable *Dest, |
_bsr(T, FirstValRM); |
} |
Variable *T_Dest = makeReg(IceType_i32); |
- Constant *ThirtyTwo = Ctx->getConstantInt(IceType_i32, 32); |
- Constant *ThirtyOne = Ctx->getConstantInt(IceType_i32, 31); |
+ Constant *ThirtyTwo = Ctx->getConstantInt32(IceType_i32, 32); |
+ Constant *ThirtyOne = Ctx->getConstantInt32(IceType_i32, 31); |
if (Cttz) { |
_mov(T_Dest, ThirtyTwo); |
} else { |
- Constant *SixtyThree = Ctx->getConstantInt(IceType_i32, 63); |
+ Constant *SixtyThree = Ctx->getConstantInt32(IceType_i32, 63); |
_mov(T_Dest, SixtyThree); |
} |
_cmov(T_Dest, T, InstX8632::Br_ne); |
@@ -3616,8 +3629,8 @@ bool matchShiftedIndex(Variable *&Index, uint16_t &Shift, const Inst *&Reason) { |
if (const InstArithmetic *ArithInst = |
llvm::dyn_cast<InstArithmetic>(IndexInst)) { |
if (Variable *Var = llvm::dyn_cast<Variable>(ArithInst->getSrc(0))) { |
- if (ConstantInteger *Const = |
- llvm::dyn_cast<ConstantInteger>(ArithInst->getSrc(1))) { |
+ if (ConstantInteger32 *Const = |
+ llvm::dyn_cast<ConstantInteger32>(ArithInst->getSrc(1))) { |
if (ArithInst->getOp() == InstArithmetic::Mul && |
!Var->getIsMultidef() && Const->getType() == IceType_i32) { |
uint64_t Mult = Const->getValue(); |
@@ -3668,13 +3681,13 @@ bool matchOffsetBase(Variable *&Base, int32_t &Offset, const Inst *&Reason) { |
return false; |
bool IsAdd = ArithInst->getOp() == InstArithmetic::Add; |
Variable *Var = NULL; |
- ConstantInteger *Const = NULL; |
+ ConstantInteger32 *Const = NULL; |
if (Variable *VariableOperand = |
llvm::dyn_cast<Variable>(ArithInst->getSrc(0))) { |
Var = VariableOperand; |
- Const = llvm::dyn_cast<ConstantInteger>(ArithInst->getSrc(1)); |
+ Const = llvm::dyn_cast<ConstantInteger32>(ArithInst->getSrc(1)); |
} else if (IsAdd) { |
- Const = llvm::dyn_cast<ConstantInteger>(ArithInst->getSrc(0)); |
+ Const = llvm::dyn_cast<ConstantInteger32>(ArithInst->getSrc(0)); |
Var = llvm::dyn_cast<Variable>(ArithInst->getSrc(1)); |
} |
if (Var == NULL || Const == NULL || Var->getIsMultidef()) |
@@ -3812,7 +3825,7 @@ void TargetX8632::doAddressOptLoad() { |
computeAddressOpt(Func, Inst, Base, Index, Shift, Offset); |
if (Base && Addr != Base) { |
Inst->setDeleted(); |
- Constant *OffsetOp = Ctx->getConstantInt(IceType_i32, Offset); |
+ Constant *OffsetOp = Ctx->getConstantInt32(IceType_i32, Offset); |
Addr = OperandX8632Mem::create(Func, Dest->getType(), Base, OffsetOp, Index, |
Shift, SegmentReg); |
Context.insert(InstLoad::create(Func, Dest, Addr)); |
@@ -3879,7 +3892,7 @@ void TargetX8632::lowerSelect(const InstSelect *Inst) { |
Operand *ConditionRM = legalize(Condition, Legal_Reg | Legal_Mem); |
Variable *xmm0 = makeReg(IceType_v4i32, Reg_xmm0); |
_movp(xmm0, ConditionRM); |
- _psll(xmm0, Ctx->getConstantInt(IceType_i8, 31)); |
+ _psll(xmm0, Ctx->getConstantInt32(IceType_i8, 31)); |
_movp(T, SrcFRM); |
_blendvps(T, SrcTRM, xmm0); |
_movp(Dest, T); |
@@ -3994,7 +4007,7 @@ void TargetX8632::doAddressOptStore() { |
computeAddressOpt(Func, Inst, Base, Index, Shift, Offset); |
if (Base && Addr != Base) { |
Inst->setDeleted(); |
- Constant *OffsetOp = Ctx->getConstantInt(IceType_i32, Offset); |
+ Constant *OffsetOp = Ctx->getConstantInt32(IceType_i32, Offset); |
Addr = OperandX8632Mem::create(Func, Data->getType(), Base, OffsetOp, Index, |
Shift, SegmentReg); |
Context.insert(InstStore::create(Func, Data, Addr)); |
@@ -4014,7 +4027,7 @@ void TargetX8632::lowerSwitch(const InstSwitch *Inst) { |
Src0 = legalize(Src0, Legal_Reg | Legal_Mem, true); |
for (SizeT I = 0; I < NumCases; ++I) { |
// TODO(stichnot): Correct lowering for IceType_i64. |
- Constant *Value = Ctx->getConstantInt(IceType_i32, Inst->getValue(I)); |
+ Constant *Value = Ctx->getConstantInt32(IceType_i32, Inst->getValue(I)); |
_cmp(Src0, Value); |
_br(InstX8632Br::Br_e, Inst->getLabel(I)); |
} |
@@ -4032,7 +4045,7 @@ void TargetX8632::scalarizeArithmetic(InstArithmetic::OpKind Kind, |
Operand *T = Ctx->getConstantUndef(Ty); |
for (SizeT I = 0; I < NumElements; ++I) { |
- Constant *Index = Ctx->getConstantInt(IceType_i32, I); |
+ Constant *Index = Ctx->getConstantInt32(IceType_i32, I); |
// Extract the next two inputs. |
Variable *Op0 = Func->makeVariable(ElementTy, Context.getNode()); |
@@ -4121,13 +4134,13 @@ Variable *TargetX8632::makeVectorOfHighOrderBits(Type Ty, int32_t RegNum) { |
if (Ty == IceType_v4f32 || Ty == IceType_v4i32 || Ty == IceType_v8i16) { |
Variable *Reg = makeVectorOfOnes(Ty, RegNum); |
SizeT Shift = typeWidthInBytes(typeElementType(Ty)) * X86_CHAR_BIT - 1; |
- _psll(Reg, Ctx->getConstantInt(IceType_i8, Shift)); |
+ _psll(Reg, Ctx->getConstantInt32(IceType_i8, Shift)); |
return Reg; |
} else { |
// SSE has no left shift operation for vectors of 8 bit integers. |
const uint32_t HIGH_ORDER_BITS_MASK = 0x80808080; |
Constant *ConstantMask = |
- Ctx->getConstantInt(IceType_i32, HIGH_ORDER_BITS_MASK); |
+ Ctx->getConstantInt32(IceType_i32, HIGH_ORDER_BITS_MASK); |
Variable *Reg = makeReg(Ty, RegNum); |
_movd(Reg, legalize(ConstantMask, Legal_Reg | Legal_Mem)); |
_pshufd(Reg, Reg, Ctx->getConstantZero(IceType_i8)); |
@@ -4148,7 +4161,7 @@ OperandX8632Mem *TargetX8632::getMemoryOperandForStackSlot(Type Ty, |
const Type PointerType = IceType_i32; |
Variable *Loc = makeReg(PointerType); |
_lea(Loc, Slot); |
- Constant *ConstantOffset = Ctx->getConstantInt(IceType_i32, Offset); |
+ Constant *ConstantOffset = Ctx->getConstantInt32(IceType_i32, Offset); |
return OperandX8632Mem::create(Func, Ty, Loc, ConstantOffset); |
} |
@@ -4278,7 +4291,7 @@ OperandX8632Mem *TargetX8632::FormMemoryOperand(Operand *Operand, Type Ty) { |
Constant *Offset = llvm::dyn_cast<Constant>(Operand); |
assert(Base || Offset); |
if (Offset) { |
- assert(llvm::isa<ConstantInteger>(Offset) || |
+ assert(llvm::isa<ConstantInteger32>(Offset) || |
llvm::isa<ConstantRelocatable>(Offset)); |
} |
Mem = OperandX8632Mem::create(Func, Ty, Base, Offset); |
@@ -4402,9 +4415,13 @@ void TargetX8632::postLower() { |
} |
} |
-template <> void ConstantInteger::emit(GlobalContext *Ctx) const { |
+template <> void ConstantInteger32::emit(GlobalContext *Ctx) const { |
Ostream &Str = Ctx->getStrEmit(); |
- Str << (int64_t) getValue(); |
+ Str << (int32_t)getValue(); |
+} |
+ |
+template <> void ConstantInteger64::emit(GlobalContext *) const { |
+ llvm_unreachable("Not expecting to emit 64-bit integers"); |
} |
template <> void ConstantFloat::emit(GlobalContext *Ctx) const { |