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
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_TARGET_MSP430_MSP430ISELLOWERING_H
1637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_TARGET_MSP430_MSP430ISELLOWERING_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
69ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  class MSP430Subtarget;
70f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov  class MSP430TargetLowering : public TargetLowering {
71f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov  public:
72ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    explicit MSP430TargetLowering(const TargetMachine &TM,
73ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                  const MSP430Subtarget &STI);
74f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MVT getScalarShiftAmountTy(EVT LHSTy) const override { return MVT::i8; }
7695771afbfd604ad003fa3723cac66c9370fed55dOwen Anderson
77f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov    /// LowerOperation - Provide custom lowering hooks for some operations.
78dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
79fd1b7c778c0c332a676b1003115d2b4bc6f9a46aAnton Korobeynikov
80fd1b7c778c0c332a676b1003115d2b4bc6f9a46aAnton Korobeynikov    /// getTargetNodeName - This method returns the name of a target specific
81fd1b7c778c0c332a676b1003115d2b4bc6f9a46aAnton Korobeynikov    /// DAG node.
82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    const char *getTargetNodeName(unsigned Opcode) const override;
83fd1b7c778c0c332a676b1003115d2b4bc6f9a46aAnton Korobeynikov
84d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerShifts(SDValue Op, SelectionDAG &DAG) const;
85d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
8669d5b48bc31b7a443355cdf1506005804b4f63e6Anton Korobeynikov    SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
87d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
88d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
89d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
90d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
91d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerSIGN_EXTEND(SDValue Op, SelectionDAG &DAG) const;
92d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
93d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
940ae61240341ca76e1329f251c64d2f475fa89278Anton Korobeynikov    SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
9527253f5edd04791bfbd0b5dd6e228be1d8071fceAnton Korobeynikov    SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
96d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman    SDValue getReturnAddressFrameIndex(SelectionDAG &DAG) const;
974428885c5acfffbbdd03ad2aab23960531c47753Anton Korobeynikov
98cd76128f182b9a9f3986384523cf90f4c30e4d35Anton Korobeynikov    TargetLowering::ConstraintType
99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    getConstraintType(const std::string &Constraint) const override;
100ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    std::pair<unsigned, const TargetRegisterClass *>
101ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
102ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                 const std::string &Constraint,
103dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                 MVT VT) const override;
104cd76128f182b9a9f3986384523cf90f4c30e4d35Anton Korobeynikov
1059afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// isTruncateFree - Return true if it's free to truncate a value of type
1069afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// Ty1 to type Ty2. e.g. On msp430 it's free to truncate a i16 value in
1079afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// register R15W to i8 by referencing its sub-register R15B.
108dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool isTruncateFree(Type *Ty1, Type *Ty2) const override;
109dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool isTruncateFree(EVT VT1, EVT VT2) const override;
1109afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov
1119afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// isZExtFree - Return true if any actual instruction that defines a value
1129afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// of type Ty1 implicit zero-extends the value to Ty2 in the result
1139afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// register. This does not necessarily include registers defined in unknown
1149afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// ways, such as incoming arguments, or copies from unknown virtual
1159afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// registers. Also, if isTruncateFree(Ty2, Ty1) is true, this does not
1169afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// necessarily apply to truncate instructions. e.g. on msp430, all
1179afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// instructions that define 8-bit values implicit zero-extend the result
1189afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov    /// out to 16 bits.
119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool isZExtFree(Type *Ty1, Type *Ty2) const override;
120dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool isZExtFree(EVT VT1, EVT VT2) const override;
121dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool isZExtFree(SDValue Val, EVT VT2) const override;
1229afb7c5fb3dfbbe207c87f69bc80098b83308785Anton Korobeynikov
1238b528e52ee6018b0d0e7e46b3b4cf6f41fdaa0d9Anton Korobeynikov    MachineBasicBlock* EmitInstrWithCustomInserter(MachineInstr *MI,
124dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                                   MachineBasicBlock *BB) const override;
1252625de35eda2aec28bdec3370a81f533f9721736Anton Korobeynikov    MachineBasicBlock* EmitShiftInstr(MachineInstr *MI,
126af1d8ca44a18f304f207e209b3bdb94b590f86ffDan Gohman                                      MachineBasicBlock *BB) const;
1274428885c5acfffbbdd03ad2aab23960531c47753Anton Korobeynikov
128f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov  private:
12998ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue LowerCCCCallTo(SDValue Chain, SDValue Callee,
13065c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                           CallingConv::ID CallConv, bool isVarArg,
13198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           bool isTailCall,
13298ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           const SmallVectorImpl<ISD::OutputArg> &Outs,
133c9403659a98bf6487ab6fbf40b81628b5695c02eDan Gohman                           const SmallVectorImpl<SDValue> &OutVals,
13498ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           const SmallVectorImpl<ISD::InputArg> &Ins,
135ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                           SDLoc dl, SelectionDAG &DAG,
136d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                           SmallVectorImpl<SDValue> &InVals) const;
13798ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
13898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue LowerCCCArguments(SDValue Chain,
13965c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                              CallingConv::ID CallConv,
14098ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                              bool isVarArg,
14198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                              const SmallVectorImpl<ISD::InputArg> &Ins,
142ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                              SDLoc dl,
14398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                              SelectionDAG &DAG,
144d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                              SmallVectorImpl<SDValue> &InVals) const;
14598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
14698ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman    SDValue LowerCallResult(SDValue Chain, SDValue InFlag,
14765c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                            CallingConv::ID CallConv, bool isVarArg,
14898ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                            const SmallVectorImpl<ISD::InputArg> &Ins,
149ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                            SDLoc dl, SelectionDAG &DAG,
150d858e90f039f5fcdc2fa93035e911a5a9505cc50Dan Gohman                            SmallVectorImpl<SDValue> &InVals) const;
15198ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman
152dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SDValue
15398ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman      LowerFormalArguments(SDValue Chain,
15465c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel                           CallingConv::ID CallConv, bool isVarArg,
15598ca4f2a325f72374a477f9deba7d09e8999c29bDan Gohman                           const SmallVectorImpl<ISD::InputArg> &Ins,
156ac6d9bec671252dd1e596fa71180ff6b39d06b5dAndrew Trick                           SDLoc dl, SelectionDAG &DAG,
157dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                           SmallVectorImpl<SDValue> &InVals) const override;
158dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SDValue
159d2ea0e10cbd158c93fb870cdd03001b9cd1156b8Justin Holewinski      LowerCall(TargetLowering::CallLoweringInfo &CLI,
160dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                SmallVectorImpl<SDValue> &InVals) const override;
161dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
162dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    SDValue LowerReturn(SDValue Chain,
163dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                        CallingConv::ID CallConv, bool isVarArg,
164dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                        const SmallVectorImpl<ISD::OutputArg> &Outs,
165dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                        const SmallVectorImpl<SDValue> &OutVals,
166dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                        SDLoc dl, SelectionDAG &DAG) const override;
167dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
168dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool getPostIndexedAddressParts(SDNode *N, SDNode *Op,
169dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                    SDValue &Base,
170dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                    SDValue &Offset,
171dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                    ISD::MemIndexedMode &AM,
172dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                    SelectionDAG &DAG) const override;
173f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov  };
174f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov} // namespace llvm
175f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
17637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#endif
177