diff options
| author | Raghuram Subramani <raghus2247@gmail.com> | 2022-06-19 19:47:51 +0530 | 
|---|---|---|
| committer | Raghuram Subramani <raghus2247@gmail.com> | 2022-06-19 19:47:51 +0530 | 
| commit | 4fd287655a72b9aea14cdac715ad5b90ed082ed2 (patch) | |
| tree | 65d393bc0e699dd12d05b29ba568e04cea666207 /circuitpython/lib/libffi/testsuite/libffi.call/many_mixed.c | |
| parent | 0150f70ce9c39e9e6dd878766c0620c85e47bed0 (diff) | |
add circuitpython code
Diffstat (limited to 'circuitpython/lib/libffi/testsuite/libffi.call/many_mixed.c')
| -rw-r--r-- | circuitpython/lib/libffi/testsuite/libffi.call/many_mixed.c | 78 | 
1 files changed, 78 insertions, 0 deletions
| diff --git a/circuitpython/lib/libffi/testsuite/libffi.call/many_mixed.c b/circuitpython/lib/libffi/testsuite/libffi.call/many_mixed.c new file mode 100644 index 0000000..85ec36e --- /dev/null +++ b/circuitpython/lib/libffi/testsuite/libffi.call/many_mixed.c @@ -0,0 +1,78 @@ +/* Area:	ffi_call +   Purpose:	Check return value double, with many arguments +   Limitations:	none. +   PR:		none. +   Originator:	From the original ffitest.c  */ + +/* { dg-do run } */ +#include "ffitest.h" + +#include <stdlib.h> +#include <float.h> +#include <math.h> + +static double many(double f1, +		  double f2, +		  long int i1, +		  double f3, +		  double f4, +		  long int i2, +		  double f5, +		  double f6, +		  long int i3, +		  double f7, +		  double f8, +		  long int i4, +		  double f9, +		  double f10, +		  long int i5, +		  double f11, +		  double f12, +		  long int i6, +		  double f13) +{ +  return ((double) (i1 + i2 + i3 + i4 + i5 + i6) + (f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13); +} + +int main (void) +{ +  ffi_cif cif; +  ffi_type *args[19]; +  void *values[19]; +  double fa[19]; +  long int la[19]; +  double f, ff; +  int i; + +  for (i = 0; i < 19; i++) +    { +	  if( (i - 2) % 3 == 0) { +	    args[i] = &ffi_type_slong; +	    la[i] = (long int) i; +	    values[i] = &la[i]; +	  } +	  else { +	    args[i] = &ffi_type_double; +	    fa[i] = (double) i; +	    values[i] = &fa[i]; +	  } +    } + +    /* Initialize the cif */ +    CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 19, +		       &ffi_type_double, args) == FFI_OK); + +    ffi_call(&cif, FFI_FN(many), &f, values); + +    ff =  many(fa[0], fa[1], la[2], +               fa[3], fa[4], la[5], +               fa[6], fa[7], la[8], +               fa[9], fa[10], la[11], +               fa[12], fa[13], la[14], +               fa[15], fa[16], la[17], +               fa[18]); +    if (fabs(f - ff) < FLT_EPSILON) +      exit(0); +    else +      abort(); +} | 
