PPCISelLowering.h revision 57ac1f458a754f30cf500410b438fb260f9b8fe5
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"
19331d1bc5dfe1be9090e29f9af9579888a63a9a79Chris Lattner#include "PPCSubtarget.h"
2079aa3417eb6f58d668aadfedf075240a41d35a26Craig Topper#include "llvm/CodeGen/SelectionDAG.h"
21a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/Target/TargetLowering.h"
227c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner
237c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattnernamespace llvm {
240bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner  namespace PPCISD {
250bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner    enum NodeType {
263c983c3dc19bb83807f978c04737b4572be90a93Nate Begeman      // Start the numbering where the builtin ops and target ops leave off.
270ba2bcfcc3149a25d08aa8aa00fb6c34a4e25bddDan Gohman      FIRST_NUMBER = ISD::BUILTIN_OP_END,
280bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner
290bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner      /// FSEL - Traditional three-operand fsel node.
300bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner      ///
310bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner      FSEL,
3295771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
33c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman      /// FCFID - The FCFID instruction, taking an f64 operand and producing
34c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman      /// and f64 value containing the FP representation of the integer that
35c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman      /// was temporarily in the f64 operand.
36c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman      FCFID,
3795771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
3895771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson      /// FCTI[D,W]Z - The FCTIDZ and FCTIWZ instructions, taking an f32 or f64
39c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman      /// operand, producing an f64 value containing the integer representation
40c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman      /// of that FP value.
41c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman      FCTIDZ, FCTIWZ,
4295771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
435126984b1da4bda0e93961da07e883699f1f2d57Chris Lattner      /// STFIWX - The STFIWX instruction.  The first operand is an input token
44c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      /// chain, then an f64 value to store, then an address to store it to.
455126984b1da4bda0e93961da07e883699f1f2d57Chris Lattner      STFIWX,
4695771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
47993aeb2ed93f99faf1438f1b67cd922989306828Nate Begeman      // VMADDFP, VNMSUBFP - The VMADDFP and VNMSUBFP instructions, taking
48993aeb2ed93f99faf1438f1b67cd922989306828Nate Begeman      // three v4f32 operands and producing a v4f32 result.
49993aeb2ed93f99faf1438f1b67cd922989306828Nate Begeman      VMADDFP, VNMSUBFP,
5095771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
51f1d0b2bedaa065972a5ba17259055c1176cd1497Chris Lattner      /// VPERM - The PPC VPERM Instruction.
52f1d0b2bedaa065972a5ba17259055c1176cd1497Chris Lattner      ///
53f1d0b2bedaa065972a5ba17259055c1176cd1497Chris Lattner      VPERM,
5495771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
55860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner      /// Hi/Lo - These represent the high and low 16-bit parts of a global
56860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner      /// address respectively.  These nodes have two operands, the first of
57860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner      /// which must be a TargetGlobalAddress, and the second of which must be a
58860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner      /// Constant.  Selected naively, these turn into 'lis G+C' and 'li G+C',
59860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner      /// though these are usually folded into other nodes.
60860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner      Hi, Lo,
6195771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
626b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller      TOC_ENTRY,
636b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller
643a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      /// The following three target-specific nodes are used for calls through
653a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      /// function pointers in the 64-bit SVR4 ABI.
663a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller
673a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      /// Restore the TOC from the TOC save area of the current stack frame.
683a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      /// This is basically a hard coded load instruction which additionally
693a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      /// takes/produces a flag.
703a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      TOC_RESTORE,
713a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller
723a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      /// Like a regular LOAD but additionally taking/producing a flag.
733a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      LOAD,
743a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller
753a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      /// LOAD into r2 (also taking/producing a flag). Like TOC_RESTORE, this is
763a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      /// a hard coded load instruction.
773a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller      LOAD_TOC,
783a84dae654630a89a91a73807201b6067c4774ecTilmann Scheller
792f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey      /// OPRC, CHAIN = DYNALLOC(CHAIN, NEGSIZE, FRAME_INDEX)
802f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey      /// This instruction is lowered in PPCRegisterInfo::eliminateFrameIndex to
812f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey      /// compute an allocation on the stack.
822f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey      DYNALLOC,
8395771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
84860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner      /// GlobalBaseReg - On Darwin, this node represents the result of the mflr
85860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner      /// at function entry, used for PIC code.
86860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner      GlobalBaseReg,
8795771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
884172b10ca1adfc1026428e5f522aaab98bd939adChris Lattner      /// These nodes represent the 32-bit PPC shifts that operate on 6-bit
894172b10ca1adfc1026428e5f522aaab98bd939adChris Lattner      /// shift amounts.  These nodes are generated by the multi-precision shift
904172b10ca1adfc1026428e5f522aaab98bd939adChris Lattner      /// code.
914172b10ca1adfc1026428e5f522aaab98bd939adChris Lattner      SRL, SRA, SHL,
9295771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
93ecfe55e65b6a72fddd543c42f2e2df4c96c647baChris Lattner      /// EXTSW_32 - This is the EXTSW instruction for use with "32-bit"
94ecfe55e65b6a72fddd543c42f2e2df4c96c647baChris Lattner      /// registers.
95ecfe55e65b6a72fddd543c42f2e2df4c96c647baChris Lattner      EXTSW_32,
969e4dd9dfc97f3930f58ca6e47bebbd8eb5cdd8a1Nate Begeman
97c703a8fbf8653ac8302ae368391a4954c307ca2cChris Lattner      /// CALL - A direct function call.
985b00ceaeeabff8c25abb09926343c3fcb06053d8Hal Finkel      /// CALL_NOP_SVR4 is a call with the special  NOP which follows 64-bit
995b00ceaeeabff8c25abb09926343c3fcb06053d8Hal Finkel      /// SVR4 calls.
1005b00ceaeeabff8c25abb09926343c3fcb06053d8Hal Finkel      CALL_Darwin, CALL_SVR4, CALL_NOP_SVR4,
10195771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
1026b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller      /// NOP - Special NOP which follows 64-bit SVR4 calls.
1036b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller      NOP,
1046b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller
105c703a8fbf8653ac8302ae368391a4954c307ca2cChris Lattner      /// CHAIN,FLAG = MTCTR(VAL, CHAIN[, INFLAG]) - Directly corresponds to a
106c703a8fbf8653ac8302ae368391a4954c307ca2cChris Lattner      /// MTCTR instruction.
107c703a8fbf8653ac8302ae368391a4954c307ca2cChris Lattner      MTCTR,
10895771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
109c703a8fbf8653ac8302ae368391a4954c307ca2cChris Lattner      /// CHAIN,FLAG = BCTRL(CHAIN, INFLAG) - Directly corresponds to a
110c703a8fbf8653ac8302ae368391a4954c307ca2cChris Lattner      /// BCTRL instruction.
1112a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller      BCTRL_Darwin, BCTRL_SVR4,
11295771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
1139e4dd9dfc97f3930f58ca6e47bebbd8eb5cdd8a1Nate Begeman      /// Return with a flag operand, matched by 'blr'
1149e4dd9dfc97f3930f58ca6e47bebbd8eb5cdd8a1Nate Begeman      RET_FLAG,
11595771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
1165f07d5224ddc32f405d7e19de8e58e91ab2816bcDale Johannesen      /// R32 = MFCR(CRREG, INFLAG) - Represents the MFCRpseud/MFOCRF
1175f07d5224ddc32f405d7e19de8e58e91ab2816bcDale Johannesen      /// instructions.  This copies the bits corresponding to the specified
1185f07d5224ddc32f405d7e19de8e58e91ab2816bcDale Johannesen      /// CRREG into the resultant GPR.  Bits corresponding to other CR regs
1195f07d5224ddc32f405d7e19de8e58e91ab2816bcDale Johannesen      /// are undefined.
1206d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner      MFCR,
121a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner
122a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner      /// RESVEC = VCMP(LHS, RHS, OPC) - Represents one of the altivec VCMP*
123a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner      /// instructions.  For lack of better number, we use the opcode number
124a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner      /// encoding for the OPC field to identify the compare.  For example, 838
125a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner      /// is VCMPGTSH.
126a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner      VCMP,
12795771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
1286d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner      /// RESVEC, OUTFLAG = VCMPo(LHS, RHS, OPC) - Represents one of the
12995771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson      /// altivec VCMP*o instructions.  For lack of better number, we use the
1306d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner      /// opcode number encoding for the OPC field to identify the compare.  For
1316d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner      /// example, 838 is VCMPGTSH.
13290564f26d17701e11effa2f4e0fb9a18d8a91274Chris Lattner      VCMPo,
13395771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
13490564f26d17701e11effa2f4e0fb9a18d8a91274Chris Lattner      /// CHAIN = COND_BRANCH CHAIN, CRRC, OPC, DESTBB [, INFLAG] - This
13590564f26d17701e11effa2f4e0fb9a18d8a91274Chris Lattner      /// corresponds to the COND_BRANCH pseudo instruction.  CRRC is the
13690564f26d17701e11effa2f4e0fb9a18d8a91274Chris Lattner      /// condition register to branch on, OPC is the branch opcode to use (e.g.
13790564f26d17701e11effa2f4e0fb9a18d8a91274Chris Lattner      /// PPC::BLE), DESTBB is the destination block to branch to, and INFLAG is
13890564f26d17701e11effa2f4e0fb9a18d8a91274Chris Lattner      /// an optional input flag argument.
139d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner      COND_BRANCH,
14095771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
1416eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen      // The following 5 instructions are used only as part of the
1426eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen      // long double-to-int conversion sequence.
1436eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen
1446eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen      /// OUTFLAG = MFFS F8RC - This moves the FPSCR (not modelled) into the
1456eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen      /// register.
1466eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen      MFFS,
1476eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen
1486eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen      /// OUTFLAG = MTFSB0 INFLAG - This clears a bit in the FPSCR.
1496eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen      MTFSB0,
1506eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen
1516eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen      /// OUTFLAG = MTFSB1 INFLAG - This sets a bit in the FPSCR.
1526eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen      MTFSB1,
1536eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen
1546eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen      /// F8RC, OUTFLAG = FADDRTZ F8RC, F8RC, INFLAG - This is an FADD done with
15595771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson      /// rounding towards zero.  It has flags added so it won't move past the
1566eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen      /// FPSCR-setting instructions.
1576eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen      FADDRTZ,
1586eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen
1596eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen      /// MTFSF = F8RC, INFLAG - This moves the register into the FPSCR.
16054fc97dcdc0ab747f49bd09c5a877bfd2a00e364Evan Cheng      MTFSF,
16154fc97dcdc0ab747f49bd09c5a877bfd2a00e364Evan Cheng
1628608f2eff2dab5345243c40d0bca9138f2dce6f1Evan Cheng      /// LARX = This corresponds to PPC l{w|d}arx instrcution: load and
16354fc97dcdc0ab747f49bd09c5a877bfd2a00e364Evan Cheng      /// reserve indexed. This is used to implement atomic operations.
1648608f2eff2dab5345243c40d0bca9138f2dce6f1Evan Cheng      LARX,
16554fc97dcdc0ab747f49bd09c5a877bfd2a00e364Evan Cheng
1668608f2eff2dab5345243c40d0bca9138f2dce6f1Evan Cheng      /// STCX = This corresponds to PPC stcx. instrcution: store conditional
1678608f2eff2dab5345243c40d0bca9138f2dce6f1Evan Cheng      /// indexed. This is used to implement atomic operations.
1688608f2eff2dab5345243c40d0bca9138f2dce6f1Evan Cheng      STCX,
16954fc97dcdc0ab747f49bd09c5a877bfd2a00e364Evan Cheng
17030e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      /// TC_RETURN - A tail call return.
17130e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      ///   operand #0 chain
17230e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      ///   operand #1 callee (register or absolute)
17330e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      ///   operand #2 stack adjustment
17430e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer      ///   operand #3 optional in flag
175c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      TC_RETURN,
176c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
17782b3821208286aeb43f603fdac98832bd662dad9Hal Finkel      /// ch, gl = CR6[UN]SET ch, inglue - Toggle CR bit 6 for SVR4 vararg calls
17882b3821208286aeb43f603fdac98832bd662dad9Hal Finkel      CR6SET,
17982b3821208286aeb43f603fdac98832bd662dad9Hal Finkel      CR6UNSET,
18082b3821208286aeb43f603fdac98832bd662dad9Hal Finkel
181d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt      /// G8RC = LD_GOT_TPREL Symbol, G8RReg - Used by the initial-exec
182d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt      /// TLS model, produces a LD instruction with base register G8RReg
183d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt      /// and offset sym@got@tprel.  The latter identifies the GOT entry
184d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt      /// containing the offset of "sym" relative to the thread pointer.
185d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt      LD_GOT_TPREL,
186d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt
187d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt      /// G8RC = ADD_TLS G8RReg, Symbol - Used by the initial-exec TLS
188d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt      /// model, produces an ADD instruction that adds the contents of
189d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt      /// G8RReg to the thread pointer.  Symbol contains a relocation
190d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt      /// sym@tls which is to be replaced by the thread pointer and
191d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt      /// identifies to the linker that the instruction is part of a
192d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt      /// TLS sequence.
193d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt      ADD_TLS,
194d7802bf0ddcac16ee910105922492aee86a53e1bBill Schmidt
19557ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      /// G8RC = ADDIS_TLSGD_HA %X2, Symbol - For the general-dynamic TLS
19657ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      /// model, produces an ADDIS8 instruction that adds the GOT base
19757ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      /// register to sym@got@tlsgd@ha.
19857ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      ADDIS_TLSGD_HA,
19957ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt
20057ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      /// G8RC = ADDI_TLSGD_L G8RReg, Symbol - For the general-dynamic TLS
20157ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      /// model, produces an ADDI8 instruction that adds G8RReg to
20257ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      /// sym@got@tlsgd@l.
20357ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      ADDI_TLSGD_L,
20457ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt
20557ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      /// G8RC = GET_TLS_ADDR %X3, Symbol - For the general-dynamic TLS
20657ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      /// model, produces a call to __tls_get_addr(sym@tlsgd).
20757ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt      GET_TLS_ADDR,
20857ac1f458a754f30cf500410b438fb260f9b8fe5Bill Schmidt
209c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      /// STD_32 - This is the STD instruction for use with "32-bit" registers.
210c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      STD_32 = ISD::FIRST_TARGET_MEMORY_OPCODE,
21195771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
21295771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson      /// CHAIN = STBRX CHAIN, GPRC, Ptr, Type - This is a
213c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      /// byte-swapping store instruction.  It byte-swaps the low "Type" bits of
214c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      /// the GPRC input, then stores it through Ptr.  Type can be either i16 or
215c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      /// i32.
21695771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson      STBRX,
21795771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
21895771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson      /// GPRC, CHAIN = LBRX CHAIN, Ptr, Type - This is a
219c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      /// byte-swapping load instruction.  It loads "Type" bits, byte swaps it,
220c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      /// then puts it in the bottom bits of the GPRC.  TYPE can be either i16
221c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman      /// or i32.
22234a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt      LBRX,
22334a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt
22434a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt      /// G8RC = ADDIS_TOC_HA %X2, Symbol - For medium code model, produces
22534a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt      /// an ADDIS8 instruction that adds the TOC base register to sym@toc@ha.
22634a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt      ADDIS_TOC_HA,
22734a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt
22834a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt      /// G8RC = LD_TOC_L Symbol, G8RReg - For medium code model, produces a
22934a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt      /// LD instruction with base register G8RReg and offset sym@toc@l.
23034a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt      /// Preceded by an ADDIS_TOC_HA to form a full 32-bit offset.
23134a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt      LD_TOC_L,
23234a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt
23334a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt      /// G8RC = ADDI_TOC_L G8RReg, Symbol - For medium code model, produces
23434a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt      /// an ADDI8 instruction that adds G8RReg to sym@toc@l.
23534a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt      /// Preceded by an ADDIS_TOC_HA to form a full 32-bit offset.
23634a9d4b3b9b7858b729a1af67afa721c048fe5e7Bill Schmidt      ADDI_TOC_L
237281b55ebeccd3f0d723888c1bb9ec6e476f708f1Chris Lattner    };
2383c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner  }
2393c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner
2403c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner  /// Define some predicates that are used for node matching.
2413c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner  namespace PPC {
242ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner    /// isVPKUHUMShuffleMask - Return true if this is the shuffle mask for a
243ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner    /// VPKUHUM instruction.
2449008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isVPKUHUMShuffleMask(ShuffleVectorSDNode *N, bool isUnary);
24595771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
246ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner    /// isVPKUWUMShuffleMask - Return true if this is the shuffle mask for a
247ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner    /// VPKUWUM instruction.
2489008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isVPKUWUMShuffleMask(ShuffleVectorSDNode *N, bool isUnary);
249116cc48e30b9c307bf3eec29c890b4ba25cd18dbChris Lattner
250116cc48e30b9c307bf3eec29c890b4ba25cd18dbChris Lattner    /// isVMRGLShuffleMask - Return true if this is a shuffle mask suitable for
251116cc48e30b9c307bf3eec29c890b4ba25cd18dbChris Lattner    /// a VRGL* instruction with the specified unit size (1,2 or 4 bytes).
2529008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isVMRGLShuffleMask(ShuffleVectorSDNode *N, unsigned UnitSize,
2539008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman                            bool isUnary);
254116cc48e30b9c307bf3eec29c890b4ba25cd18dbChris Lattner
255116cc48e30b9c307bf3eec29c890b4ba25cd18dbChris Lattner    /// isVMRGHShuffleMask - Return true if this is a shuffle mask suitable for
256116cc48e30b9c307bf3eec29c890b4ba25cd18dbChris Lattner    /// a VRGH* instruction with the specified unit size (1,2 or 4 bytes).
2579008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isVMRGHShuffleMask(ShuffleVectorSDNode *N, unsigned UnitSize,
2589008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman                            bool isUnary);
25995771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
260d0608e191ff9c00af68985f246410c219d1bec57Chris Lattner    /// isVSLDOIShuffleMask - If this is a vsldoi shuffle mask, return the shift
261d0608e191ff9c00af68985f246410c219d1bec57Chris Lattner    /// amount, otherwise return -1.
262f24380e78ecc8a2db1b2116867d878b1e7c6f6edChris Lattner    int isVSLDOIShuffleMask(SDNode *N, bool isUnary);
26395771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
2643c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner    /// isSplatShuffleMask - Return true if the specified VECTOR_SHUFFLE operand
2653c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner    /// specifies a splat of a single element that is suitable for input to
2663c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner    /// VSPLTB/VSPLTH/VSPLTW.
2679008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman    bool isSplatShuffleMask(ShuffleVectorSDNode *N, unsigned EltSize);
26895771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
26966ffe6be0c7b50100a00cb0cc87a5d4983818572Evan Cheng    /// isAllNegativeZeroVector - Returns true if all elements of build_vector
27066ffe6be0c7b50100a00cb0cc87a5d4983818572Evan Cheng    /// are -0.0.
27166ffe6be0c7b50100a00cb0cc87a5d4983818572Evan Cheng    bool isAllNegativeZeroVector(SDNode *N);
27266ffe6be0c7b50100a00cb0cc87a5d4983818572Evan Cheng
2733c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner    /// getVSPLTImmediate - Return the appropriate VSPLT* immediate to splat the
2743c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner    /// specified isSplatShuffleMask VECTOR_SHUFFLE mask.
2757ff7e674580adad7a5bccdbd74cf9c9f05e46d0fChris Lattner    unsigned getVSPLTImmediate(SDNode *N, unsigned EltSize);
27695771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
277e87192a854ff0f2f1904dd9ea282eb36059bb5afChris Lattner    /// get_VSPLTI_elt - If this is a build_vector of constants which can be
278140a58f9dfda30dbb80edd3da1b5632c178f7efcChris Lattner    /// formed by using a vspltis[bhw] instruction of the specified element
279140a58f9dfda30dbb80edd3da1b5632c178f7efcChris Lattner    /// size, return the constant being splatted.  The ByteSize field indicates
280140a58f9dfda30dbb80edd3da1b5632c178f7efcChris Lattner    /// the number of bytes of each element [124] -> [bhw].
281475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue get_VSPLTI_elt(SDNode *N, unsigned ByteSize, SelectionDAG &DAG);
2823c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner  }
28395771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
28421e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman  class PPCTargetLowering : public TargetLowering {
285331d1bc5dfe1be9090e29f9af9579888a63a9a79Chris Lattner    const PPCSubtarget &PPCSubTarget;
2861e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman
2877c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner  public:
28861e729e2e9517ab2d8887bab86fb377900fa1081Dan Gohman    explicit PPCTargetLowering(PPCTargetMachine &TM);
28995771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
290da6d20f0c15205923cb2c3ef4bf9b5d77de88881Chris Lattner    /// getTargetNodeName() - This method returns the name of a target specific
291da6d20f0c15205923cb2c3ef4bf9b5d77de88881Chris Lattner    /// DAG node.
292da6d20f0c15205923cb2c3ef4bf9b5d77de88881Chris Lattner    virtual const char *getTargetNodeName(unsigned Opcode) const;
293fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner
29495771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson    virtual MVT getShiftAmountTy(EVT LHSTy) const { return MVT::i32; }
29595771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
2965b8f82e35b51bf007de07a7ca9347d804084ddf8Scott Michel    /// getSetCCResultType - Return the ISD::SETCC ValueType
29728b77e968d2b01fc9da724762bd8ddcd80650e32Duncan Sands    virtual EVT getSetCCResultType(EVT VT) const;
2985b8f82e35b51bf007de07a7ca9347d804084ddf8Scott Michel
299fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// getPreIndexedAddressParts - returns true by value, base pointer and
300fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// offset pointer and addressing mode by reference if the node's address
301fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// can be legally represented as pre-indexed load / store address.
302475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    virtual bool getPreIndexedAddressParts(SDNode *N, SDValue &Base,
303475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                           SDValue &Offset,
304144d8f09e139f691cafadbc17873943ba4c465f3Evan Cheng                                           ISD::MemIndexedMode &AM,
30573e0914848662404cf2aa18eb049ff5aae543388Dan Gohman                                           SelectionDAG &DAG) const;
30695771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
307fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// SelectAddressRegReg - Given the specified addressed, check to see if it
308fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// can be represented as an indexed [r+r] operation.  Returns false if it
309fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// can be more efficiently represented with [r+imm].
310475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    bool SelectAddressRegReg(SDValue N, SDValue &Base, SDValue &Index,
31173e0914848662404cf2aa18eb049ff5aae543388Dan Gohman                             SelectionDAG &DAG) const;
31295771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
313fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// SelectAddressRegImm - Returns true if the address N can be represented
314fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// by a base register plus a signed 16-bit displacement [r+imm], and if it
315fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// is not better represented as reg+reg.
316475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    bool SelectAddressRegImm(SDValue N, SDValue &Disp, SDValue &Base,
31773e0914848662404cf2aa18eb049ff5aae543388Dan Gohman                             SelectionDAG &DAG) const;
31895771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
319fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// SelectAddressRegRegOnly - Given the specified addressed, force it to be
320fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// represented as an indexed [r+r] operation.
321475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    bool SelectAddressRegRegOnly(SDValue N, SDValue &Base, SDValue &Index,
32273e0914848662404cf2aa18eb049ff5aae543388Dan Gohman                                 SelectionDAG &DAG) const;
323fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner
324fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// SelectAddressRegImmShift - Returns true if the address N can be
325fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// represented by a base register plus a signed 14-bit displacement
326fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner    /// [r+imm*4].  Suitable for use by STD and friends.
327475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    bool SelectAddressRegImmShift(SDValue N, SDValue &Disp, SDValue &Base,
32873e0914848662404cf2aa18eb049ff5aae543388Dan Gohman                                  SelectionDAG &DAG) const;
329fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner
3303f31d492a5d0fadf11290e8453f8c519a89b1302Hal Finkel    Sched::Preference getSchedulingPreference(SDNode *N) const;
33195771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
332e4bc9ea0a560d8a0ba42f5a2da617e1f1f834710Chris Lattner    /// LowerOperation - Provide custom lowering hooks for some operations.
333e4bc9ea0a560d8a0ba42f5a2da617e1f1f834710Chris Lattner    ///
334d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
3351f873003266fbdec7c2c48a965c60f4e2e35a158Chris Lattner
3361607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    /// ReplaceNodeResults - Replace the results of node with an illegal result
3371607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    /// type with new values built out of custom code.
3381607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    ///
3391607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    virtual void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results,
340d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                    SelectionDAG &DAG) const;
3411607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands
342475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
34395771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
344475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    virtual void computeMaskedBitsForTargetNode(const SDValue Op,
34595771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson                                                APInt &KnownZero,
346fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman                                                APInt &KnownOne,
347ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman                                                const SelectionDAG &DAG,
348bbe77de450ef36b4f83cc3b57705a9758adbd925Chris Lattner                                                unsigned Depth = 0) const;
3494a95945fa5aa431110f50092f4a45d24772a553bNate Begeman
350af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman    virtual MachineBasicBlock *
351af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman      EmitInstrWithCustomInserter(MachineInstr *MI,
352af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman                                  MachineBasicBlock *MBB) const;
35395771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson    MachineBasicBlock *EmitAtomicBinary(MachineInstr *MI,
354bdab93a2ef5d9574bb4e322e020849f9bc9c90d7Dale Johannesen                                        MachineBasicBlock *MBB, bool is64Bit,
3551fdbc1dd4e9cb42c79a30e8dc308c322e923cc52Dan Gohman                                        unsigned BinOpcode) const;
35695771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson    MachineBasicBlock *EmitPartwordAtomicBinary(MachineInstr *MI,
35795771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson                                                MachineBasicBlock *MBB,
3581fdbc1dd4e9cb42c79a30e8dc308c322e923cc52Dan Gohman                                            bool is8bit, unsigned Opcode) const;
35995771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
3604234f57fa02b1f04a9f52a7b3c2aa22d32ac521cChris Lattner    ConstraintType getConstraintType(const std::string &Constraint) const;
36144ab89eb376af838d1123293a79975aede501464John Thompson
36244ab89eb376af838d1123293a79975aede501464John Thompson    /// Examine constraint string and operand type and determine a weight value.
36344ab89eb376af838d1123293a79975aede501464John Thompson    /// The operand object must already have been set up with the operand type.
36444ab89eb376af838d1123293a79975aede501464John Thompson    ConstraintWeight getSingleConstraintMatchWeight(
36544ab89eb376af838d1123293a79975aede501464John Thompson      AsmOperandInfo &info, const char *constraint) const;
36644ab89eb376af838d1123293a79975aede501464John Thompson
36795771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson    std::pair<unsigned, const TargetRegisterClass*>
368331d1bc5dfe1be9090e29f9af9579888a63a9a79Chris Lattner      getRegForInlineAsmConstraint(const std::string &Constraint,
369e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson                                   EVT VT) const;
370c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng
37128d08fdb9f6572cafd5aae95c7caffa3cd136d8eDale Johannesen    /// getByValTypeAlignment - Return the desired alignment for ByVal aggregate
37228d08fdb9f6572cafd5aae95c7caffa3cd136d8eDale Johannesen    /// function arguments in the caller parameter area.  This is the actual
37328d08fdb9f6572cafd5aae95c7caffa3cd136d8eDale Johannesen    /// alignment, not its logarithm.
374db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner    unsigned getByValTypeAlignment(Type *Ty) const;
37528d08fdb9f6572cafd5aae95c7caffa3cd136d8eDale Johannesen
37648884cd80b52be1528618f2e9b3425ac24e7b5caChris Lattner    /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
3771784d160e4efa75782884d451d0788b9457e67dcDale Johannesen    /// vector.  If it is invalid, don't add anything to Ops.
378475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    virtual void LowerAsmOperandForConstraint(SDValue Op,
379100c83341676d8aae8fc34b5452563ed08b14f3eEric Christopher                                              std::string &Constraint,
380475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                              std::vector<SDValue> &Ops,
3815e764233f398b6929b67701672a5e78fec20ce2eChris Lattner                                              SelectionDAG &DAG) const;
38295771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
383c9addb74883fef318140272768422656a694341fChris Lattner    /// isLegalAddressingMode - Return true if the addressing mode represented
384c9addb74883fef318140272768422656a694341fChris Lattner    /// by AM is legal for this target, for a load/store of the specified type.
385db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner    virtual bool isLegalAddressingMode(const AddrMode &AM, Type *Ty)const;
38695771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
387c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng    /// isLegalAddressImmediate - Return true if the integer value can be used
388861939152debbaa15a55a196a4321837c7bc379dEvan Cheng    /// as the offset of the target addressing mode for load / store of the
389861939152debbaa15a55a196a4321837c7bc379dEvan Cheng    /// given type.
390db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner    virtual bool isLegalAddressImmediate(int64_t V, Type *Ty) const;
391861939152debbaa15a55a196a4321837c7bc379dEvan Cheng
392861939152debbaa15a55a196a4321837c7bc379dEvan Cheng    /// isLegalAddressImmediate - Return true if the GlobalValue can be used as
393861939152debbaa15a55a196a4321837c7bc379dEvan Cheng    /// the offset of the target addressing mode.
394861939152debbaa15a55a196a4321837c7bc379dEvan Cheng    virtual bool isLegalAddressImmediate(GlobalValue *GV) const;
39543c6e7cd9b0d9a3b0006650ddfac256848f10d51Nicolas Geoffray
39654aeea39a743effe88eedb43d2f7f4805e806ab5Dan Gohman    virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
39795771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
39842642d06c915a26af1400de6ce6a53c333e5c247Evan Cheng    /// getOptimalMemOpType - Returns the target specific optimal type for load
399f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// and store operations as a result of memset, memcpy, and memmove
400f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// lowering. If DstAlign is zero that means it's safe to destination
401f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// alignment can satisfy any constraint. Similarly if SrcAlign is zero it
402f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// means there isn't a need to check it against alignment requirement,
403f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// probably because the source does not need to be loaded. If
40415701f8969fcb36899a75ca2df6fdcbc52141106Lang Hames    /// 'IsZeroVal' is true, that means it's safe to return a
405f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    /// non-scalar-integer type, e.g. empty string source, constant, or loaded
406c3b0c341e731b27b550ee9dcded9c17232b296b8Evan Cheng    /// from memory. 'MemcpyStrSrc' indicates whether the memcpy source is
407c3b0c341e731b27b550ee9dcded9c17232b296b8Evan Cheng    /// constant so it does not need to be loaded.
40837f32ee7ffe77d7c2bc1b185802e98979612f041Dan Gohman    /// It returns EVT::Other if the type should be determined using generic
40937f32ee7ffe77d7c2bc1b185802e98979612f041Dan Gohman    /// target-independent logic.
410f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng    virtual EVT
411c3b0c341e731b27b550ee9dcded9c17232b296b8Evan Cheng    getOptimalMemOpType(uint64_t Size, unsigned DstAlign, unsigned SrcAlign,
41215701f8969fcb36899a75ca2df6fdcbc52141106Lang Hames                        bool IsZeroVal, bool MemcpyStrSrc,
41337f32ee7ffe77d7c2bc1b185802e98979612f041Dan Gohman                        MachineFunction &MF) const;
41454aeea39a743effe88eedb43d2f7f4805e806ab5Dan Gohman
415070b8dba809dd75267327cc823118bf7e171d17dHal Finkel    /// isFMAFasterThanMulAndAdd - Return true if an FMA operation is faster than
416070b8dba809dd75267327cc823118bf7e171d17dHal Finkel    /// a pair of mul and add instructions. fmuladd intrinsics will be expanded to
417070b8dba809dd75267327cc823118bf7e171d17dHal Finkel    /// FMAs when this method returns true (and FMAs are legal), otherwise fmuladd
418070b8dba809dd75267327cc823118bf7e171d17dHal Finkel    /// is expanded to mul + add.
419070b8dba809dd75267327cc823118bf7e171d17dHal Finkel    virtual bool isFMAFasterThanMulAndAdd(EVT VT) const;
420070b8dba809dd75267327cc823118bf7e171d17dHal Finkel
42154fc97dcdc0ab747f49bd09c5a877bfd2a00e364Evan Cheng  private:
422475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue getFramePointerFrameIndex(SelectionDAG & DAG) const;
423475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue getReturnAddrFrameIndex(SelectionDAG & DAG) const;
42430e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer
4250c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng    bool
4260c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng    IsEligibleForTailCallOptimization(SDValue Callee,
4270c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng                                      CallingConv::ID CalleeCC,
4280c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng                                      bool isVarArg,
4290c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng                                      const SmallVectorImpl<ISD::InputArg> &Ins,
4300c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng                                      SelectionDAG& DAG) const;
4310c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng
432475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue EmitTailCallLoadFPAndRetAddr(SelectionDAG & DAG,
43333c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen                                         int SPDiff,
43433c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen                                         SDValue Chain,
43533c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen                                         SDValue &LROpOut,
43633c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen                                         SDValue &FPOpOut,
4372a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller                                         bool isDarwinABI,
438d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                         DebugLoc dl) const;
439d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman
440d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
441d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
442d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
443d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
444fd42ed676e37c29364f53f848320b7cb706111e0Roman Divacky    SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
445d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
446d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
447d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
4484a544a79bd735967f1d33fe675ae4566dbd17813Duncan Sands    SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
4494a544a79bd735967f1d33fe675ae4566dbd17813Duncan Sands    SDValue LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
450475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG,
451d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                         const PPCSubtarget &Subtarget) const;
4521e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman    SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG,
453d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                       const PPCSubtarget &Subtarget) const;
454475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue LowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG,
455d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                const PPCSubtarget &Subtarget) const;
456475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG,
457d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                      const PPCSubtarget &Subtarget) const;
458d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
459d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG, DebugLoc dl) const;
460d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
461d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG) const;
462d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSHL_PARTS(SDValue Op, SelectionDAG &DAG) const;
463d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSRL_PARTS(SDValue Op, SelectionDAG &DAG) const;
464d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSRA_PARTS(SDValue Op, SelectionDAG &DAG) const;
465d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
466d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
467d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
468d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG) const;
469d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerMUL(SDValue Op, SelectionDAG &DAG) const;
47098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
47198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
47265c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                            CallingConv::ID CallConv, bool isVarArg,
47398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                            const SmallVectorImpl<ISD::InputArg> &Ins,
47498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                            DebugLoc dl, SelectionDAG &DAG,
475d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                            SmallVectorImpl<SDValue> &InVals) const;
47665c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel    SDValue FinishCall(CallingConv::ID CallConv, DebugLoc dl, bool isTailCall,
47798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                       bool isVarArg,
47898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                       SelectionDAG &DAG,
47998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                       SmallVector<std::pair<unsigned, SDValue>, 8>
48098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                         &RegsToPass,
48198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                       SDValue InFlag, SDValue Chain,
48298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                       SDValue &Callee,
48398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                       int SPDiff, unsigned NumBytes,
48498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                       const SmallVectorImpl<ISD::InputArg> &Ins,
485d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                       SmallVectorImpl<SDValue> &InVals) const;
48698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
48798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    virtual SDValue
48898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman      LowerFormalArguments(SDValue Chain,
48965c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                           CallingConv::ID CallConv, bool isVarArg,
49098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           const SmallVectorImpl<ISD::InputArg> &Ins,
49198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           DebugLoc dl, SelectionDAG &DAG,
492d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                           SmallVectorImpl<SDValue> &InVals) const;
49398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
49498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    virtual SDValue
495d2ea0e10cbd158c93fb870cdd03001b9cd1156b8Justin Holewinski      LowerCall(TargetLowering::CallLoweringInfo &CLI,
496d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                SmallVectorImpl<SDValue> &InVals) const;
49798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
498d712f935f7e027a733741e6ca67b3237a59f65d1Hal Finkel    virtual bool
499d712f935f7e027a733741e6ca67b3237a59f65d1Hal Finkel      CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
500d712f935f7e027a733741e6ca67b3237a59f65d1Hal Finkel                   bool isVarArg,
501d712f935f7e027a733741e6ca67b3237a59f65d1Hal Finkel                   const SmallVectorImpl<ISD::OutputArg> &Outs,
502d712f935f7e027a733741e6ca67b3237a59f65d1Hal Finkel                   LLVMContext &Context) const;
503d712f935f7e027a733741e6ca67b3237a59f65d1Hal Finkel
50498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    virtual SDValue
50598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman      LowerReturn(SDValue Chain,
50665c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                  CallingConv::ID CallConv, bool isVarArg,
50798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                  const SmallVectorImpl<ISD::OutputArg> &Outs,
508c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman                  const SmallVectorImpl<SDValue> &OutVals,
509d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                  DebugLoc dl, SelectionDAG &DAG) const;
51098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
51198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue
512726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt      extendArgForPPC64(ISD::ArgFlagsTy Flags, EVT ObjectVT, SelectionDAG &DAG,
513726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                        SDValue ArgVal, DebugLoc dl) const;
514726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt
515726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt    void
516726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt      setMinReservedArea(MachineFunction &MF, SelectionDAG &DAG,
517726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                         unsigned nAltivecParamsAtEnd,
518726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                         unsigned MinReservedArea, bool isPPC64) const;
519726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt
520726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt    SDValue
521b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt      LowerFormalArguments_Darwin(SDValue Chain,
522b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt                                  CallingConv::ID CallConv, bool isVarArg,
523b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt                                  const SmallVectorImpl<ISD::InputArg> &Ins,
524b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt                                  DebugLoc dl, SelectionDAG &DAG,
525b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt                                  SmallVectorImpl<SDValue> &InVals) const;
526b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt    SDValue
527b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt      LowerFormalArguments_64SVR4(SDValue Chain,
52865c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                                  CallingConv::ID CallConv, bool isVarArg,
52998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                                  const SmallVectorImpl<ISD::InputArg> &Ins,
53098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                                  DebugLoc dl, SelectionDAG &DAG,
531d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                                  SmallVectorImpl<SDValue> &InVals) const;
53298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue
533419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt      LowerFormalArguments_32SVR4(SDValue Chain,
534419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                                  CallingConv::ID CallConv, bool isVarArg,
535419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                                  const SmallVectorImpl<ISD::InputArg> &Ins,
536419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                                  DebugLoc dl, SelectionDAG &DAG,
537419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                                  SmallVectorImpl<SDValue> &InVals) const;
53898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
53998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue
540726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt      createMemcpyOutsideCallSeq(SDValue Arg, SDValue PtrOff,
541726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                                 SDValue CallSeqStart, ISD::ArgFlagsTy Flags,
542726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                                 SelectionDAG &DAG, DebugLoc dl) const;
543726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt
544726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt    SDValue
545726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt      LowerCall_Darwin(SDValue Chain, SDValue Callee,
546726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                       CallingConv::ID CallConv,
547726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                       bool isVarArg, bool isTailCall,
548726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                       const SmallVectorImpl<ISD::OutputArg> &Outs,
549726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                       const SmallVectorImpl<SDValue> &OutVals,
550726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                       const SmallVectorImpl<ISD::InputArg> &Ins,
551726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                       DebugLoc dl, SelectionDAG &DAG,
552726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt                       SmallVectorImpl<SDValue> &InVals) const;
553726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt    SDValue
554726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt      LowerCall_64SVR4(SDValue Chain, SDValue Callee,
555419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                       CallingConv::ID CallConv,
5564bfcd4acbc7d12aa55f8de9af84a38422f0f6d83Evan Cheng                       bool isVarArg, bool isTailCall,
55798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                       const SmallVectorImpl<ISD::OutputArg> &Outs,
558c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman                       const SmallVectorImpl<SDValue> &OutVals,
55998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                       const SmallVectorImpl<ISD::InputArg> &Ins,
56098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                       DebugLoc dl, SelectionDAG &DAG,
561d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                       SmallVectorImpl<SDValue> &InVals) const;
56298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue
563419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt    LowerCall_32SVR4(SDValue Chain, SDValue Callee, CallingConv::ID CallConv,
564419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                     bool isVarArg, bool isTailCall,
565419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                     const SmallVectorImpl<ISD::OutputArg> &Outs,
566419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                     const SmallVectorImpl<SDValue> &OutVals,
567419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                     const SmallVectorImpl<ISD::InputArg> &Ins,
568419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                     DebugLoc dl, SelectionDAG &DAG,
569419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt                     SmallVectorImpl<SDValue> &InVals) const;
5707c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner  };
5717c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner}
5727c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner
5737c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner#endif   // LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H
574