PPCISelLowering.h revision 3a84dae654630a89a91a73807201b6067c4774ec
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 187c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner#include "llvm/Target/TargetLowering.h" 190bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner#include "llvm/CodeGen/SelectionDAG.h" 202668959b8879097db368aec7d76c455260abc75bChris Lattner#include "PPC.h" 21331d1bc5dfe1be9090e29f9af9579888a63a9a79Chris Lattner#include "PPCSubtarget.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, 32f76053269ecc6c7bd3d0b1e90ebdd0cef1bb2bdcChris Lattner 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, 37c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman 38c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman /// 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, 42860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner 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, 465126984b1da4bda0e93961da07e883699f1f2d57Chris Lattner 47993aeb2ed93f99faf1438f1b67cd922989306828Nate Begeman // VMADDFP, VNMSUBFP - The VMADDFP and VNMSUBFP instructions, taking 48993aeb2ed93f99faf1438f1b67cd922989306828Nate Begeman // three v4f32 operands and producing a v4f32 result. 49993aeb2ed93f99faf1438f1b67cd922989306828Nate Begeman VMADDFP, VNMSUBFP, 50993aeb2ed93f99faf1438f1b67cd922989306828Nate Begeman 51f1d0b2bedaa065972a5ba17259055c1176cd1497Chris Lattner /// VPERM - The PPC VPERM Instruction. 52f1d0b2bedaa065972a5ba17259055c1176cd1497Chris Lattner /// 53f1d0b2bedaa065972a5ba17259055c1176cd1497Chris Lattner VPERM, 54f1d0b2bedaa065972a5ba17259055c1176cd1497Chris Lattner 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, 61860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner 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, 832f616bff7ef1e2e08d6d23c2a8b42ec2bfebb173Jim Laskey 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, 874172b10ca1adfc1026428e5f522aaab98bd939adChris Lattner 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, 92ecfe55e65b6a72fddd543c42f2e2df4c96c647baChris Lattner 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. 982a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller CALL_Darwin, CALL_SVR4, 99281b55ebeccd3f0d723888c1bb9ec6e476f708f1Chris Lattner 1006b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller /// NOP - Special NOP which follows 64-bit SVR4 calls. 1016b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller NOP, 1026b16eff207f99bbde3c0f7340452a5287218772cTilmann Scheller 103c703a8fbf8653ac8302ae368391a4954c307ca2cChris Lattner /// CHAIN,FLAG = MTCTR(VAL, CHAIN[, INFLAG]) - Directly corresponds to a 104c703a8fbf8653ac8302ae368391a4954c307ca2cChris Lattner /// MTCTR instruction. 105c703a8fbf8653ac8302ae368391a4954c307ca2cChris Lattner MTCTR, 106c703a8fbf8653ac8302ae368391a4954c307ca2cChris Lattner 107c703a8fbf8653ac8302ae368391a4954c307ca2cChris Lattner /// CHAIN,FLAG = BCTRL(CHAIN, INFLAG) - Directly corresponds to a 108c703a8fbf8653ac8302ae368391a4954c307ca2cChris Lattner /// BCTRL instruction. 1092a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller BCTRL_Darwin, BCTRL_SVR4, 110c703a8fbf8653ac8302ae368391a4954c307ca2cChris Lattner 1119e4dd9dfc97f3930f58ca6e47bebbd8eb5cdd8a1Nate Begeman /// Return with a flag operand, matched by 'blr' 1129e4dd9dfc97f3930f58ca6e47bebbd8eb5cdd8a1Nate Begeman RET_FLAG, 1136d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner 1146d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner /// R32 = MFCR(CRREG, INFLAG) - Represents the MFCR/MFOCRF instructions. 1156d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner /// This copies the bits corresponding to the specified CRREG into the 1166d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner /// resultant GPR. Bits corresponding to other CR regs are undefined. 1176d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner MFCR, 118a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner 119a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner /// RESVEC = VCMP(LHS, RHS, OPC) - Represents one of the altivec VCMP* 120a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner /// instructions. For lack of better number, we use the opcode number 121a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner /// encoding for the OPC field to identify the compare. For example, 838 122a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner /// is VCMPGTSH. 123a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner VCMP, 1246d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner 1256d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner /// RESVEC, OUTFLAG = VCMPo(LHS, RHS, OPC) - Represents one of the 1266d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner /// altivec VCMP*o instructions. For lack of better number, we use the 1276d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner /// opcode number encoding for the OPC field to identify the compare. For 1286d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner /// example, 838 is VCMPGTSH. 12990564f26d17701e11effa2f4e0fb9a18d8a91274Chris Lattner VCMPo, 13090564f26d17701e11effa2f4e0fb9a18d8a91274Chris Lattner 13190564f26d17701e11effa2f4e0fb9a18d8a91274Chris Lattner /// CHAIN = COND_BRANCH CHAIN, CRRC, OPC, DESTBB [, INFLAG] - This 13290564f26d17701e11effa2f4e0fb9a18d8a91274Chris Lattner /// corresponds to the COND_BRANCH pseudo instruction. CRRC is the 13390564f26d17701e11effa2f4e0fb9a18d8a91274Chris Lattner /// condition register to branch on, OPC is the branch opcode to use (e.g. 13490564f26d17701e11effa2f4e0fb9a18d8a91274Chris Lattner /// PPC::BLE), DESTBB is the destination block to branch to, and INFLAG is 13590564f26d17701e11effa2f4e0fb9a18d8a91274Chris Lattner /// an optional input flag argument. 136d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner COND_BRANCH, 137d9989384592a3bd9dd374470a723ca8303071a2dChris Lattner 1386eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen // The following 5 instructions are used only as part of the 1396eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen // long double-to-int conversion sequence. 1406eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen 1416eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen /// OUTFLAG = MFFS F8RC - This moves the FPSCR (not modelled) into the 1426eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen /// register. 1436eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen MFFS, 1446eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen 1456eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen /// OUTFLAG = MTFSB0 INFLAG - This clears a bit in the FPSCR. 1466eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen MTFSB0, 1476eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen 1486eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen /// OUTFLAG = MTFSB1 INFLAG - This sets a bit in the FPSCR. 1496eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen MTFSB1, 1506eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen 1516eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen /// F8RC, OUTFLAG = FADDRTZ F8RC, F8RC, INFLAG - This is an FADD done with 1526eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen /// rounding towards zero. It has flags added so it won't move past the 1536eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen /// FPSCR-setting instructions. 1546eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen FADDRTZ, 1556eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen 1566eaeff29b8a6990107735f7e5f5e49da38f56223Dale Johannesen /// MTFSF = F8RC, INFLAG - This moves the register into the FPSCR. 15754fc97dcdc0ab747f49bd09c5a877bfd2a00e364Evan Cheng MTFSF, 15854fc97dcdc0ab747f49bd09c5a877bfd2a00e364Evan Cheng 1598608f2eff2dab5345243c40d0bca9138f2dce6f1Evan Cheng /// LARX = This corresponds to PPC l{w|d}arx instrcution: load and 16054fc97dcdc0ab747f49bd09c5a877bfd2a00e364Evan Cheng /// reserve indexed. This is used to implement atomic operations. 1618608f2eff2dab5345243c40d0bca9138f2dce6f1Evan Cheng LARX, 16254fc97dcdc0ab747f49bd09c5a877bfd2a00e364Evan Cheng 1638608f2eff2dab5345243c40d0bca9138f2dce6f1Evan Cheng /// STCX = This corresponds to PPC stcx. instrcution: store conditional 1648608f2eff2dab5345243c40d0bca9138f2dce6f1Evan Cheng /// indexed. This is used to implement atomic operations. 1658608f2eff2dab5345243c40d0bca9138f2dce6f1Evan Cheng STCX, 16654fc97dcdc0ab747f49bd09c5a877bfd2a00e364Evan Cheng 16730e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer /// TC_RETURN - A tail call return. 16830e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer /// operand #0 chain 16930e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer /// operand #1 callee (register or absolute) 17030e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer /// operand #2 stack adjustment 17130e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer /// operand #3 optional in flag 172c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman TC_RETURN, 173c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman 174c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman /// STD_32 - This is the STD instruction for use with "32-bit" registers. 175c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman STD_32 = ISD::FIRST_TARGET_MEMORY_OPCODE, 176c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman 177c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman /// CHAIN = STBRX CHAIN, GPRC, Ptr, Type - This is a 178c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman /// byte-swapping store instruction. It byte-swaps the low "Type" bits of 179c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman /// the GPRC input, then stores it through Ptr. Type can be either i16 or 180c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman /// i32. 181c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman STBRX, 182c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman 183c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman /// GPRC, CHAIN = LBRX CHAIN, Ptr, Type - This is a 184c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman /// byte-swapping load instruction. It loads "Type" bits, byte swaps it, 185c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman /// then puts it in the bottom bits of the GPRC. TYPE can be either i16 186c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman /// or i32. 187c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman LBRX 188281b55ebeccd3f0d723888c1bb9ec6e476f708f1Chris Lattner }; 1893c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner } 1903c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner 1913c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner /// Define some predicates that are used for node matching. 1923c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner namespace PPC { 193ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner /// isVPKUHUMShuffleMask - Return true if this is the shuffle mask for a 194ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner /// VPKUHUM instruction. 1959008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman bool isVPKUHUMShuffleMask(ShuffleVectorSDNode *N, bool isUnary); 196ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner 197ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner /// isVPKUWUMShuffleMask - Return true if this is the shuffle mask for a 198ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner /// VPKUWUM instruction. 1999008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman bool isVPKUWUMShuffleMask(ShuffleVectorSDNode *N, bool isUnary); 200116cc48e30b9c307bf3eec29c890b4ba25cd18dbChris Lattner 201116cc48e30b9c307bf3eec29c890b4ba25cd18dbChris Lattner /// isVMRGLShuffleMask - Return true if this is a shuffle mask suitable for 202116cc48e30b9c307bf3eec29c890b4ba25cd18dbChris Lattner /// a VRGL* instruction with the specified unit size (1,2 or 4 bytes). 2039008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman bool isVMRGLShuffleMask(ShuffleVectorSDNode *N, unsigned UnitSize, 2049008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman bool isUnary); 205116cc48e30b9c307bf3eec29c890b4ba25cd18dbChris Lattner 206116cc48e30b9c307bf3eec29c890b4ba25cd18dbChris Lattner /// isVMRGHShuffleMask - Return true if this is a shuffle mask suitable for 207116cc48e30b9c307bf3eec29c890b4ba25cd18dbChris Lattner /// a VRGH* instruction with the specified unit size (1,2 or 4 bytes). 2089008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman bool isVMRGHShuffleMask(ShuffleVectorSDNode *N, unsigned UnitSize, 2099008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman bool isUnary); 210ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner 211d0608e191ff9c00af68985f246410c219d1bec57Chris Lattner /// isVSLDOIShuffleMask - If this is a vsldoi shuffle mask, return the shift 212d0608e191ff9c00af68985f246410c219d1bec57Chris Lattner /// amount, otherwise return -1. 213f24380e78ecc8a2db1b2116867d878b1e7c6f6edChris Lattner int isVSLDOIShuffleMask(SDNode *N, bool isUnary); 214d0608e191ff9c00af68985f246410c219d1bec57Chris Lattner 2153c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner /// isSplatShuffleMask - Return true if the specified VECTOR_SHUFFLE operand 2163c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner /// specifies a splat of a single element that is suitable for input to 2173c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner /// VSPLTB/VSPLTH/VSPLTW. 2189008ca6b6b4f638cfafccb593cbc5b1d3f5ab877Nate Begeman bool isSplatShuffleMask(ShuffleVectorSDNode *N, unsigned EltSize); 2193c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner 22066ffe6be0c7b50100a00cb0cc87a5d4983818572Evan Cheng /// isAllNegativeZeroVector - Returns true if all elements of build_vector 22166ffe6be0c7b50100a00cb0cc87a5d4983818572Evan Cheng /// are -0.0. 22266ffe6be0c7b50100a00cb0cc87a5d4983818572Evan Cheng bool isAllNegativeZeroVector(SDNode *N); 22366ffe6be0c7b50100a00cb0cc87a5d4983818572Evan Cheng 2243c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner /// getVSPLTImmediate - Return the appropriate VSPLT* immediate to splat the 2253c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner /// specified isSplatShuffleMask VECTOR_SHUFFLE mask. 2267ff7e674580adad7a5bccdbd74cf9c9f05e46d0fChris Lattner unsigned getVSPLTImmediate(SDNode *N, unsigned EltSize); 22764b3a08bc696b2ef8733d72ce81e49be175cbbffChris Lattner 228e87192a854ff0f2f1904dd9ea282eb36059bb5afChris Lattner /// get_VSPLTI_elt - If this is a build_vector of constants which can be 229140a58f9dfda30dbb80edd3da1b5632c178f7efcChris Lattner /// formed by using a vspltis[bhw] instruction of the specified element 230140a58f9dfda30dbb80edd3da1b5632c178f7efcChris Lattner /// size, return the constant being splatted. The ByteSize field indicates 231140a58f9dfda30dbb80edd3da1b5632c178f7efcChris Lattner /// the number of bytes of each element [124] -> [bhw]. 232475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue get_VSPLTI_elt(SDNode *N, unsigned ByteSize, SelectionDAG &DAG); 2333c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner } 2340bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner 23521e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman class PPCTargetLowering : public TargetLowering { 2367c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner int VarArgsFrameIndex; // FrameIndex for start of varargs area. 2370111999a88077f237c49d03c5e7891ec874b33a9Nicolas Geoffray int VarArgsStackOffset; // StackOffset for start of stack 2380111999a88077f237c49d03c5e7891ec874b33a9Nicolas Geoffray // arguments. 2390111999a88077f237c49d03c5e7891ec874b33a9Nicolas Geoffray unsigned VarArgsNumGPR; // Index of the first unused integer 2400111999a88077f237c49d03c5e7891ec874b33a9Nicolas Geoffray // register for parameter passing. 2410111999a88077f237c49d03c5e7891ec874b33a9Nicolas Geoffray unsigned VarArgsNumFPR; // Index of the first unused double 2420111999a88077f237c49d03c5e7891ec874b33a9Nicolas Geoffray // register for parameter passing. 243331d1bc5dfe1be9090e29f9af9579888a63a9a79Chris Lattner const PPCSubtarget &PPCSubTarget; 2447c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner public: 24561e729e2e9517ab2d8887bab86fb377900fa1081Dan Gohman explicit PPCTargetLowering(PPCTargetMachine &TM); 2467c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner 247da6d20f0c15205923cb2c3ef4bf9b5d77de88881Chris Lattner /// getTargetNodeName() - This method returns the name of a target specific 248da6d20f0c15205923cb2c3ef4bf9b5d77de88881Chris Lattner /// DAG node. 249da6d20f0c15205923cb2c3ef4bf9b5d77de88881Chris Lattner virtual const char *getTargetNodeName(unsigned Opcode) const; 250fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner 2515b8f82e35b51bf007de07a7ca9347d804084ddf8Scott Michel /// getSetCCResultType - Return the ISD::SETCC ValueType 252825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson virtual MVT::SimpleValueType getSetCCResultType(EVT VT) const; 2535b8f82e35b51bf007de07a7ca9347d804084ddf8Scott Michel 254fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner /// getPreIndexedAddressParts - returns true by value, base pointer and 255fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner /// offset pointer and addressing mode by reference if the node's address 256fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner /// can be legally represented as pre-indexed load / store address. 257475871a144eb604ddaf37503397ba0941442e5fbDan Gohman virtual bool getPreIndexedAddressParts(SDNode *N, SDValue &Base, 258475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue &Offset, 259144d8f09e139f691cafadbc17873943ba4c465f3Evan Cheng ISD::MemIndexedMode &AM, 26073e0914848662404cf2aa18eb049ff5aae543388Dan Gohman SelectionDAG &DAG) const; 261fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner 262fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner /// SelectAddressRegReg - Given the specified addressed, check to see if it 263fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner /// can be represented as an indexed [r+r] operation. Returns false if it 264fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner /// can be more efficiently represented with [r+imm]. 265475871a144eb604ddaf37503397ba0941442e5fbDan Gohman bool SelectAddressRegReg(SDValue N, SDValue &Base, SDValue &Index, 26673e0914848662404cf2aa18eb049ff5aae543388Dan Gohman SelectionDAG &DAG) const; 267fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner 268fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner /// SelectAddressRegImm - Returns true if the address N can be represented 269fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner /// by a base register plus a signed 16-bit displacement [r+imm], and if it 270fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner /// is not better represented as reg+reg. 271475871a144eb604ddaf37503397ba0941442e5fbDan Gohman bool SelectAddressRegImm(SDValue N, SDValue &Disp, SDValue &Base, 27273e0914848662404cf2aa18eb049ff5aae543388Dan Gohman SelectionDAG &DAG) const; 273fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner 274fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner /// SelectAddressRegRegOnly - Given the specified addressed, force it to be 275fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner /// represented as an indexed [r+r] operation. 276475871a144eb604ddaf37503397ba0941442e5fbDan Gohman bool SelectAddressRegRegOnly(SDValue N, SDValue &Base, SDValue &Index, 27773e0914848662404cf2aa18eb049ff5aae543388Dan Gohman SelectionDAG &DAG) const; 278fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner 279fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner /// SelectAddressRegImmShift - Returns true if the address N can be 280fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner /// represented by a base register plus a signed 14-bit displacement 281fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner /// [r+imm*4]. Suitable for use by STD and friends. 282475871a144eb604ddaf37503397ba0941442e5fbDan Gohman bool SelectAddressRegImmShift(SDValue N, SDValue &Disp, SDValue &Base, 28373e0914848662404cf2aa18eb049ff5aae543388Dan Gohman SelectionDAG &DAG) const; 284fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner 285da6d20f0c15205923cb2c3ef4bf9b5d77de88881Chris Lattner 286e4bc9ea0a560d8a0ba42f5a2da617e1f1f834710Chris Lattner /// LowerOperation - Provide custom lowering hooks for some operations. 287e4bc9ea0a560d8a0ba42f5a2da617e1f1f834710Chris Lattner /// 288475871a144eb604ddaf37503397ba0941442e5fbDan Gohman virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG); 2891f873003266fbdec7c2c48a965c60f4e2e35a158Chris Lattner 2901607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands /// ReplaceNodeResults - Replace the results of node with an illegal result 2911607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands /// type with new values built out of custom code. 2921607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands /// 2931607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands virtual void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results, 2941607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands SelectionDAG &DAG); 2951607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands 296475871a144eb604ddaf37503397ba0941442e5fbDan Gohman virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const; 297fc5b1ab94959879a91c34aee8859e652a50270d0Chris Lattner 298475871a144eb604ddaf37503397ba0941442e5fbDan Gohman virtual void computeMaskedBitsForTargetNode(const SDValue Op, 299977a76fbb6ea1b87dfd7fbbe2ae2afb63e982ff3Dan Gohman const APInt &Mask, 300fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman APInt &KnownZero, 301fd29e0eb060ea8b4d490860329234d2ae5f5952eDan Gohman APInt &KnownOne, 302ea859be53ca13a1547c4675549946b74dc3c6f41Dan Gohman const SelectionDAG &DAG, 303bbe77de450ef36b4f83cc3b57705a9758adbd925Chris Lattner unsigned Depth = 0) const; 3044a95945fa5aa431110f50092f4a45d24772a553bNate Begeman 305ff9b373e8f5006c629af81e2619778b4c4f5249eEvan Cheng virtual MachineBasicBlock *EmitInstrWithCustomInserter(MachineInstr *MI, 306fb2e752e4175920d0531f2afc93a23d0cdf4db14Evan Cheng MachineBasicBlock *MBB, 307fb2e752e4175920d0531f2afc93a23d0cdf4db14Evan Cheng DenseMap<MachineBasicBlock*, MachineBasicBlock*> *EM) const; 308bdab93a2ef5d9574bb4e322e020849f9bc9c90d7Dale Johannesen MachineBasicBlock *EmitAtomicBinary(MachineInstr *MI, 309bdab93a2ef5d9574bb4e322e020849f9bc9c90d7Dale Johannesen MachineBasicBlock *MBB, bool is64Bit, 3101fdbc1dd4e9cb42c79a30e8dc308c322e923cc52Dan Gohman unsigned BinOpcode) const; 31197efa365869d3b7b62836434585360a232836f0eDale Johannesen MachineBasicBlock *EmitPartwordAtomicBinary(MachineInstr *MI, 31297efa365869d3b7b62836434585360a232836f0eDale Johannesen MachineBasicBlock *MBB, 3131fdbc1dd4e9cb42c79a30e8dc308c322e923cc52Dan Gohman bool is8bit, unsigned Opcode) const; 314ddc787dfdc75fb2d78eb3e5793ca0f417ad74fd3Chris Lattner 3154234f57fa02b1f04a9f52a7b3c2aa22d32ac521cChris Lattner ConstraintType getConstraintType(const std::string &Constraint) const; 316331d1bc5dfe1be9090e29f9af9579888a63a9a79Chris Lattner std::pair<unsigned, const TargetRegisterClass*> 317331d1bc5dfe1be9090e29f9af9579888a63a9a79Chris Lattner getRegForInlineAsmConstraint(const std::string &Constraint, 318e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT VT) const; 319c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng 32028d08fdb9f6572cafd5aae95c7caffa3cd136d8eDale Johannesen /// getByValTypeAlignment - Return the desired alignment for ByVal aggregate 32128d08fdb9f6572cafd5aae95c7caffa3cd136d8eDale Johannesen /// function arguments in the caller parameter area. This is the actual 32228d08fdb9f6572cafd5aae95c7caffa3cd136d8eDale Johannesen /// alignment, not its logarithm. 32328d08fdb9f6572cafd5aae95c7caffa3cd136d8eDale Johannesen unsigned getByValTypeAlignment(const Type *Ty) const; 32428d08fdb9f6572cafd5aae95c7caffa3cd136d8eDale Johannesen 32548884cd80b52be1528618f2e9b3425ac24e7b5caChris Lattner /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops 326da43bcf624acb56a3d77bb5ae9a02728af032613Evan Cheng /// vector. If it is invalid, don't add anything to Ops. If hasMemory is 327da43bcf624acb56a3d77bb5ae9a02728af032613Evan Cheng /// true it means one of the asm constraint of the inline asm instruction 328da43bcf624acb56a3d77bb5ae9a02728af032613Evan Cheng /// being processed is 'm'. 329475871a144eb604ddaf37503397ba0941442e5fbDan Gohman virtual void LowerAsmOperandForConstraint(SDValue Op, 33048884cd80b52be1528618f2e9b3425ac24e7b5caChris Lattner char ConstraintLetter, 331da43bcf624acb56a3d77bb5ae9a02728af032613Evan Cheng bool hasMemory, 332475871a144eb604ddaf37503397ba0941442e5fbDan Gohman std::vector<SDValue> &Ops, 3335e764233f398b6929b67701672a5e78fec20ce2eChris Lattner SelectionDAG &DAG) const; 33448884cd80b52be1528618f2e9b3425ac24e7b5caChris Lattner 335c9addb74883fef318140272768422656a694341fChris Lattner /// isLegalAddressingMode - Return true if the addressing mode represented 336c9addb74883fef318140272768422656a694341fChris Lattner /// by AM is legal for this target, for a load/store of the specified type. 337c9addb74883fef318140272768422656a694341fChris Lattner virtual bool isLegalAddressingMode(const AddrMode &AM, const Type *Ty)const; 338c9addb74883fef318140272768422656a694341fChris Lattner 339c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng /// isLegalAddressImmediate - Return true if the integer value can be used 340861939152debbaa15a55a196a4321837c7bc379dEvan Cheng /// as the offset of the target addressing mode for load / store of the 341861939152debbaa15a55a196a4321837c7bc379dEvan Cheng /// given type. 342861939152debbaa15a55a196a4321837c7bc379dEvan Cheng virtual bool isLegalAddressImmediate(int64_t V, const Type *Ty) const; 343861939152debbaa15a55a196a4321837c7bc379dEvan Cheng 344861939152debbaa15a55a196a4321837c7bc379dEvan Cheng /// isLegalAddressImmediate - Return true if the GlobalValue can be used as 345861939152debbaa15a55a196a4321837c7bc379dEvan Cheng /// the offset of the target addressing mode. 346861939152debbaa15a55a196a4321837c7bc379dEvan Cheng virtual bool isLegalAddressImmediate(GlobalValue *GV) const; 34743c6e7cd9b0d9a3b0006650ddfac256848f10d51Nicolas Geoffray 34898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman virtual bool 34998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman IsEligibleForTailCallOptimization(SDValue Callee, 35065c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CalleeCC, 35198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman bool isVarArg, 35298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 35398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SelectionDAG& DAG) const; 35430e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer 35554aeea39a743effe88eedb43d2f7f4805e806ab5Dan Gohman virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const; 356ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller 357e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson virtual EVT getOptimalMemOpType(uint64_t Size, unsigned Align, 358ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller bool isSrcConst, bool isSrcStr, 359ffd0200abfd63177257f949a3674b91dcf87bf23Tilmann Scheller SelectionDAG &DAG) const; 36054aeea39a743effe88eedb43d2f7f4805e806ab5Dan Gohman 361b4202b84d7e54efe5e144885c7da63e6cc465f80Bill Wendling /// getFunctionAlignment - Return the Log2 alignment of this function. 36220c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling virtual unsigned getFunctionAlignment(const Function *F) const; 36320c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling 36454fc97dcdc0ab747f49bd09c5a877bfd2a00e364Evan Cheng private: 365475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getFramePointerFrameIndex(SelectionDAG & DAG) const; 366475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue getReturnAddrFrameIndex(SelectionDAG & DAG) const; 36730e62c098b5841259f8026df1c5c45c7c1182a38Arnold Schwaighofer 368475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue EmitTailCallLoadFPAndRetAddr(SelectionDAG & DAG, 36933c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen int SPDiff, 37033c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen SDValue Chain, 37133c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen SDValue &LROpOut, 37233c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen SDValue &FPOpOut, 3732a9ddfb903ae3baede7282348afae1f750905248Tilmann Scheller bool isDarwinABI, 37433c960f523f2308482d5b2816af46a7ec90a6d3dDale Johannesen DebugLoc dl); 375475871a144eb604ddaf37503397ba0941442e5fbDan Gohman 376475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG); 377475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG); 378475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG); 3793d90dbee695e723f422dafca3fc75f193268ab9eBob Wilson SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG); 380475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG); 381475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG); 382475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG); 383475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG); 3847795932d41a84c921a5d348b7fa70f5d32e146d0Bill Wendling SDValue LowerTRAMPOLINE(SDValue Op, SelectionDAG &DAG); 385475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG, 3865b3b695c2f1e11b6f5e0c89e1644211a92edab49Dale Johannesen int VarArgsFrameIndex, int VarArgsStackOffset, 3875b3b695c2f1e11b6f5e0c89e1644211a92edab49Dale Johannesen unsigned VarArgsNumGPR, unsigned VarArgsNumFPR, 3885b3b695c2f1e11b6f5e0c89e1644211a92edab49Dale Johannesen const PPCSubtarget &Subtarget); 389475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG, int VarArgsFrameIndex, 3905b3b695c2f1e11b6f5e0c89e1644211a92edab49Dale Johannesen int VarArgsStackOffset, unsigned VarArgsNumGPR, 3915b3b695c2f1e11b6f5e0c89e1644211a92edab49Dale Johannesen unsigned VarArgsNumFPR, const PPCSubtarget &Subtarget); 392475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG, 3935b3b695c2f1e11b6f5e0c89e1644211a92edab49Dale Johannesen const PPCSubtarget &Subtarget); 394475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG, 3955b3b695c2f1e11b6f5e0c89e1644211a92edab49Dale Johannesen const PPCSubtarget &Subtarget); 396475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG); 3974c9369df57a52cec5e1fc735e61a979766288074Dale Johannesen SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG, DebugLoc dl); 398475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG); 399475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG); 400475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerSHL_PARTS(SDValue Op, SelectionDAG &DAG); 401475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerSRL_PARTS(SDValue Op, SelectionDAG &DAG); 402475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerSRA_PARTS(SDValue Op, SelectionDAG &DAG); 403475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG); 404475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG); 405475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG); 406475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG); 407475871a144eb604ddaf37503397ba0941442e5fbDan Gohman SDValue LowerMUL(SDValue Op, SelectionDAG &DAG); 40898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 40998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue LowerCallResult(SDValue Chain, SDValue InFlag, 41065c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, 41198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 41298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 41398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SmallVectorImpl<SDValue> &InVals); 41465c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel SDValue FinishCall(CallingConv::ID CallConv, DebugLoc dl, bool isTailCall, 41598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman bool isVarArg, 41698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SelectionDAG &DAG, 41798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SmallVector<std::pair<unsigned, SDValue>, 8> 41898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman &RegsToPass, 41998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue InFlag, SDValue Chain, 42098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue &Callee, 42198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman int SPDiff, unsigned NumBytes, 42298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 42398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SmallVectorImpl<SDValue> &InVals); 42498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 42598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman virtual SDValue 42698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman LowerFormalArguments(SDValue Chain, 42765c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, 42898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 42998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 43098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SmallVectorImpl<SDValue> &InVals); 43198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 43298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman virtual SDValue 43398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman LowerCall(SDValue Chain, SDValue Callee, 43465c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, bool isTailCall, 43598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::OutputArg> &Outs, 43698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 43798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 43898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SmallVectorImpl<SDValue> &InVals); 43998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 44098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman virtual SDValue 44198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman LowerReturn(SDValue Chain, 44265c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, 44398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::OutputArg> &Outs, 44498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG); 44598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 44698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue 44798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman LowerFormalArguments_Darwin(SDValue Chain, 44865c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, 44998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 45098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 45198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SmallVectorImpl<SDValue> &InVals); 45298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue 45398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman LowerFormalArguments_SVR4(SDValue Chain, 45465c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, 45598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 45698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 45798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SmallVectorImpl<SDValue> &InVals); 45898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 45998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue 46098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman LowerCall_Darwin(SDValue Chain, SDValue Callee, 46165c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, bool isTailCall, 46298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::OutputArg> &Outs, 46398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 46498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 46598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SmallVectorImpl<SDValue> &InVals); 46698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SDValue 46798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman LowerCall_SVR4(SDValue Chain, SDValue Callee, 46865c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, bool isTailCall, 46998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::OutputArg> &Outs, 47098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 47198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 47298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SmallVectorImpl<SDValue> &InVals); 4737c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner }; 4747c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner} 4757c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner 4767c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner#endif // LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H 477