Add custom UINT_TO_FP from v4i8/v4i16/v8i8/v8i16 to v4f32/v8f32
[oota-llvm.git] / lib / Target / X86 / X86ISelLowering.h
1 //===-- X86ISelLowering.h - X86 DAG Lowering Interface ----------*- C++ -*-===//
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 #ifndef X86ISELLOWERING_H
16 #define X86ISELLOWERING_H
17
18 #include "X86Subtarget.h"
19 #include "X86RegisterInfo.h"
20 #include "X86MachineFunctionInfo.h"
21 #include "llvm/Target/TargetLowering.h"
22 #include "llvm/Target/TargetOptions.h"
23 #include "llvm/CodeGen/FastISel.h"
24 #include "llvm/CodeGen/SelectionDAG.h"
25 #include "llvm/CodeGen/CallingConvLower.h"
26
27 namespace llvm {
28   namespace X86ISD {
29     // X86 Specific DAG Nodes
30     enum NodeType {
31       // Start the numbering where the builtin ops leave off.
32       FIRST_NUMBER = ISD::BUILTIN_OP_END,
33
34       /// BSF - Bit scan forward.
35       /// BSR - Bit scan reverse.
36       BSF,
37       BSR,
38
39       /// SHLD, SHRD - Double shift instructions. These correspond to
40       /// X86::SHLDxx and X86::SHRDxx instructions.
41       SHLD,
42       SHRD,
43
44       /// FAND - Bitwise logical AND of floating point values. This corresponds
45       /// to X86::ANDPS or X86::ANDPD.
46       FAND,
47
48       /// FOR - Bitwise logical OR of floating point values. This corresponds
49       /// to X86::ORPS or X86::ORPD.
50       FOR,
51
52       /// FXOR - Bitwise logical XOR of floating point values. This corresponds
53       /// to X86::XORPS or X86::XORPD.
54       FXOR,
55
56       /// FSRL - Bitwise logical right shift of floating point values. These
57       /// corresponds to X86::PSRLDQ.
58       FSRL,
59
60       /// CALL - These operations represent an abstract X86 call
61       /// instruction, which includes a bunch of information.  In particular the
62       /// operands of these node are:
63       ///
64       ///     #0 - The incoming token chain
65       ///     #1 - The callee
66       ///     #2 - The number of arg bytes the caller pushes on the stack.
67       ///     #3 - The number of arg bytes the callee pops off the stack.
68       ///     #4 - The value to pass in AL/AX/EAX (optional)
69       ///     #5 - The value to pass in DL/DX/EDX (optional)
70       ///
71       /// The result values of these nodes are:
72       ///
73       ///     #0 - The outgoing token chain
74       ///     #1 - The first register result value (optional)
75       ///     #2 - The second register result value (optional)
76       ///
77       CALL,
78
79       /// RDTSC_DAG - This operation implements the lowering for
80       /// readcyclecounter
81       RDTSC_DAG,
82
83       /// X86 compare and logical compare instructions.
84       CMP, COMI, UCOMI,
85
86       /// X86 bit-test instructions.
87       BT,
88
89       /// X86 SetCC. Operand 0 is condition code, and operand 1 is the EFLAGS
90       /// operand, usually produced by a CMP instruction.
91       SETCC,
92
93       // Same as SETCC except it's materialized with a sbb and the value is all
94       // one's or all zero's.
95       SETCC_CARRY,  // R = carry_bit ? ~0 : 0
96
97       /// X86 FP SETCC, implemented with CMP{cc}SS/CMP{cc}SD.
98       /// Operands are two FP values to compare; result is a mask of
99       /// 0s or 1s.  Generally DTRT for C/C++ with NaNs.
100       FSETCCss, FSETCCsd,
101
102       /// X86 MOVMSK{pd|ps}, extracts sign bits of two or four FP values,
103       /// result in an integer GPR.  Needs masking for scalar result.
104       FGETSIGNx86,
105
106       /// X86 conditional moves. Operand 0 and operand 1 are the two values
107       /// to select from. Operand 2 is the condition code, and operand 3 is the
108       /// flag operand produced by a CMP or TEST instruction. It also writes a
109       /// flag result.
110       CMOV,
111
112       /// X86 conditional branches. Operand 0 is the chain operand, operand 1
113       /// is the block to branch if condition is true, operand 2 is the
114       /// condition code, and operand 3 is the flag operand produced by a CMP
115       /// or TEST instruction.
116       BRCOND,
117
118       /// Return with a flag operand. Operand 0 is the chain operand, operand
119       /// 1 is the number of bytes of stack to pop.
120       RET_FLAG,
121
122       /// REP_STOS - Repeat fill, corresponds to X86::REP_STOSx.
123       REP_STOS,
124
125       /// REP_MOVS - Repeat move, corresponds to X86::REP_MOVSx.
126       REP_MOVS,
127
128       /// GlobalBaseReg - On Darwin, this node represents the result of the popl
129       /// at function entry, used for PIC code.
130       GlobalBaseReg,
131
132       /// Wrapper - A wrapper node for TargetConstantPool,
133       /// TargetExternalSymbol, and TargetGlobalAddress.
134       Wrapper,
135
136       /// WrapperRIP - Special wrapper used under X86-64 PIC mode for RIP
137       /// relative displacements.
138       WrapperRIP,
139
140       /// MOVDQ2Q - Copies a 64-bit value from the low word of an XMM vector
141       /// to an MMX vector.  If you think this is too close to the previous
142       /// mnemonic, so do I; blame Intel.
143       MOVDQ2Q,
144
145       /// PEXTRB - Extract an 8-bit value from a vector and zero extend it to
146       /// i32, corresponds to X86::PEXTRB.
147       PEXTRB,
148
149       /// PEXTRW - Extract a 16-bit value from a vector and zero extend it to
150       /// i32, corresponds to X86::PEXTRW.
151       PEXTRW,
152
153       /// INSERTPS - Insert any element of a 4 x float vector into any element
154       /// of a destination 4 x floatvector.
155       INSERTPS,
156
157       /// PINSRB - Insert the lower 8-bits of a 32-bit value to a vector,
158       /// corresponds to X86::PINSRB.
159       PINSRB,
160
161       /// PINSRW - Insert the lower 16-bits of a 32-bit value to a vector,
162       /// corresponds to X86::PINSRW.
163       PINSRW, MMX_PINSRW,
164
165       /// PSHUFB - Shuffle 16 8-bit values within a vector.
166       PSHUFB,
167
168       /// ANDNP - Bitwise Logical AND NOT of Packed FP values.
169       ANDNP,
170
171       /// PSIGN - Copy integer sign.
172       PSIGN,
173
174       /// BLENDV - Blend where the selector is an XMM.
175       BLENDV,
176
177       /// BLENDxx - Blend where the selector is an immediate.
178       BLENDPW,
179       BLENDPS,
180       BLENDPD,
181
182       /// HADD - Integer horizontal add.
183       HADD,
184
185       /// HSUB - Integer horizontal sub.
186       HSUB,
187
188       /// FHADD - Floating point horizontal add.
189       FHADD,
190
191       /// FHSUB - Floating point horizontal sub.
192       FHSUB,
193
194       /// FMAX, FMIN - Floating point max and min.
195       ///
196       FMAX, FMIN,
197
198       /// FMAXC, FMINC - Commutative FMIN and FMAX.
199       FMAXC, FMINC,
200
201       /// FRSQRT, FRCP - Floating point reciprocal-sqrt and reciprocal
202       /// approximation.  Note that these typically require refinement
203       /// in order to obtain suitable precision.
204       FRSQRT, FRCP,
205
206       // TLSADDR - Thread Local Storage.
207       TLSADDR,
208
209       // TLSBASEADDR - Thread Local Storage. A call to get the start address
210       // of the TLS block for the current module.
211       TLSBASEADDR,
212
213       // TLSCALL - Thread Local Storage.  When calling to an OS provided
214       // thunk at the address from an earlier relocation.
215       TLSCALL,
216
217       // EH_RETURN - Exception Handling helpers.
218       EH_RETURN,
219
220       // EH_SJLJ_SETJMP - SjLj exception handling setjmp.
221       EH_SJLJ_SETJMP,
222
223       // EH_SJLJ_LONGJMP - SjLj exception handling longjmp.
224       EH_SJLJ_LONGJMP,
225
226       /// TC_RETURN - Tail call return.
227       ///   operand #0 chain
228       ///   operand #1 callee (register or absolute)
229       ///   operand #2 stack adjustment
230       ///   operand #3 optional in flag
231       TC_RETURN,
232
233       // VZEXT_MOVL - Vector move low and zero extend.
234       VZEXT_MOVL,
235
236       // VSEXT_MOVL - Vector move low and sign extend.
237       VSEXT_MOVL,
238
239       // VZEXT - Vector integer zero-extend.
240       VZEXT,
241
242       // VSEXT - Vector integer signed-extend.
243       VSEXT,
244
245       // VFPEXT - Vector FP extend.
246       VFPEXT,
247
248       // VFPROUND - Vector FP round.
249       VFPROUND,
250
251       // VSHL, VSRL - 128-bit vector logical left / right shift
252       VSHLDQ, VSRLDQ,
253
254       // VSHL, VSRL, VSRA - Vector shift elements
255       VSHL, VSRL, VSRA,
256
257       // VSHLI, VSRLI, VSRAI - Vector shift elements by immediate
258       VSHLI, VSRLI, VSRAI,
259
260       // CMPP - Vector packed double/float comparison.
261       CMPP,
262
263       // PCMP* - Vector integer comparisons.
264       PCMPEQ, PCMPGT,
265
266       // ADD, SUB, SMUL, etc. - Arithmetic operations with FLAGS results.
267       ADD, SUB, ADC, SBB, SMUL,
268       INC, DEC, OR, XOR, AND,
269
270       ANDN, // ANDN - Bitwise AND NOT with FLAGS results.
271
272       BLSI,   // BLSI - Extract lowest set isolated bit
273       BLSMSK, // BLSMSK - Get mask up to lowest set bit
274       BLSR,   // BLSR - Reset lowest set bit
275
276       UMUL, // LOW, HI, FLAGS = umul LHS, RHS
277
278       // MUL_IMM - X86 specific multiply by immediate.
279       MUL_IMM,
280
281       // PTEST - Vector bitwise comparisons
282       PTEST,
283
284       // TESTP - Vector packed fp sign bitwise comparisons
285       TESTP,
286
287       // Several flavors of instructions with vector shuffle behaviors.
288       PALIGN,
289       PSHUFD,
290       PSHUFHW,
291       PSHUFLW,
292       SHUFP,
293       MOVDDUP,
294       MOVSHDUP,
295       MOVSLDUP,
296       MOVLHPS,
297       MOVLHPD,
298       MOVHLPS,
299       MOVLPS,
300       MOVLPD,
301       MOVSD,
302       MOVSS,
303       UNPCKL,
304       UNPCKH,
305       VPERMILP,
306       VPERMV,
307       VPERMI,
308       VPERM2X128,
309       VBROADCAST,
310
311       // PMULUDQ - Vector multiply packed unsigned doubleword integers
312       PMULUDQ,
313
314       // FMA nodes
315       FMADD,
316       FNMADD,
317       FMSUB,
318       FNMSUB,
319       FMADDSUB,
320       FMSUBADD,
321
322       // VASTART_SAVE_XMM_REGS - Save xmm argument registers to the stack,
323       // according to %al. An operator is needed so that this can be expanded
324       // with control flow.
325       VASTART_SAVE_XMM_REGS,
326
327       // WIN_ALLOCA - Windows's _chkstk call to do stack probing.
328       WIN_ALLOCA,
329
330       // SEG_ALLOCA - For allocating variable amounts of stack space when using
331       // segmented stacks. Check if the current stacklet has enough space, and
332       // falls back to heap allocation if not.
333       SEG_ALLOCA,
334
335       // WIN_FTOL - Windows's _ftol2 runtime routine to do fptoui.
336       WIN_FTOL,
337
338       // Memory barrier
339       MEMBARRIER,
340       MFENCE,
341       SFENCE,
342       LFENCE,
343
344       // FNSTSW16r - Store FP status word into i16 register.
345       FNSTSW16r,
346
347       // SAHF - Store contents of %ah into %eflags.
348       SAHF,
349
350       // RDRAND - Get a random integer and indicate whether it is valid in CF.
351       RDRAND,
352
353       // PCMP*STRI
354       PCMPISTRI,
355       PCMPESTRI,
356
357       // ATOMADD64_DAG, ATOMSUB64_DAG, ATOMOR64_DAG, ATOMAND64_DAG,
358       // ATOMXOR64_DAG, ATOMNAND64_DAG, ATOMSWAP64_DAG -
359       // Atomic 64-bit binary operations.
360       ATOMADD64_DAG = ISD::FIRST_TARGET_MEMORY_OPCODE,
361       ATOMSUB64_DAG,
362       ATOMOR64_DAG,
363       ATOMXOR64_DAG,
364       ATOMAND64_DAG,
365       ATOMNAND64_DAG,
366       ATOMMAX64_DAG,
367       ATOMMIN64_DAG,
368       ATOMUMAX64_DAG,
369       ATOMUMIN64_DAG,
370       ATOMSWAP64_DAG,
371
372       // LCMPXCHG_DAG, LCMPXCHG8_DAG, LCMPXCHG16_DAG - Compare and swap.
373       LCMPXCHG_DAG,
374       LCMPXCHG8_DAG,
375       LCMPXCHG16_DAG,
376
377       // VZEXT_LOAD - Load, scalar_to_vector, and zero extend.
378       VZEXT_LOAD,
379
380       // FNSTCW16m - Store FP control world into i16 memory.
381       FNSTCW16m,
382
383       /// FP_TO_INT*_IN_MEM - This instruction implements FP_TO_SINT with the
384       /// integer destination in memory and a FP reg source.  This corresponds
385       /// to the X86::FIST*m instructions and the rounding mode change stuff. It
386       /// has two inputs (token chain and address) and two outputs (int value
387       /// and token chain).
388       FP_TO_INT16_IN_MEM,
389       FP_TO_INT32_IN_MEM,
390       FP_TO_INT64_IN_MEM,
391
392       /// FILD, FILD_FLAG - This instruction implements SINT_TO_FP with the
393       /// integer source in memory and FP reg result.  This corresponds to the
394       /// X86::FILD*m instructions. It has three inputs (token chain, address,
395       /// and source type) and two outputs (FP value and token chain). FILD_FLAG
396       /// also produces a flag).
397       FILD,
398       FILD_FLAG,
399
400       /// FLD - This instruction implements an extending load to FP stack slots.
401       /// This corresponds to the X86::FLD32m / X86::FLD64m. It takes a chain
402       /// operand, ptr to load from, and a ValueType node indicating the type
403       /// to load to.
404       FLD,
405
406       /// FST - This instruction implements a truncating store to FP stack
407       /// slots. This corresponds to the X86::FST32m / X86::FST64m. It takes a
408       /// chain operand, value to store, address, and a ValueType to store it
409       /// as.
410       FST,
411
412       /// VAARG_64 - This instruction grabs the address of the next argument
413       /// from a va_list. (reads and modifies the va_list in memory)
414       VAARG_64
415
416       // WARNING: Do not add anything in the end unless you want the node to
417       // have memop! In fact, starting from ATOMADD64_DAG all opcodes will be
418       // thought as target memory ops!
419     };
420   }
421
422   /// Define some predicates that are used for node matching.
423   namespace X86 {
424     /// isVEXTRACTF128Index - Return true if the specified
425     /// EXTRACT_SUBVECTOR operand specifies a vector extract that is
426     /// suitable for input to VEXTRACTF128.
427     bool isVEXTRACTF128Index(SDNode *N);
428
429     /// isVINSERTF128Index - Return true if the specified
430     /// INSERT_SUBVECTOR operand specifies a subvector insert that is
431     /// suitable for input to VINSERTF128.
432     bool isVINSERTF128Index(SDNode *N);
433
434     /// getExtractVEXTRACTF128Immediate - Return the appropriate
435     /// immediate to extract the specified EXTRACT_SUBVECTOR index
436     /// with VEXTRACTF128 instructions.
437     unsigned getExtractVEXTRACTF128Immediate(SDNode *N);
438
439     /// getInsertVINSERTF128Immediate - Return the appropriate
440     /// immediate to insert at the specified INSERT_SUBVECTOR index
441     /// with VINSERTF128 instructions.
442     unsigned getInsertVINSERTF128Immediate(SDNode *N);
443
444     /// isZeroNode - Returns true if Elt is a constant zero or a floating point
445     /// constant +0.0.
446     bool isZeroNode(SDValue Elt);
447
448     /// isOffsetSuitableForCodeModel - Returns true of the given offset can be
449     /// fit into displacement field of the instruction.
450     bool isOffsetSuitableForCodeModel(int64_t Offset, CodeModel::Model M,
451                                       bool hasSymbolicDisplacement = true);
452
453
454     /// isCalleePop - Determines whether the callee is required to pop its
455     /// own arguments. Callee pop is necessary to support tail calls.
456     bool isCalleePop(CallingConv::ID CallingConv,
457                      bool is64Bit, bool IsVarArg, bool TailCallOpt);
458   }
459
460   //===--------------------------------------------------------------------===//
461   //  X86TargetLowering - X86 Implementation of the TargetLowering interface
462   class X86TargetLowering : public TargetLowering {
463   public:
464     explicit X86TargetLowering(X86TargetMachine &TM);
465
466     virtual unsigned getJumpTableEncoding() const;
467
468     virtual MVT getShiftAmountTy(EVT LHSTy) const { return MVT::i8; }
469
470     virtual const MCExpr *
471     LowerCustomJumpTableEntry(const MachineJumpTableInfo *MJTI,
472                               const MachineBasicBlock *MBB, unsigned uid,
473                               MCContext &Ctx) const;
474
475     /// getPICJumpTableRelocaBase - Returns relocation base for the given PIC
476     /// jumptable.
477     virtual SDValue getPICJumpTableRelocBase(SDValue Table,
478                                              SelectionDAG &DAG) const;
479     virtual const MCExpr *
480     getPICJumpTableRelocBaseExpr(const MachineFunction *MF,
481                                  unsigned JTI, MCContext &Ctx) const;
482
483     /// getStackPtrReg - Return the stack pointer register we are using: either
484     /// ESP or RSP.
485     unsigned getStackPtrReg() const { return X86StackPtr; }
486
487     /// getByValTypeAlignment - Return the desired alignment for ByVal aggregate
488     /// function arguments in the caller parameter area. For X86, aggregates
489     /// that contains are placed at 16-byte boundaries while the rest are at
490     /// 4-byte boundaries.
491     virtual unsigned getByValTypeAlignment(Type *Ty) const;
492
493     /// getOptimalMemOpType - Returns the target specific optimal type for load
494     /// and store operations as a result of memset, memcpy, and memmove
495     /// lowering. If DstAlign is zero that means it's safe to destination
496     /// alignment can satisfy any constraint. Similarly if SrcAlign is zero it
497     /// means there isn't a need to check it against alignment requirement,
498     /// probably because the source does not need to be loaded. If
499     /// 'IsZeroVal' is true, that means it's safe to return a
500     /// non-scalar-integer type, e.g. empty string source, constant, or loaded
501     /// from memory. 'MemcpyStrSrc' indicates whether the memcpy source is
502     /// constant so it does not need to be loaded.
503     /// It returns EVT::Other if the type should be determined using generic
504     /// target-independent logic.
505     virtual EVT
506     getOptimalMemOpType(uint64_t Size, unsigned DstAlign, unsigned SrcAlign,
507                         bool IsZeroVal, bool MemcpyStrSrc,
508                         MachineFunction &MF) const;
509
510     /// allowsUnalignedMemoryAccesses - Returns true if the target allows
511     /// unaligned memory accesses. of the specified type.
512     virtual bool allowsUnalignedMemoryAccesses(EVT VT) const {
513       return true;
514     }
515
516     /// LowerOperation - Provide custom lowering hooks for some operations.
517     ///
518     virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
519
520     /// ReplaceNodeResults - Replace the results of node with an illegal result
521     /// type with new values built out of custom code.
522     ///
523     virtual void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results,
524                                     SelectionDAG &DAG) const;
525
526
527     virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
528
529     /// isTypeDesirableForOp - Return true if the target has native support for
530     /// the specified value type and it is 'desirable' to use the type for the
531     /// given node type. e.g. On x86 i16 is legal, but undesirable since i16
532     /// instruction encodings are longer and some i16 instructions are slow.
533     virtual bool isTypeDesirableForOp(unsigned Opc, EVT VT) const;
534
535     /// isTypeDesirable - Return true if the target has native support for the
536     /// specified value type and it is 'desirable' to use the type. e.g. On x86
537     /// i16 is legal, but undesirable since i16 instruction encodings are longer
538     /// and some i16 instructions are slow.
539     virtual bool IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const;
540
541     virtual MachineBasicBlock *
542       EmitInstrWithCustomInserter(MachineInstr *MI,
543                                   MachineBasicBlock *MBB) const;
544
545
546     /// getTargetNodeName - This method returns the name of a target specific
547     /// DAG node.
548     virtual const char *getTargetNodeName(unsigned Opcode) const;
549
550     /// getSetCCResultType - Return the value type to use for ISD::SETCC.
551     virtual EVT getSetCCResultType(EVT VT) const;
552
553     /// computeMaskedBitsForTargetNode - Determine which of the bits specified
554     /// in Mask are known to be either zero or one and return them in the
555     /// KnownZero/KnownOne bitsets.
556     virtual void computeMaskedBitsForTargetNode(const SDValue Op,
557                                                 APInt &KnownZero,
558                                                 APInt &KnownOne,
559                                                 const SelectionDAG &DAG,
560                                                 unsigned Depth = 0) const;
561
562     // ComputeNumSignBitsForTargetNode - Determine the number of bits in the
563     // operation that are sign bits.
564     virtual unsigned ComputeNumSignBitsForTargetNode(SDValue Op,
565                                                      unsigned Depth) const;
566
567     virtual bool
568     isGAPlusOffset(SDNode *N, const GlobalValue* &GA, int64_t &Offset) const;
569
570     SDValue getReturnAddressFrameIndex(SelectionDAG &DAG) const;
571
572     virtual bool ExpandInlineAsm(CallInst *CI) const;
573
574     ConstraintType getConstraintType(const std::string &Constraint) const;
575
576     /// Examine constraint string and operand type and determine a weight value.
577     /// The operand object must already have been set up with the operand type.
578     virtual ConstraintWeight getSingleConstraintMatchWeight(
579       AsmOperandInfo &info, const char *constraint) const;
580
581     virtual const char *LowerXConstraint(EVT ConstraintVT) const;
582
583     /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
584     /// vector.  If it is invalid, don't add anything to Ops. If hasMemory is
585     /// true it means one of the asm constraint of the inline asm instruction
586     /// being processed is 'm'.
587     virtual void LowerAsmOperandForConstraint(SDValue Op,
588                                               std::string &Constraint,
589                                               std::vector<SDValue> &Ops,
590                                               SelectionDAG &DAG) const;
591
592     /// getRegForInlineAsmConstraint - Given a physical register constraint
593     /// (e.g. {edx}), return the register number and the register class for the
594     /// register.  This should only be used for C_Register constraints.  On
595     /// error, this returns a register number of 0.
596     std::pair<unsigned, const TargetRegisterClass*>
597       getRegForInlineAsmConstraint(const std::string &Constraint,
598                                    EVT VT) const;
599
600     /// isLegalAddressingMode - Return true if the addressing mode represented
601     /// by AM is legal for this target, for a load/store of the specified type.
602     virtual bool isLegalAddressingMode(const AddrMode &AM, Type *Ty)const;
603
604     /// isLegalICmpImmediate - Return true if the specified immediate is legal
605     /// icmp immediate, that is the target has icmp instructions which can
606     /// compare a register against the immediate without having to materialize
607     /// the immediate into a register.
608     virtual bool isLegalICmpImmediate(int64_t Imm) const;
609
610     /// isLegalAddImmediate - Return true if the specified immediate is legal
611     /// add immediate, that is the target has add instructions which can
612     /// add a register and the immediate without having to materialize
613     /// the immediate into a register.
614     virtual bool isLegalAddImmediate(int64_t Imm) const;
615
616     /// isTruncateFree - Return true if it's free to truncate a value of
617     /// type Ty1 to type Ty2. e.g. On x86 it's free to truncate a i32 value in
618     /// register EAX to i16 by referencing its sub-register AX.
619     virtual bool isTruncateFree(Type *Ty1, Type *Ty2) const;
620     virtual bool isTruncateFree(EVT VT1, EVT VT2) const;
621
622     /// isZExtFree - Return true if any actual instruction that defines a
623     /// value of type Ty1 implicit zero-extends the value to Ty2 in the result
624     /// register. This does not necessarily include registers defined in
625     /// unknown ways, such as incoming arguments, or copies from unknown
626     /// virtual registers. Also, if isTruncateFree(Ty2, Ty1) is true, this
627     /// does not necessarily apply to truncate instructions. e.g. on x86-64,
628     /// all instructions that define 32-bit values implicit zero-extend the
629     /// result out to 64 bits.
630     virtual bool isZExtFree(Type *Ty1, Type *Ty2) const;
631     virtual bool isZExtFree(EVT VT1, EVT VT2) const;
632
633     /// isFMAFasterThanMulAndAdd - Return true if an FMA operation is faster than
634     /// a pair of mul and add instructions. fmuladd intrinsics will be expanded to
635     /// FMAs when this method returns true (and FMAs are legal), otherwise fmuladd
636     /// is expanded to mul + add.
637     virtual bool isFMAFasterThanMulAndAdd(EVT) const { return true; }
638
639     /// isNarrowingProfitable - Return true if it's profitable to narrow
640     /// operations of type VT1 to VT2. e.g. on x86, it's profitable to narrow
641     /// from i32 to i8 but not from i32 to i16.
642     virtual bool isNarrowingProfitable(EVT VT1, EVT VT2) const;
643
644     /// isFPImmLegal - Returns true if the target can instruction select the
645     /// specified FP immediate natively. If false, the legalizer will
646     /// materialize the FP immediate as a load from a constant pool.
647     virtual bool isFPImmLegal(const APFloat &Imm, EVT VT) const;
648
649     /// isShuffleMaskLegal - Targets can use this to indicate that they only
650     /// support *some* VECTOR_SHUFFLE operations, those with specific masks.
651     /// By default, if a target supports the VECTOR_SHUFFLE node, all mask
652     /// values are assumed to be legal.
653     virtual bool isShuffleMaskLegal(const SmallVectorImpl<int> &Mask,
654                                     EVT VT) const;
655
656     /// isVectorClearMaskLegal - Similar to isShuffleMaskLegal. This is
657     /// used by Targets can use this to indicate if there is a suitable
658     /// VECTOR_SHUFFLE that can be used to replace a VAND with a constant
659     /// pool entry.
660     virtual bool isVectorClearMaskLegal(const SmallVectorImpl<int> &Mask,
661                                         EVT VT) const;
662
663     /// ShouldShrinkFPConstant - If true, then instruction selection should
664     /// seek to shrink the FP constant of the specified type to a smaller type
665     /// in order to save space and / or reduce runtime.
666     virtual bool ShouldShrinkFPConstant(EVT VT) const {
667       // Don't shrink FP constpool if SSE2 is available since cvtss2sd is more
668       // expensive than a straight movsd. On the other hand, it's important to
669       // shrink long double fp constant since fldt is very slow.
670       return !X86ScalarSSEf64 || VT == MVT::f80;
671     }
672
673     const X86Subtarget* getSubtarget() const {
674       return Subtarget;
675     }
676
677     /// isScalarFPTypeInSSEReg - Return true if the specified scalar FP type is
678     /// computed in an SSE register, not on the X87 floating point stack.
679     bool isScalarFPTypeInSSEReg(EVT VT) const {
680       return (VT == MVT::f64 && X86ScalarSSEf64) || // f64 is when SSE2
681       (VT == MVT::f32 && X86ScalarSSEf32);   // f32 is when SSE1
682     }
683
684     /// isTargetFTOL - Return true if the target uses the MSVC _ftol2 routine
685     /// for fptoui.
686     bool isTargetFTOL() const {
687       return Subtarget->isTargetWindows() && !Subtarget->is64Bit();
688     }
689
690     /// isIntegerTypeFTOL - Return true if the MSVC _ftol2 routine should be
691     /// used for fptoui to the given type.
692     bool isIntegerTypeFTOL(EVT VT) const {
693       return isTargetFTOL() && VT == MVT::i64;
694     }
695
696     /// createFastISel - This method returns a target specific FastISel object,
697     /// or null if the target does not support "fast" ISel.
698     virtual FastISel *createFastISel(FunctionLoweringInfo &funcInfo,
699                                      const TargetLibraryInfo *libInfo) const;
700
701     /// getStackCookieLocation - Return true if the target stores stack
702     /// protector cookies at a fixed offset in some non-standard address
703     /// space, and populates the address space and offset as
704     /// appropriate.
705     virtual bool getStackCookieLocation(unsigned &AddressSpace, unsigned &Offset) const;
706
707     SDValue BuildFILD(SDValue Op, EVT SrcVT, SDValue Chain, SDValue StackSlot,
708                       SelectionDAG &DAG) const;
709
710   protected:
711     std::pair<const TargetRegisterClass*, uint8_t>
712     findRepresentativeClass(EVT VT) const;
713
714   private:
715     /// Subtarget - Keep a pointer to the X86Subtarget around so that we can
716     /// make the right decision when generating code for different targets.
717     const X86Subtarget *Subtarget;
718     const X86RegisterInfo *RegInfo;
719     const DataLayout *TD;
720
721     /// X86StackPtr - X86 physical register used as stack ptr.
722     unsigned X86StackPtr;
723
724     /// X86ScalarSSEf32, X86ScalarSSEf64 - Select between SSE or x87
725     /// floating point ops.
726     /// When SSE is available, use it for f32 operations.
727     /// When SSE2 is available, use it for f64 operations.
728     bool X86ScalarSSEf32;
729     bool X86ScalarSSEf64;
730
731     /// LegalFPImmediates - A list of legal fp immediates.
732     std::vector<APFloat> LegalFPImmediates;
733
734     /// addLegalFPImmediate - Indicate that this x86 target can instruction
735     /// select the specified FP immediate natively.
736     void addLegalFPImmediate(const APFloat& Imm) {
737       LegalFPImmediates.push_back(Imm);
738     }
739
740     SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
741                             CallingConv::ID CallConv, bool isVarArg,
742                             const SmallVectorImpl<ISD::InputArg> &Ins,
743                             DebugLoc dl, SelectionDAG &DAG,
744                             SmallVectorImpl<SDValue> &InVals) const;
745     SDValue LowerMemArgument(SDValue Chain,
746                              CallingConv::ID CallConv,
747                              const SmallVectorImpl<ISD::InputArg> &ArgInfo,
748                              DebugLoc dl, SelectionDAG &DAG,
749                              const CCValAssign &VA,  MachineFrameInfo *MFI,
750                               unsigned i) const;
751     SDValue LowerMemOpCallTo(SDValue Chain, SDValue StackPtr, SDValue Arg,
752                              DebugLoc dl, SelectionDAG &DAG,
753                              const CCValAssign &VA,
754                              ISD::ArgFlagsTy Flags) const;
755
756     // Call lowering helpers.
757
758     /// IsEligibleForTailCallOptimization - Check whether the call is eligible
759     /// for tail call optimization. Targets which want to do tail call
760     /// optimization should implement this function.
761     bool IsEligibleForTailCallOptimization(SDValue Callee,
762                                            CallingConv::ID CalleeCC,
763                                            bool isVarArg,
764                                            bool isCalleeStructRet,
765                                            bool isCallerStructRet,
766                                            Type *RetTy,
767                                     const SmallVectorImpl<ISD::OutputArg> &Outs,
768                                     const SmallVectorImpl<SDValue> &OutVals,
769                                     const SmallVectorImpl<ISD::InputArg> &Ins,
770                                            SelectionDAG& DAG) const;
771     bool IsCalleePop(bool isVarArg, CallingConv::ID CallConv) const;
772     SDValue EmitTailCallLoadRetAddr(SelectionDAG &DAG, SDValue &OutRetAddr,
773                                 SDValue Chain, bool IsTailCall, bool Is64Bit,
774                                 int FPDiff, DebugLoc dl) const;
775
776     unsigned GetAlignedArgumentStackSize(unsigned StackSize,
777                                          SelectionDAG &DAG) const;
778
779     std::pair<SDValue,SDValue> FP_TO_INTHelper(SDValue Op, SelectionDAG &DAG,
780                                                bool isSigned,
781                                                bool isReplace) const;
782
783     SDValue LowerAsSplatVectorLoad(SDValue SrcOp, EVT VT, DebugLoc dl,
784                                    SelectionDAG &DAG) const;
785     SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
786     SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
787     SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
788     SDValue LowerEXTRACT_VECTOR_ELT_SSE4(SDValue Op, SelectionDAG &DAG) const;
789     SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
790     SDValue LowerINSERT_VECTOR_ELT_SSE4(SDValue Op, SelectionDAG &DAG) const;
791     SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
792     SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
793     SDValue LowerGlobalAddress(const GlobalValue *GV, DebugLoc dl,
794                                int64_t Offset, SelectionDAG &DAG) const;
795     SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
796     SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
797     SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
798     SDValue LowerShiftParts(SDValue Op, SelectionDAG &DAG) const;
799     SDValue LowerBITCAST(SDValue op, SelectionDAG &DAG) const;
800     SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
801     SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
802     SDValue LowerUINT_TO_FP_i64(SDValue Op, SelectionDAG &DAG) const;
803     SDValue LowerUINT_TO_FP_i32(SDValue Op, SelectionDAG &DAG) const;
804     SDValue lowerUINT_TO_FP_vec(SDValue Op, SelectionDAG &DAG) const;
805     SDValue lowerTRUNCATE(SDValue Op, SelectionDAG &DAG) const;
806     SDValue lowerZERO_EXTEND(SDValue Op, SelectionDAG &DAG) const;
807     SDValue LowerFP_TO_SINT(SDValue Op, SelectionDAG &DAG) const;
808     SDValue LowerFP_TO_UINT(SDValue Op, SelectionDAG &DAG) const;
809     SDValue lowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const;
810     SDValue LowerFABS(SDValue Op, SelectionDAG &DAG) const;
811     SDValue LowerFNEG(SDValue Op, SelectionDAG &DAG) const;
812     SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;
813     SDValue LowerToBT(SDValue And, ISD::CondCode CC,
814                       DebugLoc dl, SelectionDAG &DAG) const;
815     SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
816     SDValue LowerVSETCC(SDValue Op, SelectionDAG &DAG) const;
817     SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
818     SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
819     SDValue LowerMEMSET(SDValue Op, SelectionDAG &DAG) const;
820     SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
821     SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
822     SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
823     SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
824     SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
825     SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
826     SDValue LowerFRAME_TO_ARGS_OFFSET(SDValue Op, SelectionDAG &DAG) const;
827     SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
828     SDValue lowerEH_SJLJ_SETJMP(SDValue Op, SelectionDAG &DAG) const;
829     SDValue lowerEH_SJLJ_LONGJMP(SDValue Op, SelectionDAG &DAG) const;
830     SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
831     SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG) const;
832     SDValue LowerShift(SDValue Op, SelectionDAG &DAG) const;
833
834     SDValue LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG) const;
835
836     // Utility functions to help LowerVECTOR_SHUFFLE & LowerBUILD_VECTOR
837     SDValue LowerVectorBroadcast(SDValue Op, SelectionDAG &DAG) const;
838     SDValue NormalizeVectorShuffle(SDValue Op, SelectionDAG &DAG) const;
839     SDValue buildFromShuffleMostly(SDValue Op, SelectionDAG &DAG) const;
840
841     SDValue LowerVectorAllZeroTest(SDValue Op, SelectionDAG &DAG) const;
842
843     SDValue lowerVectorIntExtend(SDValue Op, SelectionDAG &DAG) const;
844
845     virtual SDValue
846       LowerFormalArguments(SDValue Chain,
847                            CallingConv::ID CallConv, bool isVarArg,
848                            const SmallVectorImpl<ISD::InputArg> &Ins,
849                            DebugLoc dl, SelectionDAG &DAG,
850                            SmallVectorImpl<SDValue> &InVals) const;
851     virtual SDValue
852       LowerCall(CallLoweringInfo &CLI,
853                 SmallVectorImpl<SDValue> &InVals) const;
854
855     virtual SDValue
856       LowerReturn(SDValue Chain,
857                   CallingConv::ID CallConv, bool isVarArg,
858                   const SmallVectorImpl<ISD::OutputArg> &Outs,
859                   const SmallVectorImpl<SDValue> &OutVals,
860                   DebugLoc dl, SelectionDAG &DAG) const;
861
862     virtual bool isUsedByReturnOnly(SDNode *N, SDValue &Chain) const;
863
864     virtual bool mayBeEmittedAsTailCall(CallInst *CI) const;
865
866     virtual EVT
867     getTypeForExtArgOrReturn(LLVMContext &Context, EVT VT,
868                              ISD::NodeType ExtendKind) const;
869
870     virtual bool
871     CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
872                    bool isVarArg,
873                    const SmallVectorImpl<ISD::OutputArg> &Outs,
874                    LLVMContext &Context) const;
875
876     /// Utility function to emit string processing sse4.2 instructions
877     /// that return in xmm0.
878     /// This takes the instruction to expand, the associated machine basic
879     /// block, the number of args, and whether or not the second arg is
880     /// in memory or not.
881     MachineBasicBlock *EmitPCMP(MachineInstr *BInstr, MachineBasicBlock *BB,
882                                 unsigned argNum, bool inMem) const;
883
884     /// Utility functions to emit monitor and mwait instructions. These
885     /// need to make sure that the arguments to the intrinsic are in the
886     /// correct registers.
887     MachineBasicBlock *EmitMonitor(MachineInstr *MI,
888                                    MachineBasicBlock *BB) const;
889     MachineBasicBlock *EmitMwait(MachineInstr *MI, MachineBasicBlock *BB) const;
890
891     /// Utility function to emit atomic-load-arith operations (and, or, xor,
892     /// nand, max, min, umax, umin). It takes the corresponding instruction to
893     /// expand, the associated machine basic block, and the associated X86
894     /// opcodes for reg/reg.
895     MachineBasicBlock *EmitAtomicLoadArith(MachineInstr *MI,
896                                            MachineBasicBlock *MBB) const;
897
898     /// Utility function to emit atomic-load-arith operations (and, or, xor,
899     /// nand, add, sub, swap) for 64-bit operands on 32-bit target.
900     MachineBasicBlock *EmitAtomicLoadArith6432(MachineInstr *MI,
901                                                MachineBasicBlock *MBB) const;
902
903     // Utility function to emit the low-level va_arg code for X86-64.
904     MachineBasicBlock *EmitVAARG64WithCustomInserter(
905                        MachineInstr *MI,
906                        MachineBasicBlock *MBB) const;
907
908     /// Utility function to emit the xmm reg save portion of va_start.
909     MachineBasicBlock *EmitVAStartSaveXMMRegsWithCustomInserter(
910                                                    MachineInstr *BInstr,
911                                                    MachineBasicBlock *BB) const;
912
913     MachineBasicBlock *EmitLoweredSelect(MachineInstr *I,
914                                          MachineBasicBlock *BB) const;
915
916     MachineBasicBlock *EmitLoweredWinAlloca(MachineInstr *MI,
917                                               MachineBasicBlock *BB) const;
918
919     MachineBasicBlock *EmitLoweredSegAlloca(MachineInstr *MI,
920                                             MachineBasicBlock *BB,
921                                             bool Is64Bit) const;
922
923     MachineBasicBlock *EmitLoweredTLSCall(MachineInstr *MI,
924                                           MachineBasicBlock *BB) const;
925
926     MachineBasicBlock *emitLoweredTLSAddr(MachineInstr *MI,
927                                           MachineBasicBlock *BB) const;
928
929     MachineBasicBlock *emitEHSjLjSetJmp(MachineInstr *MI,
930                                         MachineBasicBlock *MBB) const;
931
932     MachineBasicBlock *emitEHSjLjLongJmp(MachineInstr *MI,
933                                          MachineBasicBlock *MBB) const;
934
935     /// Emit nodes that will be selected as "test Op0,Op0", or something
936     /// equivalent, for use with the given x86 condition code.
937     SDValue EmitTest(SDValue Op0, unsigned X86CC, SelectionDAG &DAG) const;
938
939     /// Emit nodes that will be selected as "cmp Op0,Op1", or something
940     /// equivalent, for use with the given x86 condition code.
941     SDValue EmitCmp(SDValue Op0, SDValue Op1, unsigned X86CC,
942                     SelectionDAG &DAG) const;
943
944     /// Convert a comparison if required by the subtarget.
945     SDValue ConvertCmpIfNecessary(SDValue Cmp, SelectionDAG &DAG) const;
946   };
947
948   namespace X86 {
949     FastISel *createFastISel(FunctionLoweringInfo &funcInfo,
950                              const TargetLibraryInfo *libInfo);
951   }
952 }
953
954 #endif    // X86ISELLOWERING_H