Don't dag combine floating point select to max and min intrinsics. Those
[oota-llvm.git] / lib / Target / X86 / X86ISelLowering.cpp
1 //===-- X86ISelLowering.cpp - X86 DAG Lowering Implementation -------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by Chris Lattner and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines the interfaces that X86 uses to lower LLVM code into a
11 // selection DAG.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "X86.h"
16 #include "X86InstrBuilder.h"
17 #include "X86ISelLowering.h"
18 #include "X86MachineFunctionInfo.h"
19 #include "X86TargetMachine.h"
20 #include "llvm/CallingConv.h"
21 #include "llvm/Constants.h"
22 #include "llvm/DerivedTypes.h"
23 #include "llvm/Function.h"
24 #include "llvm/Intrinsics.h"
25 #include "llvm/ADT/VectorExtras.h"
26 #include "llvm/Analysis/ScalarEvolutionExpressions.h"
27 #include "llvm/CodeGen/MachineFrameInfo.h"
28 #include "llvm/CodeGen/MachineFunction.h"
29 #include "llvm/CodeGen/MachineInstrBuilder.h"
30 #include "llvm/CodeGen/SelectionDAG.h"
31 #include "llvm/CodeGen/SSARegMap.h"
32 #include "llvm/Support/MathExtras.h"
33 #include "llvm/Target/TargetOptions.h"
34 #include "llvm/Support/CommandLine.h"
35 #include "llvm/ADT/StringExtras.h"
36 using namespace llvm;
37
38 // FIXME: temporary.
39 static cl::opt<bool> EnableFastCC("enable-x86-fastcc", cl::Hidden,
40                                   cl::desc("Enable fastcc on X86"));
41 X86TargetLowering::X86TargetLowering(TargetMachine &TM)
42   : TargetLowering(TM) {
43   Subtarget = &TM.getSubtarget<X86Subtarget>();
44   X86ScalarSSE = Subtarget->hasSSE2();
45   X86StackPtr = Subtarget->is64Bit() ? X86::RSP : X86::ESP;
46
47   // Set up the TargetLowering object.
48
49   // X86 is weird, it always uses i8 for shift amounts and setcc results.
50   setShiftAmountType(MVT::i8);
51   setSetCCResultType(MVT::i8);
52   setSetCCResultContents(ZeroOrOneSetCCResult);
53   setSchedulingPreference(SchedulingForRegPressure);
54   setShiftAmountFlavor(Mask);   // shl X, 32 == shl X, 0
55   setStackPointerRegisterToSaveRestore(X86StackPtr);
56
57   if (!Subtarget->isTargetDarwin())
58     // Darwin should use _setjmp/_longjmp instead of setjmp/longjmp.
59     setUseUnderscoreSetJmpLongJmp(true);
60     
61   // Add legal addressing mode scale values.
62   addLegalAddressScale(8);
63   addLegalAddressScale(4);
64   addLegalAddressScale(2);
65   // Enter the ones which require both scale + index last. These are more
66   // expensive.
67   addLegalAddressScale(9);
68   addLegalAddressScale(5);
69   addLegalAddressScale(3);
70   
71   // Set up the register classes.
72   addRegisterClass(MVT::i8, X86::GR8RegisterClass);
73   addRegisterClass(MVT::i16, X86::GR16RegisterClass);
74   addRegisterClass(MVT::i32, X86::GR32RegisterClass);
75   if (Subtarget->is64Bit())
76     addRegisterClass(MVT::i64, X86::GR64RegisterClass);
77
78   setLoadXAction(ISD::SEXTLOAD, MVT::i1, Expand);
79
80   // Promote all UINT_TO_FP to larger SINT_TO_FP's, as X86 doesn't have this
81   // operation.
82   setOperationAction(ISD::UINT_TO_FP       , MVT::i1   , Promote);
83   setOperationAction(ISD::UINT_TO_FP       , MVT::i8   , Promote);
84   setOperationAction(ISD::UINT_TO_FP       , MVT::i16  , Promote);
85
86   if (Subtarget->is64Bit()) {
87     setOperationAction(ISD::UINT_TO_FP     , MVT::i64  , Expand);
88     setOperationAction(ISD::UINT_TO_FP     , MVT::i32  , Promote);
89   } else {
90     if (X86ScalarSSE)
91       // If SSE i64 SINT_TO_FP is not available, expand i32 UINT_TO_FP.
92       setOperationAction(ISD::UINT_TO_FP   , MVT::i32  , Expand);
93     else
94       setOperationAction(ISD::UINT_TO_FP   , MVT::i32  , Promote);
95   }
96
97   // Promote i1/i8 SINT_TO_FP to larger SINT_TO_FP's, as X86 doesn't have
98   // this operation.
99   setOperationAction(ISD::SINT_TO_FP       , MVT::i1   , Promote);
100   setOperationAction(ISD::SINT_TO_FP       , MVT::i8   , Promote);
101   // SSE has no i16 to fp conversion, only i32
102   if (X86ScalarSSE)
103     setOperationAction(ISD::SINT_TO_FP     , MVT::i16  , Promote);
104   else {
105     setOperationAction(ISD::SINT_TO_FP     , MVT::i16  , Custom);
106     setOperationAction(ISD::SINT_TO_FP     , MVT::i32  , Custom);
107   }
108
109   if (!Subtarget->is64Bit()) {
110     // Custom lower SINT_TO_FP and FP_TO_SINT from/to i64 in 32-bit mode.
111     setOperationAction(ISD::SINT_TO_FP     , MVT::i64  , Custom);
112     setOperationAction(ISD::FP_TO_SINT     , MVT::i64  , Custom);
113   }
114
115   // Promote i1/i8 FP_TO_SINT to larger FP_TO_SINTS's, as X86 doesn't have
116   // this operation.
117   setOperationAction(ISD::FP_TO_SINT       , MVT::i1   , Promote);
118   setOperationAction(ISD::FP_TO_SINT       , MVT::i8   , Promote);
119
120   if (X86ScalarSSE) {
121     setOperationAction(ISD::FP_TO_SINT     , MVT::i16  , Promote);
122   } else {
123     setOperationAction(ISD::FP_TO_SINT     , MVT::i16  , Custom);
124     setOperationAction(ISD::FP_TO_SINT     , MVT::i32  , Custom);
125   }
126
127   // Handle FP_TO_UINT by promoting the destination to a larger signed
128   // conversion.
129   setOperationAction(ISD::FP_TO_UINT       , MVT::i1   , Promote);
130   setOperationAction(ISD::FP_TO_UINT       , MVT::i8   , Promote);
131   setOperationAction(ISD::FP_TO_UINT       , MVT::i16  , Promote);
132
133   if (Subtarget->is64Bit()) {
134     setOperationAction(ISD::FP_TO_UINT     , MVT::i64  , Expand);
135     setOperationAction(ISD::FP_TO_UINT     , MVT::i32  , Promote);
136   } else {
137     if (X86ScalarSSE && !Subtarget->hasSSE3())
138       // Expand FP_TO_UINT into a select.
139       // FIXME: We would like to use a Custom expander here eventually to do
140       // the optimal thing for SSE vs. the default expansion in the legalizer.
141       setOperationAction(ISD::FP_TO_UINT   , MVT::i32  , Expand);
142     else
143       // With SSE3 we can use fisttpll to convert to a signed i64.
144       setOperationAction(ISD::FP_TO_UINT   , MVT::i32  , Promote);
145   }
146
147   setOperationAction(ISD::BIT_CONVERT      , MVT::f32  , Expand);
148   setOperationAction(ISD::BIT_CONVERT      , MVT::i32  , Expand);
149
150   setOperationAction(ISD::BR_JT            , MVT::Other, Expand);
151   setOperationAction(ISD::BRCOND           , MVT::Other, Custom);
152   setOperationAction(ISD::BR_CC            , MVT::Other, Expand);
153   setOperationAction(ISD::SELECT_CC        , MVT::Other, Expand);
154   setOperationAction(ISD::MEMMOVE          , MVT::Other, Expand);
155   if (Subtarget->is64Bit())
156     setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i32, Expand);
157   setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i16  , Expand);
158   setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i8   , Expand);
159   setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1   , Expand);
160   setOperationAction(ISD::FP_ROUND_INREG   , MVT::f32  , Expand);
161   setOperationAction(ISD::FREM             , MVT::f64  , Expand);
162
163   setOperationAction(ISD::CTPOP            , MVT::i8   , Expand);
164   setOperationAction(ISD::CTTZ             , MVT::i8   , Expand);
165   setOperationAction(ISD::CTLZ             , MVT::i8   , Expand);
166   setOperationAction(ISD::CTPOP            , MVT::i16  , Expand);
167   setOperationAction(ISD::CTTZ             , MVT::i16  , Expand);
168   setOperationAction(ISD::CTLZ             , MVT::i16  , Expand);
169   setOperationAction(ISD::CTPOP            , MVT::i32  , Expand);
170   setOperationAction(ISD::CTTZ             , MVT::i32  , Expand);
171   setOperationAction(ISD::CTLZ             , MVT::i32  , Expand);
172   if (Subtarget->is64Bit()) {
173     setOperationAction(ISD::CTPOP          , MVT::i64  , Expand);
174     setOperationAction(ISD::CTTZ           , MVT::i64  , Expand);
175     setOperationAction(ISD::CTLZ           , MVT::i64  , Expand);
176   }
177
178   setOperationAction(ISD::READCYCLECOUNTER , MVT::i64  , Custom);
179   setOperationAction(ISD::BSWAP            , MVT::i16  , Expand);
180
181   // These should be promoted to a larger select which is supported.
182   setOperationAction(ISD::SELECT           , MVT::i1   , Promote);
183   setOperationAction(ISD::SELECT           , MVT::i8   , Promote);
184   // X86 wants to expand cmov itself.
185   setOperationAction(ISD::SELECT          , MVT::i16  , Custom);
186   setOperationAction(ISD::SELECT          , MVT::i32  , Custom);
187   setOperationAction(ISD::SELECT          , MVT::f32  , Custom);
188   setOperationAction(ISD::SELECT          , MVT::f64  , Custom);
189   setOperationAction(ISD::SETCC           , MVT::i8   , Custom);
190   setOperationAction(ISD::SETCC           , MVT::i16  , Custom);
191   setOperationAction(ISD::SETCC           , MVT::i32  , Custom);
192   setOperationAction(ISD::SETCC           , MVT::f32  , Custom);
193   setOperationAction(ISD::SETCC           , MVT::f64  , Custom);
194   if (Subtarget->is64Bit()) {
195     setOperationAction(ISD::SELECT        , MVT::i64  , Custom);
196     setOperationAction(ISD::SETCC         , MVT::i64  , Custom);
197   }
198   // X86 ret instruction may pop stack.
199   setOperationAction(ISD::RET             , MVT::Other, Custom);
200   // Darwin ABI issue.
201   setOperationAction(ISD::ConstantPool    , MVT::i32  , Custom);
202   setOperationAction(ISD::JumpTable       , MVT::i32  , Custom);
203   setOperationAction(ISD::GlobalAddress   , MVT::i32  , Custom);
204   setOperationAction(ISD::ExternalSymbol  , MVT::i32  , Custom);
205   if (Subtarget->is64Bit()) {
206     setOperationAction(ISD::ConstantPool  , MVT::i64  , Custom);
207     setOperationAction(ISD::JumpTable     , MVT::i64  , Custom);
208     setOperationAction(ISD::GlobalAddress , MVT::i64  , Custom);
209     setOperationAction(ISD::ExternalSymbol, MVT::i64  , Custom);
210   }
211   // 64-bit addm sub, shl, sra, srl (iff 32-bit x86)
212   setOperationAction(ISD::SHL_PARTS       , MVT::i32  , Custom);
213   setOperationAction(ISD::SRA_PARTS       , MVT::i32  , Custom);
214   setOperationAction(ISD::SRL_PARTS       , MVT::i32  , Custom);
215   // X86 wants to expand memset / memcpy itself.
216   setOperationAction(ISD::MEMSET          , MVT::Other, Custom);
217   setOperationAction(ISD::MEMCPY          , MVT::Other, Custom);
218
219   // We don't have line number support yet.
220   setOperationAction(ISD::LOCATION, MVT::Other, Expand);
221   setOperationAction(ISD::DEBUG_LOC, MVT::Other, Expand);
222   // FIXME - use subtarget debug flags
223   if (!Subtarget->isTargetDarwin() &&
224       !Subtarget->isTargetELF() &&
225       !Subtarget->isTargetCygwin())
226     setOperationAction(ISD::DEBUG_LABEL, MVT::Other, Expand);
227
228   // VASTART needs to be custom lowered to use the VarArgsFrameIndex
229   setOperationAction(ISD::VASTART           , MVT::Other, Custom);
230   
231   // Use the default implementation.
232   setOperationAction(ISD::VAARG             , MVT::Other, Expand);
233   setOperationAction(ISD::VACOPY            , MVT::Other, Expand);
234   setOperationAction(ISD::VAEND             , MVT::Other, Expand);
235   setOperationAction(ISD::STACKSAVE,          MVT::Other, Expand); 
236   setOperationAction(ISD::STACKRESTORE,       MVT::Other, Expand);
237   if (Subtarget->is64Bit())
238     setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i64, Expand);
239   setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i32  , Expand);
240
241   setOperationAction(ISD::FCOPYSIGN, MVT::f64, Expand);
242   setOperationAction(ISD::FCOPYSIGN, MVT::f32, Expand);
243
244   if (X86ScalarSSE) {
245     // Set up the FP register classes.
246     addRegisterClass(MVT::f32, X86::FR32RegisterClass);
247     addRegisterClass(MVT::f64, X86::FR64RegisterClass);
248
249     // Use ANDPD to simulate FABS.
250     setOperationAction(ISD::FABS , MVT::f64, Custom);
251     setOperationAction(ISD::FABS , MVT::f32, Custom);
252
253     // Use XORP to simulate FNEG.
254     setOperationAction(ISD::FNEG , MVT::f64, Custom);
255     setOperationAction(ISD::FNEG , MVT::f32, Custom);
256
257     // We don't support sin/cos/fmod
258     setOperationAction(ISD::FSIN , MVT::f64, Expand);
259     setOperationAction(ISD::FCOS , MVT::f64, Expand);
260     setOperationAction(ISD::FREM , MVT::f64, Expand);
261     setOperationAction(ISD::FSIN , MVT::f32, Expand);
262     setOperationAction(ISD::FCOS , MVT::f32, Expand);
263     setOperationAction(ISD::FREM , MVT::f32, Expand);
264
265     // Expand FP immediates into loads from the stack, except for the special
266     // cases we handle.
267     setOperationAction(ISD::ConstantFP, MVT::f64, Expand);
268     setOperationAction(ISD::ConstantFP, MVT::f32, Expand);
269     addLegalFPImmediate(+0.0); // xorps / xorpd
270   } else {
271     // Set up the FP register classes.
272     addRegisterClass(MVT::f64, X86::RFPRegisterClass);
273     
274     setOperationAction(ISD::UNDEF, MVT::f64, Expand);
275     
276     if (!UnsafeFPMath) {
277       setOperationAction(ISD::FSIN           , MVT::f64  , Expand);
278       setOperationAction(ISD::FCOS           , MVT::f64  , Expand);
279     }
280
281     setOperationAction(ISD::ConstantFP, MVT::f64, Expand);
282     addLegalFPImmediate(+0.0); // FLD0
283     addLegalFPImmediate(+1.0); // FLD1
284     addLegalFPImmediate(-0.0); // FLD0/FCHS
285     addLegalFPImmediate(-1.0); // FLD1/FCHS
286   }
287
288   // First set operation action for all vector types to expand. Then we
289   // will selectively turn on ones that can be effectively codegen'd.
290   for (unsigned VT = (unsigned)MVT::Vector + 1;
291        VT != (unsigned)MVT::LAST_VALUETYPE; VT++) {
292     setOperationAction(ISD::ADD , (MVT::ValueType)VT, Expand);
293     setOperationAction(ISD::SUB , (MVT::ValueType)VT, Expand);
294     setOperationAction(ISD::FADD, (MVT::ValueType)VT, Expand);
295     setOperationAction(ISD::FSUB, (MVT::ValueType)VT, Expand);
296     setOperationAction(ISD::MUL , (MVT::ValueType)VT, Expand);
297     setOperationAction(ISD::FMUL, (MVT::ValueType)VT, Expand);
298     setOperationAction(ISD::SDIV, (MVT::ValueType)VT, Expand);
299     setOperationAction(ISD::UDIV, (MVT::ValueType)VT, Expand);
300     setOperationAction(ISD::FDIV, (MVT::ValueType)VT, Expand);
301     setOperationAction(ISD::SREM, (MVT::ValueType)VT, Expand);
302     setOperationAction(ISD::UREM, (MVT::ValueType)VT, Expand);
303     setOperationAction(ISD::LOAD, (MVT::ValueType)VT, Expand);
304     setOperationAction(ISD::VECTOR_SHUFFLE,     (MVT::ValueType)VT, Expand);
305     setOperationAction(ISD::EXTRACT_VECTOR_ELT, (MVT::ValueType)VT, Expand);
306     setOperationAction(ISD::INSERT_VECTOR_ELT,  (MVT::ValueType)VT, Expand);
307   }
308
309   if (Subtarget->hasMMX()) {
310     addRegisterClass(MVT::v8i8,  X86::VR64RegisterClass);
311     addRegisterClass(MVT::v4i16, X86::VR64RegisterClass);
312     addRegisterClass(MVT::v2i32, X86::VR64RegisterClass);
313
314     // FIXME: add MMX packed arithmetics
315     setOperationAction(ISD::BUILD_VECTOR,     MVT::v8i8,  Expand);
316     setOperationAction(ISD::BUILD_VECTOR,     MVT::v4i16, Expand);
317     setOperationAction(ISD::BUILD_VECTOR,     MVT::v2i32, Expand);
318   }
319
320   if (Subtarget->hasSSE1()) {
321     addRegisterClass(MVT::v4f32, X86::VR128RegisterClass);
322
323     setOperationAction(ISD::FADD,               MVT::v4f32, Legal);
324     setOperationAction(ISD::FSUB,               MVT::v4f32, Legal);
325     setOperationAction(ISD::FMUL,               MVT::v4f32, Legal);
326     setOperationAction(ISD::FDIV,               MVT::v4f32, Legal);
327     setOperationAction(ISD::LOAD,               MVT::v4f32, Legal);
328     setOperationAction(ISD::BUILD_VECTOR,       MVT::v4f32, Custom);
329     setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v4f32, Custom);
330     setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v4f32, Custom);
331     setOperationAction(ISD::SELECT,             MVT::v4f32, Custom);
332   }
333
334   if (Subtarget->hasSSE2()) {
335     addRegisterClass(MVT::v2f64, X86::VR128RegisterClass);
336     addRegisterClass(MVT::v16i8, X86::VR128RegisterClass);
337     addRegisterClass(MVT::v8i16, X86::VR128RegisterClass);
338     addRegisterClass(MVT::v4i32, X86::VR128RegisterClass);
339     addRegisterClass(MVT::v2i64, X86::VR128RegisterClass);
340
341     setOperationAction(ISD::ADD,                MVT::v16i8, Legal);
342     setOperationAction(ISD::ADD,                MVT::v8i16, Legal);
343     setOperationAction(ISD::ADD,                MVT::v4i32, Legal);
344     setOperationAction(ISD::SUB,                MVT::v16i8, Legal);
345     setOperationAction(ISD::SUB,                MVT::v8i16, Legal);
346     setOperationAction(ISD::SUB,                MVT::v4i32, Legal);
347     setOperationAction(ISD::MUL,                MVT::v8i16, Legal);
348     setOperationAction(ISD::FADD,               MVT::v2f64, Legal);
349     setOperationAction(ISD::FSUB,               MVT::v2f64, Legal);
350     setOperationAction(ISD::FMUL,               MVT::v2f64, Legal);
351     setOperationAction(ISD::FDIV,               MVT::v2f64, Legal);
352
353     setOperationAction(ISD::SCALAR_TO_VECTOR,   MVT::v16i8, Custom);
354     setOperationAction(ISD::SCALAR_TO_VECTOR,   MVT::v8i16, Custom);
355     setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v8i16, Custom);
356     setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v4i32, Custom);
357     // Implement v4f32 insert_vector_elt in terms of SSE2 v8i16 ones.
358     setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v4f32, Custom);
359
360     // Custom lower build_vector, vector_shuffle, and extract_vector_elt.
361     for (unsigned VT = (unsigned)MVT::v16i8; VT != (unsigned)MVT::v2i64; VT++) {
362       setOperationAction(ISD::BUILD_VECTOR,        (MVT::ValueType)VT, Custom);
363       setOperationAction(ISD::VECTOR_SHUFFLE,      (MVT::ValueType)VT, Custom);
364       setOperationAction(ISD::EXTRACT_VECTOR_ELT,  (MVT::ValueType)VT, Custom);
365     }
366     setOperationAction(ISD::BUILD_VECTOR,       MVT::v2f64, Custom);
367     setOperationAction(ISD::BUILD_VECTOR,       MVT::v2i64, Custom);
368     setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v2f64, Custom);
369     setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v2i64, Custom);
370     setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v2f64, Custom);
371     setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v2i64, Custom);
372
373     // Promote v16i8, v8i16, v4i32 load, select, and, or, xor to v2i64. 
374     for (unsigned VT = (unsigned)MVT::v16i8; VT != (unsigned)MVT::v2i64; VT++) {
375       setOperationAction(ISD::AND,    (MVT::ValueType)VT, Promote);
376       AddPromotedToType (ISD::AND,    (MVT::ValueType)VT, MVT::v2i64);
377       setOperationAction(ISD::OR,     (MVT::ValueType)VT, Promote);
378       AddPromotedToType (ISD::OR,     (MVT::ValueType)VT, MVT::v2i64);
379       setOperationAction(ISD::XOR,    (MVT::ValueType)VT, Promote);
380       AddPromotedToType (ISD::XOR,    (MVT::ValueType)VT, MVT::v2i64);
381       setOperationAction(ISD::LOAD,   (MVT::ValueType)VT, Promote);
382       AddPromotedToType (ISD::LOAD,   (MVT::ValueType)VT, MVT::v2i64);
383       setOperationAction(ISD::SELECT, (MVT::ValueType)VT, Promote);
384       AddPromotedToType (ISD::SELECT, (MVT::ValueType)VT, MVT::v2i64);
385     }
386
387     // Custom lower v2i64 and v2f64 selects.
388     setOperationAction(ISD::LOAD,               MVT::v2f64, Legal);
389     setOperationAction(ISD::LOAD,               MVT::v2i64, Legal);
390     setOperationAction(ISD::SELECT,             MVT::v2f64, Custom);
391     setOperationAction(ISD::SELECT,             MVT::v2i64, Custom);
392   }
393
394   // We want to custom lower some of our intrinsics.
395   setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::Other, Custom);
396
397   // We have target-specific dag combine patterns for the following nodes:
398   setTargetDAGCombine(ISD::VECTOR_SHUFFLE);
399   setTargetDAGCombine(ISD::SELECT);
400
401   computeRegisterProperties();
402
403   // FIXME: These should be based on subtarget info. Plus, the values should
404   // be smaller when we are in optimizing for size mode.
405   maxStoresPerMemset = 16; // For %llvm.memset -> sequence of stores
406   maxStoresPerMemcpy = 16; // For %llvm.memcpy -> sequence of stores
407   maxStoresPerMemmove = 16; // For %llvm.memmove -> sequence of stores
408   allowUnalignedMemoryAccesses = true; // x86 supports it!
409 }
410
411 //===----------------------------------------------------------------------===//
412 //                    C Calling Convention implementation
413 //===----------------------------------------------------------------------===//
414
415 /// AddLiveIn - This helper function adds the specified physical register to the
416 /// MachineFunction as a live in value.  It also creates a corresponding virtual
417 /// register for it.
418 static unsigned AddLiveIn(MachineFunction &MF, unsigned PReg,
419                           TargetRegisterClass *RC) {
420   assert(RC->contains(PReg) && "Not the correct regclass!");
421   unsigned VReg = MF.getSSARegMap()->createVirtualRegister(RC);
422   MF.addLiveIn(PReg, VReg);
423   return VReg;
424 }
425
426 /// HowToPassCCCArgument - Returns how an formal argument of the specified type
427 /// should be passed. If it is through stack, returns the size of the stack
428 /// slot; if it is through XMM register, returns the number of XMM registers
429 /// are needed.
430 static void
431 HowToPassCCCArgument(MVT::ValueType ObjectVT, unsigned NumXMMRegs,
432                      unsigned &ObjSize, unsigned &ObjXMMRegs) {
433   ObjXMMRegs = 0;
434
435   switch (ObjectVT) {
436   default: assert(0 && "Unhandled argument type!");
437   case MVT::i8:  ObjSize = 1; break;
438   case MVT::i16: ObjSize = 2; break;
439   case MVT::i32: ObjSize = 4; break;
440   case MVT::i64: ObjSize = 8; break;
441   case MVT::f32: ObjSize = 4; break;
442   case MVT::f64: ObjSize = 8; break;
443   case MVT::v16i8:
444   case MVT::v8i16:
445   case MVT::v4i32:
446   case MVT::v2i64:
447   case MVT::v4f32:
448   case MVT::v2f64:
449     if (NumXMMRegs < 4)
450       ObjXMMRegs = 1;
451     else
452       ObjSize = 16;
453     break;
454   }
455 }
456
457 SDOperand X86TargetLowering::LowerCCCArguments(SDOperand Op, SelectionDAG &DAG) {
458   unsigned NumArgs = Op.Val->getNumValues() - 1;
459   MachineFunction &MF = DAG.getMachineFunction();
460   MachineFrameInfo *MFI = MF.getFrameInfo();
461   SDOperand Root = Op.getOperand(0);
462   std::vector<SDOperand> ArgValues;
463
464   // Add DAG nodes to load the arguments...  On entry to a function on the X86,
465   // the stack frame looks like this:
466   //
467   // [ESP] -- return address
468   // [ESP + 4] -- first argument (leftmost lexically)
469   // [ESP + 8] -- second argument, if first argument is <= 4 bytes in size
470   //    ...
471   //
472   unsigned ArgOffset = 0;   // Frame mechanisms handle retaddr slot
473   unsigned NumXMMRegs = 0;  // XMM regs used for parameter passing.
474   static const unsigned XMMArgRegs[] = {
475     X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3
476   };
477   for (unsigned i = 0; i < NumArgs; ++i) {
478     MVT::ValueType ObjectVT = Op.getValue(i).getValueType();
479     unsigned ArgIncrement = 4;
480     unsigned ObjSize = 0;
481     unsigned ObjXMMRegs = 0;
482     HowToPassCCCArgument(ObjectVT, NumXMMRegs, ObjSize, ObjXMMRegs);
483     if (ObjSize > 4)
484       ArgIncrement = ObjSize;
485
486     SDOperand ArgValue;
487     if (ObjXMMRegs) {
488       // Passed in a XMM register.
489       unsigned Reg = AddLiveIn(MF, XMMArgRegs[NumXMMRegs],
490                                X86::VR128RegisterClass);
491       ArgValue= DAG.getCopyFromReg(Root, Reg, ObjectVT);
492       ArgValues.push_back(ArgValue);
493       NumXMMRegs += ObjXMMRegs;
494     } else {
495       // XMM arguments have to be aligned on 16-byte boundary.
496       if (ObjSize == 16)
497         ArgOffset = ((ArgOffset + 15) / 16) * 16;
498       // Create the frame index object for this incoming parameter...
499       int FI = MFI->CreateFixedObject(ObjSize, ArgOffset);
500       SDOperand FIN = DAG.getFrameIndex(FI, getPointerTy());
501       ArgValue = DAG.getLoad(Op.Val->getValueType(i), Root, FIN, NULL, 0);
502       ArgValues.push_back(ArgValue);
503       ArgOffset += ArgIncrement;   // Move on to the next argument...
504     }
505   }
506
507   ArgValues.push_back(Root);
508
509   // If the function takes variable number of arguments, make a frame index for
510   // the start of the first vararg value... for expansion of llvm.va_start.
511   bool isVarArg = cast<ConstantSDNode>(Op.getOperand(2))->getValue() != 0;
512   if (isVarArg)
513     VarArgsFrameIndex = MFI->CreateFixedObject(1, ArgOffset);
514   RegSaveFrameIndex = 0xAAAAAAA;  // X86-64 only.
515   ReturnAddrIndex = 0;            // No return address slot generated yet.
516   BytesToPopOnReturn = 0;         // Callee pops nothing.
517   BytesCallerReserves = ArgOffset;
518
519   // If this is a struct return on, the callee pops the hidden struct
520   // pointer. This is common for Darwin/X86, Linux & Mingw32 targets.
521   if (MF.getFunction()->getCallingConv() == CallingConv::CSRet)
522     BytesToPopOnReturn = 4;
523
524   // Return the new list of results.
525   std::vector<MVT::ValueType> RetVTs(Op.Val->value_begin(),
526                                      Op.Val->value_end());
527   return DAG.getNode(ISD::MERGE_VALUES, RetVTs, &ArgValues[0],ArgValues.size());
528 }
529
530
531 SDOperand X86TargetLowering::LowerCCCCallTo(SDOperand Op, SelectionDAG &DAG) {
532   SDOperand Chain     = Op.getOperand(0);
533   unsigned CallingConv= cast<ConstantSDNode>(Op.getOperand(1))->getValue();
534   bool isTailCall     = cast<ConstantSDNode>(Op.getOperand(3))->getValue() != 0;
535   SDOperand Callee    = Op.getOperand(4);
536   MVT::ValueType RetVT= Op.Val->getValueType(0);
537   unsigned NumOps     = (Op.getNumOperands() - 5) / 2;
538
539   // Keep track of the number of XMM regs passed so far.
540   unsigned NumXMMRegs = 0;
541   static const unsigned XMMArgRegs[] = {
542     X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3
543   };
544
545   // Count how many bytes are to be pushed on the stack.
546   unsigned NumBytes = 0;
547   for (unsigned i = 0; i != NumOps; ++i) {
548     SDOperand Arg = Op.getOperand(5+2*i);
549
550     switch (Arg.getValueType()) {
551     default: assert(0 && "Unexpected ValueType for argument!");
552     case MVT::i8:
553     case MVT::i16:
554     case MVT::i32:
555     case MVT::f32:
556       NumBytes += 4;
557       break;
558     case MVT::i64:
559     case MVT::f64:
560       NumBytes += 8;
561       break;
562     case MVT::v16i8:
563     case MVT::v8i16:
564     case MVT::v4i32:
565     case MVT::v2i64:
566     case MVT::v4f32:
567     case MVT::v2f64:
568       if (NumXMMRegs < 4)
569         ++NumXMMRegs;
570       else {
571         // XMM arguments have to be aligned on 16-byte boundary.
572         NumBytes = ((NumBytes + 15) / 16) * 16;
573         NumBytes += 16;
574       }
575       break;
576     }
577   }
578
579   Chain = DAG.getCALLSEQ_START(Chain,DAG.getConstant(NumBytes, getPointerTy()));
580
581   // Arguments go on the stack in reverse order, as specified by the ABI.
582   unsigned ArgOffset = 0;
583   NumXMMRegs = 0;
584   std::vector<std::pair<unsigned, SDOperand> > RegsToPass;
585   std::vector<SDOperand> MemOpChains;
586   SDOperand StackPtr = DAG.getRegister(X86StackPtr, getPointerTy());
587   for (unsigned i = 0; i != NumOps; ++i) {
588     SDOperand Arg = Op.getOperand(5+2*i);
589
590     switch (Arg.getValueType()) {
591     default: assert(0 && "Unexpected ValueType for argument!");
592     case MVT::i8:
593     case MVT::i16: {
594       // Promote the integer to 32 bits.  If the input type is signed use a
595       // sign extend, otherwise use a zero extend.
596       unsigned ExtOp =
597         dyn_cast<ConstantSDNode>(Op.getOperand(5+2*i+1))->getValue() ?
598         ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
599       Arg = DAG.getNode(ExtOp, MVT::i32, Arg);
600     }
601     // Fallthrough
602
603     case MVT::i32:
604     case MVT::f32: {
605       SDOperand PtrOff = DAG.getConstant(ArgOffset, getPointerTy());
606       PtrOff = DAG.getNode(ISD::ADD, getPointerTy(), StackPtr, PtrOff);
607       MemOpChains.push_back(DAG.getStore(Chain, Arg, PtrOff, NULL, 0));
608       ArgOffset += 4;
609       break;
610     }
611     case MVT::i64:
612     case MVT::f64: {
613       SDOperand PtrOff = DAG.getConstant(ArgOffset, getPointerTy());
614       PtrOff = DAG.getNode(ISD::ADD, getPointerTy(), StackPtr, PtrOff);
615       MemOpChains.push_back(DAG.getStore(Chain, Arg, PtrOff, NULL, 0));
616       ArgOffset += 8;
617       break;
618     }
619     case MVT::v16i8:
620     case MVT::v8i16:
621     case MVT::v4i32:
622     case MVT::v2i64:
623     case MVT::v4f32:
624     case MVT::v2f64:
625       if (NumXMMRegs < 4) {
626         RegsToPass.push_back(std::make_pair(XMMArgRegs[NumXMMRegs], Arg));
627         NumXMMRegs++;
628       } else {
629         // XMM arguments have to be aligned on 16-byte boundary.
630         ArgOffset = ((ArgOffset + 15) / 16) * 16;
631         SDOperand PtrOff = DAG.getConstant(ArgOffset, getPointerTy());
632         PtrOff = DAG.getNode(ISD::ADD, getPointerTy(), StackPtr, PtrOff);
633         MemOpChains.push_back(DAG.getStore(Chain, Arg, PtrOff, NULL, 0));
634         ArgOffset += 16;
635       }
636     }
637   }
638
639   if (!MemOpChains.empty())
640     Chain = DAG.getNode(ISD::TokenFactor, MVT::Other,
641                         &MemOpChains[0], MemOpChains.size());
642
643   // Build a sequence of copy-to-reg nodes chained together with token chain
644   // and flag operands which copy the outgoing args into registers.
645   SDOperand InFlag;
646   for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) {
647     Chain = DAG.getCopyToReg(Chain, RegsToPass[i].first, RegsToPass[i].second,
648                              InFlag);
649     InFlag = Chain.getValue(1);
650   }
651
652   // If the callee is a GlobalAddress node (quite common, every direct call is)
653   // turn it into a TargetGlobalAddress node so that legalize doesn't hack it.
654   if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee))
655     Callee = DAG.getTargetGlobalAddress(G->getGlobal(), getPointerTy());
656   else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee))
657     Callee = DAG.getTargetExternalSymbol(S->getSymbol(), getPointerTy());
658
659   std::vector<MVT::ValueType> NodeTys;
660   NodeTys.push_back(MVT::Other);   // Returns a chain
661   NodeTys.push_back(MVT::Flag);    // Returns a flag for retval copy to use.
662   std::vector<SDOperand> Ops;
663   Ops.push_back(Chain);
664   Ops.push_back(Callee);
665
666   // Add argument registers to the end of the list so that they are known live
667   // into the call.
668   for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i)
669     Ops.push_back(DAG.getRegister(RegsToPass[i].first, 
670                                   RegsToPass[i].second.getValueType()));
671
672   if (InFlag.Val)
673     Ops.push_back(InFlag);
674
675   Chain = DAG.getNode(isTailCall ? X86ISD::TAILCALL : X86ISD::CALL,
676                       NodeTys, &Ops[0], Ops.size());
677   InFlag = Chain.getValue(1);
678
679   // Create the CALLSEQ_END node.
680   unsigned NumBytesForCalleeToPush = 0;
681
682   // If this is is a call to a struct-return function, the callee
683   // pops the hidden struct pointer, so we have to push it back.
684   // This is common for Darwin/X86, Linux & Mingw32 targets.
685   if (CallingConv == CallingConv::CSRet)
686     NumBytesForCalleeToPush = 4;
687   
688   NodeTys.clear();
689   NodeTys.push_back(MVT::Other);   // Returns a chain
690   if (RetVT != MVT::Other)
691     NodeTys.push_back(MVT::Flag);  // Returns a flag for retval copy to use.
692   Ops.clear();
693   Ops.push_back(Chain);
694   Ops.push_back(DAG.getConstant(NumBytes, getPointerTy()));
695   Ops.push_back(DAG.getConstant(NumBytesForCalleeToPush, getPointerTy()));
696   Ops.push_back(InFlag);
697   Chain = DAG.getNode(ISD::CALLSEQ_END, NodeTys, &Ops[0], Ops.size());
698   if (RetVT != MVT::Other)
699     InFlag = Chain.getValue(1);
700   
701   std::vector<SDOperand> ResultVals;
702   NodeTys.clear();
703   switch (RetVT) {
704   default: assert(0 && "Unknown value type to return!");
705   case MVT::Other: break;
706   case MVT::i8:
707     Chain = DAG.getCopyFromReg(Chain, X86::AL, MVT::i8, InFlag).getValue(1);
708     ResultVals.push_back(Chain.getValue(0));
709     NodeTys.push_back(MVT::i8);
710     break;
711   case MVT::i16:
712     Chain = DAG.getCopyFromReg(Chain, X86::AX, MVT::i16, InFlag).getValue(1);
713     ResultVals.push_back(Chain.getValue(0));
714     NodeTys.push_back(MVT::i16);
715     break;
716   case MVT::i32:
717     if (Op.Val->getValueType(1) == MVT::i32) {
718       Chain = DAG.getCopyFromReg(Chain, X86::EAX, MVT::i32, InFlag).getValue(1);
719       ResultVals.push_back(Chain.getValue(0));
720       Chain = DAG.getCopyFromReg(Chain, X86::EDX, MVT::i32,
721                                  Chain.getValue(2)).getValue(1);
722       ResultVals.push_back(Chain.getValue(0));
723       NodeTys.push_back(MVT::i32);
724     } else {
725       Chain = DAG.getCopyFromReg(Chain, X86::EAX, MVT::i32, InFlag).getValue(1);
726       ResultVals.push_back(Chain.getValue(0));
727     }
728     NodeTys.push_back(MVT::i32);
729     break;
730   case MVT::v16i8:
731   case MVT::v8i16:
732   case MVT::v4i32:
733   case MVT::v2i64:
734   case MVT::v4f32:
735   case MVT::v2f64:
736     Chain = DAG.getCopyFromReg(Chain, X86::XMM0, RetVT, InFlag).getValue(1);
737     ResultVals.push_back(Chain.getValue(0));
738     NodeTys.push_back(RetVT);
739     break;
740   case MVT::f32:
741   case MVT::f64: {
742     std::vector<MVT::ValueType> Tys;
743     Tys.push_back(MVT::f64);
744     Tys.push_back(MVT::Other);
745     Tys.push_back(MVT::Flag);
746     std::vector<SDOperand> Ops;
747     Ops.push_back(Chain);
748     Ops.push_back(InFlag);
749     SDOperand RetVal = DAG.getNode(X86ISD::FP_GET_RESULT, Tys, 
750                                    &Ops[0], Ops.size());
751     Chain  = RetVal.getValue(1);
752     InFlag = RetVal.getValue(2);
753     if (X86ScalarSSE) {
754       // FIXME: Currently the FST is flagged to the FP_GET_RESULT. This
755       // shouldn't be necessary except that RFP cannot be live across
756       // multiple blocks. When stackifier is fixed, they can be uncoupled.
757       MachineFunction &MF = DAG.getMachineFunction();
758       int SSFI = MF.getFrameInfo()->CreateStackObject(8, 8);
759       SDOperand StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
760       Tys.clear();
761       Tys.push_back(MVT::Other);
762       Ops.clear();
763       Ops.push_back(Chain);
764       Ops.push_back(RetVal);
765       Ops.push_back(StackSlot);
766       Ops.push_back(DAG.getValueType(RetVT));
767       Ops.push_back(InFlag);
768       Chain = DAG.getNode(X86ISD::FST, Tys, &Ops[0], Ops.size());
769       RetVal = DAG.getLoad(RetVT, Chain, StackSlot, NULL, 0);
770       Chain = RetVal.getValue(1);
771     }
772
773     if (RetVT == MVT::f32 && !X86ScalarSSE)
774       // FIXME: we would really like to remember that this FP_ROUND
775       // operation is okay to eliminate if we allow excess FP precision.
776       RetVal = DAG.getNode(ISD::FP_ROUND, MVT::f32, RetVal);
777     ResultVals.push_back(RetVal);
778     NodeTys.push_back(RetVT);
779     break;
780   }
781   }
782
783   // If the function returns void, just return the chain.
784   if (ResultVals.empty())
785     return Chain;
786   
787   // Otherwise, merge everything together with a MERGE_VALUES node.
788   NodeTys.push_back(MVT::Other);
789   ResultVals.push_back(Chain);
790   SDOperand Res = DAG.getNode(ISD::MERGE_VALUES, NodeTys,
791                               &ResultVals[0], ResultVals.size());
792   return Res.getValue(Op.ResNo);
793 }
794
795
796 //===----------------------------------------------------------------------===//
797 //                 X86-64 C Calling Convention implementation
798 //===----------------------------------------------------------------------===//
799
800 /// HowToPassX86_64CCCArgument - Returns how an formal argument of the specified
801 /// type should be passed. If it is through stack, returns the size of the stack
802 /// slot; if it is through integer or XMM register, returns the number of
803 /// integer or XMM registers are needed.
804 static void
805 HowToPassX86_64CCCArgument(MVT::ValueType ObjectVT,
806                            unsigned NumIntRegs, unsigned NumXMMRegs,
807                            unsigned &ObjSize, unsigned &ObjIntRegs,
808                            unsigned &ObjXMMRegs) {
809   ObjSize = 0;
810   ObjIntRegs = 0;
811   ObjXMMRegs = 0;
812
813   switch (ObjectVT) {
814   default: assert(0 && "Unhandled argument type!");
815   case MVT::i8:
816   case MVT::i16:
817   case MVT::i32:
818   case MVT::i64:
819     if (NumIntRegs < 6)
820       ObjIntRegs = 1;
821     else {
822       switch (ObjectVT) {
823       default: break;
824       case MVT::i8:  ObjSize = 1; break;
825       case MVT::i16: ObjSize = 2; break;
826       case MVT::i32: ObjSize = 4; break;
827       case MVT::i64: ObjSize = 8; break;
828       }
829     }
830     break;
831   case MVT::f32:
832   case MVT::f64:
833   case MVT::v16i8:
834   case MVT::v8i16:
835   case MVT::v4i32:
836   case MVT::v2i64:
837   case MVT::v4f32:
838   case MVT::v2f64:
839     if (NumXMMRegs < 8)
840       ObjXMMRegs = 1;
841     else {
842       switch (ObjectVT) {
843       default: break;
844       case MVT::f32:  ObjSize = 4; break;
845       case MVT::f64:  ObjSize = 8; break;
846       case MVT::v16i8:
847       case MVT::v8i16:
848       case MVT::v4i32:
849       case MVT::v2i64:
850       case MVT::v4f32:
851       case MVT::v2f64: ObjSize = 16; break;
852     }
853     break;
854   }
855   }
856 }
857
858 SDOperand
859 X86TargetLowering::LowerX86_64CCCArguments(SDOperand Op, SelectionDAG &DAG) {
860   unsigned NumArgs = Op.Val->getNumValues() - 1;
861   MachineFunction &MF = DAG.getMachineFunction();
862   MachineFrameInfo *MFI = MF.getFrameInfo();
863   SDOperand Root = Op.getOperand(0);
864   bool isVarArg = cast<ConstantSDNode>(Op.getOperand(2))->getValue() != 0;
865   std::vector<SDOperand> ArgValues;
866
867   // Add DAG nodes to load the arguments...  On entry to a function on the X86,
868   // the stack frame looks like this:
869   //
870   // [RSP] -- return address
871   // [RSP + 8] -- first nonreg argument (leftmost lexically)
872   // [RSP +16] -- second nonreg argument, if 1st argument is <= 8 bytes in size
873   //    ...
874   //
875   unsigned ArgOffset = 0;   // Frame mechanisms handle retaddr slot
876   unsigned NumIntRegs = 0;  // Int regs used for parameter passing.
877   unsigned NumXMMRegs = 0;  // XMM regs used for parameter passing.
878
879   static const unsigned GPR8ArgRegs[] = {
880     X86::DIL, X86::SIL, X86::DL,  X86::CL,  X86::R8B, X86::R9B
881   };
882   static const unsigned GPR16ArgRegs[] = {
883     X86::DI,  X86::SI,  X86::DX,  X86::CX,  X86::R8W, X86::R9W
884   };
885   static const unsigned GPR32ArgRegs[] = {
886     X86::EDI, X86::ESI, X86::EDX, X86::ECX, X86::R8D, X86::R9D
887   };
888   static const unsigned GPR64ArgRegs[] = {
889     X86::RDI, X86::RSI, X86::RDX, X86::RCX, X86::R8,  X86::R9
890   };
891   static const unsigned XMMArgRegs[] = {
892     X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3,
893     X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7
894   };
895
896   for (unsigned i = 0; i < NumArgs; ++i) {
897     MVT::ValueType ObjectVT = Op.getValue(i).getValueType();
898     unsigned ArgIncrement = 8;
899     unsigned ObjSize = 0;
900     unsigned ObjIntRegs = 0;
901     unsigned ObjXMMRegs = 0;
902
903     // FIXME: __int128 and long double support?
904     HowToPassX86_64CCCArgument(ObjectVT, NumIntRegs, NumXMMRegs,
905                                ObjSize, ObjIntRegs, ObjXMMRegs);
906     if (ObjSize > 8)
907       ArgIncrement = ObjSize;
908
909     unsigned Reg = 0;
910     SDOperand ArgValue;
911     if (ObjIntRegs || ObjXMMRegs) {
912       switch (ObjectVT) {
913       default: assert(0 && "Unhandled argument type!");
914       case MVT::i8:
915       case MVT::i16:
916       case MVT::i32:
917       case MVT::i64: {
918         TargetRegisterClass *RC = NULL;
919         switch (ObjectVT) {
920         default: break;
921         case MVT::i8: 
922           RC = X86::GR8RegisterClass;
923           Reg = GPR8ArgRegs[NumIntRegs];
924           break;
925         case MVT::i16:
926           RC = X86::GR16RegisterClass;
927           Reg = GPR16ArgRegs[NumIntRegs];
928           break;
929         case MVT::i32:
930           RC = X86::GR32RegisterClass;
931           Reg = GPR32ArgRegs[NumIntRegs];
932           break;
933         case MVT::i64:
934           RC = X86::GR64RegisterClass;
935           Reg = GPR64ArgRegs[NumIntRegs];
936           break;
937         }
938         Reg = AddLiveIn(MF, Reg, RC);
939         ArgValue = DAG.getCopyFromReg(Root, Reg, ObjectVT);
940         break;
941       }
942       case MVT::f32:
943       case MVT::f64:
944       case MVT::v16i8:
945       case MVT::v8i16:
946       case MVT::v4i32:
947       case MVT::v2i64:
948       case MVT::v4f32:
949       case MVT::v2f64: {
950         TargetRegisterClass *RC= (ObjectVT == MVT::f32) ?
951           X86::FR32RegisterClass : ((ObjectVT == MVT::f64) ?
952                               X86::FR64RegisterClass : X86::VR128RegisterClass);
953         Reg = AddLiveIn(MF, XMMArgRegs[NumXMMRegs], RC);
954         ArgValue = DAG.getCopyFromReg(Root, Reg, ObjectVT);
955         break;
956       }
957       }
958       NumIntRegs += ObjIntRegs;
959       NumXMMRegs += ObjXMMRegs;
960     } else if (ObjSize) {
961       // XMM arguments have to be aligned on 16-byte boundary.
962       if (ObjSize == 16)
963         ArgOffset = ((ArgOffset + 15) / 16) * 16;
964       // Create the SelectionDAG nodes corresponding to a load from this
965       // parameter.
966       int FI = MFI->CreateFixedObject(ObjSize, ArgOffset);
967       SDOperand FIN = DAG.getFrameIndex(FI, getPointerTy());
968       ArgValue = DAG.getLoad(Op.Val->getValueType(i), Root, FIN, NULL, 0);
969       ArgOffset += ArgIncrement;   // Move on to the next argument.
970     }
971
972     ArgValues.push_back(ArgValue);
973   }
974
975   // If the function takes variable number of arguments, make a frame index for
976   // the start of the first vararg value... for expansion of llvm.va_start.
977   if (isVarArg) {
978     // For X86-64, if there are vararg parameters that are passed via
979     // registers, then we must store them to their spots on the stack so they
980     // may be loaded by deferencing the result of va_next.
981     VarArgsGPOffset = NumIntRegs * 8;
982     VarArgsFPOffset = 6 * 8 + NumXMMRegs * 16;
983     VarArgsFrameIndex = MFI->CreateFixedObject(1, ArgOffset);
984     RegSaveFrameIndex = MFI->CreateStackObject(6 * 8 + 8 * 16, 16);
985
986     // Store the integer parameter registers.
987     std::vector<SDOperand> MemOps;
988     SDOperand RSFIN = DAG.getFrameIndex(RegSaveFrameIndex, getPointerTy());
989     SDOperand FIN = DAG.getNode(ISD::ADD, getPointerTy(), RSFIN,
990                               DAG.getConstant(VarArgsGPOffset, getPointerTy()));
991     for (; NumIntRegs != 6; ++NumIntRegs) {
992       unsigned VReg = AddLiveIn(MF, GPR64ArgRegs[NumIntRegs],
993                                 X86::GR64RegisterClass);
994       SDOperand Val = DAG.getCopyFromReg(Root, VReg, MVT::i64);
995       SDOperand Store = DAG.getStore(Val.getValue(1), Val, FIN, NULL, 0);
996       MemOps.push_back(Store);
997       FIN = DAG.getNode(ISD::ADD, getPointerTy(), FIN,
998                         DAG.getConstant(8, getPointerTy()));
999     }
1000
1001     // Now store the XMM (fp + vector) parameter registers.
1002     FIN = DAG.getNode(ISD::ADD, getPointerTy(), RSFIN,
1003                       DAG.getConstant(VarArgsFPOffset, getPointerTy()));
1004     for (; NumXMMRegs != 8; ++NumXMMRegs) {
1005       unsigned VReg = AddLiveIn(MF, XMMArgRegs[NumXMMRegs],
1006                                 X86::VR128RegisterClass);
1007       SDOperand Val = DAG.getCopyFromReg(Root, VReg, MVT::v4f32);
1008       SDOperand Store = DAG.getStore(Val.getValue(1), Val, FIN, NULL, 0);
1009       MemOps.push_back(Store);
1010       FIN = DAG.getNode(ISD::ADD, getPointerTy(), FIN,
1011                         DAG.getConstant(16, getPointerTy()));
1012     }
1013     if (!MemOps.empty())
1014         Root = DAG.getNode(ISD::TokenFactor, MVT::Other,
1015                            &MemOps[0], MemOps.size());
1016   }
1017
1018   ArgValues.push_back(Root);
1019
1020   ReturnAddrIndex = 0;     // No return address slot generated yet.
1021   BytesToPopOnReturn = 0;  // Callee pops nothing.
1022   BytesCallerReserves = ArgOffset;
1023
1024   // Return the new list of results.
1025   std::vector<MVT::ValueType> RetVTs(Op.Val->value_begin(),
1026                                      Op.Val->value_end());
1027   return DAG.getNode(ISD::MERGE_VALUES, RetVTs, &ArgValues[0],ArgValues.size());
1028 }
1029
1030 SDOperand
1031 X86TargetLowering::LowerX86_64CCCCallTo(SDOperand Op, SelectionDAG &DAG) {
1032   SDOperand Chain     = Op.getOperand(0);
1033   bool isVarArg       = cast<ConstantSDNode>(Op.getOperand(2))->getValue() != 0;
1034   bool isTailCall     = cast<ConstantSDNode>(Op.getOperand(3))->getValue() != 0;
1035   SDOperand Callee    = Op.getOperand(4);
1036   MVT::ValueType RetVT= Op.Val->getValueType(0);
1037   unsigned NumOps     = (Op.getNumOperands() - 5) / 2;
1038
1039   // Count how many bytes are to be pushed on the stack.
1040   unsigned NumBytes = 0;
1041   unsigned NumIntRegs = 0;  // Int regs used for parameter passing.
1042   unsigned NumXMMRegs = 0;  // XMM regs used for parameter passing.
1043
1044   static const unsigned GPR8ArgRegs[] = {
1045     X86::DIL, X86::SIL, X86::DL,  X86::CL,  X86::R8B, X86::R9B
1046   };
1047   static const unsigned GPR16ArgRegs[] = {
1048     X86::DI,  X86::SI,  X86::DX,  X86::CX,  X86::R8W, X86::R9W
1049   };
1050   static const unsigned GPR32ArgRegs[] = {
1051     X86::EDI, X86::ESI, X86::EDX, X86::ECX, X86::R8D, X86::R9D
1052   };
1053   static const unsigned GPR64ArgRegs[] = {
1054     X86::RDI, X86::RSI, X86::RDX, X86::RCX, X86::R8,  X86::R9
1055   };
1056   static const unsigned XMMArgRegs[] = {
1057     X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3,
1058     X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7
1059   };
1060
1061   for (unsigned i = 0; i != NumOps; ++i) {
1062     SDOperand Arg = Op.getOperand(5+2*i);
1063     MVT::ValueType ArgVT = Arg.getValueType();
1064
1065     switch (ArgVT) {
1066     default: assert(0 && "Unknown value type!");
1067     case MVT::i8:
1068     case MVT::i16:
1069     case MVT::i32:
1070     case MVT::i64:
1071       if (NumIntRegs < 6)
1072         ++NumIntRegs;
1073       else
1074         NumBytes += 8;
1075       break;
1076     case MVT::f32:
1077     case MVT::f64:
1078     case MVT::v16i8:
1079     case MVT::v8i16:
1080     case MVT::v4i32:
1081     case MVT::v2i64:
1082     case MVT::v4f32:
1083     case MVT::v2f64:
1084       if (NumXMMRegs < 8)
1085         NumXMMRegs++;
1086       else if (ArgVT == MVT::f32 || ArgVT == MVT::f64)
1087         NumBytes += 8;
1088       else {
1089         // XMM arguments have to be aligned on 16-byte boundary.
1090         NumBytes = ((NumBytes + 15) / 16) * 16;
1091         NumBytes += 16;
1092       }
1093       break;
1094     }
1095   }
1096
1097   Chain = DAG.getCALLSEQ_START(Chain,DAG.getConstant(NumBytes, getPointerTy()));
1098
1099   // Arguments go on the stack in reverse order, as specified by the ABI.
1100   unsigned ArgOffset = 0;
1101   NumIntRegs = 0;
1102   NumXMMRegs = 0;
1103   std::vector<std::pair<unsigned, SDOperand> > RegsToPass;
1104   std::vector<SDOperand> MemOpChains;
1105   SDOperand StackPtr = DAG.getRegister(X86StackPtr, getPointerTy());
1106   for (unsigned i = 0; i != NumOps; ++i) {
1107     SDOperand Arg = Op.getOperand(5+2*i);
1108     MVT::ValueType ArgVT = Arg.getValueType();
1109
1110     switch (ArgVT) {
1111     default: assert(0 && "Unexpected ValueType for argument!");
1112     case MVT::i8:
1113     case MVT::i16:
1114     case MVT::i32:
1115     case MVT::i64:
1116       if (NumIntRegs < 6) {
1117         unsigned Reg = 0;
1118         switch (ArgVT) {
1119         default: break;
1120         case MVT::i8:  Reg = GPR8ArgRegs[NumIntRegs];  break;
1121         case MVT::i16: Reg = GPR16ArgRegs[NumIntRegs]; break;
1122         case MVT::i32: Reg = GPR32ArgRegs[NumIntRegs]; break;
1123         case MVT::i64: Reg = GPR64ArgRegs[NumIntRegs]; break;
1124         }
1125         RegsToPass.push_back(std::make_pair(Reg, Arg));
1126         ++NumIntRegs;
1127       } else {
1128         SDOperand PtrOff = DAG.getConstant(ArgOffset, getPointerTy());
1129         PtrOff = DAG.getNode(ISD::ADD, getPointerTy(), StackPtr, PtrOff);
1130         MemOpChains.push_back(DAG.getStore(Chain, Arg, PtrOff, NULL, 0));
1131         ArgOffset += 8;
1132       }
1133       break;
1134     case MVT::f32:
1135     case MVT::f64:
1136     case MVT::v16i8:
1137     case MVT::v8i16:
1138     case MVT::v4i32:
1139     case MVT::v2i64:
1140     case MVT::v4f32:
1141     case MVT::v2f64:
1142       if (NumXMMRegs < 8) {
1143         RegsToPass.push_back(std::make_pair(XMMArgRegs[NumXMMRegs], Arg));
1144         NumXMMRegs++;
1145       } else {
1146         if (ArgVT != MVT::f32 && ArgVT != MVT::f64) {
1147           // XMM arguments have to be aligned on 16-byte boundary.
1148           ArgOffset = ((ArgOffset + 15) / 16) * 16;
1149         }
1150         SDOperand PtrOff = DAG.getConstant(ArgOffset, getPointerTy());
1151         PtrOff = DAG.getNode(ISD::ADD, getPointerTy(), StackPtr, PtrOff);
1152         MemOpChains.push_back(DAG.getStore(Chain, Arg, PtrOff, NULL, 0));
1153         if (ArgVT == MVT::f32 || ArgVT == MVT::f64)
1154           ArgOffset += 8;
1155         else
1156           ArgOffset += 16;
1157       }
1158     }
1159   }
1160
1161   if (!MemOpChains.empty())
1162     Chain = DAG.getNode(ISD::TokenFactor, MVT::Other,
1163                         &MemOpChains[0], MemOpChains.size());
1164
1165   // Build a sequence of copy-to-reg nodes chained together with token chain
1166   // and flag operands which copy the outgoing args into registers.
1167   SDOperand InFlag;
1168   for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) {
1169     Chain = DAG.getCopyToReg(Chain, RegsToPass[i].first, RegsToPass[i].second,
1170                              InFlag);
1171     InFlag = Chain.getValue(1);
1172   }
1173
1174   if (isVarArg) {
1175     // From AMD64 ABI document:
1176     // For calls that may call functions that use varargs or stdargs
1177     // (prototype-less calls or calls to functions containing ellipsis (...) in
1178     // the declaration) %al is used as hidden argument to specify the number
1179     // of SSE registers used. The contents of %al do not need to match exactly
1180     // the number of registers, but must be an ubound on the number of SSE
1181     // registers used and is in the range 0 - 8 inclusive.
1182     Chain = DAG.getCopyToReg(Chain, X86::AL,
1183                              DAG.getConstant(NumXMMRegs, MVT::i8), InFlag);
1184     InFlag = Chain.getValue(1);
1185   }
1186
1187   // If the callee is a GlobalAddress node (quite common, every direct call is)
1188   // turn it into a TargetGlobalAddress node so that legalize doesn't hack it.
1189   if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee))
1190     Callee = DAG.getTargetGlobalAddress(G->getGlobal(), getPointerTy());
1191   else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee))
1192     Callee = DAG.getTargetExternalSymbol(S->getSymbol(), getPointerTy());
1193
1194   std::vector<MVT::ValueType> NodeTys;
1195   NodeTys.push_back(MVT::Other);   // Returns a chain
1196   NodeTys.push_back(MVT::Flag);    // Returns a flag for retval copy to use.
1197   std::vector<SDOperand> Ops;
1198   Ops.push_back(Chain);
1199   Ops.push_back(Callee);
1200
1201   // Add argument registers to the end of the list so that they are known live
1202   // into the call.
1203   for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i)
1204     Ops.push_back(DAG.getRegister(RegsToPass[i].first, 
1205                                   RegsToPass[i].second.getValueType()));
1206
1207   if (InFlag.Val)
1208     Ops.push_back(InFlag);
1209
1210   // FIXME: Do not generate X86ISD::TAILCALL for now.
1211   Chain = DAG.getNode(isTailCall ? X86ISD::TAILCALL : X86ISD::CALL,
1212                       NodeTys, &Ops[0], Ops.size());
1213   InFlag = Chain.getValue(1);
1214
1215   NodeTys.clear();
1216   NodeTys.push_back(MVT::Other);   // Returns a chain
1217   if (RetVT != MVT::Other)
1218     NodeTys.push_back(MVT::Flag);  // Returns a flag for retval copy to use.
1219   Ops.clear();
1220   Ops.push_back(Chain);
1221   Ops.push_back(DAG.getConstant(NumBytes, getPointerTy()));
1222   Ops.push_back(DAG.getConstant(0, getPointerTy()));
1223   Ops.push_back(InFlag);
1224   Chain = DAG.getNode(ISD::CALLSEQ_END, NodeTys, &Ops[0], Ops.size());
1225   if (RetVT != MVT::Other)
1226     InFlag = Chain.getValue(1);
1227   
1228   std::vector<SDOperand> ResultVals;
1229   NodeTys.clear();
1230   switch (RetVT) {
1231   default: assert(0 && "Unknown value type to return!");
1232   case MVT::Other: break;
1233   case MVT::i8:
1234     Chain = DAG.getCopyFromReg(Chain, X86::AL, MVT::i8, InFlag).getValue(1);
1235     ResultVals.push_back(Chain.getValue(0));
1236     NodeTys.push_back(MVT::i8);
1237     break;
1238   case MVT::i16:
1239     Chain = DAG.getCopyFromReg(Chain, X86::AX, MVT::i16, InFlag).getValue(1);
1240     ResultVals.push_back(Chain.getValue(0));
1241     NodeTys.push_back(MVT::i16);
1242     break;
1243   case MVT::i32:
1244     Chain = DAG.getCopyFromReg(Chain, X86::EAX, MVT::i32, InFlag).getValue(1);
1245     ResultVals.push_back(Chain.getValue(0));
1246     NodeTys.push_back(MVT::i32);
1247     break;
1248   case MVT::i64:
1249     if (Op.Val->getValueType(1) == MVT::i64) {
1250       // FIXME: __int128 support?
1251       Chain = DAG.getCopyFromReg(Chain, X86::RAX, MVT::i64, InFlag).getValue(1);
1252       ResultVals.push_back(Chain.getValue(0));
1253       Chain = DAG.getCopyFromReg(Chain, X86::RDX, MVT::i64,
1254                                  Chain.getValue(2)).getValue(1);
1255       ResultVals.push_back(Chain.getValue(0));
1256       NodeTys.push_back(MVT::i64);
1257     } else {
1258       Chain = DAG.getCopyFromReg(Chain, X86::RAX, MVT::i64, InFlag).getValue(1);
1259       ResultVals.push_back(Chain.getValue(0));
1260     }
1261     NodeTys.push_back(MVT::i64);
1262     break;
1263   case MVT::f32:
1264   case MVT::f64:
1265   case MVT::v16i8:
1266   case MVT::v8i16:
1267   case MVT::v4i32:
1268   case MVT::v2i64:
1269   case MVT::v4f32:
1270   case MVT::v2f64:
1271     // FIXME: long double support?
1272     Chain = DAG.getCopyFromReg(Chain, X86::XMM0, RetVT, InFlag).getValue(1);
1273     ResultVals.push_back(Chain.getValue(0));
1274     NodeTys.push_back(RetVT);
1275     break;
1276   }
1277
1278   // If the function returns void, just return the chain.
1279   if (ResultVals.empty())
1280     return Chain;
1281   
1282   // Otherwise, merge everything together with a MERGE_VALUES node.
1283   NodeTys.push_back(MVT::Other);
1284   ResultVals.push_back(Chain);
1285   SDOperand Res = DAG.getNode(ISD::MERGE_VALUES, NodeTys,
1286                               &ResultVals[0], ResultVals.size());
1287   return Res.getValue(Op.ResNo);
1288 }
1289
1290 //===----------------------------------------------------------------------===//
1291 //                    Fast Calling Convention implementation
1292 //===----------------------------------------------------------------------===//
1293 //
1294 // The X86 'fast' calling convention passes up to two integer arguments in
1295 // registers (an appropriate portion of EAX/EDX), passes arguments in C order,
1296 // and requires that the callee pop its arguments off the stack (allowing proper
1297 // tail calls), and has the same return value conventions as C calling convs.
1298 //
1299 // This calling convention always arranges for the callee pop value to be 8n+4
1300 // bytes, which is needed for tail recursion elimination and stack alignment
1301 // reasons.
1302 //
1303 // Note that this can be enhanced in the future to pass fp vals in registers
1304 // (when we have a global fp allocator) and do other tricks.
1305 //
1306
1307 /// HowToPassFastCCArgument - Returns how an formal argument of the specified
1308 /// type should be passed. If it is through stack, returns the size of the stack
1309 /// slot; if it is through integer or XMM register, returns the number of
1310 /// integer or XMM registers are needed.
1311 static void
1312 HowToPassFastCCArgument(MVT::ValueType ObjectVT,
1313                         unsigned NumIntRegs, unsigned NumXMMRegs,
1314                         unsigned &ObjSize, unsigned &ObjIntRegs,
1315                         unsigned &ObjXMMRegs) {
1316   ObjSize = 0;
1317   ObjIntRegs = 0;
1318   ObjXMMRegs = 0;
1319
1320   switch (ObjectVT) {
1321   default: assert(0 && "Unhandled argument type!");
1322   case MVT::i8:
1323 #if FASTCC_NUM_INT_ARGS_INREGS > 0
1324     if (NumIntRegs < FASTCC_NUM_INT_ARGS_INREGS)
1325       ObjIntRegs = 1;
1326     else
1327 #endif
1328       ObjSize = 1;
1329     break;
1330   case MVT::i16:
1331 #if FASTCC_NUM_INT_ARGS_INREGS > 0
1332     if (NumIntRegs < FASTCC_NUM_INT_ARGS_INREGS)
1333       ObjIntRegs = 1;
1334     else
1335 #endif
1336       ObjSize = 2;
1337     break;
1338   case MVT::i32:
1339 #if FASTCC_NUM_INT_ARGS_INREGS > 0
1340     if (NumIntRegs < FASTCC_NUM_INT_ARGS_INREGS)
1341       ObjIntRegs = 1;
1342     else
1343 #endif
1344       ObjSize = 4;
1345     break;
1346   case MVT::i64:
1347 #if FASTCC_NUM_INT_ARGS_INREGS > 0
1348     if (NumIntRegs+2 <= FASTCC_NUM_INT_ARGS_INREGS) {
1349       ObjIntRegs = 2;
1350     } else if (NumIntRegs+1 <= FASTCC_NUM_INT_ARGS_INREGS) {
1351       ObjIntRegs = 1;
1352       ObjSize = 4;
1353     } else
1354 #endif
1355       ObjSize = 8;
1356   case MVT::f32:
1357     ObjSize = 4;
1358     break;
1359   case MVT::f64:
1360     ObjSize = 8;
1361     break;
1362   case MVT::v16i8:
1363   case MVT::v8i16:
1364   case MVT::v4i32:
1365   case MVT::v2i64:
1366   case MVT::v4f32:
1367   case MVT::v2f64:
1368     if (NumXMMRegs < 4)
1369       ObjXMMRegs = 1;
1370     else
1371       ObjSize = 16;
1372     break;
1373   }
1374 }
1375
1376 SDOperand
1377 X86TargetLowering::LowerFastCCArguments(SDOperand Op, SelectionDAG &DAG) {
1378   unsigned NumArgs = Op.Val->getNumValues()-1;
1379   MachineFunction &MF = DAG.getMachineFunction();
1380   MachineFrameInfo *MFI = MF.getFrameInfo();
1381   SDOperand Root = Op.getOperand(0);
1382   std::vector<SDOperand> ArgValues;
1383
1384   // Add DAG nodes to load the arguments...  On entry to a function the stack
1385   // frame looks like this:
1386   //
1387   // [ESP] -- return address
1388   // [ESP + 4] -- first nonreg argument (leftmost lexically)
1389   // [ESP + 8] -- second nonreg argument, if 1st argument is <= 4 bytes in size
1390   //    ...
1391   unsigned ArgOffset = 0;   // Frame mechanisms handle retaddr slot
1392
1393   // Keep track of the number of integer regs passed so far.  This can be either
1394   // 0 (neither EAX or EDX used), 1 (EAX is used) or 2 (EAX and EDX are both
1395   // used).
1396   unsigned NumIntRegs = 0;
1397   unsigned NumXMMRegs = 0;  // XMM regs used for parameter passing.
1398
1399   static const unsigned XMMArgRegs[] = {
1400     X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3
1401   };
1402   
1403   for (unsigned i = 0; i < NumArgs; ++i) {
1404     MVT::ValueType ObjectVT = Op.getValue(i).getValueType();
1405     unsigned ArgIncrement = 4;
1406     unsigned ObjSize = 0;
1407     unsigned ObjIntRegs = 0;
1408     unsigned ObjXMMRegs = 0;
1409
1410     HowToPassFastCCArgument(ObjectVT, NumIntRegs, NumXMMRegs,
1411                             ObjSize, ObjIntRegs, ObjXMMRegs);
1412     if (ObjSize > 4)
1413       ArgIncrement = ObjSize;
1414
1415     unsigned Reg = 0;
1416     SDOperand ArgValue;
1417     if (ObjIntRegs || ObjXMMRegs) {
1418       switch (ObjectVT) {
1419       default: assert(0 && "Unhandled argument type!");
1420       case MVT::i8:
1421         Reg = AddLiveIn(MF, NumIntRegs ? X86::DL : X86::AL,
1422                         X86::GR8RegisterClass);
1423         ArgValue = DAG.getCopyFromReg(Root, Reg, MVT::i8);
1424         break;
1425       case MVT::i16:
1426         Reg = AddLiveIn(MF, NumIntRegs ? X86::DX : X86::AX,
1427                         X86::GR16RegisterClass);
1428         ArgValue = DAG.getCopyFromReg(Root, Reg, MVT::i16);
1429         break;
1430       case MVT::i32:
1431         Reg = AddLiveIn(MF, NumIntRegs ? X86::EDX : X86::EAX,
1432                         X86::GR32RegisterClass);
1433         ArgValue = DAG.getCopyFromReg(Root, Reg, MVT::i32);
1434         break;
1435       case MVT::i64:
1436         Reg = AddLiveIn(MF, NumIntRegs ? X86::EDX : X86::EAX,
1437                         X86::GR32RegisterClass);
1438         ArgValue = DAG.getCopyFromReg(Root, Reg, MVT::i32);
1439         if (ObjIntRegs == 2) {
1440           Reg = AddLiveIn(MF, X86::EDX, X86::GR32RegisterClass);
1441           SDOperand ArgValue2 = DAG.getCopyFromReg(Root, Reg, MVT::i32);
1442           ArgValue= DAG.getNode(ISD::BUILD_PAIR, MVT::i64, ArgValue, ArgValue2);
1443         }
1444         break;
1445       case MVT::v16i8:
1446       case MVT::v8i16:
1447       case MVT::v4i32:
1448       case MVT::v2i64:
1449       case MVT::v4f32:
1450       case MVT::v2f64:
1451         Reg = AddLiveIn(MF, XMMArgRegs[NumXMMRegs], X86::VR128RegisterClass);
1452         ArgValue = DAG.getCopyFromReg(Root, Reg, ObjectVT);
1453         break;
1454       }
1455       NumIntRegs += ObjIntRegs;
1456       NumXMMRegs += ObjXMMRegs;
1457     }
1458
1459     if (ObjSize) {
1460       // XMM arguments have to be aligned on 16-byte boundary.
1461       if (ObjSize == 16)
1462         ArgOffset = ((ArgOffset + 15) / 16) * 16;
1463       // Create the SelectionDAG nodes corresponding to a load from this
1464       // parameter.
1465       int FI = MFI->CreateFixedObject(ObjSize, ArgOffset);
1466       SDOperand FIN = DAG.getFrameIndex(FI, getPointerTy());
1467       if (ObjectVT == MVT::i64 && ObjIntRegs) {
1468         SDOperand ArgValue2 = DAG.getLoad(Op.Val->getValueType(i), Root, FIN,
1469                                           NULL, 0);
1470         ArgValue = DAG.getNode(ISD::BUILD_PAIR, MVT::i64, ArgValue, ArgValue2);
1471       } else
1472         ArgValue = DAG.getLoad(Op.Val->getValueType(i), Root, FIN, NULL, 0);
1473       ArgOffset += ArgIncrement;   // Move on to the next argument.
1474     }
1475
1476     ArgValues.push_back(ArgValue);
1477   }
1478
1479   ArgValues.push_back(Root);
1480
1481   // Make sure the instruction takes 8n+4 bytes to make sure the start of the
1482   // arguments and the arguments after the retaddr has been pushed are aligned.
1483   if ((ArgOffset & 7) == 0)
1484     ArgOffset += 4;
1485
1486   VarArgsFrameIndex = 0xAAAAAAA;   // fastcc functions can't have varargs.
1487   RegSaveFrameIndex = 0xAAAAAAA;   // X86-64 only.
1488   ReturnAddrIndex = 0;             // No return address slot generated yet.
1489   BytesToPopOnReturn = ArgOffset;  // Callee pops all stack arguments.
1490   BytesCallerReserves = 0;
1491
1492   // Finally, inform the code generator which regs we return values in.
1493   switch (getValueType(MF.getFunction()->getReturnType())) {
1494   default: assert(0 && "Unknown type!");
1495   case MVT::isVoid: break;
1496   case MVT::i1:
1497   case MVT::i8:
1498   case MVT::i16:
1499   case MVT::i32:
1500     MF.addLiveOut(X86::EAX);
1501     break;
1502   case MVT::i64:
1503     MF.addLiveOut(X86::EAX);
1504     MF.addLiveOut(X86::EDX);
1505     break;
1506   case MVT::f32:
1507   case MVT::f64:
1508     MF.addLiveOut(X86::ST0);
1509     break;
1510   case MVT::v16i8:
1511   case MVT::v8i16:
1512   case MVT::v4i32:
1513   case MVT::v2i64:
1514   case MVT::v4f32:
1515   case MVT::v2f64:
1516     MF.addLiveOut(X86::XMM0);
1517     break;
1518   }
1519
1520   // Return the new list of results.
1521   std::vector<MVT::ValueType> RetVTs(Op.Val->value_begin(),
1522                                      Op.Val->value_end());
1523   return DAG.getNode(ISD::MERGE_VALUES, RetVTs, &ArgValues[0],ArgValues.size());
1524 }
1525
1526 SDOperand X86TargetLowering::LowerFastCCCallTo(SDOperand Op, SelectionDAG &DAG,
1527                                                bool isFastCall) {
1528   SDOperand Chain     = Op.getOperand(0);
1529   bool isTailCall     = cast<ConstantSDNode>(Op.getOperand(3))->getValue() != 0;
1530   SDOperand Callee    = Op.getOperand(4);
1531   MVT::ValueType RetVT= Op.Val->getValueType(0);
1532   unsigned NumOps     = (Op.getNumOperands() - 5) / 2;
1533
1534   // Count how many bytes are to be pushed on the stack.
1535   unsigned NumBytes = 0;
1536
1537   // Keep track of the number of integer regs passed so far.  This can be either
1538   // 0 (neither EAX or EDX used), 1 (EAX is used) or 2 (EAX and EDX are both
1539   // used).
1540   unsigned NumIntRegs = 0;
1541   unsigned NumXMMRegs = 0;  // XMM regs used for parameter passing.
1542
1543   static const unsigned GPRArgRegs[][2] = {
1544     { X86::AL,  X86::DL },
1545     { X86::AX,  X86::DX },
1546     { X86::EAX, X86::EDX }
1547   };
1548 #if 0
1549   static const unsigned FastCallGPRArgRegs[][2] = {
1550     { X86::CL,  X86::DL },
1551     { X86::CX,  X86::DX },
1552     { X86::ECX, X86::EDX }
1553   };  
1554 #endif
1555   static const unsigned XMMArgRegs[] = {
1556     X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3
1557   };
1558
1559   for (unsigned i = 0; i != NumOps; ++i) {
1560     SDOperand Arg = Op.getOperand(5+2*i);
1561
1562     switch (Arg.getValueType()) {
1563     default: assert(0 && "Unknown value type!");
1564     case MVT::i8:
1565     case MVT::i16:
1566     case MVT::i32: {
1567      unsigned MaxNumIntRegs = (isFastCall ? 2 : FASTCC_NUM_INT_ARGS_INREGS);
1568      if (NumIntRegs < MaxNumIntRegs) {
1569        ++NumIntRegs;
1570        break;
1571      }
1572      } // Fall through
1573     case MVT::f32:
1574       NumBytes += 4;
1575       break;
1576     case MVT::f64:
1577       NumBytes += 8;
1578       break;
1579     case MVT::v16i8:
1580     case MVT::v8i16:
1581     case MVT::v4i32:
1582     case MVT::v2i64:
1583     case MVT::v4f32:
1584     case MVT::v2f64:
1585      if (isFastCall) {
1586       assert(0 && "Unknown value type!");
1587      } else {
1588        if (NumXMMRegs < 4)
1589          NumXMMRegs++;
1590        else {
1591          // XMM arguments have to be aligned on 16-byte boundary.
1592          NumBytes = ((NumBytes + 15) / 16) * 16;
1593          NumBytes += 16;
1594        }
1595      }
1596      break;
1597     }
1598   }
1599
1600   // Make sure the instruction takes 8n+4 bytes to make sure the start of the
1601   // arguments and the arguments after the retaddr has been pushed are aligned.
1602   if ((NumBytes & 7) == 0)
1603     NumBytes += 4;
1604
1605   Chain = DAG.getCALLSEQ_START(Chain,DAG.getConstant(NumBytes, getPointerTy()));
1606
1607   // Arguments go on the stack in reverse order, as specified by the ABI.
1608   unsigned ArgOffset = 0;
1609   NumIntRegs = 0;
1610   std::vector<std::pair<unsigned, SDOperand> > RegsToPass;
1611   std::vector<SDOperand> MemOpChains;
1612   SDOperand StackPtr = DAG.getRegister(X86StackPtr, getPointerTy());
1613   for (unsigned i = 0; i != NumOps; ++i) {
1614     SDOperand Arg = Op.getOperand(5+2*i);
1615
1616     switch (Arg.getValueType()) {
1617     default: assert(0 && "Unexpected ValueType for argument!");
1618     case MVT::i8:
1619     case MVT::i16:
1620     case MVT::i32: {
1621      unsigned MaxNumIntRegs = (isFastCall ? 2 : FASTCC_NUM_INT_ARGS_INREGS);
1622      if (NumIntRegs < MaxNumIntRegs) {
1623        RegsToPass.push_back(
1624          std::make_pair(GPRArgRegs[Arg.getValueType()-MVT::i8][NumIntRegs],
1625                         Arg));
1626        ++NumIntRegs;
1627        break;
1628      }
1629      } // Fall through
1630     case MVT::f32: {
1631       SDOperand PtrOff = DAG.getConstant(ArgOffset, getPointerTy());
1632       PtrOff = DAG.getNode(ISD::ADD, getPointerTy(), StackPtr, PtrOff);
1633       MemOpChains.push_back(DAG.getStore(Chain, Arg, PtrOff, NULL, 0));
1634       ArgOffset += 4;
1635       break;
1636     }
1637     case MVT::f64: {
1638       SDOperand PtrOff = DAG.getConstant(ArgOffset, getPointerTy());
1639       PtrOff = DAG.getNode(ISD::ADD, getPointerTy(), StackPtr, PtrOff);
1640       MemOpChains.push_back(DAG.getStore(Chain, Arg, PtrOff, NULL, 0));
1641       ArgOffset += 8;
1642       break;
1643     }
1644     case MVT::v16i8:
1645     case MVT::v8i16:
1646     case MVT::v4i32:
1647     case MVT::v2i64:
1648     case MVT::v4f32:
1649     case MVT::v2f64:
1650      if (isFastCall) {
1651        assert(0 && "Unexpected ValueType for argument!");
1652      } else {
1653        if (NumXMMRegs < 4) {
1654          RegsToPass.push_back(std::make_pair(XMMArgRegs[NumXMMRegs], Arg));
1655          NumXMMRegs++;
1656        } else {
1657          // XMM arguments have to be aligned on 16-byte boundary.
1658          ArgOffset = ((ArgOffset + 15) / 16) * 16;
1659          SDOperand PtrOff = DAG.getConstant(ArgOffset, getPointerTy());
1660          PtrOff = DAG.getNode(ISD::ADD, getPointerTy(), StackPtr, PtrOff);
1661          MemOpChains.push_back(DAG.getStore(Chain, Arg, PtrOff, NULL, 0));
1662          ArgOffset += 16;
1663        }       
1664      }
1665      break;
1666     }
1667   }
1668
1669   if (!MemOpChains.empty())
1670     Chain = DAG.getNode(ISD::TokenFactor, MVT::Other,
1671                         &MemOpChains[0], MemOpChains.size());
1672
1673   // Build a sequence of copy-to-reg nodes chained together with token chain
1674   // and flag operands which copy the outgoing args into registers.
1675   SDOperand InFlag;
1676   for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) {
1677     Chain = DAG.getCopyToReg(Chain, RegsToPass[i].first, RegsToPass[i].second,
1678                              InFlag);
1679     InFlag = Chain.getValue(1);
1680   }
1681
1682   // If the callee is a GlobalAddress node (quite common, every direct call is)
1683   // turn it into a TargetGlobalAddress node so that legalize doesn't hack it.
1684   if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee))
1685     Callee = DAG.getTargetGlobalAddress(G->getGlobal(), getPointerTy());
1686   else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee))
1687     Callee = DAG.getTargetExternalSymbol(S->getSymbol(), getPointerTy());
1688
1689   std::vector<MVT::ValueType> NodeTys;
1690   NodeTys.push_back(MVT::Other);   // Returns a chain
1691   NodeTys.push_back(MVT::Flag);    // Returns a flag for retval copy to use.
1692   std::vector<SDOperand> Ops;
1693   Ops.push_back(Chain);
1694   Ops.push_back(Callee);
1695
1696   // Add argument registers to the end of the list so that they are known live
1697   // into the call.
1698   for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i)
1699     Ops.push_back(DAG.getRegister(RegsToPass[i].first, 
1700                                   RegsToPass[i].second.getValueType()));
1701
1702   if (InFlag.Val)
1703     Ops.push_back(InFlag);
1704
1705   // FIXME: Do not generate X86ISD::TAILCALL for now.
1706   Chain = DAG.getNode(isTailCall ? X86ISD::TAILCALL : X86ISD::CALL,
1707                       NodeTys, &Ops[0], Ops.size());
1708   InFlag = Chain.getValue(1);
1709
1710   NodeTys.clear();
1711   NodeTys.push_back(MVT::Other);   // Returns a chain
1712   if (RetVT != MVT::Other)
1713     NodeTys.push_back(MVT::Flag);  // Returns a flag for retval copy to use.
1714   Ops.clear();
1715   Ops.push_back(Chain);
1716   Ops.push_back(DAG.getConstant(NumBytes, getPointerTy()));
1717   Ops.push_back(DAG.getConstant(NumBytes, getPointerTy()));
1718   Ops.push_back(InFlag);
1719   Chain = DAG.getNode(ISD::CALLSEQ_END, NodeTys, &Ops[0], Ops.size());
1720   if (RetVT != MVT::Other)
1721     InFlag = Chain.getValue(1);
1722   
1723   std::vector<SDOperand> ResultVals;
1724   NodeTys.clear();
1725   switch (RetVT) {
1726   default: assert(0 && "Unknown value type to return!");
1727   case MVT::Other: break;
1728   case MVT::i8:
1729     Chain = DAG.getCopyFromReg(Chain, X86::AL, MVT::i8, InFlag).getValue(1);
1730     ResultVals.push_back(Chain.getValue(0));
1731     NodeTys.push_back(MVT::i8);
1732     break;
1733   case MVT::i16:
1734     Chain = DAG.getCopyFromReg(Chain, X86::AX, MVT::i16, InFlag).getValue(1);
1735     ResultVals.push_back(Chain.getValue(0));
1736     NodeTys.push_back(MVT::i16);
1737     break;
1738   case MVT::i32:
1739     if (Op.Val->getValueType(1) == MVT::i32) {
1740       Chain = DAG.getCopyFromReg(Chain, X86::EAX, MVT::i32, InFlag).getValue(1);
1741       ResultVals.push_back(Chain.getValue(0));
1742       Chain = DAG.getCopyFromReg(Chain, X86::EDX, MVT::i32,
1743                                  Chain.getValue(2)).getValue(1);
1744       ResultVals.push_back(Chain.getValue(0));
1745       NodeTys.push_back(MVT::i32);
1746     } else {
1747       Chain = DAG.getCopyFromReg(Chain, X86::EAX, MVT::i32, InFlag).getValue(1);
1748       ResultVals.push_back(Chain.getValue(0));
1749     }
1750     NodeTys.push_back(MVT::i32);
1751     break;
1752   case MVT::v16i8:
1753   case MVT::v8i16:
1754   case MVT::v4i32:
1755   case MVT::v2i64:
1756   case MVT::v4f32:
1757   case MVT::v2f64:
1758    if (isFastCall) {
1759      assert(0 && "Unknown value type to return!");
1760    } else {
1761      Chain = DAG.getCopyFromReg(Chain, X86::XMM0, RetVT, InFlag).getValue(1);
1762      ResultVals.push_back(Chain.getValue(0));
1763      NodeTys.push_back(RetVT);
1764    }
1765    break;
1766   case MVT::f32:
1767   case MVT::f64: {
1768     std::vector<MVT::ValueType> Tys;
1769     Tys.push_back(MVT::f64);
1770     Tys.push_back(MVT::Other);
1771     Tys.push_back(MVT::Flag);
1772     std::vector<SDOperand> Ops;
1773     Ops.push_back(Chain);
1774     Ops.push_back(InFlag);
1775     SDOperand RetVal = DAG.getNode(X86ISD::FP_GET_RESULT, Tys,
1776                                    &Ops[0], Ops.size());
1777     Chain  = RetVal.getValue(1);
1778     InFlag = RetVal.getValue(2);
1779     if (X86ScalarSSE) {
1780       // FIXME: Currently the FST is flagged to the FP_GET_RESULT. This
1781       // shouldn't be necessary except that RFP cannot be live across
1782       // multiple blocks. When stackifier is fixed, they can be uncoupled.
1783       MachineFunction &MF = DAG.getMachineFunction();
1784       int SSFI = MF.getFrameInfo()->CreateStackObject(8, 8);
1785       SDOperand StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
1786       Tys.clear();
1787       Tys.push_back(MVT::Other);
1788       Ops.clear();
1789       Ops.push_back(Chain);
1790       Ops.push_back(RetVal);
1791       Ops.push_back(StackSlot);
1792       Ops.push_back(DAG.getValueType(RetVT));
1793       Ops.push_back(InFlag);
1794       Chain = DAG.getNode(X86ISD::FST, Tys, &Ops[0], Ops.size());
1795       RetVal = DAG.getLoad(RetVT, Chain, StackSlot, NULL, 0);
1796       Chain = RetVal.getValue(1);
1797     }
1798
1799     if (RetVT == MVT::f32 && !X86ScalarSSE)
1800       // FIXME: we would really like to remember that this FP_ROUND
1801       // operation is okay to eliminate if we allow excess FP precision.
1802       RetVal = DAG.getNode(ISD::FP_ROUND, MVT::f32, RetVal);
1803     ResultVals.push_back(RetVal);
1804     NodeTys.push_back(RetVT);
1805     break;
1806   }
1807   }
1808
1809
1810   // If the function returns void, just return the chain.
1811   if (ResultVals.empty())
1812     return Chain;
1813   
1814   // Otherwise, merge everything together with a MERGE_VALUES node.
1815   NodeTys.push_back(MVT::Other);
1816   ResultVals.push_back(Chain);
1817   SDOperand Res = DAG.getNode(ISD::MERGE_VALUES, NodeTys,
1818                               &ResultVals[0], ResultVals.size());
1819   return Res.getValue(Op.ResNo);
1820 }
1821
1822 //===----------------------------------------------------------------------===//
1823 //                  StdCall Calling Convention implementation
1824 //===----------------------------------------------------------------------===//
1825 //  StdCall calling convention seems to be standard for many Windows' API
1826 //  routines and around. It differs from C calling convention just a little:
1827 //  callee should clean up the stack, not caller. Symbols should be also
1828 //  decorated in some fancy way :) It doesn't support any vector arguments.
1829
1830 /// HowToPassStdCallCCArgument - Returns how an formal argument of the specified
1831 /// type should be passed. Returns the size of the stack slot
1832 static void
1833 HowToPassStdCallCCArgument(MVT::ValueType ObjectVT, unsigned &ObjSize) {
1834   switch (ObjectVT) {
1835   default: assert(0 && "Unhandled argument type!");
1836   case MVT::i8:  ObjSize = 1; break;
1837   case MVT::i16: ObjSize = 2; break;
1838   case MVT::i32: ObjSize = 4; break;
1839   case MVT::i64: ObjSize = 8; break;
1840   case MVT::f32: ObjSize = 4; break;
1841   case MVT::f64: ObjSize = 8; break;
1842   }
1843 }
1844
1845 SDOperand X86TargetLowering::LowerStdCallCCArguments(SDOperand Op,
1846                                                      SelectionDAG &DAG) {
1847   unsigned NumArgs = Op.Val->getNumValues() - 1;
1848   MachineFunction &MF = DAG.getMachineFunction();
1849   MachineFrameInfo *MFI = MF.getFrameInfo();
1850   SDOperand Root = Op.getOperand(0);
1851   std::vector<SDOperand> ArgValues;
1852
1853   // Add DAG nodes to load the arguments...  On entry to a function on the X86,
1854   // the stack frame looks like this:
1855   //
1856   // [ESP] -- return address
1857   // [ESP + 4] -- first argument (leftmost lexically)
1858   // [ESP + 8] -- second argument, if first argument is <= 4 bytes in size
1859   //    ...
1860   //
1861   unsigned ArgOffset = 0;   // Frame mechanisms handle retaddr slot
1862   for (unsigned i = 0; i < NumArgs; ++i) {
1863     MVT::ValueType ObjectVT = Op.getValue(i).getValueType();
1864     unsigned ArgIncrement = 4;
1865     unsigned ObjSize = 0;
1866     HowToPassStdCallCCArgument(ObjectVT, ObjSize);
1867     if (ObjSize > 4)
1868       ArgIncrement = ObjSize;
1869
1870     SDOperand ArgValue;
1871     // Create the frame index object for this incoming parameter...
1872     int FI = MFI->CreateFixedObject(ObjSize, ArgOffset);
1873     SDOperand FIN = DAG.getFrameIndex(FI, getPointerTy());
1874     ArgValue = DAG.getLoad(Op.Val->getValueType(i), Root, FIN, NULL, 0);
1875     ArgValues.push_back(ArgValue);
1876     ArgOffset += ArgIncrement;   // Move on to the next argument...
1877   }
1878
1879   ArgValues.push_back(Root);
1880   
1881   // If the function takes variable number of arguments, make a frame index for
1882   // the start of the first vararg value... for expansion of llvm.va_start.
1883   bool isVarArg = cast<ConstantSDNode>(Op.getOperand(2))->getValue() != 0;
1884   if (isVarArg) {
1885     BytesToPopOnReturn = 0;         // Callee pops nothing.
1886     BytesCallerReserves = ArgOffset;
1887     VarArgsFrameIndex = MFI->CreateFixedObject(1, ArgOffset);
1888   } else {
1889     BytesToPopOnReturn = ArgOffset; // Callee pops everything..
1890     BytesCallerReserves = 0;
1891   }
1892   RegSaveFrameIndex = 0xAAAAAAA;    // X86-64 only.
1893   ReturnAddrIndex = 0;              // No return address slot generated yet.
1894
1895   MF.getInfo<X86FunctionInfo>()->setBytesToPopOnReturn(BytesToPopOnReturn);
1896   
1897   // Return the new list of results.
1898   std::vector<MVT::ValueType> RetVTs(Op.Val->value_begin(),
1899                                      Op.Val->value_end());
1900   return DAG.getNode(ISD::MERGE_VALUES, RetVTs, &ArgValues[0],ArgValues.size());
1901 }
1902
1903
1904 SDOperand X86TargetLowering::LowerStdCallCCCallTo(SDOperand Op,
1905                                                   SelectionDAG &DAG) {
1906   SDOperand Chain     = Op.getOperand(0);
1907   bool isVarArg       = cast<ConstantSDNode>(Op.getOperand(2))->getValue() != 0;
1908   bool isTailCall     = cast<ConstantSDNode>(Op.getOperand(3))->getValue() != 0;
1909   SDOperand Callee    = Op.getOperand(4);
1910   MVT::ValueType RetVT= Op.Val->getValueType(0);
1911   unsigned NumOps     = (Op.getNumOperands() - 5) / 2;  
1912   
1913   // Count how many bytes are to be pushed on the stack.
1914   unsigned NumBytes = 0;
1915   for (unsigned i = 0; i != NumOps; ++i) {
1916     SDOperand Arg = Op.getOperand(5+2*i);
1917
1918     switch (Arg.getValueType()) {
1919     default: assert(0 && "Unexpected ValueType for argument!");
1920     case MVT::i8:
1921     case MVT::i16:
1922     case MVT::i32:
1923     case MVT::f32:
1924       NumBytes += 4;
1925       break;
1926     case MVT::i64:
1927     case MVT::f64:
1928       NumBytes += 8;
1929       break;
1930     }
1931   }
1932   
1933   Chain = DAG.getCALLSEQ_START(Chain,DAG.getConstant(NumBytes, getPointerTy()));
1934
1935   // Arguments go on the stack in reverse order, as specified by the ABI.
1936   unsigned ArgOffset = 0;
1937   std::vector<SDOperand> MemOpChains;
1938   SDOperand StackPtr = DAG.getRegister(X86StackPtr, getPointerTy());
1939   for (unsigned i = 0; i != NumOps; ++i) {
1940     SDOperand Arg = Op.getOperand(5+2*i);
1941
1942     switch (Arg.getValueType()) {
1943     default: assert(0 && "Unexpected ValueType for argument!");
1944     case MVT::i8:
1945     case MVT::i16: {
1946       // Promote the integer to 32 bits.  If the input type is signed use a
1947       // sign extend, otherwise use a zero extend.
1948       unsigned ExtOp =
1949         dyn_cast<ConstantSDNode>(Op.getOperand(5+2*i+1))->getValue() ?
1950         ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
1951       Arg = DAG.getNode(ExtOp, MVT::i32, Arg);
1952     }
1953     // Fallthrough
1954
1955     case MVT::i32:
1956     case MVT::f32: {
1957       SDOperand PtrOff = DAG.getConstant(ArgOffset, getPointerTy());
1958       PtrOff = DAG.getNode(ISD::ADD, getPointerTy(), StackPtr, PtrOff);
1959       MemOpChains.push_back(DAG.getStore(Chain, Arg, PtrOff, NULL, 0));
1960       ArgOffset += 4;
1961       break;
1962     }
1963     case MVT::i64:
1964     case MVT::f64: {
1965       SDOperand PtrOff = DAG.getConstant(ArgOffset, getPointerTy());
1966       PtrOff = DAG.getNode(ISD::ADD, getPointerTy(), StackPtr, PtrOff);
1967       MemOpChains.push_back(DAG.getStore(Chain, Arg, PtrOff, NULL, 0));
1968       ArgOffset += 8;
1969       break;
1970     }
1971     }
1972   }
1973
1974   if (!MemOpChains.empty())
1975     Chain = DAG.getNode(ISD::TokenFactor, MVT::Other,
1976                         &MemOpChains[0], MemOpChains.size());
1977
1978   // If the callee is a GlobalAddress node (quite common, every direct call is)
1979   // turn it into a TargetGlobalAddress node so that legalize doesn't hack it.
1980   if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee))
1981     Callee = DAG.getTargetGlobalAddress(G->getGlobal(), getPointerTy());
1982   else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee))
1983     Callee = DAG.getTargetExternalSymbol(S->getSymbol(), getPointerTy());
1984
1985   std::vector<MVT::ValueType> NodeTys;
1986   NodeTys.push_back(MVT::Other);   // Returns a chain
1987   NodeTys.push_back(MVT::Flag);    // Returns a flag for retval copy to use.
1988   std::vector<SDOperand> Ops;
1989   Ops.push_back(Chain);
1990   Ops.push_back(Callee);
1991
1992   Chain = DAG.getNode(isTailCall ? X86ISD::TAILCALL : X86ISD::CALL,
1993                       NodeTys, &Ops[0], Ops.size());
1994   SDOperand InFlag = Chain.getValue(1);
1995
1996   // Create the CALLSEQ_END node.
1997   unsigned NumBytesForCalleeToPush;
1998   
1999   if (isVarArg) {
2000     NumBytesForCalleeToPush = 0;
2001   } else {
2002     NumBytesForCalleeToPush = NumBytes;
2003   }
2004
2005   NodeTys.clear();
2006   NodeTys.push_back(MVT::Other);   // Returns a chain
2007   if (RetVT != MVT::Other)
2008     NodeTys.push_back(MVT::Flag);  // Returns a flag for retval copy to use.
2009   Ops.clear();
2010   Ops.push_back(Chain);
2011   Ops.push_back(DAG.getConstant(NumBytes, getPointerTy()));
2012   Ops.push_back(DAG.getConstant(NumBytesForCalleeToPush, getPointerTy()));
2013   Ops.push_back(InFlag);
2014   Chain = DAG.getNode(ISD::CALLSEQ_END, NodeTys, &Ops[0], Ops.size());
2015   if (RetVT != MVT::Other)
2016     InFlag = Chain.getValue(1);
2017   
2018   std::vector<SDOperand> ResultVals;
2019   NodeTys.clear();
2020   switch (RetVT) {
2021   default: assert(0 && "Unknown value type to return!");
2022   case MVT::Other: break;
2023   case MVT::i8:
2024     Chain = DAG.getCopyFromReg(Chain, X86::AL, MVT::i8, InFlag).getValue(1);
2025     ResultVals.push_back(Chain.getValue(0));
2026     NodeTys.push_back(MVT::i8);
2027     break;
2028   case MVT::i16:
2029     Chain = DAG.getCopyFromReg(Chain, X86::AX, MVT::i16, InFlag).getValue(1);
2030     ResultVals.push_back(Chain.getValue(0));
2031     NodeTys.push_back(MVT::i16);
2032     break;
2033   case MVT::i32:
2034     if (Op.Val->getValueType(1) == MVT::i32) {
2035       Chain = DAG.getCopyFromReg(Chain, X86::EAX, MVT::i32, InFlag).getValue(1);
2036       ResultVals.push_back(Chain.getValue(0));
2037       Chain = DAG.getCopyFromReg(Chain, X86::EDX, MVT::i32,
2038                                  Chain.getValue(2)).getValue(1);
2039       ResultVals.push_back(Chain.getValue(0));
2040       NodeTys.push_back(MVT::i32);
2041     } else {
2042       Chain = DAG.getCopyFromReg(Chain, X86::EAX, MVT::i32, InFlag).getValue(1);
2043       ResultVals.push_back(Chain.getValue(0));
2044     }
2045     NodeTys.push_back(MVT::i32);
2046     break;
2047   case MVT::f32:
2048   case MVT::f64: {
2049     std::vector<MVT::ValueType> Tys;
2050     Tys.push_back(MVT::f64);
2051     Tys.push_back(MVT::Other);
2052     Tys.push_back(MVT::Flag);
2053     std::vector<SDOperand> Ops;
2054     Ops.push_back(Chain);
2055     Ops.push_back(InFlag);
2056     SDOperand RetVal = DAG.getNode(X86ISD::FP_GET_RESULT, Tys, 
2057                                    &Ops[0], Ops.size());
2058     Chain  = RetVal.getValue(1);
2059     InFlag = RetVal.getValue(2);
2060     if (X86ScalarSSE) {
2061       // FIXME: Currently the FST is flagged to the FP_GET_RESULT. This
2062       // shouldn't be necessary except that RFP cannot be live across
2063       // multiple blocks. When stackifier is fixed, they can be uncoupled.
2064       MachineFunction &MF = DAG.getMachineFunction();
2065       int SSFI = MF.getFrameInfo()->CreateStackObject(8, 8);
2066       SDOperand StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
2067       Tys.clear();
2068       Tys.push_back(MVT::Other);
2069       Ops.clear();
2070       Ops.push_back(Chain);
2071       Ops.push_back(RetVal);
2072       Ops.push_back(StackSlot);
2073       Ops.push_back(DAG.getValueType(RetVT));
2074       Ops.push_back(InFlag);
2075       Chain = DAG.getNode(X86ISD::FST, Tys, &Ops[0], Ops.size());
2076       RetVal = DAG.getLoad(RetVT, Chain, StackSlot, NULL, 0);
2077       Chain = RetVal.getValue(1);
2078     }
2079
2080     if (RetVT == MVT::f32 && !X86ScalarSSE)
2081       // FIXME: we would really like to remember that this FP_ROUND
2082       // operation is okay to eliminate if we allow excess FP precision.
2083       RetVal = DAG.getNode(ISD::FP_ROUND, MVT::f32, RetVal);
2084     ResultVals.push_back(RetVal);
2085     NodeTys.push_back(RetVT);
2086     break;
2087   }
2088   }
2089
2090   // If the function returns void, just return the chain.
2091   if (ResultVals.empty())
2092     return Chain;
2093   
2094   // Otherwise, merge everything together with a MERGE_VALUES node.
2095   NodeTys.push_back(MVT::Other);
2096   ResultVals.push_back(Chain);
2097   SDOperand Res = DAG.getNode(ISD::MERGE_VALUES, NodeTys,
2098                               &ResultVals[0], ResultVals.size());
2099   return Res.getValue(Op.ResNo);
2100 }
2101
2102 //===----------------------------------------------------------------------===//
2103 //                  FastCall Calling Convention implementation
2104 //===----------------------------------------------------------------------===//
2105 //
2106 // The X86 'fastcall' calling convention passes up to two integer arguments in
2107 // registers (an appropriate portion of ECX/EDX), passes arguments in C order,
2108 // and requires that the callee pop its arguments off the stack (allowing proper
2109 // tail calls), and has the same return value conventions as C calling convs.
2110 //
2111 // This calling convention always arranges for the callee pop value to be 8n+4
2112 // bytes, which is needed for tail recursion elimination and stack alignment
2113 // reasons.
2114 //
2115
2116 /// HowToPassFastCallCCArgument - Returns how an formal argument of the
2117 /// specified type should be passed. If it is through stack, returns the size of
2118 /// the stack slot; if it is through integer register, returns the number of
2119 /// integer registers are needed.
2120 static void
2121 HowToPassFastCallCCArgument(MVT::ValueType ObjectVT,
2122                             unsigned NumIntRegs,
2123                             unsigned &ObjSize,
2124                             unsigned &ObjIntRegs)
2125 {
2126   ObjSize = 0;
2127   ObjIntRegs = 0;
2128
2129   switch (ObjectVT) {
2130   default: assert(0 && "Unhandled argument type!");
2131   case MVT::i8:
2132    if (NumIntRegs < 2)
2133      ObjIntRegs = 1;
2134    else
2135      ObjSize = 1;
2136    break;
2137   case MVT::i16:
2138    if (NumIntRegs < 2)
2139      ObjIntRegs = 1;
2140    else
2141      ObjSize = 2;
2142    break;
2143   case MVT::i32:
2144    if (NumIntRegs < 2)
2145      ObjIntRegs = 1;
2146    else
2147      ObjSize = 4;
2148     break;
2149   case MVT::i64:
2150    if (NumIntRegs+2 <= 2) {
2151      ObjIntRegs = 2;
2152    } else if (NumIntRegs+1 <= 2) {
2153      ObjIntRegs = 1;
2154      ObjSize = 4;
2155    } else
2156      ObjSize = 8;
2157    case MVT::f32:
2158     ObjSize = 4;
2159     break;
2160    case MVT::f64:
2161     ObjSize = 8;
2162     break;
2163   }
2164 }
2165
2166 SDOperand
2167 X86TargetLowering::LowerFastCallCCArguments(SDOperand Op, SelectionDAG &DAG) {
2168   unsigned NumArgs = Op.Val->getNumValues()-1;
2169   MachineFunction &MF = DAG.getMachineFunction();
2170   MachineFrameInfo *MFI = MF.getFrameInfo();
2171   SDOperand Root = Op.getOperand(0);
2172   std::vector<SDOperand> ArgValues;
2173
2174   // Add DAG nodes to load the arguments...  On entry to a function the stack
2175   // frame looks like this:
2176   //
2177   // [ESP] -- return address
2178   // [ESP + 4] -- first nonreg argument (leftmost lexically)
2179   // [ESP + 8] -- second nonreg argument, if 1st argument is <= 4 bytes in size
2180   //    ...
2181   unsigned ArgOffset = 0;   // Frame mechanisms handle retaddr slot
2182
2183   // Keep track of the number of integer regs passed so far.  This can be either
2184   // 0 (neither ECX or EDX used), 1 (ECX is used) or 2 (ECX and EDX are both
2185   // used).
2186   unsigned NumIntRegs = 0;
2187
2188   for (unsigned i = 0; i < NumArgs; ++i) {
2189     MVT::ValueType ObjectVT = Op.getValue(i).getValueType();
2190     unsigned ArgIncrement = 4;
2191     unsigned ObjSize = 0;
2192     unsigned ObjIntRegs = 0;
2193
2194     HowToPassFastCallCCArgument(ObjectVT, NumIntRegs, ObjSize, ObjIntRegs);
2195     if (ObjSize > 4)
2196       ArgIncrement = ObjSize;
2197
2198     unsigned Reg = 0;
2199     SDOperand ArgValue;
2200     if (ObjIntRegs) {
2201       switch (ObjectVT) {
2202       default: assert(0 && "Unhandled argument type!");
2203       case MVT::i8:
2204         Reg = AddLiveIn(MF, NumIntRegs ? X86::DL : X86::CL,
2205                         X86::GR8RegisterClass);
2206         ArgValue = DAG.getCopyFromReg(Root, Reg, MVT::i8);
2207         break;
2208       case MVT::i16:
2209         Reg = AddLiveIn(MF, NumIntRegs ? X86::DX : X86::CX,
2210                         X86::GR16RegisterClass);
2211         ArgValue = DAG.getCopyFromReg(Root, Reg, MVT::i16);
2212         break;
2213       case MVT::i32:
2214         Reg = AddLiveIn(MF, NumIntRegs ? X86::EDX : X86::ECX,
2215                         X86::GR32RegisterClass);
2216         ArgValue = DAG.getCopyFromReg(Root, Reg, MVT::i32);
2217         break;
2218       case MVT::i64:
2219         Reg = AddLiveIn(MF, NumIntRegs ? X86::EDX : X86::ECX,
2220                         X86::GR32RegisterClass);
2221         ArgValue = DAG.getCopyFromReg(Root, Reg, MVT::i32);
2222         if (ObjIntRegs == 2) {
2223           Reg = AddLiveIn(MF, X86::EDX, X86::GR32RegisterClass);
2224           SDOperand ArgValue2 = DAG.getCopyFromReg(Root, Reg, MVT::i32);
2225           ArgValue= DAG.getNode(ISD::BUILD_PAIR, MVT::i64, ArgValue, ArgValue2);
2226         }
2227         break;
2228       }
2229       
2230       NumIntRegs += ObjIntRegs;
2231     }
2232
2233     if (ObjSize) {
2234       // Create the SelectionDAG nodes corresponding to a load from this
2235       // parameter.
2236       int FI = MFI->CreateFixedObject(ObjSize, ArgOffset);
2237       SDOperand FIN = DAG.getFrameIndex(FI, getPointerTy());
2238       if (ObjectVT == MVT::i64 && ObjIntRegs) {
2239         SDOperand ArgValue2 = DAG.getLoad(Op.Val->getValueType(i), Root, FIN,
2240                                           NULL, 0);
2241         ArgValue = DAG.getNode(ISD::BUILD_PAIR, MVT::i64, ArgValue, ArgValue2);
2242       } else
2243         ArgValue = DAG.getLoad(Op.Val->getValueType(i), Root, FIN, NULL, 0);
2244       ArgOffset += ArgIncrement;   // Move on to the next argument.
2245     }
2246
2247     ArgValues.push_back(ArgValue);
2248   }
2249
2250   ArgValues.push_back(Root);
2251
2252   // Make sure the instruction takes 8n+4 bytes to make sure the start of the
2253   // arguments and the arguments after the retaddr has been pushed are aligned.
2254   if ((ArgOffset & 7) == 0)
2255     ArgOffset += 4;
2256
2257   VarArgsFrameIndex = 0xAAAAAAA;   // fastcc functions can't have varargs.
2258   RegSaveFrameIndex = 0xAAAAAAA;   // X86-64 only.
2259   ReturnAddrIndex = 0;             // No return address slot generated yet.
2260   BytesToPopOnReturn = ArgOffset;  // Callee pops all stack arguments.
2261   BytesCallerReserves = 0;
2262
2263   MF.getInfo<X86FunctionInfo>()->setBytesToPopOnReturn(BytesToPopOnReturn);
2264
2265   // Finally, inform the code generator which regs we return values in.
2266   switch (getValueType(MF.getFunction()->getReturnType())) {
2267   default: assert(0 && "Unknown type!");
2268   case MVT::isVoid: break;
2269   case MVT::i1:
2270   case MVT::i8:
2271   case MVT::i16:
2272   case MVT::i32:
2273     MF.addLiveOut(X86::ECX);
2274     break;
2275   case MVT::i64:
2276     MF.addLiveOut(X86::ECX);
2277     MF.addLiveOut(X86::EDX);
2278     break;
2279   case MVT::f32:
2280   case MVT::f64:
2281     MF.addLiveOut(X86::ST0);
2282     break;
2283   }
2284
2285   // Return the new list of results.
2286   std::vector<MVT::ValueType> RetVTs(Op.Val->value_begin(),
2287                                      Op.Val->value_end());
2288   return DAG.getNode(ISD::MERGE_VALUES, RetVTs, &ArgValues[0],ArgValues.size());
2289 }
2290
2291 SDOperand X86TargetLowering::getReturnAddressFrameIndex(SelectionDAG &DAG) {
2292   if (ReturnAddrIndex == 0) {
2293     // Set up a frame object for the return address.
2294     MachineFunction &MF = DAG.getMachineFunction();
2295     if (Subtarget->is64Bit())
2296       ReturnAddrIndex = MF.getFrameInfo()->CreateFixedObject(8, -8);
2297     else
2298       ReturnAddrIndex = MF.getFrameInfo()->CreateFixedObject(4, -4);
2299   }
2300
2301   return DAG.getFrameIndex(ReturnAddrIndex, getPointerTy());
2302 }
2303
2304
2305
2306 std::pair<SDOperand, SDOperand> X86TargetLowering::
2307 LowerFrameReturnAddress(bool isFrameAddress, SDOperand Chain, unsigned Depth,
2308                         SelectionDAG &DAG) {
2309   SDOperand Result;
2310   if (Depth)        // Depths > 0 not supported yet!
2311     Result = DAG.getConstant(0, getPointerTy());
2312   else {
2313     SDOperand RetAddrFI = getReturnAddressFrameIndex(DAG);
2314     if (!isFrameAddress)
2315       // Just load the return address
2316       Result = DAG.getLoad(getPointerTy(), DAG.getEntryNode(), RetAddrFI,
2317                            NULL, 0);
2318     else
2319       Result = DAG.getNode(ISD::SUB, getPointerTy(), RetAddrFI,
2320                            DAG.getConstant(4, getPointerTy()));
2321   }
2322   return std::make_pair(Result, Chain);
2323 }
2324
2325 /// translateX86CC - do a one to one translation of a ISD::CondCode to the X86
2326 /// specific condition code. It returns a false if it cannot do a direct
2327 /// translation. X86CC is the translated CondCode.  LHS/RHS are modified as
2328 /// needed.
2329 static bool translateX86CC(ISD::CondCode SetCCOpcode, bool isFP,
2330                            unsigned &X86CC, SDOperand &LHS, SDOperand &RHS,
2331                            SelectionDAG &DAG) {
2332   X86CC = X86::COND_INVALID;
2333   if (!isFP) {
2334     if (ConstantSDNode *RHSC = dyn_cast<ConstantSDNode>(RHS)) {
2335       if (SetCCOpcode == ISD::SETGT && RHSC->isAllOnesValue()) {
2336         // X > -1   -> X == 0, jump !sign.
2337         RHS = DAG.getConstant(0, RHS.getValueType());
2338         X86CC = X86::COND_NS;
2339         return true;
2340       } else if (SetCCOpcode == ISD::SETLT && RHSC->isNullValue()) {
2341         // X < 0   -> X == 0, jump on sign.
2342         X86CC = X86::COND_S;
2343         return true;
2344       }
2345     }
2346     
2347     switch (SetCCOpcode) {
2348     default: break;
2349     case ISD::SETEQ:  X86CC = X86::COND_E;  break;
2350     case ISD::SETGT:  X86CC = X86::COND_G;  break;
2351     case ISD::SETGE:  X86CC = X86::COND_GE; break;
2352     case ISD::SETLT:  X86CC = X86::COND_L;  break;
2353     case ISD::SETLE:  X86CC = X86::COND_LE; break;
2354     case ISD::SETNE:  X86CC = X86::COND_NE; break;
2355     case ISD::SETULT: X86CC = X86::COND_B;  break;
2356     case ISD::SETUGT: X86CC = X86::COND_A;  break;
2357     case ISD::SETULE: X86CC = X86::COND_BE; break;
2358     case ISD::SETUGE: X86CC = X86::COND_AE; break;
2359     }
2360   } else {
2361     // On a floating point condition, the flags are set as follows:
2362     // ZF  PF  CF   op
2363     //  0 | 0 | 0 | X > Y
2364     //  0 | 0 | 1 | X < Y
2365     //  1 | 0 | 0 | X == Y
2366     //  1 | 1 | 1 | unordered
2367     bool Flip = false;
2368     switch (SetCCOpcode) {
2369     default: break;
2370     case ISD::SETUEQ:
2371     case ISD::SETEQ: X86CC = X86::COND_E;  break;
2372     case ISD::SETOLT: Flip = true; // Fallthrough
2373     case ISD::SETOGT:
2374     case ISD::SETGT: X86CC = X86::COND_A;  break;
2375     case ISD::SETOLE: Flip = true; // Fallthrough
2376     case ISD::SETOGE:
2377     case ISD::SETGE: X86CC = X86::COND_AE; break;
2378     case ISD::SETUGT: Flip = true; // Fallthrough
2379     case ISD::SETULT:
2380     case ISD::SETLT: X86CC = X86::COND_B;  break;
2381     case ISD::SETUGE: Flip = true; // Fallthrough
2382     case ISD::SETULE:
2383     case ISD::SETLE: X86CC = X86::COND_BE; break;
2384     case ISD::SETONE:
2385     case ISD::SETNE: X86CC = X86::COND_NE; break;
2386     case ISD::SETUO: X86CC = X86::COND_P;  break;
2387     case ISD::SETO:  X86CC = X86::COND_NP; break;
2388     }
2389     if (Flip)
2390       std::swap(LHS, RHS);
2391   }
2392
2393   return X86CC != X86::COND_INVALID;
2394 }
2395
2396 /// hasFPCMov - is there a floating point cmov for the specific X86 condition
2397 /// code. Current x86 isa includes the following FP cmov instructions:
2398 /// fcmovb, fcomvbe, fcomve, fcmovu, fcmovae, fcmova, fcmovne, fcmovnu.
2399 static bool hasFPCMov(unsigned X86CC) {
2400   switch (X86CC) {
2401   default:
2402     return false;
2403   case X86::COND_B:
2404   case X86::COND_BE:
2405   case X86::COND_E:
2406   case X86::COND_P:
2407   case X86::COND_A:
2408   case X86::COND_AE:
2409   case X86::COND_NE:
2410   case X86::COND_NP:
2411     return true;
2412   }
2413 }
2414
2415 /// DarwinGVRequiresExtraLoad - true if accessing the GV requires an extra
2416 /// load. For Darwin, external and weak symbols are indirect, loading the value
2417 /// at address GV rather then the value of GV itself. This means that the
2418 /// GlobalAddress must be in the base or index register of the address, not the
2419 /// GV offset field.
2420 static bool DarwinGVRequiresExtraLoad(GlobalValue *GV) {
2421   return (GV->hasWeakLinkage() || GV->hasLinkOnceLinkage() ||
2422           (GV->isExternal() && !GV->hasNotBeenReadFromBytecode()));
2423 }
2424
2425 /// WindowsGVRequiresExtraLoad - true if accessing the GV requires an extra
2426 /// load. For Windows, dllimported symbols are indirect, loading the value at
2427 /// address GV rather then the value of GV itself. This means that the
2428 /// GlobalAddress must be in the base or index register of the address, not the
2429 /// GV offset field.
2430 static bool WindowsGVRequiresExtraLoad(GlobalValue *GV) {
2431   return (GV->hasDLLImportLinkage());  
2432 }
2433
2434 /// isUndefOrInRange - Op is either an undef node or a ConstantSDNode.  Return
2435 /// true if Op is undef or if its value falls within the specified range (L, H].
2436 static bool isUndefOrInRange(SDOperand Op, unsigned Low, unsigned Hi) {
2437   if (Op.getOpcode() == ISD::UNDEF)
2438     return true;
2439
2440   unsigned Val = cast<ConstantSDNode>(Op)->getValue();
2441   return (Val >= Low && Val < Hi);
2442 }
2443
2444 /// isUndefOrEqual - Op is either an undef node or a ConstantSDNode.  Return
2445 /// true if Op is undef or if its value equal to the specified value.
2446 static bool isUndefOrEqual(SDOperand Op, unsigned Val) {
2447   if (Op.getOpcode() == ISD::UNDEF)
2448     return true;
2449   return cast<ConstantSDNode>(Op)->getValue() == Val;
2450 }
2451
2452 /// isPSHUFDMask - Return true if the specified VECTOR_SHUFFLE operand
2453 /// specifies a shuffle of elements that is suitable for input to PSHUFD.
2454 bool X86::isPSHUFDMask(SDNode *N) {
2455   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2456
2457   if (N->getNumOperands() != 4)
2458     return false;
2459
2460   // Check if the value doesn't reference the second vector.
2461   for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
2462     SDOperand Arg = N->getOperand(i);
2463     if (Arg.getOpcode() == ISD::UNDEF) continue;
2464     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2465     if (cast<ConstantSDNode>(Arg)->getValue() >= 4)
2466       return false;
2467   }
2468
2469   return true;
2470 }
2471
2472 /// isPSHUFHWMask - Return true if the specified VECTOR_SHUFFLE operand
2473 /// specifies a shuffle of elements that is suitable for input to PSHUFHW.
2474 bool X86::isPSHUFHWMask(SDNode *N) {
2475   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2476
2477   if (N->getNumOperands() != 8)
2478     return false;
2479
2480   // Lower quadword copied in order.
2481   for (unsigned i = 0; i != 4; ++i) {
2482     SDOperand Arg = N->getOperand(i);
2483     if (Arg.getOpcode() == ISD::UNDEF) continue;
2484     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2485     if (cast<ConstantSDNode>(Arg)->getValue() != i)
2486       return false;
2487   }
2488
2489   // Upper quadword shuffled.
2490   for (unsigned i = 4; i != 8; ++i) {
2491     SDOperand Arg = N->getOperand(i);
2492     if (Arg.getOpcode() == ISD::UNDEF) continue;
2493     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2494     unsigned Val = cast<ConstantSDNode>(Arg)->getValue();
2495     if (Val < 4 || Val > 7)
2496       return false;
2497   }
2498
2499   return true;
2500 }
2501
2502 /// isPSHUFLWMask - Return true if the specified VECTOR_SHUFFLE operand
2503 /// specifies a shuffle of elements that is suitable for input to PSHUFLW.
2504 bool X86::isPSHUFLWMask(SDNode *N) {
2505   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2506
2507   if (N->getNumOperands() != 8)
2508     return false;
2509
2510   // Upper quadword copied in order.
2511   for (unsigned i = 4; i != 8; ++i)
2512     if (!isUndefOrEqual(N->getOperand(i), i))
2513       return false;
2514
2515   // Lower quadword shuffled.
2516   for (unsigned i = 0; i != 4; ++i)
2517     if (!isUndefOrInRange(N->getOperand(i), 0, 4))
2518       return false;
2519
2520   return true;
2521 }
2522
2523 /// isSHUFPMask - Return true if the specified VECTOR_SHUFFLE operand
2524 /// specifies a shuffle of elements that is suitable for input to SHUFP*.
2525 static bool isSHUFPMask(std::vector<SDOperand> &N) {
2526   unsigned NumElems = N.size();
2527   if (NumElems != 2 && NumElems != 4) return false;
2528
2529   unsigned Half = NumElems / 2;
2530   for (unsigned i = 0; i < Half; ++i)
2531     if (!isUndefOrInRange(N[i], 0, NumElems))
2532       return false;
2533   for (unsigned i = Half; i < NumElems; ++i)
2534     if (!isUndefOrInRange(N[i], NumElems, NumElems*2))
2535       return false;
2536
2537   return true;
2538 }
2539
2540 bool X86::isSHUFPMask(SDNode *N) {
2541   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2542   std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
2543   return ::isSHUFPMask(Ops);
2544 }
2545
2546 /// isCommutedSHUFP - Returns true if the shuffle mask is except
2547 /// the reverse of what x86 shuffles want. x86 shuffles requires the lower
2548 /// half elements to come from vector 1 (which would equal the dest.) and
2549 /// the upper half to come from vector 2.
2550 static bool isCommutedSHUFP(std::vector<SDOperand> &Ops) {
2551   unsigned NumElems = Ops.size();
2552   if (NumElems != 2 && NumElems != 4) return false;
2553
2554   unsigned Half = NumElems / 2;
2555   for (unsigned i = 0; i < Half; ++i)
2556     if (!isUndefOrInRange(Ops[i], NumElems, NumElems*2))
2557       return false;
2558   for (unsigned i = Half; i < NumElems; ++i)
2559     if (!isUndefOrInRange(Ops[i], 0, NumElems))
2560       return false;
2561   return true;
2562 }
2563
2564 static bool isCommutedSHUFP(SDNode *N) {
2565   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2566   std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
2567   return isCommutedSHUFP(Ops);
2568 }
2569
2570 /// isMOVHLPSMask - Return true if the specified VECTOR_SHUFFLE operand
2571 /// specifies a shuffle of elements that is suitable for input to MOVHLPS.
2572 bool X86::isMOVHLPSMask(SDNode *N) {
2573   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2574
2575   if (N->getNumOperands() != 4)
2576     return false;
2577
2578   // Expect bit0 == 6, bit1 == 7, bit2 == 2, bit3 == 3
2579   return isUndefOrEqual(N->getOperand(0), 6) &&
2580          isUndefOrEqual(N->getOperand(1), 7) &&
2581          isUndefOrEqual(N->getOperand(2), 2) &&
2582          isUndefOrEqual(N->getOperand(3), 3);
2583 }
2584
2585 /// isMOVHLPS_v_undef_Mask - Special case of isMOVHLPSMask for canonical form
2586 /// of vector_shuffle v, v, <2, 3, 2, 3>, i.e. vector_shuffle v, undef,
2587 /// <2, 3, 2, 3>
2588 bool X86::isMOVHLPS_v_undef_Mask(SDNode *N) {
2589   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2590
2591   if (N->getNumOperands() != 4)
2592     return false;
2593
2594   // Expect bit0 == 2, bit1 == 3, bit2 == 2, bit3 == 3
2595   return isUndefOrEqual(N->getOperand(0), 2) &&
2596          isUndefOrEqual(N->getOperand(1), 3) &&
2597          isUndefOrEqual(N->getOperand(2), 2) &&
2598          isUndefOrEqual(N->getOperand(3), 3);
2599 }
2600
2601 /// isMOVLPMask - Return true if the specified VECTOR_SHUFFLE operand
2602 /// specifies a shuffle of elements that is suitable for input to MOVLP{S|D}.
2603 bool X86::isMOVLPMask(SDNode *N) {
2604   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2605
2606   unsigned NumElems = N->getNumOperands();
2607   if (NumElems != 2 && NumElems != 4)
2608     return false;
2609
2610   for (unsigned i = 0; i < NumElems/2; ++i)
2611     if (!isUndefOrEqual(N->getOperand(i), i + NumElems))
2612       return false;
2613
2614   for (unsigned i = NumElems/2; i < NumElems; ++i)
2615     if (!isUndefOrEqual(N->getOperand(i), i))
2616       return false;
2617
2618   return true;
2619 }
2620
2621 /// isMOVHPMask - Return true if the specified VECTOR_SHUFFLE operand
2622 /// specifies a shuffle of elements that is suitable for input to MOVHP{S|D}
2623 /// and MOVLHPS.
2624 bool X86::isMOVHPMask(SDNode *N) {
2625   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2626
2627   unsigned NumElems = N->getNumOperands();
2628   if (NumElems != 2 && NumElems != 4)
2629     return false;
2630
2631   for (unsigned i = 0; i < NumElems/2; ++i)
2632     if (!isUndefOrEqual(N->getOperand(i), i))
2633       return false;
2634
2635   for (unsigned i = 0; i < NumElems/2; ++i) {
2636     SDOperand Arg = N->getOperand(i + NumElems/2);
2637     if (!isUndefOrEqual(Arg, i + NumElems))
2638       return false;
2639   }
2640
2641   return true;
2642 }
2643
2644 /// isUNPCKLMask - Return true if the specified VECTOR_SHUFFLE operand
2645 /// specifies a shuffle of elements that is suitable for input to UNPCKL.
2646 bool static isUNPCKLMask(std::vector<SDOperand> &N, bool V2IsSplat = false) {
2647   unsigned NumElems = N.size();
2648   if (NumElems != 2 && NumElems != 4 && NumElems != 8 && NumElems != 16)
2649     return false;
2650
2651   for (unsigned i = 0, j = 0; i != NumElems; i += 2, ++j) {
2652     SDOperand BitI  = N[i];
2653     SDOperand BitI1 = N[i+1];
2654     if (!isUndefOrEqual(BitI, j))
2655       return false;
2656     if (V2IsSplat) {
2657       if (isUndefOrEqual(BitI1, NumElems))
2658         return false;
2659     } else {
2660       if (!isUndefOrEqual(BitI1, j + NumElems))
2661         return false;
2662     }
2663   }
2664
2665   return true;
2666 }
2667
2668 bool X86::isUNPCKLMask(SDNode *N, bool V2IsSplat) {
2669   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2670   std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
2671   return ::isUNPCKLMask(Ops, V2IsSplat);
2672 }
2673
2674 /// isUNPCKHMask - Return true if the specified VECTOR_SHUFFLE operand
2675 /// specifies a shuffle of elements that is suitable for input to UNPCKH.
2676 bool static isUNPCKHMask(std::vector<SDOperand> &N, bool V2IsSplat = false) {
2677   unsigned NumElems = N.size();
2678   if (NumElems != 2 && NumElems != 4 && NumElems != 8 && NumElems != 16)
2679     return false;
2680
2681   for (unsigned i = 0, j = 0; i != NumElems; i += 2, ++j) {
2682     SDOperand BitI  = N[i];
2683     SDOperand BitI1 = N[i+1];
2684     if (!isUndefOrEqual(BitI, j + NumElems/2))
2685       return false;
2686     if (V2IsSplat) {
2687       if (isUndefOrEqual(BitI1, NumElems))
2688         return false;
2689     } else {
2690       if (!isUndefOrEqual(BitI1, j + NumElems/2 + NumElems))
2691         return false;
2692     }
2693   }
2694
2695   return true;
2696 }
2697
2698 bool X86::isUNPCKHMask(SDNode *N, bool V2IsSplat) {
2699   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2700   std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
2701   return ::isUNPCKHMask(Ops, V2IsSplat);
2702 }
2703
2704 /// isUNPCKL_v_undef_Mask - Special case of isUNPCKLMask for canonical form
2705 /// of vector_shuffle v, v, <0, 4, 1, 5>, i.e. vector_shuffle v, undef,
2706 /// <0, 0, 1, 1>
2707 bool X86::isUNPCKL_v_undef_Mask(SDNode *N) {
2708   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2709
2710   unsigned NumElems = N->getNumOperands();
2711   if (NumElems != 4 && NumElems != 8 && NumElems != 16)
2712     return false;
2713
2714   for (unsigned i = 0, j = 0; i != NumElems; i += 2, ++j) {
2715     SDOperand BitI  = N->getOperand(i);
2716     SDOperand BitI1 = N->getOperand(i+1);
2717
2718     if (!isUndefOrEqual(BitI, j))
2719       return false;
2720     if (!isUndefOrEqual(BitI1, j))
2721       return false;
2722   }
2723
2724   return true;
2725 }
2726
2727 /// isMOVLMask - Return true if the specified VECTOR_SHUFFLE operand
2728 /// specifies a shuffle of elements that is suitable for input to MOVSS,
2729 /// MOVSD, and MOVD, i.e. setting the lowest element.
2730 static bool isMOVLMask(std::vector<SDOperand> &N) {
2731   unsigned NumElems = N.size();
2732   if (NumElems != 2 && NumElems != 4 && NumElems != 8 && NumElems != 16)
2733     return false;
2734
2735   if (!isUndefOrEqual(N[0], NumElems))
2736     return false;
2737
2738   for (unsigned i = 1; i < NumElems; ++i) {
2739     SDOperand Arg = N[i];
2740     if (!isUndefOrEqual(Arg, i))
2741       return false;
2742   }
2743
2744   return true;
2745 }
2746
2747 bool X86::isMOVLMask(SDNode *N) {
2748   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2749   std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
2750   return ::isMOVLMask(Ops);
2751 }
2752
2753 /// isCommutedMOVL - Returns true if the shuffle mask is except the reverse
2754 /// of what x86 movss want. X86 movs requires the lowest  element to be lowest
2755 /// element of vector 2 and the other elements to come from vector 1 in order.
2756 static bool isCommutedMOVL(std::vector<SDOperand> &Ops, bool V2IsSplat = false,
2757                            bool V2IsUndef = false) {
2758   unsigned NumElems = Ops.size();
2759   if (NumElems != 2 && NumElems != 4 && NumElems != 8 && NumElems != 16)
2760     return false;
2761
2762   if (!isUndefOrEqual(Ops[0], 0))
2763     return false;
2764
2765   for (unsigned i = 1; i < NumElems; ++i) {
2766     SDOperand Arg = Ops[i];
2767     if (!(isUndefOrEqual(Arg, i+NumElems) ||
2768           (V2IsUndef && isUndefOrInRange(Arg, NumElems, NumElems*2)) ||
2769           (V2IsSplat && isUndefOrEqual(Arg, NumElems))))
2770       return false;
2771   }
2772
2773   return true;
2774 }
2775
2776 static bool isCommutedMOVL(SDNode *N, bool V2IsSplat = false,
2777                            bool V2IsUndef = false) {
2778   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2779   std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
2780   return isCommutedMOVL(Ops, V2IsSplat, V2IsUndef);
2781 }
2782
2783 /// isMOVSHDUPMask - Return true if the specified VECTOR_SHUFFLE operand
2784 /// specifies a shuffle of elements that is suitable for input to MOVSHDUP.
2785 bool X86::isMOVSHDUPMask(SDNode *N) {
2786   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2787
2788   if (N->getNumOperands() != 4)
2789     return false;
2790
2791   // Expect 1, 1, 3, 3
2792   for (unsigned i = 0; i < 2; ++i) {
2793     SDOperand Arg = N->getOperand(i);
2794     if (Arg.getOpcode() == ISD::UNDEF) continue;
2795     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2796     unsigned Val = cast<ConstantSDNode>(Arg)->getValue();
2797     if (Val != 1) return false;
2798   }
2799
2800   bool HasHi = false;
2801   for (unsigned i = 2; i < 4; ++i) {
2802     SDOperand Arg = N->getOperand(i);
2803     if (Arg.getOpcode() == ISD::UNDEF) continue;
2804     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2805     unsigned Val = cast<ConstantSDNode>(Arg)->getValue();
2806     if (Val != 3) return false;
2807     HasHi = true;
2808   }
2809
2810   // Don't use movshdup if it can be done with a shufps.
2811   return HasHi;
2812 }
2813
2814 /// isMOVSLDUPMask - Return true if the specified VECTOR_SHUFFLE operand
2815 /// specifies a shuffle of elements that is suitable for input to MOVSLDUP.
2816 bool X86::isMOVSLDUPMask(SDNode *N) {
2817   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2818
2819   if (N->getNumOperands() != 4)
2820     return false;
2821
2822   // Expect 0, 0, 2, 2
2823   for (unsigned i = 0; i < 2; ++i) {
2824     SDOperand Arg = N->getOperand(i);
2825     if (Arg.getOpcode() == ISD::UNDEF) continue;
2826     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2827     unsigned Val = cast<ConstantSDNode>(Arg)->getValue();
2828     if (Val != 0) return false;
2829   }
2830
2831   bool HasHi = false;
2832   for (unsigned i = 2; i < 4; ++i) {
2833     SDOperand Arg = N->getOperand(i);
2834     if (Arg.getOpcode() == ISD::UNDEF) continue;
2835     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2836     unsigned Val = cast<ConstantSDNode>(Arg)->getValue();
2837     if (Val != 2) return false;
2838     HasHi = true;
2839   }
2840
2841   // Don't use movshdup if it can be done with a shufps.
2842   return HasHi;
2843 }
2844
2845 /// isSplatMask - Return true if the specified VECTOR_SHUFFLE operand specifies
2846 /// a splat of a single element.
2847 static bool isSplatMask(SDNode *N) {
2848   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2849
2850   // This is a splat operation if each element of the permute is the same, and
2851   // if the value doesn't reference the second vector.
2852   unsigned NumElems = N->getNumOperands();
2853   SDOperand ElementBase;
2854   unsigned i = 0;
2855   for (; i != NumElems; ++i) {
2856     SDOperand Elt = N->getOperand(i);
2857     if (isa<ConstantSDNode>(Elt)) {
2858       ElementBase = Elt;
2859       break;
2860     }
2861   }
2862
2863   if (!ElementBase.Val)
2864     return false;
2865
2866   for (; i != NumElems; ++i) {
2867     SDOperand Arg = N->getOperand(i);
2868     if (Arg.getOpcode() == ISD::UNDEF) continue;
2869     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2870     if (Arg != ElementBase) return false;
2871   }
2872
2873   // Make sure it is a splat of the first vector operand.
2874   return cast<ConstantSDNode>(ElementBase)->getValue() < NumElems;
2875 }
2876
2877 /// isSplatMask - Return true if the specified VECTOR_SHUFFLE operand specifies
2878 /// a splat of a single element and it's a 2 or 4 element mask.
2879 bool X86::isSplatMask(SDNode *N) {
2880   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2881
2882   // We can only splat 64-bit, and 32-bit quantities with a single instruction.
2883   if (N->getNumOperands() != 4 && N->getNumOperands() != 2)
2884     return false;
2885   return ::isSplatMask(N);
2886 }
2887
2888 /// isSplatLoMask - Return true if the specified VECTOR_SHUFFLE operand
2889 /// specifies a splat of zero element.
2890 bool X86::isSplatLoMask(SDNode *N) {
2891   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2892
2893   for (unsigned i = 0, e = N->getNumOperands(); i < e; ++i) 
2894     if (!isUndefOrEqual(N->getOperand(i), 0))
2895       return false;
2896   return true;
2897 }
2898
2899 /// getShuffleSHUFImmediate - Return the appropriate immediate to shuffle
2900 /// the specified isShuffleMask VECTOR_SHUFFLE mask with PSHUF* and SHUFP*
2901 /// instructions.
2902 unsigned X86::getShuffleSHUFImmediate(SDNode *N) {
2903   unsigned NumOperands = N->getNumOperands();
2904   unsigned Shift = (NumOperands == 4) ? 2 : 1;
2905   unsigned Mask = 0;
2906   for (unsigned i = 0; i < NumOperands; ++i) {
2907     unsigned Val = 0;
2908     SDOperand Arg = N->getOperand(NumOperands-i-1);
2909     if (Arg.getOpcode() != ISD::UNDEF)
2910       Val = cast<ConstantSDNode>(Arg)->getValue();
2911     if (Val >= NumOperands) Val -= NumOperands;
2912     Mask |= Val;
2913     if (i != NumOperands - 1)
2914       Mask <<= Shift;
2915   }
2916
2917   return Mask;
2918 }
2919
2920 /// getShufflePSHUFHWImmediate - Return the appropriate immediate to shuffle
2921 /// the specified isShuffleMask VECTOR_SHUFFLE mask with PSHUFHW
2922 /// instructions.
2923 unsigned X86::getShufflePSHUFHWImmediate(SDNode *N) {
2924   unsigned Mask = 0;
2925   // 8 nodes, but we only care about the last 4.
2926   for (unsigned i = 7; i >= 4; --i) {
2927     unsigned Val = 0;
2928     SDOperand Arg = N->getOperand(i);
2929     if (Arg.getOpcode() != ISD::UNDEF)
2930       Val = cast<ConstantSDNode>(Arg)->getValue();
2931     Mask |= (Val - 4);
2932     if (i != 4)
2933       Mask <<= 2;
2934   }
2935
2936   return Mask;
2937 }
2938
2939 /// getShufflePSHUFLWImmediate - Return the appropriate immediate to shuffle
2940 /// the specified isShuffleMask VECTOR_SHUFFLE mask with PSHUFLW
2941 /// instructions.
2942 unsigned X86::getShufflePSHUFLWImmediate(SDNode *N) {
2943   unsigned Mask = 0;
2944   // 8 nodes, but we only care about the first 4.
2945   for (int i = 3; i >= 0; --i) {
2946     unsigned Val = 0;
2947     SDOperand Arg = N->getOperand(i);
2948     if (Arg.getOpcode() != ISD::UNDEF)
2949       Val = cast<ConstantSDNode>(Arg)->getValue();
2950     Mask |= Val;
2951     if (i != 0)
2952       Mask <<= 2;
2953   }
2954
2955   return Mask;
2956 }
2957
2958 /// isPSHUFHW_PSHUFLWMask - true if the specified VECTOR_SHUFFLE operand
2959 /// specifies a 8 element shuffle that can be broken into a pair of
2960 /// PSHUFHW and PSHUFLW.
2961 static bool isPSHUFHW_PSHUFLWMask(SDNode *N) {
2962   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2963
2964   if (N->getNumOperands() != 8)
2965     return false;
2966
2967   // Lower quadword shuffled.
2968   for (unsigned i = 0; i != 4; ++i) {
2969     SDOperand Arg = N->getOperand(i);
2970     if (Arg.getOpcode() == ISD::UNDEF) continue;
2971     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2972     unsigned Val = cast<ConstantSDNode>(Arg)->getValue();
2973     if (Val > 4)
2974       return false;
2975   }
2976
2977   // Upper quadword shuffled.
2978   for (unsigned i = 4; i != 8; ++i) {
2979     SDOperand Arg = N->getOperand(i);
2980     if (Arg.getOpcode() == ISD::UNDEF) continue;
2981     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2982     unsigned Val = cast<ConstantSDNode>(Arg)->getValue();
2983     if (Val < 4 || Val > 7)
2984       return false;
2985   }
2986
2987   return true;
2988 }
2989
2990 /// CommuteVectorShuffle - Swap vector_shuffle operandsas well as
2991 /// values in ther permute mask.
2992 static SDOperand CommuteVectorShuffle(SDOperand Op, SDOperand &V1,
2993                                       SDOperand &V2, SDOperand &Mask,
2994                                       SelectionDAG &DAG) {
2995   MVT::ValueType VT = Op.getValueType();
2996   MVT::ValueType MaskVT = Mask.getValueType();
2997   MVT::ValueType EltVT = MVT::getVectorBaseType(MaskVT);
2998   unsigned NumElems = Mask.getNumOperands();
2999   std::vector<SDOperand> MaskVec;
3000
3001   for (unsigned i = 0; i != NumElems; ++i) {
3002     SDOperand Arg = Mask.getOperand(i);
3003     if (Arg.getOpcode() == ISD::UNDEF) {
3004       MaskVec.push_back(DAG.getNode(ISD::UNDEF, EltVT));
3005       continue;
3006     }
3007     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
3008     unsigned Val = cast<ConstantSDNode>(Arg)->getValue();
3009     if (Val < NumElems)
3010       MaskVec.push_back(DAG.getConstant(Val + NumElems, EltVT));
3011     else
3012       MaskVec.push_back(DAG.getConstant(Val - NumElems, EltVT));
3013   }
3014
3015   std::swap(V1, V2);
3016   Mask = DAG.getNode(ISD::BUILD_VECTOR, MaskVT, &MaskVec[0], MaskVec.size());
3017   return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1, V2, Mask);
3018 }
3019
3020 /// ShouldXformToMOVHLPS - Return true if the node should be transformed to
3021 /// match movhlps. The lower half elements should come from upper half of
3022 /// V1 (and in order), and the upper half elements should come from the upper
3023 /// half of V2 (and in order). 
3024 static bool ShouldXformToMOVHLPS(SDNode *Mask) {
3025   unsigned NumElems = Mask->getNumOperands();
3026   if (NumElems != 4)
3027     return false;
3028   for (unsigned i = 0, e = 2; i != e; ++i)
3029     if (!isUndefOrEqual(Mask->getOperand(i), i+2))
3030       return false;
3031   for (unsigned i = 2; i != 4; ++i)
3032     if (!isUndefOrEqual(Mask->getOperand(i), i+4))
3033       return false;
3034   return true;
3035 }
3036
3037 /// isScalarLoadToVector - Returns true if the node is a scalar load that
3038 /// is promoted to a vector.
3039 static inline bool isScalarLoadToVector(SDNode *N) {
3040   if (N->getOpcode() == ISD::SCALAR_TO_VECTOR) {
3041     N = N->getOperand(0).Val;
3042     return ISD::isNON_EXTLoad(N);
3043   }
3044   return false;
3045 }
3046
3047 /// ShouldXformToMOVLP{S|D} - Return true if the node should be transformed to
3048 /// match movlp{s|d}. The lower half elements should come from lower half of
3049 /// V1 (and in order), and the upper half elements should come from the upper
3050 /// half of V2 (and in order). And since V1 will become the source of the
3051 /// MOVLP, it must be either a vector load or a scalar load to vector.
3052 static bool ShouldXformToMOVLP(SDNode *V1, SDNode *V2, SDNode *Mask) {
3053   if (!ISD::isNON_EXTLoad(V1) && !isScalarLoadToVector(V1))
3054     return false;
3055   // Is V2 is a vector load, don't do this transformation. We will try to use
3056   // load folding shufps op.
3057   if (ISD::isNON_EXTLoad(V2))
3058     return false;
3059
3060   unsigned NumElems = Mask->getNumOperands();
3061   if (NumElems != 2 && NumElems != 4)
3062     return false;
3063   for (unsigned i = 0, e = NumElems/2; i != e; ++i)
3064     if (!isUndefOrEqual(Mask->getOperand(i), i))
3065       return false;
3066   for (unsigned i = NumElems/2; i != NumElems; ++i)
3067     if (!isUndefOrEqual(Mask->getOperand(i), i+NumElems))
3068       return false;
3069   return true;
3070 }
3071
3072 /// isSplatVector - Returns true if N is a BUILD_VECTOR node whose elements are
3073 /// all the same.
3074 static bool isSplatVector(SDNode *N) {
3075   if (N->getOpcode() != ISD::BUILD_VECTOR)
3076     return false;
3077
3078   SDOperand SplatValue = N->getOperand(0);
3079   for (unsigned i = 1, e = N->getNumOperands(); i != e; ++i)
3080     if (N->getOperand(i) != SplatValue)
3081       return false;
3082   return true;
3083 }
3084
3085 /// isUndefShuffle - Returns true if N is a VECTOR_SHUFFLE that can be resolved
3086 /// to an undef.
3087 static bool isUndefShuffle(SDNode *N) {
3088   if (N->getOpcode() != ISD::BUILD_VECTOR)
3089     return false;
3090
3091   SDOperand V1 = N->getOperand(0);
3092   SDOperand V2 = N->getOperand(1);
3093   SDOperand Mask = N->getOperand(2);
3094   unsigned NumElems = Mask.getNumOperands();
3095   for (unsigned i = 0; i != NumElems; ++i) {
3096     SDOperand Arg = Mask.getOperand(i);
3097     if (Arg.getOpcode() != ISD::UNDEF) {
3098       unsigned Val = cast<ConstantSDNode>(Arg)->getValue();
3099       if (Val < NumElems && V1.getOpcode() != ISD::UNDEF)
3100         return false;
3101       else if (Val >= NumElems && V2.getOpcode() != ISD::UNDEF)
3102         return false;
3103     }
3104   }
3105   return true;
3106 }
3107
3108 /// NormalizeMask - V2 is a splat, modify the mask (if needed) so all elements
3109 /// that point to V2 points to its first element.
3110 static SDOperand NormalizeMask(SDOperand Mask, SelectionDAG &DAG) {
3111   assert(Mask.getOpcode() == ISD::BUILD_VECTOR);
3112
3113   bool Changed = false;
3114   std::vector<SDOperand> MaskVec;
3115   unsigned NumElems = Mask.getNumOperands();
3116   for (unsigned i = 0; i != NumElems; ++i) {
3117     SDOperand Arg = Mask.getOperand(i);
3118     if (Arg.getOpcode() != ISD::UNDEF) {
3119       unsigned Val = cast<ConstantSDNode>(Arg)->getValue();
3120       if (Val > NumElems) {
3121         Arg = DAG.getConstant(NumElems, Arg.getValueType());
3122         Changed = true;
3123       }
3124     }
3125     MaskVec.push_back(Arg);
3126   }
3127
3128   if (Changed)
3129     Mask = DAG.getNode(ISD::BUILD_VECTOR, Mask.getValueType(),
3130                        &MaskVec[0], MaskVec.size());
3131   return Mask;
3132 }
3133
3134 /// getMOVLMask - Returns a vector_shuffle mask for an movs{s|d}, movd
3135 /// operation of specified width.
3136 static SDOperand getMOVLMask(unsigned NumElems, SelectionDAG &DAG) {
3137   MVT::ValueType MaskVT = MVT::getIntVectorWithNumElements(NumElems);
3138   MVT::ValueType BaseVT = MVT::getVectorBaseType(MaskVT);
3139
3140   std::vector<SDOperand> MaskVec;
3141   MaskVec.push_back(DAG.getConstant(NumElems, BaseVT));
3142   for (unsigned i = 1; i != NumElems; ++i)
3143     MaskVec.push_back(DAG.getConstant(i, BaseVT));
3144   return DAG.getNode(ISD::BUILD_VECTOR, MaskVT, &MaskVec[0], MaskVec.size());
3145 }
3146
3147 /// getUnpacklMask - Returns a vector_shuffle mask for an unpackl operation
3148 /// of specified width.
3149 static SDOperand getUnpacklMask(unsigned NumElems, SelectionDAG &DAG) {
3150   MVT::ValueType MaskVT = MVT::getIntVectorWithNumElements(NumElems);
3151   MVT::ValueType BaseVT = MVT::getVectorBaseType(MaskVT);
3152   std::vector<SDOperand> MaskVec;
3153   for (unsigned i = 0, e = NumElems/2; i != e; ++i) {
3154     MaskVec.push_back(DAG.getConstant(i,            BaseVT));
3155     MaskVec.push_back(DAG.getConstant(i + NumElems, BaseVT));
3156   }
3157   return DAG.getNode(ISD::BUILD_VECTOR, MaskVT, &MaskVec[0], MaskVec.size());
3158 }
3159
3160 /// getUnpackhMask - Returns a vector_shuffle mask for an unpackh operation
3161 /// of specified width.
3162 static SDOperand getUnpackhMask(unsigned NumElems, SelectionDAG &DAG) {
3163   MVT::ValueType MaskVT = MVT::getIntVectorWithNumElements(NumElems);
3164   MVT::ValueType BaseVT = MVT::getVectorBaseType(MaskVT);
3165   unsigned Half = NumElems/2;
3166   std::vector<SDOperand> MaskVec;
3167   for (unsigned i = 0; i != Half; ++i) {
3168     MaskVec.push_back(DAG.getConstant(i + Half,            BaseVT));
3169     MaskVec.push_back(DAG.getConstant(i + NumElems + Half, BaseVT));
3170   }
3171   return DAG.getNode(ISD::BUILD_VECTOR, MaskVT, &MaskVec[0], MaskVec.size());
3172 }
3173
3174 /// getZeroVector - Returns a vector of specified type with all zero elements.
3175 ///
3176 static SDOperand getZeroVector(MVT::ValueType VT, SelectionDAG &DAG) {
3177   assert(MVT::isVector(VT) && "Expected a vector type");
3178   unsigned NumElems = getVectorNumElements(VT);
3179   MVT::ValueType EVT = MVT::getVectorBaseType(VT);
3180   bool isFP = MVT::isFloatingPoint(EVT);
3181   SDOperand Zero = isFP ? DAG.getConstantFP(0.0, EVT) : DAG.getConstant(0, EVT);
3182   std::vector<SDOperand> ZeroVec(NumElems, Zero);
3183   return DAG.getNode(ISD::BUILD_VECTOR, VT, &ZeroVec[0], ZeroVec.size());
3184 }
3185
3186 /// PromoteSplat - Promote a splat of v8i16 or v16i8 to v4i32.
3187 ///
3188 static SDOperand PromoteSplat(SDOperand Op, SelectionDAG &DAG) {
3189   SDOperand V1 = Op.getOperand(0);
3190   SDOperand Mask = Op.getOperand(2);
3191   MVT::ValueType VT = Op.getValueType();
3192   unsigned NumElems = Mask.getNumOperands();
3193   Mask = getUnpacklMask(NumElems, DAG);
3194   while (NumElems != 4) {
3195     V1 = DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1, V1, Mask);
3196     NumElems >>= 1;
3197   }
3198   V1 = DAG.getNode(ISD::BIT_CONVERT, MVT::v4i32, V1);
3199
3200   MVT::ValueType MaskVT = MVT::getIntVectorWithNumElements(4);
3201   Mask = getZeroVector(MaskVT, DAG);
3202   SDOperand Shuffle = DAG.getNode(ISD::VECTOR_SHUFFLE, MVT::v4i32, V1,
3203                                   DAG.getNode(ISD::UNDEF, MVT::v4i32), Mask);
3204   return DAG.getNode(ISD::BIT_CONVERT, VT, Shuffle);
3205 }
3206
3207 /// isZeroNode - Returns true if Elt is a constant zero or a floating point
3208 /// constant +0.0.
3209 static inline bool isZeroNode(SDOperand Elt) {
3210   return ((isa<ConstantSDNode>(Elt) &&
3211            cast<ConstantSDNode>(Elt)->getValue() == 0) ||
3212           (isa<ConstantFPSDNode>(Elt) &&
3213            cast<ConstantFPSDNode>(Elt)->isExactlyValue(0.0)));
3214 }
3215
3216 /// getShuffleVectorZeroOrUndef - Return a vector_shuffle of the specified
3217 /// vector and zero or undef vector.
3218 static SDOperand getShuffleVectorZeroOrUndef(SDOperand V2, MVT::ValueType VT,
3219                                              unsigned NumElems, unsigned Idx,
3220                                              bool isZero, SelectionDAG &DAG) {
3221   SDOperand V1 = isZero ? getZeroVector(VT, DAG) : DAG.getNode(ISD::UNDEF, VT);
3222   MVT::ValueType MaskVT = MVT::getIntVectorWithNumElements(NumElems);
3223   MVT::ValueType EVT = MVT::getVectorBaseType(MaskVT);
3224   SDOperand Zero = DAG.getConstant(0, EVT);
3225   std::vector<SDOperand> MaskVec(NumElems, Zero);
3226   MaskVec[Idx] = DAG.getConstant(NumElems, EVT);
3227   SDOperand Mask = DAG.getNode(ISD::BUILD_VECTOR, MaskVT,
3228                                &MaskVec[0], MaskVec.size());
3229   return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1, V2, Mask);
3230 }
3231
3232 /// LowerBuildVectorv16i8 - Custom lower build_vector of v16i8.
3233 ///
3234 static SDOperand LowerBuildVectorv16i8(SDOperand Op, unsigned NonZeros,
3235                                        unsigned NumNonZero, unsigned NumZero,
3236                                        SelectionDAG &DAG, TargetLowering &TLI) {
3237   if (NumNonZero > 8)
3238     return SDOperand();
3239
3240   SDOperand V(0, 0);
3241   bool First = true;
3242   for (unsigned i = 0; i < 16; ++i) {
3243     bool ThisIsNonZero = (NonZeros & (1 << i)) != 0;
3244     if (ThisIsNonZero && First) {
3245       if (NumZero)
3246         V = getZeroVector(MVT::v8i16, DAG);
3247       else
3248         V = DAG.getNode(ISD::UNDEF, MVT::v8i16);
3249       First = false;
3250     }
3251
3252     if ((i & 1) != 0) {
3253       SDOperand ThisElt(0, 0), LastElt(0, 0);
3254       bool LastIsNonZero = (NonZeros & (1 << (i-1))) != 0;
3255       if (LastIsNonZero) {
3256         LastElt = DAG.getNode(ISD::ZERO_EXTEND, MVT::i16, Op.getOperand(i-1));
3257       }
3258       if (ThisIsNonZero) {
3259         ThisElt = DAG.getNode(ISD::ZERO_EXTEND, MVT::i16, Op.getOperand(i));
3260         ThisElt = DAG.getNode(ISD::SHL, MVT::i16,
3261                               ThisElt, DAG.getConstant(8, MVT::i8));
3262         if (LastIsNonZero)
3263           ThisElt = DAG.getNode(ISD::OR, MVT::i16, ThisElt, LastElt);
3264       } else
3265         ThisElt = LastElt;
3266
3267       if (ThisElt.Val)
3268         V = DAG.getNode(ISD::INSERT_VECTOR_ELT, MVT::v8i16, V, ThisElt,
3269                         DAG.getConstant(i/2, TLI.getPointerTy()));
3270     }
3271   }
3272
3273   return DAG.getNode(ISD::BIT_CONVERT, MVT::v16i8, V);
3274 }
3275
3276 /// LowerBuildVectorv16i8 - Custom lower build_vector of v8i16.
3277 ///
3278 static SDOperand LowerBuildVectorv8i16(SDOperand Op, unsigned NonZeros,
3279                                        unsigned NumNonZero, unsigned NumZero,
3280                                        SelectionDAG &DAG, TargetLowering &TLI) {
3281   if (NumNonZero > 4)
3282     return SDOperand();
3283
3284   SDOperand V(0, 0);
3285   bool First = true;
3286   for (unsigned i = 0; i < 8; ++i) {
3287     bool isNonZero = (NonZeros & (1 << i)) != 0;
3288     if (isNonZero) {
3289       if (First) {
3290         if (NumZero)
3291           V = getZeroVector(MVT::v8i16, DAG);
3292         else
3293           V = DAG.getNode(ISD::UNDEF, MVT::v8i16);
3294         First = false;
3295       }
3296       V = DAG.getNode(ISD::INSERT_VECTOR_ELT, MVT::v8i16, V, Op.getOperand(i),
3297                       DAG.getConstant(i, TLI.getPointerTy()));
3298     }
3299   }
3300
3301   return V;
3302 }
3303
3304 SDOperand
3305 X86TargetLowering::LowerBUILD_VECTOR(SDOperand Op, SelectionDAG &DAG) {
3306   // All zero's are handled with pxor.
3307   if (ISD::isBuildVectorAllZeros(Op.Val))
3308     return Op;
3309
3310   // All one's are handled with pcmpeqd.
3311   if (ISD::isBuildVectorAllOnes(Op.Val))
3312     return Op;
3313
3314   MVT::ValueType VT = Op.getValueType();
3315   MVT::ValueType EVT = MVT::getVectorBaseType(VT);
3316   unsigned EVTBits = MVT::getSizeInBits(EVT);
3317
3318   unsigned NumElems = Op.getNumOperands();
3319   unsigned NumZero  = 0;
3320   unsigned NumNonZero = 0;
3321   unsigned NonZeros = 0;
3322   std::set<SDOperand> Values;
3323   for (unsigned i = 0; i < NumElems; ++i) {
3324     SDOperand Elt = Op.getOperand(i);
3325     if (Elt.getOpcode() != ISD::UNDEF) {
3326       Values.insert(Elt);
3327       if (isZeroNode(Elt))
3328         NumZero++;
3329       else {
3330         NonZeros |= (1 << i);
3331         NumNonZero++;
3332       }
3333     }
3334   }
3335
3336   if (NumNonZero == 0)
3337     // Must be a mix of zero and undef. Return a zero vector.
3338     return getZeroVector(VT, DAG);
3339
3340   // Splat is obviously ok. Let legalizer expand it to a shuffle.
3341   if (Values.size() == 1)
3342     return SDOperand();
3343
3344   // Special case for single non-zero element.
3345   if (NumNonZero == 1) {
3346     unsigned Idx = CountTrailingZeros_32(NonZeros);
3347     SDOperand Item = Op.getOperand(Idx);
3348     Item = DAG.getNode(ISD::SCALAR_TO_VECTOR, VT, Item);
3349     if (Idx == 0)
3350       // Turn it into a MOVL (i.e. movss, movsd, or movd) to a zero vector.
3351       return getShuffleVectorZeroOrUndef(Item, VT, NumElems, Idx,
3352                                          NumZero > 0, DAG);
3353
3354     if (EVTBits == 32) {
3355       // Turn it into a shuffle of zero and zero-extended scalar to vector.
3356       Item = getShuffleVectorZeroOrUndef(Item, VT, NumElems, 0, NumZero > 0,
3357                                          DAG);
3358       MVT::ValueType MaskVT  = MVT::getIntVectorWithNumElements(NumElems);
3359       MVT::ValueType MaskEVT = MVT::getVectorBaseType(MaskVT);
3360       std::vector<SDOperand> MaskVec;
3361       for (unsigned i = 0; i < NumElems; i++)
3362         MaskVec.push_back(DAG.getConstant((i == Idx) ? 0 : 1, MaskEVT));
3363       SDOperand Mask = DAG.getNode(ISD::BUILD_VECTOR, MaskVT,
3364                                    &MaskVec[0], MaskVec.size());
3365       return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, Item,
3366                          DAG.getNode(ISD::UNDEF, VT), Mask);
3367     }
3368   }
3369
3370   // Let legalizer expand 2-wide build_vector's.
3371   if (EVTBits == 64)
3372     return SDOperand();
3373
3374   // If element VT is < 32 bits, convert it to inserts into a zero vector.
3375   if (EVTBits == 8) {
3376     SDOperand V = LowerBuildVectorv16i8(Op, NonZeros,NumNonZero,NumZero, DAG,
3377                                         *this);
3378     if (V.Val) return V;
3379   }
3380
3381   if (EVTBits == 16) {
3382     SDOperand V = LowerBuildVectorv8i16(Op, NonZeros,NumNonZero,NumZero, DAG,
3383                                         *this);
3384     if (V.Val) return V;
3385   }
3386
3387   // If element VT is == 32 bits, turn it into a number of shuffles.
3388   std::vector<SDOperand> V(NumElems);
3389   if (NumElems == 4 && NumZero > 0) {
3390     for (unsigned i = 0; i < 4; ++i) {
3391       bool isZero = !(NonZeros & (1 << i));
3392       if (isZero)
3393         V[i] = getZeroVector(VT, DAG);
3394       else
3395         V[i] = DAG.getNode(ISD::SCALAR_TO_VECTOR, VT, Op.getOperand(i));
3396     }
3397
3398     for (unsigned i = 0; i < 2; ++i) {
3399       switch ((NonZeros & (0x3 << i*2)) >> (i*2)) {
3400         default: break;
3401         case 0:
3402           V[i] = V[i*2];  // Must be a zero vector.
3403           break;
3404         case 1:
3405           V[i] = DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V[i*2+1], V[i*2],
3406                              getMOVLMask(NumElems, DAG));
3407           break;
3408         case 2:
3409           V[i] = DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V[i*2], V[i*2+1],
3410                              getMOVLMask(NumElems, DAG));
3411           break;
3412         case 3:
3413           V[i] = DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V[i*2], V[i*2+1],
3414                              getUnpacklMask(NumElems, DAG));
3415           break;
3416       }
3417     }
3418
3419     // Take advantage of the fact GR32 to VR128 scalar_to_vector (i.e. movd)
3420     // clears the upper bits. 
3421     // FIXME: we can do the same for v4f32 case when we know both parts of
3422     // the lower half come from scalar_to_vector (loadf32). We should do
3423     // that in post legalizer dag combiner with target specific hooks.
3424     if (MVT::isInteger(EVT) && (NonZeros & (0x3 << 2)) == 0)
3425       return V[0];
3426     MVT::ValueType MaskVT = MVT::getIntVectorWithNumElements(NumElems);
3427     MVT::ValueType EVT = MVT::getVectorBaseType(MaskVT);
3428     std::vector<SDOperand> MaskVec;
3429     bool Reverse = (NonZeros & 0x3) == 2;
3430     for (unsigned i = 0; i < 2; ++i)
3431       if (Reverse)
3432         MaskVec.push_back(DAG.getConstant(1-i, EVT));
3433       else
3434         MaskVec.push_back(DAG.getConstant(i, EVT));
3435     Reverse = ((NonZeros & (0x3 << 2)) >> 2) == 2;
3436     for (unsigned i = 0; i < 2; ++i)
3437       if (Reverse)
3438         MaskVec.push_back(DAG.getConstant(1-i+NumElems, EVT));
3439       else
3440         MaskVec.push_back(DAG.getConstant(i+NumElems, EVT));
3441     SDOperand ShufMask = DAG.getNode(ISD::BUILD_VECTOR, MaskVT,
3442                                      &MaskVec[0], MaskVec.size());
3443     return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V[0], V[1], ShufMask);
3444   }
3445
3446   if (Values.size() > 2) {
3447     // Expand into a number of unpckl*.
3448     // e.g. for v4f32
3449     //   Step 1: unpcklps 0, 2 ==> X: <?, ?, 2, 0>
3450     //         : unpcklps 1, 3 ==> Y: <?, ?, 3, 1>
3451     //   Step 2: unpcklps X, Y ==>    <3, 2, 1, 0>
3452     SDOperand UnpckMask = getUnpacklMask(NumElems, DAG);
3453     for (unsigned i = 0; i < NumElems; ++i)
3454       V[i] = DAG.getNode(ISD::SCALAR_TO_VECTOR, VT, Op.getOperand(i));
3455     NumElems >>= 1;
3456     while (NumElems != 0) {
3457       for (unsigned i = 0; i < NumElems; ++i)
3458         V[i] = DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V[i], V[i + NumElems],
3459                            UnpckMask);
3460       NumElems >>= 1;
3461     }
3462     return V[0];
3463   }
3464
3465   return SDOperand();
3466 }
3467
3468 SDOperand
3469 X86TargetLowering::LowerVECTOR_SHUFFLE(SDOperand Op, SelectionDAG &DAG) {
3470   SDOperand V1 = Op.getOperand(0);
3471   SDOperand V2 = Op.getOperand(1);
3472   SDOperand PermMask = Op.getOperand(2);
3473   MVT::ValueType VT = Op.getValueType();
3474   unsigned NumElems = PermMask.getNumOperands();
3475   bool V1IsUndef = V1.getOpcode() == ISD::UNDEF;
3476   bool V2IsUndef = V2.getOpcode() == ISD::UNDEF;
3477   bool V1IsSplat = false;
3478   bool V2IsSplat = false;
3479
3480   if (isUndefShuffle(Op.Val))
3481     return DAG.getNode(ISD::UNDEF, VT);
3482
3483   if (isSplatMask(PermMask.Val)) {
3484     if (NumElems <= 4) return Op;
3485     // Promote it to a v4i32 splat.
3486     return PromoteSplat(Op, DAG);
3487   }
3488
3489   if (X86::isMOVLMask(PermMask.Val))
3490     return (V1IsUndef) ? V2 : Op;
3491       
3492   if (X86::isMOVSHDUPMask(PermMask.Val) ||
3493       X86::isMOVSLDUPMask(PermMask.Val) ||
3494       X86::isMOVHLPSMask(PermMask.Val) ||
3495       X86::isMOVHPMask(PermMask.Val) ||
3496       X86::isMOVLPMask(PermMask.Val))
3497     return Op;
3498
3499   if (ShouldXformToMOVHLPS(PermMask.Val) ||
3500       ShouldXformToMOVLP(V1.Val, V2.Val, PermMask.Val))
3501     return CommuteVectorShuffle(Op, V1, V2, PermMask, DAG);
3502
3503   bool Commuted = false;
3504   V1IsSplat = isSplatVector(V1.Val);
3505   V2IsSplat = isSplatVector(V2.Val);
3506   if ((V1IsSplat || V1IsUndef) && !(V2IsSplat || V2IsUndef)) {
3507     Op = CommuteVectorShuffle(Op, V1, V2, PermMask, DAG);
3508     std::swap(V1IsSplat, V2IsSplat);
3509     std::swap(V1IsUndef, V2IsUndef);
3510     Commuted = true;
3511   }
3512
3513   if (isCommutedMOVL(PermMask.Val, V2IsSplat, V2IsUndef)) {
3514     if (V2IsUndef) return V1;
3515     Op = CommuteVectorShuffle(Op, V1, V2, PermMask, DAG);
3516     if (V2IsSplat) {
3517       // V2 is a splat, so the mask may be malformed. That is, it may point
3518       // to any V2 element. The instruction selectior won't like this. Get
3519       // a corrected mask and commute to form a proper MOVS{S|D}.
3520       SDOperand NewMask = getMOVLMask(NumElems, DAG);
3521       if (NewMask.Val != PermMask.Val)
3522         Op = DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1, V2, NewMask);
3523     }
3524     return Op;
3525   }
3526
3527   if (X86::isUNPCKL_v_undef_Mask(PermMask.Val) ||
3528       X86::isUNPCKLMask(PermMask.Val) ||
3529       X86::isUNPCKHMask(PermMask.Val))
3530     return Op;
3531
3532   if (V2IsSplat) {
3533     // Normalize mask so all entries that point to V2 points to its first
3534     // element then try to match unpck{h|l} again. If match, return a 
3535     // new vector_shuffle with the corrected mask.
3536     SDOperand NewMask = NormalizeMask(PermMask, DAG);
3537     if (NewMask.Val != PermMask.Val) {
3538       if (X86::isUNPCKLMask(PermMask.Val, true)) {
3539         SDOperand NewMask = getUnpacklMask(NumElems, DAG);
3540         return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1, V2, NewMask);
3541       } else if (X86::isUNPCKHMask(PermMask.Val, true)) {
3542         SDOperand NewMask = getUnpackhMask(NumElems, DAG);
3543         return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1, V2, NewMask);
3544       }
3545     }
3546   }
3547
3548   // Normalize the node to match x86 shuffle ops if needed
3549   if (V2.getOpcode() != ISD::UNDEF && isCommutedSHUFP(PermMask.Val))
3550       Op = CommuteVectorShuffle(Op, V1, V2, PermMask, DAG);
3551
3552   if (Commuted) {
3553     // Commute is back and try unpck* again.
3554     Op = CommuteVectorShuffle(Op, V1, V2, PermMask, DAG);
3555     if (X86::isUNPCKL_v_undef_Mask(PermMask.Val) ||
3556         X86::isUNPCKLMask(PermMask.Val) ||
3557         X86::isUNPCKHMask(PermMask.Val))
3558       return Op;
3559   }
3560
3561   // If VT is integer, try PSHUF* first, then SHUFP*.
3562   if (MVT::isInteger(VT)) {
3563     if (X86::isPSHUFDMask(PermMask.Val) ||
3564         X86::isPSHUFHWMask(PermMask.Val) ||
3565         X86::isPSHUFLWMask(PermMask.Val)) {
3566       if (V2.getOpcode() != ISD::UNDEF)
3567         return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1,
3568                            DAG.getNode(ISD::UNDEF, V1.getValueType()),PermMask);
3569       return Op;
3570     }
3571
3572     if (X86::isSHUFPMask(PermMask.Val))
3573       return Op;
3574
3575     // Handle v8i16 shuffle high / low shuffle node pair.
3576     if (VT == MVT::v8i16 && isPSHUFHW_PSHUFLWMask(PermMask.Val)) {
3577       MVT::ValueType MaskVT = MVT::getIntVectorWithNumElements(NumElems);
3578       MVT::ValueType BaseVT = MVT::getVectorBaseType(MaskVT);
3579       std::vector<SDOperand> MaskVec;
3580       for (unsigned i = 0; i != 4; ++i)
3581         MaskVec.push_back(PermMask.getOperand(i));
3582       for (unsigned i = 4; i != 8; ++i)
3583         MaskVec.push_back(DAG.getConstant(i, BaseVT));
3584       SDOperand Mask = DAG.getNode(ISD::BUILD_VECTOR, MaskVT,
3585                                    &MaskVec[0], MaskVec.size());
3586       V1 = DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1, V2, Mask);
3587       MaskVec.clear();
3588       for (unsigned i = 0; i != 4; ++i)
3589         MaskVec.push_back(DAG.getConstant(i, BaseVT));
3590       for (unsigned i = 4; i != 8; ++i)
3591         MaskVec.push_back(PermMask.getOperand(i));
3592       Mask = DAG.getNode(ISD::BUILD_VECTOR, MaskVT, &MaskVec[0],MaskVec.size());
3593       return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1, V2, Mask);
3594     }
3595   } else {
3596     // Floating point cases in the other order.
3597     if (X86::isSHUFPMask(PermMask.Val))
3598       return Op;
3599     if (X86::isPSHUFDMask(PermMask.Val) ||
3600         X86::isPSHUFHWMask(PermMask.Val) ||
3601         X86::isPSHUFLWMask(PermMask.Val)) {
3602       if (V2.getOpcode() != ISD::UNDEF)
3603         return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1,
3604                            DAG.getNode(ISD::UNDEF, V1.getValueType()),PermMask);
3605       return Op;
3606     }
3607   }
3608
3609   if (NumElems == 4) {
3610     MVT::ValueType MaskVT = PermMask.getValueType();
3611     MVT::ValueType MaskEVT = MVT::getVectorBaseType(MaskVT);
3612     std::vector<std::pair<int, int> > Locs;
3613     Locs.reserve(NumElems);
3614     std::vector<SDOperand> Mask1(NumElems, DAG.getNode(ISD::UNDEF, MaskEVT));
3615     std::vector<SDOperand> Mask2(NumElems, DAG.getNode(ISD::UNDEF, MaskEVT));
3616     unsigned NumHi = 0;
3617     unsigned NumLo = 0;
3618     // If no more than two elements come from either vector. This can be
3619     // implemented with two shuffles. First shuffle gather the elements.
3620     // The second shuffle, which takes the first shuffle as both of its
3621     // vector operands, put the elements into the right order.
3622     for (unsigned i = 0; i != NumElems; ++i) {
3623       SDOperand Elt = PermMask.getOperand(i);
3624       if (Elt.getOpcode() == ISD::UNDEF) {
3625         Locs[i] = std::make_pair(-1, -1);
3626       } else {
3627         unsigned Val = cast<ConstantSDNode>(Elt)->getValue();
3628         if (Val < NumElems) {
3629           Locs[i] = std::make_pair(0, NumLo);
3630           Mask1[NumLo] = Elt;
3631           NumLo++;
3632         } else {
3633           Locs[i] = std::make_pair(1, NumHi);
3634           if (2+NumHi < NumElems)
3635             Mask1[2+NumHi] = Elt;
3636           NumHi++;
3637         }
3638       }
3639     }
3640     if (NumLo <= 2 && NumHi <= 2) {
3641       V1 = DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1, V2,
3642                        DAG.getNode(ISD::BUILD_VECTOR, MaskVT,
3643                                    &Mask1[0], Mask1.size()));
3644       for (unsigned i = 0; i != NumElems; ++i) {
3645         if (Locs[i].first == -1)
3646           continue;
3647         else {
3648           unsigned Idx = (i < NumElems/2) ? 0 : NumElems;
3649           Idx += Locs[i].first * (NumElems/2) + Locs[i].second;
3650           Mask2[i] = DAG.getConstant(Idx, MaskEVT);
3651         }
3652       }
3653
3654       return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1, V1,
3655                          DAG.getNode(ISD::BUILD_VECTOR, MaskVT,
3656                                      &Mask2[0], Mask2.size()));
3657     }
3658
3659     // Break it into (shuffle shuffle_hi, shuffle_lo).
3660     Locs.clear();
3661     std::vector<SDOperand> LoMask(NumElems, DAG.getNode(ISD::UNDEF, MaskEVT));
3662     std::vector<SDOperand> HiMask(NumElems, DAG.getNode(ISD::UNDEF, MaskEVT));
3663     std::vector<SDOperand> *MaskPtr = &LoMask;
3664     unsigned MaskIdx = 0;
3665     unsigned LoIdx = 0;
3666     unsigned HiIdx = NumElems/2;
3667     for (unsigned i = 0; i != NumElems; ++i) {
3668       if (i == NumElems/2) {
3669         MaskPtr = &HiMask;
3670         MaskIdx = 1;
3671         LoIdx = 0;
3672         HiIdx = NumElems/2;
3673       }
3674       SDOperand Elt = PermMask.getOperand(i);
3675       if (Elt.getOpcode() == ISD::UNDEF) {
3676         Locs[i] = std::make_pair(-1, -1);
3677       } else if (cast<ConstantSDNode>(Elt)->getValue() < NumElems) {
3678         Locs[i] = std::make_pair(MaskIdx, LoIdx);
3679         (*MaskPtr)[LoIdx] = Elt;
3680         LoIdx++;
3681       } else {
3682         Locs[i] = std::make_pair(MaskIdx, HiIdx);
3683         (*MaskPtr)[HiIdx] = Elt;
3684         HiIdx++;
3685       }
3686     }
3687
3688     SDOperand LoShuffle =
3689       DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1, V2,
3690                   DAG.getNode(ISD::BUILD_VECTOR, MaskVT,
3691                               &LoMask[0], LoMask.size()));
3692     SDOperand HiShuffle = 
3693       DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V1, V2,
3694                   DAG.getNode(ISD::BUILD_VECTOR, MaskVT,
3695                               &HiMask[0], HiMask.size()));
3696     std::vector<SDOperand> MaskOps;
3697     for (unsigned i = 0; i != NumElems; ++i) {
3698       if (Locs[i].first == -1) {
3699         MaskOps.push_back(DAG.getNode(ISD::UNDEF, MaskEVT));
3700       } else {
3701         unsigned Idx = Locs[i].first * NumElems + Locs[i].second;
3702         MaskOps.push_back(DAG.getConstant(Idx, MaskEVT));
3703       }
3704     }
3705     return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, LoShuffle, HiShuffle,
3706                        DAG.getNode(ISD::BUILD_VECTOR, MaskVT,
3707                                    &MaskOps[0], MaskOps.size()));
3708   }
3709
3710   return SDOperand();
3711 }
3712
3713 SDOperand
3714 X86TargetLowering::LowerEXTRACT_VECTOR_ELT(SDOperand Op, SelectionDAG &DAG) {
3715   if (!isa<ConstantSDNode>(Op.getOperand(1)))
3716     return SDOperand();
3717
3718   MVT::ValueType VT = Op.getValueType();
3719   // TODO: handle v16i8.
3720   if (MVT::getSizeInBits(VT) == 16) {
3721     // Transform it so it match pextrw which produces a 32-bit result.
3722     MVT::ValueType EVT = (MVT::ValueType)(VT+1);
3723     SDOperand Extract = DAG.getNode(X86ISD::PEXTRW, EVT,
3724                                     Op.getOperand(0), Op.getOperand(1));
3725     SDOperand Assert  = DAG.getNode(ISD::AssertZext, EVT, Extract,
3726                                     DAG.getValueType(VT));
3727     return DAG.getNode(ISD::TRUNCATE, VT, Assert);
3728   } else if (MVT::getSizeInBits(VT) == 32) {
3729     SDOperand Vec = Op.getOperand(0);
3730     unsigned Idx = cast<ConstantSDNode>(Op.getOperand(1))->getValue();
3731     if (Idx == 0)
3732       return Op;
3733     // SHUFPS the element to the lowest double word, then movss.
3734     MVT::ValueType MaskVT = MVT::getIntVectorWithNumElements(4);
3735     std::vector<SDOperand> IdxVec;
3736     IdxVec.push_back(DAG.getConstant(Idx, MVT::getVectorBaseType(MaskVT)));
3737     IdxVec.push_back(DAG.getNode(ISD::UNDEF, MVT::getVectorBaseType(MaskVT)));
3738     IdxVec.push_back(DAG.getNode(ISD::UNDEF, MVT::getVectorBaseType(MaskVT)));
3739     IdxVec.push_back(DAG.getNode(ISD::UNDEF, MVT::getVectorBaseType(MaskVT)));
3740     SDOperand Mask = DAG.getNode(ISD::BUILD_VECTOR, MaskVT,
3741                                  &IdxVec[0], IdxVec.size());
3742     Vec = DAG.getNode(ISD::VECTOR_SHUFFLE, Vec.getValueType(),
3743                       Vec, DAG.getNode(ISD::UNDEF, Vec.getValueType()), Mask);
3744     return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, VT, Vec,
3745                        DAG.getConstant(0, getPointerTy()));
3746   } else if (MVT::getSizeInBits(VT) == 64) {
3747     SDOperand Vec = Op.getOperand(0);
3748     unsigned Idx = cast<ConstantSDNode>(Op.getOperand(1))->getValue();
3749     if (Idx == 0)
3750       return Op;
3751
3752     // UNPCKHPD the element to the lowest double word, then movsd.
3753     // Note if the lower 64 bits of the result of the UNPCKHPD is then stored
3754     // to a f64mem, the whole operation is folded into a single MOVHPDmr.
3755     MVT::ValueType MaskVT = MVT::getIntVectorWithNumElements(4);
3756     std::vector<SDOperand> IdxVec;
3757     IdxVec.push_back(DAG.getConstant(1, MVT::getVectorBaseType(MaskVT)));
3758     IdxVec.push_back(DAG.getNode(ISD::UNDEF, MVT::getVectorBaseType(MaskVT)));
3759     SDOperand Mask = DAG.getNode(ISD::BUILD_VECTOR, MaskVT,
3760                                  &IdxVec[0], IdxVec.size());
3761     Vec = DAG.getNode(ISD::VECTOR_SHUFFLE, Vec.getValueType(),
3762                       Vec, DAG.getNode(ISD::UNDEF, Vec.getValueType()), Mask);
3763     return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, VT, Vec,
3764                        DAG.getConstant(0, getPointerTy()));
3765   }
3766
3767   return SDOperand();
3768 }
3769
3770 SDOperand
3771 X86TargetLowering::LowerINSERT_VECTOR_ELT(SDOperand Op, SelectionDAG &DAG) {
3772   // Transform it so it match pinsrw which expects a 16-bit value in a GR32
3773   // as its second argument.
3774   MVT::ValueType VT = Op.getValueType();
3775   MVT::ValueType BaseVT = MVT::getVectorBaseType(VT);
3776   SDOperand N0 = Op.getOperand(0);
3777   SDOperand N1 = Op.getOperand(1);
3778   SDOperand N2 = Op.getOperand(2);
3779   if (MVT::getSizeInBits(BaseVT) == 16) {
3780     if (N1.getValueType() != MVT::i32)
3781       N1 = DAG.getNode(ISD::ANY_EXTEND, MVT::i32, N1);
3782     if (N2.getValueType() != MVT::i32)
3783       N2 = DAG.getConstant(cast<ConstantSDNode>(N2)->getValue(), MVT::i32);
3784     return DAG.getNode(X86ISD::PINSRW, VT, N0, N1, N2);
3785   } else if (MVT::getSizeInBits(BaseVT) == 32) {
3786     unsigned Idx = cast<ConstantSDNode>(N2)->getValue();
3787     if (Idx == 0) {
3788       // Use a movss.
3789       N1 = DAG.getNode(ISD::SCALAR_TO_VECTOR, VT, N1);
3790       MVT::ValueType MaskVT = MVT::getIntVectorWithNumElements(4);
3791       MVT::ValueType BaseVT = MVT::getVectorBaseType(MaskVT);
3792       std::vector<SDOperand> MaskVec;
3793       MaskVec.push_back(DAG.getConstant(4, BaseVT));
3794       for (unsigned i = 1; i <= 3; ++i)
3795         MaskVec.push_back(DAG.getConstant(i, BaseVT));
3796       return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, N0, N1,
3797                          DAG.getNode(ISD::BUILD_VECTOR, MaskVT,
3798                                      &MaskVec[0], MaskVec.size()));
3799     } else {
3800       // Use two pinsrw instructions to insert a 32 bit value.
3801       Idx <<= 1;
3802       if (MVT::isFloatingPoint(N1.getValueType())) {
3803         if (ISD::isNON_EXTLoad(N1.Val)) {
3804           // Just load directly from f32mem to GR32.
3805           LoadSDNode *LD = cast<LoadSDNode>(N1);
3806           N1 = DAG.getLoad(MVT::i32, LD->getChain(), LD->getBasePtr(),
3807                            LD->getSrcValue(), LD->getSrcValueOffset());
3808         } else {
3809           N1 = DAG.getNode(ISD::SCALAR_TO_VECTOR, MVT::v4f32, N1);
3810           N1 = DAG.getNode(ISD::BIT_CONVERT, MVT::v4i32, N1);
3811           N1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, MVT::i32, N1,
3812                            DAG.getConstant(0, getPointerTy()));
3813         }
3814       }
3815       N0 = DAG.getNode(ISD::BIT_CONVERT, MVT::v8i16, N0);
3816       N0 = DAG.getNode(X86ISD::PINSRW, MVT::v8i16, N0, N1,
3817                        DAG.getConstant(Idx, getPointerTy()));
3818       N1 = DAG.getNode(ISD::SRL, MVT::i32, N1, DAG.getConstant(16, MVT::i8));
3819       N0 = DAG.getNode(X86ISD::PINSRW, MVT::v8i16, N0, N1,
3820                        DAG.getConstant(Idx+1, getPointerTy()));
3821       return DAG.getNode(ISD::BIT_CONVERT, VT, N0);
3822     }
3823   }
3824
3825   return SDOperand();
3826 }
3827
3828 SDOperand
3829 X86TargetLowering::LowerSCALAR_TO_VECTOR(SDOperand Op, SelectionDAG &DAG) {
3830   SDOperand AnyExt = DAG.getNode(ISD::ANY_EXTEND, MVT::i32, Op.getOperand(0));
3831   return DAG.getNode(X86ISD::S2VEC, Op.getValueType(), AnyExt);
3832 }
3833
3834 // ConstantPool, JumpTable, GlobalAddress, and ExternalSymbol are lowered as 
3835 // their target countpart wrapped in the X86ISD::Wrapper node. Suppose N is
3836 // one of the above mentioned nodes. It has to be wrapped because otherwise
3837 // Select(N) returns N. So the raw TargetGlobalAddress nodes, etc. can only
3838 // be used to form addressing mode. These wrapped nodes will be selected
3839 // into MOV32ri.
3840 SDOperand
3841 X86TargetLowering::LowerConstantPool(SDOperand Op, SelectionDAG &DAG) {
3842   ConstantPoolSDNode *CP = cast<ConstantPoolSDNode>(Op);
3843   SDOperand Result = DAG.getNode(X86ISD::Wrapper, getPointerTy(),
3844                                  DAG.getTargetConstantPool(CP->getConstVal(),
3845                                                            getPointerTy(),
3846                                                            CP->getAlignment()));
3847   if (Subtarget->isTargetDarwin()) {
3848     // With PIC, the address is actually $g + Offset.
3849     if (!Subtarget->is64Bit() &&
3850         getTargetMachine().getRelocationModel() == Reloc::PIC_)
3851       Result = DAG.getNode(ISD::ADD, getPointerTy(),
3852                     DAG.getNode(X86ISD::GlobalBaseReg, getPointerTy()), Result);
3853   }
3854
3855   return Result;
3856 }
3857
3858 SDOperand
3859 X86TargetLowering::LowerGlobalAddress(SDOperand Op, SelectionDAG &DAG) {
3860   GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
3861   SDOperand Result = DAG.getNode(X86ISD::Wrapper, getPointerTy(),
3862                                  DAG.getTargetGlobalAddress(GV,
3863                                                             getPointerTy()));
3864   if (Subtarget->isTargetDarwin()) {
3865     // With PIC, the address is actually $g + Offset.
3866     if (!Subtarget->is64Bit() &&
3867         getTargetMachine().getRelocationModel() == Reloc::PIC_)
3868       Result = DAG.getNode(ISD::ADD, getPointerTy(),
3869                            DAG.getNode(X86ISD::GlobalBaseReg, getPointerTy()),
3870                            Result);
3871
3872     // For Darwin, external and weak symbols are indirect, so we want to load
3873     // the value at address GV, not the value of GV itself. This means that
3874     // the GlobalAddress must be in the base or index register of the address,
3875     // not the GV offset field.
3876     if (getTargetMachine().getRelocationModel() != Reloc::Static &&
3877         DarwinGVRequiresExtraLoad(GV))
3878       Result = DAG.getLoad(getPointerTy(), DAG.getEntryNode(), Result, NULL, 0);
3879   } else if (Subtarget->isTargetCygwin() || Subtarget->isTargetWindows()) {
3880     // FIXME: What about PIC?
3881     if (WindowsGVRequiresExtraLoad(GV))
3882       Result = DAG.getLoad(getPointerTy(), DAG.getEntryNode(), Result, NULL, 0);
3883   }
3884   
3885
3886   return Result;
3887 }
3888
3889 SDOperand
3890 X86TargetLowering::LowerExternalSymbol(SDOperand Op, SelectionDAG &DAG) {
3891   const char *Sym = cast<ExternalSymbolSDNode>(Op)->getSymbol();
3892   SDOperand Result = DAG.getNode(X86ISD::Wrapper, getPointerTy(),
3893                                  DAG.getTargetExternalSymbol(Sym,
3894                                                              getPointerTy()));
3895   if (Subtarget->isTargetDarwin()) {
3896     // With PIC, the address is actually $g + Offset.
3897     if (!Subtarget->is64Bit() &&
3898         getTargetMachine().getRelocationModel() == Reloc::PIC_)
3899       Result = DAG.getNode(ISD::ADD, getPointerTy(),
3900                            DAG.getNode(X86ISD::GlobalBaseReg, getPointerTy()),
3901                            Result);
3902   }
3903
3904   return Result;
3905 }
3906
3907 SDOperand X86TargetLowering::LowerShift(SDOperand Op, SelectionDAG &DAG) {
3908     assert(Op.getNumOperands() == 3 && Op.getValueType() == MVT::i32 &&
3909            "Not an i64 shift!");
3910     bool isSRA = Op.getOpcode() == ISD::SRA_PARTS;
3911     SDOperand ShOpLo = Op.getOperand(0);
3912     SDOperand ShOpHi = Op.getOperand(1);
3913     SDOperand ShAmt  = Op.getOperand(2);
3914     SDOperand Tmp1 = isSRA ?
3915       DAG.getNode(ISD::SRA, MVT::i32, ShOpHi, DAG.getConstant(31, MVT::i8)) :
3916       DAG.getConstant(0, MVT::i32);
3917
3918     SDOperand Tmp2, Tmp3;
3919     if (Op.getOpcode() == ISD::SHL_PARTS) {
3920       Tmp2 = DAG.getNode(X86ISD::SHLD, MVT::i32, ShOpHi, ShOpLo, ShAmt);
3921       Tmp3 = DAG.getNode(ISD::SHL, MVT::i32, ShOpLo, ShAmt);
3922     } else {
3923       Tmp2 = DAG.getNode(X86ISD::SHRD, MVT::i32, ShOpLo, ShOpHi, ShAmt);
3924       Tmp3 = DAG.getNode(isSRA ? ISD::SRA : ISD::SRL, MVT::i32, ShOpHi, ShAmt);
3925     }
3926
3927     const MVT::ValueType *VTs = DAG.getNodeValueTypes(MVT::Other, MVT::Flag);
3928     SDOperand AndNode = DAG.getNode(ISD::AND, MVT::i8, ShAmt,
3929                                     DAG.getConstant(32, MVT::i8));
3930     SDOperand COps[]={DAG.getEntryNode(), AndNode, DAG.getConstant(0, MVT::i8)};
3931     SDOperand InFlag = DAG.getNode(X86ISD::CMP, VTs, 2, COps, 3).getValue(1);
3932
3933     SDOperand Hi, Lo;
3934     SDOperand CC = DAG.getConstant(X86::COND_NE, MVT::i8);
3935
3936     VTs = DAG.getNodeValueTypes(MVT::i32, MVT::Flag);
3937     SmallVector<SDOperand, 4> Ops;
3938     if (Op.getOpcode() == ISD::SHL_PARTS) {
3939       Ops.push_back(Tmp2);
3940       Ops.push_back(Tmp3);
3941       Ops.push_back(CC);
3942       Ops.push_back(InFlag);
3943       Hi = DAG.getNode(X86ISD::CMOV, VTs, 2, &Ops[0], Ops.size());
3944       InFlag = Hi.getValue(1);
3945
3946       Ops.clear();
3947       Ops.push_back(Tmp3);
3948       Ops.push_back(Tmp1);
3949       Ops.push_back(CC);
3950       Ops.push_back(InFlag);
3951       Lo = DAG.getNode(X86ISD::CMOV, VTs, 2, &Ops[0], Ops.size());
3952     } else {
3953       Ops.push_back(Tmp2);
3954       Ops.push_back(Tmp3);
3955       Ops.push_back(CC);
3956       Ops.push_back(InFlag);
3957       Lo = DAG.getNode(X86ISD::CMOV, VTs, 2, &Ops[0], Ops.size());
3958       InFlag = Lo.getValue(1);
3959
3960       Ops.clear();
3961       Ops.push_back(Tmp3);
3962       Ops.push_back(Tmp1);
3963       Ops.push_back(CC);
3964       Ops.push_back(InFlag);
3965       Hi = DAG.getNode(X86ISD::CMOV, VTs, 2, &Ops[0], Ops.size());
3966     }
3967
3968     VTs = DAG.getNodeValueTypes(MVT::i32, MVT::i32);
3969     Ops.clear();
3970     Ops.push_back(Lo);
3971     Ops.push_back(Hi);
3972     return DAG.getNode(ISD::MERGE_VALUES, VTs, 2, &Ops[0], Ops.size());
3973 }
3974
3975 SDOperand X86TargetLowering::LowerSINT_TO_FP(SDOperand Op, SelectionDAG &DAG) {
3976   assert(Op.getOperand(0).getValueType() <= MVT::i64 &&
3977          Op.getOperand(0).getValueType() >= MVT::i16 &&
3978          "Unknown SINT_TO_FP to lower!");
3979
3980   SDOperand Result;
3981   MVT::ValueType SrcVT = Op.getOperand(0).getValueType();
3982   unsigned Size = MVT::getSizeInBits(SrcVT)/8;
3983   MachineFunction &MF = DAG.getMachineFunction();
3984   int SSFI = MF.getFrameInfo()->CreateStackObject(Size, Size);
3985   SDOperand StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
3986   SDOperand Chain = DAG.getStore(DAG.getEntryNode(), Op.getOperand(0),
3987                                  StackSlot, NULL, 0);
3988
3989   // Build the FILD
3990   std::vector<MVT::ValueType> Tys;
3991   Tys.push_back(MVT::f64);
3992   Tys.push_back(MVT::Other);
3993   if (X86ScalarSSE) Tys.push_back(MVT::Flag);
3994   std::vector<SDOperand> Ops;
3995   Ops.push_back(Chain);
3996   Ops.push_back(StackSlot);
3997   Ops.push_back(DAG.getValueType(SrcVT));
3998   Result = DAG.getNode(X86ScalarSSE ? X86ISD::FILD_FLAG :X86ISD::FILD,
3999                        Tys, &Ops[0], Ops.size());
4000
4001   if (X86ScalarSSE) {
4002     Chain = Result.getValue(1);
4003     SDOperand InFlag = Result.getValue(2);
4004
4005     // FIXME: Currently the FST is flagged to the FILD_FLAG. This
4006     // shouldn't be necessary except that RFP cannot be live across
4007     // multiple blocks. When stackifier is fixed, they can be uncoupled.
4008     MachineFunction &MF = DAG.getMachineFunction();
4009     int SSFI = MF.getFrameInfo()->CreateStackObject(8, 8);
4010     SDOperand StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
4011     std::vector<MVT::ValueType> Tys;
4012     Tys.push_back(MVT::Other);
4013     std::vector<SDOperand> Ops;
4014     Ops.push_back(Chain);
4015     Ops.push_back(Result);
4016     Ops.push_back(StackSlot);
4017     Ops.push_back(DAG.getValueType(Op.getValueType()));
4018     Ops.push_back(InFlag);
4019     Chain = DAG.getNode(X86ISD::FST, Tys, &Ops[0], Ops.size());
4020     Result = DAG.getLoad(Op.getValueType(), Chain, StackSlot, NULL, 0);
4021   }
4022
4023   return Result;
4024 }
4025
4026 SDOperand X86TargetLowering::LowerFP_TO_SINT(SDOperand Op, SelectionDAG &DAG) {
4027   assert(Op.getValueType() <= MVT::i64 && Op.getValueType() >= MVT::i16 &&
4028          "Unknown FP_TO_SINT to lower!");
4029   // We lower FP->sint64 into FISTP64, followed by a load, all to a temporary
4030   // stack slot.
4031   MachineFunction &MF = DAG.getMachineFunction();
4032   unsigned MemSize = MVT::getSizeInBits(Op.getValueType())/8;
4033   int SSFI = MF.getFrameInfo()->CreateStackObject(MemSize, MemSize);
4034   SDOperand StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
4035
4036   unsigned Opc;
4037   switch (Op.getValueType()) {
4038     default: assert(0 && "Invalid FP_TO_SINT to lower!");
4039     case MVT::i16: Opc = X86ISD::FP_TO_INT16_IN_MEM; break;
4040     case MVT::i32: Opc = X86ISD::FP_TO_INT32_IN_MEM; break;
4041     case MVT::i64: Opc = X86ISD::FP_TO_INT64_IN_MEM; break;
4042   }
4043
4044   SDOperand Chain = DAG.getEntryNode();
4045   SDOperand Value = Op.getOperand(0);
4046   if (X86ScalarSSE) {
4047     assert(Op.getValueType() == MVT::i64 && "Invalid FP_TO_SINT to lower!");
4048     Chain = DAG.getStore(Chain, Value, StackSlot, NULL, 0);
4049     std::vector<MVT::ValueType> Tys;
4050     Tys.push_back(MVT::f64);
4051     Tys.push_back(MVT::Other);
4052     std::vector<SDOperand> Ops;
4053     Ops.push_back(Chain);
4054     Ops.push_back(StackSlot);
4055     Ops.push_back(DAG.getValueType(Op.getOperand(0).getValueType()));
4056     Value = DAG.getNode(X86ISD::FLD, Tys, &Ops[0], Ops.size());
4057     Chain = Value.getValue(1);
4058     SSFI = MF.getFrameInfo()->CreateStackObject(MemSize, MemSize);
4059     StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
4060   }
4061
4062   // Build the FP_TO_INT*_IN_MEM
4063   std::vector<SDOperand> Ops;
4064   Ops.push_back(Chain);
4065   Ops.push_back(Value);
4066   Ops.push_back(StackSlot);
4067   SDOperand FIST = DAG.getNode(Opc, MVT::Other, &Ops[0], Ops.size());
4068
4069   // Load the result.
4070   return DAG.getLoad(Op.getValueType(), FIST, StackSlot, NULL, 0);
4071 }
4072
4073 SDOperand X86TargetLowering::LowerFABS(SDOperand Op, SelectionDAG &DAG) {
4074   MVT::ValueType VT = Op.getValueType();
4075   const Type *OpNTy =  MVT::getTypeForValueType(VT);
4076   std::vector<Constant*> CV;
4077   if (VT == MVT::f64) {
4078     CV.push_back(ConstantFP::get(OpNTy, BitsToDouble(~(1ULL << 63))));
4079     CV.push_back(ConstantFP::get(OpNTy, 0.0));
4080   } else {
4081     CV.push_back(ConstantFP::get(OpNTy, BitsToFloat(~(1U << 31))));
4082     CV.push_back(ConstantFP::get(OpNTy, 0.0));
4083     CV.push_back(ConstantFP::get(OpNTy, 0.0));
4084     CV.push_back(ConstantFP::get(OpNTy, 0.0));
4085   }
4086   Constant *CS = ConstantStruct::get(CV);
4087   SDOperand CPIdx = DAG.getConstantPool(CS, getPointerTy(), 4);
4088   std::vector<MVT::ValueType> Tys;
4089   Tys.push_back(VT);
4090   Tys.push_back(MVT::Other);
4091   SmallVector<SDOperand, 3> Ops;
4092   Ops.push_back(DAG.getEntryNode());
4093   Ops.push_back(CPIdx);
4094   Ops.push_back(DAG.getSrcValue(NULL));
4095   SDOperand Mask = DAG.getNode(X86ISD::LOAD_PACK, Tys, &Ops[0], Ops.size());
4096   return DAG.getNode(X86ISD::FAND, VT, Op.getOperand(0), Mask);
4097 }
4098
4099 SDOperand X86TargetLowering::LowerFNEG(SDOperand Op, SelectionDAG &DAG) {
4100   MVT::ValueType VT = Op.getValueType();
4101   const Type *OpNTy =  MVT::getTypeForValueType(VT);
4102   std::vector<Constant*> CV;
4103   if (VT == MVT::f64) {
4104     CV.push_back(ConstantFP::get(OpNTy, BitsToDouble(1ULL << 63)));
4105     CV.push_back(ConstantFP::get(OpNTy, 0.0));
4106   } else {
4107     CV.push_back(ConstantFP::get(OpNTy, BitsToFloat(1U << 31)));
4108     CV.push_back(ConstantFP::get(OpNTy, 0.0));
4109     CV.push_back(ConstantFP::get(OpNTy, 0.0));
4110     CV.push_back(ConstantFP::get(OpNTy, 0.0));
4111   }
4112   Constant *CS = ConstantStruct::get(CV);
4113   SDOperand CPIdx = DAG.getConstantPool(CS, getPointerTy(), 4);
4114   std::vector<MVT::ValueType> Tys;
4115   Tys.push_back(VT);
4116   Tys.push_back(MVT::Other);
4117   SmallVector<SDOperand, 3> Ops;
4118   Ops.push_back(DAG.getEntryNode());
4119   Ops.push_back(CPIdx);
4120   Ops.push_back(DAG.getSrcValue(NULL));
4121   SDOperand Mask = DAG.getNode(X86ISD::LOAD_PACK, Tys, &Ops[0], Ops.size());
4122   return DAG.getNode(X86ISD::FXOR, VT, Op.getOperand(0), Mask);
4123 }
4124
4125 SDOperand X86TargetLowering::LowerSETCC(SDOperand Op, SelectionDAG &DAG,
4126                                         SDOperand Chain) {
4127   assert(Op.getValueType() == MVT::i8 && "SetCC type must be 8-bit integer");
4128   SDOperand Cond;
4129   SDOperand Op0 = Op.getOperand(0);
4130   SDOperand Op1 = Op.getOperand(1);
4131   SDOperand CC = Op.getOperand(2);
4132   ISD::CondCode SetCCOpcode = cast<CondCodeSDNode>(CC)->get();
4133   const MVT::ValueType *VTs1 = DAG.getNodeValueTypes(MVT::Other, MVT::Flag);
4134   const MVT::ValueType *VTs2 = DAG.getNodeValueTypes(MVT::i8, MVT::Flag);
4135   bool isFP = MVT::isFloatingPoint(Op.getOperand(1).getValueType());
4136   unsigned X86CC;
4137
4138   if (translateX86CC(cast<CondCodeSDNode>(CC)->get(), isFP, X86CC, 
4139                      Op0, Op1, DAG)) {
4140     SDOperand Ops1[] = { Chain, Op0, Op1 };
4141     Cond = DAG.getNode(X86ISD::CMP, VTs1, 2, Ops1, 3).getValue(1);
4142     SDOperand Ops2[] = { DAG.getConstant(X86CC, MVT::i8), Cond };
4143     return DAG.getNode(X86ISD::SETCC, VTs2, 2, Ops2, 2);
4144   }
4145
4146   assert(isFP && "Illegal integer SetCC!");
4147
4148   SDOperand COps[] = { Chain, Op0, Op1 };
4149   Cond = DAG.getNode(X86ISD::CMP, VTs1, 2, COps, 3).getValue(1);
4150
4151   switch (SetCCOpcode) {
4152   default: assert(false && "Illegal floating point SetCC!");
4153   case ISD::SETOEQ: {  // !PF & ZF
4154     SDOperand Ops1[] = { DAG.getConstant(X86::COND_NP, MVT::i8), Cond };
4155     SDOperand Tmp1 = DAG.getNode(X86ISD::SETCC, VTs2, 2, Ops1, 2);
4156     SDOperand Ops2[] = { DAG.getConstant(X86::COND_E, MVT::i8),
4157                          Tmp1.getValue(1) };
4158     SDOperand Tmp2 = DAG.getNode(X86ISD::SETCC, VTs2, 2, Ops2, 2);
4159     return DAG.getNode(ISD::AND, MVT::i8, Tmp1, Tmp2);
4160   }
4161   case ISD::SETUNE: {  // PF | !ZF
4162     SDOperand Ops1[] = { DAG.getConstant(X86::COND_P, MVT::i8), Cond };
4163     SDOperand Tmp1 = DAG.getNode(X86ISD::SETCC, VTs2, 2, Ops1, 2);
4164     SDOperand Ops2[] = { DAG.getConstant(X86::COND_NE, MVT::i8),
4165                          Tmp1.getValue(1) };
4166     SDOperand Tmp2 = DAG.getNode(X86ISD::SETCC, VTs2, 2, Ops2, 2);
4167     return DAG.getNode(ISD::OR, MVT::i8, Tmp1, Tmp2);
4168   }
4169   }
4170 }
4171
4172 SDOperand X86TargetLowering::LowerSELECT(SDOperand Op, SelectionDAG &DAG) {
4173   bool addTest = true;
4174   SDOperand Chain = DAG.getEntryNode();
4175   SDOperand Cond  = Op.getOperand(0);
4176   SDOperand CC;
4177   const MVT::ValueType *VTs = DAG.getNodeValueTypes(MVT::Other, MVT::Flag);
4178
4179   if (Cond.getOpcode() == ISD::SETCC)
4180     Cond = LowerSETCC(Cond, DAG, Chain);
4181
4182   if (Cond.getOpcode() == X86ISD::SETCC) {
4183     CC = Cond.getOperand(0);
4184
4185     // If condition flag is set by a X86ISD::CMP, then make a copy of it
4186     // (since flag operand cannot be shared). Use it as the condition setting
4187     // operand in place of the X86ISD::SETCC.
4188     // If the X86ISD::SETCC has more than one use, then perhaps it's better
4189     // to use a test instead of duplicating the X86ISD::CMP (for register
4190     // pressure reason)?
4191     SDOperand Cmp = Cond.getOperand(1);
4192     unsigned Opc = Cmp.getOpcode();
4193     bool IllegalFPCMov = !X86ScalarSSE &&
4194       MVT::isFloatingPoint(Op.getValueType()) &&
4195       !hasFPCMov(cast<ConstantSDNode>(CC)->getSignExtended());
4196     if ((Opc == X86ISD::CMP || Opc == X86ISD::COMI || Opc == X86ISD::UCOMI) &&
4197         !IllegalFPCMov) {
4198       SDOperand Ops[] = { Chain, Cmp.getOperand(1), Cmp.getOperand(2) };
4199       Cond = DAG.getNode(Opc, VTs, 2, Ops, 3);
4200       addTest = false;
4201     }
4202   }
4203
4204   if (addTest) {
4205     CC = DAG.getConstant(X86::COND_NE, MVT::i8);
4206     SDOperand Ops[] = { Chain, Cond, DAG.getConstant(0, MVT::i8) };
4207     Cond = DAG.getNode(X86ISD::CMP, VTs, 2, Ops, 3);
4208   }
4209
4210   VTs = DAG.getNodeValueTypes(Op.getValueType(), MVT::Flag);
4211   SmallVector<SDOperand, 4> Ops;
4212   // X86ISD::CMOV means set the result (which is operand 1) to the RHS if
4213   // condition is true.
4214   Ops.push_back(Op.getOperand(2));
4215   Ops.push_back(Op.getOperand(1));
4216   Ops.push_back(CC);
4217   Ops.push_back(Cond.getValue(1));
4218   return DAG.getNode(X86ISD::CMOV, VTs, 2, &Ops[0], Ops.size());
4219 }
4220
4221 SDOperand X86TargetLowering::LowerBRCOND(SDOperand Op, SelectionDAG &DAG) {
4222   bool addTest = true;
4223   SDOperand Chain = Op.getOperand(0);
4224   SDOperand Cond  = Op.getOperand(1);
4225   SDOperand Dest  = Op.getOperand(2);
4226   SDOperand CC;
4227   const MVT::ValueType *VTs = DAG.getNodeValueTypes(MVT::Other, MVT::Flag);
4228
4229   if (Cond.getOpcode() == ISD::SETCC)
4230     Cond = LowerSETCC(Cond, DAG, Chain);
4231
4232   if (Cond.getOpcode() == X86ISD::SETCC) {
4233     CC = Cond.getOperand(0);
4234
4235     // If condition flag is set by a X86ISD::CMP, then make a copy of it
4236     // (since flag operand cannot be shared). Use it as the condition setting
4237     // operand in place of the X86ISD::SETCC.
4238     // If the X86ISD::SETCC has more than one use, then perhaps it's better
4239     // to use a test instead of duplicating the X86ISD::CMP (for register
4240     // pressure reason)?
4241     SDOperand Cmp = Cond.getOperand(1);
4242     unsigned Opc = Cmp.getOpcode();
4243     if (Opc == X86ISD::CMP || Opc == X86ISD::COMI || Opc == X86ISD::UCOMI) {
4244       SDOperand Ops[] = { Chain, Cmp.getOperand(1), Cmp.getOperand(2) };
4245       Cond = DAG.getNode(Opc, VTs, 2, Ops, 3);
4246       addTest = false;
4247     }
4248   }
4249
4250   if (addTest) {
4251     CC = DAG.getConstant(X86::COND_NE, MVT::i8);
4252     SDOperand Ops[] = { Chain, Cond, DAG.getConstant(0, MVT::i8) };
4253     Cond = DAG.getNode(X86ISD::CMP, VTs, 2, Ops, 3);
4254   }
4255   return DAG.getNode(X86ISD::BRCOND, Op.getValueType(),
4256                      Cond, Op.getOperand(2), CC, Cond.getValue(1));
4257 }
4258
4259 SDOperand X86TargetLowering::LowerJumpTable(SDOperand Op, SelectionDAG &DAG) {
4260   JumpTableSDNode *JT = cast<JumpTableSDNode>(Op);
4261   SDOperand Result = DAG.getNode(X86ISD::Wrapper, getPointerTy(),
4262                                  DAG.getTargetJumpTable(JT->getIndex(),
4263                                                         getPointerTy()));
4264   if (Subtarget->isTargetDarwin()) {
4265     // With PIC, the address is actually $g + Offset.
4266     if (!Subtarget->is64Bit() &&
4267         getTargetMachine().getRelocationModel() == Reloc::PIC_)
4268       Result = DAG.getNode(ISD::ADD, getPointerTy(),
4269                            DAG.getNode(X86ISD::GlobalBaseReg, getPointerTy()),
4270                            Result);    
4271   }
4272
4273   return Result;
4274 }
4275
4276 SDOperand X86TargetLowering::LowerCALL(SDOperand Op, SelectionDAG &DAG) {
4277   unsigned CallingConv= cast<ConstantSDNode>(Op.getOperand(1))->getValue();
4278   
4279   if (Subtarget->is64Bit())
4280     return LowerX86_64CCCCallTo(Op, DAG);
4281   else
4282     switch (CallingConv) {
4283     default:
4284       assert(0 && "Unsupported calling convention");      
4285     case CallingConv::Fast:
4286       if (EnableFastCC) {
4287         return LowerFastCCCallTo(Op, DAG, false);
4288       }
4289       // Falls through
4290     case CallingConv::C:
4291     case CallingConv::CSRet:
4292       return LowerCCCCallTo(Op, DAG);
4293     case CallingConv::X86_StdCall: 
4294       return LowerStdCallCCCallTo(Op, DAG);
4295     case CallingConv::X86_FastCall:
4296       return LowerFastCCCallTo(Op, DAG, true);
4297     }
4298 }
4299
4300 SDOperand X86TargetLowering::LowerRET(SDOperand Op, SelectionDAG &DAG) {
4301   SDOperand Copy;
4302     
4303   switch(Op.getNumOperands()) {
4304     default:
4305       assert(0 && "Do not know how to return this many arguments!");
4306       abort();
4307     case 1:    // ret void.
4308       return DAG.getNode(X86ISD::RET_FLAG, MVT::Other, Op.getOperand(0),
4309                         DAG.getConstant(getBytesToPopOnReturn(), MVT::i16));
4310     case 3: {
4311       MVT::ValueType ArgVT = Op.getOperand(1).getValueType();
4312       
4313       if (MVT::isVector(ArgVT) ||
4314           (Subtarget->is64Bit() && MVT::isFloatingPoint(ArgVT))) {
4315         // Integer or FP vector result -> XMM0.
4316         if (DAG.getMachineFunction().liveout_empty())
4317           DAG.getMachineFunction().addLiveOut(X86::XMM0);
4318         Copy = DAG.getCopyToReg(Op.getOperand(0), X86::XMM0, Op.getOperand(1),
4319                                 SDOperand());
4320       } else if (MVT::isInteger(ArgVT)) {
4321         // Integer result -> EAX / RAX.
4322         // The C calling convention guarantees the return value has been
4323         // promoted to at least MVT::i32. The X86-64 ABI doesn't require the
4324         // value to be promoted MVT::i64. So we don't have to extend it to
4325         // 64-bit. Return the value in EAX, but mark RAX as liveout.
4326         unsigned Reg = Subtarget->is64Bit() ? X86::RAX : X86::EAX;
4327         if (DAG.getMachineFunction().liveout_empty())
4328           DAG.getMachineFunction().addLiveOut(Reg);
4329
4330         Reg = (ArgVT == MVT::i64) ? X86::RAX : X86::EAX;
4331         Copy = DAG.getCopyToReg(Op.getOperand(0), Reg, Op.getOperand(1),
4332                                 SDOperand());
4333       } else if (!X86ScalarSSE) {
4334         // FP return with fp-stack value.
4335         if (DAG.getMachineFunction().liveout_empty())
4336           DAG.getMachineFunction().addLiveOut(X86::ST0);
4337
4338         std::vector<MVT::ValueType> Tys;
4339         Tys.push_back(MVT::Other);
4340         Tys.push_back(MVT::Flag);
4341         std::vector<SDOperand> Ops;
4342         Ops.push_back(Op.getOperand(0));
4343         Ops.push_back(Op.getOperand(1));
4344         Copy = DAG.getNode(X86ISD::FP_SET_RESULT, Tys, &Ops[0], Ops.size());
4345       } else {
4346         // FP return with ScalarSSE (return on fp-stack).
4347         if (DAG.getMachineFunction().liveout_empty())
4348           DAG.getMachineFunction().addLiveOut(X86::ST0);
4349
4350         SDOperand MemLoc;
4351         SDOperand Chain = Op.getOperand(0);
4352         SDOperand Value = Op.getOperand(1);
4353
4354         if (ISD::isNON_EXTLoad(Value.Val) &&
4355             (Chain == Value.getValue(1) || Chain == Value.getOperand(0))) {
4356           Chain  = Value.getOperand(0);
4357           MemLoc = Value.getOperand(1);
4358         } else {
4359           // Spill the value to memory and reload it into top of stack.
4360           unsigned Size = MVT::getSizeInBits(ArgVT)/8;
4361           MachineFunction &MF = DAG.getMachineFunction();
4362           int SSFI = MF.getFrameInfo()->CreateStackObject(Size, Size);
4363           MemLoc = DAG.getFrameIndex(SSFI, getPointerTy());
4364           Chain = DAG.getStore(Op.getOperand(0), Value, MemLoc, NULL, 0);
4365         }
4366         std::vector<MVT::ValueType> Tys;
4367         Tys.push_back(MVT::f64);
4368         Tys.push_back(MVT::Other);
4369         std::vector<SDOperand> Ops;
4370         Ops.push_back(Chain);
4371         Ops.push_back(MemLoc);
4372         Ops.push_back(DAG.getValueType(ArgVT));
4373         Copy = DAG.getNode(X86ISD::FLD, Tys, &Ops[0], Ops.size());
4374         Tys.clear();
4375         Tys.push_back(MVT::Other);
4376         Tys.push_back(MVT::Flag);
4377         Ops.clear();
4378         Ops.push_back(Copy.getValue(1));
4379         Ops.push_back(Copy);
4380         Copy = DAG.getNode(X86ISD::FP_SET_RESULT, Tys, &Ops[0], Ops.size());
4381       }
4382       break;
4383     }
4384     case 5: {
4385       unsigned Reg1 = Subtarget->is64Bit() ? X86::RAX : X86::EAX;
4386       unsigned Reg2 = Subtarget->is64Bit() ? X86::RDX : X86::EDX;
4387       if (DAG.getMachineFunction().liveout_empty()) {
4388         DAG.getMachineFunction().addLiveOut(Reg1);
4389         DAG.getMachineFunction().addLiveOut(Reg2);
4390       }
4391
4392       Copy = DAG.getCopyToReg(Op.getOperand(0), Reg2, Op.getOperand(3), 
4393                               SDOperand());
4394       Copy = DAG.getCopyToReg(Copy, Reg1, Op.getOperand(1), Copy.getValue(1));
4395       break;
4396     }
4397   }
4398   return DAG.getNode(X86ISD::RET_FLAG, MVT::Other,
4399                      Copy, DAG.getConstant(getBytesToPopOnReturn(), MVT::i16),
4400                      Copy.getValue(1));
4401 }
4402
4403 SDOperand
4404 X86TargetLowering::LowerFORMAL_ARGUMENTS(SDOperand Op, SelectionDAG &DAG) {
4405   MachineFunction &MF = DAG.getMachineFunction();
4406   const Function* Fn = MF.getFunction();
4407   if (Fn->hasExternalLinkage() &&
4408       Subtarget->isTargetCygwin() &&
4409       Fn->getName() == "main")
4410     MF.getInfo<X86FunctionInfo>()->setForceFramePointer(true);
4411
4412   unsigned CC = cast<ConstantSDNode>(Op.getOperand(1))->getValue();
4413   if (Subtarget->is64Bit())
4414     return LowerX86_64CCCArguments(Op, DAG);
4415   else
4416     switch(CC) {
4417     default:
4418       assert(0 && "Unsupported calling convention");
4419     case CallingConv::Fast:
4420       if (EnableFastCC) {
4421         return LowerFastCCArguments(Op, DAG);
4422       }
4423       // Falls through
4424     case CallingConv::C:
4425     case CallingConv::CSRet:
4426       return LowerCCCArguments(Op, DAG);
4427     case CallingConv::X86_StdCall:
4428       MF.getInfo<X86FunctionInfo>()->setDecorationStyle(StdCall);
4429       return LowerStdCallCCArguments(Op, DAG);
4430     case CallingConv::X86_FastCall:
4431       MF.getInfo<X86FunctionInfo>()->setDecorationStyle(FastCall);
4432       return LowerFastCallCCArguments(Op, DAG);
4433     }
4434 }
4435
4436 SDOperand X86TargetLowering::LowerMEMSET(SDOperand Op, SelectionDAG &DAG) {
4437   SDOperand InFlag(0, 0);
4438   SDOperand Chain = Op.getOperand(0);
4439   unsigned Align =
4440     (unsigned)cast<ConstantSDNode>(Op.getOperand(4))->getValue();
4441   if (Align == 0) Align = 1;
4442
4443   ConstantSDNode *I = dyn_cast<ConstantSDNode>(Op.getOperand(3));
4444   // If not DWORD aligned, call memset if size is less than the threshold.
4445   // It knows how to align to the right boundary first.
4446   if ((Align & 3) != 0 ||
4447       (I && I->getValue() < Subtarget->getMinRepStrSizeThreshold())) {
4448     MVT::ValueType IntPtr = getPointerTy();
4449     const Type *IntPtrTy = getTargetData()->getIntPtrType();
4450     std::vector<std::pair<SDOperand, const Type*> > Args;
4451     Args.push_back(std::make_pair(Op.getOperand(1), IntPtrTy));
4452     // Extend the ubyte argument to be an int value for the call.
4453     SDOperand Val = DAG.getNode(ISD::ZERO_EXTEND, MVT::i32, Op.getOperand(2));
4454     Args.push_back(std::make_pair(Val, IntPtrTy));
4455     Args.push_back(std::make_pair(Op.getOperand(3), IntPtrTy));
4456     std::pair<SDOperand,SDOperand> CallResult =
4457       LowerCallTo(Chain, Type::VoidTy, false, CallingConv::C, false,
4458                   DAG.getExternalSymbol("memset", IntPtr), Args, DAG);
4459     return CallResult.second;
4460   }
4461
4462   MVT::ValueType AVT;
4463   SDOperand Count;
4464   ConstantSDNode *ValC = dyn_cast<ConstantSDNode>(Op.getOperand(2));
4465   unsigned BytesLeft = 0;
4466   bool TwoRepStos = false;
4467   if (ValC) {
4468     unsigned ValReg;
4469     uint64_t Val = ValC->getValue() & 255;
4470
4471     // If the value is a constant, then we can potentially use larger sets.
4472     switch (Align & 3) {
4473       case 2:   // WORD aligned
4474         AVT = MVT::i16;
4475         ValReg = X86::AX;
4476         Val = (Val << 8) | Val;
4477         break;
4478       case 0:  // DWORD aligned
4479         AVT = MVT::i32;
4480         ValReg = X86::EAX;
4481         Val = (Val << 8)  | Val;
4482         Val = (Val << 16) | Val;
4483         if (Subtarget->is64Bit() && ((Align & 0xF) == 0)) {  // QWORD aligned
4484           AVT = MVT::i64;
4485           ValReg = X86::RAX;
4486           Val = (Val << 32) | Val;
4487         }
4488         break;
4489       default:  // Byte aligned
4490         AVT = MVT::i8;
4491         ValReg = X86::AL;
4492         Count = Op.getOperand(3);
4493         break;
4494     }
4495
4496     if (AVT > MVT::i8) {
4497       if (I) {
4498         unsigned UBytes = MVT::getSizeInBits(AVT) / 8;
4499         Count = DAG.getConstant(I->getValue() / UBytes, getPointerTy());
4500         BytesLeft = I->getValue() % UBytes;
4501       } else {
4502         assert(AVT >= MVT::i32 &&
4503                "Do not use rep;stos if not at least DWORD aligned");
4504         Count = DAG.getNode(ISD::SRL, Op.getOperand(3).getValueType(),
4505                             Op.getOperand(3), DAG.getConstant(2, MVT::i8));
4506         TwoRepStos = true;
4507       }
4508     }
4509
4510     Chain  = DAG.getCopyToReg(Chain, ValReg, DAG.getConstant(Val, AVT),
4511                               InFlag);
4512     InFlag = Chain.getValue(1);
4513   } else {
4514     AVT = MVT::i8;
4515     Count  = Op.getOperand(3);
4516     Chain  = DAG.getCopyToReg(Chain, X86::AL, Op.getOperand(2), InFlag);
4517     InFlag = Chain.getValue(1);
4518   }
4519
4520   Chain  = DAG.getCopyToReg(Chain, Subtarget->is64Bit() ? X86::RCX : X86::ECX,
4521                             Count, InFlag);
4522   InFlag = Chain.getValue(1);
4523   Chain  = DAG.getCopyToReg(Chain, Subtarget->is64Bit() ? X86::RDI : X86::EDI,
4524                             Op.getOperand(1), InFlag);
4525   InFlag = Chain.getValue(1);
4526
4527   std::vector<MVT::ValueType> Tys;
4528   Tys.push_back(MVT::Other);
4529   Tys.push_back(MVT::Flag);
4530   std::vector<SDOperand> Ops;
4531   Ops.push_back(Chain);
4532   Ops.push_back(DAG.getValueType(AVT));
4533   Ops.push_back(InFlag);
4534   Chain  = DAG.getNode(X86ISD::REP_STOS, Tys, &Ops[0], Ops.size());
4535
4536   if (TwoRepStos) {
4537     InFlag = Chain.getValue(1);
4538     Count = Op.getOperand(3);
4539     MVT::ValueType CVT = Count.getValueType();
4540     SDOperand Left = DAG.getNode(ISD::AND, CVT, Count,
4541                                DAG.getConstant((AVT == MVT::i64) ? 7 : 3, CVT));
4542     Chain  = DAG.getCopyToReg(Chain, (CVT == MVT::i64) ? X86::RCX : X86::ECX,
4543                               Left, InFlag);
4544     InFlag = Chain.getValue(1);
4545     Tys.clear();
4546     Tys.push_back(MVT::Other);
4547     Tys.push_back(MVT::Flag);
4548     Ops.clear();
4549     Ops.push_back(Chain);
4550     Ops.push_back(DAG.getValueType(MVT::i8));
4551     Ops.push_back(InFlag);
4552     Chain  = DAG.getNode(X86ISD::REP_STOS, Tys, &Ops[0], Ops.size());
4553   } else if (BytesLeft) {
4554     // Issue stores for the last 1 - 7 bytes.
4555     SDOperand Value;
4556     unsigned Val = ValC->getValue() & 255;
4557     unsigned Offset = I->getValue() - BytesLeft;
4558     SDOperand DstAddr = Op.getOperand(1);
4559     MVT::ValueType AddrVT = DstAddr.getValueType();
4560     if (BytesLeft >= 4) {
4561       Val = (Val << 8)  | Val;
4562       Val = (Val << 16) | Val;
4563       Value = DAG.getConstant(Val, MVT::i32);
4564       Chain = DAG.getStore(Chain, Value,
4565                            DAG.getNode(ISD::ADD, AddrVT, DstAddr,
4566                                        DAG.getConstant(Offset, AddrVT)),
4567                            NULL, 0);
4568       BytesLeft -= 4;
4569       Offset += 4;
4570     }
4571     if (BytesLeft >= 2) {
4572       Value = DAG.getConstant((Val << 8) | Val, MVT::i16);
4573       Chain = DAG.getStore(Chain, Value,
4574                            DAG.getNode(ISD::ADD, AddrVT, DstAddr,
4575                                        DAG.getConstant(Offset, AddrVT)),
4576                            NULL, 0);
4577       BytesLeft -= 2;
4578       Offset += 2;
4579     }
4580     if (BytesLeft == 1) {
4581       Value = DAG.getConstant(Val, MVT::i8);
4582       Chain = DAG.getStore(Chain, Value,
4583                            DAG.getNode(ISD::ADD, AddrVT, DstAddr,
4584                                        DAG.getConstant(Offset, AddrVT)),
4585                            NULL, 0);
4586     }
4587   }
4588
4589   return Chain;
4590 }
4591
4592 SDOperand X86TargetLowering::LowerMEMCPY(SDOperand Op, SelectionDAG &DAG) {
4593   SDOperand Chain = Op.getOperand(0);
4594   unsigned Align =
4595     (unsigned)cast<ConstantSDNode>(Op.getOperand(4))->getValue();
4596   if (Align == 0) Align = 1;
4597
4598   ConstantSDNode *I = dyn_cast<ConstantSDNode>(Op.getOperand(3));
4599   // If not DWORD aligned, call memcpy if size is less than the threshold.
4600   // It knows how to align to the right boundary first.
4601   if ((Align & 3) != 0 ||
4602       (I && I->getValue() < Subtarget->getMinRepStrSizeThreshold())) {
4603     MVT::ValueType IntPtr = getPointerTy();
4604     const Type *IntPtrTy = getTargetData()->getIntPtrType();
4605     std::vector<std::pair<SDOperand, const Type*> > Args;
4606     Args.push_back(std::make_pair(Op.getOperand(1), IntPtrTy));
4607     Args.push_back(std::make_pair(Op.getOperand(2), IntPtrTy));
4608     Args.push_back(std::make_pair(Op.getOperand(3), IntPtrTy));
4609     std::pair<SDOperand,SDOperand> CallResult =
4610       LowerCallTo(Chain, Type::VoidTy, false, CallingConv::C, false,
4611                   DAG.getExternalSymbol("memcpy", IntPtr), Args, DAG);
4612     return CallResult.second;
4613   }
4614
4615   MVT::ValueType AVT;
4616   SDOperand Count;
4617   unsigned BytesLeft = 0;
4618   bool TwoRepMovs = false;
4619   switch (Align & 3) {
4620     case 2:   // WORD aligned
4621       AVT = MVT::i16;
4622       break;
4623     case 0:  // DWORD aligned
4624       AVT = MVT::i32;
4625       if (Subtarget->is64Bit() && ((Align & 0xF) == 0))  // QWORD aligned
4626         AVT = MVT::i64;
4627       break;
4628     default:  // Byte aligned
4629       AVT = MVT::i8;
4630       Count = Op.getOperand(3);
4631       break;
4632   }
4633
4634   if (AVT > MVT::i8) {
4635     if (I) {
4636       unsigned UBytes = MVT::getSizeInBits(AVT) / 8;
4637       Count = DAG.getConstant(I->getValue() / UBytes, getPointerTy());
4638       BytesLeft = I->getValue() % UBytes;
4639     } else {
4640       assert(AVT >= MVT::i32 &&
4641              "Do not use rep;movs if not at least DWORD aligned");
4642       Count = DAG.getNode(ISD::SRL, Op.getOperand(3).getValueType(),
4643                           Op.getOperand(3), DAG.getConstant(2, MVT::i8));
4644       TwoRepMovs = true;
4645     }
4646   }
4647
4648   SDOperand InFlag(0, 0);
4649   Chain  = DAG.getCopyToReg(Chain, Subtarget->is64Bit() ? X86::RCX : X86::ECX,
4650                             Count, InFlag);
4651   InFlag = Chain.getValue(1);
4652   Chain  = DAG.getCopyToReg(Chain, Subtarget->is64Bit() ? X86::RDI : X86::EDI,
4653                             Op.getOperand(1), InFlag);
4654   InFlag = Chain.getValue(1);
4655   Chain  = DAG.getCopyToReg(Chain, Subtarget->is64Bit() ? X86::RSI : X86::ESI,
4656                             Op.getOperand(2), InFlag);
4657   InFlag = Chain.getValue(1);
4658
4659   std::vector<MVT::ValueType> Tys;
4660   Tys.push_back(MVT::Other);
4661   Tys.push_back(MVT::Flag);
4662   std::vector<SDOperand> Ops;
4663   Ops.push_back(Chain);
4664   Ops.push_back(DAG.getValueType(AVT));
4665   Ops.push_back(InFlag);
4666   Chain = DAG.getNode(X86ISD::REP_MOVS, Tys, &Ops[0], Ops.size());
4667
4668   if (TwoRepMovs) {
4669     InFlag = Chain.getValue(1);
4670     Count = Op.getOperand(3);
4671     MVT::ValueType CVT = Count.getValueType();
4672     SDOperand Left = DAG.getNode(ISD::AND, CVT, Count,
4673                                DAG.getConstant((AVT == MVT::i64) ? 7 : 3, CVT));
4674     Chain  = DAG.getCopyToReg(Chain, (CVT == MVT::i64) ? X86::RCX : X86::ECX,
4675                               Left, InFlag);
4676     InFlag = Chain.getValue(1);
4677     Tys.clear();
4678     Tys.push_back(MVT::Other);
4679     Tys.push_back(MVT::Flag);
4680     Ops.clear();
4681     Ops.push_back(Chain);
4682     Ops.push_back(DAG.getValueType(MVT::i8));
4683     Ops.push_back(InFlag);
4684     Chain = DAG.getNode(X86ISD::REP_MOVS, Tys, &Ops[0], Ops.size());
4685   } else if (BytesLeft) {
4686     // Issue loads and stores for the last 1 - 7 bytes.
4687     unsigned Offset = I->getValue() - BytesLeft;
4688     SDOperand DstAddr = Op.getOperand(1);
4689     MVT::ValueType DstVT = DstAddr.getValueType();
4690     SDOperand SrcAddr = Op.getOperand(2);
4691     MVT::ValueType SrcVT = SrcAddr.getValueType();
4692     SDOperand Value;
4693     if (BytesLeft >= 4) {
4694       Value = DAG.getLoad(MVT::i32, Chain,
4695                           DAG.getNode(ISD::ADD, SrcVT, SrcAddr,
4696                                       DAG.getConstant(Offset, SrcVT)),
4697                           NULL, 0);
4698       Chain = Value.getValue(1);
4699       Chain = DAG.getStore(Chain, Value,
4700                            DAG.getNode(ISD::ADD, DstVT, DstAddr,
4701                                        DAG.getConstant(Offset, DstVT)),
4702                            NULL, 0);
4703       BytesLeft -= 4;
4704       Offset += 4;
4705     }
4706     if (BytesLeft >= 2) {
4707       Value = DAG.getLoad(MVT::i16, Chain,
4708                           DAG.getNode(ISD::ADD, SrcVT, SrcAddr,
4709                                       DAG.getConstant(Offset, SrcVT)),
4710                           NULL, 0);
4711       Chain = Value.getValue(1);
4712       Chain = DAG.getStore(Chain, Value,
4713                            DAG.getNode(ISD::ADD, DstVT, DstAddr,
4714                                        DAG.getConstant(Offset, DstVT)),
4715                            NULL, 0);
4716       BytesLeft -= 2;
4717       Offset += 2;
4718     }
4719
4720     if (BytesLeft == 1) {
4721       Value = DAG.getLoad(MVT::i8, Chain,
4722                           DAG.getNode(ISD::ADD, SrcVT, SrcAddr,
4723                                       DAG.getConstant(Offset, SrcVT)),
4724                           NULL, 0);
4725       Chain = Value.getValue(1);
4726       Chain = DAG.getStore(Chain, Value,
4727                            DAG.getNode(ISD::ADD, DstVT, DstAddr,
4728                                        DAG.getConstant(Offset, DstVT)),
4729                            NULL, 0);
4730     }
4731   }
4732
4733   return Chain;
4734 }
4735
4736 SDOperand
4737 X86TargetLowering::LowerREADCYCLCECOUNTER(SDOperand Op, SelectionDAG &DAG) {
4738   std::vector<MVT::ValueType> Tys;
4739   Tys.push_back(MVT::Other);
4740   Tys.push_back(MVT::Flag);
4741   std::vector<SDOperand> Ops;
4742   Ops.push_back(Op.getOperand(0));
4743   SDOperand rd = DAG.getNode(X86ISD::RDTSC_DAG, Tys, &Ops[0], Ops.size());
4744   Ops.clear();
4745   Ops.push_back(DAG.getCopyFromReg(rd, X86::EAX, MVT::i32, rd.getValue(1)));
4746   Ops.push_back(DAG.getCopyFromReg(Ops[0].getValue(1), X86::EDX, 
4747                                    MVT::i32, Ops[0].getValue(2)));
4748   Ops.push_back(Ops[1].getValue(1));
4749   Tys[0] = Tys[1] = MVT::i32;
4750   Tys.push_back(MVT::Other);
4751   return DAG.getNode(ISD::MERGE_VALUES, Tys, &Ops[0], Ops.size());
4752 }
4753
4754 SDOperand X86TargetLowering::LowerVASTART(SDOperand Op, SelectionDAG &DAG) {
4755   SrcValueSDNode *SV = cast<SrcValueSDNode>(Op.getOperand(2));
4756
4757   if (!Subtarget->is64Bit()) {
4758     // vastart just stores the address of the VarArgsFrameIndex slot into the
4759     // memory location argument.
4760     SDOperand FR = DAG.getFrameIndex(VarArgsFrameIndex, getPointerTy());
4761     return DAG.getStore(Op.getOperand(0), FR,Op.getOperand(1), SV->getValue(),
4762                         SV->getOffset());
4763   }
4764
4765   // __va_list_tag:
4766   //   gp_offset         (0 - 6 * 8)
4767   //   fp_offset         (48 - 48 + 8 * 16)
4768   //   overflow_arg_area (point to parameters coming in memory).
4769   //   reg_save_area
4770   std::vector<SDOperand> MemOps;
4771   SDOperand FIN = Op.getOperand(1);
4772   // Store gp_offset
4773   SDOperand Store = DAG.getStore(Op.getOperand(0),
4774                                  DAG.getConstant(VarArgsGPOffset, MVT::i32),
4775                                  FIN, SV->getValue(), SV->getOffset());
4776   MemOps.push_back(Store);
4777
4778   // Store fp_offset
4779   FIN = DAG.getNode(ISD::ADD, getPointerTy(), FIN,
4780                     DAG.getConstant(4, getPointerTy()));
4781   Store = DAG.getStore(Op.getOperand(0),
4782                        DAG.getConstant(VarArgsFPOffset, MVT::i32),
4783                        FIN, SV->getValue(), SV->getOffset());
4784   MemOps.push_back(Store);
4785
4786   // Store ptr to overflow_arg_area
4787   FIN = DAG.getNode(ISD::ADD, getPointerTy(), FIN,
4788                     DAG.getConstant(4, getPointerTy()));
4789   SDOperand OVFIN = DAG.getFrameIndex(VarArgsFrameIndex, getPointerTy());
4790   Store = DAG.getStore(Op.getOperand(0), OVFIN, FIN, SV->getValue(),
4791                        SV->getOffset());
4792   MemOps.push_back(Store);
4793
4794   // Store ptr to reg_save_area.
4795   FIN = DAG.getNode(ISD::ADD, getPointerTy(), FIN,
4796                     DAG.getConstant(8, getPointerTy()));
4797   SDOperand RSFIN = DAG.getFrameIndex(RegSaveFrameIndex, getPointerTy());
4798   Store = DAG.getStore(Op.getOperand(0), RSFIN, FIN, SV->getValue(),
4799                        SV->getOffset());
4800   MemOps.push_back(Store);
4801   return DAG.getNode(ISD::TokenFactor, MVT::Other, &MemOps[0], MemOps.size());
4802 }
4803
4804 SDOperand
4805 X86TargetLowering::LowerINTRINSIC_WO_CHAIN(SDOperand Op, SelectionDAG &DAG) {
4806   unsigned IntNo = cast<ConstantSDNode>(Op.getOperand(0))->getValue();
4807   switch (IntNo) {
4808   default: return SDOperand();    // Don't custom lower most intrinsics.
4809     // Comparison intrinsics.
4810   case Intrinsic::x86_sse_comieq_ss:
4811   case Intrinsic::x86_sse_comilt_ss:
4812   case Intrinsic::x86_sse_comile_ss:
4813   case Intrinsic::x86_sse_comigt_ss:
4814   case Intrinsic::x86_sse_comige_ss:
4815   case Intrinsic::x86_sse_comineq_ss:
4816   case Intrinsic::x86_sse_ucomieq_ss:
4817   case Intrinsic::x86_sse_ucomilt_ss:
4818   case Intrinsic::x86_sse_ucomile_ss:
4819   case Intrinsic::x86_sse_ucomigt_ss:
4820   case Intrinsic::x86_sse_ucomige_ss:
4821   case Intrinsic::x86_sse_ucomineq_ss:
4822   case Intrinsic::x86_sse2_comieq_sd:
4823   case Intrinsic::x86_sse2_comilt_sd:
4824   case Intrinsic::x86_sse2_comile_sd:
4825   case Intrinsic::x86_sse2_comigt_sd:
4826   case Intrinsic::x86_sse2_comige_sd:
4827   case Intrinsic::x86_sse2_comineq_sd:
4828   case Intrinsic::x86_sse2_ucomieq_sd:
4829   case Intrinsic::x86_sse2_ucomilt_sd:
4830   case Intrinsic::x86_sse2_ucomile_sd:
4831   case Intrinsic::x86_sse2_ucomigt_sd:
4832   case Intrinsic::x86_sse2_ucomige_sd:
4833   case Intrinsic::x86_sse2_ucomineq_sd: {
4834     unsigned Opc = 0;
4835     ISD::CondCode CC = ISD::SETCC_INVALID;
4836     switch (IntNo) {
4837     default: break;
4838     case Intrinsic::x86_sse_comieq_ss: 
4839     case Intrinsic::x86_sse2_comieq_sd: 
4840       Opc = X86ISD::COMI;
4841       CC = ISD::SETEQ;
4842       break;
4843     case Intrinsic::x86_sse_comilt_ss:
4844     case Intrinsic::x86_sse2_comilt_sd:
4845       Opc = X86ISD::COMI;
4846       CC = ISD::SETLT;
4847       break;
4848     case Intrinsic::x86_sse_comile_ss:
4849     case Intrinsic::x86_sse2_comile_sd:
4850       Opc = X86ISD::COMI;
4851       CC = ISD::SETLE;
4852       break;
4853     case Intrinsic::x86_sse_comigt_ss:
4854     case Intrinsic::x86_sse2_comigt_sd:
4855       Opc = X86ISD::COMI;
4856       CC = ISD::SETGT;
4857       break;
4858     case Intrinsic::x86_sse_comige_ss:
4859     case Intrinsic::x86_sse2_comige_sd:
4860       Opc = X86ISD::COMI;
4861       CC = ISD::SETGE;
4862       break;
4863     case Intrinsic::x86_sse_comineq_ss:
4864     case Intrinsic::x86_sse2_comineq_sd:
4865       Opc = X86ISD::COMI;
4866       CC = ISD::SETNE;
4867       break;
4868     case Intrinsic::x86_sse_ucomieq_ss:
4869     case Intrinsic::x86_sse2_ucomieq_sd:
4870       Opc = X86ISD::UCOMI;
4871       CC = ISD::SETEQ;
4872       break;
4873     case Intrinsic::x86_sse_ucomilt_ss:
4874     case Intrinsic::x86_sse2_ucomilt_sd:
4875       Opc = X86ISD::UCOMI;
4876       CC = ISD::SETLT;
4877       break;
4878     case Intrinsic::x86_sse_ucomile_ss:
4879     case Intrinsic::x86_sse2_ucomile_sd:
4880       Opc = X86ISD::UCOMI;
4881       CC = ISD::SETLE;
4882       break;
4883     case Intrinsic::x86_sse_ucomigt_ss:
4884     case Intrinsic::x86_sse2_ucomigt_sd:
4885       Opc = X86ISD::UCOMI;
4886       CC = ISD::SETGT;
4887       break;
4888     case Intrinsic::x86_sse_ucomige_ss:
4889     case Intrinsic::x86_sse2_ucomige_sd:
4890       Opc = X86ISD::UCOMI;
4891       CC = ISD::SETGE;
4892       break;
4893     case Intrinsic::x86_sse_ucomineq_ss:
4894     case Intrinsic::x86_sse2_ucomineq_sd:
4895       Opc = X86ISD::UCOMI;
4896       CC = ISD::SETNE;
4897       break;
4898     }
4899
4900     unsigned X86CC;
4901     SDOperand LHS = Op.getOperand(1);
4902     SDOperand RHS = Op.getOperand(2);
4903     translateX86CC(CC, true, X86CC, LHS, RHS, DAG);
4904
4905     const MVT::ValueType *VTs = DAG.getNodeValueTypes(MVT::Other, MVT::Flag);
4906     SDOperand Ops1[] = { DAG.getEntryNode(), LHS, RHS };
4907     SDOperand Cond = DAG.getNode(Opc, VTs, 2, Ops1, 3);
4908     VTs = DAG.getNodeValueTypes(MVT::i8, MVT::Flag);
4909     SDOperand Ops2[] = { DAG.getConstant(X86CC, MVT::i8), Cond };
4910     SDOperand SetCC = DAG.getNode(X86ISD::SETCC, VTs, 2, Ops2, 2);
4911     return DAG.getNode(ISD::ANY_EXTEND, MVT::i32, SetCC);
4912   }
4913   }
4914 }
4915
4916 /// LowerOperation - Provide custom lowering hooks for some operations.
4917 ///
4918 SDOperand X86TargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
4919   switch (Op.getOpcode()) {
4920   default: assert(0 && "Should not custom lower this!");
4921   case ISD::BUILD_VECTOR:       return LowerBUILD_VECTOR(Op, DAG);
4922   case ISD::VECTOR_SHUFFLE:     return LowerVECTOR_SHUFFLE(Op, DAG);
4923   case ISD::EXTRACT_VECTOR_ELT: return LowerEXTRACT_VECTOR_ELT(Op, DAG);
4924   case ISD::INSERT_VECTOR_ELT:  return LowerINSERT_VECTOR_ELT(Op, DAG);
4925   case ISD::SCALAR_TO_VECTOR:   return LowerSCALAR_TO_VECTOR(Op, DAG);
4926   case ISD::ConstantPool:       return LowerConstantPool(Op, DAG);
4927   case ISD::GlobalAddress:      return LowerGlobalAddress(Op, DAG);
4928   case ISD::ExternalSymbol:     return LowerExternalSymbol(Op, DAG);
4929   case ISD::SHL_PARTS:
4930   case ISD::SRA_PARTS:
4931   case ISD::SRL_PARTS:          return LowerShift(Op, DAG);
4932   case ISD::SINT_TO_FP:         return LowerSINT_TO_FP(Op, DAG);
4933   case ISD::FP_TO_SINT:         return LowerFP_TO_SINT(Op, DAG);
4934   case ISD::FABS:               return LowerFABS(Op, DAG);
4935   case ISD::FNEG:               return LowerFNEG(Op, DAG);
4936   case ISD::SETCC:              return LowerSETCC(Op, DAG, DAG.getEntryNode());
4937   case ISD::SELECT:             return LowerSELECT(Op, DAG);
4938   case ISD::BRCOND:             return LowerBRCOND(Op, DAG);
4939   case ISD::JumpTable:          return LowerJumpTable(Op, DAG);
4940   case ISD::CALL:               return LowerCALL(Op, DAG);
4941   case ISD::RET:                return LowerRET(Op, DAG);
4942   case ISD::FORMAL_ARGUMENTS:   return LowerFORMAL_ARGUMENTS(Op, DAG);
4943   case ISD::MEMSET:             return LowerMEMSET(Op, DAG);
4944   case ISD::MEMCPY:             return LowerMEMCPY(Op, DAG);
4945   case ISD::READCYCLECOUNTER:   return LowerREADCYCLCECOUNTER(Op, DAG);
4946   case ISD::VASTART:            return LowerVASTART(Op, DAG);
4947   case ISD::INTRINSIC_WO_CHAIN: return LowerINTRINSIC_WO_CHAIN(Op, DAG);
4948   }
4949 }
4950
4951 const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const {
4952   switch (Opcode) {
4953   default: return NULL;
4954   case X86ISD::SHLD:               return "X86ISD::SHLD";
4955   case X86ISD::SHRD:               return "X86ISD::SHRD";
4956   case X86ISD::FAND:               return "X86ISD::FAND";
4957   case X86ISD::FXOR:               return "X86ISD::FXOR";
4958   case X86ISD::FILD:               return "X86ISD::FILD";
4959   case X86ISD::FILD_FLAG:          return "X86ISD::FILD_FLAG";
4960   case X86ISD::FP_TO_INT16_IN_MEM: return "X86ISD::FP_TO_INT16_IN_MEM";
4961   case X86ISD::FP_TO_INT32_IN_MEM: return "X86ISD::FP_TO_INT32_IN_MEM";
4962   case X86ISD::FP_TO_INT64_IN_MEM: return "X86ISD::FP_TO_INT64_IN_MEM";
4963   case X86ISD::FLD:                return "X86ISD::FLD";
4964   case X86ISD::FST:                return "X86ISD::FST";
4965   case X86ISD::FP_GET_RESULT:      return "X86ISD::FP_GET_RESULT";
4966   case X86ISD::FP_SET_RESULT:      return "X86ISD::FP_SET_RESULT";
4967   case X86ISD::CALL:               return "X86ISD::CALL";
4968   case X86ISD::TAILCALL:           return "X86ISD::TAILCALL";
4969   case X86ISD::RDTSC_DAG:          return "X86ISD::RDTSC_DAG";
4970   case X86ISD::CMP:                return "X86ISD::CMP";
4971   case X86ISD::COMI:               return "X86ISD::COMI";
4972   case X86ISD::UCOMI:              return "X86ISD::UCOMI";
4973   case X86ISD::SETCC:              return "X86ISD::SETCC";
4974   case X86ISD::CMOV:               return "X86ISD::CMOV";
4975   case X86ISD::BRCOND:             return "X86ISD::BRCOND";
4976   case X86ISD::RET_FLAG:           return "X86ISD::RET_FLAG";
4977   case X86ISD::REP_STOS:           return "X86ISD::REP_STOS";
4978   case X86ISD::REP_MOVS:           return "X86ISD::REP_MOVS";
4979   case X86ISD::LOAD_PACK:          return "X86ISD::LOAD_PACK";
4980   case X86ISD::LOAD_UA:            return "X86ISD::LOAD_UA";
4981   case X86ISD::GlobalBaseReg:      return "X86ISD::GlobalBaseReg";
4982   case X86ISD::Wrapper:            return "X86ISD::Wrapper";
4983   case X86ISD::S2VEC:              return "X86ISD::S2VEC";
4984   case X86ISD::PEXTRW:             return "X86ISD::PEXTRW";
4985   case X86ISD::PINSRW:             return "X86ISD::PINSRW";
4986   case X86ISD::FMAX:               return "X86ISD::FMAX";
4987   case X86ISD::FMIN:               return "X86ISD::FMIN";
4988   }
4989 }
4990
4991 /// isLegalAddressImmediate - Return true if the integer value or
4992 /// GlobalValue can be used as the offset of the target addressing mode.
4993 bool X86TargetLowering::isLegalAddressImmediate(int64_t V) const {
4994   // X86 allows a sign-extended 32-bit immediate field.
4995   return (V > -(1LL << 32) && V < (1LL << 32)-1);
4996 }
4997
4998 bool X86TargetLowering::isLegalAddressImmediate(GlobalValue *GV) const {
4999   // GV is 64-bit but displacement field is 32-bit unless we are in small code
5000   // model. Mac OS X happens to support only small PIC code model.
5001   // FIXME: better support for other OS's.
5002   if (Subtarget->is64Bit() && !Subtarget->isTargetDarwin())
5003     return false;
5004   if (Subtarget->isTargetDarwin()) {
5005     Reloc::Model RModel = getTargetMachine().getRelocationModel();
5006     if (RModel == Reloc::Static)
5007       return true;
5008     else if (RModel == Reloc::DynamicNoPIC)
5009       return !DarwinGVRequiresExtraLoad(GV);
5010     else
5011       return false;
5012   } else
5013     return true;
5014 }
5015
5016 /// isShuffleMaskLegal - Targets can use this to indicate that they only
5017 /// support *some* VECTOR_SHUFFLE operations, those with specific masks.
5018 /// By default, if a target supports the VECTOR_SHUFFLE node, all mask values
5019 /// are assumed to be legal.
5020 bool
5021 X86TargetLowering::isShuffleMaskLegal(SDOperand Mask, MVT::ValueType VT) const {
5022   // Only do shuffles on 128-bit vector types for now.
5023   if (MVT::getSizeInBits(VT) == 64) return false;
5024   return (Mask.Val->getNumOperands() <= 4 ||
5025           isSplatMask(Mask.Val)  ||
5026           isPSHUFHW_PSHUFLWMask(Mask.Val) ||
5027           X86::isUNPCKLMask(Mask.Val) ||
5028           X86::isUNPCKL_v_undef_Mask(Mask.Val) ||
5029           X86::isUNPCKHMask(Mask.Val));
5030 }
5031
5032 bool X86TargetLowering::isVectorClearMaskLegal(std::vector<SDOperand> &BVOps,
5033                                                MVT::ValueType EVT,
5034                                                SelectionDAG &DAG) const {
5035   unsigned NumElts = BVOps.size();
5036   // Only do shuffles on 128-bit vector types for now.
5037   if (MVT::getSizeInBits(EVT) * NumElts == 64) return false;
5038   if (NumElts == 2) return true;
5039   if (NumElts == 4) {
5040     return (isMOVLMask(BVOps)  || isCommutedMOVL(BVOps, true) ||
5041             isSHUFPMask(BVOps) || isCommutedSHUFP(BVOps));
5042   }
5043   return false;
5044 }
5045
5046 //===----------------------------------------------------------------------===//
5047 //                           X86 Scheduler Hooks
5048 //===----------------------------------------------------------------------===//
5049
5050 MachineBasicBlock *
5051 X86TargetLowering::InsertAtEndOfBasicBlock(MachineInstr *MI,
5052                                            MachineBasicBlock *BB) {
5053   switch (MI->getOpcode()) {
5054   default: assert(false && "Unexpected instr type to insert");
5055   case X86::CMOV_FR32:
5056   case X86::CMOV_FR64:
5057   case X86::CMOV_V4F32:
5058   case X86::CMOV_V2F64:
5059   case X86::CMOV_V2I64: {
5060     // To "insert" a SELECT_CC instruction, we actually have to insert the
5061     // diamond control-flow pattern.  The incoming instruction knows the
5062     // destination vreg to set, the condition code register to branch on, the
5063     // true/false values to select between, and a branch opcode to use.
5064     const BasicBlock *LLVM_BB = BB->getBasicBlock();
5065     ilist<MachineBasicBlock>::iterator It = BB;
5066     ++It;
5067   
5068     //  thisMBB:
5069     //  ...
5070     //   TrueVal = ...
5071     //   cmpTY ccX, r1, r2
5072     //   bCC copy1MBB
5073     //   fallthrough --> copy0MBB
5074     MachineBasicBlock *thisMBB = BB;
5075     MachineBasicBlock *copy0MBB = new MachineBasicBlock(LLVM_BB);
5076     MachineBasicBlock *sinkMBB = new MachineBasicBlock(LLVM_BB);
5077     unsigned Opc = 
5078       X86::GetCondBranchFromCond((X86::CondCode)MI->getOperand(3).getImm());
5079     BuildMI(BB, Opc, 1).addMBB(sinkMBB);
5080     MachineFunction *F = BB->getParent();
5081     F->getBasicBlockList().insert(It, copy0MBB);
5082     F->getBasicBlockList().insert(It, sinkMBB);
5083     // Update machine-CFG edges by first adding all successors of the current
5084     // block to the new block which will contain the Phi node for the select.
5085     for(MachineBasicBlock::succ_iterator i = BB->succ_begin(), 
5086         e = BB->succ_end(); i != e; ++i)
5087       sinkMBB->addSuccessor(*i);
5088     // Next, remove all successors of the current block, and add the true
5089     // and fallthrough blocks as its successors.
5090     while(!BB->succ_empty())
5091       BB->removeSuccessor(BB->succ_begin());
5092     BB->addSuccessor(copy0MBB);
5093     BB->addSuccessor(sinkMBB);
5094   
5095     //  copy0MBB:
5096     //   %FalseValue = ...
5097     //   # fallthrough to sinkMBB
5098     BB = copy0MBB;
5099   
5100     // Update machine-CFG edges
5101     BB->addSuccessor(sinkMBB);
5102   
5103     //  sinkMBB:
5104     //   %Result = phi [ %FalseValue, copy0MBB ], [ %TrueValue, thisMBB ]
5105     //  ...
5106     BB = sinkMBB;
5107     BuildMI(BB, X86::PHI, 4, MI->getOperand(0).getReg())
5108       .addReg(MI->getOperand(1).getReg()).addMBB(copy0MBB)
5109       .addReg(MI->getOperand(2).getReg()).addMBB(thisMBB);
5110
5111     delete MI;   // The pseudo instruction is gone now.
5112     return BB;
5113   }
5114
5115   case X86::FP_TO_INT16_IN_MEM:
5116   case X86::FP_TO_INT32_IN_MEM:
5117   case X86::FP_TO_INT64_IN_MEM: {
5118     // Change the floating point control register to use "round towards zero"
5119     // mode when truncating to an integer value.
5120     MachineFunction *F = BB->getParent();
5121     int CWFrameIdx = F->getFrameInfo()->CreateStackObject(2, 2);
5122     addFrameReference(BuildMI(BB, X86::FNSTCW16m, 4), CWFrameIdx);
5123
5124     // Load the old value of the high byte of the control word...
5125     unsigned OldCW =
5126       F->getSSARegMap()->createVirtualRegister(X86::GR16RegisterClass);
5127     addFrameReference(BuildMI(BB, X86::MOV16rm, 4, OldCW), CWFrameIdx);
5128
5129     // Set the high part to be round to zero...
5130     addFrameReference(BuildMI(BB, X86::MOV16mi, 5), CWFrameIdx).addImm(0xC7F);
5131
5132     // Reload the modified control word now...
5133     addFrameReference(BuildMI(BB, X86::FLDCW16m, 4), CWFrameIdx);
5134
5135     // Restore the memory image of control word to original value
5136     addFrameReference(BuildMI(BB, X86::MOV16mr, 5), CWFrameIdx).addReg(OldCW);
5137
5138     // Get the X86 opcode to use.
5139     unsigned Opc;
5140     switch (MI->getOpcode()) {
5141     default: assert(0 && "illegal opcode!");
5142     case X86::FP_TO_INT16_IN_MEM: Opc = X86::FpIST16m; break;
5143     case X86::FP_TO_INT32_IN_MEM: Opc = X86::FpIST32m; break;
5144     case X86::FP_TO_INT64_IN_MEM: Opc = X86::FpIST64m; break;
5145     }
5146
5147     X86AddressMode AM;
5148     MachineOperand &Op = MI->getOperand(0);
5149     if (Op.isRegister()) {
5150       AM.BaseType = X86AddressMode::RegBase;
5151       AM.Base.Reg = Op.getReg();
5152     } else {
5153       AM.BaseType = X86AddressMode::FrameIndexBase;
5154       AM.Base.FrameIndex = Op.getFrameIndex();
5155     }
5156     Op = MI->getOperand(1);
5157     if (Op.isImmediate())
5158       AM.Scale = Op.getImm();
5159     Op = MI->getOperand(2);
5160     if (Op.isImmediate())
5161       AM.IndexReg = Op.getImm();
5162     Op = MI->getOperand(3);
5163     if (Op.isGlobalAddress()) {
5164       AM.GV = Op.getGlobal();
5165     } else {
5166       AM.Disp = Op.getImm();
5167     }
5168     addFullAddress(BuildMI(BB, Opc, 5), AM).addReg(MI->getOperand(4).getReg());
5169
5170     // Reload the original control word now.
5171     addFrameReference(BuildMI(BB, X86::FLDCW16m, 4), CWFrameIdx);
5172
5173     delete MI;   // The pseudo instruction is gone now.
5174     return BB;
5175   }
5176   }
5177 }
5178
5179 //===----------------------------------------------------------------------===//
5180 //                           X86 Optimization Hooks
5181 //===----------------------------------------------------------------------===//
5182
5183 void X86TargetLowering::computeMaskedBitsForTargetNode(const SDOperand Op,
5184                                                        uint64_t Mask,
5185                                                        uint64_t &KnownZero, 
5186                                                        uint64_t &KnownOne,
5187                                                        unsigned Depth) const {
5188   unsigned Opc = Op.getOpcode();
5189   assert((Opc >= ISD::BUILTIN_OP_END ||
5190           Opc == ISD::INTRINSIC_WO_CHAIN ||
5191           Opc == ISD::INTRINSIC_W_CHAIN ||
5192           Opc == ISD::INTRINSIC_VOID) &&
5193          "Should use MaskedValueIsZero if you don't know whether Op"
5194          " is a target node!");
5195
5196   KnownZero = KnownOne = 0;   // Don't know anything.
5197   switch (Opc) {
5198   default: break;
5199   case X86ISD::SETCC: 
5200     KnownZero |= (MVT::getIntVTBitMask(Op.getValueType()) ^ 1ULL);
5201     break;
5202   }
5203 }
5204
5205 /// getShuffleScalarElt - Returns the scalar element that will make up the ith
5206 /// element of the result of the vector shuffle.
5207 static SDOperand getShuffleScalarElt(SDNode *N, unsigned i, SelectionDAG &DAG) {
5208   MVT::ValueType VT = N->getValueType(0);
5209   SDOperand PermMask = N->getOperand(2);
5210   unsigned NumElems = PermMask.getNumOperands();
5211   SDOperand V = (i < NumElems) ? N->getOperand(0) : N->getOperand(1);
5212   i %= NumElems;
5213   if (V.getOpcode() == ISD::SCALAR_TO_VECTOR) {
5214     return (i == 0)
5215       ? V.getOperand(0) : DAG.getNode(ISD::UNDEF, MVT::getVectorBaseType(VT));
5216   } else if (V.getOpcode() == ISD::VECTOR_SHUFFLE) {
5217     SDOperand Idx = PermMask.getOperand(i);
5218     if (Idx.getOpcode() == ISD::UNDEF)
5219       return DAG.getNode(ISD::UNDEF, MVT::getVectorBaseType(VT));
5220     return getShuffleScalarElt(V.Val,cast<ConstantSDNode>(Idx)->getValue(),DAG);
5221   }
5222   return SDOperand();
5223 }
5224
5225 /// isGAPlusOffset - Returns true (and the GlobalValue and the offset) if the
5226 /// node is a GlobalAddress + an offset.
5227 static bool isGAPlusOffset(SDNode *N, GlobalValue* &GA, int64_t &Offset) {
5228   if (N->getOpcode() == X86ISD::Wrapper) {
5229     if (dyn_cast<GlobalAddressSDNode>(N->getOperand(0))) {
5230       GA = cast<GlobalAddressSDNode>(N->getOperand(0))->getGlobal();
5231       return true;
5232     }
5233   } else if (N->getOpcode() == ISD::ADD) {
5234     SDOperand N1 = N->getOperand(0);
5235     SDOperand N2 = N->getOperand(1);
5236     if (isGAPlusOffset(N1.Val, GA, Offset)) {
5237       ConstantSDNode *V = dyn_cast<ConstantSDNode>(N2);
5238       if (V) {
5239         Offset += V->getSignExtended();
5240         return true;
5241       }
5242     } else if (isGAPlusOffset(N2.Val, GA, Offset)) {
5243       ConstantSDNode *V = dyn_cast<ConstantSDNode>(N1);
5244       if (V) {
5245         Offset += V->getSignExtended();
5246         return true;
5247       }
5248     }
5249   }
5250   return false;
5251 }
5252
5253 /// isConsecutiveLoad - Returns true if N is loading from an address of Base
5254 /// + Dist * Size.
5255 static bool isConsecutiveLoad(SDNode *N, SDNode *Base, int Dist, int Size,
5256                               MachineFrameInfo *MFI) {
5257   if (N->getOperand(0).Val != Base->getOperand(0).Val)
5258     return false;
5259
5260   SDOperand Loc = N->getOperand(1);
5261   SDOperand BaseLoc = Base->getOperand(1);
5262   if (Loc.getOpcode() == ISD::FrameIndex) {
5263     if (BaseLoc.getOpcode() != ISD::FrameIndex)
5264       return false;
5265     int FI  = dyn_cast<FrameIndexSDNode>(Loc)->getIndex();
5266     int BFI = dyn_cast<FrameIndexSDNode>(BaseLoc)->getIndex();
5267     int FS  = MFI->getObjectSize(FI);
5268     int BFS = MFI->getObjectSize(BFI);
5269     if (FS != BFS || FS != Size) return false;
5270     return MFI->getObjectOffset(FI) == (MFI->getObjectOffset(BFI) + Dist*Size);
5271   } else {
5272     GlobalValue *GV1 = NULL;
5273     GlobalValue *GV2 = NULL;
5274     int64_t Offset1 = 0;
5275     int64_t Offset2 = 0;
5276     bool isGA1 = isGAPlusOffset(Loc.Val, GV1, Offset1);
5277     bool isGA2 = isGAPlusOffset(BaseLoc.Val, GV2, Offset2);
5278     if (isGA1 && isGA2 && GV1 == GV2)
5279       return Offset1 == (Offset2 + Dist*Size);
5280   }
5281
5282   return false;
5283 }
5284
5285 static bool isBaseAlignment16(SDNode *Base, MachineFrameInfo *MFI,
5286                               const X86Subtarget *Subtarget) {
5287   GlobalValue *GV;
5288   int64_t Offset;
5289   if (isGAPlusOffset(Base, GV, Offset))
5290     return (GV->getAlignment() >= 16 && (Offset % 16) == 0);
5291   else {
5292     assert(Base->getOpcode() == ISD::FrameIndex && "Unexpected base node!");
5293     int BFI = dyn_cast<FrameIndexSDNode>(Base)->getIndex();
5294     if (BFI < 0)
5295       // Fixed objects do not specify alignment, however the offsets are known.
5296       return ((Subtarget->getStackAlignment() % 16) == 0 &&
5297               (MFI->getObjectOffset(BFI) % 16) == 0);
5298     else
5299       return MFI->getObjectAlignment(BFI) >= 16;
5300   }
5301   return false;
5302 }
5303
5304
5305 /// PerformShuffleCombine - Combine a vector_shuffle that is equal to
5306 /// build_vector load1, load2, load3, load4, <0, 1, 2, 3> into a 128-bit load
5307 /// if the load addresses are consecutive, non-overlapping, and in the right
5308 /// order.
5309 static SDOperand PerformShuffleCombine(SDNode *N, SelectionDAG &DAG,
5310                                        const X86Subtarget *Subtarget) {
5311   MachineFunction &MF = DAG.getMachineFunction();
5312   MachineFrameInfo *MFI = MF.getFrameInfo();
5313   MVT::ValueType VT = N->getValueType(0);
5314   MVT::ValueType EVT = MVT::getVectorBaseType(VT);
5315   SDOperand PermMask = N->getOperand(2);
5316   int NumElems = (int)PermMask.getNumOperands();
5317   SDNode *Base = NULL;
5318   for (int i = 0; i < NumElems; ++i) {
5319     SDOperand Idx = PermMask.getOperand(i);
5320     if (Idx.getOpcode() == ISD::UNDEF) {
5321       if (!Base) return SDOperand();
5322     } else {
5323       SDOperand Arg =
5324         getShuffleScalarElt(N, cast<ConstantSDNode>(Idx)->getValue(), DAG);
5325       if (!Arg.Val || !ISD::isNON_EXTLoad(Arg.Val))
5326         return SDOperand();
5327       if (!Base)
5328         Base = Arg.Val;
5329       else if (!isConsecutiveLoad(Arg.Val, Base,
5330                                   i, MVT::getSizeInBits(EVT)/8,MFI))
5331         return SDOperand();
5332     }
5333   }
5334
5335   bool isAlign16 = isBaseAlignment16(Base->getOperand(1).Val, MFI, Subtarget);
5336   if (isAlign16) {
5337     LoadSDNode *LD = cast<LoadSDNode>(Base);
5338     return DAG.getLoad(VT, LD->getChain(), LD->getBasePtr(), LD->getSrcValue(),
5339                        LD->getSrcValueOffset());
5340   } else {
5341     // Just use movups, it's shorter.
5342     std::vector<MVT::ValueType> Tys;
5343     Tys.push_back(MVT::v4f32);
5344     Tys.push_back(MVT::Other);
5345     SmallVector<SDOperand, 3> Ops;
5346     Ops.push_back(Base->getOperand(0));
5347     Ops.push_back(Base->getOperand(1));
5348     Ops.push_back(Base->getOperand(2));
5349     return DAG.getNode(ISD::BIT_CONVERT, VT,
5350                        DAG.getNode(X86ISD::LOAD_UA, Tys, &Ops[0], Ops.size()));
5351   }
5352 }
5353
5354 /// PerformSELECTCombine - Do target-specific dag combines on SELECT nodes.
5355 static SDOperand PerformSELECTCombine(SDNode *N, SelectionDAG &DAG,
5356                                       const X86Subtarget *Subtarget) {
5357   SDOperand Cond = N->getOperand(0);
5358   
5359   // If we have SSE[12] support, try to form min/max nodes.
5360   if (Subtarget->hasSSE2() &&
5361       (N->getValueType(0) == MVT::f32 || N->getValueType(0) == MVT::f64)) {
5362     if (Cond.getOpcode() == ISD::SETCC) {
5363       // Get the LHS/RHS of the select.
5364       SDOperand LHS = N->getOperand(1);
5365       SDOperand RHS = N->getOperand(2);
5366       ISD::CondCode CC = cast<CondCodeSDNode>(Cond.getOperand(2))->get();
5367       
5368       unsigned Opcode = 0;
5369       if (LHS == Cond.getOperand(0) && RHS == Cond.getOperand(1)) {
5370         switch (CC) {
5371         default: break;
5372         case ISD::SETOLE: // (X <= Y) ? X : Y -> min
5373         case ISD::SETULE:
5374         case ISD::SETLE:
5375           if (!UnsafeFPMath) break;
5376           // FALL THROUGH.
5377         case ISD::SETOLT:  // (X olt/lt Y) ? X : Y -> min
5378         case ISD::SETLT:
5379           Opcode = X86ISD::FMIN;
5380           break;
5381           
5382         case ISD::SETOGT: // (X > Y) ? X : Y -> max
5383         case ISD::SETUGT:
5384         case ISD::SETGT:
5385           if (!UnsafeFPMath) break;
5386           // FALL THROUGH.
5387         case ISD::SETUGE:  // (X uge/ge Y) ? X : Y -> max
5388         case ISD::SETGE:
5389           Opcode = X86ISD::FMAX;
5390           break;
5391         }
5392       } else if (LHS == Cond.getOperand(1) && RHS == Cond.getOperand(0)) {
5393         switch (CC) {
5394         default: break;
5395         case ISD::SETOGT: // (X > Y) ? Y : X -> min
5396         case ISD::SETUGT:
5397         case ISD::SETGT:
5398           if (!UnsafeFPMath) break;
5399           // FALL THROUGH.
5400         case ISD::SETUGE:  // (X uge/ge Y) ? Y : X -> min
5401         case ISD::SETGE:
5402           Opcode = X86ISD::FMIN;
5403           break;
5404           
5405         case ISD::SETOLE:   // (X <= Y) ? Y : X -> max
5406         case ISD::SETULE:
5407         case ISD::SETLE:
5408           if (!UnsafeFPMath) break;
5409           // FALL THROUGH.
5410         case ISD::SETOLT:   // (X olt/lt Y) ? Y : X -> max
5411         case ISD::SETLT:
5412           Opcode = X86ISD::FMAX;
5413           break;
5414         }
5415       }
5416       
5417       if (Opcode)
5418         return DAG.getNode(Opcode, N->getValueType(0), LHS, RHS);
5419     }
5420     
5421   }
5422
5423   return SDOperand();
5424 }
5425
5426
5427 SDOperand X86TargetLowering::PerformDAGCombine(SDNode *N, 
5428                                                DAGCombinerInfo &DCI) const {
5429   SelectionDAG &DAG = DCI.DAG;
5430   switch (N->getOpcode()) {
5431   default: break;
5432   case ISD::VECTOR_SHUFFLE:
5433     return PerformShuffleCombine(N, DAG, Subtarget);
5434   case ISD::SELECT:
5435     return PerformSELECTCombine(N, DAG, Subtarget);
5436   }
5437
5438   return SDOperand();
5439 }
5440
5441 //===----------------------------------------------------------------------===//
5442 //                           X86 Inline Assembly Support
5443 //===----------------------------------------------------------------------===//
5444
5445 /// getConstraintType - Given a constraint letter, return the type of
5446 /// constraint it is for this target.
5447 X86TargetLowering::ConstraintType
5448 X86TargetLowering::getConstraintType(char ConstraintLetter) const {
5449   switch (ConstraintLetter) {
5450   case 'A':
5451   case 'r':
5452   case 'R':
5453   case 'l':
5454   case 'q':
5455   case 'Q':
5456   case 'x':
5457   case 'Y':
5458     return C_RegisterClass;
5459   default: return TargetLowering::getConstraintType(ConstraintLetter);
5460   }
5461 }
5462
5463 /// isOperandValidForConstraint - Return the specified operand (possibly
5464 /// modified) if the specified SDOperand is valid for the specified target
5465 /// constraint letter, otherwise return null.
5466 SDOperand X86TargetLowering::
5467 isOperandValidForConstraint(SDOperand Op, char Constraint, SelectionDAG &DAG) {
5468   switch (Constraint) {
5469   default: break;
5470   case 'i':
5471     // Literal immediates are always ok.
5472     if (isa<ConstantSDNode>(Op)) return Op;
5473     
5474     // If we are in non-pic codegen mode, we allow the address of a global to
5475     // be used with 'i'.
5476     if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(Op)) {
5477       if (getTargetMachine().getRelocationModel() == Reloc::PIC_)
5478         return SDOperand(0, 0);
5479       
5480       if (GA->getOpcode() != ISD::TargetGlobalAddress)
5481         Op = DAG.getTargetGlobalAddress(GA->getGlobal(), GA->getValueType(0),
5482                                         GA->getOffset());
5483       return Op;
5484     }
5485     
5486     // Otherwise, not valid for this mode.
5487     return SDOperand(0, 0);
5488   }
5489   return TargetLowering::isOperandValidForConstraint(Op, Constraint, DAG);
5490 }
5491
5492
5493 std::vector<unsigned> X86TargetLowering::
5494 getRegClassForInlineAsmConstraint(const std::string &Constraint,
5495                                   MVT::ValueType VT) const {
5496   if (Constraint.size() == 1) {
5497     // FIXME: not handling fp-stack yet!
5498     // FIXME: not handling MMX registers yet ('y' constraint).
5499     switch (Constraint[0]) {      // GCC X86 Constraint Letters
5500     default: break;  // Unknown constraint letter
5501     case 'A':   // EAX/EDX
5502       if (VT == MVT::i32 || VT == MVT::i64)
5503         return make_vector<unsigned>(X86::EAX, X86::EDX, 0);
5504       break;
5505     case 'r':   // GENERAL_REGS
5506     case 'R':   // LEGACY_REGS
5507       if (VT == MVT::i32)
5508         return make_vector<unsigned>(X86::EAX, X86::EDX, X86::ECX, X86::EBX,
5509                                      X86::ESI, X86::EDI, X86::EBP, X86::ESP, 0);
5510       else if (VT == MVT::i16)
5511         return make_vector<unsigned>(X86::AX, X86::DX, X86::CX, X86::BX, 
5512                                      X86::SI, X86::DI, X86::BP, X86::SP, 0);
5513       else if (VT == MVT::i8)
5514         return make_vector<unsigned>(X86::AL, X86::DL, X86::CL, X86::DL, 0);
5515       break;
5516     case 'l':   // INDEX_REGS
5517       if (VT == MVT::i32)
5518         return make_vector<unsigned>(X86::EAX, X86::EDX, X86::ECX, X86::EBX,
5519                                      X86::ESI, X86::EDI, X86::EBP, 0);
5520       else if (VT == MVT::i16)
5521         return make_vector<unsigned>(X86::AX, X86::DX, X86::CX, X86::BX, 
5522                                      X86::SI, X86::DI, X86::BP, 0);
5523       else if (VT == MVT::i8)
5524         return make_vector<unsigned>(X86::AL, X86::DL, X86::CL, X86::DL, 0);
5525       break;
5526     case 'q':   // Q_REGS (GENERAL_REGS in 64-bit mode)
5527     case 'Q':   // Q_REGS
5528       if (VT == MVT::i32)
5529         return make_vector<unsigned>(X86::EAX, X86::EDX, X86::ECX, X86::EBX, 0);
5530       else if (VT == MVT::i16)
5531         return make_vector<unsigned>(X86::AX, X86::DX, X86::CX, X86::BX, 0);
5532       else if (VT == MVT::i8)
5533         return make_vector<unsigned>(X86::AL, X86::DL, X86::CL, X86::DL, 0);
5534         break;
5535     case 'x':   // SSE_REGS if SSE1 allowed
5536       if (Subtarget->hasSSE1())
5537         return make_vector<unsigned>(X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3,
5538                                      X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7,
5539                                      0);
5540       return std::vector<unsigned>();
5541     case 'Y':   // SSE_REGS if SSE2 allowed
5542       if (Subtarget->hasSSE2())
5543         return make_vector<unsigned>(X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3,
5544                                      X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7,
5545                                      0);
5546       return std::vector<unsigned>();
5547     }
5548   }
5549   
5550   return std::vector<unsigned>();
5551 }
5552
5553 std::pair<unsigned, const TargetRegisterClass*> 
5554 X86TargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
5555                                                 MVT::ValueType VT) const {
5556   // Use the default implementation in TargetLowering to convert the register
5557   // constraint into a member of a register class.
5558   std::pair<unsigned, const TargetRegisterClass*> Res;
5559   Res = TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
5560
5561   // Not found as a standard register?
5562   if (Res.second == 0) {
5563     // GCC calls "st(0)" just plain "st".
5564     if (StringsEqualNoCase("{st}", Constraint)) {
5565       Res.first = X86::ST0;
5566       Res.second = X86::RSTRegisterClass;
5567     }
5568     
5569     return Res;
5570   }
5571   
5572   // Otherwise, check to see if this is a register class of the wrong value
5573   // type.  For example, we want to map "{ax},i32" -> {eax}, we don't want it to
5574   // turn into {ax},{dx}.
5575   if (Res.second->hasType(VT))
5576     return Res;   // Correct type already, nothing to do.
5577   
5578   // All of the single-register GCC register classes map their values onto
5579   // 16-bit register pieces "ax","dx","cx","bx","si","di","bp","sp".  If we
5580   // really want an 8-bit or 32-bit register, map to the appropriate register
5581   // class and return the appropriate register.
5582   if (Res.second != X86::GR16RegisterClass)
5583     return Res;
5584   
5585   if (VT == MVT::i8) {
5586     unsigned DestReg = 0;
5587     switch (Res.first) {
5588     default: break;
5589     case X86::AX: DestReg = X86::AL; break;
5590     case X86::DX: DestReg = X86::DL; break;
5591     case X86::CX: DestReg = X86::CL; break;
5592     case X86::BX: DestReg = X86::BL; break;
5593     }
5594     if (DestReg) {
5595       Res.first = DestReg;
5596       Res.second = Res.second = X86::GR8RegisterClass;
5597     }
5598   } else if (VT == MVT::i32) {
5599     unsigned DestReg = 0;
5600     switch (Res.first) {
5601     default: break;
5602     case X86::AX: DestReg = X86::EAX; break;
5603     case X86::DX: DestReg = X86::EDX; break;
5604     case X86::CX: DestReg = X86::ECX; break;
5605     case X86::BX: DestReg = X86::EBX; break;
5606     case X86::SI: DestReg = X86::ESI; break;
5607     case X86::DI: DestReg = X86::EDI; break;
5608     case X86::BP: DestReg = X86::EBP; break;
5609     case X86::SP: DestReg = X86::ESP; break;
5610     }
5611     if (DestReg) {
5612       Res.first = DestReg;
5613       Res.second = Res.second = X86::GR32RegisterClass;
5614     }
5615   } else if (VT == MVT::i64) {
5616     unsigned DestReg = 0;
5617     switch (Res.first) {
5618     default: break;
5619     case X86::AX: DestReg = X86::RAX; break;
5620     case X86::DX: DestReg = X86::RDX; break;
5621     case X86::CX: DestReg = X86::RCX; break;
5622     case X86::BX: DestReg = X86::RBX; break;
5623     case X86::SI: DestReg = X86::RSI; break;
5624     case X86::DI: DestReg = X86::RDI; break;
5625     case X86::BP: DestReg = X86::RBP; break;
5626     case X86::SP: DestReg = X86::RSP; break;
5627     }
5628     if (DestReg) {
5629       Res.first = DestReg;
5630       Res.second = Res.second = X86::GR64RegisterClass;
5631     }
5632   }
5633   
5634   return Res;
5635 }
5636