1283625Sdim//===-- BPFInstrFormats.td - BPF Instruction Formats -------*- tablegen -*-===//
2283625Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6283625Sdim//
7283625Sdim//===----------------------------------------------------------------------===//
8283625Sdim
9327952Sdimclass BPFOpClass<bits<3> val> {
10327952Sdim  bits<3> Value = val;
11327952Sdim}
12327952Sdim
13327952Sdimdef BPF_LD    : BPFOpClass<0x0>;
14327952Sdimdef BPF_LDX   : BPFOpClass<0x1>;
15327952Sdimdef BPF_ST    : BPFOpClass<0x2>;
16327952Sdimdef BPF_STX   : BPFOpClass<0x3>;
17327952Sdimdef BPF_ALU   : BPFOpClass<0x4>;
18327952Sdimdef BPF_JMP   : BPFOpClass<0x5>;
19353358Sdimdef BPF_JMP32 : BPFOpClass<0x6>;
20327952Sdimdef BPF_ALU64 : BPFOpClass<0x7>;
21327952Sdim
22327952Sdimclass BPFSrcType<bits<1> val> {
23327952Sdim  bits<1> Value = val;
24327952Sdim}
25327952Sdim
26327952Sdimdef BPF_K : BPFSrcType<0x0>;
27327952Sdimdef BPF_X : BPFSrcType<0x1>;
28327952Sdim
29327952Sdimclass BPFArithOp<bits<4> val> {
30327952Sdim  bits<4> Value = val;
31327952Sdim}
32327952Sdim
33327952Sdimdef BPF_ADD  : BPFArithOp<0x0>;
34327952Sdimdef BPF_SUB  : BPFArithOp<0x1>;
35327952Sdimdef BPF_MUL  : BPFArithOp<0x2>;
36327952Sdimdef BPF_DIV  : BPFArithOp<0x3>;
37327952Sdimdef BPF_OR   : BPFArithOp<0x4>;
38327952Sdimdef BPF_AND  : BPFArithOp<0x5>;
39327952Sdimdef BPF_LSH  : BPFArithOp<0x6>;
40327952Sdimdef BPF_RSH  : BPFArithOp<0x7>;
41327952Sdimdef BPF_NEG  : BPFArithOp<0x8>;
42327952Sdimdef BPF_XOR  : BPFArithOp<0xa>;
43327952Sdimdef BPF_MOV  : BPFArithOp<0xb>;
44327952Sdimdef BPF_ARSH : BPFArithOp<0xc>;
45327952Sdimdef BPF_END  : BPFArithOp<0xd>;
46327952Sdim
47327952Sdimclass BPFEndDir<bits<1> val> {
48327952Sdim  bits<1> Value = val;
49327952Sdim}
50327952Sdim
51327952Sdimdef BPF_TO_LE : BPFSrcType<0x0>;
52327952Sdimdef BPF_TO_BE : BPFSrcType<0x1>;
53327952Sdim
54327952Sdimclass BPFJumpOp<bits<4> val> {
55327952Sdim  bits<4> Value = val;
56327952Sdim}
57327952Sdim
58327952Sdimdef BPF_JA   : BPFJumpOp<0x0>;
59327952Sdimdef BPF_JEQ  : BPFJumpOp<0x1>;
60327952Sdimdef BPF_JGT  : BPFJumpOp<0x2>;
61327952Sdimdef BPF_JGE  : BPFJumpOp<0x3>;
62327952Sdimdef BPF_JNE  : BPFJumpOp<0x5>;
63327952Sdimdef BPF_JSGT : BPFJumpOp<0x6>;
64327952Sdimdef BPF_JSGE : BPFJumpOp<0x7>;
65327952Sdimdef BPF_CALL : BPFJumpOp<0x8>;
66327952Sdimdef BPF_EXIT : BPFJumpOp<0x9>;
67327952Sdimdef BPF_JLT  : BPFJumpOp<0xa>;
68327952Sdimdef BPF_JLE  : BPFJumpOp<0xb>;
69327952Sdimdef BPF_JSLT : BPFJumpOp<0xc>;
70327952Sdimdef BPF_JSLE : BPFJumpOp<0xd>;
71327952Sdim
72327952Sdimclass BPFWidthModifer<bits<2> val> {
73327952Sdim  bits<2> Value = val;
74327952Sdim}
75327952Sdim
76327952Sdimdef BPF_W  : BPFWidthModifer<0x0>;
77327952Sdimdef BPF_H  : BPFWidthModifer<0x1>;
78327952Sdimdef BPF_B  : BPFWidthModifer<0x2>;
79327952Sdimdef BPF_DW : BPFWidthModifer<0x3>;
80327952Sdim
81327952Sdimclass BPFModeModifer<bits<3> val> {
82327952Sdim  bits<3> Value = val;
83327952Sdim}
84327952Sdim
85327952Sdimdef BPF_IMM  : BPFModeModifer<0x0>;
86327952Sdimdef BPF_ABS  : BPFModeModifer<0x1>;
87327952Sdimdef BPF_IND  : BPFModeModifer<0x2>;
88327952Sdimdef BPF_MEM  : BPFModeModifer<0x3>;
89327952Sdimdef BPF_XADD : BPFModeModifer<0x6>;
90327952Sdim
91283625Sdimclass InstBPF<dag outs, dag ins, string asmstr, list<dag> pattern>
92283625Sdim  : Instruction {
93283625Sdim  field bits<64> Inst;
94283625Sdim  field bits<64> SoftFail = 0;
95283625Sdim  let Size = 8;
96283625Sdim
97283625Sdim  let Namespace = "BPF";
98283625Sdim  let DecoderNamespace = "BPF";
99283625Sdim
100327952Sdim  BPFOpClass BPFClass;
101327952Sdim  let Inst{58-56} = BPFClass.Value;
102283625Sdim
103283625Sdim  dag OutOperandList = outs;
104283625Sdim  dag InOperandList = ins;
105283625Sdim  let AsmString = asmstr;
106283625Sdim  let Pattern = pattern;
107283625Sdim}
108283625Sdim
109283625Sdim// Pseudo instructions
110283625Sdimclass Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern>
111283625Sdim  : InstBPF<outs, ins, asmstr, pattern> {
112283625Sdim  let Inst{63-0} = 0;
113283625Sdim  let isPseudo = 1;
114283625Sdim}
115