SparcISelLowering.h revision a786c7b90cfacf1c36c975ad35c3b793c232e3d8
150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org//===-- SparcISelLowering.h - Sparc DAG Lowering Interface ------*- C++ -*-===//
250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org//
350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org//                     The LLVM Compiler Infrastructure
450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org//
550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org// This file is distributed under the University of Illinois Open Source
650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org// License. See LICENSE.TXT for details.
750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org//
850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org//===----------------------------------------------------------------------===//
950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org//
1050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org// This file defines the interfaces that Sparc uses to lower LLVM code into a
1150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org// selection DAG.
1250e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org//
1350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org//===----------------------------------------------------------------------===//
1450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
1550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org#ifndef SPARC_ISELLOWERING_H
1650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org#define SPARC_ISELLOWERING_H
1750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
18c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com#include "llvm/Target/TargetLowering.h"
19c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com#include "Sparc.h"
20c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com
21c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.comnamespace llvm {
22c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com  namespace SPISD {
23bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com    enum {
24bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com      FIRST_NUMBER = ISD::BUILTIN_OP_END,
25bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com      CMPICC,      // Compare two GPR operands, set icc.
26bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com      CMPFCC,      // Compare two FP operands, set fcc.
27bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com      BRICC,       // Branch to dest on icc condition
28bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com      BRFCC,       // Branch to dest on fcc condition
29bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com      SELECT_ICC,  // Select between two values using the current ICC flags.
30bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com      SELECT_FCC,  // Select between two values using the current FCC flags.
31bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com
32bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com      Hi, Lo,      // Hi/Lo operations, typically on a global address.
33bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com
3450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org      FTOI,        // FP to Int within a FP register.
35dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com      ITOF,        // Int to FP within a FP register.
3650e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
3750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org      CALL,        // A call instruction.
385970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org      RET_FLAG     // Return with a flag operand.
399c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com    };
409c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com  }
4150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
42a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org  class SparcTargetLowering : public TargetLowering {
4350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    int VarArgsFrameOffset;   // Frame offset to start of varargs area.
449c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com  public:
459c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com    SparcTargetLowering(TargetMachine &TM);
469c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org    virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG);
475970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    SDValue LowerFORMAL_ARGUMENTS(SDValue Op, SelectionDAG &DAG);
4850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
4950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    int getVarArgsFrameOffset() const { return VarArgsFrameOffset; }
5050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
5150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    /// computeMaskedBitsForTargetNode - Determine which of the bits specified
525970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org    /// in Mask are known to be either zero or one and return them in the
5350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    /// KnownZero/KnownOne bitsets.
5450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    virtual void computeMaskedBitsForTargetNode(const SDValue Op,
5550e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                                                const APInt &Mask,
56c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                                                APInt &KnownZero,
57c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com                                                APInt &KnownOne,
589c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com                                                const SelectionDAG &DAG,
5964494e99af8f834a0343a4d1ee0aa4c2860e13a3mike@reedtribe.org                                                unsigned Depth = 0) const;
60bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com
611aa90cf11e136a722bce71dd77f4bb03cc2b56f8skia.committer@gmail.com    virtual MachineBasicBlock *EmitInstrWithCustomInserter(MachineInstr *MI,
629c0bef18e30c37dc01d325fe6c930cd7861207f5reed@google.com                                                   MachineBasicBlock *MBB) const;
6350e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org
6450e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    virtual const char *getTargetNodeName(unsigned Opcode) const;
65ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com
66c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com    ConstraintType getConstraintType(const std::string &Constraint) const;
6750e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    std::pair<unsigned, const TargetRegisterClass*>
6850e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    getRegForInlineAsmConstraint(const std::string &Constraint, MVT VT) const;
6950e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    std::vector<unsigned>
7050e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org    getRegClassForInlineAsmConstraint(const std::string &Constraint,
7150e4c72445e012f070cd42124f636cf8cb837307mike@reedtribe.org                                      MVT VT) const;
7245ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com
73c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com    virtual bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const;
74c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com
7545ba2f773364771dc4a4831246bcb1e0f0992bedskia.committer@gmail.com    /// getFunctionAlignment - Return the Log2 alignment of this function.
76c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com    virtual unsigned getFunctionAlignment(const Function *F) const;
77c83e352c18858b7fd5fad62b395e83d09a4feaa6reed@google.com  };
787ed98df9ba14bdb58e381508eb0505c963a4b6dbskia.committer@gmail.com} // end namespace llvm
79bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com
80bbe66f0824dc47823826f6265879d7a57843fed3reed@google.com#endif    // SPARC_ISELLOWERING_H
817ed98df9ba14bdb58e381508eb0505c963a4b6dbskia.committer@gmail.com