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