SparcISelLowering.h revision 20bd5296cec8d8d597ab9db2aca7346a88e580c8
19ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz//===-- SparcISelLowering.h - Sparc DAG Lowering Interface ------*- C++ -*-===//
29ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz//
39ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz//                     The LLVM Compiler Infrastructure
49ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz//
5258aab42887fa7a6d29fe862eb883c62deafde0cGreg Choi & Mike Grafton// This file is distributed under the University of Illinois Open Source
622ae9206e660fd187ff79a529452dbe2bab504fdRich Humphrey// License. See LICENSE.TXT for details.
7f99fa781cfd614512c48db52387c825d4f167f31Michael Portuesi//
89ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz//===----------------------------------------------------------------------===//
9fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey//
1022ae9206e660fd187ff79a529452dbe2bab504fdRich Humphrey// This file defines the interfaces that Sparc uses to lower LLVM code into a
1122c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwin// selection DAG.
1222c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwin//
139ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz//===----------------------------------------------------------------------===//
1440c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
1540c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams#ifndef SPARC_ISELLOWERING_H
169ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz#define SPARC_ISELLOWERING_H
179ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz
189ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz#include "llvm/Target/TargetLowering.h"
199ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz#include "Sparc.h"
206cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz
2140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williamsnamespace llvm {
22f99fa781cfd614512c48db52387c825d4f167f31Michael Portuesi  namespace SPISD {
23fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey    enum {
2437c667d06608e4bebd0f45ffbf1555ce5bd30493Zoodles      FIRST_NUMBER = ISD::BUILTIN_OP_END,
258455cc9031f98a53ad469ebe4b9d92511af8b54fRich Humphrey      CMPICC,      // Compare two GPR operands, set icc.
268455cc9031f98a53ad469ebe4b9d92511af8b54fRich Humphrey      CMPFCC,      // Compare two FP operands, set fcc.
279677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey      BRICC,       // Branch to dest on icc condition
289677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey      BRFCC,       // Branch to dest on fcc condition
299677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey      SELECT_ICC,  // Select between two values using the current ICC flags.
309677b3a80b929a57a7ee1d4301d5e9ffb51f3182Rich Humphrey      SELECT_FCC,  // Select between two values using the current FCC flags.
31258aab42887fa7a6d29fe862eb883c62deafde0cGreg Choi & Mike Grafton
323892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz      Hi, Lo,      // Hi/Lo operations, typically on a global address.
333892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz
344972836088ee1b2369abd4a668552c6b594f0436Mike Mazur & Tyler Schultz      FTOI,        // FP to Int within a FP register.
354972836088ee1b2369abd4a668552c6b594f0436Mike Mazur & Tyler Schultz      ITOF,        // Int to FP within a FP register.
369b01bc1fb0b241eafdbe239f56b95a2690aca727Michael Portuesi
376cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz      CALL,        // A call instruction.
383892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz      RET_FLAG,    // Return with a flag operand.
393892868c17d4ed48ccf77e25c2cef9bf3b1c82dcMike Mazur & Tyler Schultz      GLOBAL_BASE_REG, // Global base reg for PIC
409ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz      FLUSHW       // FLUSH register windows to stack
419ef88bf39bff29cb39dee4d84542c8f5a6178748Tyler Schultz    };
426cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz  }
436cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz
446cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz  class SparcTargetLowering : public TargetLowering {
456cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz  public:
466cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz    SparcTargetLowering(TargetMachine &TM);
4740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams    virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
48e73ede4e90af0ae4f76bdbcd54a170b4bba52b39Tyler Schultz
494972836088ee1b2369abd4a668552c6b594f0436Mike Mazur & Tyler Schultz    /// computeMaskedBitsForTargetNode - Determine which of the bits specified
504972836088ee1b2369abd4a668552c6b594f0436Mike Mazur & Tyler Schultz    /// in Mask are known to be either zero or one and return them in the
514972836088ee1b2369abd4a668552c6b594f0436Mike Mazur & Tyler Schultz    /// KnownZero/KnownOne bitsets.
524972836088ee1b2369abd4a668552c6b594f0436Mike Mazur & Tyler Schultz    virtual void computeMaskedBitsForTargetNode(const SDValue Op,
534972836088ee1b2369abd4a668552c6b594f0436Mike Mazur & Tyler Schultz                                                const APInt &Mask,
54e73ede4e90af0ae4f76bdbcd54a170b4bba52b39Tyler Schultz                                                APInt &KnownZero,
554972836088ee1b2369abd4a668552c6b594f0436Mike Mazur & Tyler Schultz                                                APInt &KnownOne,
56e73ede4e90af0ae4f76bdbcd54a170b4bba52b39Tyler Schultz                                                const SelectionDAG &DAG,
57e73ede4e90af0ae4f76bdbcd54a170b4bba52b39Tyler Schultz                                                unsigned Depth = 0) const;
5831811e1435d6c72ee6c324ca49769159e80fcd93Tyler Schultz
5931811e1435d6c72ee6c324ca49769159e80fcd93Tyler Schultz    virtual MachineBasicBlock *
6031811e1435d6c72ee6c324ca49769159e80fcd93Tyler Schultz      EmitInstrWithCustomInserter(MachineInstr *MI,
6131811e1435d6c72ee6c324ca49769159e80fcd93Tyler Schultz                                  MachineBasicBlock *MBB) const;
6231811e1435d6c72ee6c324ca49769159e80fcd93Tyler Schultz
636cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz    virtual const char *getTargetNodeName(unsigned Opcode) const;
646cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz
656cf9d6f657e61d727afc221dd157ae6ca41714baTyler Schultz    ConstraintType getConstraintType(const std::string &Constraint) const;
6640c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams    std::pair<unsigned, const TargetRegisterClass*>
672da690d2d6881bf346550347b71e6ad0d7755597Farand Koo    getRegForInlineAsmConstraint(const std::string &Constraint, EVT VT) const;
682da690d2d6881bf346550347b71e6ad0d7755597Farand Koo
692da690d2d6881bf346550347b71e6ad0d7755597Farand Koo    virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
702da690d2d6881bf346550347b71e6ad0d7755597Farand Koo
7140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams    virtual SDValue
72fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey      LowerFormalArguments(SDValue Chain,
7340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams                           CallingConv::ID CallConv,
74fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey                           bool isVarArg,
75fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey                           const SmallVectorImpl<ISD::InputArg> &Ins,
76fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey                           DebugLoc dl, SelectionDAG &DAG,
77fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey                           SmallVectorImpl<SDValue> &InVals) const;
7840c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
79fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey    virtual SDValue
8040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams      LowerCall(SDValue Chain, SDValue Callee,
81258aab42887fa7a6d29fe862eb883c62deafde0cGreg Choi & Mike Grafton                CallingConv::ID CallConv, bool isVarArg,
82258aab42887fa7a6d29fe862eb883c62deafde0cGreg Choi & Mike Grafton                bool &isTailCall,
83258aab42887fa7a6d29fe862eb883c62deafde0cGreg Choi & Mike Grafton                const SmallVectorImpl<ISD::OutputArg> &Outs,
84258aab42887fa7a6d29fe862eb883c62deafde0cGreg Choi & Mike Grafton                const SmallVectorImpl<SDValue> &OutVals,
85258aab42887fa7a6d29fe862eb883c62deafde0cGreg Choi & Mike Grafton                const SmallVectorImpl<ISD::InputArg> &Ins,
86fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey                DebugLoc dl, SelectionDAG &DAG,
8740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams                SmallVectorImpl<SDValue> &InVals) const;
88fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey
899b01bc1fb0b241eafdbe239f56b95a2690aca727Michael Portuesi    virtual SDValue
909b01bc1fb0b241eafdbe239f56b95a2690aca727Michael Portuesi      LowerReturn(SDValue Chain,
919b01bc1fb0b241eafdbe239f56b95a2690aca727Michael Portuesi                  CallingConv::ID CallConv, bool isVarArg,
929b01bc1fb0b241eafdbe239f56b95a2690aca727Michael Portuesi                  const SmallVectorImpl<ISD::OutputArg> &Outs,
939b01bc1fb0b241eafdbe239f56b95a2690aca727Michael Portuesi                  const SmallVectorImpl<SDValue> &OutVals,
949b01bc1fb0b241eafdbe239f56b95a2690aca727Michael Portuesi                  DebugLoc dl, SelectionDAG &DAG) const;
959b01bc1fb0b241eafdbe239f56b95a2690aca727Michael Portuesi
969b01bc1fb0b241eafdbe239f56b95a2690aca727Michael Portuesi    SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
979b01bc1fb0b241eafdbe239f56b95a2690aca727Michael Portuesi    SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
9840c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
99fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey    unsigned getSRetArgSize(SelectionDAG &DAG, SDValue Callee) const;
100fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey  };
10140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams} // end namespace llvm
102fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey
10340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams#endif    // SPARC_ISELLOWERING_H
104fbdac5127ba5b6b879408a0a6ae4ac30e2456d8cRich Humphrey