PPCISelLowering.h revision 946a3a9f22c967d5432eaab5fa464b91343477cd
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, 403946a3a9f22c967d5432eaab5fa464b91343477cdEvan Cheng /// probably because the source does not need to be loaded. If 'IsMemset' is 404946a3a9f22c967d5432eaab5fa464b91343477cdEvan Cheng /// true, that means it's expanding a memset. If 'ZeroMemset' is true, that 405946a3a9f22c967d5432eaab5fa464b91343477cdEvan Cheng /// means it's a memset of zero. 'MemcpyStrSrc' indicates whether the memcpy 406946a3a9f22c967d5432eaab5fa464b91343477cdEvan Cheng /// source is constant so it does not need to be loaded. 40737f32ee7ffe77d7c2bc1b185802e98979612f041Dan Gohman /// It returns EVT::Other if the type should be determined using generic 40837f32ee7ffe77d7c2bc1b185802e98979612f041Dan Gohman /// target-independent logic. 409f28f8bc40eedc6304ab25dd8bed486fa08f51f70Evan Cheng virtual EVT 410946a3a9f22c967d5432eaab5fa464b91343477cdEvan Cheng getOptimalMemOpType(uint64_t Size, unsigned DstAlign, unsigned SrcAlign, 411946a3a9f22c967d5432eaab5fa464b91343477cdEvan Cheng bool IsMemset, bool ZeroMemset, bool MemcpyStrSrc, 41237f32ee7ffe77d7c2bc1b185802e98979612f041Dan Gohman MachineFunction &MF) const; 41354aeea39a743effe88eedb43d2f7f4805e806ab5Dan Gohman 414070b8dba809dd75267327cc823118bf7e171d17dHal Finkel /// isFMAFasterThanMulAndAdd - Return true if an FMA operation is faster than 415070b8dba809dd75267327cc823118bf7e171d17dHal Finkel /// a pair of mul and add instructions. fmuladd intrinsics will be expanded to 416070b8dba809dd75267327cc823118bf7e171d17dHal Finkel /// FMAs when this method returns true (and FMAs are legal), otherwise fmuladd 417070b8dba809dd75267327cc823118bf7e171d17dHal Finkel /// is expanded to mul + add. 418070b8dba809dd75267327cc823118bf7e171d17dHal Finkel virtual bool isFMAFasterThanMulAndAdd(EVT VT) const; 419070b8dba809dd75267327cc823118bf7e171d17dHal Finkel 42054fc97dcdc0ab747f49bd09c5a877bfd2a00e364Evan Cheng private: 421475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getFramePointerFrameIndex(SelectionDAG & DAG) const; 422475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getReturnAddrFrameIndex(SelectionDAG & DAG) const; 42330e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer 4240c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng bool 4250c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng IsEligibleForTailCallOptimization(SDValue Callee, 4260c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng CallingConv::ID CalleeCC, 4270c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng bool isVarArg, 4280c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng const SmallVectorImpl<ISD::InputArg> &Ins, 4290c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng SelectionDAG& DAG) const; 4300c439eb2c8397996cbccaf2798e598052d9982c8Evan Cheng 431475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue EmitTailCallLoadFPAndRetAddr(SelectionDAG & DAG, 43233c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen int SPDiff, 43333c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen SDValue Chain, 43433c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen SDValue &LROpOut, 43533c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen SDValue &FPOpOut, 4362a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller bool isDarwinABI, 437d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman DebugLoc dl) const; 438d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman 439d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const; 440d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const; 441d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const; 442d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const; 443fd42ed676e37c29364f53f848320b7cb706111e0Roman Divacky SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const; 444d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; 445d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const; 446d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const; 4474a544a79bd735967f1d33fe675ae4566dbd17813Duncan Sands SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const; 4484a544a79bd735967f1d33fe675ae4566dbd17813Duncan Sands SDValue LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const; 449475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG, 450d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman const PPCSubtarget &Subtarget) const; 4511e93df6f0b5ee6e36d7ec18e6035f0f5a53e5ec6Dan Gohman SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG, 452d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman const PPCSubtarget &Subtarget) const; 453475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG, 454d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman const PPCSubtarget &Subtarget) const; 455475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG, 456d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman const PPCSubtarget &Subtarget) const; 457d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const; 458d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG, DebugLoc dl) const; 459d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG) const; 460d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG) const; 461d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerSHL_PARTS(SDValue Op, SelectionDAG &DAG) const; 462d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerSRL_PARTS(SDValue Op, SelectionDAG &DAG) const; 463d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerSRA_PARTS(SDValue Op, SelectionDAG &DAG) const; 464d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const; 465d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const; 466d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const; 467d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG) const; 468d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SDValue LowerMUL(SDValue Op, SelectionDAG &DAG) const; 46998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 47098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue LowerCallResult(SDValue Chain, SDValue InFlag, 47165c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, 47298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 47398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 474d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SmallVectorImpl<SDValue> &InVals) const; 47565c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel SDValue FinishCall(CallingConv::ID CallConv, DebugLoc dl, bool isTailCall, 47698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman bool isVarArg, 47798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SelectionDAG &DAG, 47898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SmallVector<std::pair<unsigned, SDValue>, 8> 47998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman &RegsToPass, 48098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue InFlag, SDValue Chain, 48198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue &Callee, 48298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman int SPDiff, unsigned NumBytes, 48398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 484d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SmallVectorImpl<SDValue> &InVals) const; 48598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 48698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman virtual SDValue 48798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman LowerFormalArguments(SDValue Chain, 48865c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, 48998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 49098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 491d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SmallVectorImpl<SDValue> &InVals) const; 49298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 49398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman virtual SDValue 494d2ea0e10cbd158c93fb870cdd03001b9cd1156b8Justin Holewinski LowerCall(TargetLowering::CallLoweringInfo &CLI, 495d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SmallVectorImpl<SDValue> &InVals) const; 49698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 497d712f935f7e027a733741e6ca67b3237a59f65d1Hal Finkel virtual bool 498d712f935f7e027a733741e6ca67b3237a59f65d1Hal Finkel CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF, 499d712f935f7e027a733741e6ca67b3237a59f65d1Hal Finkel bool isVarArg, 500d712f935f7e027a733741e6ca67b3237a59f65d1Hal Finkel const SmallVectorImpl<ISD::OutputArg> &Outs, 501d712f935f7e027a733741e6ca67b3237a59f65d1Hal Finkel LLVMContext &Context) const; 502d712f935f7e027a733741e6ca67b3237a59f65d1Hal Finkel 50398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman virtual SDValue 50498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman LowerReturn(SDValue Chain, 50565c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, 50698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::OutputArg> &Outs, 507c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman const SmallVectorImpl<SDValue> &OutVals, 508d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman DebugLoc dl, SelectionDAG &DAG) const; 50998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 51098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue 511726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt extendArgForPPC64(ISD::ArgFlagsTy Flags, EVT ObjectVT, SelectionDAG &DAG, 512726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt SDValue ArgVal, DebugLoc dl) const; 513726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt 514726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt void 515726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt setMinReservedArea(MachineFunction &MF, SelectionDAG &DAG, 516726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt unsigned nAltivecParamsAtEnd, 517726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt unsigned MinReservedArea, bool isPPC64) const; 518726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt 519726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt SDValue 520b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt LowerFormalArguments_Darwin(SDValue Chain, 521b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt CallingConv::ID CallConv, bool isVarArg, 522b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt const SmallVectorImpl<ISD::InputArg> &Ins, 523b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt DebugLoc dl, SelectionDAG &DAG, 524b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt SmallVectorImpl<SDValue> &InVals) const; 525b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt SDValue 526b2544ece597192266199ec00ece2ee5bb6273cd9Bill Schmidt LowerFormalArguments_64SVR4(SDValue Chain, 52765c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, 52898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 52998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 530d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SmallVectorImpl<SDValue> &InVals) const; 53198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue 532419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt LowerFormalArguments_32SVR4(SDValue Chain, 533419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt CallingConv::ID CallConv, bool isVarArg, 534419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt const SmallVectorImpl<ISD::InputArg> &Ins, 535419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt DebugLoc dl, SelectionDAG &DAG, 536419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt SmallVectorImpl<SDValue> &InVals) const; 53798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 53898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue 539726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt createMemcpyOutsideCallSeq(SDValue Arg, SDValue PtrOff, 540726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt SDValue CallSeqStart, ISD::ArgFlagsTy Flags, 541726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt SelectionDAG &DAG, DebugLoc dl) const; 542726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt 543726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt SDValue 544726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt LowerCall_Darwin(SDValue Chain, SDValue Callee, 545726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt CallingConv::ID CallConv, 546726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt bool isVarArg, bool isTailCall, 547726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt const SmallVectorImpl<ISD::OutputArg> &Outs, 548726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt const SmallVectorImpl<SDValue> &OutVals, 549726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt const SmallVectorImpl<ISD::InputArg> &Ins, 550726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt DebugLoc dl, SelectionDAG &DAG, 551726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt SmallVectorImpl<SDValue> &InVals) const; 552726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt SDValue 553726c23705c056e4d86f0b3d833803f1d43e6eee4Bill Schmidt LowerCall_64SVR4(SDValue Chain, SDValue Callee, 554419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt CallingConv::ID CallConv, 5554bfcd4acbc7d12aa55f8de9af84a38422f0f6d83Evan Cheng bool isVarArg, bool isTailCall, 55698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::OutputArg> &Outs, 557c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman const SmallVectorImpl<SDValue> &OutVals, 55898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 55998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 560d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman SmallVectorImpl<SDValue> &InVals) const; 56198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue 562419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt LowerCall_32SVR4(SDValue Chain, SDValue Callee, CallingConv::ID CallConv, 563419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt bool isVarArg, bool isTailCall, 564419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt const SmallVectorImpl<ISD::OutputArg> &Outs, 565419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt const SmallVectorImpl<SDValue> &OutVals, 566419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt const SmallVectorImpl<ISD::InputArg> &Ins, 567419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt DebugLoc dl, SelectionDAG &DAG, 568419f376564d17eaef7e5b4a77b066668e4272eccBill Schmidt SmallVectorImpl<SDValue> &InVals) const; 5697c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner }; 5707c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner} 5717c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner 5727c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner#endif // LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H 573