1d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner//===-- SparcISelLowering.h - Sparc DAG Lowering Interface ------*- C++ -*-===//
2d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner//
3d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner//                     The LLVM Compiler Infrastructure
4d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner//
5d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner// This file is distributed under the University of Illinois Open Source
6d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner// License. See LICENSE.TXT for details.
7d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner//
8d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner//===----------------------------------------------------------------------===//
9d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner//
10d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner// This file defines the interfaces that Sparc uses to lower LLVM code into a
11d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner// selection DAG.
12d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner//
13d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner//===----------------------------------------------------------------------===//
14d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner
15d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner#ifndef SPARC_ISELLOWERING_H
16d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner#define SPARC_ISELLOWERING_H
17d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner
18d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner#include "Sparc.h"
1979aa3417eb6f58d668aadfedf075240a41d35a26Craig Topper#include "llvm/Target/TargetLowering.h"
20d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner
21d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattnernamespace llvm {
22d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner  namespace SPISD {
23d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner    enum {
240ba2bcfcc3149a25d08aa8aa00fb6c34a4e25bddDan Gohman      FIRST_NUMBER = ISD::BUILTIN_OP_END,
25d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner      CMPICC,      // Compare two GPR operands, set icc.
26d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner      CMPFCC,      // Compare two FP operands, set fcc.
27d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner      BRICC,       // Branch to dest on icc condition
28d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner      BRFCC,       // Branch to dest on fcc condition
29d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner      SELECT_ICC,  // Select between two values using the current ICC flags.
30d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner      SELECT_FCC,  // Select between two values using the current FCC flags.
310eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov
32d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner      Hi, Lo,      // Hi/Lo operations, typically on a global address.
330eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov
34d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner      FTOI,        // FP to Int within a FP register.
35d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner      ITOF,        // Int to FP within a FP register.
360eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov
37d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner      CALL,        // A call instruction.
38db486a6d5311944f61b92db9f6074944dbbdb242Chris Lattner      RET_FLAG,    // Return with a flag operand.
39860b64cb1efba110bf81bcc243a6fbaae4c655a4Venkatraman Govindaraju      GLOBAL_BASE_REG, // Global base reg for PIC
40fc3faa75cbadd8a1020941ec85adfda1d2f49688Venkatraman Govindaraju      FLUSHW       // FLUSH register windows to stack
41d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner    };
42d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner  }
430eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov
44d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner  class SparcTargetLowering : public TargetLowering {
45d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner  public:
46d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner    SparcTargetLowering(TargetMachine &TM);
47d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
480eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov
490eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov    /// computeMaskedBitsForTargetNode - Determine which of the bits specified
500eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov    /// in Mask are known to be either zero or one and return them in the
51d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner    /// KnownZero/KnownOne bitsets.
52475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    virtual void computeMaskedBitsForTargetNode(const SDValue Op,
530eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov                                                APInt &KnownZero,
54d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner                                                APInt &KnownOne,
55d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner                                                const SelectionDAG &DAG,
56d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner                                                unsigned Depth = 0) const;
570eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov
58af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman    virtual MachineBasicBlock *
59af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman      EmitInstrWithCustomInserter(MachineInstr *MI,
60af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman                                  MachineBasicBlock *MBB) const;
610eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov
62d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner    virtual const char *getTargetNodeName(unsigned Opcode) const;
630eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov
640eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov    ConstraintType getConstraintType(const std::string &Constraint) const;
650eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov    std::pair<unsigned, const TargetRegisterClass*>
66e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    getRegForInlineAsmConstraint(const std::string &Constraint, EVT VT) const;
676520e20e4fb31f2e65e25c38b372b19d33a83df4Dan Gohman
686520e20e4fb31f2e65e25c38b372b19d33a83df4Dan Gohman    virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
6920c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling
7098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    virtual SDValue
7198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman      LowerFormalArguments(SDValue Chain,
7265c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                           CallingConv::ID CallConv,
7398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           bool isVarArg,
7498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           const SmallVectorImpl<ISD::InputArg> &Ins,
7598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           DebugLoc dl, SelectionDAG &DAG,
76d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                           SmallVectorImpl<SDValue> &InVals) const;
7798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
7898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    virtual SDValue
794bfcd4acbc7d12aa55f8de9af84a38422f0f6d83Evan Cheng      LowerCall(SDValue Chain, SDValue Callee, CallingConv::ID CallConv,
804bfcd4acbc7d12aa55f8de9af84a38422f0f6d83Evan Cheng                bool isVarArg, bool doesNotRet, bool &isTailCall,
8198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                const SmallVectorImpl<ISD::OutputArg> &Outs,
82c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman                const SmallVectorImpl<SDValue> &OutVals,
8398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                const SmallVectorImpl<ISD::InputArg> &Ins,
8498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                DebugLoc dl, SelectionDAG &DAG,
85d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                SmallVectorImpl<SDValue> &InVals) const;
8698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
8798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    virtual SDValue
8898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman      LowerReturn(SDValue Chain,
8965c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                  CallingConv::ID CallConv, bool isVarArg,
9098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                  const SmallVectorImpl<ISD::OutputArg> &Outs,
91c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman                  const SmallVectorImpl<SDValue> &OutVals,
92d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                  DebugLoc dl, SelectionDAG &DAG) const;
93db486a6d5311944f61b92db9f6074944dbbdb242Chris Lattner
94d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
95d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
9658269b973256bf2436cac0f047aa277fe4bc01ddVenkatraman Govindaraju
9758269b973256bf2436cac0f047aa277fe4bc01ddVenkatraman Govindaraju    unsigned getSRetArgSize(SelectionDAG &DAG, SDValue Callee) const;
98d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner  };
99d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner} // end namespace llvm
100d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner
101d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner#endif    // SPARC_ISELLOWERING_H
102