diff options
author | James E Wilson <wilson@specifixinc.com> | 2006-04-07 16:04:15 -0700 |
---|---|---|
committer | Jim Wilson <wilson@gcc.gnu.org> | 2006-04-07 16:04:15 -0700 |
commit | 8e7a2b58e7c1b6427511249ec77c38f064342262 (patch) | |
tree | a943312c35d8921cd128be1e1ae3f14c41b92cdf /libffi/testsuite | |
parent | a05906031a66c96a5647f8ce6fe0a180b9a8021f (diff) | |
download | gcc-8e7a2b58e7c1b6427511249ec77c38f064342262.zip gcc-8e7a2b58e7c1b6427511249ec77c38f064342262.tar.gz gcc-8e7a2b58e7c1b6427511249ec77c38f064342262.tar.bz2 |
For PR 26483, IA-64 denorm failure due to unwanted rounding.
* testsuite/libffi.call/float4.c: New testcase.
From-SVN: r112768
Diffstat (limited to 'libffi/testsuite')
-rw-r--r-- | libffi/testsuite/libffi.call/float4.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/libffi/testsuite/libffi.call/float4.c b/libffi/testsuite/libffi.call/float4.c new file mode 100644 index 0000000..febad5e --- /dev/null +++ b/libffi/testsuite/libffi.call/float4.c @@ -0,0 +1,60 @@ +/* Area: ffi_call + Purpose: Check denorm double value. + Limitations: none. + PR: PR26483. + Originator: From the original ffitest.c */ + +/* { dg-do run } */ +#include "ffitest.h" +#include "float.h" + +typedef union +{ + double d; + unsigned char c[sizeof (double)]; +} value_type; + +#define CANARY 0xba + +static double dblit(double d) +{ + return d; +} + +int main (void) +{ + ffi_cif cif; + ffi_type *args[MAX_ARGS]; + void *values[MAX_ARGS]; + double d; + value_type result[2]; + unsigned int i; + + args[0] = &ffi_type_double; + values[0] = &d; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, + &ffi_type_double, args) == FFI_OK); + + d = DBL_MIN / 2; + + /* Put a canary in the return array. This is a regression test for + a buffer overrun. */ + memset(result[1].c, CANARY, sizeof (double)); + + ffi_call(&cif, FFI_FN(dblit), &result[0].d, values); + + /* The standard delta check doesn't work for denorms. Since we didn't do + any arithmetic, we should get the original result back, and hence an + exact check should be OK here. */ + + CHECK(result[0].d == dblit(d)); + + /* Check the canary. */ + for (i = 0; i < sizeof (double); ++i) + CHECK(result[1].c[i] == CANARY); + + exit(0); + +} |