diff options
author | David Schneider <david.schneider@bivab.de> | 2013-11-13 15:50:21 +0100 |
---|---|---|
committer | David Schneider <david.schneider@bivab.de> | 2013-11-13 18:01:56 +0100 |
commit | cdf405d574f479b782454516366bd4f4b9b3415e (patch) | |
tree | 3575eebde29bdcd4e9e5e9fbe3a32b33f91a1acd /testsuite | |
parent | 77f823e31ffb557a466b24f7fba845fbf7831798 (diff) | |
download | libffi-cdf405d574f479b782454516366bd4f4b9b3415e.tar.gz |
add a testcase for the double/float issue on ARMHF
Diffstat (limited to 'testsuite')
-rw-r--r-- | testsuite/libffi.call/cls_many_mixed_float_double.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/testsuite/libffi.call/cls_many_mixed_float_double.c b/testsuite/libffi.call/cls_many_mixed_float_double.c new file mode 100644 index 0000000..62b0697 --- /dev/null +++ b/testsuite/libffi.call/cls_many_mixed_float_double.c @@ -0,0 +1,55 @@ +/* Area: closure_call + Purpose: Check register allocation for closure calls with many float and double arguments + Limitations: none. + PR: none. + Originator: <david.schneider@picle.org> */ + +/* { dg-do run } */ +#include "ffitest.h" +#include <float.h> +#include <math.h> + +#define NARGS 16 + +static void cls_mixed_float_double_fn(ffi_cif* cif , void* ret, void** args, + void* userdata __UNUSED__) +{ + double r = 0; + unsigned int i; + double t; + for(i=0; i < cif->nargs; i++) + { + if(cif->arg_types[i] == &ffi_type_double) { + t = *(((double**)(args))[i]); + } else { + t = *(((float**)(args))[i]); + } + r += t; + } + *((double*)ret) = r; +} +typedef double (*cls_mixed)(double, float, double, double, double, double, double, float, float, double, float, float); + +int main (void) +{ + ffi_cif cif; + ffi_closure *closure; + void* code; + ffi_type *argtypes[12] = {&ffi_type_double, &ffi_type_float, &ffi_type_double, + &ffi_type_double, &ffi_type_double, &ffi_type_double, + &ffi_type_double, &ffi_type_float, &ffi_type_float, + &ffi_type_double, &ffi_type_float, &ffi_type_float}; + + + closure = ffi_closure_alloc(sizeof(ffi_closure), (void**)&code); + if(closure ==NULL) + abort(); + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 12, &ffi_type_double, argtypes) == FFI_OK); + CHECK(ffi_prep_closure_loc(closure, &cif, cls_mixed_float_double_fn, NULL, code) == FFI_OK); + double ret = ((cls_mixed)code)(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2); + ffi_closure_free(closure); + if(fabs(ret - 7.8) < FLT_EPSILON) + exit(0); + else + abort(); +} |