github.com/prattmic/llgo-embedded@v0.0.0-20150820070356-41cfecea0e1e/third_party/gofrontend/libffi/testsuite/libffi.call/float.c (about)

     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  }