SparcISelLowering.h revision d23405e6f04135cabcad4d9bd7aa6e4f187bed3a
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 {
24d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner      FIRST_NUMBER = ISD::BUILTIN_OP_END+SP::INSTRUCTION_LIST_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.
31d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner
32d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner      Hi, Lo,      // Hi/Lo operations, typically on a global address.
33d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner
34d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner      FTOI,        // FP to Int within a FP register.
35d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner      ITOF,        // Int to FP within a FP register.
36d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner
37d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner      CALL,        // A call instruction.
38d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner      RET_FLAG     // Return with a flag operand.
39d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner    };
40d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner  }
41d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner
42d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner  class SparcTargetLowering : public TargetLowering {
43d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner    int VarArgsFrameOffset;   // Frame offset to start of varargs area.
44d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner  public:
45d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner    SparcTargetLowering(TargetMachine &TM);
46d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner    virtual SDOperand LowerOperation(SDOperand Op, SelectionDAG &DAG);
47d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner
48d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner    int getVarArgsFrameOffset() const { return VarArgsFrameOffset; }
49d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner
50d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner    /// computeMaskedBitsForTargetNode - Determine which of the bits specified
51d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner    /// in Mask are known to be either zero or one and return them in the
52d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner    /// KnownZero/KnownOne bitsets.
53d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner    virtual void computeMaskedBitsForTargetNode(const SDOperand Op,
54d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner                                                const APInt &Mask,
55d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner                                                APInt &KnownZero,
56d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner                                                APInt &KnownOne,
57d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner                                                const SelectionDAG &DAG,
58d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner                                                unsigned Depth = 0) const;
59d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner
60d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner    virtual std::vector<SDOperand>
61d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner      LowerArguments(Function &F, SelectionDAG &DAG);
62d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner    virtual std::pair<SDOperand, SDOperand>
63d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner      LowerCallTo(SDOperand Chain, const Type *RetTy,
64d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner                  bool RetSExt, bool RetZExt, bool isVarArg,
65d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner                  unsigned CC, bool isTailCall, SDOperand Callee,
66d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner                  ArgListTy &Args, SelectionDAG &DAG);
67d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner    virtual MachineBasicBlock *EmitInstrWithCustomInserter(MachineInstr *MI,
68d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner                                                        MachineBasicBlock *MBB);
69d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner
70d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner    virtual const char *getTargetNodeName(unsigned Opcode) const;
71d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner  };
72d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner} // end namespace llvm
73d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner
74d23405e6f04135cabcad4d9bd7aa6e4f187bed3aChris Lattner#endif    // SPARC_ISELLOWERING_H
75