Add a getTarget method that returns the x86 target lowering

Remove a bit of complex repeated template naming.

BUG=
R=jpp@chromium.org, stichnot@chromium.org

Review URL: https://codereview.chromium.org/1438933002 .
diff --git a/src/IceInstX86Base.h b/src/IceInstX86Base.h
index d18c746..c19ec9d 100644
--- a/src/IceInstX86Base.h
+++ b/src/IceInstX86Base.h
@@ -35,6 +35,7 @@
 
 public:
   using Traits = MachineTraits<Machine>;
+  using X86TargetLowering = typename Traits::TargetLowering;
 
   enum InstKindX86 {
     k__Start = Inst::Target,
@@ -156,6 +157,10 @@
                   const Operand *Src,
                   const typename Traits::Assembler::GPREmitterShiftOp &Emitter);
 
+  static X86TargetLowering *getTarget(const Cfg* Func) {
+    return static_cast<X86TargetLowering *>(Func->getTarget());
+  }
+
 protected:
   InstX86Base<Machine>(Cfg *Func, InstKindX86 Kind, SizeT Maxsrcs,
                        Variable *Dest)
diff --git a/src/IceInstX86BaseImpl.h b/src/IceInstX86BaseImpl.h
index 2c3bfe2..de9e566 100644
--- a/src/IceInstX86BaseImpl.h
+++ b/src/IceInstX86BaseImpl.h
@@ -570,7 +570,7 @@
   assert(this->getSrcSize() == 1);
   Str << "\tcall\t";
   Operand *CallTarget = getCallTarget();
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   if (const auto *CI = llvm::dyn_cast<ConstantInteger32>(CallTarget)) {
     // Emit without a leading '$'.
     Str << CI->getValue();
@@ -589,15 +589,12 @@
   typename InstX86Base<Machine>::Traits::Assembler *Asm =
       Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
   Operand *CallTarget = getCallTarget();
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   if (const auto *Var = llvm::dyn_cast<Variable>(CallTarget)) {
     if (Var->hasReg()) {
       Asm->call(InstX86Base<Machine>::Traits::getEncodedGPR(Var->getRegNum()));
     } else {
-      Asm->call(
-          static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-              Target)
-              ->stackVarToAsmOperand(Var));
+      Asm->call(Target->stackVarToAsmOperand(Var));
     }
   } else if (const auto *Mem = llvm::dyn_cast<
                  typename InstX86Base<Machine>::Traits::X86OperandMem>(
@@ -654,7 +651,7 @@
 void emitIASOpTyGPR(const Cfg *Func, Type Ty, const Operand *Op,
                     const typename InstX86Base<
                         Machine>::Traits::Assembler::GPREmitterOneOp &Emitter) {
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   typename InstX86Base<Machine>::Traits::Assembler *Asm =
       Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
   if (const auto *Var = llvm::dyn_cast<Variable>(Op)) {
@@ -665,9 +662,7 @@
       (Asm->*(Emitter.Reg))(Ty, VarReg);
     } else {
       typename InstX86Base<Machine>::Traits::Address StackAddr(
-          static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-              Target)
-              ->stackVarToAsmOperand(Var));
+          Target->stackVarToAsmOperand(Var));
       (Asm->*(Emitter.Addr))(Ty, StackAddr);
     }
   } else if (const auto *Mem = llvm::dyn_cast<
@@ -684,7 +679,7 @@
     const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src,
     const typename InstX86Base<Machine>::Traits::Assembler::GPREmitterRegOp
         &Emitter) {
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   typename InstX86Base<Machine>::Traits::Assembler *Asm =
       Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
   assert(Var->hasReg());
@@ -703,9 +698,7 @@
       (Asm->*(Emitter.GPRGPR))(Ty, VarReg, SrcReg);
     } else {
       typename InstX86Base<Machine>::Traits::Address SrcStackAddr =
-          static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-              Target)
-              ->stackVarToAsmOperand(SrcVar);
+          Target->stackVarToAsmOperand(SrcVar);
       (Asm->*(Emitter.GPRAddr))(Ty, VarReg, SrcStackAddr);
     }
   } else if (const auto *Mem = llvm::dyn_cast<
@@ -757,13 +750,11 @@
     const Cfg *Func, Type Ty, const Operand *Op0, const Operand *Op1,
     const typename InstX86Base<Machine>::Traits::Assembler::GPREmitterAddrOp
         &Emitter) {
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   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 *>(
-            Target)
-            ->stackVarToAsmOperand(Op0Var));
+        Target->stackVarToAsmOperand(Op0Var));
     emitIASAddrOpTyGPR<Machine>(Func, Ty, StackAddr, Op1, Emitter);
   } else if (const auto *Op0Mem = llvm::dyn_cast<
                  typename InstX86Base<Machine>::Traits::X86OperandMem>(Op0)) {
@@ -841,7 +832,7 @@
     const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src,
     const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterShiftOp
         &Emitter) {
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   typename InstX86Base<Machine>::Traits::Assembler *Asm =
       Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
   assert(Var->hasReg());
@@ -854,9 +845,7 @@
       (Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg);
     } else {
       typename InstX86Base<Machine>::Traits::Address SrcStackAddr =
-          static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-              Target)
-              ->stackVarToAsmOperand(SrcVar);
+          Target->stackVarToAsmOperand(SrcVar);
       (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr);
     }
   } else if (const auto *Mem = llvm::dyn_cast<
@@ -876,7 +865,7 @@
     const Cfg *Func, Type Ty, const Variable *Var, const Operand *Src,
     const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp
         &Emitter) {
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   typename InstX86Base<Machine>::Traits::Assembler *Asm =
       Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
   assert(Var->hasReg());
@@ -889,9 +878,7 @@
       (Asm->*(Emitter.XmmXmm))(Ty, VarReg, SrcReg);
     } else {
       typename InstX86Base<Machine>::Traits::Address SrcStackAddr =
-          static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-              Target)
-              ->stackVarToAsmOperand(SrcVar);
+          Target->stackVarToAsmOperand(SrcVar);
       (Asm->*(Emitter.XmmAddr))(Ty, VarReg, SrcStackAddr);
     }
   } else if (const auto *Mem = llvm::dyn_cast<
@@ -914,7 +901,7 @@
                       Type SrcTy, const Operand *Src,
                       const typename InstX86Base<Machine>::Traits::Assembler::
                           template CastEmitterRegOp<DReg_t, SReg_t> &Emitter) {
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   typename InstX86Base<Machine>::Traits::Assembler *Asm =
       Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
   assert(Dest->hasReg());
@@ -925,9 +912,7 @@
       (Asm->*(Emitter.RegReg))(DestTy, DestReg, SrcTy, SrcReg);
     } else {
       typename InstX86Base<Machine>::Traits::Address SrcStackAddr =
-          static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-              Target)
-              ->stackVarToAsmOperand(SrcVar);
+          Target->stackVarToAsmOperand(SrcVar);
       (Asm->*(Emitter.RegAddr))(DestTy, DestReg, SrcTy, SrcStackAddr);
     }
   } else if (const auto *Mem = llvm::dyn_cast<
@@ -947,7 +932,7 @@
     const Operand *Src1,
     const typename InstX86Base<Machine>::Traits::Assembler::
         template ThreeOpImmEmitter<DReg_t, SReg_t> Emitter) {
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   typename InstX86Base<Machine>::Traits::Assembler *Asm =
       Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
   // This only handles Dest being a register, and Src1 being an immediate.
@@ -960,9 +945,7 @@
       (Asm->*(Emitter.RegRegImm))(DispatchTy, DestReg, SrcReg, Imm);
     } else {
       typename InstX86Base<Machine>::Traits::Address SrcStackAddr =
-          static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-              Target)
-              ->stackVarToAsmOperand(SrcVar);
+          Target->stackVarToAsmOperand(SrcVar);
       (Asm->*(Emitter.RegAddrImm))(DispatchTy, DestReg, SrcStackAddr, Imm);
     }
   } else if (const auto *Mem = llvm::dyn_cast<
@@ -980,7 +963,7 @@
     const Cfg *Func, const Variable *Dest, const Operand *Src,
     const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterMovOps
         Emitter) {
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   typename InstX86Base<Machine>::Traits::Assembler *Asm =
       Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
   if (Dest->hasReg()) {
@@ -993,9 +976,7 @@
             InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()));
       } else {
         typename InstX86Base<Machine>::Traits::Address StackAddr(
-            static_cast<
-                typename InstX86Base<Machine>::Traits::TargetLowering *>(Target)
-                ->stackVarToAsmOperand(SrcVar));
+            Target->stackVarToAsmOperand(SrcVar));
         (Asm->*(Emitter.XmmAddr))(DestReg, StackAddr);
       }
     } else if (const auto *SrcMem = llvm::dyn_cast<
@@ -1008,9 +989,7 @@
     }
   } else {
     typename InstX86Base<Machine>::Traits::Address StackAddr(
-        static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-            Target)
-            ->stackVarToAsmOperand(Dest));
+        Target->stackVarToAsmOperand(Dest));
     // Src must be a register in this case.
     const auto *SrcVar = llvm::cast<Variable>(Src);
     assert(SrcVar->hasReg());
