From: Guinevere Larsen Date: Fri, 1 Nov 2024 16:30:49 +0000 (-0300) Subject: gdb/record: add support for vpxor instruction X-Git-Tag: gdb-16-branchpoint~350 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2bb2f15e0b923885c648c41df4545bb50b3f65da;p=thirdparty%2Fbinutils-gdb.git 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 --- diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index 6a919bf6473..38b1e7a1f02 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 edd931b9f8c..9bdc365ed86 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 7ed12937391..c4a54211592 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"