1/* Area: ffi_call 2 Purpose: Check fastcall fct call on X86_WIN32 systems. 3 Limitations: none. 4 PR: none. 5 Originator: From the original ffitest.c */ 6 7/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */ 8 9#include "ffitest.h" 10 11static size_t __FASTCALL__ my_fastcall_f(char *s, float a) 12{ 13 return (size_t) ((int) strlen(s) + (int) a); 14} 15 16int main (void) 17{ 18 ffi_cif cif; 19 ffi_type *args[MAX_ARGS]; 20 void *values[MAX_ARGS]; 21 ffi_arg rint; 22 char *s; 23 float v2; 24 args[0] = &ffi_type_pointer; 25 args[1] = &ffi_type_float; 26 values[0] = (void*) &s; 27 values[1] = (void*) &v2; 28 29 /* Initialize the cif */ 30 CHECK(ffi_prep_cif(&cif, FFI_FASTCALL, 2, 31 &ffi_type_sint, args) == FFI_OK); 32 33 s = "a"; 34 v2 = 0.0; 35 ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values); 36 CHECK(rint == 1); 37 38 s = "1234567"; 39 v2 = -1.0; 40 ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values); 41 CHECK(rint == 6); 42 43 s = "1234567890123456789012345"; 44 v2 = 1.0; 45 ffi_call(&cif, FFI_FN(my_fastcall_f), &rint, values); 46 CHECK(rint == 26); 47 48 printf("fastcall fct1 tests passed\n"); 49 exit(0); 50} 51