@@ -1066,12 +1045,10 @@
   char buf[30];
   bool TypesAreValid = this->getDest()->getType() == IceType_v4i32 ||
                        this->getDest()->getType() == IceType_v8i16;
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   bool InstructionSetIsValid =
       this->getDest()->getType() == IceType_v8i16 ||
-      static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-          Target)
-              ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1;
+      Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1;
   (void)TypesAreValid;
   (void)InstructionSetIsValid;
   assert(TypesAreValid);
@@ -1087,12 +1064,10 @@
 void InstX86Pmull<Machine>::emitIAS(const Cfg *Func) const {
   Type Ty = this->getDest()->getType();
   bool TypesAreValid = Ty == IceType_v4i32 || Ty == IceType_v8i16;
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   bool InstructionSetIsValid =
       Ty == IceType_v8i16 ||
-      static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-          Target)
-              ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1;
+      Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1;
   (void)TypesAreValid;
   (void)InstructionSetIsValid;
   assert(TypesAreValid);
@@ -1236,21 +1211,15 @@
 void InstX86Blendvps<Machine>::emit(const Cfg *Func) const {
   if (!BuildDefs::dump())
     return;
-  TargetLowering *Target = Func->getTarget();
-  (void)Target;
-  assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-             Target)
-             ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
+  assert(Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
   emitVariableBlendInst<Machine>(this->Opcode, this, Func);
 }
 
 template <class Machine>
 void InstX86Blendvps<Machine>::emitIAS(const Cfg *Func) const {
-  TargetLowering *Target = Func->getTarget();
-  (void)Target;
-  assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-             Target)
-             ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
+  assert(Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
   static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp
       Emitter = {&InstX86Base<Machine>::Traits::Assembler::blendvps,
                  &InstX86Base<Machine>::Traits::Assembler::blendvps};
@@ -1261,21 +1230,15 @@
 void InstX86Pblendvb<Machine>::emit(const Cfg *Func) const {
   if (!BuildDefs::dump())
     return;
-  TargetLowering *Target = Func->getTarget();
-  (void)Target;
-  assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-             Target)
-             ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
+  assert(Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
   emitVariableBlendInst<Machine>(this->Opcode, this, Func);
 }
 
 template <class Machine>
 void InstX86Pblendvb<Machine>::emitIAS(const Cfg *Func) const {
-  TargetLowering *Target = Func->getTarget();
-  (void)Target;
-  assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-             Target)
-             ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
+  assert(Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
   static const typename InstX86Base<Machine>::Traits::Assembler::XmmEmitterRegOp
       Emitter = {&InstX86Base<Machine>::Traits::Assembler::pblendvb,
                  &InstX86Base<Machine>::Traits::Assembler::pblendvb};
@@ -1379,11 +1342,8 @@
 template <class Machine>
 void InstX86Insertps<Machine>::emitIAS(const Cfg *Func) const {
   assert(this->getSrcSize() == 3);
-  TargetLowering *Target = Func->getTarget();
-  (void)Target;
-  assert(static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-             Target)
-             ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
+  assert(Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
   const Variable *Dest = this->getDest();
   assert(Dest == this->getSrc(0));
   Type Ty = Dest->getType();
@@ -1629,7 +1589,7 @@
          (InstX86Base<Machine>::Traits::Is64Bit));
   typename InstX86Base<Machine>::Traits::Assembler *Asm =
       Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   if (const auto *SrcVar = llvm::dyn_cast<Variable>(Src)) {
     if (SrcVar->hasReg()) {
       Asm->cmov(
@@ -1640,9 +1600,7 @@
       Asm->cmov(
           SrcTy, Condition, InstX86Base<Machine>::Traits::getEncodedGPR(
                                 this->getDest()->getRegNum()),
-          static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-              Target)
-              ->stackVarToAsmOperand(SrcVar));
+          Target->stackVarToAsmOperand(SrcVar));
     }
   } else if (const auto *Mem = llvm::dyn_cast<
                  typename InstX86Base<Machine>::Traits::X86OperandMem>(Src)) {
@@ -1696,7 +1654,7 @@
   // Assuming there isn't any load folding for cmpps, and vector constants are
   // not allowed in PNaCl.
   assert(llvm::isa<Variable>(this->getSrc(1)));
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   const auto *SrcVar = llvm::cast<Variable>(this->getSrc(1));
   if (SrcVar->hasReg()) {
     Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm(
@@ -1705,9 +1663,7 @@
                Condition);
   } else {
     typename InstX86Base<Machine>::Traits::Address SrcStackAddr =
-        static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-            Target)
-            ->stackVarToAsmOperand(SrcVar);
+        Target->stackVarToAsmOperand(SrcVar);
     Asm->cmpps(InstX86Base<Machine>::Traits::getEncodedXmm(
                    this->getDest()->getRegNum()),
                SrcStackAddr, Condition);
@@ -1750,7 +1706,7 @@
   typename InstX86Base<Machine>::Traits::Assembler *Asm =
       Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
   Type Ty = this->getSrc(0)->getType();
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   const auto Mem =
       llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>(
           this->getSrc(0));
@@ -1800,7 +1756,7 @@
           this->getSrc(0));
   assert(Mem->getSegmentRegister() ==
          InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   const typename InstX86Base<Machine>::Traits::Address Addr =
       Mem->toAsmAddress(Asm, Target);
   Asm->cmpxchg8b(Addr, this->Locked);
@@ -2142,13 +2098,11 @@
         InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum());
     typename InstX86Base<Machine>::Traits::Assembler *Asm =
         Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
-    TargetLowering *Target = Func->getTarget();
+    auto *Target = InstX86Base<Machine>::getTarget(Func);
     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 *>(
-              Target)
-              ->stackVarToAsmOperand(DestVar));
+          Target->stackVarToAsmOperand(DestVar));
       Asm->movss(DestTy, StackAddr, SrcReg);
     } else {
       const auto DestMem =
@@ -2205,7 +2159,7 @@
   assert(DestMem->getSegmentRegister() ==
          InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
   assert(SrcVar->hasReg());
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   Asm->movups(DestMem->toAsmAddress(Asm, Target),
               InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()));
 }
