1/* Area: ffi_call, closure_call 2 Purpose: Check long double arguments. 3 Limitations: none. 4 PR: none. 5 Originator: Blake Chaffin */ 6 7/* { dg-do run { xfail mips*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */ 8/* { dg-options -mlong-double-128 { target powerpc64*-*-* } } */ 9 10#include "ffitest.h" 11 12long double cls_ldouble_fn( 13 long double a1, 14 long double a2, 15 long double a3, 16 long double a4, 17 long double a5, 18 long double a6, 19 long double a7, 20 long double a8) 21{ 22 long double r = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8; 23 24 printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: %Lg\n", 25 a1, a2, a3, a4, a5, a6, a7, a8, r); 26 27 return r; 28} 29 30static void 31cls_ldouble_gn(ffi_cif* cif, void* resp, void** args, void* userdata) 32{ 33 long double a1 = *(long double*)args[0]; 34 long double a2 = *(long double*)args[1]; 35 long double a3 = *(long double*)args[2]; 36 long double a4 = *(long double*)args[3]; 37 long double a5 = *(long double*)args[4]; 38 long double a6 = *(long double*)args[5]; 39 long double a7 = *(long double*)args[6]; 40 long double a8 = *(long double*)args[7]; 41 42 *(long double*)resp = cls_ldouble_fn( 43 a1, a2, a3, a4, a5, a6, a7, a8); 44} 45 46int main(void) 47{ 48 ffi_cif cif; 49#ifndef USING_MMAP 50 static ffi_closure cl; 51#endif 52 ffi_closure* pcl; 53 void* args[9]; 54 ffi_type* arg_types[9]; 55 long double res = 0; 56 57#ifdef USING_MMAP 58 pcl = allocate_mmap(sizeof(ffi_closure)); 59#else 60 pcl = &cl; 61#endif 62 63 long double arg1 = 1; 64 long double arg2 = 2; 65 long double arg3 = 3; 66 long double arg4 = 4; 67 long double arg5 = 5; 68 long double arg6 = 6; 69 long double arg7 = 7; 70 long double arg8 = 8; 71 72 arg_types[0] = &ffi_type_longdouble; 73 arg_types[1] = &ffi_type_longdouble; 74 arg_types[2] = &ffi_type_longdouble; 75 arg_types[3] = &ffi_type_longdouble; 76 arg_types[4] = &ffi_type_longdouble; 77 arg_types[5] = &ffi_type_longdouble; 78 arg_types[6] = &ffi_type_longdouble; 79 arg_types[7] = &ffi_type_longdouble; 80 arg_types[8] = NULL; 81 82 CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 8, &ffi_type_longdouble, 83 arg_types) == FFI_OK); 84 85 args[0] = &arg1; 86 args[1] = &arg2; 87 args[2] = &arg3; 88 args[3] = &arg4; 89 args[4] = &arg5; 90 args[5] = &arg6; 91 args[6] = &arg7; 92 args[7] = &arg8; 93 args[8] = NULL; 94 95 ffi_call(&cif, FFI_FN(cls_ldouble_fn), &res, args); 96 /* { dg-output "1 2 3 4 5 6 7 8: 36" } */ 97 printf("res: %Lg\n", res); 98 /* { dg-output "\nres: 36" } */ 99 100 CHECK(ffi_prep_closure(pcl, &cif, cls_ldouble_gn, NULL) == FFI_OK); 101 102 res = ((long double(*)(long double, long double, long double, long double, 103 long double, long double, long double, long double))(pcl))(arg1, arg2, 104 arg3, arg4, arg5, arg6, arg7, arg8); 105 /* { dg-output "\n1 2 3 4 5 6 7 8: 36" } */ 106 printf("res: %Lg\n", res); 107 /* { dg-output "\nres: 36" } */ 108 109 return 0; 110} 111