bpf: gas,include,opcode: add suppor for instructions BSWAP{16,32,64}
authorJose E. Marchesi <jose.marchesi@oracle.com>
Mon, 24 Jul 2023 00:54:06 +0000 (02:54 +0200)
committerJose E. Marchesi <jose.marchesi@oracle.com>
Mon, 24 Jul 2023 00:54:06 +0000 (02:54 +0200)
This patch adds support for the BPF V4 ISA byte swap instructions to
opcodes, assembler and disassembler.

Tested in bpf-unknown-none.

include/ChangeLog:

2023-07-24  Jose E. Marchesi  <jose.marchesi@oracle.com>

* opcode/bpf.h (BPF_IMM32_BSWAP16): Define.
(BPF_IMM32_BSWAP32): Likewise.
(BPF_IMM32_BSWAP64): Likewise.
(enum bpf_insn_id): New entries BPF_INSN_BSWAP{16,32,64}.

opcodes/ChangeLog:

2023-07-24  Jose E. Marchesi  <jose.marchesi@oracle.com>

* bpf-opc.c (bpf_opcodes): Add entries for the BSWAP*
instructions.

gas/ChangeLog:

2023-07-24  Jose E. Marchesi  <jose.marchesi@oracle.com>

* doc/c-bpf.texi (BPF Instructions): Document BSWAP* instructions.
* testsuite/gas/bpf/alu.s: Test BSWAP{16,32,64} instructions.
* testsuite/gas/bpf/alu.d: Likewise.
* testsuite/gas/bpf/alu-be.d: Likewise.
* testsuite/gas/bpf/alu-pseudoc.s: Likewise.
* testsuite/gas/bpf/alu-pseudoc.d: Likewise.
* testsuite/gas/bpf/alu-be-pseudoc.d: Likewise.

12 files changed:
gas/ChangeLog
gas/doc/c-bpf.texi
gas/testsuite/gas/bpf/alu-be-pseudoc.d
gas/testsuite/gas/bpf/alu-be.d
gas/testsuite/gas/bpf/alu-pseudoc.d
gas/testsuite/gas/bpf/alu-pseudoc.s
gas/testsuite/gas/bpf/alu.d
gas/testsuite/gas/bpf/alu.s
include/ChangeLog
include/opcode/bpf.h
opcodes/ChangeLog
opcodes/bpf-opc.c

index 5538cd236b3a0d8f55b6679336fc7bceb2f95530..ef87eea33b62990fb8200eb341763fd5ea430186 100644 (file)
@@ -1,3 +1,13 @@
+2023-07-24  Jose E. Marchesi  <jose.marchesi@oracle.com>
+
+       * doc/c-bpf.texi (BPF Instructions): Document BSWAP* instructions.
+       * testsuite/gas/bpf/alu.s: Test BSWAP{16,32,64} instructions.
+       * testsuite/gas/bpf/alu.d: Likewise.
+       * testsuite/gas/bpf/alu-be.d: Likewise.
+       * testsuite/gas/bpf/alu-pseudoc.s: Likewise.
+       * testsuite/gas/bpf/alu-pseudoc.d: Likewise.
+       * testsuite/gas/bpf/alu-be-pseudoc.d: Likewise.
+
 2023-07-24  Jose E. Marchesi  <jose.marchesi@oracle.com>
 
        * doc/c-bpf.texi (BPF Instructions): The pseudoc syntax for MOVS*
index be29d8d2a5659ca1aa3680f46644a9d3dcc6e704..4cb15616515c5f4b86c0e34989e7e41ce56bb268 100644 (file)
@@ -404,6 +404,26 @@ Convert the 16-bit, 32-bit or 64-bit value in @code{rd} to big-endian
 and store it back in @code{rd}.
 @end table
 
+@subsection Byte swap instructions
+
+@table @code
+@item bswap rd, 16
+@itemx rd = bswap16 rd
+Swap the least-significant 16-bit word in @code{rd} with the
+most-significant 16-bit word.
+
+@item bswap rd, 32
+@itemx rd = bswap32 rd
+Swap the least-significant 32-bit word in @code{rd} with the
+most-significant 32-bit word.
+
+@item bswap rd, 64
+@itemx rd = bswap64 rd
+Swap the least-significant 64-bit word in @code{rd} with the
+most-significant 64-bit word.
+@end table
+
+
 @subsection 64-bit load and pseudo maps
 
 @table @code
