BPFInstrFormats.td 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. //===-- BPFInstrFormats.td - BPF Instruction Formats -------*- tablegen -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. class BPFOpClass<bits<3> val> {
  9. bits<3> Value = val;
  10. }
  11. def BPF_LD : BPFOpClass<0x0>;
  12. def BPF_LDX : BPFOpClass<0x1>;
  13. def BPF_ST : BPFOpClass<0x2>;
  14. def BPF_STX : BPFOpClass<0x3>;
  15. def BPF_ALU : BPFOpClass<0x4>;
  16. def BPF_JMP : BPFOpClass<0x5>;
  17. def BPF_JMP32 : BPFOpClass<0x6>;
  18. def BPF_ALU64 : BPFOpClass<0x7>;
  19. class BPFSrcType<bits<1> val> {
  20. bits<1> Value = val;
  21. }
  22. def BPF_K : BPFSrcType<0x0>;
  23. def BPF_X : BPFSrcType<0x1>;
  24. class BPFArithOp<bits<4> val> {
  25. bits<4> Value = val;
  26. }
  27. def BPF_ADD : BPFArithOp<0x0>;
  28. def BPF_SUB : BPFArithOp<0x1>;
  29. def BPF_MUL : BPFArithOp<0x2>;
  30. def BPF_DIV : BPFArithOp<0x3>;
  31. def BPF_OR : BPFArithOp<0x4>;
  32. def BPF_AND : BPFArithOp<0x5>;
  33. def BPF_LSH : BPFArithOp<0x6>;
  34. def BPF_RSH : BPFArithOp<0x7>;
  35. def BPF_NEG : BPFArithOp<0x8>;
  36. def BPF_XOR : BPFArithOp<0xa>;
  37. def BPF_MOV : BPFArithOp<0xb>;
  38. def BPF_ARSH : BPFArithOp<0xc>;
  39. def BPF_END : BPFArithOp<0xd>;
  40. def BPF_XCHG : BPFArithOp<0xe>;
  41. def BPF_CMPXCHG : BPFArithOp<0xf>;
  42. class BPFEndDir<bits<1> val> {
  43. bits<1> Value = val;
  44. }
  45. def BPF_TO_LE : BPFSrcType<0x0>;
  46. def BPF_TO_BE : BPFSrcType<0x1>;
  47. class BPFJumpOp<bits<4> val> {
  48. bits<4> Value = val;
  49. }
  50. def BPF_JA : BPFJumpOp<0x0>;
  51. def BPF_JEQ : BPFJumpOp<0x1>;
  52. def BPF_JGT : BPFJumpOp<0x2>;
  53. def BPF_JGE : BPFJumpOp<0x3>;
  54. def BPF_JNE : BPFJumpOp<0x5>;
  55. def BPF_JSGT : BPFJumpOp<0x6>;
  56. def BPF_JSGE : BPFJumpOp<0x7>;
  57. def BPF_CALL : BPFJumpOp<0x8>;
  58. def BPF_EXIT : BPFJumpOp<0x9>;
  59. def BPF_JLT : BPFJumpOp<0xa>;
  60. def BPF_JLE : BPFJumpOp<0xb>;
  61. def BPF_JSLT : BPFJumpOp<0xc>;
  62. def BPF_JSLE : BPFJumpOp<0xd>;
  63. class BPFWidthModifer<bits<2> val> {
  64. bits<2> Value = val;
  65. }
  66. def BPF_W : BPFWidthModifer<0x0>;
  67. def BPF_H : BPFWidthModifer<0x1>;
  68. def BPF_B : BPFWidthModifer<0x2>;
  69. def BPF_DW : BPFWidthModifer<0x3>;
  70. class BPFModeModifer<bits<3> val> {
  71. bits<3> Value = val;
  72. }
  73. def BPF_IMM : BPFModeModifer<0x0>;
  74. def BPF_ABS : BPFModeModifer<0x1>;
  75. def BPF_IND : BPFModeModifer<0x2>;
  76. def BPF_MEM : BPFModeModifer<0x3>;
  77. def BPF_ATOMIC : BPFModeModifer<0x6>;
  78. class BPFAtomicFlag<bits<4> val> {
  79. bits<4> Value = val;
  80. }
  81. def BPF_FETCH : BPFAtomicFlag<0x1>;
  82. class InstBPF<dag outs, dag ins, string asmstr, list<dag> pattern>
  83. : Instruction {
  84. field bits<64> Inst;
  85. field bits<64> SoftFail = 0;
  86. let Size = 8;
  87. let Namespace = "BPF";
  88. let DecoderNamespace = "BPF";
  89. BPFOpClass BPFClass;
  90. let Inst{58-56} = BPFClass.Value;
  91. dag OutOperandList = outs;
  92. dag InOperandList = ins;
  93. let AsmString = asmstr;
  94. let Pattern = pattern;
  95. }
  96. // Pseudo instructions
  97. class Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern>
  98. : InstBPF<outs, ins, asmstr, pattern> {
  99. let Inst{63-0} = 0;
  100. let isPseudo = 1;
  101. }