PPCISelLowering.h revision d0608e191ff9c00af68985f246410c219d1bec57
121e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman//===-- PPCISelLowering.h - PPC32 DAG Lowering Interface --------*- C++ -*-===// 27c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner// 37c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner// The LLVM Compiler Infrastructure 47c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner// 57c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner// This file was developed by Chris Lattner and is distributed under 67c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner// the University of Illinois Open Source 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" 217c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner 227c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattnernamespace llvm { 230bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner namespace PPCISD { 240bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner enum NodeType { 250bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner // Start the numbering where the builting ops and target ops leave off. 260bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner FIRST_NUMBER = ISD::BUILTIN_OP_END+PPC::INSTRUCTION_LIST_END, 270bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner 280bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner /// FSEL - Traditional three-operand fsel node. 290bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner /// 300bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner FSEL, 31f76053269ecc6c7bd3d0b1e90ebdd0cef1bb2bdcChris Lattner 32c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman /// FCFID - The FCFID instruction, taking an f64 operand and producing 33c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman /// and f64 value containing the FP representation of the integer that 34c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman /// was temporarily in the f64 operand. 35c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman FCFID, 36c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman 37c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman /// FCTI[D,W]Z - The FCTIDZ and FCTIWZ instructions, taking an f32 or f64 38c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman /// operand, producing an f64 value containing the integer representation 39c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman /// of that FP value. 40c09eeec0ebc378644bafd04916e5efafa7d98152Nate Begeman FCTIDZ, FCTIWZ, 41860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner 425126984b1da4bda0e93961da07e883699f1f2d57Chris Lattner /// STFIWX - The STFIWX instruction. The first operand is an input token 435126984b1da4bda0e93961da07e883699f1f2d57Chris Lattner /// chain, then an f64 value to store, then an address to store it to, 445126984b1da4bda0e93961da07e883699f1f2d57Chris Lattner /// then a SRCVALUE for the address. 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 62860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner /// GlobalBaseReg - On Darwin, this node represents the result of the mflr 63860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner /// at function entry, used for PIC code. 64860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner GlobalBaseReg, 654172b10ca1adfc1026428e5f522aaab98bd939adChris Lattner 664172b10ca1adfc1026428e5f522aaab98bd939adChris Lattner /// These nodes represent the 32-bit PPC shifts that operate on 6-bit 674172b10ca1adfc1026428e5f522aaab98bd939adChris Lattner /// shift amounts. These nodes are generated by the multi-precision shift 684172b10ca1adfc1026428e5f522aaab98bd939adChris Lattner /// code. 694172b10ca1adfc1026428e5f522aaab98bd939adChris Lattner SRL, SRA, SHL, 70ecfe55e65b6a72fddd543c42f2e2df4c96c647baChris Lattner 71ecfe55e65b6a72fddd543c42f2e2df4c96c647baChris Lattner /// EXTSW_32 - This is the EXTSW instruction for use with "32-bit" 72ecfe55e65b6a72fddd543c42f2e2df4c96c647baChris Lattner /// registers. 73ecfe55e65b6a72fddd543c42f2e2df4c96c647baChris Lattner EXTSW_32, 749e4dd9dfc97f3930f58ca6e47bebbd8eb5cdd8a1Nate Begeman 75ecfe55e65b6a72fddd543c42f2e2df4c96c647baChris Lattner /// STD_32 - This is the STD instruction for use with "32-bit" registers. 76ecfe55e65b6a72fddd543c42f2e2df4c96c647baChris Lattner STD_32, 77ecfe55e65b6a72fddd543c42f2e2df4c96c647baChris Lattner 78281b55ebeccd3f0d723888c1bb9ec6e476f708f1Chris Lattner /// CALL - A function call. 79281b55ebeccd3f0d723888c1bb9ec6e476f708f1Chris Lattner CALL, 80281b55ebeccd3f0d723888c1bb9ec6e476f708f1Chris Lattner 819e4dd9dfc97f3930f58ca6e47bebbd8eb5cdd8a1Nate Begeman /// Return with a flag operand, matched by 'blr' 829e4dd9dfc97f3930f58ca6e47bebbd8eb5cdd8a1Nate Begeman RET_FLAG, 836d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner 846d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner /// R32 = MFCR(CRREG, INFLAG) - Represents the MFCR/MFOCRF instructions. 856d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner /// This copies the bits corresponding to the specified CRREG into the 866d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner /// resultant GPR. Bits corresponding to other CR regs are undefined. 876d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner MFCR, 88a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner 89a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner /// RESVEC = VCMP(LHS, RHS, OPC) - Represents one of the altivec VCMP* 90a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner /// instructions. For lack of better number, we use the opcode number 91a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner /// encoding for the OPC field to identify the compare. For example, 838 92a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner /// is VCMPGTSH. 93a17b1557ad705c56c41624e6841e19093ed31f21Chris Lattner VCMP, 946d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner 956d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner /// RESVEC, OUTFLAG = VCMPo(LHS, RHS, OPC) - Represents one of the 966d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner /// altivec VCMP*o instructions. For lack of better number, we use the 976d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner /// opcode number encoding for the OPC field to identify the compare. For 986d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner /// example, 838 is VCMPGTSH. 996d92caddc4aa5fc946b294259e00cc35536e61e8Chris Lattner VCMPo 100281b55ebeccd3f0d723888c1bb9ec6e476f708f1Chris Lattner }; 1013c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner } 1023c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner 1033c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner /// Define some predicates that are used for node matching. 1043c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner namespace PPC { 105ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner /// isVPKUHUMShuffleMask - Return true if this is the shuffle mask for a 106ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner /// VPKUHUM instruction. 107ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner bool isVPKUHUMShuffleMask(SDNode *N); 108ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner 109ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner /// isVPKUWUMShuffleMask - Return true if this is the shuffle mask for a 110ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner /// VPKUWUM instruction. 111ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner bool isVPKUWUMShuffleMask(SDNode *N); 112ddb739e5ea6ccf6fa4f4e2a23e3da550868efaa1Chris Lattner 113d0608e191ff9c00af68985f246410c219d1bec57Chris Lattner /// isVSLDOIShuffleMask - If this is a vsldoi shuffle mask, return the shift 114d0608e191ff9c00af68985f246410c219d1bec57Chris Lattner /// amount, otherwise return -1. 115d0608e191ff9c00af68985f246410c219d1bec57Chris Lattner int isVSLDOIShuffleMask(SDNode *N); 116d0608e191ff9c00af68985f246410c219d1bec57Chris Lattner 117d0608e191ff9c00af68985f246410c219d1bec57Chris Lattner /// isVSLDOIRotateShuffleMask - If this is a vsldoi rotate shuffle mask, 118d0608e191ff9c00af68985f246410c219d1bec57Chris Lattner /// return the shift amount, otherwise return -1. This matches vsldoi(x,x). 119d0608e191ff9c00af68985f246410c219d1bec57Chris Lattner int isVSLDOIRotateShuffleMask(SDNode *N); 120d0608e191ff9c00af68985f246410c219d1bec57Chris Lattner 1213c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner /// isSplatShuffleMask - Return true if the specified VECTOR_SHUFFLE operand 1223c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner /// specifies a splat of a single element that is suitable for input to 1233c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner /// VSPLTB/VSPLTH/VSPLTW. 1247ff7e674580adad7a5bccdbd74cf9c9f05e46d0fChris Lattner bool isSplatShuffleMask(SDNode *N, unsigned EltSize); 1253c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner 1263c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner /// getVSPLTImmediate - Return the appropriate VSPLT* immediate to splat the 1273c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner /// specified isSplatShuffleMask VECTOR_SHUFFLE mask. 1287ff7e674580adad7a5bccdbd74cf9c9f05e46d0fChris Lattner unsigned getVSPLTImmediate(SDNode *N, unsigned EltSize); 12964b3a08bc696b2ef8733d72ce81e49be175cbbffChris Lattner 1309c61dcf1aaf275a1733b6785c54d34eda5426ae1Chris Lattner /// isVecSplatImm - Return true if this is a build_vector of constants which 1319c61dcf1aaf275a1733b6785c54d34eda5426ae1Chris Lattner /// can be formed by using a vspltis[bhw] instruction. The ByteSize field 1329c61dcf1aaf275a1733b6785c54d34eda5426ae1Chris Lattner /// indicates the number of bytes of each element [124] -> [bhw]. 1339c61dcf1aaf275a1733b6785c54d34eda5426ae1Chris Lattner bool isVecSplatImm(SDNode *N, unsigned ByteSize, char *Val = 0); 1343c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner } 1350bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner 13621e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman class PPCTargetLowering : public TargetLowering { 1377c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner int VarArgsFrameIndex; // FrameIndex for start of varargs area. 1387c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner int ReturnAddrIndex; // FrameIndex for return slot. 1397c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner public: 14021e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman PPCTargetLowering(TargetMachine &TM); 1417c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner 142da6d20f0c15205923cb2c3ef4bf9b5d77de88881Chris Lattner /// getTargetNodeName() - This method returns the name of a target specific 143da6d20f0c15205923cb2c3ef4bf9b5d77de88881Chris Lattner /// DAG node. 144da6d20f0c15205923cb2c3ef4bf9b5d77de88881Chris Lattner virtual const char *getTargetNodeName(unsigned Opcode) const; 145da6d20f0c15205923cb2c3ef4bf9b5d77de88881Chris Lattner 146e4bc9ea0a560d8a0ba42f5a2da617e1f1f834710Chris Lattner /// LowerOperation - Provide custom lowering hooks for some operations. 147e4bc9ea0a560d8a0ba42f5a2da617e1f1f834710Chris Lattner /// 148e4bc9ea0a560d8a0ba42f5a2da617e1f1f834710Chris Lattner virtual SDOperand LowerOperation(SDOperand Op, SelectionDAG &DAG); 149e4bc9ea0a560d8a0ba42f5a2da617e1f1f834710Chris Lattner 1508c13d0a5734a2f9d2b1c3870732cafffb20e3a55Chris Lattner virtual SDOperand PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const; 1518c13d0a5734a2f9d2b1c3870732cafffb20e3a55Chris Lattner 152bbe77de450ef36b4f83cc3b57705a9758adbd925Chris Lattner virtual void computeMaskedBitsForTargetNode(const SDOperand Op, 153bbe77de450ef36b4f83cc3b57705a9758adbd925Chris Lattner uint64_t Mask, 154bbe77de450ef36b4f83cc3b57705a9758adbd925Chris Lattner uint64_t &KnownZero, 155bbe77de450ef36b4f83cc3b57705a9758adbd925Chris Lattner uint64_t &KnownOne, 156bbe77de450ef36b4f83cc3b57705a9758adbd925Chris Lattner unsigned Depth = 0) const; 1577c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner /// LowerArguments - This hook must be implemented to indicate how we should 1587c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner /// lower the arguments for the specified function, into the specified DAG. 1597c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner virtual std::vector<SDOperand> 1607c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner LowerArguments(Function &F, SelectionDAG &DAG); 1617c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner 1627c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner /// LowerCallTo - This hook lowers an abstract call to a function into an 1637c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner /// actual call. 1647c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner virtual std::pair<SDOperand, SDOperand> 1657c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner LowerCallTo(SDOperand Chain, const Type *RetTy, bool isVarArg, 1667c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner unsigned CC, 1677c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner bool isTailCall, SDOperand Callee, ArgListTy &Args, 1687c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner SelectionDAG &DAG); 1694a95945fa5aa431110f50092f4a45d24772a553bNate Begeman 1708a2d3ca7dff8f37ee0f1fc0042f47c194045183dChris Lattner virtual MachineBasicBlock *InsertAtEndOfBasicBlock(MachineInstr *MI, 1718a2d3ca7dff8f37ee0f1fc0042f47c194045183dChris Lattner MachineBasicBlock *MBB); 172ddc787dfdc75fb2d78eb3e5793ca0f417ad74fd3Chris Lattner 173ad3bc8d8add8204195aeb5106036eb7992541bdbChris Lattner ConstraintType getConstraintType(char ConstraintLetter) const; 174ddc787dfdc75fb2d78eb3e5793ca0f417ad74fd3Chris Lattner std::vector<unsigned> 1751efa40f6a4b561cf8f80fe018684236010645cd0Chris Lattner getRegClassForInlineAsmConstraint(const std::string &Constraint, 1761efa40f6a4b561cf8f80fe018684236010645cd0Chris Lattner MVT::ValueType VT) const; 177763317de1bda41581b12915b31ba06c2e16450feChris Lattner bool isOperandValidForConstraint(SDOperand Op, char ConstraintLetter); 178c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng 179c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng /// isLegalAddressImmediate - Return true if the integer value can be used 180c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng /// as the offset of the target addressing mode. 181c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng virtual bool isLegalAddressImmediate(int64_t V) const; 1827c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner }; 1837c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner} 1847c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner 1857c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner#endif // LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H 186