This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[4.2 PATCH]: Backport libffi x86 fix
- From: "Kaveh R. GHAZI" <ghazi at caip dot rutgers dot edu>
- To: gcc-patches at gcc dot gnu dot org
- Cc: ubizjak at gmail dot com, janis187 at us dot ibm dot com
- Date: Tue, 26 Feb 2008 14:44:44 -0500 (EST)
- Subject: [4.2 PATCH]: Backport libffi x86 fix
This patch backports to the 4.2 branch a fix on x86 for a libffi test that
fails because of the excess precision on that chip. The failure can be
seen here: http://gcc.gnu.org/ml/gcc-testresults/2008-02/msg01527.html
Patch tested via "make check-target-libffi" on i686-unknown-linux-gnu.
Okay for 4.2?
Thanks,
--Kaveh
2008-02-26 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
Backport:
2007-03-24 Uros Bizjak <ubizjak@gmail.com>
* testsuite/libffi.call/return_fl2.c (return_fl): Mark as static.
Use 'volatile float sum' to create sum of floats to avoid false
negative due to excess precision on ix86 targets.
(main): Ditto.
diff -rup orig/egcc-4.2-SVN20080226/libffi/testsuite/libffi.call/return_fl2.c egcc-4.2-SVN20080226/libffi/testsuite/libffi.call/return_fl2.c
--- orig/egcc-4.2-SVN20080226/libffi/testsuite/libffi.call/return_fl2.c 2008-01-03 23:39:22.000000000 +0100
+++ egcc-4.2-SVN20080226/libffi/testsuite/libffi.call/return_fl2.c 2008-02-26 05:17:00.000000000 +0100
@@ -7,12 +7,13 @@
/* { dg-do run } */
#include "ffitest.h"
-/* To avoid a false negative on ix86 do not declare the return_fl static.
- See PR323.
-*/
-float return_fl(float fl1, float fl2, float fl3, float fl4)
+/* Use volatile float to avoid false negative on ix86. See PR target/323. */
+static float return_fl(float fl1, float fl2, float fl3, float fl4)
{
- return fl1 + fl2 + fl3 + fl4;
+ volatile float sum;
+
+ sum = fl1 + fl2 + fl3 + fl4;
+ return sum;
}
int main (void)
{
@@ -20,6 +21,7 @@ int main (void)
ffi_type *args[MAX_ARGS];
void *values[MAX_ARGS];
float fl1, fl2, fl3, fl4, rfl;
+ volatile float sum;
args[0] = &ffi_type_float;
args[1] = &ffi_type_float;
@@ -40,6 +42,8 @@ int main (void)
ffi_call(&cif, FFI_FN(return_fl), &rfl, values);
printf ("%f vs %f\n", rfl, return_fl(fl1, fl2, fl3, fl4));
- CHECK(rfl == fl1 + fl2 + fl3 + fl4);
+
+ sum = fl1 + fl2 + fl3 + fl4;
+ CHECK(rfl == sum);
exit(0);
}