@@ -2248,7 +2202,7 @@
   assert(DestMem->getSegmentRegister() ==
          InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
   assert(SrcVar->hasReg());
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   Asm->movq(DestMem->toAsmAddress(Asm, Target),
             InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum()));
 }
@@ -2312,8 +2266,7 @@
   // TODO: This assert disallows usages such as copying a floating
   // point value between a vector and a scalar (which movss is used for). Clean
   // this up.
-  TargetLowering *Target = Func->getTarget();
-  (void)Target;
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   assert(Target->typeWidthInBytesOnStack(DestTy) ==
          Target->typeWidthInBytesOnStack(SrcTy));
   const Operand *NewSrc = Src;
@@ -2359,7 +2312,7 @@
   // TODO: This assert disallows usages such as copying a floating
   // point value between a vector and a scalar (which movss is used for). Clean
   // this up.
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   assert(Target->typeWidthInBytesOnStack(this->getDest()->getType()) ==
          Target->typeWidthInBytesOnStack(Src->getType()));
   if (Dest->hasReg()) {
@@ -2394,9 +2347,7 @@
     // Dest must be Stack and Src *could* be a register. Use Src's type to
     // decide on the emitters.
     typename InstX86Base<Machine>::Traits::Address StackAddr(
-        static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-            Target)
-            ->stackVarToAsmOperand(Dest));
+        Target->stackVarToAsmOperand(Dest));
     if (isScalarFloatingType(SrcTy)) {
       // Src must be a register.
       const auto *SrcVar = llvm::cast<Variable>(Src);
@@ -2424,7 +2375,7 @@
   assert(this->getSrcSize() == 1);
   const Variable *Dest = this->getDest();
   const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0));
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   // For insert/extract element (one of Src/Dest is an Xmm vector and the other
   // is an int type).
   if (SrcVar->getType() == IceType_i32 ||
@@ -2443,9 +2394,7 @@
           InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum()));
     } else {
       typename InstX86Base<Machine>::Traits::Address StackAddr(
-          static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-              Target)
-              ->stackVarToAsmOperand(SrcVar));
+          Target->stackVarToAsmOperand(SrcVar));
       Asm->movd(SrcVar->getType(), DestReg, StackAddr);
     }
   } else {
@@ -2465,9 +2414,7 @@
                 SrcReg);
     } else {
       typename InstX86Base<Machine>::Traits::Address StackAddr(
-          static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-              Target)
-              ->stackVarToAsmOperand(Dest));
+          Target->stackVarToAsmOperand(Dest));
       Asm->movd(Dest->getType(), StackAddr, SrcReg);
     }
   }
