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