]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb/record: add support for more AVX broadcast instructions
authorGuinevere Larsen <guinevere@redhat.com>
Wed, 11 Jun 2025 19:09:28 +0000 (16:09 -0300)
committerGuinevere Larsen <guinevere@redhat.com>
Fri, 11 Jul 2025 14:55:34 +0000 (11:55 -0300)
This commit adds support for 3 instructions:
* VBROADCASTSS
* VBROADCASTSD
* VBROADCASTF128

and extends the function vpbroadcast_test to include these.

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

index ab9ed2f13a3436727141b7f477893d3f57818306..31a113a729a31f4dbee333a7903e3c91adb4a732 100644 (file)
@@ -4994,6 +4994,14 @@ i386_record_vex (struct i386_record_s *ir, uint8_t vex_w, uint8_t vex_r,
        }
       break;
 
+    case 0x19: /* VBROADCASTSD.  */
+      i386_record_modrm (ir);
+      record_full_arch_list_add_reg (ir->regcache,
+                                    tdep->ymm0_regnum + ir->reg
+                                    + 8 * vex_r);
+      break;
+
+    case 0x18: /* VBROADCASTSS.  */
     case 0x60: /* VPUNPCKLBW  */
     case 0x61: /* VPUNPCKLWD  */
     case 0x62: /* VPUNPCKLDQ  */
@@ -5038,6 +5046,7 @@ i386_record_vex (struct i386_record_s *ir, uint8_t vex_w, uint8_t vex_r,
     case 0x0c: /* VPERMILPS with register.  */
     case 0x0d: /* VPERMILPD with register.  */
     case 0x16: /* VPERMPS.  */
+    case 0x1a: /* VBROADCASTF128.  */
     case 0x36: /* VPERMD.  */
     case 0x40: /* VPMULLD  */
     case 0x46: /* VPERM2I128.  */
index 5e0e1a14d74cf137a134a7c6a9c0b8d5231f1e3b..8b3f7077e457f16b30d64842bf8b968937a62e4c 100644 (file)
@@ -245,7 +245,7 @@ vpunpck_test  ()
   return 0; /* end vpunpck_test */
 }
 
-/* Test if we can record vpbroadcast instructions.  */
+/* Test if we can record vpbroadcast and vbroadcast instructions.  */
 int
 vpbroadcast_test ()
 {
@@ -268,6 +268,14 @@ vpbroadcast_test ()
   asm volatile ("vpbroadcastq %xmm1, %ymm0");
   asm volatile ("vpbroadcastq %xmm1, %ymm15");
 
+  asm volatile ("vbroadcastss %xmm1, %xmm0");
+  asm volatile ("vbroadcastss %xmm1, %ymm15");
+  asm volatile ("vbroadcastss %0, %%ymm0" : : "m" (global_buf0));
+  asm volatile ("vbroadcastss %0, %%xmm15": : "m" (dyn_buf0));
+  asm volatile ("vbroadcastsd %xmm1, %ymm0");
+  asm volatile ("vbroadcastsd %0, %%ymm15": : "m" (global_buf0));
+  asm volatile ("vbroadcastf128 %0, %%ymm0" : : "m" (dyn_buf0));
+
   /* We have a return statement to deal with
      epilogue in different compilers.  */
   return 0; /* end vpbroadcast_test */
index 0a5681385574a31d47278aa1cdad5b5392753199..ae13a6e86e64aea807676c5bae5662871c3e1e2a 100644 (file)
@@ -365,6 +365,24 @@ gdb_test_no_output "set \$xmm1.v2_int64 = {0x1716151413121110, 0x1f1e1d1c1b1a191
     "set xmm1 for vpbroadcast"
 gdb_test_no_output "set \$ymm15.v2_int128 = {0x0, 0x0}" "set xmm15 for vpbroadcast"
 if {[record_full_function "vpbroadcast"] == true} {
+    test_one_register "vbroadcastf128" "ymm0" \
+       "0x17161514131211101716151413121110, 0x17161514131211101716151413121110"
+    test_one_register "vbroadcastsd" "ymm15" \
+       "0x404060004040600040406000404060, 0x0"
+    test_one_register "vbroadcastsd" "ymm0" \
+       "0x13121110131211101312111013121110, 0x13121110131211101312111013121110"
+
+    test_one_register "vbroadcastss" "ymm15" \
+       "0x13121110131211101312111013121110, 0x13121110131211101312111013121110" \
+       "broadcast from memory"
+    test_one_register "vbroadcastss" "ymm0" \
+       "0x13121110131211101312111013121110, 0x0" \
+       "broadcast from memory"
+    test_one_register "vbroadcastss" "ymm15" \
+       "0x17161514131211101716151413121110, 0x17161514131211101716151413121110"
+    test_one_register "vbroadcastss" "ymm0" \
+       "0x17161514131211101716151413121110, 0x17161514131211101716151413121110"
+
     test_one_register "vpbroadcastq" "ymm15" "0x13121110131211101312111013121110, 0x0"
     test_one_register "vpbroadcastq" "ymm0"  "0x13121110131211101312111013121110, 0x0"