|
From: <sv...@va...> - 2011-03-26 07:30:47
|
Author: sewardj
Date: 2011-03-26 07:30:39 +0000 (Sat, 26 Mar 2011)
New Revision: 11667
Log:
Add a test case for non-overwriting of CC_NDEP in shifts by zero.
See #269354. (Stephen McCamant, smcc@CS.Berkeley.EDU)
Added:
trunk/none/tests/x86/shift_ndep.c
trunk/none/tests/x86/shift_ndep.stderr.exp
trunk/none/tests/x86/shift_ndep.stdout.exp
trunk/none/tests/x86/shift_ndep.vgtest
Modified:
trunk/none/tests/x86/Makefile.am
Modified: trunk/none/tests/x86/Makefile.am
===================================================================
--- trunk/none/tests/x86/Makefile.am 2011-03-25 20:07:25 UTC (rev 11666)
+++ trunk/none/tests/x86/Makefile.am 2011-03-26 07:30:39 UTC (rev 11667)
@@ -54,6 +54,7 @@
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 @@
movx \
pushpopseg \
sbbmisc \
+ shift_ndep \
smc1 \
x86locked \
yield \
Added: trunk/none/tests/x86/shift_ndep.c
===================================================================
--- trunk/none/tests/x86/shift_ndep.c (rev 0)
+++ trunk/none/tests/x86/shift_ndep.c 2011-03-26 07:30:39 UTC (rev 11667)
@@ -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;
+}
Added: trunk/none/tests/x86/shift_ndep.stderr.exp
===================================================================
--- trunk/none/tests/x86/shift_ndep.stderr.exp (rev 0)
+++ trunk/none/tests/x86/shift_ndep.stderr.exp 2011-03-26 07:30:39 UTC (rev 11667)
@@ -0,0 +1,2 @@
+
+
Added: trunk/none/tests/x86/shift_ndep.stdout.exp
===================================================================
--- trunk/none/tests/x86/shift_ndep.stdout.exp (rev 0)
+++ trunk/none/tests/x86/shift_ndep.stdout.exp 2011-03-26 07:30:39 UTC (rev 11667)
@@ -0,0 +1 @@
+Passed (0).
Added: trunk/none/tests/x86/shift_ndep.vgtest
===================================================================
--- trunk/none/tests/x86/shift_ndep.vgtest (rev 0)
+++ trunk/none/tests/x86/shift_ndep.vgtest 2011-03-26 07:30:39 UTC (rev 11667)
@@ -0,0 +1 @@
+prog: shift_ndep
|