diff options
author | wilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-04-07 23:04:15 +0000 |
---|---|---|
committer | wilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-04-07 23:04:15 +0000 |
commit | 2d3dcfaad60f9b7e1298c50d278f7ea5106ec2b3 (patch) | |
tree | a943312c35d8921cd128be1e1ae3f14c41b92cdf /libffi/testsuite | |
parent | c26f4a0af99fda9c01f379d7199b7f5a0b89e71f (diff) | |
download | gcc-2d3dcfaad60f9b7e1298c50d278f7ea5106ec2b3.tar.gz |
For PR 26483, IA-64 denorm failure due to unwanted rounding.
* testsuite/libffi.call/float4.c: New testcase.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@112768 138bc75d-0d04-0410-961f-82ee72b054a4
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 00000000000..febad5eb917 --- /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); + +} |