You can subscribe to this list here.
| 2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
(122) |
Nov
(152) |
Dec
(69) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2003 |
Jan
(6) |
Feb
(25) |
Mar
(73) |
Apr
(82) |
May
(24) |
Jun
(25) |
Jul
(10) |
Aug
(11) |
Sep
(10) |
Oct
(54) |
Nov
(203) |
Dec
(182) |
| 2004 |
Jan
(307) |
Feb
(305) |
Mar
(430) |
Apr
(312) |
May
(187) |
Jun
(342) |
Jul
(487) |
Aug
(637) |
Sep
(336) |
Oct
(373) |
Nov
(441) |
Dec
(210) |
| 2005 |
Jan
(385) |
Feb
(480) |
Mar
(636) |
Apr
(544) |
May
(679) |
Jun
(625) |
Jul
(810) |
Aug
(838) |
Sep
(634) |
Oct
(521) |
Nov
(965) |
Dec
(543) |
| 2006 |
Jan
(494) |
Feb
(431) |
Mar
(546) |
Apr
(411) |
May
(406) |
Jun
(322) |
Jul
(256) |
Aug
(401) |
Sep
(345) |
Oct
(542) |
Nov
(308) |
Dec
(481) |
| 2007 |
Jan
(427) |
Feb
(326) |
Mar
(367) |
Apr
(255) |
May
(244) |
Jun
(204) |
Jul
(223) |
Aug
(231) |
Sep
(354) |
Oct
(374) |
Nov
(497) |
Dec
(362) |
| 2008 |
Jan
(322) |
Feb
(482) |
Mar
(658) |
Apr
(422) |
May
(476) |
Jun
(396) |
Jul
(455) |
Aug
(267) |
Sep
(280) |
Oct
(253) |
Nov
(232) |
Dec
(304) |
| 2009 |
Jan
(486) |
Feb
(470) |
Mar
(458) |
Apr
(423) |
May
(696) |
Jun
(461) |
Jul
(551) |
Aug
(575) |
Sep
(134) |
Oct
(110) |
Nov
(157) |
Dec
(102) |
| 2010 |
Jan
(226) |
Feb
(86) |
Mar
(147) |
Apr
(117) |
May
(107) |
Jun
(203) |
Jul
(193) |
Aug
(238) |
Sep
(300) |
Oct
(246) |
Nov
(23) |
Dec
(75) |
| 2011 |
Jan
(133) |
Feb
(195) |
Mar
(315) |
Apr
(200) |
May
(267) |
Jun
(293) |
Jul
(353) |
Aug
(237) |
Sep
(278) |
Oct
(611) |
Nov
(274) |
Dec
(260) |
| 2012 |
Jan
(303) |
Feb
(391) |
Mar
(417) |
Apr
(441) |
May
(488) |
Jun
(655) |
Jul
(590) |
Aug
(610) |
Sep
(526) |
Oct
(478) |
Nov
(359) |
Dec
(372) |
| 2013 |
Jan
(467) |
Feb
(226) |
Mar
(391) |
Apr
(281) |
May
(299) |
Jun
(252) |
Jul
(311) |
Aug
(352) |
Sep
(481) |
Oct
(571) |
Nov
(222) |
Dec
(231) |
| 2014 |
Jan
(185) |
Feb
(329) |
Mar
(245) |
Apr
(238) |
May
(281) |
Jun
(399) |
Jul
(382) |
Aug
(500) |
Sep
(579) |
Oct
(435) |
Nov
(487) |
Dec
(256) |
| 2015 |
Jan
(338) |
Feb
(357) |
Mar
(330) |
Apr
(294) |
May
(191) |
Jun
(108) |
Jul
(142) |
Aug
(261) |
Sep
(190) |
Oct
(54) |
Nov
(83) |
Dec
(22) |
| 2016 |
Jan
(49) |
Feb
(89) |
Mar
(33) |
Apr
(50) |
May
(27) |
Jun
(34) |
Jul
(53) |
Aug
(53) |
Sep
(98) |
Oct
(206) |
Nov
(93) |
Dec
(53) |
| 2017 |
Jan
(65) |
Feb
(82) |
Mar
(102) |
Apr
(86) |
May
(187) |
Jun
(67) |
Jul
(23) |
Aug
(93) |
Sep
(65) |
Oct
(45) |
Nov
(35) |
Dec
(17) |
| 2018 |
Jan
(26) |
Feb
(35) |
Mar
(38) |
Apr
(32) |
May
(8) |
Jun
(43) |
Jul
(27) |
Aug
(30) |
Sep
(43) |
Oct
(42) |
Nov
(38) |
Dec
(67) |
| 2019 |
Jan
(32) |
Feb
(37) |
Mar
(53) |
Apr
(64) |
May
(49) |
Jun
(18) |
Jul
(14) |
Aug
(53) |
Sep
(25) |
Oct
(30) |
Nov
(49) |
Dec
(31) |
| 2020 |
Jan
(87) |
Feb
(45) |
Mar
(37) |
Apr
(51) |
May
(99) |
Jun
(36) |
Jul
(11) |
Aug
(14) |
Sep
(20) |
Oct
(24) |
Nov
(40) |
Dec
(23) |
| 2021 |
Jan
(14) |
Feb
(53) |
Mar
(85) |
Apr
(15) |
May
(19) |
Jun
(3) |
Jul
(14) |
Aug
(1) |
Sep
(57) |
Oct
(73) |
Nov
(56) |
Dec
(22) |
| 2022 |
Jan
(3) |
Feb
(22) |
Mar
(6) |
Apr
(55) |
May
(46) |
Jun
(39) |
Jul
(15) |
Aug
(9) |
Sep
(11) |
Oct
(34) |
Nov
(20) |
Dec
(36) |
| 2023 |
Jan
(79) |
Feb
(41) |
Mar
(99) |
Apr
(169) |
May
(48) |
Jun
(16) |
Jul
(16) |
Aug
(57) |
Sep
(19) |
Oct
|
Nov
|
Dec
|
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
|
|
|
|
|
1
(4) |
2
(1) |
3
|
|
4
|
5
(6) |
6
|
7
(7) |
8
(2) |
9
(1) |
10
(2) |
|
11
(4) |
12
(1) |
13
(4) |
14
(5) |
15
(2) |
16
(5) |
17
(2) |
|
18
(3) |
19
(12) |
20
(10) |
21
(3) |
22
(7) |
23
(4) |
24
(5) |
|
25
(3) |
26
(2) |
27
(1) |
28
|
29
(1) |
30
(1) |
|
|
From: <sv...@va...> - 2016-09-19 22:12:11
|
Author: sewardj
Date: Mon Sep 19 23:12:05 2016
New Revision: 15969
Log:
Merge from trunk, r15968 (Add none/tests/ppc64/ppc64_helpers.h to noinst_HEADERS.)
Modified:
branches/VALGRIND_3_12_BRANCH/ (props changed)
branches/VALGRIND_3_12_BRANCH/none/tests/ppc64/Makefile.am
Modified: branches/VALGRIND_3_12_BRANCH/none/tests/ppc64/Makefile.am
==============================================================================
--- branches/VALGRIND_3_12_BRANCH/none/tests/ppc64/Makefile.am (original)
+++ branches/VALGRIND_3_12_BRANCH/none/tests/ppc64/Makefile.am Mon Sep 19 23:12:05 2016
@@ -3,6 +3,8 @@
dist_noinst_SCRIPTS = filter_stderr
+noinst_HEADERS = ppc64_helpers.h
+
EXTRA_DIST = \
jm-int.stderr.exp jm-int.stdout.exp jm-int.vgtest jm-int.stdout.exp-LE \
jm-fp.stderr.exp jm-fp.stdout.exp jm-fp.vgtest jm-fp.stdout.exp-LE jm-fp.stdout.exp-LE2 jm-fp.stdout.exp-BE2 \
|
|
From: <sv...@va...> - 2016-09-19 22:03:42
|
Author: mjw
Date: Mon Sep 19 23:03:34 2016
New Revision: 15968
Log:
Add none/tests/ppc64/ppc64_helpers.h to noinst_HEADERS.
Makes sure that the header file will be included in the dist tar.
Modified:
trunk/none/tests/ppc64/Makefile.am
Modified: trunk/none/tests/ppc64/Makefile.am
==============================================================================
--- trunk/none/tests/ppc64/Makefile.am (original)
+++ trunk/none/tests/ppc64/Makefile.am Mon Sep 19 23:03:34 2016
@@ -3,6 +3,8 @@
dist_noinst_SCRIPTS = filter_stderr
+noinst_HEADERS = ppc64_helpers.h
+
EXTRA_DIST = \
jm-int.stderr.exp jm-int.stdout.exp jm-int.vgtest jm-int.stdout.exp-LE \
jm-fp.stderr.exp jm-fp.stdout.exp jm-fp.vgtest jm-fp.stdout.exp-LE jm-fp.stdout.exp-LE2 jm-fp.stdout.exp-BE2 \
|
|
From: <sv...@va...> - 2016-09-19 19:34:13
|
Author: sewardj
Date: Mon Sep 19 20:34:07 2016
New Revision: 15967
Log:
Merge from trunk, r15966 (Add missing file for bug #358213 workaround)
Added:
branches/VALGRIND_3_12_BRANCH/helgrind/tests/bar_bad.stderr.exp-destroy-hang
- copied unchanged from r15966, trunk/helgrind/tests/bar_bad.stderr.exp-destroy-hang
Modified:
branches/VALGRIND_3_12_BRANCH/ (props changed)
|
|
From: <sv...@va...> - 2016-09-19 19:25:41
|
Author: mjw
Date: Mon Sep 19 20:25:33 2016
New Revision: 15966
Log:
Add missing file for bug #358213 workaround.
svn commit r15962 missed adding bar_bad.stderr.exp-destroy-hang.
Added:
trunk/helgrind/tests/bar_bad.stderr.exp-destroy-hang
Added: trunk/helgrind/tests/bar_bad.stderr.exp-destroy-hang
==============================================================================
--- trunk/helgrind/tests/bar_bad.stderr.exp-destroy-hang (added)
+++ trunk/helgrind/tests/bar_bad.stderr.exp-destroy-hang Mon Sep 19 20:25:33 2016
@@ -0,0 +1,72 @@
+
+initialise a barrier with zero count
+---Thread-Announcement------------------------------------------
+
+Thread #x is the program's root thread
+
+----------------------------------------------------------------
+
+Thread #x: pthread_barrier_init: 'count' argument is zero
+ at 0x........: pthread_barrier_init (hg_intercepts.c:...)
+ by 0x........: main (bar_bad.c:43)
+
+----------------------------------------------------------------
+
+Thread #x's call to pthread_barrier_init failed
+ with error code 22 (EINVAL: Invalid argument)
+ at 0x........: pthread_barrier_init (hg_intercepts.c:...)
+ by 0x........: main (bar_bad.c:43)
+
+
+initialise a barrier twice
+----------------------------------------------------------------
+
+Thread #x: pthread_barrier_init: barrier is already initialised
+ at 0x........: pthread_barrier_init (hg_intercepts.c:...)
+ by 0x........: main (bar_bad.c:49)
+
+
+initialise a barrier which has threads waiting on it
+----------------------------------------------------------------
+
+Thread #x: pthread_barrier_init: barrier is already initialised
+ at 0x........: pthread_barrier_init (hg_intercepts.c:...)
+ by 0x........: main (bar_bad.c:64)
+
+----------------------------------------------------------------
+
+Thread #x: pthread_barrier_init: threads are waiting at barrier
+ at 0x........: pthread_barrier_init (hg_intercepts.c:...)
+ by 0x........: main (bar_bad.c:64)
+
+
+destroy a barrier that has waiting threads
+----------------------------------------------------------------
+
+Thread #x: pthread_barrier_destroy: threads are waiting at barrier
+ at 0x........: pthread_barrier_destroy (hg_intercepts.c:...)
+ by 0x........: main (bar_bad.c:82)
+
+---Thread-Announcement------------------------------------------
+
+Thread #x was created
+ ...
+ by 0x........: pthread_create@* (hg_intercepts.c:...)
+ by 0x........: main (bar_bad.c:76)
+
+----------------------------------------------------------------
+
+Thread #x: pthread_barrier_wait: barrier is uninitialised
+ at 0x........: pthread_barrier_wait (hg_intercepts.c:...)
+ by 0x........: sleep1 (bar_bad.c:22)
+ by 0x........: mythread_wrapper (hg_intercepts.c:...)
+ ...
+
+
+destroy a barrier that was never initialised
+----------------------------------------------------------------
+
+Thread #x: pthread_barrier_destroy: barrier was never initialised
+ at 0x........: pthread_barrier_destroy (hg_intercepts.c:...)
+ by 0x........: main (bar_bad.c:96)
+
|
|
From: <sv...@va...> - 2016-09-19 14:55:26
|
Author: sewardj
Date: Mon Sep 19 15:55:16 2016
New Revision: 15965
Log:
Bump the version.
Modified:
branches/VALGRIND_3_12_BRANCH/configure.ac
Modified: branches/VALGRIND_3_12_BRANCH/configure.ac
==============================================================================
--- branches/VALGRIND_3_12_BRANCH/configure.ac (original)
+++ branches/VALGRIND_3_12_BRANCH/configure.ac Mon Sep 19 15:55:16 2016
@@ -8,7 +8,7 @@
##------------------------------------------------------------##
# Process this file with autoconf to produce a configure script.
-AC_INIT([Valgrind],[3.12.0.SVN],[val...@li...])
+AC_INIT([Valgrind],[3.12.BRANCH],[val...@li...])
AC_CONFIG_SRCDIR(coregrind/m_main.c)
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([foreign subdir-objects])
|
|
From: <sv...@va...> - 2016-09-19 14:49:03
|
Author: sewardj
Date: Mon Sep 19 15:48:56 2016
New Revision: 15964
Log:
Swizzle external.
Modified:
branches/VALGRIND_3_12_BRANCH/ (props changed)
|
|
From: <sv...@va...> - 2016-09-19 14:47:26
|
Author: sewardj
Date: Mon Sep 19 15:47:20 2016
New Revision: 15963
Log:
Create branches/VALGRIND_3_12_BRANCH as a copy of trunk r15962.
Added:
branches/VALGRIND_3_12_BRANCH/
- copied from r15962, trunk/
|
|
From: <sv...@va...> - 2016-09-19 14:35:45
|
Author: sewardj
Date: Mon Sep 19 15:35:39 2016
New Revision: 3250
Log:
Create branches/VEX_3_12_BRANCH as a copy of trunk r3249.
Added:
branches/VEX_3_12_BRANCH/
- copied from r3249, trunk/
|
|
From: <sv...@va...> - 2016-09-19 14:16:44
|
Author: mjw
Date: Mon Sep 19 15:16:35 2016
New Revision: 15962
Log:
Workaround bar_bad testcase hanging with newer glibc in helgrind/drd tests.
This is a workaround for bug #358213 helgrind/drd pthread_barrier tests
hangs with new glibc pthread barrier implementation. This makes sure that
the tests don't hang anymore. It does this by creating new threads that
sleep and kill the other threads after some time. But this introduces
some non-determinism that might cause the tests to occassionally fail
(both against old and new glibc implementations).
Added:
trunk/drd/tests/bar_bad.stderr.exp-nohang
- copied, changed from r15961, trunk/drd/tests/bar_bad.stderr.exp
trunk/drd/tests/bar_bad_xml.stderr.exp-nohang
- copied, changed from r15961, trunk/drd/tests/bar_bad_xml.stderr.exp
Modified:
trunk/drd/tests/Makefile.am
trunk/drd/tests/bar_bad.stderr.exp
trunk/drd/tests/bar_bad_xml.stderr.exp
trunk/helgrind/tests/Makefile.am
trunk/helgrind/tests/bar_bad.c
trunk/helgrind/tests/bar_bad.stderr.exp
Modified: trunk/drd/tests/Makefile.am
==============================================================================
--- trunk/drd/tests/Makefile.am (original)
+++ trunk/drd/tests/Makefile.am Mon Sep 19 15:16:35 2016
@@ -81,8 +81,10 @@
atomic_var.stderr.exp \
atomic_var.vgtest \
bar_bad.stderr.exp \
+ bar_bad.stderr.exp-nohang \
bar_bad.vgtest \
bar_bad_xml.stderr.exp \
+ bar_bad_xml.stderr.exp-nohang \
bar_bad_xml.vgtest \
bar_trivial.stderr.exp \
bar_trivial.stdout.exp \
Modified: trunk/drd/tests/bar_bad.stderr.exp
==============================================================================
--- trunk/drd/tests/bar_bad.stderr.exp (original)
+++ trunk/drd/tests/bar_bad.stderr.exp Mon Sep 19 15:16:35 2016
@@ -34,16 +34,5 @@
destroy a barrier that was never initialised
-Not a barrier
- at 0x........: pthread_barrier_destroy (drd_pthread_intercepts.c:?)
- by 0x........: main (bar_bad.c:?)
-Destruction of barrier that is being waited upon: barrier 0x........
- at 0x........: free (vg_replace_malloc.c:...)
- by 0x........: main (bar_bad.c:?)
-barrier 0x........ was first observed at:
- at 0x........: pthread_barrier_init (drd_pthread_intercepts.c:?)
- by 0x........: main (bar_bad.c:?)
-
-
-ERROR SUMMARY: 7 errors from 6 contexts (suppressed: 0 from 0)
+ERROR SUMMARY: 5 errors from 4 contexts (suppressed: 0 from 0)
Copied: trunk/drd/tests/bar_bad.stderr.exp-nohang (from r15961, trunk/drd/tests/bar_bad.stderr.exp)
==============================================================================
--- trunk/drd/tests/bar_bad.stderr.exp (original)
+++ trunk/drd/tests/bar_bad.stderr.exp-nohang Mon Sep 19 15:16:35 2016
@@ -38,12 +38,5 @@
at 0x........: pthread_barrier_destroy (drd_pthread_intercepts.c:?)
by 0x........: main (bar_bad.c:?)
-Destruction of barrier that is being waited upon: barrier 0x........
- at 0x........: free (vg_replace_malloc.c:...)
- by 0x........: main (bar_bad.c:?)
-barrier 0x........ was first observed at:
- at 0x........: pthread_barrier_init (drd_pthread_intercepts.c:?)
- by 0x........: main (bar_bad.c:?)
-
-ERROR SUMMARY: 7 errors from 6 contexts (suppressed: 0 from 0)
+ERROR SUMMARY: 6 errors from 5 contexts (suppressed: 0 from 0)
Modified: trunk/drd/tests/bar_bad_xml.stderr.exp
==============================================================================
--- trunk/drd/tests/bar_bad_xml.stderr.exp (original)
+++ trunk/drd/tests/bar_bad_xml.stderr.exp Mon Sep 19 15:16:35 2016
@@ -204,78 +204,6 @@
destroy a barrier that was never initialised
-<error>
- <unique>0x........</unique>
- <tid>...</tid>
- <kind>GenericErr</kind>
- <what>Not a barrier</what>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>pthread_barrier_destroy</fn>
- <dir>...</dir>
- <file>drd_pthread_intercepts.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>main</fn>
- <dir>...</dir>
- <file>bar_bad.c</file>
- <line>...</line>
- </frame>
- </stack>
-</error>
-
-<error>
- <unique>0x........</unique>
- <tid>...</tid>
- <kind>BarrierErr</kind>
- <what>Destruction of barrier that is being waited upon: barrier 0x........</what>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>free</fn>
- <dir>...</dir>
- <file>vg_replace_malloc.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>main</fn>
- <dir>...</dir>
- <file>bar_bad.c</file>
- <line>...</line>
- </frame>
- </stack>
- <first_observed_at>
- <what>barrier</what>
- <address>0x........</address>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>pthread_barrier_init</fn>
- <dir>...</dir>
- <file>drd_pthread_intercepts.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>main</fn>
- <dir>...</dir>
- <file>bar_bad.c</file>
- <line>...</line>
- </frame>
- </stack>
- </first_observed_at>
-</error>
-
<status>
<state>FINISHED</state>
@@ -299,14 +227,6 @@
<count>...</count>
<unique>0x........</unique>
</pair>
- <pair>
- <count>...</count>
- <unique>0x........</unique>
- </pair>
- <pair>
- <count>...</count>
- <unique>0x........</unique>
- </pair>
</errorcounts>
<suppcounts>...</suppcounts>
Copied: trunk/drd/tests/bar_bad_xml.stderr.exp-nohang (from r15961, trunk/drd/tests/bar_bad_xml.stderr.exp)
==============================================================================
--- trunk/drd/tests/bar_bad_xml.stderr.exp (original)
+++ trunk/drd/tests/bar_bad_xml.stderr.exp-nohang Mon Sep 19 15:16:35 2016
@@ -229,53 +229,6 @@
</stack>
</error>
-<error>
- <unique>0x........</unique>
- <tid>...</tid>
- <kind>BarrierErr</kind>
- <what>Destruction of barrier that is being waited upon: barrier 0x........</what>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>free</fn>
- <dir>...</dir>
- <file>vg_replace_malloc.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>main</fn>
- <dir>...</dir>
- <file>bar_bad.c</file>
- <line>...</line>
- </frame>
- </stack>
- <first_observed_at>
- <what>barrier</what>
- <address>0x........</address>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>pthread_barrier_init</fn>
- <dir>...</dir>
- <file>drd_pthread_intercepts.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>main</fn>
- <dir>...</dir>
- <file>bar_bad.c</file>
- <line>...</line>
- </frame>
- </stack>
- </first_observed_at>
-</error>
-
<status>
<state>FINISHED</state>
@@ -303,10 +256,6 @@
<count>...</count>
<unique>0x........</unique>
</pair>
- <pair>
- <count>...</count>
- <unique>0x........</unique>
- </pair>
</errorcounts>
<suppcounts>...</suppcounts>
Modified: trunk/helgrind/tests/Makefile.am
==============================================================================
--- trunk/helgrind/tests/Makefile.am (original)
+++ trunk/helgrind/tests/Makefile.am Mon Sep 19 15:16:35 2016
@@ -19,6 +19,7 @@
cond_timedwait_test.vgtest cond_timedwait_test.stdout.exp \
cond_timedwait_test.stderr.exp \
bar_bad.vgtest bar_bad.stdout.exp bar_bad.stderr.exp \
+ bar_bad.stderr.exp-destroy-hang \
bar_trivial.vgtest bar_trivial.stdout.exp bar_trivial.stderr.exp \
free_is_write.vgtest free_is_write.stdout.exp \
free_is_write.stderr.exp \
Modified: trunk/helgrind/tests/bar_bad.c
==============================================================================
--- trunk/helgrind/tests/bar_bad.c (original)
+++ trunk/helgrind/tests/bar_bad.c Mon Sep 19 15:16:35 2016
@@ -15,23 +15,27 @@
return NULL;
}
+void *sleep1 ( void* arg )
+{
+ /* Long sleep, we hope to never trigger. */
+ sleep (10);
+ pthread_barrier_wait ( (pthread_barrier_t*)arg );
+ return NULL;
+}
+
+void *exit1 ( void* arg )
+{
+ /* Sleep a bit, then exit, we are done. */
+ sleep (1);
+ exit (0);
+ return NULL;
+}
+
int main ( void )
{
pthread_barrier_t *bar1, *bar2, *bar3, *bar4, *bar5;
- pthread_t thr1, thr2;
int r;
-
- /* possibly set up a watchdog timer thread here. */
-
-
-
-
-
-
-
-
-
-
+ pthread_t thr1, thr2, slp1, slp2, ext1;
/* initialise a barrier with a zero count */
fprintf(stderr, "\ninitialise a barrier with zero count\n");
@@ -49,6 +53,9 @@
fprintf(stderr, "\ninitialise a barrier which has threads waiting on it\n");
bar3 = malloc(sizeof(pthread_barrier_t));
pthread_barrier_init(bar3, NULL, 2);
+ /* create a thread, whose purpose is to "unblock" the barrier after
+ some sleeping in case it keeps being blocked. */
+ pthread_create(&slp1, NULL, sleep1, (void*)bar3);
/* create a thread, whose only purpose is to block on the barrier */
pthread_create(&thr1, NULL, child1, (void*)bar3);
/* guarantee that it gets there first */
@@ -61,6 +68,12 @@
/* once again, create a thread, whose only purpose is to block. */
bar4 = malloc(sizeof(pthread_barrier_t));
pthread_barrier_init(bar4, NULL, 2);
+ /* create a thread, whose purpose is to "unblock" the barrier after
+ some sleeping in case it keeps being blocked. We hope it isn't
+ needed, but if it is, because pthread_barier_destroy hangs
+ and we will get an extra warning about the barrier being already
+ destroyed. */
+ pthread_create(&slp2, NULL, sleep1, (void*)bar4);
/* create a thread, whose only purpose is to block on the barrier */
pthread_create(&thr2, NULL, child1, (void*)bar4);
/* guarantee that it gets there first */
@@ -70,20 +83,24 @@
/* destroy a barrier that was never initialised. This is a bit
tricky, in that we have to fill the barrier with bytes which
- ensure that the pthread_barrier_destroy call doesn't hang for
- some reason. Zero-fill seems to work ok on amd64-linux (glibc
+ ensure that the pthread_barrier_destroy call doesn't crash for
+ some reason. One-fill seems to work ok on amd64-linux (glibc
2.8). */
fprintf(stderr, "\ndestroy a barrier that was never initialised\n");
+ /* Create a thread that just exits the process after some sleep.
+ We are really done at this point, even if we hang. */
+ pthread_create(&ext1, NULL, exit1, NULL);
bar5 = malloc(sizeof(pthread_barrier_t));
assert(bar5);
- memset(bar5, 0, sizeof(*bar5));
+ memset(bar5, 1, sizeof(*bar5));
pthread_barrier_destroy(bar5);
- /* now we need to clean up the mess .. */
- r= pthread_cancel(thr1); assert(!r);
- r= pthread_cancel(thr2); assert(!r);
+ /* now we need to clean up the mess .. But skip canceling threads. */
+ /* r= pthread_cancel(thr1); assert(!r); // drd doesn't like it. Just exit.
+ r= pthread_cancel(thr2); assert(!r); */
free(bar1); free(bar2); free(bar3); free(bar4); free(bar5);
- return 0;
+ /* Use exit, we want to kill any "sleeper threads". */
+ exit (0);
}
Modified: trunk/helgrind/tests/bar_bad.stderr.exp
==============================================================================
--- trunk/helgrind/tests/bar_bad.stderr.exp (original)
+++ trunk/helgrind/tests/bar_bad.stderr.exp Mon Sep 19 15:16:35 2016
@@ -8,14 +8,14 @@
Thread #x: pthread_barrier_init: 'count' argument is zero
at 0x........: pthread_barrier_init (hg_intercepts.c:...)
- by 0x........: main (bar_bad.c:39)
+ by 0x........: main (bar_bad.c:43)
----------------------------------------------------------------
Thread #x's call to pthread_barrier_init failed
with error code 22 (EINVAL: Invalid argument)
at 0x........: pthread_barrier_init (hg_intercepts.c:...)
- by 0x........: main (bar_bad.c:39)
+ by 0x........: main (bar_bad.c:43)
initialise a barrier twice
@@ -23,7 +23,7 @@
Thread #x: pthread_barrier_init: barrier is already initialised
at 0x........: pthread_barrier_init (hg_intercepts.c:...)
- by 0x........: main (bar_bad.c:45)
+ by 0x........: main (bar_bad.c:49)
initialise a barrier which has threads waiting on it
@@ -31,13 +31,13 @@
Thread #x: pthread_barrier_init: barrier is already initialised
at 0x........: pthread_barrier_init (hg_intercepts.c:...)
- by 0x........: main (bar_bad.c:57)
+ by 0x........: main (bar_bad.c:64)
----------------------------------------------------------------
Thread #x: pthread_barrier_init: threads are waiting at barrier
at 0x........: pthread_barrier_init (hg_intercepts.c:...)
- by 0x........: main (bar_bad.c:57)
+ by 0x........: main (bar_bad.c:64)
destroy a barrier that has waiting threads
@@ -45,14 +45,14 @@
Thread #x: pthread_barrier_destroy: threads are waiting at barrier
at 0x........: pthread_barrier_destroy (hg_intercepts.c:...)
- by 0x........: main (bar_bad.c:69)
+ by 0x........: main (bar_bad.c:82)
----------------------------------------------------------------
Thread #x's call to pthread_barrier_destroy failed
with error code 16 (EBUSY: Device or resource busy)
at 0x........: pthread_barrier_destroy (hg_intercepts.c:...)
- by 0x........: main (bar_bad.c:69)
+ by 0x........: main (bar_bad.c:82)
destroy a barrier that was never initialised
@@ -60,5 +60,5 @@
Thread #x: pthread_barrier_destroy: barrier was never initialised
at 0x........: pthread_barrier_destroy (hg_intercepts.c:...)
- by 0x........: main (bar_bad.c:80)
+ by 0x........: main (bar_bad.c:96)
|
Author: mjw
Date: Mon Sep 19 13:41:38 2016
New Revision: 15961
Log:
Testcases for fma4 instructions. Bug #369000.
Added:
trunk/none/tests/amd64/fma4.c
trunk/none/tests/amd64/fma4.stderr.exp
trunk/none/tests/amd64/fma4.stdout.exp
trunk/none/tests/amd64/fma4.vgtest
Modified:
trunk/NEWS
trunk/configure.ac
trunk/none/tests/amd64/Makefile.am
trunk/tests/x86_amd64_features.c
Modified: trunk/NEWS
==============================================================================
--- trunk/NEWS (original)
+++ trunk/NEWS Mon Sep 19 13:41:38 2016
@@ -168,6 +168,7 @@
368416 Add tc06_two_races_xml.exp output for ppc64
368412 False positive result for altivec capability check
368461 mmapunmap test fails on ppc64
+369000 AMD64 fma4 instructions unsupported.
n-i-bz Fix incorrect (or infinite loop) unwind on RHEL7 x86 and amd64
n-i-bz massif --pages-as-heap=yes does not report peak caused by mmap+munmap
Modified: trunk/configure.ac
==============================================================================
--- trunk/configure.ac (original)
+++ trunk/configure.ac Mon Sep 19 13:41:38 2016
@@ -2380,6 +2380,26 @@
AM_CONDITIONAL(BUILD_VPCLMULQDQ_TESTS, test x$ac_have_as_vpclmulqdq = xyes)
+# does the x86/amd64 assembler understand FMA4 instructions?
+# Note, this doesn't generate a C-level symbol. It generates a
+# automake-level symbol (BUILD_AFM4_TESTS), used in test Makefile.am's
+AC_MSG_CHECKING([if x86/amd64 assembler supports FMA4 'vfmaddpd'])
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
+ do {
+ __asm__ __volatile__(
+ "vfmaddpd %%xmm7,%%xmm8,%%xmm6,%%xmm9" : : : );
+ } while (0)
+]])], [
+ac_have_as_vfmaddpd=yes
+AC_MSG_RESULT([yes])
+], [
+ac_have_as_vfmaddpd=no
+AC_MSG_RESULT([no])
+])
+
+AM_CONDITIONAL(BUILD_FMA4_TESTS, test x$ac_have_as_vfmaddpd = xyes)
+
+
# does the x86/amd64 assembler understand the LZCNT instruction?
# Note, this doesn't generate a C-level symbol. It generates a
# automake-level symbol (BUILD_LZCNT_TESTS), used in test Makefile.am's
Modified: trunk/none/tests/amd64/Makefile.am
==============================================================================
--- trunk/none/tests/amd64/Makefile.am (original)
+++ trunk/none/tests/amd64/Makefile.am Mon Sep 19 13:41:38 2016
@@ -42,6 +42,7 @@
cmpxchg.vgtest cmpxchg.stdout.exp cmpxchg.stderr.exp \
faultstatus.disabled faultstatus.stderr.exp \
fcmovnu.vgtest fcmovnu.stderr.exp fcmovnu.stdout.exp \
+ fma4.vgtest fma4.stdout.exp fma4.stderr.exp \
fxtract.vgtest fxtract.stderr.exp fxtract.stdout.exp \
fxtract.stdout.exp-older-glibc \
getseg.stdout.exp getseg.stderr.exp getseg.vgtest \
@@ -109,6 +110,9 @@
if BUILD_VPCLMULQDQ_TESTS
check_PROGRAMS += avx-1
endif
+if BUILD_FMA4_TESTS
+ check_PROGRAMS += fma4
+endif
endif
if BUILD_AVX2_TESTS
if !COMPILER_IS_ICC
@@ -185,6 +189,8 @@
insn_fpu_LDADD = -lm
insn_pclmulqdq_SOURCES = insn_pclmulqdq.def
fxtract_LDADD = -lm
+fma4_CFLAGS = $(AM_CFKAGS) -std=c99
+fma4_LDADD = -lm
.def.c: $(srcdir)/gen_insn_test.pl
$(PERL) $(srcdir)/gen_insn_test.pl < $< > $@
Added: trunk/none/tests/amd64/fma4.c
==============================================================================
--- trunk/none/tests/amd64/fma4.c (added)
+++ trunk/none/tests/amd64/fma4.c Mon Sep 19 13:41:38 2016
@@ -0,0 +1,659 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <math.h>
+#include "tests/malloc.h"
+
+typedef unsigned char UChar;
+typedef unsigned int UInt;
+typedef unsigned long int UWord;
+typedef unsigned long long int ULong;
+typedef double Double;
+typedef float Float;
+
+#define IS_32_ALIGNED(_ptr) (0 == (0x1F & (UWord)(_ptr)))
+
+typedef union { UChar u8[16]; UInt u32[4]; Float f32[4]; Double f64[2]; } XMM;
+typedef union { UChar u8[32]; UInt u32[8]; XMM xmm[2]; } YMM;
+typedef struct { YMM r1; YMM r2; YMM r3; YMM r4; YMM m; } Block;
+
+void showFloat ( XMM* vec, int idx )
+{
+ Float f = vec->f32[idx];
+ int neg = signbit (f);
+ char sign = neg != 0 ? '-' : ' ';
+ switch (fpclassify (f)) {
+ case FP_NORMAL: {
+ for (int i = idx * 4 + 3; i >= idx * 4; i--)
+ printf("%02x", (UInt)vec->u8[i]);
+ break;
+ }
+ case FP_INFINITE: {
+ printf ("[ %cINF ]", sign);
+ break;
+ }
+ case FP_ZERO: {
+ printf ("[%cZERO ]", sign);
+ break;
+ }
+ case FP_NAN: {
+ printf ("[ NAN ]");
+ break;
+ }
+ default: {
+ printf ("[%cSUBNR]", sign);
+ break;
+ }
+ }
+}
+
+void showDouble ( XMM* vec, int idx )
+{
+ Double d = vec->f64[idx];
+ int neg = signbit (d);
+ char sign = neg != 0 ? '-' : ' ';
+ switch (fpclassify (d)) {
+ case FP_NORMAL: {
+ for (int i = idx * 8 + 7; i >= idx * 8; i--)
+ printf("%02x", (UInt)vec->u8[i]);
+ break;
+ }
+ case FP_INFINITE: {
+ printf ("[ %cINF ]", sign);
+ break;
+ }
+ case FP_ZERO: {
+ printf ("[ %cZERO ]", sign);
+ break;
+ }
+ case FP_NAN: {
+ printf ("[ NAN ]");
+ break;
+ }
+ default: {
+ printf ("[ %cSUBNORMAL ]", sign);
+ break;
+ }
+ }
+}
+
+void showXMM ( XMM* vec, int isDouble )
+{
+ if (isDouble) {
+ showDouble ( vec, 1 );
+ printf (".");
+ showDouble ( vec, 0 );
+ } else {
+ showFloat ( vec, 3 );
+ printf (".");
+ showFloat ( vec, 2 );
+ printf (".");
+ showFloat ( vec, 1 );
+ printf (".");
+ showFloat ( vec, 0 );
+ }
+}
+
+void showYMM ( YMM* vec, int isDouble )
+{
+ assert(IS_32_ALIGNED(vec));
+ showXMM ( &vec->xmm[1], isDouble );
+ printf(".");
+ showXMM ( &vec->xmm[0], isDouble );
+}
+
+void showBlock ( char* msg, Block* block, int isDouble )
+{
+ printf(" %s\n", msg);
+ printf("r1: "); showYMM(&block->r1, isDouble); printf("\n");
+ printf("r2: "); showYMM(&block->r2, isDouble); printf("\n");
+ printf("r3: "); showYMM(&block->r3, isDouble); printf("\n");
+ printf("r4: "); showYMM(&block->r4, isDouble); printf("\n");
+ printf(" m: "); showYMM(&block->m, isDouble); printf("\n");
+}
+
+static Double special_values[10];
+
+static __attribute__((noinline))
+Double negate ( Double d ) { return -d; }
+static __attribute__((noinline))
+Double divf64 ( Double x, Double y ) { return x/y; }
+
+static __attribute__((noinline))
+Double plusZero ( void ) { return 0.0; }
+static __attribute__((noinline))
+Double minusZero ( void ) { return negate(plusZero()); }
+
+static __attribute__((noinline))
+Double plusOne ( void ) { return 1.0; }
+static __attribute__((noinline))
+Double minusOne ( void ) { return negate(plusOne()); }
+
+static __attribute__((noinline))
+Double plusInf ( void ) { return 1.0 / 0.0; }
+static __attribute__((noinline))
+Double minusInf ( void ) { return negate(plusInf()); }
+
+static __attribute__((noinline))
+Double plusNaN ( void ) { return divf64(plusInf(),plusInf()); }
+static __attribute__((noinline))
+Double minusNaN ( void ) { return negate(plusNaN()); }
+
+static __attribute__((noinline))
+Double plusDenorm ( void ) { return 1.23e-315 / 1e3; }
+static __attribute__((noinline))
+Double minusDenorm ( void ) { return negate(plusDenorm()); }
+
+static void init_special_values ( void )
+{
+ special_values[0] = plusZero();
+ special_values[1] = minusZero();
+ special_values[2] = plusOne();
+ special_values[3] = minusOne();
+ special_values[4] = plusInf();
+ special_values[5] = minusInf();
+ special_values[6] = plusNaN();
+ special_values[7] = minusNaN();
+ special_values[8] = plusDenorm();
+ special_values[9] = minusDenorm();
+}
+
+void specialFBlock ( Block* b )
+{
+ int i;
+ Float* p = (Float*)b;
+ for (i = 0; i < sizeof(Block) / sizeof(Float); i++)
+ p[i] = (Float) special_values[i % 10];
+}
+
+void specialDBlock ( Block* b )
+{
+ int i;
+ Double* p = (Double*)b;
+ for (i = 0; i < sizeof(Block) / sizeof(Double); i++)
+ p[i] = special_values[i % 10];
+}
+
+UChar randUChar ( void )
+{
+ static UInt seed = 80021;
+ seed = 1103515245 * seed + 12345;
+ return (seed >> 17) & 0xFF;
+}
+
+void randBlock ( Block* b )
+{
+ int i;
+ UChar* p = (UChar*)b;
+ for (i = 0; i < sizeof(Block); i++)
+ p[i] = randUChar();
+}
+
+void oneBlock ( Block* b )
+{
+ int i;
+ UChar* p = (UChar*)b;
+ for (i = 0; i < sizeof(Block); i++)
+ p[i] = 1;
+}
+
+#define GEN_test(_name, _instr, _isD) \
+ __attribute__ ((noinline)) void \
+ test_##_name ( const char *n, Block* b) \
+ { \
+ printf("%s %s\n", #_name, n); \
+ showBlock("before", b, _isD); \
+ __asm__ __volatile__( \
+ "vmovdqa 0(%0),%%ymm7" "\n\t" \
+ "vmovdqa 32(%0),%%ymm8" "\n\t" \
+ "vmovdqa 64(%0),%%ymm6" "\n\t" \
+ "vmovdqa 96(%0),%%ymm9" "\n\t" \
+ "leaq 128(%0),%%r14" "\n\t" \
+ _instr "\n\t" \
+ "vmovdqa %%ymm7, 0(%0)" "\n\t" \
+ "vmovdqa %%ymm8, 32(%0)" "\n\t" \
+ "vmovdqa %%ymm6, 64(%0)" "\n\t" \
+ "vmovdqa %%ymm9, 96(%0)" "\n\t" \
+ : /*OUT*/ \
+ : /*IN*/"r"(b) \
+ : /*TRASH*/"xmm7","xmm8","xmm6","xmm9","r14","memory","cc" \
+ ); \
+ showBlock("after", b, _isD); \
+ printf("\n"); \
+ }
+
+/* All these defines do the same thing (and someone with stronger
+ preprocessor foo could probably express things much smaller).
+ They generate 4 different functions to test 4 variants of an
+ fma4 instruction. One with as input 4 registers, one where
+ the output register is also one of the input registers and
+ two versions where different inputs are a memory location.
+ The xmm variants create 128 versions, the ymm variants 256. */
+
+#define GEN_test_VFMADDPD_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfmaddpd %%xmm7,%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfmaddpd %%xmm7,%%xmm8,%%xmm9,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfmaddpd (%%r14),%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfmaddpd %%xmm8,(%%r14),%%xmm6,%%xmm9", 1);
+GEN_test_VFMADDPD_xmm(VFMADDPD)
+
+#define GEN_test_VFMADDPD_ymm(_name) \
+ GEN_test(_name##_ymm, \
+ "vfmaddpd %%ymm7,%%ymm8,%%ymm6,%%ymm9", 1); \
+ GEN_test(_name##_ymm_src_dst, \
+ "vfmaddpd %%ymm7,%%ymm8,%%ymm9,%%ymm9", 1); \
+ GEN_test(_name##_ymm_mem1, \
+ "vfmaddpd (%%r14),%%ymm8,%%ymm6,%%ymm9", 1); \
+ GEN_test(_name##_ymm_mem2, \
+ "vfmaddpd %%ymm8,(%%r14),%%ymm6,%%ymm9", 1);
+GEN_test_VFMADDPD_ymm(VFMADDPD)
+
+#define GEN_test_VFMADDPS_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfmaddps %%xmm7,%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfmaddps %%xmm7,%%xmm8,%%xmm9,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfmaddps (%%r14),%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfmaddps %%xmm8,(%%r14),%%xmm6,%%xmm9", 0);
+GEN_test_VFMADDPS_xmm(VFMADDPS)
+
+#define GEN_test_VFMADDPS_ymm(_name) \
+ GEN_test(_name##_ymm, \
+ "vfmaddps %%ymm7,%%ymm8,%%ymm6,%%ymm9", 0); \
+ GEN_test(_name##_ymm_src_dst, \
+ "vfmaddps %%ymm7,%%ymm8,%%ymm9,%%ymm9", 0); \
+ GEN_test(_name##_ymm_mem1, \
+ "vfmaddps (%%r14),%%ymm8,%%ymm6,%%ymm9", 0); \
+ GEN_test(_name##_ymm_mem2, \
+ "vfmaddps %%ymm8,(%%r14),%%ymm6,%%ymm9", 0);
+GEN_test_VFMADDPS_ymm(VFMADDPS)
+
+#define GEN_test_VFMADDSD_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfmaddsd %%xmm7,%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfmaddsd %%xmm7,%%xmm8,%%xmm9,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfmaddsd (%%r14),%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfmaddsd %%xmm8,(%%r14),%%xmm6,%%xmm9", 1);
+GEN_test_VFMADDSD_xmm(VFMADDSD)
+
+#define GEN_test_VFMADDSS_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfmaddss %%xmm7,%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfmaddss %%xmm7,%%xmm8,%%xmm9,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfmaddss (%%r14),%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfmaddss %%xmm8,(%%r14),%%xmm6,%%xmm9", 0);
+GEN_test_VFMADDSS_xmm(VFMADDSS)
+
+#define GEN_test_VFMADDSUBPD_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfmaddsubpd %%xmm7,%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfmaddsubpd %%xmm7,%%xmm8,%%xmm9,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfmaddsubpd (%%r14),%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfmaddsubpd %%xmm8,(%%r14),%%xmm6,%%xmm9", 1);
+GEN_test_VFMADDSUBPD_xmm(VFMADDSUBPD)
+
+#define GEN_test_VFMADDSUBPD_ymm(_name) \
+ GEN_test(_name##_ymm, \
+ "vfmaddsubpd %%ymm7,%%ymm8,%%ymm6,%%ymm9", 1); \
+ GEN_test(_name##_ymm_src_dst, \
+ "vfmaddsubpd %%ymm7,%%ymm8,%%ymm9,%%ymm9", 1); \
+ GEN_test(_name##_ymm_mem1, \
+ "vfmaddsubpd (%%r14),%%ymm8,%%ymm6,%%ymm9", 1); \
+ GEN_test(_name##_ymm_mem2, \
+ "vfmaddsubpd %%ymm8,(%%r14),%%ymm6,%%ymm9", 1);
+GEN_test_VFMADDSUBPD_ymm(VFMADDSUBPD)
+
+#define GEN_test_VFMADDSUBPS_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfmaddsubps %%xmm7,%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfmaddsubps %%xmm7,%%xmm8,%%xmm9,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfmaddsubps (%%r14),%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfmaddsubps %%xmm8,(%%r14),%%xmm6,%%xmm9", 0);
+GEN_test_VFMADDSUBPS_xmm(VFMADDSUBPS)
+
+#define GEN_test_VFMADDSUBPS_ymm(_name) \
+ GEN_test(_name##_ymm, \
+ "vfmaddsubps %%ymm7,%%ymm8,%%ymm6,%%ymm9", 0); \
+ GEN_test(_name##_ymm_src_dst, \
+ "vfmaddsubps %%ymm7,%%ymm8,%%ymm9,%%ymm9", 0); \
+ GEN_test(_name##_ymm_mem1, \
+ "vfmaddsubps (%%r14),%%ymm8,%%ymm6,%%ymm9", 0); \
+ GEN_test(_name##_ymm_mem2, \
+ "vfmaddsubps %%ymm8,(%%r14),%%ymm6,%%ymm9", 0);
+GEN_test_VFMADDSUBPS_ymm(VFMADDSUBPS)
+
+#define GEN_test_VFMSUBADDPD_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfmsubaddpd %%xmm7,%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfmsubaddpd %%xmm7,%%xmm8,%%xmm9,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfmsubaddpd (%%r14),%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfmsubaddpd %%xmm8,(%%r14),%%xmm6,%%xmm9", 1);
+GEN_test_VFMSUBADDPD_xmm(VFMSUBADDPD)
+
+#define GEN_test_VFMSUBADDPD_ymm(_name) \
+ GEN_test(_name##_ymm, \
+ "vfmsubaddpd %%ymm7,%%ymm8,%%ymm6,%%ymm9", 1); \
+ GEN_test(_name##_ymm_src_dst, \
+ "vfmsubaddpd %%ymm7,%%ymm8,%%ymm9,%%ymm9", 1); \
+ GEN_test(_name##_ymm_mem1, \
+ "vfmsubaddpd (%%r14),%%ymm8,%%ymm6,%%ymm9", 1); \
+ GEN_test(_name##_ymm_mem2, \
+ "vfmsubaddpd %%ymm8,(%%r14),%%ymm6,%%ymm9", 1);
+GEN_test_VFMSUBADDPD_ymm(VFMSUBADDPD)
+
+#define GEN_test_VFMSUBADDPS_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfmsubaddps %%xmm7,%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfmsubaddps %%xmm7,%%xmm8,%%xmm9,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfmsubaddps (%%r14),%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfmsubaddps %%xmm8,(%%r14),%%xmm6,%%xmm9", 0);
+GEN_test_VFMSUBADDPS_xmm(VFMSUBADDPS)
+
+#define GEN_test_VFMSUBADDPS_ymm(_name) \
+ GEN_test(_name##_ymm, \
+ "vfmsubaddps %%ymm7,%%ymm8,%%ymm6,%%ymm9", 0); \
+ GEN_test(_name##_ymm_src_dst, \
+ "vfmsubaddps %%ymm7,%%ymm8,%%ymm9,%%ymm9", 0); \
+ GEN_test(_name##_ymm_mem1, \
+ "vfmsubaddps (%%r14),%%ymm8,%%ymm6,%%ymm9", 0); \
+ GEN_test(_name##_ymm_mem2, \
+ "vfmsubaddps %%ymm8,(%%r14),%%ymm6,%%ymm9", 0);
+GEN_test_VFMSUBADDPS_ymm(VFMSUBADDPS)
+
+#define GEN_test_VFMSUBPD_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfmsubpd %%xmm7,%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfmsubpd %%xmm7,%%xmm8,%%xmm9,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfmsubpd (%%r14),%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfmsubpd %%xmm8,(%%r14),%%xmm6,%%xmm9", 1);
+GEN_test_VFMSUBPD_xmm(VFMSUBPD)
+
+#define GEN_test_VFMSUBPD_ymm(_name) \
+ GEN_test(_name##_ymm, \
+ "vfmsubpd %%ymm7,%%ymm8,%%ymm6,%%ymm9", 1); \
+ GEN_test(_name##_ymm_src_dst, \
+ "vfmsubpd %%ymm7,%%ymm8,%%ymm9,%%ymm9", 1); \
+ GEN_test(_name##_ymm_mem1, \
+ "vfmsubpd (%%r14),%%ymm8,%%ymm6,%%ymm9", 1); \
+ GEN_test(_name##_ymm_mem2, \
+ "vfmsubpd %%ymm8,(%%r14),%%ymm6,%%ymm9", 1);
+GEN_test_VFMSUBPD_ymm(VFMSUBPD)
+
+#define GEN_test_VFMSUBPS_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfmsubps %%xmm7,%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfmsubps %%xmm7,%%xmm8,%%xmm9,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfmsubps (%%r14),%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfmsubps %%xmm8,(%%r14),%%xmm6,%%xmm9", 0);
+GEN_test_VFMSUBPS_xmm(VFMSUBPS)
+
+#define GEN_test_VFMSUBPS_ymm(_name) \
+ GEN_test(_name##_ymm, \
+ "vfmsubps %%ymm7,%%ymm8,%%ymm6,%%ymm9", 0); \
+ GEN_test(_name##_ymm_src_dst, \
+ "vfmsubps %%ymm7,%%ymm8,%%ymm9,%%ymm9", 0); \
+ GEN_test(_name##_ymm_mem1, \
+ "vfmsubps (%%r14),%%ymm8,%%ymm6,%%ymm9", 0); \
+ GEN_test(_name##_ymm_mem2, \
+ "vfmsubps %%ymm8,(%%r14),%%ymm6,%%ymm9", 0);
+GEN_test_VFMSUBPS_ymm(VFMSUBPS)
+
+#define GEN_test_VFMSUBSD_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfmsubsd %%xmm7,%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfmsubsd %%xmm7,%%xmm8,%%xmm9,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfmsubsd (%%r14),%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfmsubsd %%xmm8,(%%r14),%%xmm6,%%xmm9", 1);
+GEN_test_VFMSUBSD_xmm(VFMSUBSD)
+
+#define GEN_test_VFMSUBSS_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfmsubss %%xmm7,%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfmsubss %%xmm7,%%xmm8,%%xmm9,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfmsubss (%%r14),%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfmsubss %%xmm8,(%%r14),%%xmm6,%%xmm9", 0);
+GEN_test_VFMSUBSS_xmm(VFMSUBSS)
+
+#define GEN_test_VFNMADDPD_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfnmaddpd %%xmm7,%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfnmaddpd %%xmm7,%%xmm8,%%xmm9,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfnmaddpd (%%r14),%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfnmaddpd %%xmm8,(%%r14),%%xmm6,%%xmm9", 1);
+GEN_test_VFNMADDPD_xmm(VFNMADDPD)
+
+#define GEN_test_VFNMADDPD_ymm(_name) \
+ GEN_test(_name##_ymm, \
+ "vfnmaddpd %%ymm7,%%ymm8,%%ymm6,%%ymm9", 1); \
+ GEN_test(_name##_ymm_src_dst, \
+ "vfnmaddpd %%ymm7,%%ymm8,%%ymm9,%%ymm9", 1); \
+ GEN_test(_name##_ymm_mem1, \
+ "vfnmaddpd (%%r14),%%ymm8,%%ymm6,%%ymm9", 1); \
+ GEN_test(_name##_ymm_mem2, \
+ "vfnmaddpd %%ymm8,(%%r14),%%ymm6,%%ymm9", 1);
+GEN_test_VFNMADDPD_ymm(VFNMADDPD)
+
+#define GEN_test_VFNMADDPS_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfnmaddps %%xmm7,%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfnmaddps %%xmm7,%%xmm8,%%xmm9,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfnmaddps (%%r14),%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfnmaddps %%xmm8,(%%r14),%%xmm6,%%xmm9", 0);
+GEN_test_VFNMADDPS_xmm(VFNMADDPS)
+
+#define GEN_test_VFNMADDPS_ymm(_name) \
+ GEN_test(_name##_ymm, \
+ "vfnmaddps %%ymm7,%%ymm8,%%ymm6,%%ymm9", 0); \
+ GEN_test(_name##_ymm_src_dst, \
+ "vfnmaddps %%ymm7,%%ymm8,%%ymm9,%%ymm9", 0); \
+ GEN_test(_name##_ymm_mem1, \
+ "vfnmaddps (%%r14),%%ymm8,%%ymm6,%%ymm9", 0); \
+ GEN_test(_name##_ymm_mem2, \
+ "vfnmaddps %%ymm8,(%%r14),%%ymm6,%%ymm9", 0);
+GEN_test_VFNMADDPS_ymm(VFNMADDPS)
+
+#define GEN_test_VFNMADDSD_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfnmaddsd %%xmm7,%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfnmaddsd %%xmm7,%%xmm8,%%xmm9,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfnmaddsd (%%r14),%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfnmaddsd %%xmm8,(%%r14),%%xmm6,%%xmm9", 1);
+GEN_test_VFNMADDSD_xmm(VFNMADDSD)
+
+#define GEN_test_VFNMADDSS_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfnmaddss %%xmm7,%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfnmaddss %%xmm7,%%xmm8,%%xmm9,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfnmaddss (%%r14),%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfnmaddss %%xmm8,(%%r14),%%xmm6,%%xmm9", 0);
+GEN_test_VFNMADDSS_xmm(VFNMADDSS)
+
+#define GEN_test_VFNMSUBPD_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfnmsubpd %%xmm7,%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfnmsubpd %%xmm7,%%xmm8,%%xmm9,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfnmsubpd (%%r14),%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfnmsubpd %%xmm8,(%%r14),%%xmm6,%%xmm9", 1);
+GEN_test_VFNMSUBPD_xmm(VFNMSUBPD)
+
+#define GEN_test_VFNMSUBPD_ymm(_name) \
+ GEN_test(_name##_ymm, \
+ "vfnmsubpd %%ymm7,%%ymm8,%%ymm6,%%ymm9", 1); \
+ GEN_test(_name##_ymm_src_dst, \
+ "vfnmsubpd %%ymm7,%%ymm8,%%ymm9,%%ymm9", 1); \
+ GEN_test(_name##_ymm_mem1, \
+ "vfnmsubpd (%%r14),%%ymm8,%%ymm6,%%ymm9", 1); \
+ GEN_test(_name##_ymm_mem2, \
+ "vfnmsubpd %%ymm8,(%%r14),%%ymm6,%%ymm9", 1);
+GEN_test_VFNMSUBPD_ymm(VFNMSUBPD)
+
+#define GEN_test_VFNMSUBPS_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfnmsubps %%xmm7,%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfnmsubps %%xmm7,%%xmm8,%%xmm9,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfnmsubps (%%r14),%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfnmsubps %%xmm8,(%%r14),%%xmm6,%%xmm9", 0);
+GEN_test_VFNMSUBPS_xmm(VFNMSUBPS)
+
+#define GEN_test_VFNMSUBPS_ymm(_name) \
+ GEN_test(_name##_ymm, \
+ "vfnmsubps %%ymm7,%%ymm8,%%ymm6,%%ymm9", 0); \
+ GEN_test(_name##_ymm_src_dst, \
+ "vfnmsubps %%ymm7,%%ymm8,%%ymm9,%%ymm9", 0); \
+ GEN_test(_name##_ymm_mem1, \
+ "vfnmsubps (%%r14),%%ymm8,%%ymm6,%%ymm9", 0); \
+ GEN_test(_name##_ymm_mem2, \
+ "vfnmsubps %%ymm8,(%%r14),%%ymm6,%%ymm9", 0);
+GEN_test_VFNMSUBPS_ymm(VFNMSUBPS)
+
+#define GEN_test_VFNMSUBSD_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfnmsubsd %%xmm7,%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfnmsubsd %%xmm7,%%xmm8,%%xmm9,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfnmsubsd (%%r14),%%xmm8,%%xmm6,%%xmm9", 1); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfnmsubsd %%xmm8,(%%r14),%%xmm6,%%xmm9", 1);
+GEN_test_VFNMSUBSD_xmm(VFNMSUBSD)
+
+#define GEN_test_VFNMSUBSS_xmm(_name) \
+ GEN_test(_name##_xmm, \
+ "vfnmsubss %%xmm7,%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_src_dst, \
+ "vfnmsubss %%xmm7,%%xmm8,%%xmm9,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem1, \
+ "vfnmsubss (%%r14),%%xmm8,%%xmm6,%%xmm9", 0); \
+ GEN_test(_name##_xmm_mem2, \
+ "vfnmsubss %%xmm8,(%%r14),%%xmm6,%%xmm9", 0);
+GEN_test_VFNMSUBSS_xmm(VFNMSUBSS)
+
+#define DO_test_block(_name, _sub, _bname, _block) \
+ test_##_name##_##_sub(_bname,_block);
+
+#define DO_test(_name, _sub, _isD) { \
+ Block* b = memalign32(sizeof(Block)); \
+ oneBlock(b); \
+ DO_test_block(_name, _sub, "ones", b); \
+ if (_isD) { \
+ specialDBlock(b); \
+ DO_test_block(_name, _sub, "specialD", b); \
+ } else { \
+ specialFBlock(b); \
+ DO_test_block(_name, _sub, "specialF", b); \
+ } \
+ randBlock(b); \
+ DO_test_block(_name, _sub, "rand", b); \
+ free(b); \
+}
+
+#define DO_tests_xmm(_name,_isD) \
+ DO_test(_name, xmm, _isD); \
+ DO_test(_name, xmm_src_dst, _isD); \
+ DO_test(_name, xmm_mem1, _isD); \
+ DO_test(_name, xmm_mem2, _isD);
+
+#define DO_tests_ymm(_name,_isD) \
+ DO_test(_name, ymm, _isD); \
+ DO_test(_name, ymm_src_dst, _isD); \
+ DO_test(_name, ymm_mem1, _isD); \
+ DO_test(_name, ymm_mem2, _isD);
+
+int main ( void )
+{
+ init_special_values();
+
+ // 128
+ DO_tests_xmm(VFMADDPD, 1);
+ DO_tests_xmm(VFMADDPS, 0);
+ DO_tests_xmm(VFMADDSD, 1);
+ DO_tests_xmm(VFMADDSS, 0);
+ DO_tests_xmm(VFMADDSUBPD, 1);
+ DO_tests_xmm(VFMADDSUBPS, 0);
+ DO_tests_xmm(VFMSUBADDPD, 1);
+ DO_tests_xmm(VFMSUBADDPS, 0);
+ DO_tests_xmm(VFMSUBPD, 1);
+ DO_tests_xmm(VFMSUBPS, 0);
+ DO_tests_xmm(VFMSUBSD, 1);
+ DO_tests_xmm(VFMSUBSS, 0);
+ DO_tests_xmm(VFNMADDPD, 1);
+ DO_tests_xmm(VFNMADDPS, 0);
+ DO_tests_xmm(VFNMADDSD, 1);
+ DO_tests_xmm(VFNMADDSS, 0);
+ DO_tests_xmm(VFNMSUBPD, 1);
+ DO_tests_xmm(VFNMSUBPS, 0);
+ DO_tests_xmm(VFNMSUBSD, 1);
+ DO_tests_xmm(VFNMSUBSS, 0);
+
+ // 256
+ /*
+ DO_tests_ymm(VFMADDPD, 1);
+ DO_tests_ymm(VFMADDPS, 0);
+ DO_tests_ymm(VFMADDSUBPD, 1);
+ DO_tests_ymm(VFMADDSUBPS, 0);
+ DO_tests_ymm(VFMSUBADDPD, 1);
+ DO_tests_ymm(VFMSUBADDPS, 0);
+ DO_tests_ymm(VFMSUBPD, 1);
+ DO_tests_ymm(VFMSUBPS, 0);
+ DO_tests_ymm(VFNMADDPD, 1);
+ DO_tests_ymm(VFNMADDPS, 0);
+ DO_tests_ymm(VFNMSUBPD, 1);
+ DO_tests_ymm(VFNMSUBPS, 0);
+ */
+
+ return 0;
+}
Added: trunk/none/tests/amd64/fma4.stderr.exp
==============================================================================
(empty)
Added: trunk/none/tests/amd64/fma4.stdout.exp
==============================================================================
--- trunk/none/tests/amd64/fma4.stdout.exp (added)
+++ trunk/none/tests/amd64/fma4.stdout.exp Mon Sep 19 13:41:38 2016
@@ -0,0 +1,3360 @@
+VFMADDPD_xmm ones
+ before
+r1: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r2: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r3: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r4: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+ m: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+ after
+r1: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r2: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r3: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r4: [ ZERO ].[ ZERO ].0101010101010101.0101010101010101
+ m: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+
+VFMADDPD_xmm specialD
+ before
+r1: bff0000000000000.3ff0000000000000.[ -ZERO ].[ ZERO ]
+r2: [ NAN ].[ NAN ].[ -INF ].[ INF ]
+r3: [ -ZERO ].[ ZERO ].[ -SUBNORMAL ].[ SUBNORMAL ]
+r4: [ -INF ].[ INF ].bff0000000000000.3ff0000000000000
+ m: [ -SUBNORMAL ].[ SUBNORMAL ].[ NAN ].[ NAN ]
+ after
+r1: bff0000000000000.3ff0000000000000.[ -ZERO ].[ ZERO ]
+r2: [ NAN ].[ NAN ].[ -INF ].[ INF ]
+r3: [ -ZERO ].[ ZERO ].[ -SUBNORMAL ].[ SUBNORMAL ]
+r4: [ ZERO ].[ ZERO ].[ INF ].[ INF ]
+ m: [ -SUBNORMAL ].[ SUBNORMAL ].[ NAN ].[ NAN ]
+
+VFMADDPD_xmm rand
+ before
+r1: 7d6528c5fa956a0d.69c3e9a6af27d13b.5175e39d19c9ca1e.98f24a4984175700
+r2: b6d2fb5aa7bc5127.fe9915e556a044b2.60b160857d45c484.47b8d8c0eeef1e50
+r3: 065d77195d623e6b.842adc6450659e17.19a348215c3a67fd.399182c2dbcc2d38
+r4: cb509970b8136c85.d740b80eb7839b97.d89998df5035ed36.4a4bc43968bc40e5
+ m: 5ff85bc9535c191f.d3a727d1a705f65d.f9dd4a29f8c093db.56b01a12b0ca1583
+ after
+r1: 7d6528c5fa956a0d.69c3e9a6af27d13b.5175e39d19c9ca1e.98f24a4984175700
+r2: b6d2fb5aa7bc5127.fe9915e556a044b2.60b160857d45c484.47b8d8c0eeef1e50
+r3: 065d77195d623e6b.842adc6450659e17.19a348215c3a67fd.399182c2dbcc2d38
+r4: [ ZERO ].[ ZERO ].5175e39d19c9ca1e.415b315cb6ea9ab9
+ m: 5ff85bc9535c191f.d3a727d1a705f65d.f9dd4a29f8c093db.56b01a12b0ca1583
+
+VFMADDPD_xmm_src_dst ones
+ before
+r1: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r2: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r3: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r4: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+ m: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+ after
+r1: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r2: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r3: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r4: [ ZERO ].[ ZERO ].0101010101010101.0101010101010101
+ m: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+
+VFMADDPD_xmm_src_dst specialD
+ before
+r1: bff0000000000000.3ff0000000000000.[ -ZERO ].[ ZERO ]
+r2: [ NAN ].[ NAN ].[ -INF ].[ INF ]
+r3: [ -ZERO ].[ ZERO ].[ -SUBNORMAL ].[ SUBNORMAL ]
+r4: [ -INF ].[ INF ].bff0000000000000.3ff0000000000000
+ m: [ -SUBNORMAL ].[ SUBNORMAL ].[ NAN ].[ NAN ]
+ after
+r1: bff0000000000000.3ff0000000000000.[ -ZERO ].[ ZERO ]
+r2: [ NAN ].[ NAN ].[ -INF ].[ INF ]
+r3: [ -ZERO ].[ ZERO ].[ -SUBNORMAL ].[ SUBNORMAL ]
+r4: [ ZERO ].[ ZERO ].[ INF ].[ INF ]
+ m: [ -SUBNORMAL ].[ SUBNORMAL ].[ NAN ].[ NAN ]
+
+VFMADDPD_xmm_src_dst rand
+ before
+r1: 20a1bb92cbc97fe8.542da4983df76c96.d8bc5c6dee699597.398e0039cf03663d
+r2: 6897b536bbe4da8a.369dab4f9465b86e.d182c916cebc2e17.cfaff39be272ef40
+r3: 95264321bf3b68b2.55c2b9e2c95c9810.407b8d9035449b06.f4e06e2205236eb7
+r4: 019963bf7459630b.8d69483df7e8c6a9.81f2a547be8d1811.84ededbc53239dcf
+ m: 0a3e0f7c75cb0842.b95ed64d3b13ff64.f0350ca70523e0e4.5ba1ec54e87d39b3
+ after
+r1: 20a1bb92cbc97fe8.542da4983df76c96.d8bc5c6dee699597.398e0039cf03663d
+r2: 6897b536bbe4da8a.369dab4f9465b86e.d182c916cebc2e17.cfaff39be272ef40
+r3: 95264321bf3b68b2.55c2b9e2c95c9810.407b8d9035449b06.f4e06e2205236eb7
+r4: [ ZERO ].[ ZERO ].d8bc5c6dee699597.398e0039cf03663d
+ m: 0a3e0f7c75cb0842.b95ed64d3b13ff64.f0350ca70523e0e4.5ba1ec54e87d39b3
+
+VFMADDPD_xmm_mem1 ones
+ before
+r1: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r2: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r3: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r4: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+ m: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+ after
+r1: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r2: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r3: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r4: [ ZERO ].[ ZERO ].0101010101010101.0101010101010101
+ m: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+
+VFMADDPD_xmm_mem1 specialD
+ before
+r1: bff0000000000000.3ff0000000000000.[ -ZERO ].[ ZERO ]
+r2: [ NAN ].[ NAN ].[ -INF ].[ INF ]
+r3: [ -ZERO ].[ ZERO ].[ -SUBNORMAL ].[ SUBNORMAL ]
+r4: [ -INF ].[ INF ].bff0000000000000.3ff0000000000000
+ m: [ -SUBNORMAL ].[ SUBNORMAL ].[ NAN ].[ NAN ]
+ after
+r1: bff0000000000000.3ff0000000000000.[ -ZERO ].[ ZERO ]
+r2: [ NAN ].[ NAN ].[ -INF ].[ INF ]
+r3: [ -ZERO ].[ ZERO ].[ -SUBNORMAL ].[ SUBNORMAL ]
+r4: [ ZERO ].[ ZERO ].[ NAN ].[ NAN ]
+ m: [ -SUBNORMAL ].[ SUBNORMAL ].[ NAN ].[ NAN ]
+
+VFMADDPD_xmm_mem1 rand
+ before
+r1: 0a5f45c55f1c9202.b76ddefcb0ebfe6e.e98ebd1ca893312a.54cae7d5e13dfe91
+r2: 5f490104ced83ff8.6262dd37727c80f3.c84ab71340684590.4d325b2d5a70a792
+r3: 63483da65c8c49d0.96084deb9ed0411e.e9b5f3f66b2e58c1.21a6c3476d21f1e5
+r4: 73a8f718a8c3ec35.2e2dac0350f6fd1c.a81b6e33c572a86a.acf29b0f395c98b4
+ m: ecb42ac54b0966d4.089b756aa3f77018.61c82534e9bf6f37.c9e25f72d82e582b
+ after
+r1: 0a5f45c55f1c9202.b76ddefcb0ebfe6e.e98ebd1ca893312a.54cae7d5e13dfe91
+r2: 5f490104ced83ff8.6262dd37727c80f3.c84ab71340684590.4d325b2d5a70a792
+r3: 63483da65c8c49d0.96084deb9ed0411e.e9b5f3f66b2e58c1.21a6c3476d21f1e5
+r4: [ ZERO ].[ ZERO ].721253d095545e3c.c9e25f72d82e582b
+ m: ecb42ac54b0966d4.089b756aa3f77018.61c82534e9bf6f37.c9e25f72d82e582b
+
+VFMADDPD_xmm_mem2 ones
+ before
+r1: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r2: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r3: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r4: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+ m: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+ after
+r1: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r2: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r3: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r4: [ ZERO ].[ ZERO ].0101010101010101.0101010101010101
+ m: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+
+VFMADDPD_xmm_mem2 specialD
+ before
+r1: bff0000000000000.3ff0000000000000.[ -ZERO ].[ ZERO ]
+r2: [ NAN ].[ NAN ].[ -INF ].[ INF ]
+r3: [ -ZERO ].[ ZERO ].[ -SUBNORMAL ].[ SUBNORMAL ]
+r4: [ -INF ].[ INF ].bff0000000000000.3ff0000000000000
+ m: [ -SUBNORMAL ].[ SUBNORMAL ].[ NAN ].[ NAN ]
+ after
+r1: bff0000000000000.3ff0000000000000.[ -ZERO ].[ ZERO ]
+r2: [ NAN ].[ NAN ].[ -INF ].[ INF ]
+r3: [ -ZERO ].[ ZERO ].[ -SUBNORMAL ].[ SUBNORMAL ]
+r4: [ ZERO ].[ ZERO ].[ NAN ].[ NAN ]
+ m: [ -SUBNORMAL ].[ SUBNORMAL ].[ NAN ].[ NAN ]
+
+VFMADDPD_xmm_mem2 rand
+ before
+r1: 28bad218e4ebf159.ff1f240eb3e1553f.6f07136773a2ead3.56428c5a66a2ec77
+r2: 8404eb7f0cf4ca6f.ee8536da9dbf68bc.3026343700a654eb.2ddd9db4ffc411c4
+r3: 5cdf726562b02dc2.b39925ba7d9d67bc.ff6f850f2c57ea2a.2c810e6dc1a1833d
+r4: 0c9761367fac55ff.28276f9a6e880c6b.372f015d9242e83d.2ef85b6fc544fd0f
+ m: f078b65e01737fd2.2bfa8f668c8b14f4.36b2a38dcef18acf.0e0f01a829ba3c66
+ after
+r1: 28bad218e4ebf159.ff1f240eb3e1553f.6f07136773a2ead3.56428c5a66a2ec77
+r2: 8404eb7f0cf4ca6f.ee8536da9dbf68bc.3026343700a654eb.2ddd9db4ffc411c4
+r3: 5cdf726562b02dc2.b39925ba7d9d67bc.ff6f850f2c57ea2a.2c810e6dc1a1833d
+r4: [ ZERO ].[ ZERO ].f6325bf1fc5cab6d.2ddd9db4ffc411c4
+ m: f078b65e01737fd2.2bfa8f668c8b14f4.36b2a38dcef18acf.0e0f01a829ba3c66
+
+VFMADDPS_xmm ones
+ before
+r1: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r2: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r3: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r4: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+ m: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+ after
+r1: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r2: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r3: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].01010101.01010101.01010101.01010101
+ m: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+
+VFMADDPS_xmm specialF
+ before
+r1: [ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ]
+r2: [ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ]
+r3: bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ].[ NAN ].[ NAN ]
+r4: [-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ -INF ].[ INF ]
+ m: [-ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000
+ after
+r1: [ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ]
+r2: [ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ]
+r3: bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ].[ NAN ].[ NAN ]
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].bf800000.3f800000.[ NAN ].[ NAN ]
+ m: [-ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000
+
+VFMADDPS_xmm rand
+ before
+r1: 65ce6d49.8492e7e7.96df010b.f4b23b84.57436a09.7df30b8d.aa927a03.090dfc6d
+r2: c5e48064.a393c8e9.47a34273.c10a3c47.f5304f3e.3ad1a923.dc4c446c.[-SUBNR]
+r3: 6d08ed19.fa045f84.1810cd8c.109ed568.6ec34f98.a2199d3c.810bdacf.ab80ee3d
+r4: b984aed6.2671e865.e6f21d40.fc7bc013.1c4a6784.50562685.769ab818.a5b7985e
+ m: 05a5c205.c3659f38.8e17b17d.a2acb976.5d0f926c.e1157eaa.95c45b33.8afcb3df
+ after
+r1: 65ce6d49.8492e7e7.96df010b.f4b23b84.57436a09.7df30b8d.aa927a03.090dfc6d
+r2: c5e48064.a393c8e9.47a34273.c10a3c47.f5304f3e.3ad1a923.dc4c446c.[-SUBNR]
+r3: 6d08ed19.fa045f84.1810cd8c.109ed568.6ec34f98.a2199d3c.810bdacf.ab80ee3d
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ -INF ].7df30b8d.aa927a03.090dfc6d
+ m: 05a5c205.c3659f38.8e17b17d.a2acb976.5d0f926c.e1157eaa.95c45b33.8afcb3df
+
+VFMADDPS_xmm_src_dst ones
+ before
+r1: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r2: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r3: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r4: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+ m: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+ after
+r1: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r2: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r3: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].01010101.01010101.01010101.01010101
+ m: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+
+VFMADDPS_xmm_src_dst specialF
+ before
+r1: [ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ]
+r2: [ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ]
+r3: bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ].[ NAN ].[ NAN ]
+r4: [-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ -INF ].[ INF ]
+ m: [-ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000
+ after
+r1: [ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ]
+r2: [ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ]
+r3: bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ].[ NAN ].[ NAN ]
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ NAN ].[ NAN ]
+ m: [-ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000
+
+VFMADDPS_xmm_src_dst rand
+ before
+r1: acb72214.6c6cbfa9.ea4a022e.1d3d7dbb.8b5fccbe.f0e1e256.bc563e0c.775bfaed
+r2: 0c05cb6e.bd128663.d7568e3e.8a3ac80e.048612e5.1a468e36.c51cdd8f.87e12ab4
+r3: 80ddba7e.53e42d12.3208cf9b.04b0569c.22cf5e4c.fad1bdf5.8de2b4a9.d799ff5f
+r4: 6489eab2.c96df363.d52c4330.a7aae391.4288ae61.2c0dad40.f0733f44.8390351b
+ m: 14575775.bc3a1202.9d8e66ea.90352a18.c1fbfd8f.4d8698c2.cb9dfb4e.a5d18713
+ after
+r1: acb72214.6c6cbfa9.ea4a022e.1d3d7dbb.8b5fccbe.f0e1e256.bc563e0c.775bfaed
+r2: 0c05cb6e.bd128663.d7568e3e.8a3ac80e.048612e5.1a468e36.c51cdd8f.87e12ab4
+r3: 80ddba7e.53e42d12.3208cf9b.04b0569c.22cf5e4c.fad1bdf5.8de2b4a9.d799ff5f
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].8b5eae69.f0e1e256.76150d13.775bfaed
+ m: 14575775.bc3a1202.9d8e66ea.90352a18.c1fbfd8f.4d8698c2.cb9dfb4e.a5d18713
+
+VFMADDPS_xmm_mem1 ones
+ before
+r1: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r2: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r3: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r4: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+ m: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+ after
+r1: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r2: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r3: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].01010101.01010101.01010101.01010101
+ m: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+
+VFMADDPS_xmm_mem1 specialF
+ before
+r1: [ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ]
+r2: [ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ]
+r3: bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ].[ NAN ].[ NAN ]
+r4: [-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ -INF ].[ INF ]
+ m: [-ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000
+ after
+r1: [ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ]
+r2: [ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ]
+r3: bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ].[ NAN ].[ NAN ]
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ -INF ].[ INF ].[ NAN ].[ NAN ]
+ m: [-ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000
+
+VFMADDPS_xmm_mem1 rand
+ before
+r1: ec91fe34.c7d6c79a.66fab2b3.db5ce85e.f9754842.f9c9ba28.f82a63b1.5c68b274
+r2: 4784d959.87cd4ed8.0c3ca578.a32bd88e.474289e7.cb61501e.54e7f35b.c162726a
+r3: 837be651.97abe268.6b1fba26.04afb8d5.08aebee8.5fda964f.bba02737.f3c98220
+r4: fbc42088.94fdc0f5.5f706da7.1bf2425f.9605e2b2.52c1c868.09217c31.0baca0c3
+ m: 0aaa836b.194e242c.c5fc3ae9.04033357.4e92f1b2.40a12214.1a366d35.2714867e
+ after
+r1: ec91fe34.c7d6c79a.66fab2b3.db5ce85e.f9754842.f9c9ba28.f82a63b1.5c68b274
+r2: 4784d959.87cd4ed8.0c3ca578.a32bd88e.474289e7.cb61501e.54e7f35b.c162726a
+r3: 837be651.97abe268.6b1fba26.04afb8d5.08aebee8.5fda964f.bba02737.f3c98220
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].4e92f1b2.ebc06284.d1111ba1.75b23ef0
+ m: 0aaa836b.194e242c.c5fc3ae9.04033357.4e92f1b2.40a12214.1a366d35.2714867e
+
+VFMADDPS_xmm_mem2 ones
+ before
+r1: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r2: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r3: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r4: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+ m: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+ after
+r1: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r2: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r3: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].01010101.01010101.01010101.01010101
+ m: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+
+VFMADDPS_xmm_mem2 specialF
+ before
+r1: [ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ]
+r2: [ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ]
+r3: bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ].[ NAN ].[ NAN ]
+r4: [-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ -INF ].[ INF ]
+ m: [-ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000
+ after
+r1: [ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ]
+r2: [ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ]
+r3: bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ].[ NAN ].[ NAN ]
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ NAN ].[ NAN ]
+ m: [-ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000
+
+VFMADDPS_xmm_mem2 rand
+ before
+r1: 0e780c65.c22b4ab8.778d9ed6.d9eb46ea.8ca3e752.c306df00.caab752f.630ff07e
+r2: 627bb6e1.2d1f6d46.51ef145c.b9b83843.ac82c100.7a7d3cd8.f54b130c.daa89cef
+r3: 61ff7d4d.f3b6ca81.31f01866.bd76c58f.0a7c7a27.fe917447.77e3c0b6.a9ec44fc
+r4: 69505d14.b27d9d16.f25b26e0.042fa9fa.02dd0e32.eecfc5fa.2c3ffa1a.ebe6a4d2
+ m: d4ba52a2.06ff21b1.70fbbab6.a7f19faf.f0f1798f.e3c1699c.f02b3b25.bca27a9c
+ after
+r1: 0e780c65.c22b4ab8.778d9ed6.d9eb46ea.8ca3e752.c306df00.caab752f.630ff07e
+r2: 627bb6e1.2d1f6d46.51ef145c.b9b83843.ac82c100.7a7d3cd8.f54b130c.daa89cef
+r3: 61ff7d4d.f3b6ca81.31f01866.bd76c58f.0a7c7a27.fe917447.77e3c0b6.a9ec44fc
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].bbee26e1.[ INF ].[ -INF ].daa89cef
+ m: d4ba52a2.06ff21b1.70fbbab6.a7f19faf.f0f1798f.e3c1699c.f02b3b25.bca27a9c
+
+VFMADDSD_xmm ones
+ before
+r1: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r2: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r3: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r4: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+ m: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+ after
+r1: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r2: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r3: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r4: [ ZERO ].[ ZERO ].[ ZERO ].0101010101010101
+ m: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+
+VFMADDSD_xmm specialD
+ before
+r1: bff0000000000000.3ff0000000000000.[ -ZERO ].[ ZERO ]
+r2: [ NAN ].[ NAN ].[ -INF ].[ INF ]
+r3: [ -ZERO ].[ ZERO ].[ -SUBNORMAL ].[ SUBNORMAL ]
+r4: [ -INF ].[ INF ].bff0000000000000.3ff0000000000000
+ m: [ -SUBNORMAL ].[ SUBNORMAL ].[ NAN ].[ NAN ]
+ after
+r1: bff0000000000000.3ff0000000000000.[ -ZERO ].[ ZERO ]
+r2: [ NAN ].[ NAN ].[ -INF ].[ INF ]
+r3: [ -ZERO ].[ ZERO ].[ -SUBNORMAL ].[ SUBNORMAL ]
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ INF ]
+ m: [ -SUBNORMAL ].[ SUBNORMAL ].[ NAN ].[ NAN ]
+
+VFMADDSD_xmm rand
+ before
+r1: 0088596389c893fd.879d51d4c5c764db.3004b7a97cf69dda.9f7301c1392d8087
+r2: 47086cc3da642fa7.130d662777beb4a9.1e61c5ec52f79c60.15e3c8dc7e9273bf
+r3: 0784892e9360315b.f0177599dbe14b46.16559ec50352a3d9.2d460a61a5dd0f6f
+r4: 9a49ac115048d4c4.f987fa170d3ce4dd.742c3e9e2b92eef2.c569453ccd1b0fc4
+ m: 5da3cfd6aea6558e.0c28728e28dc3c9c.9432a2e46543b956.b819f459105730e9
+ after
+r1: 0088596389c893fd.879d51d4c5c764db.3004b7a97cf69dda.9f7301c1392d8087
+r2: 47086cc3da642fa7.130d662777beb4a9.1e61c5ec52f79c60.15e3c8dc7e9273bf
+r3: 0784892e9360315b.f0177599dbe14b46.16559ec50352a3d9.2d460a61a5dd0f6f
+r4: [ ZERO ].[ ZERO ].[ ZERO ].9f7301c1392d8087
+ m: 5da3cfd6aea6558e.0c28728e28dc3c9c.9432a2e46543b956.b819f459105730e9
+
+VFMADDSD_xmm_src_dst ones
+ before
+r1: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r2: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r3: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r4: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+ m: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+ after
+r1: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r2: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r3: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r4: [ ZERO ].[ ZERO ].[ ZERO ].0101010101010101
+ m: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+
+VFMADDSD_xmm_src_dst specialD
+ before
+r1: bff0000000000000.3ff0000000000000.[ -ZERO ].[ ZERO ]
+r2: [ NAN ].[ NAN ].[ -INF ].[ INF ]
+r3: [ -ZERO ].[ ZERO ].[ -SUBNORMAL ].[ SUBNORMAL ]
+r4: [ -INF ].[ INF ].bff0000000000000.3ff0000000000000
+ m: [ -SUBNORMAL ].[ SUBNORMAL ].[ NAN ].[ NAN ]
+ after
+r1: bff0000000000000.3ff0000000000000.[ -ZERO ].[ ZERO ]
+r2: [ NAN ].[ NAN ].[ -INF ].[ INF ]
+r3: [ -ZERO ].[ ZERO ].[ -SUBNORMAL ].[ SUBNORMAL ]
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ INF ]
+ m: [ -SUBNORMAL ].[ SUBNORMAL ].[ NAN ].[ NAN ]
+
+VFMADDSD_xmm_src_dst rand
+ before
+r1: adddf0eb4808f067.04c857e949cc0fac.d2b3c4044ef23fb2.e22093a48a9d2e0b
+r2: e4450ababbfae0f9.bc3127138b19183c.89fba268812abdb2.1e4a9e0958fac555
+r3: 5f2619b1a20662f0.12305efa0acd1475.1755377e9a786f01.4a6592749579b0f4
+r4: 7acb193b9abab2f9.e1917689e3f6bf86.d70f7fb13667914c.413cead25e27ac14
+ m: 918107c43ea20cc0.0420edac31a0d599.2573776df1835e3e.de9a220dce0e75e0
+ after
+r1: adddf0eb4808f067.04c857e949cc0fac.d2b3c4044ef23fb2.e22093a48a9d2e0b
+r2: e4450ababbfae0f9.bc3127138b19183c.89fba268812abdb2.1e4a9e0958fac555
+r3: 5f2619b1a20662f0.12305efa0acd1475.1755377e9a786f01.4a6592749579b0f4
+r4: [ ZERO ].[ ZERO ].[ ZERO ].e22093a48a9d2e0b
+ m: 918107c43ea20cc0.0420edac31a0d599.2573776df1835e3e.de9a220dce0e75e0
+
+VFMADDSD_xmm_mem1 ones
+ before
+r1: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r2: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r3: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r4: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+ m: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+ after
+r1: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r2: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r3: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r4: [ ZERO ].[ ZERO ].[ ZERO ].0101010101010101
+ m: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+
+VFMADDSD_xmm_mem1 specialD
+ before
+r1: bff0000000000000.3ff0000000000000.[ -ZERO ].[ ZERO ]
+r2: [ NAN ].[ NAN ].[ -INF ].[ INF ]
+r3: [ -ZERO ].[ ZERO ].[ -SUBNORMAL ].[ SUBNORMAL ]
+r4: [ -INF ].[ INF ].bff0000000000000.3ff0000000000000
+ m: [ -SUBNORMAL ].[ SUBNORMAL ].[ NAN ].[ NAN ]
+ after
+r1: bff0000000000000.3ff0000000000000.[ -ZERO ].[ ZERO ]
+r2: [ NAN ].[ NAN ].[ -INF ].[ INF ]
+r3: [ -ZERO ].[ ZERO ].[ -SUBNORMAL ].[ SUBNORMAL ]
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ NAN ]
+ m: [ -SUBNORMAL ].[ SUBNORMAL ].[ NAN ].[ NAN ]
+
+VFMADDSD_xmm_mem1 rand
+ before
+r1: 0194ddb82b49abf0.59a93d4f11d611db.5cce191e65591384.ff4cb613013cc685
+r2: 24509983fc3bcc36.baf7e45e9fa43077.da6c63303173ecc9.7e1e22cf15bd5c2f
+r3: 570037914d04ab3d.05d75ec6f616ee9a.fa99500fef6024ba.39dce32c239cf309
+r4: f6f2b14fbb3184b2.141625713239066f.17a0dc273ba9f803.0a52741849e54740
+ m: 5d700527e24d9241.c57eb74d70183523.8fcf04e5b2dca44f.cf4c517ea3a413ff
+ after
+r1: 0194ddb82b49abf0.59a93d4f11d611db.5cce191e65591384.ff4cb613013cc685
+r2: 24509983fc3bcc36.baf7e45e9fa43077.da6c63303173ecc9.7e1e22cf15bd5c2f
+r3: 570037914d04ab3d.05d75ec6f616ee9a.fa99500fef6024ba.39dce32c239cf309
+r4: [ ZERO ].[ ZERO ].[ ZERO ].780b3465b16e86e6
+ m: 5d700527e24d9241.c57eb74d70183523.8fcf04e5b2dca44f.cf4c517ea3a413ff
+
+VFMADDSD_xmm_mem2 ones
+ before
+r1: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r2: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r3: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r4: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+ m: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+ after
+r1: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r2: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r3: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+r4: [ ZERO ].[ ZERO ].[ ZERO ].0101010101010101
+ m: 0101010101010101.0101010101010101.0101010101010101.0101010101010101
+
+VFMADDSD_xmm_mem2 specialD
+ before
+r1: bff0000000000000.3ff0000000000000.[ -ZERO ].[ ZERO ]
+r2: [ NAN ].[ NAN ].[ -INF ].[ INF ]
+r3: [ -ZERO ].[ ZERO ].[ -SUBNORMAL ].[ SUBNORMAL ]
+r4: [ -INF ].[ INF ].bff0000000000000.3ff0000000000000
+ m: [ -SUBNORMAL ].[ SUBNORMAL ].[ NAN ].[ NAN ]
+ after
+r1: bff0000000000000.3ff0000000000000.[ -ZERO ].[ ZERO ]
+r2: [ NAN ].[ NAN ].[ -INF ].[ INF ]
+r3: [ -ZERO ].[ ZERO ].[ -SUBNORMAL ].[ SUBNORMAL ]
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ NAN ]
+ m: [ -SUBNORMAL ].[ SUBNORMAL ].[ NAN ].[ NAN ]
+
+VFMADDSD_xmm_mem2 rand
+ before
+r1: e8c72e865de41295.f2db8f44cbbf37e2.bc70c3b3ef84644b.6295f64a4ce61473
+r2: f34428d9c8833f5b.78fb29445f3bc8d7.fcd015ff8f2e73a3.a0fae06860b606c7
+r3: da30ef8bc0b5573e.34a901384a97a32f.a93bf6332d650e02.66478ac4fc21a428
+r4: f9da7f07e00794eb.00b0940ba5e08516.20fd62bd65b57115.8e48704b3c31abc2
+ m: ac8dd5bbc503330e.b9dd5dab8e212ab7.be625608d5abd787.f5c90ee73af5d7c0
+ after
+r1: e8c72e865de41295.f2db8f44cbbf37e2.bc70c3b3ef84644b.6295f64a4ce61473
+r2: f34428d9c8833f5b.78fb29445f3bc8d7.fcd015ff8f2e73a3.a0fae06860b606c7
+r3: da30ef8bc0b5573e.34a901384a97a32f.a93bf6332d650e02.66478ac4fc21a428
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ -INF ]
+ m: ac8dd5bbc503330e.b9dd5dab8e212ab7.be625608d5abd787.f5c90ee73af5d7c0
+
+VFMADDSS_xmm ones
+ before
+r1: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r2: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r3: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r4: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+ m: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+ after
+r1: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r2: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r3: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].01010101
+ m: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+
+VFMADDSS_xmm specialF
+ before
+r1: [ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ]
+r2: [ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ]
+r3: bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ].[ NAN ].[ NAN ]
+r4: [-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ -INF ].[ INF ]
+ m: [-ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000
+ after
+r1: [ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ]
+r2: [ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ]
+r3: bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ].[ NAN ].[ NAN ]
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ NAN ]
+ m: [-ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000
+
+VFMADDSS_xmm rand
+ before
+r1: 4e94ec12.0b386f52.3bfcd803.21664d3e.ddb5cd80.16d27d05.7796e086.1576e44f
+r2: 3d3cc078.4c2f8563.63d98100.79bbabd9.db43c391.c6b69f3a.f17a6312.e7c28d9a
+r3: d4d14e59.2776b1ef.0b40d58c.b22d00b1.125934a7.81e479d3.3d431279.cce48fce
+r4: 6f9f9022.35982fa0.10fd4e94.e9c808f5.df411d2e.e2e7467c.38bb69a6.e1e9a617
+ m: 69f2843d.15223a22.4edb6a05.3a967ecf.9e477892.854b43e0.beafe485.41dc8da0
+ after
+r1: 4e94ec12.0b386f52.3bfcd803.21664d3e.ddb5cd80.16d27d05.7796e086.1576e44f
+r2: 3d3cc078.4c2f8563.63d98100.79bbabd9.db43c391.c6b69f3a.f17a6312.e7c28d9a
+r3: d4d14e59.2776b1ef.0b40d58c.b22d00b1.125934a7.81e479d3.3d431279.cce48fce
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].752db367
+ m: 69f2843d.15223a22.4edb6a05.3a967ecf.9e477892.854b43e0.beafe485.41dc8da0
+
+VFMADDSS_xmm_src_dst ones
+ before
+r1: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r2: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r3: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r4: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+ m: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+ after
+r1: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r2: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r3: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].01010101
+ m: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+
+VFMADDSS_xmm_src_dst specialF
+ before
+r1: [ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ]
+r2: [ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ]
+r3: bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ].[ NAN ].[ NAN ]
+r4: [-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ -INF ].[ INF ]
+ m: [-ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000
+ after
+r1: [ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ]
+r2: [ -INF ].[ INF ].bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ]
+r3: bf800000.3f800000.[-ZERO ].[ ZERO ].[-ZERO ].[ ZERO ].[ NAN ].[ NAN ]
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ NAN ]
+ m: [-ZERO ].[ ZERO ].[ NAN ].[ NAN ].[ -INF ].[ INF ].bf800000.3f800000
+
+VFMADDSS_xmm_src_dst rand
+ before
+r1: 20162517.609f0f22.a1a7a4c9.c0a51f6b.acb9433f.079dacac.abeb0002.08c90296
+r2: ef56701d.b49bea4c.e52e79ce.9700a7f7.63e279a2.0368bc8b.db3b3709.54bcbf24
+r3: 31005fb9.ada2074b.f63a63fe.dcb4d29c.200d1726.1638b12a.2a6a0786.3ec28077
+r4: 445ef059.e641a1cc.b097e047.aacc5b89.3f871736.dc9ac535.7446eb65.e4e703bb
+ m: 83bd1e68.fb03f57b.ef136b94.1e54ffe8.1c9c7740.ef193457.95996092.6235021b
+ after
+r1: 20162517.609f0f22.a1a7a4c9.c0a51f6b.acb9433f.079dacac.abeb0002.08c90296
+r2: ef56701d.b49bea4c.e52e79ce.9700a7f7.63e279a2.0368bc8b.db3b3709.54bcbf24
+r3: 31005fb9.ada2074b.f63a63fe.dcb4d29c.200d1726.1638b12a.2a6a0786.3ec28077
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].fa2a533a
+ m: 83bd1e68.fb03f57b.ef136b94.1e54ffe8.1c9c7740.ef193457.95996092.6235021b
+
+VFMADDSS_xmm_mem1 ones
+ before
+r1: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r2: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r3: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r4: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+ m: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+ after
+r1: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r2: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r3: 01010101.01010101.01010101.01010101.01010101.01010101.01010101.01010101
+r4: [ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].[ ZERO ].01010101
+ m: 01010101.01010101.0101...
[truncated message content] |
|
From: <sv...@va...> - 2016-09-19 12:41:28
|
Author: mjw
Date: Mon Sep 19 13:41:19 2016
New Revision: 3249
Log:
Implement AMD FMA4 instructions. Bug #369000.
Original patch by p4...@gm....
Modified:
trunk/priv/guest_amd64_toIR.c
Modified: trunk/priv/guest_amd64_toIR.c
==============================================================================
--- trunk/priv/guest_amd64_toIR.c (original)
+++ trunk/priv/guest_amd64_toIR.c Mon Sep 19 13:41:19 2016
@@ -30096,6 +30096,136 @@
return delta;
}
+/* operand format:
+ * [0] = dst
+ * [n] = srcn
+ */
+static Long decode_vregW(Int count, Long delta, UChar modrm, Prefix pfx,
+ const VexAbiInfo* vbi, IRTemp *v, UInt *dst, Int swap)
+{
+ v[0] = newTemp(Ity_V128);
+ v[1] = newTemp(Ity_V128);
+ v[2] = newTemp(Ity_V128);
+ v[3] = newTemp(Ity_V128);
+ IRTemp addr = IRTemp_INVALID;
+ Int alen = 0;
+ HChar dis_buf[50];
+
+ *dst = gregOfRexRM(pfx, modrm);
+ assign( v[0], getXMMReg(*dst) );
+
+ if ( epartIsReg( modrm ) ) {
+ UInt ereg = eregOfRexRM(pfx, modrm);
+ assign(swap ? v[count-1] : v[count-2], getXMMReg(ereg) );
+ DIS(dis_buf, "%s", nameXMMReg(ereg));
+ } else {
+ Bool extra_byte = (getUChar(delta - 3) & 0xF) != 9;
+ addr = disAMode(&alen, vbi, pfx, delta, dis_buf, extra_byte);
+ assign(swap ? v[count-1] : v[count-2], loadLE(Ity_V128, mkexpr(addr)));
+ delta += alen - 1;
+ }
+
+ UInt vvvv = getVexNvvvv(pfx);
+ switch(count) {
+ case 2:
+ DIP( "%s,%s", nameXMMReg(*dst), dis_buf );
+ break;
+ case 3:
+ assign( swap ? v[1] : v[2], getXMMReg(vvvv) );
+ DIP( "%s,%s,%s", nameXMMReg(*dst), nameXMMReg(vvvv), dis_buf );
+ break;
+ case 4:
+ {
+ assign( v[1], getXMMReg(vvvv) );
+ UInt src2 = getUChar(delta + 1) >> 4;
+ assign( swap ? v[2] : v[3], getXMMReg(src2) );
+ DIP( "%s,%s,%s,%s", nameXMMReg(*dst), nameXMMReg(vvvv),
+ nameXMMReg(src2), dis_buf );
+ }
+ break;
+ }
+ return delta + 1;
+}
+
+static Long dis_FMA4 (Prefix pfx, Long delta, UChar opc,
+ Bool* uses_vvvv, const VexAbiInfo* vbi )
+{
+ UInt dst;
+ *uses_vvvv = True;
+
+ UChar modrm = getUChar(delta);
+
+ Bool zero_64F = False;
+ Bool zero_96F = False;
+ UInt is_F32 = ((opc & 0x01) == 0x00) ? 1 : 0;
+ Bool neg = (opc & 0xF0) == 0x70;
+ Bool alt = (opc & 0xF0) == 0x50;
+ Bool sub = alt ? (opc & 0x0E) != 0x0E : (opc & 0x0C) == 0x0C;
+
+ IRTemp operand[4];
+ switch(opc & 0xF) {
+ case 0x0A: zero_96F = (opc >> 4) != 0x05; break;
+ case 0x0B: zero_64F = (opc >> 4) != 0x05; break;
+ case 0x0E: zero_96F = (opc >> 4) != 0x05; break;
+ case 0x0F: zero_64F = (opc >> 4) != 0x05; break;
+ default: break;
+ }
+ DIP("vfm%s", neg ? "n" : "");
+ if(alt) DIP("%s", sub ? "add" : "sub");
+ DIP("%s", sub ? "sub" : "add");
+ DIP("%c ", (zero_64F || zero_96F) ? 's' : 'p');
+ DIP("%c ", is_F32 ? 's' : 'd');
+ delta = decode_vregW(4, delta, modrm, pfx, vbi, operand, &dst, getRexW(pfx));
+ DIP("\n");
+ IRExpr *src[3];
+
+ void (*putXMM[2])(UInt,Int,IRExpr*) = {&putXMMRegLane64F, &putXMMRegLane32F};
+
+ IROp size_op[] = {Iop_V128to64, Iop_V128HIto64, Iop_64to32, Iop_64HIto32};
+ IROp neg_op[] = {Iop_NegF64, Iop_NegF32};
+ int i, j;
+ for(i = 0; i < is_F32 * 2 + 2; i++) {
+ for(j = 0; j < 3; j++) {
+ if(is_F32) {
+ src[j] = unop(Iop_ReinterpI32asF32,
+ unop(size_op[i%2+2],
+ unop(size_op[i/2],
+ mkexpr(operand[j + 1])
+ )
+ ));
+ } else {
+ src[j] = unop(Iop_ReinterpI64asF64,
+ unop(size_op[i%2],
+ mkexpr(operand[j + 1])
+ ));
+ }
+ }
+ putXMM[is_F32](dst, i, IRExpr_Qop(is_F32 ? Iop_MAddF32 : Iop_MAddF64,
+ get_FAKE_roundingmode(),
+ neg ? unop(neg_op[is_F32], src[0])
+ : src[0],
+ src[1],
+ sub ? unop(neg_op[is_F32], src[2])
+ : src[2]
+ ));
+ if(alt) {
+ sub = !sub;
+ }
+ }
+
+ /* Zero out top bits of ymm/xmm register. */
+ putYMMRegLane128( dst, 1, mkV128(0) );
+
+ if(zero_64F || zero_96F) {
+ putXMMRegLane64( dst, 1, IRExpr_Const(IRConst_U64(0)));
+ }
+
+ if(zero_96F) {
+ putXMMRegLane32( dst, 1, IRExpr_Const(IRConst_U32(0)));
+ }
+
+ return delta+1;
+}
/*------------------------------------------------------------*/
/*--- ---*/
@@ -31640,6 +31770,16 @@
/* else fall though; dis_PCMPxSTRx failed to decode it */
}
break;
+ case 0x5C ... 0x5F:
+ case 0x68 ... 0x6F:
+ case 0x78 ... 0x7F:
+ if (have66noF2noF3(pfx) && 0==getVexL(pfx)/*128*/) {
+ Long delta0 = delta;
+ delta = dis_FMA4( pfx, delta, opc, uses_vvvv, vbi );
+ if (delta > delta0) goto decode_success;
+ /* else fall though; dis_FMA4 failed to decode it */
+ }
+ break;
case 0xDF:
/* VAESKEYGENASSIST imm8, xmm2/m128, xmm1 = VEX.128.66.0F3A.WIG DF /r */
|
Author: mjw
Date: Mon Sep 19 09:08:51 2016
New Revision: 15960
Log:
Fix bad gdbserver_tests heap usage tests stderr output.
When doing inferior function calls from gdb (in mcmain_pic) there might
be extra heap usage from gdb that we aren't interested in tracking.
Modified:
trunk/gdbserver_tests/filter_memcheck_monitor
trunk/gdbserver_tests/mcclean_after_fork.stderr.exp
trunk/gdbserver_tests/mcmain_pic.stderr.exp
trunk/gdbserver_tests/mcmain_pic.stderr.exp-solaris
trunk/gdbserver_tests/mcsignopass.stderr.exp
trunk/gdbserver_tests/mcsigpass.stderr.exp
trunk/gdbserver_tests/mcwatchpoints.stderr.exp
Modified: trunk/gdbserver_tests/filter_memcheck_monitor
==============================================================================
--- trunk/gdbserver_tests/filter_memcheck_monitor (original)
+++ trunk/gdbserver_tests/filter_memcheck_monitor Mon Sep 19 09:08:51 2016
@@ -22,8 +22,13 @@
# Bypass a s390x kernel bug which makes faultstatus test3 fail. In our case, we are
# not interested in checking the si_code, but rather the signal passing
# in mcsig(no)pass
+#
+# When doing inferior function calls from gdb (in mcmain_pic) there might be
+# extra heap usage from gdb that we aren't interested in tracking.
+#
sed -e '/Cannot access memory at address 0x......../d' \
-e '/^[1-9][0-9]* \.\.\/sysdeps\/powerpc\/powerpc32\/dl-start\.S: No such file or directory\./d' \
-e '/^Missing separate debuginfo/d' \
-e '/^Try: zypper install -C/d' \
- -e 's/Test 3: FAIL: expected si_code==2, not 128/Test 3: PASS/'
+ -e 's/Test 3: FAIL: expected si_code==2, not 128/Test 3: PASS/' \
+ -e '/^ total heap usage: /d'
Modified: trunk/gdbserver_tests/mcclean_after_fork.stderr.exp
==============================================================================
--- trunk/gdbserver_tests/mcclean_after_fork.stderr.exp (original)
+++ trunk/gdbserver_tests/mcclean_after_fork.stderr.exp Mon Sep 19 09:08:51 2016
@@ -1,7 +1,6 @@
(action at startup) vgdb me ...
HEAP SUMMARY:
in use at exit: 0 bytes in 0 blocks
- total heap usage: 0 allocs, 0 frees, 0 bytes allocated
For a detailed leak analysis, rerun with: --leak-check=full
For counts of detected and suppressed errors, rerun with: -v
ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Modified: trunk/gdbserver_tests/mcmain_pic.stderr.exp
==============================================================================
--- trunk/gdbserver_tests/mcmain_pic.stderr.exp (original)
+++ trunk/gdbserver_tests/mcmain_pic.stderr.exp Mon Sep 19 09:08:51 2016
@@ -1,7 +1,6 @@
(action at startup) vgdb me ...
HEAP SUMMARY:
in use at exit: 16 bytes in 1 blocks
- total heap usage: 1 allocs, 0 frees, 16 bytes allocated
For a detailed leak analysis, rerun with: --leak-check=full
For counts of detected and suppressed errors, rerun with: -v
ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Modified: trunk/gdbserver_tests/mcmain_pic.stderr.exp-solaris
==============================================================================
--- trunk/gdbserver_tests/mcmain_pic.stderr.exp-solaris (original)
+++ trunk/gdbserver_tests/mcmain_pic.stderr.exp-solaris Mon Sep 19 09:08:51 2016
@@ -1,7 +1,6 @@
(action at startup) vgdb me ...
HEAP SUMMARY:
in use at exit: 131,080 bytes in 1 blocks
- total heap usage: 1 allocs, 0 frees, 131,080 bytes allocated
For a detailed leak analysis, rerun with: --leak-check=full
For counts of detected and suppressed errors, rerun with: -v
ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Modified: trunk/gdbserver_tests/mcsignopass.stderr.exp
==============================================================================
--- trunk/gdbserver_tests/mcsignopass.stderr.exp (original)
+++ trunk/gdbserver_tests/mcsignopass.stderr.exp Mon Sep 19 09:08:51 2016
@@ -9,7 +9,6 @@
Test 4: PASS
HEAP SUMMARY:
in use at exit: 0 bytes in 0 blocks
- total heap usage: 0 allocs, 0 frees, 0 bytes allocated
For a detailed leak analysis, rerun with: --leak-check=full
For counts of detected and suppressed errors, rerun with: -v
ERROR SUMMARY: 11 errors from 1 contexts (suppressed: 0 from 0)
Modified: trunk/gdbserver_tests/mcsigpass.stderr.exp
==============================================================================
--- trunk/gdbserver_tests/mcsigpass.stderr.exp (original)
+++ trunk/gdbserver_tests/mcsigpass.stderr.exp Mon Sep 19 09:08:51 2016
@@ -9,7 +9,6 @@
Test 4: PASS
HEAP SUMMARY:
in use at exit: 0 bytes in 0 blocks
- total heap usage: 0 allocs, 0 frees, 0 bytes allocated
For a detailed leak analysis, rerun with: --leak-check=full
For counts of detected and suppressed errors, rerun with: -v
ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
Modified: trunk/gdbserver_tests/mcwatchpoints.stderr.exp
==============================================================================
--- trunk/gdbserver_tests/mcwatchpoints.stderr.exp (original)
+++ trunk/gdbserver_tests/mcwatchpoints.stderr.exp Mon Sep 19 09:08:51 2016
@@ -16,7 +16,6 @@
value of k50[1000] p
HEAP SUMMARY:
in use at exit: 0 bytes in 0 blocks
- total heap usage: 1 allocs, 1 frees, 50,000 bytes allocated
For a detailed leak analysis, rerun with: --leak-check=full
For counts of detected and suppressed errors, rerun with: -v
ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
|