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