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