xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/BPF/BPFInstrFormats.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric//===-- BPFInstrFormats.td - BPF Instruction Formats -------*- tablegen -*-===//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric
90b57cec5SDimitry Andricclass BPFOpClass<bits<3> val> {
100b57cec5SDimitry Andric  bits<3> Value = val;
110b57cec5SDimitry Andric}
120b57cec5SDimitry Andric
130b57cec5SDimitry Andricdef BPF_LD    : BPFOpClass<0x0>;
140b57cec5SDimitry Andricdef BPF_LDX   : BPFOpClass<0x1>;
150b57cec5SDimitry Andricdef BPF_ST    : BPFOpClass<0x2>;
160b57cec5SDimitry Andricdef BPF_STX   : BPFOpClass<0x3>;
170b57cec5SDimitry Andricdef BPF_ALU   : BPFOpClass<0x4>;
180b57cec5SDimitry Andricdef BPF_JMP   : BPFOpClass<0x5>;
190b57cec5SDimitry Andricdef BPF_JMP32 : BPFOpClass<0x6>;
200b57cec5SDimitry Andricdef BPF_ALU64 : BPFOpClass<0x7>;
210b57cec5SDimitry Andric
220b57cec5SDimitry Andricclass BPFSrcType<bits<1> val> {
230b57cec5SDimitry Andric  bits<1> Value = val;
240b57cec5SDimitry Andric}
250b57cec5SDimitry Andric
260b57cec5SDimitry Andricdef BPF_K : BPFSrcType<0x0>;
270b57cec5SDimitry Andricdef BPF_X : BPFSrcType<0x1>;
280b57cec5SDimitry Andric
290b57cec5SDimitry Andricclass BPFArithOp<bits<4> val> {
300b57cec5SDimitry Andric  bits<4> Value = val;
310b57cec5SDimitry Andric}
320b57cec5SDimitry Andric
330b57cec5SDimitry Andricdef BPF_ADD  : BPFArithOp<0x0>;
340b57cec5SDimitry Andricdef BPF_SUB  : BPFArithOp<0x1>;
350b57cec5SDimitry Andricdef BPF_MUL  : BPFArithOp<0x2>;
360b57cec5SDimitry Andricdef BPF_DIV  : BPFArithOp<0x3>;
370b57cec5SDimitry Andricdef BPF_OR   : BPFArithOp<0x4>;
380b57cec5SDimitry Andricdef BPF_AND  : BPFArithOp<0x5>;
390b57cec5SDimitry Andricdef BPF_LSH  : BPFArithOp<0x6>;
400b57cec5SDimitry Andricdef BPF_RSH  : BPFArithOp<0x7>;
410b57cec5SDimitry Andricdef BPF_NEG  : BPFArithOp<0x8>;
4281ad6265SDimitry Andricdef BPF_MOD  : BPFArithOp<0x9>;
430b57cec5SDimitry Andricdef BPF_XOR  : BPFArithOp<0xa>;
440b57cec5SDimitry Andricdef BPF_MOV  : BPFArithOp<0xb>;
450b57cec5SDimitry Andricdef BPF_ARSH : BPFArithOp<0xc>;
460b57cec5SDimitry Andricdef BPF_END  : BPFArithOp<0xd>;
470b57cec5SDimitry Andric
48e8d8bef9SDimitry Andricdef BPF_XCHG    : BPFArithOp<0xe>;
49e8d8bef9SDimitry Andricdef BPF_CMPXCHG : BPFArithOp<0xf>;
50e8d8bef9SDimitry Andric
510b57cec5SDimitry Andricclass BPFEndDir<bits<1> val> {
520b57cec5SDimitry Andric  bits<1> Value = val;
530b57cec5SDimitry Andric}
540b57cec5SDimitry Andric
550b57cec5SDimitry Andricdef BPF_TO_LE : BPFSrcType<0x0>;
560b57cec5SDimitry Andricdef BPF_TO_BE : BPFSrcType<0x1>;
570b57cec5SDimitry Andric
580b57cec5SDimitry Andricclass BPFJumpOp<bits<4> val> {
590b57cec5SDimitry Andric  bits<4> Value = val;
600b57cec5SDimitry Andric}
610b57cec5SDimitry Andric
620b57cec5SDimitry Andricdef BPF_JA   : BPFJumpOp<0x0>;
630b57cec5SDimitry Andricdef BPF_JEQ  : BPFJumpOp<0x1>;
640b57cec5SDimitry Andricdef BPF_JGT  : BPFJumpOp<0x2>;
650b57cec5SDimitry Andricdef BPF_JGE  : BPFJumpOp<0x3>;
665f757f3fSDimitry Andricdef BPF_JSET : BPFJumpOp<0x4>;
670b57cec5SDimitry Andricdef BPF_JNE  : BPFJumpOp<0x5>;
680b57cec5SDimitry Andricdef BPF_JSGT : BPFJumpOp<0x6>;
690b57cec5SDimitry Andricdef BPF_JSGE : BPFJumpOp<0x7>;
700b57cec5SDimitry Andricdef BPF_CALL : BPFJumpOp<0x8>;
710b57cec5SDimitry Andricdef BPF_EXIT : BPFJumpOp<0x9>;
720b57cec5SDimitry Andricdef BPF_JLT  : BPFJumpOp<0xa>;
730b57cec5SDimitry Andricdef BPF_JLE  : BPFJumpOp<0xb>;
740b57cec5SDimitry Andricdef BPF_JSLT : BPFJumpOp<0xc>;
750b57cec5SDimitry Andricdef BPF_JSLE : BPFJumpOp<0xd>;
76*0fca6ea1SDimitry Andricdef BPF_JCOND : BPFJumpOp<0xe>;
770b57cec5SDimitry Andric
780b57cec5SDimitry Andricclass BPFWidthModifer<bits<2> val> {
790b57cec5SDimitry Andric  bits<2> Value = val;
800b57cec5SDimitry Andric}
810b57cec5SDimitry Andric
820b57cec5SDimitry Andricdef BPF_W  : BPFWidthModifer<0x0>;
830b57cec5SDimitry Andricdef BPF_H  : BPFWidthModifer<0x1>;
840b57cec5SDimitry Andricdef BPF_B  : BPFWidthModifer<0x2>;
850b57cec5SDimitry Andricdef BPF_DW : BPFWidthModifer<0x3>;
860b57cec5SDimitry Andric
870b57cec5SDimitry Andricclass BPFModeModifer<bits<3> val> {
880b57cec5SDimitry Andric  bits<3> Value = val;
890b57cec5SDimitry Andric}
900b57cec5SDimitry Andric
910b57cec5SDimitry Andricdef BPF_IMM  : BPFModeModifer<0x0>;
920b57cec5SDimitry Andricdef BPF_ABS  : BPFModeModifer<0x1>;
930b57cec5SDimitry Andricdef BPF_IND  : BPFModeModifer<0x2>;
940b57cec5SDimitry Andricdef BPF_MEM  : BPFModeModifer<0x3>;
955f757f3fSDimitry Andricdef BPF_MEMSX  : BPFModeModifer<0x4>;
96e8d8bef9SDimitry Andricdef BPF_ATOMIC : BPFModeModifer<0x6>;
97e8d8bef9SDimitry Andric
98e8d8bef9SDimitry Andricclass BPFAtomicFlag<bits<4> val> {
99e8d8bef9SDimitry Andric  bits<4> Value = val;
100e8d8bef9SDimitry Andric}
101e8d8bef9SDimitry Andric
102e8d8bef9SDimitry Andricdef BPF_FETCH : BPFAtomicFlag<0x1>;
1030b57cec5SDimitry Andric
1040b57cec5SDimitry Andricclass InstBPF<dag outs, dag ins, string asmstr, list<dag> pattern>
1050b57cec5SDimitry Andric  : Instruction {
1060b57cec5SDimitry Andric  field bits<64> Inst;
1070b57cec5SDimitry Andric  field bits<64> SoftFail = 0;
1080b57cec5SDimitry Andric  let Size = 8;
1090b57cec5SDimitry Andric
1100b57cec5SDimitry Andric  let Namespace = "BPF";
1110b57cec5SDimitry Andric  let DecoderNamespace = "BPF";
1120b57cec5SDimitry Andric
1130b57cec5SDimitry Andric  BPFOpClass BPFClass;
1140b57cec5SDimitry Andric  let Inst{58-56} = BPFClass.Value;
1150b57cec5SDimitry Andric
1160b57cec5SDimitry Andric  dag OutOperandList = outs;
1170b57cec5SDimitry Andric  dag InOperandList = ins;
1180b57cec5SDimitry Andric  let AsmString = asmstr;
1190b57cec5SDimitry Andric  let Pattern = pattern;
1200b57cec5SDimitry Andric}
1210b57cec5SDimitry Andric
1220b57cec5SDimitry Andric// Pseudo instructions
1230b57cec5SDimitry Andricclass Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern>
1240b57cec5SDimitry Andric  : InstBPF<outs, ins, asmstr, pattern> {
1250b57cec5SDimitry Andric  let Inst{63-0} = 0;
1260b57cec5SDimitry Andric  let isPseudo = 1;
1270b57cec5SDimitry Andric}
128