Index: src/IceInstX86BaseImpl.h |
diff --git a/src/IceInstX86BaseImpl.h b/src/IceInstX86BaseImpl.h |
index 0f1ddd379c6e8e3225790cfa9abd391943b22864..6428f53642272f70413d5a0d16c0ae8b69d215ab 100644 |
--- a/src/IceInstX86BaseImpl.h |
+++ b/src/IceInstX86BaseImpl.h |
@@ -206,7 +206,7 @@ InstX86Cmpxchg<Machine>::InstX86Cmpxchg(Cfg *Func, Operand *DestOrAddr, |
: InstX86BaseLockable<Machine>(Func, InstX86Base<Machine>::Cmpxchg, 3, |
llvm::dyn_cast<Variable>(DestOrAddr), |
Locked) { |
- assert(Eax->getRegNum() == |
+ assert(InstX86Base<Machine>::Traits::getBaseReg(Eax->getRegNum()) == |
InstX86Base<Machine>::Traits::RegisterSet::Reg_eax); |
this->addSource(DestOrAddr); |
this->addSource(Eax); |
@@ -521,10 +521,9 @@ void InstX86Jmp<Machine>::emitIAS(const Cfg *Func) const { |
typename InstX86Base<Machine>::Traits::Assembler *Asm = |
Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
Operand *Target = getJmpTarget(); |
- if (const auto Var = llvm::dyn_cast<Variable>(Target)) { |
+ if (const auto *Var = llvm::dyn_cast<Variable>(Target)) { |
if (Var->hasReg()) { |
- Asm->jmp(InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR( |
- Var->getRegNum())); |
+ Asm->jmp(InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum())); |
} else { |
// The jmp instruction with a memory operand should be possible to |
// encode, but it isn't a valid sandboxed instruction, and there |
@@ -532,17 +531,17 @@ void InstX86Jmp<Machine>::emitIAS(const Cfg *Func) const { |
// register, so we don't really need to bother implementing it. |
llvm::report_fatal_error("Assembler can't jmp to memory operand"); |
} |
- } else if (const auto Mem = llvm::dyn_cast< |
+ } else if (const auto *Mem = llvm::dyn_cast< |
typename InstX86Base<Machine>::Traits::X86OperandMem>( |
Target)) { |
(void)Mem; |
assert(Mem->getSegmentRegister() == |
InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
llvm::report_fatal_error("Assembler can't jmp to memory operand"); |
- } else if (const auto CR = llvm::dyn_cast<ConstantRelocatable>(Target)) { |
+ } else if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(Target)) { |
assert(CR->getOffset() == 0 && "We only support jumping to a function"); |
Asm->jmp(CR); |
- } else if (const auto Imm = llvm::dyn_cast<ConstantInteger32>(Target)) { |
+ } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Target)) { |
// NaCl trampoline calls refer to an address within the sandbox directly. |
// This is usually only needed for non-IRT builds and otherwise not very |
// portable or stable. Usually this is only done for "calls" and not jumps. |
@@ -570,7 +569,7 @@ 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())) { |
+ if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(getCallTarget())) { |
// Emit without a leading '$'. |
Str << CI->getValue(); |
} else if (const auto CallTarget = |
@@ -588,26 +587,25 @@ 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)) { |
+ if (const auto *Var = llvm::dyn_cast<Variable>(Target)) { |
if (Var->hasReg()) { |
- Asm->call(InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR( |
- Var->getRegNum())); |
+ Asm->call(InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum())); |
} else { |
Asm->call( |
static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
Func->getTarget()) |
->stackVarToAsmOperand(Var)); |
} |
- } else if (const auto Mem = llvm::dyn_cast< |
+ } else if (const auto *Mem = llvm::dyn_cast< |
typename InstX86Base<Machine>::Traits::X86OperandMem>( |
Target)) { |
assert(Mem->getSegmentRegister() == |
InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
Asm->call(Mem->toAsmAddress(Asm)); |
- } else if (const auto CR = llvm::dyn_cast<ConstantRelocatable>(Target)) { |
+ } else if (const auto *CR = llvm::dyn_cast<ConstantRelocatable>(Target)) { |
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>(Target)) { |
Asm->call(Immediate(Imm->getValue())); |
} else { |
llvm_unreachable("Unexpected operand type"); |
@@ -628,12 +626,11 @@ void InstX86Call<Machine>::dump(const Cfg *Func) const { |
getCallTarget()->dump(Func); |
} |
-// The ShiftHack parameter is used to emit "cl" instead of "ecx" for shift |
-// instructions, in order to be syntactically valid. The this->Opcode parameter |
-// needs to be char* and not IceString because of template issues. |
+// The this->Opcode parameter needs to be char* and not IceString because of |
+// template issues. |
template <class Machine> |
void InstX86Base<Machine>::emitTwoAddress(const char *Opcode, const Inst *Inst, |
- const Cfg *Func, bool ShiftHack) { |
+ const Cfg *Func) { |
if (!BuildDefs::dump()) |
return; |
Ostream &Str = Func->getContext()->getStrEmit(); |
@@ -645,13 +642,7 @@ void InstX86Base<Machine>::emitTwoAddress(const char *Opcode, const Inst *Inst, |
Operand *Src1 = Inst->getSrc(1); |
Str << "\t" << Opcode << InstX86Base<Machine>::getWidthString(Dest->getType()) |
<< "\t"; |
- const auto ShiftReg = llvm::dyn_cast<Variable>(Src1); |
- if (ShiftHack && ShiftReg && |
- ShiftReg->getRegNum() == |
- InstX86Base<Machine>::Traits::RegisterSet::Reg_ecx) |
- Str << "%cl"; |
- else |
- Src1->emit(Func); |
+ Src1->emit(Func); |
Str << ", "; |
Dest->emit(Func); |
} |
@@ -662,12 +653,11 @@ void emitIASOpTyGPR(const Cfg *Func, Type Ty, const Operand *Op, |
Machine>::Traits::Assembler::GPREmitterOneOp &Emitter) { |
typename InstX86Base<Machine>::Traits::Assembler *Asm = |
Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
- if (const auto Var = llvm::dyn_cast<Variable>(Op)) { |
+ if (const auto *Var = llvm::dyn_cast<Variable>(Op)) { |
if (Var->hasReg()) { |
// We cheat a little and use GPRRegister even for byte operations. |
typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister VarReg = |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedByteRegOrGPR( |
- Ty, Var->getRegNum()); |
+ InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()); |
(Asm->*(Emitter.Reg))(Ty, VarReg); |
} else { |
typename InstX86Base<Machine>::Traits::Address StackAddr( |
@@ -676,7 +666,7 @@ void emitIASOpTyGPR(const Cfg *Func, Type Ty, const Operand *Op, |
->stackVarToAsmOperand(Var)); |
(Asm->*(Emitter.Addr))(Ty, StackAddr); |
} |
- } else if (const auto Mem = llvm::dyn_cast< |
+ } else if (const auto *Mem = llvm::dyn_cast< |
typename InstX86Base<Machine>::Traits::X86OperandMem>(Op)) { |
Mem->emitSegmentOverride(Asm); |
(Asm->*(Emitter.Addr))(Ty, Mem->toAsmAddress(Asm)); |
@@ -696,17 +686,14 @@ void emitIASRegOpTyGPR( |
// We cheat a little and use GPRRegister even for byte operations. |
typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister VarReg = |
VarCanBeByte |
- ? InstX86Base<Machine>::Traits::RegisterSet::getEncodedByteRegOrGPR( |
- Ty, Var->getRegNum()) |
- : InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR( |
- Var->getRegNum()); |
- if (const auto SrcVar = llvm::dyn_cast<Variable>(Src)) { |
+ ? InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()) |
+ : InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()); |
+ if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
if (SrcVar->hasReg()) { |
typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister SrcReg = |
SrcCanBeByte |
- ? InstX86Base<Machine>::Traits::RegisterSet:: |
- getEncodedByteRegOrGPR(Ty, SrcVar->getRegNum()) |
- : InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR( |
+ ? InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum()) |
+ : InstX86Base<Machine>::Traits::getEncodedGPR( |
SrcVar->getRegNum()); |
(Asm->*(Emitter.GPRGPR))(Ty, VarReg, SrcReg); |
} else { |
@@ -716,17 +703,17 @@ void emitIASRegOpTyGPR( |
->stackVarToAsmOperand(SrcVar); |
(Asm->*(Emitter.GPRAddr))(Ty, VarReg, SrcStackAddr); |
} |
- } else if (const auto Mem = llvm::dyn_cast< |
+ } 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)); |
- } else if (const auto Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { |
+ } 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)) { |
+ } else if (const auto *Reloc = llvm::dyn_cast<ConstantRelocatable>(Src)) { |
AssemblerFixup *Fixup = |
Asm->createFixup(InstX86Base<Machine>::Traits::RelFixup, Reloc); |
(Asm->*(Emitter.GPRImm))(Ty, VarReg, Immediate(Reloc->getOffset(), Fixup)); |
- } else if (const auto Split = llvm::dyn_cast< |
+ } else if (const auto *Split = llvm::dyn_cast< |
typename InstX86Base<Machine>::Traits::VariableSplit>(Src)) { |
(Asm->*(Emitter.GPRAddr))(Ty, VarReg, Split->toAsmAddress(Func)); |
} else { |
@@ -744,15 +731,14 @@ void emitIASAddrOpTyGPR( |
typename InstX86Base<Machine>::Traits::Assembler *Asm = |
Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
// Src can only be Reg or Immediate. |
- if (const auto SrcVar = llvm::dyn_cast<Variable>(Src)) { |
+ if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
assert(SrcVar->hasReg()); |
typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister SrcReg = |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedByteRegOrGPR( |
- Ty, SrcVar->getRegNum()); |
+ InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum()); |
(Asm->*(Emitter.AddrGPR))(Ty, Addr, SrcReg); |
- } else if (const auto Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { |
+ } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { |
(Asm->*(Emitter.AddrImm))(Ty, Addr, Immediate(Imm->getValue())); |
- } else if (const auto Reloc = llvm::dyn_cast<ConstantRelocatable>(Src)) { |
+ } else if (const auto *Reloc = llvm::dyn_cast<ConstantRelocatable>(Src)) { |
AssemblerFixup *Fixup = |
Asm->createFixup(InstX86Base<Machine>::Traits::RelFixup, Reloc); |
(Asm->*(Emitter.AddrImm))(Ty, Addr, Immediate(Reloc->getOffset(), Fixup)); |
@@ -766,21 +752,21 @@ void emitIASAsAddrOpTyGPR( |
const Cfg *Func, Type Ty, const Operand *Op0, const Operand *Op1, |
const typename InstX86Base<Machine>::Traits::Assembler::GPREmitterAddrOp |
&Emitter) { |
- if (const auto Op0Var = llvm::dyn_cast<Variable>(Op0)) { |
+ 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()) |
->stackVarToAsmOperand(Op0Var)); |
emitIASAddrOpTyGPR<Machine>(Func, Ty, StackAddr, Op1, Emitter); |
- } else if (const auto Op0Mem = llvm::dyn_cast< |
+ } else if (const auto *Op0Mem = llvm::dyn_cast< |
typename InstX86Base<Machine>::Traits::X86OperandMem>(Op0)) { |
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); |
- } else if (const auto Split = llvm::dyn_cast< |
+ } else if (const auto *Split = llvm::dyn_cast< |
typename InstX86Base<Machine>::Traits::VariableSplit>(Op0)) { |
emitIASAddrOpTyGPR<Machine>(Func, Ty, Split->toAsmAddress(Func), Op1, |
Emitter); |
@@ -801,16 +787,14 @@ void InstX86Base<Machine>::emitIASGPRShift( |
assert(Var->hasReg()); |
// We cheat a little and use GPRRegister even for byte operations. |
typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister VarReg = |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedByteRegOrGPR( |
- Ty, Var->getRegNum()); |
+ InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()); |
// Src must be reg == ECX or an Imm8. This is asserted by the assembler. |
- if (const auto SrcVar = llvm::dyn_cast<Variable>(Src)) { |
+ if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
assert(SrcVar->hasReg()); |
typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister SrcReg = |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedByteRegOrGPR( |
- Ty, SrcVar->getRegNum()); |
+ InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum()); |
(Asm->*(Emitter.GPRGPR))(Ty, VarReg, SrcReg); |
- } else if (const auto Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { |
+ } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { |
(Asm->*(Emitter.GPRImm))(Ty, VarReg, Immediate(Imm->getValue())); |
} else { |
llvm_unreachable("Unexpected operand type"); |
@@ -828,22 +812,20 @@ void emitIASGPRShiftDouble( |
// Dest can be reg or mem, but we only use the reg variant. |
assert(Dest->hasReg()); |
typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister DestReg = |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR( |
- Dest->getRegNum()); |
+ InstX86Base<Machine>::Traits::getEncodedGPR(Dest->getRegNum()); |
// SrcVar1 must be reg. |
- const auto SrcVar1 = llvm::cast<Variable>(Src1Op); |
+ const auto *SrcVar1 = llvm::cast<Variable>(Src1Op); |
assert(SrcVar1->hasReg()); |
typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister SrcReg = |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR( |
- SrcVar1->getRegNum()); |
+ InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar1->getRegNum()); |
Type Ty = SrcVar1->getType(); |
// Src2 can be the implicit CL register or an immediate. |
- if (const auto Imm = llvm::dyn_cast<ConstantInteger32>(Src2Op)) { |
+ if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src2Op)) { |
(Asm->*(Emitter.GPRGPRImm))(Ty, DestReg, SrcReg, |
Immediate(Imm->getValue())); |
} else { |
assert(llvm::cast<Variable>(Src2Op)->getRegNum() == |
- InstX86Base<Machine>::Traits::RegisterSet::Reg_ecx); |
+ InstX86Base<Machine>::Traits::RegisterSet::Reg_cl); |
(Asm->*(Emitter.GPRGPR))(Ty, DestReg, SrcReg); |
} |
} |
@@ -857,13 +839,11 @@ void emitIASXmmShift( |
Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
assert(Var->hasReg()); |
typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister VarReg = |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
- Var->getRegNum()); |
- if (const auto SrcVar = llvm::dyn_cast<Variable>(Src)) { |
+ InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum()); |
+ if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
if (SrcVar->hasReg()) { |
typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
- SrcVar->getRegNum()); |
+ InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); |
(Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg); |
} else { |
typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
@@ -872,12 +852,12 @@ void emitIASXmmShift( |
->stackVarToAsmOperand(SrcVar); |
(Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); |
} |
- } else if (const auto Mem = llvm::dyn_cast< |
+ } else if (const auto *Mem = llvm::dyn_cast< |
typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
assert(Mem->getSegmentRegister() == |
InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
(Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm)); |
- } else if (const auto Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { |
+ } else if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src)) { |
(Asm->*(Emitter.XmmImm))(Ty, VarReg, Immediate(Imm->getValue())); |
} else { |
llvm_unreachable("Unexpected operand type"); |
@@ -893,13 +873,11 @@ void emitIASRegOpTyXMM( |
Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
assert(Var->hasReg()); |
typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister VarReg = |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
- Var->getRegNum()); |
- if (const auto SrcVar = llvm::dyn_cast<Variable>(Src)) { |
+ InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum()); |
+ if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
if (SrcVar->hasReg()) { |
typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
- SrcVar->getRegNum()); |
+ InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); |
(Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg); |
} else { |
typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
@@ -908,12 +886,12 @@ void emitIASRegOpTyXMM( |
->stackVarToAsmOperand(SrcVar); |
(Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr); |
} |
- } else if (const auto Mem = llvm::dyn_cast< |
+ } else if (const auto *Mem = llvm::dyn_cast< |
typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
assert(Mem->getSegmentRegister() == |
InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
(Asm->*(Emitter.XmmAddr))(Ty, VarReg, Mem->toAsmAddress(Asm)); |
- } else if (const auto Imm = llvm::dyn_cast<Constant>(Src)) { |
+ } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { |
(Asm->*(Emitter.XmmAddr))( |
Ty, VarReg, |
InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm)); |
@@ -932,7 +910,7 @@ void emitIASCastRegOp(const Cfg *Func, Type DestTy, const Variable *Dest, |
Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
assert(Dest->hasReg()); |
DReg_t DestReg = destEnc(Dest->getRegNum()); |
- if (const auto SrcVar = llvm::dyn_cast<Variable>(Src)) { |
+ if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
if (SrcVar->hasReg()) { |
SReg_t SrcReg = srcEnc(SrcVar->getRegNum()); |
(Asm->*(Emitter.RegReg))(DestTy, DestReg, SrcTy, SrcReg); |
@@ -943,7 +921,7 @@ void emitIASCastRegOp(const Cfg *Func, Type DestTy, const Variable *Dest, |
->stackVarToAsmOperand(SrcVar); |
(Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, SrcStackAddr); |
} |
- } else if (const auto Mem = llvm::dyn_cast< |
+ } 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)); |
@@ -965,7 +943,7 @@ void emitIASThreeOpImmOps( |
assert(Dest->hasReg()); |
DReg_t DestReg = destEnc(Dest->getRegNum()); |
Immediate Imm(llvm::cast<ConstantInteger32>(Src1)->getValue()); |
- if (const auto SrcVar = llvm::dyn_cast<Variable>(Src0)) { |
+ if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src0)) { |
if (SrcVar->hasReg()) { |
SReg_t SrcReg = srcEnc(SrcVar->getRegNum()); |
(Asm->*(Emitter.RegRegImm))(DispatchTy, DestReg, SrcReg, Imm); |
@@ -976,7 +954,7 @@ void emitIASThreeOpImmOps( |
->stackVarToAsmOperand(SrcVar); |
(Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, SrcStackAddr, Imm); |
} |
- } else if (const auto Mem = llvm::dyn_cast< |
+ } 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), |
@@ -995,13 +973,12 @@ void emitIASMovlikeXMM( |
Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
if (Dest->hasReg()) { |
typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg = |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
- Dest->getRegNum()); |
- if (const auto SrcVar = llvm::dyn_cast<Variable>(Src)) { |
+ InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum()); |
+ if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
if (SrcVar->hasReg()) { |
(Asm->*(Emitter.XmmXmm))( |
- DestReg, InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
- SrcVar->getRegNum())); |
+ DestReg, |
+ InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); |
} else { |
typename InstX86Base<Machine>::Traits::Address StackAddr( |
static_cast<typename InstX86Base<Machine>::Traits::TargetLowering |
@@ -1009,7 +986,7 @@ void emitIASMovlikeXMM( |
->stackVarToAsmOperand(SrcVar)); |
(Asm->*(Emitter.XmmAddr))(DestReg, StackAddr); |
} |
- } else if (const auto SrcMem = llvm::dyn_cast< |
+ } else if (const auto *SrcMem = llvm::dyn_cast< |
typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
assert(SrcMem->getSegmentRegister() == |
InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
@@ -1023,11 +1000,11 @@ void emitIASMovlikeXMM( |
Func->getTarget()) |
->stackVarToAsmOperand(Dest)); |
// Src must be a register in this case. |
- const auto SrcVar = llvm::cast<Variable>(Src); |
+ const auto *SrcVar = llvm::cast<Variable>(Src); |
assert(SrcVar->hasReg()); |
(Asm->*(Emitter.AddrXmm))( |
- StackAddr, InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
- SrcVar->getRegNum())); |
+ StackAddr, |
+ InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); |
} |
} |
@@ -1292,11 +1269,10 @@ void InstX86Imul<Machine>::emit(const Cfg *Func) const { |
Variable *Dest = this->getDest(); |
if (isByteSizedArithType(Dest->getType())) { |
// The 8-bit version of imul only allows the form "imul r/m8". |
- const auto Src0Var = llvm::dyn_cast<Variable>(this->getSrc(0)); |
+ const auto *Src0Var = llvm::dyn_cast<Variable>(this->getSrc(0)); |
(void)Src0Var; |
- assert(Src0Var && |
- Src0Var->getRegNum() == |
- InstX86Base<Machine>::Traits::RegisterSet::Reg_eax); |
+ assert(Src0Var->getRegNum() == |
+ InstX86Base<Machine>::Traits::RegisterSet::Reg_al); |
Str << "\timulb\t"; |
this->getSrc(1)->emit(Func); |
} else if (llvm::isa<Constant>(this->getSrc(1))) { |
@@ -1319,11 +1295,10 @@ void InstX86Imul<Machine>::emitIAS(const Cfg *Func) const { |
const Operand *Src = this->getSrc(1); |
if (isByteSizedArithType(Ty)) { |
// The 8-bit version of imul only allows the form "imul r/m8". |
- const auto Src0Var = llvm::dyn_cast<Variable>(this->getSrc(0)); |
+ const auto *Src0Var = llvm::dyn_cast<Variable>(this->getSrc(0)); |
(void)Src0Var; |
- assert(Src0Var && |
- Src0Var->getRegNum() == |
- InstX86Base<Machine>::Traits::RegisterSet::Reg_eax); |
+ assert(Src0Var->getRegNum() == |
+ InstX86Base<Machine>::Traits::RegisterSet::Reg_al); |
static const typename InstX86Base< |
Machine>::Traits::Assembler::GPREmitterOneOp Emitter = { |
&InstX86Base<Machine>::Traits::Assembler::imul, |
@@ -1374,8 +1349,8 @@ void InstX86ImulImm<Machine>::emitIAS(const Cfg *Func) const { |
emitIASThreeOpImmOps< |
Machine, typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, |
typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR>( |
+ InstX86Base<Machine>::Traits::getEncodedGPR, |
+ InstX86Base<Machine>::Traits::getEncodedGPR>( |
Func, Ty, Dest, this->getSrc(0), this->getSrc(1), Emitter); |
} |
@@ -1397,8 +1372,8 @@ void InstX86Insertps<Machine>::emitIAS(const Cfg *Func) const { |
emitIASThreeOpImmOps< |
Machine, typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, |
typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm>( |
+ InstX86Base<Machine>::Traits::getEncodedXmm, |
+ InstX86Base<Machine>::Traits::getEncodedXmm>( |
Func, Ty, Dest, this->getSrc(1), this->getSrc(2), Emitter); |
} |
@@ -1410,25 +1385,29 @@ void InstX86Cbwdq<Machine>::emit(const Cfg *Func) const { |
assert(this->getSrcSize() == 1); |
Operand *Src0 = this->getSrc(0); |
assert(llvm::isa<Variable>(Src0)); |
- assert(llvm::cast<Variable>(Src0)->getRegNum() == |
- InstX86Base<Machine>::Traits::RegisterSet::Reg_eax); |
switch (Src0->getType()) { |
default: |
llvm_unreachable("unexpected source type!"); |
break; |
case IceType_i8: |
+ assert(llvm::cast<Variable>(Src0)->getRegNum() == |
+ InstX86Base<Machine>::Traits::RegisterSet::Reg_al); |
assert(this->getDest()->getRegNum() == |
- InstX86Base<Machine>::Traits::RegisterSet::Reg_eax); |
+ InstX86Base<Machine>::Traits::RegisterSet::Reg_ax); |
Str << "\t" |
<< "cbtw"; |
break; |
case IceType_i16: |
+ assert(llvm::cast<Variable>(Src0)->getRegNum() == |
+ InstX86Base<Machine>::Traits::RegisterSet::Reg_ax); |
assert(this->getDest()->getRegNum() == |
- InstX86Base<Machine>::Traits::RegisterSet::Reg_edx); |
+ InstX86Base<Machine>::Traits::RegisterSet::Reg_dx); |
Str << "\t" |
<< "cwtd"; |
break; |
case IceType_i32: |
+ assert(llvm::cast<Variable>(Src0)->getRegNum() == |
+ InstX86Base<Machine>::Traits::RegisterSet::Reg_eax); |
assert(this->getDest()->getRegNum() == |
InstX86Base<Machine>::Traits::RegisterSet::Reg_edx); |
Str << "\t" |
@@ -1450,23 +1429,27 @@ void InstX86Cbwdq<Machine>::emitIAS(const Cfg *Func) const { |
assert(this->getSrcSize() == 1); |
Operand *Src0 = this->getSrc(0); |
assert(llvm::isa<Variable>(Src0)); |
- assert(llvm::cast<Variable>(Src0)->getRegNum() == |
- InstX86Base<Machine>::Traits::RegisterSet::Reg_eax); |
switch (Src0->getType()) { |
default: |
llvm_unreachable("unexpected source type!"); |
break; |
case IceType_i8: |
+ assert(llvm::cast<Variable>(Src0)->getRegNum() == |
+ InstX86Base<Machine>::Traits::RegisterSet::Reg_al); |
assert(this->getDest()->getRegNum() == |
- InstX86Base<Machine>::Traits::RegisterSet::Reg_eax); |
+ InstX86Base<Machine>::Traits::RegisterSet::Reg_ax); |
Asm->cbw(); |
break; |
case IceType_i16: |
+ assert(llvm::cast<Variable>(Src0)->getRegNum() == |
+ InstX86Base<Machine>::Traits::RegisterSet::Reg_ax); |
assert(this->getDest()->getRegNum() == |
- InstX86Base<Machine>::Traits::RegisterSet::Reg_edx); |
+ InstX86Base<Machine>::Traits::RegisterSet::Reg_dx); |
Asm->cwd(); |
break; |
case IceType_i32: |
+ assert(llvm::cast<Variable>(Src0)->getRegNum() == |
+ InstX86Base<Machine>::Traits::RegisterSet::Reg_eax); |
assert(this->getDest()->getRegNum() == |
InstX86Base<Machine>::Traits::RegisterSet::Reg_edx); |
Asm->cdq(); |
@@ -1529,14 +1512,7 @@ void InstX86Shld<Machine>::emit(const Cfg *Func) const { |
assert(this->getSrcSize() == 3); |
assert(Dest == this->getSrc(0)); |
Str << "\tshld" << this->getWidthString(Dest->getType()) << "\t"; |
- if (const auto ShiftReg = llvm::dyn_cast<Variable>(this->getSrc(2))) { |
- (void)ShiftReg; |
- assert(ShiftReg->getRegNum() == |
- InstX86Base<Machine>::Traits::RegisterSet::Reg_ecx); |
- Str << "%cl"; |
- } else { |
- this->getSrc(2)->emit(Func); |
- } |
+ this->getSrc(2)->emit(Func); |
Str << ", "; |
this->getSrc(1)->emit(Func); |
Str << ", "; |
@@ -1576,14 +1552,7 @@ void InstX86Shrd<Machine>::emit(const Cfg *Func) const { |
assert(this->getSrcSize() == 3); |
assert(Dest == this->getSrc(0)); |
Str << "\tshrd" << this->getWidthString(Dest->getType()) << "\t"; |
- if (const auto ShiftReg = llvm::dyn_cast<Variable>(this->getSrc(2))) { |
- (void)ShiftReg; |
- assert(ShiftReg->getRegNum() == |
- InstX86Base<Machine>::Traits::RegisterSet::Reg_ecx); |
- Str << "%cl"; |
- } else { |
- this->getSrc(2)->emit(Func); |
- } |
+ this->getSrc(2)->emit(Func); |
Str << ", "; |
this->getSrc(1)->emit(Func); |
Str << ", "; |
@@ -1644,27 +1613,24 @@ void InstX86Cmov<Machine>::emitIAS(const Cfg *Func) const { |
Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) { |
if (SrcVar->hasReg()) { |
- Asm->cmov(SrcTy, Condition, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR( |
- this->getDest()->getRegNum()), |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR( |
- SrcVar->getRegNum())); |
+ Asm->cmov( |
+ SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( |
+ this->getDest()->getRegNum()), |
+ InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum())); |
} else { |
Asm->cmov( |
- SrcTy, Condition, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR( |
- this->getDest()->getRegNum()), |
+ SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( |
+ this->getDest()->getRegNum()), |
static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
Func->getTarget()) |
->stackVarToAsmOperand(SrcVar)); |
} |
- } else if (const auto Mem = llvm::dyn_cast< |
+ } else if (const auto *Mem = llvm::dyn_cast< |
typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
assert(Mem->getSegmentRegister() == |
InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
- Asm->cmov(SrcTy, Condition, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR( |
- this->getDest()->getRegNum()), |
+ Asm->cmov(SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR( |
+ this->getDest()->getRegNum()), |
Mem->toAsmAddress(Asm)); |
} else { |
llvm_unreachable("Unexpected operand type"); |
@@ -1711,19 +1677,18 @@ 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))); |
- const auto SrcVar = llvm::cast<Variable>(this->getSrc(1)); |
+ const auto *SrcVar = llvm::cast<Variable>(this->getSrc(1)); |
if (SrcVar->hasReg()) { |
- Asm->cmpps(InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
+ Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm( |
this->getDest()->getRegNum()), |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
- SrcVar->getRegNum()), |
+ InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()), |
Condition); |
} else { |
typename InstX86Base<Machine>::Traits::Address SrcStackAddr = |
static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
Func->getTarget()) |
->stackVarToAsmOperand(SrcVar); |
- Asm->cmpps(InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
+ Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm( |
this->getDest()->getRegNum()), |
SrcStackAddr, Condition); |
} |
@@ -1772,11 +1737,10 @@ void InstX86Cmpxchg<Machine>::emitIAS(const Cfg *Func) const { |
InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
const typename InstX86Base<Machine>::Traits::Address Addr = |
Mem->toAsmAddress(Asm); |
- const auto VarReg = llvm::cast<Variable>(this->getSrc(2)); |
+ const auto *VarReg = llvm::cast<Variable>(this->getSrc(2)); |
assert(VarReg->hasReg()); |
const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg = |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR( |
- VarReg->getRegNum()); |
+ InstX86Base<Machine>::Traits::getEncodedGPR(VarReg->getRegNum()); |
Asm->cmpxchg(Ty, Addr, Reg, this->Locked); |
} |
@@ -1877,9 +1841,9 @@ void InstX86Cvt<Machine>::emitIAS(const Cfg *Func) const { |
Machine, |
typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, |
typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR>( |
- Func, DestTy, Dest, SrcTy, Src, Emitter); |
+ InstX86Base<Machine>::Traits::getEncodedXmm, |
+ InstX86Base<Machine>::Traits::getEncodedGPR>(Func, DestTy, Dest, SrcTy, |
+ Src, Emitter); |
return; |
} |
case Tss2si: { |
@@ -1900,9 +1864,9 @@ void InstX86Cvt<Machine>::emitIAS(const Cfg *Func) const { |
Machine, |
typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, |
typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm>( |
- Func, DestTy, Dest, SrcTy, Src, Emitter); |
+ InstX86Base<Machine>::Traits::getEncodedGPR, |
+ InstX86Base<Machine>::Traits::getEncodedXmm>(Func, DestTy, Dest, SrcTy, |
+ Src, Emitter); |
return; |
} |
case Float2float: { |
@@ -1982,7 +1946,7 @@ void InstX86Icmp<Machine>::emitIAS(const Cfg *Func) const { |
Machine>::Traits::Assembler::GPREmitterAddrOp AddrEmitter = { |
&InstX86Base<Machine>::Traits::Assembler::cmp, |
&InstX86Base<Machine>::Traits::Assembler::cmp}; |
- if (const auto SrcVar0 = llvm::dyn_cast<Variable>(Src0)) { |
+ if (const auto *SrcVar0 = llvm::dyn_cast<Variable>(Src0)) { |
if (SrcVar0->hasReg()) { |
emitIASRegOpTyGPR<Machine>(Func, Ty, SrcVar0, Src1, RegEmitter); |
return; |
@@ -2021,7 +1985,7 @@ void InstX86Ucomiss<Machine>::emitIAS(const Cfg *Func) const { |
// Currently src0 is always a variable by convention, to avoid having two |
// memory operands. |
assert(llvm::isa<Variable>(this->getSrc(0))); |
- const auto Src0Var = llvm::cast<Variable>(this->getSrc(0)); |
+ const auto *Src0Var = llvm::cast<Variable>(this->getSrc(0)); |
Type Ty = Src0Var->getType(); |
static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp |
Emitter = {&InstX86Base<Machine>::Traits::Assembler::ucomiss, |
@@ -2086,7 +2050,7 @@ void InstX86Test<Machine>::emitIAS(const Cfg *Func) const { |
Machine>::Traits::Assembler::GPREmitterAddrOp AddrEmitter = { |
&InstX86Base<Machine>::Traits::Assembler::test, |
&InstX86Base<Machine>::Traits::Assembler::test}; |
- if (const auto SrcVar0 = llvm::dyn_cast<Variable>(Src0)) { |
+ if (const auto *SrcVar0 = llvm::dyn_cast<Variable>(Src0)) { |
if (SrcVar0->hasReg()) { |
emitIASRegOpTyGPR<Machine>(Func, Ty, SrcVar0, Src1, RegEmitter); |
return; |
@@ -2150,14 +2114,13 @@ void InstX86Store<Machine>::emitIAS(const Cfg *Func) const { |
Type DestTy = Dest->getType(); |
if (isScalarFloatingType(DestTy)) { |
// Src must be a register, since Dest is a Mem operand of some kind. |
- const auto SrcVar = llvm::cast<Variable>(Src); |
+ const auto *SrcVar = llvm::cast<Variable>(Src); |
assert(SrcVar->hasReg()); |
typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
- SrcVar->getRegNum()); |
+ InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); |
typename InstX86Base<Machine>::Traits::Assembler *Asm = |
Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
- if (const auto DestVar = llvm::dyn_cast<Variable>(Dest)) { |
+ 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 *>( |
@@ -2212,7 +2175,7 @@ void InstX86StoreP<Machine>::emitIAS(const Cfg *Func) const { |
typename InstX86Base<Machine>::Traits::Assembler *Asm = |
Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
assert(this->getSrcSize() == 2); |
- const auto SrcVar = llvm::cast<Variable>(this->getSrc(0)); |
+ const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); |
const auto DestMem = |
llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
this->getSrc(1)); |
@@ -2220,8 +2183,7 @@ void InstX86StoreP<Machine>::emitIAS(const Cfg *Func) const { |
InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
assert(SrcVar->hasReg()); |
Asm->movups(DestMem->toAsmAddress(Asm), |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
- SrcVar->getRegNum())); |
+ InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); |
} |
template <class Machine> |
@@ -2255,7 +2217,7 @@ void InstX86StoreQ<Machine>::emitIAS(const Cfg *Func) const { |
typename InstX86Base<Machine>::Traits::Assembler *Asm = |
Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
assert(this->getSrcSize() == 2); |
- const auto SrcVar = llvm::cast<Variable>(this->getSrc(0)); |
+ const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); |
const auto DestMem = |
llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>( |
this->getSrc(1)); |
@@ -2263,8 +2225,7 @@ void InstX86StoreQ<Machine>::emitIAS(const Cfg *Func) const { |
InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
assert(SrcVar->hasReg()); |
Asm->movq(DestMem->toAsmAddress(Asm), |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
- SrcVar->getRegNum())); |
+ InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); |
} |
template <class Machine> |
@@ -2286,11 +2247,12 @@ template <class Machine> void InstX86Lea<Machine>::emit(const Cfg *Func) const { |
assert(this->getDest()->hasReg()); |
Str << "\tleal\t"; |
Operand *Src0 = this->getSrc(0); |
- if (const auto Src0Var = llvm::dyn_cast<Variable>(Src0)) { |
+ if (const auto *Src0Var = llvm::dyn_cast<Variable>(Src0)) { |
Type Ty = Src0Var->getType(); |
// lea on x86-32 doesn't accept mem128 operands, so cast VSrc0 to an |
// acceptable type. |
- Src0Var->asType(isVectorType(Ty) ? IceType_i32 : Ty)->emit(Func); |
+ Src0Var->asType(isVectorType(Ty) ? IceType_i32 : Ty, Variable::NoRegister) |
+ ->emit(Func); |
} else { |
Src0->emit(Func); |
} |
@@ -2334,7 +2296,14 @@ template <class Machine> void InstX86Mov<Machine>::emit(const Cfg *Func) const { |
Func->getTarget()->typeWidthInBytesOnStack(SrcTy)); |
Src->emit(Func); |
Str << ", "; |
- this->getDest()->asType(SrcTy)->emit(Func); |
+ int32_t NewRegNum = Variable::NoRegister; |
+ if (this->getDest()->hasReg()) |
+ NewRegNum = InstX86Base<Machine>::Traits::getGprForType( |
+ SrcTy, this->getDest()->getRegNum()); |
+ const Variable *NewDest = SrcTy == DestTy |
+ ? this->getDest() |
+ : this->getDest()->asType(SrcTy, NewRegNum); |
+ NewDest->emit(Func); |
} |
template <class Machine> |
@@ -2391,9 +2360,9 @@ void InstX86Mov<Machine>::emitIAS(const Cfg *Func) const { |
Value = llvm::cast<ConstantInteger32>(Src)->getValue(); |
} |
Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>() |
- ->movabs(InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR( |
- Dest->getRegNum()), |
- Value); |
+ ->movabs( |
+ InstX86Base<Machine>::Traits::getEncodedGPR(Dest->getRegNum()), |
+ Value); |
return; |
} |
if (isScalarIntegerType(SrcTy)) { |
@@ -2411,14 +2380,13 @@ void InstX86Mov<Machine>::emitIAS(const Cfg *Func) const { |
->stackVarToAsmOperand(Dest)); |
if (isScalarFloatingType(SrcTy)) { |
// Src must be a register. |
- const auto SrcVar = llvm::cast<Variable>(Src); |
+ const auto *SrcVar = llvm::cast<Variable>(Src); |
assert(SrcVar->hasReg()); |
typename InstX86Base<Machine>::Traits::Assembler *Asm = |
Func->getAssembler< |
typename InstX86Base<Machine>::Traits::Assembler>(); |
- Asm->movss(SrcTy, StackAddr, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
- SrcVar->getRegNum())); |
+ Asm->movss(SrcTy, StackAddr, InstX86Base<Machine>::Traits::getEncodedXmm( |
+ SrcVar->getRegNum())); |
return; |
} else { |
// Src can be a register or immediate. |
@@ -2436,7 +2404,7 @@ void InstX86Movd<Machine>::emitIAS(const Cfg *Func) const { |
Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
assert(this->getSrcSize() == 1); |
const Variable *Dest = this->getDest(); |
- const auto SrcVar = llvm::cast<Variable>(this->getSrc(0)); |
+ const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0)); |
// For insert/extract element (one of Src/Dest is an Xmm vector and the other |
// is an int type). |
if (SrcVar->getType() == IceType_i32 || |
@@ -2448,12 +2416,11 @@ void InstX86Movd<Machine>::emitIAS(const Cfg *Func) const { |
typeWidthInBytes(Dest->getType()))); |
assert(Dest->hasReg()); |
typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg = |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
- Dest->getRegNum()); |
+ InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum()); |
if (SrcVar->hasReg()) { |
- Asm->movd(SrcVar->getType(), DestReg, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR( |
- SrcVar->getRegNum())); |
+ Asm->movd( |
+ SrcVar->getType(), DestReg, |
+ InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum())); |
} else { |
typename InstX86Base<Machine>::Traits::Address StackAddr( |
static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
@@ -2471,12 +2438,10 @@ void InstX86Movd<Machine>::emitIAS(const Cfg *Func) const { |
(InstX86Base<Machine>::Traits::Is64Bit && |
Dest->getType() == IceType_i64)); |
typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg = |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
- SrcVar->getRegNum()); |
+ InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()); |
if (Dest->hasReg()) { |
Asm->movd(Dest->getType(), |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR( |
- Dest->getRegNum()), |
+ InstX86Base<Machine>::Traits::getEncodedGPR(Dest->getRegNum()), |
SrcReg); |
} else { |
typename InstX86Base<Machine>::Traits::Address StackAddr( |
@@ -2553,15 +2518,13 @@ void InstX86MovssRegs<Machine>::emitIAS(const Cfg *Func) const { |
assert(this->getSrcSize() == 2); |
const Variable *Dest = this->getDest(); |
assert(Dest == this->getSrc(0)); |
- const auto SrcVar = llvm::cast<Variable>(this->getSrc(1)); |
+ const auto *SrcVar = llvm::cast<Variable>(this->getSrc(1)); |
assert(Dest->hasReg() && SrcVar->hasReg()); |
typename InstX86Base<Machine>::Traits::Assembler *Asm = |
Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
Asm->movss(IceType_f32, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
- Dest->getRegNum()), |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
- SrcVar->getRegNum())); |
+ InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum()), |
+ InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum())); |
} |
template <class Machine> |
@@ -2621,7 +2584,7 @@ template <class Machine> void InstX86Fld<Machine>::emit(const Cfg *Func) const { |
assert(this->getSrcSize() == 1); |
Type Ty = this->getSrc(0)->getType(); |
SizeT Width = typeWidthInBytes(Ty); |
- const auto Var = llvm::dyn_cast<Variable>(this->getSrc(0)); |
+ const auto *Var = llvm::dyn_cast<Variable>(this->getSrc(0)); |
if (Var && Var->hasReg()) { |
// This is a physical xmm register, so we need to spill it to a temporary |
// stack slot. |
@@ -2647,7 +2610,7 @@ void InstX86Fld<Machine>::emitIAS(const Cfg *Func) const { |
assert(this->getSrcSize() == 1); |
const Operand *Src = this->getSrc(0); |
Type Ty = Src->getType(); |
- if (const auto Var = llvm::dyn_cast<Variable>(Src)) { |
+ if (const auto *Var = llvm::dyn_cast<Variable>(Src)) { |
if (Var->hasReg()) { |
// This is a physical xmm register, so we need to spill it to a temporary |
// stack slot. |
@@ -2660,8 +2623,7 @@ void InstX86Fld<Machine>::emitIAS(const Cfg *Func) const { |
InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, 0, |
AssemblerFixup::NoFixup); |
Asm->movss(Ty, StackSlot, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
- Var->getRegNum())); |
+ InstX86Base<Machine>::Traits::getEncodedXmm(Var->getRegNum())); |
Asm->fld(Ty, StackSlot); |
Asm->add(IceType_i32, |
InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, |
@@ -2673,12 +2635,12 @@ void InstX86Fld<Machine>::emitIAS(const Cfg *Func) const { |
->stackVarToAsmOperand(Var)); |
Asm->fld(Ty, StackAddr); |
} |
- } else if (const auto Mem = llvm::dyn_cast< |
+ } else if (const auto *Mem = llvm::dyn_cast< |
typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) { |
assert(Mem->getSegmentRegister() == |
InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
Asm->fld(Ty, Mem->toAsmAddress(Asm)); |
- } else if (const auto Imm = llvm::dyn_cast<Constant>(Src)) { |
+ } else if (const auto *Imm = llvm::dyn_cast<Constant>(Src)) { |
Asm->fld(Ty, InstX86Base<Machine>::Traits::Address::ofConstPool(Asm, Imm)); |
} else { |
llvm_unreachable("Unexpected operand type"); |
@@ -2759,8 +2721,8 @@ void InstX86Fstp<Machine>::emitIAS(const Cfg *Func) const { |
InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, 0, |
AssemblerFixup::NoFixup); |
Asm->fstp(Ty, StackSlot); |
- Asm->movss(Ty, InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm( |
- Dest->getRegNum()), |
+ Asm->movss(Ty, |
+ InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum()), |
StackSlot); |
Asm->add(IceType_i32, |
InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp, Width); |
@@ -2825,7 +2787,7 @@ void InstX86Pextr<Machine>::emit(const Cfg *Func) const { |
// memory dest, but we aren't using it. For uniformity, just restrict them |
// all to have a register dest for now. |
assert(Dest->hasReg()); |
- Dest->asType(IceType_i32)->emit(Func); |
+ Dest->asType(IceType_i32, Dest->getRegNum())->emit(Func); |
} |
template <class Machine> |
@@ -2833,7 +2795,8 @@ void InstX86Pextr<Machine>::emitIAS(const Cfg *Func) const { |
assert(this->getSrcSize() == 2); |
// pextrb and pextrd are SSE4.1 instructions. |
const Variable *Dest = this->getDest(); |
- Type DispatchTy = Dest->getType(); |
+ Type DispatchTy = InstX86Base<Machine>::Traits::getInVectorElementType( |
+ this->getSrc(0)->getType()); |
assert(DispatchTy == IceType_i16 || |
static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>( |
Func->getTarget()) |
@@ -2852,8 +2815,8 @@ void InstX86Pextr<Machine>::emitIAS(const Cfg *Func) const { |
emitIASThreeOpImmOps< |
Machine, typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, |
typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm>( |
+ InstX86Base<Machine>::Traits::getEncodedGPR, |
+ InstX86Base<Machine>::Traits::getEncodedXmm>( |
Func, DispatchTy, Dest, this->getSrc(0), this->getSrc(1), Emitter); |
} |
@@ -2876,10 +2839,13 @@ void InstX86Pinsr<Machine>::emit(const Cfg *Func) const { |
this->getSrc(2)->emit(Func); |
Str << ", "; |
Operand *Src1 = this->getSrc(1); |
- if (const auto Src1Var = llvm::dyn_cast<Variable>(Src1)) { |
+ if (const auto *Src1Var = llvm::dyn_cast<Variable>(Src1)) { |
// If src1 is a register, it should always be r32. |
if (Src1Var->hasReg()) { |
- Src1Var->asType(IceType_i32)->emit(Func); |
+ int32_t NewRegNum = |
+ InstX86Base<Machine>::Traits::getBaseReg(Src1Var->getRegNum()); |
+ const Variable *NewSrc = Src1Var->asType(IceType_i32, NewRegNum); |
+ NewSrc->emit(Func); |
} else { |
Src1Var->emit(Func); |
} |
@@ -2903,7 +2869,19 @@ void InstX86Pinsr<Machine>::emitIAS(const Cfg *Func) const { |
->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 |
- // to trust the regalloc to not choose "ah", where it doesn't overlap. |
+ // to make sure the register allocator didn't choose an 8-bit high register |
+ // like "ah". |
+ if (BuildDefs::asserts()) { |
+ if (auto *Src0Var = llvm::dyn_cast<Variable>(Src0)) { |
+ if (Src0Var->hasReg()) { |
+ int32_t RegNum = Src0Var->getRegNum(); |
+ int32_t BaseRegNum = InstX86Base<Machine>::Traits::getBaseReg(RegNum); |
+ (void)BaseRegNum; |
+ assert(InstX86Base<Machine>::Traits::getEncodedGPR(RegNum) == |
+ InstX86Base<Machine>::Traits::getEncodedGPR(BaseRegNum)); |
+ } |
+ } |
+ } |
static const typename InstX86Base<Machine>::Traits::Assembler:: |
template ThreeOpImmEmitter< |
typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, |
@@ -2913,8 +2891,8 @@ void InstX86Pinsr<Machine>::emitIAS(const Cfg *Func) const { |
emitIASThreeOpImmOps< |
Machine, typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, |
typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR>( |
+ InstX86Base<Machine>::Traits::getEncodedXmm, |
+ InstX86Base<Machine>::Traits::getEncodedGPR>( |
Func, DispatchTy, this->getDest(), Src0, this->getSrc(2), Emitter); |
} |
@@ -2932,8 +2910,8 @@ void InstX86Pshufd<Machine>::emitIAS(const Cfg *Func) const { |
emitIASThreeOpImmOps< |
Machine, typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, |
typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm>( |
+ InstX86Base<Machine>::Traits::getEncodedXmm, |
+ InstX86Base<Machine>::Traits::getEncodedXmm>( |
Func, Ty, Dest, this->getSrc(0), this->getSrc(1), Emitter); |
} |
@@ -2952,8 +2930,8 @@ void InstX86Shufps<Machine>::emitIAS(const Cfg *Func) const { |
emitIASThreeOpImmOps< |
Machine, typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, |
typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedXmm>( |
+ InstX86Base<Machine>::Traits::getEncodedXmm, |
+ InstX86Base<Machine>::Traits::getEncodedXmm>( |
Func, Ty, Dest, this->getSrc(1), this->getSrc(2), Emitter); |
} |
@@ -2972,7 +2950,7 @@ void InstX86Pop<Machine>::emitIAS(const Cfg *Func) const { |
typename InstX86Base<Machine>::Traits::Assembler *Asm = |
Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
if (this->getDest()->hasReg()) { |
- Asm->popl(InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR( |
+ Asm->popl(InstX86Base<Machine>::Traits::getEncodedGPR( |
this->getDest()->getRegNum())); |
} else { |
Asm->popl( |
@@ -3024,7 +3002,7 @@ void InstX86Push<Machine>::emit(const Cfg *Func) const { |
Ostream &Str = Func->getContext()->getStrEmit(); |
assert(this->getSrcSize() == 1); |
// Push is currently only used for saving GPRs. |
- const auto Var = llvm::cast<Variable>(this->getSrc(0)); |
+ const auto *Var = llvm::cast<Variable>(this->getSrc(0)); |
assert(Var->hasReg()); |
Str << "\tpush\t"; |
Var->emit(Func); |
@@ -3034,12 +3012,11 @@ template <class Machine> |
void InstX86Push<Machine>::emitIAS(const Cfg *Func) const { |
assert(this->getSrcSize() == 1); |
// Push is currently only used for saving GPRs. |
- const auto Var = llvm::cast<Variable>(this->getSrc(0)); |
+ const auto *Var = llvm::cast<Variable>(this->getSrc(0)); |
assert(Var->hasReg()); |
typename InstX86Base<Machine>::Traits::Assembler *Asm = |
Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
- Asm->pushl(InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR( |
- Var->getRegNum())); |
+ Asm->pushl(InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum())); |
} |
template <class Machine> |
@@ -3138,9 +3115,8 @@ void InstX86Setcc<Machine>::emitIAS(const Cfg *Func) const { |
typename InstX86Base<Machine>::Traits::Assembler *Asm = |
Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); |
if (this->getDest()->hasReg()) |
- Asm->setcc(Condition, |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedByteReg( |
- this->getDest()->getRegNum())); |
+ Asm->setcc(Condition, InstX86Base<Machine>::Traits::getEncodedByteReg( |
+ this->getDest()->getRegNum())); |
else |
Asm->setcc( |
Condition, |
@@ -3188,11 +3164,10 @@ void InstX86Xadd<Machine>::emitIAS(const Cfg *Func) const { |
InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment); |
const typename InstX86Base<Machine>::Traits::Address Addr = |
Mem->toAsmAddress(Asm); |
- const auto VarReg = llvm::cast<Variable>(this->getSrc(1)); |
+ const auto *VarReg = llvm::cast<Variable>(this->getSrc(1)); |
assert(VarReg->hasReg()); |
const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg = |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR( |
- VarReg->getRegNum()); |
+ InstX86Base<Machine>::Traits::getEncodedGPR(VarReg->getRegNum()); |
Asm->xadd(Ty, Addr, Reg, this->Locked); |
} |
@@ -3229,14 +3204,12 @@ void InstX86Xchg<Machine>::emitIAS(const Cfg *Func) const { |
const auto *VarReg1 = llvm::cast<Variable>(this->getSrc(1)); |
assert(VarReg1->hasReg()); |
const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg1 = |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR( |
- VarReg1->getRegNum()); |
+ InstX86Base<Machine>::Traits::getEncodedGPR(VarReg1->getRegNum()); |
if (const auto *VarReg0 = llvm::dyn_cast<Variable>(this->getSrc(0))) { |
assert(VarReg0->hasReg()); |
const typename InstX86Base<Machine>::Traits::RegisterSet::GPRRegister Reg0 = |
- InstX86Base<Machine>::Traits::RegisterSet::getEncodedGPR( |
- VarReg0->getRegNum()); |
+ InstX86Base<Machine>::Traits::getEncodedGPR(VarReg0->getRegNum()); |
Asm->xchg(Ty, Reg0, Reg1); |
return; |
} |