119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===-- X86FastISel.cpp - X86 FastISel implementation ---------------------===//
219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//                     The LLVM Compiler Infrastructure
419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source
619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details.
719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file defines the X86-specific support for the FastISel class. Much
1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// of the target-specific code is generated by tablegen in the file
1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// X86GenFastISel.inc, which is #included here.
1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "X86.h"
1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "X86InstrBuilder.h"
1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "X86ISelLowering.h"
1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "X86RegisterInfo.h"
2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "X86Subtarget.h"
2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "X86TargetMachine.h"
2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/CallingConv.h"
2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/DerivedTypes.h"
2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/GlobalVariable.h"
2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/GlobalAlias.h"
2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Instructions.h"
2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/IntrinsicInst.h"
2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Operator.h"
2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/CodeGen/Analysis.h"
3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/CodeGen/FastISel.h"
3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/CodeGen/FunctionLoweringInfo.h"
3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/CodeGen/MachineConstantPool.h"
3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/CodeGen/MachineFrameInfo.h"
3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/CodeGen/MachineRegisterInfo.h"
3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/CallSite.h"
3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/ErrorHandling.h"
3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/GetElementPtrTypeIterator.h"
3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetOptions.h"
3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanusing namespace llvm;
4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace {
4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass X86FastISel : public FastISel {
4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// Subtarget - Keep a pointer to the X86Subtarget around so that we can
4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// make the right decision when generating code for different targets.
4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const X86Subtarget *Subtarget;
4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// StackPtr - Register used as the stack pointer.
4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ///
5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned StackPtr;
5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// X86ScalarSSEf32, X86ScalarSSEf64 - Select between SSE or x87
5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// floating point ops.
5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// When SSE is available, use it for f32 operations.
5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// When SSE2 is available, use it for f64 operations.
5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86ScalarSSEf64;
5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86ScalarSSEf32;
5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanpublic:
6019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  explicit X86FastISel(FunctionLoweringInfo &funcInfo) : FastISel(funcInfo) {
6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Subtarget = &TM.getSubtarget<X86Subtarget>();
6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    StackPtr = Subtarget->is64Bit() ? X86::RSP : X86::ESP;
6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    X86ScalarSSEf64 = Subtarget->hasSSE2() || Subtarget->hasAVX();
6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    X86ScalarSSEf32 = Subtarget->hasSSE1() || Subtarget->hasAVX();
6519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
6619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
6719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  virtual bool TargetSelectInstruction(const Instruction *I);
6819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
6919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// TryToFoldLoad - The specified machine instr operand is a vreg, and that
7019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// vreg is being provided by the specified load instruction.  If possible,
7119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// try to fold the load as an operand to the instruction, returning true if
7219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// possible.
7319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  virtual bool TryToFoldLoad(MachineInstr *MI, unsigned OpNo,
7419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                             const LoadInst *LI);
7519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
7619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "X86GenFastISel.inc"
7719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
7819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanprivate:
7919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86FastEmitCompare(const Value *LHS, const Value *RHS, EVT VT);
8019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
8119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86FastEmitLoad(EVT VT, const X86AddressMode &AM, unsigned &RR);
8219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
8319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86FastEmitStore(EVT VT, const Value *Val, const X86AddressMode &AM);
8419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86FastEmitStore(EVT VT, unsigned Val, const X86AddressMode &AM);
8519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
8619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86FastEmitExtend(ISD::NodeType Opc, EVT DstVT, unsigned Src, EVT SrcVT,
8719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         unsigned &ResultReg);
8819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
8919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86SelectAddress(const Value *V, X86AddressMode &AM);
9019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86SelectCallAddress(const Value *V, X86AddressMode &AM);
9119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
9219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86SelectLoad(const Instruction *I);
9319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
9419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86SelectStore(const Instruction *I);
9519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
9619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86SelectRet(const Instruction *I);
9719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
9819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86SelectCmp(const Instruction *I);
9919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
10019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86SelectZExt(const Instruction *I);
10119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
10219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86SelectBranch(const Instruction *I);
10319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
10419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86SelectShift(const Instruction *I);
10519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
10619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86SelectSelect(const Instruction *I);
10719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
10819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86SelectTrunc(const Instruction *I);
10919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
11019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86SelectFPExt(const Instruction *I);
11119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86SelectFPTrunc(const Instruction *I);
11219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
11319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86VisitIntrinsicCall(const IntrinsicInst &I);
11419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86SelectCall(const Instruction *I);
11519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
11619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool DoSelectCall(const Instruction *I, const char *MemIntName);
11719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
11819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const X86InstrInfo *getInstrInfo() const {
11919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return getTargetMachine()->getInstrInfo();
12019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
12119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const X86TargetMachine *getTargetMachine() const {
12219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return static_cast<const X86TargetMachine *>(&TM);
12319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
12419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
12519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned TargetMaterializeConstant(const Constant *C);
12619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
12719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned TargetMaterializeAlloca(const AllocaInst *C);
12819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
12919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned TargetMaterializeFloatZero(const ConstantFP *CF);
13019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
13119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// isScalarFPTypeInSSEReg - Return true if the specified scalar FP type is
13219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// computed in an SSE register, not on the X87 floating point stack.
13319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool isScalarFPTypeInSSEReg(EVT VT) const {
13419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return (VT == MVT::f64 && X86ScalarSSEf64) || // f64 is when SSE2
13519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      (VT == MVT::f32 && X86ScalarSSEf32);   // f32 is when SSE1
13619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
13719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
13819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool isTypeLegal(Type *Ty, MVT &VT, bool AllowI1 = false);
13919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
14019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool IsMemcpySmall(uint64_t Len);
14119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
14219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool TryEmitSmallMemcpy(X86AddressMode DestAM,
14319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                          X86AddressMode SrcAM, uint64_t Len);
14419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman};
14519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
14619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} // end anonymous namespace.
14719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
14819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::isTypeLegal(Type *Ty, MVT &VT, bool AllowI1) {
14919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EVT evt = TLI.getValueType(Ty, /*HandleUnknown=*/true);
15019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (evt == MVT::Other || !evt.isSimple())
15119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Unhandled type. Halt "fast" selection and bail.
15219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
15319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
15419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  VT = evt.getSimpleVT();
15519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // For now, require SSE/SSE2 for performing floating-point operations,
15619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // since x87 requires additional work.
15719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (VT == MVT::f64 && !X86ScalarSSEf64)
15819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman     return false;
15919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (VT == MVT::f32 && !X86ScalarSSEf32)
16019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman     return false;
16119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Similarly, no f80 support yet.
16219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (VT == MVT::f80)
16319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
16419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // We only handle legal types. For example, on x86-32 the instruction
16519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // selector contains all of the 64-bit instructions from x86-64,
16619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // under the assumption that i64 won't be used if the target doesn't
16719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // support it.
16819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return (AllowI1 && VT == MVT::i1) || TLI.isTypeLegal(VT);
16919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
17019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
17119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "X86GenCallingConv.inc"
17219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
17319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// X86FastEmitLoad - Emit a machine instruction to load a value of type VT.
17419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// The address is either pre-computed, i.e. Ptr, or a GlobalAddress, i.e. GV.
17519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// Return true and the result register by reference if it is possible.
17619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::X86FastEmitLoad(EVT VT, const X86AddressMode &AM,
17719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                  unsigned &ResultReg) {
17819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Get opcode and regclass of the output for the given load instruction.
17919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Opc = 0;
18019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const TargetRegisterClass *RC = NULL;
18119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  switch (VT.getSimpleVT().SimpleTy) {
18219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  default: return false;
18319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i1:
18419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i8:
18519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Opc = X86::MOV8rm;
18619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    RC  = X86::GR8RegisterClass;
18719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
18819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i16:
18919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Opc = X86::MOV16rm;
19019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    RC  = X86::GR16RegisterClass;
19119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
19219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i32:
19319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Opc = X86::MOV32rm;
19419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    RC  = X86::GR32RegisterClass;
19519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
19619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i64:
19719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Must be in x86-64 mode.
19819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Opc = X86::MOV64rm;
19919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    RC  = X86::GR64RegisterClass;
20019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
20119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::f32:
20219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (X86ScalarSSEf32) {
20319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Opc = Subtarget->hasAVX() ? X86::VMOVSSrm : X86::MOVSSrm;
20419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      RC  = X86::FR32RegisterClass;
20519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    } else {
20619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Opc = X86::LD_Fp32m;
20719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      RC  = X86::RFP32RegisterClass;
20819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
20919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
21019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::f64:
21119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (X86ScalarSSEf64) {
21219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Opc = Subtarget->hasAVX() ? X86::VMOVSDrm : X86::MOVSDrm;
21319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      RC  = X86::FR64RegisterClass;
21419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    } else {
21519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Opc = X86::LD_Fp64m;
21619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      RC  = X86::RFP64RegisterClass;
21719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
21819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
21919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::f80:
22019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // No f80 support yet.
22119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
22219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
22319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
22419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ResultReg = createResultReg(RC);
22519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  addFullAddress(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt,
22619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         DL, TII.get(Opc), ResultReg), AM);
22719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return true;
22819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
22919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
23019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// X86FastEmitStore - Emit a machine instruction to store a value Val of
23119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// type VT. The address is either pre-computed, consisted of a base ptr, Ptr
23219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// and a displacement offset, or a GlobalAddress,
23319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// i.e. V. Return true if it is possible.
23419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool
23519bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanX86FastISel::X86FastEmitStore(EVT VT, unsigned Val, const X86AddressMode &AM) {
23619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Get opcode and regclass of the output for the given store instruction.
23719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Opc = 0;
23819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  switch (VT.getSimpleVT().SimpleTy) {
23919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::f80: // No f80 support yet.
24019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  default: return false;
24119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i1: {
24219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Mask out all but lowest bit.
24319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned AndResult = createResultReg(X86::GR8RegisterClass);
24419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
24519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman            TII.get(X86::AND8ri), AndResult).addReg(Val).addImm(1);
24619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Val = AndResult;
24719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
24819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // FALLTHROUGH, handling i1 as i8.
24919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i8:  Opc = X86::MOV8mr;  break;
25019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i16: Opc = X86::MOV16mr; break;
25119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i32: Opc = X86::MOV32mr; break;
25219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i64: Opc = X86::MOV64mr; break; // Must be in x86-64 mode.
25319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::f32:
25419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Opc = X86ScalarSSEf32 ?
25519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          (Subtarget->hasAVX() ? X86::VMOVSSmr : X86::MOVSSmr) : X86::ST_Fp32m;
25619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
25719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::f64:
25819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Opc = X86ScalarSSEf64 ?
25919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          (Subtarget->hasAVX() ? X86::VMOVSDmr : X86::MOVSDmr) : X86::ST_Fp64m;
26019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
26119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
26219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
26319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  addFullAddress(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt,
26419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         DL, TII.get(Opc)), AM).addReg(Val);
26519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return true;
26619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
26719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
26819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::X86FastEmitStore(EVT VT, const Value *Val,
26919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                   const X86AddressMode &AM) {
27019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Handle 'null' like i32/i64 0.
27119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (isa<ConstantPointerNull>(Val))
27219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Val = Constant::getNullValue(TD.getIntPtrType(Val->getContext()));
27319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
27419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // If this is a store of a simple constant, fold the constant into the store.
27519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (const ConstantInt *CI = dyn_cast<ConstantInt>(Val)) {
27619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned Opc = 0;
27719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    bool Signed = true;
27819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    switch (VT.getSimpleVT().SimpleTy) {
27919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    default: break;
28019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case MVT::i1:  Signed = false;     // FALLTHROUGH to handle as i8.
28119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case MVT::i8:  Opc = X86::MOV8mi;  break;
28219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case MVT::i16: Opc = X86::MOV16mi; break;
28319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case MVT::i32: Opc = X86::MOV32mi; break;
28419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case MVT::i64:
28519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // Must be a 32-bit sign extended value.
28619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if ((int)CI->getSExtValue() == CI->getSExtValue())
28719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        Opc = X86::MOV64mi32;
28819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      break;
28919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
29019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
29119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Opc) {
29219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      addFullAddress(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt,
29319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                             DL, TII.get(Opc)), AM)
29419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                             .addImm(Signed ? (uint64_t) CI->getSExtValue() :
29519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                              CI->getZExtValue());
29619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return true;
29719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
29819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
29919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
30019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned ValReg = getRegForValue(Val);
30119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (ValReg == 0)
30219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
30319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
30419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return X86FastEmitStore(VT, ValReg, AM);
30519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
30619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
30719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// X86FastEmitExtend - Emit a machine instruction to extend a value Src of
30819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// type SrcVT to type DstVT using the specified extension opcode Opc (e.g.
30919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// ISD::SIGN_EXTEND).
31019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::X86FastEmitExtend(ISD::NodeType Opc, EVT DstVT,
31119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                    unsigned Src, EVT SrcVT,
31219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                    unsigned &ResultReg) {
31319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned RR = FastEmit_r(SrcVT.getSimpleVT(), DstVT.getSimpleVT(), Opc,
31419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           Src, /*TODO: Kill=*/false);
31519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
31619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (RR != 0) {
31719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    ResultReg = RR;
31819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return true;
31919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else
32019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
32119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
32219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
32319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// X86SelectAddress - Attempt to fill in an address from the given value.
32419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman///
32519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::X86SelectAddress(const Value *V, X86AddressMode &AM) {
32619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const User *U = NULL;
32719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Opcode = Instruction::UserOp1;
32819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (const Instruction *I = dyn_cast<Instruction>(V)) {
32919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Don't walk into other basic blocks; it's possible we haven't
33019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // visited them yet, so the instructions may not yet be assigned
33119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // virtual registers.
33219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (FuncInfo.StaticAllocaMap.count(static_cast<const AllocaInst *>(V)) ||
33319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        FuncInfo.MBBMap[I->getParent()] == FuncInfo.MBB) {
33419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Opcode = I->getOpcode();
33519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      U = I;
33619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
33719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else if (const ConstantExpr *C = dyn_cast<ConstantExpr>(V)) {
33819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Opcode = C->getOpcode();
33919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    U = C;
34019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
34119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
34219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (PointerType *Ty = dyn_cast<PointerType>(V->getType()))
34319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Ty->getAddressSpace() > 255)
34419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // Fast instruction selection doesn't support the special
34519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // address spaces.
34619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
34719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
34819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  switch (Opcode) {
34919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  default: break;
35019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::BitCast:
35119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Look past bitcasts.
35219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return X86SelectAddress(U->getOperand(0), AM);
35319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
35419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::IntToPtr:
35519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Look past no-op inttoptrs.
35619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (TLI.getValueType(U->getOperand(0)->getType()) == TLI.getPointerTy())
35719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return X86SelectAddress(U->getOperand(0), AM);
35819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
35919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
36019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::PtrToInt:
36119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Look past no-op ptrtoints.
36219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (TLI.getValueType(U->getType()) == TLI.getPointerTy())
36319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return X86SelectAddress(U->getOperand(0), AM);
36419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
36519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
36619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::Alloca: {
36719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Do static allocas.
36819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    const AllocaInst *A = cast<AllocaInst>(V);
36919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    DenseMap<const AllocaInst*, int>::iterator SI =
37019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      FuncInfo.StaticAllocaMap.find(A);
37119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (SI != FuncInfo.StaticAllocaMap.end()) {
37219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      AM.BaseType = X86AddressMode::FrameIndexBase;
37319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      AM.Base.FrameIndex = SI->second;
37419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return true;
37519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
37619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
37719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
37819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
37919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::Add: {
38019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Adds of constants are common and easy enough.
38119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (const ConstantInt *CI = dyn_cast<ConstantInt>(U->getOperand(1))) {
38219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      uint64_t Disp = (int32_t)AM.Disp + (uint64_t)CI->getSExtValue();
38319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // They have to fit in the 32-bit signed displacement field though.
38419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (isInt<32>(Disp)) {
38519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        AM.Disp = (uint32_t)Disp;
38619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        return X86SelectAddress(U->getOperand(0), AM);
38719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
38819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
38919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
39019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
39119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
39219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::GetElementPtr: {
39319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    X86AddressMode SavedAM = AM;
39419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
39519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Pattern-match simple GEPs.
39619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    uint64_t Disp = (int32_t)AM.Disp;
39719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned IndexReg = AM.IndexReg;
39819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned Scale = AM.Scale;
39919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    gep_type_iterator GTI = gep_type_begin(U);
40019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Iterate through the indices, folding what we can. Constants can be
40119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // folded, and one dynamic index can be handled, if the scale is supported.
40219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    for (User::const_op_iterator i = U->op_begin() + 1, e = U->op_end();
40319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman         i != e; ++i, ++GTI) {
40419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      const Value *Op = *i;
40519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (StructType *STy = dyn_cast<StructType>(*GTI)) {
40619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        const StructLayout *SL = TD.getStructLayout(STy);
40719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        Disp += SL->getElementOffset(cast<ConstantInt>(Op)->getZExtValue());
40819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        continue;
40919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
41019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
41119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // A array/variable index is always of the form i*S where S is the
41219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // constant scale size.  See if we can push the scale into immediates.
41319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      uint64_t S = TD.getTypeAllocSize(GTI.getIndexedType());
41419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      for (;;) {
41519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        if (const ConstantInt *CI = dyn_cast<ConstantInt>(Op)) {
41619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          // Constant-offset addressing.
41719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          Disp += CI->getSExtValue() * S;
41819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          break;
41919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        }
42019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        if (isa<AddOperator>(Op) &&
42119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman            (!isa<Instruction>(Op) ||
42219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman             FuncInfo.MBBMap[cast<Instruction>(Op)->getParent()]
42319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman               == FuncInfo.MBB) &&
42419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman            isa<ConstantInt>(cast<AddOperator>(Op)->getOperand(1))) {
42519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          // An add (in the same block) with a constant operand. Fold the
42619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          // constant.
42719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          ConstantInt *CI =
42819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman            cast<ConstantInt>(cast<AddOperator>(Op)->getOperand(1));
42919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          Disp += CI->getSExtValue() * S;
43019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          // Iterate on the other operand.
43119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          Op = cast<AddOperator>(Op)->getOperand(0);
43219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          continue;
43319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        }
43419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        if (IndexReg == 0 &&
43519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman            (!AM.GV || !Subtarget->isPICStyleRIPRel()) &&
43619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman            (S == 1 || S == 2 || S == 4 || S == 8)) {
43719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          // Scaled-index addressing.
43819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          Scale = S;
43919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          IndexReg = getRegForGEPIndex(Op).first;
44019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          if (IndexReg == 0)
44119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman            return false;
44219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          break;
44319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        }
44419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        // Unsupported.
44519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        goto unsupported_gep;
44619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
44719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
44819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Check for displacement overflow.
44919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (!isInt<32>(Disp))
45019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      break;
45119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Ok, the GEP indices were covered by constant-offset and scaled-index
45219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // addressing. Update the address state and move on to examining the base.
45319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    AM.IndexReg = IndexReg;
45419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    AM.Scale = Scale;
45519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    AM.Disp = (uint32_t)Disp;
45619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (X86SelectAddress(U->getOperand(0), AM))
45719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return true;
45819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
45919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // If we couldn't merge the gep value into this addr mode, revert back to
46019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // our address and just match the value instead of completely failing.
46119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    AM = SavedAM;
46219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
46319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsupported_gep:
46419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Ok, the GEP indices weren't all covered.
46519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
46619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
46719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
46819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
46919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Handle constant address.
47019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (const GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
47119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Can't handle alternate code models yet.
47219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (TM.getCodeModel() != CodeModel::Small)
47319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
47419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
47519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Can't handle TLS yet.
47619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV))
47719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (GVar->isThreadLocal())
47819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        return false;
47919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
48019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Can't handle TLS yet, part 2 (this is slightly crazy, but this is how
48119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // it works...).
48219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(GV))
48319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (const GlobalVariable *GVar =
48419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman            dyn_cast_or_null<GlobalVariable>(GA->resolveAliasedGlobal(false)))
48519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        if (GVar->isThreadLocal())
48619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          return false;
48719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
48819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // RIP-relative addresses can't have additional register operands, so if
48919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // we've already folded stuff into the addressing mode, just force the
49019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // global value into its own register, which we can use as the basereg.
49119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (!Subtarget->isPICStyleRIPRel() ||
49219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        (AM.Base.Reg == 0 && AM.IndexReg == 0)) {
49319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // Okay, we've committed to selecting this global. Set up the address.
49419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      AM.GV = GV;
49519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
49619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // Allow the subtarget to classify the global.
49719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      unsigned char GVFlags = Subtarget->ClassifyGlobalReference(GV, TM);
49819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
49919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // If this reference is relative to the pic base, set it now.
50019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (isGlobalRelativeToPICBase(GVFlags)) {
50119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        // FIXME: How do we know Base.Reg is free??
50219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        AM.Base.Reg = getInstrInfo()->getGlobalBaseReg(FuncInfo.MF);
50319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
50419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
50519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // Unless the ABI requires an extra load, return a direct reference to
50619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // the global.
50719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (!isGlobalStubReference(GVFlags)) {
50819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        if (Subtarget->isPICStyleRIPRel()) {
50919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          // Use rip-relative addressing if we can.  Above we verified that the
51019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          // base and index registers are unused.
51119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          assert(AM.Base.Reg == 0 && AM.IndexReg == 0);
51219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          AM.Base.Reg = X86::RIP;
51319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        }
51419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        AM.GVOpFlags = GVFlags;
51519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        return true;
51619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
51719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
51819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // Ok, we need to do a load from a stub.  If we've already loaded from
51919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // this stub, reuse the loaded pointer, otherwise emit the load now.
52019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      DenseMap<const Value*, unsigned>::iterator I = LocalValueMap.find(V);
52119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      unsigned LoadReg;
52219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (I != LocalValueMap.end() && I->second != 0) {
52319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        LoadReg = I->second;
52419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      } else {
52519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        // Issue load from stub.
52619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        unsigned Opc = 0;
52719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        const TargetRegisterClass *RC = NULL;
52819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        X86AddressMode StubAM;
52919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        StubAM.Base.Reg = AM.Base.Reg;
53019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        StubAM.GV = GV;
53119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        StubAM.GVOpFlags = GVFlags;
53219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
53319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        // Prepare for inserting code in the local-value area.
53419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        SavePoint SaveInsertPt = enterLocalValueArea();
53519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
53619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        if (TLI.getPointerTy() == MVT::i64) {
53719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          Opc = X86::MOV64rm;
53819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          RC  = X86::GR64RegisterClass;
53919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
54019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          if (Subtarget->isPICStyleRIPRel())
54119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman            StubAM.Base.Reg = X86::RIP;
54219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        } else {
54319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          Opc = X86::MOV32rm;
54419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          RC  = X86::GR32RegisterClass;
54519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        }
54619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
54719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        LoadReg = createResultReg(RC);
54819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        MachineInstrBuilder LoadMI =
54919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(Opc), LoadReg);
55019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        addFullAddress(LoadMI, StubAM);
55119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
55219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        // Ok, back to normal mode.
55319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        leaveLocalValueArea(SaveInsertPt);
55419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
55519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        // Prevent loading GV stub multiple times in same MBB.
55619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        LocalValueMap[V] = LoadReg;
55719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
55819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
55919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // Now construct the final address. Note that the Disp, Scale,
56019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // and Index values may already be set here.
56119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      AM.Base.Reg = LoadReg;
56219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      AM.GV = 0;
56319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return true;
56419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
56519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
56619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
56719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // If all else fails, try to materialize the value in a register.
56819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!AM.GV || !Subtarget->isPICStyleRIPRel()) {
56919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (AM.Base.Reg == 0) {
57019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      AM.Base.Reg = getRegForValue(V);
57119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return AM.Base.Reg != 0;
57219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
57319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (AM.IndexReg == 0) {
57419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      assert(AM.Scale == 1 && "Scale with no index!");
57519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      AM.IndexReg = getRegForValue(V);
57619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return AM.IndexReg != 0;
57719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
57819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
57919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
58019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return false;
58119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
58219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
58319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// X86SelectCallAddress - Attempt to fill in an address from the given value.
58419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman///
58519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::X86SelectCallAddress(const Value *V, X86AddressMode &AM) {
58619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const User *U = NULL;
58719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Opcode = Instruction::UserOp1;
58819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (const Instruction *I = dyn_cast<Instruction>(V)) {
58919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Opcode = I->getOpcode();
59019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    U = I;
59119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else if (const ConstantExpr *C = dyn_cast<ConstantExpr>(V)) {
59219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Opcode = C->getOpcode();
59319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    U = C;
59419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
59519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
59619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  switch (Opcode) {
59719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  default: break;
59819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::BitCast:
59919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Look past bitcasts.
60019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return X86SelectCallAddress(U->getOperand(0), AM);
60119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
60219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::IntToPtr:
60319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Look past no-op inttoptrs.
60419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (TLI.getValueType(U->getOperand(0)->getType()) == TLI.getPointerTy())
60519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return X86SelectCallAddress(U->getOperand(0), AM);
60619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
60719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
60819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::PtrToInt:
60919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Look past no-op ptrtoints.
61019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (TLI.getValueType(U->getType()) == TLI.getPointerTy())
61119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return X86SelectCallAddress(U->getOperand(0), AM);
61219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
61319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
61419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
61519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Handle constant address.
61619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (const GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
61719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Can't handle alternate code models yet.
61819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (TM.getCodeModel() != CodeModel::Small)
61919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
62019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
62119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // RIP-relative addresses can't have additional register operands.
62219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Subtarget->isPICStyleRIPRel() &&
62319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        (AM.Base.Reg != 0 || AM.IndexReg != 0))
62419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
62519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
62619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Can't handle DLLImport.
62719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (GV->hasDLLImportLinkage())
62819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
62919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
63019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Can't handle TLS.
63119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV))
63219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (GVar->isThreadLocal())
63319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        return false;
63419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
63519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Okay, we've committed to selecting this global. Set up the basic address.
63619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    AM.GV = GV;
63719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
63819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // No ABI requires an extra load for anything other than DLLImport, which
63919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // we rejected above. Return a direct reference to the global.
64019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Subtarget->isPICStyleRIPRel()) {
64119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // Use rip-relative addressing if we can.  Above we verified that the
64219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // base and index registers are unused.
64319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      assert(AM.Base.Reg == 0 && AM.IndexReg == 0);
64419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      AM.Base.Reg = X86::RIP;
64519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    } else if (Subtarget->isPICStyleStubPIC()) {
64619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      AM.GVOpFlags = X86II::MO_PIC_BASE_OFFSET;
64719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    } else if (Subtarget->isPICStyleGOT()) {
64819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      AM.GVOpFlags = X86II::MO_GOTOFF;
64919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
65019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
65119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return true;
65219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
65319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
65419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // If all else fails, try to materialize the value in a register.
65519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!AM.GV || !Subtarget->isPICStyleRIPRel()) {
65619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (AM.Base.Reg == 0) {
65719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      AM.Base.Reg = getRegForValue(V);
65819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return AM.Base.Reg != 0;
65919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
66019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (AM.IndexReg == 0) {
66119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      assert(AM.Scale == 1 && "Scale with no index!");
66219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      AM.IndexReg = getRegForValue(V);
66319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return AM.IndexReg != 0;
66419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
66519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
66619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
66719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return false;
66819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
66919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
67019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
67119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// X86SelectStore - Select and emit code to implement store instructions.
67219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::X86SelectStore(const Instruction *I) {
67319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Atomic stores need special handling.
67419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (cast<StoreInst>(I)->isAtomic())
67519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
67619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
67719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MVT VT;
67819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!isTypeLegal(I->getOperand(0)->getType(), VT, /*AllowI1=*/true))
67919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
68019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
68119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  X86AddressMode AM;
68219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!X86SelectAddress(I->getOperand(1), AM))
68319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
68419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
68519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return X86FastEmitStore(VT, I->getOperand(0), AM);
68619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
68719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
68819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// X86SelectRet - Select and emit code to implement ret instructions.
68919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::X86SelectRet(const Instruction *I) {
69019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const ReturnInst *Ret = cast<ReturnInst>(I);
69119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const Function &F = *I->getParent()->getParent();
69219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
69319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!FuncInfo.CanLowerReturn)
69419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
69519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
69619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CallingConv::ID CC = F.getCallingConv();
69719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (CC != CallingConv::C &&
69819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      CC != CallingConv::Fast &&
69919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      CC != CallingConv::X86_FastCall)
70019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
70119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
70219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Subtarget->isTargetWin64())
70319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
70419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
70519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Don't handle popping bytes on return for now.
70619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (FuncInfo.MF->getInfo<X86MachineFunctionInfo>()
70719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        ->getBytesToPopOnReturn() != 0)
70819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return 0;
70919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
71019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // fastcc with -tailcallopt is intended to provide a guaranteed
71119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // tail call optimization. Fastisel doesn't know how to do that.
71219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (CC == CallingConv::Fast && GuaranteedTailCallOpt)
71319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
71419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
71519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Let SDISel handle vararg functions.
71619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (F.isVarArg())
71719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
71819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
71919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Ret->getNumOperands() > 0) {
72019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    SmallVector<ISD::OutputArg, 4> Outs;
72119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    GetReturnInfo(F.getReturnType(), F.getAttributes().getRetAttributes(),
72219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                  Outs, TLI);
72319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
72419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Analyze operands of the call, assigning locations to each operand.
72519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    SmallVector<CCValAssign, 16> ValLocs;
72619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    CCState CCInfo(CC, F.isVarArg(), *FuncInfo.MF, TM, ValLocs,
72719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman		   I->getContext());
72819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    CCInfo.AnalyzeReturn(Outs, RetCC_X86);
72919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
73019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    const Value *RV = Ret->getOperand(0);
73119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned Reg = getRegForValue(RV);
73219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Reg == 0)
73319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
73419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
73519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Only handle a single return value for now.
73619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (ValLocs.size() != 1)
73719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
73819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
73919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    CCValAssign &VA = ValLocs[0];
74019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
74119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Don't bother handling odd stuff for now.
74219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (VA.getLocInfo() != CCValAssign::Full)
74319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
74419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Only handle register returns for now.
74519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (!VA.isRegLoc())
74619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
74719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
74819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // The calling-convention tables for x87 returns don't tell
74919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // the whole story.
75019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (VA.getLocReg() == X86::ST0 || VA.getLocReg() == X86::ST1)
75119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
75219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
75319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned SrcReg = Reg + VA.getValNo();
75419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EVT SrcVT = TLI.getValueType(RV->getType());
75519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EVT DstVT = VA.getValVT();
75619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Special handling for extended integers.
75719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (SrcVT != DstVT) {
75819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (SrcVT != MVT::i1 && SrcVT != MVT::i8 && SrcVT != MVT::i16)
75919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        return false;
76019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
76119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (!Outs[0].Flags.isZExt() && !Outs[0].Flags.isSExt())
76219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        return false;
76319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
76419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      assert(DstVT == MVT::i32 && "X86 should always ext to i32");
76519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
76619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (SrcVT == MVT::i1) {
76719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        if (Outs[0].Flags.isSExt())
76819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          return false;
76919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        SrcReg = FastEmitZExtFromI1(MVT::i8, SrcReg, /*TODO: Kill=*/false);
77019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        SrcVT = MVT::i8;
77119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
77219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      unsigned Op = Outs[0].Flags.isZExt() ? ISD::ZERO_EXTEND :
77319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                             ISD::SIGN_EXTEND;
77419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      SrcReg = FastEmit_r(SrcVT.getSimpleVT(), DstVT.getSimpleVT(), Op,
77519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                          SrcReg, /*TODO: Kill=*/false);
77619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
77719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
77819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Make the copy.
77919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned DstReg = VA.getLocReg();
78019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    const TargetRegisterClass* SrcRC = MRI.getRegClass(SrcReg);
78119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Avoid a cross-class copy. This is very unlikely.
78219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (!SrcRC->contains(DstReg))
78319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
78419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(TargetOpcode::COPY),
78519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman            DstReg).addReg(SrcReg);
78619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
78719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Mark the register as live out of the function.
78819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MRI.addLiveOut(VA.getLocReg());
78919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
79019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
79119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Now emit the RET.
79219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(X86::RET));
79319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return true;
79419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
79519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
79619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// X86SelectLoad - Select and emit code to implement load instructions.
79719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman///
79819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::X86SelectLoad(const Instruction *I)  {
79919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Atomic loads need special handling.
80019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (cast<LoadInst>(I)->isAtomic())
80119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
80219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
80319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MVT VT;
80419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!isTypeLegal(I->getType(), VT, /*AllowI1=*/true))
80519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
80619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
80719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  X86AddressMode AM;
80819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!X86SelectAddress(I->getOperand(0), AM))
80919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
81019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
81119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned ResultReg = 0;
81219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (X86FastEmitLoad(VT, AM, ResultReg)) {
81319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    UpdateValueMap(I, ResultReg);
81419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return true;
81519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
81619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return false;
81719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
81819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
81919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic unsigned X86ChooseCmpOpcode(EVT VT, const X86Subtarget *Subtarget) {
82019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool HasAVX = Subtarget->hasAVX();
82119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86ScalarSSEf32 = HasAVX || Subtarget->hasSSE1();
82219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool X86ScalarSSEf64 = HasAVX || Subtarget->hasSSE2();
82319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
82419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  switch (VT.getSimpleVT().SimpleTy) {
82519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  default:       return 0;
82619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i8:  return X86::CMP8rr;
82719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i16: return X86::CMP16rr;
82819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i32: return X86::CMP32rr;
82919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i64: return X86::CMP64rr;
83019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::f32:
83119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return X86ScalarSSEf32 ? (HasAVX ? X86::VUCOMISSrr : X86::UCOMISSrr) : 0;
83219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::f64:
83319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return X86ScalarSSEf64 ? (HasAVX ? X86::VUCOMISDrr : X86::UCOMISDrr) : 0;
83419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
83519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
83619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
83719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// X86ChooseCmpImmediateOpcode - If we have a comparison with RHS as the RHS
83819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// of the comparison, return an opcode that works for the compare (e.g.
83919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// CMP32ri) otherwise return 0.
84019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic unsigned X86ChooseCmpImmediateOpcode(EVT VT, const ConstantInt *RHSC) {
84119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  switch (VT.getSimpleVT().SimpleTy) {
84219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Otherwise, we can't fold the immediate into this comparison.
84319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  default: return 0;
84419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i8: return X86::CMP8ri;
84519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i16: return X86::CMP16ri;
84619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i32: return X86::CMP32ri;
84719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i64:
84819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // 64-bit comparisons are only valid if the immediate fits in a 32-bit sext
84919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // field.
85019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if ((int)RHSC->getSExtValue() == RHSC->getSExtValue())
85119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return X86::CMP64ri32;
85219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return 0;
85319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
85419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
85519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
85619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::X86FastEmitCompare(const Value *Op0, const Value *Op1,
85719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                     EVT VT) {
85819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Op0Reg = getRegForValue(Op0);
85919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Op0Reg == 0) return false;
86019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
86119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Handle 'null' like i32/i64 0.
86219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (isa<ConstantPointerNull>(Op1))
86319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Op1 = Constant::getNullValue(TD.getIntPtrType(Op0->getContext()));
86419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
86519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // We have two options: compare with register or immediate.  If the RHS of
86619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // the compare is an immediate that we can fold into this compare, use
86719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // CMPri, otherwise use CMPrr.
86819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (const ConstantInt *Op1C = dyn_cast<ConstantInt>(Op1)) {
86919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (unsigned CompareImmOpc = X86ChooseCmpImmediateOpcode(VT, Op1C)) {
87019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(CompareImmOpc))
87119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        .addReg(Op0Reg)
87219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        .addImm(Op1C->getSExtValue());
87319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return true;
87419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
87519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
87619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
87719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned CompareOpc = X86ChooseCmpOpcode(VT, Subtarget);
87819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (CompareOpc == 0) return false;
87919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
88019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Op1Reg = getRegForValue(Op1);
88119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Op1Reg == 0) return false;
88219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(CompareOpc))
88319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    .addReg(Op0Reg)
88419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    .addReg(Op1Reg);
88519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
88619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return true;
88719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
88819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
88919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::X86SelectCmp(const Instruction *I) {
89019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const CmpInst *CI = cast<CmpInst>(I);
89119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
89219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MVT VT;
89319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!isTypeLegal(I->getOperand(0)->getType(), VT))
89419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
89519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
89619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned ResultReg = createResultReg(&X86::GR8RegClass);
89719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned SetCCOpc;
89819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool SwapArgs;  // false -> compare Op0, Op1.  true -> compare Op1, Op0.
89919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  switch (CI->getPredicate()) {
90019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::FCMP_OEQ: {
90119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (!X86FastEmitCompare(CI->getOperand(0), CI->getOperand(1), VT))
90219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
90319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
90419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned EReg = createResultReg(&X86::GR8RegClass);
90519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned NPReg = createResultReg(&X86::GR8RegClass);
90619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(X86::SETEr), EReg);
90719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
90819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman            TII.get(X86::SETNPr), NPReg);
90919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
91019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman            TII.get(X86::AND8rr), ResultReg).addReg(NPReg).addReg(EReg);
91119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    UpdateValueMap(I, ResultReg);
91219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return true;
91319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
91419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::FCMP_UNE: {
91519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (!X86FastEmitCompare(CI->getOperand(0), CI->getOperand(1), VT))
91619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
91719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
91819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned NEReg = createResultReg(&X86::GR8RegClass);
91919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned PReg = createResultReg(&X86::GR8RegClass);
92019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(X86::SETNEr), NEReg);
92119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(X86::SETPr), PReg);
92219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(X86::OR8rr),ResultReg)
92319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      .addReg(PReg).addReg(NEReg);
92419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    UpdateValueMap(I, ResultReg);
92519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return true;
92619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
92719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::FCMP_OGT: SwapArgs = false; SetCCOpc = X86::SETAr;  break;
92819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::FCMP_OGE: SwapArgs = false; SetCCOpc = X86::SETAEr; break;
92919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::FCMP_OLT: SwapArgs = true;  SetCCOpc = X86::SETAr;  break;
93019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::FCMP_OLE: SwapArgs = true;  SetCCOpc = X86::SETAEr; break;
93119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::FCMP_ONE: SwapArgs = false; SetCCOpc = X86::SETNEr; break;
93219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::FCMP_ORD: SwapArgs = false; SetCCOpc = X86::SETNPr; break;
93319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::FCMP_UNO: SwapArgs = false; SetCCOpc = X86::SETPr;  break;
93419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::FCMP_UEQ: SwapArgs = false; SetCCOpc = X86::SETEr;  break;
93519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::FCMP_UGT: SwapArgs = true;  SetCCOpc = X86::SETBr;  break;
93619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::FCMP_UGE: SwapArgs = true;  SetCCOpc = X86::SETBEr; break;
93719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::FCMP_ULT: SwapArgs = false; SetCCOpc = X86::SETBr;  break;
93819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::FCMP_ULE: SwapArgs = false; SetCCOpc = X86::SETBEr; break;
93919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
94019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::ICMP_EQ:  SwapArgs = false; SetCCOpc = X86::SETEr;  break;
94119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::ICMP_NE:  SwapArgs = false; SetCCOpc = X86::SETNEr; break;
94219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::ICMP_UGT: SwapArgs = false; SetCCOpc = X86::SETAr;  break;
94319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::ICMP_UGE: SwapArgs = false; SetCCOpc = X86::SETAEr; break;
94419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::ICMP_ULT: SwapArgs = false; SetCCOpc = X86::SETBr;  break;
94519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::ICMP_ULE: SwapArgs = false; SetCCOpc = X86::SETBEr; break;
94619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::ICMP_SGT: SwapArgs = false; SetCCOpc = X86::SETGr;  break;
94719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::ICMP_SGE: SwapArgs = false; SetCCOpc = X86::SETGEr; break;
94819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::ICMP_SLT: SwapArgs = false; SetCCOpc = X86::SETLr;  break;
94919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case CmpInst::ICMP_SLE: SwapArgs = false; SetCCOpc = X86::SETLEr; break;
95019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  default:
95119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
95219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
95319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
95419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const Value *Op0 = CI->getOperand(0), *Op1 = CI->getOperand(1);
95519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (SwapArgs)
95619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    std::swap(Op0, Op1);
95719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
95819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Emit a compare of Op0/Op1.
95919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!X86FastEmitCompare(Op0, Op1, VT))
96019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
96119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
96219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(SetCCOpc), ResultReg);
96319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  UpdateValueMap(I, ResultReg);
96419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return true;
96519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
96619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
96719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::X86SelectZExt(const Instruction *I) {
96819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Handle zero-extension from i1 to i8, which is common.
96919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!I->getOperand(0)->getType()->isIntegerTy(1))
97019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
97119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
97219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EVT DstVT = TLI.getValueType(I->getType());
97319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!TLI.isTypeLegal(DstVT))
97419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
97519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
97619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned ResultReg = getRegForValue(I->getOperand(0));
97719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (ResultReg == 0)
97819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
97919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
98019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Set the high bits to zero.
98119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ResultReg = FastEmitZExtFromI1(MVT::i8, ResultReg, /*TODO: Kill=*/false);
98219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (ResultReg == 0)
98319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
98419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
98519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (DstVT != MVT::i8) {
98619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    ResultReg = FastEmit_r(MVT::i8, DstVT.getSimpleVT(), ISD::ZERO_EXTEND,
98719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           ResultReg, /*Kill=*/true);
98819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (ResultReg == 0)
98919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
99019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
99119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
99219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  UpdateValueMap(I, ResultReg);
99319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return true;
99419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
99519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
99619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
99719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::X86SelectBranch(const Instruction *I) {
99819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Unconditional branches are selected by tablegen-generated code.
99919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Handle a conditional branch.
100019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const BranchInst *BI = cast<BranchInst>(I);
100119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MachineBasicBlock *TrueMBB = FuncInfo.MBBMap[BI->getSuccessor(0)];
100219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MachineBasicBlock *FalseMBB = FuncInfo.MBBMap[BI->getSuccessor(1)];
100319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
100419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Fold the common case of a conditional branch with a comparison
100519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // in the same block (values defined on other blocks may not have
100619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // initialized registers).
100719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (const CmpInst *CI = dyn_cast<CmpInst>(BI->getCondition())) {
100819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (CI->hasOneUse() && CI->getParent() == I->getParent()) {
100919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      EVT VT = TLI.getValueType(CI->getOperand(0)->getType());
101019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
101119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // Try to take advantage of fallthrough opportunities.
101219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      CmpInst::Predicate Predicate = CI->getPredicate();
101319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (FuncInfo.MBB->isLayoutSuccessor(TrueMBB)) {
101419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        std::swap(TrueMBB, FalseMBB);
101519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        Predicate = CmpInst::getInversePredicate(Predicate);
101619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
101719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
101819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      bool SwapArgs;  // false -> compare Op0, Op1.  true -> compare Op1, Op0.
101919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      unsigned BranchOpc; // Opcode to jump on, e.g. "X86::JA"
102019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
102119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      switch (Predicate) {
102219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::FCMP_OEQ:
102319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        std::swap(TrueMBB, FalseMBB);
102419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        Predicate = CmpInst::FCMP_UNE;
102519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        // FALL THROUGH
102619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::FCMP_UNE: SwapArgs = false; BranchOpc = X86::JNE_4; break;
102719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::FCMP_OGT: SwapArgs = false; BranchOpc = X86::JA_4;  break;
102819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::FCMP_OGE: SwapArgs = false; BranchOpc = X86::JAE_4; break;
102919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::FCMP_OLT: SwapArgs = true;  BranchOpc = X86::JA_4;  break;
103019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::FCMP_OLE: SwapArgs = true;  BranchOpc = X86::JAE_4; break;
103119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::FCMP_ONE: SwapArgs = false; BranchOpc = X86::JNE_4; break;
103219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::FCMP_ORD: SwapArgs = false; BranchOpc = X86::JNP_4; break;
103319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::FCMP_UNO: SwapArgs = false; BranchOpc = X86::JP_4;  break;
103419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::FCMP_UEQ: SwapArgs = false; BranchOpc = X86::JE_4;  break;
103519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::FCMP_UGT: SwapArgs = true;  BranchOpc = X86::JB_4;  break;
103619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::FCMP_UGE: SwapArgs = true;  BranchOpc = X86::JBE_4; break;
103719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::FCMP_ULT: SwapArgs = false; BranchOpc = X86::JB_4;  break;
103819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::FCMP_ULE: SwapArgs = false; BranchOpc = X86::JBE_4; break;
103919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
104019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::ICMP_EQ:  SwapArgs = false; BranchOpc = X86::JE_4;  break;
104119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::ICMP_NE:  SwapArgs = false; BranchOpc = X86::JNE_4; break;
104219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::ICMP_UGT: SwapArgs = false; BranchOpc = X86::JA_4;  break;
104319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::ICMP_UGE: SwapArgs = false; BranchOpc = X86::JAE_4; break;
104419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::ICMP_ULT: SwapArgs = false; BranchOpc = X86::JB_4;  break;
104519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::ICMP_ULE: SwapArgs = false; BranchOpc = X86::JBE_4; break;
104619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::ICMP_SGT: SwapArgs = false; BranchOpc = X86::JG_4;  break;
104719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::ICMP_SGE: SwapArgs = false; BranchOpc = X86::JGE_4; break;
104819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::ICMP_SLT: SwapArgs = false; BranchOpc = X86::JL_4;  break;
104919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case CmpInst::ICMP_SLE: SwapArgs = false; BranchOpc = X86::JLE_4; break;
105019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      default:
105119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        return false;
105219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
105319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
105419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      const Value *Op0 = CI->getOperand(0), *Op1 = CI->getOperand(1);
105519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (SwapArgs)
105619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        std::swap(Op0, Op1);
105719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
105819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // Emit a compare of the LHS and RHS, setting the flags.
105919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (!X86FastEmitCompare(Op0, Op1, VT))
106019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        return false;
106119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
106219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(BranchOpc))
106319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        .addMBB(TrueMBB);
106419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
106519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (Predicate == CmpInst::FCMP_UNE) {
106619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        // X86 requires a second branch to handle UNE (and OEQ,
106719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        // which is mapped to UNE above).
106819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(X86::JP_4))
106919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          .addMBB(TrueMBB);
107019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
107119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
107219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      FastEmitBranch(FalseMBB, DL);
107319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      FuncInfo.MBB->addSuccessor(TrueMBB);
107419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return true;
107519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
107619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else if (TruncInst *TI = dyn_cast<TruncInst>(BI->getCondition())) {
107719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Handle things like "%cond = trunc i32 %X to i1 / br i1 %cond", which
107819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // typically happen for _Bool and C++ bools.
107919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MVT SourceVT;
108019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (TI->hasOneUse() && TI->getParent() == I->getParent() &&
108119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        isTypeLegal(TI->getOperand(0)->getType(), SourceVT)) {
108219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      unsigned TestOpc = 0;
108319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      switch (SourceVT.SimpleTy) {
108419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      default: break;
108519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case MVT::i8:  TestOpc = X86::TEST8ri; break;
108619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case MVT::i16: TestOpc = X86::TEST16ri; break;
108719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case MVT::i32: TestOpc = X86::TEST32ri; break;
108819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      case MVT::i64: TestOpc = X86::TEST64ri32; break;
108919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
109019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (TestOpc) {
109119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        unsigned OpReg = getRegForValue(TI->getOperand(0));
109219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        if (OpReg == 0) return false;
109319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(TestOpc))
109419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          .addReg(OpReg).addImm(1);
109519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
109619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        unsigned JmpOpc = X86::JNE_4;
109719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        if (FuncInfo.MBB->isLayoutSuccessor(TrueMBB)) {
109819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          std::swap(TrueMBB, FalseMBB);
109919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          JmpOpc = X86::JE_4;
110019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        }
110119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
110219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(JmpOpc))
110319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          .addMBB(TrueMBB);
110419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        FastEmitBranch(FalseMBB, DL);
110519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        FuncInfo.MBB->addSuccessor(TrueMBB);
110619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        return true;
110719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
110819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
110919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
111019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
111119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Otherwise do a clumsy setcc and re-test it.
111219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Note that i1 essentially gets ANY_EXTEND'ed to i8 where it isn't used
111319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // in an explicit cast, so make sure to handle that correctly.
111419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned OpReg = getRegForValue(BI->getCondition());
111519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (OpReg == 0) return false;
111619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
111719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(X86::TEST8ri))
111819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    .addReg(OpReg).addImm(1);
111919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(X86::JNE_4))
112019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    .addMBB(TrueMBB);
112119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  FastEmitBranch(FalseMBB, DL);
112219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  FuncInfo.MBB->addSuccessor(TrueMBB);
112319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return true;
112419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
112519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
112619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::X86SelectShift(const Instruction *I) {
112719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned CReg = 0, OpReg = 0;
112819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const TargetRegisterClass *RC = NULL;
112919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (I->getType()->isIntegerTy(8)) {
113019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    CReg = X86::CL;
113119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    RC = &X86::GR8RegClass;
113219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    switch (I->getOpcode()) {
113319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case Instruction::LShr: OpReg = X86::SHR8rCL; break;
113419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case Instruction::AShr: OpReg = X86::SAR8rCL; break;
113519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case Instruction::Shl:  OpReg = X86::SHL8rCL; break;
113619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    default: return false;
113719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
113819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else if (I->getType()->isIntegerTy(16)) {
113919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    CReg = X86::CX;
114019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    RC = &X86::GR16RegClass;
114119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    switch (I->getOpcode()) {
114219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case Instruction::LShr: OpReg = X86::SHR16rCL; break;
114319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case Instruction::AShr: OpReg = X86::SAR16rCL; break;
114419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case Instruction::Shl:  OpReg = X86::SHL16rCL; break;
114519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    default: return false;
114619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
114719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else if (I->getType()->isIntegerTy(32)) {
114819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    CReg = X86::ECX;
114919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    RC = &X86::GR32RegClass;
115019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    switch (I->getOpcode()) {
115119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case Instruction::LShr: OpReg = X86::SHR32rCL; break;
115219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case Instruction::AShr: OpReg = X86::SAR32rCL; break;
115319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case Instruction::Shl:  OpReg = X86::SHL32rCL; break;
115419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    default: return false;
115519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
115619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else if (I->getType()->isIntegerTy(64)) {
115719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    CReg = X86::RCX;
115819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    RC = &X86::GR64RegClass;
115919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    switch (I->getOpcode()) {
116019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case Instruction::LShr: OpReg = X86::SHR64rCL; break;
116119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case Instruction::AShr: OpReg = X86::SAR64rCL; break;
116219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case Instruction::Shl:  OpReg = X86::SHL64rCL; break;
116319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    default: return false;
116419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
116519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else {
116619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
116719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
116819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
116919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MVT VT;
117019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!isTypeLegal(I->getType(), VT))
117119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
117219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
117319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Op0Reg = getRegForValue(I->getOperand(0));
117419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Op0Reg == 0) return false;
117519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
117619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Op1Reg = getRegForValue(I->getOperand(1));
117719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Op1Reg == 0) return false;
117819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(TargetOpcode::COPY),
117919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          CReg).addReg(Op1Reg);
118019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
118119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // The shift instruction uses X86::CL. If we defined a super-register
118219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // of X86::CL, emit a subreg KILL to precisely describe what we're doing here.
118319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (CReg != X86::CL)
118419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
118519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman            TII.get(TargetOpcode::KILL), X86::CL)
118619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      .addReg(CReg, RegState::Kill);
118719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
118819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned ResultReg = createResultReg(RC);
118919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(OpReg), ResultReg)
119019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    .addReg(Op0Reg);
119119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  UpdateValueMap(I, ResultReg);
119219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return true;
119319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
119419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
119519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::X86SelectSelect(const Instruction *I) {
119619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MVT VT;
119719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!isTypeLegal(I->getType(), VT))
119819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
119919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
120019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // We only use cmov here, if we don't have a cmov instruction bail.
120119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!Subtarget->hasCMov()) return false;
120219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
120319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Opc = 0;
120419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const TargetRegisterClass *RC = NULL;
120519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (VT == MVT::i16) {
120619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Opc = X86::CMOVE16rr;
120719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    RC = &X86::GR16RegClass;
120819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else if (VT == MVT::i32) {
120919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Opc = X86::CMOVE32rr;
121019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    RC = &X86::GR32RegClass;
121119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else if (VT == MVT::i64) {
121219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Opc = X86::CMOVE64rr;
121319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    RC = &X86::GR64RegClass;
121419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else {
121519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
121619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
121719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
121819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Op0Reg = getRegForValue(I->getOperand(0));
121919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Op0Reg == 0) return false;
122019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Op1Reg = getRegForValue(I->getOperand(1));
122119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Op1Reg == 0) return false;
122219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Op2Reg = getRegForValue(I->getOperand(2));
122319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Op2Reg == 0) return false;
122419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
122519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(X86::TEST8rr))
122619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    .addReg(Op0Reg).addReg(Op0Reg);
122719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned ResultReg = createResultReg(RC);
122819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(Opc), ResultReg)
122919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    .addReg(Op1Reg).addReg(Op2Reg);
123019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  UpdateValueMap(I, ResultReg);
123119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return true;
123219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
123319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
123419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::X86SelectFPExt(const Instruction *I) {
123519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // fpext from float to double.
123619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (X86ScalarSSEf64 &&
123719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      I->getType()->isDoubleTy()) {
123819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    const Value *V = I->getOperand(0);
123919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (V->getType()->isFloatTy()) {
124019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      unsigned OpReg = getRegForValue(V);
124119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (OpReg == 0) return false;
124219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      unsigned ResultReg = createResultReg(X86::FR64RegisterClass);
124319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
124419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman              TII.get(X86::CVTSS2SDrr), ResultReg)
124519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        .addReg(OpReg);
124619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      UpdateValueMap(I, ResultReg);
124719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return true;
124819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
124919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
125019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
125119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return false;
125219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
125319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
125419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::X86SelectFPTrunc(const Instruction *I) {
125519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (X86ScalarSSEf64) {
125619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (I->getType()->isFloatTy()) {
125719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      const Value *V = I->getOperand(0);
125819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (V->getType()->isDoubleTy()) {
125919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        unsigned OpReg = getRegForValue(V);
126019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        if (OpReg == 0) return false;
126119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        unsigned ResultReg = createResultReg(X86::FR32RegisterClass);
126219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
126319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                TII.get(X86::CVTSD2SSrr), ResultReg)
126419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          .addReg(OpReg);
126519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        UpdateValueMap(I, ResultReg);
126619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        return true;
126719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
126819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
126919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
127019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
127119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return false;
127219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
127319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
127419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::X86SelectTrunc(const Instruction *I) {
127519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EVT SrcVT = TLI.getValueType(I->getOperand(0)->getType());
127619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EVT DstVT = TLI.getValueType(I->getType());
127719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
127819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // This code only handles truncation to byte.
127919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (DstVT != MVT::i8 && DstVT != MVT::i1)
128019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
128119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!TLI.isTypeLegal(SrcVT))
128219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
128319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
128419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned InputReg = getRegForValue(I->getOperand(0));
128519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!InputReg)
128619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Unhandled operand.  Halt "fast" selection and bail.
128719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
128819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
128919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (SrcVT == MVT::i8) {
129019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Truncate from i8 to i1; no code needed.
129119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    UpdateValueMap(I, InputReg);
129219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return true;
129319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
129419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
129519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!Subtarget->is64Bit()) {
129619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // If we're on x86-32; we can't extract an i8 from a general register.
129719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // First issue a copy to GR16_ABCD or GR32_ABCD.
129819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    const TargetRegisterClass *CopyRC = (SrcVT == MVT::i16)
129919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      ? X86::GR16_ABCDRegisterClass : X86::GR32_ABCDRegisterClass;
130019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned CopyReg = createResultReg(CopyRC);
130119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(TargetOpcode::COPY),
130219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman            CopyReg).addReg(InputReg);
130319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    InputReg = CopyReg;
130419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
130519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
130619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Issue an extract_subreg.
130719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned ResultReg = FastEmitInst_extractsubreg(MVT::i8,
130819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                                  InputReg, /*Kill=*/true,
130919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                                  X86::sub_8bit);
131019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!ResultReg)
131119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
131219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
131319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  UpdateValueMap(I, ResultReg);
131419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return true;
131519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
131619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
131719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::IsMemcpySmall(uint64_t Len) {
131819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return Len <= (Subtarget->is64Bit() ? 32 : 16);
131919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
132019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
132119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::TryEmitSmallMemcpy(X86AddressMode DestAM,
132219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                     X86AddressMode SrcAM, uint64_t Len) {
132319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
132419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Make sure we don't bloat code by inlining very large memcpy's.
132519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!IsMemcpySmall(Len))
132619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
132719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
132819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool i64Legal = Subtarget->is64Bit();
132919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
133019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // We don't care about alignment here since we just emit integer accesses.
133119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  while (Len) {
133219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MVT VT;
133319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Len >= 8 && i64Legal)
133419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      VT = MVT::i64;
133519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    else if (Len >= 4)
133619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      VT = MVT::i32;
133719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    else if (Len >= 2)
133819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      VT = MVT::i16;
133919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    else {
134019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      assert(Len == 1);
134119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      VT = MVT::i8;
134219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
134319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
134419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned Reg;
134519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    bool RV = X86FastEmitLoad(VT, SrcAM, Reg);
134619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    RV &= X86FastEmitStore(VT, Reg, DestAM);
134719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    assert(RV && "Failed to emit load or store??");
134819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
134919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned Size = VT.getSizeInBits()/8;
135019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Len -= Size;
135119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    DestAM.Disp += Size;
135219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    SrcAM.Disp += Size;
135319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
135419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
135519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return true;
135619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
135719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
135819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::X86VisitIntrinsicCall(const IntrinsicInst &I) {
135919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // FIXME: Handle more intrinsics.
136019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  switch (I.getIntrinsicID()) {
136119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  default: return false;
136219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Intrinsic::memcpy: {
136319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    const MemCpyInst &MCI = cast<MemCpyInst>(I);
136419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Don't handle volatile or variable length memcpys.
136519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (MCI.isVolatile())
136619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
136719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
136819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (isa<ConstantInt>(MCI.getLength())) {
136919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // Small memcpy's are common enough that we want to do them
137019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // without a call if possible.
137119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      uint64_t Len = cast<ConstantInt>(MCI.getLength())->getZExtValue();
137219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (IsMemcpySmall(Len)) {
137319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        X86AddressMode DestAM, SrcAM;
137419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        if (!X86SelectAddress(MCI.getRawDest(), DestAM) ||
137519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman            !X86SelectAddress(MCI.getRawSource(), SrcAM))
137619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          return false;
137719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        TryEmitSmallMemcpy(DestAM, SrcAM, Len);
137819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        return true;
137919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
138019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
138119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
138219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned SizeWidth = Subtarget->is64Bit() ? 64 : 32;
138319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (!MCI.getLength()->getType()->isIntegerTy(SizeWidth))
138419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
138519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
138619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (MCI.getSourceAddressSpace() > 255 || MCI.getDestAddressSpace() > 255)
138719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
138819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
138919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return DoSelectCall(&I, "memcpy");
139019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
139119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Intrinsic::memset: {
139219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    const MemSetInst &MSI = cast<MemSetInst>(I);
139319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
139419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (MSI.isVolatile())
139519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
139619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
139719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned SizeWidth = Subtarget->is64Bit() ? 64 : 32;
139819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (!MSI.getLength()->getType()->isIntegerTy(SizeWidth))
139919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
140019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
140119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (MSI.getDestAddressSpace() > 255)
140219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
140319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
140419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return DoSelectCall(&I, "memset");
140519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
140619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Intrinsic::stackprotector: {
140719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Emit code inline code to store the stack guard onto the stack.
140819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EVT PtrTy = TLI.getPointerTy();
140919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
141019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    const Value *Op1 = I.getArgOperand(0); // The guard's value.
141119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    const AllocaInst *Slot = cast<AllocaInst>(I.getArgOperand(1));
141219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
141319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Grab the frame index.
141419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    X86AddressMode AM;
141519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (!X86SelectAddress(Slot, AM)) return false;
141619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (!X86FastEmitStore(PtrTy, Op1, AM)) return false;
141719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return true;
141819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
141919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Intrinsic::dbg_declare: {
142019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    const DbgDeclareInst *DI = cast<DbgDeclareInst>(&I);
142119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    X86AddressMode AM;
142219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    assert(DI->getAddress() && "Null address should be checked earlier!");
142319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (!X86SelectAddress(DI->getAddress(), AM))
142419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
142519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    const MCInstrDesc &II = TII.get(TargetOpcode::DBG_VALUE);
142619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // FIXME may need to add RegState::Debug to any registers produced,
142719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // although ESP/EBP should be the only ones at the moment.
142819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    addFullAddress(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, II), AM).
142919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      addImm(0).addMetadata(DI->getVariable());
143019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return true;
143119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
143219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Intrinsic::trap: {
143319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(X86::TRAP));
143419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return true;
143519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
143619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Intrinsic::sadd_with_overflow:
143719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Intrinsic::uadd_with_overflow: {
143819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // FIXME: Should fold immediates.
143919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
144019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Replace "add with overflow" intrinsics with an "add" instruction followed
144119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // by a seto/setc instruction.
144219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    const Function *Callee = I.getCalledFunction();
144319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Type *RetTy =
144419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      cast<StructType>(Callee->getReturnType())->getTypeAtIndex(unsigned(0));
144519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
144619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MVT VT;
144719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (!isTypeLegal(RetTy, VT))
144819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
144919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
145019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    const Value *Op1 = I.getArgOperand(0);
145119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    const Value *Op2 = I.getArgOperand(1);
145219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned Reg1 = getRegForValue(Op1);
145319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned Reg2 = getRegForValue(Op2);
145419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
145519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Reg1 == 0 || Reg2 == 0)
145619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // FIXME: Handle values *not* in registers.
145719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
145819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
145919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned OpC = 0;
146019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (VT == MVT::i32)
146119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      OpC = X86::ADD32rr;
146219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    else if (VT == MVT::i64)
146319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      OpC = X86::ADD64rr;
146419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    else
146519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
146619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
146719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // The call to CreateRegs builds two sequential registers, to store the
146819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // both the the returned values.
146919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned ResultReg = FuncInfo.CreateRegs(I.getType());
147019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(OpC), ResultReg)
147119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      .addReg(Reg1).addReg(Reg2);
147219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
147319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned Opc = X86::SETBr;
147419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (I.getIntrinsicID() == Intrinsic::sadd_with_overflow)
147519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Opc = X86::SETOr;
147619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(Opc), ResultReg+1);
147719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
147819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    UpdateValueMap(&I, ResultReg, 2);
147919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return true;
148019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
148119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
148219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
148319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
148419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::X86SelectCall(const Instruction *I) {
148519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const CallInst *CI = cast<CallInst>(I);
148619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const Value *Callee = CI->getCalledValue();
148719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
148819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Can't handle inline asm yet.
148919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (isa<InlineAsm>(Callee))
149019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
149119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
149219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Handle intrinsic calls.
149319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(CI))
149419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return X86VisitIntrinsicCall(*II);
149519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
149619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return DoSelectCall(I, 0);
149719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
149819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
149919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// Select either a call, or an llvm.memcpy/memmove/memset intrinsic
150019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::DoSelectCall(const Instruction *I, const char *MemIntName) {
150119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const CallInst *CI = cast<CallInst>(I);
150219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const Value *Callee = CI->getCalledValue();
150319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
150419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Handle only C and fastcc calling conventions for now.
150519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ImmutableCallSite CS(CI);
150619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CallingConv::ID CC = CS.getCallingConv();
150719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (CC != CallingConv::C && CC != CallingConv::Fast &&
150819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      CC != CallingConv::X86_FastCall)
150919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
151019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
151119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // fastcc with -tailcallopt is intended to provide a guaranteed
151219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // tail call optimization. Fastisel doesn't know how to do that.
151319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (CC == CallingConv::Fast && GuaranteedTailCallOpt)
151419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
151519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
151619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  PointerType *PT = cast<PointerType>(CS.getCalledValue()->getType());
151719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  FunctionType *FTy = cast<FunctionType>(PT->getElementType());
151819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool isVarArg = FTy->isVarArg();
151919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
152019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Don't know how to handle Win64 varargs yet.  Nothing special needed for
152119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // x86-32.  Special handling for x86-64 is implemented.
152219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (isVarArg && Subtarget->isTargetWin64())
152319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
152419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
152519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Fast-isel doesn't know about callee-pop yet.
152619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (X86::isCalleePop(CC, Subtarget->is64Bit(), isVarArg,
152719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                       GuaranteedTailCallOpt))
152819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
152919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
153019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Check whether the function can return without sret-demotion.
153119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SmallVector<ISD::OutputArg, 4> Outs;
153219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SmallVector<uint64_t, 4> Offsets;
153319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  GetReturnInfo(I->getType(), CS.getAttributes().getRetAttributes(),
153419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                Outs, TLI, &Offsets);
153519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  bool CanLowerReturn = TLI.CanLowerReturn(CS.getCallingConv(),
153619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman					   *FuncInfo.MF, FTy->isVarArg(),
153719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman					   Outs, FTy->getContext());
153819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!CanLowerReturn)
153919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
154019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
154119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Materialize callee address in a register. FIXME: GV address can be
154219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // handled with a CALLpcrel32 instead.
154319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  X86AddressMode CalleeAM;
154419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!X86SelectCallAddress(Callee, CalleeAM))
154519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
154619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned CalleeOp = 0;
154719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const GlobalValue *GV = 0;
154819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (CalleeAM.GV != 0) {
154919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    GV = CalleeAM.GV;
155019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else if (CalleeAM.Base.Reg != 0) {
155119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    CalleeOp = CalleeAM.Base.Reg;
155219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else
155319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
155419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
155519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Deal with call operands first.
155619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SmallVector<const Value *, 8> ArgVals;
155719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SmallVector<unsigned, 8> Args;
155819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SmallVector<MVT, 8> ArgVTs;
155919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SmallVector<ISD::ArgFlagsTy, 8> ArgFlags;
156019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  Args.reserve(CS.arg_size());
156119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ArgVals.reserve(CS.arg_size());
156219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ArgVTs.reserve(CS.arg_size());
156319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ArgFlags.reserve(CS.arg_size());
156419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  for (ImmutableCallSite::arg_iterator i = CS.arg_begin(), e = CS.arg_end();
156519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman       i != e; ++i) {
156619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // If we're lowering a mem intrinsic instead of a regular call, skip the
156719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // last two arguments, which should not passed to the underlying functions.
156819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (MemIntName && e-i <= 2)
156919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      break;
157019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Value *ArgVal = *i;
157119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    ISD::ArgFlagsTy Flags;
157219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned AttrInd = i - CS.arg_begin() + 1;
157319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (CS.paramHasAttr(AttrInd, Attribute::SExt))
157419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Flags.setSExt();
157519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (CS.paramHasAttr(AttrInd, Attribute::ZExt))
157619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Flags.setZExt();
157719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
157819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (CS.paramHasAttr(AttrInd, Attribute::ByVal)) {
157919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      PointerType *Ty = cast<PointerType>(ArgVal->getType());
158019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Type *ElementTy = Ty->getElementType();
158119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      unsigned FrameSize = TD.getTypeAllocSize(ElementTy);
158219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      unsigned FrameAlign = CS.getParamAlignment(AttrInd);
158319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (!FrameAlign)
158419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        FrameAlign = TLI.getByValTypeAlignment(ElementTy);
158519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Flags.setByVal();
158619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Flags.setByValSize(FrameSize);
158719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Flags.setByValAlign(FrameAlign);
158819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (!IsMemcpySmall(FrameSize))
158919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        return false;
159019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
159119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
159219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (CS.paramHasAttr(AttrInd, Attribute::InReg))
159319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Flags.setInReg();
159419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (CS.paramHasAttr(AttrInd, Attribute::Nest))
159519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Flags.setNest();
159619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
159719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // If this is an i1/i8/i16 argument, promote to i32 to avoid an extra
159819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // instruction.  This is safe because it is common to all fastisel supported
159919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // calling conventions on x86.
160019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (ConstantInt *CI = dyn_cast<ConstantInt>(ArgVal)) {
160119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (CI->getBitWidth() == 1 || CI->getBitWidth() == 8 ||
160219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          CI->getBitWidth() == 16) {
160319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        if (Flags.isSExt())
160419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          ArgVal = ConstantExpr::getSExt(CI,Type::getInt32Ty(CI->getContext()));
160519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        else
160619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          ArgVal = ConstantExpr::getZExt(CI,Type::getInt32Ty(CI->getContext()));
160719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
160819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
160919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
161019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned ArgReg;
161119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
161219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Passing bools around ends up doing a trunc to i1 and passing it.
161319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Codegen this as an argument + "and 1".
161419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (ArgVal->getType()->isIntegerTy(1) && isa<TruncInst>(ArgVal) &&
161519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        cast<TruncInst>(ArgVal)->getParent() == I->getParent() &&
161619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        ArgVal->hasOneUse()) {
161719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      ArgVal = cast<TruncInst>(ArgVal)->getOperand(0);
161819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      ArgReg = getRegForValue(ArgVal);
161919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (ArgReg == 0) return false;
162019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
162119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      MVT ArgVT;
162219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (!isTypeLegal(ArgVal->getType(), ArgVT)) return false;
162319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
162419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      ArgReg = FastEmit_ri(ArgVT, ArgVT, ISD::AND, ArgReg,
162519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           ArgVal->hasOneUse(), 1);
162619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    } else {
162719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      ArgReg = getRegForValue(ArgVal);
162819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
162919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
163019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (ArgReg == 0) return false;
163119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
163219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Type *ArgTy = ArgVal->getType();
163319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MVT ArgVT;
163419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (!isTypeLegal(ArgTy, ArgVT))
163519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
163619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (ArgVT == MVT::x86mmx)
163719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
163819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned OriginalAlignment = TD.getABITypeAlignment(ArgTy);
163919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Flags.setOrigAlign(OriginalAlignment);
164019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
164119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Args.push_back(ArgReg);
164219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    ArgVals.push_back(ArgVal);
164319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    ArgVTs.push_back(ArgVT);
164419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    ArgFlags.push_back(Flags);
164519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
164619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
164719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Analyze operands of the call, assigning locations to each operand.
164819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SmallVector<CCValAssign, 16> ArgLocs;
164919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CCState CCInfo(CC, isVarArg, *FuncInfo.MF, TM, ArgLocs,
165019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman		 I->getParent()->getContext());
165119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
165219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Allocate shadow area for Win64
165319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Subtarget->isTargetWin64())
165419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    CCInfo.AllocateStack(32, 8);
165519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
165619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CCInfo.AnalyzeCallOperands(ArgVTs, ArgFlags, CC_X86);
165719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
165819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Get a count of how many bytes are to be pushed on the stack.
165919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned NumBytes = CCInfo.getNextStackOffset();
166019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
166119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Issue CALLSEQ_START
166219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned AdjStackDown = TII.getCallFrameSetupOpcode();
166319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(AdjStackDown))
166419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    .addImm(NumBytes);
166519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
166619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Process argument: walk the register/memloc assignments, inserting
166719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // copies / loads.
166819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SmallVector<unsigned, 4> RegArgs;
166919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
167019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    CCValAssign &VA = ArgLocs[i];
167119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned Arg = Args[VA.getValNo()];
167219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EVT ArgVT = ArgVTs[VA.getValNo()];
167319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
167419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Promote the value if needed.
167519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    switch (VA.getLocInfo()) {
167619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    default: llvm_unreachable("Unknown loc info!");
167719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case CCValAssign::Full: break;
167819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case CCValAssign::SExt: {
167919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      assert(VA.getLocVT().isInteger() && !VA.getLocVT().isVector() &&
168019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman             "Unexpected extend");
168119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      bool Emitted = X86FastEmitExtend(ISD::SIGN_EXTEND, VA.getLocVT(),
168219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                       Arg, ArgVT, Arg);
168319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      assert(Emitted && "Failed to emit a sext!"); (void)Emitted;
168419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      ArgVT = VA.getLocVT();
168519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      break;
168619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
168719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case CCValAssign::ZExt: {
168819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      assert(VA.getLocVT().isInteger() && !VA.getLocVT().isVector() &&
168919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman             "Unexpected extend");
169019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      bool Emitted = X86FastEmitExtend(ISD::ZERO_EXTEND, VA.getLocVT(),
169119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                       Arg, ArgVT, Arg);
169219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      assert(Emitted && "Failed to emit a zext!"); (void)Emitted;
169319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      ArgVT = VA.getLocVT();
169419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      break;
169519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
169619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case CCValAssign::AExt: {
169719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      assert(VA.getLocVT().isInteger() && !VA.getLocVT().isVector() &&
169819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman             "Unexpected extend");
169919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      bool Emitted = X86FastEmitExtend(ISD::ANY_EXTEND, VA.getLocVT(),
170019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                       Arg, ArgVT, Arg);
170119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (!Emitted)
170219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        Emitted = X86FastEmitExtend(ISD::ZERO_EXTEND, VA.getLocVT(),
170319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                    Arg, ArgVT, Arg);
170419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (!Emitted)
170519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        Emitted = X86FastEmitExtend(ISD::SIGN_EXTEND, VA.getLocVT(),
170619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                    Arg, ArgVT, Arg);
170719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
170819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      assert(Emitted && "Failed to emit a aext!"); (void)Emitted;
170919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      ArgVT = VA.getLocVT();
171019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      break;
171119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
171219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case CCValAssign::BCvt: {
171319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      unsigned BC = FastEmit_r(ArgVT.getSimpleVT(), VA.getLocVT(),
171419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                               ISD::BITCAST, Arg, /*TODO: Kill=*/false);
171519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      assert(BC != 0 && "Failed to emit a bitcast!");
171619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Arg = BC;
171719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      ArgVT = VA.getLocVT();
171819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      break;
171919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
172019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
172119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
172219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (VA.isRegLoc()) {
172319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(TargetOpcode::COPY),
172419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman              VA.getLocReg()).addReg(Arg);
172519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      RegArgs.push_back(VA.getLocReg());
172619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    } else {
172719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      unsigned LocMemOffset = VA.getLocMemOffset();
172819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      X86AddressMode AM;
172919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      AM.Base.Reg = StackPtr;
173019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      AM.Disp = LocMemOffset;
173119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      const Value *ArgVal = ArgVals[VA.getValNo()];
173219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      ISD::ArgFlagsTy Flags = ArgFlags[VA.getValNo()];
173319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
173419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (Flags.isByVal()) {
173519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        X86AddressMode SrcAM;
173619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        SrcAM.Base.Reg = Arg;
173719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        bool Res = TryEmitSmallMemcpy(AM, SrcAM, Flags.getByValSize());
173819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        assert(Res && "memcpy length already checked!"); (void)Res;
173919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      } else if (isa<ConstantInt>(ArgVal) || isa<ConstantPointerNull>(ArgVal)) {
174019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        // If this is a really simple value, emit this with the Value* version
174119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        // of X86FastEmitStore.  If it isn't simple, we don't want to do this,
174219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        // as it can cause us to reevaluate the argument.
174319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        X86FastEmitStore(ArgVT, ArgVal, AM);
174419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      } else {
174519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        X86FastEmitStore(ArgVT, Arg, AM);
174619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
174719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
174819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
174919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
175019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // ELF / PIC requires GOT in the EBX register before function calls via PLT
175119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // GOT pointer.
175219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Subtarget->isPICStyleGOT()) {
175319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned Base = getInstrInfo()->getGlobalBaseReg(FuncInfo.MF);
175419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(TargetOpcode::COPY),
175519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman            X86::EBX).addReg(Base);
175619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
175719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
175819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Subtarget->is64Bit() && isVarArg && !Subtarget->isTargetWin64()) {
175919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Count the number of XMM registers allocated.
176019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    static const unsigned XMMArgRegs[] = {
176119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3,
176219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7
176319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    };
176419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned NumXMMRegs = CCInfo.getFirstUnallocated(XMMArgRegs, 8);
176519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(X86::MOV8ri),
176619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman            X86::AL).addImm(NumXMMRegs);
176719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
176819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
176919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Issue the call.
177019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MachineInstrBuilder MIB;
177119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (CalleeOp) {
177219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Register-indirect call.
177319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned CallOpc;
177419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Subtarget->isTargetWin64())
177519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      CallOpc = X86::WINCALL64r;
177619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    else if (Subtarget->is64Bit())
177719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      CallOpc = X86::CALL64r;
177819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    else
177919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      CallOpc = X86::CALL32r;
178019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(CallOpc))
178119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      .addReg(CalleeOp);
178219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
178319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else {
178419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Direct call.
178519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    assert(GV && "Not a direct call");
178619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned CallOpc;
178719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Subtarget->isTargetWin64())
178819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      CallOpc = X86::WINCALL64pcrel32;
178919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    else if (Subtarget->is64Bit())
179019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      CallOpc = X86::CALL64pcrel32;
179119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    else
179219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      CallOpc = X86::CALLpcrel32;
179319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
179419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // See if we need any target-specific flags on the GV operand.
179519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned char OpFlags = 0;
179619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
179719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // On ELF targets, in both X86-64 and X86-32 mode, direct calls to
179819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // external symbols most go through the PLT in PIC mode.  If the symbol
179919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // has hidden or protected visibility, or if it is static or local, then
180019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // we don't need to use the PLT - we can directly call it.
180119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Subtarget->isTargetELF() &&
180219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        TM.getRelocationModel() == Reloc::PIC_ &&
180319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        GV->hasDefaultVisibility() && !GV->hasLocalLinkage()) {
180419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      OpFlags = X86II::MO_PLT;
180519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    } else if (Subtarget->isPICStyleStubAny() &&
180619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman               (GV->isDeclaration() || GV->isWeakForLinker()) &&
180719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman               (!Subtarget->getTargetTriple().isMacOSX() ||
180819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                Subtarget->getTargetTriple().isMacOSXVersionLT(10, 5))) {
180919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // PC-relative references to external symbols should go through $stub,
181019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // unless we're building with the leopard linker or later, which
181119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // automatically synthesizes these stubs.
181219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      OpFlags = X86II::MO_DARWIN_STUB;
181319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
181419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
181519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
181619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(CallOpc));
181719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (MemIntName)
181819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      MIB.addExternalSymbol(MemIntName, OpFlags);
181919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    else
182019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      MIB.addGlobalAddress(GV, 0, OpFlags);
182119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
182219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
182319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Add an implicit use GOT pointer in EBX.
182419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Subtarget->isPICStyleGOT())
182519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MIB.addReg(X86::EBX);
182619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
182719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Subtarget->is64Bit() && isVarArg && !Subtarget->isTargetWin64())
182819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MIB.addReg(X86::AL);
182919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
183019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Add implicit physical register uses to the call.
183119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  for (unsigned i = 0, e = RegArgs.size(); i != e; ++i)
183219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MIB.addReg(RegArgs[i]);
183319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
183419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Issue CALLSEQ_END
183519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned AdjStackUp = TII.getCallFrameDestroyOpcode();
183619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned NumBytesCallee = 0;
183719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!Subtarget->is64Bit() && CS.paramHasAttr(1, Attribute::StructRet))
183819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    NumBytesCallee = 4;
183919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(AdjStackUp))
184019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    .addImm(NumBytes).addImm(NumBytesCallee);
184119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
184219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Build info for return calling conv lowering code.
184319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // FIXME: This is practically a copy-paste from TargetLowering::LowerCallTo.
184419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SmallVector<ISD::InputArg, 32> Ins;
184519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SmallVector<EVT, 4> RetTys;
184619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ComputeValueVTs(TLI, I->getType(), RetTys);
184719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  for (unsigned i = 0, e = RetTys.size(); i != e; ++i) {
184819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EVT VT = RetTys[i];
184919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EVT RegisterVT = TLI.getRegisterType(I->getParent()->getContext(), VT);
185019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned NumRegs = TLI.getNumRegisters(I->getParent()->getContext(), VT);
185119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    for (unsigned j = 0; j != NumRegs; ++j) {
185219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      ISD::InputArg MyFlags;
185319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      MyFlags.VT = RegisterVT.getSimpleVT();
185419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      MyFlags.Used = !CS.getInstruction()->use_empty();
185519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (CS.paramHasAttr(0, Attribute::SExt))
185619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        MyFlags.Flags.setSExt();
185719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (CS.paramHasAttr(0, Attribute::ZExt))
185819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        MyFlags.Flags.setZExt();
185919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (CS.paramHasAttr(0, Attribute::InReg))
186019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        MyFlags.Flags.setInReg();
186119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Ins.push_back(MyFlags);
186219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
186319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
186419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
186519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Now handle call return values.
186619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SmallVector<unsigned, 4> UsedRegs;
186719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SmallVector<CCValAssign, 16> RVLocs;
186819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CCState CCRetInfo(CC, false, *FuncInfo.MF, TM, RVLocs,
186919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman		    I->getParent()->getContext());
187019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned ResultReg = FuncInfo.CreateRegs(I->getType());
187119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  CCRetInfo.AnalyzeCallResult(Ins, RetCC_X86);
187219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  for (unsigned i = 0; i != RVLocs.size(); ++i) {
187319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EVT CopyVT = RVLocs[i].getValVT();
187419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned CopyReg = ResultReg + i;
187519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
187619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // If this is a call to a function that returns an fp value on the x87 fp
187719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // stack, but where we prefer to use the value in xmm registers, copy it
187819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // out as F80 and use a truncate to move it from fp stack reg to xmm reg.
187919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if ((RVLocs[i].getLocReg() == X86::ST0 ||
188019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman         RVLocs[i].getLocReg() == X86::ST1)) {
188119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (isScalarFPTypeInSSEReg(RVLocs[i].getValVT())) {
188219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        CopyVT = MVT::f80;
188319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        CopyReg = createResultReg(X86::RFP80RegisterClass);
188419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
188519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(X86::FpPOP_RETVAL),
188619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman              CopyReg);
188719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    } else {
188819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(TargetOpcode::COPY),
188919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman              CopyReg).addReg(RVLocs[i].getLocReg());
189019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      UsedRegs.push_back(RVLocs[i].getLocReg());
189119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
189219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
189319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (CopyVT != RVLocs[i].getValVT()) {
189419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // Round the F80 the right size, which also moves to the appropriate xmm
189519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // register. This is accomplished by storing the F80 value in memory and
189619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // then loading it back. Ewww...
189719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      EVT ResVT = RVLocs[i].getValVT();
189819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      unsigned Opc = ResVT == MVT::f32 ? X86::ST_Fp80m32 : X86::ST_Fp80m64;
189919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      unsigned MemSize = ResVT.getSizeInBits()/8;
190019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      int FI = MFI.CreateStackObject(MemSize, MemSize, false);
190119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      addFrameReference(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
190219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                TII.get(Opc)), FI)
190319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        .addReg(CopyReg);
190419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Opc = ResVT == MVT::f32 ? X86::MOVSSrm : X86::MOVSDrm;
190519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      addFrameReference(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
190619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                TII.get(Opc), ResultReg + i), FI);
190719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
190819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
190919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
191019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (RVLocs.size())
191119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    UpdateValueMap(I, ResultReg, RVLocs.size());
191219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
191319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Set all unused physreg defs as dead.
191419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  static_cast<MachineInstr *>(MIB)->setPhysRegsDeadExcept(UsedRegs, TRI);
191519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
191619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return true;
191719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
191819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
191919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
192019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool
192119bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanX86FastISel::TargetSelectInstruction(const Instruction *I)  {
192219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  switch (I->getOpcode()) {
192319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  default: break;
192419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::Load:
192519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return X86SelectLoad(I);
192619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::Store:
192719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return X86SelectStore(I);
192819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::Ret:
192919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return X86SelectRet(I);
193019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::ICmp:
193119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::FCmp:
193219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return X86SelectCmp(I);
193319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::ZExt:
193419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return X86SelectZExt(I);
193519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::Br:
193619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return X86SelectBranch(I);
193719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::Call:
193819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return X86SelectCall(I);
193919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::LShr:
194019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::AShr:
194119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::Shl:
194219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return X86SelectShift(I);
194319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::Select:
194419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return X86SelectSelect(I);
194519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::Trunc:
194619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return X86SelectTrunc(I);
194719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::FPExt:
194819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return X86SelectFPExt(I);
194919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::FPTrunc:
195019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return X86SelectFPTrunc(I);
195119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::IntToPtr: // Deliberate fall-through.
195219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case Instruction::PtrToInt: {
195319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EVT SrcVT = TLI.getValueType(I->getOperand(0)->getType());
195419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EVT DstVT = TLI.getValueType(I->getType());
195519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (DstVT.bitsGT(SrcVT))
195619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return X86SelectZExt(I);
195719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (DstVT.bitsLT(SrcVT))
195819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return X86SelectTrunc(I);
195919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    unsigned Reg = getRegForValue(I->getOperand(0));
196019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (Reg == 0) return false;
196119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    UpdateValueMap(I, Reg);
196219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return true;
196319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
196419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
196519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
196619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return false;
196719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
196819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
196919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanunsigned X86FastISel::TargetMaterializeConstant(const Constant *C) {
197019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MVT VT;
197119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!isTypeLegal(C->getType(), VT))
197219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
197319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
197419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Get opcode and regclass of the output for the given load instruction.
197519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Opc = 0;
197619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const TargetRegisterClass *RC = NULL;
197719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  switch (VT.SimpleTy) {
197819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  default: return false;
197919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i8:
198019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Opc = X86::MOV8rm;
198119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    RC  = X86::GR8RegisterClass;
198219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
198319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i16:
198419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Opc = X86::MOV16rm;
198519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    RC  = X86::GR16RegisterClass;
198619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
198719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i32:
198819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Opc = X86::MOV32rm;
198919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    RC  = X86::GR32RegisterClass;
199019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
199119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::i64:
199219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Must be in x86-64 mode.
199319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Opc = X86::MOV64rm;
199419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    RC  = X86::GR64RegisterClass;
199519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
199619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::f32:
199719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (X86ScalarSSEf32) {
199819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Opc = Subtarget->hasAVX() ? X86::VMOVSSrm : X86::MOVSSrm;
199919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      RC  = X86::FR32RegisterClass;
200019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    } else {
200119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Opc = X86::LD_Fp32m;
200219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      RC  = X86::RFP32RegisterClass;
200319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
200419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
200519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::f64:
200619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (X86ScalarSSEf64) {
200719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Opc = Subtarget->hasAVX() ? X86::VMOVSDrm : X86::MOVSDrm;
200819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      RC  = X86::FR64RegisterClass;
200919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    } else {
201019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Opc = X86::LD_Fp64m;
201119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      RC  = X86::RFP64RegisterClass;
201219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
201319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
201419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MVT::f80:
201519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // No f80 support yet.
201619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
201719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
201819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
201919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Materialize addresses with LEA instructions.
202019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (isa<GlobalValue>(C)) {
202119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    X86AddressMode AM;
202219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (X86SelectAddress(C, AM)) {
202319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // If the expression is just a basereg, then we're done, otherwise we need
202419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // to emit an LEA.
202519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (AM.BaseType == X86AddressMode::RegBase &&
202619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman          AM.IndexReg == 0 && AM.Disp == 0 && AM.GV == 0)
202719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        return AM.Base.Reg;
202819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
202919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Opc = TLI.getPointerTy() == MVT::i32 ? X86::LEA32r : X86::LEA64r;
203019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      unsigned ResultReg = createResultReg(RC);
203119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      addFullAddress(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
203219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                             TII.get(Opc), ResultReg), AM);
203319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return ResultReg;
203419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
203519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return 0;
203619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
203719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
203819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // MachineConstantPool wants an explicit alignment.
203919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Align = TD.getPrefTypeAlignment(C->getType());
204019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Align == 0) {
204119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Alignment of vector types.  FIXME!
204219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    Align = TD.getTypeAllocSize(C->getType());
204319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
204419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
204519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // x86-32 PIC requires a PIC base register for constant pools.
204619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned PICBase = 0;
204719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned char OpFlag = 0;
204819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Subtarget->isPICStyleStubPIC()) { // Not dynamic-no-pic
204919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    OpFlag = X86II::MO_PIC_BASE_OFFSET;
205019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    PICBase = getInstrInfo()->getGlobalBaseReg(FuncInfo.MF);
205119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else if (Subtarget->isPICStyleGOT()) {
205219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    OpFlag = X86II::MO_GOTOFF;
205319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    PICBase = getInstrInfo()->getGlobalBaseReg(FuncInfo.MF);
205419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else if (Subtarget->isPICStyleRIPRel() &&
205519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman             TM.getCodeModel() == CodeModel::Small) {
205619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    PICBase = X86::RIP;
205719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
205819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
205919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Create the load from the constant pool.
206019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned MCPOffset = MCP.getConstantPoolIndex(C, Align);
206119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned ResultReg = createResultReg(RC);
206219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  addConstantPoolReference(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
206319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                   TII.get(Opc), ResultReg),
206419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                           MCPOffset, PICBase, OpFlag);
206519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
206619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return ResultReg;
206719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
206819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
206919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanunsigned X86FastISel::TargetMaterializeAlloca(const AllocaInst *C) {
207019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Fail on dynamic allocas. At this point, getRegForValue has already
207119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // checked its CSE maps, so if we're here trying to handle a dynamic
207219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // alloca, we're not going to succeed. X86SelectAddress has a
207319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // check for dynamic allocas, because it's called directly from
207419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // various places, but TargetMaterializeAlloca also needs a check
207519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // in order to avoid recursion between getRegForValue,
207619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // X86SelectAddrss, and TargetMaterializeAlloca.
207719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!FuncInfo.StaticAllocaMap.count(C))
207819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return 0;
207919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
208019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  X86AddressMode AM;
208119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!X86SelectAddress(C, AM))
208219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return 0;
208319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Opc = Subtarget->is64Bit() ? X86::LEA64r : X86::LEA32r;
208419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  TargetRegisterClass* RC = TLI.getRegClassFor(TLI.getPointerTy());
208519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned ResultReg = createResultReg(RC);
208619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  addFullAddress(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
208719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         TII.get(Opc), ResultReg), AM);
208819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return ResultReg;
208919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
209019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
209119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanunsigned X86FastISel::TargetMaterializeFloatZero(const ConstantFP *CF) {
209219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MVT VT;
209319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!isTypeLegal(CF->getType(), VT))
209419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
209519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
209619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Get opcode and regclass for the given zero.
209719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Opc = 0;
209819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const TargetRegisterClass *RC = NULL;
209919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  switch (VT.SimpleTy) {
210019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    default: return false;
210119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case MVT::f32:
210219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (X86ScalarSSEf32) {
210319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        Opc = X86::FsFLD0SS;
210419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        RC  = X86::FR32RegisterClass;
210519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      } else {
210619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        Opc = X86::LD_Fp032;
210719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        RC  = X86::RFP32RegisterClass;
210819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
210919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      break;
211019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case MVT::f64:
211119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      if (X86ScalarSSEf64) {
211219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        Opc = X86::FsFLD0SD;
211319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        RC  = X86::FR64RegisterClass;
211419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      } else {
211519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        Opc = X86::LD_Fp064;
211619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        RC  = X86::RFP64RegisterClass;
211719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      }
211819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      break;
211919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case MVT::f80:
212019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      // No f80 support yet.
212119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return false;
212219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
212319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
212419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned ResultReg = createResultReg(RC);
212519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(Opc), ResultReg);
212619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return ResultReg;
212719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
212819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
212919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
213019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// TryToFoldLoad - The specified machine instr operand is a vreg, and that
213119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// vreg is being provided by the specified load instruction.  If possible,
213219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// try to fold the load as an operand to the instruction, returning true if
213319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// possible.
213419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool X86FastISel::TryToFoldLoad(MachineInstr *MI, unsigned OpNo,
213519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                const LoadInst *LI) {
213619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  X86AddressMode AM;
213719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (!X86SelectAddress(LI->getOperand(0), AM))
213819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return false;
213919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
214019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  X86InstrInfo &XII = (X86InstrInfo&)TII;
214119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
214219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Size = TD.getTypeAllocSize(LI->getType());
214319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Alignment = LI->getAlignment();
214419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
214519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  SmallVector<MachineOperand, 8> AddrOps;
214619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  AM.getFullAddress(AddrOps);
214719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
214819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MachineInstr *Result =
214919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    XII.foldMemoryOperandImpl(*FuncInfo.MF, MI, OpNo, AddrOps, Size, Alignment);
215019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (Result == 0) return false;
215119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
215219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  FuncInfo.MBB->insert(FuncInfo.InsertPt, Result);
215319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MI->eraseFromParent();
215419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return true;
215519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
215619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
215719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
215819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace llvm {
215919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  llvm::FastISel *X86::createFastISel(FunctionLoweringInfo &funcInfo) {
216019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return new X86FastISel(funcInfo);
216119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
216219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
2163