1ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//===-- BPFISelLowering.h - BPF DAG Lowering Interface ----------*- C++ -*-===// 2ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// 3ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// The LLVM Compiler Infrastructure 4ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// 5ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// This file is distributed under the University of Illinois Open Source 6ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// License. See LICENSE.TXT for details. 7ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// 8ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//===----------------------------------------------------------------------===// 9ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// 10ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// This file defines the interfaces that BPF uses to lower LLVM code into a 11ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// selection DAG. 12ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// 13ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//===----------------------------------------------------------------------===// 14ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 15ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#ifndef LLVM_LIB_TARGET_BPF_BPFISELLOWERING_H 16ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#define LLVM_LIB_TARGET_BPF_BPFISELLOWERING_H 17ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 18ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "BPF.h" 19ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/CodeGen/SelectionDAG.h" 20ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Target/TargetLowering.h" 21ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 22ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesnamespace llvm { 234c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarclass BPFSubtarget; 24ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesnamespace BPFISD { 25ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesenum { 26ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines FIRST_NUMBER = ISD::BUILTIN_OP_END, 27ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines RET_FLAG, 28ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines CALL, 29ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SELECT_CC, 30ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines BR_CC, 31ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Wrapper 32ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}; 33ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 34ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 35ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesclass BPFTargetLowering : public TargetLowering { 36ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinespublic: 37ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines explicit BPFTargetLowering(const TargetMachine &TM, const BPFSubtarget &STI); 38ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 39ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // Provide custom lowering hooks for some operations. 40ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override; 41ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 42ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // This method returns the name of a target specific DAG node. 43ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines const char *getTargetNodeName(unsigned Opcode) const override; 44ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 45ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines MachineBasicBlock * 46ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines EmitInstrWithCustomInserter(MachineInstr *MI, 47ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines MachineBasicBlock *BB) const override; 48ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 49ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesprivate: 50ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const; 51ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const; 52ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; 53ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 54ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // Lower the result values of a call, copying them out of physregs into vregs 55ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SDValue LowerCallResult(SDValue Chain, SDValue InFlag, 56ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines CallingConv::ID CallConv, bool IsVarArg, 57ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines const SmallVectorImpl<ISD::InputArg> &Ins, SDLoc DL, 58ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SelectionDAG &DAG, 59ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SmallVectorImpl<SDValue> &InVals) const; 60ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 61ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // Lower a call into CALLSEQ_START - BPFISD:CALL - CALLSEQ_END chain 62ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI, 63ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SmallVectorImpl<SDValue> &InVals) const override; 64ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 65ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines // Lower incoming arguments, copy physregs into vregs 66ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, 67ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool IsVarArg, 68ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines const SmallVectorImpl<ISD::InputArg> &Ins, 69ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SDLoc DL, SelectionDAG &DAG, 70ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SmallVectorImpl<SDValue> &InVals) const override; 71ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 72ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg, 73ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines const SmallVectorImpl<ISD::OutputArg> &Outs, 74ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines const SmallVectorImpl<SDValue> &OutVals, SDLoc DL, 75ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines SelectionDAG &DAG) const override; 76ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 77ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines EVT getOptimalMemOpType(uint64_t Size, unsigned DstAlign, unsigned SrcAlign, 78ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool IsMemset, bool ZeroMemset, bool MemcpyStrSrc, 79ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines MachineFunction &MF) const override { 80ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return Size >= 8 ? MVT::i64 : MVT::i32; 81ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 82ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 83ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines bool shouldConvertConstantLoadToIntImm(const APInt &Imm, 84ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines Type *Ty) const override { 85ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return true; 86ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 87ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}; 88ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines} 89ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines 90ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#endif 91