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