OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libffi/] [testsuite/] [libffi.call/] [cls_longdouble.c] - Blame information for rev 732

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.