| Index: src/IceTargetLoweringX8632.cpp
|
| diff --git a/src/IceTargetLoweringX8632.cpp b/src/IceTargetLoweringX8632.cpp
|
| index 31c11d4efdd65782cd576ca4c95963af34295435..d17173984a8441303957dd6d884b12bd7c03a7f9 100644
|
| --- a/src/IceTargetLoweringX8632.cpp
|
| +++ b/src/IceTargetLoweringX8632.cpp
|
| @@ -21,6 +21,7 @@
|
| #include "IceClFlags.h"
|
| #include "IceInstX8632.h"
|
| #include "IceOperand.h"
|
| +#include "IceRegistersX8632.h"
|
| #include "IceTargetLoweringX8632.def"
|
| #include "IceTargetLoweringX8632.h"
|
| #include "llvm/ADT/DenseMap.h"
|
| @@ -51,14 +52,12 @@ namespace {
|
| const struct TableFcmp_ {
|
| uint32_t Default;
|
| bool SwapScalarOperands;
|
| - InstX8632::BrCond C1, C2;
|
| + CondX86::BrCond C1, C2;
|
| bool SwapVectorOperands;
|
| - InstX8632Cmpps::CmppsCond Predicate;
|
| + CondX86::CmppsCond Predicate;
|
| } TableFcmp[] = {
|
| #define X(val, dflt, swapS, C1, C2, swapV, pred) \
|
| - { \
|
| - dflt, swapS, InstX8632Br::C1, InstX8632Br::C2, swapV, InstX8632Cmpps::pred \
|
| - } \
|
| + { dflt, swapS, CondX86::C1, CondX86::C2, swapV, CondX86::pred } \
|
| ,
|
| FCMPX8632_TABLE
|
| #undef X
|
| @@ -70,10 +69,10 @@ const size_t TableFcmpSize = llvm::array_lengthof(TableFcmp);
|
| // x86 conditional branch instruction.
|
|
|
| const struct TableIcmp32_ {
|
| - InstX8632::BrCond Mapping;
|
| + CondX86::BrCond Mapping;
|
| } TableIcmp32[] = {
|
| #define X(val, C_32, C1_64, C2_64, C3_64) \
|
| - { InstX8632Br::C_32 } \
|
| + { CondX86::C_32 } \
|
| ,
|
| ICMPX8632_TABLE
|
| #undef X
|
| @@ -85,17 +84,17 @@ const size_t TableIcmp32Size = llvm::array_lengthof(TableIcmp32);
|
| // conditional branches are needed. For the other conditions, three separate
|
| // conditional branches are needed.
|
| const struct TableIcmp64_ {
|
| - InstX8632::BrCond C1, C2, C3;
|
| + CondX86::BrCond C1, C2, C3;
|
| } TableIcmp64[] = {
|
| #define X(val, C_32, C1_64, C2_64, C3_64) \
|
| - { InstX8632Br::C1_64, InstX8632Br::C2_64, InstX8632Br::C3_64 } \
|
| + { CondX86::C1_64, CondX86::C2_64, CondX86::C3_64 } \
|
| ,
|
| ICMPX8632_TABLE
|
| #undef X
|
| };
|
| const size_t TableIcmp64Size = llvm::array_lengthof(TableIcmp64);
|
|
|
| -InstX8632::BrCond getIcmp32Mapping(InstIcmp::ICond Cond) {
|
| +CondX86::BrCond getIcmp32Mapping(InstIcmp::ICond Cond) {
|
| size_t Index = static_cast<size_t>(Cond);
|
| assert(Index < TableIcmp32Size);
|
| return TableIcmp32[Index].Mapping;
|
| @@ -264,23 +263,23 @@ TargetX8632::TargetX8632(Cfg *Func)
|
| : TargetLowering(Func), InstructionSet(CLInstructionSet),
|
| IsEbpBasedFrame(false), NeedsStackAlignment(false), FrameSizeLocals(0),
|
| SpillAreaSizeBytes(0), NextLabelNumber(0), ComputedLiveRanges(false),
|
| - PhysicalRegisters(VarList(Reg_NUM)) {
|
| + PhysicalRegisters(VarList(RegX8632::Reg_NUM)) {
|
| // TODO: Don't initialize IntegerRegisters and friends every time.
|
| // Instead, initialize in some sort of static initializer for the
|
| // class.
|
| - llvm::SmallBitVector IntegerRegisters(Reg_NUM);
|
| - llvm::SmallBitVector IntegerRegistersI8(Reg_NUM);
|
| - llvm::SmallBitVector FloatRegisters(Reg_NUM);
|
| - llvm::SmallBitVector VectorRegisters(Reg_NUM);
|
| - llvm::SmallBitVector InvalidRegisters(Reg_NUM);
|
| - ScratchRegs.resize(Reg_NUM);
|
| -#define X(val, init, name, name16, name8, scratch, preserved, stackptr, \
|
| + llvm::SmallBitVector IntegerRegisters(RegX8632::Reg_NUM);
|
| + llvm::SmallBitVector IntegerRegistersI8(RegX8632::Reg_NUM);
|
| + llvm::SmallBitVector FloatRegisters(RegX8632::Reg_NUM);
|
| + llvm::SmallBitVector VectorRegisters(RegX8632::Reg_NUM);
|
| + llvm::SmallBitVector InvalidRegisters(RegX8632::Reg_NUM);
|
| + ScratchRegs.resize(RegX8632::Reg_NUM);
|
| +#define X(val, encode, name, name16, name8, scratch, preserved, stackptr, \
|
| frameptr, isI8, isInt, isFP) \
|
| - IntegerRegisters[val] = isInt; \
|
| - IntegerRegistersI8[val] = isI8; \
|
| - FloatRegisters[val] = isFP; \
|
| - VectorRegisters[val] = isFP; \
|
| - ScratchRegs[val] = scratch;
|
| + IntegerRegisters[RegX8632::val] = isInt; \
|
| + IntegerRegistersI8[RegX8632::val] = isI8; \
|
| + FloatRegisters[RegX8632::val] = isFP; \
|
| + VectorRegisters[RegX8632::val] = isFP; \
|
| + ScratchRegs[RegX8632::val] = scratch;
|
| REGX8632_TABLE;
|
| #undef X
|
| TypeToRegisterSet[IceType_void] = InvalidRegisters;
|
| @@ -460,7 +459,7 @@ bool TargetX8632::doBranchOpt(Inst *I, const CfgNode *NextNode) {
|
| }
|
|
|
| IceString TargetX8632::RegNames[] = {
|
| -#define X(val, init, name, name16, name8, scratch, preserved, stackptr, \
|
| +#define X(val, encode, name, name16, name8, scratch, preserved, stackptr, \
|
| frameptr, isI8, isInt, isFP) \
|
| name,
|
| REGX8632_TABLE
|
| @@ -480,16 +479,16 @@ Variable *TargetX8632::getPhysicalRegister(SizeT RegNum) {
|
| }
|
|
|
| IceString TargetX8632::getRegName(SizeT RegNum, Type Ty) const {
|
| - assert(RegNum < Reg_NUM);
|
| + assert(RegNum < RegX8632::Reg_NUM);
|
| static IceString RegNames8[] = {
|
| -#define X(val, init, name, name16, name8, scratch, preserved, stackptr, \
|
| +#define X(val, encode, name, name16, name8, scratch, preserved, stackptr, \
|
| frameptr, isI8, isInt, isFP) \
|
| name8,
|
| REGX8632_TABLE
|
| #undef X
|
| };
|
| static IceString RegNames16[] = {
|
| -#define X(val, init, name, name16, name8, scratch, preserved, stackptr, \
|
| +#define X(val, encode, name, name16, name8, scratch, preserved, stackptr, \
|
| frameptr, isI8, isInt, isFP) \
|
| name16,
|
| REGX8632_TABLE
|
| @@ -546,7 +545,7 @@ void TargetX8632::lowerArguments() {
|
| // Replace Arg in the argument list with the home register. Then
|
| // generate an instruction in the prolog to copy the home register
|
| // to the assigned location of Arg.
|
| - int32_t RegNum = Reg_xmm0 + NumXmmArgs;
|
| + int32_t RegNum = RegX8632::Reg_xmm0 + NumXmmArgs;
|
| ++NumXmmArgs;
|
| IceString Name = "home_reg:" + Arg->getName();
|
| const CfgNode *DefNode = NULL;
|
| @@ -782,8 +781,8 @@ void TargetX8632::addProlog(CfgNode *Node) {
|
| assert((RegsUsed & getRegisterSet(RegSet_FramePointer, RegSet_None))
|
| .count() == 0);
|
| PreservedRegsSizeBytes += 4;
|
| - Variable *ebp = getPhysicalRegister(Reg_ebp);
|
| - Variable *esp = getPhysicalRegister(Reg_esp);
|
| + Variable *ebp = getPhysicalRegister(RegX8632::Reg_ebp);
|
| + Variable *esp = getPhysicalRegister(RegX8632::Reg_esp);
|
| const bool SuppressStackAdjustment = true;
|
| _push(ebp, SuppressStackAdjustment);
|
| _mov(ebp, esp);
|
| @@ -821,7 +820,7 @@ void TargetX8632::addProlog(CfgNode *Node) {
|
|
|
| // Generate "sub esp, SpillAreaSizeBytes"
|
| if (SpillAreaSizeBytes)
|
| - _sub(getPhysicalRegister(Reg_esp),
|
| + _sub(getPhysicalRegister(RegX8632::Reg_esp),
|
| Ctx->getConstantInt32(IceType_i32, SpillAreaSizeBytes));
|
| Ctx->statsUpdateFrameBytes(SpillAreaSizeBytes);
|
|
|
| @@ -931,9 +930,9 @@ void TargetX8632::addEpilog(CfgNode *Node) {
|
| Context.init(Node);
|
| Context.setInsertPoint(InsertPoint);
|
|
|
| - Variable *esp = getPhysicalRegister(Reg_esp);
|
| + Variable *esp = getPhysicalRegister(RegX8632::Reg_esp);
|
| if (IsEbpBasedFrame) {
|
| - Variable *ebp = getPhysicalRegister(Reg_ebp);
|
| + Variable *ebp = getPhysicalRegister(RegX8632::Reg_ebp);
|
| _mov(esp, ebp);
|
| _pop(ebp);
|
| } else {
|
| @@ -947,7 +946,7 @@ void TargetX8632::addEpilog(CfgNode *Node) {
|
| getRegisterSet(RegSet_CalleeSave, RegSet_None);
|
| for (SizeT i = 0; i < CalleeSaves.size(); ++i) {
|
| SizeT j = CalleeSaves.size() - i - 1;
|
| - if (j == Reg_ebp && IsEbpBasedFrame)
|
| + if (j == RegX8632::Reg_ebp && IsEbpBasedFrame)
|
| continue;
|
| if (CalleeSaves[j] && RegsUsed[j]) {
|
| _pop(getPhysicalRegister(j));
|
| @@ -1104,26 +1103,26 @@ Operand *TargetX8632::hiOperand(Operand *Operand) {
|
|
|
| llvm::SmallBitVector TargetX8632::getRegisterSet(RegSetMask Include,
|
| RegSetMask Exclude) const {
|
| - llvm::SmallBitVector Registers(Reg_NUM);
|
| + llvm::SmallBitVector Registers(RegX8632::Reg_NUM);
|
|
|
| -#define X(val, init, name, name16, name8, scratch, preserved, stackptr, \
|
| +#define X(val, encode, name, name16, name8, scratch, preserved, stackptr, \
|
| frameptr, isI8, isInt, isFP) \
|
| if (scratch && (Include & RegSet_CallerSave)) \
|
| - Registers[val] = true; \
|
| + Registers[RegX8632::val] = true; \
|
| if (preserved && (Include & RegSet_CalleeSave)) \
|
| - Registers[val] = true; \
|
| + Registers[RegX8632::val] = true; \
|
| if (stackptr && (Include & RegSet_StackPointer)) \
|
| - Registers[val] = true; \
|
| + Registers[RegX8632::val] = true; \
|
| if (frameptr && (Include & RegSet_FramePointer)) \
|
| - Registers[val] = true; \
|
| + Registers[RegX8632::val] = true; \
|
| if (scratch && (Exclude & RegSet_CallerSave)) \
|
| - Registers[val] = false; \
|
| + Registers[RegX8632::val] = false; \
|
| if (preserved && (Exclude & RegSet_CalleeSave)) \
|
| - Registers[val] = false; \
|
| + Registers[RegX8632::val] = false; \
|
| if (stackptr && (Exclude & RegSet_StackPointer)) \
|
| - Registers[val] = false; \
|
| + Registers[RegX8632::val] = false; \
|
| if (frameptr && (Exclude & RegSet_FramePointer)) \
|
| - Registers[val] = false;
|
| + Registers[RegX8632::val] = false;
|
|
|
| REGX8632_TABLE
|
|
|
| @@ -1142,7 +1141,7 @@ void TargetX8632::lowerAlloca(const InstAlloca *Inst) {
|
| NeedsStackAlignment = true;
|
|
|
| // TODO(sehr,stichnot): minimize the number of adjustments of esp, etc.
|
| - Variable *esp = getPhysicalRegister(Reg_esp);
|
| + Variable *esp = getPhysicalRegister(RegX8632::Reg_esp);
|
| Operand *TotalSize = legalize(Inst->getSizeInBytes());
|
| Variable *Dest = Inst->getDest();
|
| uint32_t AlignmentParam = Inst->getAlignInBytes();
|
| @@ -1233,8 +1232,8 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) {
|
| break;
|
| case InstArithmetic::Mul: {
|
| Variable *T_1 = NULL, *T_2 = NULL, *T_3 = NULL;
|
| - Variable *T_4Lo = makeReg(IceType_i32, Reg_eax);
|
| - Variable *T_4Hi = makeReg(IceType_i32, Reg_edx);
|
| + Variable *T_4Lo = makeReg(IceType_i32, RegX8632::Reg_eax);
|
| + Variable *T_4Hi = makeReg(IceType_i32, RegX8632::Reg_edx);
|
| // gcc does the following:
|
| // a=b*c ==>
|
| // t1 = b.hi; t1 *=(imul) c.lo
|
| @@ -1251,7 +1250,7 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) {
|
| _imul(T_1, Src1Lo);
|
| _mov(T_2, Src1Hi);
|
| _imul(T_2, Src0Lo);
|
| - _mov(T_3, Src0Lo, Reg_eax);
|
| + _mov(T_3, Src0Lo, RegX8632::Reg_eax);
|
| _mul(T_4Lo, T_3, Src1Lo);
|
| // The mul instruction produces two dest variables, edx:eax. We
|
| // create a fake definition of edx to account for this.
|
| @@ -1282,13 +1281,13 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) {
|
| 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);
|
| + _mov(T_1, Src1Lo, RegX8632::Reg_ecx);
|
| _mov(T_2, Src0Lo);
|
| _mov(T_3, Src0Hi);
|
| _shld(T_3, T_2, T_1);
|
| _shl(T_2, T_1);
|
| _test(T_1, BitTest);
|
| - _br(InstX8632Br::Br_e, Label);
|
| + _br(CondX86::Br_e, Label);
|
| // Because of the intra-block control flow, we need to fake a use
|
| // of T_3 to prevent its earlier definition from being dead-code
|
| // eliminated in the presence of its later definition.
|
| @@ -1318,13 +1317,13 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) {
|
| 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);
|
| + _mov(T_1, Src1Lo, RegX8632::Reg_ecx);
|
| _mov(T_2, Src0Lo);
|
| _mov(T_3, Src0Hi);
|
| _shrd(T_2, T_3, T_1);
|
| _shr(T_3, T_1);
|
| _test(T_1, BitTest);
|
| - _br(InstX8632Br::Br_e, Label);
|
| + _br(CondX86::Br_e, Label);
|
| // Because of the intra-block control flow, we need to fake a use
|
| // of T_3 to prevent its earlier definition from being dead-code
|
| // eliminated in the presence of its later definition.
|
| @@ -1354,13 +1353,13 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) {
|
| 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_1, Src1Lo, RegX8632::Reg_ecx);
|
| _mov(T_2, Src0Lo);
|
| _mov(T_3, Src0Hi);
|
| _shrd(T_2, T_3, T_1);
|
| _sar(T_3, T_1);
|
| _test(T_1, BitTest);
|
| - _br(InstX8632Br::Br_e, Label);
|
| + _br(CondX86::Br_e, Label);
|
| // Because of the intra-block control flow, we need to fake a use
|
| // of T_3 to prevent its earlier definition from being dead-code
|
| // eliminated in the presence of its later definition.
|
| @@ -1575,7 +1574,7 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) {
|
| // The 8-bit version of imul only allows the form "imul r/m8"
|
| // where T must be in eax.
|
| if (Dest->getType() == IceType_i8)
|
| - _mov(T, Src0, Reg_eax);
|
| + _mov(T, Src0, RegX8632::Reg_eax);
|
| else
|
| _mov(T, Src0);
|
| _imul(T, Src1);
|
| @@ -1584,21 +1583,21 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) {
|
| case InstArithmetic::Shl:
|
| _mov(T, Src0);
|
| if (!llvm::isa<Constant>(Src1))
|
| - Src1 = legalizeToVar(Src1, false, Reg_ecx);
|
| + Src1 = legalizeToVar(Src1, false, RegX8632::Reg_ecx);
|
| _shl(T, Src1);
|
| _mov(Dest, T);
|
| break;
|
| case InstArithmetic::Lshr:
|
| _mov(T, Src0);
|
| if (!llvm::isa<Constant>(Src1))
|
| - Src1 = legalizeToVar(Src1, false, Reg_ecx);
|
| + Src1 = legalizeToVar(Src1, false, RegX8632::Reg_ecx);
|
| _shr(T, Src1);
|
| _mov(Dest, T);
|
| break;
|
| case InstArithmetic::Ashr:
|
| _mov(T, Src0);
|
| if (!llvm::isa<Constant>(Src1))
|
| - Src1 = legalizeToVar(Src1, false, Reg_ecx);
|
| + Src1 = legalizeToVar(Src1, false, RegX8632::Reg_ecx);
|
| _sar(T, Src1);
|
| _mov(Dest, T);
|
| break;
|
| @@ -1609,14 +1608,14 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) {
|
| if (Dest->getType() == IceType_i8) {
|
| Variable *T_ah = NULL;
|
| Constant *Zero = Ctx->getConstantZero(IceType_i8);
|
| - _mov(T, Src0, Reg_eax);
|
| - _mov(T_ah, Zero, Reg_ah);
|
| + _mov(T, Src0, RegX8632::Reg_eax);
|
| + _mov(T_ah, Zero, RegX8632::Reg_ah);
|
| _div(T, Src1, T_ah);
|
| _mov(Dest, T);
|
| } else {
|
| Constant *Zero = Ctx->getConstantZero(IceType_i32);
|
| - _mov(T, Src0, Reg_eax);
|
| - _mov(T_edx, Zero, Reg_edx);
|
| + _mov(T, Src0, RegX8632::Reg_eax);
|
| + _mov(T_edx, Zero, RegX8632::Reg_edx);
|
| _div(T, Src1, T_edx);
|
| _mov(Dest, T);
|
| }
|
| @@ -1624,13 +1623,13 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) {
|
| case InstArithmetic::Sdiv:
|
| Src1 = legalize(Src1, Legal_Reg | Legal_Mem);
|
| if (Dest->getType() == IceType_i8) {
|
| - _mov(T, Src0, Reg_eax);
|
| + _mov(T, Src0, RegX8632::Reg_eax);
|
| _cbwdq(T, T);
|
| _idiv(T, Src1, T);
|
| _mov(Dest, T);
|
| } else {
|
| - T_edx = makeReg(IceType_i32, Reg_edx);
|
| - _mov(T, Src0, Reg_eax);
|
| + T_edx = makeReg(IceType_i32, RegX8632::Reg_edx);
|
| + _mov(T, Src0, RegX8632::Reg_eax);
|
| _cbwdq(T_edx, T);
|
| _idiv(T, Src1, T_edx);
|
| _mov(Dest, T);
|
| @@ -1641,14 +1640,14 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) {
|
| if (Dest->getType() == IceType_i8) {
|
| Variable *T_ah = NULL;
|
| Constant *Zero = Ctx->getConstantZero(IceType_i8);
|
| - _mov(T, Src0, Reg_eax);
|
| - _mov(T_ah, Zero, Reg_ah);
|
| + _mov(T, Src0, RegX8632::Reg_eax);
|
| + _mov(T_ah, Zero, RegX8632::Reg_ah);
|
| _div(T_ah, Src1, T);
|
| _mov(Dest, T_ah);
|
| } else {
|
| Constant *Zero = Ctx->getConstantZero(IceType_i32);
|
| - _mov(T_edx, Zero, Reg_edx);
|
| - _mov(T, Src0, Reg_eax);
|
| + _mov(T_edx, Zero, RegX8632::Reg_edx);
|
| + _mov(T, Src0, RegX8632::Reg_eax);
|
| _div(T_edx, Src1, T);
|
| _mov(Dest, T_edx);
|
| }
|
| @@ -1656,15 +1655,15 @@ void TargetX8632::lowerArithmetic(const InstArithmetic *Inst) {
|
| case InstArithmetic::Srem:
|
| Src1 = legalize(Src1, Legal_Reg | Legal_Mem);
|
| if (Dest->getType() == IceType_i8) {
|
| - Variable *T_ah = makeReg(IceType_i8, Reg_ah);
|
| - _mov(T, Src0, Reg_eax);
|
| + Variable *T_ah = makeReg(IceType_i8, RegX8632::Reg_ah);
|
| + _mov(T, Src0, RegX8632::Reg_eax);
|
| _cbwdq(T, T);
|
| Context.insert(InstFakeDef::create(Func, T_ah));
|
| _idiv(T_ah, Src1, T);
|
| _mov(Dest, T_ah);
|
| } else {
|
| - T_edx = makeReg(IceType_i32, Reg_edx);
|
| - _mov(T, Src0, Reg_eax);
|
| + T_edx = makeReg(IceType_i32, RegX8632::Reg_edx);
|
| + _mov(T, Src0, RegX8632::Reg_eax);
|
| _cbwdq(T_edx, T);
|
| _idiv(T_edx, Src1, T);
|
| _mov(Dest, T_edx);
|
| @@ -1736,7 +1735,7 @@ void TargetX8632::lowerBr(const InstBr *Inst) {
|
| Operand *Src0 = legalize(Inst->getCondition(), Legal_Reg | Legal_Mem);
|
| Constant *Zero = Ctx->getConstantZero(IceType_i32);
|
| _cmp(Src0, Zero);
|
| - _br(InstX8632Br::Br_ne, Inst->getTargetTrue(), Inst->getTargetFalse());
|
| + _br(CondX86::Br_ne, Inst->getTargetTrue(), Inst->getTargetFalse());
|
| }
|
| }
|
|
|
| @@ -1782,7 +1781,7 @@ void TargetX8632::lowerCall(const InstCall *Instr) {
|
| if (isVectorType(Arg->getType())) {
|
| ParameterAreaSizeBytes = applyStackAlignment(ParameterAreaSizeBytes);
|
| }
|
| - Variable *esp = Func->getTarget()->getPhysicalRegister(Reg_esp);
|
| + Variable *esp = Func->getTarget()->getPhysicalRegister(RegX8632::Reg_esp);
|
| Constant *Loc =
|
| Ctx->getConstantInt32(IceType_i32, ParameterAreaSizeBytes);
|
| StackArgLocations.push_back(OperandX8632Mem::create(Func, Ty, esp, Loc));
|
| @@ -1824,7 +1823,7 @@ void TargetX8632::lowerCall(const InstCall *Instr) {
|
| // code, as the memory operand displacements may end up being smaller
|
| // before any stack adjustment is done.
|
| for (SizeT i = 0, NumXmmArgs = XmmArgs.size(); i < NumXmmArgs; ++i) {
|
| - Variable *Reg = legalizeToVar(XmmArgs[i], false, Reg_xmm0 + i);
|
| + Variable *Reg = legalizeToVar(XmmArgs[i], false, RegX8632::Reg_xmm0 + i);
|
| // Generate a FakeUse of register arguments so that they do not get
|
| // dead code eliminated as a result of the FakeKill of scratch
|
| // registers after the call.
|
| @@ -1847,11 +1846,11 @@ void TargetX8632::lowerCall(const InstCall *Instr) {
|
| case IceType_i8:
|
| case IceType_i16:
|
| case IceType_i32:
|
| - ReturnReg = makeReg(Dest->getType(), Reg_eax);
|
| + ReturnReg = makeReg(Dest->getType(), RegX8632::Reg_eax);
|
| break;
|
| case IceType_i64:
|
| - ReturnReg = makeReg(IceType_i32, Reg_eax);
|
| - ReturnRegHi = makeReg(IceType_i32, Reg_edx);
|
| + ReturnReg = makeReg(IceType_i32, RegX8632::Reg_eax);
|
| + ReturnRegHi = makeReg(IceType_i32, RegX8632::Reg_edx);
|
| break;
|
| case IceType_f32:
|
| case IceType_f64:
|
| @@ -1865,7 +1864,7 @@ void TargetX8632::lowerCall(const InstCall *Instr) {
|
| case IceType_v8i16:
|
| case IceType_v4i32:
|
| case IceType_v4f32:
|
| - ReturnReg = makeReg(Dest->getType(), Reg_xmm0);
|
| + ReturnReg = makeReg(Dest->getType(), RegX8632::Reg_xmm0);
|
| break;
|
| }
|
| }
|
| @@ -1880,7 +1879,7 @@ void TargetX8632::lowerCall(const InstCall *Instr) {
|
| // Add the appropriate offset to esp. The call instruction takes care
|
| // of resetting the stack offset during emission.
|
| if (ParameterAreaSizeBytes) {
|
| - Variable *esp = Func->getTarget()->getPhysicalRegister(Reg_esp);
|
| + Variable *esp = Func->getTarget()->getPhysicalRegister(RegX8632::Reg_esp);
|
| _add(esp, Ctx->getConstantInt32(IceType_i32, ParameterAreaSizeBytes));
|
| }
|
|
|
| @@ -2480,8 +2479,8 @@ void TargetX8632::lowerFcmp(const InstFcmp *Inst) {
|
|
|
| switch (Condition) {
|
| default: {
|
| - InstX8632Cmpps::CmppsCond Predicate = TableFcmp[Index].Predicate;
|
| - assert(Predicate != InstX8632Cmpps::Cmpps_Invalid);
|
| + CondX86::CmppsCond Predicate = TableFcmp[Index].Predicate;
|
| + assert(Predicate != CondX86::Cmpps_Invalid);
|
| T = makeReg(Src0RM->getType());
|
| _movp(T, Src0RM);
|
| _cmpps(T, Src1RM, Predicate);
|
| @@ -2491,9 +2490,9 @@ void TargetX8632::lowerFcmp(const InstFcmp *Inst) {
|
| T = makeReg(Src0RM->getType());
|
| Variable *T2 = makeReg(Src0RM->getType());
|
| _movp(T, Src0RM);
|
| - _cmpps(T, Src1RM, InstX8632Cmpps::Cmpps_neq);
|
| + _cmpps(T, Src1RM, CondX86::Cmpps_neq);
|
| _movp(T2, Src0RM);
|
| - _cmpps(T2, Src1RM, InstX8632Cmpps::Cmpps_ord);
|
| + _cmpps(T2, Src1RM, CondX86::Cmpps_ord);
|
| _pand(T, T2);
|
| } break;
|
| case InstFcmp::Ueq: {
|
| @@ -2501,9 +2500,9 @@ void TargetX8632::lowerFcmp(const InstFcmp *Inst) {
|
| T = makeReg(Src0RM->getType());
|
| Variable *T2 = makeReg(Src0RM->getType());
|
| _movp(T, Src0RM);
|
| - _cmpps(T, Src1RM, InstX8632Cmpps::Cmpps_eq);
|
| + _cmpps(T, Src1RM, CondX86::Cmpps_eq);
|
| _movp(T2, Src0RM);
|
| - _cmpps(T2, Src1RM, InstX8632Cmpps::Cmpps_unord);
|
| + _cmpps(T2, Src1RM, CondX86::Cmpps_unord);
|
| _por(T, T2);
|
| } break;
|
| }
|
| @@ -2531,8 +2530,8 @@ void TargetX8632::lowerFcmp(const InstFcmp *Inst) {
|
| Src0 = Src1;
|
| Src1 = Tmp;
|
| }
|
| - bool HasC1 = (TableFcmp[Index].C1 != InstX8632Br::Br_None);
|
| - bool HasC2 = (TableFcmp[Index].C2 != InstX8632Br::Br_None);
|
| + bool HasC1 = (TableFcmp[Index].C1 != CondX86::Br_None);
|
| + bool HasC2 = (TableFcmp[Index].C2 != CondX86::Br_None);
|
| if (HasC1) {
|
| Src0 = legalize(Src0);
|
| Operand *Src1RM = legalize(Src1, Legal_Reg | Legal_Mem);
|
| @@ -2705,9 +2704,9 @@ void TargetX8632::lowerIcmp(const InstIcmp *Inst) {
|
| InstX8632Label *Label = InstX8632Label::create(Func, this);
|
| _mov(Dest, (Condition == InstIcmp::Eq ? Zero : One));
|
| _cmp(Src0LoRM, Src1LoRI);
|
| - _br(InstX8632Br::Br_ne, Label);
|
| + _br(CondX86::Br_ne, Label);
|
| _cmp(Src0HiRM, Src1HiRI);
|
| - _br(InstX8632Br::Br_ne, Label);
|
| + _br(CondX86::Br_ne, Label);
|
| Context.insert(InstFakeUse::create(Func, Dest));
|
| _mov(Dest, (Condition == InstIcmp::Eq ? One : Zero));
|
| Context.insert(Label);
|
| @@ -3160,13 +3159,13 @@ void TargetX8632::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
|
| return;
|
| }
|
| case Intrinsics::Stacksave: {
|
| - Variable *esp = Func->getTarget()->getPhysicalRegister(Reg_esp);
|
| + Variable *esp = Func->getTarget()->getPhysicalRegister(RegX8632::Reg_esp);
|
| Variable *Dest = Instr->getDest();
|
| _mov(Dest, esp);
|
| return;
|
| }
|
| case Intrinsics::Stackrestore: {
|
| - Variable *esp = Func->getTarget()->getPhysicalRegister(Reg_esp);
|
| + Variable *esp = Func->getTarget()->getPhysicalRegister(RegX8632::Reg_esp);
|
| _mov(esp, Instr->getArg(0));
|
| return;
|
| }
|
| @@ -3185,10 +3184,10 @@ void TargetX8632::lowerAtomicCmpxchg(Variable *DestPrev, Operand *Ptr,
|
| if (Expected->getType() == IceType_i64) {
|
| // Reserve the pre-colored registers first, before adding any more
|
| // infinite-weight variables from FormMemoryOperand's legalization.
|
| - Variable *T_edx = makeReg(IceType_i32, Reg_edx);
|
| - Variable *T_eax = makeReg(IceType_i32, Reg_eax);
|
| - Variable *T_ecx = makeReg(IceType_i32, Reg_ecx);
|
| - Variable *T_ebx = makeReg(IceType_i32, Reg_ebx);
|
| + Variable *T_edx = makeReg(IceType_i32, RegX8632::Reg_edx);
|
| + Variable *T_eax = makeReg(IceType_i32, RegX8632::Reg_eax);
|
| + Variable *T_ecx = makeReg(IceType_i32, RegX8632::Reg_ecx);
|
| + Variable *T_ebx = makeReg(IceType_i32, RegX8632::Reg_ebx);
|
| _mov(T_eax, loOperand(Expected));
|
| _mov(T_edx, hiOperand(Expected));
|
| _mov(T_ebx, loOperand(Desired));
|
| @@ -3202,7 +3201,7 @@ void TargetX8632::lowerAtomicCmpxchg(Variable *DestPrev, Operand *Ptr,
|
| _mov(DestHi, T_edx);
|
| return;
|
| }
|
| - Variable *T_eax = makeReg(Expected->getType(), Reg_eax);
|
| + Variable *T_eax = makeReg(Expected->getType(), RegX8632::Reg_eax);
|
| _mov(T_eax, Expected);
|
| OperandX8632Mem *Addr = FormMemoryOperand(Ptr, Expected->getType());
|
| Variable *DesiredReg = legalizeToVar(Desired);
|
| @@ -3271,7 +3270,7 @@ bool TargetX8632::tryOptimizedCmpxchgCmpBr(Variable *Dest, Operand *PtrToMem,
|
| lowerAssign(PhiAssign);
|
| Context.advanceNext();
|
| }
|
| - _br(InstX8632::Br_e, NextBr->getTargetTrue(), NextBr->getTargetFalse());
|
| + _br(CondX86::Br_e, NextBr->getTargetTrue(), NextBr->getTargetFalse());
|
| // Skip over the old compare and branch, by deleting them.
|
| NextCmp->setDeleted();
|
| NextBr->setDeleted();
|
| @@ -3398,13 +3397,13 @@ void TargetX8632::expandAtomicRMWAsCmpxchg(LowerBinOp Op_Lo, LowerBinOp Op_Hi,
|
| Val = legalize(Val);
|
| Type Ty = Val->getType();
|
| if (Ty == IceType_i64) {
|
| - Variable *T_edx = makeReg(IceType_i32, Reg_edx);
|
| - Variable *T_eax = makeReg(IceType_i32, Reg_eax);
|
| + Variable *T_edx = makeReg(IceType_i32, RegX8632::Reg_edx);
|
| + Variable *T_eax = makeReg(IceType_i32, RegX8632::Reg_eax);
|
| OperandX8632Mem *Addr = FormMemoryOperand(Ptr, Ty);
|
| _mov(T_eax, loOperand(Addr));
|
| _mov(T_edx, hiOperand(Addr));
|
| - Variable *T_ecx = makeReg(IceType_i32, Reg_ecx);
|
| - Variable *T_ebx = makeReg(IceType_i32, Reg_ebx);
|
| + Variable *T_ecx = makeReg(IceType_i32, RegX8632::Reg_ecx);
|
| + Variable *T_ebx = makeReg(IceType_i32, RegX8632::Reg_ebx);
|
| InstX8632Label *Label = InstX8632Label::create(Func, this);
|
| const bool IsXchg8b = Op_Lo == NULL && Op_Hi == NULL;
|
| if (!IsXchg8b) {
|
| @@ -3423,7 +3422,7 @@ void TargetX8632::expandAtomicRMWAsCmpxchg(LowerBinOp Op_Lo, LowerBinOp Op_Hi,
|
| }
|
| const bool Locked = true;
|
| _cmpxchg8b(Addr, T_edx, T_eax, T_ecx, T_ebx, Locked);
|
| - _br(InstX8632Br::Br_ne, Label);
|
| + _br(CondX86::Br_ne, Label);
|
| if (!IsXchg8b) {
|
| // If Val is a variable, model the extended live range of Val through
|
| // the end of the loop, since it will be re-used by the loop.
|
| @@ -3447,7 +3446,7 @@ void TargetX8632::expandAtomicRMWAsCmpxchg(LowerBinOp Op_Lo, LowerBinOp Op_Hi,
|
| return;
|
| }
|
| OperandX8632Mem *Addr = FormMemoryOperand(Ptr, Ty);
|
| - Variable *T_eax = makeReg(Ty, Reg_eax);
|
| + Variable *T_eax = makeReg(Ty, RegX8632::Reg_eax);
|
| _mov(T_eax, Addr);
|
| InstX8632Label *Label = InstX8632Label::create(Func, this);
|
| Context.insert(Label);
|
| @@ -3458,7 +3457,7 @@ void TargetX8632::expandAtomicRMWAsCmpxchg(LowerBinOp Op_Lo, LowerBinOp Op_Hi,
|
| (this->*Op_Lo)(T, Val);
|
| const bool Locked = true;
|
| _cmpxchg(Addr, T_eax, T, Locked);
|
| - _br(InstX8632Br::Br_ne, Label);
|
| + _br(CondX86::Br_ne, Label);
|
| // If Val is a variable, model the extended live range of Val through
|
| // the end of the loop, since it will be re-used by the loop.
|
| if (Variable *ValVar = llvm::dyn_cast<Variable>(Val)) {
|
| @@ -3519,7 +3518,7 @@ void TargetX8632::lowerCountZeros(bool Cttz, Type Ty, Variable *Dest,
|
| Constant *SixtyThree = Ctx->getConstantInt32(IceType_i32, 63);
|
| _mov(T_Dest, SixtyThree);
|
| }
|
| - _cmov(T_Dest, T, InstX8632::Br_ne);
|
| + _cmov(T_Dest, T, CondX86::Br_ne);
|
| if (!Cttz) {
|
| _xor(T_Dest, ThirtyOne);
|
| }
|
| @@ -3540,7 +3539,7 @@ void TargetX8632::lowerCountZeros(bool Cttz, Type Ty, Variable *Dest,
|
| _xor(T_Dest2, ThirtyOne);
|
| }
|
| _test(SecondVar, SecondVar);
|
| - _cmov(T_Dest2, T_Dest, InstX8632::Br_e);
|
| + _cmov(T_Dest2, T_Dest, CondX86::Br_e);
|
| _mov(DestLo, T_Dest2);
|
| _mov(DestHi, Ctx->getConstantZero(IceType_i32));
|
| }
|
| @@ -3867,17 +3866,17 @@ void TargetX8632::lowerRet(const InstRet *Inst) {
|
| if (Inst->hasRetValue()) {
|
| Operand *Src0 = legalize(Inst->getRetValue());
|
| if (Src0->getType() == IceType_i64) {
|
| - Variable *eax = legalizeToVar(loOperand(Src0), false, Reg_eax);
|
| - Variable *edx = legalizeToVar(hiOperand(Src0), false, Reg_edx);
|
| + Variable *eax = legalizeToVar(loOperand(Src0), false, RegX8632::Reg_eax);
|
| + Variable *edx = legalizeToVar(hiOperand(Src0), false, RegX8632::Reg_edx);
|
| Reg = eax;
|
| Context.insert(InstFakeUse::create(Func, edx));
|
| } else if (Src0->getType() == IceType_f32 ||
|
| Src0->getType() == IceType_f64) {
|
| _fld(Src0);
|
| } else if (isVectorType(Src0->getType())) {
|
| - Reg = legalizeToVar(Src0, false, Reg_xmm0);
|
| + Reg = legalizeToVar(Src0, false, RegX8632::Reg_xmm0);
|
| } else {
|
| - _mov(Reg, Src0, Reg_eax);
|
| + _mov(Reg, Src0, RegX8632::Reg_eax);
|
| }
|
| }
|
| _ret(Reg);
|
| @@ -3886,7 +3885,7 @@ void TargetX8632::lowerRet(const InstRet *Inst) {
|
| // eliminated. TODO: Are there more places where the fake use
|
| // should be inserted? E.g. "void f(int n){while(1) g(n);}" may not
|
| // have a ret instruction.
|
| - Variable *esp = Func->getTarget()->getPhysicalRegister(Reg_esp);
|
| + Variable *esp = Func->getTarget()->getPhysicalRegister(RegX8632::Reg_esp);
|
| Context.insert(InstFakeUse::create(Func, esp));
|
| }
|
|
|
| @@ -3909,7 +3908,7 @@ void TargetX8632::lowerSelect(const InstSelect *Inst) {
|
| if (SrcTy == IceType_v4i1 || SrcTy == IceType_v4i32 ||
|
| SrcTy == IceType_v4f32) {
|
| Operand *ConditionRM = legalize(Condition, Legal_Reg | Legal_Mem);
|
| - Variable *xmm0 = makeReg(IceType_v4i32, Reg_xmm0);
|
| + Variable *xmm0 = makeReg(IceType_v4i32, RegX8632::Reg_xmm0);
|
| _movp(xmm0, ConditionRM);
|
| _psll(xmm0, Ctx->getConstantInt32(IceType_i8, 31));
|
| _movp(T, SrcFRM);
|
| @@ -3919,7 +3918,7 @@ void TargetX8632::lowerSelect(const InstSelect *Inst) {
|
| assert(typeNumElements(SrcTy) == 8 || typeNumElements(SrcTy) == 16);
|
| Type SignExtTy = Condition->getType() == IceType_v8i1 ? IceType_v8i16
|
| : IceType_v16i8;
|
| - Variable *xmm0 = makeReg(SignExtTy, Reg_xmm0);
|
| + Variable *xmm0 = makeReg(SignExtTy, RegX8632::Reg_xmm0);
|
| lowerCast(InstCast::create(Func, InstCast::Sext, xmm0, Condition));
|
| _movp(T, SrcFRM);
|
| _pblendvb(T, SrcTRM, xmm0);
|
| @@ -3967,7 +3966,7 @@ void TargetX8632::lowerSelect(const InstSelect *Inst) {
|
| _cmp(ConditionRM, Zero);
|
| _mov(DestLo, SrcLoRI);
|
| _mov(DestHi, SrcHiRI);
|
| - _br(InstX8632Br::Br_ne, Label);
|
| + _br(CondX86::Br_ne, Label);
|
| Context.insert(InstFakeUse::create(Func, DestLo));
|
| Context.insert(InstFakeUse::create(Func, DestHi));
|
| Operand *SrcFLo = loOperand(SrcF);
|
| @@ -3980,7 +3979,7 @@ void TargetX8632::lowerSelect(const InstSelect *Inst) {
|
| _cmp(ConditionRM, Zero);
|
| SrcT = legalize(SrcT, Legal_Reg | Legal_Imm, true);
|
| _mov(Dest, SrcT);
|
| - _br(InstX8632Br::Br_ne, Label);
|
| + _br(CondX86::Br_ne, Label);
|
| Context.insert(InstFakeUse::create(Func, Dest));
|
| SrcF = legalize(SrcF, Legal_Reg | Legal_Imm, true);
|
| _mov(Dest, SrcF);
|
| @@ -4048,7 +4047,7 @@ void TargetX8632::lowerSwitch(const InstSwitch *Inst) {
|
| // TODO(stichnot): Correct lowering for IceType_i64.
|
| Constant *Value = Ctx->getConstantInt32(IceType_i32, Inst->getValue(I));
|
| _cmp(Src0, Value);
|
| - _br(InstX8632Br::Br_e, Inst->getLabel(I));
|
| + _br(CondX86::Br_e, Inst->getLabel(I));
|
| }
|
|
|
| _br(Inst->getLabelDefault());
|
|
|