]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add a test case for flag handling for BT/BTC/BTS/BTR. Pertains to #367543.
authorJulian Seward <jseward@acm.org>
Sat, 13 May 2017 16:52:33 +0000 (16:52 +0000)
committerJulian Seward <jseward@acm.org>
Sat, 13 May 2017 16:52:33 +0000 (16:52 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@16370

none/tests/amd64/Makefile.am
none/tests/amd64/bt_flags.c [new file with mode: 0644]
none/tests/amd64/bt_flags.stderr.exp [new file with mode: 0644]
none/tests/amd64/bt_flags.stdout.exp [new file with mode: 0644]
none/tests/amd64/bt_flags.vgtest [new file with mode: 0644]

index 11da02a0681aadb87f9d3cb1b0974b80eaadf1f1..fc85e358ca68ba4e4b9430971eba8cdcd534252a 100644 (file)
@@ -27,6 +27,7 @@ EXTRA_DIST = \
        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 @@ EXTRA_DIST = \
 check_PROGRAMS = \
        allexec \
        amd64locked \
+       bt_flags \
        bug127521-64 bug132813-amd64 bug132918 bug137714-amd64 \
        clc \
        cmpxchg \
diff --git a/none/tests/amd64/bt_flags.c b/none/tests/amd64/bt_flags.c
new file mode 100644 (file)
index 0000000..2991783
--- /dev/null
@@ -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;
+}
diff --git a/none/tests/amd64/bt_flags.stderr.exp b/none/tests/amd64/bt_flags.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/amd64/bt_flags.stdout.exp b/none/tests/amd64/bt_flags.stdout.exp
new file mode 100644 (file)
index 0000000..5139f9a
--- /dev/null
@@ -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)
diff --git a/none/tests/amd64/bt_flags.vgtest b/none/tests/amd64/bt_flags.vgtest
new file mode 100644 (file)
index 0000000..d5f14c1
--- /dev/null
@@ -0,0 +1 @@
+prog: bt_flags