PPCISelLowering.h revision 3a84dae654630a89a91a73807201b6067c4774ec
1310968cbbb564c4141d4bd418a746e8103560222Chris Lattner//===-- PPCISelLowering.h - PPC32 DAG Lowering Interface --------*- C++ -*-===//
2f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman//
3310968cbbb564c4141d4bd418a746e8103560222Chris Lattner//                     The LLVM Compiler Infrastructure
4310968cbbb564c4141d4bd418a746e8103560222Chris Lattner//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman//
8310968cbbb564c4141d4bd418a746e8103560222Chris Lattner//===----------------------------------------------------------------------===//
9310968cbbb564c4141d4bd418a746e8103560222Chris Lattner//
10310968cbbb564c4141d4bd418a746e8103560222Chris Lattner// This file defines the interfaces that PPC uses to lower LLVM code into a
11310968cbbb564c4141d4bd418a746e8103560222Chris Lattner// selection DAG.
12310968cbbb564c4141d4bd418a746e8103560222Chris Lattner//
13310968cbbb564c4141d4bd418a746e8103560222Chris Lattner//===----------------------------------------------------------------------===//
14310968cbbb564c4141d4bd418a746e8103560222Chris Lattner
15af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner#ifndef LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H
16beeb93e6ba48af2661eabc4872d8b159fb43e5dbChris Lattner#define LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H
1707000c6f01d8f57170f2d4c77a86d934bdc5c696Owen Anderson
18f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetLowering.h"
19310968cbbb564c4141d4bd418a746e8103560222Chris Lattner#include "llvm/CodeGen/SelectionDAG.h"
206f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman#include "PPC.h"
21707e0184233f27e0e9f9aee0309f2daab8cfe7f8Dan Gohman#include "PPCSubtarget.h"
22dc879296090a738c66968f5eec77db65d7e03623Chris Lattner
2384023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohmannamespace llvm {
24ad4196b44ae714a6b95e238d9d96303df74b0429Evan Cheng  namespace PPCISD {
25071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner    enum NodeType {
26589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner      // Start the numbering where the builtin ops and target ops leave off.
27310968cbbb564c4141d4bd418a746e8103560222Chris Lattner      FIRST_NUMBER = ISD::BUILTIN_OP_END,
28e3ee49fb2728dcb9702b5be0c3c80f472ffccefcJakob Stoklund Olesen
29718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson      /// FSEL - Traditional three-operand fsel node.
30b6fbec3a546fd04bb2e79040db2436b0bd629162Nadav Rotem      ///
31c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin      FSEL,
32c6fd6cd65c88ef1f11da43c11be0152cb69013a7Chris Lattner
33476b242fe7a61e5f9ac6214b0bc5c680d24f152eNick Lewycky      /// FCFID - The FCFID instruction, taking an f64 operand and producing
34310968cbbb564c4141d4bd418a746e8103560222Chris Lattner      /// and f64 value containing the FP representation of the integer that
35310968cbbb564c4141d4bd418a746e8103560222Chris Lattner      /// was temporarily in the f64 operand.
3656966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      FCFID,
3756966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
3879cca507fe51aa8af7a9006b380977c61b6f3feaEvan Cheng      /// FCTI[D,W]Z - The FCTIDZ and FCTIWZ instructions, taking an f32 or f64
39c31642f7af64bfaed36064b52a5cb2366fd01064Anton Korobeynikov      /// operand, producing an f64 value containing the integer representation
4056966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      /// of that FP value.
4156966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      FCTIDZ, FCTIWZ,
42dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands
43c31642f7af64bfaed36064b52a5cb2366fd01064Anton Korobeynikov      /// STFIWX - The STFIWX instruction.  The first operand is an input token
4456966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      /// chain, then an f64 value to store, then an address to store it to.
4556966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      STFIWX,
46dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands
47c31642f7af64bfaed36064b52a5cb2366fd01064Anton Korobeynikov      // VMADDFP, VNMSUBFP - The VMADDFP and VNMSUBFP instructions, taking
4856966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      // three v4f32 operands and producing a v4f32 result.
4956966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      VMADDFP, VNMSUBFP,
50dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands
518983da729aa1ca99a11a3b98ae6280dfcdbadb39Anton Korobeynikov      /// VPERM - The PPC VPERM Instruction.
52c31642f7af64bfaed36064b52a5cb2366fd01064Anton Korobeynikov      ///
5356966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      VPERM,
5456966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
555ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands      /// Hi/Lo - These represent the high and low 16-bit parts of a global
56362fee90b9a1d64ac091755466caf6a94ade22ebEric Christopher      /// address respectively.  These nodes have two operands, the first of
57362fee90b9a1d64ac091755466caf6a94ade22ebEric Christopher      /// which must be a TargetGlobalAddress, and the second of which must be a
58362fee90b9a1d64ac091755466caf6a94ade22ebEric Christopher      /// Constant.  Selected naively, these turn into 'lis G+C' and 'li G+C',
598983da729aa1ca99a11a3b98ae6280dfcdbadb39Anton Korobeynikov      /// though these are usually folded into other nodes.
60813090cf891325c715b9f6fb1546e6ce67fa8c8bAnton Korobeynikov      Hi, Lo,
6156966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
6256966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      TOC_ENTRY,
635ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands
648983da729aa1ca99a11a3b98ae6280dfcdbadb39Anton Korobeynikov      /// The following three target-specific nodes are used for calls through
65fb3f84fe16219467cef4ed181530e846177cb4dfAnton Korobeynikov      /// function pointers in the 64-bit SVR4 ABI.
6656966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
6756966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      /// Restore the TOC from the TOC save area of the current stack frame.
685ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands      /// This is basically a hard coded load instruction which additionally
698983da729aa1ca99a11a3b98ae6280dfcdbadb39Anton Korobeynikov      /// takes/produces a flag.
70813090cf891325c715b9f6fb1546e6ce67fa8c8bAnton Korobeynikov      TOC_RESTORE,
7156966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
7256966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      /// Like a regular LOAD but additionally taking/producing a flag.
735ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands      LOAD,
748983da729aa1ca99a11a3b98ae6280dfcdbadb39Anton Korobeynikov
759fe9c8ec7d7d1e260927cb66e91d5e69db8a6febAnton Korobeynikov      /// LOAD into r2 (also taking/producing a flag). Like TOC_RESTORE, this is
7656966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      /// a hard coded load instruction.
7756966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      LOAD_TOC,
785ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands
798e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng      /// OPRC, CHAIN = DYNALLOC(CHAIN, NEGSIZE, FRAME_INDEX)
808e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng      /// This instruction is lowered in PPCRegisterInfo::eliminateFrameIndex to
818e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng      /// compute an allocation on the stack.
828e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng      DYNALLOC,
838e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng
848e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng      /// GlobalBaseReg - On Darwin, this node represents the result of the mflr
858e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng      /// at function entry, used for PIC code.
868e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng      GlobalBaseReg,
878e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng
888e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng      /// These nodes represent the 32-bit PPC shifts that operate on 6-bit
898e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng      /// shift amounts.  These nodes are generated by the multi-precision shift
908e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng      /// code.
918e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng      SRL, SRA, SHL,
9256966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
9356966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      /// EXTSW_32 - This is the EXTSW instruction for use with "32-bit"
9456966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      /// registers.
9556966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      EXTSW_32,
96007f9847c44ddbe7fd04cba362b4ec0f0f40964bDuncan Sands
97161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen      /// CALL - A direct function call.
9856966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      CALL_Darwin, CALL_SVR4,
9956966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
100007f9847c44ddbe7fd04cba362b4ec0f0f40964bDuncan Sands      /// NOP - Special NOP which follows 64-bit SVR4 calls.
101161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen      NOP,
10256966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
10356966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      /// CHAIN,FLAG = MTCTR(VAL, CHAIN[, INFLAG]) - Directly corresponds to a
104007f9847c44ddbe7fd04cba362b4ec0f0f40964bDuncan Sands      /// MTCTR instruction.
105161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen      MTCTR,
10656966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
10756966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      /// CHAIN,FLAG = BCTRL(CHAIN, INFLAG) - Directly corresponds to a
108007f9847c44ddbe7fd04cba362b4ec0f0f40964bDuncan Sands      /// BCTRL instruction.
109161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen      BCTRL_Darwin, BCTRL_SVR4,
11056966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
11156966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      /// Return with a flag operand, matched by 'blr'
112007f9847c44ddbe7fd04cba362b4ec0f0f40964bDuncan Sands      RET_FLAG,
113161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen
11433390848a7eca75301d04a59b89b516d83e19ee0Cameron Zwarich      /// R32 = MFCR(CRREG, INFLAG) - Represents the MFCR/MFOCRF instructions.
11533390848a7eca75301d04a59b89b516d83e19ee0Cameron Zwarich      /// This copies the bits corresponding to the specified CRREG into the
11633390848a7eca75301d04a59b89b516d83e19ee0Cameron Zwarich      /// resultant GPR.  Bits corresponding to other CR regs are undefined.
11733390848a7eca75301d04a59b89b516d83e19ee0Cameron Zwarich      MFCR,
11856966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
11956966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      /// RESVEC = VCMP(LHS, RHS, OPC) - Represents one of the altivec VCMP*
120161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen      /// instructions.  For lack of better number, we use the opcode number
121161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen      /// encoding for the OPC field to identify the compare.  For example, 838
12256966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      /// is VCMPGTSH.
12356966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      VCMP,
124161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen
125161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen      /// RESVEC, OUTFLAG = VCMPo(LHS, RHS, OPC) - Represents one of the
1267794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen      /// altivec VCMP*o instructions.  For lack of better number, we use the
1277794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen      /// opcode number encoding for the OPC field to identify the compare.  For
1287794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen      /// example, 838 is VCMPGTSH.
1297794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen      VCMPo,
1307794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen
1317794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen      /// CHAIN = COND_BRANCH CHAIN, CRRC, OPC, DESTBB [, INFLAG] - This
1327794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen      /// corresponds to the COND_BRANCH pseudo instruction.  CRRC is the
1337794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen      /// condition register to branch on, OPC is the branch opcode to use (e.g.
1347794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen      /// PPC::BLE), DESTBB is the destination block to branch to, and INFLAG is
1357794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen      /// an optional input flag argument.
1367794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen      COND_BRANCH,
1377794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen
1387794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen      // The following 5 instructions are used only as part of the
1397794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen      // long double-to-int conversion sequence.
1407794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen
1417794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen      /// OUTFLAG = MFFS F8RC - This moves the FPSCR (not modelled) into the
1427794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen      /// register.
1437794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen      MFFS,
1447794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen
1457794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen      /// OUTFLAG = MTFSB0 INFLAG - This clears a bit in the FPSCR.
14656966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      MTFSB0,
14756966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
148007f9847c44ddbe7fd04cba362b4ec0f0f40964bDuncan Sands      /// OUTFLAG = MTFSB1 INFLAG - This sets a bit in the FPSCR.
149007f9847c44ddbe7fd04cba362b4ec0f0f40964bDuncan Sands      MTFSB1,
15056966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
15156966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      /// F8RC, OUTFLAG = FADDRTZ F8RC, F8RC, INFLAG - This is an FADD done with
152007f9847c44ddbe7fd04cba362b4ec0f0f40964bDuncan Sands      /// rounding towards zero.  It has flags added so it won't move past the
153007f9847c44ddbe7fd04cba362b4ec0f0f40964bDuncan Sands      /// FPSCR-setting instructions.
154e54be104180d81b61c5fcc29ccb7960f9b78476eDan Gohman      FADDRTZ,
155e54be104180d81b61c5fcc29ccb7960f9b78476eDan Gohman
156e54be104180d81b61c5fcc29ccb7960f9b78476eDan Gohman      /// MTFSF = F8RC, INFLAG - This moves the register into the FPSCR.
157e54be104180d81b61c5fcc29ccb7960f9b78476eDan Gohman      MTFSF,
1582bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman
1592bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman      /// LARX = This corresponds to PPC l{w|d}arx instrcution: load and
1602bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman      /// reserve indexed. This is used to implement atomic operations.
1612bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman      LARX,
1622bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman
1632bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman      /// STCX = This corresponds to PPC stcx. instrcution: store conditional
1642bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman      /// indexed. This is used to implement atomic operations.
1652bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman      STCX,
1662bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman
1672bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman      /// TC_RETURN - A tail call return.
1682bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman      ///   operand #0 chain
1692bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman      ///   operand #1 callee (register or absolute)
1702bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman      ///   operand #2 stack adjustment
1712bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman      ///   operand #3 optional in flag
1722bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman      TC_RETURN,
1732bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman
1742bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman      /// STD_32 - This is the STD instruction for use with "32-bit" registers.
1752bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman      STD_32 = ISD::FIRST_TARGET_MEMORY_OPCODE,
1762bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman
1772bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman      /// CHAIN = STBRX CHAIN, GPRC, Ptr, Type - This is a
178d2c817eff1d158398fb0a620fa762bf95207922fDuncan Sands      /// byte-swapping store instruction.  It byte-swaps the low "Type" bits of
179d2c817eff1d158398fb0a620fa762bf95207922fDuncan Sands      /// the GPRC input, then stores it through Ptr.  Type can be either i16 or
180d2c817eff1d158398fb0a620fa762bf95207922fDuncan Sands      /// i32.
181d2c817eff1d158398fb0a620fa762bf95207922fDuncan Sands      STBRX,
18256966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
183927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov      /// GPRC, CHAIN = LBRX CHAIN, Ptr, Type - This is a
184927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov      /// byte-swapping load instruction.  It loads "Type" bits, byte swaps it,
18556966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng      /// then puts it in the bottom bits of the GPRC.  TYPE can be either i16
186e36bfe678df09f46e1eac60b15105c1ccd2c5382Bruno Cardoso Lopes      /// or i32.
187e36bfe678df09f46e1eac60b15105c1ccd2c5382Bruno Cardoso Lopes      LBRX
188e36bfe678df09f46e1eac60b15105c1ccd2c5382Bruno Cardoso Lopes    };
189e36bfe678df09f46e1eac60b15105c1ccd2c5382Bruno Cardoso Lopes  }
190de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov
191de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov  /// Define some predicates that are used for node matching.
19256966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng  namespace PPC {
19356966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng    /// isVPKUHUMShuffleMask - Return true if this is the shuffle mask for a
194a2e9485e34f1348526ed104dbdc194673e291077Dan Gohman    /// VPKUHUM instruction.
195de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov    bool isVPKUHUMShuffleMask(ShuffleVectorSDNode *N, bool isUnary);
196de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov
19756966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng    /// isVPKUWUMShuffleMask - Return true if this is the shuffle mask for a
19856966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng    /// VPKUWUM instruction.
199a2e9485e34f1348526ed104dbdc194673e291077Dan Gohman    bool isVPKUWUMShuffleMask(ShuffleVectorSDNode *N, bool isUnary);
200be1ad4de2900451626c8d4ace07b9ea16099ea1dDuncan Sands
201161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen    /// isVMRGLShuffleMask - Return true if this is a shuffle mask suitable for
202a2e9485e34f1348526ed104dbdc194673e291077Dan Gohman    /// a VRGL* instruction with the specified unit size (1,2 or 4 bytes).
203041cde26eaf4ef6171ff1a44aeedd08d7a1cba6cDuncan Sands    bool isVMRGLShuffleMask(ShuffleVectorSDNode *N, unsigned UnitSize,
204161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen                            bool isUnary);
205a2e9485e34f1348526ed104dbdc194673e291077Dan Gohman
206de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov    /// isVMRGHShuffleMask - Return true if this is a shuffle mask suitable for
207de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov    /// a VRGH* instruction with the specified unit size (1,2 or 4 bytes).
20856966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng    bool isVMRGHShuffleMask(ShuffleVectorSDNode *N, unsigned UnitSize,
20956966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng                            bool isUnary);
210a2e9485e34f1348526ed104dbdc194673e291077Dan Gohman
211de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov    /// isVSLDOIShuffleMask - If this is a vsldoi shuffle mask, return the shift
212de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov    /// amount, otherwise return -1.
21356966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng    int isVSLDOIShuffleMask(SDNode *N, bool isUnary);
21456966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
215a2e9485e34f1348526ed104dbdc194673e291077Dan Gohman    /// isSplatShuffleMask - Return true if the specified VECTOR_SHUFFLE operand
216161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen    /// specifies a splat of a single element that is suitable for input to
217161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen    /// VSPLTB/VSPLTH/VSPLTW.
218a2e9485e34f1348526ed104dbdc194673e291077Dan Gohman    bool isSplatShuffleMask(ShuffleVectorSDNode *N, unsigned EltSize);
219041cde26eaf4ef6171ff1a44aeedd08d7a1cba6cDuncan Sands
220161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen    /// isAllNegativeZeroVector - Returns true if all elements of build_vector
221a2e9485e34f1348526ed104dbdc194673e291077Dan Gohman    /// are -0.0.
22256966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng    bool isAllNegativeZeroVector(SDNode *N);
22356966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
2249bed0f58eb7f5e9e22d062f3880a5fabfdd0dfddDuncan Sands    /// getVSPLTImmediate - Return the appropriate VSPLT* immediate to splat the
2259bed0f58eb7f5e9e22d062f3880a5fabfdd0dfddDuncan Sands    /// specified isSplatShuffleMask VECTOR_SHUFFLE mask.
22656966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng    unsigned getVSPLTImmediate(SDNode *N, unsigned EltSize);
22756966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
228161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen    /// get_VSPLTI_elt - If this is a build_vector of constants which can be
229161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen    /// formed by using a vspltis[bhw] instruction of the specified element
230d91446de7a89a22c8ea1cbfd40fe2528467a4ccbDan Gohman    /// size, return the constant being splatted.  The ByteSize field indicates
231d91446de7a89a22c8ea1cbfd40fe2528467a4ccbDan Gohman    /// the number of bytes of each element [124] -> [bhw].
232d91446de7a89a22c8ea1cbfd40fe2528467a4ccbDan Gohman    SDValue get_VSPLTI_elt(SDNode *N, unsigned ByteSize, SelectionDAG &DAG);
233d91446de7a89a22c8ea1cbfd40fe2528467a4ccbDan Gohman  }
23456966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
23556966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng  class PPCTargetLowering : public TargetLowering {
236ac6cecec189ba9689c42543c3106c02b96d788daDuncan Sands    int VarArgsFrameIndex;            // FrameIndex for start of varargs area.
237ac6cecec189ba9689c42543c3106c02b96d788daDuncan Sands    int VarArgsStackOffset;           // StackOffset for start of stack
23856966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng                                      // arguments.
23956966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng    unsigned VarArgsNumGPR;           // Index of the first unused integer
240ac6cecec189ba9689c42543c3106c02b96d788daDuncan Sands                                      // register for parameter passing.
241ac6cecec189ba9689c42543c3106c02b96d788daDuncan Sands    unsigned VarArgsNumFPR;           // Index of the first unused double
242ac6cecec189ba9689c42543c3106c02b96d788daDuncan Sands                                      // register for parameter passing.
243ac6cecec189ba9689c42543c3106c02b96d788daDuncan Sands    const PPCSubtarget &PPCSubTarget;
244ac6cecec189ba9689c42543c3106c02b96d788daDuncan Sands  public:
245ac6cecec189ba9689c42543c3106c02b96d788daDuncan Sands    explicit PPCTargetLowering(PPCTargetMachine &TM);
24656966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
24756966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng    /// getTargetNodeName() - This method returns the name of a target specific
24856966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng    /// DAG node.
24956966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng    virtual const char *getTargetNodeName(unsigned Opcode) const;
25056966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
25156966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng    /// getSetCCResultType - Return the ISD::SETCC ValueType
25256966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng    virtual MVT::SimpleValueType getSetCCResultType(EVT VT) const;
25356966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng
25456966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng    /// getPreIndexedAddressParts - returns true by value, base pointer and
25556966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng    /// offset pointer and addressing mode by reference if the node's address
25656966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng    /// can be legally represented as pre-indexed load / store address.
25756966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng    virtual bool getPreIndexedAddressParts(SDNode *N, SDValue &Base,
25856966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng                                           SDValue &Offset,
25956966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng                                           ISD::MemIndexedMode &AM,
260d385fd62cb43435b3ad70d789198d34bf148e579Evan Cheng                                           SelectionDAG &DAG) const;
261d385fd62cb43435b3ad70d789198d34bf148e579Evan Cheng
262a114baa5bf0d70aed8b8cf576a864005c0d6a128Sanjiv Gupta    /// SelectAddressRegReg - Given the specified addressed, check to see if it
263a114baa5bf0d70aed8b8cf576a864005c0d6a128Sanjiv Gupta    /// can be represented as an indexed [r+r] operation.  Returns false if it
264a114baa5bf0d70aed8b8cf576a864005c0d6a128Sanjiv Gupta    /// can be more efficiently represented with [r+imm].
265b0f1e1780c736c62fb99e5824825d2a60a53b53bDuncan Sands    bool SelectAddressRegReg(SDValue N, SDValue &Base, SDValue &Index,
266e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach                             SelectionDAG &DAG) const;
267e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach
268e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach    /// SelectAddressRegImm - Returns true if the address N can be represented
269e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach    /// by a base register plus a signed 16-bit displacement [r+imm], and if it
270ef6eb9c7ab7967790566c5e2d47977d89fc060eeJim Grosbach    /// is not better represented as reg+reg.
271ef6eb9c7ab7967790566c5e2d47977d89fc060eeJim Grosbach    bool SelectAddressRegImm(SDValue N, SDValue &Disp, SDValue &Base,
272ef6eb9c7ab7967790566c5e2d47977d89fc060eeJim Grosbach                             SelectionDAG &DAG) const;
273ef6eb9c7ab7967790566c5e2d47977d89fc060eeJim Grosbach
274e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach    /// SelectAddressRegRegOnly - Given the specified addressed, force it to be
275e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach    /// represented as an indexed [r+r] operation.
276e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach    bool SelectAddressRegRegOnly(SDValue N, SDValue &Base, SDValue &Index,
277e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach                                 SelectionDAG &DAG) const;
278e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach
279e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach    /// SelectAddressRegImmShift - Returns true if the address N can be
280e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach    /// represented by a base register plus a signed 14-bit displacement
281e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach    /// [r+imm*4].  Suitable for use by STD and friends.
282e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach    bool SelectAddressRegImmShift(SDValue N, SDValue &Disp, SDValue &Base,
283e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach                                  SelectionDAG &DAG) const;
284e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach
285e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach
286e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach    /// LowerOperation - Provide custom lowering hooks for some operations.
287e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach    ///
288e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach    virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG);
289e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach
290e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach    /// ReplaceNodeResults - Replace the results of node with an illegal result
291e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach    /// type with new values built out of custom code.
292312b7c950a27f72a811b3fdbed26e2e08eb20c31Jim Grosbach    ///
293e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach    virtual void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results,
294e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach                                    SelectionDAG &DAG);
295e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach
296e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach    virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
297e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach
298d385fd62cb43435b3ad70d789198d34bf148e579Evan Cheng    virtual void computeMaskedBitsForTargetNode(const SDValue Op,
299d385fd62cb43435b3ad70d789198d34bf148e579Evan Cheng                                                const APInt &Mask,
30072977a45a8ad9d9524c9b49399e89fb9a3a676edAnton Korobeynikov                                                APInt &KnownZero,
30172977a45a8ad9d9524c9b49399e89fb9a3a676edAnton Korobeynikov                                                APInt &KnownOne,
30272977a45a8ad9d9524c9b49399e89fb9a3a676edAnton Korobeynikov                                                const SelectionDAG &DAG,
30372977a45a8ad9d9524c9b49399e89fb9a3a676edAnton Korobeynikov                                                unsigned Depth = 0) const;
30472977a45a8ad9d9524c9b49399e89fb9a3a676edAnton Korobeynikov
30572977a45a8ad9d9524c9b49399e89fb9a3a676edAnton Korobeynikov    virtual MachineBasicBlock *EmitInstrWithCustomInserter(MachineInstr *MI,
30672977a45a8ad9d9524c9b49399e89fb9a3a676edAnton Korobeynikov                                                         MachineBasicBlock *MBB,
30772977a45a8ad9d9524c9b49399e89fb9a3a676edAnton Korobeynikov                    DenseMap<MachineBasicBlock*, MachineBasicBlock*> *EM) const;
308b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    MachineBasicBlock *EmitAtomicBinary(MachineInstr *MI,
309b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                                        MachineBasicBlock *MBB, bool is64Bit,
310e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                                        unsigned BinOpcode) const;
311825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    MachineBasicBlock *EmitPartwordAtomicBinary(MachineInstr *MI,
312825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                                MachineBasicBlock *MBB,
313b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                                            bool is8bit, unsigned Opcode) const;
314b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands
315927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov    ConstraintType getConstraintType(const std::string &Constraint) const;
316b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    std::pair<unsigned, const TargetRegisterClass*>
317b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands      getRegForInlineAsmConstraint(const std::string &Constraint,
318b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                                   EVT VT) const;
319b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands
320b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    /// getByValTypeAlignment - Return the desired alignment for ByVal aggregate
321e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    /// function arguments in the caller parameter area.  This is the actual
322825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    /// alignment, not its logarithm.
323825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    unsigned getByValTypeAlignment(const Type *Ty) const;
324b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands
325825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
326e36bfe678df09f46e1eac60b15105c1ccd2c5382Bruno Cardoso Lopes    /// vector.  If it is invalid, don't add anything to Ops. If hasMemory is
327825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    /// true it means one of the asm constraint of the inline asm instruction
328e36bfe678df09f46e1eac60b15105c1ccd2c5382Bruno Cardoso Lopes    /// being processed is 'm'.
329825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    virtual void LowerAsmOperandForConstraint(SDValue Op,
330825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                              char ConstraintLetter,
331e36bfe678df09f46e1eac60b15105c1ccd2c5382Bruno Cardoso Lopes                                              bool hasMemory,
332825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                              std::vector<SDValue> &Ops,
333e36bfe678df09f46e1eac60b15105c1ccd2c5382Bruno Cardoso Lopes                                              SelectionDAG &DAG) const;
334b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands
335927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov    /// isLegalAddressingMode - Return true if the addressing mode represented
336b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    /// by AM is legal for this target, for a load/store of the specified type.
337b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    virtual bool isLegalAddressingMode(const AddrMode &AM, const Type *Ty)const;
338b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands
339b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    /// isLegalAddressImmediate - Return true if the integer value can be used
340b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    /// as the offset of the target addressing mode for load / store of the
341e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    /// given type.
342825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    virtual bool isLegalAddressImmediate(int64_t V, const Type *Ty) const;
343825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson
3448aa207ee306b6a5ce753511a5f811fc1cd2468e2Sanjiv Gupta    /// isLegalAddressImmediate - Return true if the GlobalValue can be used as
345825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    /// the offset of the target addressing mode.
3468aa207ee306b6a5ce753511a5f811fc1cd2468e2Sanjiv Gupta    virtual bool isLegalAddressImmediate(GlobalValue *GV) const;
347825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson
348b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    virtual bool
349825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    IsEligibleForTailCallOptimization(SDValue Callee,
350b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                                      CallingConv::ID CalleeCC,
351825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                      bool isVarArg,
352b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                                      const SmallVectorImpl<ISD::InputArg> &Ins,
353825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                      SelectionDAG& DAG) const;
354de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov
355de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov    virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
356de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov
357de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov    virtual EVT getOptimalMemOpType(uint64_t Size, unsigned Align,
358825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                    bool isSrcConst, bool isSrcStr,
359b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                                    SelectionDAG &DAG) const;
360825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson
361b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    /// getFunctionAlignment - Return the Log2 alignment of this function.
362825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    virtual unsigned getFunctionAlignment(const Function *F) const;
363b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands
364825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  private:
365825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDValue getFramePointerFrameIndex(SelectionDAG & DAG) const;
366b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    SDValue getReturnAddrFrameIndex(SelectionDAG & DAG) const;
367825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson
368b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    SDValue EmitTailCallLoadFPAndRetAddr(SelectionDAG & DAG,
369825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                         int SPDiff,
370b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                                         SDValue Chain,
371825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                         SDValue &LROpOut,
372825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                         SDValue &FPOpOut,
373b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                                         bool isDarwinABI,
374825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                         DebugLoc dl);
375b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands
376825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG);
377b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG);
378b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG);
379b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG);
380b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG);
381b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG);
382b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG);
383b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG);
384e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    SDValue LowerTRAMPOLINE(SDValue Op, SelectionDAG &DAG);
385825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG,
386825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                           int VarArgsFrameIndex, int VarArgsStackOffset,
3878aa207ee306b6a5ce753511a5f811fc1cd2468e2Sanjiv Gupta                           unsigned VarArgsNumGPR, unsigned VarArgsNumFPR,
388825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                           const PPCSubtarget &Subtarget);
3898aa207ee306b6a5ce753511a5f811fc1cd2468e2Sanjiv Gupta    SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG, int VarArgsFrameIndex,
390825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                         int VarArgsStackOffset, unsigned VarArgsNumGPR,
391b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                         unsigned VarArgsNumFPR, const PPCSubtarget &Subtarget);
392825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDValue LowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG,
393b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                                const PPCSubtarget &Subtarget);
394825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG,
395b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                                      const PPCSubtarget &Subtarget);
396825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG);
397de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov    SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG, DebugLoc dl);
398de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov    SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG);
399de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov    SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG);
400de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov    SDValue LowerSHL_PARTS(SDValue Op, SelectionDAG &DAG);
401825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDValue LowerSRL_PARTS(SDValue Op, SelectionDAG &DAG);
402b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    SDValue LowerSRA_PARTS(SDValue Op, SelectionDAG &DAG);
403825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG);
404b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG);
405825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG);
406b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    SDValue LowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG);
407825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDValue LowerMUL(SDValue Op, SelectionDAG &DAG);
408825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson
409b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
410825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                            CallingConv::ID CallConv, bool isVarArg,
411b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                            const SmallVectorImpl<ISD::InputArg> &Ins,
412825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                            DebugLoc dl, SelectionDAG &DAG,
413b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                            SmallVectorImpl<SDValue> &InVals);
414825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDValue FinishCall(CallingConv::ID CallConv, DebugLoc dl, bool isTailCall,
415825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                       bool isVarArg,
416b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                       SelectionDAG &DAG,
417825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                       SmallVector<std::pair<unsigned, SDValue>, 8>
418b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                         &RegsToPass,
419825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                       SDValue InFlag, SDValue Chain,
420b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                       SDValue &Callee,
421b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                       int SPDiff, unsigned NumBytes,
422b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                       const SmallVectorImpl<ISD::InputArg> &Ins,
423b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                       SmallVectorImpl<SDValue> &InVals);
424b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands
425b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    virtual SDValue
426b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands      LowerFormalArguments(SDValue Chain,
427e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                           CallingConv::ID CallConv, bool isVarArg,
428825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                           const SmallVectorImpl<ISD::InputArg> &Ins,
429825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                           DebugLoc dl, SelectionDAG &DAG,
430b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                           SmallVectorImpl<SDValue> &InVals);
431825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson
432b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    virtual SDValue
433825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson      LowerCall(SDValue Chain, SDValue Callee,
434b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                CallingConv::ID CallConv, bool isVarArg, bool isTailCall,
435825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                const SmallVectorImpl<ISD::OutputArg> &Outs,
436b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                const SmallVectorImpl<ISD::InputArg> &Ins,
437825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                DebugLoc dl, SelectionDAG &DAG,
438825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                SmallVectorImpl<SDValue> &InVals);
439b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands
440825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    virtual SDValue
441b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands      LowerReturn(SDValue Chain,
442825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                  CallingConv::ID CallConv, bool isVarArg,
443b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                  const SmallVectorImpl<ISD::OutputArg> &Outs,
444825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                  DebugLoc dl, SelectionDAG &DAG);
445b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands
446825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDValue
447825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson      LowerFormalArguments_Darwin(SDValue Chain,
448b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                                  CallingConv::ID CallConv, bool isVarArg,
449825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                  const SmallVectorImpl<ISD::InputArg> &Ins,
450b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                                  DebugLoc dl, SelectionDAG &DAG,
451825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                  SmallVectorImpl<SDValue> &InVals);
452b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    SDValue
453825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson      LowerFormalArguments_SVR4(SDValue Chain,
454b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                                CallingConv::ID CallConv, bool isVarArg,
455b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                                const SmallVectorImpl<ISD::InputArg> &Ins,
456b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                                DebugLoc dl, SelectionDAG &DAG,
457b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                                SmallVectorImpl<SDValue> &InVals);
458b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands
459b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    SDValue
460b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands      LowerCall_Darwin(SDValue Chain, SDValue Callee,
461e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                       CallingConv::ID CallConv, bool isVarArg, bool isTailCall,
462825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                       const SmallVectorImpl<ISD::OutputArg> &Outs,
463825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                       const SmallVectorImpl<ISD::InputArg> &Ins,
464b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                       DebugLoc dl, SelectionDAG &DAG,
465825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                       SmallVectorImpl<SDValue> &InVals);
466b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands    SDValue
467825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson      LowerCall_SVR4(SDValue Chain, SDValue Callee,
468b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                     CallingConv::ID CallConv, bool isVarArg, bool isTailCall,
469825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                     const SmallVectorImpl<ISD::OutputArg> &Outs,
470b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands                     const SmallVectorImpl<ISD::InputArg> &Ins,
471825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                     DebugLoc dl, SelectionDAG &DAG,
472825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                     SmallVectorImpl<SDValue> &InVals);
473b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands  };
474825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson}
475b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands
476825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson#endif   // LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H
477b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands