From: Julian Seward Date: Sat, 13 May 2017 16:52:33 +0000 (+0000) Subject: Add a test case for flag handling for BT/BTC/BTS/BTR. Pertains to #367543. X-Git-Tag: svn/VALGRIND_3_13_0~64 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5c7234a3edb26058f107b13cc23d9525746c37a8;p=thirdparty%2Fvalgrind.git Add a test case for flag handling for BT/BTC/BTS/BTR. Pertains to #367543. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@16370 --- diff --git a/none/tests/amd64/Makefile.am b/none/tests/amd64/Makefile.am index 11da02a068..fc85e358ca 100644 --- a/none/tests/amd64/Makefile.am +++ b/none/tests/amd64/Makefile.am @@ -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 index 0000000000..299178334d --- /dev/null +++ b/none/tests/amd64/bt_flags.c @@ -0,0 +1,88 @@ + +#include +#include + +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 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/amd64/bt_flags.stderr.exp @@ -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 index 0000000000..5139f9a80f --- /dev/null +++ b/none/tests/amd64/bt_flags.stdout.exp @@ -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 index 0000000000..d5f14c15f5 --- /dev/null +++ b/none/tests/amd64/bt_flags.vgtest @@ -0,0 +1 @@ +prog: bt_flags