OSDN Git Service

6181dbd2a6ab98e7ca2e42959babe4b3eb6d24df
[android-x86/external-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 LLVM_LIB_TARGET_X86_X86ISELLOWERING_H
16 #define LLVM_LIB_TARGET_X86_X86ISELLOWERING_H
17
18 #include "llvm/CodeGen/CallingConvLower.h"
19 #include "llvm/CodeGen/SelectionDAG.h"
20 #include "llvm/CodeGen/TargetLowering.h"
21 #include "llvm/Target/TargetOptions.h"
22
23 namespace llvm {
24   class X86Subtarget;
25   class X86TargetMachine;
26
27   namespace X86ISD {
28     // X86 Specific DAG Nodes
29     enum NodeType : unsigned {
30       // Start the numbering where the builtin ops leave off.
31       FIRST_NUMBER = ISD::BUILTIN_OP_END,
32
33       /// Bit scan forward.
34       BSF,
35       /// Bit scan reverse.
36       BSR,
37
38       /// Double shift instructions. These correspond to
39       /// X86::SHLDxx and X86::SHRDxx instructions.
40       SHLD,
41       SHRD,
42
43       /// Bitwise logical AND of floating point values. This corresponds
44       /// to X86::ANDPS or X86::ANDPD.
45       FAND,
46
47       /// Bitwise logical OR of floating point values. This corresponds
48       /// to X86::ORPS or X86::ORPD.
49       FOR,
50
51       /// Bitwise logical XOR of floating point values. This corresponds
52       /// to X86::XORPS or X86::XORPD.
53       FXOR,
54
55       ///  Bitwise logical ANDNOT of floating point values. This
56       /// corresponds to X86::ANDNPS or X86::ANDNPD.
57       FANDN,
58
59       /// These operations represent an abstract X86 call
60       /// instruction, which includes a bunch of information.  In particular the
61       /// operands of these node are:
62       ///
63       ///     #0 - The incoming token chain
64       ///     #1 - The callee
65       ///     #2 - The number of arg bytes the caller pushes on the stack.
66       ///     #3 - The number of arg bytes the callee pops off the stack.
67       ///     #4 - The value to pass in AL/AX/EAX (optional)
68       ///     #5 - The value to pass in DL/DX/EDX (optional)
69       ///
70       /// The result values of these nodes are:
71       ///
72       ///     #0 - The outgoing token chain
73       ///     #1 - The first register result value (optional)
74       ///     #2 - The second register result value (optional)
75       ///
76       CALL,
77
78       /// This operation implements the lowering for readcyclecounter.
79       RDTSC_DAG,
80
81       /// X86 Read Time-Stamp Counter and Processor ID.
82       RDTSCP_DAG,
83
84       /// X86 Read Performance Monitoring Counters.
85       RDPMC_DAG,
86
87       /// X86 compare and logical compare instructions.
88       CMP, COMI, UCOMI,
89
90       /// X86 bit-test instructions.
91       BT,
92
93       /// X86 SetCC. Operand 0 is condition code, and operand 1 is the EFLAGS
94       /// operand, usually produced by a CMP instruction.
95       SETCC,
96
97       /// X86 Select
98       SELECT, SELECTS,
99
100       // Same as SETCC except it's materialized with a sbb and the value is all
101       // one's or all zero's.
102       SETCC_CARRY,  // R = carry_bit ? ~0 : 0
103
104       /// X86 FP SETCC, implemented with CMP{cc}SS/CMP{cc}SD.
105       /// Operands are two FP values to compare; result is a mask of
106       /// 0s or 1s.  Generally DTRT for C/C++ with NaNs.
107       FSETCC,
108
109       /// X86 FP SETCC, similar to above, but with output as an i1 mask and
110       /// with optional rounding mode.
111       FSETCCM, FSETCCM_RND,
112
113       /// X86 conditional moves. Operand 0 and operand 1 are the two values
114       /// to select from. Operand 2 is the condition code, and operand 3 is the
115       /// flag operand produced by a CMP or TEST instruction. It also writes a
116       /// flag result.
117       CMOV,
118
119       /// X86 conditional branches. Operand 0 is the chain operand, operand 1
120       /// is the block to branch if condition is true, operand 2 is the
121       /// condition code, and operand 3 is the flag operand produced by a CMP
122       /// or TEST instruction.
123       BRCOND,
124
125       /// Return with a flag operand. Operand 0 is the chain operand, operand
126       /// 1 is the number of bytes of stack to pop.
127       RET_FLAG,
128
129       /// Return from interrupt. Operand 0 is the number of bytes to pop.
130       IRET,
131
132       /// Repeat fill, corresponds to X86::REP_STOSx.
133       REP_STOS,
134
135       /// Repeat move, corresponds to X86::REP_MOVSx.
136       REP_MOVS,
137
138       /// On Darwin, this node represents the result of the popl
139       /// at function entry, used for PIC code.
140       GlobalBaseReg,
141
142       /// A wrapper node for TargetConstantPool, TargetJumpTable,
143       /// TargetExternalSymbol, TargetGlobalAddress, TargetGlobalTLSAddress,
144       /// MCSymbol and TargetBlockAddress.
145       Wrapper,
146
147       /// Special wrapper used under X86-64 PIC mode for RIP
148       /// relative displacements.
149       WrapperRIP,
150
151       /// Copies a 64-bit value from the low word of an XMM vector
152       /// to an MMX vector.
153       MOVDQ2Q,
154
155       /// Copies a 32-bit value from the low word of a MMX
156       /// vector to a GPR.
157       MMX_MOVD2W,
158
159       /// Copies a GPR into the low 32-bit word of a MMX vector
160       /// and zero out the high word.
161       MMX_MOVW2D,
162
163       /// Extract an 8-bit value from a vector and zero extend it to
164       /// i32, corresponds to X86::PEXTRB.
165       PEXTRB,
166
167       /// Extract a 16-bit value from a vector and zero extend it to
168       /// i32, corresponds to X86::PEXTRW.
169       PEXTRW,
170
171       /// Insert any element of a 4 x float vector into any element
172       /// of a destination 4 x floatvector.
173       INSERTPS,
174
175       /// Insert the lower 8-bits of a 32-bit value to a vector,
176       /// corresponds to X86::PINSRB.
177       PINSRB,
178
179       /// Insert the lower 16-bits of a 32-bit value to a vector,
180       /// corresponds to X86::PINSRW.
181       PINSRW,
182
183       /// Shuffle 16 8-bit values within a vector.
184       PSHUFB,
185
186       /// Compute Sum of Absolute Differences.
187       PSADBW,
188       /// Compute Double Block Packed Sum-Absolute-Differences
189       DBPSADBW,
190
191       /// Bitwise Logical AND NOT of Packed FP values.
192       ANDNP,
193
194       /// Blend where the selector is an immediate.
195       BLENDI,
196
197       /// Dynamic (non-constant condition) vector blend where only the sign bits
198       /// of the condition elements are used. This is used to enforce that the
199       /// condition mask is not valid for generic VSELECT optimizations.
200       SHRUNKBLEND,
201
202       /// Combined add and sub on an FP vector.
203       ADDSUB,
204
205       //  FP vector ops with rounding mode.
206       FADD_RND, FADDS_RND,
207       FSUB_RND, FSUBS_RND,
208       FMUL_RND, FMULS_RND,
209       FDIV_RND, FDIVS_RND,
210       FMAX_RND, FMAXS_RND,
211       FMIN_RND, FMINS_RND,
212       FSQRT_RND, FSQRTS_RND,
213
214       // FP vector get exponent.
215       FGETEXP_RND, FGETEXPS_RND,
216       // Extract Normalized Mantissas.
217       VGETMANT, VGETMANT_RND, VGETMANTS, VGETMANTS_RND,
218       // FP Scale.
219       SCALEF,
220       SCALEFS,
221
222       // Integer add/sub with unsigned saturation.
223       ADDUS,
224       SUBUS,
225
226       // Integer add/sub with signed saturation.
227       ADDS,
228       SUBS,
229
230       // Unsigned Integer average.
231       AVG,
232
233       /// Integer horizontal add/sub.
234       HADD,
235       HSUB,
236
237       /// Floating point horizontal add/sub.
238       FHADD,
239       FHSUB,
240
241       // Detect Conflicts Within a Vector
242       CONFLICT,
243
244       /// Floating point max and min.
245       FMAX, FMIN,
246
247       /// Commutative FMIN and FMAX.
248       FMAXC, FMINC,
249
250       /// Scalar intrinsic floating point max and min.
251       FMAXS, FMINS,
252
253       /// Floating point reciprocal-sqrt and reciprocal approximation.
254       /// Note that these typically require refinement
255       /// in order to obtain suitable precision.
256       FRSQRT, FRCP,
257
258       // AVX-512 reciprocal approximations with a little more precision.
259       RSQRT14, RSQRT14S, RCP14, RCP14S,
260
261       // Thread Local Storage.
262       TLSADDR,
263
264       // Thread Local Storage. A call to get the start address
265       // of the TLS block for the current module.
266       TLSBASEADDR,
267
268       // Thread Local Storage.  When calling to an OS provided
269       // thunk at the address from an earlier relocation.
270       TLSCALL,
271
272       // Exception Handling helpers.
273       EH_RETURN,
274
275       // SjLj exception handling setjmp.
276       EH_SJLJ_SETJMP,
277
278       // SjLj exception handling longjmp.
279       EH_SJLJ_LONGJMP,
280
281       // SjLj exception handling dispatch.
282       EH_SJLJ_SETUP_DISPATCH,
283
284       /// Tail call return. See X86TargetLowering::LowerCall for
285       /// the list of operands.
286       TC_RETURN,
287
288       // Vector move to low scalar and zero higher vector elements.
289       VZEXT_MOVL,
290
291       // Vector integer zero-extend.
292       VZEXT,
293       // Vector integer signed-extend.
294       VSEXT,
295
296       // Vector integer truncate.
297       VTRUNC,
298       // Vector integer truncate with unsigned/signed saturation.
299       VTRUNCUS, VTRUNCS,
300
301       // Vector FP extend.
302       VFPEXT, VFPEXT_RND, VFPEXTS_RND,
303
304       // Vector FP round.
305       VFPROUND, VFPROUND_RND, VFPROUNDS_RND,
306
307       // 128-bit vector logical left / right shift
308       VSHLDQ, VSRLDQ,
309
310       // Vector shift elements
311       VSHL, VSRL, VSRA,
312
313       // Vector variable shift right arithmetic.
314       // Unlike ISD::SRA, in case shift count greater then element size
315       // use sign bit to fill destination data element.
316       VSRAV,
317
318       // Vector shift elements by immediate
319       VSHLI, VSRLI, VSRAI,
320
321       // Shifts of mask registers.
322       KSHIFTL, KSHIFTR,
323
324       // Bit rotate by immediate
325       VROTLI, VROTRI,
326
327       // Vector packed double/float comparison.
328       CMPP,
329
330       // Vector integer comparisons.
331       PCMPEQ, PCMPGT,
332
333       // v8i16 Horizontal minimum and position.
334       PHMINPOS,
335
336       MULTISHIFT,
337
338       /// Vector comparison generating mask bits for fp and
339       /// integer signed and unsigned data types.
340       CMPM,
341       CMPMU,
342       // Vector comparison with rounding mode for FP values
343       CMPM_RND,
344
345       // Arithmetic operations with FLAGS results.
346       ADD, SUB, ADC, SBB, SMUL,
347       INC, DEC, OR, XOR, AND,
348
349       // Bit field extract.
350       BEXTR,
351
352       // LOW, HI, FLAGS = umul LHS, RHS.
353       UMUL,
354
355       // 8-bit SMUL/UMUL - AX, FLAGS = smul8/umul8 AL, RHS.
356       SMUL8, UMUL8,
357
358       // 8-bit divrem that zero-extend the high result (AH).
359       UDIVREM8_ZEXT_HREG,
360       SDIVREM8_SEXT_HREG,
361
362       // X86-specific multiply by immediate.
363       MUL_IMM,
364
365       // Vector sign bit extraction.
366       MOVMSK,
367
368       // Vector bitwise comparisons.
369       PTEST,
370
371       // Vector packed fp sign bitwise comparisons.
372       TESTP,
373
374       // OR/AND test for masks.
375       KORTEST,
376       KTEST,
377
378       // ADD for masks.
379       KADD,
380
381       // Several flavors of instructions with vector shuffle behaviors.
382       // Saturated signed/unnsigned packing.
383       PACKSS,
384       PACKUS,
385       // Intra-lane alignr.
386       PALIGNR,
387       // AVX512 inter-lane alignr.
388       VALIGN,
389       PSHUFD,
390       PSHUFHW,
391       PSHUFLW,
392       SHUFP,
393       // VBMI2 Concat & Shift.
394       VSHLD,
395       VSHRD,
396       VSHLDV,
397       VSHRDV,
398       //Shuffle Packed Values at 128-bit granularity.
399       SHUF128,
400       MOVDDUP,
401       MOVSHDUP,
402       MOVSLDUP,
403       MOVLHPS,
404       MOVHLPS,
405       MOVLPS,
406       MOVLPD,
407       MOVSD,
408       MOVSS,
409       UNPCKL,
410       UNPCKH,
411       VPERMILPV,
412       VPERMILPI,
413       VPERMI,
414       VPERM2X128,
415
416       // Variable Permute (VPERM).
417       // Res = VPERMV MaskV, V0
418       VPERMV,
419
420       // 3-op Variable Permute (VPERMT2).
421       // Res = VPERMV3 V0, MaskV, V1
422       VPERMV3,
423
424       // 3-op Variable Permute overwriting the index (VPERMI2).
425       // Res = VPERMIV3 V0, MaskV, V1
426       VPERMIV3,
427
428       // Bitwise ternary logic.
429       VPTERNLOG,
430       // Fix Up Special Packed Float32/64 values.
431       VFIXUPIMM,
432       VFIXUPIMMS,
433       // Range Restriction Calculation For Packed Pairs of Float32/64 values.
434       VRANGE, VRANGE_RND, VRANGES, VRANGES_RND,
435       // Reduce - Perform Reduction Transformation on scalar\packed FP.
436       VREDUCE, VREDUCE_RND, VREDUCES, VREDUCES_RND,
437       // RndScale - Round FP Values To Include A Given Number Of Fraction Bits.
438       // Also used by the legacy (V)ROUND intrinsics where we mask out the
439       // scaling part of the immediate.
440       VRNDSCALE, VRNDSCALE_RND, VRNDSCALES, VRNDSCALES_RND,
441       // Tests Types Of a FP Values for packed types.
442       VFPCLASS,
443       // Tests Types Of a FP Values for scalar types.
444       VFPCLASSS,
445
446       // Broadcast scalar to vector.
447       VBROADCAST,
448       // Broadcast mask to vector.
449       VBROADCASTM,
450       // Broadcast subvector to vector.
451       SUBV_BROADCAST,
452
453       /// SSE4A Extraction and Insertion.
454       EXTRQI, INSERTQI,
455
456       // XOP arithmetic/logical shifts.
457       VPSHA, VPSHL,
458       // XOP signed/unsigned integer comparisons.
459       VPCOM, VPCOMU,
460       // XOP packed permute bytes.
461       VPPERM,
462       // XOP two source permutation.
463       VPERMIL2,
464
465       // Vector multiply packed unsigned doubleword integers.
466       PMULUDQ,
467       // Vector multiply packed signed doubleword integers.
468       PMULDQ,
469       // Vector Multiply Packed UnsignedIntegers with Round and Scale.
470       MULHRS,
471
472       // Multiply and Add Packed Integers.
473       VPMADDUBSW, VPMADDWD,
474
475       // AVX512IFMA multiply and add.
476       // NOTE: These are different than the instruction and perform
477       // op0 x op1 + op2.
478       VPMADD52L, VPMADD52H,
479
480       // VNNI
481       VPDPBUSD,
482       VPDPBUSDS,
483       VPDPWSSD,
484       VPDPWSSDS,
485
486       // FMA nodes.
487       // We use the target independent ISD::FMA for the non-inverted case.
488       FNMADD,
489       FMSUB,
490       FNMSUB,
491       FMADDSUB,
492       FMSUBADD,
493
494       // FMA with rounding mode.
495       FMADD_RND,
496       FNMADD_RND,
497       FMSUB_RND,
498       FNMSUB_RND,
499       FMADDSUB_RND,
500       FMSUBADD_RND,
501
502       // FMA4 specific scalar intrinsics bits that zero the non-scalar bits.
503       FMADD4S, FNMADD4S, FMSUB4S, FNMSUB4S,
504
505       // Scalar intrinsic FMA.
506       FMADDS1, FMADDS3,
507       FNMADDS1, FNMADDS3,
508       FMSUBS1, FMSUBS3,
509       FNMSUBS1, FNMSUBS3,
510
511       // Scalar intrinsic FMA with rounding mode.
512       // Two versions, passthru bits on op1 or op3.
513       FMADDS1_RND, FMADDS3_RND,
514       FNMADDS1_RND, FNMADDS3_RND,
515       FMSUBS1_RND, FMSUBS3_RND,
516       FNMSUBS1_RND, FNMSUBS3_RND,
517
518       // Compress and expand.
519       COMPRESS,
520       EXPAND,
521
522       // Bits shuffle
523       VPSHUFBITQMB,
524
525       // Convert Unsigned/Integer to Floating-Point Value with rounding mode.
526       SINT_TO_FP_RND, UINT_TO_FP_RND,
527       SCALAR_SINT_TO_FP_RND, SCALAR_UINT_TO_FP_RND,
528
529       // Vector float/double to signed/unsigned integer.
530       CVTP2SI, CVTP2UI, CVTP2SI_RND, CVTP2UI_RND,
531       // Scalar float/double to signed/unsigned integer.
532       CVTS2SI_RND, CVTS2UI_RND,
533
534       // Vector float/double to signed/unsigned integer with truncation.
535       CVTTP2SI, CVTTP2UI, CVTTP2SI_RND, CVTTP2UI_RND,
536       // Scalar float/double to signed/unsigned integer with truncation.
537       CVTTS2SI_RND, CVTTS2UI_RND,
538
539       // Vector signed/unsigned integer to float/double.
540       CVTSI2P, CVTUI2P,
541
542       // Save xmm argument registers to the stack, according to %al. An operator
543       // is needed so that this can be expanded with control flow.
544       VASTART_SAVE_XMM_REGS,
545
546       // Windows's _chkstk call to do stack probing.
547       WIN_ALLOCA,
548
549       // For allocating variable amounts of stack space when using
550       // segmented stacks. Check if the current stacklet has enough space, and
551       // falls back to heap allocation if not.
552       SEG_ALLOCA,
553
554       // Memory barriers.
555       MEMBARRIER,
556       MFENCE,
557
558       // Store FP status word into i16 register.
559       FNSTSW16r,
560
561       // Store contents of %ah into %eflags.
562       SAHF,
563
564       // Get a random integer and indicate whether it is valid in CF.
565       RDRAND,
566
567       // Get a NIST SP800-90B & C compliant random integer and
568       // indicate whether it is valid in CF.
569       RDSEED,
570
571       // SSE42 string comparisons.
572       PCMPISTRI,
573       PCMPESTRI,
574
575       // Test if in transactional execution.
576       XTEST,
577
578       // ERI instructions.
579       RSQRT28, RSQRT28S, RCP28, RCP28S, EXP2,
580
581       // Conversions between float and half-float.
582       CVTPS2PH, CVTPH2PS, CVTPH2PS_RND,
583
584       // Galois Field Arithmetic Instructions
585       GF2P8AFFINEINVQB, GF2P8AFFINEQB, GF2P8MULB,
586
587       // LWP insert record.
588       LWPINS,
589
590       // Compare and swap.
591       LCMPXCHG_DAG = ISD::FIRST_TARGET_MEMORY_OPCODE,
592       LCMPXCHG8_DAG,
593       LCMPXCHG16_DAG,
594       LCMPXCHG8_SAVE_EBX_DAG,
595       LCMPXCHG16_SAVE_RBX_DAG,
596
597       /// LOCK-prefixed arithmetic read-modify-write instructions.
598       /// EFLAGS, OUTCHAIN = LADD(INCHAIN, PTR, RHS)
599       LADD, LSUB, LOR, LXOR, LAND, LINC, LDEC,
600
601       // Load, scalar_to_vector, and zero extend.
602       VZEXT_LOAD,
603
604       // Store FP control world into i16 memory.
605       FNSTCW16m,
606
607       /// This instruction implements FP_TO_SINT with the
608       /// integer destination in memory and a FP reg source.  This corresponds
609       /// to the X86::FIST*m instructions and the rounding mode change stuff. It
610       /// has two inputs (token chain and address) and two outputs (int value
611       /// and token chain).
612       FP_TO_INT16_IN_MEM,
613       FP_TO_INT32_IN_MEM,
614       FP_TO_INT64_IN_MEM,
615
616       /// This instruction implements SINT_TO_FP with the
617       /// integer source in memory and FP reg result.  This corresponds to the
618       /// X86::FILD*m instructions. It has three inputs (token chain, address,
619       /// and source type) and two outputs (FP value and token chain). FILD_FLAG
620       /// also produces a flag).
621       FILD,
622       FILD_FLAG,
623
624       /// This instruction implements an extending load to FP stack slots.
625       /// This corresponds to the X86::FLD32m / X86::FLD64m. It takes a chain
626       /// operand, ptr to load from, and a ValueType node indicating the type
627       /// to load to.
628       FLD,
629
630       /// This instruction implements a truncating store to FP stack
631       /// slots. This corresponds to the X86::FST32m / X86::FST64m. It takes a
632       /// chain operand, value to store, address, and a ValueType to store it
633       /// as.
634       FST,
635
636       /// This instruction grabs the address of the next argument
637       /// from a va_list. (reads and modifies the va_list in memory)
638       VAARG_64,
639
640       // Vector truncating store with unsigned/signed saturation
641       VTRUNCSTOREUS, VTRUNCSTORES,
642       // Vector truncating masked store with unsigned/signed saturation
643       VMTRUNCSTOREUS, VMTRUNCSTORES,
644
645       // X86 specific gather and scatter
646       MGATHER, MSCATTER,
647
648       // WARNING: Do not add anything in the end unless you want the node to
649       // have memop! In fact, starting from FIRST_TARGET_MEMORY_OPCODE all
650       // opcodes will be thought as target memory ops!
651     };
652   } // end namespace X86ISD
653
654   /// Define some predicates that are used for node matching.
655   namespace X86 {
656     /// Returns true if Elt is a constant zero or floating point constant +0.0.
657     bool isZeroNode(SDValue Elt);
658
659     /// Returns true of the given offset can be
660     /// fit into displacement field of the instruction.
661     bool isOffsetSuitableForCodeModel(int64_t Offset, CodeModel::Model M,
662                                       bool hasSymbolicDisplacement = true);
663
664     /// Determines whether the callee is required to pop its
665     /// own arguments. Callee pop is necessary to support tail calls.
666     bool isCalleePop(CallingConv::ID CallingConv,
667                      bool is64Bit, bool IsVarArg, bool GuaranteeTCO);
668
669   } // end namespace X86
670
671   //===--------------------------------------------------------------------===//
672   //  X86 Implementation of the TargetLowering interface
673   class X86TargetLowering final : public TargetLowering {
674   public:
675     explicit X86TargetLowering(const X86TargetMachine &TM,
676                                const X86Subtarget &STI);
677
678     unsigned getJumpTableEncoding() const override;
679     bool useSoftFloat() const override;
680
681     void markLibCallAttributes(MachineFunction *MF, unsigned CC,
682                                ArgListTy &Args) const override;
683
684     MVT getScalarShiftAmountTy(const DataLayout &, EVT VT) const override {
685       return MVT::i8;
686     }
687
688     const MCExpr *
689     LowerCustomJumpTableEntry(const MachineJumpTableInfo *MJTI,
690                               const MachineBasicBlock *MBB, unsigned uid,
691                               MCContext &Ctx) const override;
692
693     /// Returns relocation base for the given PIC jumptable.
694     SDValue getPICJumpTableRelocBase(SDValue Table,
695                                      SelectionDAG &DAG) const override;
696     const MCExpr *
697     getPICJumpTableRelocBaseExpr(const MachineFunction *MF,
698                                  unsigned JTI, MCContext &Ctx) const override;
699
700     /// Return the desired alignment for ByVal aggregate
701     /// function arguments in the caller parameter area. For X86, aggregates
702     /// that contains are placed at 16-byte boundaries while the rest are at
703     /// 4-byte boundaries.
704     unsigned getByValTypeAlignment(Type *Ty,
705                                    const DataLayout &DL) const override;
706
707     /// Returns the target specific optimal type for load
708     /// and store operations as a result of memset, memcpy, and memmove
709     /// lowering. If DstAlign is zero that means it's safe to destination
710     /// alignment can satisfy any constraint. Similarly if SrcAlign is zero it
711     /// means there isn't a need to check it against alignment requirement,
712     /// probably because the source does not need to be loaded. If 'IsMemset' is
713     /// true, that means it's expanding a memset. If 'ZeroMemset' is true, that
714     /// means it's a memset of zero. 'MemcpyStrSrc' indicates whether the memcpy
715     /// source is constant so it does not need to be loaded.
716     /// It returns EVT::Other if the type should be determined using generic
717     /// target-independent logic.
718     EVT getOptimalMemOpType(uint64_t Size, unsigned DstAlign, unsigned SrcAlign,
719                             bool IsMemset, bool ZeroMemset, bool MemcpyStrSrc,
720                             MachineFunction &MF) const override;
721
722     /// Returns true if it's safe to use load / store of the
723     /// specified type to expand memcpy / memset inline. This is mostly true
724     /// for all types except for some special cases. For example, on X86
725     /// targets without SSE2 f64 load / store are done with fldl / fstpl which
726     /// also does type conversion. Note the specified type doesn't have to be
727     /// legal as the hook is used before type legalization.
728     bool isSafeMemOpType(MVT VT) const override;
729
730     /// Returns true if the target allows unaligned memory accesses of the
731     /// specified type. Returns whether it is "fast" in the last argument.
732     bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS, unsigned Align,
733                                        bool *Fast) const override;
734
735     /// Provide custom lowering hooks for some operations.
736     ///
737     SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
738
739     /// Places new result values for the node in Results (their number
740     /// and types must exactly match those of the original return values of
741     /// the node), or leaves Results empty, which indicates that the node is not
742     /// to be custom lowered after all.
743     void LowerOperationWrapper(SDNode *N,
744                                SmallVectorImpl<SDValue> &Results,
745                                SelectionDAG &DAG) const override;
746
747     /// Replace the results of node with an illegal result
748     /// type with new values built out of custom code.
749     ///
750     void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results,
751                             SelectionDAG &DAG) const override;
752
753     SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
754
755     // Return true if it is profitable to combine a BUILD_VECTOR with a
756     // stride-pattern to a shuffle and a truncate.
757     // Example of such a combine:
758     // v4i32 build_vector((extract_elt V, 1),
759     //                    (extract_elt V, 3),
760     //                    (extract_elt V, 5),
761     //                    (extract_elt V, 7))
762     //  -->
763     // v4i32 truncate (bitcast (shuffle<1,u,3,u,4,u,5,u,6,u,7,u> V, u) to
764     // v4i64)
765     bool isDesirableToCombineBuildVectorToShuffleTruncate(
766         ArrayRef<int> ShuffleMask, EVT SrcVT, EVT TruncVT) const override;
767
768     /// Return true if the target has native support for
769     /// the specified value type and it is 'desirable' to use the type for the
770     /// given node type. e.g. On x86 i16 is legal, but undesirable since i16
771     /// instruction encodings are longer and some i16 instructions are slow.
772     bool isTypeDesirableForOp(unsigned Opc, EVT VT) const override;
773
774     /// Return true if the target has native support for the
775     /// specified value type and it is 'desirable' to use the type. e.g. On x86
776     /// i16 is legal, but undesirable since i16 instruction encodings are longer
777     /// and some i16 instructions are slow.
778     bool IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const override;
779
780     MachineBasicBlock *
781     EmitInstrWithCustomInserter(MachineInstr &MI,
782                                 MachineBasicBlock *MBB) const override;
783
784     /// This method returns the name of a target specific DAG node.
785     const char *getTargetNodeName(unsigned Opcode) const override;
786
787     bool mergeStoresAfterLegalization() const override { return true; }
788
789     bool canMergeStoresTo(unsigned AddressSpace, EVT MemVT,
790                           const SelectionDAG &DAG) const override;
791
792     bool isCheapToSpeculateCttz() const override;
793
794     bool isCheapToSpeculateCtlz() const override;
795
796     bool isCtlzFast() const override;
797
798     bool hasBitPreservingFPLogic(EVT VT) const override {
799       return VT == MVT::f32 || VT == MVT::f64 || VT.isVector();
800     }
801
802     bool isMultiStoresCheaperThanBitsMerge(EVT LTy, EVT HTy) const override {
803       // If the pair to store is a mixture of float and int values, we will
804       // save two bitwise instructions and one float-to-int instruction and
805       // increase one store instruction. There is potentially a more
806       // significant benefit because it avoids the float->int domain switch
807       // for input value. So It is more likely a win.
808       if ((LTy.isFloatingPoint() && HTy.isInteger()) ||
809           (LTy.isInteger() && HTy.isFloatingPoint()))
810         return true;
811       // If the pair only contains int values, we will save two bitwise
812       // instructions and increase one store instruction (costing one more
813       // store buffer). Since the benefit is more blurred so we leave
814       // such pair out until we get testcase to prove it is a win.
815       return false;
816     }
817
818     bool isMaskAndCmp0FoldingBeneficial(const Instruction &AndI) const override;
819
820     bool hasAndNotCompare(SDValue Y) const override;
821
822     bool convertSetCCLogicToBitwiseLogic(EVT VT) const override {
823       return VT.isScalarInteger();
824     }
825
826     /// Vector-sized comparisons are fast using PCMPEQ + PMOVMSK or PTEST.
827     MVT hasFastEqualityCompare(unsigned NumBits) const override;
828
829     /// Allow multiple load pairs per block for smaller and faster code.
830     unsigned getMemcmpEqZeroLoadsPerBlock() const override {
831       return 2;
832     }
833
834     /// Return the value type to use for ISD::SETCC.
835     EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context,
836                            EVT VT) const override;
837
838     bool targetShrinkDemandedConstant(SDValue Op, const APInt &Demanded,
839                                       TargetLoweringOpt &TLO) const override;
840
841     /// Determine which of the bits specified in Mask are known to be either
842     /// zero or one and return them in the KnownZero/KnownOne bitsets.
843     void computeKnownBitsForTargetNode(const SDValue Op,
844                                        KnownBits &Known,
845                                        const APInt &DemandedElts,
846                                        const SelectionDAG &DAG,
847                                        unsigned Depth = 0) const override;
848
849     /// Determine the number of bits in the operation that are sign bits.
850     unsigned ComputeNumSignBitsForTargetNode(SDValue Op,
851                                              const APInt &DemandedElts,
852                                              const SelectionDAG &DAG,
853                                              unsigned Depth) const override;
854
855     SDValue unwrapAddress(SDValue N) const override;
856
857     bool isGAPlusOffset(SDNode *N, const GlobalValue* &GA,
858                         int64_t &Offset) const override;
859
860     SDValue getReturnAddressFrameIndex(SelectionDAG &DAG) const;
861
862     bool ExpandInlineAsm(CallInst *CI) const override;
863
864     ConstraintType getConstraintType(StringRef Constraint) const override;
865
866     /// Examine constraint string and operand type and determine a weight value.
867     /// The operand object must already have been set up with the operand type.
868     ConstraintWeight
869       getSingleConstraintMatchWeight(AsmOperandInfo &info,
870                                      const char *constraint) const override;
871
872     const char *LowerXConstraint(EVT ConstraintVT) const override;
873
874     /// Lower the specified operand into the Ops vector. If it is invalid, don't
875     /// add anything to Ops. If hasMemory is true it means one of the asm
876     /// constraint of the inline asm instruction being processed is 'm'.
877     void LowerAsmOperandForConstraint(SDValue Op,
878                                       std::string &Constraint,
879                                       std::vector<SDValue> &Ops,
880                                       SelectionDAG &DAG) const override;
881
882     unsigned
883     getInlineAsmMemConstraint(StringRef ConstraintCode) const override {
884       if (ConstraintCode == "i")
885         return InlineAsm::Constraint_i;
886       else if (ConstraintCode == "o")
887         return InlineAsm::Constraint_o;
888       else if (ConstraintCode == "v")
889         return InlineAsm::Constraint_v;
890       else if (ConstraintCode == "X")
891         return InlineAsm::Constraint_X;
892       return TargetLowering::getInlineAsmMemConstraint(ConstraintCode);
893     }
894
895     /// Given a physical register constraint
896     /// (e.g. {edx}), return the register number and the register class for the
897     /// register.  This should only be used for C_Register constraints.  On
898     /// error, this returns a register number of 0.
899     std::pair<unsigned, const TargetRegisterClass *>
900     getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
901                                  StringRef Constraint, MVT VT) const override;
902
903     /// Return true if the addressing mode represented
904     /// by AM is legal for this target, for a load/store of the specified type.
905     bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM,
906                                Type *Ty, unsigned AS,
907                                Instruction *I = nullptr) const override;
908
909     /// Return true if the specified immediate is legal
910     /// icmp immediate, that is the target has icmp instructions which can
911     /// compare a register against the immediate without having to materialize
912     /// the immediate into a register.
913     bool isLegalICmpImmediate(int64_t Imm) const override;
914
915     /// Return true if the specified immediate is legal
916     /// add immediate, that is the target has add instructions which can
917     /// add a register and the immediate without having to materialize
918     /// the immediate into a register.
919     bool isLegalAddImmediate(int64_t Imm) const override;
920
921     /// \brief Return the cost of the scaling factor used in the addressing
922     /// mode represented by AM for this target, for a load/store
923     /// of the specified type.
924     /// If the AM is supported, the return value must be >= 0.
925     /// If the AM is not supported, it returns a negative value.
926     int getScalingFactorCost(const DataLayout &DL, const AddrMode &AM, Type *Ty,
927                              unsigned AS) const override;
928
929     bool isVectorShiftByScalarCheap(Type *Ty) const override;
930
931     /// Return true if it's free to truncate a value of
932     /// type Ty1 to type Ty2. e.g. On x86 it's free to truncate a i32 value in
933     /// register EAX to i16 by referencing its sub-register AX.
934     bool isTruncateFree(Type *Ty1, Type *Ty2) const override;
935     bool isTruncateFree(EVT VT1, EVT VT2) const override;
936
937     bool allowTruncateForTailCall(Type *Ty1, Type *Ty2) const override;
938
939     /// Return true if any actual instruction that defines a
940     /// value of type Ty1 implicit zero-extends the value to Ty2 in the result
941     /// register. This does not necessarily include registers defined in
942     /// unknown ways, such as incoming arguments, or copies from unknown
943     /// virtual registers. Also, if isTruncateFree(Ty2, Ty1) is true, this
944     /// does not necessarily apply to truncate instructions. e.g. on x86-64,
945     /// all instructions that define 32-bit values implicit zero-extend the
946     /// result out to 64 bits.
947     bool isZExtFree(Type *Ty1, Type *Ty2) const override;
948     bool isZExtFree(EVT VT1, EVT VT2) const override;
949     bool isZExtFree(SDValue Val, EVT VT2) const override;
950
951     /// Return true if folding a vector load into ExtVal (a sign, zero, or any
952     /// extend node) is profitable.
953     bool isVectorLoadExtDesirable(SDValue) const override;
954
955     /// Return true if an FMA operation is faster than a pair of fmul and fadd
956     /// instructions. fmuladd intrinsics will be expanded to FMAs when this
957     /// method returns true, otherwise fmuladd is expanded to fmul + fadd.
958     bool isFMAFasterThanFMulAndFAdd(EVT VT) const override;
959
960     /// Return true if it's profitable to narrow
961     /// operations of type VT1 to VT2. e.g. on x86, it's profitable to narrow
962     /// from i32 to i8 but not from i32 to i16.
963     bool isNarrowingProfitable(EVT VT1, EVT VT2) const override;
964
965     /// Given an intrinsic, checks if on the target the intrinsic will need to map
966     /// to a MemIntrinsicNode (touches memory). If this is the case, it returns
967     /// true and stores the intrinsic information into the IntrinsicInfo that was
968     /// passed to the function.
969     bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallInst &I,
970                             MachineFunction &MF,
971                             unsigned Intrinsic) const override;
972
973     /// Returns true if the target can instruction select the
974     /// specified FP immediate natively. If false, the legalizer will
975     /// materialize the FP immediate as a load from a constant pool.
976     bool isFPImmLegal(const APFloat &Imm, EVT VT) const override;
977
978     /// Targets can use this to indicate that they only support *some*
979     /// VECTOR_SHUFFLE operations, those with specific masks. By default, if a
980     /// target supports the VECTOR_SHUFFLE node, all mask values are assumed to
981     /// be legal.
982     bool isShuffleMaskLegal(ArrayRef<int> Mask, EVT VT) const override;
983
984     /// Similar to isShuffleMaskLegal. This is used by Targets can use this to
985     /// indicate if there is a suitable VECTOR_SHUFFLE that can be used to
986     /// replace a VAND with a constant pool entry.
987     bool isVectorClearMaskLegal(const SmallVectorImpl<int> &Mask,
988                                 EVT VT) const override;
989
990     /// Returns true if lowering to a jump table is allowed.
991     bool areJTsAllowed(const Function *Fn) const override;
992
993     /// If true, then instruction selection should
994     /// seek to shrink the FP constant of the specified type to a smaller type
995     /// in order to save space and / or reduce runtime.
996     bool ShouldShrinkFPConstant(EVT VT) const override {
997       // Don't shrink FP constpool if SSE2 is available since cvtss2sd is more
998       // expensive than a straight movsd. On the other hand, it's important to
999       // shrink long double fp constant since fldt is very slow.
1000       return !X86ScalarSSEf64 || VT == MVT::f80;
1001     }
1002
1003     /// Return true if we believe it is correct and profitable to reduce the
1004     /// load node to a smaller type.
1005     bool shouldReduceLoadWidth(SDNode *Load, ISD::LoadExtType ExtTy,
1006                                EVT NewVT) const override;
1007
1008     /// Return true if the specified scalar FP type is computed in an SSE
1009     /// register, not on the X87 floating point stack.
1010     bool isScalarFPTypeInSSEReg(EVT VT) const {
1011       return (VT == MVT::f64 && X86ScalarSSEf64) || // f64 is when SSE2
1012              (VT == MVT::f32 && X86ScalarSSEf32);   // f32 is when SSE1
1013     }
1014
1015     /// \brief Returns true if it is beneficial to convert a load of a constant
1016     /// to just the constant itself.
1017     bool shouldConvertConstantLoadToIntImm(const APInt &Imm,
1018                                            Type *Ty) const override;
1019
1020     bool convertSelectOfConstantsToMath(EVT VT) const override;
1021
1022     /// Return true if EXTRACT_SUBVECTOR is cheap for this result type
1023     /// with this index.
1024     bool isExtractSubvectorCheap(EVT ResVT, EVT SrcVT,
1025                                  unsigned Index) const override;
1026
1027     bool storeOfVectorConstantIsCheap(EVT MemVT, unsigned NumElem,
1028                                       unsigned AddrSpace) const override {
1029       // If we can replace more than 2 scalar stores, there will be a reduction
1030       // in instructions even after we add a vector constant load.
1031       return NumElem > 2;
1032     }
1033
1034     bool isLoadBitCastBeneficial(EVT LoadVT, EVT BitcastVT) const override;
1035
1036     /// Intel processors have a unified instruction and data cache
1037     const char * getClearCacheBuiltinName() const override {
1038       return nullptr; // nothing to do, move along.
1039     }
1040
1041     unsigned getRegisterByName(const char* RegName, EVT VT,
1042                                SelectionDAG &DAG) const override;
1043
1044     /// If a physical register, this returns the register that receives the
1045     /// exception address on entry to an EH pad.
1046     unsigned
1047     getExceptionPointerRegister(const Constant *PersonalityFn) const override;
1048
1049     /// If a physical register, this returns the register that receives the
1050     /// exception typeid on entry to a landing pad.
1051     unsigned
1052     getExceptionSelectorRegister(const Constant *PersonalityFn) const override;
1053
1054     virtual bool needsFixedCatchObjects() const override;
1055
1056     /// This method returns a target specific FastISel object,
1057     /// or null if the target does not support "fast" ISel.
1058     FastISel *createFastISel(FunctionLoweringInfo &funcInfo,
1059                              const TargetLibraryInfo *libInfo) const override;
1060
1061     /// If the target has a standard location for the stack protector cookie,
1062     /// returns the address of that location. Otherwise, returns nullptr.
1063     Value *getIRStackGuard(IRBuilder<> &IRB) const override;
1064
1065     bool useLoadStackGuardNode() const override;
1066     bool useStackGuardXorFP() const override;
1067     void insertSSPDeclarations(Module &M) const override;
1068     Value *getSDagStackGuard(const Module &M) const override;
1069     Value *getSSPStackGuardCheck(const Module &M) const override;
1070     SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val,
1071                                 const SDLoc &DL) const override;
1072
1073
1074     /// Return true if the target stores SafeStack pointer at a fixed offset in
1075     /// some non-standard address space, and populates the address space and
1076     /// offset as appropriate.
1077     Value *getSafeStackPointerLocation(IRBuilder<> &IRB) const override;
1078
1079     SDValue BuildFILD(SDValue Op, EVT SrcVT, SDValue Chain, SDValue StackSlot,
1080                       SelectionDAG &DAG) const;
1081
1082     bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override;
1083
1084     /// \brief Customize the preferred legalization strategy for certain types.
1085     LegalizeTypeAction getPreferredVectorAction(EVT VT) const override;
1086
1087     MVT getRegisterTypeForCallingConv(MVT VT) const override;
1088
1089     MVT getRegisterTypeForCallingConv(LLVMContext &Context,
1090                                       EVT VT) const override;
1091
1092     unsigned getNumRegistersForCallingConv(LLVMContext &Context,
1093                                            EVT VT) const override;
1094
1095     bool isIntDivCheap(EVT VT, AttributeList Attr) const override;
1096
1097     bool supportSwiftError() const override;
1098
1099     StringRef getStackProbeSymbolName(MachineFunction &MF) const override;
1100
1101     bool hasVectorBlend() const override { return true; }
1102
1103     unsigned getMaxSupportedInterleaveFactor() const override { return 4; }
1104
1105     /// \brief Lower interleaved load(s) into target specific
1106     /// instructions/intrinsics.
1107     bool lowerInterleavedLoad(LoadInst *LI,
1108                               ArrayRef<ShuffleVectorInst *> Shuffles,
1109                               ArrayRef<unsigned> Indices,
1110                               unsigned Factor) const override;
1111
1112     /// \brief Lower interleaved store(s) into target specific
1113     /// instructions/intrinsics.
1114     bool lowerInterleavedStore(StoreInst *SI, ShuffleVectorInst *SVI,
1115                                unsigned Factor) const override;
1116
1117
1118     void finalizeLowering(MachineFunction &MF) const override;
1119
1120   protected:
1121     std::pair<const TargetRegisterClass *, uint8_t>
1122     findRepresentativeClass(const TargetRegisterInfo *TRI,
1123                             MVT VT) const override;
1124
1125   private:
1126     /// Keep a reference to the X86Subtarget around so that we can
1127     /// make the right decision when generating code for different targets.
1128     const X86Subtarget &Subtarget;
1129
1130     /// Select between SSE or x87 floating point ops.
1131     /// When SSE is available, use it for f32 operations.
1132     /// When SSE2 is available, use it for f64 operations.
1133     bool X86ScalarSSEf32;
1134     bool X86ScalarSSEf64;
1135
1136     /// A list of legal FP immediates.
1137     std::vector<APFloat> LegalFPImmediates;
1138
1139     /// Indicate that this x86 target can instruction
1140     /// select the specified FP immediate natively.
1141     void addLegalFPImmediate(const APFloat& Imm) {
1142       LegalFPImmediates.push_back(Imm);
1143     }
1144
1145     SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
1146                             CallingConv::ID CallConv, bool isVarArg,
1147                             const SmallVectorImpl<ISD::InputArg> &Ins,
1148                             const SDLoc &dl, SelectionDAG &DAG,
1149                             SmallVectorImpl<SDValue> &InVals,
1150                             uint32_t *RegMask) const;
1151     SDValue LowerMemArgument(SDValue Chain, CallingConv::ID CallConv,
1152                              const SmallVectorImpl<ISD::InputArg> &ArgInfo,
1153                              const SDLoc &dl, SelectionDAG &DAG,
1154                              const CCValAssign &VA, MachineFrameInfo &MFI,
1155                              unsigned i) const;
1156     SDValue LowerMemOpCallTo(SDValue Chain, SDValue StackPtr, SDValue Arg,
1157                              const SDLoc &dl, SelectionDAG &DAG,
1158                              const CCValAssign &VA,
1159                              ISD::ArgFlagsTy Flags) const;
1160
1161     // Call lowering helpers.
1162
1163     /// Check whether the call is eligible for tail call optimization. Targets
1164     /// that want to do tail call optimization should implement this function.
1165     bool IsEligibleForTailCallOptimization(SDValue Callee,
1166                                            CallingConv::ID CalleeCC,
1167                                            bool isVarArg,
1168                                            bool isCalleeStructRet,
1169                                            bool isCallerStructRet,
1170                                            Type *RetTy,
1171                                     const SmallVectorImpl<ISD::OutputArg> &Outs,
1172                                     const SmallVectorImpl<SDValue> &OutVals,
1173                                     const SmallVectorImpl<ISD::InputArg> &Ins,
1174                                            SelectionDAG& DAG) const;
1175     SDValue EmitTailCallLoadRetAddr(SelectionDAG &DAG, SDValue &OutRetAddr,
1176                                     SDValue Chain, bool IsTailCall,
1177                                     bool Is64Bit, int FPDiff,
1178                                     const SDLoc &dl) const;
1179
1180     unsigned GetAlignedArgumentStackSize(unsigned StackSize,
1181                                          SelectionDAG &DAG) const;
1182
1183     unsigned getAddressSpace(void) const;
1184
1185     std::pair<SDValue,SDValue> FP_TO_INTHelper(SDValue Op, SelectionDAG &DAG,
1186                                                bool isSigned,
1187                                                bool isReplace) const;
1188
1189     SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
1190     SDValue LowerVSELECT(SDValue Op, SelectionDAG &DAG) const;
1191     SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
1192     SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
1193
1194     unsigned getGlobalWrapperKind(const GlobalValue *GV = nullptr) const;
1195     SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
1196     SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
1197     SDValue LowerGlobalAddress(const GlobalValue *GV, const SDLoc &dl,
1198                                int64_t Offset, SelectionDAG &DAG) const;
1199     SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
1200     SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
1201     SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
1202
1203     SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
1204     SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
1205     SDValue LowerTRUNCATE(SDValue Op, SelectionDAG &DAG) const;
1206     SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
1207     SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
1208     SDValue LowerSETCCCARRY(SDValue Op, SelectionDAG &DAG) const;
1209     SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
1210     SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
1211     SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
1212     SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
1213     SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
1214     SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
1215     SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
1216     SDValue LowerADDROFRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
1217     SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
1218     SDValue LowerFRAME_TO_ARGS_OFFSET(SDValue Op, SelectionDAG &DAG) const;
1219     SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
1220     SDValue lowerEH_SJLJ_SETJMP(SDValue Op, SelectionDAG &DAG) const;
1221     SDValue lowerEH_SJLJ_LONGJMP(SDValue Op, SelectionDAG &DAG) const;
1222     SDValue lowerEH_SJLJ_SETUP_DISPATCH(SDValue Op, SelectionDAG &DAG) const;
1223     SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
1224     SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG) const;
1225     SDValue LowerWin64_i128OP(SDValue Op, SelectionDAG &DAG) const;
1226     SDValue LowerGC_TRANSITION_START(SDValue Op, SelectionDAG &DAG) const;
1227     SDValue LowerGC_TRANSITION_END(SDValue Op, SelectionDAG &DAG) const;
1228     SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
1229
1230     SDValue
1231     LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1232                          const SmallVectorImpl<ISD::InputArg> &Ins,
1233                          const SDLoc &dl, SelectionDAG &DAG,
1234                          SmallVectorImpl<SDValue> &InVals) const override;
1235     SDValue LowerCall(CallLoweringInfo &CLI,
1236                       SmallVectorImpl<SDValue> &InVals) const override;
1237
1238     SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
1239                         const SmallVectorImpl<ISD::OutputArg> &Outs,
1240                         const SmallVectorImpl<SDValue> &OutVals,
1241                         const SDLoc &dl, SelectionDAG &DAG) const override;
1242
1243     bool supportSplitCSR(MachineFunction *MF) const override {
1244       return MF->getFunction().getCallingConv() == CallingConv::CXX_FAST_TLS &&
1245           MF->getFunction().hasFnAttribute(Attribute::NoUnwind);
1246     }
1247     void initializeSplitCSR(MachineBasicBlock *Entry) const override;
1248     void insertCopiesSplitCSR(
1249       MachineBasicBlock *Entry,
1250       const SmallVectorImpl<MachineBasicBlock *> &Exits) const override;
1251
1252     bool isUsedByReturnOnly(SDNode *N, SDValue &Chain) const override;
1253
1254     bool mayBeEmittedAsTailCall(const CallInst *CI) const override;
1255
1256     EVT getTypeForExtReturn(LLVMContext &Context, EVT VT,
1257                             ISD::NodeType ExtendKind) const override;
1258
1259     bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
1260                         bool isVarArg,
1261                         const SmallVectorImpl<ISD::OutputArg> &Outs,
1262                         LLVMContext &Context) const override;
1263
1264     const MCPhysReg *getScratchRegisters(CallingConv::ID CC) const override;
1265
1266     TargetLoweringBase::AtomicExpansionKind
1267     shouldExpandAtomicLoadInIR(LoadInst *SI) const override;
1268     bool shouldExpandAtomicStoreInIR(StoreInst *SI) const override;
1269     TargetLoweringBase::AtomicExpansionKind
1270     shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const override;
1271
1272     LoadInst *
1273     lowerIdempotentRMWIntoFencedLoad(AtomicRMWInst *AI) const override;
1274
1275     bool needsCmpXchgNb(Type *MemType) const;
1276
1277     void SetupEntryBlockForSjLj(MachineInstr &MI, MachineBasicBlock *MBB,
1278                                 MachineBasicBlock *DispatchBB, int FI) const;
1279
1280     // Utility function to emit the low-level va_arg code for X86-64.
1281     MachineBasicBlock *
1282     EmitVAARG64WithCustomInserter(MachineInstr &MI,
1283                                   MachineBasicBlock *MBB) const;
1284
1285     /// Utility function to emit the xmm reg save portion of va_start.
1286     MachineBasicBlock *
1287     EmitVAStartSaveXMMRegsWithCustomInserter(MachineInstr &BInstr,
1288                                              MachineBasicBlock *BB) const;
1289
1290     MachineBasicBlock *EmitLoweredCascadedSelect(MachineInstr &MI1,
1291                                                  MachineInstr &MI2,
1292                                                  MachineBasicBlock *BB) const;
1293
1294     MachineBasicBlock *EmitLoweredSelect(MachineInstr &I,
1295                                          MachineBasicBlock *BB) const;
1296
1297     MachineBasicBlock *EmitLoweredAtomicFP(MachineInstr &I,
1298                                            MachineBasicBlock *BB) const;
1299
1300     MachineBasicBlock *EmitLoweredCatchRet(MachineInstr &MI,
1301                                            MachineBasicBlock *BB) const;
1302
1303     MachineBasicBlock *EmitLoweredCatchPad(MachineInstr &MI,
1304                                            MachineBasicBlock *BB) const;
1305
1306     MachineBasicBlock *EmitLoweredSegAlloca(MachineInstr &MI,
1307                                             MachineBasicBlock *BB) const;
1308
1309     MachineBasicBlock *EmitLoweredTLSAddr(MachineInstr &MI,
1310                                           MachineBasicBlock *BB) const;
1311
1312     MachineBasicBlock *EmitLoweredTLSCall(MachineInstr &MI,
1313                                           MachineBasicBlock *BB) const;
1314
1315     MachineBasicBlock *EmitLoweredRetpoline(MachineInstr &MI,
1316                                             MachineBasicBlock *BB) const;
1317
1318     MachineBasicBlock *emitEHSjLjSetJmp(MachineInstr &MI,
1319                                         MachineBasicBlock *MBB) const;
1320
1321     MachineBasicBlock *emitEHSjLjLongJmp(MachineInstr &MI,
1322                                          MachineBasicBlock *MBB) const;
1323
1324     MachineBasicBlock *emitFMA3Instr(MachineInstr &MI,
1325                                      MachineBasicBlock *MBB) const;
1326
1327     MachineBasicBlock *EmitSjLjDispatchBlock(MachineInstr &MI,
1328                                              MachineBasicBlock *MBB) const;
1329
1330     /// Emit nodes that will be selected as "test Op0,Op0", or something
1331     /// equivalent, for use with the given x86 condition code.
1332     SDValue EmitTest(SDValue Op0, unsigned X86CC, const SDLoc &dl,
1333                      SelectionDAG &DAG) const;
1334
1335     /// Emit nodes that will be selected as "cmp Op0,Op1", or something
1336     /// equivalent, for use with the given x86 condition code.
1337     SDValue EmitCmp(SDValue Op0, SDValue Op1, unsigned X86CC, const SDLoc &dl,
1338                     SelectionDAG &DAG) const;
1339
1340     /// Convert a comparison if required by the subtarget.
1341     SDValue ConvertCmpIfNecessary(SDValue Cmp, SelectionDAG &DAG) const;
1342
1343     /// Check if replacement of SQRT with RSQRT should be disabled.
1344     bool isFsqrtCheap(SDValue Operand, SelectionDAG &DAG) const override;
1345
1346     /// Use rsqrt* to speed up sqrt calculations.
1347     SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
1348                             int &RefinementSteps, bool &UseOneConstNR,
1349                             bool Reciprocal) const override;
1350
1351     /// Use rcp* to speed up fdiv calculations.
1352     SDValue getRecipEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
1353                              int &RefinementSteps) const override;
1354
1355     /// Reassociate floating point divisions into multiply by reciprocal.
1356     unsigned combineRepeatedFPDivisors() const override;
1357   };
1358
1359   namespace X86 {
1360     FastISel *createFastISel(FunctionLoweringInfo &funcInfo,
1361                              const TargetLibraryInfo *libInfo);
1362   } // end namespace X86
1363
1364   // Base class for all X86 non-masked store operations.
1365   class X86StoreSDNode : public MemSDNode {
1366   public:
1367     X86StoreSDNode(unsigned Opcode, unsigned Order, const DebugLoc &dl,
1368                    SDVTList VTs, EVT MemVT,
1369                    MachineMemOperand *MMO)
1370       :MemSDNode(Opcode, Order, dl, VTs, MemVT, MMO) {}
1371     const SDValue &getValue() const { return getOperand(1); }
1372     const SDValue &getBasePtr() const { return getOperand(2); }
1373
1374     static bool classof(const SDNode *N) {
1375       return N->getOpcode() == X86ISD::VTRUNCSTORES ||
1376         N->getOpcode() == X86ISD::VTRUNCSTOREUS;
1377     }
1378   };
1379
1380   // Base class for all X86 masked store operations.
1381   // The class has the same order of operands as MaskedStoreSDNode for
1382   // convenience.
1383   class X86MaskedStoreSDNode : public MemSDNode {
1384   public:
1385     X86MaskedStoreSDNode(unsigned Opcode, unsigned Order,
1386                          const DebugLoc &dl, SDVTList VTs, EVT MemVT,
1387                          MachineMemOperand *MMO)
1388       : MemSDNode(Opcode, Order, dl, VTs, MemVT, MMO) {}
1389
1390     const SDValue &getBasePtr() const { return getOperand(1); }
1391     const SDValue &getMask()    const { return getOperand(2); }
1392     const SDValue &getValue()   const { return getOperand(3); }
1393
1394     static bool classof(const SDNode *N) {
1395       return N->getOpcode() == X86ISD::VMTRUNCSTORES ||
1396         N->getOpcode() == X86ISD::VMTRUNCSTOREUS;
1397     }
1398   };
1399
1400   // X86 Truncating Store with Signed saturation.
1401   class TruncSStoreSDNode : public X86StoreSDNode {
1402   public:
1403     TruncSStoreSDNode(unsigned Order, const DebugLoc &dl,
1404                         SDVTList VTs, EVT MemVT, MachineMemOperand *MMO)
1405       : X86StoreSDNode(X86ISD::VTRUNCSTORES, Order, dl, VTs, MemVT, MMO) {}
1406
1407     static bool classof(const SDNode *N) {
1408       return N->getOpcode() == X86ISD::VTRUNCSTORES;
1409     }
1410   };
1411
1412   // X86 Truncating Store with Unsigned saturation.
1413   class TruncUSStoreSDNode : public X86StoreSDNode {
1414   public:
1415     TruncUSStoreSDNode(unsigned Order, const DebugLoc &dl,
1416                       SDVTList VTs, EVT MemVT, MachineMemOperand *MMO)
1417       : X86StoreSDNode(X86ISD::VTRUNCSTOREUS, Order, dl, VTs, MemVT, MMO) {}
1418
1419     static bool classof(const SDNode *N) {
1420       return N->getOpcode() == X86ISD::VTRUNCSTOREUS;
1421     }
1422   };
1423
1424   // X86 Truncating Masked Store with Signed saturation.
1425   class MaskedTruncSStoreSDNode : public X86MaskedStoreSDNode {
1426   public:
1427     MaskedTruncSStoreSDNode(unsigned Order,
1428                          const DebugLoc &dl, SDVTList VTs, EVT MemVT,
1429                          MachineMemOperand *MMO)
1430       : X86MaskedStoreSDNode(X86ISD::VMTRUNCSTORES, Order, dl, VTs, MemVT, MMO) {}
1431
1432     static bool classof(const SDNode *N) {
1433       return N->getOpcode() == X86ISD::VMTRUNCSTORES;
1434     }
1435   };
1436
1437   // X86 Truncating Masked Store with Unsigned saturation.
1438   class MaskedTruncUSStoreSDNode : public X86MaskedStoreSDNode {
1439   public:
1440     MaskedTruncUSStoreSDNode(unsigned Order,
1441                             const DebugLoc &dl, SDVTList VTs, EVT MemVT,
1442                             MachineMemOperand *MMO)
1443       : X86MaskedStoreSDNode(X86ISD::VMTRUNCSTOREUS, Order, dl, VTs, MemVT, MMO) {}
1444
1445     static bool classof(const SDNode *N) {
1446       return N->getOpcode() == X86ISD::VMTRUNCSTOREUS;
1447     }
1448   };
1449
1450   // X86 specific Gather/Scatter nodes.
1451   // The class has the same order of operands as MaskedGatherScatterSDNode for
1452   // convenience.
1453   class X86MaskedGatherScatterSDNode : public MemSDNode {
1454   public:
1455     X86MaskedGatherScatterSDNode(unsigned Opc, unsigned Order,
1456                                  const DebugLoc &dl, SDVTList VTs, EVT MemVT,
1457                                  MachineMemOperand *MMO)
1458         : MemSDNode(Opc, Order, dl, VTs, MemVT, MMO) {}
1459
1460     const SDValue &getBasePtr() const { return getOperand(3); }
1461     const SDValue &getIndex()   const { return getOperand(4); }
1462     const SDValue &getMask()    const { return getOperand(2); }
1463     const SDValue &getValue()   const { return getOperand(1); }
1464     const SDValue &getScale()   const { return getOperand(5); }
1465
1466     static bool classof(const SDNode *N) {
1467       return N->getOpcode() == X86ISD::MGATHER ||
1468              N->getOpcode() == X86ISD::MSCATTER;
1469     }
1470   };
1471
1472   class X86MaskedGatherSDNode : public X86MaskedGatherScatterSDNode {
1473   public:
1474     X86MaskedGatherSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs,
1475                           EVT MemVT, MachineMemOperand *MMO)
1476         : X86MaskedGatherScatterSDNode(X86ISD::MGATHER, Order, dl, VTs, MemVT,
1477                                        MMO) {}
1478
1479     static bool classof(const SDNode *N) {
1480       return N->getOpcode() == X86ISD::MGATHER;
1481     }
1482   };
1483
1484   class X86MaskedScatterSDNode : public X86MaskedGatherScatterSDNode {
1485   public:
1486     X86MaskedScatterSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs,
1487                            EVT MemVT, MachineMemOperand *MMO)
1488         : X86MaskedGatherScatterSDNode(X86ISD::MSCATTER, Order, dl, VTs, MemVT,
1489                                        MMO) {}
1490
1491     static bool classof(const SDNode *N) {
1492       return N->getOpcode() == X86ISD::MSCATTER;
1493     }
1494   };
1495
1496   /// Generate unpacklo/unpackhi shuffle mask.
1497   template <typename T = int>
1498   void createUnpackShuffleMask(MVT VT, SmallVectorImpl<T> &Mask, bool Lo,
1499                                bool Unary) {
1500     assert(Mask.empty() && "Expected an empty shuffle mask vector");
1501     int NumElts = VT.getVectorNumElements();
1502     int NumEltsInLane = 128 / VT.getScalarSizeInBits();
1503     for (int i = 0; i < NumElts; ++i) {
1504       unsigned LaneStart = (i / NumEltsInLane) * NumEltsInLane;
1505       int Pos = (i % NumEltsInLane) / 2 + LaneStart;
1506       Pos += (Unary ? 0 : NumElts * (i % 2));
1507       Pos += (Lo ? 0 : NumEltsInLane / 2);
1508       Mask.push_back(Pos);
1509     }
1510   }
1511
1512   /// Helper function to scale a shuffle or target shuffle mask, replacing each
1513   /// mask index with the scaled sequential indices for an equivalent narrowed
1514   /// mask. This is the reverse process to canWidenShuffleElements, but can
1515   /// always succeed.
1516   template <typename T>
1517   void scaleShuffleMask(int Scale, ArrayRef<T> Mask,
1518                         SmallVectorImpl<T> &ScaledMask) {
1519     assert(0 < Scale && "Unexpected scaling factor");
1520     int NumElts = Mask.size();
1521     ScaledMask.assign(static_cast<size_t>(NumElts * Scale), -1);
1522
1523     for (int i = 0; i != NumElts; ++i) {
1524       int M = Mask[i];
1525
1526       // Repeat sentinel values in every mask element.
1527       if (M < 0) {
1528         for (int s = 0; s != Scale; ++s)
1529           ScaledMask[(Scale * i) + s] = M;
1530         continue;
1531       }
1532
1533       // Scale mask element and increment across each mask element.
1534       for (int s = 0; s != Scale; ++s)
1535         ScaledMask[(Scale * i) + s] = (Scale * M) + s;
1536     }
1537   }
1538 } // end namespace llvm
1539
1540 #endif // LLVM_LIB_TARGET_X86_X86ISELLOWERING_H