1283625Sdim//===-- BPFISelLowering.h - BPF DAG Lowering Interface ----------*- C++ -*-===// 2283625Sdim// 3283625Sdim// The LLVM Compiler Infrastructure 4283625Sdim// 5283625Sdim// This file is distributed under the University of Illinois Open Source 6283625Sdim// License. See LICENSE.TXT for details. 7283625Sdim// 8283625Sdim//===----------------------------------------------------------------------===// 9283625Sdim// 10283625Sdim// This file defines the interfaces that BPF uses to lower LLVM code into a 11283625Sdim// selection DAG. 12283625Sdim// 13283625Sdim//===----------------------------------------------------------------------===// 14283625Sdim 15283625Sdim#ifndef LLVM_LIB_TARGET_BPF_BPFISELLOWERING_H 16283625Sdim#define LLVM_LIB_TARGET_BPF_BPFISELLOWERING_H 17283625Sdim 18283625Sdim#include "BPF.h" 19283625Sdim#include "llvm/CodeGen/SelectionDAG.h" 20283625Sdim#include "llvm/Target/TargetLowering.h" 21283625Sdim 22283625Sdimnamespace llvm { 23283625Sdimclass BPFSubtarget; 24283625Sdimnamespace BPFISD { 25283625Sdimenum NodeType : unsigned { 26283625Sdim FIRST_NUMBER = ISD::BUILTIN_OP_END, 27283625Sdim RET_FLAG, 28283625Sdim CALL, 29283625Sdim SELECT_CC, 30283625Sdim BR_CC, 31283625Sdim Wrapper 32283625Sdim}; 33283625Sdim} 34283625Sdim 35283625Sdimclass BPFTargetLowering : public TargetLowering { 36283625Sdimpublic: 37283625Sdim explicit BPFTargetLowering(const TargetMachine &TM, const BPFSubtarget &STI); 38283625Sdim 39283625Sdim // Provide custom lowering hooks for some operations. 40283625Sdim SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override; 41283625Sdim 42283625Sdim // This method returns the name of a target specific DAG node. 43283625Sdim const char *getTargetNodeName(unsigned Opcode) const override; 44283625Sdim 45283625Sdim MachineBasicBlock * 46283625Sdim EmitInstrWithCustomInserter(MachineInstr *MI, 47283625Sdim MachineBasicBlock *BB) const override; 48283625Sdim 49283625Sdimprivate: 50283625Sdim SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const; 51283625Sdim SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const; 52283625Sdim SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; 53283625Sdim 54283625Sdim // Lower the result values of a call, copying them out of physregs into vregs 55283625Sdim SDValue LowerCallResult(SDValue Chain, SDValue InFlag, 56283625Sdim CallingConv::ID CallConv, bool IsVarArg, 57283625Sdim const SmallVectorImpl<ISD::InputArg> &Ins, SDLoc DL, 58283625Sdim SelectionDAG &DAG, 59283625Sdim SmallVectorImpl<SDValue> &InVals) const; 60283625Sdim 61283625Sdim // Lower a call into CALLSEQ_START - BPFISD:CALL - CALLSEQ_END chain 62283625Sdim SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI, 63283625Sdim SmallVectorImpl<SDValue> &InVals) const override; 64283625Sdim 65283625Sdim // Lower incoming arguments, copy physregs into vregs 66283625Sdim SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, 67283625Sdim bool IsVarArg, 68283625Sdim const SmallVectorImpl<ISD::InputArg> &Ins, 69283625Sdim SDLoc DL, SelectionDAG &DAG, 70283625Sdim SmallVectorImpl<SDValue> &InVals) const override; 71283625Sdim 72283625Sdim SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg, 73283625Sdim const SmallVectorImpl<ISD::OutputArg> &Outs, 74283625Sdim const SmallVectorImpl<SDValue> &OutVals, SDLoc DL, 75283625Sdim SelectionDAG &DAG) const override; 76283625Sdim 77283625Sdim EVT getOptimalMemOpType(uint64_t Size, unsigned DstAlign, unsigned SrcAlign, 78283625Sdim bool IsMemset, bool ZeroMemset, bool MemcpyStrSrc, 79283625Sdim MachineFunction &MF) const override { 80283625Sdim return Size >= 8 ? MVT::i64 : MVT::i32; 81283625Sdim } 82283625Sdim 83283625Sdim bool shouldConvertConstantLoadToIntImm(const APInt &Imm, 84283625Sdim Type *Ty) const override { 85283625Sdim return true; 86283625Sdim } 87283625Sdim}; 88285181Sdim} 89283625Sdim 90283625Sdim#endif 91