Discussion:
Valgrind: r16370 - in /trunk/none/tests/amd64: Makefile.am bt_flags.c bt_flags.stderr.exp bt_flags.stdout.exp bt_flags.vgtest
Add Reply
s***@valgrind.org
2017-05-13 16:52:34 UTC
Reply
Permalink
Raw Message
Author: sewardj
Date: Sat May 13 17:52:33 2017
New Revision: 16370

Log:
Add a test case for flag handling for BT/BTC/BTS/BTR. Pertains to #367543.

Added:
trunk/none/tests/amd64/bt_flags.c
trunk/none/tests/amd64/bt_flags.stderr.exp
trunk/none/tests/amd64/bt_flags.stdout.exp
trunk/none/tests/amd64/bt_flags.vgtest
Modified:
trunk/none/tests/amd64/Makefile.am

Modified: trunk/none/tests/amd64/Makefile.am
==============================================================================
--- trunk/none/tests/amd64/Makefile.am (original)
+++ trunk/none/tests/amd64/Makefile.am Sat May 13 17:52:33 2017
@@ -27,6 +27,7 @@
avx2-1.vgtest avx2-1.stdout.exp avx2-1.stderr.exp \
asorep.stderr.exp asorep.stdout.exp asorep.vgtest \
bmi.stderr.exp bmi.stdout.exp bmi.vgtest \
+ bt_flags.stderr.exp bt_flags.stdout.exp bt_flags.vgtest \
fma.stderr.exp fma.stdout.exp fma.vgtest \
bug127521-64.vgtest bug127521-64.stdout.exp bug127521-64.stderr.exp \
bug132813-amd64.vgtest bug132813-amd64.stdout.exp \
@@ -90,6 +91,7 @@
check_PROGRAMS = \
allexec \
amd64locked \
+ bt_flags \
bug127521-64 bug132813-amd64 bug132918 bug137714-amd64 \
clc \
cmpxchg \

Added: trunk/none/tests/amd64/bt_flags.c
==============================================================================
--- trunk/none/tests/amd64/bt_flags.c (added)
+++ trunk/none/tests/amd64/bt_flags.c Sat May 13 17:52:33 2017
@@ -0,0 +1,88 @@
+
+#include <stdio.h>
+#include <string.h>
+
+typedef unsigned long long int ULong;
+typedef unsigned int UInt;
+
+#define CC_SHIFT_O 11
+#define CC_SHIFT_S 7
+#define CC_SHIFT_Z 6
+#define CC_SHIFT_A 4
+#define CC_SHIFT_C 0
+#define CC_SHIFT_P 2
+
+#define CC_MASK_O (1ULL << CC_SHIFT_O)
+#define CC_MASK_S (1ULL << CC_SHIFT_S)
+#define CC_MASK_Z (1ULL << CC_SHIFT_Z)
+#define CC_MASK_A (1ULL << CC_SHIFT_A)
+#define CC_MASK_C (1ULL << CC_SHIFT_C)
+#define CC_MASK_P (1ULL << CC_SHIFT_P)
+
+#define CC_MASK_OSZACP \
+ (CC_MASK_O | CC_MASK_S | CC_MASK_Z | CC_MASK_A | CC_MASK_C | CC_MASK_P)
+
+
+void showFlags(/*OUT*/char* str, int nStr, ULong flags)
+{
+ // Ignore everything except OSZACP, because V differs from real h/w in
+ // flags other than OSZACP, and we don't want that to confuse the
+ // results here
+ memset(str, 0, nStr);
+ sprintf(str, "%c%c%c%c%c%c",
+ (flags & CC_MASK_O) ? 'o' : '-',
+ (flags & CC_MASK_S) ? 's' : '-',
+ (flags & CC_MASK_Z) ? 'z' : '-',
+ (flags & CC_MASK_A) ? 'a' : '-',
+ (flags & CC_MASK_C) ? 'c' : '-',
+ (flags & CC_MASK_P) ? 'p' : '-');
+}
+
+__attribute__((noinline))
+void do_test ( ULong val, UInt ix )
+{
+ ULong o, s, z, a, c, p, flags_before;
+ for (o = 0; o < 2; o++) {
+ for (s = 0; s < 2; s++) {
+ for (z = 0; z < 2; z++) {
+ for (a = 0; a < 2; a++) {
+ for (c = 0; c < 2; c++) {
+ for (p = 0; p < 2; p++) {
+ flags_before = (o ? CC_MASK_O : 0)
+ | (s ? CC_MASK_S : 0)
+ | (z ? CC_MASK_Z : 0)
+ | (a ? CC_MASK_A : 0)
+ | (c ? CC_MASK_C : 0)
+ | (p ? CC_MASK_P : 0);
+ ULong block[4] = { flags_before, val, ix, 0 };
+ __asm__ __volatile__(
+ "movq 0(%0), %%r15" "\n\t" // flags_before
+ "pushq %%r15" "\n\t"
+ "popfq" "\n\t"
+ "movq 8(%0), %%r14" "\n\t" // val
+ "movq 16(%0), %%r13" "\n\t" // ix
+ "bt %%r13, %%r14" "\n\t"
+ "pushfq" "\n\t"
+ "popq %%r15" "\n\t"
+ "movq %%r15, 24(%0)" "\n" // block[3]
+ : : "r"(&block[0]) : "cc","memory","r13","r14","r15"
+ );
+ ULong flags_after = block[3];
+ flags_after &= CC_MASK_OSZACP;
+ char flags_after_str[100];
+ char flags_before_str[100];
+ showFlags(flags_before_str, 100, flags_before);
+ showFlags(flags_after_str, 100, flags_after);
+ printf("flags 0x%03llx(%s) val 0x%llx ix %d -> flags 0x%03llx(%s)\n",
+ flags_before, flags_before_str, val, ix,
+ flags_after, flags_after_str);
+ }}}}}}
+}
+
+int main ( void )
+{
+ do_test(0x8000, 14); // should always return C == 0
+ printf("\n");
+ do_test(0x8000, 15); // should always return C == 1
+ return 0;
+}

