From 2d3dcfaad60f9b7e1298c50d278f7ea5106ec2b3 Mon Sep 17 00:00:00 2001 From: wilson Date: Fri, 7 Apr 2006 23:04:15 +0000 Subject: [PATCH] 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 --- libffi/ChangeLog | 4 +++ libffi/testsuite/libffi.call/float4.c | 60 +++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 libffi/testsuite/libffi.call/float4.c diff --git a/libffi/ChangeLog b/libffi/ChangeLog index b7ec8d6beb4..def8e5c97b9 100644 --- a/libffi/ChangeLog +++ b/libffi/ChangeLog @@ -1,3 +1,7 @@ +2006-04-07 James E Wilson + + * testsuite/libffi.call/float4.c: New testcase. + 2006-04-05 John David Anglin Andreas Tobler 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); + +} -- 2.11.4.GIT