@@ -2629,7 +2576,7 @@
       Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
   assert(this->getSrcSize() == 1);
   const Operand *Src = this->getSrc(0);
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   Type Ty = Src->getType();
   if (const auto *Var = llvm::dyn_cast<Variable>(Src)) {
     if (Var->hasReg()) {
@@ -2651,9 +2598,7 @@
                Width);
     } else {
       typename InstX86Base<Machine>::Traits::Address StackAddr(
-          static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-              Target)
-              ->stackVarToAsmOperand(Var));
+          Target->stackVarToAsmOperand(Var));
       Asm->fld(Ty, StackAddr);
     }
   } else if (const auto *Mem = llvm::dyn_cast<
@@ -2723,13 +2668,11 @@
     Asm->fstp(InstX86Base<Machine>::Traits::RegisterSet::getEncodedSTReg(0));
     return;
   }
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   Type Ty = Dest->getType();
   if (!Dest->hasReg()) {
     typename InstX86Base<Machine>::Traits::Address StackAddr(
-        static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-            Target)
-            ->stackVarToAsmOperand(Dest));
+        Target->stackVarToAsmOperand(Dest));
     Asm->fstp(Ty, StackAddr);
   } else {
     // Dest is a physical (xmm) register, so st(0) needs to go through memory.
@@ -2791,13 +2734,10 @@
   Ostream &Str = Func->getContext()->getStrEmit();
   assert(this->getSrcSize() == 2);
   // pextrb and pextrd are SSE4.1 instructions.
-  TargetLowering *Target = Func->getTarget();
-  (void)Target;
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   assert(this->getSrc(0)->getType() == IceType_v8i16 ||
          this->getSrc(0)->getType() == IceType_v8i1 ||
-         static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-             Target)
-                 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
+         Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
   Str << "\t" << this->Opcode
       << InstX86Base<Machine>::Traits::TypeAttributes[this->getSrc(0)
                                                           ->getType()]
@@ -2821,12 +2761,9 @@
   const Variable *Dest = this->getDest();
   Type DispatchTy = InstX86Base<Machine>::Traits::getInVectorElementType(
       this->getSrc(0)->getType());
-  TargetLowering *Target = Func->getTarget();
-  (void)Target;
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   assert(DispatchTy == IceType_i16 ||
-         static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-             Target)
-                 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
+         Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
   // pextrw must take a register dest. There is an SSE4.1 version that takes a
   // memory dest, but we aren't using it. For uniformity, just restrict them
   // all to have a register dest for now.
@@ -2853,13 +2790,10 @@
   Ostream &Str = Func->getContext()->getStrEmit();
   assert(this->getSrcSize() == 3);
   // pinsrb and pinsrd are SSE4.1 instructions.
-  TargetLowering *Target = Func->getTarget();
-  (void)Target;
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   assert(this->getDest()->getType() == IceType_v8i16 ||
          this->getDest()->getType() == IceType_v8i1 ||
-         static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-             Target)
-                 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
+         Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
   Str << "\t" << this->Opcode
       << InstX86Base<
              Machine>::Traits::TypeAttributes[this->getDest()->getType()]
@@ -2891,12 +2825,9 @@
   // pinsrb and pinsrd are SSE4.1 instructions.
   const Operand *Src0 = this->getSrc(1);
   Type DispatchTy = Src0->getType();
-  TargetLowering *Target = Func->getTarget();
-  (void)Target;
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   assert(DispatchTy == IceType_i16 ||
-         static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-             Target)
-                 ->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
+         Target->getInstructionSet() >= InstX86Base<Machine>::Traits::SSE4_1);
   // If src1 is a register, it should always be r32 (this should fall out from
   // the encodings for ByteRegs overlapping the encodings for r32), but we have
   // to make sure the register allocator didn't choose an 8-bit high register
