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