1480093f4SDimitry Andric //===-- VEISelLowering.h - VE DAG Lowering Interface ------------*- C++ -*-===// 2480093f4SDimitry Andric // 3480093f4SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4480093f4SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5480093f4SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6480093f4SDimitry Andric // 7480093f4SDimitry Andric //===----------------------------------------------------------------------===// 8480093f4SDimitry Andric // 9480093f4SDimitry Andric // This file defines the interfaces that VE uses to lower LLVM code into a 10480093f4SDimitry Andric // selection DAG. 11480093f4SDimitry Andric // 12480093f4SDimitry Andric //===----------------------------------------------------------------------===// 13480093f4SDimitry Andric 14480093f4SDimitry Andric #ifndef LLVM_LIB_TARGET_VE_VEISELLOWERING_H 15480093f4SDimitry Andric #define LLVM_LIB_TARGET_VE_VEISELLOWERING_H 16480093f4SDimitry Andric 17480093f4SDimitry Andric #include "VE.h" 18480093f4SDimitry Andric #include "llvm/CodeGen/TargetLowering.h" 19480093f4SDimitry Andric 20480093f4SDimitry Andric namespace llvm { 21480093f4SDimitry Andric class VESubtarget; 22480093f4SDimitry Andric 23480093f4SDimitry Andric namespace VEISD { 24480093f4SDimitry Andric enum NodeType : unsigned { 25480093f4SDimitry Andric FIRST_NUMBER = ISD::BUILTIN_OP_END, 26*5ffd83dbSDimitry Andric 27*5ffd83dbSDimitry Andric Hi, 28*5ffd83dbSDimitry Andric Lo, // Hi/Lo operations, typically on a global address. 29*5ffd83dbSDimitry Andric 30*5ffd83dbSDimitry Andric GETFUNPLT, // load function address through %plt insturction 31*5ffd83dbSDimitry Andric GETTLSADDR, // load address for TLS access 32*5ffd83dbSDimitry Andric GETSTACKTOP, // retrieve address of stack top (first address of 33*5ffd83dbSDimitry Andric // locals and temporaries) 34*5ffd83dbSDimitry Andric 35*5ffd83dbSDimitry Andric CALL, // A call instruction. 36480093f4SDimitry Andric RET_FLAG, // Return with a flag operand. 37*5ffd83dbSDimitry Andric GLOBAL_BASE_REG, // Global base reg for PIC. 38480093f4SDimitry Andric }; 39480093f4SDimitry Andric } 40480093f4SDimitry Andric 41480093f4SDimitry Andric class VETargetLowering : public TargetLowering { 42480093f4SDimitry Andric const VESubtarget *Subtarget; 43480093f4SDimitry Andric 44480093f4SDimitry Andric public: 45480093f4SDimitry Andric VETargetLowering(const TargetMachine &TM, const VESubtarget &STI); 46480093f4SDimitry Andric 47480093f4SDimitry Andric const char *getTargetNodeName(unsigned Opcode) const override; 48*5ffd83dbSDimitry Andric MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override { 49*5ffd83dbSDimitry Andric return MVT::i32; 50*5ffd83dbSDimitry Andric } 51480093f4SDimitry Andric 52480093f4SDimitry Andric Register getRegisterByName(const char *RegName, LLT VT, 53480093f4SDimitry Andric const MachineFunction &MF) const override; 54480093f4SDimitry Andric 55480093f4SDimitry Andric /// getSetCCResultType - Return the ISD::SETCC ValueType 56480093f4SDimitry Andric EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, 57480093f4SDimitry Andric EVT VT) const override; 58480093f4SDimitry Andric 59480093f4SDimitry Andric SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, 60480093f4SDimitry Andric bool isVarArg, 61480093f4SDimitry Andric const SmallVectorImpl<ISD::InputArg> &Ins, 62480093f4SDimitry Andric const SDLoc &dl, SelectionDAG &DAG, 63480093f4SDimitry Andric SmallVectorImpl<SDValue> &InVals) const override; 64480093f4SDimitry Andric 65*5ffd83dbSDimitry Andric SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI, 66*5ffd83dbSDimitry Andric SmallVectorImpl<SDValue> &InVals) const override; 67*5ffd83dbSDimitry Andric 68480093f4SDimitry Andric bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF, 69480093f4SDimitry Andric bool isVarArg, 70480093f4SDimitry Andric const SmallVectorImpl<ISD::OutputArg> &ArgsFlags, 71480093f4SDimitry Andric LLVMContext &Context) const override; 72480093f4SDimitry Andric SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, 73480093f4SDimitry Andric const SmallVectorImpl<ISD::OutputArg> &Outs, 74480093f4SDimitry Andric const SmallVectorImpl<SDValue> &OutVals, const SDLoc &dl, 75480093f4SDimitry Andric SelectionDAG &DAG) const override; 76*5ffd83dbSDimitry Andric 77*5ffd83dbSDimitry Andric /// Custom Lower { 78*5ffd83dbSDimitry Andric SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override; 79*5ffd83dbSDimitry Andric 80*5ffd83dbSDimitry Andric SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const; 81*5ffd83dbSDimitry Andric SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const; 82*5ffd83dbSDimitry Andric SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const; 83*5ffd83dbSDimitry Andric SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; 84*5ffd83dbSDimitry Andric SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const; 85*5ffd83dbSDimitry Andric SDValue LowerToTLSGeneralDynamicModel(SDValue Op, SelectionDAG &DAG) const; 86*5ffd83dbSDimitry Andric SDValue lowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const; 87*5ffd83dbSDimitry Andric /// } Custom Lower 88*5ffd83dbSDimitry Andric 89*5ffd83dbSDimitry Andric SDValue withTargetFlags(SDValue Op, unsigned TF, SelectionDAG &DAG) const; 90*5ffd83dbSDimitry Andric SDValue makeHiLoPair(SDValue Op, unsigned HiTF, unsigned LoTF, 91*5ffd83dbSDimitry Andric SelectionDAG &DAG) const; 92*5ffd83dbSDimitry Andric SDValue makeAddress(SDValue Op, SelectionDAG &DAG) const; 93*5ffd83dbSDimitry Andric 94*5ffd83dbSDimitry Andric bool isFPImmLegal(const APFloat &Imm, EVT VT, 95*5ffd83dbSDimitry Andric bool ForCodeSize) const override; 96*5ffd83dbSDimitry Andric /// Returns true if the target allows unaligned memory accesses of the 97*5ffd83dbSDimitry Andric /// specified type. 98*5ffd83dbSDimitry Andric bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS, unsigned Align, 99*5ffd83dbSDimitry Andric MachineMemOperand::Flags Flags, 100*5ffd83dbSDimitry Andric bool *Fast) const override; 101*5ffd83dbSDimitry Andric 102*5ffd83dbSDimitry Andric // Block s/udiv lowering for now 103*5ffd83dbSDimitry Andric bool isIntDivCheap(EVT VT, AttributeList Attr) const override { return true; } 104*5ffd83dbSDimitry Andric 105*5ffd83dbSDimitry Andric bool hasAndNot(SDValue Y) const override; 106480093f4SDimitry Andric }; 107480093f4SDimitry Andric } // namespace llvm 108480093f4SDimitry Andric 109480093f4SDimitry Andric #endif // VE_ISELLOWERING_H 110