PPCISelLowering.h revision 3c0f9cc90cdcb70caf0dc517b9f9206d731aeb70
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 51b2177b9405e43a66bd5e76dfeed1b40aaedd9271Chris Lattner /// LVE_X - The PPC LVE*X instructions. The size of the element loaded is 52b2177b9405e43a66bd5e76dfeed1b40aaedd9271Chris Lattner /// the size of the element type of the vector result. The element loaded 53b2177b9405e43a66bd5e76dfeed1b40aaedd9271Chris Lattner /// depends on the alignment of the input pointer. 54b2177b9405e43a66bd5e76dfeed1b40aaedd9271Chris Lattner /// 55b2177b9405e43a66bd5e76dfeed1b40aaedd9271Chris Lattner /// The first operand is a token chain, the second is the address to load 56b2177b9405e43a66bd5e76dfeed1b40aaedd9271Chris Lattner /// the third is the SRCVALUE node. 57b2177b9405e43a66bd5e76dfeed1b40aaedd9271Chris Lattner LVE_X, 58b2177b9405e43a66bd5e76dfeed1b40aaedd9271Chris Lattner 59f1d0b2bedaa065972a5ba17259055c1176cd1497Chris Lattner /// VPERM - The PPC VPERM Instruction. 60f1d0b2bedaa065972a5ba17259055c1176cd1497Chris Lattner /// 61f1d0b2bedaa065972a5ba17259055c1176cd1497Chris Lattner VPERM, 62f1d0b2bedaa065972a5ba17259055c1176cd1497Chris Lattner 63860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner /// Hi/Lo - These represent the high and low 16-bit parts of a global 64860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner /// address respectively. These nodes have two operands, the first of 65860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner /// which must be a TargetGlobalAddress, and the second of which must be a 66860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner /// Constant. Selected naively, these turn into 'lis G+C' and 'li G+C', 67860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner /// though these are usually folded into other nodes. 68860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner Hi, Lo, 69860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner 70860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner /// GlobalBaseReg - On Darwin, this node represents the result of the mflr 71860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner /// at function entry, used for PIC code. 72860e8862c1fbd3b261da4a64a8c0096f9f373681Chris Lattner GlobalBaseReg, 734172b10ca1adfc1026428e5f522aaab98bd939adChris Lattner 744172b10ca1adfc1026428e5f522aaab98bd939adChris Lattner /// These nodes represent the 32-bit PPC shifts that operate on 6-bit 754172b10ca1adfc1026428e5f522aaab98bd939adChris Lattner /// shift amounts. These nodes are generated by the multi-precision shift 764172b10ca1adfc1026428e5f522aaab98bd939adChris Lattner /// code. 774172b10ca1adfc1026428e5f522aaab98bd939adChris Lattner SRL, SRA, SHL, 789e4dd9dfc97f3930f58ca6e47bebbd8eb5cdd8a1Nate Begeman 79281b55ebeccd3f0d723888c1bb9ec6e476f708f1Chris Lattner /// CALL - A function call. 80281b55ebeccd3f0d723888c1bb9ec6e476f708f1Chris Lattner CALL, 81281b55ebeccd3f0d723888c1bb9ec6e476f708f1Chris Lattner 829e4dd9dfc97f3930f58ca6e47bebbd8eb5cdd8a1Nate Begeman /// Return with a flag operand, matched by 'blr' 839e4dd9dfc97f3930f58ca6e47bebbd8eb5cdd8a1Nate Begeman RET_FLAG, 84281b55ebeccd3f0d723888c1bb9ec6e476f708f1Chris Lattner }; 853c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner } 863c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner 873c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner /// Define some predicates that are used for node matching. 883c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner namespace PPC { 893c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner /// isSplatShuffleMask - Return true if the specified VECTOR_SHUFFLE operand 903c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner /// specifies a splat of a single element that is suitable for input to 913c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner /// VSPLTB/VSPLTH/VSPLTW. 923c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner bool isSplatShuffleMask(SDNode *N) { return false; } // FIXME: 933c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner 943c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner /// getVSPLTImmediate - Return the appropriate VSPLT* immediate to splat the 953c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner /// specified isSplatShuffleMask VECTOR_SHUFFLE mask. 963c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner unsigned getVSPLTImmediate(SDNode *N) { return 0; } // FIXME: 973c0f9cc90cdcb70caf0dc517b9f9206d731aeb70Chris Lattner } 980bbea954331b8f08afa5b094dfb0841829c70eaaChris Lattner 9921e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman class PPCTargetLowering : public TargetLowering { 1007c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner int VarArgsFrameIndex; // FrameIndex for start of varargs area. 1017c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner int ReturnAddrIndex; // FrameIndex for return slot. 1027c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner public: 10321e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman PPCTargetLowering(TargetMachine &TM); 1047c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner 105da6d20f0c15205923cb2c3ef4bf9b5d77de88881Chris Lattner /// getTargetNodeName() - This method returns the name of a target specific 106da6d20f0c15205923cb2c3ef4bf9b5d77de88881Chris Lattner /// DAG node. 107da6d20f0c15205923cb2c3ef4bf9b5d77de88881Chris Lattner virtual const char *getTargetNodeName(unsigned Opcode) const; 108da6d20f0c15205923cb2c3ef4bf9b5d77de88881Chris Lattner 109e4bc9ea0a560d8a0ba42f5a2da617e1f1f834710Chris Lattner /// LowerOperation - Provide custom lowering hooks for some operations. 110e4bc9ea0a560d8a0ba42f5a2da617e1f1f834710Chris Lattner /// 111e4bc9ea0a560d8a0ba42f5a2da617e1f1f834710Chris Lattner virtual SDOperand LowerOperation(SDOperand Op, SelectionDAG &DAG); 112e4bc9ea0a560d8a0ba42f5a2da617e1f1f834710Chris Lattner 1138c13d0a5734a2f9d2b1c3870732cafffb20e3a55Chris Lattner virtual SDOperand PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const; 1148c13d0a5734a2f9d2b1c3870732cafffb20e3a55Chris Lattner 1157c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner /// LowerArguments - This hook must be implemented to indicate how we should 1167c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner /// lower the arguments for the specified function, into the specified DAG. 1177c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner virtual std::vector<SDOperand> 1187c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner LowerArguments(Function &F, SelectionDAG &DAG); 1197c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner 1207c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner /// LowerCallTo - This hook lowers an abstract call to a function into an 1217c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner /// actual call. 1227c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner virtual std::pair<SDOperand, SDOperand> 1237c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner LowerCallTo(SDOperand Chain, const Type *RetTy, bool isVarArg, 1247c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner unsigned CC, 1257c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner bool isTailCall, SDOperand Callee, ArgListTy &Args, 1267c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner SelectionDAG &DAG); 1274a95945fa5aa431110f50092f4a45d24772a553bNate Begeman 1288a2d3ca7dff8f37ee0f1fc0042f47c194045183dChris Lattner virtual MachineBasicBlock *InsertAtEndOfBasicBlock(MachineInstr *MI, 1298a2d3ca7dff8f37ee0f1fc0042f47c194045183dChris Lattner MachineBasicBlock *MBB); 130ddc787dfdc75fb2d78eb3e5793ca0f417ad74fd3Chris Lattner 131ad3bc8d8add8204195aeb5106036eb7992541bdbChris Lattner ConstraintType getConstraintType(char ConstraintLetter) const; 132ddc787dfdc75fb2d78eb3e5793ca0f417ad74fd3Chris Lattner std::vector<unsigned> 1331efa40f6a4b561cf8f80fe018684236010645cd0Chris Lattner getRegClassForInlineAsmConstraint(const std::string &Constraint, 1341efa40f6a4b561cf8f80fe018684236010645cd0Chris Lattner MVT::ValueType VT) const; 135763317de1bda41581b12915b31ba06c2e16450feChris Lattner bool isOperandValidForConstraint(SDOperand Op, char ConstraintLetter); 136c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng 137c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng /// isLegalAddressImmediate - Return true if the integer value can be used 138c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng /// as the offset of the target addressing mode. 139c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng virtual bool isLegalAddressImmediate(int64_t V) const; 1407c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner }; 1417c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner} 1427c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner 1437c5a3d390a463fb50a6eee7ae3174817925e6d28Chris Lattner#endif // LLVM_TARGET_POWERPC_PPC32ISELLOWERING_H 144