Added: trunk/none/tests/amd64/bt_flags.stderr.exp
==============================================================================
--- trunk/none/tests/amd64/bt_flags.stderr.exp (added)
+++ trunk/none/tests/amd64/bt_flags.stderr.exp Sat May 13 17:52:33 2017
@@ -0,0 +1,2 @@
+
+

Added: trunk/none/tests/amd64/bt_flags.stdout.exp
==============================================================================
--- trunk/none/tests/amd64/bt_flags.stdout.exp (added)
+++ trunk/none/tests/amd64/bt_flags.stdout.exp Sat May 13 17:52:33 2017
@@ -0,0 +1,129 @@
+flags 0x000(------) val 0x8000 ix 14 -> flags 0x000(------)
+flags 0x004(-----p) val 0x8000 ix 14 -> flags 0x004(-----p)
+flags 0x001(----c-) val 0x8000 ix 14 -> flags 0x000(------)
+flags 0x005(----cp) val 0x8000 ix 14 -> flags 0x004(-----p)
+flags 0x010(---a--) val 0x8000 ix 14 -> flags 0x010(---a--)
+flags 0x014(---a-p) val 0x8000 ix 14 -> flags 0x014(---a-p)
+flags 0x011(---ac-) val 0x8000 ix 14 -> flags 0x010(---a--)
+flags 0x015(---acp) val 0x8000 ix 14 -> flags 0x014(---a-p)
+flags 0x040(--z---) val 0x8000 ix 14 -> flags 0x040(--z---)
+flags 0x044(--z--p) val 0x8000 ix 14 -> flags 0x044(--z--p)
+flags 0x041(--z-c-) val 0x8000 ix 14 -> flags 0x040(--z---)
+flags 0x045(--z-cp) val 0x8000 ix 14 -> flags 0x044(--z--p)
+flags 0x050(--za--) val 0x8000 ix 14 -> flags 0x050(--za--)
+flags 0x054(--za-p) val 0x8000 ix 14 -> flags 0x054(--za-p)
+flags 0x051(--zac-) val 0x8000 ix 14 -> flags 0x050(--za--)
+flags 0x055(--zacp) val 0x8000 ix 14 -> flags 0x054(--za-p)
+flags 0x080(-s----) val 0x8000 ix 14 -> flags 0x080(-s----)
+flags 0x084(-s---p) val 0x8000 ix 14 -> flags 0x084(-s---p)
+flags 0x081(-s--c-) val 0x8000 ix 14 -> flags 0x080(-s----)
+flags 0x085(-s--cp) val 0x8000 ix 14 -> flags 0x084(-s---p)
+flags 0x090(-s-a--) val 0x8000 ix 14 -> flags 0x090(-s-a--)
+flags 0x094(-s-a-p) val 0x8000 ix 14 -> flags 0x094(-s-a-p)
+flags 0x091(-s-ac-) val 0x8000 ix 14 -> flags 0x090(-s-a--)
+flags 0x095(-s-acp) val 0x8000 ix 14 -> flags 0x094(-s-a-p)
+flags 0x0c0(-sz---) val 0x8000 ix 14 -> flags 0x0c0(-sz---)
+flags 0x0c4(-sz--p) val 0x8000 ix 14 -> flags 0x0c4(-sz--p)
+flags 0x0c1(-sz-c-) val 0x8000 ix 14 -> flags 0x0c0(-sz---)
+flags 0x0c5(-sz-cp) val 0x8000 ix 14 -> flags 0x0c4(-sz--p)
+flags 0x0d0(-sza--) val 0x8000 ix 14 -> flags 0x0d0(-sza--)
+flags 0x0d4(-sza-p) val 0x8000 ix 14 -> flags 0x0d4(-sza-p)
+flags 0x0d1(-szac-) val 0x8000 ix 14 -> flags 0x0d0(-sza--)
+flags 0x0d5(-szacp) val 0x8000 ix 14 -> flags 0x0d4(-sza-p)
+flags 0x800(o-----) val 0x8000 ix 14 -> flags 0x800(o-----)
+flags 0x804(o----p) val 0x8000 ix 14 -> flags 0x804(o----p)
+flags 0x801(o---c-) val 0x8000 ix 14 -> flags 0x800(o-----)
+flags 0x805(o---cp) val 0x8000 ix 14 -> flags 0x804(o----p)
+flags 0x810(o--a--) val 0x8000 ix 14 -> flags 0x810(o--a--)
+flags 0x814(o--a-p) val 0x8000 ix 14 -> flags 0x814(o--a-p)
+flags 0x811(o--ac-) val 0x8000 ix 14 -> flags 0x810(o--a--)
+flags 0x815(o--acp) val 0x8000 ix 14 -> flags 0x814(o--a-p)
+flags 0x840(o-z---) val 0x8000 ix 14 -> flags 0x840(o-z---)
+flags 0x844(o-z--p) val 0x8000 ix 14 -> flags 0x844(o-z--p)
+flags 0x841(o-z-c-) val 0x8000 ix 14 -> flags 0x840(o-z---)
+flags 0x845(o-z-cp) val 0x8000 ix 14 -> flags 0x844(o-z--p)
+flags 0x850(o-za--) val 0x8000 ix 14 -> flags 0x850(o-za--)
+flags 0x854(o-za-p) val 0x8000 ix 14 -> flags 0x854(o-za-p)
+flags 0x851(o-zac-) val 0x8000 ix 14 -> flags 0x850(o-za--)
+flags 0x855(o-zacp) val 0x8000 ix 14 -> flags 0x854(o-za-p)
+flags 0x880(os----) val 0x8000 ix 14 -> flags 0x880(os----)
+flags 0x884(os---p) val 0x8000 ix 14 -> flags 0x884(os---p)
+flags 0x881(os--c-) val 0x8000 ix 14 -> flags 0x880(os----)
+flags 0x885(os--cp) val 0x8000 ix 14 -> flags 0x884(os---p)
+flags 0x890(os-a--) val 0x8000 ix 14 -> flags 0x890(os-a--)
+flags 0x894(os-a-p) val 0x8000 ix 14 -> flags 0x894(os-a-p)
+flags 0x891(os-ac-) val 0x8000 ix 14 -> flags 0x890(os-a--)
+flags 0x895(os-acp) val 0x8000 ix 14 -> flags 0x894(os-a-p)
+flags 0x8c0(osz---) val 0x8000 ix 14 -> flags 0x8c0(osz---)
+flags 0x8c4(osz--p) val 0x8000 ix 14 -> flags 0x8c4(osz--p)
+flags 0x8c1(osz-c-) val 0x8000 ix 14 -> flags 0x8c0(osz---)
+flags 0x8c5(osz-cp) val 0x8000 ix 14 -> flags 0x8c4(osz--p)
+flags 0x8d0(osza--) val 0x8000 ix 14 -> flags 0x8d0(osza--)
+flags 0x8d4(osza-p) val 0x8000 ix 14 -> flags 0x8d4(osza-p)
+flags 0x8d1(oszac-) val 0x8000 ix 14 -> flags 0x8d0(osza--)
+flags 0x8d5(oszacp) val 0x8000 ix 14 -> flags 0x8d4(osza-p)
+
+flags 0x000(------) val 0x8000 ix 15 -> flags 0x001(----c-)
+flags 0x004(-----p) val 0x8000 ix 15 -> flags 0x005(----cp)
+flags 0x001(----c-) val 0x8000 ix 15 -> flags 0x001(----c-)
+flags 0x005(----cp) val 0x8000 ix 15 -> flags 0x005(----cp)
+flags 0x010(---a--) val 0x8000 ix 15 -> flags 0x011(---ac-)
+flags 0x014(---a-p) val 0x8000 ix 15 -> flags 0x015(---acp)
+flags 0x011(---ac-) val 0x8000 ix 15 -> flags 0x011(---ac-)
+flags 0x015(---acp) val 0x8000 ix 15 -> flags 0x015(---acp)
+flags 0x040(--z---) val 0x8000 ix 15 -> flags 0x041(--z-c-)
+flags 0x044(--z--p) val 0x8000 ix 15 -> flags 0x045(--z-cp)
+flags 0x041(--z-c-) val 0x8000 ix 15 -> flags 0x041(--z-c-)
+flags 0x045(--z-cp) val 0x8000 ix 15 -> flags 0x045(--z-cp)
+flags 0x050(--za--) val 0x8000 ix 15 -> flags 0x051(--zac-)
+flags 0x054(--za-p) val 0x8000 ix 15 -> flags 0x055(--zacp)
+flags 0x051(--zac-) val 0x8000 ix 15 -> flags 0x051(--zac-)
+flags 0x055(--zacp) val 0x8000 ix 15 -> flags 0x055(--zacp)
+flags 0x080(-s----) val 0x8000 ix 15 -> flags 0x081(-s--c-)
+flags 0x084(-s---p) val 0x8000 ix 15 -> flags 0x085(-s--cp)
+flags 0x081(-s--c-) val 0x8000 ix 15 -> flags 0x081(-s--c-)
+flags 0x085(-s--cp) val 0x8000 ix 15 -> flags 0x085(-s--cp)
+flags 0x090(-s-a--) val 0x8000 ix 15 -> flags 0x091(-s-ac-)
+flags 0x094(-s-a-p) val 0x8000 ix 15 -> flags 0x095(-s-acp)
+flags 0x091(-s-ac-) val 0x8000 ix 15 -> flags 0x091(-s-ac-)
+flags 0x095(-s-acp) val 0x8000 ix 15 -> flags 0x095(-s-acp)
+flags 0x0c0(-sz---) val 0x8000 ix 15 -> flags 0x0c1(-sz-c-)
+flags 0x0c4(-sz--p) val 0x8000 ix 15 -> flags 0x0c5(-sz-cp)
+flags 0x0c1(-sz-c-) val 0x8000 ix 15 -> flags 0x0c1(-sz-c-)
+flags 0x0c5(-sz-cp) val 0x8000 ix 15 -> flags 0x0c5(-sz-cp)
+flags 0x0d0(-sza--) val 0x8000 ix 15 -> flags 0x0d1(-szac-)
+flags 0x0d4(-sza-p) val 0x8000 ix 15 -> flags 0x0d5(-szacp)
+flags 0x0d1(-szac-) val 0x8000 ix 15 -> flags 0x0d1(-szac-)
+flags 0x0d5(-szacp) val 0x8000 ix 15 -> flags 0x0d5(-szacp)
+flags 0x800(o-----) val 0x8000 ix 15 -> flags 0x801(o---c-)
+flags 0x804(o----p) val 0x8000 ix 15 -> flags 0x805(o---cp)
+flags 0x801(o---c-) val 0x8000 ix 15 -> flags 0x801(o---c-)
+flags 0x805(o---cp) val 0x8000 ix 15 -> flags 0x805(o---cp)
+flags 0x810(o--a--) val 0x8000 ix 15 -> flags 0x811(o--ac-)
+flags 0x814(o--a-p) val 0x8000 ix 15 -> flags 0x815(o--acp)
+flags 0x811(o--ac-) val 0x8000 ix 15 -> flags 0x811(o--ac-)
+flags 0x815(o--acp) val 0x8000 ix 15 -> flags 0x815(o--acp)
+flags 0x840(o-z---) val 0x8000 ix 15 -> flags 0x841(o-z-c-)
+flags 0x844(o-z--p) val 0x8000 ix 15 -> flags 0x845(o-z-cp)
+flags 0x841(o-z-c-) val 0x8000 ix 15 -> flags 0x841(o-z-c-)
+flags 0x845(o-z-cp) val 0x8000 ix 15 -> flags 0x845(o-z-cp)
+flags 0x850(o-za--) val 0x8000 ix 15 -> flags 0x851(o-zac-)
+flags 0x854(o-za-p) val 0x8000 ix 15 -> flags 0x855(o-zacp)
+flags 0x851(o-zac-) val 0x8000 ix 15 -> flags 0x851(o-zac-)
+flags 0x855(o-zacp) val 0x8000 ix 15 -> flags 0x855(o-zacp)
+flags 0x880(os----) val 0x8000 ix 15 -> flags 0x881(os--c-)
+flags 0x884(os---p) val 0x8000 ix 15 -> flags 0x885(os--cp)
+flags 0x881(os--c-) val 0x8000 ix 15 -> flags 0x881(os--c-)
+flags 0x885(os--cp) val 0x8000 ix 15 -> flags 0x885(os--cp)
+flags 0x890(os-a--) val 0x8000 ix 15 -> flags 0x891(os-ac-)
+flags 0x894(os-a-p) val 0x8000 ix 15 -> flags 0x895(os-acp)
+flags 0x891(os-ac-) val 0x8000 ix 15 -> flags 0x891(os-ac-)
+flags 0x895(os-acp) val 0x8000 ix 15 -> flags 0x895(os-acp)
+flags 0x8c0(osz---) val 0x8000 ix 15 -> flags 0x8c1(osz-c-)
+flags 0x8c4(osz--p) val 0x8000 ix 15 -> flags 0x8c5(osz-cp)
+flags 0x8c1(osz-c-) val 0x8000 ix 15 -> flags 0x8c1(osz-c-)
+flags 0x8c5(osz-cp) val 0x8000 ix 15 -> flags 0x8c5(osz-cp)
+flags 0x8d0(osza--) val 0x8000 ix 15 -> flags 0x8d1(oszac-)
+flags 0x8d4(osza-p) val 0x8000 ix 15 -> flags 0x8d5(oszacp)
+flags 0x8d1(oszac-) val 0x8000 ix 15 -> flags 0x8d1(oszac-)
+flags 0x8d5(oszacp) val 0x8000 ix 15 -> flags 0x8d5(oszacp)

Added: trunk/none/tests/amd64/bt_flags.vgtest
==============================================================================
--- trunk/none/tests/amd64/bt_flags.vgtest (added)
+++ trunk/none/tests/amd64/bt_flags.vgtest Sat May 13 17:52:33 2017
@@ -0,0 +1 @@
+prog: bt_flags

Loading...