1/* Area: ffi_call 2 Purpose: Check return value long double. 3 Limitations: none. 4 PR: none. 5 Originator: From the original ffitest.c */ 6 7/* { dg-do run } */ 8/* { dg-options -mlong-double-128 { target powerpc64*-*-* } } */ 9 10#include "ffitest.h" 11#include "float.h" 12 13static long double ldblit(float f) 14{ 15 return (long double) (((long double) f)/ (long double) 3.0); 16} 17 18int main (void) 19{ 20 ffi_cif cif; 21 ffi_type *args[MAX_ARGS]; 22 void *values[MAX_ARGS]; 23 float f; 24 long double ld; 25 26 args[0] = &ffi_type_float; 27 values[0] = &f; 28 29 /* Initialize the cif */ 30 CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, 31 &ffi_type_longdouble, args) == FFI_OK); 32 33 f = 3.14159; 34 35#if 1 36 /* This is ifdef'd out for now. long double support under SunOS/gcc 37 is pretty much non-existent. You'll get the odd bus error in library 38 routines like printf(). */ 39 printf ("%Lf\n", ldblit(f)); 40#endif 41 ld = 666; 42 ffi_call(&cif, FFI_FN(ldblit), &ld, values); 43 44#if 1 45 /* This is ifdef'd out for now. long double support under SunOS/gcc 46 is pretty much non-existent. You'll get the odd bus error in library 47 routines like printf(). */ 48 printf ("%Lf, %Lf, %Lf, %Lf\n", ld, ldblit(f), ld - ldblit(f), LDBL_EPSILON); 49#endif 50 51 /* These are not always the same!! Check for a reasonable delta */ 52 /*@-realcompare@*/ 53 if (ld - ldblit(f) < LDBL_EPSILON) 54 /*@=realcompare@*/ 55 puts("long double return value tests ok!"); 56 else 57 CHECK(0); 58 59 exit(0); 60} 61