PPCISelLowering.h revision 3a84dae654630a89a91a73807201b6067c4774ec
1310968cbbb564c4141d4bd418a746e8103560222Chris Lattner//===-- PPCISelLowering.h - PPC32 DAG Lowering Interface --------*- C++ -*-===// 2f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman// 3310968cbbb564c4141d4bd418a746e8103560222Chris Lattner// The LLVM Compiler Infrastructure 4310968cbbb564c4141d4bd418a746e8103560222Chris Lattner// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7f976c856fcc5055f3fc7d9f070d72c2d027c1d9dMisha Brukman// 8310968cbbb564c4141d4bd418a746e8103560222Chris Lattner//===----------------------------------------------------------------------===// 9310968cbbb564c4141d4bd418a746e8103560222Chris Lattner// 10310968cbbb564c4141d4bd418a746e8103560222Chris Lattner// This file defines the interfaces that PPC uses to lower LLVM code into a 11310968cbbb564c4141d4bd418a746e8103560222Chris Lattner// selection DAG. 12310968cbbb564c4141d4bd418a746e8103560222Chris Lattner// 13310968cbbb564c4141d4bd418a746e8103560222Chris Lattner//===----------------------------------------------------------------------===// 14310968cbbb564c4141d4bd418a746e8103560222Chris Lattner 15af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner#ifndef LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H 16beeb93e6ba48af2661eabc4872d8b159fb43e5dbChris Lattner#define LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H 1707000c6f01d8f57170f2d4c77a86d934bdc5c696Owen Anderson 18f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetLowering.h" 19310968cbbb564c4141d4bd418a746e8103560222Chris Lattner#include "llvm/CodeGen/SelectionDAG.h" 206f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman#include "PPC.h" 21707e0184233f27e0e9f9aee0309f2daab8cfe7f8Dan Gohman#include "PPCSubtarget.h" 22dc879296090a738c66968f5eec77db65d7e03623Chris Lattner 2384023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohmannamespace llvm { 24ad4196b44ae714a6b95e238d9d96303df74b0429Evan Cheng namespace PPCISD { 25071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner enum NodeType { 26589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner // Start the numbering where the builtin ops and target ops leave off. 27310968cbbb564c4141d4bd418a746e8103560222Chris Lattner FIRST_NUMBER = ISD::BUILTIN_OP_END, 28e3ee49fb2728dcb9702b5be0c3c80f472ffccefcJakob Stoklund Olesen 29718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson /// FSEL - Traditional three-operand fsel node. 30b6fbec3a546fd04bb2e79040db2436b0bd629162Nadav Rotem /// 31c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin FSEL, 32c6fd6cd65c88ef1f11da43c11be0152cb69013a7Chris Lattner 33476b242fe7a61e5f9ac6214b0bc5c680d24f152eNick Lewycky /// FCFID - The FCFID instruction, taking an f64 operand and producing 34310968cbbb564c4141d4bd418a746e8103560222Chris Lattner /// and f64 value containing the FP representation of the integer that 35310968cbbb564c4141d4bd418a746e8103560222Chris Lattner /// was temporarily in the f64 operand. 3656966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng FCFID, 3756966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 3879cca507fe51aa8af7a9006b380977c61b6f3feaEvan Cheng /// FCTI[D,W]Z - The FCTIDZ and FCTIWZ instructions, taking an f32 or f64 39c31642f7af64bfaed36064b52a5cb2366fd01064Anton Korobeynikov /// operand, producing an f64 value containing the integer representation 4056966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// of that FP value. 4156966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng FCTIDZ, FCTIWZ, 42dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands 43c31642f7af64bfaed36064b52a5cb2366fd01064Anton Korobeynikov /// STFIWX - The STFIWX instruction. The first operand is an input token 4456966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// chain, then an f64 value to store, then an address to store it to. 4556966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng STFIWX, 46dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands 47c31642f7af64bfaed36064b52a5cb2366fd01064Anton Korobeynikov // VMADDFP, VNMSUBFP - The VMADDFP and VNMSUBFP instructions, taking 4856966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng // three v4f32 operands and producing a v4f32 result. 4956966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng VMADDFP, VNMSUBFP, 50dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands 518983da729aa1ca99a11a3b98ae6280dfcdbadb39Anton Korobeynikov /// VPERM - The PPC VPERM Instruction. 52c31642f7af64bfaed36064b52a5cb2366fd01064Anton Korobeynikov /// 5356966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng VPERM, 5456966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 555ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands /// Hi/Lo - These represent the high and low 16-bit parts of a global 56362fee90b9a1d64ac091755466caf6a94ade22ebEric Christopher /// address respectively. These nodes have two operands, the first of 57362fee90b9a1d64ac091755466caf6a94ade22ebEric Christopher /// which must be a TargetGlobalAddress, and the second of which must be a 58362fee90b9a1d64ac091755466caf6a94ade22ebEric Christopher /// Constant. Selected naively, these turn into 'lis G+C' and 'li G+C', 598983da729aa1ca99a11a3b98ae6280dfcdbadb39Anton Korobeynikov /// though these are usually folded into other nodes. 60813090cf891325c715b9f6fb1546e6ce67fa8c8bAnton Korobeynikov Hi, Lo, 6156966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 6256966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng TOC_ENTRY, 635ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands 648983da729aa1ca99a11a3b98ae6280dfcdbadb39Anton Korobeynikov /// The following three target-specific nodes are used for calls through 65fb3f84fe16219467cef4ed181530e846177cb4dfAnton Korobeynikov /// function pointers in the 64-bit SVR4 ABI. 6656966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 6756966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// Restore the TOC from the TOC save area of the current stack frame. 685ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands /// This is basically a hard coded load instruction which additionally 698983da729aa1ca99a11a3b98ae6280dfcdbadb39Anton Korobeynikov /// takes/produces a flag. 70813090cf891325c715b9f6fb1546e6ce67fa8c8bAnton Korobeynikov TOC_RESTORE, 7156966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 7256966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// Like a regular LOAD but additionally taking/producing a flag. 735ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands LOAD, 748983da729aa1ca99a11a3b98ae6280dfcdbadb39Anton Korobeynikov 759fe9c8ec7d7d1e260927cb66e91d5e69db8a6febAnton Korobeynikov /// LOAD into r2 (also taking/producing a flag). Like TOC_RESTORE, this is 7656966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// a hard coded load instruction. 7756966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng LOAD_TOC, 785ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands 798e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng /// OPRC, CHAIN = DYNALLOC(CHAIN, NEGSIZE, FRAME_INDEX) 808e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng /// This instruction is lowered in PPCRegisterInfo::eliminateFrameIndex to 818e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng /// compute an allocation on the stack. 828e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng DYNALLOC, 838e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng 848e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng /// GlobalBaseReg - On Darwin, this node represents the result of the mflr 858e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng /// at function entry, used for PIC code. 868e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng GlobalBaseReg, 878e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng 888e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng /// These nodes represent the 32-bit PPC shifts that operate on 6-bit 898e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng /// shift amounts. These nodes are generated by the multi-precision shift 908e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng /// code. 918e23e815ad1136721acdfcce76975a37c8a2c036Evan Cheng SRL, SRA, SHL, 9256966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 9356966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// EXTSW_32 - This is the EXTSW instruction for use with "32-bit" 9456966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// registers. 9556966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng EXTSW_32, 96007f9847c44ddbe7fd04cba362b4ec0f0f40964bDuncan Sands 97161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen /// CALL - A direct function call. 9856966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng CALL_Darwin, CALL_SVR4, 9956966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 100007f9847c44ddbe7fd04cba362b4ec0f0f40964bDuncan Sands /// NOP - Special NOP which follows 64-bit SVR4 calls. 101161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen NOP, 10256966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 10356966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// CHAIN,FLAG = MTCTR(VAL, CHAIN[, INFLAG]) - Directly corresponds to a 104007f9847c44ddbe7fd04cba362b4ec0f0f40964bDuncan Sands /// MTCTR instruction. 105161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen MTCTR, 10656966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 10756966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// CHAIN,FLAG = BCTRL(CHAIN, INFLAG) - Directly corresponds to a 108007f9847c44ddbe7fd04cba362b4ec0f0f40964bDuncan Sands /// BCTRL instruction. 109161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen BCTRL_Darwin, BCTRL_SVR4, 11056966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 11156966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// Return with a flag operand, matched by 'blr' 112007f9847c44ddbe7fd04cba362b4ec0f0f40964bDuncan Sands RET_FLAG, 113161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen 11433390848a7eca75301d04a59b89b516d83e19ee0Cameron Zwarich /// R32 = MFCR(CRREG, INFLAG) - Represents the MFCR/MFOCRF instructions. 11533390848a7eca75301d04a59b89b516d83e19ee0Cameron Zwarich /// This copies the bits corresponding to the specified CRREG into the 11633390848a7eca75301d04a59b89b516d83e19ee0Cameron Zwarich /// resultant GPR. Bits corresponding to other CR regs are undefined. 11733390848a7eca75301d04a59b89b516d83e19ee0Cameron Zwarich MFCR, 11856966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 11956966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// RESVEC = VCMP(LHS, RHS, OPC) - Represents one of the altivec VCMP* 120161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen /// instructions. For lack of better number, we use the opcode number 121161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen /// encoding for the OPC field to identify the compare. For example, 838 12256966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// is VCMPGTSH. 12356966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng VCMP, 124161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen 125161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen /// RESVEC, OUTFLAG = VCMPo(LHS, RHS, OPC) - Represents one of the 1267794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen /// altivec VCMP*o instructions. For lack of better number, we use the 1277794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen /// opcode number encoding for the OPC field to identify the compare. For 1287794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen /// example, 838 is VCMPGTSH. 1297794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen VCMPo, 1307794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen 1317794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen /// CHAIN = COND_BRANCH CHAIN, CRRC, OPC, DESTBB [, INFLAG] - This 1327794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen /// corresponds to the COND_BRANCH pseudo instruction. CRRC is the 1337794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen /// condition register to branch on, OPC is the branch opcode to use (e.g. 1347794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen /// PPC::BLE), DESTBB is the destination block to branch to, and INFLAG is 1357794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen /// an optional input flag argument. 1367794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen COND_BRANCH, 1377794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen 1387794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen // The following 5 instructions are used only as part of the 1397794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen // long double-to-int conversion sequence. 1407794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen 1417794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen /// OUTFLAG = MFFS F8RC - This moves the FPSCR (not modelled) into the 1427794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen /// register. 1437794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen MFFS, 1447794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen 1457794f2a3a7778bdbc9bdd861db1fe914450e0470Dale Johannesen /// OUTFLAG = MTFSB0 INFLAG - This clears a bit in the FPSCR. 14656966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng MTFSB0, 14756966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 148007f9847c44ddbe7fd04cba362b4ec0f0f40964bDuncan Sands /// OUTFLAG = MTFSB1 INFLAG - This sets a bit in the FPSCR. 149007f9847c44ddbe7fd04cba362b4ec0f0f40964bDuncan Sands MTFSB1, 15056966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 15156966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// F8RC, OUTFLAG = FADDRTZ F8RC, F8RC, INFLAG - This is an FADD done with 152007f9847c44ddbe7fd04cba362b4ec0f0f40964bDuncan Sands /// rounding towards zero. It has flags added so it won't move past the 153007f9847c44ddbe7fd04cba362b4ec0f0f40964bDuncan Sands /// FPSCR-setting instructions. 154e54be104180d81b61c5fcc29ccb7960f9b78476eDan Gohman FADDRTZ, 155e54be104180d81b61c5fcc29ccb7960f9b78476eDan Gohman 156e54be104180d81b61c5fcc29ccb7960f9b78476eDan Gohman /// MTFSF = F8RC, INFLAG - This moves the register into the FPSCR. 157e54be104180d81b61c5fcc29ccb7960f9b78476eDan Gohman MTFSF, 1582bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman 1592bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman /// LARX = This corresponds to PPC l{w|d}arx instrcution: load and 1602bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman /// reserve indexed. This is used to implement atomic operations. 1612bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman LARX, 1622bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman 1632bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman /// STCX = This corresponds to PPC stcx. instrcution: store conditional 1642bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman /// indexed. This is used to implement atomic operations. 1652bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman STCX, 1662bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman 1672bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman /// TC_RETURN - A tail call return. 1682bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman /// operand #0 chain 1692bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman /// operand #1 callee (register or absolute) 1702bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman /// operand #2 stack adjustment 1712bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman /// operand #3 optional in flag 1722bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman TC_RETURN, 1732bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman 1742bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman /// STD_32 - This is the STD instruction for use with "32-bit" registers. 1752bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman STD_32 = ISD::FIRST_TARGET_MEMORY_OPCODE, 1762bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman 1772bb1e3eede14dd8a965506465e2876fb1ae765c2Dan Gohman /// CHAIN = STBRX CHAIN, GPRC, Ptr, Type - This is a 178d2c817eff1d158398fb0a620fa762bf95207922fDuncan Sands /// byte-swapping store instruction. It byte-swaps the low "Type" bits of 179d2c817eff1d158398fb0a620fa762bf95207922fDuncan Sands /// the GPRC input, then stores it through Ptr. Type can be either i16 or 180d2c817eff1d158398fb0a620fa762bf95207922fDuncan Sands /// i32. 181d2c817eff1d158398fb0a620fa762bf95207922fDuncan Sands STBRX, 18256966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 183927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov /// GPRC, CHAIN = LBRX CHAIN, Ptr, Type - This is a 184927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov /// byte-swapping load instruction. It loads "Type" bits, byte swaps it, 18556966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// then puts it in the bottom bits of the GPRC. TYPE can be either i16 186e36bfe678df09f46e1eac60b15105c1ccd2c5382Bruno Cardoso Lopes /// or i32. 187e36bfe678df09f46e1eac60b15105c1ccd2c5382Bruno Cardoso Lopes LBRX 188e36bfe678df09f46e1eac60b15105c1ccd2c5382Bruno Cardoso Lopes }; 189e36bfe678df09f46e1eac60b15105c1ccd2c5382Bruno Cardoso Lopes } 190de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov 191de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov /// Define some predicates that are used for node matching. 19256966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng namespace PPC { 19356966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// isVPKUHUMShuffleMask - Return true if this is the shuffle mask for a 194a2e9485e34f1348526ed104dbdc194673e291077Dan Gohman /// VPKUHUM instruction. 195de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov bool isVPKUHUMShuffleMask(ShuffleVectorSDNode *N, bool isUnary); 196de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov 19756966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// isVPKUWUMShuffleMask - Return true if this is the shuffle mask for a 19856966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// VPKUWUM instruction. 199a2e9485e34f1348526ed104dbdc194673e291077Dan Gohman bool isVPKUWUMShuffleMask(ShuffleVectorSDNode *N, bool isUnary); 200be1ad4de2900451626c8d4ace07b9ea16099ea1dDuncan Sands 201161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen /// isVMRGLShuffleMask - Return true if this is a shuffle mask suitable for 202a2e9485e34f1348526ed104dbdc194673e291077Dan Gohman /// a VRGL* instruction with the specified unit size (1,2 or 4 bytes). 203041cde26eaf4ef6171ff1a44aeedd08d7a1cba6cDuncan Sands bool isVMRGLShuffleMask(ShuffleVectorSDNode *N, unsigned UnitSize, 204161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen bool isUnary); 205a2e9485e34f1348526ed104dbdc194673e291077Dan Gohman 206de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov /// isVMRGHShuffleMask - Return true if this is a shuffle mask suitable for 207de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov /// a VRGH* instruction with the specified unit size (1,2 or 4 bytes). 20856966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng bool isVMRGHShuffleMask(ShuffleVectorSDNode *N, unsigned UnitSize, 20956966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng bool isUnary); 210a2e9485e34f1348526ed104dbdc194673e291077Dan Gohman 211de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov /// isVSLDOIShuffleMask - If this is a vsldoi shuffle mask, return the shift 212de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov /// amount, otherwise return -1. 21356966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng int isVSLDOIShuffleMask(SDNode *N, bool isUnary); 21456966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 215a2e9485e34f1348526ed104dbdc194673e291077Dan Gohman /// isSplatShuffleMask - Return true if the specified VECTOR_SHUFFLE operand 216161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen /// specifies a splat of a single element that is suitable for input to 217161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen /// VSPLTB/VSPLTH/VSPLTW. 218a2e9485e34f1348526ed104dbdc194673e291077Dan Gohman bool isSplatShuffleMask(ShuffleVectorSDNode *N, unsigned EltSize); 219041cde26eaf4ef6171ff1a44aeedd08d7a1cba6cDuncan Sands 220161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen /// isAllNegativeZeroVector - Returns true if all elements of build_vector 221a2e9485e34f1348526ed104dbdc194673e291077Dan Gohman /// are -0.0. 22256966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng bool isAllNegativeZeroVector(SDNode *N); 22356966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 2249bed0f58eb7f5e9e22d062f3880a5fabfdd0dfddDuncan Sands /// getVSPLTImmediate - Return the appropriate VSPLT* immediate to splat the 2259bed0f58eb7f5e9e22d062f3880a5fabfdd0dfddDuncan Sands /// specified isSplatShuffleMask VECTOR_SHUFFLE mask. 22656966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng unsigned getVSPLTImmediate(SDNode *N, unsigned EltSize); 22756966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 228161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen /// get_VSPLTI_elt - If this is a build_vector of constants which can be 229161e897b0fb35d156b2fe720fadabd975b0d6723Dale Johannesen /// formed by using a vspltis[bhw] instruction of the specified element 230d91446de7a89a22c8ea1cbfd40fe2528467a4ccbDan Gohman /// size, return the constant being splatted. The ByteSize field indicates 231d91446de7a89a22c8ea1cbfd40fe2528467a4ccbDan Gohman /// the number of bytes of each element [124] -> [bhw]. 232d91446de7a89a22c8ea1cbfd40fe2528467a4ccbDan Gohman SDValue get_VSPLTI_elt(SDNode *N, unsigned ByteSize, SelectionDAG &DAG); 233d91446de7a89a22c8ea1cbfd40fe2528467a4ccbDan Gohman } 23456966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 23556966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng class PPCTargetLowering : public TargetLowering { 236ac6cecec189ba9689c42543c3106c02b96d788daDuncan Sands int VarArgsFrameIndex; // FrameIndex for start of varargs area. 237ac6cecec189ba9689c42543c3106c02b96d788daDuncan Sands int VarArgsStackOffset; // StackOffset for start of stack 23856966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng // arguments. 23956966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng unsigned VarArgsNumGPR; // Index of the first unused integer 240ac6cecec189ba9689c42543c3106c02b96d788daDuncan Sands // register for parameter passing. 241ac6cecec189ba9689c42543c3106c02b96d788daDuncan Sands unsigned VarArgsNumFPR; // Index of the first unused double 242ac6cecec189ba9689c42543c3106c02b96d788daDuncan Sands // register for parameter passing. 243ac6cecec189ba9689c42543c3106c02b96d788daDuncan Sands const PPCSubtarget &PPCSubTarget; 244ac6cecec189ba9689c42543c3106c02b96d788daDuncan Sands public: 245ac6cecec189ba9689c42543c3106c02b96d788daDuncan Sands explicit PPCTargetLowering(PPCTargetMachine &TM); 24656966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 24756966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// getTargetNodeName() - This method returns the name of a target specific 24856966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// DAG node. 24956966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng virtual const char *getTargetNodeName(unsigned Opcode) const; 25056966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 25156966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// getSetCCResultType - Return the ISD::SETCC ValueType 25256966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng virtual MVT::SimpleValueType getSetCCResultType(EVT VT) const; 25356966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng 25456966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// getPreIndexedAddressParts - returns true by value, base pointer and 25556966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// offset pointer and addressing mode by reference if the node's address 25656966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng /// can be legally represented as pre-indexed load / store address. 25756966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng virtual bool getPreIndexedAddressParts(SDNode *N, SDValue &Base, 25856966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng SDValue &Offset, 25956966225d1eed9f9a6951d2167bfbbec9628c8d6Evan Cheng ISD::MemIndexedMode &AM, 260d385fd62cb43435b3ad70d789198d34bf148e579Evan Cheng SelectionDAG &DAG) const; 261d385fd62cb43435b3ad70d789198d34bf148e579Evan Cheng 262a114baa5bf0d70aed8b8cf576a864005c0d6a128Sanjiv Gupta /// SelectAddressRegReg - Given the specified addressed, check to see if it 263a114baa5bf0d70aed8b8cf576a864005c0d6a128Sanjiv Gupta /// can be represented as an indexed [r+r] operation. Returns false if it 264a114baa5bf0d70aed8b8cf576a864005c0d6a128Sanjiv Gupta /// can be more efficiently represented with [r+imm]. 265b0f1e1780c736c62fb99e5824825d2a60a53b53bDuncan Sands bool SelectAddressRegReg(SDValue N, SDValue &Base, SDValue &Index, 266e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach SelectionDAG &DAG) const; 267e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach 268e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach /// SelectAddressRegImm - Returns true if the address N can be represented 269e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach /// by a base register plus a signed 16-bit displacement [r+imm], and if it 270ef6eb9c7ab7967790566c5e2d47977d89fc060eeJim Grosbach /// is not better represented as reg+reg. 271ef6eb9c7ab7967790566c5e2d47977d89fc060eeJim Grosbach bool SelectAddressRegImm(SDValue N, SDValue &Disp, SDValue &Base, 272ef6eb9c7ab7967790566c5e2d47977d89fc060eeJim Grosbach SelectionDAG &DAG) const; 273ef6eb9c7ab7967790566c5e2d47977d89fc060eeJim Grosbach 274e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach /// SelectAddressRegRegOnly - Given the specified addressed, force it to be 275e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach /// represented as an indexed [r+r] operation. 276e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach bool SelectAddressRegRegOnly(SDValue N, SDValue &Base, SDValue &Index, 277e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach SelectionDAG &DAG) const; 278e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach 279e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach /// SelectAddressRegImmShift - Returns true if the address N can be 280e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach /// represented by a base register plus a signed 14-bit displacement 281e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach /// [r+imm*4]. Suitable for use by STD and friends. 282e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach bool SelectAddressRegImmShift(SDValue N, SDValue &Disp, SDValue &Base, 283e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach SelectionDAG &DAG) const; 284e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach 285e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach 286e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach /// LowerOperation - Provide custom lowering hooks for some operations. 287e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach /// 288e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG); 289e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach 290e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach /// ReplaceNodeResults - Replace the results of node with an illegal result 291e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach /// type with new values built out of custom code. 292312b7c950a27f72a811b3fdbed26e2e08eb20c31Jim Grosbach /// 293e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach virtual void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue>&Results, 294e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach SelectionDAG &DAG); 295e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach 296e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const; 297e03262fcfc09356a0e3ec589041bc2e0248944e9Jim Grosbach 298d385fd62cb43435b3ad70d789198d34bf148e579Evan Cheng virtual void computeMaskedBitsForTargetNode(const SDValue Op, 299d385fd62cb43435b3ad70d789198d34bf148e579Evan Cheng const APInt &Mask, 30072977a45a8ad9d9524c9b49399e89fb9a3a676edAnton Korobeynikov APInt &KnownZero, 30172977a45a8ad9d9524c9b49399e89fb9a3a676edAnton Korobeynikov APInt &KnownOne, 30272977a45a8ad9d9524c9b49399e89fb9a3a676edAnton Korobeynikov const SelectionDAG &DAG, 30372977a45a8ad9d9524c9b49399e89fb9a3a676edAnton Korobeynikov unsigned Depth = 0) const; 30472977a45a8ad9d9524c9b49399e89fb9a3a676edAnton Korobeynikov 30572977a45a8ad9d9524c9b49399e89fb9a3a676edAnton Korobeynikov virtual MachineBasicBlock *EmitInstrWithCustomInserter(MachineInstr *MI, 30672977a45a8ad9d9524c9b49399e89fb9a3a676edAnton Korobeynikov MachineBasicBlock *MBB, 30772977a45a8ad9d9524c9b49399e89fb9a3a676edAnton Korobeynikov DenseMap<MachineBasicBlock*, MachineBasicBlock*> *EM) const; 308b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands MachineBasicBlock *EmitAtomicBinary(MachineInstr *MI, 309b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands MachineBasicBlock *MBB, bool is64Bit, 310e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson unsigned BinOpcode) const; 311825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson MachineBasicBlock *EmitPartwordAtomicBinary(MachineInstr *MI, 312825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson MachineBasicBlock *MBB, 313b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands bool is8bit, unsigned Opcode) const; 314b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands 315927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov ConstraintType getConstraintType(const std::string &Constraint) const; 316b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands std::pair<unsigned, const TargetRegisterClass*> 317b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands getRegForInlineAsmConstraint(const std::string &Constraint, 318b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands EVT VT) const; 319b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands 320b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands /// getByValTypeAlignment - Return the desired alignment for ByVal aggregate 321e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson /// function arguments in the caller parameter area. This is the actual 322825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson /// alignment, not its logarithm. 323825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson unsigned getByValTypeAlignment(const Type *Ty) const; 324b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands 325825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson /// LowerAsmOperandForConstraint - Lower the specified operand into the Ops 326e36bfe678df09f46e1eac60b15105c1ccd2c5382Bruno Cardoso Lopes /// vector. If it is invalid, don't add anything to Ops. If hasMemory is 327825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson /// true it means one of the asm constraint of the inline asm instruction 328e36bfe678df09f46e1eac60b15105c1ccd2c5382Bruno Cardoso Lopes /// being processed is 'm'. 329825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson virtual void LowerAsmOperandForConstraint(SDValue Op, 330825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson char ConstraintLetter, 331e36bfe678df09f46e1eac60b15105c1ccd2c5382Bruno Cardoso Lopes bool hasMemory, 332825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson std::vector<SDValue> &Ops, 333e36bfe678df09f46e1eac60b15105c1ccd2c5382Bruno Cardoso Lopes SelectionDAG &DAG) const; 334b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands 335927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov /// isLegalAddressingMode - Return true if the addressing mode represented 336b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands /// by AM is legal for this target, for a load/store of the specified type. 337b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands virtual bool isLegalAddressingMode(const AddrMode &AM, const Type *Ty)const; 338b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands 339b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands /// isLegalAddressImmediate - Return true if the integer value can be used 340b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands /// as the offset of the target addressing mode for load / store of the 341e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson /// given type. 342825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson virtual bool isLegalAddressImmediate(int64_t V, const Type *Ty) const; 343825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson 3448aa207ee306b6a5ce753511a5f811fc1cd2468e2Sanjiv Gupta /// isLegalAddressImmediate - Return true if the GlobalValue can be used as 345825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson /// the offset of the target addressing mode. 3468aa207ee306b6a5ce753511a5f811fc1cd2468e2Sanjiv Gupta virtual bool isLegalAddressImmediate(GlobalValue *GV) const; 347825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson 348b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands virtual bool 349825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson IsEligibleForTailCallOptimization(SDValue Callee, 350b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands CallingConv::ID CalleeCC, 351825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson bool isVarArg, 352b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands const SmallVectorImpl<ISD::InputArg> &Ins, 353825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SelectionDAG& DAG) const; 354de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov 355de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const; 356de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov 357de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov virtual EVT getOptimalMemOpType(uint64_t Size, unsigned Align, 358825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson bool isSrcConst, bool isSrcStr, 359b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SelectionDAG &DAG) const; 360825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson 361b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands /// getFunctionAlignment - Return the Log2 alignment of this function. 362825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson virtual unsigned getFunctionAlignment(const Function *F) const; 363b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands 364825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson private: 365825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDValue getFramePointerFrameIndex(SelectionDAG & DAG) const; 366b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SDValue getReturnAddrFrameIndex(SelectionDAG & DAG) const; 367825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson 368b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SDValue EmitTailCallLoadFPAndRetAddr(SelectionDAG & DAG, 369825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson int SPDiff, 370b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SDValue Chain, 371825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDValue &LROpOut, 372825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDValue &FPOpOut, 373b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands bool isDarwinABI, 374825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson DebugLoc dl); 375b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands 376825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG); 377b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG); 378b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG); 379b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG); 380b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG); 381b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG); 382b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG); 383b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG); 384e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson SDValue LowerTRAMPOLINE(SDValue Op, SelectionDAG &DAG); 385825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG, 386825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson int VarArgsFrameIndex, int VarArgsStackOffset, 3878aa207ee306b6a5ce753511a5f811fc1cd2468e2Sanjiv Gupta unsigned VarArgsNumGPR, unsigned VarArgsNumFPR, 388825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson const PPCSubtarget &Subtarget); 3898aa207ee306b6a5ce753511a5f811fc1cd2468e2Sanjiv Gupta SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG, int VarArgsFrameIndex, 390825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson int VarArgsStackOffset, unsigned VarArgsNumGPR, 391b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands unsigned VarArgsNumFPR, const PPCSubtarget &Subtarget); 392825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDValue LowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG, 393b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands const PPCSubtarget &Subtarget); 394825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG, 395b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands const PPCSubtarget &Subtarget); 396825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG); 397de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG, DebugLoc dl); 398de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG); 399de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov SDValue LowerFLT_ROUNDS_(SDValue Op, SelectionDAG &DAG); 400de0118c324a3fb8b0b5afa8e46996d9b81666bfdAnton Korobeynikov SDValue LowerSHL_PARTS(SDValue Op, SelectionDAG &DAG); 401825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDValue LowerSRL_PARTS(SDValue Op, SelectionDAG &DAG); 402b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SDValue LowerSRA_PARTS(SDValue Op, SelectionDAG &DAG); 403825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG); 404b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG); 405825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG); 406b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SDValue LowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG); 407825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDValue LowerMUL(SDValue Op, SelectionDAG &DAG); 408825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson 409b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SDValue LowerCallResult(SDValue Chain, SDValue InFlag, 410825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson CallingConv::ID CallConv, bool isVarArg, 411b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands const SmallVectorImpl<ISD::InputArg> &Ins, 412825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson DebugLoc dl, SelectionDAG &DAG, 413b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SmallVectorImpl<SDValue> &InVals); 414825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDValue FinishCall(CallingConv::ID CallConv, DebugLoc dl, bool isTailCall, 415825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson bool isVarArg, 416b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SelectionDAG &DAG, 417825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SmallVector<std::pair<unsigned, SDValue>, 8> 418b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands &RegsToPass, 419825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDValue InFlag, SDValue Chain, 420b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SDValue &Callee, 421b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands int SPDiff, unsigned NumBytes, 422b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands const SmallVectorImpl<ISD::InputArg> &Ins, 423b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SmallVectorImpl<SDValue> &InVals); 424b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands 425b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands virtual SDValue 426b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands LowerFormalArguments(SDValue Chain, 427e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson CallingConv::ID CallConv, bool isVarArg, 428825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson const SmallVectorImpl<ISD::InputArg> &Ins, 429825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson DebugLoc dl, SelectionDAG &DAG, 430b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SmallVectorImpl<SDValue> &InVals); 431825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson 432b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands virtual SDValue 433825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson LowerCall(SDValue Chain, SDValue Callee, 434b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands CallingConv::ID CallConv, bool isVarArg, bool isTailCall, 435825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson const SmallVectorImpl<ISD::OutputArg> &Outs, 436b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands const SmallVectorImpl<ISD::InputArg> &Ins, 437825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson DebugLoc dl, SelectionDAG &DAG, 438825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SmallVectorImpl<SDValue> &InVals); 439b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands 440825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson virtual SDValue 441b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands LowerReturn(SDValue Chain, 442825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson CallingConv::ID CallConv, bool isVarArg, 443b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands const SmallVectorImpl<ISD::OutputArg> &Outs, 444825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson DebugLoc dl, SelectionDAG &DAG); 445b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands 446825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SDValue 447825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson LowerFormalArguments_Darwin(SDValue Chain, 448b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands CallingConv::ID CallConv, bool isVarArg, 449825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson const SmallVectorImpl<ISD::InputArg> &Ins, 450b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands DebugLoc dl, SelectionDAG &DAG, 451825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SmallVectorImpl<SDValue> &InVals); 452b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SDValue 453825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson LowerFormalArguments_SVR4(SDValue Chain, 454b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands CallingConv::ID CallConv, bool isVarArg, 455b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands const SmallVectorImpl<ISD::InputArg> &Ins, 456b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands DebugLoc dl, SelectionDAG &DAG, 457b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SmallVectorImpl<SDValue> &InVals); 458b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands 459b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SDValue 460b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands LowerCall_Darwin(SDValue Chain, SDValue Callee, 461e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson CallingConv::ID CallConv, bool isVarArg, bool isTailCall, 462825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson const SmallVectorImpl<ISD::OutputArg> &Outs, 463825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson const SmallVectorImpl<ISD::InputArg> &Ins, 464b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands DebugLoc dl, SelectionDAG &DAG, 465825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SmallVectorImpl<SDValue> &InVals); 466b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands SDValue 467825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson LowerCall_SVR4(SDValue Chain, SDValue Callee, 468b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands CallingConv::ID CallConv, bool isVarArg, bool isTailCall, 469825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson const SmallVectorImpl<ISD::OutputArg> &Outs, 470b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands const SmallVectorImpl<ISD::InputArg> &Ins, 471825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson DebugLoc dl, SelectionDAG &DAG, 472825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson SmallVectorImpl<SDValue> &InVals); 473b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands }; 474825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson} 475b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands 476825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson#endif // LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H 477b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands