Turn off the old way of handling debug information in the code generator. Use
[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 is distributed under the University of Illinois Open Source
6 // 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/GlobalVariable.h"
24 #include "llvm/Function.h"
25 #include "llvm/Intrinsics.h"
26 #include "llvm/ADT/BitVector.h"
27 #include "llvm/ADT/VectorExtras.h"
28 #include "llvm/CodeGen/CallingConvLower.h"
29 #include "llvm/CodeGen/MachineFrameInfo.h"
30 #include "llvm/CodeGen/MachineFunction.h"
31 #include "llvm/CodeGen/MachineInstrBuilder.h"
32 #include "llvm/CodeGen/MachineModuleInfo.h"
33 #include "llvm/CodeGen/MachineRegisterInfo.h"
34 #include "llvm/CodeGen/PseudoSourceValue.h"
35 #include "llvm/CodeGen/SelectionDAG.h"
36 #include "llvm/Support/MathExtras.h"
37 #include "llvm/Support/Debug.h"
38 #include "llvm/Target/TargetOptions.h"
39 #include "llvm/ADT/SmallSet.h"
40 #include "llvm/ADT/StringExtras.h"
41 #include "llvm/Support/CommandLine.h"
42 using namespace llvm;
43
44 static cl::opt<bool>
45 DisableMMX("disable-mmx", cl::Hidden, cl::desc("Disable use of MMX"));
46
47 // Forward declarations.
48 static SDValue getMOVLMask(unsigned NumElems, SelectionDAG &DAG, DebugLoc dl);
49
50 X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
51   : TargetLowering(TM) {
52   Subtarget = &TM.getSubtarget<X86Subtarget>();
53   X86ScalarSSEf64 = Subtarget->hasSSE2();
54   X86ScalarSSEf32 = Subtarget->hasSSE1();
55   X86StackPtr = Subtarget->is64Bit() ? X86::RSP : X86::ESP;
56
57   bool Fast = false;
58
59   RegInfo = TM.getRegisterInfo();
60   TD = getTargetData();
61
62   // Set up the TargetLowering object.
63
64   // X86 is weird, it always uses i8 for shift amounts and setcc results.
65   setShiftAmountType(MVT::i8);
66   setBooleanContents(ZeroOrOneBooleanContent);
67   setSchedulingPreference(SchedulingForRegPressure);
68   setShiftAmountFlavor(Mask);   // shl X, 32 == shl X, 0
69   setStackPointerRegisterToSaveRestore(X86StackPtr);
70
71   if (Subtarget->isTargetDarwin()) {
72     // Darwin should use _setjmp/_longjmp instead of setjmp/longjmp.
73     setUseUnderscoreSetJmp(false);
74     setUseUnderscoreLongJmp(false);
75   } else if (Subtarget->isTargetMingw()) {
76     // MS runtime is weird: it exports _setjmp, but longjmp!
77     setUseUnderscoreSetJmp(true);
78     setUseUnderscoreLongJmp(false);
79   } else {
80     setUseUnderscoreSetJmp(true);
81     setUseUnderscoreLongJmp(true);
82   }
83   
84   // Set up the register classes.
85   addRegisterClass(MVT::i8, X86::GR8RegisterClass);
86   addRegisterClass(MVT::i16, X86::GR16RegisterClass);
87   addRegisterClass(MVT::i32, X86::GR32RegisterClass);
88   if (Subtarget->is64Bit())
89     addRegisterClass(MVT::i64, X86::GR64RegisterClass);
90
91   setLoadExtAction(ISD::SEXTLOAD, MVT::i1, Promote);
92
93   // We don't accept any truncstore of integer registers.  
94   setTruncStoreAction(MVT::i64, MVT::i32, Expand);
95   setTruncStoreAction(MVT::i64, MVT::i16, Expand);
96   setTruncStoreAction(MVT::i64, MVT::i8 , Expand);
97   setTruncStoreAction(MVT::i32, MVT::i16, Expand);
98   setTruncStoreAction(MVT::i32, MVT::i8 , Expand);
99   setTruncStoreAction(MVT::i16, MVT::i8,  Expand);
100
101   // SETOEQ and SETUNE require checking two conditions.
102   setCondCodeAction(ISD::SETOEQ, MVT::f32, Expand);
103   setCondCodeAction(ISD::SETOEQ, MVT::f64, Expand);
104   setCondCodeAction(ISD::SETOEQ, MVT::f80, Expand);
105   setCondCodeAction(ISD::SETUNE, MVT::f32, Expand);
106   setCondCodeAction(ISD::SETUNE, MVT::f64, Expand);
107   setCondCodeAction(ISD::SETUNE, MVT::f80, Expand);
108
109   // Promote all UINT_TO_FP to larger SINT_TO_FP's, as X86 doesn't have this
110   // operation.
111   setOperationAction(ISD::UINT_TO_FP       , MVT::i1   , Promote);
112   setOperationAction(ISD::UINT_TO_FP       , MVT::i8   , Promote);
113   setOperationAction(ISD::UINT_TO_FP       , MVT::i16  , Promote);
114
115   if (Subtarget->is64Bit()) {
116     setOperationAction(ISD::UINT_TO_FP     , MVT::i64  , Expand);
117     setOperationAction(ISD::UINT_TO_FP     , MVT::i32  , Promote);
118   } else {
119     if (X86ScalarSSEf64) {
120       // We have an impenetrably clever algorithm for ui64->double only.
121       setOperationAction(ISD::UINT_TO_FP   , MVT::i64  , Custom);
122
123       // We have faster algorithm for ui32->single only.
124       setOperationAction(ISD::UINT_TO_FP   , MVT::i32  , Custom);
125     } else
126       setOperationAction(ISD::UINT_TO_FP   , MVT::i32  , Promote);
127   }
128
129   // Promote i1/i8 SINT_TO_FP to larger SINT_TO_FP's, as X86 doesn't have
130   // this operation.
131   setOperationAction(ISD::SINT_TO_FP       , MVT::i1   , Promote);
132   setOperationAction(ISD::SINT_TO_FP       , MVT::i8   , Promote);
133   // SSE has no i16 to fp conversion, only i32
134   if (X86ScalarSSEf32) {
135     setOperationAction(ISD::SINT_TO_FP     , MVT::i16  , Promote);
136     // f32 and f64 cases are Legal, f80 case is not
137     setOperationAction(ISD::SINT_TO_FP     , MVT::i32  , Custom);
138   } else {
139     setOperationAction(ISD::SINT_TO_FP     , MVT::i16  , Custom);
140     setOperationAction(ISD::SINT_TO_FP     , MVT::i32  , Custom);
141   }
142
143   // In 32-bit mode these are custom lowered.  In 64-bit mode F32 and F64
144   // are Legal, f80 is custom lowered.
145   setOperationAction(ISD::FP_TO_SINT     , MVT::i64  , Custom);
146   setOperationAction(ISD::SINT_TO_FP     , MVT::i64  , Custom);
147
148   // Promote i1/i8 FP_TO_SINT to larger FP_TO_SINTS's, as X86 doesn't have
149   // this operation.
150   setOperationAction(ISD::FP_TO_SINT       , MVT::i1   , Promote);
151   setOperationAction(ISD::FP_TO_SINT       , MVT::i8   , Promote);
152
153   if (X86ScalarSSEf32) {
154     setOperationAction(ISD::FP_TO_SINT     , MVT::i16  , Promote);
155     // f32 and f64 cases are Legal, f80 case is not
156     setOperationAction(ISD::FP_TO_SINT     , MVT::i32  , Custom);
157   } else {
158     setOperationAction(ISD::FP_TO_SINT     , MVT::i16  , Custom);
159     setOperationAction(ISD::FP_TO_SINT     , MVT::i32  , Custom);
160   }
161
162   // Handle FP_TO_UINT by promoting the destination to a larger signed
163   // conversion.
164   setOperationAction(ISD::FP_TO_UINT       , MVT::i1   , Promote);
165   setOperationAction(ISD::FP_TO_UINT       , MVT::i8   , Promote);
166   setOperationAction(ISD::FP_TO_UINT       , MVT::i16  , Promote);
167
168   if (Subtarget->is64Bit()) {
169     setOperationAction(ISD::FP_TO_UINT     , MVT::i64  , Expand);
170     setOperationAction(ISD::FP_TO_UINT     , MVT::i32  , Promote);
171   } else {
172     if (X86ScalarSSEf32 && !Subtarget->hasSSE3())
173       // Expand FP_TO_UINT into a select.
174       // FIXME: We would like to use a Custom expander here eventually to do
175       // the optimal thing for SSE vs. the default expansion in the legalizer.
176       setOperationAction(ISD::FP_TO_UINT   , MVT::i32  , Expand);
177     else
178       // With SSE3 we can use fisttpll to convert to a signed i64.
179       setOperationAction(ISD::FP_TO_UINT   , MVT::i32  , Promote);
180   }
181
182   // TODO: when we have SSE, these could be more efficient, by using movd/movq.
183   if (!X86ScalarSSEf64) {
184     setOperationAction(ISD::BIT_CONVERT      , MVT::f32  , Expand);
185     setOperationAction(ISD::BIT_CONVERT      , MVT::i32  , Expand);
186   }
187
188   // Scalar integer divide and remainder are lowered to use operations that
189   // produce two results, to match the available instructions. This exposes
190   // the two-result form to trivial CSE, which is able to combine x/y and x%y
191   // into a single instruction.
192   //
193   // Scalar integer multiply-high is also lowered to use two-result
194   // operations, to match the available instructions. However, plain multiply
195   // (low) operations are left as Legal, as there are single-result
196   // instructions for this in x86. Using the two-result multiply instructions
197   // when both high and low results are needed must be arranged by dagcombine.
198   setOperationAction(ISD::MULHS           , MVT::i8    , Expand);
199   setOperationAction(ISD::MULHU           , MVT::i8    , Expand);
200   setOperationAction(ISD::SDIV            , MVT::i8    , Expand);
201   setOperationAction(ISD::UDIV            , MVT::i8    , Expand);
202   setOperationAction(ISD::SREM            , MVT::i8    , Expand);
203   setOperationAction(ISD::UREM            , MVT::i8    , Expand);
204   setOperationAction(ISD::MULHS           , MVT::i16   , Expand);
205   setOperationAction(ISD::MULHU           , MVT::i16   , Expand);
206   setOperationAction(ISD::SDIV            , MVT::i16   , Expand);
207   setOperationAction(ISD::UDIV            , MVT::i16   , Expand);
208   setOperationAction(ISD::SREM            , MVT::i16   , Expand);
209   setOperationAction(ISD::UREM            , MVT::i16   , Expand);
210   setOperationAction(ISD::MULHS           , MVT::i32   , Expand);
211   setOperationAction(ISD::MULHU           , MVT::i32   , Expand);
212   setOperationAction(ISD::SDIV            , MVT::i32   , Expand);
213   setOperationAction(ISD::UDIV            , MVT::i32   , Expand);
214   setOperationAction(ISD::SREM            , MVT::i32   , Expand);
215   setOperationAction(ISD::UREM            , MVT::i32   , Expand);
216   setOperationAction(ISD::MULHS           , MVT::i64   , Expand);
217   setOperationAction(ISD::MULHU           , MVT::i64   , Expand);
218   setOperationAction(ISD::SDIV            , MVT::i64   , Expand);
219   setOperationAction(ISD::UDIV            , MVT::i64   , Expand);
220   setOperationAction(ISD::SREM            , MVT::i64   , Expand);
221   setOperationAction(ISD::UREM            , MVT::i64   , Expand);
222
223   setOperationAction(ISD::BR_JT            , MVT::Other, Expand);
224   setOperationAction(ISD::BRCOND           , MVT::Other, Custom);
225   setOperationAction(ISD::BR_CC            , MVT::Other, Expand);
226   setOperationAction(ISD::SELECT_CC        , MVT::Other, Expand);
227   if (Subtarget->is64Bit())
228     setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i32, Legal);
229   setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i16  , Legal);
230   setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i8   , Legal);
231   setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1   , Expand);
232   setOperationAction(ISD::FP_ROUND_INREG   , MVT::f32  , Expand);
233   setOperationAction(ISD::FREM             , MVT::f32  , Expand);
234   setOperationAction(ISD::FREM             , MVT::f64  , Expand);
235   setOperationAction(ISD::FREM             , MVT::f80  , Expand);
236   setOperationAction(ISD::FLT_ROUNDS_      , MVT::i32  , Custom);
237   
238   setOperationAction(ISD::CTPOP            , MVT::i8   , Expand);
239   setOperationAction(ISD::CTTZ             , MVT::i8   , Custom);
240   setOperationAction(ISD::CTLZ             , MVT::i8   , Custom);
241   setOperationAction(ISD::CTPOP            , MVT::i16  , Expand);
242   setOperationAction(ISD::CTTZ             , MVT::i16  , Custom);
243   setOperationAction(ISD::CTLZ             , MVT::i16  , Custom);
244   setOperationAction(ISD::CTPOP            , MVT::i32  , Expand);
245   setOperationAction(ISD::CTTZ             , MVT::i32  , Custom);
246   setOperationAction(ISD::CTLZ             , MVT::i32  , Custom);
247   if (Subtarget->is64Bit()) {
248     setOperationAction(ISD::CTPOP          , MVT::i64  , Expand);
249     setOperationAction(ISD::CTTZ           , MVT::i64  , Custom);
250     setOperationAction(ISD::CTLZ           , MVT::i64  , Custom);
251   }
252
253   setOperationAction(ISD::READCYCLECOUNTER , MVT::i64  , Custom);
254   setOperationAction(ISD::BSWAP            , MVT::i16  , Expand);
255
256   // These should be promoted to a larger select which is supported.
257   setOperationAction(ISD::SELECT           , MVT::i1   , Promote);
258   setOperationAction(ISD::SELECT           , MVT::i8   , Promote);
259   // X86 wants to expand cmov itself.
260   setOperationAction(ISD::SELECT          , MVT::i16  , Custom);
261   setOperationAction(ISD::SELECT          , MVT::i32  , Custom);
262   setOperationAction(ISD::SELECT          , MVT::f32  , Custom);
263   setOperationAction(ISD::SELECT          , MVT::f64  , Custom);
264   setOperationAction(ISD::SELECT          , MVT::f80  , Custom);
265   setOperationAction(ISD::SETCC           , MVT::i8   , Custom);
266   setOperationAction(ISD::SETCC           , MVT::i16  , Custom);
267   setOperationAction(ISD::SETCC           , MVT::i32  , Custom);
268   setOperationAction(ISD::SETCC           , MVT::f32  , Custom);
269   setOperationAction(ISD::SETCC           , MVT::f64  , Custom);
270   setOperationAction(ISD::SETCC           , MVT::f80  , Custom);
271   if (Subtarget->is64Bit()) {
272     setOperationAction(ISD::SELECT        , MVT::i64  , Custom);
273     setOperationAction(ISD::SETCC         , MVT::i64  , Custom);
274   }
275   // X86 ret instruction may pop stack.
276   setOperationAction(ISD::RET             , MVT::Other, Custom);
277   setOperationAction(ISD::EH_RETURN       , MVT::Other, Custom);
278
279   // Darwin ABI issue.
280   setOperationAction(ISD::ConstantPool    , MVT::i32  , Custom);
281   setOperationAction(ISD::JumpTable       , MVT::i32  , Custom);
282   setOperationAction(ISD::GlobalAddress   , MVT::i32  , Custom);
283   setOperationAction(ISD::GlobalTLSAddress, MVT::i32  , Custom);
284   if (Subtarget->is64Bit())
285     setOperationAction(ISD::GlobalTLSAddress, MVT::i64, Custom);
286   setOperationAction(ISD::ExternalSymbol  , MVT::i32  , Custom);
287   if (Subtarget->is64Bit()) {
288     setOperationAction(ISD::ConstantPool  , MVT::i64  , Custom);
289     setOperationAction(ISD::JumpTable     , MVT::i64  , Custom);
290     setOperationAction(ISD::GlobalAddress , MVT::i64  , Custom);
291     setOperationAction(ISD::ExternalSymbol, MVT::i64  , Custom);
292   }
293   // 64-bit addm sub, shl, sra, srl (iff 32-bit x86)
294   setOperationAction(ISD::SHL_PARTS       , MVT::i32  , Custom);
295   setOperationAction(ISD::SRA_PARTS       , MVT::i32  , Custom);
296   setOperationAction(ISD::SRL_PARTS       , MVT::i32  , Custom);
297   if (Subtarget->is64Bit()) {
298     setOperationAction(ISD::SHL_PARTS     , MVT::i64  , Custom);
299     setOperationAction(ISD::SRA_PARTS     , MVT::i64  , Custom);
300     setOperationAction(ISD::SRL_PARTS     , MVT::i64  , Custom);
301   }
302
303   if (Subtarget->hasSSE1())
304     setOperationAction(ISD::PREFETCH      , MVT::Other, Legal);
305
306   if (!Subtarget->hasSSE2())
307     setOperationAction(ISD::MEMBARRIER    , MVT::Other, Expand);
308
309   // Expand certain atomics
310   setOperationAction(ISD::ATOMIC_CMP_SWAP, MVT::i8, Custom);
311   setOperationAction(ISD::ATOMIC_CMP_SWAP, MVT::i16, Custom);
312   setOperationAction(ISD::ATOMIC_CMP_SWAP, MVT::i32, Custom);
313   setOperationAction(ISD::ATOMIC_CMP_SWAP, MVT::i64, Custom);
314
315   setOperationAction(ISD::ATOMIC_LOAD_SUB, MVT::i8, Custom);
316   setOperationAction(ISD::ATOMIC_LOAD_SUB, MVT::i16, Custom);
317   setOperationAction(ISD::ATOMIC_LOAD_SUB, MVT::i32, Custom);
318   setOperationAction(ISD::ATOMIC_LOAD_SUB, MVT::i64, Custom);
319
320   if (!Subtarget->is64Bit()) {
321     setOperationAction(ISD::ATOMIC_LOAD_ADD, MVT::i64, Custom);
322     setOperationAction(ISD::ATOMIC_LOAD_SUB, MVT::i64, Custom);
323     setOperationAction(ISD::ATOMIC_LOAD_AND, MVT::i64, Custom);
324     setOperationAction(ISD::ATOMIC_LOAD_OR, MVT::i64, Custom);
325     setOperationAction(ISD::ATOMIC_LOAD_XOR, MVT::i64, Custom);
326     setOperationAction(ISD::ATOMIC_LOAD_NAND, MVT::i64, Custom);
327     setOperationAction(ISD::ATOMIC_SWAP, MVT::i64, Custom);
328   }
329
330   // Use the default ISD::DBG_STOPPOINT, ISD::DECLARE expansion.
331   setOperationAction(ISD::DBG_STOPPOINT, MVT::Other, Expand);
332   // FIXME - use subtarget debug flags
333   if (!Subtarget->isTargetDarwin() &&
334       !Subtarget->isTargetELF() &&
335       !Subtarget->isTargetCygMing()) {
336     setOperationAction(ISD::DBG_LABEL, MVT::Other, Expand);
337     setOperationAction(ISD::EH_LABEL, MVT::Other, Expand);
338   }
339
340   setOperationAction(ISD::EXCEPTIONADDR, MVT::i64, Expand);
341   setOperationAction(ISD::EHSELECTION,   MVT::i64, Expand);
342   setOperationAction(ISD::EXCEPTIONADDR, MVT::i32, Expand);
343   setOperationAction(ISD::EHSELECTION,   MVT::i32, Expand);
344   if (Subtarget->is64Bit()) {
345     setExceptionPointerRegister(X86::RAX);
346     setExceptionSelectorRegister(X86::RDX);
347   } else {
348     setExceptionPointerRegister(X86::EAX);
349     setExceptionSelectorRegister(X86::EDX);
350   }
351   setOperationAction(ISD::FRAME_TO_ARGS_OFFSET, MVT::i32, Custom);
352   setOperationAction(ISD::FRAME_TO_ARGS_OFFSET, MVT::i64, Custom);
353
354   setOperationAction(ISD::TRAMPOLINE, MVT::Other, Custom);
355
356   setOperationAction(ISD::TRAP, MVT::Other, Legal);
357
358   // VASTART needs to be custom lowered to use the VarArgsFrameIndex
359   setOperationAction(ISD::VASTART           , MVT::Other, Custom);
360   setOperationAction(ISD::VAEND             , MVT::Other, Expand);
361   if (Subtarget->is64Bit()) {
362     setOperationAction(ISD::VAARG           , MVT::Other, Custom);
363     setOperationAction(ISD::VACOPY          , MVT::Other, Custom);
364   } else {
365     setOperationAction(ISD::VAARG           , MVT::Other, Expand);
366     setOperationAction(ISD::VACOPY          , MVT::Other, Expand);
367   }
368
369   setOperationAction(ISD::STACKSAVE,          MVT::Other, Expand);
370   setOperationAction(ISD::STACKRESTORE,       MVT::Other, Expand);
371   if (Subtarget->is64Bit())
372     setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i64, Expand);
373   if (Subtarget->isTargetCygMing())
374     setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i32, Custom);
375   else
376     setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i32, Expand);
377
378   if (X86ScalarSSEf64) {
379     // f32 and f64 use SSE.
380     // Set up the FP register classes.
381     addRegisterClass(MVT::f32, X86::FR32RegisterClass);
382     addRegisterClass(MVT::f64, X86::FR64RegisterClass);
383
384     // Use ANDPD to simulate FABS.
385     setOperationAction(ISD::FABS , MVT::f64, Custom);
386     setOperationAction(ISD::FABS , MVT::f32, Custom);
387
388     // Use XORP to simulate FNEG.
389     setOperationAction(ISD::FNEG , MVT::f64, Custom);
390     setOperationAction(ISD::FNEG , MVT::f32, Custom);
391
392     // Use ANDPD and ORPD to simulate FCOPYSIGN.
393     setOperationAction(ISD::FCOPYSIGN, MVT::f64, Custom);
394     setOperationAction(ISD::FCOPYSIGN, MVT::f32, Custom);
395
396     // We don't support sin/cos/fmod
397     setOperationAction(ISD::FSIN , MVT::f64, Expand);
398     setOperationAction(ISD::FCOS , MVT::f64, Expand);
399     setOperationAction(ISD::FSIN , MVT::f32, Expand);
400     setOperationAction(ISD::FCOS , MVT::f32, Expand);
401
402     // Expand FP immediates into loads from the stack, except for the special
403     // cases we handle.
404     addLegalFPImmediate(APFloat(+0.0)); // xorpd
405     addLegalFPImmediate(APFloat(+0.0f)); // xorps
406
407     // Floating truncations from f80 and extensions to f80 go through memory.
408     // If optimizing, we lie about this though and handle it in
409     // InstructionSelectPreprocess so that dagcombine2 can hack on these.
410     if (Fast) {
411       setConvertAction(MVT::f32, MVT::f80, Expand);
412       setConvertAction(MVT::f64, MVT::f80, Expand);
413       setConvertAction(MVT::f80, MVT::f32, Expand);
414       setConvertAction(MVT::f80, MVT::f64, Expand);
415     }
416   } else if (X86ScalarSSEf32) {
417     // Use SSE for f32, x87 for f64.
418     // Set up the FP register classes.
419     addRegisterClass(MVT::f32, X86::FR32RegisterClass);
420     addRegisterClass(MVT::f64, X86::RFP64RegisterClass);
421
422     // Use ANDPS to simulate FABS.
423     setOperationAction(ISD::FABS , MVT::f32, Custom);
424
425     // Use XORP to simulate FNEG.
426     setOperationAction(ISD::FNEG , MVT::f32, Custom);
427
428     setOperationAction(ISD::UNDEF,     MVT::f64, Expand);
429
430     // Use ANDPS and ORPS to simulate FCOPYSIGN.
431     setOperationAction(ISD::FCOPYSIGN, MVT::f64, Expand);
432     setOperationAction(ISD::FCOPYSIGN, MVT::f32, Custom);
433
434     // We don't support sin/cos/fmod
435     setOperationAction(ISD::FSIN , MVT::f32, Expand);
436     setOperationAction(ISD::FCOS , MVT::f32, Expand);
437
438     // Special cases we handle for FP constants.
439     addLegalFPImmediate(APFloat(+0.0f)); // xorps
440     addLegalFPImmediate(APFloat(+0.0)); // FLD0
441     addLegalFPImmediate(APFloat(+1.0)); // FLD1
442     addLegalFPImmediate(APFloat(-0.0)); // FLD0/FCHS
443     addLegalFPImmediate(APFloat(-1.0)); // FLD1/FCHS
444
445     // SSE <-> X87 conversions go through memory.  If optimizing, we lie about
446     // this though and handle it in InstructionSelectPreprocess so that
447     // dagcombine2 can hack on these.
448     if (Fast) {
449       setConvertAction(MVT::f32, MVT::f64, Expand);
450       setConvertAction(MVT::f32, MVT::f80, Expand);
451       setConvertAction(MVT::f80, MVT::f32, Expand);    
452       setConvertAction(MVT::f64, MVT::f32, Expand);
453       // And x87->x87 truncations also.
454       setConvertAction(MVT::f80, MVT::f64, Expand);
455     }
456
457     if (!UnsafeFPMath) {
458       setOperationAction(ISD::FSIN           , MVT::f64  , Expand);
459       setOperationAction(ISD::FCOS           , MVT::f64  , Expand);
460     }
461   } else {
462     // f32 and f64 in x87.
463     // Set up the FP register classes.
464     addRegisterClass(MVT::f64, X86::RFP64RegisterClass);
465     addRegisterClass(MVT::f32, X86::RFP32RegisterClass);
466
467     setOperationAction(ISD::UNDEF,     MVT::f64, Expand);
468     setOperationAction(ISD::UNDEF,     MVT::f32, Expand);
469     setOperationAction(ISD::FCOPYSIGN, MVT::f64, Expand);
470     setOperationAction(ISD::FCOPYSIGN, MVT::f32, Expand);
471
472     // Floating truncations go through memory.  If optimizing, we lie about
473     // this though and handle it in InstructionSelectPreprocess so that
474     // dagcombine2 can hack on these.
475     if (Fast) {
476       setConvertAction(MVT::f80, MVT::f32, Expand);    
477       setConvertAction(MVT::f64, MVT::f32, Expand);
478       setConvertAction(MVT::f80, MVT::f64, Expand);
479     }
480
481     if (!UnsafeFPMath) {
482       setOperationAction(ISD::FSIN           , MVT::f64  , Expand);
483       setOperationAction(ISD::FCOS           , MVT::f64  , Expand);
484     }
485     addLegalFPImmediate(APFloat(+0.0)); // FLD0
486     addLegalFPImmediate(APFloat(+1.0)); // FLD1
487     addLegalFPImmediate(APFloat(-0.0)); // FLD0/FCHS
488     addLegalFPImmediate(APFloat(-1.0)); // FLD1/FCHS
489     addLegalFPImmediate(APFloat(+0.0f)); // FLD0
490     addLegalFPImmediate(APFloat(+1.0f)); // FLD1
491     addLegalFPImmediate(APFloat(-0.0f)); // FLD0/FCHS
492     addLegalFPImmediate(APFloat(-1.0f)); // FLD1/FCHS
493   }
494
495   // Long double always uses X87.
496   addRegisterClass(MVT::f80, X86::RFP80RegisterClass);
497   setOperationAction(ISD::UNDEF,     MVT::f80, Expand);
498   setOperationAction(ISD::FCOPYSIGN, MVT::f80, Expand);
499   {
500     bool ignored;
501     APFloat TmpFlt(+0.0);
502     TmpFlt.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
503                    &ignored);
504     addLegalFPImmediate(TmpFlt);  // FLD0
505     TmpFlt.changeSign();
506     addLegalFPImmediate(TmpFlt);  // FLD0/FCHS
507     APFloat TmpFlt2(+1.0);
508     TmpFlt2.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
509                     &ignored);
510     addLegalFPImmediate(TmpFlt2);  // FLD1
511     TmpFlt2.changeSign();
512     addLegalFPImmediate(TmpFlt2);  // FLD1/FCHS
513   }
514     
515   if (!UnsafeFPMath) {
516     setOperationAction(ISD::FSIN           , MVT::f80  , Expand);
517     setOperationAction(ISD::FCOS           , MVT::f80  , Expand);
518   }
519
520   // Always use a library call for pow.
521   setOperationAction(ISD::FPOW             , MVT::f32  , Expand);
522   setOperationAction(ISD::FPOW             , MVT::f64  , Expand);
523   setOperationAction(ISD::FPOW             , MVT::f80  , Expand);
524
525   setOperationAction(ISD::FLOG, MVT::f80, Expand);
526   setOperationAction(ISD::FLOG2, MVT::f80, Expand);
527   setOperationAction(ISD::FLOG10, MVT::f80, Expand);
528   setOperationAction(ISD::FEXP, MVT::f80, Expand);
529   setOperationAction(ISD::FEXP2, MVT::f80, Expand);
530
531   // First set operation action for all vector types to either promote
532   // (for widening) or expand (for scalarization). Then we will selectively
533   // turn on ones that can be effectively codegen'd.
534   for (unsigned VT = (unsigned)MVT::FIRST_VECTOR_VALUETYPE;
535        VT <= (unsigned)MVT::LAST_VECTOR_VALUETYPE; ++VT) {
536     setOperationAction(ISD::ADD , (MVT::SimpleValueType)VT, Expand);
537     setOperationAction(ISD::SUB , (MVT::SimpleValueType)VT, Expand);
538     setOperationAction(ISD::FADD, (MVT::SimpleValueType)VT, Expand);
539     setOperationAction(ISD::FNEG, (MVT::SimpleValueType)VT, Expand);
540     setOperationAction(ISD::FSUB, (MVT::SimpleValueType)VT, Expand);
541     setOperationAction(ISD::MUL , (MVT::SimpleValueType)VT, Expand);
542     setOperationAction(ISD::FMUL, (MVT::SimpleValueType)VT, Expand);
543     setOperationAction(ISD::SDIV, (MVT::SimpleValueType)VT, Expand);
544     setOperationAction(ISD::UDIV, (MVT::SimpleValueType)VT, Expand);
545     setOperationAction(ISD::FDIV, (MVT::SimpleValueType)VT, Expand);
546     setOperationAction(ISD::SREM, (MVT::SimpleValueType)VT, Expand);
547     setOperationAction(ISD::UREM, (MVT::SimpleValueType)VT, Expand);
548     setOperationAction(ISD::LOAD, (MVT::SimpleValueType)VT, Expand);
549     setOperationAction(ISD::VECTOR_SHUFFLE, (MVT::SimpleValueType)VT, Expand);
550     setOperationAction(ISD::EXTRACT_VECTOR_ELT,(MVT::SimpleValueType)VT,Expand);
551     setOperationAction(ISD::INSERT_VECTOR_ELT,(MVT::SimpleValueType)VT, Expand);
552     setOperationAction(ISD::FABS, (MVT::SimpleValueType)VT, Expand);
553     setOperationAction(ISD::FSIN, (MVT::SimpleValueType)VT, Expand);
554     setOperationAction(ISD::FCOS, (MVT::SimpleValueType)VT, Expand);
555     setOperationAction(ISD::FREM, (MVT::SimpleValueType)VT, Expand);
556     setOperationAction(ISD::FPOWI, (MVT::SimpleValueType)VT, Expand);
557     setOperationAction(ISD::FSQRT, (MVT::SimpleValueType)VT, Expand);
558     setOperationAction(ISD::FCOPYSIGN, (MVT::SimpleValueType)VT, Expand);
559     setOperationAction(ISD::SMUL_LOHI, (MVT::SimpleValueType)VT, Expand);
560     setOperationAction(ISD::UMUL_LOHI, (MVT::SimpleValueType)VT, Expand);
561     setOperationAction(ISD::SDIVREM, (MVT::SimpleValueType)VT, Expand);
562     setOperationAction(ISD::UDIVREM, (MVT::SimpleValueType)VT, Expand);
563     setOperationAction(ISD::FPOW, (MVT::SimpleValueType)VT, Expand);
564     setOperationAction(ISD::CTPOP, (MVT::SimpleValueType)VT, Expand);
565     setOperationAction(ISD::CTTZ, (MVT::SimpleValueType)VT, Expand);
566     setOperationAction(ISD::CTLZ, (MVT::SimpleValueType)VT, Expand);
567     setOperationAction(ISD::SHL, (MVT::SimpleValueType)VT, Expand);
568     setOperationAction(ISD::SRA, (MVT::SimpleValueType)VT, Expand);
569     setOperationAction(ISD::SRL, (MVT::SimpleValueType)VT, Expand);
570     setOperationAction(ISD::ROTL, (MVT::SimpleValueType)VT, Expand);
571     setOperationAction(ISD::ROTR, (MVT::SimpleValueType)VT, Expand);
572     setOperationAction(ISD::BSWAP, (MVT::SimpleValueType)VT, Expand);
573     setOperationAction(ISD::VSETCC, (MVT::SimpleValueType)VT, Expand);
574     setOperationAction(ISD::FLOG, (MVT::SimpleValueType)VT, Expand);
575     setOperationAction(ISD::FLOG2, (MVT::SimpleValueType)VT, Expand);
576     setOperationAction(ISD::FLOG10, (MVT::SimpleValueType)VT, Expand);
577     setOperationAction(ISD::FEXP, (MVT::SimpleValueType)VT, Expand);
578     setOperationAction(ISD::FEXP2, (MVT::SimpleValueType)VT, Expand);
579   }
580
581   if (!DisableMMX && Subtarget->hasMMX()) {
582     addRegisterClass(MVT::v8i8,  X86::VR64RegisterClass);
583     addRegisterClass(MVT::v4i16, X86::VR64RegisterClass);
584     addRegisterClass(MVT::v2i32, X86::VR64RegisterClass);
585     addRegisterClass(MVT::v2f32, X86::VR64RegisterClass);
586     addRegisterClass(MVT::v1i64, X86::VR64RegisterClass);
587
588     // FIXME: add MMX packed arithmetics
589
590     setOperationAction(ISD::ADD,                MVT::v8i8,  Legal);
591     setOperationAction(ISD::ADD,                MVT::v4i16, Legal);
592     setOperationAction(ISD::ADD,                MVT::v2i32, Legal);
593     setOperationAction(ISD::ADD,                MVT::v1i64, Legal);
594
595     setOperationAction(ISD::SUB,                MVT::v8i8,  Legal);
596     setOperationAction(ISD::SUB,                MVT::v4i16, Legal);
597     setOperationAction(ISD::SUB,                MVT::v2i32, Legal);
598     setOperationAction(ISD::SUB,                MVT::v1i64, Legal);
599
600     setOperationAction(ISD::MULHS,              MVT::v4i16, Legal);
601     setOperationAction(ISD::MUL,                MVT::v4i16, Legal);
602
603     setOperationAction(ISD::AND,                MVT::v8i8,  Promote);
604     AddPromotedToType (ISD::AND,                MVT::v8i8,  MVT::v1i64);
605     setOperationAction(ISD::AND,                MVT::v4i16, Promote);
606     AddPromotedToType (ISD::AND,                MVT::v4i16, MVT::v1i64);
607     setOperationAction(ISD::AND,                MVT::v2i32, Promote);
608     AddPromotedToType (ISD::AND,                MVT::v2i32, MVT::v1i64);
609     setOperationAction(ISD::AND,                MVT::v1i64, Legal);
610
611     setOperationAction(ISD::OR,                 MVT::v8i8,  Promote);
612     AddPromotedToType (ISD::OR,                 MVT::v8i8,  MVT::v1i64);
613     setOperationAction(ISD::OR,                 MVT::v4i16, Promote);
614     AddPromotedToType (ISD::OR,                 MVT::v4i16, MVT::v1i64);
615     setOperationAction(ISD::OR,                 MVT::v2i32, Promote);
616     AddPromotedToType (ISD::OR,                 MVT::v2i32, MVT::v1i64);
617     setOperationAction(ISD::OR,                 MVT::v1i64, Legal);
618
619     setOperationAction(ISD::XOR,                MVT::v8i8,  Promote);
620     AddPromotedToType (ISD::XOR,                MVT::v8i8,  MVT::v1i64);
621     setOperationAction(ISD::XOR,                MVT::v4i16, Promote);
622     AddPromotedToType (ISD::XOR,                MVT::v4i16, MVT::v1i64);
623     setOperationAction(ISD::XOR,                MVT::v2i32, Promote);
624     AddPromotedToType (ISD::XOR,                MVT::v2i32, MVT::v1i64);
625     setOperationAction(ISD::XOR,                MVT::v1i64, Legal);
626
627     setOperationAction(ISD::LOAD,               MVT::v8i8,  Promote);
628     AddPromotedToType (ISD::LOAD,               MVT::v8i8,  MVT::v1i64);
629     setOperationAction(ISD::LOAD,               MVT::v4i16, Promote);
630     AddPromotedToType (ISD::LOAD,               MVT::v4i16, MVT::v1i64);
631     setOperationAction(ISD::LOAD,               MVT::v2i32, Promote);
632     AddPromotedToType (ISD::LOAD,               MVT::v2i32, MVT::v1i64);
633     setOperationAction(ISD::LOAD,               MVT::v2f32, Promote);
634     AddPromotedToType (ISD::LOAD,               MVT::v2f32, MVT::v1i64);
635     setOperationAction(ISD::LOAD,               MVT::v1i64, Legal);
636
637     setOperationAction(ISD::BUILD_VECTOR,       MVT::v8i8,  Custom);
638     setOperationAction(ISD::BUILD_VECTOR,       MVT::v4i16, Custom);
639     setOperationAction(ISD::BUILD_VECTOR,       MVT::v2i32, Custom);
640     setOperationAction(ISD::BUILD_VECTOR,       MVT::v2f32, Custom);
641     setOperationAction(ISD::BUILD_VECTOR,       MVT::v1i64, Custom);
642
643     setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v8i8,  Custom);
644     setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v4i16, Custom);
645     setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v2i32, Custom);
646     setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v1i64, Custom);
647
648     setOperationAction(ISD::SCALAR_TO_VECTOR,   MVT::v2f32, Custom);
649     setOperationAction(ISD::SCALAR_TO_VECTOR,   MVT::v8i8,  Custom);
650     setOperationAction(ISD::SCALAR_TO_VECTOR,   MVT::v4i16, Custom);
651     setOperationAction(ISD::SCALAR_TO_VECTOR,   MVT::v1i64, Custom);
652
653     setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v4i16, Custom);
654
655     setTruncStoreAction(MVT::v8i16, MVT::v8i8, Expand);
656     setOperationAction(ISD::TRUNCATE,           MVT::v8i8, Expand);
657     setOperationAction(ISD::SELECT,             MVT::v8i8, Promote);
658     setOperationAction(ISD::SELECT,             MVT::v4i16, Promote);
659     setOperationAction(ISD::SELECT,             MVT::v2i32, Promote);
660     setOperationAction(ISD::SELECT,             MVT::v1i64, Custom);
661   }
662
663   if (Subtarget->hasSSE1()) {
664     addRegisterClass(MVT::v4f32, X86::VR128RegisterClass);
665
666     setOperationAction(ISD::FADD,               MVT::v4f32, Legal);
667     setOperationAction(ISD::FSUB,               MVT::v4f32, Legal);
668     setOperationAction(ISD::FMUL,               MVT::v4f32, Legal);
669     setOperationAction(ISD::FDIV,               MVT::v4f32, Legal);
670     setOperationAction(ISD::FSQRT,              MVT::v4f32, Legal);
671     setOperationAction(ISD::FNEG,               MVT::v4f32, Custom);
672     setOperationAction(ISD::LOAD,               MVT::v4f32, Legal);
673     setOperationAction(ISD::BUILD_VECTOR,       MVT::v4f32, Custom);
674     setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v4f32, Custom);
675     setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v4f32, Custom);
676     setOperationAction(ISD::SELECT,             MVT::v4f32, Custom);
677     setOperationAction(ISD::VSETCC,             MVT::v4f32, Custom);
678   }
679
680   if (Subtarget->hasSSE2()) {
681     addRegisterClass(MVT::v2f64, X86::VR128RegisterClass);
682     addRegisterClass(MVT::v16i8, X86::VR128RegisterClass);
683     addRegisterClass(MVT::v8i16, X86::VR128RegisterClass);
684     addRegisterClass(MVT::v4i32, X86::VR128RegisterClass);
685     addRegisterClass(MVT::v2i64, X86::VR128RegisterClass);
686
687     setOperationAction(ISD::ADD,                MVT::v16i8, Legal);
688     setOperationAction(ISD::ADD,                MVT::v8i16, Legal);
689     setOperationAction(ISD::ADD,                MVT::v4i32, Legal);
690     setOperationAction(ISD::ADD,                MVT::v2i64, Legal);
691     setOperationAction(ISD::MUL,                MVT::v2i64, Custom);
692     setOperationAction(ISD::SUB,                MVT::v16i8, Legal);
693     setOperationAction(ISD::SUB,                MVT::v8i16, Legal);
694     setOperationAction(ISD::SUB,                MVT::v4i32, Legal);
695     setOperationAction(ISD::SUB,                MVT::v2i64, Legal);
696     setOperationAction(ISD::MUL,                MVT::v8i16, Legal);
697     setOperationAction(ISD::FADD,               MVT::v2f64, Legal);
698     setOperationAction(ISD::FSUB,               MVT::v2f64, Legal);
699     setOperationAction(ISD::FMUL,               MVT::v2f64, Legal);
700     setOperationAction(ISD::FDIV,               MVT::v2f64, Legal);
701     setOperationAction(ISD::FSQRT,              MVT::v2f64, Legal);
702     setOperationAction(ISD::FNEG,               MVT::v2f64, Custom);
703
704     setOperationAction(ISD::VSETCC,             MVT::v2f64, Custom);
705     setOperationAction(ISD::VSETCC,             MVT::v16i8, Custom);
706     setOperationAction(ISD::VSETCC,             MVT::v8i16, Custom);
707     setOperationAction(ISD::VSETCC,             MVT::v4i32, Custom);
708
709     setOperationAction(ISD::SCALAR_TO_VECTOR,   MVT::v16i8, Custom);
710     setOperationAction(ISD::SCALAR_TO_VECTOR,   MVT::v8i16, Custom);
711     setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v8i16, Custom);
712     setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v4i32, Custom);
713     setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v4f32, Custom);
714
715     // Custom lower build_vector, vector_shuffle, and extract_vector_elt.
716     for (unsigned i = (unsigned)MVT::v16i8; i != (unsigned)MVT::v2i64; ++i) {
717       MVT VT = (MVT::SimpleValueType)i;
718       // Do not attempt to custom lower non-power-of-2 vectors
719       if (!isPowerOf2_32(VT.getVectorNumElements()))
720         continue;
721       setOperationAction(ISD::BUILD_VECTOR,       VT, Custom);
722       setOperationAction(ISD::VECTOR_SHUFFLE,     VT, Custom);
723       setOperationAction(ISD::EXTRACT_VECTOR_ELT, VT, Custom);
724     }
725     setOperationAction(ISD::BUILD_VECTOR,       MVT::v2f64, Custom);
726     setOperationAction(ISD::BUILD_VECTOR,       MVT::v2i64, Custom);
727     setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v2f64, Custom);
728     setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v2i64, Custom);
729     setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v2f64, Custom);
730     setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v2f64, Custom);
731     if (Subtarget->is64Bit()) {
732       setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v2i64, Custom);
733       setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v2i64, Custom);
734     }
735
736     // Promote v16i8, v8i16, v4i32 load, select, and, or, xor to v2i64.
737     for (unsigned VT = (unsigned)MVT::v16i8; VT != (unsigned)MVT::v2i64; VT++) {
738       setOperationAction(ISD::AND,    (MVT::SimpleValueType)VT, Promote);
739       AddPromotedToType (ISD::AND,    (MVT::SimpleValueType)VT, MVT::v2i64);
740       setOperationAction(ISD::OR,     (MVT::SimpleValueType)VT, Promote);
741       AddPromotedToType (ISD::OR,     (MVT::SimpleValueType)VT, MVT::v2i64);
742       setOperationAction(ISD::XOR,    (MVT::SimpleValueType)VT, Promote);
743       AddPromotedToType (ISD::XOR,    (MVT::SimpleValueType)VT, MVT::v2i64);
744       setOperationAction(ISD::LOAD,   (MVT::SimpleValueType)VT, Promote);
745       AddPromotedToType (ISD::LOAD,   (MVT::SimpleValueType)VT, MVT::v2i64);
746       setOperationAction(ISD::SELECT, (MVT::SimpleValueType)VT, Promote);
747       AddPromotedToType (ISD::SELECT, (MVT::SimpleValueType)VT, MVT::v2i64);
748     }
749
750     setTruncStoreAction(MVT::f64, MVT::f32, Expand);
751
752     // Custom lower v2i64 and v2f64 selects.
753     setOperationAction(ISD::LOAD,               MVT::v2f64, Legal);
754     setOperationAction(ISD::LOAD,               MVT::v2i64, Legal);
755     setOperationAction(ISD::SELECT,             MVT::v2f64, Custom);
756     setOperationAction(ISD::SELECT,             MVT::v2i64, Custom);
757     
758   }
759   
760   if (Subtarget->hasSSE41()) {
761     // FIXME: Do we need to handle scalar-to-vector here?
762     setOperationAction(ISD::MUL,                MVT::v4i32, Legal);
763
764     // i8 and i16 vectors are custom , because the source register and source
765     // source memory operand types are not the same width.  f32 vectors are
766     // custom since the immediate controlling the insert encodes additional
767     // information.
768     setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v16i8, Custom);
769     setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v8i16, Custom);
770     setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v4i32, Custom);
771     setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v4f32, Custom);
772
773     setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v16i8, Custom);
774     setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v8i16, Custom);
775     setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v4i32, Custom);
776     setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v4f32, Custom);
777
778     if (Subtarget->is64Bit()) {
779       setOperationAction(ISD::INSERT_VECTOR_ELT,  MVT::v2i64, Legal);
780       setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v2i64, Legal);
781     }
782   }
783
784   if (Subtarget->hasSSE42()) {
785     setOperationAction(ISD::VSETCC,             MVT::v2i64, Custom);
786   }
787   
788   // We want to custom lower some of our intrinsics.
789   setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::Other, Custom);
790
791   // Add/Sub/Mul with overflow operations are custom lowered.
792   setOperationAction(ISD::SADDO, MVT::i32, Custom);
793   setOperationAction(ISD::SADDO, MVT::i64, Custom);
794   setOperationAction(ISD::UADDO, MVT::i32, Custom);
795   setOperationAction(ISD::UADDO, MVT::i64, Custom);
796   setOperationAction(ISD::SSUBO, MVT::i32, Custom);
797   setOperationAction(ISD::SSUBO, MVT::i64, Custom);
798   setOperationAction(ISD::USUBO, MVT::i32, Custom);
799   setOperationAction(ISD::USUBO, MVT::i64, Custom);
800   setOperationAction(ISD::SMULO, MVT::i32, Custom);
801   setOperationAction(ISD::SMULO, MVT::i64, Custom);
802   setOperationAction(ISD::UMULO, MVT::i32, Custom);
803   setOperationAction(ISD::UMULO, MVT::i64, Custom);
804
805   // We have target-specific dag combine patterns for the following nodes:
806   setTargetDAGCombine(ISD::VECTOR_SHUFFLE);
807   setTargetDAGCombine(ISD::BUILD_VECTOR);
808   setTargetDAGCombine(ISD::SELECT);
809   setTargetDAGCombine(ISD::SHL);
810   setTargetDAGCombine(ISD::SRA);
811   setTargetDAGCombine(ISD::SRL);
812   setTargetDAGCombine(ISD::STORE);
813
814   computeRegisterProperties();
815
816   // FIXME: These should be based on subtarget info. Plus, the values should
817   // be smaller when we are in optimizing for size mode.
818   maxStoresPerMemset = 16; // For @llvm.memset -> sequence of stores
819   maxStoresPerMemcpy = 16; // For @llvm.memcpy -> sequence of stores
820   maxStoresPerMemmove = 3; // For @llvm.memmove -> sequence of stores
821   allowUnalignedMemoryAccesses = true; // x86 supports it!
822   setPrefLoopAlignment(16);
823 }
824
825
826 MVT X86TargetLowering::getSetCCResultType(MVT VT) const {
827   return MVT::i8;
828 }
829
830
831 /// getMaxByValAlign - Helper for getByValTypeAlignment to determine
832 /// the desired ByVal argument alignment.
833 static void getMaxByValAlign(const Type *Ty, unsigned &MaxAlign) {
834   if (MaxAlign == 16)
835     return;
836   if (const VectorType *VTy = dyn_cast<VectorType>(Ty)) {
837     if (VTy->getBitWidth() == 128)
838       MaxAlign = 16;
839   } else if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) {
840     unsigned EltAlign = 0;
841     getMaxByValAlign(ATy->getElementType(), EltAlign);
842     if (EltAlign > MaxAlign)
843       MaxAlign = EltAlign;
844   } else if (const StructType *STy = dyn_cast<StructType>(Ty)) {
845     for (unsigned i = 0, e = STy->getNumElements(); i != e; ++i) {
846       unsigned EltAlign = 0;
847       getMaxByValAlign(STy->getElementType(i), EltAlign);
848       if (EltAlign > MaxAlign)
849         MaxAlign = EltAlign;
850       if (MaxAlign == 16)
851         break;
852     }
853   }
854   return;
855 }
856
857 /// getByValTypeAlignment - Return the desired alignment for ByVal aggregate
858 /// function arguments in the caller parameter area. For X86, aggregates
859 /// that contain SSE vectors are placed at 16-byte boundaries while the rest
860 /// are at 4-byte boundaries.
861 unsigned X86TargetLowering::getByValTypeAlignment(const Type *Ty) const {
862   if (Subtarget->is64Bit()) {
863     // Max of 8 and alignment of type.
864     unsigned TyAlign = TD->getABITypeAlignment(Ty);
865     if (TyAlign > 8)
866       return TyAlign;
867     return 8;
868   }
869
870   unsigned Align = 4;
871   if (Subtarget->hasSSE1())
872     getMaxByValAlign(Ty, Align);
873   return Align;
874 }
875
876 /// getOptimalMemOpType - Returns the target specific optimal type for load
877 /// and store operations as a result of memset, memcpy, and memmove
878 /// lowering. It returns MVT::iAny if SelectionDAG should be responsible for
879 /// determining it.
880 MVT
881 X86TargetLowering::getOptimalMemOpType(uint64_t Size, unsigned Align,
882                                        bool isSrcConst, bool isSrcStr) const {
883   // FIXME: This turns off use of xmm stores for memset/memcpy on targets like
884   // linux.  This is because the stack realignment code can't handle certain
885   // cases like PR2962.  This should be removed when PR2962 is fixed.
886   if (Subtarget->getStackAlignment() >= 16) {
887     if ((isSrcConst || isSrcStr) && Subtarget->hasSSE2() && Size >= 16)
888       return MVT::v4i32;
889     if ((isSrcConst || isSrcStr) && Subtarget->hasSSE1() && Size >= 16)
890       return MVT::v4f32;
891   }
892   if (Subtarget->is64Bit() && Size >= 8)
893     return MVT::i64;
894   return MVT::i32;
895 }
896
897
898 /// getPICJumpTableRelocaBase - Returns relocation base for the given PIC
899 /// jumptable.
900 SDValue X86TargetLowering::getPICJumpTableRelocBase(SDValue Table,
901                                                       SelectionDAG &DAG) const {
902   if (usesGlobalOffsetTable())
903     return DAG.getGLOBAL_OFFSET_TABLE(getPointerTy());
904   if (!Subtarget->isPICStyleRIPRel())
905     // This doesn't have DebugLoc associated with it, but is not really the
906     // same as a Register.
907     return DAG.getNode(X86ISD::GlobalBaseReg, DebugLoc::getUnknownLoc(),
908                        getPointerTy());
909   return Table;
910 }
911
912 //===----------------------------------------------------------------------===//
913 //               Return Value Calling Convention Implementation
914 //===----------------------------------------------------------------------===//
915
916 #include "X86GenCallingConv.inc"
917
918 /// LowerRET - Lower an ISD::RET node.
919 SDValue X86TargetLowering::LowerRET(SDValue Op, SelectionDAG &DAG) {
920   DebugLoc dl = Op.getDebugLoc();
921   assert((Op.getNumOperands() & 1) == 1 && "ISD::RET should have odd # args");
922   
923   SmallVector<CCValAssign, 16> RVLocs;
924   unsigned CC = DAG.getMachineFunction().getFunction()->getCallingConv();
925   bool isVarArg = DAG.getMachineFunction().getFunction()->isVarArg();
926   CCState CCInfo(CC, isVarArg, getTargetMachine(), RVLocs);
927   CCInfo.AnalyzeReturn(Op.getNode(), RetCC_X86);
928     
929   // If this is the first return lowered for this function, add the regs to the
930   // liveout set for the function.
931   if (DAG.getMachineFunction().getRegInfo().liveout_empty()) {
932     for (unsigned i = 0; i != RVLocs.size(); ++i)
933       if (RVLocs[i].isRegLoc())
934         DAG.getMachineFunction().getRegInfo().addLiveOut(RVLocs[i].getLocReg());
935   }
936   SDValue Chain = Op.getOperand(0);
937   
938   // Handle tail call return.
939   Chain = GetPossiblePreceedingTailCall(Chain, X86ISD::TAILCALL);
940   if (Chain.getOpcode() == X86ISD::TAILCALL) {
941     SDValue TailCall = Chain;
942     SDValue TargetAddress = TailCall.getOperand(1);
943     SDValue StackAdjustment = TailCall.getOperand(2);
944     assert(((TargetAddress.getOpcode() == ISD::Register &&
945                (cast<RegisterSDNode>(TargetAddress)->getReg() == X86::EAX ||
946                 cast<RegisterSDNode>(TargetAddress)->getReg() == X86::R9)) ||
947               TargetAddress.getOpcode() == ISD::TargetExternalSymbol ||
948               TargetAddress.getOpcode() == ISD::TargetGlobalAddress) && 
949              "Expecting an global address, external symbol, or register");
950     assert(StackAdjustment.getOpcode() == ISD::Constant &&
951            "Expecting a const value");
952
953     SmallVector<SDValue,8> Operands;
954     Operands.push_back(Chain.getOperand(0));
955     Operands.push_back(TargetAddress);
956     Operands.push_back(StackAdjustment);
957     // Copy registers used by the call. Last operand is a flag so it is not
958     // copied.
959     for (unsigned i=3; i < TailCall.getNumOperands()-1; i++) {
960       Operands.push_back(Chain.getOperand(i));
961     }
962     return DAG.getNode(X86ISD::TC_RETURN, dl, MVT::Other, &Operands[0], 
963                        Operands.size());
964   }
965   
966   // Regular return.
967   SDValue Flag;
968
969   SmallVector<SDValue, 6> RetOps;
970   RetOps.push_back(Chain); // Operand #0 = Chain (updated below)
971   // Operand #1 = Bytes To Pop
972   RetOps.push_back(DAG.getConstant(getBytesToPopOnReturn(), MVT::i16));
973   
974   // Copy the result values into the output registers.
975   for (unsigned i = 0; i != RVLocs.size(); ++i) {
976     CCValAssign &VA = RVLocs[i];
977     assert(VA.isRegLoc() && "Can only return in registers!");
978     SDValue ValToCopy = Op.getOperand(i*2+1);
979     
980     // Returns in ST0/ST1 are handled specially: these are pushed as operands to
981     // the RET instruction and handled by the FP Stackifier.
982     if (VA.getLocReg() == X86::ST0 ||
983         VA.getLocReg() == X86::ST1) {
984       // If this is a copy from an xmm register to ST(0), use an FPExtend to
985       // change the value to the FP stack register class.
986       if (isScalarFPTypeInSSEReg(VA.getValVT()))
987         ValToCopy = DAG.getNode(ISD::FP_EXTEND, dl, MVT::f80, ValToCopy);
988       RetOps.push_back(ValToCopy);
989       // Don't emit a copytoreg.
990       continue;
991     }
992
993     Chain = DAG.getCopyToReg(Chain, dl, VA.getLocReg(), ValToCopy, Flag);
994     Flag = Chain.getValue(1);
995   }
996
997   // The x86-64 ABI for returning structs by value requires that we copy
998   // the sret argument into %rax for the return. We saved the argument into
999   // a virtual register in the entry block, so now we copy the value out
1000   // and into %rax.
1001   if (Subtarget->is64Bit() &&
1002       DAG.getMachineFunction().getFunction()->hasStructRetAttr()) {
1003     MachineFunction &MF = DAG.getMachineFunction();
1004     X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
1005     unsigned Reg = FuncInfo->getSRetReturnReg();
1006     if (!Reg) {
1007       Reg = MF.getRegInfo().createVirtualRegister(getRegClassFor(MVT::i64));
1008       FuncInfo->setSRetReturnReg(Reg);
1009     }
1010     SDValue Val = DAG.getCopyFromReg(Chain, dl, Reg, getPointerTy());
1011
1012     Chain = DAG.getCopyToReg(Chain, dl, X86::RAX, Val, Flag);
1013     Flag = Chain.getValue(1);
1014   }
1015   
1016   RetOps[0] = Chain;  // Update chain.
1017
1018   // Add the flag if we have it.
1019   if (Flag.getNode())
1020     RetOps.push_back(Flag);
1021   
1022   return DAG.getNode(X86ISD::RET_FLAG, dl, 
1023                      MVT::Other, &RetOps[0], RetOps.size());
1024 }
1025
1026
1027 /// LowerCallResult - Lower the result values of an ISD::CALL into the
1028 /// appropriate copies out of appropriate physical registers.  This assumes that
1029 /// Chain/InFlag are the input chain/flag to use, and that TheCall is the call
1030 /// being lowered.  The returns a SDNode with the same number of values as the
1031 /// ISD::CALL.
1032 SDNode *X86TargetLowering::
1033 LowerCallResult(SDValue Chain, SDValue InFlag, CallSDNode *TheCall, 
1034                 unsigned CallingConv, SelectionDAG &DAG) {
1035
1036   DebugLoc dl = TheCall->getDebugLoc();  
1037   // Assign locations to each value returned by this call.
1038   SmallVector<CCValAssign, 16> RVLocs;
1039   bool isVarArg = TheCall->isVarArg();
1040   bool Is64Bit = Subtarget->is64Bit();
1041   CCState CCInfo(CallingConv, isVarArg, getTargetMachine(), RVLocs);
1042   CCInfo.AnalyzeCallResult(TheCall, RetCC_X86);
1043
1044   SmallVector<SDValue, 8> ResultVals;
1045   
1046   // Copy all of the result registers out of their specified physreg.
1047   for (unsigned i = 0; i != RVLocs.size(); ++i) {
1048     CCValAssign &VA = RVLocs[i];
1049     MVT CopyVT = VA.getValVT();
1050   
1051     // If this is x86-64, and we disabled SSE, we can't return FP values
1052     if ((CopyVT == MVT::f32 || CopyVT == MVT::f64) && 
1053         ((Is64Bit || TheCall->isInreg()) && !Subtarget->hasSSE1())) {
1054       cerr << "SSE register return with SSE disabled\n";
1055       exit(1);
1056     }
1057
1058     // If this is a call to a function that returns an fp value on the floating
1059     // point stack, but where we prefer to use the value in xmm registers, copy
1060     // it out as F80 and use a truncate to move it from fp stack reg to xmm reg.
1061     if ((VA.getLocReg() == X86::ST0 ||
1062          VA.getLocReg() == X86::ST1) &&
1063         isScalarFPTypeInSSEReg(VA.getValVT())) {
1064       CopyVT = MVT::f80;
1065     }
1066     
1067     Chain = DAG.getCopyFromReg(Chain, dl, VA.getLocReg(),
1068                                CopyVT, InFlag).getValue(1);
1069     SDValue Val = Chain.getValue(0);
1070     InFlag = Chain.getValue(2);
1071
1072     if (CopyVT != VA.getValVT()) {
1073       // Round the F80 the right size, which also moves to the appropriate xmm
1074       // register.
1075       Val = DAG.getNode(ISD::FP_ROUND, dl, VA.getValVT(), Val,
1076                         // This truncation won't change the value.
1077                         DAG.getIntPtrConstant(1));
1078     }
1079     
1080     ResultVals.push_back(Val);
1081   }
1082
1083   // Merge everything together with a MERGE_VALUES node.
1084   ResultVals.push_back(Chain);
1085   return DAG.getNode(ISD::MERGE_VALUES, dl, TheCall->getVTList(),
1086                      &ResultVals[0], ResultVals.size()).getNode();
1087 }
1088
1089
1090 //===----------------------------------------------------------------------===//
1091 //                C & StdCall & Fast Calling Convention implementation
1092 //===----------------------------------------------------------------------===//
1093 //  StdCall calling convention seems to be standard for many Windows' API
1094 //  routines and around. It differs from C calling convention just a little:
1095 //  callee should clean up the stack, not caller. Symbols should be also
1096 //  decorated in some fancy way :) It doesn't support any vector arguments.
1097 //  For info on fast calling convention see Fast Calling Convention (tail call)
1098 //  implementation LowerX86_32FastCCCallTo.
1099
1100 /// AddLiveIn - This helper function adds the specified physical register to the
1101 /// MachineFunction as a live in value.  It also creates a corresponding virtual
1102 /// register for it.
1103 static unsigned AddLiveIn(MachineFunction &MF, unsigned PReg,
1104                           const TargetRegisterClass *RC) {
1105   assert(RC->contains(PReg) && "Not the correct regclass!");
1106   unsigned VReg = MF.getRegInfo().createVirtualRegister(RC);
1107   MF.getRegInfo().addLiveIn(PReg, VReg);
1108   return VReg;
1109 }
1110
1111 /// CallIsStructReturn - Determines whether a CALL node uses struct return
1112 /// semantics.
1113 static bool CallIsStructReturn(CallSDNode *TheCall) {
1114   unsigned NumOps = TheCall->getNumArgs();
1115   if (!NumOps)
1116     return false;
1117
1118   return TheCall->getArgFlags(0).isSRet();
1119 }
1120
1121 /// ArgsAreStructReturn - Determines whether a FORMAL_ARGUMENTS node uses struct
1122 /// return semantics.
1123 static bool ArgsAreStructReturn(SDValue Op) {
1124   unsigned NumArgs = Op.getNode()->getNumValues() - 1;
1125   if (!NumArgs)
1126     return false;
1127
1128   return cast<ARG_FLAGSSDNode>(Op.getOperand(3))->getArgFlags().isSRet();
1129 }
1130
1131 /// IsCalleePop - Determines whether a CALL or FORMAL_ARGUMENTS node requires
1132 /// the callee to pop its own arguments. Callee pop is necessary to support tail
1133 /// calls.
1134 bool X86TargetLowering::IsCalleePop(bool IsVarArg, unsigned CallingConv) {
1135   if (IsVarArg)
1136     return false;
1137
1138   switch (CallingConv) {
1139   default:
1140     return false;
1141   case CallingConv::X86_StdCall:
1142     return !Subtarget->is64Bit();
1143   case CallingConv::X86_FastCall:
1144     return !Subtarget->is64Bit();
1145   case CallingConv::Fast:
1146     return PerformTailCallOpt;
1147   }
1148 }
1149
1150 /// CCAssignFnForNode - Selects the correct CCAssignFn for a the
1151 /// given CallingConvention value.
1152 CCAssignFn *X86TargetLowering::CCAssignFnForNode(unsigned CC) const {
1153   if (Subtarget->is64Bit()) {
1154     if (Subtarget->isTargetWin64())
1155       return CC_X86_Win64_C;
1156     else if (CC == CallingConv::Fast && PerformTailCallOpt)
1157       return CC_X86_64_TailCall;
1158     else
1159       return CC_X86_64_C;
1160   }
1161
1162   if (CC == CallingConv::X86_FastCall)
1163     return CC_X86_32_FastCall;
1164   else if (CC == CallingConv::Fast)
1165     return CC_X86_32_FastCC;
1166   else
1167     return CC_X86_32_C;
1168 }
1169
1170 /// NameDecorationForFORMAL_ARGUMENTS - Selects the appropriate decoration to
1171 /// apply to a MachineFunction containing a given FORMAL_ARGUMENTS node.
1172 NameDecorationStyle
1173 X86TargetLowering::NameDecorationForFORMAL_ARGUMENTS(SDValue Op) {
1174   unsigned CC = cast<ConstantSDNode>(Op.getOperand(1))->getZExtValue();
1175   if (CC == CallingConv::X86_FastCall)
1176     return FastCall;
1177   else if (CC == CallingConv::X86_StdCall)
1178     return StdCall;
1179   return None;
1180 }
1181
1182
1183 /// CallRequiresGOTInRegister - Check whether the call requires the GOT pointer
1184 /// in a register before calling.
1185 bool X86TargetLowering::CallRequiresGOTPtrInReg(bool Is64Bit, bool IsTailCall) {
1186   return !IsTailCall && !Is64Bit &&
1187     getTargetMachine().getRelocationModel() == Reloc::PIC_ &&
1188     Subtarget->isPICStyleGOT();
1189 }
1190
1191 /// CallRequiresFnAddressInReg - Check whether the call requires the function
1192 /// address to be loaded in a register.
1193 bool 
1194 X86TargetLowering::CallRequiresFnAddressInReg(bool Is64Bit, bool IsTailCall) {
1195   return !Is64Bit && IsTailCall &&  
1196     getTargetMachine().getRelocationModel() == Reloc::PIC_ &&
1197     Subtarget->isPICStyleGOT();
1198 }
1199
1200 /// CreateCopyOfByValArgument - Make a copy of an aggregate at address specified
1201 /// by "Src" to address "Dst" with size and alignment information specified by
1202 /// the specific parameter attribute. The copy will be passed as a byval
1203 /// function parameter.
1204 static SDValue 
1205 CreateCopyOfByValArgument(SDValue Src, SDValue Dst, SDValue Chain,
1206                           ISD::ArgFlagsTy Flags, SelectionDAG &DAG,
1207                           DebugLoc dl) {
1208   SDValue SizeNode     = DAG.getConstant(Flags.getByValSize(), MVT::i32);
1209   return DAG.getMemcpy(Chain, dl, Dst, Src, SizeNode, Flags.getByValAlign(),
1210                        /*AlwaysInline=*/true, NULL, 0, NULL, 0);
1211 }
1212
1213 SDValue X86TargetLowering::LowerMemArgument(SDValue Op, SelectionDAG &DAG,
1214                                               const CCValAssign &VA,
1215                                               MachineFrameInfo *MFI,
1216                                               unsigned CC,
1217                                               SDValue Root, unsigned i) {
1218   // Create the nodes corresponding to a load from this parameter slot.
1219   ISD::ArgFlagsTy Flags =
1220     cast<ARG_FLAGSSDNode>(Op.getOperand(3 + i))->getArgFlags();
1221   bool AlwaysUseMutable = (CC==CallingConv::Fast) && PerformTailCallOpt;
1222   bool isImmutable = !AlwaysUseMutable && !Flags.isByVal();
1223
1224   // FIXME: For now, all byval parameter objects are marked mutable. This can be
1225   // changed with more analysis.  
1226   // In case of tail call optimization mark all arguments mutable. Since they
1227   // could be overwritten by lowering of arguments in case of a tail call.
1228   int FI = MFI->CreateFixedObject(VA.getValVT().getSizeInBits()/8,
1229                                   VA.getLocMemOffset(), isImmutable);
1230   SDValue FIN = DAG.getFrameIndex(FI, getPointerTy());
1231   if (Flags.isByVal())
1232     return FIN;
1233   return DAG.getLoad(VA.getValVT(), Op.getDebugLoc(), Root, FIN,
1234                      PseudoSourceValue::getFixedStack(FI), 0);
1235 }
1236
1237 SDValue
1238 X86TargetLowering::LowerFORMAL_ARGUMENTS(SDValue Op, SelectionDAG &DAG) {
1239   MachineFunction &MF = DAG.getMachineFunction();
1240   X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
1241   DebugLoc dl = Op.getDebugLoc();
1242   
1243   const Function* Fn = MF.getFunction();
1244   if (Fn->hasExternalLinkage() &&
1245       Subtarget->isTargetCygMing() &&
1246       Fn->getName() == "main")
1247     FuncInfo->setForceFramePointer(true);
1248
1249   // Decorate the function name.
1250   FuncInfo->setDecorationStyle(NameDecorationForFORMAL_ARGUMENTS(Op));
1251   
1252   MachineFrameInfo *MFI = MF.getFrameInfo();
1253   SDValue Root = Op.getOperand(0);
1254   bool isVarArg = cast<ConstantSDNode>(Op.getOperand(2))->getZExtValue() != 0;
1255   unsigned CC = MF.getFunction()->getCallingConv();
1256   bool Is64Bit = Subtarget->is64Bit();
1257   bool IsWin64 = Subtarget->isTargetWin64();
1258
1259   assert(!(isVarArg && CC == CallingConv::Fast) &&
1260          "Var args not supported with calling convention fastcc");
1261
1262   // Assign locations to all of the incoming arguments.
1263   SmallVector<CCValAssign, 16> ArgLocs;
1264   CCState CCInfo(CC, isVarArg, getTargetMachine(), ArgLocs);
1265   CCInfo.AnalyzeFormalArguments(Op.getNode(), CCAssignFnForNode(CC));
1266   
1267   SmallVector<SDValue, 8> ArgValues;
1268   unsigned LastVal = ~0U;
1269   for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
1270     CCValAssign &VA = ArgLocs[i];
1271     // TODO: If an arg is passed in two places (e.g. reg and stack), skip later
1272     // places.
1273     assert(VA.getValNo() != LastVal &&
1274            "Don't support value assigned to multiple locs yet");
1275     LastVal = VA.getValNo();
1276     
1277     if (VA.isRegLoc()) {
1278       MVT RegVT = VA.getLocVT();
1279       TargetRegisterClass *RC = NULL;
1280       if (RegVT == MVT::i32)
1281         RC = X86::GR32RegisterClass;
1282       else if (Is64Bit && RegVT == MVT::i64)
1283         RC = X86::GR64RegisterClass;
1284       else if (RegVT == MVT::f32)
1285         RC = X86::FR32RegisterClass;
1286       else if (RegVT == MVT::f64)
1287         RC = X86::FR64RegisterClass;
1288       else if (RegVT.isVector() && RegVT.getSizeInBits() == 128)
1289         RC = X86::VR128RegisterClass;
1290       else if (RegVT.isVector()) {
1291         assert(RegVT.getSizeInBits() == 64);
1292         if (!Is64Bit)
1293           RC = X86::VR64RegisterClass;     // MMX values are passed in MMXs.
1294         else {
1295           // Darwin calling convention passes MMX values in either GPRs or
1296           // XMMs in x86-64. Other targets pass them in memory.
1297           if (RegVT != MVT::v1i64 && Subtarget->hasSSE2()) {
1298             RC = X86::VR128RegisterClass;  // MMX values are passed in XMMs.
1299             RegVT = MVT::v2i64;
1300           } else {
1301             RC = X86::GR64RegisterClass;   // v1i64 values are passed in GPRs.
1302             RegVT = MVT::i64;
1303           }
1304         }
1305       } else {
1306         assert(0 && "Unknown argument type!");
1307       }
1308
1309       unsigned Reg = AddLiveIn(DAG.getMachineFunction(), VA.getLocReg(), RC);
1310       SDValue ArgValue = DAG.getCopyFromReg(Root, dl, Reg, RegVT);
1311       
1312       // If this is an 8 or 16-bit value, it is really passed promoted to 32
1313       // bits.  Insert an assert[sz]ext to capture this, then truncate to the
1314       // right size.
1315       if (VA.getLocInfo() == CCValAssign::SExt)
1316         ArgValue = DAG.getNode(ISD::AssertSext, dl, RegVT, ArgValue,
1317                                DAG.getValueType(VA.getValVT()));
1318       else if (VA.getLocInfo() == CCValAssign::ZExt)
1319         ArgValue = DAG.getNode(ISD::AssertZext, dl, RegVT, ArgValue,
1320                                DAG.getValueType(VA.getValVT()));
1321       
1322       if (VA.getLocInfo() != CCValAssign::Full)
1323         ArgValue = DAG.getNode(ISD::TRUNCATE, dl, VA.getValVT(), ArgValue);
1324       
1325       // Handle MMX values passed in GPRs.
1326       if (Is64Bit && RegVT != VA.getLocVT()) {
1327         if (RegVT.getSizeInBits() == 64 && RC == X86::GR64RegisterClass)
1328           ArgValue = DAG.getNode(ISD::BIT_CONVERT, dl, VA.getLocVT(), ArgValue);
1329         else if (RC == X86::VR128RegisterClass) {
1330           ArgValue = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i64,
1331                                  ArgValue, DAG.getConstant(0, MVT::i64));
1332           ArgValue = DAG.getNode(ISD::BIT_CONVERT, dl, VA.getLocVT(), ArgValue);
1333         }
1334       }
1335       
1336       ArgValues.push_back(ArgValue);
1337     } else {
1338       assert(VA.isMemLoc());
1339       ArgValues.push_back(LowerMemArgument(Op, DAG, VA, MFI, CC, Root, i));
1340     }
1341   }
1342
1343   // The x86-64 ABI for returning structs by value requires that we copy
1344   // the sret argument into %rax for the return. Save the argument into
1345   // a virtual register so that we can access it from the return points.
1346   if (Is64Bit && DAG.getMachineFunction().getFunction()->hasStructRetAttr()) {
1347     MachineFunction &MF = DAG.getMachineFunction();
1348     X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
1349     unsigned Reg = FuncInfo->getSRetReturnReg();
1350     if (!Reg) {
1351       Reg = MF.getRegInfo().createVirtualRegister(getRegClassFor(MVT::i64));
1352       FuncInfo->setSRetReturnReg(Reg);
1353     }
1354     SDValue Copy = DAG.getCopyToReg(DAG.getEntryNode(), dl, Reg, ArgValues[0]);
1355     Root = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Copy, Root);
1356   }
1357
1358   unsigned StackSize = CCInfo.getNextStackOffset();
1359   // align stack specially for tail calls
1360   if (PerformTailCallOpt && CC == CallingConv::Fast)
1361     StackSize = GetAlignedArgumentStackSize(StackSize, DAG);
1362
1363   // If the function takes variable number of arguments, make a frame index for
1364   // the start of the first vararg value... for expansion of llvm.va_start.
1365   if (isVarArg) {
1366     if (Is64Bit || CC != CallingConv::X86_FastCall) {
1367       VarArgsFrameIndex = MFI->CreateFixedObject(1, StackSize);
1368     }
1369     if (Is64Bit) {
1370       unsigned TotalNumIntRegs = 0, TotalNumXMMRegs = 0;
1371
1372       // FIXME: We should really autogenerate these arrays
1373       static const unsigned GPR64ArgRegsWin64[] = {
1374         X86::RCX, X86::RDX, X86::R8,  X86::R9
1375       };
1376       static const unsigned XMMArgRegsWin64[] = {
1377         X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3
1378       };
1379       static const unsigned GPR64ArgRegs64Bit[] = {
1380         X86::RDI, X86::RSI, X86::RDX, X86::RCX, X86::R8, X86::R9
1381       };
1382       static const unsigned XMMArgRegs64Bit[] = {
1383         X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3,
1384         X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7
1385       };
1386       const unsigned *GPR64ArgRegs, *XMMArgRegs;
1387
1388       if (IsWin64) {
1389         TotalNumIntRegs = 4; TotalNumXMMRegs = 4;
1390         GPR64ArgRegs = GPR64ArgRegsWin64;
1391         XMMArgRegs = XMMArgRegsWin64;
1392       } else {
1393         TotalNumIntRegs = 6; TotalNumXMMRegs = 8;
1394         GPR64ArgRegs = GPR64ArgRegs64Bit;
1395         XMMArgRegs = XMMArgRegs64Bit;
1396       }
1397       unsigned NumIntRegs = CCInfo.getFirstUnallocated(GPR64ArgRegs,
1398                                                        TotalNumIntRegs);
1399       unsigned NumXMMRegs = CCInfo.getFirstUnallocated(XMMArgRegs,
1400                                                        TotalNumXMMRegs);
1401
1402       assert((Subtarget->hasSSE1() || !NumXMMRegs) &&
1403              "SSE register cannot be used when SSE is disabled!");
1404       if (!Subtarget->hasSSE1()) {
1405         // Kernel mode asks for SSE to be disabled, so don't push them
1406         // on the stack.
1407         TotalNumXMMRegs = 0;
1408       }
1409       // For X86-64, if there are vararg parameters that are passed via
1410       // registers, then we must store them to their spots on the stack so they
1411       // may be loaded by deferencing the result of va_next.
1412       VarArgsGPOffset = NumIntRegs * 8;
1413       VarArgsFPOffset = TotalNumIntRegs * 8 + NumXMMRegs * 16;
1414       RegSaveFrameIndex = MFI->CreateStackObject(TotalNumIntRegs * 8 +
1415                                                  TotalNumXMMRegs * 16, 16);
1416
1417       // Store the integer parameter registers.
1418       SmallVector<SDValue, 8> MemOps;
1419       SDValue RSFIN = DAG.getFrameIndex(RegSaveFrameIndex, getPointerTy());
1420       SDValue FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(), RSFIN,
1421                                   DAG.getIntPtrConstant(VarArgsGPOffset));
1422       for (; NumIntRegs != TotalNumIntRegs; ++NumIntRegs) {
1423         unsigned VReg = AddLiveIn(MF, GPR64ArgRegs[NumIntRegs],
1424                                   X86::GR64RegisterClass);
1425         SDValue Val = DAG.getCopyFromReg(Root, dl, VReg, MVT::i64);
1426         SDValue Store =
1427           DAG.getStore(Val.getValue(1), dl, Val, FIN,
1428                        PseudoSourceValue::getFixedStack(RegSaveFrameIndex), 0);
1429         MemOps.push_back(Store);
1430         FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(), FIN,
1431                           DAG.getIntPtrConstant(8));
1432       }
1433
1434       // Now store the XMM (fp + vector) parameter registers.
1435       FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(), RSFIN,
1436                         DAG.getIntPtrConstant(VarArgsFPOffset));
1437       for (; NumXMMRegs != TotalNumXMMRegs; ++NumXMMRegs) {
1438         unsigned VReg = AddLiveIn(MF, XMMArgRegs[NumXMMRegs],
1439                                   X86::VR128RegisterClass);
1440         SDValue Val = DAG.getCopyFromReg(Root, dl, VReg, MVT::v4f32);
1441         SDValue Store =
1442           DAG.getStore(Val.getValue(1), dl, Val, FIN,
1443                        PseudoSourceValue::getFixedStack(RegSaveFrameIndex), 0);
1444         MemOps.push_back(Store);
1445         FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(), FIN,
1446                           DAG.getIntPtrConstant(16));
1447       }
1448       if (!MemOps.empty())
1449           Root = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
1450                              &MemOps[0], MemOps.size());
1451     }
1452   }
1453   
1454   ArgValues.push_back(Root);
1455
1456   // Some CCs need callee pop.
1457   if (IsCalleePop(isVarArg, CC)) {
1458     BytesToPopOnReturn  = StackSize; // Callee pops everything.
1459     BytesCallerReserves = 0;
1460   } else {
1461     BytesToPopOnReturn  = 0; // Callee pops nothing.
1462     // If this is an sret function, the return should pop the hidden pointer.
1463     if (!Is64Bit && CC != CallingConv::Fast && ArgsAreStructReturn(Op))
1464       BytesToPopOnReturn = 4;  
1465     BytesCallerReserves = StackSize;
1466   }
1467
1468   if (!Is64Bit) {
1469     RegSaveFrameIndex = 0xAAAAAAA;   // RegSaveFrameIndex is X86-64 only.
1470     if (CC == CallingConv::X86_FastCall)
1471       VarArgsFrameIndex = 0xAAAAAAA;   // fastcc functions can't have varargs.
1472   }
1473
1474   FuncInfo->setBytesToPopOnReturn(BytesToPopOnReturn);
1475
1476   // Return the new list of results.
1477   return DAG.getNode(ISD::MERGE_VALUES, dl, Op.getNode()->getVTList(),
1478                      &ArgValues[0], ArgValues.size()).getValue(Op.getResNo());
1479 }
1480
1481 SDValue
1482 X86TargetLowering::LowerMemOpCallTo(CallSDNode *TheCall, SelectionDAG &DAG,
1483                                     const SDValue &StackPtr,
1484                                     const CCValAssign &VA,
1485                                     SDValue Chain,
1486                                     SDValue Arg, ISD::ArgFlagsTy Flags) {
1487   DebugLoc dl = TheCall->getDebugLoc();
1488   unsigned LocMemOffset = VA.getLocMemOffset();
1489   SDValue PtrOff = DAG.getIntPtrConstant(LocMemOffset);
1490   PtrOff = DAG.getNode(ISD::ADD, dl, getPointerTy(), StackPtr, PtrOff);
1491   if (Flags.isByVal()) {
1492     return CreateCopyOfByValArgument(Arg, PtrOff, Chain, Flags, DAG, dl);
1493   }
1494   return DAG.getStore(Chain, dl, Arg, PtrOff,
1495                       PseudoSourceValue::getStack(), LocMemOffset);
1496 }
1497
1498 /// EmitTailCallLoadRetAddr - Emit a load of return address if tail call
1499 /// optimization is performed and it is required.
1500 SDValue 
1501 X86TargetLowering::EmitTailCallLoadRetAddr(SelectionDAG &DAG, 
1502                                            SDValue &OutRetAddr,
1503                                            SDValue Chain, 
1504                                            bool IsTailCall, 
1505                                            bool Is64Bit, 
1506                                            int FPDiff,
1507                                            DebugLoc dl) {
1508   if (!IsTailCall || FPDiff==0) return Chain;
1509
1510   // Adjust the Return address stack slot.
1511   MVT VT = getPointerTy();
1512   OutRetAddr = getReturnAddressFrameIndex(DAG);
1513
1514   // Load the "old" Return address.
1515   OutRetAddr = DAG.getLoad(VT, dl, Chain, OutRetAddr, NULL, 0);
1516   return SDValue(OutRetAddr.getNode(), 1);
1517 }
1518
1519 /// EmitTailCallStoreRetAddr - Emit a store of the return adress if tail call
1520 /// optimization is performed and it is required (FPDiff!=0).
1521 static SDValue 
1522 EmitTailCallStoreRetAddr(SelectionDAG & DAG, MachineFunction &MF, 
1523                          SDValue Chain, SDValue RetAddrFrIdx,
1524                          bool Is64Bit, int FPDiff, DebugLoc dl) {
1525   // Store the return address to the appropriate stack slot.
1526   if (!FPDiff) return Chain;
1527   // Calculate the new stack slot for the return address.
1528   int SlotSize = Is64Bit ? 8 : 4;
1529   int NewReturnAddrFI = 
1530     MF.getFrameInfo()->CreateFixedObject(SlotSize, FPDiff-SlotSize);
1531   MVT VT = Is64Bit ? MVT::i64 : MVT::i32;
1532   SDValue NewRetAddrFrIdx = DAG.getFrameIndex(NewReturnAddrFI, VT);
1533   Chain = DAG.getStore(Chain, dl, RetAddrFrIdx, NewRetAddrFrIdx, 
1534                        PseudoSourceValue::getFixedStack(NewReturnAddrFI), 0);
1535   return Chain;
1536 }
1537
1538 SDValue X86TargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG) {
1539   MachineFunction &MF = DAG.getMachineFunction();
1540   CallSDNode *TheCall = cast<CallSDNode>(Op.getNode());
1541   SDValue Chain       = TheCall->getChain();
1542   unsigned CC         = TheCall->getCallingConv();
1543   bool isVarArg       = TheCall->isVarArg();
1544   bool IsTailCall     = TheCall->isTailCall() &&
1545                         CC == CallingConv::Fast && PerformTailCallOpt;
1546   SDValue Callee      = TheCall->getCallee();
1547   bool Is64Bit        = Subtarget->is64Bit();
1548   bool IsStructRet    = CallIsStructReturn(TheCall);
1549   DebugLoc dl         = TheCall->getDebugLoc();
1550
1551   assert(!(isVarArg && CC == CallingConv::Fast) &&
1552          "Var args not supported with calling convention fastcc");
1553
1554   // Analyze operands of the call, assigning locations to each operand.
1555   SmallVector<CCValAssign, 16> ArgLocs;
1556   CCState CCInfo(CC, isVarArg, getTargetMachine(), ArgLocs);
1557   CCInfo.AnalyzeCallOperands(TheCall, CCAssignFnForNode(CC));
1558   
1559   // Get a count of how many bytes are to be pushed on the stack.
1560   unsigned NumBytes = CCInfo.getNextStackOffset();
1561   if (PerformTailCallOpt && CC == CallingConv::Fast)
1562     NumBytes = GetAlignedArgumentStackSize(NumBytes, DAG);
1563
1564   int FPDiff = 0;
1565   if (IsTailCall) {
1566     // Lower arguments at fp - stackoffset + fpdiff.
1567     unsigned NumBytesCallerPushed = 
1568       MF.getInfo<X86MachineFunctionInfo>()->getBytesToPopOnReturn();
1569     FPDiff = NumBytesCallerPushed - NumBytes;
1570
1571     // Set the delta of movement of the returnaddr stackslot.
1572     // But only set if delta is greater than previous delta.
1573     if (FPDiff < (MF.getInfo<X86MachineFunctionInfo>()->getTCReturnAddrDelta()))
1574       MF.getInfo<X86MachineFunctionInfo>()->setTCReturnAddrDelta(FPDiff);
1575   }
1576
1577   Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(NumBytes, true));
1578
1579   SDValue RetAddrFrIdx;
1580   // Load return adress for tail calls.
1581   Chain = EmitTailCallLoadRetAddr(DAG, RetAddrFrIdx, Chain, IsTailCall, Is64Bit,
1582                                   FPDiff, dl);
1583
1584   SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;
1585   SmallVector<SDValue, 8> MemOpChains;
1586   SDValue StackPtr;
1587
1588   // Walk the register/memloc assignments, inserting copies/loads.  In the case
1589   // of tail call optimization arguments are handle later.
1590   for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
1591     CCValAssign &VA = ArgLocs[i];
1592     SDValue Arg = TheCall->getArg(i);
1593     ISD::ArgFlagsTy Flags = TheCall->getArgFlags(i);
1594     bool isByVal = Flags.isByVal();
1595   
1596     // Promote the value if needed.
1597     switch (VA.getLocInfo()) {
1598     default: assert(0 && "Unknown loc info!");
1599     case CCValAssign::Full: break;
1600     case CCValAssign::SExt:
1601       Arg = DAG.getNode(ISD::SIGN_EXTEND, dl, VA.getLocVT(), Arg);
1602       break;
1603     case CCValAssign::ZExt:
1604       Arg = DAG.getNode(ISD::ZERO_EXTEND, dl, VA.getLocVT(), Arg);
1605       break;
1606     case CCValAssign::AExt:
1607       Arg = DAG.getNode(ISD::ANY_EXTEND, dl, VA.getLocVT(), Arg);
1608       break;
1609     }
1610     
1611     if (VA.isRegLoc()) {
1612       if (Is64Bit) {
1613         MVT RegVT = VA.getLocVT();
1614         if (RegVT.isVector() && RegVT.getSizeInBits() == 64)
1615           switch (VA.getLocReg()) {
1616           default:
1617             break;
1618           case X86::RDI: case X86::RSI: case X86::RDX: case X86::RCX:
1619           case X86::R8: {
1620             // Special case: passing MMX values in GPR registers.
1621             Arg = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::i64, Arg);
1622             break;
1623           }
1624           case X86::XMM0: case X86::XMM1: case X86::XMM2: case X86::XMM3:
1625           case X86::XMM4: case X86::XMM5: case X86::XMM6: case X86::XMM7: {
1626             // Special case: passing MMX values in XMM registers.
1627             Arg = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::i64, Arg);
1628             Arg = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v2i64, Arg);
1629             Arg = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, MVT::v2i64,
1630                               DAG.getUNDEF(MVT::v2i64), Arg,
1631                               getMOVLMask(2, DAG, dl));
1632             break;
1633           }
1634           }
1635       }
1636       RegsToPass.push_back(std::make_pair(VA.getLocReg(), Arg));
1637     } else {
1638       if (!IsTailCall || (IsTailCall && isByVal)) {
1639         assert(VA.isMemLoc());
1640         if (StackPtr.getNode() == 0)
1641           StackPtr = DAG.getCopyFromReg(Chain, dl, X86StackPtr, getPointerTy());
1642         
1643         MemOpChains.push_back(LowerMemOpCallTo(TheCall, DAG, StackPtr, VA,
1644                                                Chain, Arg, Flags));
1645       }
1646     }
1647   }
1648   
1649   if (!MemOpChains.empty())
1650     Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
1651                         &MemOpChains[0], MemOpChains.size());
1652
1653   // Build a sequence of copy-to-reg nodes chained together with token chain
1654   // and flag operands which copy the outgoing args into registers.
1655   SDValue InFlag;
1656   // Tail call byval lowering might overwrite argument registers so in case of
1657   // tail call optimization the copies to registers are lowered later.
1658   if (!IsTailCall)
1659     for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) {
1660       Chain = DAG.getCopyToReg(Chain, dl, RegsToPass[i].first, 
1661                                RegsToPass[i].second, InFlag);
1662       InFlag = Chain.getValue(1);
1663     }
1664
1665   // ELF / PIC requires GOT in the EBX register before function calls via PLT
1666   // GOT pointer.  
1667   if (CallRequiresGOTPtrInReg(Is64Bit, IsTailCall)) {
1668     Chain = DAG.getCopyToReg(Chain, dl, X86::EBX,
1669                              DAG.getNode(X86ISD::GlobalBaseReg, 
1670                                          DebugLoc::getUnknownLoc(), 
1671                                          getPointerTy()),
1672                              InFlag);
1673     InFlag = Chain.getValue(1);
1674   }
1675   // If we are tail calling and generating PIC/GOT style code load the address
1676   // of the callee into ecx. The value in ecx is used as target of the tail
1677   // jump. This is done to circumvent the ebx/callee-saved problem for tail
1678   // calls on PIC/GOT architectures. Normally we would just put the address of
1679   // GOT into ebx and then call target@PLT. But for tail callss ebx would be
1680   // restored (since ebx is callee saved) before jumping to the target@PLT.
1681   if (CallRequiresFnAddressInReg(Is64Bit, IsTailCall)) {
1682     // Note: The actual moving to ecx is done further down.
1683     GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee);
1684     if (G && !G->getGlobal()->hasHiddenVisibility() &&
1685         !G->getGlobal()->hasProtectedVisibility())
1686       Callee =  LowerGlobalAddress(Callee, DAG);
1687     else if (isa<ExternalSymbolSDNode>(Callee))
1688       Callee = LowerExternalSymbol(Callee,DAG);
1689   }
1690
1691   if (Is64Bit && isVarArg) {
1692     // From AMD64 ABI document:
1693     // For calls that may call functions that use varargs or stdargs
1694     // (prototype-less calls or calls to functions containing ellipsis (...) in
1695     // the declaration) %al is used as hidden argument to specify the number
1696     // of SSE registers used. The contents of %al do not need to match exactly
1697     // the number of registers, but must be an ubound on the number of SSE
1698     // registers used and is in the range 0 - 8 inclusive.
1699
1700     // FIXME: Verify this on Win64
1701     // Count the number of XMM registers allocated.
1702     static const unsigned XMMArgRegs[] = {
1703       X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3,
1704       X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7
1705     };
1706     unsigned NumXMMRegs = CCInfo.getFirstUnallocated(XMMArgRegs, 8);
1707     assert((Subtarget->hasSSE1() || !NumXMMRegs) 
1708            && "SSE registers cannot be used when SSE is disabled");
1709     
1710     Chain = DAG.getCopyToReg(Chain, dl, X86::AL,
1711                              DAG.getConstant(NumXMMRegs, MVT::i8), InFlag);
1712     InFlag = Chain.getValue(1);
1713   }
1714
1715
1716   // For tail calls lower the arguments to the 'real' stack slot.
1717   if (IsTailCall) {
1718     SmallVector<SDValue, 8> MemOpChains2;
1719     SDValue FIN;
1720     int FI = 0;
1721     // Do not flag preceeding copytoreg stuff together with the following stuff.
1722     InFlag = SDValue();
1723     for (unsigned i = 0, e = ArgLocs.size(); i != e; ++i) {
1724       CCValAssign &VA = ArgLocs[i];
1725       if (!VA.isRegLoc()) {
1726         assert(VA.isMemLoc());
1727         SDValue Arg = TheCall->getArg(i);
1728         ISD::ArgFlagsTy Flags = TheCall->getArgFlags(i);
1729         // Create frame index.
1730         int32_t Offset = VA.getLocMemOffset()+FPDiff;
1731         uint32_t OpSize = (VA.getLocVT().getSizeInBits()+7)/8;
1732         FI = MF.getFrameInfo()->CreateFixedObject(OpSize, Offset);
1733         FIN = DAG.getFrameIndex(FI, getPointerTy());
1734
1735         if (Flags.isByVal()) {
1736           // Copy relative to framepointer.
1737           SDValue Source = DAG.getIntPtrConstant(VA.getLocMemOffset());
1738           if (StackPtr.getNode() == 0)
1739             StackPtr = DAG.getCopyFromReg(Chain, dl, X86StackPtr, 
1740                                           getPointerTy());
1741           Source = DAG.getNode(ISD::ADD, dl, getPointerTy(), StackPtr, Source);
1742
1743           MemOpChains2.push_back(CreateCopyOfByValArgument(Source, FIN, Chain,
1744                                                            Flags, DAG, dl));
1745         } else {
1746           // Store relative to framepointer.
1747           MemOpChains2.push_back(
1748             DAG.getStore(Chain, dl, Arg, FIN,
1749                          PseudoSourceValue::getFixedStack(FI), 0));
1750         }            
1751       }
1752     }
1753
1754     if (!MemOpChains2.empty())
1755       Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other,
1756                           &MemOpChains2[0], MemOpChains2.size());
1757
1758     // Copy arguments to their registers.
1759     for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i) {
1760       Chain = DAG.getCopyToReg(Chain, dl, RegsToPass[i].first, 
1761                                RegsToPass[i].second, InFlag);
1762       InFlag = Chain.getValue(1);
1763     }
1764     InFlag =SDValue();
1765
1766     // Store the return address to the appropriate stack slot.
1767     Chain = EmitTailCallStoreRetAddr(DAG, MF, Chain, RetAddrFrIdx, Is64Bit,
1768                                      FPDiff, dl);
1769   }
1770
1771   // If the callee is a GlobalAddress node (quite common, every direct call is)
1772   // turn it into a TargetGlobalAddress node so that legalize doesn't hack it.
1773   if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee)) {
1774     // We should use extra load for direct calls to dllimported functions in
1775     // non-JIT mode.
1776     if (!Subtarget->GVRequiresExtraLoad(G->getGlobal(),
1777                                         getTargetMachine(), true))
1778       Callee = DAG.getTargetGlobalAddress(G->getGlobal(), getPointerTy(),
1779                                           G->getOffset());
1780   } else if (ExternalSymbolSDNode *S = dyn_cast<ExternalSymbolSDNode>(Callee)) {
1781     Callee = DAG.getTargetExternalSymbol(S->getSymbol(), getPointerTy());
1782   } else if (IsTailCall) {
1783     unsigned Opc = Is64Bit ? X86::R9 : X86::EAX;
1784
1785     Chain = DAG.getCopyToReg(Chain,  dl,
1786                              DAG.getRegister(Opc, getPointerTy()), 
1787                              Callee,InFlag);
1788     Callee = DAG.getRegister(Opc, getPointerTy());
1789     // Add register as live out.
1790     DAG.getMachineFunction().getRegInfo().addLiveOut(Opc);
1791   }
1792  
1793   // Returns a chain & a flag for retval copy to use.
1794   SDVTList NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
1795   SmallVector<SDValue, 8> Ops;
1796
1797   if (IsTailCall) {
1798     Chain = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(NumBytes, true),
1799                            DAG.getIntPtrConstant(0, true), InFlag);
1800     InFlag = Chain.getValue(1);
1801  
1802     // Returns a chain & a flag for retval copy to use.
1803     NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
1804     Ops.clear();
1805   }
1806   
1807   Ops.push_back(Chain);
1808   Ops.push_back(Callee);
1809
1810   if (IsTailCall)
1811     Ops.push_back(DAG.getConstant(FPDiff, MVT::i32));
1812
1813   // Add argument registers to the end of the list so that they are known live
1814   // into the call.
1815   for (unsigned i = 0, e = RegsToPass.size(); i != e; ++i)
1816     Ops.push_back(DAG.getRegister(RegsToPass[i].first,
1817                                   RegsToPass[i].second.getValueType()));
1818   
1819   // Add an implicit use GOT pointer in EBX.
1820   if (!IsTailCall && !Is64Bit &&
1821       getTargetMachine().getRelocationModel() == Reloc::PIC_ &&
1822       Subtarget->isPICStyleGOT())
1823     Ops.push_back(DAG.getRegister(X86::EBX, getPointerTy()));
1824
1825   // Add an implicit use of AL for x86 vararg functions.
1826   if (Is64Bit && isVarArg)
1827     Ops.push_back(DAG.getRegister(X86::AL, MVT::i8));
1828
1829   if (InFlag.getNode())
1830     Ops.push_back(InFlag);
1831
1832   if (IsTailCall) {
1833     assert(InFlag.getNode() && 
1834            "Flag must be set. Depend on flag being set in LowerRET");
1835     Chain = DAG.getNode(X86ISD::TAILCALL, dl,
1836                         TheCall->getVTList(), &Ops[0], Ops.size());
1837       
1838     return SDValue(Chain.getNode(), Op.getResNo());
1839   }
1840
1841   Chain = DAG.getNode(X86ISD::CALL, dl, NodeTys, &Ops[0], Ops.size());
1842   InFlag = Chain.getValue(1);
1843
1844   // Create the CALLSEQ_END node.
1845   unsigned NumBytesForCalleeToPush;
1846   if (IsCalleePop(isVarArg, CC))
1847     NumBytesForCalleeToPush = NumBytes;    // Callee pops everything
1848   else if (!Is64Bit && CC != CallingConv::Fast && IsStructRet)
1849     // If this is is a call to a struct-return function, the callee
1850     // pops the hidden struct pointer, so we have to push it back.
1851     // This is common for Darwin/X86, Linux & Mingw32 targets.
1852     NumBytesForCalleeToPush = 4;
1853   else
1854     NumBytesForCalleeToPush = 0;  // Callee pops nothing.
1855   
1856   // Returns a flag for retval copy to use.
1857   Chain = DAG.getCALLSEQ_END(Chain,
1858                              DAG.getIntPtrConstant(NumBytes, true),
1859                              DAG.getIntPtrConstant(NumBytesForCalleeToPush,
1860                                                    true),
1861                              InFlag);
1862   InFlag = Chain.getValue(1);
1863
1864   // Handle result values, copying them out of physregs into vregs that we
1865   // return.
1866   return SDValue(LowerCallResult(Chain, InFlag, TheCall, CC, DAG),
1867                  Op.getResNo());
1868 }
1869
1870
1871 //===----------------------------------------------------------------------===//
1872 //                Fast Calling Convention (tail call) implementation
1873 //===----------------------------------------------------------------------===//
1874
1875 //  Like std call, callee cleans arguments, convention except that ECX is
1876 //  reserved for storing the tail called function address. Only 2 registers are
1877 //  free for argument passing (inreg). Tail call optimization is performed
1878 //  provided:
1879 //                * tailcallopt is enabled
1880 //                * caller/callee are fastcc
1881 //  On X86_64 architecture with GOT-style position independent code only local
1882 //  (within module) calls are supported at the moment.
1883 //  To keep the stack aligned according to platform abi the function
1884 //  GetAlignedArgumentStackSize ensures that argument delta is always multiples
1885 //  of stack alignment. (Dynamic linkers need this - darwin's dyld for example)
1886 //  If a tail called function callee has more arguments than the caller the
1887 //  caller needs to make sure that there is room to move the RETADDR to. This is
1888 //  achieved by reserving an area the size of the argument delta right after the
1889 //  original REtADDR, but before the saved framepointer or the spilled registers
1890 //  e.g. caller(arg1, arg2) calls callee(arg1, arg2,arg3,arg4)
1891 //  stack layout:
1892 //    arg1
1893 //    arg2
1894 //    RETADDR
1895 //    [ new RETADDR 
1896 //      move area ]
1897 //    (possible EBP)
1898 //    ESI
1899 //    EDI
1900 //    local1 ..
1901
1902 /// GetAlignedArgumentStackSize - Make the stack size align e.g 16n + 12 aligned
1903 /// for a 16 byte align requirement.
1904 unsigned X86TargetLowering::GetAlignedArgumentStackSize(unsigned StackSize, 
1905                                                         SelectionDAG& DAG) {
1906   MachineFunction &MF = DAG.getMachineFunction();
1907   const TargetMachine &TM = MF.getTarget();
1908   const TargetFrameInfo &TFI = *TM.getFrameInfo();
1909   unsigned StackAlignment = TFI.getStackAlignment();
1910   uint64_t AlignMask = StackAlignment - 1; 
1911   int64_t Offset = StackSize;
1912   uint64_t SlotSize = TD->getPointerSize();
1913   if ( (Offset & AlignMask) <= (StackAlignment - SlotSize) ) {
1914     // Number smaller than 12 so just add the difference.
1915     Offset += ((StackAlignment - SlotSize) - (Offset & AlignMask));
1916   } else {
1917     // Mask out lower bits, add stackalignment once plus the 12 bytes.
1918     Offset = ((~AlignMask) & Offset) + StackAlignment + 
1919       (StackAlignment-SlotSize);
1920   }
1921   return Offset;
1922 }
1923
1924 /// IsEligibleForTailCallElimination - Check to see whether the next instruction
1925 /// following the call is a return. A function is eligible if caller/callee
1926 /// calling conventions match, currently only fastcc supports tail calls, and
1927 /// the function CALL is immediatly followed by a RET.
1928 bool X86TargetLowering::IsEligibleForTailCallOptimization(CallSDNode *TheCall,
1929                                                       SDValue Ret,
1930                                                       SelectionDAG& DAG) const {
1931   if (!PerformTailCallOpt)
1932     return false;
1933
1934   if (CheckTailCallReturnConstraints(TheCall, Ret)) {
1935     MachineFunction &MF = DAG.getMachineFunction();
1936     unsigned CallerCC = MF.getFunction()->getCallingConv();
1937     unsigned CalleeCC= TheCall->getCallingConv();
1938     if (CalleeCC == CallingConv::Fast && CallerCC == CalleeCC) {
1939       SDValue Callee = TheCall->getCallee();
1940       // On x86/32Bit PIC/GOT  tail calls are supported.
1941       if (getTargetMachine().getRelocationModel() != Reloc::PIC_ ||
1942           !Subtarget->isPICStyleGOT()|| !Subtarget->is64Bit())
1943         return true;
1944
1945       // Can only do local tail calls (in same module, hidden or protected) on
1946       // x86_64 PIC/GOT at the moment.
1947       if (GlobalAddressSDNode *G = dyn_cast<GlobalAddressSDNode>(Callee))
1948         return G->getGlobal()->hasHiddenVisibility()
1949             || G->getGlobal()->hasProtectedVisibility();
1950     }
1951   }
1952
1953   return false;
1954 }
1955
1956 FastISel *
1957 X86TargetLowering::createFastISel(MachineFunction &mf,
1958                                   MachineModuleInfo *mmo,
1959                                   DwarfWriter *dw,
1960                                   DenseMap<const Value *, unsigned> &vm,
1961                                   DenseMap<const BasicBlock *,
1962                                            MachineBasicBlock *> &bm,
1963                                   DenseMap<const AllocaInst *, int> &am
1964 #ifndef NDEBUG
1965                                   , SmallSet<Instruction*, 8> &cil
1966 #endif
1967                                   ) {
1968   return X86::createFastISel(mf, mmo, dw, vm, bm, am
1969 #ifndef NDEBUG
1970                              , cil
1971 #endif
1972                              );
1973 }
1974
1975
1976 //===----------------------------------------------------------------------===//
1977 //                           Other Lowering Hooks
1978 //===----------------------------------------------------------------------===//
1979
1980
1981 SDValue X86TargetLowering::getReturnAddressFrameIndex(SelectionDAG &DAG) {
1982   MachineFunction &MF = DAG.getMachineFunction();
1983   X86MachineFunctionInfo *FuncInfo = MF.getInfo<X86MachineFunctionInfo>();
1984   int ReturnAddrIndex = FuncInfo->getRAIndex();
1985
1986   if (ReturnAddrIndex == 0) {
1987     // Set up a frame object for the return address.
1988     uint64_t SlotSize = TD->getPointerSize();
1989     ReturnAddrIndex = MF.getFrameInfo()->CreateFixedObject(SlotSize, -SlotSize);
1990     FuncInfo->setRAIndex(ReturnAddrIndex);
1991   }
1992
1993   return DAG.getFrameIndex(ReturnAddrIndex, getPointerTy());
1994 }
1995
1996
1997 /// TranslateX86CC - do a one to one translation of a ISD::CondCode to the X86
1998 /// specific condition code, returning the condition code and the LHS/RHS of the
1999 /// comparison to make.
2000 static unsigned TranslateX86CC(ISD::CondCode SetCCOpcode, bool isFP,
2001                                SDValue &LHS, SDValue &RHS, SelectionDAG &DAG) {
2002   if (!isFP) {
2003     if (ConstantSDNode *RHSC = dyn_cast<ConstantSDNode>(RHS)) {
2004       if (SetCCOpcode == ISD::SETGT && RHSC->isAllOnesValue()) {
2005         // X > -1   -> X == 0, jump !sign.
2006         RHS = DAG.getConstant(0, RHS.getValueType());
2007         return X86::COND_NS;
2008       } else if (SetCCOpcode == ISD::SETLT && RHSC->isNullValue()) {
2009         // X < 0   -> X == 0, jump on sign.
2010         return X86::COND_S;
2011       } else if (SetCCOpcode == ISD::SETLT && RHSC->getZExtValue() == 1) {
2012         // X < 1   -> X <= 0
2013         RHS = DAG.getConstant(0, RHS.getValueType());
2014         return X86::COND_LE;
2015       }
2016     }
2017
2018     switch (SetCCOpcode) {
2019     default: assert(0 && "Invalid integer condition!");
2020     case ISD::SETEQ:  return X86::COND_E;
2021     case ISD::SETGT:  return X86::COND_G;
2022     case ISD::SETGE:  return X86::COND_GE;
2023     case ISD::SETLT:  return X86::COND_L;
2024     case ISD::SETLE:  return X86::COND_LE;
2025     case ISD::SETNE:  return X86::COND_NE;
2026     case ISD::SETULT: return X86::COND_B;
2027     case ISD::SETUGT: return X86::COND_A;
2028     case ISD::SETULE: return X86::COND_BE;
2029     case ISD::SETUGE: return X86::COND_AE;
2030     }
2031   }
2032   
2033   // First determine if it is required or is profitable to flip the operands.
2034
2035   // If LHS is a foldable load, but RHS is not, flip the condition.
2036   if ((ISD::isNON_EXTLoad(LHS.getNode()) && LHS.hasOneUse()) &&
2037       !(ISD::isNON_EXTLoad(RHS.getNode()) && RHS.hasOneUse())) {
2038     SetCCOpcode = getSetCCSwappedOperands(SetCCOpcode);
2039     std::swap(LHS, RHS);
2040   }
2041
2042   switch (SetCCOpcode) {
2043   default: break;
2044   case ISD::SETOLT:
2045   case ISD::SETOLE:
2046   case ISD::SETUGT:
2047   case ISD::SETUGE:
2048     std::swap(LHS, RHS);
2049     break;
2050   }
2051
2052   // On a floating point condition, the flags are set as follows:
2053   // ZF  PF  CF   op
2054   //  0 | 0 | 0 | X > Y
2055   //  0 | 0 | 1 | X < Y
2056   //  1 | 0 | 0 | X == Y
2057   //  1 | 1 | 1 | unordered
2058   switch (SetCCOpcode) {
2059   default: assert(0 && "Condcode should be pre-legalized away");
2060   case ISD::SETUEQ:
2061   case ISD::SETEQ:   return X86::COND_E;
2062   case ISD::SETOLT:              // flipped
2063   case ISD::SETOGT:
2064   case ISD::SETGT:   return X86::COND_A;
2065   case ISD::SETOLE:              // flipped
2066   case ISD::SETOGE:
2067   case ISD::SETGE:   return X86::COND_AE;
2068   case ISD::SETUGT:              // flipped
2069   case ISD::SETULT:
2070   case ISD::SETLT:   return X86::COND_B;
2071   case ISD::SETUGE:              // flipped
2072   case ISD::SETULE:
2073   case ISD::SETLE:   return X86::COND_BE;
2074   case ISD::SETONE:
2075   case ISD::SETNE:   return X86::COND_NE;
2076   case ISD::SETUO:   return X86::COND_P;
2077   case ISD::SETO:    return X86::COND_NP;
2078   }
2079 }
2080
2081 /// hasFPCMov - is there a floating point cmov for the specific X86 condition
2082 /// code. Current x86 isa includes the following FP cmov instructions:
2083 /// fcmovb, fcomvbe, fcomve, fcmovu, fcmovae, fcmova, fcmovne, fcmovnu.
2084 static bool hasFPCMov(unsigned X86CC) {
2085   switch (X86CC) {
2086   default:
2087     return false;
2088   case X86::COND_B:
2089   case X86::COND_BE:
2090   case X86::COND_E:
2091   case X86::COND_P:
2092   case X86::COND_A:
2093   case X86::COND_AE:
2094   case X86::COND_NE:
2095   case X86::COND_NP:
2096     return true;
2097   }
2098 }
2099
2100 /// isUndefOrInRange - Op is either an undef node or a ConstantSDNode.  Return
2101 /// true if Op is undef or if its value falls within the specified range (L, H].
2102 static bool isUndefOrInRange(SDValue Op, unsigned Low, unsigned Hi) {
2103   if (Op.getOpcode() == ISD::UNDEF)
2104     return true;
2105
2106   unsigned Val = cast<ConstantSDNode>(Op)->getZExtValue();
2107   return (Val >= Low && Val < Hi);
2108 }
2109
2110 /// isUndefOrEqual - Op is either an undef node or a ConstantSDNode.  Return
2111 /// true if Op is undef or if its value equal to the specified value.
2112 static bool isUndefOrEqual(SDValue Op, unsigned Val) {
2113   if (Op.getOpcode() == ISD::UNDEF)
2114     return true;
2115   return cast<ConstantSDNode>(Op)->getZExtValue() == Val;
2116 }
2117
2118 /// isPSHUFDMask - Return true if the specified VECTOR_SHUFFLE operand
2119 /// specifies a shuffle of elements that is suitable for input to PSHUFD.
2120 bool X86::isPSHUFDMask(SDNode *N) {
2121   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2122
2123   if (N->getNumOperands() != 2 && N->getNumOperands() != 4)
2124     return false;
2125
2126   // Check if the value doesn't reference the second vector.
2127   for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
2128     SDValue Arg = N->getOperand(i);
2129     if (Arg.getOpcode() == ISD::UNDEF) continue;
2130     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2131     if (cast<ConstantSDNode>(Arg)->getZExtValue() >= e)
2132       return false;
2133   }
2134
2135   return true;
2136 }
2137
2138 /// isPSHUFHWMask - Return true if the specified VECTOR_SHUFFLE operand
2139 /// specifies a shuffle of elements that is suitable for input to PSHUFHW.
2140 bool X86::isPSHUFHWMask(SDNode *N) {
2141   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2142
2143   if (N->getNumOperands() != 8)
2144     return false;
2145
2146   // Lower quadword copied in order.
2147   for (unsigned i = 0; i != 4; ++i) {
2148     SDValue Arg = N->getOperand(i);
2149     if (Arg.getOpcode() == ISD::UNDEF) continue;
2150     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2151     if (cast<ConstantSDNode>(Arg)->getZExtValue() != i)
2152       return false;
2153   }
2154
2155   // Upper quadword shuffled.
2156   for (unsigned i = 4; i != 8; ++i) {
2157     SDValue Arg = N->getOperand(i);
2158     if (Arg.getOpcode() == ISD::UNDEF) continue;
2159     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2160     unsigned Val = cast<ConstantSDNode>(Arg)->getZExtValue();
2161     if (Val < 4 || Val > 7)
2162       return false;
2163   }
2164
2165   return true;
2166 }
2167
2168 /// isPSHUFLWMask - Return true if the specified VECTOR_SHUFFLE operand
2169 /// specifies a shuffle of elements that is suitable for input to PSHUFLW.
2170 bool X86::isPSHUFLWMask(SDNode *N) {
2171   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2172
2173   if (N->getNumOperands() != 8)
2174     return false;
2175
2176   // Upper quadword copied in order.
2177   for (unsigned i = 4; i != 8; ++i)
2178     if (!isUndefOrEqual(N->getOperand(i), i))
2179       return false;
2180
2181   // Lower quadword shuffled.
2182   for (unsigned i = 0; i != 4; ++i)
2183     if (!isUndefOrInRange(N->getOperand(i), 0, 4))
2184       return false;
2185
2186   return true;
2187 }
2188
2189 /// isSHUFPMask - Return true if the specified VECTOR_SHUFFLE operand
2190 /// specifies a shuffle of elements that is suitable for input to SHUFP*.
2191 template<class SDOperand>
2192 static bool isSHUFPMask(SDOperand *Elems, unsigned NumElems) {
2193   if (NumElems != 2 && NumElems != 4) return false;
2194
2195   unsigned Half = NumElems / 2;
2196   for (unsigned i = 0; i < Half; ++i)
2197     if (!isUndefOrInRange(Elems[i], 0, NumElems))
2198       return false;
2199   for (unsigned i = Half; i < NumElems; ++i)
2200     if (!isUndefOrInRange(Elems[i], NumElems, NumElems*2))
2201       return false;
2202
2203   return true;
2204 }
2205
2206 bool X86::isSHUFPMask(SDNode *N) {
2207   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2208   return ::isSHUFPMask(N->op_begin(), N->getNumOperands());
2209 }
2210
2211 /// isCommutedSHUFP - Returns true if the shuffle mask is exactly
2212 /// the reverse of what x86 shuffles want. x86 shuffles requires the lower
2213 /// half elements to come from vector 1 (which would equal the dest.) and
2214 /// the upper half to come from vector 2.
2215 template<class SDOperand>
2216 static bool isCommutedSHUFP(SDOperand *Ops, unsigned NumOps) {
2217   if (NumOps != 2 && NumOps != 4) return false;
2218
2219   unsigned Half = NumOps / 2;
2220   for (unsigned i = 0; i < Half; ++i)
2221     if (!isUndefOrInRange(Ops[i], NumOps, NumOps*2))
2222       return false;
2223   for (unsigned i = Half; i < NumOps; ++i)
2224     if (!isUndefOrInRange(Ops[i], 0, NumOps))
2225       return false;
2226   return true;
2227 }
2228
2229 static bool isCommutedSHUFP(SDNode *N) {
2230   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2231   return isCommutedSHUFP(N->op_begin(), N->getNumOperands());
2232 }
2233
2234 /// isMOVHLPSMask - Return true if the specified VECTOR_SHUFFLE operand
2235 /// specifies a shuffle of elements that is suitable for input to MOVHLPS.
2236 bool X86::isMOVHLPSMask(SDNode *N) {
2237   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2238
2239   if (N->getNumOperands() != 4)
2240     return false;
2241
2242   // Expect bit0 == 6, bit1 == 7, bit2 == 2, bit3 == 3
2243   return isUndefOrEqual(N->getOperand(0), 6) &&
2244          isUndefOrEqual(N->getOperand(1), 7) &&
2245          isUndefOrEqual(N->getOperand(2), 2) &&
2246          isUndefOrEqual(N->getOperand(3), 3);
2247 }
2248
2249 /// isMOVHLPS_v_undef_Mask - Special case of isMOVHLPSMask for canonical form
2250 /// of vector_shuffle v, v, <2, 3, 2, 3>, i.e. vector_shuffle v, undef,
2251 /// <2, 3, 2, 3>
2252 bool X86::isMOVHLPS_v_undef_Mask(SDNode *N) {
2253   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2254
2255   if (N->getNumOperands() != 4)
2256     return false;
2257
2258   // Expect bit0 == 2, bit1 == 3, bit2 == 2, bit3 == 3
2259   return isUndefOrEqual(N->getOperand(0), 2) &&
2260          isUndefOrEqual(N->getOperand(1), 3) &&
2261          isUndefOrEqual(N->getOperand(2), 2) &&
2262          isUndefOrEqual(N->getOperand(3), 3);
2263 }
2264
2265 /// isMOVLPMask - Return true if the specified VECTOR_SHUFFLE operand
2266 /// specifies a shuffle of elements that is suitable for input to MOVLP{S|D}.
2267 bool X86::isMOVLPMask(SDNode *N) {
2268   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2269
2270   unsigned NumElems = N->getNumOperands();
2271   if (NumElems != 2 && NumElems != 4)
2272     return false;
2273
2274   for (unsigned i = 0; i < NumElems/2; ++i)
2275     if (!isUndefOrEqual(N->getOperand(i), i + NumElems))
2276       return false;
2277
2278   for (unsigned i = NumElems/2; i < NumElems; ++i)
2279     if (!isUndefOrEqual(N->getOperand(i), i))
2280       return false;
2281
2282   return true;
2283 }
2284
2285 /// isMOVHPMask - Return true if the specified VECTOR_SHUFFLE operand
2286 /// specifies a shuffle of elements that is suitable for input to MOVHP{S|D}
2287 /// and MOVLHPS.
2288 bool X86::isMOVHPMask(SDNode *N) {
2289   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2290
2291   unsigned NumElems = N->getNumOperands();
2292   if (NumElems != 2 && NumElems != 4)
2293     return false;
2294
2295   for (unsigned i = 0; i < NumElems/2; ++i)
2296     if (!isUndefOrEqual(N->getOperand(i), i))
2297       return false;
2298
2299   for (unsigned i = 0; i < NumElems/2; ++i) {
2300     SDValue Arg = N->getOperand(i + NumElems/2);
2301     if (!isUndefOrEqual(Arg, i + NumElems))
2302       return false;
2303   }
2304
2305   return true;
2306 }
2307
2308 /// isUNPCKLMask - Return true if the specified VECTOR_SHUFFLE operand
2309 /// specifies a shuffle of elements that is suitable for input to UNPCKL.
2310 template<class SDOperand>
2311 bool static isUNPCKLMask(SDOperand *Elts, unsigned NumElts,
2312                          bool V2IsSplat = false) {
2313   if (NumElts != 2 && NumElts != 4 && NumElts != 8 && NumElts != 16)
2314     return false;
2315
2316   for (unsigned i = 0, j = 0; i != NumElts; i += 2, ++j) {
2317     SDValue BitI  = Elts[i];
2318     SDValue BitI1 = Elts[i+1];
2319     if (!isUndefOrEqual(BitI, j))
2320       return false;
2321     if (V2IsSplat) {
2322       if (!isUndefOrEqual(BitI1, NumElts))
2323         return false;
2324     } else {
2325       if (!isUndefOrEqual(BitI1, j + NumElts))
2326         return false;
2327     }
2328   }
2329
2330   return true;
2331 }
2332
2333 bool X86::isUNPCKLMask(SDNode *N, bool V2IsSplat) {
2334   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2335   return ::isUNPCKLMask(N->op_begin(), N->getNumOperands(), V2IsSplat);
2336 }
2337
2338 /// isUNPCKHMask - Return true if the specified VECTOR_SHUFFLE operand
2339 /// specifies a shuffle of elements that is suitable for input to UNPCKH.
2340 template<class SDOperand>
2341 bool static isUNPCKHMask(SDOperand *Elts, unsigned NumElts,
2342                          bool V2IsSplat = false) {
2343   if (NumElts != 2 && NumElts != 4 && NumElts != 8 && NumElts != 16)
2344     return false;
2345
2346   for (unsigned i = 0, j = 0; i != NumElts; i += 2, ++j) {
2347     SDValue BitI  = Elts[i];
2348     SDValue BitI1 = Elts[i+1];
2349     if (!isUndefOrEqual(BitI, j + NumElts/2))
2350       return false;
2351     if (V2IsSplat) {
2352       if (isUndefOrEqual(BitI1, NumElts))
2353         return false;
2354     } else {
2355       if (!isUndefOrEqual(BitI1, j + NumElts/2 + NumElts))
2356         return false;
2357     }
2358   }
2359
2360   return true;
2361 }
2362
2363 bool X86::isUNPCKHMask(SDNode *N, bool V2IsSplat) {
2364   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2365   return ::isUNPCKHMask(N->op_begin(), N->getNumOperands(), V2IsSplat);
2366 }
2367
2368 /// isUNPCKL_v_undef_Mask - Special case of isUNPCKLMask for canonical form
2369 /// of vector_shuffle v, v, <0, 4, 1, 5>, i.e. vector_shuffle v, undef,
2370 /// <0, 0, 1, 1>
2371 bool X86::isUNPCKL_v_undef_Mask(SDNode *N) {
2372   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2373
2374   unsigned NumElems = N->getNumOperands();
2375   if (NumElems != 2 && NumElems != 4 && NumElems != 8 && NumElems != 16)
2376     return false;
2377
2378   for (unsigned i = 0, j = 0; i != NumElems; i += 2, ++j) {
2379     SDValue BitI  = N->getOperand(i);
2380     SDValue BitI1 = N->getOperand(i+1);
2381
2382     if (!isUndefOrEqual(BitI, j))
2383       return false;
2384     if (!isUndefOrEqual(BitI1, j))
2385       return false;
2386   }
2387
2388   return true;
2389 }
2390
2391 /// isUNPCKH_v_undef_Mask - Special case of isUNPCKHMask for canonical form
2392 /// of vector_shuffle v, v, <2, 6, 3, 7>, i.e. vector_shuffle v, undef,
2393 /// <2, 2, 3, 3>
2394 bool X86::isUNPCKH_v_undef_Mask(SDNode *N) {
2395   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2396
2397   unsigned NumElems = N->getNumOperands();
2398   if (NumElems != 2 && NumElems != 4 && NumElems != 8 && NumElems != 16)
2399     return false;
2400
2401   for (unsigned i = 0, j = NumElems / 2; i != NumElems; i += 2, ++j) {
2402     SDValue BitI  = N->getOperand(i);
2403     SDValue BitI1 = N->getOperand(i + 1);
2404
2405     if (!isUndefOrEqual(BitI, j))
2406       return false;
2407     if (!isUndefOrEqual(BitI1, j))
2408       return false;
2409   }
2410
2411   return true;
2412 }
2413
2414 /// isMOVLMask - Return true if the specified VECTOR_SHUFFLE operand
2415 /// specifies a shuffle of elements that is suitable for input to MOVSS,
2416 /// MOVSD, and MOVD, i.e. setting the lowest element.
2417 template<class SDOperand>
2418 static bool isMOVLMask(SDOperand *Elts, unsigned NumElts) {
2419   if (NumElts != 2 && NumElts != 4)
2420     return false;
2421
2422   if (!isUndefOrEqual(Elts[0], NumElts))
2423     return false;
2424
2425   for (unsigned i = 1; i < NumElts; ++i) {
2426     if (!isUndefOrEqual(Elts[i], i))
2427       return false;
2428   }
2429
2430   return true;
2431 }
2432
2433 bool X86::isMOVLMask(SDNode *N) {
2434   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2435   return ::isMOVLMask(N->op_begin(), N->getNumOperands());
2436 }
2437
2438 /// isCommutedMOVL - Returns true if the shuffle mask is except the reverse
2439 /// of what x86 movss want. X86 movs requires the lowest  element to be lowest
2440 /// element of vector 2 and the other elements to come from vector 1 in order.
2441 template<class SDOperand>
2442 static bool isCommutedMOVL(SDOperand *Ops, unsigned NumOps,
2443                            bool V2IsSplat = false,
2444                            bool V2IsUndef = false) {
2445   if (NumOps != 2 && NumOps != 4 && NumOps != 8 && NumOps != 16)
2446     return false;
2447
2448   if (!isUndefOrEqual(Ops[0], 0))
2449     return false;
2450
2451   for (unsigned i = 1; i < NumOps; ++i) {
2452     SDValue Arg = Ops[i];
2453     if (!(isUndefOrEqual(Arg, i+NumOps) ||
2454           (V2IsUndef && isUndefOrInRange(Arg, NumOps, NumOps*2)) ||
2455           (V2IsSplat && isUndefOrEqual(Arg, NumOps))))
2456       return false;
2457   }
2458
2459   return true;
2460 }
2461
2462 static bool isCommutedMOVL(SDNode *N, bool V2IsSplat = false,
2463                            bool V2IsUndef = false) {
2464   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2465   return isCommutedMOVL(N->op_begin(), N->getNumOperands(),
2466                         V2IsSplat, V2IsUndef);
2467 }
2468
2469 /// isMOVSHDUPMask - Return true if the specified VECTOR_SHUFFLE operand
2470 /// specifies a shuffle of elements that is suitable for input to MOVSHDUP.
2471 bool X86::isMOVSHDUPMask(SDNode *N) {
2472   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2473
2474   if (N->getNumOperands() != 4)
2475     return false;
2476
2477   // Expect 1, 1, 3, 3
2478   for (unsigned i = 0; i < 2; ++i) {
2479     SDValue Arg = N->getOperand(i);
2480     if (Arg.getOpcode() == ISD::UNDEF) continue;
2481     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2482     unsigned Val = cast<ConstantSDNode>(Arg)->getZExtValue();
2483     if (Val != 1) return false;
2484   }
2485
2486   bool HasHi = false;
2487   for (unsigned i = 2; i < 4; ++i) {
2488     SDValue Arg = N->getOperand(i);
2489     if (Arg.getOpcode() == ISD::UNDEF) continue;
2490     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2491     unsigned Val = cast<ConstantSDNode>(Arg)->getZExtValue();
2492     if (Val != 3) return false;
2493     HasHi = true;
2494   }
2495
2496   // Don't use movshdup if it can be done with a shufps.
2497   return HasHi;
2498 }
2499
2500 /// isMOVSLDUPMask - Return true if the specified VECTOR_SHUFFLE operand
2501 /// specifies a shuffle of elements that is suitable for input to MOVSLDUP.
2502 bool X86::isMOVSLDUPMask(SDNode *N) {
2503   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2504
2505   if (N->getNumOperands() != 4)
2506     return false;
2507
2508   // Expect 0, 0, 2, 2
2509   for (unsigned i = 0; i < 2; ++i) {
2510     SDValue Arg = N->getOperand(i);
2511     if (Arg.getOpcode() == ISD::UNDEF) continue;
2512     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2513     unsigned Val = cast<ConstantSDNode>(Arg)->getZExtValue();
2514     if (Val != 0) return false;
2515   }
2516
2517   bool HasHi = false;
2518   for (unsigned i = 2; i < 4; ++i) {
2519     SDValue Arg = N->getOperand(i);
2520     if (Arg.getOpcode() == ISD::UNDEF) continue;
2521     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2522     unsigned Val = cast<ConstantSDNode>(Arg)->getZExtValue();
2523     if (Val != 2) return false;
2524     HasHi = true;
2525   }
2526
2527   // Don't use movshdup if it can be done with a shufps.
2528   return HasHi;
2529 }
2530
2531 /// isIdentityMask - Return true if the specified VECTOR_SHUFFLE operand
2532 /// specifies a identity operation on the LHS or RHS.
2533 static bool isIdentityMask(SDNode *N, bool RHS = false) {
2534   unsigned NumElems = N->getNumOperands();
2535   for (unsigned i = 0; i < NumElems; ++i)
2536     if (!isUndefOrEqual(N->getOperand(i), i + (RHS ? NumElems : 0)))
2537       return false;
2538   return true;
2539 }
2540
2541 /// isSplatMask - Return true if the specified VECTOR_SHUFFLE operand specifies
2542 /// a splat of a single element.
2543 static bool isSplatMask(SDNode *N) {
2544   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2545
2546   // This is a splat operation if each element of the permute is the same, and
2547   // if the value doesn't reference the second vector.
2548   unsigned NumElems = N->getNumOperands();
2549   SDValue ElementBase;
2550   unsigned i = 0;
2551   for (; i != NumElems; ++i) {
2552     SDValue Elt = N->getOperand(i);
2553     if (isa<ConstantSDNode>(Elt)) {
2554       ElementBase = Elt;
2555       break;
2556     }
2557   }
2558
2559   if (!ElementBase.getNode())
2560     return false;
2561
2562   for (; i != NumElems; ++i) {
2563     SDValue Arg = N->getOperand(i);
2564     if (Arg.getOpcode() == ISD::UNDEF) continue;
2565     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2566     if (Arg != ElementBase) return false;
2567   }
2568
2569   // Make sure it is a splat of the first vector operand.
2570   return cast<ConstantSDNode>(ElementBase)->getZExtValue() < NumElems;
2571 }
2572
2573 /// getSplatMaskEltNo - Given a splat mask, return the index to the element
2574 /// we want to splat.
2575 static SDValue getSplatMaskEltNo(SDNode *N) {
2576   assert(isSplatMask(N) && "Not a splat mask");
2577   unsigned NumElems = N->getNumOperands();
2578   SDValue ElementBase;
2579   unsigned i = 0;
2580   for (; i != NumElems; ++i) {
2581     SDValue Elt = N->getOperand(i);
2582     if (isa<ConstantSDNode>(Elt))
2583       return Elt;
2584   }
2585   assert(0 && " No splat value found!");
2586   return SDValue();
2587 }
2588
2589
2590 /// isSplatMask - Return true if the specified VECTOR_SHUFFLE operand specifies
2591 /// a splat of a single element and it's a 2 or 4 element mask.
2592 bool X86::isSplatMask(SDNode *N) {
2593   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2594
2595   // We can only splat 64-bit, and 32-bit quantities with a single instruction.
2596   if (N->getNumOperands() != 4 && N->getNumOperands() != 2)
2597     return false;
2598   return ::isSplatMask(N);
2599 }
2600
2601 /// isSplatLoMask - Return true if the specified VECTOR_SHUFFLE operand
2602 /// specifies a splat of zero element.
2603 bool X86::isSplatLoMask(SDNode *N) {
2604   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2605
2606   for (unsigned i = 0, e = N->getNumOperands(); i < e; ++i)
2607     if (!isUndefOrEqual(N->getOperand(i), 0))
2608       return false;
2609   return true;
2610 }
2611
2612 /// isMOVDDUPMask - Return true if the specified VECTOR_SHUFFLE operand
2613 /// specifies a shuffle of elements that is suitable for input to MOVDDUP.
2614 bool X86::isMOVDDUPMask(SDNode *N) {
2615   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2616
2617   unsigned e = N->getNumOperands() / 2;
2618   for (unsigned i = 0; i < e; ++i)
2619     if (!isUndefOrEqual(N->getOperand(i), i))
2620       return false;
2621   for (unsigned i = 0; i < e; ++i)
2622     if (!isUndefOrEqual(N->getOperand(e+i), i))
2623       return false;
2624   return true;
2625 }
2626
2627 /// getShuffleSHUFImmediate - Return the appropriate immediate to shuffle
2628 /// the specified isShuffleMask VECTOR_SHUFFLE mask with PSHUF* and SHUFP*
2629 /// instructions.
2630 unsigned X86::getShuffleSHUFImmediate(SDNode *N) {
2631   unsigned NumOperands = N->getNumOperands();
2632   unsigned Shift = (NumOperands == 4) ? 2 : 1;
2633   unsigned Mask = 0;
2634   for (unsigned i = 0; i < NumOperands; ++i) {
2635     unsigned Val = 0;
2636     SDValue Arg = N->getOperand(NumOperands-i-1);
2637     if (Arg.getOpcode() != ISD::UNDEF)
2638       Val = cast<ConstantSDNode>(Arg)->getZExtValue();
2639     if (Val >= NumOperands) Val -= NumOperands;
2640     Mask |= Val;
2641     if (i != NumOperands - 1)
2642       Mask <<= Shift;
2643   }
2644
2645   return Mask;
2646 }
2647
2648 /// getShufflePSHUFHWImmediate - Return the appropriate immediate to shuffle
2649 /// the specified isShuffleMask VECTOR_SHUFFLE mask with PSHUFHW
2650 /// instructions.
2651 unsigned X86::getShufflePSHUFHWImmediate(SDNode *N) {
2652   unsigned Mask = 0;
2653   // 8 nodes, but we only care about the last 4.
2654   for (unsigned i = 7; i >= 4; --i) {
2655     unsigned Val = 0;
2656     SDValue Arg = N->getOperand(i);
2657     if (Arg.getOpcode() != ISD::UNDEF) {
2658       Val = cast<ConstantSDNode>(Arg)->getZExtValue();
2659       Mask |= (Val - 4);
2660     }
2661     if (i != 4)
2662       Mask <<= 2;
2663   }
2664
2665   return Mask;
2666 }
2667
2668 /// getShufflePSHUFLWImmediate - Return the appropriate immediate to shuffle
2669 /// the specified isShuffleMask VECTOR_SHUFFLE mask with PSHUFLW
2670 /// instructions.
2671 unsigned X86::getShufflePSHUFLWImmediate(SDNode *N) {
2672   unsigned Mask = 0;
2673   // 8 nodes, but we only care about the first 4.
2674   for (int i = 3; i >= 0; --i) {
2675     unsigned Val = 0;
2676     SDValue Arg = N->getOperand(i);
2677     if (Arg.getOpcode() != ISD::UNDEF)
2678       Val = cast<ConstantSDNode>(Arg)->getZExtValue();
2679     Mask |= Val;
2680     if (i != 0)
2681       Mask <<= 2;
2682   }
2683
2684   return Mask;
2685 }
2686
2687 /// isPSHUFHW_PSHUFLWMask - true if the specified VECTOR_SHUFFLE operand
2688 /// specifies a 8 element shuffle that can be broken into a pair of
2689 /// PSHUFHW and PSHUFLW.
2690 static bool isPSHUFHW_PSHUFLWMask(SDNode *N) {
2691   assert(N->getOpcode() == ISD::BUILD_VECTOR);
2692
2693   if (N->getNumOperands() != 8)
2694     return false;
2695
2696   // Lower quadword shuffled.
2697   for (unsigned i = 0; i != 4; ++i) {
2698     SDValue Arg = N->getOperand(i);
2699     if (Arg.getOpcode() == ISD::UNDEF) continue;
2700     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2701     unsigned Val = cast<ConstantSDNode>(Arg)->getZExtValue();
2702     if (Val >= 4)
2703       return false;
2704   }
2705
2706   // Upper quadword shuffled.
2707   for (unsigned i = 4; i != 8; ++i) {
2708     SDValue Arg = N->getOperand(i);
2709     if (Arg.getOpcode() == ISD::UNDEF) continue;
2710     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2711     unsigned Val = cast<ConstantSDNode>(Arg)->getZExtValue();
2712     if (Val < 4 || Val > 7)
2713       return false;
2714   }
2715
2716   return true;
2717 }
2718
2719 /// CommuteVectorShuffle - Swap vector_shuffle operands as well as
2720 /// values in ther permute mask.
2721 static SDValue CommuteVectorShuffle(SDValue Op, SDValue &V1,
2722                                       SDValue &V2, SDValue &Mask,
2723                                       SelectionDAG &DAG) {
2724   MVT VT = Op.getValueType();
2725   MVT MaskVT = Mask.getValueType();
2726   MVT EltVT = MaskVT.getVectorElementType();
2727   unsigned NumElems = Mask.getNumOperands();
2728   SmallVector<SDValue, 8> MaskVec;
2729   DebugLoc dl = Op.getDebugLoc();
2730
2731   for (unsigned i = 0; i != NumElems; ++i) {
2732     SDValue Arg = Mask.getOperand(i);
2733     if (Arg.getOpcode() == ISD::UNDEF) {
2734       MaskVec.push_back(DAG.getUNDEF(EltVT));
2735       continue;
2736     }
2737     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2738     unsigned Val = cast<ConstantSDNode>(Arg)->getZExtValue();
2739     if (Val < NumElems)
2740       MaskVec.push_back(DAG.getConstant(Val + NumElems, EltVT));
2741     else
2742       MaskVec.push_back(DAG.getConstant(Val - NumElems, EltVT));
2743   }
2744
2745   std::swap(V1, V2);
2746   Mask = DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT, &MaskVec[0], NumElems);
2747   return DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, V1, V2, Mask);
2748 }
2749
2750 /// CommuteVectorShuffleMask - Change values in a shuffle permute mask assuming
2751 /// the two vector operands have swapped position.
2752 static
2753 SDValue CommuteVectorShuffleMask(SDValue Mask, SelectionDAG &DAG, DebugLoc dl) {
2754   MVT MaskVT = Mask.getValueType();
2755   MVT EltVT = MaskVT.getVectorElementType();
2756   unsigned NumElems = Mask.getNumOperands();
2757   SmallVector<SDValue, 8> MaskVec;
2758   for (unsigned i = 0; i != NumElems; ++i) {
2759     SDValue Arg = Mask.getOperand(i);
2760     if (Arg.getOpcode() == ISD::UNDEF) {
2761       MaskVec.push_back(DAG.getUNDEF(EltVT));
2762       continue;
2763     }
2764     assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!");
2765     unsigned Val = cast<ConstantSDNode>(Arg)->getZExtValue();
2766     if (Val < NumElems)
2767       MaskVec.push_back(DAG.getConstant(Val + NumElems, EltVT));
2768     else
2769       MaskVec.push_back(DAG.getConstant(Val - NumElems, EltVT));
2770   }
2771   return DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT, &MaskVec[0], NumElems);
2772 }
2773
2774
2775 /// ShouldXformToMOVHLPS - Return true if the node should be transformed to
2776 /// match movhlps. The lower half elements should come from upper half of
2777 /// V1 (and in order), and the upper half elements should come from the upper
2778 /// half of V2 (and in order).
2779 static bool ShouldXformToMOVHLPS(SDNode *Mask) {
2780   unsigned NumElems = Mask->getNumOperands();
2781   if (NumElems != 4)
2782     return false;
2783   for (unsigned i = 0, e = 2; i != e; ++i)
2784     if (!isUndefOrEqual(Mask->getOperand(i), i+2))
2785       return false;
2786   for (unsigned i = 2; i != 4; ++i)
2787     if (!isUndefOrEqual(Mask->getOperand(i), i+4))
2788       return false;
2789   return true;
2790 }
2791
2792 /// isScalarLoadToVector - Returns true if the node is a scalar load that
2793 /// is promoted to a vector. It also returns the LoadSDNode by reference if
2794 /// required.
2795 static bool isScalarLoadToVector(SDNode *N, LoadSDNode **LD = NULL) {
2796   if (N->getOpcode() != ISD::SCALAR_TO_VECTOR)
2797     return false;
2798   N = N->getOperand(0).getNode();
2799   if (!ISD::isNON_EXTLoad(N))
2800     return false;
2801   if (LD)
2802     *LD = cast<LoadSDNode>(N);
2803   return true;
2804 }
2805
2806 /// ShouldXformToMOVLP{S|D} - Return true if the node should be transformed to
2807 /// match movlp{s|d}. The lower half elements should come from lower half of
2808 /// V1 (and in order), and the upper half elements should come from the upper
2809 /// half of V2 (and in order). And since V1 will become the source of the
2810 /// MOVLP, it must be either a vector load or a scalar load to vector.
2811 static bool ShouldXformToMOVLP(SDNode *V1, SDNode *V2, SDNode *Mask) {
2812   if (!ISD::isNON_EXTLoad(V1) && !isScalarLoadToVector(V1))
2813     return false;
2814   // Is V2 is a vector load, don't do this transformation. We will try to use
2815   // load folding shufps op.
2816   if (ISD::isNON_EXTLoad(V2))
2817     return false;
2818
2819   unsigned NumElems = Mask->getNumOperands();
2820   if (NumElems != 2 && NumElems != 4)
2821     return false;
2822   for (unsigned i = 0, e = NumElems/2; i != e; ++i)
2823     if (!isUndefOrEqual(Mask->getOperand(i), i))
2824       return false;
2825   for (unsigned i = NumElems/2; i != NumElems; ++i)
2826     if (!isUndefOrEqual(Mask->getOperand(i), i+NumElems))
2827       return false;
2828   return true;
2829 }
2830
2831 /// isSplatVector - Returns true if N is a BUILD_VECTOR node whose elements are
2832 /// all the same.
2833 static bool isSplatVector(SDNode *N) {
2834   if (N->getOpcode() != ISD::BUILD_VECTOR)
2835     return false;
2836
2837   SDValue SplatValue = N->getOperand(0);
2838   for (unsigned i = 1, e = N->getNumOperands(); i != e; ++i)
2839     if (N->getOperand(i) != SplatValue)
2840       return false;
2841   return true;
2842 }
2843
2844 /// isUndefShuffle - Returns true if N is a VECTOR_SHUFFLE that can be resolved
2845 /// to an undef.
2846 static bool isUndefShuffle(SDNode *N) {
2847   if (N->getOpcode() != ISD::VECTOR_SHUFFLE)
2848     return false;
2849
2850   SDValue V1 = N->getOperand(0);
2851   SDValue V2 = N->getOperand(1);
2852   SDValue Mask = N->getOperand(2);
2853   unsigned NumElems = Mask.getNumOperands();
2854   for (unsigned i = 0; i != NumElems; ++i) {
2855     SDValue Arg = Mask.getOperand(i);
2856     if (Arg.getOpcode() != ISD::UNDEF) {
2857       unsigned Val = cast<ConstantSDNode>(Arg)->getZExtValue();
2858       if (Val < NumElems && V1.getOpcode() != ISD::UNDEF)
2859         return false;
2860       else if (Val >= NumElems && V2.getOpcode() != ISD::UNDEF)
2861         return false;
2862     }
2863   }
2864   return true;
2865 }
2866
2867 /// isZeroNode - Returns true if Elt is a constant zero or a floating point
2868 /// constant +0.0.
2869 static inline bool isZeroNode(SDValue Elt) {
2870   return ((isa<ConstantSDNode>(Elt) &&
2871            cast<ConstantSDNode>(Elt)->getZExtValue() == 0) ||
2872           (isa<ConstantFPSDNode>(Elt) &&
2873            cast<ConstantFPSDNode>(Elt)->getValueAPF().isPosZero()));
2874 }
2875
2876 /// isZeroShuffle - Returns true if N is a VECTOR_SHUFFLE that can be resolved
2877 /// to an zero vector.
2878 static bool isZeroShuffle(SDNode *N) {
2879   if (N->getOpcode() != ISD::VECTOR_SHUFFLE)
2880     return false;
2881
2882   SDValue V1 = N->getOperand(0);
2883   SDValue V2 = N->getOperand(1);
2884   SDValue Mask = N->getOperand(2);
2885   unsigned NumElems = Mask.getNumOperands();
2886   for (unsigned i = 0; i != NumElems; ++i) {
2887     SDValue Arg = Mask.getOperand(i);
2888     if (Arg.getOpcode() == ISD::UNDEF)
2889       continue;
2890     
2891     unsigned Idx = cast<ConstantSDNode>(Arg)->getZExtValue();
2892     if (Idx < NumElems) {
2893       unsigned Opc = V1.getNode()->getOpcode();
2894       if (Opc == ISD::UNDEF || ISD::isBuildVectorAllZeros(V1.getNode()))
2895         continue;
2896       if (Opc != ISD::BUILD_VECTOR ||
2897           !isZeroNode(V1.getNode()->getOperand(Idx)))
2898         return false;
2899     } else if (Idx >= NumElems) {
2900       unsigned Opc = V2.getNode()->getOpcode();
2901       if (Opc == ISD::UNDEF || ISD::isBuildVectorAllZeros(V2.getNode()))
2902         continue;
2903       if (Opc != ISD::BUILD_VECTOR ||
2904           !isZeroNode(V2.getNode()->getOperand(Idx - NumElems)))
2905         return false;
2906     }
2907   }
2908   return true;
2909 }
2910
2911 /// getZeroVector - Returns a vector of specified type with all zero elements.
2912 ///
2913 static SDValue getZeroVector(MVT VT, bool HasSSE2, SelectionDAG &DAG,
2914                              DebugLoc dl) {
2915   assert(VT.isVector() && "Expected a vector type");
2916   
2917   // Always build zero vectors as <4 x i32> or <2 x i32> bitcasted to their dest
2918   // type.  This ensures they get CSE'd.
2919   SDValue Vec;
2920   if (VT.getSizeInBits() == 64) { // MMX
2921     SDValue Cst = DAG.getTargetConstant(0, MVT::i32);
2922     Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v2i32, Cst, Cst);
2923   } else if (HasSSE2) {  // SSE2
2924     SDValue Cst = DAG.getTargetConstant(0, MVT::i32);
2925     Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32, Cst, Cst, Cst, Cst);
2926   } else { // SSE1
2927     SDValue Cst = DAG.getTargetConstantFP(+0.0, MVT::f32);
2928     Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4f32, Cst, Cst, Cst, Cst);
2929   }
2930   return DAG.getNode(ISD::BIT_CONVERT, dl, VT, Vec);
2931 }
2932
2933 /// getOnesVector - Returns a vector of specified type with all bits set.
2934 ///
2935 static SDValue getOnesVector(MVT VT, SelectionDAG &DAG, DebugLoc dl) {
2936   assert(VT.isVector() && "Expected a vector type");
2937   
2938   // Always build ones vectors as <4 x i32> or <2 x i32> bitcasted to their dest
2939   // type.  This ensures they get CSE'd.
2940   SDValue Cst = DAG.getTargetConstant(~0U, MVT::i32);
2941   SDValue Vec;
2942   if (VT.getSizeInBits() == 64)  // MMX
2943     Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v2i32, Cst, Cst);
2944   else                                              // SSE
2945     Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32, Cst, Cst, Cst, Cst);
2946   return DAG.getNode(ISD::BIT_CONVERT, dl, VT, Vec);
2947 }
2948
2949
2950 /// NormalizeMask - V2 is a splat, modify the mask (if needed) so all elements
2951 /// that point to V2 points to its first element.
2952 static SDValue NormalizeMask(SDValue Mask, SelectionDAG &DAG) {
2953   assert(Mask.getOpcode() == ISD::BUILD_VECTOR);
2954
2955   bool Changed = false;
2956   SmallVector<SDValue, 8> MaskVec;
2957   unsigned NumElems = Mask.getNumOperands();
2958   for (unsigned i = 0; i != NumElems; ++i) {
2959     SDValue Arg = Mask.getOperand(i);
2960     if (Arg.getOpcode() != ISD::UNDEF) {
2961       unsigned Val = cast<ConstantSDNode>(Arg)->getZExtValue();
2962       if (Val > NumElems) {
2963         Arg = DAG.getConstant(NumElems, Arg.getValueType());
2964         Changed = true;
2965       }
2966     }
2967     MaskVec.push_back(Arg);
2968   }
2969
2970   if (Changed)
2971     Mask = DAG.getNode(ISD::BUILD_VECTOR, Mask.getDebugLoc(),
2972                        Mask.getValueType(),
2973                        &MaskVec[0], MaskVec.size());
2974   return Mask;
2975 }
2976
2977 /// getMOVLMask - Returns a vector_shuffle mask for an movs{s|d}, movd
2978 /// operation of specified width.
2979 static SDValue getMOVLMask(unsigned NumElems, SelectionDAG &DAG, DebugLoc dl) {
2980   MVT MaskVT = MVT::getIntVectorWithNumElements(NumElems);
2981   MVT BaseVT = MaskVT.getVectorElementType();
2982
2983   SmallVector<SDValue, 8> MaskVec;
2984   MaskVec.push_back(DAG.getConstant(NumElems, BaseVT));
2985   for (unsigned i = 1; i != NumElems; ++i)
2986     MaskVec.push_back(DAG.getConstant(i, BaseVT));
2987   return DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT, 
2988                      &MaskVec[0], MaskVec.size());
2989 }
2990
2991 /// getUnpacklMask - Returns a vector_shuffle mask for an unpackl operation
2992 /// of specified width.
2993 static SDValue getUnpacklMask(unsigned NumElems, SelectionDAG &DAG, 
2994                               DebugLoc dl) {
2995   MVT MaskVT = MVT::getIntVectorWithNumElements(NumElems);
2996   MVT BaseVT = MaskVT.getVectorElementType();
2997   SmallVector<SDValue, 8> MaskVec;
2998   for (unsigned i = 0, e = NumElems/2; i != e; ++i) {
2999     MaskVec.push_back(DAG.getConstant(i,            BaseVT));
3000     MaskVec.push_back(DAG.getConstant(i + NumElems, BaseVT));
3001   }
3002   return DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT, 
3003                      &MaskVec[0], MaskVec.size());
3004 }
3005
3006 /// getUnpackhMask - Returns a vector_shuffle mask for an unpackh operation
3007 /// of specified width.
3008 static SDValue getUnpackhMask(unsigned NumElems, SelectionDAG &DAG,
3009                               DebugLoc dl) {
3010   MVT MaskVT = MVT::getIntVectorWithNumElements(NumElems);
3011   MVT BaseVT = MaskVT.getVectorElementType();
3012   unsigned Half = NumElems/2;
3013   SmallVector<SDValue, 8> MaskVec;
3014   for (unsigned i = 0; i != Half; ++i) {
3015     MaskVec.push_back(DAG.getConstant(i + Half,            BaseVT));
3016     MaskVec.push_back(DAG.getConstant(i + NumElems + Half, BaseVT));
3017   }
3018   return DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT, 
3019                      &MaskVec[0], MaskVec.size());
3020 }
3021
3022 /// getSwapEltZeroMask - Returns a vector_shuffle mask for a shuffle that swaps
3023 /// element #0 of a vector with the specified index, leaving the rest of the
3024 /// elements in place.
3025 static SDValue getSwapEltZeroMask(unsigned NumElems, unsigned DestElt,
3026                                    SelectionDAG &DAG, DebugLoc dl) {
3027   MVT MaskVT = MVT::getIntVectorWithNumElements(NumElems);
3028   MVT BaseVT = MaskVT.getVectorElementType();
3029   SmallVector<SDValue, 8> MaskVec;
3030   // Element #0 of the result gets the elt we are replacing.
3031   MaskVec.push_back(DAG.getConstant(DestElt, BaseVT));
3032   for (unsigned i = 1; i != NumElems; ++i)
3033     MaskVec.push_back(DAG.getConstant(i == DestElt ? 0 : i, BaseVT));
3034   return DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT, 
3035                      &MaskVec[0], MaskVec.size());
3036 }
3037
3038 /// PromoteSplat - Promote a splat of v4f32, v8i16 or v16i8 to v4i32.
3039 static SDValue PromoteSplat(SDValue Op, SelectionDAG &DAG, bool HasSSE2) {
3040   MVT PVT = HasSSE2 ? MVT::v4i32 : MVT::v4f32;
3041   MVT VT = Op.getValueType();
3042   if (PVT == VT)
3043     return Op;
3044   SDValue V1 = Op.getOperand(0);
3045   SDValue Mask = Op.getOperand(2);
3046   unsigned MaskNumElems = Mask.getNumOperands();
3047   unsigned NumElems = MaskNumElems;
3048   DebugLoc dl = Op.getDebugLoc();
3049   // Special handling of v4f32 -> v4i32.
3050   if (VT != MVT::v4f32) {
3051     // Find which element we want to splat.
3052     SDNode* EltNoNode = getSplatMaskEltNo(Mask.getNode()).getNode();
3053     unsigned EltNo = cast<ConstantSDNode>(EltNoNode)->getZExtValue();
3054     // unpack elements to the correct location
3055     while (NumElems > 4) {
3056       if (EltNo < NumElems/2) {
3057         Mask = getUnpacklMask(MaskNumElems, DAG, dl);
3058       } else {
3059         Mask = getUnpackhMask(MaskNumElems, DAG, dl);
3060         EltNo -= NumElems/2;
3061       }
3062       V1 = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, V1, V1, Mask);
3063       NumElems >>= 1;
3064     }
3065     SDValue Cst = DAG.getConstant(EltNo, MVT::i32);
3066     Mask = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32, Cst, Cst, Cst, Cst);
3067   }
3068
3069   V1 = DAG.getNode(ISD::BIT_CONVERT, dl, PVT, V1);
3070   SDValue Shuffle = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, PVT, V1,
3071                                   DAG.getUNDEF(PVT), Mask);
3072   return DAG.getNode(ISD::BIT_CONVERT, dl, VT, Shuffle);
3073 }
3074
3075 /// isVectorLoad - Returns true if the node is a vector load, a scalar
3076 /// load that's promoted to vector, or a load bitcasted.
3077 static bool isVectorLoad(SDValue Op) {
3078   assert(Op.getValueType().isVector() && "Expected a vector type");
3079   if (Op.getOpcode() == ISD::SCALAR_TO_VECTOR ||
3080       Op.getOpcode() == ISD::BIT_CONVERT) {
3081     return isa<LoadSDNode>(Op.getOperand(0));
3082   }
3083   return isa<LoadSDNode>(Op);
3084 }
3085
3086
3087 /// CanonicalizeMovddup - Cannonicalize movddup shuffle to v2f64.
3088 ///
3089 static SDValue CanonicalizeMovddup(SDValue Op, SDValue V1, SDValue Mask,
3090                                    SelectionDAG &DAG, bool HasSSE3) {
3091   // If we have sse3 and shuffle has more than one use or input is a load, then
3092   // use movddup. Otherwise, use movlhps.
3093   bool UseMovddup = HasSSE3 && (!Op.hasOneUse() || isVectorLoad(V1));
3094   MVT PVT = UseMovddup ? MVT::v2f64 : MVT::v4f32;
3095   MVT VT = Op.getValueType();
3096   if (VT == PVT)
3097     return Op;
3098   DebugLoc dl = Op.getDebugLoc();
3099   unsigned NumElems = PVT.getVectorNumElements();
3100   if (NumElems == 2) {
3101     SDValue Cst = DAG.getTargetConstant(0, MVT::i32);
3102     Mask = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v2i32, Cst, Cst);
3103   } else {
3104     assert(NumElems == 4);
3105     SDValue Cst0 = DAG.getTargetConstant(0, MVT::i32);
3106     SDValue Cst1 = DAG.getTargetConstant(1, MVT::i32);
3107     Mask = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32, 
3108                        Cst0, Cst1, Cst0, Cst1);
3109   }
3110
3111   V1 = DAG.getNode(ISD::BIT_CONVERT, dl, PVT, V1);
3112   SDValue Shuffle = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, PVT, V1,
3113                                 DAG.getUNDEF(PVT), Mask);
3114   return DAG.getNode(ISD::BIT_CONVERT, dl, VT, Shuffle);
3115 }
3116
3117 /// getShuffleVectorZeroOrUndef - Return a vector_shuffle of the specified
3118 /// vector of zero or undef vector.  This produces a shuffle where the low
3119 /// element of V2 is swizzled into the zero/undef vector, landing at element
3120 /// Idx.  This produces a shuffle mask like 4,1,2,3 (idx=0) or  0,1,2,4 (idx=3).
3121 static SDValue getShuffleVectorZeroOrUndef(SDValue V2, unsigned Idx,
3122                                              bool isZero, bool HasSSE2,
3123                                              SelectionDAG &DAG) {
3124   DebugLoc dl = V2.getDebugLoc();
3125   MVT VT = V2.getValueType();
3126   SDValue V1 = isZero
3127     ? getZeroVector(VT, HasSSE2, DAG, dl) : DAG.getUNDEF(VT);
3128   unsigned NumElems = V2.getValueType().getVectorNumElements();
3129   MVT MaskVT = MVT::getIntVectorWithNumElements(NumElems);
3130   MVT EVT = MaskVT.getVectorElementType();
3131   SmallVector<SDValue, 16> MaskVec;
3132   for (unsigned i = 0; i != NumElems; ++i)
3133     if (i == Idx)  // If this is the insertion idx, put the low elt of V2 here.
3134       MaskVec.push_back(DAG.getConstant(NumElems, EVT));
3135     else
3136       MaskVec.push_back(DAG.getConstant(i, EVT));
3137   SDValue Mask = DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT,
3138                                &MaskVec[0], MaskVec.size());
3139   return DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, V1, V2, Mask);
3140 }
3141
3142 /// getNumOfConsecutiveZeros - Return the number of elements in a result of
3143 /// a shuffle that is zero.
3144 static
3145 unsigned getNumOfConsecutiveZeros(SDValue Op, SDValue Mask,
3146                                   unsigned NumElems, bool Low,
3147                                   SelectionDAG &DAG) {
3148   unsigned NumZeros = 0;
3149   for (unsigned i = 0; i < NumElems; ++i) {
3150     unsigned Index = Low ? i : NumElems-i-1;
3151     SDValue Idx = Mask.getOperand(Index);
3152     if (Idx.getOpcode() == ISD::UNDEF) {
3153       ++NumZeros;
3154       continue;
3155     }
3156     SDValue Elt = DAG.getShuffleScalarElt(Op.getNode(), Index);
3157     if (Elt.getNode() && isZeroNode(Elt))
3158       ++NumZeros;
3159     else
3160       break;
3161   }
3162   return NumZeros;
3163 }
3164
3165 /// isVectorShift - Returns true if the shuffle can be implemented as a
3166 /// logical left or right shift of a vector.
3167 static bool isVectorShift(SDValue Op, SDValue Mask, SelectionDAG &DAG,
3168                           bool &isLeft, SDValue &ShVal, unsigned &ShAmt) {
3169   unsigned NumElems = Mask.getNumOperands();
3170
3171   isLeft = true;
3172   unsigned NumZeros= getNumOfConsecutiveZeros(Op, Mask, NumElems, true, DAG);
3173   if (!NumZeros) {
3174     isLeft = false;
3175     NumZeros = getNumOfConsecutiveZeros(Op, Mask, NumElems, false, DAG);
3176     if (!NumZeros)
3177       return false;
3178   }
3179
3180   bool SeenV1 = false;
3181   bool SeenV2 = false;
3182   for (unsigned i = NumZeros; i < NumElems; ++i) {
3183     unsigned Val = isLeft ? (i - NumZeros) : i;
3184     SDValue Idx = Mask.getOperand(isLeft ? i : (i - NumZeros));
3185     if (Idx.getOpcode() == ISD::UNDEF)
3186       continue;
3187     unsigned Index = cast<ConstantSDNode>(Idx)->getZExtValue();
3188     if (Index < NumElems)
3189       SeenV1 = true;
3190     else {
3191       Index -= NumElems;
3192       SeenV2 = true;
3193     }
3194     if (Index != Val)
3195       return false;
3196   }
3197   if (SeenV1 && SeenV2)
3198     return false;
3199
3200   ShVal = SeenV1 ? Op.getOperand(0) : Op.getOperand(1);
3201   ShAmt = NumZeros;
3202   return true;
3203 }
3204
3205
3206 /// LowerBuildVectorv16i8 - Custom lower build_vector of v16i8.
3207 ///
3208 static SDValue LowerBuildVectorv16i8(SDValue Op, unsigned NonZeros,
3209                                        unsigned NumNonZero, unsigned NumZero,
3210                                        SelectionDAG &DAG, TargetLowering &TLI) {
3211   if (NumNonZero > 8)
3212     return SDValue();
3213
3214   DebugLoc dl = Op.getDebugLoc();
3215   SDValue V(0, 0);
3216   bool First = true;
3217   for (unsigned i = 0; i < 16; ++i) {
3218     bool ThisIsNonZero = (NonZeros & (1 << i)) != 0;
3219     if (ThisIsNonZero && First) {
3220       if (NumZero)
3221         V = getZeroVector(MVT::v8i16, true, DAG, dl);
3222       else
3223         V = DAG.getUNDEF(MVT::v8i16);
3224       First = false;
3225     }
3226
3227     if ((i & 1) != 0) {
3228       SDValue ThisElt(0, 0), LastElt(0, 0);
3229       bool LastIsNonZero = (NonZeros & (1 << (i-1))) != 0;
3230       if (LastIsNonZero) {
3231         LastElt = DAG.getNode(ISD::ZERO_EXTEND, dl, 
3232                               MVT::i16, Op.getOperand(i-1));
3233       }
3234       if (ThisIsNonZero) {
3235         ThisElt = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i16, Op.getOperand(i));
3236         ThisElt = DAG.getNode(ISD::SHL, dl, MVT::i16,
3237                               ThisElt, DAG.getConstant(8, MVT::i8));
3238         if (LastIsNonZero)
3239           ThisElt = DAG.getNode(ISD::OR, dl, MVT::i16, ThisElt, LastElt);
3240       } else
3241         ThisElt = LastElt;
3242
3243       if (ThisElt.getNode())
3244         V = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, MVT::v8i16, V, ThisElt,
3245                         DAG.getIntPtrConstant(i/2));
3246     }
3247   }
3248
3249   return DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v16i8, V);
3250 }
3251
3252 /// LowerBuildVectorv8i16 - Custom lower build_vector of v8i16.
3253 ///
3254 static SDValue LowerBuildVectorv8i16(SDValue Op, unsigned NonZeros,
3255                                        unsigned NumNonZero, unsigned NumZero,
3256                                        SelectionDAG &DAG, TargetLowering &TLI) {
3257   if (NumNonZero > 4)
3258     return SDValue();
3259
3260   DebugLoc dl = Op.getDebugLoc();
3261   SDValue V(0, 0);
3262   bool First = true;
3263   for (unsigned i = 0; i < 8; ++i) {
3264     bool isNonZero = (NonZeros & (1 << i)) != 0;
3265     if (isNonZero) {
3266       if (First) {
3267         if (NumZero)
3268           V = getZeroVector(MVT::v8i16, true, DAG, dl);
3269         else
3270           V = DAG.getUNDEF(MVT::v8i16);
3271         First = false;
3272       }
3273       V = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, 
3274                       MVT::v8i16, V, Op.getOperand(i),
3275                       DAG.getIntPtrConstant(i));
3276     }
3277   }
3278
3279   return V;
3280 }
3281
3282 /// getVShift - Return a vector logical shift node.
3283 ///
3284 static SDValue getVShift(bool isLeft, MVT VT, SDValue SrcOp,
3285                            unsigned NumBits, SelectionDAG &DAG,
3286                            const TargetLowering &TLI, DebugLoc dl) {
3287   bool isMMX = VT.getSizeInBits() == 64;
3288   MVT ShVT = isMMX ? MVT::v1i64 : MVT::v2i64;
3289   unsigned Opc = isLeft ? X86ISD::VSHL : X86ISD::VSRL;
3290   SrcOp = DAG.getNode(ISD::BIT_CONVERT, dl, ShVT, SrcOp);
3291   return DAG.getNode(ISD::BIT_CONVERT, dl, VT,
3292                      DAG.getNode(Opc, dl, ShVT, SrcOp,
3293                              DAG.getConstant(NumBits, TLI.getShiftAmountTy())));
3294 }
3295
3296 SDValue
3297 X86TargetLowering::LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) {
3298   DebugLoc dl = Op.getDebugLoc();
3299   // All zero's are handled with pxor, all one's are handled with pcmpeqd.
3300   if (ISD::isBuildVectorAllZeros(Op.getNode())
3301       || ISD::isBuildVectorAllOnes(Op.getNode())) {
3302     // Canonicalize this to either <4 x i32> or <2 x i32> (SSE vs MMX) to
3303     // 1) ensure the zero vectors are CSE'd, and 2) ensure that i64 scalars are
3304     // eliminated on x86-32 hosts.
3305     if (Op.getValueType() == MVT::v4i32 || Op.getValueType() == MVT::v2i32)
3306       return Op;
3307
3308     if (ISD::isBuildVectorAllOnes(Op.getNode()))
3309       return getOnesVector(Op.getValueType(), DAG, dl);
3310     return getZeroVector(Op.getValueType(), Subtarget->hasSSE2(), DAG, dl);
3311   }
3312
3313   MVT VT = Op.getValueType();
3314   MVT EVT = VT.getVectorElementType();
3315   unsigned EVTBits = EVT.getSizeInBits();
3316
3317   unsigned NumElems = Op.getNumOperands();
3318   unsigned NumZero  = 0;
3319   unsigned NumNonZero = 0;
3320   unsigned NonZeros = 0;
3321   bool IsAllConstants = true;
3322   SmallSet<SDValue, 8> Values;
3323   for (unsigned i = 0; i < NumElems; ++i) {
3324     SDValue Elt = Op.getOperand(i);
3325     if (Elt.getOpcode() == ISD::UNDEF)
3326       continue;
3327     Values.insert(Elt);
3328     if (Elt.getOpcode() != ISD::Constant &&
3329         Elt.getOpcode() != ISD::ConstantFP)
3330       IsAllConstants = false;
3331     if (isZeroNode(Elt))
3332       NumZero++;
3333     else {
3334       NonZeros |= (1 << i);
3335       NumNonZero++;
3336     }
3337   }
3338
3339   if (NumNonZero == 0) {
3340     // All undef vector. Return an UNDEF.  All zero vectors were handled above.
3341     return DAG.getUNDEF(VT);
3342   }
3343
3344   // Special case for single non-zero, non-undef, element.
3345   if (NumNonZero == 1 && NumElems <= 4) {
3346     unsigned Idx = CountTrailingZeros_32(NonZeros);
3347     SDValue Item = Op.getOperand(Idx);
3348     
3349     // If this is an insertion of an i64 value on x86-32, and if the top bits of
3350     // the value are obviously zero, truncate the value to i32 and do the
3351     // insertion that way.  Only do this if the value is non-constant or if the
3352     // value is a constant being inserted into element 0.  It is cheaper to do
3353     // a constant pool load than it is to do a movd + shuffle.
3354     if (EVT == MVT::i64 && !Subtarget->is64Bit() &&
3355         (!IsAllConstants || Idx == 0)) {
3356       if (DAG.MaskedValueIsZero(Item, APInt::getBitsSet(64, 32, 64))) {
3357         // Handle MMX and SSE both.
3358         MVT VecVT = VT == MVT::v2i64 ? MVT::v4i32 : MVT::v2i32;
3359         unsigned VecElts = VT == MVT::v2i64 ? 4 : 2;
3360         
3361         // Truncate the value (which may itself be a constant) to i32, and
3362         // convert it to a vector with movd (S2V+shuffle to zero extend).
3363         Item = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Item);
3364         Item = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VecVT, Item);
3365         Item = getShuffleVectorZeroOrUndef(Item, 0, true,
3366                                            Subtarget->hasSSE2(), DAG);
3367         
3368         // Now we have our 32-bit value zero extended in the low element of
3369         // a vector.  If Idx != 0, swizzle it into place.
3370         if (Idx != 0) {
3371           SDValue Ops[] = { 
3372             Item, DAG.getUNDEF(Item.getValueType()),
3373             getSwapEltZeroMask(VecElts, Idx, DAG, dl)
3374           };
3375           Item = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VecVT, Ops, 3);
3376         }
3377         return DAG.getNode(ISD::BIT_CONVERT, dl, Op.getValueType(), Item);
3378       }
3379     }
3380     
3381     // If we have a constant or non-constant insertion into the low element of
3382     // a vector, we can do this with SCALAR_TO_VECTOR + shuffle of zero into
3383     // the rest of the elements.  This will be matched as movd/movq/movss/movsd
3384     // depending on what the source datatype is.  Because we can only get here
3385     // when NumElems <= 4, this only needs to handle i32/f32/i64/f64.
3386     if (Idx == 0 &&
3387         // Don't do this for i64 values on x86-32.
3388         (EVT != MVT::i64 || Subtarget->is64Bit())) {
3389       Item = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Item);
3390       // Turn it into a MOVL (i.e. movss, movsd, or movd) to a zero vector.
3391       return getShuffleVectorZeroOrUndef(Item, 0, NumZero > 0,
3392                                          Subtarget->hasSSE2(), DAG);
3393     }
3394
3395     // Is it a vector logical left shift?
3396     if (NumElems == 2 && Idx == 1 &&
3397         isZeroNode(Op.getOperand(0)) && !isZeroNode(Op.getOperand(1))) {
3398       unsigned NumBits = VT.getSizeInBits();
3399       return getVShift(true, VT,
3400                        DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, 
3401                                    VT, Op.getOperand(1)),
3402                        NumBits/2, DAG, *this, dl);
3403     }
3404     
3405     if (IsAllConstants) // Otherwise, it's better to do a constpool load.
3406       return SDValue();
3407
3408     // Otherwise, if this is a vector with i32 or f32 elements, and the element
3409     // is a non-constant being inserted into an element other than the low one,
3410     // we can't use a constant pool load.  Instead, use SCALAR_TO_VECTOR (aka
3411     // movd/movss) to move this into the low element, then shuffle it into
3412     // place.
3413     if (EVTBits == 32) {
3414       Item = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Item);
3415       
3416       // Turn it into a shuffle of zero and zero-extended scalar to vector.
3417       Item = getShuffleVectorZeroOrUndef(Item, 0, NumZero > 0,
3418                                          Subtarget->hasSSE2(), DAG);
3419       MVT MaskVT  = MVT::getIntVectorWithNumElements(NumElems);
3420       MVT MaskEVT = MaskVT.getVectorElementType();
3421       SmallVector<SDValue, 8> MaskVec;
3422       for (unsigned i = 0; i < NumElems; i++)
3423         MaskVec.push_back(DAG.getConstant((i == Idx) ? 0 : 1, MaskEVT));
3424       SDValue Mask = DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT,
3425                                    &MaskVec[0], MaskVec.size());
3426       return DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, Item,
3427                          DAG.getUNDEF(VT), Mask);
3428     }
3429   }
3430
3431   // Splat is obviously ok. Let legalizer expand it to a shuffle.
3432   if (Values.size() == 1)
3433     return SDValue();
3434   
3435   // A vector full of immediates; various special cases are already
3436   // handled, so this is best done with a single constant-pool load.
3437   if (IsAllConstants)
3438     return SDValue();
3439
3440   // Let legalizer expand 2-wide build_vectors.
3441   if (EVTBits == 64) {
3442     if (NumNonZero == 1) {
3443       // One half is zero or undef.
3444       unsigned Idx = CountTrailingZeros_32(NonZeros);
3445       SDValue V2 = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT,
3446                                  Op.getOperand(Idx));
3447       return getShuffleVectorZeroOrUndef(V2, Idx, true,
3448                                          Subtarget->hasSSE2(), DAG);
3449     }
3450     return SDValue();
3451   }
3452
3453   // If element VT is < 32 bits, convert it to inserts into a zero vector.
3454   if (EVTBits == 8 && NumElems == 16) {
3455     SDValue V = LowerBuildVectorv16i8(Op, NonZeros,NumNonZero,NumZero, DAG,
3456                                         *this);
3457     if (V.getNode()) return V;
3458   }
3459
3460   if (EVTBits == 16 && NumElems == 8) {
3461     SDValue V = LowerBuildVectorv8i16(Op, NonZeros,NumNonZero,NumZero, DAG,
3462                                         *this);
3463     if (V.getNode()) return V;
3464   }
3465
3466   // If element VT is == 32 bits, turn it into a number of shuffles.
3467   SmallVector<SDValue, 8> V;
3468   V.resize(NumElems);
3469   if (NumElems == 4 && NumZero > 0) {
3470     for (unsigned i = 0; i < 4; ++i) {
3471       bool isZero = !(NonZeros & (1 << i));
3472       if (isZero)
3473         V[i] = getZeroVector(VT, Subtarget->hasSSE2(), DAG, dl);
3474       else
3475         V[i] = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Op.getOperand(i));
3476     }
3477
3478     for (unsigned i = 0; i < 2; ++i) {
3479       switch ((NonZeros & (0x3 << i*2)) >> (i*2)) {
3480         default: break;
3481         case 0:
3482           V[i] = V[i*2];  // Must be a zero vector.
3483           break;
3484         case 1:
3485           V[i] = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, V[i*2+1], V[i*2],
3486                              getMOVLMask(NumElems, DAG, dl));
3487           break;
3488         case 2:
3489           V[i] = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, V[i*2], V[i*2+1],
3490                              getMOVLMask(NumElems, DAG, dl));
3491           break;
3492         case 3:
3493           V[i] = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, V[i*2], V[i*2+1],
3494                              getUnpacklMask(NumElems, DAG, dl));
3495           break;
3496       }
3497     }
3498
3499     MVT MaskVT = MVT::getIntVectorWithNumElements(NumElems);
3500     MVT EVT = MaskVT.getVectorElementType();
3501     SmallVector<SDValue, 8> MaskVec;
3502     bool Reverse = (NonZeros & 0x3) == 2;
3503     for (unsigned i = 0; i < 2; ++i)
3504       if (Reverse)
3505         MaskVec.push_back(DAG.getConstant(1-i, EVT));
3506       else
3507         MaskVec.push_back(DAG.getConstant(i, EVT));
3508     Reverse = ((NonZeros & (0x3 << 2)) >> 2) == 2;
3509     for (unsigned i = 0; i < 2; ++i)
3510       if (Reverse)
3511         MaskVec.push_back(DAG.getConstant(1-i+NumElems, EVT));
3512       else
3513         MaskVec.push_back(DAG.getConstant(i+NumElems, EVT));
3514     SDValue ShufMask = DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT,
3515                                      &MaskVec[0], MaskVec.size());
3516     return DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, V[0], V[1], ShufMask);
3517   }
3518
3519   if (Values.size() > 2) {
3520     // Expand into a number of unpckl*.
3521     // e.g. for v4f32
3522     //   Step 1: unpcklps 0, 2 ==> X: <?, ?, 2, 0>
3523     //         : unpcklps 1, 3 ==> Y: <?, ?, 3, 1>
3524     //   Step 2: unpcklps X, Y ==>    <3, 2, 1, 0>
3525     SDValue UnpckMask = getUnpacklMask(NumElems, DAG, dl);
3526     for (unsigned i = 0; i < NumElems; ++i)
3527       V[i] = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Op.getOperand(i));
3528     NumElems >>= 1;
3529     while (NumElems != 0) {
3530       for (unsigned i = 0; i < NumElems; ++i)
3531         V[i] = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, V[i], V[i + NumElems],
3532                            UnpckMask);
3533       NumElems >>= 1;
3534     }
3535     return V[0];
3536   }
3537
3538   return SDValue();
3539 }
3540
3541 static
3542 SDValue LowerVECTOR_SHUFFLEv8i16(SDValue V1, SDValue V2,
3543                                  SDValue PermMask, SelectionDAG &DAG,
3544                                  TargetLowering &TLI, DebugLoc dl) {
3545   SDValue NewV;
3546   MVT MaskVT = MVT::getIntVectorWithNumElements(8);
3547   MVT MaskEVT = MaskVT.getVectorElementType();
3548   MVT PtrVT = TLI.getPointerTy();
3549   SmallVector<SDValue, 8> MaskElts(PermMask.getNode()->op_begin(),
3550                                    PermMask.getNode()->op_end());
3551
3552   // First record which half of which vector the low elements come from.
3553   SmallVector<unsigned, 4> LowQuad(4);
3554   for (unsigned i = 0; i < 4; ++i) {
3555     SDValue Elt = MaskElts[i];
3556     if (Elt.getOpcode() == ISD::UNDEF)
3557       continue;
3558     unsigned EltIdx = cast<ConstantSDNode>(Elt)->getZExtValue();
3559     int QuadIdx = EltIdx / 4;
3560     ++LowQuad[QuadIdx];
3561   }
3562
3563   int BestLowQuad = -1;
3564   unsigned MaxQuad = 1;
3565   for (unsigned i = 0; i < 4; ++i) {
3566     if (LowQuad[i] > MaxQuad) {
3567       BestLowQuad = i;
3568       MaxQuad = LowQuad[i];
3569     }
3570   }
3571
3572   // Record which half of which vector the high elements come from.
3573   SmallVector<unsigned, 4> HighQuad(4);
3574   for (unsigned i = 4; i < 8; ++i) {
3575     SDValue Elt = MaskElts[i];
3576     if (Elt.getOpcode() == ISD::UNDEF)
3577       continue;
3578     unsigned EltIdx = cast<ConstantSDNode>(Elt)->getZExtValue();
3579     int QuadIdx = EltIdx / 4;
3580     ++HighQuad[QuadIdx];
3581   }
3582
3583   int BestHighQuad = -1;
3584   MaxQuad = 1;
3585   for (unsigned i = 0; i < 4; ++i) {
3586     if (HighQuad[i] > MaxQuad) {
3587       BestHighQuad = i;
3588       MaxQuad = HighQuad[i];
3589     }
3590   }
3591
3592   // If it's possible to sort parts of either half with PSHUF{H|L}W, then do it.
3593   if (BestLowQuad != -1 || BestHighQuad != -1) {
3594     // First sort the 4 chunks in order using shufpd.
3595     SmallVector<SDValue, 8> MaskVec;
3596
3597     if (BestLowQuad != -1)
3598       MaskVec.push_back(DAG.getConstant(BestLowQuad, MVT::i32));
3599     else
3600       MaskVec.push_back(DAG.getConstant(0, MVT::i32));
3601
3602     if (BestHighQuad != -1)
3603       MaskVec.push_back(DAG.getConstant(BestHighQuad, MVT::i32));
3604     else
3605       MaskVec.push_back(DAG.getConstant(1, MVT::i32));
3606
3607     SDValue Mask= DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v2i32, &MaskVec[0],2);
3608     NewV = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, MVT::v2i64,
3609                        DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2i64, V1),
3610                        DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2i64, V2), Mask);
3611     NewV = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v8i16, NewV);
3612
3613     // Now sort high and low parts separately.
3614     BitVector InOrder(8);
3615     if (BestLowQuad != -1) {
3616       // Sort lower half in order using PSHUFLW.
3617       MaskVec.clear();
3618       bool AnyOutOrder = false;
3619
3620       for (unsigned i = 0; i != 4; ++i) {
3621         SDValue Elt = MaskElts[i];
3622         if (Elt.getOpcode() == ISD::UNDEF) {
3623           MaskVec.push_back(Elt);
3624           InOrder.set(i);
3625         } else {
3626           unsigned EltIdx = cast<ConstantSDNode>(Elt)->getZExtValue();
3627           if (EltIdx != i)
3628             AnyOutOrder = true;
3629
3630           MaskVec.push_back(DAG.getConstant(EltIdx % 4, MaskEVT));
3631
3632           // If this element is in the right place after this shuffle, then
3633           // remember it.
3634           if ((int)(EltIdx / 4) == BestLowQuad)
3635             InOrder.set(i);
3636         }
3637       }
3638       if (AnyOutOrder) {
3639         for (unsigned i = 4; i != 8; ++i)
3640           MaskVec.push_back(DAG.getConstant(i, MaskEVT));
3641         SDValue Mask = DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT, 
3642                                    &MaskVec[0], 8);
3643         NewV = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, MVT::v8i16, 
3644                            NewV, NewV, Mask);
3645       }
3646     }
3647
3648     if (BestHighQuad != -1) {
3649       // Sort high half in order using PSHUFHW if possible.
3650       MaskVec.clear();
3651
3652       for (unsigned i = 0; i != 4; ++i)
3653         MaskVec.push_back(DAG.getConstant(i, MaskEVT));
3654
3655       bool AnyOutOrder = false;
3656       for (unsigned i = 4; i != 8; ++i) {
3657         SDValue Elt = MaskElts[i];
3658         if (Elt.getOpcode() == ISD::UNDEF) {
3659           MaskVec.push_back(Elt);
3660           InOrder.set(i);
3661         } else {
3662           unsigned EltIdx = cast<ConstantSDNode>(Elt)->getZExtValue();
3663           if (EltIdx != i)
3664             AnyOutOrder = true;
3665
3666           MaskVec.push_back(DAG.getConstant((EltIdx % 4) + 4, MaskEVT));
3667
3668           // If this element is in the right place after this shuffle, then
3669           // remember it.
3670           if ((int)(EltIdx / 4) == BestHighQuad)
3671             InOrder.set(i);
3672         }
3673       }
3674
3675       if (AnyOutOrder) {
3676         SDValue Mask = DAG.getNode(ISD::BUILD_VECTOR, dl, 
3677                                    MaskVT, &MaskVec[0], 8);
3678         NewV = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, MVT::v8i16, 
3679                            NewV, NewV, Mask);
3680       }
3681     }
3682
3683     // The other elements are put in the right place using pextrw and pinsrw.
3684     for (unsigned i = 0; i != 8; ++i) {
3685       if (InOrder[i])
3686         continue;
3687       SDValue Elt = MaskElts[i];
3688       if (Elt.getOpcode() == ISD::UNDEF)
3689         continue;
3690       unsigned EltIdx = cast<ConstantSDNode>(Elt)->getZExtValue();
3691       SDValue ExtOp = (EltIdx < 8)
3692         ? DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i16, V1,
3693                       DAG.getConstant(EltIdx, PtrVT))
3694         : DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i16, V2,
3695                       DAG.getConstant(EltIdx - 8, PtrVT));
3696       NewV = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, MVT::v8i16, NewV, ExtOp,
3697                          DAG.getConstant(i, PtrVT));
3698     }
3699
3700     return NewV;
3701   }
3702
3703   // PSHUF{H|L}W are not used. Lower into extracts and inserts but try to use as
3704   // few as possible. First, let's find out how many elements are already in the
3705   // right order.
3706   unsigned V1InOrder = 0;
3707   unsigned V1FromV1 = 0;
3708   unsigned V2InOrder = 0;
3709   unsigned V2FromV2 = 0;
3710   SmallVector<SDValue, 8> V1Elts;
3711   SmallVector<SDValue, 8> V2Elts;
3712   for (unsigned i = 0; i < 8; ++i) {
3713     SDValue Elt = MaskElts[i];
3714     if (Elt.getOpcode() == ISD::UNDEF) {
3715       V1Elts.push_back(Elt);
3716       V2Elts.push_back(Elt);
3717       ++V1InOrder;
3718       ++V2InOrder;
3719       continue;
3720     }
3721     unsigned EltIdx = cast<ConstantSDNode>(Elt)->getZExtValue();
3722     if (EltIdx == i) {
3723       V1Elts.push_back(Elt);
3724       V2Elts.push_back(DAG.getConstant(i+8, MaskEVT));
3725       ++V1InOrder;
3726     } else if (EltIdx == i+8) {
3727       V1Elts.push_back(Elt);
3728       V2Elts.push_back(DAG.getConstant(i, MaskEVT));
3729       ++V2InOrder;
3730     } else if (EltIdx < 8) {
3731       V1Elts.push_back(Elt);
3732       V2Elts.push_back(DAG.getConstant(EltIdx+8, MaskEVT));
3733       ++V1FromV1;
3734     } else {
3735       V1Elts.push_back(Elt);
3736       V2Elts.push_back(DAG.getConstant(EltIdx-8, MaskEVT));
3737       ++V2FromV2;
3738     }
3739   }
3740
3741   if (V2InOrder > V1InOrder) {
3742     PermMask = CommuteVectorShuffleMask(PermMask, DAG, dl);
3743     std::swap(V1, V2);
3744     std::swap(V1Elts, V2Elts);
3745     std::swap(V1FromV1, V2FromV2);
3746   }
3747
3748   if ((V1FromV1 + V1InOrder) != 8) {
3749     // Some elements are from V2.
3750     if (V1FromV1) {
3751       // If there are elements that are from V1 but out of place,
3752       // then first sort them in place
3753       SmallVector<SDValue, 8> MaskVec;
3754       for (unsigned i = 0; i < 8; ++i) {
3755         SDValue Elt = V1Elts[i];
3756         if (Elt.getOpcode() == ISD::UNDEF) {
3757           MaskVec.push_back(DAG.getUNDEF(MaskEVT));
3758           continue;
3759         }
3760         unsigned EltIdx = cast<ConstantSDNode>(Elt)->getZExtValue();
3761         if (EltIdx >= 8)
3762           MaskVec.push_back(DAG.getUNDEF(MaskEVT));
3763         else
3764           MaskVec.push_back(DAG.getConstant(EltIdx, MaskEVT));
3765       }
3766       SDValue Mask = DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT, &MaskVec[0], 8);
3767       V1 = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, MVT::v8i16, V1, V1, Mask);
3768     }
3769
3770     NewV = V1;
3771     for (unsigned i = 0; i < 8; ++i) {
3772       SDValue Elt = V1Elts[i];
3773       if (Elt.getOpcode() == ISD::UNDEF)
3774         continue;
3775       unsigned EltIdx = cast<ConstantSDNode>(Elt)->getZExtValue();
3776       if (EltIdx < 8)
3777         continue;
3778       SDValue ExtOp = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i16, V2,
3779                                     DAG.getConstant(EltIdx - 8, PtrVT));
3780       NewV = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, MVT::v8i16, NewV, ExtOp,
3781                          DAG.getConstant(i, PtrVT));
3782     }
3783     return NewV;
3784   } else {
3785     // All elements are from V1.
3786     NewV = V1;
3787     for (unsigned i = 0; i < 8; ++i) {
3788       SDValue Elt = V1Elts[i];
3789       if (Elt.getOpcode() == ISD::UNDEF)
3790         continue;
3791       unsigned EltIdx = cast<ConstantSDNode>(Elt)->getZExtValue();
3792       SDValue ExtOp = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i16, V1,
3793                                     DAG.getConstant(EltIdx, PtrVT));
3794       NewV = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, MVT::v8i16, NewV, ExtOp,
3795                          DAG.getConstant(i, PtrVT));
3796     }
3797     return NewV;
3798   }
3799 }
3800
3801 /// RewriteAsNarrowerShuffle - Try rewriting v8i16 and v16i8 shuffles as 4 wide
3802 /// ones, or rewriting v4i32 / v2f32 as 2 wide ones if possible. This can be
3803 /// done when every pair / quad of shuffle mask elements point to elements in
3804 /// the right sequence. e.g.
3805 /// vector_shuffle <>, <>, < 3, 4, | 10, 11, | 0, 1, | 14, 15>
3806 static
3807 SDValue RewriteAsNarrowerShuffle(SDValue V1, SDValue V2,
3808                                 MVT VT,
3809                                 SDValue PermMask, SelectionDAG &DAG,
3810                                 TargetLowering &TLI, DebugLoc dl) {
3811   unsigned NumElems = PermMask.getNumOperands();
3812   unsigned NewWidth = (NumElems == 4) ? 2 : 4;
3813   MVT MaskVT = MVT::getIntVectorWithNumElements(NewWidth);
3814   MVT MaskEltVT = MaskVT.getVectorElementType();
3815   MVT NewVT = MaskVT;
3816   switch (VT.getSimpleVT()) {
3817   default: assert(false && "Unexpected!");
3818   case MVT::v4f32: NewVT = MVT::v2f64; break;
3819   case MVT::v4i32: NewVT = MVT::v2i64; break;
3820   case MVT::v8i16: NewVT = MVT::v4i32; break;
3821   case MVT::v16i8: NewVT = MVT::v4i32; break;
3822   }
3823
3824   if (NewWidth == 2) {
3825     if (VT.isInteger())
3826       NewVT = MVT::v2i64;
3827     else
3828       NewVT = MVT::v2f64;
3829   }
3830   unsigned Scale = NumElems / NewWidth;
3831   SmallVector<SDValue, 8> MaskVec;
3832   for (unsigned i = 0; i < NumElems; i += Scale) {
3833     unsigned StartIdx = ~0U;
3834     for (unsigned j = 0; j < Scale; ++j) {
3835       SDValue Elt = PermMask.getOperand(i+j);
3836       if (Elt.getOpcode() == ISD::UNDEF)
3837         continue;
3838       unsigned EltIdx = cast<ConstantSDNode>(Elt)->getZExtValue();
3839       if (StartIdx == ~0U)
3840         StartIdx = EltIdx - (EltIdx % Scale);
3841       if (EltIdx != StartIdx + j)
3842         return SDValue();
3843     }
3844     if (StartIdx == ~0U)
3845       MaskVec.push_back(DAG.getUNDEF(MaskEltVT));
3846     else
3847       MaskVec.push_back(DAG.getConstant(StartIdx / Scale, MaskEltVT));
3848   }
3849
3850   V1 = DAG.getNode(ISD::BIT_CONVERT, dl, NewVT, V1);
3851   V2 = DAG.getNode(ISD::BIT_CONVERT, dl, NewVT, V2);
3852   return DAG.getNode(ISD::VECTOR_SHUFFLE, dl, NewVT, V1, V2,
3853                      DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT,
3854                                  &MaskVec[0], MaskVec.size()));
3855 }
3856
3857 /// getVZextMovL - Return a zero-extending vector move low node.
3858 ///
3859 static SDValue getVZextMovL(MVT VT, MVT OpVT,
3860                               SDValue SrcOp, SelectionDAG &DAG,
3861                               const X86Subtarget *Subtarget, DebugLoc dl) {
3862   if (VT == MVT::v2f64 || VT == MVT::v4f32) {
3863     LoadSDNode *LD = NULL;
3864     if (!isScalarLoadToVector(SrcOp.getNode(), &LD))
3865       LD = dyn_cast<LoadSDNode>(SrcOp);
3866     if (!LD) {
3867       // movssrr and movsdrr do not clear top bits. Try to use movd, movq
3868       // instead.
3869       MVT EVT = (OpVT == MVT::v2f64) ? MVT::i64 : MVT::i32;
3870       if ((EVT != MVT::i64 || Subtarget->is64Bit()) &&
3871           SrcOp.getOpcode() == ISD::SCALAR_TO_VECTOR &&
3872           SrcOp.getOperand(0).getOpcode() == ISD::BIT_CONVERT &&
3873           SrcOp.getOperand(0).getOperand(0).getValueType() == EVT) {
3874         // PR2108
3875         OpVT = (OpVT == MVT::v2f64) ? MVT::v2i64 : MVT::v4i32;
3876         return DAG.getNode(ISD::BIT_CONVERT, dl, VT,
3877                            DAG.getNode(X86ISD::VZEXT_MOVL, dl, OpVT,
3878                                        DAG.getNode(ISD::SCALAR_TO_VECTOR, dl,
3879                                                    OpVT,
3880                                                    SrcOp.getOperand(0)
3881                                                           .getOperand(0))));
3882       }
3883     }
3884   }
3885
3886   return DAG.getNode(ISD::BIT_CONVERT, dl, VT,
3887                      DAG.getNode(X86ISD::VZEXT_MOVL, dl, OpVT,
3888                                  DAG.getNode(ISD::BIT_CONVERT, dl, 
3889                                              OpVT, SrcOp)));
3890 }
3891
3892 /// LowerVECTOR_SHUFFLE_4wide - Handle all 4 wide cases with a number of
3893 /// shuffles.
3894 static SDValue
3895 LowerVECTOR_SHUFFLE_4wide(SDValue V1, SDValue V2,
3896                           SDValue PermMask, MVT VT, SelectionDAG &DAG,
3897                           DebugLoc dl) {
3898   MVT MaskVT = PermMask.getValueType();
3899   MVT MaskEVT = MaskVT.getVectorElementType();
3900   SmallVector<std::pair<int, int>, 8> Locs;
3901   Locs.resize(4);
3902   SmallVector<SDValue, 8> Mask1(4, DAG.getUNDEF(MaskEVT));
3903   unsigned NumHi = 0;
3904   unsigned NumLo = 0;
3905   for (unsigned i = 0; i != 4; ++i) {
3906     SDValue Elt = PermMask.getOperand(i);
3907     if (Elt.getOpcode() == ISD::UNDEF) {
3908       Locs[i] = std::make_pair(-1, -1);
3909     } else {
3910       unsigned Val = cast<ConstantSDNode>(Elt)->getZExtValue();
3911       assert(Val < 8 && "Invalid VECTOR_SHUFFLE index!");
3912       if (Val < 4) {
3913         Locs[i] = std::make_pair(0, NumLo);
3914         Mask1[NumLo] = Elt;
3915         NumLo++;
3916       } else {
3917         Locs[i] = std::make_pair(1, NumHi);
3918         if (2+NumHi < 4)
3919           Mask1[2+NumHi] = Elt;
3920         NumHi++;
3921       }
3922     }
3923   }
3924
3925   if (NumLo <= 2 && NumHi <= 2) {
3926     // If no more than two elements come from either vector. This can be
3927     // implemented with two shuffles. First shuffle gather the elements.
3928     // The second shuffle, which takes the first shuffle as both of its
3929     // vector operands, put the elements into the right order.
3930     V1 = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, V1, V2,
3931                      DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT,
3932                                  &Mask1[0], Mask1.size()));
3933
3934     SmallVector<SDValue, 8> Mask2(4, DAG.getUNDEF(MaskEVT));
3935     for (unsigned i = 0; i != 4; ++i) {
3936       if (Locs[i].first == -1)
3937         continue;
3938       else {
3939         unsigned Idx = (i < 2) ? 0 : 4;
3940         Idx += Locs[i].first * 2 + Locs[i].second;
3941         Mask2[i] = DAG.getConstant(Idx, MaskEVT);
3942       }
3943     }
3944
3945     return DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, V1, V1,
3946                        DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT,
3947                                    &Mask2[0], Mask2.size()));
3948   } else if (NumLo == 3 || NumHi == 3) {
3949     // Otherwise, we must have three elements from one vector, call it X, and
3950     // one element from the other, call it Y.  First, use a shufps to build an
3951     // intermediate vector with the one element from Y and the element from X
3952     // that will be in the same half in the final destination (the indexes don't
3953     // matter). Then, use a shufps to build the final vector, taking the half
3954     // containing the element from Y from the intermediate, and the other half
3955     // from X.
3956     if (NumHi == 3) {
3957       // Normalize it so the 3 elements come from V1.
3958       PermMask = CommuteVectorShuffleMask(PermMask, DAG, dl);
3959       std::swap(V1, V2);
3960     }
3961
3962     // Find the element from V2.
3963     unsigned HiIndex;
3964     for (HiIndex = 0; HiIndex < 3; ++HiIndex) {
3965       SDValue Elt = PermMask.getOperand(HiIndex);
3966       if (Elt.getOpcode() == ISD::UNDEF)
3967         continue;
3968       unsigned Val = cast<ConstantSDNode>(Elt)->getZExtValue();
3969       if (Val >= 4)
3970         break;
3971     }
3972
3973     Mask1[0] = PermMask.getOperand(HiIndex);
3974     Mask1[1] = DAG.getUNDEF(MaskEVT);
3975     Mask1[2] = PermMask.getOperand(HiIndex^1);
3976     Mask1[3] = DAG.getUNDEF(MaskEVT);
3977     V2 = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, V1, V2,
3978                      DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT, &Mask1[0], 4));
3979
3980     if (HiIndex >= 2) {
3981       Mask1[0] = PermMask.getOperand(0);
3982       Mask1[1] = PermMask.getOperand(1);
3983       Mask1[2] = DAG.getConstant(HiIndex & 1 ? 6 : 4, MaskEVT);
3984       Mask1[3] = DAG.getConstant(HiIndex & 1 ? 4 : 6, MaskEVT);
3985       return DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, V1, V2,
3986                          DAG.getNode(ISD::BUILD_VECTOR, dl, 
3987                                      MaskVT, &Mask1[0], 4));
3988     } else {
3989       Mask1[0] = DAG.getConstant(HiIndex & 1 ? 2 : 0, MaskEVT);
3990       Mask1[1] = DAG.getConstant(HiIndex & 1 ? 0 : 2, MaskEVT);
3991       Mask1[2] = PermMask.getOperand(2);
3992       Mask1[3] = PermMask.getOperand(3);
3993       if (Mask1[2].getOpcode() != ISD::UNDEF)
3994         Mask1[2] =
3995           DAG.getConstant(cast<ConstantSDNode>(Mask1[2])->getZExtValue()+4,
3996                           MaskEVT);
3997       if (Mask1[3].getOpcode() != ISD::UNDEF)
3998         Mask1[3] =
3999           DAG.getConstant(cast<ConstantSDNode>(Mask1[3])->getZExtValue()+4,
4000                           MaskEVT);
4001       return DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, V2, V1,
4002                          DAG.getNode(ISD::BUILD_VECTOR, dl, 
4003                                      MaskVT, &Mask1[0], 4));
4004     }
4005   }
4006
4007   // Break it into (shuffle shuffle_hi, shuffle_lo).
4008   Locs.clear();
4009   SmallVector<SDValue,8> LoMask(4, DAG.getUNDEF(MaskEVT));
4010   SmallVector<SDValue,8> HiMask(4, DAG.getUNDEF(MaskEVT));
4011   SmallVector<SDValue,8> *MaskPtr = &LoMask;
4012   unsigned MaskIdx = 0;
4013   unsigned LoIdx = 0;
4014   unsigned HiIdx = 2;
4015   for (unsigned i = 0; i != 4; ++i) {
4016     if (i == 2) {
4017       MaskPtr = &HiMask;
4018       MaskIdx = 1;
4019       LoIdx = 0;
4020       HiIdx = 2;
4021     }
4022     SDValue Elt = PermMask.getOperand(i);
4023     if (Elt.getOpcode() == ISD::UNDEF) {
4024       Locs[i] = std::make_pair(-1, -1);
4025     } else if (cast<ConstantSDNode>(Elt)->getZExtValue() < 4) {
4026       Locs[i] = std::make_pair(MaskIdx, LoIdx);
4027       (*MaskPtr)[LoIdx] = Elt;
4028       LoIdx++;
4029     } else {
4030       Locs[i] = std::make_pair(MaskIdx, HiIdx);
4031       (*MaskPtr)[HiIdx] = Elt;
4032       HiIdx++;
4033     }
4034   }
4035
4036   SDValue LoShuffle = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, V1, V2,
4037                                     DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT,
4038                                                 &LoMask[0], LoMask.size()));
4039   SDValue HiShuffle = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, V1, V2,
4040                                     DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT,
4041                                                 &HiMask[0], HiMask.size()));
4042   SmallVector<SDValue, 8> MaskOps;
4043   for (unsigned i = 0; i != 4; ++i) {
4044     if (Locs[i].first == -1) {
4045       MaskOps.push_back(DAG.getUNDEF(MaskEVT));
4046     } else {
4047       unsigned Idx = Locs[i].first * 4 + Locs[i].second;
4048       MaskOps.push_back(DAG.getConstant(Idx, MaskEVT));
4049     }
4050   }
4051   return DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, LoShuffle, HiShuffle,
4052                      DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT,
4053                                  &MaskOps[0], MaskOps.size()));
4054 }
4055
4056 SDValue
4057 X86TargetLowering::LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) {
4058   SDValue V1 = Op.getOperand(0);
4059   SDValue V2 = Op.getOperand(1);
4060   SDValue PermMask = Op.getOperand(2);
4061   MVT VT = Op.getValueType();
4062   DebugLoc dl = Op.getDebugLoc();
4063   unsigned NumElems = PermMask.getNumOperands();
4064   bool isMMX = VT.getSizeInBits() == 64;
4065   bool V1IsUndef = V1.getOpcode() == ISD::UNDEF;
4066   bool V2IsUndef = V2.getOpcode() == ISD::UNDEF;
4067   bool V1IsSplat = false;
4068   bool V2IsSplat = false;
4069
4070   if (isUndefShuffle(Op.getNode()))
4071     return DAG.getUNDEF(VT);
4072
4073   if (isZeroShuffle(Op.getNode()))
4074     return getZeroVector(VT, Subtarget->hasSSE2(), DAG, dl);
4075
4076   if (isIdentityMask(PermMask.getNode()))
4077     return V1;
4078   else if (isIdentityMask(PermMask.getNode(), true))
4079     return V2;
4080
4081   // Canonicalize movddup shuffles.
4082   if (V2IsUndef && Subtarget->hasSSE2() &&
4083       VT.getSizeInBits() == 128 &&
4084       X86::isMOVDDUPMask(PermMask.getNode()))
4085     return CanonicalizeMovddup(Op, V1, PermMask, DAG, Subtarget->hasSSE3());
4086
4087   if (isSplatMask(PermMask.getNode())) {
4088     if (isMMX || NumElems < 4) return Op;
4089     // Promote it to a v4{if}32 splat.
4090     return PromoteSplat(Op, DAG, Subtarget->hasSSE2());
4091   }
4092
4093   // If the shuffle can be profitably rewritten as a narrower shuffle, then
4094   // do it!
4095   if (VT == MVT::v8i16 || VT == MVT::v16i8) {
4096     SDValue NewOp= RewriteAsNarrowerShuffle(V1, V2, VT, PermMask, DAG,
4097                                             *this, dl);
4098     if (NewOp.getNode())
4099       return DAG.getNode(ISD::BIT_CONVERT, dl, VT, 
4100                          LowerVECTOR_SHUFFLE(NewOp, DAG));
4101   } else if ((VT == MVT::v4i32 || (VT == MVT::v4f32 && Subtarget->hasSSE2()))) {
4102     // FIXME: Figure out a cleaner way to do this.
4103     // Try to make use of movq to zero out the top part.
4104     if (ISD::isBuildVectorAllZeros(V2.getNode())) {
4105       SDValue NewOp = RewriteAsNarrowerShuffle(V1, V2, VT, PermMask,
4106                                                  DAG, *this, dl);
4107       if (NewOp.getNode()) {
4108         SDValue NewV1 = NewOp.getOperand(0);
4109         SDValue NewV2 = NewOp.getOperand(1);
4110         SDValue NewMask = NewOp.getOperand(2);
4111         if (isCommutedMOVL(NewMask.getNode(), true, false)) {
4112           NewOp = CommuteVectorShuffle(NewOp, NewV1, NewV2, NewMask, DAG);
4113           return getVZextMovL(VT, NewOp.getValueType(), NewV2, DAG, Subtarget,
4114                               dl);
4115         }
4116       }
4117     } else if (ISD::isBuildVectorAllZeros(V1.getNode())) {
4118       SDValue NewOp= RewriteAsNarrowerShuffle(V1, V2, VT, PermMask,
4119                                                 DAG, *this, dl);
4120       if (NewOp.getNode() && X86::isMOVLMask(NewOp.getOperand(2).getNode()))
4121         return getVZextMovL(VT, NewOp.getValueType(), NewOp.getOperand(1),
4122                              DAG, Subtarget, dl);
4123     }
4124   }
4125
4126   // Check if this can be converted into a logical shift.
4127   bool isLeft = false;
4128   unsigned ShAmt = 0;
4129   SDValue ShVal;
4130   bool isShift = isVectorShift(Op, PermMask, DAG, isLeft, ShVal, ShAmt);
4131   if (isShift && ShVal.hasOneUse()) {
4132     // If the shifted value has multiple uses, it may be cheaper to use 
4133     // v_set0 + movlhps or movhlps, etc.
4134     MVT EVT = VT.getVectorElementType();
4135     ShAmt *= EVT.getSizeInBits();
4136     return getVShift(isLeft, VT, ShVal, ShAmt, DAG, *this, dl);
4137   }
4138
4139   if (X86::isMOVLMask(PermMask.getNode())) {
4140     if (V1IsUndef)
4141       return V2;
4142     if (ISD::isBuildVectorAllZeros(V1.getNode()))
4143       return getVZextMovL(VT, VT, V2, DAG, Subtarget, dl);
4144     if (!isMMX)
4145       return Op;
4146   }
4147
4148   if (!isMMX && (X86::isMOVSHDUPMask(PermMask.getNode()) ||
4149                  X86::isMOVSLDUPMask(PermMask.getNode()) ||
4150                  X86::isMOVHLPSMask(PermMask.getNode()) ||
4151                  X86::isMOVHPMask(PermMask.getNode()) ||
4152                  X86::isMOVLPMask(PermMask.getNode())))
4153     return Op;
4154
4155   if (ShouldXformToMOVHLPS(PermMask.getNode()) ||
4156       ShouldXformToMOVLP(V1.getNode(), V2.getNode(), PermMask.getNode()))
4157     return CommuteVectorShuffle(Op, V1, V2, PermMask, DAG);
4158
4159   if (isShift) {
4160     // No better options. Use a vshl / vsrl.
4161     MVT EVT = VT.getVectorElementType();
4162     ShAmt *= EVT.getSizeInBits();
4163     return getVShift(isLeft, VT, ShVal, ShAmt, DAG, *this, dl);
4164   }
4165
4166   bool Commuted = false;
4167   // FIXME: This should also accept a bitcast of a splat?  Be careful, not
4168   // 1,1,1,1 -> v8i16 though.
4169   V1IsSplat = isSplatVector(V1.getNode());
4170   V2IsSplat = isSplatVector(V2.getNode());
4171   
4172   // Canonicalize the splat or undef, if present, to be on the RHS.
4173   if ((V1IsSplat || V1IsUndef) && !(V2IsSplat || V2IsUndef)) {
4174     Op = CommuteVectorShuffle(Op, V1, V2, PermMask, DAG);
4175     std::swap(V1IsSplat, V2IsSplat);
4176     std::swap(V1IsUndef, V2IsUndef);
4177     Commuted = true;
4178   }
4179
4180   // FIXME: Figure out a cleaner way to do this.
4181   if (isCommutedMOVL(PermMask.getNode(), V2IsSplat, V2IsUndef)) {
4182     if (V2IsUndef) return V1;
4183     Op = CommuteVectorShuffle(Op, V1, V2, PermMask, DAG);
4184     if (V2IsSplat) {
4185       // V2 is a splat, so the mask may be malformed. That is, it may point
4186       // to any V2 element. The instruction selectior won't like this. Get
4187       // a corrected mask and commute to form a proper MOVS{S|D}.
4188       SDValue NewMask = getMOVLMask(NumElems, DAG, dl);
4189       if (NewMask.getNode() != PermMask.getNode())
4190         Op = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, V1, V2, NewMask);
4191     }
4192     return Op;
4193   }
4194
4195   if (X86::isUNPCKL_v_undef_Mask(PermMask.getNode()) ||
4196       X86::isUNPCKH_v_undef_Mask(PermMask.getNode()) ||
4197       X86::isUNPCKLMask(PermMask.getNode()) ||
4198       X86::isUNPCKHMask(PermMask.getNode()))
4199     return Op;
4200
4201   if (V2IsSplat) {
4202     // Normalize mask so all entries that point to V2 points to its first
4203     // element then try to match unpck{h|l} again. If match, return a
4204     // new vector_shuffle with the corrected mask.
4205     SDValue NewMask = NormalizeMask(PermMask, DAG);
4206     if (NewMask.getNode() != PermMask.getNode()) {
4207       if (X86::isUNPCKLMask(NewMask.getNode(), true)) {
4208         SDValue NewMask = getUnpacklMask(NumElems, DAG, dl);
4209         return DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, V1, V2, NewMask);
4210       } else if (X86::isUNPCKHMask(NewMask.getNode(), true)) {
4211         SDValue NewMask = getUnpackhMask(NumElems, DAG, dl);
4212         return DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, V1, V2, NewMask);
4213       }
4214     }
4215   }
4216
4217   // Normalize the node to match x86 shuffle ops if needed
4218   if (V2.getOpcode() != ISD::UNDEF && isCommutedSHUFP(PermMask.getNode()))
4219       Op = CommuteVectorShuffle(Op, V1, V2, PermMask, DAG);
4220
4221   if (Commuted) {
4222     // Commute is back and try unpck* again.
4223     Op = CommuteVectorShuffle(Op, V1, V2, PermMask, DAG);
4224     if (X86::isUNPCKL_v_undef_Mask(PermMask.getNode()) ||
4225         X86::isUNPCKH_v_undef_Mask(PermMask.getNode()) ||
4226         X86::isUNPCKLMask(PermMask.getNode()) ||
4227         X86::isUNPCKHMask(PermMask.getNode()))
4228       return Op;
4229   }
4230
4231   // Try PSHUF* first, then SHUFP*.
4232   // MMX doesn't have PSHUFD but it does have PSHUFW. While it's theoretically
4233   // possible to shuffle a v2i32 using PSHUFW, that's not yet implemented.
4234   if (isMMX && NumElems == 4 && X86::isPSHUFDMask(PermMask.getNode())) {
4235     if (V2.getOpcode() != ISD::UNDEF)
4236       return DAG.getNode(ISD::VECTOR_SHUFFLE, dl, VT, V1,
4237                          DAG.getUNDEF(VT), PermMask);
4238     return Op;
4239   }
4240
4241   if (!isMMX) {
4242     if (Subtarget->hasSSE2() &&
4243         (X86::isPSHUFDMask(PermMask.getNode()) ||
4244          X86::isPSHUFHWMask(PermMask.getNode()) ||
4245          X86::isPSHUFLWMask(PermMask.getNode()))) {
4246       MVT RVT = VT;
4247       if (VT == MVT::v4f32) {
4248         RVT = MVT::v4i32;
4249         Op = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, RVT,
4250                          DAG.getNode(ISD::BIT_CONVERT, dl, RVT, V1),
4251                          DAG.getUNDEF(RVT), PermMask);
4252       } else if (V2.getOpcode() != ISD::UNDEF)
4253         Op = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, RVT, V1,
4254                          DAG.getUNDEF(RVT), PermMask);
4255       if (RVT != VT)
4256         Op = DAG.getNode(ISD::BIT_CONVERT, dl, VT, Op);
4257       return Op;
4258     }
4259
4260     // Binary or unary shufps.
4261     if (X86::isSHUFPMask(PermMask.getNode()) ||
4262         (V2.getOpcode() == ISD::UNDEF && X86::isPSHUFDMask(PermMask.getNode())))
4263       return Op;
4264   }
4265
4266   // Handle v8i16 specifically since SSE can do byte extraction and insertion.
4267   if (VT == MVT::v8i16) {
4268     SDValue NewOp = LowerVECTOR_SHUFFLEv8i16(V1, V2, PermMask, DAG, *this, dl);
4269     if (NewOp.getNode())
4270       return NewOp;
4271   }
4272
4273   // Handle all 4 wide cases with a number of shuffles except for MMX.
4274   if (NumElems == 4 && !isMMX)
4275     return LowerVECTOR_SHUFFLE_4wide(V1, V2, PermMask, VT, DAG, dl);
4276
4277   return SDValue();
4278 }
4279
4280 SDValue
4281 X86TargetLowering::LowerEXTRACT_VECTOR_ELT_SSE4(SDValue Op,
4282                                                 SelectionDAG &DAG) {
4283   MVT VT = Op.getValueType();
4284   DebugLoc dl = Op.getDebugLoc();
4285   if (VT.getSizeInBits() == 8) {
4286     SDValue Extract = DAG.getNode(X86ISD::PEXTRB, dl, MVT::i32,
4287                                     Op.getOperand(0), Op.getOperand(1));
4288     SDValue Assert  = DAG.getNode(ISD::AssertZext, dl, MVT::i32, Extract,
4289                                     DAG.getValueType(VT));
4290     return DAG.getNode(ISD::TRUNCATE, dl, VT, Assert);
4291   } else if (VT.getSizeInBits() == 16) {
4292     unsigned Idx = cast<ConstantSDNode>(Op.getOperand(1))->getZExtValue();
4293     // If Idx is 0, it's cheaper to do a move instead of a pextrw.
4294     if (Idx == 0)
4295       return DAG.getNode(ISD::TRUNCATE, dl, MVT::i16,
4296                          DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i32,
4297                                      DAG.getNode(ISD::BIT_CONVERT, dl,
4298                                                  MVT::v4i32,
4299                                                  Op.getOperand(0)),
4300                                      Op.getOperand(1)));
4301     SDValue Extract = DAG.getNode(X86ISD::PEXTRW, dl, MVT::i32,
4302                                     Op.getOperand(0), Op.getOperand(1));
4303     SDValue Assert  = DAG.getNode(ISD::AssertZext, dl, MVT::i32, Extract,
4304                                     DAG.getValueType(VT));
4305     return DAG.getNode(ISD::TRUNCATE, dl, VT, Assert);
4306   } else if (VT == MVT::f32) {
4307     // EXTRACTPS outputs to a GPR32 register which will require a movd to copy
4308     // the result back to FR32 register. It's only worth matching if the
4309     // result has a single use which is a store or a bitcast to i32.  And in
4310     // the case of a store, it's not worth it if the index is a constant 0,
4311     // because a MOVSSmr can be used instead, which is smaller and faster.
4312     if (!Op.hasOneUse())
4313       return SDValue();
4314     SDNode *User = *Op.getNode()->use_begin();
4315     if ((User->getOpcode() != ISD::STORE ||
4316          (isa<ConstantSDNode>(Op.getOperand(1)) &&
4317           cast<ConstantSDNode>(Op.getOperand(1))->isNullValue())) &&
4318         (User->getOpcode() != ISD::BIT_CONVERT ||
4319          User->getValueType(0) != MVT::i32))
4320       return SDValue();
4321     SDValue Extract = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i32,
4322                                   DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v4i32, 
4323                                               Op.getOperand(0)),
4324                                               Op.getOperand(1));
4325     return DAG.getNode(ISD::BIT_CONVERT, dl, MVT::f32, Extract);
4326   } else if (VT == MVT::i32) {
4327     // ExtractPS works with constant index.
4328     if (isa<ConstantSDNode>(Op.getOperand(1)))
4329       return Op;
4330   }
4331   return SDValue();
4332 }
4333
4334
4335 SDValue
4336 X86TargetLowering::LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) {
4337   if (!isa<ConstantSDNode>(Op.getOperand(1)))
4338     return SDValue();
4339
4340   if (Subtarget->hasSSE41()) {
4341     SDValue Res = LowerEXTRACT_VECTOR_ELT_SSE4(Op, DAG);
4342     if (Res.getNode())
4343       return Res;
4344   }
4345
4346   MVT VT = Op.getValueType();
4347   DebugLoc dl = Op.getDebugLoc();
4348   // TODO: handle v16i8.
4349   if (VT.getSizeInBits() == 16) {
4350     SDValue Vec = Op.getOperand(0);
4351     unsigned Idx = cast<ConstantSDNode>(Op.getOperand(1))->getZExtValue();
4352     if (Idx == 0)
4353       return DAG.getNode(ISD::TRUNCATE, dl, MVT::i16,
4354                          DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i32,
4355                                      DAG.getNode(ISD::BIT_CONVERT, dl, 
4356                                                  MVT::v4i32, Vec),
4357                                      Op.getOperand(1)));
4358     // Transform it so it match pextrw which produces a 32-bit result.
4359     MVT EVT = (MVT::SimpleValueType)(VT.getSimpleVT()+1);
4360     SDValue Extract = DAG.getNode(X86ISD::PEXTRW, dl, EVT,
4361                                     Op.getOperand(0), Op.getOperand(1));
4362     SDValue Assert  = DAG.getNode(ISD::AssertZext, dl, EVT, Extract,
4363                                     DAG.getValueType(VT));
4364     return DAG.getNode(ISD::TRUNCATE, dl, VT, Assert);
4365   } else if (VT.getSizeInBits() == 32) {
4366     unsigned Idx = cast<ConstantSDNode>(Op.getOperand(1))->getZExtValue();
4367     if (Idx == 0)
4368       return Op;
4369     // SHUFPS the element to the lowest double word, then movss.
4370     MVT MaskVT = MVT::getIntVectorWithNumElements(4);
4371     SmallVector<SDValue, 8> IdxVec;
4372     IdxVec.
4373       push_back(DAG.getConstant(Idx, MaskVT.getVectorElementType()));
4374     IdxVec.
4375       push_back(DAG.getUNDEF(MaskVT.getVectorElementType()));
4376     IdxVec.
4377       push_back(DAG.getUNDEF(MaskVT.getVectorElementType()));
4378     IdxVec.
4379       push_back(DAG.getUNDEF(MaskVT.getVectorElementType()));
4380     SDValue Mask = DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT,
4381                                  &IdxVec[0], IdxVec.size());
4382     SDValue Vec = Op.getOperand(0);
4383     Vec = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, Vec.getValueType(),
4384                       Vec, DAG.getUNDEF(Vec.getValueType()), Mask);
4385     return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, VT, Vec,
4386                        DAG.getIntPtrConstant(0));
4387   } else if (VT.getSizeInBits() == 64) {
4388     // FIXME: .td only matches this for <2 x f64>, not <2 x i64> on 32b
4389     // FIXME: seems like this should be unnecessary if mov{h,l}pd were taught
4390     //        to match extract_elt for f64.
4391     unsigned Idx = cast<ConstantSDNode>(Op.getOperand(1))->getZExtValue();
4392     if (Idx == 0)
4393       return Op;
4394
4395     // UNPCKHPD the element to the lowest double word, then movsd.
4396     // Note if the lower 64 bits of the result of the UNPCKHPD is then stored
4397     // to a f64mem, the whole operation is folded into a single MOVHPDmr.
4398     MVT MaskVT = MVT::getIntVectorWithNumElements(2);
4399     SmallVector<SDValue, 8> IdxVec;
4400     IdxVec.push_back(DAG.getConstant(1, MaskVT.getVectorElementType()));
4401     IdxVec.
4402       push_back(DAG.getUNDEF(MaskVT.getVectorElementType()));
4403     SDValue Mask = DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT,
4404                                  &IdxVec[0], IdxVec.size());
4405     SDValue Vec = Op.getOperand(0);
4406     Vec = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, Vec.getValueType(),
4407                       Vec, DAG.getUNDEF(Vec.getValueType()), 
4408                       Mask);
4409     return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, VT, Vec,
4410                        DAG.getIntPtrConstant(0));
4411   }
4412
4413   return SDValue();
4414 }
4415
4416 SDValue
4417 X86TargetLowering::LowerINSERT_VECTOR_ELT_SSE4(SDValue Op, SelectionDAG &DAG){
4418   MVT VT = Op.getValueType();
4419   MVT EVT = VT.getVectorElementType();
4420   DebugLoc dl = Op.getDebugLoc();
4421
4422   SDValue N0 = Op.getOperand(0);
4423   SDValue N1 = Op.getOperand(1);
4424   SDValue N2 = Op.getOperand(2);
4425
4426   if ((EVT.getSizeInBits() == 8 || EVT.getSizeInBits() == 16) &&
4427       isa<ConstantSDNode>(N2)) {
4428     unsigned Opc = (EVT.getSizeInBits() == 8) ? X86ISD::PINSRB
4429                                                   : X86ISD::PINSRW;
4430     // Transform it so it match pinsr{b,w} which expects a GR32 as its second
4431     // argument.
4432     if (N1.getValueType() != MVT::i32)
4433       N1 = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i32, N1);
4434     if (N2.getValueType() != MVT::i32)
4435       N2 = DAG.getIntPtrConstant(cast<ConstantSDNode>(N2)->getZExtValue());
4436     return DAG.getNode(Opc, dl, VT, N0, N1, N2);
4437   } else if (EVT == MVT::f32 && isa<ConstantSDNode>(N2)) {
4438     // Bits [7:6] of the constant are the source select.  This will always be
4439     //  zero here.  The DAG Combiner may combine an extract_elt index into these
4440     //  bits.  For example (insert (extract, 3), 2) could be matched by putting
4441     //  the '3' into bits [7:6] of X86ISD::INSERTPS.
4442     // Bits [5:4] of the constant are the destination select.  This is the 
4443     //  value of the incoming immediate.
4444     // Bits [3:0] of the constant are the zero mask.  The DAG Combiner may 
4445     //   combine either bitwise AND or insert of float 0.0 to set these bits.
4446     N2 = DAG.getIntPtrConstant(cast<ConstantSDNode>(N2)->getZExtValue() << 4);
4447     return DAG.getNode(X86ISD::INSERTPS, dl, VT, N0, N1, N2);
4448   } else if (EVT == MVT::i32) {
4449     // InsertPS works with constant index.
4450     if (isa<ConstantSDNode>(N2))
4451       return Op;
4452   }
4453   return SDValue();
4454 }
4455
4456 SDValue
4457 X86TargetLowering::LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) {
4458   MVT VT = Op.getValueType();
4459   MVT EVT = VT.getVectorElementType();
4460
4461   if (Subtarget->hasSSE41())
4462     return LowerINSERT_VECTOR_ELT_SSE4(Op, DAG);
4463
4464   if (EVT == MVT::i8)
4465     return SDValue();
4466
4467   DebugLoc dl = Op.getDebugLoc();
4468   SDValue N0 = Op.getOperand(0);
4469   SDValue N1 = Op.getOperand(1);
4470   SDValue N2 = Op.getOperand(2);
4471
4472   if (EVT.getSizeInBits() == 16) {
4473     // Transform it so it match pinsrw which expects a 16-bit value in a GR32
4474     // as its second argument.
4475     if (N1.getValueType() != MVT::i32)
4476       N1 = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i32, N1);
4477     if (N2.getValueType() != MVT::i32)
4478       N2 = DAG.getIntPtrConstant(cast<ConstantSDNode>(N2)->getZExtValue());
4479     return DAG.getNode(X86ISD::PINSRW, dl, VT, N0, N1, N2);
4480   }
4481   return SDValue();
4482 }
4483
4484 SDValue
4485 X86TargetLowering::LowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG) {
4486   DebugLoc dl = Op.getDebugLoc();
4487   if (Op.getValueType() == MVT::v2f32)
4488     return DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2f32,
4489                        DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v2i32,
4490                                    DAG.getNode(ISD::BIT_CONVERT, dl, MVT::i32,
4491                                                Op.getOperand(0))));
4492
4493   SDValue AnyExt = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i32, Op.getOperand(0));
4494   MVT VT = MVT::v2i32;
4495   switch (Op.getValueType().getSimpleVT()) {
4496   default: break;
4497   case MVT::v16i8:
4498   case MVT::v8i16:
4499     VT = MVT::v4i32;
4500     break;
4501   }
4502   return DAG.getNode(ISD::BIT_CONVERT, dl, Op.getValueType(),
4503                      DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, AnyExt));
4504 }
4505
4506 // ConstantPool, JumpTable, GlobalAddress, and ExternalSymbol are lowered as
4507 // their target countpart wrapped in the X86ISD::Wrapper node. Suppose N is
4508 // one of the above mentioned nodes. It has to be wrapped because otherwise
4509 // Select(N) returns N. So the raw TargetGlobalAddress nodes, etc. can only
4510 // be used to form addressing mode. These wrapped nodes will be selected
4511 // into MOV32ri.
4512 SDValue
4513 X86TargetLowering::LowerConstantPool(SDValue Op, SelectionDAG &DAG) {
4514   ConstantPoolSDNode *CP = cast<ConstantPoolSDNode>(Op);
4515   // FIXME there isn't really any debug info here, should come from the parent
4516   DebugLoc dl = CP->getDebugLoc();
4517   SDValue Result = DAG.getTargetConstantPool(CP->getConstVal(),
4518                                                getPointerTy(),
4519                                                CP->getAlignment());
4520   Result = DAG.getNode(X86ISD::Wrapper, dl, getPointerTy(), Result);
4521   // With PIC, the address is actually $g + Offset.
4522   if (getTargetMachine().getRelocationModel() == Reloc::PIC_ &&
4523       !Subtarget->isPICStyleRIPRel()) {
4524     Result = DAG.getNode(ISD::ADD, dl, getPointerTy(),
4525                          DAG.getNode(X86ISD::GlobalBaseReg,
4526                                      DebugLoc::getUnknownLoc(),
4527                                      getPointerTy()),
4528                          Result);
4529   }
4530
4531   return Result;
4532 }
4533
4534 SDValue
4535 X86TargetLowering::LowerGlobalAddress(const GlobalValue *GV, DebugLoc dl,
4536                                       int64_t Offset,
4537                                       SelectionDAG &DAG) const {
4538   bool IsPic = getTargetMachine().getRelocationModel() == Reloc::PIC_;
4539   bool ExtraLoadRequired =
4540     Subtarget->GVRequiresExtraLoad(GV, getTargetMachine(), false);
4541
4542   // Create the TargetGlobalAddress node, folding in the constant
4543   // offset if it is legal.
4544   SDValue Result;
4545   if (!IsPic && !ExtraLoadRequired && isInt32(Offset)) {
4546     Result = DAG.getTargetGlobalAddress(GV, getPointerTy(), Offset);
4547     Offset = 0;
4548   } else
4549     Result = DAG.getTargetGlobalAddress(GV, getPointerTy(), 0);
4550   Result = DAG.getNode(X86ISD::Wrapper, dl, getPointerTy(), Result);
4551
4552   // With PIC, the address is actually $g + Offset.
4553   if (IsPic && !Subtarget->isPICStyleRIPRel()) {
4554     Result = DAG.getNode(ISD::ADD, dl, getPointerTy(),
4555                          DAG.getNode(X86ISD::GlobalBaseReg, dl, getPointerTy()),
4556                          Result);
4557   }
4558   
4559   // For Darwin & Mingw32, external and weak symbols are indirect, so we want to
4560   // load the value at address GV, not the value of GV itself. This means that
4561   // the GlobalAddress must be in the base or index register of the address, not
4562   // the GV offset field. Platform check is inside GVRequiresExtraLoad() call
4563   // The same applies for external symbols during PIC codegen
4564   if (ExtraLoadRequired)
4565     Result = DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(), Result,
4566                          PseudoSourceValue::getGOT(), 0);
4567
4568   // If there was a non-zero offset that we didn't fold, create an explicit
4569   // addition for it.
4570   if (Offset != 0)
4571     Result = DAG.getNode(ISD::ADD, dl, getPointerTy(), Result,
4572                          DAG.getConstant(Offset, getPointerTy()));
4573
4574   return Result;
4575 }
4576
4577 SDValue
4578 X86TargetLowering::LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) {
4579   const GlobalValue *GV = cast<GlobalAddressSDNode>(Op)->getGlobal();
4580   int64_t Offset = cast<GlobalAddressSDNode>(Op)->getOffset();
4581   return LowerGlobalAddress(GV, Op.getDebugLoc(), Offset, DAG);
4582 }
4583
4584 // Lower ISD::GlobalTLSAddress using the "general dynamic" model, 32 bit
4585 static SDValue
4586 LowerToTLSGeneralDynamicModel32(GlobalAddressSDNode *GA, SelectionDAG &DAG,
4587                                 const MVT PtrVT) {
4588   SDValue InFlag;
4589   DebugLoc dl = GA->getDebugLoc();  // ? function entry point might be better
4590   SDValue Chain = DAG.getCopyToReg(DAG.getEntryNode(), dl, X86::EBX,
4591                                      DAG.getNode(X86ISD::GlobalBaseReg,
4592                                                  DebugLoc::getUnknownLoc(),
4593                                                  PtrVT), InFlag);
4594   InFlag = Chain.getValue(1);
4595
4596   // emit leal symbol@TLSGD(,%ebx,1), %eax
4597   SDVTList NodeTys = DAG.getVTList(PtrVT, MVT::Other, MVT::Flag);
4598   SDValue TGA = DAG.getTargetGlobalAddress(GA->getGlobal(),
4599                                              GA->getValueType(0),
4600                                              GA->getOffset());
4601   SDValue Ops[] = { Chain,  TGA, InFlag };
4602   SDValue Result = DAG.getNode(X86ISD::TLSADDR, dl, NodeTys, Ops, 3);
4603   InFlag = Result.getValue(2);
4604   Chain = Result.getValue(1);
4605
4606   // call ___tls_get_addr. This function receives its argument in
4607   // the register EAX.
4608   Chain = DAG.getCopyToReg(Chain, dl, X86::EAX, Result, InFlag);
4609   InFlag = Chain.getValue(1);
4610
4611   NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
4612   SDValue Ops1[] = { Chain,
4613                       DAG.getTargetExternalSymbol("___tls_get_addr",
4614                                                   PtrVT),
4615                       DAG.getRegister(X86::EAX, PtrVT),
4616                       DAG.getRegister(X86::EBX, PtrVT),
4617                       InFlag };
4618   Chain = DAG.getNode(X86ISD::CALL, dl, NodeTys, Ops1, 5);
4619   InFlag = Chain.getValue(1);
4620
4621   return DAG.getCopyFromReg(Chain, dl, X86::EAX, PtrVT, InFlag);
4622 }
4623
4624 // Lower ISD::GlobalTLSAddress using the "general dynamic" model, 64 bit
4625 static SDValue
4626 LowerToTLSGeneralDynamicModel64(GlobalAddressSDNode *GA, SelectionDAG &DAG,
4627                                 const MVT PtrVT) {
4628   SDValue InFlag, Chain;
4629   DebugLoc dl = GA->getDebugLoc();  // ? function entry point might be better
4630
4631   // emit leaq symbol@TLSGD(%rip), %rdi
4632   SDVTList NodeTys = DAG.getVTList(PtrVT, MVT::Other, MVT::Flag);
4633   SDValue TGA = DAG.getTargetGlobalAddress(GA->getGlobal(),
4634                                              GA->getValueType(0),
4635                                              GA->getOffset());
4636   SDValue Ops[]  = { DAG.getEntryNode(), TGA};
4637   SDValue Result = DAG.getNode(X86ISD::TLSADDR, dl, NodeTys, Ops, 2);
4638   Chain  = Result.getValue(1);
4639   InFlag = Result.getValue(2);
4640
4641   // call __tls_get_addr. This function receives its argument in
4642   // the register RDI.
4643   Chain = DAG.getCopyToReg(Chain, dl, X86::RDI, Result, InFlag);
4644   InFlag = Chain.getValue(1);
4645
4646   NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
4647   SDValue Ops1[] = { Chain,
4648                       DAG.getTargetExternalSymbol("__tls_get_addr",
4649                                                   PtrVT),
4650                       DAG.getRegister(X86::RDI, PtrVT),
4651                       InFlag };
4652   Chain = DAG.getNode(X86ISD::CALL, dl, NodeTys, Ops1, 4);
4653   InFlag = Chain.getValue(1);
4654
4655   return DAG.getCopyFromReg(Chain, dl, X86::RAX, PtrVT, InFlag);
4656 }
4657
4658 // Lower ISD::GlobalTLSAddress using the "initial exec" (for no-pic) or
4659 // "local exec" model.
4660 static SDValue LowerToTLSExecModel(GlobalAddressSDNode *GA, SelectionDAG &DAG,
4661                                      const MVT PtrVT) {
4662   DebugLoc dl = GA->getDebugLoc();
4663   // Get the Thread Pointer
4664   SDValue ThreadPointer = DAG.getNode(X86ISD::THREAD_POINTER,
4665                                       DebugLoc::getUnknownLoc(), PtrVT);
4666   // emit "addl x@ntpoff,%eax" (local exec) or "addl x@indntpoff,%eax" (initial
4667   // exec)
4668   SDValue TGA = DAG.getTargetGlobalAddress(GA->getGlobal(),
4669                                              GA->getValueType(0),
4670                                              GA->getOffset());
4671   SDValue Offset = DAG.getNode(X86ISD::Wrapper, dl, PtrVT, TGA);
4672
4673   if (GA->getGlobal()->isDeclaration()) // initial exec TLS model
4674     Offset = DAG.getLoad(PtrVT, dl, DAG.getEntryNode(), Offset,
4675                          PseudoSourceValue::getGOT(), 0);
4676
4677   // The address of the thread local variable is the add of the thread
4678   // pointer with the offset of the variable.
4679   return DAG.getNode(ISD::ADD, dl, PtrVT, ThreadPointer, Offset);
4680 }
4681
4682 SDValue
4683 X86TargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) {
4684   // TODO: implement the "local dynamic" model
4685   // TODO: implement the "initial exec"model for pic executables
4686   assert(Subtarget->isTargetELF() &&
4687          "TLS not implemented for non-ELF targets");
4688   GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(Op);
4689   // If the relocation model is PIC, use the "General Dynamic" TLS Model,
4690   // otherwise use the "Local Exec"TLS Model
4691   if (Subtarget->is64Bit()) {
4692     return LowerToTLSGeneralDynamicModel64(GA, DAG, getPointerTy());
4693   } else {
4694     if (getTargetMachine().getRelocationModel() == Reloc::PIC_)
4695       return LowerToTLSGeneralDynamicModel32(GA, DAG, getPointerTy());
4696     else
4697       return LowerToTLSExecModel(GA, DAG, getPointerTy());
4698   }
4699 }
4700
4701 SDValue
4702 X86TargetLowering::LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) {
4703   // FIXME there isn't really any debug info here
4704   DebugLoc dl = Op.getDebugLoc();
4705   const char *Sym = cast<ExternalSymbolSDNode>(Op)->getSymbol();
4706   SDValue Result = DAG.getTargetExternalSymbol(Sym, getPointerTy());
4707   Result = DAG.getNode(X86ISD::Wrapper, dl, getPointerTy(), Result);
4708   // With PIC, the address is actually $g + Offset.
4709   if (getTargetMachine().getRelocationModel() == Reloc::PIC_ &&
4710       !Subtarget->isPICStyleRIPRel()) {
4711     Result = DAG.getNode(ISD::ADD, dl, getPointerTy(),
4712                          DAG.getNode(X86ISD::GlobalBaseReg, 
4713                                      DebugLoc::getUnknownLoc(),
4714                                      getPointerTy()),
4715                          Result);
4716   }
4717
4718   return Result;
4719 }
4720
4721 SDValue X86TargetLowering::LowerJumpTable(SDValue Op, SelectionDAG &DAG) {
4722   JumpTableSDNode *JT = cast<JumpTableSDNode>(Op);
4723   // FIXME there isn't really any debug into here
4724   DebugLoc dl = JT->getDebugLoc();
4725   SDValue Result = DAG.getTargetJumpTable(JT->getIndex(), getPointerTy());
4726   Result = DAG.getNode(X86ISD::Wrapper, dl, getPointerTy(), Result);
4727   // With PIC, the address is actually $g + Offset.
4728   if (getTargetMachine().getRelocationModel() == Reloc::PIC_ &&
4729       !Subtarget->isPICStyleRIPRel()) {
4730     Result = DAG.getNode(ISD::ADD, dl, getPointerTy(),
4731                          DAG.getNode(X86ISD::GlobalBaseReg,
4732                                      DebugLoc::getUnknownLoc(),
4733                                      getPointerTy()),
4734                          Result);
4735   }
4736
4737   return Result;
4738 }
4739
4740 /// LowerShift - Lower SRA_PARTS and friends, which return two i32 values and
4741 /// take a 2 x i32 value to shift plus a shift amount. 
4742 SDValue X86TargetLowering::LowerShift(SDValue Op, SelectionDAG &DAG) {
4743   assert(Op.getNumOperands() == 3 && "Not a double-shift!");
4744   MVT VT = Op.getValueType();
4745   unsigned VTBits = VT.getSizeInBits();
4746   DebugLoc dl = Op.getDebugLoc();
4747   bool isSRA = Op.getOpcode() == ISD::SRA_PARTS;
4748   SDValue ShOpLo = Op.getOperand(0);
4749   SDValue ShOpHi = Op.getOperand(1);
4750   SDValue ShAmt  = Op.getOperand(2);
4751   SDValue Tmp1 = isSRA ?
4752     DAG.getNode(ISD::SRA, dl, VT, ShOpHi, 
4753                 DAG.getConstant(VTBits - 1, MVT::i8)) :
4754     DAG.getConstant(0, VT);
4755
4756   SDValue Tmp2, Tmp3;
4757   if (Op.getOpcode() == ISD::SHL_PARTS) {
4758     Tmp2 = DAG.getNode(X86ISD::SHLD, dl, VT, ShOpHi, ShOpLo, ShAmt);
4759     Tmp3 = DAG.getNode(ISD::SHL, dl, VT, ShOpLo, ShAmt);
4760   } else {
4761     Tmp2 = DAG.getNode(X86ISD::SHRD, dl, VT, ShOpLo, ShOpHi, ShAmt);
4762     Tmp3 = DAG.getNode(isSRA ? ISD::SRA : ISD::SRL, dl, VT, ShOpHi, ShAmt);
4763   }
4764
4765   SDValue AndNode = DAG.getNode(ISD::AND, dl, MVT::i8, ShAmt,
4766                                   DAG.getConstant(VTBits, MVT::i8));
4767   SDValue Cond = DAG.getNode(X86ISD::CMP, dl, VT,
4768                                AndNode, DAG.getConstant(0, MVT::i8));
4769
4770   SDValue Hi, Lo;
4771   SDValue CC = DAG.getConstant(X86::COND_NE, MVT::i8);
4772   SDValue Ops0[4] = { Tmp2, Tmp3, CC, Cond };
4773   SDValue Ops1[4] = { Tmp3, Tmp1, CC, Cond };
4774
4775   if (Op.getOpcode() == ISD::SHL_PARTS) {
4776     Hi = DAG.getNode(X86ISD::CMOV, dl, VT, Ops0, 4);
4777     Lo = DAG.getNode(X86ISD::CMOV, dl, VT, Ops1, 4);
4778   } else {
4779     Lo = DAG.getNode(X86ISD::CMOV, dl, VT, Ops0, 4);
4780     Hi = DAG.getNode(X86ISD::CMOV, dl, VT, Ops1, 4);
4781   }
4782
4783   SDValue Ops[2] = { Lo, Hi };
4784   return DAG.getMergeValues(Ops, 2, dl);
4785 }
4786
4787 SDValue X86TargetLowering::LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG) {
4788   MVT SrcVT = Op.getOperand(0).getValueType();
4789   assert(SrcVT.getSimpleVT() <= MVT::i64 && SrcVT.getSimpleVT() >= MVT::i16 &&
4790          "Unknown SINT_TO_FP to lower!");
4791   
4792   // These are really Legal; caller falls through into that case.
4793   if (SrcVT == MVT::i32 && isScalarFPTypeInSSEReg(Op.getValueType()))
4794     return SDValue();
4795   if (SrcVT == MVT::i64 && Op.getValueType() != MVT::f80 && 
4796       Subtarget->is64Bit())
4797     return SDValue();
4798   
4799   DebugLoc dl = Op.getDebugLoc();
4800   unsigned Size = SrcVT.getSizeInBits()/8;
4801   MachineFunction &MF = DAG.getMachineFunction();
4802   int SSFI = MF.getFrameInfo()->CreateStackObject(Size, Size);
4803   SDValue StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
4804   SDValue Chain = DAG.getStore(DAG.getEntryNode(), dl, Op.getOperand(0),
4805                                  StackSlot,
4806                                  PseudoSourceValue::getFixedStack(SSFI), 0);
4807
4808   // Build the FILD
4809   SDVTList Tys;
4810   bool useSSE = isScalarFPTypeInSSEReg(Op.getValueType());
4811   if (useSSE)
4812     Tys = DAG.getVTList(MVT::f64, MVT::Other, MVT::Flag);
4813   else
4814     Tys = DAG.getVTList(Op.getValueType(), MVT::Other);
4815   SmallVector<SDValue, 8> Ops;
4816   Ops.push_back(Chain);
4817   Ops.push_back(StackSlot);
4818   Ops.push_back(DAG.getValueType(SrcVT));
4819   SDValue Result = DAG.getNode(useSSE ? X86ISD::FILD_FLAG : X86ISD::FILD, dl,
4820                                  Tys, &Ops[0], Ops.size());
4821
4822   if (useSSE) {
4823     Chain = Result.getValue(1);
4824     SDValue InFlag = Result.getValue(2);
4825
4826     // FIXME: Currently the FST is flagged to the FILD_FLAG. This
4827     // shouldn't be necessary except that RFP cannot be live across
4828     // multiple blocks. When stackifier is fixed, they can be uncoupled.
4829     MachineFunction &MF = DAG.getMachineFunction();
4830     int SSFI = MF.getFrameInfo()->CreateStackObject(8, 8);
4831     SDValue StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
4832     Tys = DAG.getVTList(MVT::Other);
4833     SmallVector<SDValue, 8> Ops;
4834     Ops.push_back(Chain);
4835     Ops.push_back(Result);
4836     Ops.push_back(StackSlot);
4837     Ops.push_back(DAG.getValueType(Op.getValueType()));
4838     Ops.push_back(InFlag);
4839     Chain = DAG.getNode(X86ISD::FST, dl, Tys, &Ops[0], Ops.size());
4840     Result = DAG.getLoad(Op.getValueType(), dl, Chain, StackSlot,
4841                          PseudoSourceValue::getFixedStack(SSFI), 0);
4842   }
4843
4844   return Result;
4845 }
4846
4847 // LowerUINT_TO_FP_i64 - 64-bit unsigned integer to double expansion.
4848 SDValue X86TargetLowering::LowerUINT_TO_FP_i64(SDValue Op, SelectionDAG &DAG) {
4849   // This algorithm is not obvious. Here it is in C code, more or less:
4850   /*
4851     double uint64_to_double( uint32_t hi, uint32_t lo ) {
4852       static const __m128i exp = { 0x4330000045300000ULL, 0 };
4853       static const __m128d bias = { 0x1.0p84, 0x1.0p52 };
4854
4855       // Copy ints to xmm registers.
4856       __m128i xh = _mm_cvtsi32_si128( hi );
4857       __m128i xl = _mm_cvtsi32_si128( lo );
4858
4859       // Combine into low half of a single xmm register.
4860       __m128i x = _mm_unpacklo_epi32( xh, xl );
4861       __m128d d;
4862       double sd;
4863
4864       // Merge in appropriate exponents to give the integer bits the right
4865       // magnitude.
4866       x = _mm_unpacklo_epi32( x, exp );
4867
4868       // Subtract away the biases to deal with the IEEE-754 double precision
4869       // implicit 1.
4870       d = _mm_sub_pd( (__m128d) x, bias );
4871
4872       // All conversions up to here are exact. The correctly rounded result is
4873       // calculated using the current rounding mode using the following
4874       // horizontal add.
4875       d = _mm_add_sd( d, _mm_unpackhi_pd( d, d ) );
4876       _mm_store_sd( &sd, d );   // Because we are returning doubles in XMM, this
4877                                 // store doesn't really need to be here (except
4878                                 // maybe to zero the other double)
4879       return sd;
4880     }
4881   */
4882
4883   DebugLoc dl = Op.getDebugLoc();
4884
4885   // Build some magic constants.
4886   std::vector<Constant*> CV0;
4887   CV0.push_back(ConstantInt::get(APInt(32, 0x45300000)));
4888   CV0.push_back(ConstantInt::get(APInt(32, 0x43300000)));
4889   CV0.push_back(ConstantInt::get(APInt(32, 0)));
4890   CV0.push_back(ConstantInt::get(APInt(32, 0)));
4891   Constant *C0 = ConstantVector::get(CV0);
4892   SDValue CPIdx0 = DAG.getConstantPool(C0, getPointerTy(), 4);
4893
4894   std::vector<Constant*> CV1;
4895   CV1.push_back(ConstantFP::get(APFloat(APInt(64, 0x4530000000000000ULL))));
4896   CV1.push_back(ConstantFP::get(APFloat(APInt(64, 0x4330000000000000ULL))));
4897   Constant *C1 = ConstantVector::get(CV1);
4898   SDValue CPIdx1 = DAG.getConstantPool(C1, getPointerTy(), 4);
4899
4900   SmallVector<SDValue, 4> MaskVec;
4901   MaskVec.push_back(DAG.getConstant(0, MVT::i32));
4902   MaskVec.push_back(DAG.getConstant(4, MVT::i32));
4903   MaskVec.push_back(DAG.getConstant(1, MVT::i32));
4904   MaskVec.push_back(DAG.getConstant(5, MVT::i32));
4905   SDValue UnpcklMask = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v4i32, 
4906                                    &MaskVec[0], MaskVec.size());
4907   SmallVector<SDValue, 4> MaskVec2;
4908   MaskVec2.push_back(DAG.getConstant(1, MVT::i32));
4909   MaskVec2.push_back(DAG.getConstant(0, MVT::i32));
4910   SDValue ShufMask = DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v2i32, 
4911                                  &MaskVec2[0], MaskVec2.size());
4912
4913   SDValue XR1 = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v4i32,
4914                             DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
4915                                         Op.getOperand(0),
4916                                         DAG.getIntPtrConstant(1)));
4917   SDValue XR2 = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v4i32,
4918                             DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
4919                                         Op.getOperand(0),
4920                                         DAG.getIntPtrConstant(0)));
4921   SDValue Unpck1 = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, MVT::v4i32,
4922                                 XR1, XR2, UnpcklMask);
4923   SDValue CLod0 = DAG.getLoad(MVT::v4i32, dl, DAG.getEntryNode(), CPIdx0,
4924                               PseudoSourceValue::getConstantPool(), 0,
4925                               false, 16);
4926   SDValue Unpck2 = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, MVT::v4i32,
4927                                Unpck1, CLod0, UnpcklMask);
4928   SDValue XR2F = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2f64, Unpck2);
4929   SDValue CLod1 = DAG.getLoad(MVT::v2f64, dl, CLod0.getValue(1), CPIdx1,
4930                               PseudoSourceValue::getConstantPool(), 0,
4931                               false, 16);
4932   SDValue Sub = DAG.getNode(ISD::FSUB, dl, MVT::v2f64, XR2F, CLod1);
4933
4934   // Add the halves; easiest way is to swap them into another reg first.
4935   SDValue Shuf = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, MVT::v2f64,
4936                              Sub, Sub, ShufMask);
4937   SDValue Add = DAG.getNode(ISD::FADD, dl, MVT::v2f64, Shuf, Sub);
4938   return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::f64, Add,
4939                      DAG.getIntPtrConstant(0));
4940 }
4941
4942 // LowerUINT_TO_FP_i32 - 32-bit unsigned integer to float expansion.
4943 SDValue X86TargetLowering::LowerUINT_TO_FP_i32(SDValue Op, SelectionDAG &DAG) {
4944   DebugLoc dl = Op.getDebugLoc();
4945   // FP constant to bias correct the final result.
4946   SDValue Bias = DAG.getConstantFP(BitsToDouble(0x4330000000000000ULL),
4947                                    MVT::f64);
4948
4949   // Load the 32-bit value into an XMM register.
4950   SDValue Load = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v4i32,
4951                              DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
4952                                          Op.getOperand(0),
4953                                          DAG.getIntPtrConstant(0)));
4954
4955   Load = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::f64,
4956                      DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2f64, Load),
4957                      DAG.getIntPtrConstant(0));
4958
4959   // Or the load with the bias.
4960   SDValue Or = DAG.getNode(ISD::OR, dl, MVT::v2i64,
4961                            DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2i64,
4962                                        DAG.getNode(ISD::SCALAR_TO_VECTOR, dl,
4963                                                    MVT::v2f64, Load)),
4964                            DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2i64,
4965                                        DAG.getNode(ISD::SCALAR_TO_VECTOR, dl,
4966                                                    MVT::v2f64, Bias)));
4967   Or = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::f64,
4968                    DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2f64, Or),
4969                    DAG.getIntPtrConstant(0));
4970
4971   // Subtract the bias.
4972   SDValue Sub = DAG.getNode(ISD::FSUB, dl, MVT::f64, Or, Bias);
4973
4974   // Handle final rounding.
4975   MVT DestVT = Op.getValueType();
4976
4977   if (DestVT.bitsLT(MVT::f64)) {
4978     return DAG.getNode(ISD::FP_ROUND, dl, DestVT, Sub,
4979                        DAG.getIntPtrConstant(0));
4980   } else if (DestVT.bitsGT(MVT::f64)) {
4981     return DAG.getNode(ISD::FP_EXTEND, dl, DestVT, Sub);
4982   }
4983
4984   // Handle final rounding.
4985   return Sub;
4986 }
4987
4988 SDValue X86TargetLowering::LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG) {
4989   SDValue N0 = Op.getOperand(0);
4990   DebugLoc dl = Op.getDebugLoc();
4991
4992   // Now not UINT_TO_FP is legal (it's marked custom), dag combiner won't
4993   // optimize it to a SINT_TO_FP when the sign bit is known zero. Perform
4994   // the optimization here.
4995   if (DAG.SignBitIsZero(N0))
4996     return DAG.getNode(ISD::SINT_TO_FP, dl, Op.getValueType(), N0);
4997
4998   MVT SrcVT = N0.getValueType();
4999   if (SrcVT == MVT::i64) {
5000     // We only handle SSE2 f64 target here; caller can handle the rest.
5001     if (Op.getValueType() != MVT::f64 || !X86ScalarSSEf64)
5002       return SDValue();
5003
5004     return LowerUINT_TO_FP_i64(Op, DAG);
5005   } else if (SrcVT == MVT::i32) {
5006     return LowerUINT_TO_FP_i32(Op, DAG);
5007   }
5008
5009   assert(0 && "Unknown UINT_TO_FP to lower!");
5010   return SDValue();
5011 }
5012
5013 std::pair<SDValue,SDValue> X86TargetLowering::
5014 FP_TO_SINTHelper(SDValue Op, SelectionDAG &DAG) {
5015   DebugLoc dl = Op.getDebugLoc();
5016   assert(Op.getValueType().getSimpleVT() <= MVT::i64 &&
5017          Op.getValueType().getSimpleVT() >= MVT::i16 &&
5018          "Unknown FP_TO_SINT to lower!");
5019
5020   // These are really Legal.
5021   if (Op.getValueType() == MVT::i32 && 
5022       isScalarFPTypeInSSEReg(Op.getOperand(0).getValueType()))
5023     return std::make_pair(SDValue(), SDValue());
5024   if (Subtarget->is64Bit() &&
5025       Op.getValueType() == MVT::i64 &&
5026       Op.getOperand(0).getValueType() != MVT::f80)
5027     return std::make_pair(SDValue(), SDValue());
5028
5029   // We lower FP->sint64 into FISTP64, followed by a load, all to a temporary
5030   // stack slot.
5031   MachineFunction &MF = DAG.getMachineFunction();
5032   unsigned MemSize = Op.getValueType().getSizeInBits()/8;
5033   int SSFI = MF.getFrameInfo()->CreateStackObject(MemSize, MemSize);
5034   SDValue StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
5035   unsigned Opc;
5036   switch (Op.getValueType().getSimpleVT()) {
5037   default: assert(0 && "Invalid FP_TO_SINT to lower!");
5038   case MVT::i16: Opc = X86ISD::FP_TO_INT16_IN_MEM; break;
5039   case MVT::i32: Opc = X86ISD::FP_TO_INT32_IN_MEM; break;
5040   case MVT::i64: Opc = X86ISD::FP_TO_INT64_IN_MEM; break;
5041   }
5042
5043   SDValue Chain = DAG.getEntryNode();
5044   SDValue Value = Op.getOperand(0);
5045   if (isScalarFPTypeInSSEReg(Op.getOperand(0).getValueType())) {
5046     assert(Op.getValueType() == MVT::i64 && "Invalid FP_TO_SINT to lower!");
5047     Chain = DAG.getStore(Chain, dl, Value, StackSlot,
5048                          PseudoSourceValue::getFixedStack(SSFI), 0);
5049     SDVTList Tys = DAG.getVTList(Op.getOperand(0).getValueType(), MVT::Other);
5050     SDValue Ops[] = {
5051       Chain, StackSlot, DAG.getValueType(Op.getOperand(0).getValueType())
5052     };
5053     Value = DAG.getNode(X86ISD::FLD, dl, Tys, Ops, 3);
5054     Chain = Value.getValue(1);
5055     SSFI = MF.getFrameInfo()->CreateStackObject(MemSize, MemSize);
5056     StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
5057   }
5058
5059   // Build the FP_TO_INT*_IN_MEM
5060   SDValue Ops[] = { Chain, Value, StackSlot };
5061   SDValue FIST = DAG.getNode(Opc, dl, MVT::Other, Ops, 3);
5062
5063   return std::make_pair(FIST, StackSlot);
5064 }
5065
5066 SDValue X86TargetLowering::LowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) {
5067   std::pair<SDValue,SDValue> Vals = FP_TO_SINTHelper(Op, DAG);
5068   SDValue FIST = Vals.first, StackSlot = Vals.second;
5069   if (FIST.getNode() == 0) return SDValue();
5070   
5071   // Load the result.
5072   return DAG.getLoad(Op.getValueType(), Op.getDebugLoc(),
5073                      FIST, StackSlot, NULL, 0);
5074 }
5075
5076 SDValue X86TargetLowering::LowerFABS(SDValue Op, SelectionDAG &DAG) {
5077   DebugLoc dl = Op.getDebugLoc();
5078   MVT VT = Op.getValueType();
5079   MVT EltVT = VT;
5080   if (VT.isVector())
5081     EltVT = VT.getVectorElementType();
5082   std::vector<Constant*> CV;
5083   if (EltVT == MVT::f64) {
5084     Constant *C = ConstantFP::get(APFloat(APInt(64, ~(1ULL << 63))));
5085     CV.push_back(C);
5086     CV.push_back(C);
5087   } else {
5088     Constant *C = ConstantFP::get(APFloat(APInt(32, ~(1U << 31))));
5089     CV.push_back(C);
5090     CV.push_back(C);
5091     CV.push_back(C);
5092     CV.push_back(C);
5093   }
5094   Constant *C = ConstantVector::get(CV);
5095   SDValue CPIdx = DAG.getConstantPool(C, getPointerTy(), 4);
5096   SDValue Mask = DAG.getLoad(VT, dl, DAG.getEntryNode(), CPIdx,
5097                                PseudoSourceValue::getConstantPool(), 0,
5098                                false, 16);
5099   return DAG.getNode(X86ISD::FAND, dl, VT, Op.getOperand(0), Mask);
5100 }
5101
5102 SDValue X86TargetLowering::LowerFNEG(SDValue Op, SelectionDAG &DAG) {
5103   DebugLoc dl = Op.getDebugLoc();
5104   MVT VT = Op.getValueType();
5105   MVT EltVT = VT;
5106   unsigned EltNum = 1;
5107   if (VT.isVector()) {
5108     EltVT = VT.getVectorElementType();
5109     EltNum = VT.getVectorNumElements();
5110   }
5111   std::vector<Constant*> CV;
5112   if (EltVT == MVT::f64) {
5113     Constant *C = ConstantFP::get(APFloat(APInt(64, 1ULL << 63)));
5114     CV.push_back(C);
5115     CV.push_back(C);
5116   } else {
5117     Constant *C = ConstantFP::get(APFloat(APInt(32, 1U << 31)));
5118     CV.push_back(C);
5119     CV.push_back(C);
5120     CV.push_back(C);
5121     CV.push_back(C);
5122   }
5123   Constant *C = ConstantVector::get(CV);
5124   SDValue CPIdx = DAG.getConstantPool(C, getPointerTy(), 4);
5125   SDValue Mask = DAG.getLoad(VT, dl, DAG.getEntryNode(), CPIdx,
5126                                PseudoSourceValue::getConstantPool(), 0,
5127                                false, 16);
5128   if (VT.isVector()) {
5129     return DAG.getNode(ISD::BIT_CONVERT, dl, VT,
5130                        DAG.getNode(ISD::XOR, dl, MVT::v2i64,
5131                     DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2i64, 
5132                                 Op.getOperand(0)),
5133                     DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v2i64, Mask)));
5134   } else {
5135     return DAG.getNode(X86ISD::FXOR, dl, VT, Op.getOperand(0), Mask);
5136   }
5137 }
5138
5139 SDValue X86TargetLowering::LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) {
5140   SDValue Op0 = Op.getOperand(0);
5141   SDValue Op1 = Op.getOperand(1);
5142   DebugLoc dl = Op.getDebugLoc();
5143   MVT VT = Op.getValueType();
5144   MVT SrcVT = Op1.getValueType();
5145
5146   // If second operand is smaller, extend it first.
5147   if (SrcVT.bitsLT(VT)) {
5148     Op1 = DAG.getNode(ISD::FP_EXTEND, dl, VT, Op1);
5149     SrcVT = VT;
5150   }
5151   // And if it is bigger, shrink it first.
5152   if (SrcVT.bitsGT(VT)) {
5153     Op1 = DAG.getNode(ISD::FP_ROUND, dl, VT, Op1, DAG.getIntPtrConstant(1));
5154     SrcVT = VT;
5155   }
5156
5157   // At this point the operands and the result should have the same
5158   // type, and that won't be f80 since that is not custom lowered.
5159
5160   // First get the sign bit of second operand.
5161   std::vector<Constant*> CV;
5162   if (SrcVT == MVT::f64) {
5163     CV.push_back(ConstantFP::get(APFloat(APInt(64, 1ULL << 63))));
5164     CV.push_back(ConstantFP::get(APFloat(APInt(64, 0))));
5165   } else {
5166     CV.push_back(ConstantFP::get(APFloat(APInt(32, 1U << 31))));
5167     CV.push_back(ConstantFP::get(APFloat(APInt(32, 0))));
5168     CV.push_back(ConstantFP::get(APFloat(APInt(32, 0))));
5169     CV.push_back(ConstantFP::get(APFloat(APInt(32, 0))));
5170   }
5171   Constant *C = ConstantVector::get(CV);
5172   SDValue CPIdx = DAG.getConstantPool(C, getPointerTy(), 4);
5173   SDValue Mask1 = DAG.getLoad(SrcVT, dl, DAG.getEntryNode(), CPIdx,
5174                                 PseudoSourceValue::getConstantPool(), 0,
5175                                 false, 16);
5176   SDValue SignBit = DAG.getNode(X86ISD::FAND, dl, SrcVT, Op1, Mask1);
5177
5178   // Shift sign bit right or left if the two operands have different types.
5179   if (SrcVT.bitsGT(VT)) {
5180     // Op0 is MVT::f32, Op1 is MVT::f64.
5181     SignBit = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, MVT::v2f64, SignBit);
5182     SignBit = DAG.getNode(X86ISD::FSRL, dl, MVT::v2f64, SignBit,
5183                           DAG.getConstant(32, MVT::i32));
5184     SignBit = DAG.getNode(ISD::BIT_CONVERT, dl, MVT::v4f32, SignBit);
5185     SignBit = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::f32, SignBit,
5186                           DAG.getIntPtrConstant(0));
5187   }
5188
5189   // Clear first operand sign bit.
5190   CV.clear();
5191   if (VT == MVT::f64) {
5192     CV.push_back(ConstantFP::get(APFloat(APInt(64, ~(1ULL << 63)))));
5193     CV.push_back(ConstantFP::get(APFloat(APInt(64, 0))));
5194   } else {
5195     CV.push_back(ConstantFP::get(APFloat(APInt(32, ~(1U << 31)))));
5196     CV.push_back(ConstantFP::get(APFloat(APInt(32, 0))));
5197     CV.push_back(ConstantFP::get(APFloat(APInt(32, 0))));
5198     CV.push_back(ConstantFP::get(APFloat(APInt(32, 0))));
5199   }
5200   C = ConstantVector::get(CV);
5201   CPIdx = DAG.getConstantPool(C, getPointerTy(), 4);
5202   SDValue Mask2 = DAG.getLoad(VT, dl, DAG.getEntryNode(), CPIdx,
5203                                 PseudoSourceValue::getConstantPool(), 0,
5204                                 false, 16);
5205   SDValue Val = DAG.getNode(X86ISD::FAND, dl, VT, Op0, Mask2);
5206
5207   // Or the value with the sign bit.
5208   return DAG.getNode(X86ISD::FOR, dl, VT, Val, SignBit);
5209 }
5210
5211 SDValue X86TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) {
5212   assert(Op.getValueType() == MVT::i8 && "SetCC type must be 8-bit integer");
5213   SDValue Op0 = Op.getOperand(0);
5214   SDValue Op1 = Op.getOperand(1);
5215   DebugLoc dl = Op.getDebugLoc();
5216   ISD::CondCode CC = cast<CondCodeSDNode>(Op.getOperand(2))->get();
5217   
5218   // Lower (X & (1 << N)) == 0 to BT(X, N).
5219   // Lower ((X >>u N) & 1) != 0 to BT(X, N).
5220   // Lower ((X >>s N) & 1) != 0 to BT(X, N).
5221   if (Op0.getOpcode() == ISD::AND &&
5222       Op0.hasOneUse() &&
5223       Op1.getOpcode() == ISD::Constant &&
5224       cast<ConstantSDNode>(Op1)->getZExtValue() == 0 &&
5225       (CC == ISD::SETEQ || CC == ISD::SETNE)) {
5226     SDValue LHS, RHS;
5227     if (Op0.getOperand(1).getOpcode() == ISD::SHL) {
5228       if (ConstantSDNode *Op010C =
5229             dyn_cast<ConstantSDNode>(Op0.getOperand(1).getOperand(0)))
5230         if (Op010C->getZExtValue() == 1) {
5231           LHS = Op0.getOperand(0);
5232           RHS = Op0.getOperand(1).getOperand(1);
5233         }
5234     } else if (Op0.getOperand(0).getOpcode() == ISD::SHL) {
5235       if (ConstantSDNode *Op000C =
5236             dyn_cast<ConstantSDNode>(Op0.getOperand(0).getOperand(0)))
5237         if (Op000C->getZExtValue() == 1) {
5238           LHS = Op0.getOperand(1);
5239           RHS = Op0.getOperand(0).getOperand(1);
5240         }
5241     } else if (Op0.getOperand(1).getOpcode() == ISD::Constant) {
5242       ConstantSDNode *AndRHS = cast<ConstantSDNode>(Op0.getOperand(1));
5243       SDValue AndLHS = Op0.getOperand(0);
5244       if (AndRHS->getZExtValue() == 1 && AndLHS.getOpcode() == ISD::SRL) {
5245         LHS = AndLHS.getOperand(0);
5246         RHS = AndLHS.getOperand(1);
5247       }
5248     }
5249
5250     if (LHS.getNode()) {
5251       // If LHS is i8, promote it to i16 with any_extend.  There is no i8 BT
5252       // instruction.  Since the shift amount is in-range-or-undefined, we know
5253       // that doing a bittest on the i16 value is ok.  We extend to i32 because
5254       // the encoding for the i16 version is larger than the i32 version.
5255       if (LHS.getValueType() == MVT::i8)
5256         LHS = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i32, LHS);
5257
5258       // If the operand types disagree, extend the shift amount to match.  Since
5259       // BT ignores high bits (like shifts) we can use anyextend.
5260       if (LHS.getValueType() != RHS.getValueType())
5261         RHS = DAG.getNode(ISD::ANY_EXTEND, dl, LHS.getValueType(), RHS);
5262
5263       SDValue BT = DAG.getNode(X86ISD::BT, dl, MVT::i32, LHS, RHS);
5264       unsigned Cond = CC == ISD::SETEQ ? X86::COND_AE : X86::COND_B;
5265       return DAG.getNode(X86ISD::SETCC, dl, MVT::i8,
5266                          DAG.getConstant(Cond, MVT::i8), BT);
5267     }
5268   }
5269
5270   bool isFP = Op.getOperand(1).getValueType().isFloatingPoint();
5271   unsigned X86CC = TranslateX86CC(CC, isFP, Op0, Op1, DAG);
5272     
5273   SDValue Cond = DAG.getNode(X86ISD::CMP, dl, MVT::i32, Op0, Op1);
5274   return DAG.getNode(X86ISD::SETCC, dl, MVT::i8,
5275                      DAG.getConstant(X86CC, MVT::i8), Cond);
5276 }
5277
5278 SDValue X86TargetLowering::LowerVSETCC(SDValue Op, SelectionDAG &DAG) {
5279   SDValue Cond;
5280   SDValue Op0 = Op.getOperand(0);
5281   SDValue Op1 = Op.getOperand(1);
5282   SDValue CC = Op.getOperand(2);
5283   MVT VT = Op.getValueType();
5284   ISD::CondCode SetCCOpcode = cast<CondCodeSDNode>(CC)->get();
5285   bool isFP = Op.getOperand(1).getValueType().isFloatingPoint();
5286   DebugLoc dl = Op.getDebugLoc();
5287
5288   if (isFP) {
5289     unsigned SSECC = 8;
5290     MVT VT0 = Op0.getValueType();
5291     assert(VT0 == MVT::v4f32 || VT0 == MVT::v2f64);
5292     unsigned Opc = VT0 == MVT::v4f32 ? X86ISD::CMPPS : X86ISD::CMPPD;
5293     bool Swap = false;
5294
5295     switch (SetCCOpcode) {
5296     default: break;
5297     case ISD::SETOEQ:
5298     case ISD::SETEQ:  SSECC = 0; break;
5299     case ISD::SETOGT: 
5300     case ISD::SETGT: Swap = true; // Fallthrough
5301     case ISD::SETLT:
5302     case ISD::SETOLT: SSECC = 1; break;
5303     case ISD::SETOGE:
5304     case ISD::SETGE: Swap = true; // Fallthrough
5305     case ISD::SETLE:
5306     case ISD::SETOLE: SSECC = 2; break;
5307     case ISD::SETUO:  SSECC = 3; break;
5308     case ISD::SETUNE:
5309     case ISD::SETNE:  SSECC = 4; break;
5310     case ISD::SETULE: Swap = true;
5311     case ISD::SETUGE: SSECC = 5; break;
5312     case ISD::SETULT: Swap = true;
5313     case ISD::SETUGT: SSECC = 6; break;
5314     case ISD::SETO:   SSECC = 7; break;
5315     }
5316     if (Swap)
5317       std::swap(Op0, Op1);
5318
5319     // In the two special cases we can't handle, emit two comparisons.
5320     if (SSECC == 8) {
5321       if (SetCCOpcode == ISD::SETUEQ) {
5322         SDValue UNORD, EQ;
5323         UNORD = DAG.getNode(Opc, dl, VT, Op0, Op1, DAG.getConstant(3, MVT::i8));
5324         EQ = DAG.getNode(Opc, dl, VT, Op0, Op1, DAG.getConstant(0, MVT::i8));
5325         return DAG.getNode(ISD::OR, dl, VT, UNORD, EQ);
5326       }
5327       else if (SetCCOpcode == ISD::SETONE) {
5328         SDValue ORD, NEQ;
5329         ORD = DAG.getNode(Opc, dl, VT, Op0, Op1, DAG.getConstant(7, MVT::i8));
5330         NEQ = DAG.getNode(Opc, dl, VT, Op0, Op1, DAG.getConstant(4, MVT::i8));
5331         return DAG.getNode(ISD::AND, dl, VT, ORD, NEQ);
5332       }
5333       assert(0 && "Illegal FP comparison");
5334     }
5335     // Handle all other FP comparisons here.
5336     return DAG.getNode(Opc, dl, VT, Op0, Op1, DAG.getConstant(SSECC, MVT::i8));
5337   }
5338   
5339   // We are handling one of the integer comparisons here.  Since SSE only has
5340   // GT and EQ comparisons for integer, swapping operands and multiple
5341   // operations may be required for some comparisons.
5342   unsigned Opc = 0, EQOpc = 0, GTOpc = 0;
5343   bool Swap = false, Invert = false, FlipSigns = false;
5344   
5345   switch (VT.getSimpleVT()) {
5346   default: break;
5347   case MVT::v16i8: EQOpc = X86ISD::PCMPEQB; GTOpc = X86ISD::PCMPGTB; break;
5348   case MVT::v8i16: EQOpc = X86ISD::PCMPEQW; GTOpc = X86ISD::PCMPGTW; break;
5349   case MVT::v4i32: EQOpc = X86ISD::PCMPEQD; GTOpc = X86ISD::PCMPGTD; break;
5350   case MVT::v2i64: EQOpc = X86ISD::PCMPEQQ; GTOpc = X86ISD::PCMPGTQ; break;
5351   }
5352   
5353   switch (SetCCOpcode) {
5354   default: break;
5355   case ISD::SETNE:  Invert = true;
5356   case ISD::SETEQ:  Opc = EQOpc; break;
5357   case ISD::SETLT:  Swap = true;
5358   case ISD::SETGT:  Opc = GTOpc; break;
5359   case ISD::SETGE:  Swap = true;
5360   case ISD::SETLE:  Opc = GTOpc; Invert = true; break;
5361   case ISD::SETULT: Swap = true;
5362   case ISD::SETUGT: Opc = GTOpc; FlipSigns = true; break;
5363   case ISD::SETUGE: Swap = true;
5364   case ISD::SETULE: Opc = GTOpc; FlipSigns = true; Invert = true; break;
5365   }
5366   if (Swap)
5367     std::swap(Op0, Op1);
5368   
5369   // Since SSE has no unsigned integer comparisons, we need to flip  the sign
5370   // bits of the inputs before performing those operations.
5371   if (FlipSigns) {
5372     MVT EltVT = VT.getVectorElementType();
5373     SDValue SignBit = DAG.getConstant(APInt::getSignBit(EltVT.getSizeInBits()),
5374                                       EltVT);
5375     std::vector<SDValue> SignBits(VT.getVectorNumElements(), SignBit);
5376     SDValue SignVec = DAG.getNode(ISD::BUILD_VECTOR, dl, VT, &SignBits[0],
5377                                     SignBits.size());
5378     Op0 = DAG.getNode(ISD::XOR, dl, VT, Op0, SignVec);
5379     Op1 = DAG.getNode(ISD::XOR, dl, VT, Op1, SignVec);
5380   }
5381   
5382   SDValue Result = DAG.getNode(Opc, dl, VT, Op0, Op1);
5383
5384   // If the logical-not of the result is required, perform that now.
5385   if (Invert)
5386     Result = DAG.getNOT(dl, Result, VT);
5387
5388   return Result;
5389 }
5390
5391 // isX86LogicalCmp - Return true if opcode is a X86 logical comparison.
5392 static bool isX86LogicalCmp(unsigned Opc) {
5393   return Opc == X86ISD::CMP || Opc == X86ISD::COMI || Opc == X86ISD::UCOMI;
5394 }
5395
5396 SDValue X86TargetLowering::LowerSELECT(SDValue Op, SelectionDAG &DAG) {
5397   bool addTest = true;
5398   SDValue Cond  = Op.getOperand(0);
5399   DebugLoc dl = Op.getDebugLoc();
5400   SDValue CC;
5401
5402   if (Cond.getOpcode() == ISD::SETCC)
5403     Cond = LowerSETCC(Cond, DAG);
5404
5405   // If condition flag is set by a X86ISD::CMP, then use it as the condition
5406   // setting operand in place of the X86ISD::SETCC.
5407   if (Cond.getOpcode() == X86ISD::SETCC) {
5408     CC = Cond.getOperand(0);
5409
5410     SDValue Cmp = Cond.getOperand(1);
5411     unsigned Opc = Cmp.getOpcode();
5412     MVT VT = Op.getValueType();
5413     
5414     bool IllegalFPCMov = false;
5415     if (VT.isFloatingPoint() && !VT.isVector() &&
5416         !isScalarFPTypeInSSEReg(VT))  // FPStack?
5417       IllegalFPCMov = !hasFPCMov(cast<ConstantSDNode>(CC)->getSExtValue());
5418     
5419     if ((isX86LogicalCmp(Opc) && !IllegalFPCMov) || Opc == X86ISD::BT) { // FIXME
5420       Cond = Cmp;
5421       addTest = false;
5422     }
5423   }
5424
5425   if (addTest) {
5426     CC = DAG.getConstant(X86::COND_NE, MVT::i8);
5427     Cond= DAG.getNode(X86ISD::CMP, dl, MVT::i32, Cond, 
5428                       DAG.getConstant(0, MVT::i8));
5429   }
5430
5431   const MVT *VTs = DAG.getNodeValueTypes(Op.getValueType(),
5432                                                     MVT::Flag);
5433   SmallVector<SDValue, 4> Ops;
5434   // X86ISD::CMOV means set the result (which is operand 1) to the RHS if
5435   // condition is true.
5436   Ops.push_back(Op.getOperand(2));
5437   Ops.push_back(Op.getOperand(1));
5438   Ops.push_back(CC);
5439   Ops.push_back(Cond);
5440   return DAG.getNode(X86ISD::CMOV, dl, VTs, 2, &Ops[0], Ops.size());
5441 }
5442
5443 // isAndOrOfSingleUseSetCCs - Return true if node is an ISD::AND or
5444 // ISD::OR of two X86ISD::SETCC nodes each of which has no other use apart
5445 // from the AND / OR.
5446 static bool isAndOrOfSetCCs(SDValue Op, unsigned &Opc) {
5447   Opc = Op.getOpcode();
5448   if (Opc != ISD::OR && Opc != ISD::AND)
5449     return false;
5450   return (Op.getOperand(0).getOpcode() == X86ISD::SETCC &&
5451           Op.getOperand(0).hasOneUse() &&
5452           Op.getOperand(1).getOpcode() == X86ISD::SETCC &&
5453           Op.getOperand(1).hasOneUse());
5454 }
5455
5456 // isXor1OfSetCC - Return true if node is an ISD::XOR of a X86ISD::SETCC and
5457 // 1 and that the SETCC node has a single use.
5458 static bool isXor1OfSetCC(SDValue Op) {
5459   if (Op.getOpcode() != ISD::XOR)
5460     return false;
5461   ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(Op.getOperand(1));
5462   if (N1C && N1C->getAPIntValue() == 1) {
5463     return Op.getOperand(0).getOpcode() == X86ISD::SETCC &&
5464       Op.getOperand(0).hasOneUse();
5465   }
5466   return false;
5467 }
5468
5469 SDValue X86TargetLowering::LowerBRCOND(SDValue Op, SelectionDAG &DAG) {
5470   bool addTest = true;
5471   SDValue Chain = Op.getOperand(0);
5472   SDValue Cond  = Op.getOperand(1);
5473   SDValue Dest  = Op.getOperand(2);
5474   DebugLoc dl = Op.getDebugLoc();
5475   SDValue CC;
5476
5477   if (Cond.getOpcode() == ISD::SETCC)
5478     Cond = LowerSETCC(Cond, DAG);
5479 #if 0
5480   // FIXME: LowerXALUO doesn't handle these!!
5481   else if (Cond.getOpcode() == X86ISD::ADD  ||
5482            Cond.getOpcode() == X86ISD::SUB  ||
5483            Cond.getOpcode() == X86ISD::SMUL ||
5484            Cond.getOpcode() == X86ISD::UMUL)
5485     Cond = LowerXALUO(Cond, DAG);
5486 #endif
5487   
5488   // If condition flag is set by a X86ISD::CMP, then use it as the condition
5489   // setting operand in place of the X86ISD::SETCC.
5490   if (Cond.getOpcode() == X86ISD::SETCC) {
5491     CC = Cond.getOperand(0);
5492
5493     SDValue Cmp = Cond.getOperand(1);
5494     unsigned Opc = Cmp.getOpcode();
5495     // FIXME: WHY THE SPECIAL CASING OF LogicalCmp??
5496     if (isX86LogicalCmp(Opc) || Opc == X86ISD::BT) {
5497       Cond = Cmp;
5498       addTest = false;
5499     } else {
5500       switch (cast<ConstantSDNode>(CC)->getZExtValue()) {
5501       default: break;
5502       case X86::COND_O:
5503       case X86::COND_B:
5504         // These can only come from an arithmetic instruction with overflow,
5505         // e.g. SADDO, UADDO.
5506         Cond = Cond.getNode()->getOperand(1);
5507         addTest = false;
5508         break;
5509       }
5510     }
5511   } else {
5512     unsigned CondOpc;
5513     if (Cond.hasOneUse() && isAndOrOfSetCCs(Cond, CondOpc)) {
5514       SDValue Cmp = Cond.getOperand(0).getOperand(1);
5515       unsigned Opc = Cmp.getOpcode();
5516       if (CondOpc == ISD::OR) {
5517         // Also, recognize the pattern generated by an FCMP_UNE. We can emit
5518         // two branches instead of an explicit OR instruction with a
5519         // separate test.
5520         if (Cmp == Cond.getOperand(1).getOperand(1) &&
5521             isX86LogicalCmp(Opc)) {
5522           CC = Cond.getOperand(0).getOperand(0);
5523           Chain = DAG.getNode(X86ISD::BRCOND, dl, Op.getValueType(),
5524                               Chain, Dest, CC, Cmp);
5525           CC = Cond.getOperand(1).getOperand(0);
5526           Cond = Cmp;
5527           addTest = false;
5528         }
5529       } else { // ISD::AND
5530         // Also, recognize the pattern generated by an FCMP_OEQ. We can emit
5531         // two branches instead of an explicit AND instruction with a
5532         // separate test. However, we only do this if this block doesn't
5533         // have a fall-through edge, because this requires an explicit
5534         // jmp when the condition is false.
5535         if (Cmp == Cond.getOperand(1).getOperand(1) &&
5536             isX86LogicalCmp(Opc) &&
5537             Op.getNode()->hasOneUse()) {
5538           X86::CondCode CCode =
5539             (X86::CondCode)Cond.getOperand(0).getConstantOperandVal(0);
5540           CCode = X86::GetOppositeBranchCondition(CCode);
5541           CC = DAG.getConstant(CCode, MVT::i8);
5542           SDValue User = SDValue(*Op.getNode()->use_begin(), 0);
5543           // Look for an unconditional branch following this conditional branch.
5544           // We need this because we need to reverse the successors in order
5545           // to implement FCMP_OEQ.
5546           if (User.getOpcode() == ISD::BR) {
5547             SDValue FalseBB = User.getOperand(1);
5548             SDValue NewBR =
5549               DAG.UpdateNodeOperands(User, User.getOperand(0), Dest);
5550             assert(NewBR == User);
5551             Dest = FalseBB;
5552
5553             Chain = DAG.getNode(X86ISD::BRCOND, dl, Op.getValueType(),
5554                                 Chain, Dest, CC, Cmp);
5555             X86::CondCode CCode =
5556               (X86::CondCode)Cond.getOperand(1).getConstantOperandVal(0);
5557             CCode = X86::GetOppositeBranchCondition(CCode);
5558             CC = DAG.getConstant(CCode, MVT::i8);
5559             Cond = Cmp;
5560             addTest = false;
5561           }
5562         }
5563       }
5564     } else if (Cond.hasOneUse() && isXor1OfSetCC(Cond)) {
5565       // Recognize for xorb (setcc), 1 patterns. The xor inverts the condition.
5566       // It should be transformed during dag combiner except when the condition
5567       // is set by a arithmetics with overflow node.
5568       X86::CondCode CCode =
5569         (X86::CondCode)Cond.getOperand(0).getConstantOperandVal(0);
5570       CCode = X86::GetOppositeBranchCondition(CCode);
5571       CC = DAG.getConstant(CCode, MVT::i8);
5572       Cond = Cond.getOperand(0).getOperand(1);
5573       addTest = false;
5574     }
5575   }
5576
5577   if (addTest) {
5578     CC = DAG.getConstant(X86::COND_NE, MVT::i8);
5579     Cond= DAG.getNode(X86ISD::CMP, dl, MVT::i32, Cond, 
5580                       DAG.getConstant(0, MVT::i8));
5581   }
5582   return DAG.getNode(X86ISD::BRCOND, dl, Op.getValueType(),
5583                      Chain, Dest, CC, Cond);
5584 }
5585
5586
5587 // Lower dynamic stack allocation to _alloca call for Cygwin/Mingw targets.
5588 // Calls to _alloca is needed to probe the stack when allocating more than 4k
5589 // bytes in one go. Touching the stack at 4K increments is necessary to ensure
5590 // that the guard pages used by the OS virtual memory manager are allocated in
5591 // correct sequence.
5592 SDValue
5593 X86TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
5594                                            SelectionDAG &DAG) {
5595   assert(Subtarget->isTargetCygMing() &&
5596          "This should be used only on Cygwin/Mingw targets");
5597   DebugLoc dl = Op.getDebugLoc();
5598
5599   // Get the inputs.
5600   SDValue Chain = Op.getOperand(0);
5601   SDValue Size  = Op.getOperand(1);
5602   // FIXME: Ensure alignment here
5603
5604   SDValue Flag;
5605
5606   MVT IntPtr = getPointerTy();
5607   MVT SPTy = Subtarget->is64Bit() ? MVT::i64 : MVT::i32;
5608
5609   Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(0, true));
5610
5611   Chain = DAG.getCopyToReg(Chain, dl, X86::EAX, Size, Flag);
5612   Flag = Chain.getValue(1);
5613
5614   SDVTList  NodeTys = DAG.getVTList(MVT::Other, MVT::Flag);
5615   SDValue Ops[] = { Chain,
5616                       DAG.getTargetExternalSymbol("_alloca", IntPtr),
5617                       DAG.getRegister(X86::EAX, IntPtr),
5618                       DAG.getRegister(X86StackPtr, SPTy),
5619                       Flag };
5620   Chain = DAG.getNode(X86ISD::CALL, dl, NodeTys, Ops, 5);
5621   Flag = Chain.getValue(1);
5622
5623   Chain = DAG.getCALLSEQ_END(Chain,
5624                              DAG.getIntPtrConstant(0, true),
5625                              DAG.getIntPtrConstant(0, true),
5626                              Flag);
5627
5628   Chain = DAG.getCopyFromReg(Chain, dl, X86StackPtr, SPTy).getValue(1);
5629
5630   SDValue Ops1[2] = { Chain.getValue(0), Chain };
5631   return DAG.getMergeValues(Ops1, 2, dl);
5632 }
5633
5634 SDValue
5635 X86TargetLowering::EmitTargetCodeForMemset(SelectionDAG &DAG, DebugLoc dl,
5636                                            SDValue Chain,
5637                                            SDValue Dst, SDValue Src,
5638                                            SDValue Size, unsigned Align,
5639                                            const Value *DstSV,
5640                                            uint64_t DstSVOff) {
5641   ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
5642
5643   // If not DWORD aligned or size is more than the threshold, call the library.
5644   // The libc version is likely to be faster for these cases. It can use the
5645   // address value and run time information about the CPU.
5646   if ((Align & 3) != 0 ||
5647       !ConstantSize ||
5648       ConstantSize->getZExtValue() >
5649         getSubtarget()->getMaxInlineSizeThreshold()) {
5650     SDValue InFlag(0, 0);
5651
5652     // Check to see if there is a specialized entry-point for memory zeroing.
5653     ConstantSDNode *V = dyn_cast<ConstantSDNode>(Src);
5654
5655     if (const char *bzeroEntry =  V &&
5656         V->isNullValue() ? Subtarget->getBZeroEntry() : 0) {
5657       MVT IntPtr = getPointerTy();
5658       const Type *IntPtrTy = TD->getIntPtrType();
5659       TargetLowering::ArgListTy Args; 
5660       TargetLowering::ArgListEntry Entry;
5661       Entry.Node = Dst;
5662       Entry.Ty = IntPtrTy;
5663       Args.push_back(Entry);
5664       Entry.Node = Size;
5665       Args.push_back(Entry);
5666       std::pair<SDValue,SDValue> CallResult =
5667         LowerCallTo(Chain, Type::VoidTy, false, false, false, false, 
5668                     CallingConv::C, false, 
5669                     DAG.getExternalSymbol(bzeroEntry, IntPtr), Args, DAG, dl);
5670       return CallResult.second;
5671     }
5672
5673     // Otherwise have the target-independent code call memset.
5674     return SDValue();
5675   }
5676
5677   uint64_t SizeVal = ConstantSize->getZExtValue();
5678   SDValue InFlag(0, 0);
5679   MVT AVT;
5680   SDValue Count;
5681   ConstantSDNode *ValC = dyn_cast<ConstantSDNode>(Src);
5682   unsigned BytesLeft = 0;
5683   bool TwoRepStos = false;
5684   if (ValC) {
5685     unsigned ValReg;
5686     uint64_t Val = ValC->getZExtValue() & 255;
5687
5688     // If the value is a constant, then we can potentially use larger sets.
5689     switch (Align & 3) {
5690     case 2:   // WORD aligned
5691       AVT = MVT::i16;
5692       ValReg = X86::AX;
5693       Val = (Val << 8) | Val;
5694       break;
5695     case 0:  // DWORD aligned
5696       AVT = MVT::i32;
5697       ValReg = X86::EAX;
5698       Val = (Val << 8)  | Val;
5699       Val = (Val << 16) | Val;
5700       if (Subtarget->is64Bit() && ((Align & 0x7) == 0)) {  // QWORD aligned
5701         AVT = MVT::i64;
5702         ValReg = X86::RAX;
5703         Val = (Val << 32) | Val;
5704       }
5705       break;
5706     default:  // Byte aligned
5707       AVT = MVT::i8;
5708       ValReg = X86::AL;
5709       Count = DAG.getIntPtrConstant(SizeVal);
5710       break;
5711     }
5712
5713     if (AVT.bitsGT(MVT::i8)) {
5714       unsigned UBytes = AVT.getSizeInBits() / 8;
5715       Count = DAG.getIntPtrConstant(SizeVal / UBytes);
5716       BytesLeft = SizeVal % UBytes;
5717     }
5718
5719     Chain  = DAG.getCopyToReg(Chain, dl, ValReg, DAG.getConstant(Val, AVT),
5720                               InFlag);
5721     InFlag = Chain.getValue(1);
5722   } else {
5723     AVT = MVT::i8;
5724     Count  = DAG.getIntPtrConstant(SizeVal);
5725     Chain  = DAG.getCopyToReg(Chain, dl, X86::AL, Src, InFlag);
5726     InFlag = Chain.getValue(1);
5727   }
5728
5729   Chain  = DAG.getCopyToReg(Chain, dl, Subtarget->is64Bit() ? X86::RCX : 
5730                                                               X86::ECX,
5731                             Count, InFlag);
5732   InFlag = Chain.getValue(1);
5733   Chain  = DAG.getCopyToReg(Chain, dl, Subtarget->is64Bit() ? X86::RDI : 
5734                                                               X86::EDI,
5735                             Dst, InFlag);
5736   InFlag = Chain.getValue(1);
5737
5738   SDVTList Tys = DAG.getVTList(MVT::Other, MVT::Flag);
5739   SmallVector<SDValue, 8> Ops;
5740   Ops.push_back(Chain);
5741   Ops.push_back(DAG.getValueType(AVT));
5742   Ops.push_back(InFlag);
5743   Chain  = DAG.getNode(X86ISD::REP_STOS, dl, Tys, &Ops[0], Ops.size());
5744
5745   if (TwoRepStos) {
5746     InFlag = Chain.getValue(1);
5747     Count  = Size;
5748     MVT CVT = Count.getValueType();
5749     SDValue Left = DAG.getNode(ISD::AND, dl, CVT, Count,
5750                                DAG.getConstant((AVT == MVT::i64) ? 7 : 3, CVT));
5751     Chain  = DAG.getCopyToReg(Chain, dl, (CVT == MVT::i64) ? X86::RCX : 
5752                                                              X86::ECX,
5753                               Left, InFlag);
5754     InFlag = Chain.getValue(1);
5755     Tys = DAG.getVTList(MVT::Other, MVT::Flag);
5756     Ops.clear();
5757     Ops.push_back(Chain);
5758     Ops.push_back(DAG.getValueType(MVT::i8));
5759     Ops.push_back(InFlag);
5760     Chain  = DAG.getNode(X86ISD::REP_STOS, dl, Tys, &Ops[0], Ops.size());
5761   } else if (BytesLeft) {
5762     // Handle the last 1 - 7 bytes.
5763     unsigned Offset = SizeVal - BytesLeft;
5764     MVT AddrVT = Dst.getValueType();
5765     MVT SizeVT = Size.getValueType();
5766
5767     Chain = DAG.getMemset(Chain, dl,
5768                           DAG.getNode(ISD::ADD, dl, AddrVT, Dst,
5769                                       DAG.getConstant(Offset, AddrVT)),
5770                           Src,
5771                           DAG.getConstant(BytesLeft, SizeVT),
5772                           Align, DstSV, DstSVOff + Offset);
5773   }
5774
5775   // TODO: Use a Tokenfactor, as in memcpy, instead of a single chain.
5776   return Chain;
5777 }
5778
5779 SDValue
5780 X86TargetLowering::EmitTargetCodeForMemcpy(SelectionDAG &DAG, DebugLoc dl,
5781                                       SDValue Chain, SDValue Dst, SDValue Src,
5782                                       SDValue Size, unsigned Align,
5783                                       bool AlwaysInline,
5784                                       const Value *DstSV, uint64_t DstSVOff,
5785                                       const Value *SrcSV, uint64_t SrcSVOff) {  
5786   // This requires the copy size to be a constant, preferrably
5787   // within a subtarget-specific limit.
5788   ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
5789   if (!ConstantSize)
5790     return SDValue();
5791   uint64_t SizeVal = ConstantSize->getZExtValue();
5792   if (!AlwaysInline && SizeVal > getSubtarget()->getMaxInlineSizeThreshold())
5793     return SDValue();
5794
5795   /// If not DWORD aligned, call the library.
5796   if ((Align & 3) != 0)
5797     return SDValue();
5798
5799   // DWORD aligned
5800   MVT AVT = MVT::i32;
5801   if (Subtarget->is64Bit() && ((Align & 0x7) == 0))  // QWORD aligned
5802     AVT = MVT::i64;
5803
5804   unsigned UBytes = AVT.getSizeInBits() / 8;
5805   unsigned CountVal = SizeVal / UBytes;
5806   SDValue Count = DAG.getIntPtrConstant(CountVal);
5807   unsigned BytesLeft = SizeVal % UBytes;
5808
5809   SDValue InFlag(0, 0);
5810   Chain  = DAG.getCopyToReg(Chain, dl, Subtarget->is64Bit() ? X86::RCX : 
5811                                                               X86::ECX,
5812                             Count, InFlag);
5813   InFlag = Chain.getValue(1);
5814   Chain  = DAG.getCopyToReg(Chain, dl, Subtarget->is64Bit() ? X86::RDI : 
5815                                                              X86::EDI,
5816                             Dst, InFlag);
5817   InFlag = Chain.getValue(1);
5818   Chain  = DAG.getCopyToReg(Chain, dl, Subtarget->is64Bit() ? X86::RSI : 
5819                                                               X86::ESI,
5820                             Src, InFlag);
5821   InFlag = Chain.getValue(1);
5822
5823   SDVTList Tys = DAG.getVTList(MVT::Other, MVT::Flag);
5824   SmallVector<SDValue, 8> Ops;
5825   Ops.push_back(Chain);
5826   Ops.push_back(DAG.getValueType(AVT));
5827   Ops.push_back(InFlag);
5828   SDValue RepMovs = DAG.getNode(X86ISD::REP_MOVS, dl, Tys, &Ops[0], Ops.size());
5829
5830   SmallVector<SDValue, 4> Results;
5831   Results.push_back(RepMovs);
5832   if (BytesLeft) {
5833     // Handle the last 1 - 7 bytes.
5834     unsigned Offset = SizeVal - BytesLeft;
5835     MVT DstVT = Dst.getValueType();
5836     MVT SrcVT = Src.getValueType();
5837     MVT SizeVT = Size.getValueType();
5838     Results.push_back(DAG.getMemcpy(Chain, dl, 
5839                                     DAG.getNode(ISD::ADD, dl, DstVT, Dst,
5840                                                 DAG.getConstant(Offset, DstVT)),
5841                                     DAG.getNode(ISD::ADD, dl, SrcVT, Src,
5842                                                 DAG.getConstant(Offset, SrcVT)),
5843                                     DAG.getConstant(BytesLeft, SizeVT),
5844                                     Align, AlwaysInline,
5845                                     DstSV, DstSVOff + Offset,
5846                                     SrcSV, SrcSVOff + Offset));
5847   }
5848
5849   return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, 
5850                      &Results[0], Results.size());
5851 }
5852
5853 SDValue X86TargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) {
5854   const Value *SV = cast<SrcValueSDNode>(Op.getOperand(2))->getValue();
5855   DebugLoc dl = Op.getDebugLoc();
5856
5857   if (!Subtarget->is64Bit()) {
5858     // vastart just stores the address of the VarArgsFrameIndex slot into the
5859     // memory location argument.
5860     SDValue FR = DAG.getFrameIndex(VarArgsFrameIndex, getPointerTy());
5861     return DAG.getStore(Op.getOperand(0), dl, FR, Op.getOperand(1), SV, 0);
5862   }
5863
5864   // __va_list_tag:
5865   //   gp_offset         (0 - 6 * 8)
5866   //   fp_offset         (48 - 48 + 8 * 16)
5867   //   overflow_arg_area (point to parameters coming in memory).
5868   //   reg_save_area
5869   SmallVector<SDValue, 8> MemOps;
5870   SDValue FIN = Op.getOperand(1);
5871   // Store gp_offset
5872   SDValue Store = DAG.getStore(Op.getOperand(0), dl,
5873                                  DAG.getConstant(VarArgsGPOffset, MVT::i32),
5874                                  FIN, SV, 0);
5875   MemOps.push_back(Store);
5876
5877   // Store fp_offset
5878   FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(), 
5879                     FIN, DAG.getIntPtrConstant(4));
5880   Store = DAG.getStore(Op.getOperand(0), dl,
5881                        DAG.getConstant(VarArgsFPOffset, MVT::i32),
5882                        FIN, SV, 0);
5883   MemOps.push_back(Store);
5884
5885   // Store ptr to overflow_arg_area
5886   FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(), 
5887                     FIN, DAG.getIntPtrConstant(4));
5888   SDValue OVFIN = DAG.getFrameIndex(VarArgsFrameIndex, getPointerTy());
5889   Store = DAG.getStore(Op.getOperand(0), dl, OVFIN, FIN, SV, 0);
5890   MemOps.push_back(Store);
5891
5892   // Store ptr to reg_save_area.
5893   FIN = DAG.getNode(ISD::ADD, dl, getPointerTy(), 
5894                     FIN, DAG.getIntPtrConstant(8));
5895   SDValue RSFIN = DAG.getFrameIndex(RegSaveFrameIndex, getPointerTy());
5896   Store = DAG.getStore(Op.getOperand(0), dl, RSFIN, FIN, SV, 0);
5897   MemOps.push_back(Store);
5898   return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, 
5899                      &MemOps[0], MemOps.size());
5900 }
5901
5902 SDValue X86TargetLowering::LowerVAARG(SDValue Op, SelectionDAG &DAG) {
5903   // X86-64 va_list is a struct { i32, i32, i8*, i8* }.
5904   assert(Subtarget->is64Bit() && "This code only handles 64-bit va_arg!");
5905   SDValue Chain = Op.getOperand(0);
5906   SDValue SrcPtr = Op.getOperand(1);
5907   SDValue SrcSV = Op.getOperand(2);
5908
5909   assert(0 && "VAArgInst is not yet implemented for x86-64!");
5910   abort();
5911   return SDValue();
5912 }
5913
5914 SDValue X86TargetLowering::LowerVACOPY(SDValue Op, SelectionDAG &DAG) {
5915   // X86-64 va_list is a struct { i32, i32, i8*, i8* }.
5916   assert(Subtarget->is64Bit() && "This code only handles 64-bit va_copy!");
5917   SDValue Chain = Op.getOperand(0);
5918   SDValue DstPtr = Op.getOperand(1);
5919   SDValue SrcPtr = Op.getOperand(2);
5920   const Value *DstSV = cast<SrcValueSDNode>(Op.getOperand(3))->getValue();
5921   const Value *SrcSV = cast<SrcValueSDNode>(Op.getOperand(4))->getValue();
5922   DebugLoc dl = Op.getDebugLoc();
5923
5924   return DAG.getMemcpy(Chain, dl, DstPtr, SrcPtr,
5925                        DAG.getIntPtrConstant(24), 8, false,
5926                        DstSV, 0, SrcSV, 0);
5927 }
5928
5929 SDValue
5930 X86TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) {
5931   DebugLoc dl = Op.getDebugLoc();
5932   unsigned IntNo = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
5933   switch (IntNo) {
5934   default: return SDValue();    // Don't custom lower most intrinsics.
5935   // Comparison intrinsics.
5936   case Intrinsic::x86_sse_comieq_ss:
5937   case Intrinsic::x86_sse_comilt_ss:
5938   case Intrinsic::x86_sse_comile_ss:
5939   case Intrinsic::x86_sse_comigt_ss:
5940   case Intrinsic::x86_sse_comige_ss:
5941   case Intrinsic::x86_sse_comineq_ss:
5942   case Intrinsic::x86_sse_ucomieq_ss:
5943   case Intrinsic::x86_sse_ucomilt_ss:
5944   case Intrinsic::x86_sse_ucomile_ss:
5945   case Intrinsic::x86_sse_ucomigt_ss:
5946   case Intrinsic::x86_sse_ucomige_ss:
5947   case Intrinsic::x86_sse_ucomineq_ss:
5948   case Intrinsic::x86_sse2_comieq_sd:
5949   case Intrinsic::x86_sse2_comilt_sd:
5950   case Intrinsic::x86_sse2_comile_sd:
5951   case Intrinsic::x86_sse2_comigt_sd:
5952   case Intrinsic::x86_sse2_comige_sd:
5953   case Intrinsic::x86_sse2_comineq_sd:
5954   case Intrinsic::x86_sse2_ucomieq_sd:
5955   case Intrinsic::x86_sse2_ucomilt_sd:
5956   case Intrinsic::x86_sse2_ucomile_sd:
5957   case Intrinsic::x86_sse2_ucomigt_sd:
5958   case Intrinsic::x86_sse2_ucomige_sd:
5959   case Intrinsic::x86_sse2_ucomineq_sd: {
5960     unsigned Opc = 0;
5961     ISD::CondCode CC = ISD::SETCC_INVALID;
5962     switch (IntNo) {
5963     default: break;
5964     case Intrinsic::x86_sse_comieq_ss:
5965     case Intrinsic::x86_sse2_comieq_sd:
5966       Opc = X86ISD::COMI;
5967       CC = ISD::SETEQ;
5968       break;
5969     case Intrinsic::x86_sse_comilt_ss:
5970     case Intrinsic::x86_sse2_comilt_sd:
5971       Opc = X86ISD::COMI;
5972       CC = ISD::SETLT;
5973       break;
5974     case Intrinsic::x86_sse_comile_ss:
5975     case Intrinsic::x86_sse2_comile_sd:
5976       Opc = X86ISD::COMI;
5977       CC = ISD::SETLE;
5978       break;
5979     case Intrinsic::x86_sse_comigt_ss:
5980     case Intrinsic::x86_sse2_comigt_sd:
5981       Opc = X86ISD::COMI;
5982       CC = ISD::SETGT;
5983       break;
5984     case Intrinsic::x86_sse_comige_ss:
5985     case Intrinsic::x86_sse2_comige_sd:
5986       Opc = X86ISD::COMI;
5987       CC = ISD::SETGE;
5988       break;
5989     case Intrinsic::x86_sse_comineq_ss:
5990     case Intrinsic::x86_sse2_comineq_sd:
5991       Opc = X86ISD::COMI;
5992       CC = ISD::SETNE;
5993       break;
5994     case Intrinsic::x86_sse_ucomieq_ss:
5995     case Intrinsic::x86_sse2_ucomieq_sd:
5996       Opc = X86ISD::UCOMI;
5997       CC = ISD::SETEQ;
5998       break;
5999     case Intrinsic::x86_sse_ucomilt_ss:
6000     case Intrinsic::x86_sse2_ucomilt_sd:
6001       Opc = X86ISD::UCOMI;
6002       CC = ISD::SETLT;
6003       break;
6004     case Intrinsic::x86_sse_ucomile_ss:
6005     case Intrinsic::x86_sse2_ucomile_sd:
6006       Opc = X86ISD::UCOMI;
6007       CC = ISD::SETLE;
6008       break;
6009     case Intrinsic::x86_sse_ucomigt_ss:
6010     case Intrinsic::x86_sse2_ucomigt_sd:
6011       Opc = X86ISD::UCOMI;
6012       CC = ISD::SETGT;
6013       break;
6014     case Intrinsic::x86_sse_ucomige_ss:
6015     case Intrinsic::x86_sse2_ucomige_sd:
6016       Opc = X86ISD::UCOMI;
6017       CC = ISD::SETGE;
6018       break;
6019     case Intrinsic::x86_sse_ucomineq_ss:
6020     case Intrinsic::x86_sse2_ucomineq_sd:
6021       Opc = X86ISD::UCOMI;
6022       CC = ISD::SETNE;
6023       break;
6024     }
6025
6026     SDValue LHS = Op.getOperand(1);
6027     SDValue RHS = Op.getOperand(2);
6028     unsigned X86CC = TranslateX86CC(CC, true, LHS, RHS, DAG);
6029     SDValue Cond = DAG.getNode(Opc, dl, MVT::i32, LHS, RHS);
6030     SDValue SetCC = DAG.getNode(X86ISD::SETCC, dl, MVT::i8,
6031                                 DAG.getConstant(X86CC, MVT::i8), Cond);
6032     return DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i32, SetCC);
6033   }
6034
6035   // Fix vector shift instructions where the last operand is a non-immediate
6036   // i32 value.
6037   case Intrinsic::x86_sse2_pslli_w:
6038   case Intrinsic::x86_sse2_pslli_d:
6039   case Intrinsic::x86_sse2_pslli_q:
6040   case Intrinsic::x86_sse2_psrli_w:
6041   case Intrinsic::x86_sse2_psrli_d:
6042   case Intrinsic::x86_sse2_psrli_q:
6043   case Intrinsic::x86_sse2_psrai_w:
6044   case Intrinsic::x86_sse2_psrai_d:
6045   case Intrinsic::x86_mmx_pslli_w:
6046   case Intrinsic::x86_mmx_pslli_d:
6047   case Intrinsic::x86_mmx_pslli_q:
6048   case Intrinsic::x86_mmx_psrli_w:
6049   case Intrinsic::x86_mmx_psrli_d:
6050   case Intrinsic::x86_mmx_psrli_q:
6051   case Intrinsic::x86_mmx_psrai_w:
6052   case Intrinsic::x86_mmx_psrai_d: {
6053     SDValue ShAmt = Op.getOperand(2);
6054     if (isa<ConstantSDNode>(ShAmt))
6055       return SDValue();
6056
6057     unsigned NewIntNo = 0;
6058     MVT ShAmtVT = MVT::v4i32;
6059     switch (IntNo) {
6060     case Intrinsic::x86_sse2_pslli_w:
6061       NewIntNo = Intrinsic::x86_sse2_psll_w;
6062       break;
6063     case Intrinsic::x86_sse2_pslli_d:
6064       NewIntNo = Intrinsic::x86_sse2_psll_d;
6065       break;
6066     case Intrinsic::x86_sse2_pslli_q:
6067       NewIntNo = Intrinsic::x86_sse2_psll_q;
6068       break;
6069     case Intrinsic::x86_sse2_psrli_w:
6070       NewIntNo = Intrinsic::x86_sse2_psrl_w;
6071       break;
6072     case Intrinsic::x86_sse2_psrli_d:
6073       NewIntNo = Intrinsic::x86_sse2_psrl_d;
6074       break;
6075     case Intrinsic::x86_sse2_psrli_q:
6076       NewIntNo = Intrinsic::x86_sse2_psrl_q;
6077       break;
6078     case Intrinsic::x86_sse2_psrai_w:
6079       NewIntNo = Intrinsic::x86_sse2_psra_w;
6080       break;
6081     case Intrinsic::x86_sse2_psrai_d:
6082       NewIntNo = Intrinsic::x86_sse2_psra_d;
6083       break;
6084     default: {
6085       ShAmtVT = MVT::v2i32;
6086       switch (IntNo) {
6087       case Intrinsic::x86_mmx_pslli_w:
6088         NewIntNo = Intrinsic::x86_mmx_psll_w;
6089         break;
6090       case Intrinsic::x86_mmx_pslli_d:
6091         NewIntNo = Intrinsic::x86_mmx_psll_d;
6092         break;
6093       case Intrinsic::x86_mmx_pslli_q:
6094         NewIntNo = Intrinsic::x86_mmx_psll_q;
6095         break;
6096       case Intrinsic::x86_mmx_psrli_w:
6097         NewIntNo = Intrinsic::x86_mmx_psrl_w;
6098         break;
6099       case Intrinsic::x86_mmx_psrli_d:
6100         NewIntNo = Intrinsic::x86_mmx_psrl_d;
6101         break;
6102       case Intrinsic::x86_mmx_psrli_q:
6103         NewIntNo = Intrinsic::x86_mmx_psrl_q;
6104         break;
6105       case Intrinsic::x86_mmx_psrai_w:
6106         NewIntNo = Intrinsic::x86_mmx_psra_w;
6107         break;
6108       case Intrinsic::x86_mmx_psrai_d:
6109         NewIntNo = Intrinsic::x86_mmx_psra_d;
6110         break;
6111       default: abort();  // Can't reach here.
6112       }
6113       break;
6114     }
6115     }
6116     MVT VT = Op.getValueType();
6117     ShAmt = DAG.getNode(ISD::BIT_CONVERT, dl, VT,
6118                         DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, ShAmtVT, ShAmt));
6119     return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
6120                        DAG.getConstant(NewIntNo, MVT::i32),
6121                        Op.getOperand(1), ShAmt);
6122   }
6123   }
6124 }
6125
6126 SDValue X86TargetLowering::LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) {
6127   unsigned Depth = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
6128   DebugLoc dl = Op.getDebugLoc();
6129
6130   if (Depth > 0) {
6131     SDValue FrameAddr = LowerFRAMEADDR(Op, DAG);
6132     SDValue Offset =
6133       DAG.getConstant(TD->getPointerSize(),
6134                       Subtarget->is64Bit() ? MVT::i64 : MVT::i32);
6135     return DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(),
6136                        DAG.getNode(ISD::ADD, dl, getPointerTy(), 
6137                                    FrameAddr, Offset),
6138                        NULL, 0);
6139   }
6140
6141   // Just load the return address.
6142   SDValue RetAddrFI = getReturnAddressFrameIndex(DAG);
6143   return DAG.getLoad(getPointerTy(), dl, DAG.getEntryNode(), 
6144                      RetAddrFI, NULL, 0);
6145 }
6146
6147 SDValue X86TargetLowering::LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) {
6148   MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
6149   MFI->setFrameAddressIsTaken(true);
6150   MVT VT = Op.getValueType();
6151   DebugLoc dl = Op.getDebugLoc();  // FIXME probably not meaningful
6152   unsigned Depth = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
6153   unsigned FrameReg = Subtarget->is64Bit() ? X86::RBP : X86::EBP;
6154   SDValue FrameAddr = DAG.getCopyFromReg(DAG.getEntryNode(), dl, FrameReg, VT);
6155   while (Depth--)
6156     FrameAddr = DAG.getLoad(VT, dl, DAG.getEntryNode(), FrameAddr, NULL, 0);
6157   return FrameAddr;
6158 }
6159
6160 SDValue X86TargetLowering::LowerFRAME_TO_ARGS_OFFSET(SDValue Op,
6161                                                      SelectionDAG &DAG) {
6162   return DAG.getIntPtrConstant(2*TD->getPointerSize());
6163 }
6164
6165 SDValue X86TargetLowering::LowerEH_RETURN(SDValue Op, SelectionDAG &DAG)
6166 {
6167   MachineFunction &MF = DAG.getMachineFunction();
6168   SDValue Chain     = Op.getOperand(0);
6169   SDValue Offset    = Op.getOperand(1);
6170   SDValue Handler   = Op.getOperand(2);
6171   DebugLoc dl       = Op.getDebugLoc();
6172
6173   SDValue Frame = DAG.getRegister(Subtarget->is64Bit() ? X86::RBP : X86::EBP,
6174                                   getPointerTy());
6175   unsigned StoreAddrReg = (Subtarget->is64Bit() ? X86::RCX : X86::ECX);
6176
6177   SDValue StoreAddr = DAG.getNode(ISD::SUB, dl, getPointerTy(), Frame,
6178                                   DAG.getIntPtrConstant(-TD->getPointerSize()));
6179   StoreAddr = DAG.getNode(ISD::ADD, dl, getPointerTy(), StoreAddr, Offset);
6180   Chain = DAG.getStore(Chain, dl, Handler, StoreAddr, NULL, 0);
6181   Chain = DAG.getCopyToReg(Chain, dl, StoreAddrReg, StoreAddr);
6182   MF.getRegInfo().addLiveOut(StoreAddrReg);
6183
6184   return DAG.getNode(X86ISD::EH_RETURN, dl,
6185                      MVT::Other,
6186                      Chain, DAG.getRegister(StoreAddrReg, getPointerTy()));
6187 }
6188
6189 SDValue X86TargetLowering::LowerTRAMPOLINE(SDValue Op,
6190                                              SelectionDAG &DAG) {
6191   SDValue Root = Op.getOperand(0);
6192   SDValue Trmp = Op.getOperand(1); // trampoline
6193   SDValue FPtr = Op.getOperand(2); // nested function
6194   SDValue Nest = Op.getOperand(3); // 'nest' parameter value
6195   DebugLoc dl  = Op.getDebugLoc();
6196
6197   const Value *TrmpAddr = cast<SrcValueSDNode>(Op.getOperand(4))->getValue();
6198
6199   const X86InstrInfo *TII =
6200     ((X86TargetMachine&)getTargetMachine()).getInstrInfo();
6201
6202   if (Subtarget->is64Bit()) {
6203     SDValue OutChains[6];
6204
6205     // Large code-model.
6206
6207     const unsigned char JMP64r  = TII->getBaseOpcodeFor(X86::JMP64r);
6208     const unsigned char MOV64ri = TII->getBaseOpcodeFor(X86::MOV64ri);
6209
6210     const unsigned char N86R10 = RegInfo->getX86RegNum(X86::R10);
6211     const unsigned char N86R11 = RegInfo->getX86RegNum(X86::R11);
6212
6213     const unsigned char REX_WB = 0x40 | 0x08 | 0x01; // REX prefix
6214
6215     // Load the pointer to the nested function into R11.
6216     unsigned OpCode = ((MOV64ri | N86R11) << 8) | REX_WB; // movabsq r11
6217     SDValue Addr = Trmp;
6218     OutChains[0] = DAG.getStore(Root, dl, DAG.getConstant(OpCode, MVT::i16),
6219                                 Addr, TrmpAddr, 0);
6220
6221     Addr = DAG.getNode(ISD::ADD, dl, MVT::i64, Trmp, 
6222                        DAG.getConstant(2, MVT::i64));
6223     OutChains[1] = DAG.getStore(Root, dl, FPtr, Addr, TrmpAddr, 2, false, 2);
6224
6225     // Load the 'nest' parameter value into R10.
6226     // R10 is specified in X86CallingConv.td
6227     OpCode = ((MOV64ri | N86R10) << 8) | REX_WB; // movabsq r10
6228     Addr = DAG.getNode(ISD::ADD, dl, MVT::i64, Trmp, 
6229                        DAG.getConstant(10, MVT::i64));
6230     OutChains[2] = DAG.getStore(Root, dl, DAG.getConstant(OpCode, MVT::i16),
6231                                 Addr, TrmpAddr, 10);
6232
6233     Addr = DAG.getNode(ISD::ADD, dl, MVT::i64, Trmp, 
6234                        DAG.getConstant(12, MVT::i64));
6235     OutChains[3] = DAG.getStore(Root, dl, Nest, Addr, TrmpAddr, 12, false, 2);
6236
6237     // Jump to the nested function.
6238     OpCode = (JMP64r << 8) | REX_WB; // jmpq *...
6239     Addr = DAG.getNode(ISD::ADD, dl, MVT::i64, Trmp, 
6240                        DAG.getConstant(20, MVT::i64));
6241     OutChains[4] = DAG.getStore(Root, dl, DAG.getConstant(OpCode, MVT::i16),
6242                                 Addr, TrmpAddr, 20);
6243
6244     unsigned char ModRM = N86R11 | (4 << 3) | (3 << 6); // ...r11
6245     Addr = DAG.getNode(ISD::ADD, dl, MVT::i64, Trmp, 
6246                        DAG.getConstant(22, MVT::i64));
6247     OutChains[5] = DAG.getStore(Root, dl, DAG.getConstant(ModRM, MVT::i8), Addr,
6248                                 TrmpAddr, 22);
6249
6250     SDValue Ops[] =
6251       { Trmp, DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains, 6) };
6252     return DAG.getMergeValues(Ops, 2, dl);
6253   } else {
6254     const Function *Func =
6255       cast<Function>(cast<SrcValueSDNode>(Op.getOperand(5))->getValue());
6256     unsigned CC = Func->getCallingConv();
6257     unsigned NestReg;
6258
6259     switch (CC) {
6260     default:
6261       assert(0 && "Unsupported calling convention");
6262     case CallingConv::C:
6263     case CallingConv::X86_StdCall: {
6264       // Pass 'nest' parameter in ECX.
6265       // Must be kept in sync with X86CallingConv.td
6266       NestReg = X86::ECX;
6267
6268       // Check that ECX wasn't needed by an 'inreg' parameter.
6269       const FunctionType *FTy = Func->getFunctionType();
6270       const AttrListPtr &Attrs = Func->getAttributes();
6271
6272       if (!Attrs.isEmpty() && !Func->isVarArg()) {
6273         unsigned InRegCount = 0;
6274         unsigned Idx = 1;
6275
6276         for (FunctionType::param_iterator I = FTy->param_begin(),
6277              E = FTy->param_end(); I != E; ++I, ++Idx)
6278           if (Attrs.paramHasAttr(Idx, Attribute::InReg))
6279             // FIXME: should only count parameters that are lowered to integers.
6280             InRegCount += (TD->getTypeSizeInBits(*I) + 31) / 32;
6281
6282         if (InRegCount > 2) {
6283           cerr << "Nest register in use - reduce number of inreg parameters!\n";
6284           abort();
6285         }
6286       }
6287       break;
6288     }
6289     case CallingConv::X86_FastCall:
6290     case CallingConv::Fast:
6291       // Pass 'nest' parameter in EAX.
6292       // Must be kept in sync with X86CallingConv.td
6293       NestReg = X86::EAX;
6294       break;
6295     }
6296
6297     SDValue OutChains[4];
6298     SDValue Addr, Disp;
6299
6300     Addr = DAG.getNode(ISD::ADD, dl, MVT::i32, Trmp, 
6301                        DAG.getConstant(10, MVT::i32));
6302     Disp = DAG.getNode(ISD::SUB, dl, MVT::i32, FPtr, Addr);
6303
6304     const unsigned char MOV32ri = TII->getBaseOpcodeFor(X86::MOV32ri);
6305     const unsigned char N86Reg = RegInfo->getX86RegNum(NestReg);
6306     OutChains[0] = DAG.getStore(Root, dl, 
6307                                 DAG.getConstant(MOV32ri|N86Reg, MVT::i8),
6308                                 Trmp, TrmpAddr, 0);
6309
6310     Addr = DAG.getNode(ISD::ADD, dl, MVT::i32, Trmp, 
6311                        DAG.getConstant(1, MVT::i32));
6312     OutChains[1] = DAG.getStore(Root, dl, Nest, Addr, TrmpAddr, 1, false, 1);
6313
6314     const unsigned char JMP = TII->getBaseOpcodeFor(X86::JMP);
6315     Addr = DAG.getNode(ISD::ADD, dl, MVT::i32, Trmp, 
6316                        DAG.getConstant(5, MVT::i32));
6317     OutChains[2] = DAG.getStore(Root, dl, DAG.getConstant(JMP, MVT::i8), Addr,
6318                                 TrmpAddr, 5, false, 1);
6319
6320     Addr = DAG.getNode(ISD::ADD, dl, MVT::i32, Trmp, 
6321                        DAG.getConstant(6, MVT::i32));
6322     OutChains[3] = DAG.getStore(Root, dl, Disp, Addr, TrmpAddr, 6, false, 1);
6323
6324     SDValue Ops[] =
6325       { Trmp, DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains, 4) };
6326     return DAG.getMergeValues(Ops, 2, dl);
6327   }
6328 }
6329
6330 SDValue X86TargetLowering::LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG) {
6331   /*
6332    The rounding mode is in bits 11:10 of FPSR, and has the following
6333    settings:
6334      00 Round to nearest
6335      01 Round to -inf
6336      10 Round to +inf
6337      11 Round to 0
6338
6339   FLT_ROUNDS, on the other hand, expects the following:
6340     -1 Undefined
6341      0 Round to 0
6342      1 Round to nearest
6343      2 Round to +inf
6344      3 Round to -inf
6345
6346   To perform the conversion, we do:
6347     (((((FPSR & 0x800) >> 11) | ((FPSR & 0x400) >> 9)) + 1) & 3)
6348   */
6349
6350   MachineFunction &MF = DAG.getMachineFunction();
6351   const TargetMachine &TM = MF.getTarget();
6352   const TargetFrameInfo &TFI = *TM.getFrameInfo();
6353   unsigned StackAlignment = TFI.getStackAlignment();
6354   MVT VT = Op.getValueType();
6355   DebugLoc dl = Op.getDebugLoc();
6356
6357   // Save FP Control Word to stack slot
6358   int SSFI = MF.getFrameInfo()->CreateStackObject(2, StackAlignment);
6359   SDValue StackSlot = DAG.getFrameIndex(SSFI, getPointerTy());
6360
6361   SDValue Chain = DAG.getNode(X86ISD::FNSTCW16m, dl, MVT::Other,
6362                               DAG.getEntryNode(), StackSlot);
6363
6364   // Load FP Control Word from stack slot
6365   SDValue CWD = DAG.getLoad(MVT::i16, dl, Chain, StackSlot, NULL, 0);
6366
6367   // Transform as necessary
6368   SDValue CWD1 =
6369     DAG.getNode(ISD::SRL, dl, MVT::i16,
6370                 DAG.getNode(ISD::AND, dl, MVT::i16,
6371                             CWD, DAG.getConstant(0x800, MVT::i16)),
6372                 DAG.getConstant(11, MVT::i8));
6373   SDValue CWD2 =
6374     DAG.getNode(ISD::SRL, dl, MVT::i16,
6375                 DAG.getNode(ISD::AND, dl, MVT::i16,
6376                             CWD, DAG.getConstant(0x400, MVT::i16)),
6377                 DAG.getConstant(9, MVT::i8));
6378
6379   SDValue RetVal =
6380     DAG.getNode(ISD::AND, dl, MVT::i16,
6381                 DAG.getNode(ISD::ADD, dl, MVT::i16,
6382                             DAG.getNode(ISD::OR, dl, MVT::i16, CWD1, CWD2),
6383                             DAG.getConstant(1, MVT::i16)),
6384                 DAG.getConstant(3, MVT::i16));
6385
6386
6387   return DAG.getNode((VT.getSizeInBits() < 16 ?
6388                       ISD::TRUNCATE : ISD::ZERO_EXTEND), dl, VT, RetVal);
6389 }
6390
6391 SDValue X86TargetLowering::LowerCTLZ(SDValue Op, SelectionDAG &DAG) {
6392   MVT VT = Op.getValueType();
6393   MVT OpVT = VT;
6394   unsigned NumBits = VT.getSizeInBits();
6395   DebugLoc dl = Op.getDebugLoc();
6396
6397   Op = Op.getOperand(0);
6398   if (VT == MVT::i8) {
6399     // Zero extend to i32 since there is not an i8 bsr.
6400     OpVT = MVT::i32;
6401     Op = DAG.getNode(ISD::ZERO_EXTEND, dl, OpVT, Op);
6402   }
6403
6404   // Issue a bsr (scan bits in reverse) which also sets EFLAGS.
6405   SDVTList VTs = DAG.getVTList(OpVT, MVT::i32);
6406   Op = DAG.getNode(X86ISD::BSR, dl, VTs, Op);
6407
6408   // If src is zero (i.e. bsr sets ZF), returns NumBits.
6409   SmallVector<SDValue, 4> Ops;
6410   Ops.push_back(Op);
6411   Ops.push_back(DAG.getConstant(NumBits+NumBits-1, OpVT));
6412   Ops.push_back(DAG.getConstant(X86::COND_E, MVT::i8));
6413   Ops.push_back(Op.getValue(1));
6414   Op = DAG.getNode(X86ISD::CMOV, dl, OpVT, &Ops[0], 4);
6415
6416   // Finally xor with NumBits-1.
6417   Op = DAG.getNode(ISD::XOR, dl, OpVT, Op, DAG.getConstant(NumBits-1, OpVT));
6418
6419   if (VT == MVT::i8)
6420     Op = DAG.getNode(ISD::TRUNCATE, dl, MVT::i8, Op);
6421   return Op;
6422 }
6423
6424 SDValue X86TargetLowering::LowerCTTZ(SDValue Op, SelectionDAG &DAG) {
6425   MVT VT = Op.getValueType();
6426   MVT OpVT = VT;
6427   unsigned NumBits = VT.getSizeInBits();
6428   DebugLoc dl = Op.getDebugLoc();
6429
6430   Op = Op.getOperand(0);
6431   if (VT == MVT::i8) {
6432     OpVT = MVT::i32;
6433     Op = DAG.getNode(ISD::ZERO_EXTEND, dl, OpVT, Op);
6434   }
6435
6436   // Issue a bsf (scan bits forward) which also sets EFLAGS.
6437   SDVTList VTs = DAG.getVTList(OpVT, MVT::i32);
6438   Op = DAG.getNode(X86ISD::BSF, dl, VTs, Op);
6439
6440   // If src is zero (i.e. bsf sets ZF), returns NumBits.
6441   SmallVector<SDValue, 4> Ops;
6442   Ops.push_back(Op);
6443   Ops.push_back(DAG.getConstant(NumBits, OpVT));
6444   Ops.push_back(DAG.getConstant(X86::COND_E, MVT::i8));
6445   Ops.push_back(Op.getValue(1));
6446   Op = DAG.getNode(X86ISD::CMOV, dl, OpVT, &Ops[0], 4);
6447
6448   if (VT == MVT::i8)
6449     Op = DAG.getNode(ISD::TRUNCATE, dl, MVT::i8, Op);
6450   return Op;
6451 }
6452
6453 SDValue X86TargetLowering::LowerMUL_V2I64(SDValue Op, SelectionDAG &DAG) {
6454   MVT VT = Op.getValueType();
6455   assert(VT == MVT::v2i64 && "Only know how to lower V2I64 multiply");
6456   DebugLoc dl = Op.getDebugLoc();
6457   
6458   //  ulong2 Ahi = __builtin_ia32_psrlqi128( a, 32);
6459   //  ulong2 Bhi = __builtin_ia32_psrlqi128( b, 32);
6460   //  ulong2 AloBlo = __builtin_ia32_pmuludq128( a, b );
6461   //  ulong2 AloBhi = __builtin_ia32_pmuludq128( a, Bhi );
6462   //  ulong2 AhiBlo = __builtin_ia32_pmuludq128( Ahi, b );
6463   //
6464   //  AloBhi = __builtin_ia32_psllqi128( AloBhi, 32 );
6465   //  AhiBlo = __builtin_ia32_psllqi128( AhiBlo, 32 );
6466   //  return AloBlo + AloBhi + AhiBlo;
6467
6468   SDValue A = Op.getOperand(0);
6469   SDValue B = Op.getOperand(1);
6470   
6471   SDValue Ahi = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
6472                        DAG.getConstant(Intrinsic::x86_sse2_psrli_q, MVT::i32),
6473                        A, DAG.getConstant(32, MVT::i32));
6474   SDValue Bhi = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
6475                        DAG.getConstant(Intrinsic::x86_sse2_psrli_q, MVT::i32),
6476                        B, DAG.getConstant(32, MVT::i32));
6477   SDValue AloBlo = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
6478                        DAG.getConstant(Intrinsic::x86_sse2_pmulu_dq, MVT::i32),
6479                        A, B);
6480   SDValue AloBhi = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
6481                        DAG.getConstant(Intrinsic::x86_sse2_pmulu_dq, MVT::i32),
6482                        A, Bhi);
6483   SDValue AhiBlo = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
6484                        DAG.getConstant(Intrinsic::x86_sse2_pmulu_dq, MVT::i32),
6485                        Ahi, B);
6486   AloBhi = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
6487                        DAG.getConstant(Intrinsic::x86_sse2_pslli_q, MVT::i32),
6488                        AloBhi, DAG.getConstant(32, MVT::i32));
6489   AhiBlo = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
6490                        DAG.getConstant(Intrinsic::x86_sse2_pslli_q, MVT::i32),
6491                        AhiBlo, DAG.getConstant(32, MVT::i32));
6492   SDValue Res = DAG.getNode(ISD::ADD, dl, VT, AloBlo, AloBhi);
6493   Res = DAG.getNode(ISD::ADD, dl, VT, Res, AhiBlo);
6494   return Res;
6495 }
6496
6497
6498 SDValue X86TargetLowering::LowerXALUO(SDValue Op, SelectionDAG &DAG) {
6499   // Lower the "add/sub/mul with overflow" instruction into a regular ins plus
6500   // a "setcc" instruction that checks the overflow flag. The "brcond" lowering
6501   // looks for this combo and may remove the "setcc" instruction if the "setcc"
6502   // has only one use.
6503   SDNode *N = Op.getNode();
6504   SDValue LHS = N->getOperand(0);
6505   SDValue RHS = N->getOperand(1);
6506   unsigned BaseOp = 0;
6507   unsigned Cond = 0;
6508   DebugLoc dl = Op.getDebugLoc();
6509
6510   switch (Op.getOpcode()) {
6511   default: assert(0 && "Unknown ovf instruction!");
6512   case ISD::SADDO:
6513     BaseOp = X86ISD::ADD;
6514     Cond = X86::COND_O;
6515     break;
6516   case ISD::UADDO:
6517     BaseOp = X86ISD::ADD;
6518     Cond = X86::COND_B;
6519     break;
6520   case ISD::SSUBO:
6521     BaseOp = X86ISD::SUB;
6522     Cond = X86::COND_O;
6523     break;
6524   case ISD::USUBO:
6525     BaseOp = X86ISD::SUB;
6526     Cond = X86::COND_B;
6527     break;
6528   case ISD::SMULO:
6529     BaseOp = X86ISD::SMUL;
6530     Cond = X86::COND_O;
6531     break;
6532   case ISD::UMULO:
6533     BaseOp = X86ISD::UMUL;
6534     Cond = X86::COND_B;
6535     break;
6536   }
6537
6538   // Also sets EFLAGS.
6539   SDVTList VTs = DAG.getVTList(N->getValueType(0), MVT::i32);
6540   SDValue Sum = DAG.getNode(BaseOp, dl, VTs, LHS, RHS);
6541
6542   SDValue SetCC =
6543     DAG.getNode(X86ISD::SETCC, dl, N->getValueType(1),
6544                 DAG.getConstant(Cond, MVT::i32), SDValue(Sum.getNode(), 1));
6545
6546   DAG.ReplaceAllUsesOfValueWith(SDValue(N, 1), SetCC);
6547   return Sum;
6548 }
6549
6550 SDValue X86TargetLowering::LowerCMP_SWAP(SDValue Op, SelectionDAG &DAG) {
6551   MVT T = Op.getValueType();
6552   DebugLoc dl = Op.getDebugLoc();
6553   unsigned Reg = 0;
6554   unsigned size = 0;
6555   switch(T.getSimpleVT()) {
6556   default:
6557     assert(false && "Invalid value type!");
6558   case MVT::i8:  Reg = X86::AL;  size = 1; break;
6559   case MVT::i16: Reg = X86::AX;  size = 2; break;
6560   case MVT::i32: Reg = X86::EAX; size = 4; break;
6561   case MVT::i64: 
6562     assert(Subtarget->is64Bit() && "Node not type legal!");
6563     Reg = X86::RAX; size = 8;
6564     break;
6565   }
6566   SDValue cpIn = DAG.getCopyToReg(Op.getOperand(0), dl, Reg,
6567                                     Op.getOperand(2), SDValue());
6568   SDValue Ops[] = { cpIn.getValue(0),
6569                     Op.getOperand(1),
6570                     Op.getOperand(3),
6571                     DAG.getTargetConstant(size, MVT::i8),
6572                     cpIn.getValue(1) };
6573   SDVTList Tys = DAG.getVTList(MVT::Other, MVT::Flag);
6574   SDValue Result = DAG.getNode(X86ISD::LCMPXCHG_DAG, dl, Tys, Ops, 5);
6575   SDValue cpOut = 
6576     DAG.getCopyFromReg(Result.getValue(0), dl, Reg, T, Result.getValue(1));
6577   return cpOut;
6578 }
6579
6580 SDValue X86TargetLowering::LowerREADCYCLECOUNTER(SDValue Op,
6581                                                  SelectionDAG &DAG) {
6582   assert(Subtarget->is64Bit() && "Result not type legalized?");
6583   SDVTList Tys = DAG.getVTList(MVT::Other, MVT::Flag);
6584   SDValue TheChain = Op.getOperand(0);
6585   DebugLoc dl = Op.getDebugLoc();
6586   SDValue rd = DAG.getNode(X86ISD::RDTSC_DAG, dl, Tys, &TheChain, 1);
6587   SDValue rax = DAG.getCopyFromReg(rd, dl, X86::RAX, MVT::i64, rd.getValue(1));
6588   SDValue rdx = DAG.getCopyFromReg(rax.getValue(1), dl, X86::RDX, MVT::i64,
6589                                    rax.getValue(2));
6590   SDValue Tmp = DAG.getNode(ISD::SHL, dl, MVT::i64, rdx,
6591                             DAG.getConstant(32, MVT::i8));
6592   SDValue Ops[] = {
6593     DAG.getNode(ISD::OR, dl, MVT::i64, rax, Tmp),
6594     rdx.getValue(1)
6595   };
6596   return DAG.getMergeValues(Ops, 2, dl);
6597 }
6598
6599 SDValue X86TargetLowering::LowerLOAD_SUB(SDValue Op, SelectionDAG &DAG) {
6600   SDNode *Node = Op.getNode();
6601   DebugLoc dl = Node->getDebugLoc();
6602   MVT T = Node->getValueType(0);
6603   SDValue negOp = DAG.getNode(ISD::SUB, dl, T,
6604                                 DAG.getConstant(0, T), Node->getOperand(2));
6605   return DAG.getAtomic(ISD::ATOMIC_LOAD_ADD, dl,
6606                        cast<AtomicSDNode>(Node)->getMemoryVT(),
6607                        Node->getOperand(0),
6608                        Node->getOperand(1), negOp,
6609                        cast<AtomicSDNode>(Node)->getSrcValue(),
6610                        cast<AtomicSDNode>(Node)->getAlignment());
6611 }
6612
6613 /// LowerOperation - Provide custom lowering hooks for some operations.
6614 ///
6615 SDValue X86TargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) {
6616   switch (Op.getOpcode()) {
6617   default: assert(0 && "Should not custom lower this!");
6618   case ISD::ATOMIC_CMP_SWAP:    return LowerCMP_SWAP(Op,DAG);
6619   case ISD::ATOMIC_LOAD_SUB:    return LowerLOAD_SUB(Op,DAG);
6620   case ISD::BUILD_VECTOR:       return LowerBUILD_VECTOR(Op, DAG);
6621   case ISD::VECTOR_SHUFFLE:     return LowerVECTOR_SHUFFLE(Op, DAG);
6622   case ISD::EXTRACT_VECTOR_ELT: return LowerEXTRACT_VECTOR_ELT(Op, DAG);
6623   case ISD::INSERT_VECTOR_ELT:  return LowerINSERT_VECTOR_ELT(Op, DAG);
6624   case ISD::SCALAR_TO_VECTOR:   return LowerSCALAR_TO_VECTOR(Op, DAG);
6625   case ISD::ConstantPool:       return LowerConstantPool(Op, DAG);
6626   case ISD::GlobalAddress:      return LowerGlobalAddress(Op, DAG);
6627   case ISD::GlobalTLSAddress:   return LowerGlobalTLSAddress(Op, DAG);
6628   case ISD::ExternalSymbol:     return LowerExternalSymbol(Op, DAG);
6629   case ISD::SHL_PARTS:
6630   case ISD::SRA_PARTS:
6631   case ISD::SRL_PARTS:          return LowerShift(Op, DAG);
6632   case ISD::SINT_TO_FP:         return LowerSINT_TO_FP(Op, DAG);
6633   case ISD::UINT_TO_FP:         return LowerUINT_TO_FP(Op, DAG);
6634   case ISD::FP_TO_SINT:         return LowerFP_TO_SINT(Op, DAG);
6635   case ISD::FABS:               return LowerFABS(Op, DAG);
6636   case ISD::FNEG:               return LowerFNEG(Op, DAG);
6637   case ISD::FCOPYSIGN:          return LowerFCOPYSIGN(Op, DAG);
6638   case ISD::SETCC:              return LowerSETCC(Op, DAG);
6639   case ISD::VSETCC:             return LowerVSETCC(Op, DAG);
6640   case ISD::SELECT:             return LowerSELECT(Op, DAG);
6641   case ISD::BRCOND:             return LowerBRCOND(Op, DAG);
6642   case ISD::JumpTable:          return LowerJumpTable(Op, DAG);
6643   case ISD::CALL:               return LowerCALL(Op, DAG);
6644   case ISD::RET:                return LowerRET(Op, DAG);
6645   case ISD::FORMAL_ARGUMENTS:   return LowerFORMAL_ARGUMENTS(Op, DAG);
6646   case ISD::VASTART:            return LowerVASTART(Op, DAG);
6647   case ISD::VAARG:              return LowerVAARG(Op, DAG);
6648   case ISD::VACOPY:             return LowerVACOPY(Op, DAG);
6649   case ISD::INTRINSIC_WO_CHAIN: return LowerINTRINSIC_WO_CHAIN(Op, DAG);
6650   case ISD::RETURNADDR:         return LowerRETURNADDR(Op, DAG);
6651   case ISD::FRAMEADDR:          return LowerFRAMEADDR(Op, DAG);
6652   case ISD::FRAME_TO_ARGS_OFFSET:
6653                                 return LowerFRAME_TO_ARGS_OFFSET(Op, DAG);
6654   case ISD::DYNAMIC_STACKALLOC: return LowerDYNAMIC_STACKALLOC(Op, DAG);
6655   case ISD::EH_RETURN:          return LowerEH_RETURN(Op, DAG);
6656   case ISD::TRAMPOLINE:         return LowerTRAMPOLINE(Op, DAG);
6657   case ISD::FLT_ROUNDS_:        return LowerFLT_ROUNDS_(Op, DAG);
6658   case ISD::CTLZ:               return LowerCTLZ(Op, DAG);
6659   case ISD::CTTZ:               return LowerCTTZ(Op, DAG);
6660   case ISD::MUL:                return LowerMUL_V2I64(Op, DAG);
6661   case ISD::SADDO:
6662   case ISD::UADDO:
6663   case ISD::SSUBO:
6664   case ISD::USUBO:
6665   case ISD::SMULO:
6666   case ISD::UMULO:              return LowerXALUO(Op, DAG);
6667   case ISD::READCYCLECOUNTER:   return LowerREADCYCLECOUNTER(Op, DAG);
6668   }
6669 }
6670
6671 void X86TargetLowering::
6672 ReplaceATOMIC_BINARY_64(SDNode *Node, SmallVectorImpl<SDValue>&Results,
6673                         SelectionDAG &DAG, unsigned NewOp) {
6674   MVT T = Node->getValueType(0);
6675   DebugLoc dl = Node->getDebugLoc();
6676   assert (T == MVT::i64 && "Only know how to expand i64 atomics");
6677
6678   SDValue Chain = Node->getOperand(0);
6679   SDValue In1 = Node->getOperand(1);
6680   SDValue In2L = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
6681                              Node->getOperand(2), DAG.getIntPtrConstant(0));
6682   SDValue In2H = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32,
6683                              Node->getOperand(2), DAG.getIntPtrConstant(1));
6684   // This is a generalized SDNode, not an AtomicSDNode, so it doesn't
6685   // have a MemOperand.  Pass the info through as a normal operand.
6686   SDValue LSI = DAG.getMemOperand(cast<MemSDNode>(Node)->getMemOperand());
6687   SDValue Ops[] = { Chain, In1, In2L, In2H, LSI };
6688   SDVTList Tys = DAG.getVTList(MVT::i32, MVT::i32, MVT::Other);
6689   SDValue Result = DAG.getNode(NewOp, dl, Tys, Ops, 5);
6690   SDValue OpsF[] = { Result.getValue(0), Result.getValue(1)};
6691   Results.push_back(DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i64, OpsF, 2));
6692   Results.push_back(Result.getValue(2));
6693 }
6694
6695 /// ReplaceNodeResults - Replace a node with an illegal result type
6696 /// with a new node built out of custom code.
6697 void X86TargetLowering::ReplaceNodeResults(SDNode *N,
6698                                            SmallVectorImpl<SDValue>&Results,
6699                                            SelectionDAG &DAG) {
6700   DebugLoc dl = N->getDebugLoc();
6701   switch (N->getOpcode()) {
6702   default:
6703     assert(false && "Do not know how to custom type legalize this operation!");
6704     return;
6705   case ISD::FP_TO_SINT: {
6706     std::pair<SDValue,SDValue> Vals = FP_TO_SINTHelper(SDValue(N, 0), DAG);
6707     SDValue FIST = Vals.first, StackSlot = Vals.second;
6708     if (FIST.getNode() != 0) {
6709       MVT VT = N->getValueType(0);
6710       // Return a load from the stack slot.
6711       Results.push_back(DAG.getLoad(VT, dl, FIST, StackSlot, NULL, 0));
6712     }
6713     return;
6714   }
6715   case ISD::READCYCLECOUNTER: {
6716     SDVTList Tys = DAG.getVTList(MVT::Other, MVT::Flag);
6717     SDValue TheChain = N->getOperand(0);
6718     SDValue rd = DAG.getNode(X86ISD::RDTSC_DAG, dl, Tys, &TheChain, 1);
6719     SDValue eax = DAG.getCopyFromReg(rd, dl, X86::EAX, MVT::i32, 
6720                                      rd.getValue(1));
6721     SDValue edx = DAG.getCopyFromReg(eax.getValue(1), dl, X86::EDX, MVT::i32,
6722                                      eax.getValue(2));
6723     // Use a buildpair to merge the two 32-bit values into a 64-bit one.
6724     SDValue Ops[] = { eax, edx };
6725     Results.push_back(DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i64, Ops, 2));
6726     Results.push_back(edx.getValue(1));
6727     return;
6728   }
6729   case ISD::ATOMIC_CMP_SWAP: {
6730     MVT T = N->getValueType(0);
6731     assert (T == MVT::i64 && "Only know how to expand i64 Cmp and Swap");
6732     SDValue cpInL, cpInH;
6733     cpInL = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, N->getOperand(2),
6734                         DAG.getConstant(0, MVT::i32));
6735     cpInH = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, N->getOperand(2),
6736                         DAG.getConstant(1, MVT::i32));
6737     cpInL = DAG.getCopyToReg(N->getOperand(0), dl, X86::EAX, cpInL, SDValue());
6738     cpInH = DAG.getCopyToReg(cpInL.getValue(0), dl, X86::EDX, cpInH,
6739                              cpInL.getValue(1));
6740     SDValue swapInL, swapInH;
6741     swapInL = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, N->getOperand(3),
6742                           DAG.getConstant(0, MVT::i32));
6743     swapInH = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, MVT::i32, N->getOperand(3),
6744                           DAG.getConstant(1, MVT::i32));
6745     swapInL = DAG.getCopyToReg(cpInH.getValue(0), dl, X86::EBX, swapInL,
6746                                cpInH.getValue(1));
6747     swapInH = DAG.getCopyToReg(swapInL.getValue(0), dl, X86::ECX, swapInH,
6748                                swapInL.getValue(1));
6749     SDValue Ops[] = { swapInH.getValue(0),
6750                       N->getOperand(1),
6751                       swapInH.getValue(1) };
6752     SDVTList Tys = DAG.getVTList(MVT::Other, MVT::Flag);
6753     SDValue Result = DAG.getNode(X86ISD::LCMPXCHG8_DAG, dl, Tys, Ops, 3);
6754     SDValue cpOutL = DAG.getCopyFromReg(Result.getValue(0), dl, X86::EAX,
6755                                         MVT::i32, Result.getValue(1));
6756     SDValue cpOutH = DAG.getCopyFromReg(cpOutL.getValue(1), dl, X86::EDX,
6757                                         MVT::i32, cpOutL.getValue(2));
6758     SDValue OpsF[] = { cpOutL.getValue(0), cpOutH.getValue(0)};
6759     Results.push_back(DAG.getNode(ISD::BUILD_PAIR, dl, MVT::i64, OpsF, 2));
6760     Results.push_back(cpOutH.getValue(1));
6761     return;
6762   }
6763   case ISD::ATOMIC_LOAD_ADD:
6764     ReplaceATOMIC_BINARY_64(N, Results, DAG, X86ISD::ATOMADD64_DAG);
6765     return;
6766   case ISD::ATOMIC_LOAD_AND:
6767     ReplaceATOMIC_BINARY_64(N, Results, DAG, X86ISD::ATOMAND64_DAG);
6768     return;
6769   case ISD::ATOMIC_LOAD_NAND:
6770     ReplaceATOMIC_BINARY_64(N, Results, DAG, X86ISD::ATOMNAND64_DAG);
6771     return;
6772   case ISD::ATOMIC_LOAD_OR:
6773     ReplaceATOMIC_BINARY_64(N, Results, DAG, X86ISD::ATOMOR64_DAG);
6774     return;
6775   case ISD::ATOMIC_LOAD_SUB:
6776     ReplaceATOMIC_BINARY_64(N, Results, DAG, X86ISD::ATOMSUB64_DAG);
6777     return;
6778   case ISD::ATOMIC_LOAD_XOR:
6779     ReplaceATOMIC_BINARY_64(N, Results, DAG, X86ISD::ATOMXOR64_DAG);
6780     return;
6781   case ISD::ATOMIC_SWAP:
6782     ReplaceATOMIC_BINARY_64(N, Results, DAG, X86ISD::ATOMSWAP64_DAG);
6783     return;
6784   }
6785 }
6786
6787 const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const {
6788   switch (Opcode) {
6789   default: return NULL;
6790   case X86ISD::BSF:                return "X86ISD::BSF";
6791   case X86ISD::BSR:                return "X86ISD::BSR";
6792   case X86ISD::SHLD:               return "X86ISD::SHLD";
6793   case X86ISD::SHRD:               return "X86ISD::SHRD";
6794   case X86ISD::FAND:               return "X86ISD::FAND";
6795   case X86ISD::FOR:                return "X86ISD::FOR";
6796   case X86ISD::FXOR:               return "X86ISD::FXOR";
6797   case X86ISD::FSRL:               return "X86ISD::FSRL";
6798   case X86ISD::FILD:               return "X86ISD::FILD";
6799   case X86ISD::FILD_FLAG:          return "X86ISD::FILD_FLAG";
6800   case X86ISD::FP_TO_INT16_IN_MEM: return "X86ISD::FP_TO_INT16_IN_MEM";
6801   case X86ISD::FP_TO_INT32_IN_MEM: return "X86ISD::FP_TO_INT32_IN_MEM";
6802   case X86ISD::FP_TO_INT64_IN_MEM: return "X86ISD::FP_TO_INT64_IN_MEM";
6803   case X86ISD::FLD:                return "X86ISD::FLD";
6804   case X86ISD::FST:                return "X86ISD::FST";
6805   case X86ISD::CALL:               return "X86ISD::CALL";
6806   case X86ISD::TAILCALL:           return "X86ISD::TAILCALL";
6807   case X86ISD::RDTSC_DAG:          return "X86ISD::RDTSC_DAG";
6808   case X86ISD::BT:                 return "X86ISD::BT";
6809   case X86ISD::CMP:                return "X86ISD::CMP";
6810   case X86ISD::COMI:               return "X86ISD::COMI";
6811   case X86ISD::UCOMI:              return "X86ISD::UCOMI";
6812   case X86ISD::SETCC:              return "X86ISD::SETCC";
6813   case X86ISD::CMOV:               return "X86ISD::CMOV";
6814   case X86ISD::BRCOND:             return "X86ISD::BRCOND";
6815   case X86ISD::RET_FLAG:           return "X86ISD::RET_FLAG";
6816   case X86ISD::REP_STOS:           return "X86ISD::REP_STOS";
6817   case X86ISD::REP_MOVS:           return "X86ISD::REP_MOVS";
6818   case X86ISD::GlobalBaseReg:      return "X86ISD::GlobalBaseReg";
6819   case X86ISD::Wrapper:            return "X86ISD::Wrapper";
6820   case X86ISD::PEXTRB:             return "X86ISD::PEXTRB";
6821   case X86ISD::PEXTRW:             return "X86ISD::PEXTRW";
6822   case X86ISD::INSERTPS:           return "X86ISD::INSERTPS";
6823   case X86ISD::PINSRB:             return "X86ISD::PINSRB";
6824   case X86ISD::PINSRW:             return "X86ISD::PINSRW";
6825   case X86ISD::FMAX:               return "X86ISD::FMAX";
6826   case X86ISD::FMIN:               return "X86ISD::FMIN";
6827   case X86ISD::FRSQRT:             return "X86ISD::FRSQRT";
6828   case X86ISD::FRCP:               return "X86ISD::FRCP";
6829   case X86ISD::TLSADDR:            return "X86ISD::TLSADDR";
6830   case X86ISD::THREAD_POINTER:     return "X86ISD::THREAD_POINTER";
6831   case X86ISD::EH_RETURN:          return "X86ISD::EH_RETURN";
6832   case X86ISD::TC_RETURN:          return "X86ISD::TC_RETURN";
6833   case X86ISD::FNSTCW16m:          return "X86ISD::FNSTCW16m";
6834   case X86ISD::LCMPXCHG_DAG:       return "X86ISD::LCMPXCHG_DAG";
6835   case X86ISD::LCMPXCHG8_DAG:      return "X86ISD::LCMPXCHG8_DAG";
6836   case X86ISD::ATOMADD64_DAG:      return "X86ISD::ATOMADD64_DAG";
6837   case X86ISD::ATOMSUB64_DAG:      return "X86ISD::ATOMSUB64_DAG";
6838   case X86ISD::ATOMOR64_DAG:       return "X86ISD::ATOMOR64_DAG";
6839   case X86ISD::ATOMXOR64_DAG:      return "X86ISD::ATOMXOR64_DAG";
6840   case X86ISD::ATOMAND64_DAG:      return "X86ISD::ATOMAND64_DAG";
6841   case X86ISD::ATOMNAND64_DAG:     return "X86ISD::ATOMNAND64_DAG";
6842   case X86ISD::VZEXT_MOVL:         return "X86ISD::VZEXT_MOVL";
6843   case X86ISD::VZEXT_LOAD:         return "X86ISD::VZEXT_LOAD";
6844   case X86ISD::VSHL:               return "X86ISD::VSHL";
6845   case X86ISD::VSRL:               return "X86ISD::VSRL";
6846   case X86ISD::CMPPD:              return "X86ISD::CMPPD";
6847   case X86ISD::CMPPS:              return "X86ISD::CMPPS";
6848   case X86ISD::PCMPEQB:            return "X86ISD::PCMPEQB";
6849   case X86ISD::PCMPEQW:            return "X86ISD::PCMPEQW";
6850   case X86ISD::PCMPEQD:            return "X86ISD::PCMPEQD";
6851   case X86ISD::PCMPEQQ:            return "X86ISD::PCMPEQQ";
6852   case X86ISD::PCMPGTB:            return "X86ISD::PCMPGTB";
6853   case X86ISD::PCMPGTW:            return "X86ISD::PCMPGTW";
6854   case X86ISD::PCMPGTD:            return "X86ISD::PCMPGTD";
6855   case X86ISD::PCMPGTQ:            return "X86ISD::PCMPGTQ";
6856   case X86ISD::ADD:                return "X86ISD::ADD";
6857   case X86ISD::SUB:                return "X86ISD::SUB";
6858   case X86ISD::SMUL:               return "X86ISD::SMUL";
6859   case X86ISD::UMUL:               return "X86ISD::UMUL";
6860   }
6861 }
6862
6863 // isLegalAddressingMode - Return true if the addressing mode represented
6864 // by AM is legal for this target, for a load/store of the specified type.
6865 bool X86TargetLowering::isLegalAddressingMode(const AddrMode &AM, 
6866                                               const Type *Ty) const {
6867   // X86 supports extremely general addressing modes.
6868   
6869   // X86 allows a sign-extended 32-bit immediate field as a displacement.
6870   if (AM.BaseOffs <= -(1LL << 32) || AM.BaseOffs >= (1LL << 32)-1)
6871     return false;
6872   
6873   if (AM.BaseGV) {
6874     // We can only fold this if we don't need an extra load.
6875     if (Subtarget->GVRequiresExtraLoad(AM.BaseGV, getTargetMachine(), false))
6876       return false;
6877     // If BaseGV requires a register, we cannot also have a BaseReg.
6878     if (Subtarget->GVRequiresRegister(AM.BaseGV, getTargetMachine(), false) &&
6879         AM.HasBaseReg)
6880       return false;
6881
6882     // X86-64 only supports addr of globals in small code model.
6883     if (Subtarget->is64Bit()) {
6884       if (getTargetMachine().getCodeModel() != CodeModel::Small)
6885         return false;
6886       // If lower 4G is not available, then we must use rip-relative addressing.
6887       if (AM.BaseOffs || AM.Scale > 1)
6888         return false;
6889     }
6890   }
6891   
6892   switch (AM.Scale) {
6893   case 0:
6894   case 1:
6895   case 2:
6896   case 4:
6897   case 8:
6898     // These scales always work.
6899     break;
6900   case 3:
6901   case 5:
6902   case 9:
6903     // These scales are formed with basereg+scalereg.  Only accept if there is
6904     // no basereg yet.
6905     if (AM.HasBaseReg)
6906       return false;
6907     break;
6908   default:  // Other stuff never works.
6909     return false;
6910   }
6911   
6912   return true;
6913 }
6914
6915
6916 bool X86TargetLowering::isTruncateFree(const Type *Ty1, const Type *Ty2) const {
6917   if (!Ty1->isInteger() || !Ty2->isInteger())
6918     return false;
6919   unsigned NumBits1 = Ty1->getPrimitiveSizeInBits();
6920   unsigned NumBits2 = Ty2->getPrimitiveSizeInBits();
6921   if (NumBits1 <= NumBits2)
6922     return false;
6923   return Subtarget->is64Bit() || NumBits1 < 64;
6924 }
6925
6926 bool X86TargetLowering::isTruncateFree(MVT VT1, MVT VT2) const {
6927   if (!VT1.isInteger() || !VT2.isInteger())
6928     return false;
6929   unsigned NumBits1 = VT1.getSizeInBits();
6930   unsigned NumBits2 = VT2.getSizeInBits();
6931   if (NumBits1 <= NumBits2)
6932     return false;
6933   return Subtarget->is64Bit() || NumBits1 < 64;
6934 }
6935
6936 /// isShuffleMaskLegal - Targets can use this to indicate that they only
6937 /// support *some* VECTOR_SHUFFLE operations, those with specific masks.
6938 /// By default, if a target supports the VECTOR_SHUFFLE node, all mask values
6939 /// are assumed to be legal.
6940 bool
6941 X86TargetLowering::isShuffleMaskLegal(SDValue Mask, MVT VT) const {
6942   // Only do shuffles on 128-bit vector types for now.
6943   if (VT.getSizeInBits() == 64) return false;
6944   return (Mask.getNode()->getNumOperands() <= 4 ||
6945           isIdentityMask(Mask.getNode()) ||
6946           isIdentityMask(Mask.getNode(), true) ||
6947           isSplatMask(Mask.getNode())  ||
6948           isPSHUFHW_PSHUFLWMask(Mask.getNode()) ||
6949           X86::isUNPCKLMask(Mask.getNode()) ||
6950           X86::isUNPCKHMask(Mask.getNode()) ||
6951           X86::isUNPCKL_v_undef_Mask(Mask.getNode()) ||
6952           X86::isUNPCKH_v_undef_Mask(Mask.getNode()));
6953 }
6954
6955 bool
6956 X86TargetLowering::isVectorClearMaskLegal(const std::vector<SDValue> &BVOps,
6957                                           MVT EVT, SelectionDAG &DAG) const {
6958   unsigned NumElts = BVOps.size();
6959   // Only do shuffles on 128-bit vector types for now.
6960   if (EVT.getSizeInBits() * NumElts == 64) return false;
6961   if (NumElts == 2) return true;
6962   if (NumElts == 4) {
6963     return (isMOVLMask(&BVOps[0], 4)  ||
6964             isCommutedMOVL(&BVOps[0], 4, true) ||
6965             isSHUFPMask(&BVOps[0], 4) || 
6966             isCommutedSHUFP(&BVOps[0], 4));
6967   }
6968   return false;
6969 }
6970
6971 //===----------------------------------------------------------------------===//
6972 //                           X86 Scheduler Hooks
6973 //===----------------------------------------------------------------------===//
6974
6975 // private utility function
6976 MachineBasicBlock *
6977 X86TargetLowering::EmitAtomicBitwiseWithCustomInserter(MachineInstr *bInstr,
6978                                                        MachineBasicBlock *MBB,
6979                                                        unsigned regOpc,
6980                                                        unsigned immOpc,
6981                                                        unsigned LoadOpc,
6982                                                        unsigned CXchgOpc,
6983                                                        unsigned copyOpc,
6984                                                        unsigned notOpc,
6985                                                        unsigned EAXreg,
6986                                                        TargetRegisterClass *RC,
6987                                                        bool invSrc) const {
6988   // For the atomic bitwise operator, we generate
6989   //   thisMBB:
6990   //   newMBB:
6991   //     ld  t1 = [bitinstr.addr]
6992   //     op  t2 = t1, [bitinstr.val]
6993   //     mov EAX = t1
6994   //     lcs dest = [bitinstr.addr], t2  [EAX is implicit]
6995   //     bz  newMBB
6996   //     fallthrough -->nextMBB
6997   const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
6998   const BasicBlock *LLVM_BB = MBB->getBasicBlock();
6999   MachineFunction::iterator MBBIter = MBB;
7000   ++MBBIter;
7001   
7002   /// First build the CFG
7003   MachineFunction *F = MBB->getParent();
7004   MachineBasicBlock *thisMBB = MBB;
7005   MachineBasicBlock *newMBB = F->CreateMachineBasicBlock(LLVM_BB);
7006   MachineBasicBlock *nextMBB = F->CreateMachineBasicBlock(LLVM_BB);
7007   F->insert(MBBIter, newMBB);
7008   F->insert(MBBIter, nextMBB);
7009   
7010   // Move all successors to thisMBB to nextMBB
7011   nextMBB->transferSuccessors(thisMBB);
7012     
7013   // Update thisMBB to fall through to newMBB
7014   thisMBB->addSuccessor(newMBB);
7015   
7016   // newMBB jumps to itself and fall through to nextMBB
7017   newMBB->addSuccessor(nextMBB);
7018   newMBB->addSuccessor(newMBB);
7019   
7020   // Insert instructions into newMBB based on incoming instruction
7021   assert(bInstr->getNumOperands() < 8 && "unexpected number of operands");
7022   DebugLoc dl = bInstr->getDebugLoc();
7023   MachineOperand& destOper = bInstr->getOperand(0);
7024   MachineOperand* argOpers[6];
7025   int numArgs = bInstr->getNumOperands() - 1;
7026   for (int i=0; i < numArgs; ++i)
7027     argOpers[i] = &bInstr->getOperand(i+1);
7028
7029   // x86 address has 4 operands: base, index, scale, and displacement
7030   int lastAddrIndx = 3; // [0,3]
7031   int valArgIndx = 4;
7032   
7033   unsigned t1 = F->getRegInfo().createVirtualRegister(RC);
7034   MachineInstrBuilder MIB = BuildMI(newMBB, dl, TII->get(LoadOpc), t1);
7035   for (int i=0; i <= lastAddrIndx; ++i)
7036     (*MIB).addOperand(*argOpers[i]);
7037
7038   unsigned tt = F->getRegInfo().createVirtualRegister(RC);
7039   if (invSrc) {
7040     MIB = BuildMI(newMBB, dl, TII->get(notOpc), tt).addReg(t1);
7041   }
7042   else 
7043     tt = t1;
7044
7045   unsigned t2 = F->getRegInfo().createVirtualRegister(RC);
7046   assert((argOpers[valArgIndx]->isReg() ||
7047           argOpers[valArgIndx]->isImm()) &&
7048          "invalid operand");
7049   if (argOpers[valArgIndx]->isReg())
7050     MIB = BuildMI(newMBB, dl, TII->get(regOpc), t2);
7051   else
7052     MIB = BuildMI(newMBB, dl, TII->get(immOpc), t2);
7053   MIB.addReg(tt);
7054   (*MIB).addOperand(*argOpers[valArgIndx]);
7055
7056   MIB = BuildMI(newMBB, dl, TII->get(copyOpc), EAXreg);
7057   MIB.addReg(t1);
7058   
7059   MIB = BuildMI(newMBB, dl, TII->get(CXchgOpc));
7060   for (int i=0; i <= lastAddrIndx; ++i)
7061     (*MIB).addOperand(*argOpers[i]);
7062   MIB.addReg(t2);
7063   assert(bInstr->hasOneMemOperand() && "Unexpected number of memoperand");
7064   (*MIB).addMemOperand(*F, *bInstr->memoperands_begin());
7065
7066   MIB = BuildMI(newMBB, dl, TII->get(copyOpc), destOper.getReg());
7067   MIB.addReg(EAXreg);
7068   
7069   // insert branch
7070   BuildMI(newMBB, dl, TII->get(X86::JNE)).addMBB(newMBB);
7071
7072   F->DeleteMachineInstr(bInstr);   // The pseudo instruction is gone now.
7073   return nextMBB;
7074 }
7075
7076 // private utility function:  64 bit atomics on 32 bit host.
7077 MachineBasicBlock *
7078 X86TargetLowering::EmitAtomicBit6432WithCustomInserter(MachineInstr *bInstr,
7079                                                        MachineBasicBlock *MBB,
7080                                                        unsigned regOpcL,
7081                                                        unsigned regOpcH,
7082                                                        unsigned immOpcL,
7083                                                        unsigned immOpcH,
7084                                                        bool invSrc) const {
7085   // For the atomic bitwise operator, we generate
7086   //   thisMBB (instructions are in pairs, except cmpxchg8b)
7087   //     ld t1,t2 = [bitinstr.addr]
7088   //   newMBB:
7089   //     out1, out2 = phi (thisMBB, t1/t2) (newMBB, t3/t4)
7090   //     op  t5, t6 <- out1, out2, [bitinstr.val]
7091   //      (for SWAP, substitute:  mov t5, t6 <- [bitinstr.val])
7092   //     mov ECX, EBX <- t5, t6
7093   //     mov EAX, EDX <- t1, t2
7094   //     cmpxchg8b [bitinstr.addr]  [EAX, EDX, EBX, ECX implicit]
7095   //     mov t3, t4 <- EAX, EDX
7096   //     bz  newMBB
7097   //     result in out1, out2
7098   //     fallthrough -->nextMBB
7099
7100   const TargetRegisterClass *RC = X86::GR32RegisterClass;
7101   const unsigned LoadOpc = X86::MOV32rm;
7102   const unsigned copyOpc = X86::MOV32rr;
7103   const unsigned NotOpc = X86::NOT32r;
7104   const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
7105   const BasicBlock *LLVM_BB = MBB->getBasicBlock();
7106   MachineFunction::iterator MBBIter = MBB;
7107   ++MBBIter;
7108   
7109   /// First build the CFG
7110   MachineFunction *F = MBB->getParent();
7111   MachineBasicBlock *thisMBB = MBB;
7112   MachineBasicBlock *newMBB = F->CreateMachineBasicBlock(LLVM_BB);
7113   MachineBasicBlock *nextMBB = F->CreateMachineBasicBlock(LLVM_BB);
7114   F->insert(MBBIter, newMBB);
7115   F->insert(MBBIter, nextMBB);
7116   
7117   // Move all successors to thisMBB to nextMBB
7118   nextMBB->transferSuccessors(thisMBB);
7119     
7120   // Update thisMBB to fall through to newMBB
7121   thisMBB->addSuccessor(newMBB);
7122   
7123   // newMBB jumps to itself and fall through to nextMBB
7124   newMBB->addSuccessor(nextMBB);
7125   newMBB->addSuccessor(newMBB);
7126   
7127   DebugLoc dl = bInstr->getDebugLoc();
7128   // Insert instructions into newMBB based on incoming instruction
7129   // There are 8 "real" operands plus 9 implicit def/uses, ignored here.
7130   assert(bInstr->getNumOperands() < 18 && "unexpected number of operands");
7131   MachineOperand& dest1Oper = bInstr->getOperand(0);
7132   MachineOperand& dest2Oper = bInstr->getOperand(1);
7133   MachineOperand* argOpers[6];
7134   for (int i=0; i < 6; ++i)
7135     argOpers[i] = &bInstr->getOperand(i+2);
7136
7137   // x86 address has 4 operands: base, index, scale, and displacement
7138   int lastAddrIndx = 3; // [0,3]
7139   
7140   unsigned t1 = F->getRegInfo().createVirtualRegister(RC);
7141   MachineInstrBuilder MIB = BuildMI(thisMBB, dl, TII->get(LoadOpc), t1);
7142   for (int i=0; i <= lastAddrIndx; ++i)
7143     (*MIB).addOperand(*argOpers[i]);
7144   unsigned t2 = F->getRegInfo().createVirtualRegister(RC);
7145   MIB = BuildMI(thisMBB, dl, TII->get(LoadOpc), t2);
7146   // add 4 to displacement.
7147   for (int i=0; i <= lastAddrIndx-1; ++i)
7148     (*MIB).addOperand(*argOpers[i]);
7149   MachineOperand newOp3 = *(argOpers[3]);
7150   if (newOp3.isImm())
7151     newOp3.setImm(newOp3.getImm()+4);
7152   else
7153     newOp3.setOffset(newOp3.getOffset()+4);
7154   (*MIB).addOperand(newOp3);
7155
7156   // t3/4 are defined later, at the bottom of the loop
7157   unsigned t3 = F->getRegInfo().createVirtualRegister(RC);
7158   unsigned t4 = F->getRegInfo().createVirtualRegister(RC);
7159   BuildMI(newMBB, dl, TII->get(X86::PHI), dest1Oper.getReg())
7160     .addReg(t1).addMBB(thisMBB).addReg(t3).addMBB(newMBB);
7161   BuildMI(newMBB, dl, TII->get(X86::PHI), dest2Oper.getReg())
7162     .addReg(t2).addMBB(thisMBB).addReg(t4).addMBB(newMBB);
7163
7164   unsigned tt1 = F->getRegInfo().createVirtualRegister(RC);
7165   unsigned tt2 = F->getRegInfo().createVirtualRegister(RC);
7166   if (invSrc) {  
7167     MIB = BuildMI(newMBB, dl, TII->get(NotOpc), tt1).addReg(t1);
7168     MIB = BuildMI(newMBB, dl, TII->get(NotOpc), tt2).addReg(t2);
7169   } else {
7170     tt1 = t1;
7171     tt2 = t2;
7172   }
7173
7174   assert((argOpers[4]->isReg() || argOpers[4]->isImm()) &&
7175          "invalid operand");
7176   unsigned t5 = F->getRegInfo().createVirtualRegister(RC);
7177   unsigned t6 = F->getRegInfo().createVirtualRegister(RC);
7178   if (argOpers[4]->isReg())
7179     MIB = BuildMI(newMBB, dl, TII->get(regOpcL), t5);
7180   else
7181     MIB = BuildMI(newMBB, dl, TII->get(immOpcL), t5);
7182   if (regOpcL != X86::MOV32rr)
7183     MIB.addReg(tt1);
7184   (*MIB).addOperand(*argOpers[4]);
7185   assert(argOpers[5]->isReg() == argOpers[4]->isReg());
7186   assert(argOpers[5]->isImm() == argOpers[4]->isImm());
7187   if (argOpers[5]->isReg())
7188     MIB = BuildMI(newMBB, dl, TII->get(regOpcH), t6);
7189   else
7190     MIB = BuildMI(newMBB, dl, TII->get(immOpcH), t6);
7191   if (regOpcH != X86::MOV32rr)
7192     MIB.addReg(tt2);
7193   (*MIB).addOperand(*argOpers[5]);
7194
7195   MIB = BuildMI(newMBB, dl, TII->get(copyOpc), X86::EAX);
7196   MIB.addReg(t1);
7197   MIB = BuildMI(newMBB, dl, TII->get(copyOpc), X86::EDX);
7198   MIB.addReg(t2);
7199
7200   MIB = BuildMI(newMBB, dl, TII->get(copyOpc), X86::EBX);
7201   MIB.addReg(t5);
7202   MIB = BuildMI(newMBB, dl, TII->get(copyOpc), X86::ECX);
7203   MIB.addReg(t6);
7204   
7205   MIB = BuildMI(newMBB, dl, TII->get(X86::LCMPXCHG8B));
7206   for (int i=0; i <= lastAddrIndx; ++i)
7207     (*MIB).addOperand(*argOpers[i]);
7208
7209   assert(bInstr->hasOneMemOperand() && "Unexpected number of memoperand");
7210   (*MIB).addMemOperand(*F, *bInstr->memoperands_begin());
7211
7212   MIB = BuildMI(newMBB, dl, TII->get(copyOpc), t3);
7213   MIB.addReg(X86::EAX);
7214   MIB = BuildMI(newMBB, dl, TII->get(copyOpc), t4);
7215   MIB.addReg(X86::EDX);
7216   
7217   // insert branch
7218   BuildMI(newMBB, dl, TII->get(X86::JNE)).addMBB(newMBB);
7219
7220   F->DeleteMachineInstr(bInstr);   // The pseudo instruction is gone now.
7221   return nextMBB;
7222 }
7223
7224 // private utility function
7225 MachineBasicBlock *
7226 X86TargetLowering::EmitAtomicMinMaxWithCustomInserter(MachineInstr *mInstr,
7227                                                       MachineBasicBlock *MBB,
7228                                                       unsigned cmovOpc) const {
7229   // For the atomic min/max operator, we generate
7230   //   thisMBB:
7231   //   newMBB:
7232   //     ld t1 = [min/max.addr]
7233   //     mov t2 = [min/max.val] 
7234   //     cmp  t1, t2
7235   //     cmov[cond] t2 = t1
7236   //     mov EAX = t1
7237   //     lcs dest = [bitinstr.addr], t2  [EAX is implicit]
7238   //     bz   newMBB
7239   //     fallthrough -->nextMBB
7240   //
7241   const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
7242   const BasicBlock *LLVM_BB = MBB->getBasicBlock();
7243   MachineFunction::iterator MBBIter = MBB;
7244   ++MBBIter;
7245   
7246   /// First build the CFG
7247   MachineFunction *F = MBB->getParent();
7248   MachineBasicBlock *thisMBB = MBB;
7249   MachineBasicBlock *newMBB = F->CreateMachineBasicBlock(LLVM_BB);
7250   MachineBasicBlock *nextMBB = F->CreateMachineBasicBlock(LLVM_BB);
7251   F->insert(MBBIter, newMBB);
7252   F->insert(MBBIter, nextMBB);
7253   
7254   // Move all successors to thisMBB to nextMBB
7255   nextMBB->transferSuccessors(thisMBB);
7256   
7257   // Update thisMBB to fall through to newMBB
7258   thisMBB->addSuccessor(newMBB);
7259   
7260   // newMBB jumps to newMBB and fall through to nextMBB
7261   newMBB->addSuccessor(nextMBB);
7262   newMBB->addSuccessor(newMBB);
7263   
7264   DebugLoc dl = mInstr->getDebugLoc();
7265   // Insert instructions into newMBB based on incoming instruction
7266   assert(mInstr->getNumOperands() < 8 && "unexpected number of operands");
7267   MachineOperand& destOper = mInstr->getOperand(0);
7268   MachineOperand* argOpers[6];
7269   int numArgs = mInstr->getNumOperands() - 1;
7270   for (int i=0; i < numArgs; ++i)
7271     argOpers[i] = &mInstr->getOperand(i+1);
7272   
7273   // x86 address has 4 operands: base, index, scale, and displacement
7274   int lastAddrIndx = 3; // [0,3]
7275   int valArgIndx = 4;
7276   
7277   unsigned t1 = F->getRegInfo().createVirtualRegister(X86::GR32RegisterClass);
7278   MachineInstrBuilder MIB = BuildMI(newMBB, dl, TII->get(X86::MOV32rm), t1);
7279   for (int i=0; i <= lastAddrIndx; ++i)
7280     (*MIB).addOperand(*argOpers[i]);
7281
7282   // We only support register and immediate values
7283   assert((argOpers[valArgIndx]->isReg() ||
7284           argOpers[valArgIndx]->isImm()) &&
7285          "invalid operand");
7286   
7287   unsigned t2 = F->getRegInfo().createVirtualRegister(X86::GR32RegisterClass);  
7288   if (argOpers[valArgIndx]->isReg())
7289     MIB = BuildMI(newMBB, dl, TII->get(X86::MOV32rr), t2);
7290   else 
7291     MIB = BuildMI(newMBB, dl, TII->get(X86::MOV32rr), t2);
7292   (*MIB).addOperand(*argOpers[valArgIndx]);
7293
7294   MIB = BuildMI(newMBB, dl, TII->get(X86::MOV32rr), X86::EAX);
7295   MIB.addReg(t1);
7296
7297   MIB = BuildMI(newMBB, dl, TII->get(X86::CMP32rr));
7298   MIB.addReg(t1);
7299   MIB.addReg(t2);
7300
7301   // Generate movc
7302   unsigned t3 = F->getRegInfo().createVirtualRegister(X86::GR32RegisterClass);
7303   MIB = BuildMI(newMBB, dl, TII->get(cmovOpc),t3);
7304   MIB.addReg(t2);
7305   MIB.addReg(t1);
7306
7307   // Cmp and exchange if none has modified the memory location
7308   MIB = BuildMI(newMBB, dl, TII->get(X86::LCMPXCHG32));
7309   for (int i=0; i <= lastAddrIndx; ++i)
7310     (*MIB).addOperand(*argOpers[i]);
7311   MIB.addReg(t3);
7312   assert(mInstr->hasOneMemOperand() && "Unexpected number of memoperand");
7313   (*MIB).addMemOperand(*F, *mInstr->memoperands_begin());
7314   
7315   MIB = BuildMI(newMBB, dl, TII->get(X86::MOV32rr), destOper.getReg());
7316   MIB.addReg(X86::EAX);
7317   
7318   // insert branch
7319   BuildMI(newMBB, dl, TII->get(X86::JNE)).addMBB(newMBB);
7320
7321   F->DeleteMachineInstr(mInstr);   // The pseudo instruction is gone now.
7322   return nextMBB;
7323 }
7324
7325
7326 MachineBasicBlock *
7327 X86TargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
7328                                                MachineBasicBlock *BB) const {
7329   DebugLoc dl = MI->getDebugLoc();
7330   const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
7331   switch (MI->getOpcode()) {
7332   default: assert(false && "Unexpected instr type to insert");
7333   case X86::CMOV_V1I64:
7334   case X86::CMOV_FR32:
7335   case X86::CMOV_FR64:
7336   case X86::CMOV_V4F32:
7337   case X86::CMOV_V2F64:
7338   case X86::CMOV_V2I64: {
7339     // To "insert" a SELECT_CC instruction, we actually have to insert the
7340     // diamond control-flow pattern.  The incoming instruction knows the
7341     // destination vreg to set, the condition code register to branch on, the
7342     // true/false values to select between, and a branch opcode to use.
7343     const BasicBlock *LLVM_BB = BB->getBasicBlock();
7344     MachineFunction::iterator It = BB;
7345     ++It;
7346
7347     //  thisMBB:
7348     //  ...
7349     //   TrueVal = ...
7350     //   cmpTY ccX, r1, r2
7351     //   bCC copy1MBB
7352     //   fallthrough --> copy0MBB
7353     MachineBasicBlock *thisMBB = BB;
7354     MachineFunction *F = BB->getParent();
7355     MachineBasicBlock *copy0MBB = F->CreateMachineBasicBlock(LLVM_BB);
7356     MachineBasicBlock *sinkMBB = F->CreateMachineBasicBlock(LLVM_BB);
7357     unsigned Opc =
7358       X86::GetCondBranchFromCond((X86::CondCode)MI->getOperand(3).getImm());
7359     BuildMI(BB, dl, TII->get(Opc)).addMBB(sinkMBB);
7360     F->insert(It, copy0MBB);
7361     F->insert(It, sinkMBB);
7362     // Update machine-CFG edges by transferring all successors of the current
7363     // block to the new block which will contain the Phi node for the select.
7364     sinkMBB->transferSuccessors(BB);
7365
7366     // Add the true and fallthrough blocks as its successors.
7367     BB->addSuccessor(copy0MBB);
7368     BB->addSuccessor(sinkMBB);
7369
7370     //  copy0MBB:
7371     //   %FalseValue = ...
7372     //   # fallthrough to sinkMBB
7373     BB = copy0MBB;
7374
7375     // Update machine-CFG edges
7376     BB->addSuccessor(sinkMBB);
7377
7378     //  sinkMBB:
7379     //   %Result = phi [ %FalseValue, copy0MBB ], [ %TrueValue, thisMBB ]
7380     //  ...
7381     BB = sinkMBB;
7382     BuildMI(BB, dl, TII->get(X86::PHI), MI->getOperand(0).getReg())
7383       .addReg(MI->getOperand(1).getReg()).addMBB(copy0MBB)
7384       .addReg(MI->getOperand(2).getReg()).addMBB(thisMBB);
7385
7386     F->DeleteMachineInstr(MI);   // The pseudo instruction is gone now.
7387     return BB;
7388   }
7389
7390   case X86::FP32_TO_INT16_IN_MEM:
7391   case X86::FP32_TO_INT32_IN_MEM:
7392   case X86::FP32_TO_INT64_IN_MEM:
7393   case X86::FP64_TO_INT16_IN_MEM:
7394   case X86::FP64_TO_INT32_IN_MEM:
7395   case X86::FP64_TO_INT64_IN_MEM:
7396   case X86::FP80_TO_INT16_IN_MEM:
7397   case X86::FP80_TO_INT32_IN_MEM:
7398   case X86::FP80_TO_INT64_IN_MEM: {
7399     // Change the floating point control register to use "round towards zero"
7400     // mode when truncating to an integer value.
7401     MachineFunction *F = BB->getParent();
7402     int CWFrameIdx = F->getFrameInfo()->CreateStackObject(2, 2);
7403     addFrameReference(BuildMI(BB, dl, TII->get(X86::FNSTCW16m)), CWFrameIdx);
7404
7405     // Load the old value of the high byte of the control word...
7406     unsigned OldCW =
7407       F->getRegInfo().createVirtualRegister(X86::GR16RegisterClass);
7408     addFrameReference(BuildMI(BB, dl, TII->get(X86::MOV16rm), OldCW), 
7409                       CWFrameIdx);
7410
7411     // Set the high part to be round to zero...
7412     addFrameReference(BuildMI(BB, dl, TII->get(X86::MOV16mi)), CWFrameIdx)
7413       .addImm(0xC7F);
7414
7415     // Reload the modified control word now...
7416     addFrameReference(BuildMI(BB, dl, TII->get(X86::FLDCW16m)), CWFrameIdx);
7417
7418     // Restore the memory image of control word to original value
7419     addFrameReference(BuildMI(BB, dl, TII->get(X86::MOV16mr)), CWFrameIdx)
7420       .addReg(OldCW);
7421
7422     // Get the X86 opcode to use.
7423     unsigned Opc;
7424     switch (MI->getOpcode()) {
7425     default: assert(0 && "illegal opcode!");
7426     case X86::FP32_TO_INT16_IN_MEM: Opc = X86::IST_Fp16m32; break;
7427     case X86::FP32_TO_INT32_IN_MEM: Opc = X86::IST_Fp32m32; break;
7428     case X86::FP32_TO_INT64_IN_MEM: Opc = X86::IST_Fp64m32; break;
7429     case X86::FP64_TO_INT16_IN_MEM: Opc = X86::IST_Fp16m64; break;
7430     case X86::FP64_TO_INT32_IN_MEM: Opc = X86::IST_Fp32m64; break;
7431     case X86::FP64_TO_INT64_IN_MEM: Opc = X86::IST_Fp64m64; break;
7432     case X86::FP80_TO_INT16_IN_MEM: Opc = X86::IST_Fp16m80; break;
7433     case X86::FP80_TO_INT32_IN_MEM: Opc = X86::IST_Fp32m80; break;
7434     case X86::FP80_TO_INT64_IN_MEM: Opc = X86::IST_Fp64m80; break;
7435     }
7436
7437     X86AddressMode AM;
7438     MachineOperand &Op = MI->getOperand(0);
7439     if (Op.isReg()) {
7440       AM.BaseType = X86AddressMode::RegBase;
7441       AM.Base.Reg = Op.getReg();
7442     } else {
7443       AM.BaseType = X86AddressMode::FrameIndexBase;
7444       AM.Base.FrameIndex = Op.getIndex();
7445     }
7446     Op = MI->getOperand(1);
7447     if (Op.isImm())
7448       AM.Scale = Op.getImm();
7449     Op = MI->getOperand(2);
7450     if (Op.isImm())
7451       AM.IndexReg = Op.getImm();
7452     Op = MI->getOperand(3);
7453     if (Op.isGlobal()) {
7454       AM.GV = Op.getGlobal();
7455     } else {
7456       AM.Disp = Op.getImm();
7457     }
7458     addFullAddress(BuildMI(BB, dl, TII->get(Opc)), AM)
7459                       .addReg(MI->getOperand(4).getReg());
7460
7461     // Reload the original control word now.
7462     addFrameReference(BuildMI(BB, dl, TII->get(X86::FLDCW16m)), CWFrameIdx);
7463
7464     F->DeleteMachineInstr(MI);   // The pseudo instruction is gone now.
7465     return BB;
7466   }
7467   case X86::ATOMAND32:
7468     return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND32rr,
7469                                                X86::AND32ri, X86::MOV32rm, 
7470                                                X86::LCMPXCHG32, X86::MOV32rr,
7471                                                X86::NOT32r, X86::EAX,
7472                                                X86::GR32RegisterClass);
7473   case X86::ATOMOR32:
7474     return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::OR32rr, 
7475                                                X86::OR32ri, X86::MOV32rm, 
7476                                                X86::LCMPXCHG32, X86::MOV32rr,
7477                                                X86::NOT32r, X86::EAX,
7478                                                X86::GR32RegisterClass);
7479   case X86::ATOMXOR32:
7480     return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::XOR32rr,
7481                                                X86::XOR32ri, X86::MOV32rm, 
7482                                                X86::LCMPXCHG32, X86::MOV32rr,
7483                                                X86::NOT32r, X86::EAX,
7484                                                X86::GR32RegisterClass);
7485   case X86::ATOMNAND32:
7486     return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND32rr,
7487                                                X86::AND32ri, X86::MOV32rm,
7488                                                X86::LCMPXCHG32, X86::MOV32rr,
7489                                                X86::NOT32r, X86::EAX,
7490                                                X86::GR32RegisterClass, true);
7491   case X86::ATOMMIN32:
7492     return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVL32rr);
7493   case X86::ATOMMAX32:
7494     return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVG32rr);
7495   case X86::ATOMUMIN32:
7496     return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVB32rr);
7497   case X86::ATOMUMAX32:
7498     return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVA32rr);
7499
7500   case X86::ATOMAND16:
7501     return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND16rr,
7502                                                X86::AND16ri, X86::MOV16rm,
7503                                                X86::LCMPXCHG16, X86::MOV16rr,
7504                                                X86::NOT16r, X86::AX,
7505                                                X86::GR16RegisterClass);
7506   case X86::ATOMOR16:
7507     return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::OR16rr, 
7508                                                X86::OR16ri, X86::MOV16rm,
7509                                                X86::LCMPXCHG16, X86::MOV16rr,
7510                                                X86::NOT16r, X86::AX,
7511                                                X86::GR16RegisterClass);
7512   case X86::ATOMXOR16:
7513     return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::XOR16rr,
7514                                                X86::XOR16ri, X86::MOV16rm,
7515                                                X86::LCMPXCHG16, X86::MOV16rr,
7516                                                X86::NOT16r, X86::AX,
7517                                                X86::GR16RegisterClass);
7518   case X86::ATOMNAND16:
7519     return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND16rr,
7520                                                X86::AND16ri, X86::MOV16rm,
7521                                                X86::LCMPXCHG16, X86::MOV16rr,
7522                                                X86::NOT16r, X86::AX,
7523                                                X86::GR16RegisterClass, true);
7524   case X86::ATOMMIN16:
7525     return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVL16rr);
7526   case X86::ATOMMAX16:
7527     return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVG16rr);
7528   case X86::ATOMUMIN16:
7529     return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVB16rr);
7530   case X86::ATOMUMAX16:
7531     return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVA16rr);
7532
7533   case X86::ATOMAND8:
7534     return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND8rr,
7535                                                X86::AND8ri, X86::MOV8rm,
7536                                                X86::LCMPXCHG8, X86::MOV8rr,
7537                                                X86::NOT8r, X86::AL,
7538                                                X86::GR8RegisterClass);
7539   case X86::ATOMOR8:
7540     return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::OR8rr, 
7541                                                X86::OR8ri, X86::MOV8rm,
7542                                                X86::LCMPXCHG8, X86::MOV8rr,
7543                                                X86::NOT8r, X86::AL,
7544                                                X86::GR8RegisterClass);
7545   case X86::ATOMXOR8:
7546     return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::XOR8rr,
7547                                                X86::XOR8ri, X86::MOV8rm,
7548                                                X86::LCMPXCHG8, X86::MOV8rr,
7549                                                X86::NOT8r, X86::AL,
7550                                                X86::GR8RegisterClass);
7551   case X86::ATOMNAND8:
7552     return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND8rr,
7553                                                X86::AND8ri, X86::MOV8rm,
7554                                                X86::LCMPXCHG8, X86::MOV8rr,
7555                                                X86::NOT8r, X86::AL,
7556                                                X86::GR8RegisterClass, true);
7557   // FIXME: There are no CMOV8 instructions; MIN/MAX need some other way.
7558   // This group is for 64-bit host.
7559   case X86::ATOMAND64:
7560     return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND64rr,
7561                                                X86::AND64ri32, X86::MOV64rm, 
7562                                                X86::LCMPXCHG64, X86::MOV64rr,
7563                                                X86::NOT64r, X86::RAX,
7564                                                X86::GR64RegisterClass);
7565   case X86::ATOMOR64:
7566     return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::OR64rr, 
7567                                                X86::OR64ri32, X86::MOV64rm, 
7568                                                X86::LCMPXCHG64, X86::MOV64rr,
7569                                                X86::NOT64r, X86::RAX,
7570                                                X86::GR64RegisterClass);
7571   case X86::ATOMXOR64:
7572     return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::XOR64rr,
7573                                                X86::XOR64ri32, X86::MOV64rm, 
7574                                                X86::LCMPXCHG64, X86::MOV64rr,
7575                                                X86::NOT64r, X86::RAX,
7576                                                X86::GR64RegisterClass);
7577   case X86::ATOMNAND64:
7578     return EmitAtomicBitwiseWithCustomInserter(MI, BB, X86::AND64rr,
7579                                                X86::AND64ri32, X86::MOV64rm,
7580                                                X86::LCMPXCHG64, X86::MOV64rr,
7581                                                X86::NOT64r, X86::RAX,
7582                                                X86::GR64RegisterClass, true);
7583   case X86::ATOMMIN64:
7584     return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVL64rr);
7585   case X86::ATOMMAX64:
7586     return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVG64rr);
7587   case X86::ATOMUMIN64:
7588     return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVB64rr);
7589   case X86::ATOMUMAX64:
7590     return EmitAtomicMinMaxWithCustomInserter(MI, BB, X86::CMOVA64rr);
7591
7592   // This group does 64-bit operations on a 32-bit host.
7593   case X86::ATOMAND6432:
7594     return EmitAtomicBit6432WithCustomInserter(MI, BB, 
7595                                                X86::AND32rr, X86::AND32rr,
7596                                                X86::AND32ri, X86::AND32ri,
7597                                                false);
7598   case X86::ATOMOR6432:
7599     return EmitAtomicBit6432WithCustomInserter(MI, BB, 
7600                                                X86::OR32rr, X86::OR32rr,
7601                                                X86::OR32ri, X86::OR32ri,
7602                                                false);
7603   case X86::ATOMXOR6432:
7604     return EmitAtomicBit6432WithCustomInserter(MI, BB, 
7605                                                X86::XOR32rr, X86::XOR32rr,
7606                                                X86::XOR32ri, X86::XOR32ri,
7607                                                false);
7608   case X86::ATOMNAND6432:
7609     return EmitAtomicBit6432WithCustomInserter(MI, BB, 
7610                                                X86::AND32rr, X86::AND32rr,
7611                                                X86::AND32ri, X86::AND32ri,
7612                                                true);
7613   case X86::ATOMADD6432:
7614     return EmitAtomicBit6432WithCustomInserter(MI, BB, 
7615                                                X86::ADD32rr, X86::ADC32rr,
7616                                                X86::ADD32ri, X86::ADC32ri,
7617                                                false);
7618   case X86::ATOMSUB6432:
7619     return EmitAtomicBit6432WithCustomInserter(MI, BB, 
7620                                                X86::SUB32rr, X86::SBB32rr,
7621                                                X86::SUB32ri, X86::SBB32ri,
7622                                                false);
7623   case X86::ATOMSWAP6432:
7624     return EmitAtomicBit6432WithCustomInserter(MI, BB, 
7625                                                X86::MOV32rr, X86::MOV32rr,
7626                                                X86::MOV32ri, X86::MOV32ri,
7627                                                false);
7628   }
7629 }
7630
7631 //===----------------------------------------------------------------------===//
7632 //                           X86 Optimization Hooks
7633 //===----------------------------------------------------------------------===//
7634
7635 void X86TargetLowering::computeMaskedBitsForTargetNode(const SDValue Op,
7636                                                        const APInt &Mask,
7637                                                        APInt &KnownZero,
7638                                                        APInt &KnownOne,
7639                                                        const SelectionDAG &DAG,
7640                                                        unsigned Depth) const {
7641   unsigned Opc = Op.getOpcode();
7642   assert((Opc >= ISD::BUILTIN_OP_END ||
7643           Opc == ISD::INTRINSIC_WO_CHAIN ||
7644           Opc == ISD::INTRINSIC_W_CHAIN ||
7645           Opc == ISD::INTRINSIC_VOID) &&
7646          "Should use MaskedValueIsZero if you don't know whether Op"
7647          " is a target node!");
7648
7649   KnownZero = KnownOne = APInt(Mask.getBitWidth(), 0);   // Don't know anything.
7650   switch (Opc) {
7651   default: break;
7652   case X86ISD::ADD:
7653   case X86ISD::SUB:
7654   case X86ISD::SMUL:
7655   case X86ISD::UMUL:
7656     // These nodes' second result is a boolean.
7657     if (Op.getResNo() == 0)
7658       break;
7659     // Fallthrough
7660   case X86ISD::SETCC:
7661     KnownZero |= APInt::getHighBitsSet(Mask.getBitWidth(),
7662                                        Mask.getBitWidth() - 1);
7663     break;
7664   }
7665 }
7666
7667 /// isGAPlusOffset - Returns true (and the GlobalValue and the offset) if the
7668 /// node is a GlobalAddress + offset.
7669 bool X86TargetLowering::isGAPlusOffset(SDNode *N,
7670                                        GlobalValue* &GA, int64_t &Offset) const{
7671   if (N->getOpcode() == X86ISD::Wrapper) {
7672     if (isa<GlobalAddressSDNode>(N->getOperand(0))) {
7673       GA = cast<GlobalAddressSDNode>(N->getOperand(0))->getGlobal();
7674       Offset = cast<GlobalAddressSDNode>(N->getOperand(0))->getOffset();
7675       return true;
7676     }
7677   }
7678   return TargetLowering::isGAPlusOffset(N, GA, Offset);
7679 }
7680
7681 static bool isBaseAlignmentOfN(unsigned N, SDNode *Base,
7682                                const TargetLowering &TLI) {
7683   GlobalValue *GV;
7684   int64_t Offset = 0;
7685   if (TLI.isGAPlusOffset(Base, GV, Offset))
7686     return (GV->getAlignment() >= N && (Offset % N) == 0);
7687   // DAG combine handles the stack object case.
7688   return false;
7689 }
7690
7691 static bool EltsFromConsecutiveLoads(SDNode *N, SDValue PermMask,
7692                                      unsigned NumElems, MVT EVT,
7693                                      SDNode *&Base,
7694                                      SelectionDAG &DAG, MachineFrameInfo *MFI,
7695                                      const TargetLowering &TLI) {
7696   Base = NULL;
7697   for (unsigned i = 0; i < NumElems; ++i) {
7698     SDValue Idx = PermMask.getOperand(i);
7699     if (Idx.getOpcode() == ISD::UNDEF) {
7700       if (!Base)
7701         return false;
7702       continue;
7703     }
7704
7705     SDValue Elt = DAG.getShuffleScalarElt(N, i);
7706     if (!Elt.getNode() ||
7707         (Elt.getOpcode() != ISD::UNDEF && !ISD::isNON_EXTLoad(Elt.getNode())))
7708       return false;
7709     if (!Base) {
7710       Base = Elt.getNode();
7711       if (Base->getOpcode() == ISD::UNDEF)
7712         return false;
7713       continue;
7714     }
7715     if (Elt.getOpcode() == ISD::UNDEF)
7716       continue;
7717
7718     if (!TLI.isConsecutiveLoad(Elt.getNode(), Base,
7719                                EVT.getSizeInBits()/8, i, MFI))
7720       return false;
7721   }
7722   return true;
7723 }
7724
7725 /// PerformShuffleCombine - Combine a vector_shuffle that is equal to
7726 /// build_vector load1, load2, load3, load4, <0, 1, 2, 3> into a 128-bit load
7727 /// if the load addresses are consecutive, non-overlapping, and in the right
7728 /// order.
7729 static SDValue PerformShuffleCombine(SDNode *N, SelectionDAG &DAG,
7730                                        const TargetLowering &TLI) {
7731   MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo();
7732   DebugLoc dl = N->getDebugLoc();
7733   MVT VT = N->getValueType(0);
7734   MVT EVT = VT.getVectorElementType();
7735   SDValue PermMask = N->getOperand(2);
7736   unsigned NumElems = PermMask.getNumOperands();
7737   SDNode *Base = NULL;
7738   if (!EltsFromConsecutiveLoads(N, PermMask, NumElems, EVT, Base,
7739                                 DAG, MFI, TLI))
7740     return SDValue();
7741
7742   LoadSDNode *LD = cast<LoadSDNode>(Base);
7743   if (isBaseAlignmentOfN(16, Base->getOperand(1).getNode(), TLI))
7744     return DAG.getLoad(VT, dl, LD->getChain(), LD->getBasePtr(),
7745                        LD->getSrcValue(), LD->getSrcValueOffset(), 
7746                        LD->isVolatile());
7747   return DAG.getLoad(VT, dl, LD->getChain(), LD->getBasePtr(),
7748                      LD->getSrcValue(), LD->getSrcValueOffset(),
7749                      LD->isVolatile(), LD->getAlignment());
7750 }
7751
7752 /// PerformBuildVectorCombine - build_vector 0,(load i64 / f64) -> movq / movsd.
7753 static SDValue PerformBuildVectorCombine(SDNode *N, SelectionDAG &DAG,
7754                                          TargetLowering::DAGCombinerInfo &DCI,
7755                                          const X86Subtarget *Subtarget,
7756                                          const TargetLowering &TLI) {
7757   unsigned NumOps = N->getNumOperands();
7758   DebugLoc dl = N->getDebugLoc();
7759
7760   // Ignore single operand BUILD_VECTOR.
7761   if (NumOps == 1)
7762     return SDValue();
7763
7764   MVT VT = N->getValueType(0);
7765   MVT EVT = VT.getVectorElementType();
7766   if ((EVT != MVT::i64 && EVT != MVT::f64) || Subtarget->is64Bit())
7767     // We are looking for load i64 and zero extend. We want to transform
7768     // it before legalizer has a chance to expand it. Also look for i64
7769     // BUILD_PAIR bit casted to f64.
7770     return SDValue();
7771   // This must be an insertion into a zero vector.
7772   SDValue HighElt = N->getOperand(1);
7773   if (!isZeroNode(HighElt))
7774     return SDValue();
7775
7776   // Value must be a load.
7777   SDNode *Base = N->getOperand(0).getNode();
7778   if (!isa<LoadSDNode>(Base)) {
7779     if (Base->getOpcode() != ISD::BIT_CONVERT)
7780       return SDValue();
7781     Base = Base->getOperand(0).getNode();
7782     if (!isa<LoadSDNode>(Base))
7783       return SDValue();
7784   }
7785
7786   // Transform it into VZEXT_LOAD addr.
7787   LoadSDNode *LD = cast<LoadSDNode>(Base);
7788   
7789   // Load must not be an extload.
7790   if (LD->getExtensionType() != ISD::NON_EXTLOAD)
7791     return SDValue();
7792
7793   // Load type should legal type so we don't have to legalize it.
7794   if (!TLI.isTypeLegal(VT))
7795     return SDValue();
7796
7797   SDVTList Tys = DAG.getVTList(VT, MVT::Other);
7798   SDValue Ops[] = { LD->getChain(), LD->getBasePtr() };
7799   SDValue ResNode = DAG.getNode(X86ISD::VZEXT_LOAD, dl, Tys, Ops, 2);
7800   TargetLowering::TargetLoweringOpt TLO(DAG);
7801   TLO.CombineTo(SDValue(Base, 1), ResNode.getValue(1));
7802   DCI.CommitTargetLoweringOpt(TLO);
7803   return ResNode;
7804 }                                           
7805
7806 /// PerformSELECTCombine - Do target-specific dag combines on SELECT nodes.
7807 static SDValue PerformSELECTCombine(SDNode *N, SelectionDAG &DAG,
7808                                       const X86Subtarget *Subtarget) {
7809   DebugLoc dl = N->getDebugLoc();
7810   SDValue Cond = N->getOperand(0);
7811
7812   // If we have SSE[12] support, try to form min/max nodes.
7813   if (Subtarget->hasSSE2() &&
7814       (N->getValueType(0) == MVT::f32 || N->getValueType(0) == MVT::f64)) {
7815     if (Cond.getOpcode() == ISD::SETCC) {
7816       // Get the LHS/RHS of the select.
7817       SDValue LHS = N->getOperand(1);
7818       SDValue RHS = N->getOperand(2);
7819       ISD::CondCode CC = cast<CondCodeSDNode>(Cond.getOperand(2))->get();
7820
7821       unsigned Opcode = 0;
7822       if (LHS == Cond.getOperand(0) && RHS == Cond.getOperand(1)) {
7823         switch (CC) {
7824         default: break;
7825         case ISD::SETOLE: // (X <= Y) ? X : Y -> min
7826         case ISD::SETULE:
7827         case ISD::SETLE:
7828           if (!UnsafeFPMath) break;
7829           // FALL THROUGH.
7830         case ISD::SETOLT:  // (X olt/lt Y) ? X : Y -> min
7831         case ISD::SETLT:
7832           Opcode = X86ISD::FMIN;
7833           break;
7834
7835         case ISD::SETOGT: // (X > Y) ? X : Y -> max
7836         case ISD::SETUGT:
7837         case ISD::SETGT:
7838           if (!UnsafeFPMath) break;
7839           // FALL THROUGH.
7840         case ISD::SETUGE:  // (X uge/ge Y) ? X : Y -> max
7841         case ISD::SETGE:
7842           Opcode = X86ISD::FMAX;
7843           break;
7844         }
7845       } else if (LHS == Cond.getOperand(1) && RHS == Cond.getOperand(0)) {
7846         switch (CC) {
7847         default: break;
7848         case ISD::SETOGT: // (X > Y) ? Y : X -> min
7849         case ISD::SETUGT:
7850         case ISD::SETGT:
7851           if (!UnsafeFPMath) break;
7852           // FALL THROUGH.
7853         case ISD::SETUGE:  // (X uge/ge Y) ? Y : X -> min
7854         case ISD::SETGE:
7855           Opcode = X86ISD::FMIN;
7856           break;
7857
7858         case ISD::SETOLE:   // (X <= Y) ? Y : X -> max
7859         case ISD::SETULE:
7860         case ISD::SETLE:
7861           if (!UnsafeFPMath) break;
7862           // FALL THROUGH.
7863         case ISD::SETOLT:   // (X olt/lt Y) ? Y : X -> max
7864         case ISD::SETLT:
7865           Opcode = X86ISD::FMAX;
7866           break;
7867         }
7868       }
7869
7870       if (Opcode)
7871         return DAG.getNode(Opcode, dl, N->getValueType(0), LHS, RHS);
7872     }
7873
7874   }
7875
7876   return SDValue();
7877 }
7878
7879 /// PerformShiftCombine - Transforms vector shift nodes to use vector shifts
7880 ///                       when possible.
7881 static SDValue PerformShiftCombine(SDNode* N, SelectionDAG &DAG,
7882                                    const X86Subtarget *Subtarget) {
7883   // On X86 with SSE2 support, we can transform this to a vector shift if
7884   // all elements are shifted by the same amount.  We can't do this in legalize
7885   // because the a constant vector is typically transformed to a constant pool
7886   // so we have no knowledge of the shift amount.
7887   if (!Subtarget->hasSSE2())
7888     return SDValue();
7889     
7890   MVT VT = N->getValueType(0);
7891   if (VT != MVT::v2i64 && VT != MVT::v4i32 && VT != MVT::v8i16)
7892     return SDValue();
7893     
7894   SDValue ShAmtOp = N->getOperand(1);
7895   MVT EltVT = VT.getVectorElementType();
7896   DebugLoc dl = N->getDebugLoc();
7897   SDValue BaseShAmt;
7898   if (ShAmtOp.getOpcode() == ISD::BUILD_VECTOR) {
7899     unsigned NumElts = VT.getVectorNumElements();
7900     unsigned i = 0;
7901     for (; i != NumElts; ++i) {
7902       SDValue Arg = ShAmtOp.getOperand(i);
7903       if (Arg.getOpcode() == ISD::UNDEF) continue;
7904       BaseShAmt = Arg;
7905       break;
7906     }
7907     for (; i != NumElts; ++i) {
7908       SDValue Arg = ShAmtOp.getOperand(i);
7909       if (Arg.getOpcode() == ISD::UNDEF) continue;
7910       if (Arg != BaseShAmt) {
7911         return SDValue();
7912       }
7913     }
7914   } else if (ShAmtOp.getOpcode() == ISD::VECTOR_SHUFFLE &&
7915              isSplatMask(ShAmtOp.getOperand(2).getNode())) {
7916       BaseShAmt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, ShAmtOp,
7917                               DAG.getIntPtrConstant(0));
7918   } else
7919     return SDValue();
7920
7921   if (EltVT.bitsGT(MVT::i32))
7922     BaseShAmt = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, BaseShAmt);
7923   else if (EltVT.bitsLT(MVT::i32))
7924     BaseShAmt = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i32, BaseShAmt);
7925
7926   // The shift amount is identical so we can do a vector shift.
7927   SDValue  ValOp = N->getOperand(0);
7928   switch (N->getOpcode()) {
7929   default:
7930     assert(0 && "Unknown shift opcode!");
7931     break;
7932   case ISD::SHL:
7933     if (VT == MVT::v2i64)
7934       return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
7935                          DAG.getConstant(Intrinsic::x86_sse2_pslli_q, MVT::i32),
7936                          ValOp, BaseShAmt);
7937     if (VT == MVT::v4i32)
7938       return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
7939                          DAG.getConstant(Intrinsic::x86_sse2_pslli_d, MVT::i32),
7940                          ValOp, BaseShAmt);
7941     if (VT == MVT::v8i16)
7942       return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
7943                          DAG.getConstant(Intrinsic::x86_sse2_pslli_w, MVT::i32),
7944                          ValOp, BaseShAmt);
7945     break;
7946   case ISD::SRA:
7947     if (VT == MVT::v4i32)
7948       return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
7949                          DAG.getConstant(Intrinsic::x86_sse2_psrai_d, MVT::i32),
7950                          ValOp, BaseShAmt);
7951     if (VT == MVT::v8i16)
7952       return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
7953                          DAG.getConstant(Intrinsic::x86_sse2_psrai_w, MVT::i32),
7954                          ValOp, BaseShAmt);
7955     break;
7956   case ISD::SRL:
7957     if (VT == MVT::v2i64)
7958       return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
7959                          DAG.getConstant(Intrinsic::x86_sse2_psrli_q, MVT::i32),
7960                          ValOp, BaseShAmt);
7961     if (VT == MVT::v4i32)
7962       return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
7963                          DAG.getConstant(Intrinsic::x86_sse2_psrli_d, MVT::i32),
7964                          ValOp, BaseShAmt);
7965     if (VT ==  MVT::v8i16)
7966       return DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
7967                          DAG.getConstant(Intrinsic::x86_sse2_psrli_w, MVT::i32),
7968                          ValOp, BaseShAmt);
7969     break;
7970   }
7971   return SDValue();
7972 }
7973
7974 /// PerformSTORECombine - Do target-specific dag combines on STORE nodes.
7975 static SDValue PerformSTORECombine(SDNode *N, SelectionDAG &DAG,
7976                                      const X86Subtarget *Subtarget) {
7977   // Turn load->store of MMX types into GPR load/stores.  This avoids clobbering
7978   // the FP state in cases where an emms may be missing.
7979   // A preferable solution to the general problem is to figure out the right
7980   // places to insert EMMS.  This qualifies as a quick hack.
7981   StoreSDNode *St = cast<StoreSDNode>(N);
7982   if (St->getValue().getValueType().isVector() &&
7983       St->getValue().getValueType().getSizeInBits() == 64 &&
7984       isa<LoadSDNode>(St->getValue()) &&
7985       !cast<LoadSDNode>(St->getValue())->isVolatile() &&
7986       St->getChain().hasOneUse() && !St->isVolatile()) {
7987     SDNode* LdVal = St->getValue().getNode();
7988     LoadSDNode *Ld = 0;
7989     int TokenFactorIndex = -1;
7990     SmallVector<SDValue, 8> Ops;
7991     SDNode* ChainVal = St->getChain().getNode();
7992     // Must be a store of a load.  We currently handle two cases:  the load
7993     // is a direct child, and it's under an intervening TokenFactor.  It is
7994     // possible to dig deeper under nested TokenFactors.
7995     if (ChainVal == LdVal)
7996       Ld = cast<LoadSDNode>(St->getChain());
7997     else if (St->getValue().hasOneUse() &&
7998              ChainVal->getOpcode() == ISD::TokenFactor) {
7999       for (unsigned i=0, e = ChainVal->getNumOperands(); i != e; ++i) {
8000         if (ChainVal->getOperand(i).getNode() == LdVal) {
8001           TokenFactorIndex = i;
8002           Ld = cast<LoadSDNode>(St->getValue());
8003         } else
8004           Ops.push_back(ChainVal->getOperand(i));
8005       }
8006     }
8007     if (Ld) {
8008       DebugLoc dl = N->getDebugLoc();
8009       // If we are a 64-bit capable x86, lower to a single movq load/store pair.
8010       if (Subtarget->is64Bit()) {
8011         SDValue NewLd = DAG.getLoad(MVT::i64, dl, Ld->getChain(), 
8012                                       Ld->getBasePtr(), Ld->getSrcValue(), 
8013                                       Ld->getSrcValueOffset(), Ld->isVolatile(),
8014                                       Ld->getAlignment());
8015         SDValue NewChain = NewLd.getValue(1);
8016         if (TokenFactorIndex != -1) {
8017           Ops.push_back(NewChain);
8018           NewChain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, &Ops[0], 
8019                                  Ops.size());
8020         }
8021         return DAG.getStore(NewChain, dl, NewLd, St->getBasePtr(),
8022                             St->getSrcValue(), St->getSrcValueOffset(),
8023                             St->isVolatile(), St->getAlignment());
8024       }
8025
8026       // Otherwise, lower to two 32-bit copies.
8027       SDValue LoAddr = Ld->getBasePtr();
8028       SDValue HiAddr = DAG.getNode(ISD::ADD, dl, MVT::i32, LoAddr,
8029                                      DAG.getConstant(4, MVT::i32));
8030
8031       SDValue LoLd = DAG.getLoad(MVT::i32, dl, Ld->getChain(), LoAddr,
8032                                    Ld->getSrcValue(), Ld->getSrcValueOffset(),
8033                                    Ld->isVolatile(), Ld->getAlignment());
8034       SDValue HiLd = DAG.getLoad(MVT::i32, dl, Ld->getChain(), HiAddr,
8035                                    Ld->getSrcValue(), Ld->getSrcValueOffset()+4,
8036                                    Ld->isVolatile(), 
8037                                    MinAlign(Ld->getAlignment(), 4));
8038
8039       SDValue NewChain = LoLd.getValue(1);
8040       if (TokenFactorIndex != -1) {
8041         Ops.push_back(LoLd);
8042         Ops.push_back(HiLd);
8043         NewChain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, &Ops[0], 
8044                                Ops.size());
8045       }
8046
8047       LoAddr = St->getBasePtr();
8048       HiAddr = DAG.getNode(ISD::ADD, dl, MVT::i32, LoAddr,
8049                            DAG.getConstant(4, MVT::i32));
8050
8051       SDValue LoSt = DAG.getStore(NewChain, dl, LoLd, LoAddr,
8052                           St->getSrcValue(), St->getSrcValueOffset(),
8053                           St->isVolatile(), St->getAlignment());
8054       SDValue HiSt = DAG.getStore(NewChain, dl, HiLd, HiAddr,
8055                                     St->getSrcValue(),
8056                                     St->getSrcValueOffset() + 4,
8057                                     St->isVolatile(), 
8058                                     MinAlign(St->getAlignment(), 4));
8059       return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, LoSt, HiSt);
8060     }
8061   }
8062   return SDValue();
8063 }
8064
8065 /// PerformFORCombine - Do target-specific dag combines on X86ISD::FOR and
8066 /// X86ISD::FXOR nodes.
8067 static SDValue PerformFORCombine(SDNode *N, SelectionDAG &DAG) {
8068   assert(N->getOpcode() == X86ISD::FOR || N->getOpcode() == X86ISD::FXOR);
8069   // F[X]OR(0.0, x) -> x
8070   // F[X]OR(x, 0.0) -> x
8071   if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(N->getOperand(0)))
8072     if (C->getValueAPF().isPosZero())
8073       return N->getOperand(1);
8074   if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(N->getOperand(1)))
8075     if (C->getValueAPF().isPosZero())
8076       return N->getOperand(0);
8077   return SDValue();
8078 }
8079
8080 /// PerformFANDCombine - Do target-specific dag combines on X86ISD::FAND nodes.
8081 static SDValue PerformFANDCombine(SDNode *N, SelectionDAG &DAG) {
8082   // FAND(0.0, x) -> 0.0
8083   // FAND(x, 0.0) -> 0.0
8084   if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(N->getOperand(0)))
8085     if (C->getValueAPF().isPosZero())
8086       return N->getOperand(0);
8087   if (ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(N->getOperand(1)))
8088     if (C->getValueAPF().isPosZero())
8089       return N->getOperand(1);
8090   return SDValue();
8091 }
8092
8093 static SDValue PerformBTCombine(SDNode *N,
8094                                 SelectionDAG &DAG,
8095                                 TargetLowering::DAGCombinerInfo &DCI) {
8096   // BT ignores high bits in the bit index operand.
8097   SDValue Op1 = N->getOperand(1);
8098   if (Op1.hasOneUse()) {
8099     unsigned BitWidth = Op1.getValueSizeInBits();
8100     APInt DemandedMask = APInt::getLowBitsSet(BitWidth, Log2_32(BitWidth));
8101     APInt KnownZero, KnownOne;
8102     TargetLowering::TargetLoweringOpt TLO(DAG);
8103     TargetLowering &TLI = DAG.getTargetLoweringInfo();
8104     if (TLO.ShrinkDemandedConstant(Op1, DemandedMask) ||
8105         TLI.SimplifyDemandedBits(Op1, DemandedMask, KnownZero, KnownOne, TLO))
8106       DCI.CommitTargetLoweringOpt(TLO);
8107   }
8108   return SDValue();
8109 }
8110
8111 SDValue X86TargetLowering::PerformDAGCombine(SDNode *N,
8112                                              DAGCombinerInfo &DCI) const {
8113   SelectionDAG &DAG = DCI.DAG;
8114   switch (N->getOpcode()) {
8115   default: break;
8116   case ISD::VECTOR_SHUFFLE: return PerformShuffleCombine(N, DAG, *this);
8117   case ISD::BUILD_VECTOR:
8118     return PerformBuildVectorCombine(N, DAG, DCI, Subtarget, *this);
8119   case ISD::SELECT:         return PerformSELECTCombine(N, DAG, Subtarget);
8120   case ISD::SHL:
8121   case ISD::SRA:
8122   case ISD::SRL:            return PerformShiftCombine(N, DAG, Subtarget);
8123   case ISD::STORE:          return PerformSTORECombine(N, DAG, Subtarget);
8124   case X86ISD::FXOR:
8125   case X86ISD::FOR:         return PerformFORCombine(N, DAG);
8126   case X86ISD::FAND:        return PerformFANDCombine(N, DAG);
8127   case X86ISD::BT:          return PerformBTCombine(N, DAG, DCI);
8128   }
8129
8130   return SDValue();
8131 }
8132
8133 //===----------------------------------------------------------------------===//
8134 //                           X86 Inline Assembly Support
8135 //===----------------------------------------------------------------------===//
8136
8137 /// getConstraintType - Given a constraint letter, return the type of
8138 /// constraint it is for this target.
8139 X86TargetLowering::ConstraintType
8140 X86TargetLowering::getConstraintType(const std::string &Constraint) const {
8141   if (Constraint.size() == 1) {
8142     switch (Constraint[0]) {
8143     case 'A':
8144       return C_Register;
8145     case 'f':
8146     case 'r':
8147     case 'R':
8148     case 'l':
8149     case 'q':
8150     case 'Q':
8151     case 'x':
8152     case 'y':
8153     case 'Y':
8154       return C_RegisterClass;
8155     case 'e':
8156     case 'Z':
8157       return C_Other;
8158     default:
8159       break;
8160     }
8161   }
8162   return TargetLowering::getConstraintType(Constraint);
8163 }
8164
8165 /// LowerXConstraint - try to replace an X constraint, which matches anything,
8166 /// with another that has more specific requirements based on the type of the
8167 /// corresponding operand.
8168 const char *X86TargetLowering::
8169 LowerXConstraint(MVT ConstraintVT) const {
8170   // FP X constraints get lowered to SSE1/2 registers if available, otherwise
8171   // 'f' like normal targets.
8172   if (ConstraintVT.isFloatingPoint()) {
8173     if (Subtarget->hasSSE2())
8174       return "Y";
8175     if (Subtarget->hasSSE1())
8176       return "x";
8177   }
8178   
8179   return TargetLowering::LowerXConstraint(ConstraintVT);
8180 }
8181
8182 /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
8183 /// vector.  If it is invalid, don't add anything to Ops.
8184 void X86TargetLowering::LowerAsmOperandForConstraint(SDValue Op,
8185                                                      char Constraint,
8186                                                      bool hasMemory,
8187                                                      std::vector<SDValue>&Ops,
8188                                                      SelectionDAG &DAG) const {
8189   SDValue Result(0, 0);
8190   
8191   switch (Constraint) {
8192   default: break;
8193   case 'I':
8194     if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
8195       if (C->getZExtValue() <= 31) {
8196         Result = DAG.getTargetConstant(C->getZExtValue(), Op.getValueType());
8197         break;
8198       }
8199     }
8200     return;
8201   case 'J':
8202     if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
8203       if (C->getZExtValue() <= 63) {
8204         Result = DAG.getTargetConstant(C->getZExtValue(), Op.getValueType());
8205         break;
8206       }
8207     }
8208     return;
8209   case 'N':
8210     if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
8211       if (C->getZExtValue() <= 255) {
8212         Result = DAG.getTargetConstant(C->getZExtValue(), Op.getValueType());
8213         break;
8214       }
8215     }
8216     return;
8217   case 'e': {
8218     // 32-bit signed value
8219     if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
8220       const ConstantInt *CI = C->getConstantIntValue();
8221       if (CI->isValueValidForType(Type::Int32Ty, C->getSExtValue())) {
8222         // Widen to 64 bits here to get it sign extended.
8223         Result = DAG.getTargetConstant(C->getSExtValue(), MVT::i64);
8224         break;
8225       }
8226     // FIXME gcc accepts some relocatable values here too, but only in certain
8227     // memory models; it's complicated.
8228     }
8229     return;
8230   }
8231   case 'Z': {
8232     // 32-bit unsigned value
8233     if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
8234       const ConstantInt *CI = C->getConstantIntValue();
8235       if (CI->isValueValidForType(Type::Int32Ty, C->getZExtValue())) {
8236         Result = DAG.getTargetConstant(C->getZExtValue(), Op.getValueType());
8237         break;
8238       }
8239     }
8240     // FIXME gcc accepts some relocatable values here too, but only in certain
8241     // memory models; it's complicated.
8242     return;
8243   }
8244   case 'i': {
8245     // Literal immediates are always ok.
8246     if (ConstantSDNode *CST = dyn_cast<ConstantSDNode>(Op)) {
8247       // Widen to 64 bits here to get it sign extended.
8248       Result = DAG.getTargetConstant(CST->getSExtValue(), MVT::i64);
8249       break;
8250     }
8251
8252     // If we are in non-pic codegen mode, we allow the address of a global (with
8253     // an optional displacement) to be used with 'i'.
8254     GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(Op);
8255     int64_t Offset = 0;
8256     
8257     // Match either (GA) or (GA+C)
8258     if (GA) {
8259       Offset = GA->getOffset();
8260     } else if (Op.getOpcode() == ISD::ADD) {
8261       ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op.getOperand(1));
8262       GA = dyn_cast<GlobalAddressSDNode>(Op.getOperand(0));
8263       if (C && GA) {
8264         Offset = GA->getOffset()+C->getZExtValue();
8265       } else {
8266         C = dyn_cast<ConstantSDNode>(Op.getOperand(1));
8267         GA = dyn_cast<GlobalAddressSDNode>(Op.getOperand(0));
8268         if (C && GA)
8269           Offset = GA->getOffset()+C->getZExtValue();
8270         else
8271           C = 0, GA = 0;
8272       }
8273     }
8274     
8275     if (GA) {
8276       if (hasMemory) 
8277         Op = LowerGlobalAddress(GA->getGlobal(), Op.getDebugLoc(),
8278                                 Offset, DAG);
8279       else
8280         Op = DAG.getTargetGlobalAddress(GA->getGlobal(), GA->getValueType(0),
8281                                         Offset);
8282       Result = Op;
8283       break;
8284     }
8285
8286     // Otherwise, not valid for this mode.
8287     return;
8288   }
8289   }
8290   
8291   if (Result.getNode()) {
8292     Ops.push_back(Result);
8293     return;
8294   }
8295   return TargetLowering::LowerAsmOperandForConstraint(Op, Constraint, hasMemory,
8296                                                       Ops, DAG);
8297 }
8298
8299 std::vector<unsigned> X86TargetLowering::
8300 getRegClassForInlineAsmConstraint(const std::string &Constraint,
8301                                   MVT VT) const {
8302   if (Constraint.size() == 1) {
8303     // FIXME: not handling fp-stack yet!
8304     switch (Constraint[0]) {      // GCC X86 Constraint Letters
8305     default: break;  // Unknown constraint letter
8306     case 'q':   // Q_REGS (GENERAL_REGS in 64-bit mode)
8307     case 'Q':   // Q_REGS
8308       if (VT == MVT::i32)
8309         return make_vector<unsigned>(X86::EAX, X86::EDX, X86::ECX, X86::EBX, 0);
8310       else if (VT == MVT::i16)
8311         return make_vector<unsigned>(X86::AX, X86::DX, X86::CX, X86::BX, 0);
8312       else if (VT == MVT::i8)
8313         return make_vector<unsigned>(X86::AL, X86::DL, X86::CL, X86::BL, 0);
8314       else if (VT == MVT::i64)
8315         return make_vector<unsigned>(X86::RAX, X86::RDX, X86::RCX, X86::RBX, 0);
8316       break;
8317     }
8318   }
8319
8320   return std::vector<unsigned>();
8321 }
8322
8323 std::pair<unsigned, const TargetRegisterClass*>
8324 X86TargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
8325                                                 MVT VT) const {
8326   // First, see if this is a constraint that directly corresponds to an LLVM
8327   // register class.
8328   if (Constraint.size() == 1) {
8329     // GCC Constraint Letters
8330     switch (Constraint[0]) {
8331     default: break;
8332     case 'r':   // GENERAL_REGS
8333     case 'R':   // LEGACY_REGS
8334     case 'l':   // INDEX_REGS
8335       if (VT == MVT::i8)
8336         return std::make_pair(0U, X86::GR8RegisterClass);
8337       if (VT == MVT::i16)
8338         return std::make_pair(0U, X86::GR16RegisterClass);
8339       if (VT == MVT::i32 || !Subtarget->is64Bit())
8340         return std::make_pair(0U, X86::GR32RegisterClass);  
8341       return std::make_pair(0U, X86::GR64RegisterClass);
8342     case 'f':  // FP Stack registers.
8343       // If SSE is enabled for this VT, use f80 to ensure the isel moves the
8344       // value to the correct fpstack register class.
8345       if (VT == MVT::f32 && !isScalarFPTypeInSSEReg(VT))
8346         return std::make_pair(0U, X86::RFP32RegisterClass);
8347       if (VT == MVT::f64 && !isScalarFPTypeInSSEReg(VT))
8348         return std::make_pair(0U, X86::RFP64RegisterClass);
8349       return std::make_pair(0U, X86::RFP80RegisterClass);
8350     case 'y':   // MMX_REGS if MMX allowed.
8351       if (!Subtarget->hasMMX()) break;
8352       return std::make_pair(0U, X86::VR64RegisterClass);
8353     case 'Y':   // SSE_REGS if SSE2 allowed
8354       if (!Subtarget->hasSSE2()) break;
8355       // FALL THROUGH.
8356     case 'x':   // SSE_REGS if SSE1 allowed
8357       if (!Subtarget->hasSSE1()) break;
8358
8359       switch (VT.getSimpleVT()) {
8360       default: break;
8361       // Scalar SSE types.
8362       case MVT::f32:
8363       case MVT::i32:
8364         return std::make_pair(0U, X86::FR32RegisterClass);
8365       case MVT::f64:
8366       case MVT::i64:
8367         return std::make_pair(0U, X86::FR64RegisterClass);
8368       // Vector types.
8369       case MVT::v16i8:
8370       case MVT::v8i16:
8371       case MVT::v4i32:
8372       case MVT::v2i64:
8373       case MVT::v4f32:
8374       case MVT::v2f64:
8375         return std::make_pair(0U, X86::VR128RegisterClass);
8376       }
8377       break;
8378     }
8379   }
8380   
8381   // Use the default implementation in TargetLowering to convert the register
8382   // constraint into a member of a register class.
8383   std::pair<unsigned, const TargetRegisterClass*> Res;
8384   Res = TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
8385
8386   // Not found as a standard register?
8387   if (Res.second == 0) {
8388     // GCC calls "st(0)" just plain "st".
8389     if (StringsEqualNoCase("{st}", Constraint)) {
8390       Res.first = X86::ST0;
8391       Res.second = X86::RFP80RegisterClass;
8392     }
8393     // 'A' means EAX + EDX.
8394     if (Constraint == "A") {
8395       Res.first = X86::EAX;
8396       Res.second = X86::GRADRegisterClass;
8397     }
8398     return Res;
8399   }
8400
8401   // Otherwise, check to see if this is a register class of the wrong value
8402   // type.  For example, we want to map "{ax},i32" -> {eax}, we don't want it to
8403   // turn into {ax},{dx}.
8404   if (Res.second->hasType(VT))
8405     return Res;   // Correct type already, nothing to do.
8406
8407   // All of the single-register GCC register classes map their values onto
8408   // 16-bit register pieces "ax","dx","cx","bx","si","di","bp","sp".  If we
8409   // really want an 8-bit or 32-bit register, map to the appropriate register
8410   // class and return the appropriate register.
8411   if (Res.second == X86::GR16RegisterClass) {
8412     if (VT == MVT::i8) {
8413       unsigned DestReg = 0;
8414       switch (Res.first) {
8415       default: break;
8416       case X86::AX: DestReg = X86::AL; break;
8417       case X86::DX: DestReg = X86::DL; break;
8418       case X86::CX: DestReg = X86::CL; break;
8419       case X86::BX: DestReg = X86::BL; break;
8420       }
8421       if (DestReg) {
8422         Res.first = DestReg;
8423         Res.second = Res.second = X86::GR8RegisterClass;
8424       }
8425     } else if (VT == MVT::i32) {
8426       unsigned DestReg = 0;
8427       switch (Res.first) {
8428       default: break;
8429       case X86::AX: DestReg = X86::EAX; break;
8430       case X86::DX: DestReg = X86::EDX; break;
8431       case X86::CX: DestReg = X86::ECX; break;
8432       case X86::BX: DestReg = X86::EBX; break;
8433       case X86::SI: DestReg = X86::ESI; break;
8434       case X86::DI: DestReg = X86::EDI; break;
8435       case X86::BP: DestReg = X86::EBP; break;
8436       case X86::SP: DestReg = X86::ESP; break;
8437       }
8438       if (DestReg) {
8439         Res.first = DestReg;
8440         Res.second = Res.second = X86::GR32RegisterClass;
8441       }
8442     } else if (VT == MVT::i64) {
8443       unsigned DestReg = 0;
8444       switch (Res.first) {
8445       default: break;
8446       case X86::AX: DestReg = X86::RAX; break;
8447       case X86::DX: DestReg = X86::RDX; break;
8448       case X86::CX: DestReg = X86::RCX; break;
8449       case X86::BX: DestReg = X86::RBX; break;
8450       case X86::SI: DestReg = X86::RSI; break;
8451       case X86::DI: DestReg = X86::RDI; break;
8452       case X86::BP: DestReg = X86::RBP; break;
8453       case X86::SP: DestReg = X86::RSP; break;
8454       }
8455       if (DestReg) {
8456         Res.first = DestReg;
8457         Res.second = Res.second = X86::GR64RegisterClass;
8458       }
8459     }
8460   } else if (Res.second == X86::FR32RegisterClass ||
8461              Res.second == X86::FR64RegisterClass ||
8462              Res.second == X86::VR128RegisterClass) {
8463     // Handle references to XMM physical registers that got mapped into the
8464     // wrong class.  This can happen with constraints like {xmm0} where the
8465     // target independent register mapper will just pick the first match it can
8466     // find, ignoring the required type.
8467     if (VT == MVT::f32)
8468       Res.second = X86::FR32RegisterClass;
8469     else if (VT == MVT::f64)
8470       Res.second = X86::FR64RegisterClass;
8471     else if (X86::VR128RegisterClass->hasType(VT))
8472       Res.second = X86::VR128RegisterClass;
8473   }
8474
8475   return Res;
8476 }
8477
8478 //===----------------------------------------------------------------------===//
8479 //                           X86 Widen vector type
8480 //===----------------------------------------------------------------------===//
8481
8482 /// getWidenVectorType: given a vector type, returns the type to widen
8483 /// to (e.g., v7i8 to v8i8). If the vector type is legal, it returns itself.
8484 /// If there is no vector type that we want to widen to, returns MVT::Other
8485 /// When and where to widen is target dependent based on the cost of
8486 /// scalarizing vs using the wider vector type.
8487
8488 MVT X86TargetLowering::getWidenVectorType(MVT VT) const {
8489   assert(VT.isVector());
8490   if (isTypeLegal(VT))
8491     return VT;
8492   
8493   // TODO: In computeRegisterProperty, we can compute the list of legal vector
8494   //       type based on element type.  This would speed up our search (though
8495   //       it may not be worth it since the size of the list is relatively
8496   //       small).
8497   MVT EltVT = VT.getVectorElementType();
8498   unsigned NElts = VT.getVectorNumElements();
8499   
8500   // On X86, it make sense to widen any vector wider than 1
8501   if (NElts <= 1)
8502     return MVT::Other;
8503   
8504   for (unsigned nVT = MVT::FIRST_VECTOR_VALUETYPE; 
8505        nVT <= MVT::LAST_VECTOR_VALUETYPE; ++nVT) {
8506     MVT SVT = (MVT::SimpleValueType)nVT;
8507     
8508     if (isTypeLegal(SVT) && 
8509         SVT.getVectorElementType() == EltVT && 
8510         SVT.getVectorNumElements() > NElts)
8511       return SVT;
8512   }
8513   return MVT::Other;
8514 }