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