131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- MSP430ISelLowering.h - MSP430 DAG Lowering Interface ----*- C++ -*-===//
2f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//
3f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//                     The LLVM Compiler Infrastructure
4f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//
5f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov// This file is distributed under the University of Illinois Open Source
6f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov// License. See LICENSE.TXT for details.
7f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//
8f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//===----------------------------------------------------------------------===//
9f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//
10f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov// This file defines the interfaces that MSP430 uses to lower LLVM code into a
11f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov// selection DAG.
12f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//
13f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//===----------------------------------------------------------------------===//
14f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
15f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov#ifndef LLVM_TARGET_MSP430_ISELLOWERING_H
16f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov#define LLVM_TARGET_MSP430_ISELLOWERING_H
17f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
18f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov#include "MSP430.h"
19f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov#include "llvm/CodeGen/SelectionDAG.h"
20f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov#include "llvm/Target/TargetLowering.h"
21f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
22f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikovnamespace llvm {
23fd1b7c778c0c332a676b1003115d2b4bc6f9a46aAnton Korobeynikov  namespace MSP430ISD {
24fd1b7c778c0c332a676b1003115d2b4bc6f9a46aAnton Korobeynikov    enum {
25fd1b7c778c0c332a676b1003115d2b4bc6f9a46aAnton Korobeynikov      FIRST_NUMBER = ISD::BUILTIN_OP_END,
26fd1b7c778c0c332a676b1003115d2b4bc6f9a46aAnton Korobeynikov
27fd1b7c778c0c332a676b1003115d2b4bc6f9a46aAnton Korobeynikov      /// Return with a flag operand. Operand 0 is the chain operand.
28d2c94ae49e546e68b591e838cdfc2fd016d928d9Anton Korobeynikov      RET_FLAG,
29d2c94ae49e546e68b591e838cdfc2fd016d928d9Anton Korobeynikov
30e662f7a8b22e7d31fb55e6502af94d49b78bc942Anton Korobeynikov      /// Same as RET_FLAG, but used for returning from ISRs.
31e662f7a8b22e7d31fb55e6502af94d49b78bc942Anton Korobeynikov      RETI_FLAG,
32e662f7a8b22e7d31fb55e6502af94d49b78bc942Anton Korobeynikov
33ea54c9846b2973cafa8ffd40626f5676ba9ccfeeAnton Korobeynikov      /// Y = R{R,L}A X, rotate right (left) arithmetically
34ea54c9846b2973cafa8ffd40626f5676ba9ccfeeAnton Korobeynikov      RRA, RLA,
354428885c5acfffbbdd03ad2aab23960531c47753Anton Korobeynikov
36e699d0f549151a2cca993c21407aea4a6eff7d3fAnton Korobeynikov      /// Y = RRC X, rotate right via carry
37e699d0f549151a2cca993c21407aea4a6eff7d3fAnton Korobeynikov      RRC,
38e699d0f549151a2cca993c21407aea4a6eff7d3fAnton Korobeynikov
3998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman      /// CALL - These operations represent an abstract call
404428885c5acfffbbdd03ad2aab23960531c47753Anton Korobeynikov      /// instruction, which includes a bunch of information.
413513ca81c6beda087a281a66f1b0e612879c0aadAnton Korobeynikov      CALL,
423513ca81c6beda087a281a66f1b0e612879c0aadAnton Korobeynikov
433513ca81c6beda087a281a66f1b0e612879c0aadAnton Korobeynikov      /// Wrapper - A wrapper node for TargetConstantPool, TargetExternalSymbol,
443513ca81c6beda087a281a66f1b0e612879c0aadAnton Korobeynikov      /// and TargetGlobalAddress.
45ed1a51af376b9027db60ff060e0a2572493df07bAnton Korobeynikov      Wrapper,
46ed1a51af376b9027db60ff060e0a2572493df07bAnton Korobeynikov
47ed1a51af376b9027db60ff060e0a2572493df07bAnton Korobeynikov      /// CMP - Compare instruction.
48ed1a51af376b9027db60ff060e0a2572493df07bAnton Korobeynikov      CMP,
49ed1a51af376b9027db60ff060e0a2572493df07bAnton Korobeynikov
502625de35eda2aec28bdec3370a81f533f9721736Anton Korobeynikov      /// SetCC - Operand 0 is condition code, and operand 1 is the flag
51ed1a51af376b9027db60ff060e0a2572493df07bAnton Korobeynikov      /// operand produced by a CMP instruction.
52ed1a51af376b9027db60ff060e0a2572493df07bAnton Korobeynikov      SETCC,
53ed1a51af376b9027db60ff060e0a2572493df07bAnton Korobeynikov
54ed1a51af376b9027db60ff060e0a2572493df07bAnton Korobeynikov      /// MSP430 conditional branches. Operand 0 is the chain operand, operand 1
55ed1a51af376b9027db60ff060e0a2572493df07bAnton Korobeynikov      /// is the block to branch if condition is true, operand 2 is the
56ed1a51af376b9027db60ff060e0a2572493df07bAnton Korobeynikov      /// condition code, and operand 3 is the flag operand produced by a CMP
57ed1a51af376b9027db60ff060e0a2572493df07bAnton Korobeynikov      /// instruction.
581bb8cd723d9fc89701fd3e54951c6bb419f798d3Anton Korobeynikov      BR_CC,
598b528e52ee6018b0d0e7e46b3b4cf6f41fdaa0d9Anton Korobeynikov
602625de35eda2aec28bdec3370a81f533f9721736Anton Korobeynikov      /// SELECT_CC - Operand 0 and operand 1 are selection variable, operand 3
611bb8cd723d9fc89701fd3e54951c6bb419f798d3Anton Korobeynikov      /// is condition code and operand 4 is flag operand.
622625de35eda2aec28bdec3370a81f533f9721736Anton Korobeynikov      SELECT_CC,
632625de35eda2aec28bdec3370a81f533f9721736Anton Korobeynikov
642625de35eda2aec28bdec3370a81f533f9721736Anton Korobeynikov      /// SHL, SRA, SRL - Non-constant shifts.
652625de35eda2aec28bdec3370a81f533f9721736Anton Korobeynikov      SHL, SRA, SRL
66fd1b7c778c0c332a676b1003115d2b4bc6f9a46aAnton Korobeynikov    };
67fd1b7c778c0c332a676b1003115d2b4bc6f9a46aAnton Korobeynikov  }
68f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
69f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov  class MSP430Subtarget;
70f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov  class MSP430TargetMachine;
71f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
72f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov  class MSP430TargetLowering : public TargetLowering {
73f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov  public:
74f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov    explicit MSP430TargetLowering(MSP430TargetMachine &TM);
75f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
76a6b20ced765b67a85d9219d0c8547fc9c133e14fMichael Liao    virtual MVT getScalarShiftAmountTy(EVT LHSTy) const { return MVT::i8; }
7795771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
78f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov    /// LowerOperation - Provide custom lowering hooks for some operations.
79d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;
80fd1b7c778c0c332a676b1003115d2b4bc6f9a46aAnton Korobeynikov
81fd1b7c778c0c332a676b1003115d2b4bc6f9a46aAnton Korobeynikov    /// getTargetNodeName - This method returns the name of a target specific
82fd1b7c778c0c332a676b1003115d2b4bc6f9a46aAnton Korobeynikov    /// DAG node.
83fd1b7c778c0c332a676b1003115d2b4bc6f9a46aAnton Korobeynikov    virtual const char *getTargetNodeName(unsigned Opcode) const;
84fd1b7c778c0c332a676b1003115d2b4bc6f9a46aAnton Korobeynikov
85d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerShifts(SDValue Op, SelectionDAG &DAG) const;
86d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
8769d5b48bc31b7a443355cdf1506005804b4f63e6Anton Korobeynikov    SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
88d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
89d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
90d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
91d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
92d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSIGN_EXTEND(SDValue Op, SelectionDAG &DAG) const;
93d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
94d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
950ae61240341ca76e1329f251c64d2f475fa89278Anton Korobeynikov    SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
96d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue getReturnAddressFrameIndex(SelectionDAG &DAG) const;
974428885c5acfffbbdd03ad2aab23960531c47753Anton Korobeynikov
98cd76128f182b9a9f3986384523cf90f4c30e4d35Anton Korobeynikov    TargetLowering::ConstraintType
99cd76128f182b9a9f3986384523cf90f4c30e4d35Anton Korobeynikov    getConstraintType(const std::string &Constraint) const;
100cd76128f182b9a9f3986384523cf90f4c30e4d35Anton Korobeynikov    std::pair<unsigned, const TargetRegisterClass*>
101cd76128f182b9a9f3986384523cf90f4c30e4d35Anton Korobeynikov    getRegForInlineAsmConstraint(const std::string &Constraint, EVT VT) const;
102cd76128f182b9a9f3986384523cf90f4c30e4d35Anton Korobeynikov
1039afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// isTruncateFree - Return true if it's free to truncate a value of type
1049afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// Ty1 to type Ty2. e.g. On msp430 it's free to truncate a i16 value in
1059afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// register R15W to i8 by referencing its sub-register R15B.
106db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner    virtual bool isTruncateFree(Type *Ty1, Type *Ty2) const;
1079afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    virtual bool isTruncateFree(EVT VT1, EVT VT2) const;
1089afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov
1099afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// isZExtFree - Return true if any actual instruction that defines a value
1109afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// of type Ty1 implicit zero-extends the value to Ty2 in the result
1119afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// register. This does not necessarily include registers defined in unknown
1129afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// ways, such as incoming arguments, or copies from unknown virtual
1139afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// registers. Also, if isTruncateFree(Ty2, Ty1) is true, this does not
1149afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// necessarily apply to truncate instructions. e.g. on msp430, all
1159afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// instructions that define 8-bit values implicit zero-extend the result
1169afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// out to 16 bits.
117db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner    virtual bool isZExtFree(Type *Ty1, Type *Ty2) const;
1189afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    virtual bool isZExtFree(EVT VT1, EVT VT2) const;
119968b667e27d7fc9a5bf5da52191a7af629e174dcEli Bendersky    virtual bool isZExtFree(SDValue Val, EVT VT2) const;
1209afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov
1218b528e52ee6018b0d0e7e46b3b4cf6f41fdaa0d9Anton Korobeynikov    MachineBasicBlock* EmitInstrWithCustomInserter(MachineInstr *MI,
122af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman                                                   MachineBasicBlock *BB) const;
1232625de35eda2aec28bdec3370a81f533f9721736Anton Korobeynikov    MachineBasicBlock* EmitShiftInstr(MachineInstr *MI,
124af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman                                      MachineBasicBlock *BB) const;
1254428885c5acfffbbdd03ad2aab23960531c47753Anton Korobeynikov
126f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov  private:
12798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue LowerCCCCallTo(SDValue Chain, SDValue Callee,
12865c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                           CallingConv::ID CallConv, bool isVarArg,
12998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           bool isTailCall,
13098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           const SmallVectorImpl<ISD::OutputArg> &Outs,
131c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman                           const SmallVectorImpl<SDValue> &OutVals,
13298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           const SmallVectorImpl<ISD::InputArg> &Ins,
13398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           DebugLoc dl, SelectionDAG &DAG,
134d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                           SmallVectorImpl<SDValue> &InVals) const;
13598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
13698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue LowerCCCArguments(SDValue Chain,
13765c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                              CallingConv::ID CallConv,
13898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                              bool isVarArg,
13998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                              const SmallVectorImpl<ISD::InputArg> &Ins,
14098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                              DebugLoc dl,
14198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                              SelectionDAG &DAG,
142d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                              SmallVectorImpl<SDValue> &InVals) const;
14398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
14498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
14565c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                            CallingConv::ID CallConv, bool isVarArg,
14698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                            const SmallVectorImpl<ISD::InputArg> &Ins,
14798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                            DebugLoc dl, SelectionDAG &DAG,
148d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                            SmallVectorImpl<SDValue> &InVals) const;
14998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
15098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    virtual SDValue
15198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman      LowerFormalArguments(SDValue Chain,
15265c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                           CallingConv::ID CallConv, bool isVarArg,
15398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           const SmallVectorImpl<ISD::InputArg> &Ins,
15498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           DebugLoc dl, SelectionDAG &DAG,
155d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                           SmallVectorImpl<SDValue> &InVals) const;
15698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    virtual SDValue
157d2ea0e10cbd158c93fb870cdd03001b9cd1156b8Justin Holewinski      LowerCall(TargetLowering::CallLoweringInfo &CLI,
158d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                SmallVectorImpl<SDValue> &InVals) const;
15998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
16098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    virtual SDValue
16198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman      LowerReturn(SDValue Chain,
16265c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                  CallingConv::ID CallConv, bool isVarArg,
16398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                  const SmallVectorImpl<ISD::OutputArg> &Outs,
164c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman                  const SmallVectorImpl<SDValue> &OutVals,
165d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                  DebugLoc dl, SelectionDAG &DAG) const;
16698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
1676534f83ae8c39284ae51fbf478ce0c37d0c892a2Anton Korobeynikov    virtual bool getPostIndexedAddressParts(SDNode *N, SDNode *Op,
1686534f83ae8c39284ae51fbf478ce0c37d0c892a2Anton Korobeynikov                                            SDValue &Base,
1696534f83ae8c39284ae51fbf478ce0c37d0c892a2Anton Korobeynikov                                            SDValue &Offset,
1706534f83ae8c39284ae51fbf478ce0c37d0c892a2Anton Korobeynikov                                            ISD::MemIndexedMode &AM,
1716534f83ae8c39284ae51fbf478ce0c37d0c892a2Anton Korobeynikov                                            SelectionDAG &DAG) const;
1726534f83ae8c39284ae51fbf478ce0c37d0c892a2Anton Korobeynikov
173f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov    const MSP430Subtarget &Subtarget;
1743574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow    const DataLayout *TD;
175f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov  };
176f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov} // namespace llvm
177f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
178f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov#endif // LLVM_TARGET_MSP430_ISELLOWERING_H
179