(root)/
gcc-13.2.0/
libffi/
testsuite/
libffi.call/
float.c
       1  /* Area:	ffi_call
       2     Purpose:	Check return value float.
       3     Limitations:	none.
       4     PR:		none.
       5     Originator:	From the original ffitest.c  */
       6  
       7  /* { dg-do run } */
       8  
       9  #include "ffitest.h"
      10  
      11  static int floating(int a, float b, double c, long double d)
      12  {
      13    int i;
      14  
      15    i = (int) ((float)a/b + ((float)c/(float)d));
      16  
      17    return i;
      18  }
      19  
      20  int main (void)
      21  {
      22    ffi_cif cif;
      23    ffi_type *args[MAX_ARGS];
      24    void *values[MAX_ARGS];
      25    ffi_arg rint;
      26  
      27    float f;
      28    signed int si1;
      29    double d;
      30    long double ld;
      31  
      32    args[0] = &ffi_type_sint;
      33    values[0] = &si1;
      34    args[1] = &ffi_type_float;
      35    values[1] = &f;
      36    args[2] = &ffi_type_double;
      37    values[2] = &d;
      38    args[3] = &ffi_type_longdouble;
      39    values[3] = &ld;
      40  
      41    /* Initialize the cif */
      42    CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4,
      43  		     &ffi_type_sint, args) == FFI_OK);
      44  
      45    si1 = 6;
      46    f = 3.14159;
      47    d = (double)1.0/(double)3.0;
      48    ld = 2.71828182846L;
      49  
      50    floating (si1, f, d, ld);
      51  
      52    ffi_call(&cif, FFI_FN(floating), &rint, values);
      53  
      54    printf ("%d vs %d\n", (int)rint, floating (si1, f, d, ld));
      55  
      56    CHECK((int)rint == floating(si1, f, d, ld));
      57  
      58    exit (0);
      59  }