diff options
author | Guinevere Larsen <guinevere@redhat.com> | 2024-11-01 13:30:49 -0300 |
---|---|---|
committer | Guinevere Larsen <guinevere@redhat.com> | 2024-11-22 17:40:25 -0300 |
commit | 2bb2f15e0b923885c648c41df4545bb50b3f65da (patch) | |
tree | 39a5162b0c2d87387d4d307133f66c869441f0eb /gdb | |
parent | 3cfa137ca5327c759fd192ad1f0fdc981bf05b82 (diff) | |
download | binutils-2bb2f15e0b923885c648c41df4545bb50b3f65da.zip binutils-2bb2f15e0b923885c648c41df4545bb50b3f65da.tar.gz binutils-2bb2f15e0b923885c648c41df4545bb50b3f65da.tar.bz2 |
gdb/record: add support for vpxor instruction
This commit adds support for recording the instruction vpxor,
introduced in the AVX extension, and extended in AVX2 to use 256 bit
registers. The test gdb.reverse/i386-avx-reverse.exp has been extended
to test this instruction as well.
Approved-By: Tom Tromey <tom@tromey.com>
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/i386-tdep.c | 9 | ||||
-rw-r--r-- | gdb/testsuite/gdb.reverse/i386-avx-reverse.c | 20 | ||||
-rw-r--r-- | gdb/testsuite/gdb.reverse/i386-avx-reverse.exp | 25 |
3 files changed, 54 insertions, 0 deletions
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index 6a919bf..38b1e7a 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -4981,6 +4981,15 @@ i386_record_vex (struct i386_record_s *ir, uint8_t vex_w, uint8_t vex_r, break; } + case 0xef: + { + i386_record_modrm (ir); + int reg_offset = ir->reg + vex_r * 8; + 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 edd931b..9bdc365 100644 --- a/gdb/testsuite/gdb.reverse/i386-avx-reverse.c +++ b/gdb/testsuite/gdb.reverse/i386-avx-reverse.c @@ -210,6 +210,25 @@ vzeroupper_test () return 0; /* end vzeroupper_test */ } +int +vpxor_test () +{ + /* start vpxor_test. */ + /* Using GDB, load this value onto the register, for ease of testing. + ymm0.v2_int128 = {0x0, 0x12345} + ymm1.v2_int128 = {0x1f1e1d1c1b1a1918, 0x0} + ymm2.v2_int128 = {0x0, 0xbeef} + ymm15.v2_int128 = {0x0, 0xcafeface} + this way it's easy to confirm we're undoing things correctly. */ + + asm volatile ("vpxor %ymm0, %ymm0, %ymm0"); + asm volatile ("vpxor %xmm0, %xmm1, %xmm0"); + asm volatile ("vpxor %ymm2, %ymm15, %ymm1"); + asm volatile ("vpxor %xmm2, %xmm15, %xmm2"); + asm volatile ("vpxor %ymm2, %ymm1, %ymm15"); + return 0; /* end vpxor_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. */ @@ -235,5 +254,6 @@ main () vpunpck_test (); vpbroadcast_test (); vzeroupper_test (); + vpxor_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 7ed1293..c4a5421 100644 --- a/gdb/testsuite/gdb.reverse/i386-avx-reverse.exp +++ b/gdb/testsuite/gdb.reverse/i386-avx-reverse.exp @@ -327,9 +327,34 @@ if {[record_full_function "vzeroupper"] == true} { "Register ymm15h changed: 3405707982" \ "Register rip changed: \[^\r\n\]+" ] \ "verify vzeroupper recording" + + gdb_test "record stop" "Process record is stopped.*" \ + "delete history for vzeroupper_test" } else { untested "couldn't run vzeroupper tests" } gdb_test "finish" "Run till exit from.*vzeroupper_test.*" \ "leaving vzeroupper" + +# Preparation and testing vpxor instructions. +gdb_test_no_output "set \$ymm0.v2_int128 = {0x0, 0x12345}" "set ymm0 for vpxor" +gdb_test_no_output "set \$ymm1.v2_int128 = {0x1f1e1d1c1b1a1918, 0x0}" \ + "set ymm1 for vpxor" +gdb_test_no_output "set \$ymm2.v2_int128 = {0x0, 0xbeef}" "set ymm2 for vpxor" +gdb_test_no_output "set \$ymm15.v2_int128 = {0x0, 0xcafeface}" "set ymm15 for vpxor" + +if {[record_full_function "vpxor"] == true} { + test_one_register "vpxor" "ymm15" "0x0, 0xcafeface" + test_one_register "vpxor" "ymm2" "0x0, 0xbeef" + test_one_register "vpxor" "ymm1" "0x1f1e1d1c1b1a1918, 0x0" + test_one_register "vpxor" "ymm0" "0x0, 0x0" "first" + test_one_register "vpxor" "ymm0" "0x0, 0x12345" "second" + + gdb_test "record stop" "Process record is stopped.*" \ + "delete history for vpxor_test" +} else { + untested "couldn't run vpxor tests" +} +gdb_test "finish" "Run till exit from.*vpxor_test.*" \ + "leaving vpxor" |