Chromium Code Reviews| 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 && |
|
John
2015/10/28 12:48:06
I don't know if this will work for X8664, but I'll
Jim Stichnoth
2015/10/28 14:03:55
I think this particular thing ought to work for x8
|
| - 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; |
| } |