1 /* Area: ffi_call 2 Purpose: Check float arguments with different orders. 3 Limitations: none. 4 PR: none. 5 Originator: From the original ffitest.c */ 6 7 /* { dg-do run } */ 8 9 #include "ffitest.h" 10 #include "float.h" 11 12 static double floating_1(float a, double b, long double c) 13 { 14 return (double) a + b + (double) c; 15 } 16 17 static double floating_2(long double a, double b, float c) 18 { 19 return (double) a + b + (double) c; 20 } 21 22 int main (void) 23 { 24 ffi_cif cif; 25 ffi_type *args[MAX_ARGS]; 26 void *values[MAX_ARGS]; 27 double rd; 28 29 float f; 30 double d; 31 long double ld; 32 33 args[0] = &ffi_type_float; 34 values[0] = &f; 35 args[1] = &ffi_type_double; 36 values[1] = &d; 37 args[2] = &ffi_type_longdouble; 38 values[2] = &ld; 39 40 /* Initialize the cif */ 41 CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, 42 &ffi_type_double, args) == FFI_OK); 43 44 f = 3.14159; 45 d = (double)1.0/(double)3.0; 46 ld = 2.71828182846L; 47 48 floating_1 (f, d, ld); 49 50 ffi_call(&cif, FFI_FN(floating_1), &rd, values); 51 52 CHECK(rd - floating_1(f, d, ld) < DBL_EPSILON); 53 54 args[0] = &ffi_type_longdouble; 55 values[0] = &ld; 56 args[1] = &ffi_type_double; 57 values[1] = &d; 58 args[2] = &ffi_type_float; 59 values[2] = &f; 60 61 /* Initialize the cif */ 62 CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, 63 &ffi_type_double, args) == FFI_OK); 64 65 floating_2 (ld, d, f); 66 67 ffi_call(&cif, FFI_FN(floating_2), &rd, values); 68 69 CHECK(rd - floating_2(ld, d, f) < DBL_EPSILON); 70 71 exit (0); 72 } 73