aboutsummaryrefslogtreecommitdiff
path: root/SingleSource/Regression/C/gcc-c-torture/execute/ieee/unsafe-fp-assoc-1.c
diff options
context:
space:
mode:
Diffstat (limited to 'SingleSource/Regression/C/gcc-c-torture/execute/ieee/unsafe-fp-assoc-1.c')
-rw-r--r--SingleSource/Regression/C/gcc-c-torture/execute/ieee/unsafe-fp-assoc-1.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/SingleSource/Regression/C/gcc-c-torture/execute/ieee/unsafe-fp-assoc-1.c b/SingleSource/Regression/C/gcc-c-torture/execute/ieee/unsafe-fp-assoc-1.c
new file mode 100644
index 00000000..56c9ac35
--- /dev/null
+++ b/SingleSource/Regression/C/gcc-c-torture/execute/ieee/unsafe-fp-assoc-1.c
@@ -0,0 +1,39 @@
+extern void abort();
+
+typedef union {
+ struct {
+ unsigned int hi;
+ unsigned int lo;
+ } i;
+ double d;
+} hexdouble;
+
+static const double twoTo52 = 0x1.0p+52;
+
+void func ( double x )
+{
+ hexdouble argument;
+ register double y, z;
+ unsigned int xHead;
+ argument.d = x;
+ xHead = argument.i.hi & 0x7fffffff;
+ if (__builtin_expect(!!(xHead < 0x43300000u), 1))
+ {
+ y = ( x - twoTo52 ) + twoTo52;
+ if ( y != x )
+ abort();
+ z = x - 0.5;
+ y = ( z - twoTo52 ) + twoTo52;
+ if ( y == (( x - twoTo52 ) + twoTo52) )
+ abort();
+ }
+ return;
+}
+
+int main()
+{
+ if (sizeof (double) == 4)
+ return 0;
+ func((double)1.00);
+ return 0;
+}