@@ -2983,11 +2914,8 @@
     Asm->popl(InstX86Base<Machine>::Traits::getEncodedGPR(
         this->getDest()->getRegNum()));
   } else {
-    TargetLowering *Target = Func->getTarget();
-    Asm->popl(
-        static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-            Target)
-            ->stackVarToAsmOperand(this->getDest()));
+    auto *Target = InstX86Base<Machine>::getTarget(Func);
+    Asm->popl(Target->stackVarToAsmOperand(this->getDest()));
   }
 }
 
@@ -3005,7 +2933,7 @@
     return;
   Ostream &Str = Func->getContext()->getStrEmit();
   Str << "\tsubl\t$" << Amount << ", %esp";
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   Target->updateStackAdjustment(Amount);
 }
 
@@ -3016,7 +2944,7 @@
   Asm->sub(IceType_i32,
            InstX86Base<Machine>::Traits::RegisterSet::Encoded_Reg_esp,
            Immediate(Amount));
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   Target->updateStackAdjustment(Amount);
 }
 
@@ -3147,16 +3075,12 @@
   assert(this->getSrcSize() == 0);
   typename InstX86Base<Machine>::Traits::Assembler *Asm =
       Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   if (this->getDest()->hasReg())
     Asm->setcc(Condition, InstX86Base<Machine>::Traits::getEncodedByteReg(
                               this->getDest()->getRegNum()));
   else
-    Asm->setcc(
-        Condition,
-        static_cast<typename InstX86Base<Machine>::Traits::TargetLowering *>(
-            Target)
-            ->stackVarToAsmOperand(this->getDest()));
+    Asm->setcc(Condition, Target->stackVarToAsmOperand(this->getDest()));
   return;
 }
 
@@ -3196,7 +3120,7 @@
           this->getSrc(0));
   assert(Mem->getSegmentRegister() ==
          InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   const typename InstX86Base<Machine>::Traits::Address Addr =
       Mem->toAsmAddress(Asm, Target);
   const auto *VarReg = llvm::cast<Variable>(this->getSrc(1));
@@ -3254,7 +3178,7 @@
           this->getSrc(0));
   assert(Mem->getSegmentRegister() ==
          InstX86Base<Machine>::Traits::X86OperandMem::DefaultSegment);
-  TargetLowering *Target = Func->getTarget();
+  auto *Target = InstX86Base<Machine>::getTarget(Func);
   const typename InstX86Base<Machine>::Traits::Address Addr =
       Mem->toAsmAddress(Asm, Target);
   Asm->xchg(Ty, Addr, Reg1);