index 5eb7f39aebde9defa1b868b43887db66bb930c22..1d83eaccd1e9ff9cccea413cd5ee5a6d652ac577 100644 (file)
@@ -66,3 +66,6 @@ Disassembly of section .text:
  1b8:  bf 12 00 08 00 00 00 00         r1 = \(s8\) r2
  1c0:  bf 12 00 10 00 00 00 00         r1 = \(s16\) r2
  1c8:  bf 12 00 20 00 00 00 00         r1 = \(s32\) r2
+ 1d0:  d7 10 00 00 00 00 00 10         r1 = bswap16 r1
+ 1d8:  d7 20 00 00 00 00 00 20         r2 = bswap32 r2
+ 1e0:  d7 30 00 00 00 00 00 40         r3 = bswap64 r3
index a082c46af1cc3f9604781a82ebdfa66b9218b837..2911d8b044594f5645740c73d7fb436388164f9b 100644 (file)
@@ -66,3 +66,6 @@ Disassembly of section .text:
  1b8:  bf 12 00 08 00 00 00 00         movs %r1,%r2,8
  1c0:  bf 12 00 10 00 00 00 00         movs %r1,%r2,16
  1c8:  bf 12 00 20 00 00 00 00         movs %r1,%r2,32
+ 1d0:  d7 10 00 00 00 00 00 10         bswap %r1,16
+ 1d8:  d7 20 00 00 00 00 00 20         bswap %r2,32
+ 1e0:  d7 30 00 00 00 00 00 40         bswap %r3,64
index 586fc0937fd90e0a81aaa0ae7395e0c8cdc6460d..bfc2493fdd48395887ee3248059523f797fbbf24 100644 (file)
@@ -66,3 +66,6 @@ Disassembly of section .text:
  1b8:  bf 21 08 00 00 00 00 00         r1 = \(s8\) r2
  1c0:  bf 21 10 00 00 00 00 00         r1 = \(s16\) r2
  1c8:  bf 21 20 00 00 00 00 00         r1 = \(s32\) r2
+ 1d0:  d7 01 00 00 10 00 00 00         r1 = bswap16 r1
+ 1d8:  d7 02 00 00 20 00 00 00         r2 = bswap32 r2
+ 1e0:  d7 03 00 00 40 00 00 00         r3 = bswap64 r3
index 4a47ba6bd6448eee55e711a441a33ad45d75267d..172a93cb0ecbffb25125d93f30c6988b5fed766b 100644 (file)
@@ -58,3 +58,6 @@
         r1 = (s8) r2
         r1 = (s16) r2
         r1 = (s32) r2
+        r1 = bswap16 r1
+        r2 = bswap32 r2
+        r3 = bswap64 r3
index 409018ddf5577e7eb2f7a70265bbeebf4f46b451..65f328035364e63b169e43393c639837a9fda4e9 100644 (file)
@@ -66,3 +66,6 @@ Disassembly of section .text:
  1b8:  bf 21 08 00 00 00 00 00         movs %r1,%r2,8
  1c0:  bf 21 10 00 00 00 00 00         movs %r1,%r2,16
  1c8:  bf 21 20 00 00 00 00 00         movs %r1,%r2,32
+ 1d0:  d7 01 00 00 10 00 00 00         bswap %r1,16
+ 1d8:  d7 02 00 00 20 00 00 00         bswap %r2,32
+ 1e0:  d7 03 00 00 40 00 00 00         bswap %r3,64
index 6f8c30fff6803266830b60c4c04bfbb8de2ed8cd..3e8a3cf4001874516d743af52ec564b246c2aa32 100644 (file)
@@ -58,3 +58,6 @@
         movs    %r1,%r2,8
         movs    %r1,%r2,16
         movs    %r1,%r2,32
+        bswap   %r1, 16
+        bswap   %r2, 32
+        bswap   %r3, 64
index 8cad8e2ea7a1c8375ccc6dccb42e6fff385a938b..11c1c09306b97bb60852b10cac95d6f12beb4f04 100644 (file)
@@ -1,3 +1,10 @@
+2023-07-24  Jose E. Marchesi  <jose.marchesi@oracle.com>
+
+       * opcode/bpf.h (BPF_IMM32_BSWAP16): Define.
+       (BPF_IMM32_BSWAP32): Likewise.
+       (BPF_IMM32_BSWAP64): Likewise.
+       (enum bpf_insn_id): New entries BPF_INSN_BSWAP{16,32,64}.
+
 2023-07-24  Jose E. Marchesi  <jose.marchesi@oracle.com>
 
        * opcode/bpf.h (enum bpf_insn_id): Add entry BPF_INSN_JAL.
