| Index: src/IceInstX86BaseImpl.h
|
| diff --git a/src/IceInstX86BaseImpl.h b/src/IceInstX86BaseImpl.h
|
| index e109bf2a3350cfab526e87ce517f9411ecf908a5..80a1f6bcc4c36e883c674b338481302b8689f4c7 100644
|
| --- a/src/IceInstX86BaseImpl.h
|
| +++ b/src/IceInstX86BaseImpl.h
|
| @@ -569,48 +569,51 @@ void InstX86Call<Machine>::emit(const Cfg *Func) const {
|
| Ostream &Str = Func->getContext()->getStrEmit();
|
| assert(this->getSrcSize() == 1);
|
| Str << "\tcall\t";
|
| - if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(getCallTarget())) {
|
| + Operand *CallTarget = getCallTarget();
|
| + TargetLowering *Target = Func->getTarget();
|
| + if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(CallTarget)) {
|
| // Emit without a leading '$'.
|
| Str << CI->getValue();
|
| - } else if (const auto CallTarget =
|
| - llvm::dyn_cast<ConstantRelocatable>(getCallTarget())) {
|
| - CallTarget->emitWithoutPrefix(Func->getTarget());
|
| + } else if (const auto DirectCallTarget =
|
| + llvm::dyn_cast<ConstantRelocatable>(CallTarget)) {
|
| + DirectCallTarget->emitWithoutPrefix(Target);
|
| } else {
|
| Str << "*";
|
| - getCallTarget()->emit(Func);
|
| + CallTarget->emit(Func);
|
| }
|
| - Func->getTarget()->resetStackAdjustment();
|
| + Target->resetStackAdjustment();
|
| }
|
|
|
| template <class Machine>
|
| void InstX86Call<Machine>::emitIAS(const Cfg *Func) const {
|
| typename InstX86Base<Machine>::Traits::Assembler *Asm =
|
| Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
|
| - Operand *Target = getCallTarget();
|
| - if (const auto *Var = llvm::dyn_cast<Variable>(Target)) {
|
| + Operand *CallTarget = getCallTarget();
|
| + TargetLowering *Target = Func->getTarget();
|
| + if (const auto *Var = llvm::dyn_cast<Variable>(CallTarget)) {
|
| if (Var->hasReg()) {
|
| Asm->call(InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()));
|
| } else {
|
| Asm->call(
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->stackVarToAsmOperand(Var));
|
| }
|
| } else if (const auto *Mem = llvm::dyn_cast<
|
| typename InstX86Base<Machine>::Traits::X86OperandMem>(
|
| - Target)) {
|
| + CallTarget)) {
|
| assert(Mem->getSegmentRegister() ==
|
| InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
|
| - Asm->call(Mem->toAsmAddress(Asm));
|
| - } else if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(Target)) {
|
| + Asm->call(Mem->toAsmAddress(Asm, Target));
|
| + } else if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(CallTarget)) {
|
| assert(CR->getOffset() == 0 && "We only support calling a function");
|
| Asm->call(CR);
|
| - } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Target)) {
|
| + } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(CallTarget)) {
|
| Asm->call(Immediate(Imm->getValue()));
|
| } else {
|
| llvm_unreachable("Unexpected operand type");
|
| }
|
| - Func->getTarget()->resetStackAdjustment();
|
| + Target->resetStackAdjustment();
|
| }
|
|
|
| template <class Machine>
|
| @@ -651,6 +654,7 @@ template <class Machine>
|
| void emitIASOpTyGPR(const Cfg *Func, Type Ty, const Operand *Op,
|
| const typename InstX86Base<
|
| Machine>::Traits::Assembler::GPREmitterOneOp &Emitter) {
|
| + TargetLowering *Target = Func->getTarget();
|
| typename InstX86Base<Machine>::Traits::Assembler *Asm =
|
| Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
|
| if (const auto *Var = llvm::dyn_cast<Variable>(Op)) {
|
| @@ -662,14 +666,14 @@ void emitIASOpTyGPR(const Cfg *Func, Type Ty, const Operand *Op,
|
| } else {
|
| typename InstX86Base<Machine>::Traits::Address StackAddr(
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->stackVarToAsmOperand(Var));
|
| (Asm->*(Emitter.Addr))(Ty, StackAddr);
|
| }
|
| } else if (const auto *Mem = llvm::dyn_cast<
|
| typename InstX86Base<Machine>::Traits::X86OperandMem>(Op)) {
|
| Mem->emitSegmentOverride(Asm);
|
| - (Asm->*(Emitter.Addr))(Ty, Mem->toAsmAddress(Asm));
|
| + (Asm->*(Emitter.Addr))(Ty, Mem->toAsmAddress(Asm, Target));
|
| } else {
|
| llvm_unreachable("Unexpected operand type");
|
| }
|
| @@ -680,6 +684,7 @@ void emitIASRegOpTyGPR(
|
| const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src,
|
| const typename InstX86Base<Machine>::Traits::Assembler::GPREmitterRegOp
|
| &Emitter) {
|
| + TargetLowering *Target = Func->getTarget();
|
| typename InstX86Base<Machine>::Traits::Assembler *Asm =
|
| Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
|
| assert(Var->hasReg());
|
| @@ -699,14 +704,14 @@ void emitIASRegOpTyGPR(
|
| } else {
|
| typename InstX86Base<Machine>::Traits::Address SrcStackAddr =
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->stackVarToAsmOperand(SrcVar);
|
| (Asm->*(Emitter.GPRAddr))(Ty, VarReg, SrcStackAddr);
|
| }
|
| } else if (const auto *Mem = llvm::dyn_cast<
|
| typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) {
|
| Mem->emitSegmentOverride(Asm);
|
| - (Asm->*(Emitter.GPRAddr))(Ty, VarReg, Mem->toAsmAddress(Asm));
|
| + (Asm->*(Emitter.GPRAddr))(Ty, VarReg, Mem->toAsmAddress(Asm, Target));
|
| } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) {
|
| (Asm->*(Emitter.GPRImm))(Ty, VarReg, Immediate(Imm->getValue()));
|
| } else if (const auto *Reloc = llvm::dyn_cast<ConstantRelocatable>(Src)) {
|
| @@ -752,11 +757,12 @@ void emitIASAsAddrOpTyGPR(
|
| const Cfg *Func, Type Ty, const Operand *Op0, const Operand *Op1,
|
| const typename InstX86Base<Machine>::Traits::Assembler::GPREmitterAddrOp
|
| &Emitter) {
|
| + TargetLowering *Target = Func->getTarget();
|
| if (const auto *Op0Var = llvm::dyn_cast<Variable>(Op0)) {
|
| assert(!Op0Var->hasReg());
|
| typename InstX86Base<Machine>::Traits::Address StackAddr(
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->stackVarToAsmOperand(Op0Var));
|
| emitIASAddrOpTyGPR<Machine>(Func, Ty, StackAddr, Op1, Emitter);
|
| } else if (const auto *Op0Mem = llvm::dyn_cast<
|
| @@ -764,8 +770,8 @@ void emitIASAsAddrOpTyGPR(
|
| typename InstX86Base<Machine>::Traits::Assembler *Asm =
|
| Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
|
| Op0Mem->emitSegmentOverride(Asm);
|
| - emitIASAddrOpTyGPR<Machine>(Func, Ty, Op0Mem->toAsmAddress(Asm), Op1,
|
| - Emitter);
|
| + emitIASAddrOpTyGPR<Machine>(Func, Ty, Op0Mem->toAsmAddress(Asm, Target),
|
| + Op1, Emitter);
|
| } else if (const auto *Split = llvm::dyn_cast<
|
| typename InstX86Base<Machine>::Traits::VariableSplit>(Op0)) {
|
| emitIASAddrOpTyGPR<Machine>(Func, Ty, Split->toAsmAddress(Func), Op1,
|
| @@ -835,6 +841,7 @@ void emitIASXmmShift(
|
| const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src,
|
| const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterShiftOp
|
| &Emitter) {
|
| + TargetLowering *Target = Func->getTarget();
|
| typename InstX86Base<Machine>::Traits::Assembler *Asm =
|
| Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
|
| assert(Var->hasReg());
|
| @@ -848,7 +855,7 @@ void emitIASXmmShift(
|
| } else {
|
| typename InstX86Base<Machine>::Traits::Address SrcStackAddr =
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->stackVarToAsmOperand(SrcVar);
|
| (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr);
|
| }
|
| @@ -856,7 +863,7 @@ void emitIASXmmShift(
|
| typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) {
|
| assert(Mem->getSegmentRegister() ==
|
| InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
|
| - (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm));
|
| + (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm, Target));
|
| } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) {
|
| (Asm->*(Emitter.XmmImm))(Ty, VarReg, Immediate(Imm->getValue()));
|
| } else {
|
| @@ -869,6 +876,7 @@ void emitIASRegOpTyXMM(
|
| const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src,
|
| const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp
|
| &Emitter) {
|
| + TargetLowering *Target = Func->getTarget();
|
| typename InstX86Base<Machine>::Traits::Assembler *Asm =
|
| Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
|
| assert(Var->hasReg());
|
| @@ -882,7 +890,7 @@ void emitIASRegOpTyXMM(
|
| } else {
|
| typename InstX86Base<Machine>::Traits::Address SrcStackAddr =
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->stackVarToAsmOperand(SrcVar);
|
| (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr);
|
| }
|
| @@ -890,7 +898,7 @@ void emitIASRegOpTyXMM(
|
| typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) {
|
| assert(Mem->getSegmentRegister() ==
|
| InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
|
| - (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm));
|
| + (Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm, Target));
|
| } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) {
|
| (Asm->*(Emitter.XmmAddr))(
|
| Ty, VarReg,
|
| @@ -906,6 +914,7 @@ void emitIASCastRegOp(const Cfg *Func, Type DestTy, const Variable *Dest,
|
| Type SrcTy, const Operand *Src,
|
| const typename InstX86Base<Machine>::Traits::Assembler::
|
| template CastEmitterRegOp<DReg_t, SReg_t> &Emitter) {
|
| + TargetLowering *Target = Func->getTarget();
|
| typename InstX86Base<Machine>::Traits::Assembler *Asm =
|
| Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
|
| assert(Dest->hasReg());
|
| @@ -917,14 +926,15 @@ void emitIASCastRegOp(const Cfg *Func, Type DestTy, const Variable *Dest,
|
| } else {
|
| typename InstX86Base<Machine>::Traits::Address SrcStackAddr =
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->stackVarToAsmOperand(SrcVar);
|
| (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, SrcStackAddr);
|
| }
|
| } else if (const auto *Mem = llvm::dyn_cast<
|
| typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) {
|
| Mem->emitSegmentOverride(Asm);
|
| - (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, Mem->toAsmAddress(Asm));
|
| + (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy,
|
| + Mem->toAsmAddress(Asm, Target));
|
| } else {
|
| llvm_unreachable("Unexpected operand type");
|
| }
|
| @@ -937,6 +947,7 @@ void emitIASThreeOpImmOps(
|
| const Operand *Src1,
|
| const typename InstX86Base<Machine>::Traits::Assembler::
|
| template ThreeOpImmEmitter<DReg_t, SReg_t> Emitter) {
|
| + TargetLowering *Target = Func->getTarget();
|
| typename InstX86Base<Machine>::Traits::Assembler *Asm =
|
| Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
|
| // This only handles Dest being a register, and Src1 being an immediate.
|
| @@ -950,15 +961,15 @@ void emitIASThreeOpImmOps(
|
| } else {
|
| typename InstX86Base<Machine>::Traits::Address SrcStackAddr =
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->stackVarToAsmOperand(SrcVar);
|
| (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, SrcStackAddr, Imm);
|
| }
|
| } else if (const auto *Mem = llvm::dyn_cast<
|
| typename InstX86Base<Machine>::Traits::X86OperandMem>(Src0)) {
|
| Mem->emitSegmentOverride(Asm);
|
| - (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, Mem->toAsmAddress(Asm),
|
| - Imm);
|
| + (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg,
|
| + Mem->toAsmAddress(Asm, Target), Imm);
|
| } else {
|
| llvm_unreachable("Unexpected operand type");
|
| }
|
| @@ -969,6 +980,7 @@ void emitIASMovlikeXMM(
|
| const Cfg *Func, const Variable *Dest, const Operand *Src,
|
| const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterMovOps
|
| Emitter) {
|
| + TargetLowering *Target = Func->getTarget();
|
| typename InstX86Base<Machine>::Traits::Assembler *Asm =
|
| Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
|
| if (Dest->hasReg()) {
|
| @@ -981,8 +993,8 @@ void emitIASMovlikeXMM(
|
| InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()));
|
| } else {
|
| typename InstX86Base<Machine>::Traits::Address StackAddr(
|
| - static_cast<typename InstX86Base<Machine>::Traits::TargetLowering
|
| - *>(Func->getTarget())
|
| + static_cast<
|
| + typename InstX86Base<Machine>::Traits::TargetLowering *>(Target)
|
| ->stackVarToAsmOperand(SrcVar));
|
| (Asm->*(Emitter.XmmAddr))(DestReg, StackAddr);
|
| }
|
| @@ -990,14 +1002,14 @@ void emitIASMovlikeXMM(
|
| typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) {
|
| assert(SrcMem->getSegmentRegister() ==
|
| InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
|
| - (Asm->*(Emitter.XmmAddr))(DestReg, SrcMem->toAsmAddress(Asm));
|
| + (Asm->*(Emitter.XmmAddr))(DestReg, SrcMem->toAsmAddress(Asm, Target));
|
| } else {
|
| llvm_unreachable("Unexpected operand type");
|
| }
|
| } else {
|
| typename InstX86Base<Machine>::Traits::Address StackAddr(
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->stackVarToAsmOperand(Dest));
|
| // Src must be a register in this case.
|
| const auto *SrcVar = llvm::cast<Variable>(Src);
|
| @@ -1054,10 +1066,11 @@ void InstX86Pmull<Machine>::emit(const Cfg *Func) const {
|
| char buf[30];
|
| bool TypesAreValid = this->getDest()->getType() == IceType_v4i32 ||
|
| this->getDest()->getType() == IceType_v8i16;
|
| + TargetLowering *Target = Func->getTarget();
|
| bool InstructionSetIsValid =
|
| this->getDest()->getType() == IceType_v8i16 ||
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1;
|
| (void)TypesAreValid;
|
| (void)InstructionSetIsValid;
|
| @@ -1074,10 +1087,11 @@ template <class Machine>
|
| void InstX86Pmull<Machine>::emitIAS(const Cfg *Func) const {
|
| Type Ty = this->getDest()->getType();
|
| bool TypesAreValid = Ty == IceType_v4i32 || Ty == IceType_v8i16;
|
| + TargetLowering *Target = Func->getTarget();
|
| bool InstructionSetIsValid =
|
| Ty == IceType_v8i16 ||
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1;
|
| (void)TypesAreValid;
|
| (void)InstructionSetIsValid;
|
| @@ -1222,16 +1236,18 @@ template <class Machine>
|
| void InstX86Blendvps<Machine>::emit(const Cfg *Func) const {
|
| if (!BuildDefs::dump())
|
| return;
|
| + TargetLowering *Target = Func->getTarget();
|
| assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
|
| emitVariableBlendInst<Machine>(this->Opcode, this, Func);
|
| }
|
|
|
| template <class Machine>
|
| void InstX86Blendvps<Machine>::emitIAS(const Cfg *Func) const {
|
| + TargetLowering *Target = Func->getTarget();
|
| assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
|
| static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp
|
| Emitter = {&InstX86Base<Machine>::Traits::Assembler::blendvps,
|
| @@ -1243,16 +1259,18 @@ template <class Machine>
|
| void InstX86Pblendvb<Machine>::emit(const Cfg *Func) const {
|
| if (!BuildDefs::dump())
|
| return;
|
| + TargetLowering *Target = Func->getTarget();
|
| assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
|
| emitVariableBlendInst<Machine>(this->Opcode, this, Func);
|
| }
|
|
|
| template <class Machine>
|
| void InstX86Pblendvb<Machine>::emitIAS(const Cfg *Func) const {
|
| + TargetLowering *Target = Func->getTarget();
|
| assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
|
| static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp
|
| Emitter = {&InstX86Base<Machine>::Traits::Assembler::pblendvb,
|
| @@ -1357,8 +1375,9 @@ void InstX86ImulImm<Machine>::emitIAS(const Cfg *Func) const {
|
| template <class Machine>
|
| void InstX86Insertps<Machine>::emitIAS(const Cfg *Func) const {
|
| assert(this->getSrcSize() == 3);
|
| + TargetLowering *Target = Func->getTarget();
|
| assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
|
| const Variable *Dest = this->getDest();
|
| assert(Dest == this->getSrc(0));
|
| @@ -1605,6 +1624,7 @@ void InstX86Cmov<Machine>::emitIAS(const Cfg *Func) const {
|
| (InstX86Base<Machine>::Traits::Is64Bit));
|
| typename InstX86Base<Machine>::Traits::Assembler *Asm =
|
| Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
|
| + TargetLowering *Target = Func->getTarget();
|
| if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) {
|
| if (SrcVar->hasReg()) {
|
| Asm->cmov(
|
| @@ -1616,7 +1636,7 @@ void InstX86Cmov<Machine>::emitIAS(const Cfg *Func) const {
|
| SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR(
|
| this->getDest()->getRegNum()),
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->stackVarToAsmOperand(SrcVar));
|
| }
|
| } else if (const auto *Mem = llvm::dyn_cast<
|
| @@ -1625,7 +1645,7 @@ void InstX86Cmov<Machine>::emitIAS(const Cfg *Func) const {
|
| InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
|
| Asm->cmov(SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR(
|
| this->getDest()->getRegNum()),
|
| - Mem->toAsmAddress(Asm));
|
| + Mem->toAsmAddress(Asm, Target));
|
| } else {
|
| llvm_unreachable("Unexpected operand type");
|
| }
|
| @@ -1671,6 +1691,7 @@ void InstX86Cmpps<Machine>::emitIAS(const Cfg *Func) const {
|
| // Assuming there isn't any load folding for cmpps, and vector constants are
|
| // not allowed in PNaCl.
|
| assert(llvm::isa<Variable>(this->getSrc(1)));
|
| + TargetLowering *Target = Func->getTarget();
|
| const auto *SrcVar = llvm::cast<Variable>(this->getSrc(1));
|
| if (SrcVar->hasReg()) {
|
| Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm(
|
| @@ -1680,7 +1701,7 @@ void InstX86Cmpps<Machine>::emitIAS(const Cfg *Func) const {
|
| } else {
|
| typename InstX86Base<Machine>::Traits::Address SrcStackAddr =
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->stackVarToAsmOperand(SrcVar);
|
| Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm(
|
| this->getDest()->getRegNum()),
|
| @@ -1724,13 +1745,14 @@ void InstX86Cmpxchg<Machine>::emitIAS(const Cfg *Func) const {
|
| typename InstX86Base<Machine>::Traits::Assembler *Asm =
|
| Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
|
| Type Ty = this->getSrc(0)->getType();
|
| + TargetLowering *Target = Func->getTarget();
|
| const auto Mem =
|
| llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>(
|
| this->getSrc(0));
|
| assert(Mem->getSegmentRegister() ==
|
| InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
|
| const typename InstX86Base<Machine>::Traits::Address Addr =
|
| - Mem->toAsmAddress(Asm);
|
| + Mem->toAsmAddress(Asm, Target);
|
| const auto *VarReg = llvm::cast<Variable>(this->getSrc(2));
|
| assert(VarReg->hasReg());
|
| const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg =
|
| @@ -1773,8 +1795,9 @@ void InstX86Cmpxchg8b<Machine>::emitIAS(const Cfg *Func) const {
|
| this->getSrc(0));
|
| assert(Mem->getSegmentRegister() ==
|
| InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
|
| + TargetLowering *Target = Func->getTarget();
|
| const typename InstX86Base<Machine>::Traits::Address Addr =
|
| - Mem->toAsmAddress(Asm);
|
| + Mem->toAsmAddress(Asm, Target);
|
| Asm->cmpxchg8b(Addr, this->Locked);
|
| }
|
|
|
| @@ -2114,11 +2137,12 @@ void InstX86Store<Machine>::emitIAS(const Cfg *Func) const {
|
| InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum());
|
| typename InstX86Base<Machine>::Traits::Assembler *Asm =
|
| Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
|
| + TargetLowering *Target = Func->getTarget();
|
| if (const auto *DestVar = llvm::dyn_cast<Variable>(Dest)) {
|
| assert(!DestVar->hasReg());
|
| typename InstX86Base<Machine>::Traits::Address StackAddr(
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->stackVarToAsmOperand(DestVar));
|
| Asm->movss(DestTy, StackAddr, SrcReg);
|
| } else {
|
| @@ -2127,7 +2151,7 @@ void InstX86Store<Machine>::emitIAS(const Cfg *Func) const {
|
| Dest);
|
| assert(DestMem->getSegmentRegister() ==
|
| InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
|
| - Asm->movss(DestTy, DestMem->toAsmAddress(Asm), SrcReg);
|
| + Asm->movss(DestTy, DestMem->toAsmAddress(Asm, Target), SrcReg);
|
| }
|
| return;
|
| } else {
|
| @@ -2176,7 +2200,8 @@ void InstX86StoreP<Machine>::emitIAS(const Cfg *Func) const {
|
| assert(DestMem->getSegmentRegister() ==
|
| InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
|
| assert(SrcVar->hasReg());
|
| - Asm->movups(DestMem->toAsmAddress(Asm),
|
| + TargetLowering *Target = Func->getTarget();
|
| + Asm->movups(DestMem->toAsmAddress(Asm, Target),
|
| InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()));
|
| }
|
|
|
| @@ -2218,7 +2243,8 @@ void InstX86StoreQ<Machine>::emitIAS(const Cfg *Func) const {
|
| assert(DestMem->getSegmentRegister() ==
|
| InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
|
| assert(SrcVar->hasReg());
|
| - Asm->movq(DestMem->toAsmAddress(Asm),
|
| + TargetLowering *Target = Func->getTarget();
|
| + Asm->movq(DestMem->toAsmAddress(Asm, Target),
|
| InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()));
|
| }
|
|
|
| @@ -2281,8 +2307,9 @@ template <class Machine> void InstX86Mov<Machine>::emit(const Cfg *Func) const {
|
| // TODO: This assert disallows usages such as copying a floating
|
| // point value between a vector and a scalar (which movss is used for). Clean
|
| // this up.
|
| - assert(Func->getTarget()->typeWidthInBytesOnStack(DestTy) ==
|
| - Func->getTarget()->typeWidthInBytesOnStack(SrcTy));
|
| + TargetLowering *Target = Func->getTarget();
|
| + assert(Target->typeWidthInBytesOnStack(DestTy) ==
|
| + Target->typeWidthInBytesOnStack(SrcTy));
|
| const Operand *NewSrc = Src;
|
| if (auto *SrcVar = llvm::dyn_cast<Variable>(Src)) {
|
| int32_t NewRegNum = Variable::NoRegister;
|
| @@ -2326,9 +2353,9 @@ void InstX86Mov<Machine>::emitIAS(const Cfg *Func) const {
|
| // TODO: This assert disallows usages such as copying a floating
|
| // point value between a vector and a scalar (which movss is used for). Clean
|
| // this up.
|
| - assert(
|
| - Func->getTarget()->typeWidthInBytesOnStack(this->getDest()->getType()) ==
|
| - Func->getTarget()->typeWidthInBytesOnStack(Src->getType()));
|
| + TargetLowering *Target = Func->getTarget();
|
| + assert(Target->typeWidthInBytesOnStack(this->getDest()->getType()) ==
|
| + Target->typeWidthInBytesOnStack(Src->getType()));
|
| if (Dest->hasReg()) {
|
| if (isScalarFloatingType(DestTy)) {
|
| emitIASRegOpTyXMM<Machine>(Func, DestTy, Dest, Src, XmmRegEmitter);
|
| @@ -2362,7 +2389,7 @@ void InstX86Mov<Machine>::emitIAS(const Cfg *Func) const {
|
| // decide on the emitters.
|
| typename InstX86Base<Machine>::Traits::Address StackAddr(
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->stackVarToAsmOperand(Dest));
|
| if (isScalarFloatingType(SrcTy)) {
|
| // Src must be a register.
|
| @@ -2391,6 +2418,7 @@ void InstX86Movd<Machine>::emitIAS(const Cfg *Func) const {
|
| assert(this->getSrcSize() == 1);
|
| const Variable *Dest = this->getDest();
|
| const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0));
|
| + TargetLowering *Target = Func->getTarget();
|
| // For insert/extract element (one of Src/Dest is an Xmm vector and the other
|
| // is an int type).
|
| if (SrcVar->getType() == IceType_i32 ||
|
| @@ -2410,7 +2438,7 @@ void InstX86Movd<Machine>::emitIAS(const Cfg *Func) const {
|
| } else {
|
| typename InstX86Base<Machine>::Traits::Address StackAddr(
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->stackVarToAsmOperand(SrcVar));
|
| Asm->movd(SrcVar->getType(), DestReg, StackAddr);
|
| }
|
| @@ -2432,7 +2460,7 @@ void InstX86Movd<Machine>::emitIAS(const Cfg *Func) const {
|
| } else {
|
| typename InstX86Base<Machine>::Traits::Address StackAddr(
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->stackVarToAsmOperand(Dest));
|
| Asm->movd(Dest->getType(), StackAddr, SrcReg);
|
| }
|
| @@ -2595,6 +2623,7 @@ void InstX86Fld<Machine>::emitIAS(const Cfg *Func) const {
|
| Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
|
| assert(this->getSrcSize() == 1);
|
| const Operand *Src = this->getSrc(0);
|
| + TargetLowering *Target = Func->getTarget();
|
| Type Ty = Src->getType();
|
| if (const auto *Var = llvm::dyn_cast<Variable>(Src)) {
|
| if (Var->hasReg()) {
|
| @@ -2617,7 +2646,7 @@ void InstX86Fld<Machine>::emitIAS(const Cfg *Func) const {
|
| } else {
|
| typename InstX86Base<Machine>::Traits::Address StackAddr(
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->stackVarToAsmOperand(Var));
|
| Asm->fld(Ty, StackAddr);
|
| }
|
| @@ -2625,7 +2654,7 @@ void InstX86Fld<Machine>::emitIAS(const Cfg *Func) const {
|
| typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) {
|
| assert(Mem->getSegmentRegister() ==
|
| InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
|
| - Asm->fld(Ty, Mem->toAsmAddress(Asm));
|
| + Asm->fld(Ty, Mem->toAsmAddress(Asm, Target));
|
| } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) {
|
| Asm->fld(Ty, InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm));
|
| } else {
|
| @@ -2688,11 +2717,12 @@ void InstX86Fstp<Machine>::emitIAS(const Cfg *Func) const {
|
| Asm->fstp(InstX86Base<Machine>::Traits::RegisterSet::getEncodedSTReg(0));
|
| return;
|
| }
|
| + TargetLowering *Target = Func->getTarget();
|
| Type Ty = Dest->getType();
|
| if (!Dest->hasReg()) {
|
| typename InstX86Base<Machine>::Traits::Address StackAddr(
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->stackVarToAsmOperand(Dest));
|
| Asm->fstp(Ty, StackAddr);
|
| } else {
|
| @@ -2755,10 +2785,11 @@ void InstX86Pextr<Machine>::emit(const Cfg *Func) const {
|
| Ostream &Str = Func->getContext()->getStrEmit();
|
| assert(this->getSrcSize() == 2);
|
| // pextrb and pextrd are SSE4.1 instructions.
|
| + TargetLowering *Target = Func->getTarget();
|
| assert(this->getSrc(0)->getType() == IceType_v8i16 ||
|
| this->getSrc(0)->getType() == IceType_v8i1 ||
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
|
| Str << "\t" << this->Opcode
|
| << InstX86Base<Machine>::Traits::TypeAttributes[this->getSrc(0)
|
| @@ -2783,9 +2814,10 @@ void InstX86Pextr<Machine>::emitIAS(const Cfg *Func) const {
|
| const Variable *Dest = this->getDest();
|
| Type DispatchTy = InstX86Base<Machine>::Traits::getInVectorElementType(
|
| this->getSrc(0)->getType());
|
| + TargetLowering *Target = Func->getTarget();
|
| assert(DispatchTy == IceType_i16 ||
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
|
| // pextrw must take a register dest. There is an SSE4.1 version that takes a
|
| // memory dest, but we aren't using it. For uniformity, just restrict them
|
| @@ -2813,10 +2845,11 @@ void InstX86Pinsr<Machine>::emit(const Cfg *Func) const {
|
| Ostream &Str = Func->getContext()->getStrEmit();
|
| assert(this->getSrcSize() == 3);
|
| // pinsrb and pinsrd are SSE4.1 instructions.
|
| + TargetLowering *Target = Func->getTarget();
|
| assert(this->getDest()->getType() == IceType_v8i16 ||
|
| this->getDest()->getType() == IceType_v8i1 ||
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
|
| Str << "\t" << this->Opcode
|
| << InstX86Base<
|
| @@ -2849,9 +2882,10 @@ void InstX86Pinsr<Machine>::emitIAS(const Cfg *Func) const {
|
| // pinsrb and pinsrd are SSE4.1 instructions.
|
| const Operand *Src0 = this->getSrc(1);
|
| Type DispatchTy = Src0->getType();
|
| + TargetLowering *Target = Func->getTarget();
|
| assert(DispatchTy == IceType_i16 ||
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
|
| // If src1 is a register, it should always be r32 (this should fall out from
|
| // the encodings for ByteRegs overlapping the encodings for r32), but we have
|
| @@ -2939,9 +2973,10 @@ void InstX86Pop<Machine>::emitIAS(const Cfg *Func) const {
|
| Asm->popl(InstX86Base<Machine>::Traits::getEncodedGPR(
|
| this->getDest()->getRegNum()));
|
| } else {
|
| + TargetLowering *Target = Func->getTarget();
|
| Asm->popl(
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->stackVarToAsmOperand(this->getDest()));
|
| }
|
| }
|
| @@ -2960,7 +2995,8 @@ void InstX86AdjustStack<Machine>::emit(const Cfg *Func) const {
|
| return;
|
| Ostream &Str = Func->getContext()->getStrEmit();
|
| Str << "\tsubl\t$" << Amount << ", %esp";
|
| - Func->getTarget()->updateStackAdjustment(Amount);
|
| + TargetLowering *Target = Func->getTarget();
|
| + Target->updateStackAdjustment(Amount);
|
| }
|
|
|
| template <class Machine>
|
| @@ -2970,7 +3006,8 @@ void InstX86AdjustStack<Machine>::emitIAS(const Cfg *Func) const {
|
| Asm->sub(IceType_i32,
|
| InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp,
|
| Immediate(Amount));
|
| - Func->getTarget()->updateStackAdjustment(Amount);
|
| + TargetLowering *Target = Func->getTarget();
|
| + Target->updateStackAdjustment(Amount);
|
| }
|
|
|
| template <class Machine>
|
| @@ -3100,6 +3137,7 @@ void InstX86Setcc<Machine>::emitIAS(const Cfg *Func) const {
|
| assert(this->getSrcSize() == 0);
|
| typename InstX86Base<Machine>::Traits::Assembler *Asm =
|
| Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
|
| + TargetLowering *Target = Func->getTarget();
|
| if (this->getDest()->hasReg())
|
| Asm->setcc(Condition, InstX86Base<Machine>::Traits::getEncodedByteReg(
|
| this->getDest()->getRegNum()));
|
| @@ -3107,7 +3145,7 @@ void InstX86Setcc<Machine>::emitIAS(const Cfg *Func) const {
|
| Asm->setcc(
|
| Condition,
|
| static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
|
| - Func->getTarget())
|
| + Target)
|
| ->stackVarToAsmOperand(this->getDest()));
|
| return;
|
| }
|
| @@ -3148,8 +3186,9 @@ void InstX86Xadd<Machine>::emitIAS(const Cfg *Func) const {
|
| this->getSrc(0));
|
| assert(Mem->getSegmentRegister() ==
|
| InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
|
| + TargetLowering *Target = Func->getTarget();
|
| const typename InstX86Base<Machine>::Traits::Address Addr =
|
| - Mem->toAsmAddress(Asm);
|
| + Mem->toAsmAddress(Asm, Target);
|
| const auto *VarReg = llvm::cast<Variable>(this->getSrc(1));
|
| assert(VarReg->hasReg());
|
| const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg =
|
| @@ -3205,8 +3244,9 @@ void InstX86Xchg<Machine>::emitIAS(const Cfg *Func) const {
|
| this->getSrc(0));
|
| assert(Mem->getSegmentRegister() ==
|
| InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
|
| + TargetLowering *Target = Func->getTarget();
|
| const typename InstX86Base<Machine>::Traits::Address Addr =
|
| - Mem->toAsmAddress(Asm);
|
| + Mem->toAsmAddress(Asm, Target);
|
| Asm->xchg(Ty, Addr, Reg1);
|
| }
|
|
|
|
|