121e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman//===-- PPCISelLowering.h - PPC32 DAG Lowering Interface --------*- C++ -*-===//
27c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner//
37c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner//                     The LLVM Compiler Infrastructure
47c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
77c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner//
87c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner//===----------------------------------------------------------------------===//
97c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner//
107c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner// This file defines the interfaces that PPC uses to lower LLVM code into a
117c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner// selection DAG.
127c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner//
137c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner//===----------------------------------------------------------------------===//
147c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner
157c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner#ifndef LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H
167c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner#define LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H
177c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner
182668959b8879097db368aec7d76c455260abc75bChris Lattner#include "PPC.h"
19ff56d1a2011f239e114267c13302ea26db4f8046Hal Finkel#include "PPCInstrInfo.h"
207ee74a663a3b4d4ee6b55d23362f347ed1d390c2Hal Finkel#include "PPCRegisterInfo.h"
21331d1bc5dfe1be9090e29f9af9579888a63a9a79Chris Lattner#include "PPCSubtarget.h"
2279aa3417eb6f58d668aadfedf075240a41d35a26Craig Topper#include "llvm/CodeGen/SelectionDAG.h"
23d3f7766f2363862b9c8586d2f78bc413223240d3Bill Schmidt#include "llvm/CodeGen/CallingConvLower.h"
24a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/Target/TargetLowering.h"
257c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner
267c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattnernamespace llvm {
270bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner  namespace PPCISD {
280bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner    enum NodeType {
293c983c3dc19bb83807f978c04737b4572be90a93Nate Begeman      // Start the numbering where the builtin ops and target ops leave off.
300ba2bcfcc3149a25d08aa8aa00fb6c34a4e25bddDan Gohman      FIRST_NUMBER = ISD::BUILTIN_OP_END,
310bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner
320bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner      /// FSEL - Traditional three-operand fsel node.
330bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner      ///
340bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner      FSEL,
3595771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
36c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman      /// FCFID - The FCFID instruction, taking an f64 operand and producing
37c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman      /// and f64 value containing the FP representation of the integer that
38c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman      /// was temporarily in the f64 operand.
39c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman      FCFID,
4095771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
4146479197843ecb651adc9417c49bbd1b00acfcb6Hal Finkel      /// Newer FCFID[US] integer-to-floating-point conversion instructions for
4246479197843ecb651adc9417c49bbd1b00acfcb6Hal Finkel      /// unsigned integers and single-precision outputs.
4346479197843ecb651adc9417c49bbd1b00acfcb6Hal Finkel      FCFIDU, FCFIDS, FCFIDUS,
4446479197843ecb651adc9417c49bbd1b00acfcb6Hal Finkel
4595771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson      /// FCTI[D,W]Z - The FCTIDZ and FCTIWZ instructions, taking an f32 or f64
46c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman      /// operand, producing an f64 value containing the integer representation
47c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman      /// of that FP value.
48c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman      FCTIDZ, FCTIWZ,
4995771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
5046479197843ecb651adc9417c49bbd1b00acfcb6Hal Finkel      /// Newer FCTI[D,W]UZ floating-point-to-integer conversion instructions for
5146479197843ecb651adc9417c49bbd1b00acfcb6Hal Finkel      /// unsigned integers.
5246479197843ecb651adc9417c49bbd1b00acfcb6Hal Finkel      FCTIDUZ, FCTIWUZ,
5346479197843ecb651adc9417c49bbd1b00acfcb6Hal Finkel
54827307b95fa909e35a3ddef612f9f50ffcf0963aHal Finkel      /// Reciprocal estimate instructions (unary FP ops).
55827307b95fa909e35a3ddef612f9f50ffcf0963aHal Finkel      FRE, FRSQRTE,
56827307b95fa909e35a3ddef612f9f50ffcf0963aHal Finkel
57993aeb2ed93f99faf1438f1b67cd922989306828Nate Begeman      // VMADDFP, VNMSUBFP - The VMADDFP and VNMSUBFP instructions, taking
58993aeb2ed93f99faf1438f1b67cd922989306828Nate Begeman      // three v4f32 operands and producing a v4f32 result.
59993aeb2ed93f99faf1438f1b67cd922989306828Nate Begeman      VMADDFP, VNMSUBFP,
6095771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
61f1d0b2bedaa065972a5ba17259055c1176cd1497Chris Lattner      /// VPERM - The PPC VPERM Instruction.
62f1d0b2bedaa065972a5ba17259055c1176cd1497Chris Lattner      ///
63f1d0b2bedaa065972a5ba17259055c1176cd1497Chris Lattner      VPERM,
6495771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
65860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner      /// Hi/Lo - These represent the high and low 16-bit parts of a global
66860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner      /// address respectively.  These nodes have two operands, the first of
67860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner      /// which must be a TargetGlobalAddress, and the second of which must be a
68860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner      /// Constant.  Selected naively, these turn into 'lis G+C' and 'li G+C',
69860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner      /// though these are usually folded into other nodes.
70860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner      Hi, Lo,
7195771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
726b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller      TOC_ENTRY,
736b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller
743a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      /// The following three target-specific nodes are used for calls through
753a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      /// function pointers in the 64-bit SVR4 ABI.
763a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller
773a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      /// Restore the TOC from the TOC save area of the current stack frame.
783a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      /// This is basically a hard coded load instruction which additionally
793a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      /// takes/produces a flag.
803a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      TOC_RESTORE,
813a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller
823a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      /// Like a regular LOAD but additionally taking/producing a flag.
833a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      LOAD,
843a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller
853a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      /// LOAD into r2 (also taking/producing a flag). Like TOC_RESTORE, this is
863a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      /// a hard coded load instruction.
873a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      LOAD_TOC,
883a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller
892f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey      /// OPRC, CHAIN = DYNALLOC(CHAIN, NEGSIZE, FRAME_INDEX)
902f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey      /// This instruction is lowered in PPCRegisterInfo::eliminateFrameIndex to
912f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey      /// compute an allocation on the stack.
922f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey      DYNALLOC,
9395771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
94860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner      /// GlobalBaseReg - On Darwin, this node represents the result of the mflr
95860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner      /// at function entry, used for PIC code.
96860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner      GlobalBaseReg,
9795771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
984172b10ca1adfc1026428e5f522aaab98bd939adChris Lattner      /// These nodes represent the 32-bit PPC shifts that operate on 6-bit
994172b10ca1adfc1026428e5f522aaab98bd939adChris Lattner      /// shift amounts.  These nodes are generated by the multi-precision shift
1004172b10ca1adfc1026428e5f522aaab98bd939adChris Lattner      /// code.
1014172b10ca1adfc1026428e5f522aaab98bd939adChris Lattner      SRL, SRA, SHL,
10295771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
103c703a8fbf8653ac8302ae368391a4954c307ca2cChris Lattner      /// CALL - A direct function call.
10486765fbe170198e7bb40fd8499d1354f4c786f60Ulrich Weigand      /// CALL_NOP is a call with the special NOP which follows 64-bit
1055b00ceaeeabff8c25abb09926343c3fcb06053d8Hal Finkel      /// SVR4 calls.
10686765fbe170198e7bb40fd8499d1354f4c786f60Ulrich Weigand      CALL, CALL_NOP,
1076b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller
108c703a8fbf8653ac8302ae368391a4954c307ca2cChris Lattner      /// CHAIN,FLAG = MTCTR(VAL, CHAIN[, INFLAG]) - Directly corresponds to a
109c703a8fbf8653ac8302ae368391a4954c307ca2cChris Lattner      /// MTCTR instruction.
110c703a8fbf8653ac8302ae368391a4954c307ca2cChris Lattner      MTCTR,
11195771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
112c703a8fbf8653ac8302ae368391a4954c307ca2cChris Lattner      /// CHAIN,FLAG = BCTRL(CHAIN, INFLAG) - Directly corresponds to a
113c703a8fbf8653ac8302ae368391a4954c307ca2cChris Lattner      /// BCTRL instruction.
11486765fbe170198e7bb40fd8499d1354f4c786f60Ulrich Weigand      BCTRL,
11595771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
1169e4dd9dfc97f3930f58ca6e47bebbd8eb5cdd8a1Nate Begeman      /// Return with a flag operand, matched by 'blr'
1179e4dd9dfc97f3930f58ca6e47bebbd8eb5cdd8a1Nate Begeman      RET_FLAG,
11895771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
119965b20e39c7fd73846e9b6ed55ba90e032ae3b1bUlrich Weigand      /// R32 = MFOCRF(CRREG, INFLAG) - Represents the MFOCRF instruction.
120965b20e39c7fd73846e9b6ed55ba90e032ae3b1bUlrich Weigand      /// This copies the bits corresponding to the specified CRREG into the
121965b20e39c7fd73846e9b6ed55ba90e032ae3b1bUlrich Weigand      /// resultant GPR.  Bits corresponding to other CR regs are undefined.
122965b20e39c7fd73846e9b6ed55ba90e032ae3b1bUlrich Weigand      MFOCRF,
123a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner
1247ee74a663a3b4d4ee6b55d23362f347ed1d390c2Hal Finkel      // EH_SJLJ_SETJMP - SjLj exception handling setjmp.
1257ee74a663a3b4d4ee6b55d23362f347ed1d390c2Hal Finkel      EH_SJLJ_SETJMP,
1267ee74a663a3b4d4ee6b55d23362f347ed1d390c2Hal Finkel
1277ee74a663a3b4d4ee6b55d23362f347ed1d390c2Hal Finkel      // EH_SJLJ_LONGJMP - SjLj exception handling longjmp.
1287ee74a663a3b4d4ee6b55d23362f347ed1d390c2Hal Finkel      EH_SJLJ_LONGJMP,
1297ee74a663a3b4d4ee6b55d23362f347ed1d390c2Hal Finkel
130a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner      /// RESVEC = VCMP(LHS, RHS, OPC) - Represents one of the altivec VCMP*
131a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner      /// instructions.  For lack of better number, we use the opcode number
132a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner      /// encoding for the OPC field to identify the compare.  For example, 838
133a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner      /// is VCMPGTSH.
134a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner      VCMP,
13595771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
1366d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner      /// RESVEC, OUTFLAG = VCMPo(LHS, RHS, OPC) - Represents one of the
13795771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson      /// altivec VCMP*o instructions.  For lack of better number, we use the
1386d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner      /// opcode number encoding for the OPC field to identify the compare.  For
1396d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner      /// example, 838 is VCMPGTSH.
14090564f26d17701e11effa2f4e0fb9a18d8a91274Chris Lattner      VCMPo,
14195771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
14290564f26d17701e11effa2f4e0fb9a18d8a91274Chris Lattner      /// CHAIN = COND_BRANCH CHAIN, CRRC, OPC, DESTBB [, INFLAG] - This
14390564f26d17701e11effa2f4e0fb9a18d8a91274Chris Lattner      /// corresponds to the COND_BRANCH pseudo instruction.  CRRC is the
14490564f26d17701e11effa2f4e0fb9a18d8a91274Chris Lattner      /// condition register to branch on, OPC is the branch opcode to use (e.g.
14590564f26d17701e11effa2f4e0fb9a18d8a91274Chris Lattner      /// PPC::BLE), DESTBB is the destination block to branch to, and INFLAG is
14690564f26d17701e11effa2f4e0fb9a18d8a91274Chris Lattner      /// an optional input flag argument.
147d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner      COND_BRANCH,
14895771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
149b1fd3cd78f8acd21dbf514b75fef991827c343b6Hal Finkel      /// CHAIN = BDNZ CHAIN, DESTBB - These are used to create counter-based
150b1fd3cd78f8acd21dbf514b75fef991827c343b6Hal Finkel      /// loops.
151b1fd3cd78f8acd21dbf514b75fef991827c343b6Hal Finkel      BDNZ, BDZ,
152b1fd3cd78f8acd21dbf514b75fef991827c343b6Hal Finkel
1537d35d3f432cb59d3d1c0884af3023de9b5cb10b1Ulrich Weigand      /// F8RC = FADDRTZ F8RC, F8RC - This is an FADD done with rounding
1547d35d3f432cb59d3d1c0884af3023de9b5cb10b1Ulrich Weigand      /// towards zero.  Used only as part of the long double-to-int
1557d35d3f432cb59d3d1c0884af3023de9b5cb10b1Ulrich Weigand      /// conversion sequence.
1566eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen      FADDRTZ,
1576eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen
1587d35d3f432cb59d3d1c0884af3023de9b5cb10b1Ulrich Weigand      /// F8RC = MFFS - This moves the FPSCR (not modeled) into the register.
1597d35d3f432cb59d3d1c0884af3023de9b5cb10b1Ulrich Weigand      MFFS,
16054fc97dcdc0ab747f49bd09c5a877bfd2a00e364Evan Cheng
1618608f2eff2dab5345243c40d0bca9138f2dce6f1Evan Cheng      /// LARX = This corresponds to PPC l{w|d}arx instrcution: load and
16254fc97dcdc0ab747f49bd09c5a877bfd2a00e364Evan Cheng      /// reserve indexed. This is used to implement atomic operations.
1638608f2eff2dab5345243c40d0bca9138f2dce6f1Evan Cheng      LARX,
16454fc97dcdc0ab747f49bd09c5a877bfd2a00e364Evan Cheng
1658608f2eff2dab5345243c40d0bca9138f2dce6f1Evan Cheng      /// STCX = This corresponds to PPC stcx. instrcution: store conditional
1668608f2eff2dab5345243c40d0bca9138f2dce6f1Evan Cheng      /// indexed. This is used to implement atomic operations.
1678608f2eff2dab5345243c40d0bca9138f2dce6f1Evan Cheng      STCX,
16854fc97dcdc0ab747f49bd09c5a877bfd2a00e364Evan Cheng
16930e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      /// TC_RETURN - A tail call return.
17030e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      ///   operand #0 chain
17130e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      ///   operand #1 callee (register or absolute)
17230e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      ///   operand #2 stack adjustment
17330e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      ///   operand #3 optional in flag
174c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      TC_RETURN,
175c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
17682b3821208286aeb43f603fdac98832bd662dad9Hal Finkel      /// ch, gl = CR6[UN]SET ch, inglue - Toggle CR bit 6 for SVR4 vararg calls
17782b3821208286aeb43f603fdac98832bd662dad9Hal Finkel      CR6SET,
17882b3821208286aeb43f603fdac98832bd662dad9Hal Finkel      CR6UNSET,
17982b3821208286aeb43f603fdac98832bd662dad9Hal Finkel
180b453e16855f347e300f1dc0cd0dfbdd65c27b0d2Bill Schmidt      /// G8RC = ADDIS_GOT_TPREL_HA %X2, Symbol - Used by the initial-exec
181b453e16855f347e300f1dc0cd0dfbdd65c27b0d2Bill Schmidt      /// TLS model, produces an ADDIS8 instruction that adds the GOT
1829d86f9cc3ab4db75b388c2761bf3dd205f84a6d8NAKAMURA Takumi      /// base to sym\@got\@tprel\@ha.
183b453e16855f347e300f1dc0cd0dfbdd65c27b0d2Bill Schmidt      ADDIS_GOT_TPREL_HA,
184b453e16855f347e300f1dc0cd0dfbdd65c27b0d2Bill Schmidt
185b453e16855f347e300f1dc0cd0dfbdd65c27b0d2Bill Schmidt      /// G8RC = LD_GOT_TPREL_L Symbol, G8RReg - Used by the initial-exec
186d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt      /// TLS model, produces a LD instruction with base register G8RReg
1879d86f9cc3ab4db75b388c2761bf3dd205f84a6d8NAKAMURA Takumi      /// and offset sym\@got\@tprel\@l.  This completes the addition that
188b453e16855f347e300f1dc0cd0dfbdd65c27b0d2Bill Schmidt      /// finds the offset of "sym" relative to the thread pointer.
189b453e16855f347e300f1dc0cd0dfbdd65c27b0d2Bill Schmidt      LD_GOT_TPREL_L,
190d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt
191d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt      /// G8RC = ADD_TLS G8RReg, Symbol - Used by the initial-exec TLS
192d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt      /// model, produces an ADD instruction that adds the contents of
193d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt      /// G8RReg to the thread pointer.  Symbol contains a relocation
1949d86f9cc3ab4db75b388c2761bf3dd205f84a6d8NAKAMURA Takumi      /// sym\@tls which is to be replaced by the thread pointer and
195d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt      /// identifies to the linker that the instruction is part of a
196d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt      /// TLS sequence.
197d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt      ADD_TLS,
198d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt
19957ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      /// G8RC = ADDIS_TLSGD_HA %X2, Symbol - For the general-dynamic TLS
20057ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      /// model, produces an ADDIS8 instruction that adds the GOT base
2019d86f9cc3ab4db75b388c2761bf3dd205f84a6d8NAKAMURA Takumi      /// register to sym\@got\@tlsgd\@ha.
20257ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      ADDIS_TLSGD_HA,
20357ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt
20457ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      /// G8RC = ADDI_TLSGD_L G8RReg, Symbol - For the general-dynamic TLS
20557ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      /// model, produces an ADDI8 instruction that adds G8RReg to
2069d86f9cc3ab4db75b388c2761bf3dd205f84a6d8NAKAMURA Takumi      /// sym\@got\@tlsgd\@l.
20757ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      ADDI_TLSGD_L,
20857ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt
20957ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      /// G8RC = GET_TLS_ADDR %X3, Symbol - For the general-dynamic TLS
2109d86f9cc3ab4db75b388c2761bf3dd205f84a6d8NAKAMURA Takumi      /// model, produces a call to __tls_get_addr(sym\@tlsgd).
21157ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      GET_TLS_ADDR,
21257ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt
213349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt      /// G8RC = ADDIS_TLSLD_HA %X2, Symbol - For the local-dynamic TLS
214349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt      /// model, produces an ADDIS8 instruction that adds the GOT base
2159d86f9cc3ab4db75b388c2761bf3dd205f84a6d8NAKAMURA Takumi      /// register to sym\@got\@tlsld\@ha.
216349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt      ADDIS_TLSLD_HA,
217349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt
218349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt      /// G8RC = ADDI_TLSLD_L G8RReg, Symbol - For the local-dynamic TLS
219349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt      /// model, produces an ADDI8 instruction that adds G8RReg to
2209d86f9cc3ab4db75b388c2761bf3dd205f84a6d8NAKAMURA Takumi      /// sym\@got\@tlsld\@l.
221349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt      ADDI_TLSLD_L,
222349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt
223349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt      /// G8RC = GET_TLSLD_ADDR %X3, Symbol - For the local-dynamic TLS
2249d86f9cc3ab4db75b388c2761bf3dd205f84a6d8NAKAMURA Takumi      /// model, produces a call to __tls_get_addr(sym\@tlsld).
225349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt      GET_TLSLD_ADDR,
226349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt
227349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt      /// G8RC = ADDIS_DTPREL_HA %X3, Symbol, Chain - For the
228349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt      /// local-dynamic TLS model, produces an ADDIS8 instruction
229225ed7069caae9ece32d8bd3d15c6e41e21cc04bMatt Arsenault      /// that adds X3 to sym\@dtprel\@ha. The Chain operand is needed
230349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt      /// to tie this in place following a copy to %X3 from the result
231349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt      /// of a GET_TLSLD_ADDR.
232349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt      ADDIS_DTPREL_HA,
233349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt
234349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt      /// G8RC = ADDI_DTPREL_L G8RReg, Symbol - For the local-dynamic TLS
235349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt      /// model, produces an ADDI8 instruction that adds G8RReg to
2369d86f9cc3ab4db75b388c2761bf3dd205f84a6d8NAKAMURA Takumi      /// sym\@got\@dtprel\@l.
237349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt      ADDI_DTPREL_L,
238349c2787cf9e174c8aa955bf8e3b09a405b2aeceBill Schmidt
239b34c79e4bbe5accbb54d0291e8bef5d2bfef32e4Bill Schmidt      /// VRRC = VADD_SPLAT Elt, EltSize - Temporary node to be expanded
240abc402886e407e21d845cccc15723cffd6e2dc20Bill Schmidt      /// during instruction selection to optimize a BUILD_VECTOR into
241abc402886e407e21d845cccc15723cffd6e2dc20Bill Schmidt      /// operations on splats.  This is necessary to avoid losing these
242abc402886e407e21d845cccc15723cffd6e2dc20Bill Schmidt      /// optimizations due to constant folding.
243b34c79e4bbe5accbb54d0291e8bef5d2bfef32e4Bill Schmidt      VADD_SPLAT,
244b34c79e4bbe5accbb54d0291e8bef5d2bfef32e4Bill Schmidt
2455bbdb190412a55436b808cfa59820b1e6cf08db0Bill Schmidt      /// CHAIN = SC CHAIN, Imm128 - System call.  The 7-bit unsigned
2465bbdb190412a55436b808cfa59820b1e6cf08db0Bill Schmidt      /// operand identifies the operating system entry point.
2475bbdb190412a55436b808cfa59820b1e6cf08db0Bill Schmidt      SC,
2485bbdb190412a55436b808cfa59820b1e6cf08db0Bill Schmidt
24995771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson      /// CHAIN = STBRX CHAIN, GPRC, Ptr, Type - This is a
250c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      /// byte-swapping store instruction.  It byte-swaps the low "Type" bits of
251c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      /// the GPRC input, then stores it through Ptr.  Type can be either i16 or
252c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      /// i32.
2539ad0f4907b3ba0916a8b6cdb95d298d2ddb7d405Hal Finkel      STBRX = ISD::FIRST_TARGET_MEMORY_OPCODE,
25495771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
25595771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson      /// GPRC, CHAIN = LBRX CHAIN, Ptr, Type - This is a
256c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      /// byte-swapping load instruction.  It loads "Type" bits, byte swaps it,
257c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      /// then puts it in the bottom bits of the GPRC.  TYPE can be either i16
258c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      /// or i32.
25934a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt      LBRX,
26034a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt
261f170cc9b2eb98efee40ee22cff6bcf401c209b00Hal Finkel      /// STFIWX - The STFIWX instruction.  The first operand is an input token
262f170cc9b2eb98efee40ee22cff6bcf401c209b00Hal Finkel      /// chain, then an f64 value to store, then an address to store it to.
263f170cc9b2eb98efee40ee22cff6bcf401c209b00Hal Finkel      STFIWX,
264f170cc9b2eb98efee40ee22cff6bcf401c209b00Hal Finkel
2658049ab15e4b638a07d6f230329945c2310eca27bHal Finkel      /// GPRC, CHAIN = LFIWAX CHAIN, Ptr - This is a floating-point
2668049ab15e4b638a07d6f230329945c2310eca27bHal Finkel      /// load which sign-extends from a 32-bit integer value into the
2678049ab15e4b638a07d6f230329945c2310eca27bHal Finkel      /// destination 64-bit register.
2688049ab15e4b638a07d6f230329945c2310eca27bHal Finkel      LFIWAX,
2698049ab15e4b638a07d6f230329945c2310eca27bHal Finkel
27046479197843ecb651adc9417c49bbd1b00acfcb6Hal Finkel      /// GPRC, CHAIN = LFIWZX CHAIN, Ptr - This is a floating-point
27146479197843ecb651adc9417c49bbd1b00acfcb6Hal Finkel      /// load which zero-extends from a 32-bit integer value into the
27246479197843ecb651adc9417c49bbd1b00acfcb6Hal Finkel      /// destination 64-bit register.
27346479197843ecb651adc9417c49bbd1b00acfcb6Hal Finkel      LFIWZX,
27446479197843ecb651adc9417c49bbd1b00acfcb6Hal Finkel
27553b0b0e75480121e4e01a7a76e17909e92b1762aBill Schmidt      /// G8RC = ADDIS_TOC_HA %X2, Symbol - For medium and large code model,
27653b0b0e75480121e4e01a7a76e17909e92b1762aBill Schmidt      /// produces an ADDIS8 instruction that adds the TOC base register to
2779d86f9cc3ab4db75b388c2761bf3dd205f84a6d8NAKAMURA Takumi      /// sym\@toc\@ha.
27834a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt      ADDIS_TOC_HA,
27934a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt
28053b0b0e75480121e4e01a7a76e17909e92b1762aBill Schmidt      /// G8RC = LD_TOC_L Symbol, G8RReg - For medium and large code model,
28153b0b0e75480121e4e01a7a76e17909e92b1762aBill Schmidt      /// produces a LD instruction with base register G8RReg and offset
2829d86f9cc3ab4db75b388c2761bf3dd205f84a6d8NAKAMURA Takumi      /// sym\@toc\@l. Preceded by an ADDIS_TOC_HA to form a full 32-bit offset.
28334a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt      LD_TOC_L,
28434a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt
28534a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt      /// G8RC = ADDI_TOC_L G8RReg, Symbol - For medium code model, produces
2869d86f9cc3ab4db75b388c2761bf3dd205f84a6d8NAKAMURA Takumi      /// an ADDI8 instruction that adds G8RReg to sym\@toc\@l.
28734a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt      /// Preceded by an ADDIS_TOC_HA to form a full 32-bit offset.
28834a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt      ADDI_TOC_L
289281b55ebeccd3f0d723888c1bb9ec6e476f708f1Chris Lattner    };
2903c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner  }
2913c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner
2923c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner  /// Define some predicates that are used for node matching.
2933c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner  namespace PPC {
294ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner    /// isVPKUHUMShuffleMask - Return true if this is the shuffle mask for a
295ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner    /// VPKUHUM instruction.
2969008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isVPKUHUMShuffleMask(ShuffleVectorSDNode *N, bool isUnary);
29795771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
298ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner    /// isVPKUWUMShuffleMask - Return true if this is the shuffle mask for a
299ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner    /// VPKUWUM instruction.
3009008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isVPKUWUMShuffleMask(ShuffleVectorSDNode *N, bool isUnary);
301116cc48e30b9c307bf3eec29c890b4ba25cd18dbChris Lattner
302116cc48e30b9c307bf3eec29c890b4ba25cd18dbChris Lattner    /// isVMRGLShuffleMask - Return true if this is a shuffle mask suitable for
303116cc48e30b9c307bf3eec29c890b4ba25cd18dbChris Lattner    /// a VRGL* instruction with the specified unit size (1,2 or 4 bytes).
3049008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isVMRGLShuffleMask(ShuffleVectorSDNode *N, unsigned UnitSize,
3059008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman                            bool isUnary);
306116cc48e30b9c307bf3eec29c890b4ba25cd18dbChris Lattner
307116cc48e30b9c307bf3eec29c890b4ba25cd18dbChris Lattner    /// isVMRGHShuffleMask - Return true if this is a shuffle mask suitable for
308116cc48e30b9c307bf3eec29c890b4ba25cd18dbChris Lattner    /// a VRGH* instruction with the specified unit size (1,2 or 4 bytes).
3099008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isVMRGHShuffleMask(ShuffleVectorSDNode *N, unsigned UnitSize,
3109008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman                            bool isUnary);
31195771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
312d0608e191ff9c00af68985f246410c219d1bec57Chris Lattner    /// isVSLDOIShuffleMask - If this is a vsldoi shuffle mask, return the shift
313d0608e191ff9c00af68985f246410c219d1bec57Chris Lattner    /// amount, otherwise return -1.
314f24380e78ecc8a2db1b2116867d878b1e7c6f6edChris Lattner    int isVSLDOIShuffleMask(SDNode *N, bool isUnary);
31595771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
3163c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner    /// isSplatShuffleMask - Return true if the specified VECTOR_SHUFFLE operand
3173c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner    /// specifies a splat of a single element that is suitable for input to
3183c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner    /// VSPLTB/VSPLTH/VSPLTW.
3199008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isSplatShuffleMask(ShuffleVectorSDNode *N, unsigned EltSize);
32095771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
32166ffe6be0c7b50100a00cb0cc87a5d4983818572Evan Cheng    /// isAllNegativeZeroVector - Returns true if all elements of build_vector
32266ffe6be0c7b50100a00cb0cc87a5d4983818572Evan Cheng    /// are -0.0.
32366ffe6be0c7b50100a00cb0cc87a5d4983818572Evan Cheng    bool isAllNegativeZeroVector(SDNode *N);
32466ffe6be0c7b50100a00cb0cc87a5d4983818572Evan Cheng
3253c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner    /// getVSPLTImmediate - Return the appropriate VSPLT* immediate to splat the
3263c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner    /// specified isSplatShuffleMask VECTOR_SHUFFLE mask.
3277ff7e674580adad7a5bccdbd74cf9c9f05e46d0fChris Lattner    unsigned getVSPLTImmediate(SDNode *N, unsigned EltSize);
32895771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
329e87192a854ff0f2f1904dd9ea282eb36059bb5afChris Lattner    /// get_VSPLTI_elt - If this is a build_vector of constants which can be
330140a58f9dfda30dbb80edd3da1b5632c178f7efcChris Lattner    /// formed by using a vspltis[bhw] instruction of the specified element
331140a58f9dfda30dbb80edd3da1b5632c178f7efcChris Lattner    /// size, return the constant being splatted.  The ByteSize field indicates
332140a58f9dfda30dbb80edd3da1b5632c178f7efcChris Lattner    /// the number of bytes of each element [124] -> [bhw].
333475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue get_VSPLTI_elt(SDNode *N, unsigned ByteSize, SelectionDAG &DAG);
3343c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner  }
33595771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
33621e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman  class PPCTargetLowering : public TargetLowering {
337331d1bc5dfe1be9090e29f9af9579888a63a9a79Chris Lattner    const PPCSubtarget &PPCSubTarget;
3381e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman
3397c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner  public:
34061e729e2e9517ab2d8887bab86fb377900fa1081Dan Gohman    explicit PPCTargetLowering(PPCTargetMachine &TM);
34195771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
342da6d20f0c15205923cb2c3ef4bf9b5d77de88881Chris Lattner    /// getTargetNodeName() - This method returns the name of a target specific
343da6d20f0c15205923cb2c3ef4bf9b5d77de88881Chris Lattner    /// DAG node.
344da6d20f0c15205923cb2c3ef4bf9b5d77de88881Chris Lattner    virtual const char *getTargetNodeName(unsigned Opcode) const;
345fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner
346a6b20ced765b67a85d9219d0c8547fc9c133e14fMichael Liao    virtual MVT getScalarShiftAmountTy(EVT LHSTy) const { return MVT::i32; }
34795771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
3485b8f82e35b51bf007de07a7ca9347d804084ddf8Scott Michel    /// getSetCCResultType - Return the ISD::SETCC ValueType
349225ed7069caae9ece32d8bd3d15c6e41e21cc04bMatt Arsenault    virtual EVT getSetCCResultType(LLVMContext &Context, EVT VT) const;
3505b8f82e35b51bf007de07a7ca9347d804084ddf8Scott Michel
351fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// getPreIndexedAddressParts - returns true by value, base pointer and
352fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// offset pointer and addressing mode by reference if the node's address
353fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// can be legally represented as pre-indexed load / store address.
354475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    virtual bool getPreIndexedAddressParts(SDNode *N, SDValue &Base,
355475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                           SDValue &Offset,
356144d8f09e139f691cafadbc17873943ba4c465f3Evan Cheng                                           ISD::MemIndexedMode &AM,
35773e0914848662404cf2aa18eb049ff5aae543388Dan Gohman                                           SelectionDAG &DAG) const;
35895771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
359fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// SelectAddressRegReg - Given the specified addressed, check to see if it
360fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// can be represented as an indexed [r+r] operation.  Returns false if it
361fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// can be more efficiently represented with [r+imm].
362475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    bool SelectAddressRegReg(SDValue N, SDValue &Base, SDValue &Index,
36373e0914848662404cf2aa18eb049ff5aae543388Dan Gohman                             SelectionDAG &DAG) const;
36495771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
365fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// SelectAddressRegImm - Returns true if the address N can be represented
366fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// by a base register plus a signed 16-bit displacement [r+imm], and if it
367347a5079e18278803bc05b197d325b8580e95610Ulrich Weigand    /// is not better represented as reg+reg.  If Aligned is true, only accept
368347a5079e18278803bc05b197d325b8580e95610Ulrich Weigand    /// displacements suitable for STD and friends, i.e. multiples of 4.
369475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    bool SelectAddressRegImm(SDValue N, SDValue &Disp, SDValue &Base,
370347a5079e18278803bc05b197d325b8580e95610Ulrich Weigand                             SelectionDAG &DAG, bool Aligned) const;
37195771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
372fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// SelectAddressRegRegOnly - Given the specified addressed, force it to be
373fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// represented as an indexed [r+r] operation.
374475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    bool SelectAddressRegRegOnly(SDValue N, SDValue &Base, SDValue &Index,
37573e0914848662404cf2aa18eb049ff5aae543388Dan Gohman                                 SelectionDAG &DAG) const;
376fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner
3773f31d492a5d0fadf11290e8453f8c519a89b1302Hal Finkel    Sched::Preference getSchedulingPreference(SDNode *N) const;
37895771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
379e4bc9ea0a560d8a0ba42f5a2da617e1f1f834710Chris Lattner    /// LowerOperation - Provide custom lowering hooks for some operations.
380e4bc9ea0a560d8a0ba42f5a2da617e1f1f834710Chris Lattner    ///
381d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
3821f873003266fbdec7c2c48a965c60f4e2e35a158Chris Lattner
3831607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    /// ReplaceNodeResults - Replace the results of node with an illegal result
3841607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    /// type with new values built out of custom code.
3851607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    ///
3861607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    virtual void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results,
387d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                    SelectionDAG &DAG) const;
3881607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands
389475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
39095771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
391475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    virtual void computeMaskedBitsForTargetNode(const SDValue Op,
39295771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson                                                APInt &KnownZero,
393fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman                                                APInt &KnownOne,
394ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman                                                const SelectionDAG &DAG,
395bbe77de450ef36b4f83cc3b57705a9758adbd925Chris Lattner                                                unsigned Depth = 0) const;
3964a95945fa5aa431110f50092f4a45d24772a553bNate Begeman
397af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman    virtual MachineBasicBlock *
398af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman      EmitInstrWithCustomInserter(MachineInstr *MI,
399af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman                                  MachineBasicBlock *MBB) const;
40095771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson    MachineBasicBlock *EmitAtomicBinary(MachineInstr *MI,
401bdab93a2ef5d9574bb4e322e020849f9bc9c90d7Dale Johannesen                                        MachineBasicBlock *MBB, bool is64Bit,
4021fdbc1dd4e9cb42c79a30e8dc308c322e923cc52Dan Gohman                                        unsigned BinOpcode) const;
40395771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson    MachineBasicBlock *EmitPartwordAtomicBinary(MachineInstr *MI,
40495771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson                                                MachineBasicBlock *MBB,
4051fdbc1dd4e9cb42c79a30e8dc308c322e923cc52Dan Gohman                                            bool is8bit, unsigned Opcode) const;
40695771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
4077ee74a663a3b4d4ee6b55d23362f347ed1d390c2Hal Finkel    MachineBasicBlock *emitEHSjLjSetJmp(MachineInstr *MI,
4087ee74a663a3b4d4ee6b55d23362f347ed1d390c2Hal Finkel                                        MachineBasicBlock *MBB) const;
4097ee74a663a3b4d4ee6b55d23362f347ed1d390c2Hal Finkel
4107ee74a663a3b4d4ee6b55d23362f347ed1d390c2Hal Finkel    MachineBasicBlock *emitEHSjLjLongJmp(MachineInstr *MI,
4117ee74a663a3b4d4ee6b55d23362f347ed1d390c2Hal Finkel                                         MachineBasicBlock *MBB) const;
4127ee74a663a3b4d4ee6b55d23362f347ed1d390c2Hal Finkel
4134234f57fa02b1f04a9f52a7b3c2aa22d32ac521cChris Lattner    ConstraintType getConstraintType(const std::string &Constraint) const;
41444ab89eb376af838d1123293a79975aede501464John Thompson
41544ab89eb376af838d1123293a79975aede501464John Thompson    /// Examine constraint string and operand type and determine a weight value.
41644ab89eb376af838d1123293a79975aede501464John Thompson    /// The operand object must already have been set up with the operand type.
41744ab89eb376af838d1123293a79975aede501464John Thompson    ConstraintWeight getSingleConstraintMatchWeight(
41844ab89eb376af838d1123293a79975aede501464John Thompson      AsmOperandInfo &info, const char *constraint) const;
41944ab89eb376af838d1123293a79975aede501464John Thompson
42095771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson    std::pair<unsigned, const TargetRegisterClass*>
421331d1bc5dfe1be9090e29f9af9579888a63a9a79Chris Lattner      getRegForInlineAsmConstraint(const std::string &Constraint,
4225b3fca50a08865f0db55fc92ad1c037a04e12177Chad Rosier                                   MVT VT) const;
423c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng
42428d08fdb9f6572cafd5aae95c7caffa3cd136d8eDale Johannesen    /// getByValTypeAlignment - Return the desired alignment for ByVal aggregate
42528d08fdb9f6572cafd5aae95c7caffa3cd136d8eDale Johannesen    /// function arguments in the caller parameter area.  This is the actual
42628d08fdb9f6572cafd5aae95c7caffa3cd136d8eDale Johannesen    /// alignment, not its logarithm.
427db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner    unsigned getByValTypeAlignment(Type *Ty) const;
42828d08fdb9f6572cafd5aae95c7caffa3cd136d8eDale Johannesen
42948884cd80b52be1528618f2e9b3425ac24e7b5caChris Lattner    /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
4301784d160e4efa75782884d451d0788b9457e67dcDale Johannesen    /// vector.  If it is invalid, don't add anything to Ops.
431475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    virtual void LowerAsmOperandForConstraint(SDValue Op,
432100c83341676d8aae8fc34b5452563ed08b14f3eEric Christopher                                              std::string &Constraint,
433475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                              std::vector<SDValue> &Ops,
4345e764233f398b6929b67701672a5e78fec20ce2eChris Lattner                                              SelectionDAG &DAG) const;
43595771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
436c9addb74883fef318140272768422656a694341fChris Lattner    /// isLegalAddressingMode - Return true if the addressing mode represented
437c9addb74883fef318140272768422656a694341fChris Lattner    /// by AM is legal for this target, for a load/store of the specified type.
438db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner    virtual bool isLegalAddressingMode(const AddrMode &AM, Type *Ty)const;
43995771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
44054aeea39a743effe88eedb43d2f7f4805e806ab5Dan Gohman    virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
44195771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
44242642d06c915a26af1400de6ce6a53c333e5c247Evan Cheng    /// getOptimalMemOpType - Returns the target specific optimal type for load
443f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// and store operations as a result of memset, memcpy, and memmove
444f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// lowering. If DstAlign is zero that means it's safe to destination
445f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// alignment can satisfy any constraint. Similarly if SrcAlign is zero it
446f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// means there isn't a need to check it against alignment requirement,
447946a3a9f22c967d5432eaab5fa464b91343477cdEvan Cheng    /// probably because the source does not need to be loaded. If 'IsMemset' is
448946a3a9f22c967d5432eaab5fa464b91343477cdEvan Cheng    /// true, that means it's expanding a memset. If 'ZeroMemset' is true, that
449946a3a9f22c967d5432eaab5fa464b91343477cdEvan Cheng    /// means it's a memset of zero. 'MemcpyStrSrc' indicates whether the memcpy
450946a3a9f22c967d5432eaab5fa464b91343477cdEvan Cheng    /// source is constant so it does not need to be loaded.
45137f32ee7ffe77d7c2bc1b185802e98979612f041Dan Gohman    /// It returns EVT::Other if the type should be determined using generic
45237f32ee7ffe77d7c2bc1b185802e98979612f041Dan Gohman    /// target-independent logic.
453f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    virtual EVT
4548108a80677a3ab5aff132aea5d340c0beb1ebef7NAKAMURA Takumi    getOptimalMemOpType(uint64_t Size, unsigned DstAlign, unsigned SrcAlign,
455946a3a9f22c967d5432eaab5fa464b91343477cdEvan Cheng                        bool IsMemset, bool ZeroMemset, bool MemcpyStrSrc,
45637f32ee7ffe77d7c2bc1b185802e98979612f041Dan Gohman                        MachineFunction &MF) const;
45754aeea39a743effe88eedb43d2f7f4805e806ab5Dan Gohman
4582d37f7b979a24930c444f9783173a90a6e548118Hal Finkel    /// Is unaligned memory access allowed for the given type, and is it fast
4592d37f7b979a24930c444f9783173a90a6e548118Hal Finkel    /// relative to software emulation.
4602d37f7b979a24930c444f9783173a90a6e548118Hal Finkel    virtual bool allowsUnalignedMemoryAccesses(EVT VT, bool *Fast = 0) const;
4612d37f7b979a24930c444f9783173a90a6e548118Hal Finkel
462e54885af9b54bfc7436a928a48d3db1ef88a2a70Stephen Lin    /// isFMAFasterThanFMulAndFAdd - Return true if an FMA operation is faster
463e54885af9b54bfc7436a928a48d3db1ef88a2a70Stephen Lin    /// than a pair of fmul and fadd instructions. fmuladd intrinsics will be
464e54885af9b54bfc7436a928a48d3db1ef88a2a70Stephen Lin    /// expanded to FMAs when this method returns true, otherwise fmuladd is
465e54885af9b54bfc7436a928a48d3db1ef88a2a70Stephen Lin    /// expanded to fmul + fadd.
466e54885af9b54bfc7436a928a48d3db1ef88a2a70Stephen Lin    virtual bool isFMAFasterThanFMulAndFAdd(EVT VT) const;
467070b8dba809dd75267327cc823118bf7e171d17dHal Finkel
468646cd7933b16b78443b06ce9ba2362e6695cb526Bill Schmidt    /// createFastISel - This method returns a target-specific FastISel object,
469646cd7933b16b78443b06ce9ba2362e6695cb526Bill Schmidt    /// or null if the target does not support "fast" instruction selection.
470646cd7933b16b78443b06ce9ba2362e6695cb526Bill Schmidt    virtual FastISel *createFastISel(FunctionLoweringInfo &FuncInfo,
471646cd7933b16b78443b06ce9ba2362e6695cb526Bill Schmidt                                     const TargetLibraryInfo *LibInfo) const;
472646cd7933b16b78443b06ce9ba2362e6695cb526Bill Schmidt
47354fc97dcdc0ab747f49bd09c5a877bfd2a00e364Evan Cheng  private:
474475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue getFramePointerFrameIndex(SelectionDAG & DAG) const;
475475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue getReturnAddrFrameIndex(SelectionDAG & DAG) const;
47630e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer
4770c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng    bool
4780c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng    IsEligibleForTailCallOptimization(SDValue Callee,
4790c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng                                      CallingConv::ID CalleeCC,
4800c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng                                      bool isVarArg,
4810c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng                                      const SmallVectorImpl<ISD::InputArg> &Ins,
4820c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng                                      SelectionDAG& DAG) const;
4830c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng
484475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue EmitTailCallLoadFPAndRetAddr(SelectionDAG & DAG,
48533c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen                                         int SPDiff,
48633c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen                                         SDValue Chain,
48733c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen                                         SDValue &LROpOut,
48833c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen                                         SDValue &FPOpOut,
4892a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller                                         bool isDarwinABI,
490ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                                         SDLoc dl) const;
491d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman
492d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
493d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
494d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
495d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
496fd42ed676e37c29364f53f848320b7cb706111e0Roman Divacky    SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
497d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
498d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
499d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
5004a544a79bd735967f1d33fe675ae4566dbd17813Duncan Sands    SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
5014a544a79bd735967f1d33fe675ae4566dbd17813Duncan Sands    SDValue LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
502475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG,
503d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                         const PPCSubtarget &Subtarget) const;
5041e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman    SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG,
505d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                       const PPCSubtarget &Subtarget) const;
5066ebf55d811bab50e7f42ee8cec60c125f6fe0cd2Roman Divacky    SDValue LowerVACOPY(SDValue Op, SelectionDAG &DAG,
5076ebf55d811bab50e7f42ee8cec60c125f6fe0cd2Roman Divacky                        const PPCSubtarget &Subtarget) const;
508475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue LowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG,
509d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                const PPCSubtarget &Subtarget) const;
510475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG,
511d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                      const PPCSubtarget &Subtarget) const;
512d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
513ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick    SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG, SDLoc dl) const;
51446479197843ecb651adc9417c49bbd1b00acfcb6Hal Finkel    SDValue LowerINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
515d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG) const;
516d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSHL_PARTS(SDValue Op, SelectionDAG &DAG) const;
517d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSRL_PARTS(SDValue Op, SelectionDAG &DAG) const;
518d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSRA_PARTS(SDValue Op, SelectionDAG &DAG) const;
519d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
520d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
521d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
522d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG) const;
523d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerMUL(SDValue Op, SelectionDAG &DAG) const;
52498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
52598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
52665c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                            CallingConv::ID CallConv, bool isVarArg,
52798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                            const SmallVectorImpl<ISD::InputArg> &Ins,
528ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                            SDLoc dl, SelectionDAG &DAG,
529d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                            SmallVectorImpl<SDValue> &InVals) const;
530ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick    SDValue FinishCall(CallingConv::ID CallConv, SDLoc dl, bool isTailCall,
53198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                       bool isVarArg,
53298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                       SelectionDAG &DAG,
53398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                       SmallVector<std::pair<unsigned, SDValue>, 8>
53498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                         &RegsToPass,
53598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                       SDValue InFlag, SDValue Chain,
53698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                       SDValue &Callee,
53798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                       int SPDiff, unsigned NumBytes,
53898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                       const SmallVectorImpl<ISD::InputArg> &Ins,
539d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                       SmallVectorImpl<SDValue> &InVals) const;
54098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
54198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    virtual SDValue
54298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman      LowerFormalArguments(SDValue Chain,
54365c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                           CallingConv::ID CallConv, bool isVarArg,
54498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           const SmallVectorImpl<ISD::InputArg> &Ins,
545ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                           SDLoc dl, SelectionDAG &DAG,
546d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                           SmallVectorImpl<SDValue> &InVals) const;
54798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
54898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    virtual SDValue
549d2ea0e10cbd158c93fb870cdd03001b9cd1156b8Justin Holewinski      LowerCall(TargetLowering::CallLoweringInfo &CLI,
550d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                SmallVectorImpl<SDValue> &InVals) const;
55198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
552d712f935f7e027a733741e6ca67b3237a59f65d1Hal Finkel    virtual bool
553d712f935f7e027a733741e6ca67b3237a59f65d1Hal Finkel      CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
554d712f935f7e027a733741e6ca67b3237a59f65d1Hal Finkel                   bool isVarArg,
555d712f935f7e027a733741e6ca67b3237a59f65d1Hal Finkel                   const SmallVectorImpl<ISD::OutputArg> &Outs,
556d712f935f7e027a733741e6ca67b3237a59f65d1Hal Finkel                   LLVMContext &Context) const;
557d712f935f7e027a733741e6ca67b3237a59f65d1Hal Finkel
55898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    virtual SDValue
55998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman      LowerReturn(SDValue Chain,
56065c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                  CallingConv::ID CallConv, bool isVarArg,
56198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                  const SmallVectorImpl<ISD::OutputArg> &Outs,
562c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman                  const SmallVectorImpl<SDValue> &OutVals,
563ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                  SDLoc dl, SelectionDAG &DAG) const;
56498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
56598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue
566726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt      extendArgForPPC64(ISD::ArgFlagsTy Flags, EVT ObjectVT, SelectionDAG &DAG,
567ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                        SDValue ArgVal, SDLoc dl) const;
568726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt
569726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt    void
570726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt      setMinReservedArea(MachineFunction &MF, SelectionDAG &DAG,
571726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                         unsigned nAltivecParamsAtEnd,
572726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                         unsigned MinReservedArea, bool isPPC64) const;
573726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt
574726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt    SDValue
575b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt      LowerFormalArguments_Darwin(SDValue Chain,
576b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt                                  CallingConv::ID CallConv, bool isVarArg,
577b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt                                  const SmallVectorImpl<ISD::InputArg> &Ins,
578ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                                  SDLoc dl, SelectionDAG &DAG,
579b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt                                  SmallVectorImpl<SDValue> &InVals) const;
580b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt    SDValue
581b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt      LowerFormalArguments_64SVR4(SDValue Chain,
58265c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                                  CallingConv::ID CallConv, bool isVarArg,
58398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                                  const SmallVectorImpl<ISD::InputArg> &Ins,
584ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                                  SDLoc dl, SelectionDAG &DAG,
585d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                  SmallVectorImpl<SDValue> &InVals) const;
58698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue
587419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt      LowerFormalArguments_32SVR4(SDValue Chain,
588419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                                  CallingConv::ID CallConv, bool isVarArg,
589419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                                  const SmallVectorImpl<ISD::InputArg> &Ins,
590ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                                  SDLoc dl, SelectionDAG &DAG,
591419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                                  SmallVectorImpl<SDValue> &InVals) const;
59298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
59398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue
594726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt      createMemcpyOutsideCallSeq(SDValue Arg, SDValue PtrOff,
595726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                                 SDValue CallSeqStart, ISD::ArgFlagsTy Flags,
596ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                                 SelectionDAG &DAG, SDLoc dl) const;
597726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt
598726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt    SDValue
599726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt      LowerCall_Darwin(SDValue Chain, SDValue Callee,
600726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                       CallingConv::ID CallConv,
601726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                       bool isVarArg, bool isTailCall,
602726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                       const SmallVectorImpl<ISD::OutputArg> &Outs,
603726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                       const SmallVectorImpl<SDValue> &OutVals,
604726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                       const SmallVectorImpl<ISD::InputArg> &Ins,
605ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                       SDLoc dl, SelectionDAG &DAG,
606726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                       SmallVectorImpl<SDValue> &InVals) const;
607726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt    SDValue
608726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt      LowerCall_64SVR4(SDValue Chain, SDValue Callee,
609419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                       CallingConv::ID CallConv,
6104bfcd4acbc7d12aa55f8de9af84a38422f0f6d83Evan Cheng                       bool isVarArg, bool isTailCall,
61198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                       const SmallVectorImpl<ISD::OutputArg> &Outs,
612c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman                       const SmallVectorImpl<SDValue> &OutVals,
61398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                       const SmallVectorImpl<ISD::InputArg> &Ins,
614ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                       SDLoc dl, SelectionDAG &DAG,
615d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                       SmallVectorImpl<SDValue> &InVals) const;
61698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue
617419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt    LowerCall_32SVR4(SDValue Chain, SDValue Callee, CallingConv::ID CallConv,
618419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                     bool isVarArg, bool isTailCall,
619419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                     const SmallVectorImpl<ISD::OutputArg> &Outs,
620419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                     const SmallVectorImpl<SDValue> &OutVals,
621419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                     const SmallVectorImpl<ISD::InputArg> &Ins,
622ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                     SDLoc dl, SelectionDAG &DAG,
623419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                     SmallVectorImpl<SDValue> &InVals) const;
6247ee74a663a3b4d4ee6b55d23362f347ed1d390c2Hal Finkel
6257ee74a663a3b4d4ee6b55d23362f347ed1d390c2Hal Finkel    SDValue lowerEH_SJLJ_SETJMP(SDValue Op, SelectionDAG &DAG) const;
6267ee74a663a3b4d4ee6b55d23362f347ed1d390c2Hal Finkel    SDValue lowerEH_SJLJ_LONGJMP(SDValue Op, SelectionDAG &DAG) const;
627827307b95fa909e35a3ddef612f9f50ffcf0963aHal Finkel
62863c32a7a9fd30f67bc623c818f434e742d43c085Hal Finkel    SDValue DAGCombineFastRecip(SDValue Op, DAGCombinerInfo &DCI) const;
62963c32a7a9fd30f67bc623c818f434e742d43c085Hal Finkel    SDValue DAGCombineFastRecipFSQRT(SDValue Op, DAGCombinerInfo &DCI) const;
6307c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner  };
631d3f7766f2363862b9c8586d2f78bc413223240d3Bill Schmidt
632646cd7933b16b78443b06ce9ba2362e6695cb526Bill Schmidt  namespace PPC {
633646cd7933b16b78443b06ce9ba2362e6695cb526Bill Schmidt    FastISel *createFastISel(FunctionLoweringInfo &FuncInfo,
634646cd7933b16b78443b06ce9ba2362e6695cb526Bill Schmidt                             const TargetLibraryInfo *LibInfo);
635646cd7933b16b78443b06ce9ba2362e6695cb526Bill Schmidt  }
636646cd7933b16b78443b06ce9ba2362e6695cb526Bill Schmidt
637d3f7766f2363862b9c8586d2f78bc413223240d3Bill Schmidt  bool CC_PPC32_SVR4_Custom_Dummy(unsigned &ValNo, MVT &ValVT, MVT &LocVT,
638d3f7766f2363862b9c8586d2f78bc413223240d3Bill Schmidt                                  CCValAssign::LocInfo &LocInfo,
639d3f7766f2363862b9c8586d2f78bc413223240d3Bill Schmidt                                  ISD::ArgFlagsTy &ArgFlags,
640d3f7766f2363862b9c8586d2f78bc413223240d3Bill Schmidt                                  CCState &State);
641d3f7766f2363862b9c8586d2f78bc413223240d3Bill Schmidt
642d3f7766f2363862b9c8586d2f78bc413223240d3Bill Schmidt  bool CC_PPC32_SVR4_Custom_AlignArgRegs(unsigned &ValNo, MVT &ValVT,
643d3f7766f2363862b9c8586d2f78bc413223240d3Bill Schmidt                                         MVT &LocVT,
644d3f7766f2363862b9c8586d2f78bc413223240d3Bill Schmidt                                         CCValAssign::LocInfo &LocInfo,
645d3f7766f2363862b9c8586d2f78bc413223240d3Bill Schmidt                                         ISD::ArgFlagsTy &ArgFlags,
646d3f7766f2363862b9c8586d2f78bc413223240d3Bill Schmidt                                         CCState &State);
647d3f7766f2363862b9c8586d2f78bc413223240d3Bill Schmidt
648d3f7766f2363862b9c8586d2f78bc413223240d3Bill Schmidt  bool CC_PPC32_SVR4_Custom_AlignFPArgRegs(unsigned &ValNo, MVT &ValVT,
649d3f7766f2363862b9c8586d2f78bc413223240d3Bill Schmidt                                           MVT &LocVT,
650d3f7766f2363862b9c8586d2f78bc413223240d3Bill Schmidt                                           CCValAssign::LocInfo &LocInfo,
651d3f7766f2363862b9c8586d2f78bc413223240d3Bill Schmidt                                           ISD::ArgFlagsTy &ArgFlags,
652d3f7766f2363862b9c8586d2f78bc413223240d3Bill Schmidt                                           CCState &State);
6537c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner}
6547c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner
6557c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner#endif   // LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H
656