131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- HexagonISelLowering.h - Hexagon DAG Lowering Interface --*- C++ -*-===// 2b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 3b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// The LLVM Compiler Infrastructure 4b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 5b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// This file is distributed under the University of Illinois Open Source 6b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// License. See LICENSE.TXT for details. 7b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 8b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===// 9b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 10b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// This file defines the interfaces that Hexagon uses to lower LLVM code into a 11b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// selection DAG. 12b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 13b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===// 14b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_TARGET_HEXAGON_HEXAGONISELLOWERING_H 1637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_TARGET_HEXAGON_HEXAGONISELLOWERING_H 17b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 1879aa3417eb6f58d668aadfedf075240a41d35a26Craig Topper#include "Hexagon.h" 19b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/CodeGen/CallingConvLower.h" 200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/CallingConv.h" 21a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/Target/TargetLowering.h" 22b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 23b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumnamespace llvm { 24ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 25ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// Return true when the given node fits in a positive half word. 26ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesbool isPositiveHalfWord(SDNode *N); 27ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 28b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum namespace HexagonISD { 296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar enum NodeType : unsigned { 306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar OP_BEGIN = ISD::BUILTIN_OP_END, 31b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar CONST32 = OP_BEGIN, 33b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum CONST32_GP, // For marking data present in GP. 347517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande FCONST32, 356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ALLOCA, 36b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum ARGEXTEND, 37b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 38f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar AT_GOT, // Index in GOT. 39f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar AT_PCREL, // Offset relative to PC. 404c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 41ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines CALLv3, // A V3+ call instruction. 42ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines CALLv3nr, // A V3+ call instruction that doesn't return. 43ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines CALLR, 44ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 45b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum RET_FLAG, // Return with a flag operand. 464c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar BARRIER, // Memory barrier. 474c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar JT, // Jump table. 484c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar CP, // Constant pool. 496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 50ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines POPCOUNT, 51ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines COMBINE, 524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar PACKHL, 534c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar VSPLATB, 544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar VSPLATH, 554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar SHUFFEB, 564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar SHUFFEH, 574c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar SHUFFOB, 584c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar SHUFFOH, 594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar VSXTBH, 604c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar VSXTBW, 614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar VSRAW, 624c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar VSRAH, 634c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar VSRLW, 644c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar VSRLH, 654c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar VSHLW, 664c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar VSHLH, 674c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar VCMPBEQ, 684c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar VCMPBGT, 694c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar VCMPBGTU, 704c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar VCMPHEQ, 714c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar VCMPHGT, 724c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar VCMPHGTU, 734c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar VCMPWEQ, 744c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar VCMPWGT, 754c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar VCMPWGTU, 766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar INSERT, 786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar INSERTRP, 796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar EXTRACTU, 806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar EXTRACTURP, 81f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar VCOMBINE, 826ea706e40e841c148bc47bcac4dcca5e0f0245ebJyotsna Verma TC_RETURN, 83ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines EH_RETURN, 846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar DCFETCH, 856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar OP_END 87b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum }; 88b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 89b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 90ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines class HexagonSubtarget; 91ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 92b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum class HexagonTargetLowering : public TargetLowering { 93b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum int VarArgsFrameOffset; // Frame offset to start of varargs area. 94b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool CanReturnSmallStruct(const Function* CalleeFn, unsigned& RetSize) 966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const; 97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void promoteLdStType(MVT VT, MVT PromotedLdStVT); 986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const HexagonTargetMachine &HTM; 996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const HexagonSubtarget &Subtarget; 1004c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 101b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum public: 102ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines explicit HexagonTargetLowering(const TargetMachine &TM, 1036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const HexagonSubtarget &ST); 104b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 105b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum /// IsEligibleForTailCallOptimization - Check whether the call is eligible 106b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum /// for tail call optimization. Targets which want to do tail call 107b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum /// optimization should implement this function. 1086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool IsEligibleForTailCallOptimization(SDValue Callee, 1096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar CallingConv::ID CalleeCC, bool isVarArg, bool isCalleeStructRet, 1106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool isCallerStructRet, const SmallVectorImpl<ISD::OutputArg> &Outs, 1116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const SmallVectorImpl<SDValue> &OutVals, 1126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const SmallVectorImpl<ISD::InputArg> &Ins, SelectionDAG& DAG) const; 113b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 114dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isTruncateFree(Type *Ty1, Type *Ty2) const override; 115dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isTruncateFree(EVT VT1, EVT VT2) const override; 116b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool allowTruncateForTailCall(Type *Ty1, Type *Ty2) const override; 118d113448c1dd5f40522c3c02db96e87a9eb59eaf4Tim Northover 1194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Should we expand the build vector with shuffles? 1204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar bool shouldExpandBuildVectorWithShuffles(EVT VT, 1216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar unsigned DefinedValues) const override; 122b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 1234c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override; 124dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const char *getTargetNodeName(unsigned Opcode) const override; 1254c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const; 1264c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar SDValue LowerEXTRACT_VECTOR(SDValue Op, SelectionDAG &DAG) const; 1274c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar SDValue LowerINSERT_VECTOR(SDValue Op, SelectionDAG &DAG) const; 1284c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const; 129b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const; 130b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum SDValue LowerINLINEASM(SDValue Op, SelectionDAG &DAG) const; 131de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SDValue LowerPREFETCH(SDValue Op, SelectionDAG &DAG) const; 132b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum SDValue LowerEH_LABEL(SDValue Op, SelectionDAG &DAG) const; 1336ea706e40e841c148bc47bcac4dcca5e0f0245ebJyotsna Verma SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const; 134de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SDValue 135de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, 136de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const SmallVectorImpl<ISD::InputArg> &Ins, 137de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const SDLoc &dl, SelectionDAG &DAG, 138de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SmallVectorImpl<SDValue> &InVals) const override; 139b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum SDValue LowerGLOBALADDRESS(SDValue Op, SelectionDAG &DAG) const; 140b6716187ca8cc33817fb7446d9d9bdcb708c3f35Jyotsna Verma SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const; 141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const; 142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SDValue LowerToTLSGeneralDynamicModel(GlobalAddressSDNode *GA, 143de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SelectionDAG &DAG) const; 144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SDValue LowerToTLSInitialExecModel(GlobalAddressSDNode *GA, 145de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SelectionDAG &DAG) const; 146de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SDValue LowerToTLSLocalExecModel(GlobalAddressSDNode *GA, 147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SelectionDAG &DAG) const; 148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SDValue GetDynamicTLSAddr(SelectionDAG &DAG, SDValue Chain, 149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GlobalAddressSDNode *GA, SDValue *InFlag, EVT PtrVT, 150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned ReturnReg, unsigned char OperandFlags) const; 151f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar SDValue LowerGLOBAL_OFFSET_TABLE(SDValue Op, SelectionDAG &DAG) const; 152b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 153d2ea0e10cbd158c93fb870cdd03001b9cd1156b8Justin Holewinski SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI, 1546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar SmallVectorImpl<SDValue> &InVals) const override; 155b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum SDValue LowerCallResult(SDValue Chain, SDValue InFlag, 156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CallingConv::ID CallConv, bool isVarArg, 157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const SmallVectorImpl<ISD::InputArg> &Ins, 158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const SDLoc &dl, SelectionDAG &DAG, 159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SmallVectorImpl<SDValue> &InVals, 160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const SmallVectorImpl<SDValue> &OutVals, 161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SDValue Callee) const; 162b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 1634c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const; 1644c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar SDValue LowerVSELECT(SDValue Op, SelectionDAG &DAG) const; 1654c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar SDValue LowerCTPOP(SDValue Op, SelectionDAG &DAG) const; 166b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const; 167b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG& DAG) const; 168b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const; 1694c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const; 170b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, 172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const SmallVectorImpl<ISD::OutputArg> &Outs, 173de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const SmallVectorImpl<SDValue> &OutVals, 174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const SDLoc &dl, SelectionDAG &DAG) const override; 175b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 1766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar bool mayBeEmittedAsTailCall(CallInst *CI) const override; 177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar MachineBasicBlock * 178de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar EmitInstrWithCustomInserter(MachineInstr &MI, 179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar MachineBasicBlock *BB) const override; 180b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 181f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// If a physical register, this returns the register that receives the 182f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// exception address on entry to an EH pad. 183f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar unsigned 184f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar getExceptionPointerRegister(const Constant *PersonalityFn) const override { 185f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return Hexagon::R0; 186f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 187f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 188f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// If a physical register, this returns the register that receives the 189f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// exception typeid on entry to a landing pad. 190f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar unsigned 191f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar getExceptionSelectorRegister(const Constant *PersonalityFn) const override { 192f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return Hexagon::R1; 193f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 194f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 1956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const; 1966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const; 197f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const; 198f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar EVT getSetCCResultType(const DataLayout &, LLVMContext &C, 199f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar EVT VT) const override { 200c7e77f91fecd662b198939a9a8ee0a0cc3828fc4Juergen Ributzka if (!VT.isVector()) 201c7e77f91fecd662b198939a9a8ee0a0cc3828fc4Juergen Ributzka return MVT::i1; 202c7e77f91fecd662b198939a9a8ee0a0cc3828fc4Juergen Ributzka else 203c7e77f91fecd662b198939a9a8ee0a0cc3828fc4Juergen Ributzka return EVT::getVectorVT(C, MVT::i1, VT.getVectorNumElements()); 204b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 205b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 206dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool getPostIndexedAddressParts(SDNode *N, SDNode *Op, 207dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SDValue &Base, SDValue &Offset, 208dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines ISD::MemIndexedMode &AM, 209dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SelectionDAG &DAG) const override; 210b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ConstraintType getConstraintType(StringRef Constraint) const override; 212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 213ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines std::pair<unsigned, const TargetRegisterClass *> 214ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, 215f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar StringRef Constraint, MVT VT) const override; 216b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 217f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar unsigned 218f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar getInlineAsmMemConstraint(StringRef ConstraintCode) const override { 2194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar if (ConstraintCode == "o") 2204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar return InlineAsm::Constraint_o; 2214c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar return TargetLowering::getInlineAsmMemConstraint(ConstraintCode); 2224c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 2234c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 224b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Intrinsics 225dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const; 226de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SDValue LowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG) const; 227b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum /// isLegalAddressingMode - Return true if the addressing mode represented 228b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum /// by AM is legal for this target, for a load/store of the specified type. 229b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum /// The type may be VoidTy, in which case only return true if the addressing 230b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum /// mode is legal for a load/store of any legal type. 231b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum /// TODO: Handle pre/postinc as well. 232f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, 233f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Type *Ty, unsigned AS) const override; 234f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// Return true if folding a constant offset with the given GlobalAddress 235f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// is legal. It is frequently not legal in PIC relocation models. 236f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override; 237f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 238dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isFPImmLegal(const APFloat &Imm, EVT VT) const override; 239b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 240b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum /// isLegalICmpImmediate - Return true if the specified immediate is legal 241b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum /// icmp immediate, that is the target has icmp instructions which can 242b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum /// compare a register against the immediate without having to materialize 243b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum /// the immediate into a register. 244dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isLegalICmpImmediate(int64_t Imm) const override; 245f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 246de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AddrSpace, 247de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar unsigned Align, bool *Fast) const override; 248de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 249f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// Returns relocation base for the given PIC jumptable. 250f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar SDValue getPICJumpTableRelocBase(SDValue Table, SelectionDAG &DAG) 251f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar const override; 252f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 253f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // Handling of atomic RMW instructions. 254f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Value *emitLoadLinked(IRBuilder<> &Builder, Value *Addr, 255f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar AtomicOrdering Ord) const override; 256f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Value *emitStoreConditional(IRBuilder<> &Builder, Value *Val, 257f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar Value *Addr, AtomicOrdering Ord) const override; 258f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar AtomicExpansionKind shouldExpandAtomicLoadInIR(LoadInst *LI) const override; 259f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar bool shouldExpandAtomicStoreInIR(StoreInst *SI) const override; 260de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool shouldExpandAtomicCmpXchgInIR(AtomicCmpXchgInst *AI) const override; 261de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 262f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar AtomicExpansionKind 263f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const override { 264f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return AtomicExpansionKind::LLSC; 265f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 266f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 267f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar protected: 268f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar std::pair<const TargetRegisterClass*, uint8_t> 269f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar findRepresentativeClass(const TargetRegisterInfo *TRI, MVT VT) 270f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar const override; 271b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum }; 272b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} // end namespace llvm 273b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 274b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#endif // Hexagon_ISELLOWERING_H 275