]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb/record: add support for 'pack' AVX instructions
authorGuinevere Larsen <guinevere@redhat.com>
Fri, 13 Jun 2025 16:47:11 +0000 (13:47 -0300)
committerGuinevere Larsen <guinevere@redhat.com>
Fri, 11 Jul 2025 14:55:34 +0000 (11:55 -0300)
This commit adds support for the following instructions VPACK[S|U]S[WB|DW] and associated tests.

gdb/i386-tdep.c
gdb/testsuite/gdb.reverse/i386-avx-reverse.c
gdb/testsuite/gdb.reverse/i386-avx-reverse.exp

index ecac5cd8aa34a5a6c34620078c1f87b10fb6909a..0fd5efd436d8c1a21bb0fefc90915d91c3451e93 100644 (file)
@@ -5118,6 +5118,7 @@ i386_record_vex (struct i386_record_s *ir, uint8_t vex_w, uint8_t vex_r,
     case 0x0d: /* VPERMILPD with register and VBLENDPD.  */
     case 0x0e: /* VPBLENDW.  */
     case 0x1a: /* VBROADCASTF128.  */
+    case 0x2b: /* VPACKUSDW.  */
     case 0x36: /* VPERMD.  */
     case 0x40: /* VPMULLD  */
     case 0x46: /* VPERM2I128.  */
@@ -5131,6 +5132,9 @@ i386_record_vex (struct i386_record_s *ir, uint8_t vex_w, uint8_t vex_r,
     case 0x5d: /* VMIN[P|S][S|D]  */
     case 0x5e: /* VDIV[P|S][S|D]  */
     case 0x5f: /* VMAX[P|S][S|D]  */
+    case 0x63: /* VPACKSSWB.  */
+    case 0X67: /* VPACKUSWB.  */
+    case 0x6b: /* VPACKSSDW.  */
     case 0x70: /* VPSHUF[B|D|HW|LW].  */
     case 0x78: /* VPBROADCASTB  */
     case 0x79: /* VPBROADCASTW  */
index 863f5b6a10295289e9ff1bbb712937406e76bc06..7ae6d83a6e906963aa3f47d3f1a24927d9dde6d4 100644 (file)
@@ -676,6 +676,29 @@ compare_test ()
   return 0; /* end compare_test  */
 }
 
+int
+pack_test ()
+{
+  /* start pack_test.  */
+  /* Using GDB, load these values onto registers for testing.
+     xmm0.v4_float = {0, 1.5, 2, 0}
+     xmm1.v4_float = {0, 1, 2.5, -1}
+     xmm2.v4_float = {0, 1, 2.5, -1}
+     xmm15.v4_float = {-1, -2, 10, 100}
+     this way it's easy to confirm we're undoing things correctly.  */
+
+  asm volatile ("vpacksswb %xmm1, %xmm2, %xmm0");
+  asm volatile ("vpacksswb %ymm1, %ymm2, %ymm15");
+  asm volatile ("vpackssdw %xmm1, %xmm2, %xmm15");
+  asm volatile ("vpackssdw %ymm1, %ymm2, %ymm0");
+  asm volatile ("vpackuswb %xmm1, %xmm2, %xmm0");
+  asm volatile ("vpackuswb %ymm1, %ymm2, %ymm15");
+  asm volatile ("vpackusdw %xmm1, %xmm2, %xmm15");
+  asm volatile ("vpackusdw %ymm1, %ymm2, %ymm0");
+
+  return 0; /* end pack_test  */
+}
+
 /* This include is used to allocate the dynamic buffer and have
    the pointers aligned to a 32-bit boundary, so we can test instructions
    that require aligned memory.  */
@@ -714,5 +737,6 @@ main ()
   extract_insert_test ();
   blend_test ();
   compare_test ();
+  pack_test ();
   return 0;    /* end of main */
 }
index f401aef34ab79e3424cdd2ba0009d6c40f6ed052..f8e8ad1ad46e70b9a6d558d7e346bd0286e52570 100644 (file)
@@ -1077,3 +1077,39 @@ if {[record_full_function "compare"] == true} {
 }
 gdb_test "finish" "Run till exit from.*compare_test.*" \
     "leaving compare"
+
+# Preparation and testing pack instructions.
+gdb_test_no_output \
+    "set \$ymm0.v2_int128 = {0, 0}" "set ymm0 for pack"
+gdb_test_no_output \
+    "set \$ymm1.v16_int16 = {0x1020, 0x1121, 0x1222, 0x1323, 0x1424, 0x1525, 0x1626, 0x1727, 0x1828, 0x1929, 0x1a2a, 0x1b2b, 0x1c2c, 0x1d2d, 0x1e2e, 0x1f2f}" \
+    "set ymm1 for pack"
+gdb_test_no_output \
+    "set \$ymm2.v16_int16 = {0x3040, 0x3141, 0x3242, 0x3343, 0x3444, 0x3545, 0x3646, 0x3747, 0x3848, 0x3949, 0x3a4a, 0x3b4b, 0x3c4c, 0x3d4d, 0x3e4e, 0x3f4f}" \
+    "set ymm2 for pack"
+gdb_test_no_output \
+    "set \$ymm15.v2_int128 = {0, 0}" "set ymm15 for pack"
+
+if {[record_full_function "pack"] == true} {
+    test_one_register "vpackusdw" "ymm0" \
+       "0xffffffffffffffffffffffffffffffff, 0x0"
+    test_one_register "vpackusdw" "ymm15" \
+       "0xffffffffffffffffffffffffffffffff, 0xffffffffffffffffffffffffffffffff"
+    test_one_register "vpackuswb" "ymm15" \
+       "0x7fff7fff7fff7fff7fff7fff7fff7fff, 0x0"
+    test_one_register "vpackuswb" "ymm0" \
+       "0x7fff7fff7fff7fff7fff7fff7fff7fff, 0x7fff7fff7fff7fff7fff7fff7fff7fff"
+    test_one_register "vpackssdw" "ymm0" \
+       "0x7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f, 0x0"
+    test_one_register "vpackssdw" "ymm15" \
+       "0x7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f, 0x7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f"
+    test_one_register "vpacksswb" "ymm15" "0x0, 0x0"
+    test_one_register "vpacksswb" "ymm0" "0x0, 0x0"
+
+    gdb_test "record stop" "Process record is stopped.*" \
+       "delete history for pack_test"
+} else {
+    untested "couldn't run pack tests"
+}
+gdb_test "finish" "Run till exit from.*pack_test.*" \
+    "leaving pack"