PPCISelLowering.h revision 65c3c8f323198b99b88b109654194540cf9b3fa5
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//===-- PPCISelLowering.h - PPC32 DAG Lowering Interface --------*- C++ -*-===//
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//                     The LLVM Compiler Infrastructure
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// This file is distributed under the University of Illinois Open Source
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// License. See LICENSE.TXT for details.
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//===----------------------------------------------------------------------===//
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// This file defines the interfaces that PPC uses to lower LLVM code into a
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project// selection DAG.
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project//===----------------------------------------------------------------------===//
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "llvm/Target/TargetLowering.h"
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "llvm/CodeGen/SelectionDAG.h"
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "PPC.h"
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "PPCSubtarget.h"
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectnamespace llvm {
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  namespace PPCISD {
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    enum NodeType {
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      // Start the numbering where the builtin ops and target ops leave off.
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      FIRST_NUMBER = ISD::BUILTIN_OP_END,
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// FSEL - Traditional three-operand fsel node.
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      ///
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      FSEL,
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// FCFID - The FCFID instruction, taking an f64 operand and producing
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// and f64 value containing the FP representation of the integer that
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// was temporarily in the f64 operand.
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      FCFID,
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// FCTI[D,W]Z - The FCTIDZ and FCTIWZ instructions, taking an f32 or f64
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// operand, producing an f64 value containing the integer representation
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// of that FP value.
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      FCTIDZ, FCTIWZ,
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// STFIWX - The STFIWX instruction.  The first operand is an input token
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// chain, then an f64 value to store, then an address to store it to,
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// then a SRCVALUE for the address.
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      STFIWX,
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      // VMADDFP, VNMSUBFP - The VMADDFP and VNMSUBFP instructions, taking
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      // three v4f32 operands and producing a v4f32 result.
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      VMADDFP, VNMSUBFP,
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// VPERM - The PPC VPERM Instruction.
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      ///
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      VPERM,
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// Hi/Lo - These represent the high and low 16-bit parts of a global
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// address respectively.  These nodes have two operands, the first of
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// which must be a TargetGlobalAddress, and the second of which must be a
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// Constant.  Selected naively, these turn into 'lis G+C' and 'li G+C',
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// though these are usually folded into other nodes.
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      Hi, Lo,
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      TOC_ENTRY,
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// OPRC, CHAIN = DYNALLOC(CHAIN, NEGSIZE, FRAME_INDEX)
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// This instruction is lowered in PPCRegisterInfo::eliminateFrameIndex to
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// compute an allocation on the stack.
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      DYNALLOC,
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// GlobalBaseReg - On Darwin, this node represents the result of the mflr
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// at function entry, used for PIC code.
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      GlobalBaseReg,
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// These nodes represent the 32-bit PPC shifts that operate on 6-bit
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// shift amounts.  These nodes are generated by the multi-precision shift
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// code.
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      SRL, SRA, SHL,
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// EXTSW_32 - This is the EXTSW instruction for use with "32-bit"
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// registers.
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      EXTSW_32,
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// STD_32 - This is the STD instruction for use with "32-bit" registers.
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      STD_32,
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// CALL - A direct function call.
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      CALL_Darwin, CALL_SVR4,
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// NOP - Special NOP which follows 64-bit SVR4 calls.
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      NOP,
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// CHAIN,FLAG = MTCTR(VAL, CHAIN[, INFLAG]) - Directly corresponds to a
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// MTCTR instruction.
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      MTCTR,
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// CHAIN,FLAG = BCTRL(CHAIN, INFLAG) - Directly corresponds to a
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// BCTRL instruction.
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      BCTRL_Darwin, BCTRL_SVR4,
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// Return with a flag operand, matched by 'blr'
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      RET_FLAG,
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// R32 = MFCR(CRREG, INFLAG) - Represents the MFCR/MFOCRF instructions.
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// This copies the bits corresponding to the specified CRREG into the
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// resultant GPR.  Bits corresponding to other CR regs are undefined.
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      MFCR,
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// RESVEC = VCMP(LHS, RHS, OPC) - Represents one of the altivec VCMP*
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// instructions.  For lack of better number, we use the opcode number
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// encoding for the OPC field to identify the compare.  For example, 838
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// is VCMPGTSH.
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      VCMP,
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// RESVEC, OUTFLAG = VCMPo(LHS, RHS, OPC) - Represents one of the
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// altivec VCMP*o instructions.  For lack of better number, we use the
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// opcode number encoding for the OPC field to identify the compare.  For
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// example, 838 is VCMPGTSH.
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      VCMPo,
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// CHAIN = COND_BRANCH CHAIN, CRRC, OPC, DESTBB [, INFLAG] - This
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// corresponds to the COND_BRANCH pseudo instruction.  CRRC is the
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// condition register to branch on, OPC is the branch opcode to use (e.g.
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// PPC::BLE), DESTBB is the destination block to branch to, and INFLAG is
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// an optional input flag argument.
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      COND_BRANCH,
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// CHAIN = STBRX CHAIN, GPRC, Ptr, SRCVALUE, Type - This is a
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// byte-swapping store instruction.  It byte-swaps the low "Type" bits of
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// the GPRC input, then stores it through Ptr.  Type can be either i16 or
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// i32.
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      STBRX,
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// GPRC, CHAIN = LBRX CHAIN, Ptr, SRCVALUE, Type - This is a
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// byte-swapping load instruction.  It loads "Type" bits, byte swaps it,
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// then puts it in the bottom bits of the GPRC.  TYPE can be either i16
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// or i32.
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      LBRX,
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      // The following 5 instructions are used only as part of the
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      // long double-to-int conversion sequence.
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// OUTFLAG = MFFS F8RC - This moves the FPSCR (not modelled) into the
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// register.
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      MFFS,
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// OUTFLAG = MTFSB0 INFLAG - This clears a bit in the FPSCR.
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      MTFSB0,
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// OUTFLAG = MTFSB1 INFLAG - This sets a bit in the FPSCR.
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      MTFSB1,
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// F8RC, OUTFLAG = FADDRTZ F8RC, F8RC, INFLAG - This is an FADD done with
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// rounding towards zero.  It has flags added so it won't move past the
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// FPSCR-setting instructions.
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      FADDRTZ,
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// MTFSF = F8RC, INFLAG - This moves the register into the FPSCR.
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      MTFSF,
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// LARX = This corresponds to PPC l{w|d}arx instrcution: load and
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// reserve indexed. This is used to implement atomic operations.
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      LARX,
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// STCX = This corresponds to PPC stcx. instrcution: store conditional
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// indexed. This is used to implement atomic operations.
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      STCX,
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      /// TC_RETURN - A tail call return.
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      ///   operand #0 chain
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      ///   operand #1 callee (register or absolute)
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      ///   operand #2 stack adjustment
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      ///   operand #3 optional in flag
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      TC_RETURN
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    };
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  /// Define some predicates that are used for node matching.
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  namespace PPC {
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// isVPKUHUMShuffleMask - Return true if this is the shuffle mask for a
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// VPKUHUM instruction.
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    bool isVPKUHUMShuffleMask(ShuffleVectorSDNode *N, bool isUnary);
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// isVPKUWUMShuffleMask - Return true if this is the shuffle mask for a
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// VPKUWUM instruction.
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    bool isVPKUWUMShuffleMask(ShuffleVectorSDNode *N, bool isUnary);
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// isVMRGLShuffleMask - Return true if this is a shuffle mask suitable for
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// a VRGL* instruction with the specified unit size (1,2 or 4 bytes).
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    bool isVMRGLShuffleMask(ShuffleVectorSDNode *N, unsigned UnitSize,
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                            bool isUnary);
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// isVMRGHShuffleMask - Return true if this is a shuffle mask suitable for
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// a VRGH* instruction with the specified unit size (1,2 or 4 bytes).
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    bool isVMRGHShuffleMask(ShuffleVectorSDNode *N, unsigned UnitSize,
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                            bool isUnary);
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// isVSLDOIShuffleMask - If this is a vsldoi shuffle mask, return the shift
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// amount, otherwise return -1.
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int isVSLDOIShuffleMask(SDNode *N, bool isUnary);
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// isSplatShuffleMask - Return true if the specified VECTOR_SHUFFLE operand
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// specifies a splat of a single element that is suitable for input to
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// VSPLTB/VSPLTH/VSPLTW.
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    bool isSplatShuffleMask(ShuffleVectorSDNode *N, unsigned EltSize);
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// isAllNegativeZeroVector - Returns true if all elements of build_vector
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// are -0.0.
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    bool isAllNegativeZeroVector(SDNode *N);
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// getVSPLTImmediate - Return the appropriate VSPLT* immediate to splat the
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// specified isSplatShuffleMask VECTOR_SHUFFLE mask.
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    unsigned getVSPLTImmediate(SDNode *N, unsigned EltSize);
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// get_VSPLTI_elt - If this is a build_vector of constants which can be
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// formed by using a vspltis[bhw] instruction of the specified element
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// size, return the constant being splatted.  The ByteSize field indicates
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// the number of bytes of each element [124] -> [bhw].
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue get_VSPLTI_elt(SDNode *N, unsigned ByteSize, SelectionDAG &DAG);
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  }
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  class PPCTargetLowering : public TargetLowering {
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int VarArgsFrameIndex;            // FrameIndex for start of varargs area.
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    int VarArgsStackOffset;           // StackOffset for start of stack
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                      // arguments.
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    unsigned VarArgsNumGPR;           // Index of the first unused integer
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                      // register for parameter passing.
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    unsigned VarArgsNumFPR;           // Index of the first unused double
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                      // register for parameter passing.
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    const PPCSubtarget &PPCSubTarget;
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  public:
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    explicit PPCTargetLowering(PPCTargetMachine &TM);
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// getTargetNodeName() - This method returns the name of a target specific
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// DAG node.
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    virtual const char *getTargetNodeName(unsigned Opcode) const;
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// getSetCCResultType - Return the ISD::SETCC ValueType
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    virtual MVT::SimpleValueType getSetCCResultType(EVT VT) const;
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// getPreIndexedAddressParts - returns true by value, base pointer and
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// offset pointer and addressing mode by reference if the node's address
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// can be legally represented as pre-indexed load / store address.
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    virtual bool getPreIndexedAddressParts(SDNode *N, SDValue &Base,
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                           SDValue &Offset,
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                           ISD::MemIndexedMode &AM,
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                           SelectionDAG &DAG) const;
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// SelectAddressRegReg - Given the specified addressed, check to see if it
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// can be represented as an indexed [r+r] operation.  Returns false if it
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// can be more efficiently represented with [r+imm].
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    bool SelectAddressRegReg(SDValue N, SDValue &Base, SDValue &Index,
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                             SelectionDAG &DAG) const;
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// SelectAddressRegImm - Returns true if the address N can be represented
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// by a base register plus a signed 16-bit displacement [r+imm], and if it
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// is not better represented as reg+reg.
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    bool SelectAddressRegImm(SDValue N, SDValue &Disp, SDValue &Base,
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                             SelectionDAG &DAG) const;
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// SelectAddressRegRegOnly - Given the specified addressed, force it to be
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// represented as an indexed [r+r] operation.
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    bool SelectAddressRegRegOnly(SDValue N, SDValue &Base, SDValue &Index,
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                 SelectionDAG &DAG) const;
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// SelectAddressRegImmShift - Returns true if the address N can be
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// represented by a base register plus a signed 14-bit displacement
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// [r+imm*4].  Suitable for use by STD and friends.
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    bool SelectAddressRegImmShift(SDValue N, SDValue &Disp, SDValue &Base,
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                  SelectionDAG &DAG) const;
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// LowerOperation - Provide custom lowering hooks for some operations.
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG);
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// ReplaceNodeResults - Replace the results of node with an illegal result
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// type with new values built out of custom code.
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ///
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    virtual void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results,
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                    SelectionDAG &DAG);
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    virtual void computeMaskedBitsForTargetNode(const SDValue Op,
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                                const APInt &Mask,
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                                APInt &KnownZero,
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                                APInt &KnownOne,
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                                const SelectionDAG &DAG,
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                                unsigned Depth = 0) const;
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    virtual MachineBasicBlock *EmitInstrWithCustomInserter(MachineInstr *MI,
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                                  MachineBasicBlock *MBB) const;
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    MachineBasicBlock *EmitAtomicBinary(MachineInstr *MI,
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                        MachineBasicBlock *MBB, bool is64Bit,
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                        unsigned BinOpcode) const;
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    MachineBasicBlock *EmitPartwordAtomicBinary(MachineInstr *MI,
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                                MachineBasicBlock *MBB,
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                            bool is8bit, unsigned Opcode) const;
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    ConstraintType getConstraintType(const std::string &Constraint) const;
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    std::pair<unsigned, const TargetRegisterClass*>
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      getRegForInlineAsmConstraint(const std::string &Constraint,
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                   EVT VT) const;
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// getByValTypeAlignment - Return the desired alignment for ByVal aggregate
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// function arguments in the caller parameter area.  This is the actual
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// alignment, not its logarithm.
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    unsigned getByValTypeAlignment(const Type *Ty) const;
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// vector.  If it is invalid, don't add anything to Ops. If hasMemory is
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// true it means one of the asm constraint of the inline asm instruction
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// being processed is 'm'.
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    virtual void LowerAsmOperandForConstraint(SDValue Op,
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                              char ConstraintLetter,
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                              bool hasMemory,
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                              std::vector<SDValue> &Ops,
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                              SelectionDAG &DAG) const;
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// isLegalAddressingMode - Return true if the addressing mode represented
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// by AM is legal for this target, for a load/store of the specified type.
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    virtual bool isLegalAddressingMode(const AddrMode &AM, const Type *Ty)const;
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// isLegalAddressImmediate - Return true if the integer value can be used
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// as the offset of the target addressing mode for load / store of the
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// given type.
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    virtual bool isLegalAddressImmediate(int64_t V, const Type *Ty) const;
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// isLegalAddressImmediate - Return true if the GlobalValue can be used as
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// the offset of the target addressing mode.
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    virtual bool isLegalAddressImmediate(GlobalValue *GV) const;
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    virtual bool
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    IsEligibleForTailCallOptimization(SDValue Callee,
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                      CallingConv::ID CalleeCC,
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                      bool isVarArg,
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                      const SmallVectorImpl<ISD::InputArg> &Ins,
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                      SelectionDAG& DAG) const;
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    virtual EVT getOptimalMemOpType(uint64_t Size, unsigned Align,
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                    bool isSrcConst, bool isSrcStr,
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                    SelectionDAG &DAG) const;
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    /// getFunctionAlignment - Return the Log2 alignment of this function.
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    virtual unsigned getFunctionAlignment(const Function *F) const;
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  private:
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue getFramePointerFrameIndex(SelectionDAG & DAG) const;
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue getReturnAddrFrameIndex(SelectionDAG & DAG) const;
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue EmitTailCallLoadFPAndRetAddr(SelectionDAG & DAG,
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                         int SPDiff,
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                         SDValue Chain,
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                         SDValue &LROpOut,
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                         SDValue &FPOpOut,
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                         bool isDarwinABI,
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                         DebugLoc dl);
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG);
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG);
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG);
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG);
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG);
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG);
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG);
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerTRAMPOLINE(SDValue Op, SelectionDAG &DAG);
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG,
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           int VarArgsFrameIndex, int VarArgsStackOffset,
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           unsigned VarArgsNumGPR, unsigned VarArgsNumFPR,
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           const PPCSubtarget &Subtarget);
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG, int VarArgsFrameIndex,
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                         int VarArgsStackOffset, unsigned VarArgsNumGPR,
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                         unsigned VarArgsNumFPR, const PPCSubtarget &Subtarget);
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG,
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                const PPCSubtarget &Subtarget);
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG,
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                      const PPCSubtarget &Subtarget);
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG);
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG, DebugLoc dl);
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG);
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG);
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerSHL_PARTS(SDValue Op, SelectionDAG &DAG);
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerSRL_PARTS(SDValue Op, SelectionDAG &DAG);
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerSRA_PARTS(SDValue Op, SelectionDAG &DAG);
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG);
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG);
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG);
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG);
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerMUL(SDValue Op, SelectionDAG &DAG);
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                            CallingConv::ID CallConv, bool isVarArg,
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                            const SmallVectorImpl<ISD::InputArg> &Ins,
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                            DebugLoc dl, SelectionDAG &DAG,
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                            SmallVectorImpl<SDValue> &InVals);
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue FinishCall(CallingConv::ID CallConv, DebugLoc dl, bool isTailCall,
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                       bool isVarArg,
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                       SelectionDAG &DAG,
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                       SmallVector<std::pair<unsigned, SDValue>, 8>
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                         &RegsToPass,
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                       SDValue InFlag, SDValue Chain,
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                       SDValue &Callee,
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                       int SPDiff, unsigned NumBytes,
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                       const SmallVectorImpl<ISD::InputArg> &Ins,
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                       SmallVectorImpl<SDValue> &InVals);
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    virtual SDValue
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      LowerFormalArguments(SDValue Chain,
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           CallingConv::ID CallConv, bool isVarArg,
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           const SmallVectorImpl<ISD::InputArg> &Ins,
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           DebugLoc dl, SelectionDAG &DAG,
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                           SmallVectorImpl<SDValue> &InVals);
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    virtual SDValue
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      LowerCall(SDValue Chain, SDValue Callee,
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                CallingConv::ID CallConv, bool isVarArg, bool isTailCall,
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                const SmallVectorImpl<ISD::OutputArg> &Outs,
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                const SmallVectorImpl<ISD::InputArg> &Ins,
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                DebugLoc dl, SelectionDAG &DAG,
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                SmallVectorImpl<SDValue> &InVals);
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    virtual SDValue
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      LowerReturn(SDValue Chain,
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                  CallingConv::ID CallConv, bool isVarArg,
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                  const SmallVectorImpl<ISD::OutputArg> &Outs,
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                  DebugLoc dl, SelectionDAG &DAG);
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      LowerFormalArguments_Darwin(SDValue Chain,
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                  CallingConv::ID CallConv, bool isVarArg,
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                  const SmallVectorImpl<ISD::InputArg> &Ins,
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                  DebugLoc dl, SelectionDAG &DAG,
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                  SmallVectorImpl<SDValue> &InVals);
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      LowerFormalArguments_SVR4(SDValue Chain,
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                CallingConv::ID CallConv, bool isVarArg,
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                const SmallVectorImpl<ISD::InputArg> &Ins,
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                DebugLoc dl, SelectionDAG &DAG,
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                                SmallVectorImpl<SDValue> &InVals);
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      LowerCall_Darwin(SDValue Chain, SDValue Callee,
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                       CallingConv::ID CallConv, bool isVarArg, bool isTailCall,
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                       const SmallVectorImpl<ISD::OutputArg> &Outs,
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                       const SmallVectorImpl<ISD::InputArg> &Ins,
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                       DebugLoc dl, SelectionDAG &DAG,
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                       SmallVectorImpl<SDValue> &InVals);
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    SDValue
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project      LowerCall_SVR4(SDValue Chain, SDValue Callee,
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                     CallingConv::ID CallConv, bool isVarArg, bool isTailCall,
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                     const SmallVectorImpl<ISD::OutputArg> &Outs,
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                     const SmallVectorImpl<ISD::InputArg> &Ins,
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                     DebugLoc dl, SelectionDAG &DAG,
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                     SmallVectorImpl<SDValue> &InVals);
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  };
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif   // LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project