aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuinevere Larsen <guinevere@redhat.com>2024-06-13 14:32:29 -0300
committerGuinevere Larsen <guinevere@redhat.com>2024-10-28 10:46:33 -0300
commit6be89caafe18735d02ffb7261ad41a329d8bd610 (patch)
tree1d607f84fa487d8bf37e3177e9d0d84a1d5c61e8
parent51de3d886cd75aaa9d87b17acbf17b9ff6b1029e (diff)
downloadgdb-6be89caafe18735d02ffb7261ad41a329d8bd610.zip
gdb-6be89caafe18735d02ffb7261ad41a329d8bd610.tar.gz
gdb-6be89caafe18735d02ffb7261ad41a329d8bd610.tar.bz2
gdb/record: Add recording support to vpbroadcast instructions
This commit adds recording support to all AVX and AVX2 instructions of the form vpbroadcast. GDB is not yet concerned about AVX512 in recording mode, so for now we only support the AVX2 registers and instructions. This commit also updates the gdb.reverse/i386-avx-reverse.exp to test broadcast instructions. Approved-By: Tom Tromey <tom@tromey.com>
-rw-r--r--gdb/i386-tdep.c13
-rw-r--r--gdb/testsuite/gdb.reverse/i386-avx-reverse.c29
-rw-r--r--gdb/testsuite/gdb.reverse/i386-avx-reverse.exp29
3 files changed, 71 insertions, 0 deletions
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index a0e0181..b9ac12e 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -4902,6 +4902,19 @@ i386_record_vex (struct i386_record_s *ir, uint8_t vex_w, uint8_t vex_r,
}
break;
+ case 0x78: /* VPBROADCASTB */
+ case 0x79: /* VPBROADCASTW */
+ case 0x58: /* VPBROADCASTD */
+ case 0x59: /* VPBROADCASTQ */
+ {
+ i386_record_modrm (ir);
+ int reg_offset = ir->reg + vex_r * 8;
+ gdb_assert (tdep->num_ymm_regs > reg_offset);
+ record_full_arch_list_add_reg (ir->regcache,
+ tdep->ymm0_regnum + reg_offset);
+ }
+ break;
+
default:
gdb_printf (gdb_stderr,
_("Process record does not support VEX instruction 0x%02x "
diff --git a/gdb/testsuite/gdb.reverse/i386-avx-reverse.c b/gdb/testsuite/gdb.reverse/i386-avx-reverse.c
index c897436..16303a4 100644
--- a/gdb/testsuite/gdb.reverse/i386-avx-reverse.c
+++ b/gdb/testsuite/gdb.reverse/i386-avx-reverse.c
@@ -130,6 +130,34 @@ vpunpck_test ()
return 0; /* end vpunpck_test */
}
+/* Test if we can record vpbroadcast instructions. */
+int
+vpbroadcast_test ()
+{
+ /* Using GDB, load this value onto the register, for ease of testing.
+ xmm0.uint128 = 0x0
+ xmm1.uint128 = 0x1f1e1d1c1b1a19181716151413121110
+ xmm15.uint128 = 0x0
+ this way it's easy to confirm we're undoing things correctly. */
+ /* start vpbroadcast_test. */
+
+ asm volatile ("vpbroadcastb %xmm1, %xmm0");
+ asm volatile ("vpbroadcastb %xmm1, %xmm15");
+
+ asm volatile ("vpbroadcastw %xmm1, %ymm0");
+ asm volatile ("vpbroadcastw %xmm1, %ymm15");
+
+ asm volatile ("vpbroadcastd %xmm1, %xmm0");
+ asm volatile ("vpbroadcastd %xmm1, %xmm15");
+
+ asm volatile ("vpbroadcastq %xmm1, %ymm0");
+ asm volatile ("vpbroadcastq %xmm1, %ymm15");
+
+ /* We have a return statement to deal with
+ epilogue in different compilers. */
+ return 0; /* end vpbroadcast_test */
+}
+
int
main ()
{
@@ -148,5 +176,6 @@ main ()
vmov_test ();
vpunpck_test ();
+ vpbroadcast_test ();
return 0; /* end of main */
}
diff --git a/gdb/testsuite/gdb.reverse/i386-avx-reverse.exp b/gdb/testsuite/gdb.reverse/i386-avx-reverse.exp
index 718dca3..75c313c 100644
--- a/gdb/testsuite/gdb.reverse/i386-avx-reverse.exp
+++ b/gdb/testsuite/gdb.reverse/i386-avx-reverse.exp
@@ -237,3 +237,32 @@ if {[record_full_function "vpunpck"] == true} {
gdb_test "record stop" "Process record is stopped.*" \
"delete history for vpunpck_test"
gdb_test "finish" "Run till exit from.*vpunpck_test.*" "leaving vpunpck_test"
+
+# Start vpbroadcast tests
+gdb_test_no_output "set \$ymm0.v2_int128 = {0x0, 0x0}" "set xmm0 for vpbroadcast"
+gdb_test_no_output "set \$xmm1.v2_int64 = {0x1716151413121110, 0x1f1e1d1c1b1a1918}" \
+ "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 "vpbroadcastq" "ymm15" "0x13121110131211101312111013121110, 0x0"
+ test_one_register "vpbroadcastq" "ymm0" "0x13121110131211101312111013121110, 0x0"
+
+ test_one_register "vpbroadcastd" "ymm15" \
+ "0x11101110111011101110111011101110, 0x11101110111011101110111011101110"
+ test_one_register "vpbroadcastd" "ymm0" \
+ "0x11101110111011101110111011101110, 0x11101110111011101110111011101110"
+
+ test_one_register "vpbroadcastw" "ymm15" "0x10101010101010101010101010101010, 0x0"
+ test_one_register "vpbroadcastw" "ymm0" "0x10101010101010101010101010101010, 0x0"
+
+ test_one_register "vpbroadcastb" "ymm15" "0x0, 0x0"
+ test_one_register "vpbroadcastb" "ymm0" "0x0, 0x0"
+
+ gdb_test "record stop" "Process record is stopped.*" \
+ "delete history for vpbroadcast_test"
+} else {
+ untested "couldn't run vpbroadcast tests"
+}
+
+gdb_test "finish" "Run till exit from.*vpbroadcast_test.*" \
+ "leaving vpbroadcast"