aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/i386-tdep.c10
-rw-r--r--gdb/testsuite/gdb.reverse/i386-avx-reverse.c56
-rw-r--r--gdb/testsuite/gdb.reverse/i386-avx-reverse.exp105
3 files changed, 169 insertions, 2 deletions
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index 4412397..5f585b2 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -5003,9 +5003,15 @@ i386_record_vex (struct i386_record_s *ir, uint8_t vex_w, uint8_t vex_r,
case 0x78: /* VPBROADCASTB */
case 0x79: /* VPBROADCASTW */
- case 0x58: /* VPBROADCASTD */
- case 0x59: /* VPBROADCASTQ */
+ case 0x58: /* VPBROADCASTD and VADD[P|S][S|D] */
+ case 0x59: /* VPBROADCASTQ and VMUL[P|S][S|D] */
+ case 0x5c: /* VSUB[P|S][S|D] */
+ case 0x5d: /* VMIN[P|S][S|D] */
+ case 0x5e: /* VDIV[P|S][S|D] */
+ case 0x5f: /* VMAX[P|S][S|D] */
{
+ /* vpbroadcast and arithmethic operations are differentiated
+ by map_select, but it doesn't change the recording mechanics. */
i386_record_modrm (ir);
int reg_offset = ir->reg + vex_r * 8;
gdb_assert (tdep->num_ymm_regs > reg_offset);
diff --git a/gdb/testsuite/gdb.reverse/i386-avx-reverse.c b/gdb/testsuite/gdb.reverse/i386-avx-reverse.c
index f41c7ff..0c26bcd 100644
--- a/gdb/testsuite/gdb.reverse/i386-avx-reverse.c
+++ b/gdb/testsuite/gdb.reverse/i386-avx-reverse.c
@@ -364,6 +364,61 @@ vpmovmskb_test ()
return 0; /* end vpmovmskb_test */
}
+/* Test record arithmetic instructions. */
+int
+arith_test ()
+{
+ /* start arith_test. */
+ /* Using GDB, load these values onto registers for testing.
+ ymm0.v8_float = {0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5}
+ ymm1.v8_float = {0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5}
+ ymm15.v2_int128 = {0x0, 0x0}
+ this way it's easy to confirm we're undoing things correctly. */
+ asm volatile ("vaddps %xmm0, %xmm1, %xmm15");
+ asm volatile ("vaddps %ymm0, %ymm1, %ymm15");
+ asm volatile ("vaddpd %xmm0, %xmm1, %xmm15");
+ asm volatile ("vaddpd %ymm0, %ymm1, %ymm15");
+ asm volatile ("vaddss %xmm0, %xmm1, %xmm15");
+ asm volatile ("vaddsd %xmm0, %xmm1, %xmm15");
+
+ asm volatile ("vmulps %xmm0, %xmm1, %xmm15");
+ asm volatile ("vmulps %ymm0, %ymm1, %ymm15");
+ asm volatile ("vmulpd %xmm0, %xmm1, %xmm15");
+ asm volatile ("vmulpd %ymm0, %ymm1, %ymm15");
+ asm volatile ("vmulss %xmm0, %xmm1, %xmm15");
+ asm volatile ("vmulsd %xmm0, %xmm1, %xmm15");
+
+ asm volatile ("vsubps %xmm0, %xmm1, %xmm15");
+ asm volatile ("vsubps %ymm0, %ymm1, %ymm15");
+ asm volatile ("vsubpd %xmm0, %xmm1, %xmm15");
+ asm volatile ("vsubpd %ymm0, %ymm1, %ymm15");
+ asm volatile ("vsubss %xmm0, %xmm1, %xmm15");
+ asm volatile ("vsubsd %xmm0, %xmm1, %xmm15");
+
+ asm volatile ("vdivps %xmm0, %xmm1, %xmm15");
+ asm volatile ("vdivps %ymm0, %ymm1, %ymm15");
+ asm volatile ("vdivpd %xmm0, %xmm1, %xmm15");
+ asm volatile ("vdivpd %ymm0, %ymm1, %ymm15");
+ asm volatile ("vdivss %xmm0, %xmm1, %xmm15");
+ asm volatile ("vdivsd %xmm0, %xmm1, %xmm15");
+
+ asm volatile ("vminps %xmm0, %xmm1, %xmm15");
+ asm volatile ("vminps %ymm0, %ymm1, %ymm15");
+ asm volatile ("vminpd %xmm0, %xmm1, %xmm15");
+ asm volatile ("vminpd %ymm0, %ymm1, %ymm15");
+ asm volatile ("vminss %xmm0, %xmm1, %xmm15");
+ asm volatile ("vminsd %xmm0, %xmm1, %xmm15");
+
+ asm volatile ("vmaxps %xmm0, %xmm1, %xmm15");
+ asm volatile ("vmaxps %ymm0, %ymm1, %ymm15");
+ asm volatile ("vmaxpd %xmm0, %xmm1, %xmm15");
+ asm volatile ("vmaxpd %ymm0, %ymm1, %ymm15");
+ asm volatile ("vmaxss %xmm0, %xmm1, %xmm15");
+ asm volatile ("vmaxsd %xmm0, %xmm1, %xmm15");
+
+ return 0; /* end arith_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. */
@@ -392,5 +447,6 @@ main ()
vpor_xor_test ();
vpcmpeq_test ();
vpmovmskb_test ();
+ arith_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 e3d1bbb..11532af 100644
--- a/gdb/testsuite/gdb.reverse/i386-avx-reverse.exp
+++ b/gdb/testsuite/gdb.reverse/i386-avx-reverse.exp
@@ -517,3 +517,108 @@ if {[record_full_function "vpmovmskb"] == true} {
}
gdb_test "finish" "Run till exit from.*vpmovmskb_test.*" \
"leaving vpmovmskb"
+
+# Preparation and testing arithmetic instructions.
+gdb_test_no_output \
+ "set \$ymm0.v8_float = {0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5}"
+gdb_test_no_output \
+ "set \$ymm1.v8_float = {0, 1, 2, 3, 4, 5, 6, 7}"
+gdb_test_no_output "set \$ymm15.v2_int128 = {0,0}"
+
+if {[record_full_function "arith"] == true} {
+ test_one_register "vmaxsd" "ymm15" \
+ "0x40400000400000003f8000003f000000, 0x0" "ymm operation: "
+ test_one_register "vmaxss" "ymm15" \
+ "0x40600000402000003fc000003f000000, 0x40f0000040d0000040b0000040900000" \
+ "xmm operation: "
+ test_one_register "vmaxpd" "ymm15" \
+ "0x40600000402000003fc000003f000000, 0x0" "ymm operation: "
+ test_one_register "vmaxpd" "ymm15" \
+ "0x40600000402000003fc000003f000000, 0x40f0000040d0000040b0000040900000" \
+ "xmm operation: "
+ test_one_register "vmaxps" "ymm15" \
+ "0x40600000402000003fc000003f000000, 0x0" "ymm operation: "
+ test_one_register "vmaxps" "ymm15" \
+ "0x40400000400000003f80000000000000, 0x0" "xmm operation: "
+
+ test_one_register "vminsd" "ymm15" \
+ "0x40400000400000003f80000000000000, 0x0" "ymm operation: "
+ test_one_register "vminss" "ymm15" \
+ "0x40400000400000003f80000000000000, 0x40e0000040c0000040a0000040800000" \
+ "xmm operation: "
+ test_one_register "vminpd" "ymm15" \
+ "0x40400000400000003f80000000000000, 0x0" "ymm operation: "
+ test_one_register "vminpd" "ymm15" \
+ "0x40400000400000003f80000000000000, 0x40e0000040c0000040a0000040800000" \
+ "xmm operation: "
+ test_one_register "vminps" "ymm15" \
+ "0x40400000400000003f80000000000000, 0x0" "ymm operation: "
+ test_one_register "vminps" "ymm15" \
+ "0x40400000400000003fafffff820001f0, 0x0" "xmm operation: "
+
+ test_one_register "vdivsd" "ymm15" \
+ "0x40400000400000003f80000000000000, 0x0" "ymm operation: "
+ test_one_register "vdivss" "ymm15" \
+ "0x3fcfffffffc000013fafffff820001f0, 0x3fdfffffffe000013fdfffffffe00001" \
+ "xmm operation: "
+ test_one_register "vdivpd" "ymm15" \
+ "0x3fcfffffffc000013fafffff820001f0, 0x0" "ymm operation: "
+ test_one_register "vdivpd" "ymm15" \
+ "0x3f5b6db73f4ccccd3f2aaaab00000000, 0x3f6eeeef3f6c4ec53f68ba2f3f638e39" \
+ "xmm operation: "
+ test_one_register "vdivps" "ymm15" \
+ "0x3f5b6db73f4ccccd3f2aaaab00000000, 0x0" "ymm operation: "
+ test_one_register "vdivps" "ymm15" \
+ "0x4040000040000000bfbe00007e000000, 0x0" "xmm operation: "
+
+ test_one_register "vsubsd" "ymm15" \
+ "0x40400000400000003f800000bf000000, 0x0" "ymm operation: "
+ test_one_register "vsubss" "ymm15" \
+ "0xc058000060400000bfbe00007e000000, 0xc0e0000040e00000c0a0000040a00000" \
+ "xmm operation: "
+ test_one_register "vsubpd" "ymm15" \
+ "0xc058000060400000bfbe00007e000000, 0x0" "ymm operation: "
+ test_one_register "vsubpd" "ymm15" \
+ "0xbf000000bf000000bf000000bf000000, 0xbf000000bf000000bf000000bf000000" \
+ "xmm operation: "
+ test_one_register "vsubps" "ymm15" \
+ "0xbf000000bf000000bf000000bf000000, 0x0" "ymm operation: "
+ test_one_register "vsubps" "ymm15" \
+ "0x40400000400000003f5000003f000000, 0x0" "xmm operation: "
+
+ test_one_register "vmulsd" "ymm15" \
+ "0x40400000400000003f80000000000000, 0x0" "ymm operation: "
+ test_one_register "vmulss" "ymm15" \
+ "0x40b00000802001003f5000003f000000, 0x41e00000819001064160000081100104" \
+ "xmm operation: "
+ test_one_register "vmulpd" "ymm15" \
+ "0x40b00000802001003f5000003f000000, 0x0" "ymm operation: "
+ test_one_register "vmulpd" "ymm15" \
+ "0x4128000040a000003fc0000000000000, 0x42520000421c000041dc000041900000" \
+ "xmm operation: "
+ test_one_register "vmulps" "ymm15" \
+ "0x4128000040a000003fc0000000000000, 0x0" "ymm operation: "
+ test_one_register "vmulps" "ymm15" \
+ "0x40400000400000003fc100003f000000, 0x0" "xmm operation: "
+
+ test_one_register "vaddsd" "ymm15" \
+ "0x40400000400000003f8000003f000000, 0x0" "ymm operation: "
+ test_one_register "vaddss" "ymm15" \
+ "0x40640000502000003fc100003f000000, 0x40f800006130000040b8000060d00000" \
+ "xmm operation: "
+ test_one_register "vaddpd" "ymm15" \
+ "0x40640000502000003fc100003f000000, 0x0" "ymm operation: "
+ test_one_register "vaddpd" "ymm15" \
+ "0x40d0000040900000402000003f000000, 0x41680000414800004128000041080000" \
+ "xmm operation: "
+ test_one_register "vaddps" "ymm15" \
+ "0x40d0000040900000402000003f000000, 0x0" "ymm operation: "
+ test_one_register "vaddps" "ymm15" "0x0, 0x0" "xmm operation: "
+
+ gdb_test "record stop" "Process record is stopped.*" \
+ "delete history for arith_test"
+} else {
+ untested "couldn't run arith tests"
+}
+gdb_test "finish" "Run till exit from.*arith_test.*" \
+ "leaving arith"