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