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