SparcISelLowering.h revision db486a6d5311944f61b92db9f6074944dbbdb242
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 "llvm/Target/TargetLowering.h" 19d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner#include "Sparc.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. 39db486a6d5311944f61b92db9f6074944dbbdb242Chris Lattner GLOBAL_BASE_REG // Global base reg for PIC 40d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner }; 41d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner } 420eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov 43d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner class SparcTargetLowering : public TargetLowering { 44d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner int VarArgsFrameOffset; // Frame offset to start of varargs area. 45d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner public: 46d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner SparcTargetLowering(TargetMachine &TM); 47475871a144eb604ddaf37503397ba0941442e5fbDan Gohman virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG); 480eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov 49d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner int getVarArgsFrameOffset() const { return VarArgsFrameOffset; } 500eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov 510eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov /// computeMaskedBitsForTargetNode - Determine which of the bits specified 520eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov /// in Mask are known to be either zero or one and return them in the 53d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner /// KnownZero/KnownOne bitsets. 54475871a144eb604ddaf37503397ba0941442e5fbDan Gohman virtual void computeMaskedBitsForTargetNode(const SDValue Op, 55d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner const APInt &Mask, 560eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov APInt &KnownZero, 57d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner APInt &KnownOne, 58d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner const SelectionDAG &DAG, 59d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner unsigned Depth = 0) const; 600eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov 61d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner virtual MachineBasicBlock *EmitInstrWithCustomInserter(MachineInstr *MI, 621fdbc1dd4e9cb42c79a30e8dc308c322e923cc52Dan Gohman MachineBasicBlock *MBB) const; 630eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov 64d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner virtual const char *getTargetNodeName(unsigned Opcode) const; 650eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov 660eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov ConstraintType getConstraintType(const std::string &Constraint) const; 670eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov std::pair<unsigned, const TargetRegisterClass*> 68e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson getRegForInlineAsmConstraint(const std::string &Constraint, EVT VT) const; 690eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov std::vector<unsigned> 700eefda1335f5e86f95dbb58352321a43237e1089Anton Korobeynikov getRegClassForInlineAsmConstraint(const std::string &Constraint, 71e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson EVT VT) const; 726520e20e4fb31f2e65e25c38b372b19d33a83df4Dan Gohman 736520e20e4fb31f2e65e25c38b372b19d33a83df4Dan Gohman virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const; 7420c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling 75b4202b84d7e54efe5e144885c7da63e6cc465f80Bill Wendling /// getFunctionAlignment - Return the Log2 alignment of this function. 7620c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling virtual unsigned getFunctionAlignment(const Function *F) const; 7798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 7898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman virtual SDValue 7998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman LowerFormalArguments(SDValue Chain, 8065c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, 8198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman bool isVarArg, 8298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 8398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 8498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SmallVectorImpl<SDValue> &InVals); 8598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 8698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman virtual SDValue 8798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman LowerCall(SDValue Chain, SDValue Callee, 8865c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, 8998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman bool isTailCall, 9098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::OutputArg> &Outs, 9198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::InputArg> &Ins, 9298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG, 9398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman SmallVectorImpl<SDValue> &InVals); 9498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman 9598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman virtual SDValue 9698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman LowerReturn(SDValue Chain, 9765c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID CallConv, bool isVarArg, 9898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman const SmallVectorImpl<ISD::OutputArg> &Outs, 9998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman DebugLoc dl, SelectionDAG &DAG); 100db486a6d5311944f61b92db9f6074944dbbdb242Chris Lattner 101db486a6d5311944f61b92db9f6074944dbbdb242Chris Lattner SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG); 102db486a6d5311944f61b92db9f6074944dbbdb242Chris Lattner SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG); 103d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner }; 104d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner} // end namespace llvm 105d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner 106d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner#endif // SPARC_ISELLOWERING_H 107