index dc1b6e7ae57eb8bbb215d5ce3b79f503e44c3c2f..ed344427f1b31c491e978d9daa97eadfa89a15a7 100644 (file)
@@ -140,6 +140,10 @@ typedef uint64_t bpf_insn_word;
 #define BPF_IMM32_END32 ((uint64_t)0x00000020)
 #define BPF_IMM32_END64 ((uint64_t)0x00000040)
 
+#define BPF_IMM32_BSWAP16 ((uint64_t)0x00000010)
+#define BPF_IMM32_BSWAP32 ((uint64_t)0x00000020)
+#define BPF_IMM32_BSWAP64 ((uint64_t)0x00000040)
+
 #define BPF_IMM32_AADD ((uint64_t)0x00000000)
 #define BPF_IMM32_AOR  ((uint64_t)0x00000040)
 #define BPF_IMM32_AAND ((uint64_t)0x00000050)
@@ -178,6 +182,8 @@ enum bpf_insn_id
   BPF_INSN_RSH32R, BPF_INSN_RSH32I, BPF_INSN_ARSH32R, BPF_INSN_ARSH32I,
   BPF_INSN_MOVS328R, BPF_INSN_MOVS3216R, BPF_INSN_MOVS3232R,
   BPF_INSN_MOV32R, BPF_INSN_MOV32I,
+  /* Byte swap instructions.  */
+  BPF_INSN_BSWAP16, BPF_INSN_BSWAP32, BPF_INSN_BSWAP64,
   /* Endianness conversion instructions.  */
   BPF_INSN_ENDLE16, BPF_INSN_ENDLE32, BPF_INSN_ENDLE64,
   BPF_INSN_ENDBE16, BPF_INSN_ENDBE32, BPF_INSN_ENDBE64,
index e3848151e28679a7628294bd1cbcc613e1c29513..973b17edc2be15e5c8c244653e58a44216a8660d 100644 (file)
@@ -1,3 +1,8 @@
+2023-07-24  Jose E. Marchesi  <jose.marchesi@oracle.com>
+
+       * bpf-opc.c (bpf_opcodes): Add entries for the BSWAP*
+       instructions.
+
 2023-07-24  Jose E. Marchesi  <jose.marchesi@oracle.com>
 
        * bpf-opc.c (bpf_opcodes): Fix pseudo-c syntax for MOVS* and LDXS*
index e2691eaad649639c1083b245c2a200bdd68266a2..00a21c6039ce256fb5a37c28bdf46a1261041730 100644 (file)
@@ -182,6 +182,14 @@ const struct bpf_opcode bpf_opcodes[] =
   {BPF_INSN_ENDBE64, "endbe%W%dr , 64", "%dr = be64%w%dr",
    BPF_V1, BPF_CODE|BPF_IMM32, BPF_CLASS_ALU|BPF_CODE_END|BPF_SRC_X|BPF_IMM32_END64},
 
+  /* Byte-swap instructions.  */
+  {BPF_INSN_BSWAP16, "bswap%W%dr , 16", "%dr%w=%wbswap16%w%dr",
+   BPF_V4, BPF_CODE|BPF_IMM32, BPF_CLASS_ALU64|BPF_CODE_END|BPF_SRC_K|BPF_IMM32_BSWAP16},
+  {BPF_INSN_BSWAP32, "bswap%W%dr , 32", "%dr%w=%wbswap32%w%dr",
+   BPF_V4, BPF_CODE|BPF_IMM32, BPF_CLASS_ALU64|BPF_CODE_END|BPF_SRC_K|BPF_IMM32_BSWAP32},
+  {BPF_INSN_BSWAP64, "bswap%W%dr , 64", "%dr%w=%wbswap64%w%dr",
+   BPF_V4, BPF_CODE|BPF_IMM32, BPF_CLASS_ALU64|BPF_CODE_END|BPF_SRC_K|BPF_IMM32_BSWAP64},
+
   /* 64-bit load instruction.  */
   {BPF_INSN_LDDW, "lddw%W%dr , %i64", "%dr = %i64%wll",
    BPF_V1, BPF_CODE, BPF_CLASS_LD|BPF_SIZE_DW|BPF_MODE_IMM},