From: Julian Seward Date: Sat, 26 Mar 2011 07:30:39 +0000 (+0000) Subject: Add a test case for non-overwriting of CC_NDEP in shifts by zero. X-Git-Tag: svn/VALGRIND_3_7_0~567 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b28bc73ed4f764281d48f217060a38ed31d23bfd;p=thirdparty%2Fvalgrind.git Add a test case for non-overwriting of CC_NDEP in shifts by zero. See #269354. (Stephen McCamant, smcc@CS.Berkeley.EDU) git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11667 --- diff --git a/none/tests/x86/Makefile.am b/none/tests/x86/Makefile.am index 1b8aad5c75..ebdd95d8b4 100644 --- a/none/tests/x86/Makefile.am +++ b/none/tests/x86/Makefile.am @@ -54,6 +54,7 @@ EXTRA_DIST = \ movx.stderr.exp movx.stdout.exp movx.vgtest \ pushpopseg.stderr.exp pushpopseg.stdout.exp pushpopseg.vgtest \ sbbmisc.stderr.exp sbbmisc.stdout.exp sbbmisc.vgtest \ + shift_ndep.stderr.exp shift_ndep.stdout.exp shift_ndep.vgtest \ smc1.stderr.exp smc1.stdout.exp smc1.vgtest \ ssse3_misaligned.stderr.exp ssse3_misaligned.stdout.exp \ ssse3_misaligned.vgtest ssse3_misaligned.c \ @@ -87,6 +88,7 @@ check_PROGRAMS = \ movx \ pushpopseg \ sbbmisc \ + shift_ndep \ smc1 \ x86locked \ yield \ diff --git a/none/tests/x86/shift_ndep.c b/none/tests/x86/shift_ndep.c new file mode 100644 index 0000000000..7fc34c982f --- /dev/null +++ b/none/tests/x86/shift_ndep.c @@ -0,0 +1,42 @@ +#include "tests/asm.h" +#include + +/* Test whether a shift by zero properly preserves the CC_NDEP thunk. */ + +/* Check whether the carry flag is properly preserved by a variable + shift when the shift amount happens to be zero. */ +int shift_ndep( void ) +{ + char shift_amt = 0; + int x = -2; + /* First we set the carry flag. Then we increment %x, which sets + CC_OP to X86G_CC_OP_INCL and stores the carry (1) in + CC_NDEP. Then we left shift %x by a variable amount that happens + to be zero, which should leave both %x and all the flags + unchanged. Then we add-with-carry 0 to %x, which (assuming the + carry is still set as it should be) increments %x again. Thus the + expected final value for x is -2 + 1 + 1 = 0. + + If instead the shift clears CC_NDEP (as it would legally do if + the shift amount were non-zero), this will be interpeted as + clearing the carry bit, so the adc will be a no-op and the final + value of %x will instead be -1. + */ + asm ( + "stc" "\n\t" + "inc %[x]" "\n\t" + "shl %[shift_amt], %[x]" "\n\t" + "adc $0, %[x]" "\n\t" + : [x] "+r" (x) : [shift_amt] "c" (shift_amt)); + return x; +} + +int main ( void ) +{ + int r = shift_ndep(); + if (r == 0) + printf("Passed (%d).\n", r); + else + printf("Failed (%d).\n", r); + return 0; +} diff --git a/none/tests/x86/shift_ndep.stderr.exp b/none/tests/x86/shift_ndep.stderr.exp new file mode 100644 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/x86/shift_ndep.stderr.exp @@ -0,0 +1,2 @@ + + diff --git a/none/tests/x86/shift_ndep.stdout.exp b/none/tests/x86/shift_ndep.stdout.exp new file mode 100644 index 0000000000..9890a0bd79 --- /dev/null +++ b/none/tests/x86/shift_ndep.stdout.exp @@ -0,0 +1 @@ +Passed (0). diff --git a/none/tests/x86/shift_ndep.vgtest b/none/tests/x86/shift_ndep.vgtest new file mode 100644 index 0000000000..1629604aa2 --- /dev/null +++ b/none/tests/x86/shift_ndep.vgtest @@ -0,0 +1 @@ +prog: shift_ndep