]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add a test case for non-overwriting of CC_NDEP in shifts by zero.
authorJulian Seward <jseward@acm.org>
Sat, 26 Mar 2011 07:30:39 +0000 (07:30 +0000)
committerJulian Seward <jseward@acm.org>
Sat, 26 Mar 2011 07:30:39 +0000 (07:30 +0000)
See #269354.  (Stephen McCamant, smcc@CS.Berkeley.EDU)

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11667

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

index 1b8aad5c755603252ccfd3ac6fb15bbafbad14cc..ebdd95d8b4aba1afc46039747ed03f4578b74d6e 100644 (file)
@@ -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 (file)
index 0000000..7fc34c9
--- /dev/null
@@ -0,0 +1,42 @@
+#include "tests/asm.h"
+#include <stdio.h>
+
+/* 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 (file)
index 0000000..139597f
--- /dev/null
@@ -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 (file)
index 0000000..9890a0b
--- /dev/null
@@ -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 (file)
index 0000000..1629604
--- /dev/null
@@ -0,0 +1 @@
+prog: shift_ndep