Merge pull request #45 from foss-for-synopsys-dwc-arc-processors/arc_support

arc: Fix build error
This commit is contained in:
Anthony Green
2013-11-02 14:08:23 -07:00
6 changed files with 118 additions and 22 deletions

View File

@@ -9,7 +9,7 @@
#include <float.h>
#include <math.h>
#define NARGS 12
#define NARGS 16
static void cls_ret_double_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
void* userdata __UNUSED__)
@@ -19,7 +19,7 @@ static void cls_ret_double_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
double t;
for(i = 0; i < NARGS; i++)
{
if(i == 8)
if(i == 4 || i == 9 || i == 11 || i == 13 || i == 15)
{
t = *(long int *)args[i];
CHECK(t == i+1);
@@ -33,7 +33,9 @@ static void cls_ret_double_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
}
*(double *)resp = r;
}
typedef double (*cls_ret_double)(double, double, double, double, double, double, double, double, long int, double, double, double);
typedef double (*cls_ret_double)(double, double, double, double, long int,
double, double, double, double, long int, double, long int, double, long int,
double, long int);
int main (void)
{
@@ -43,11 +45,11 @@ int main (void)
ffi_type * cl_arg_types[NARGS];
double res;
int i;
double expected = 15.9;
double expected = 64.9;
for(i = 0; i < NARGS; i++)
{
if(i == 8)
if(i == 4 || i == 9 || i == 11 || i == 13 || i == 15)
cl_arg_types[i] = &ffi_type_slong;
else
cl_arg_types[i] = &ffi_type_double;
@@ -59,8 +61,8 @@ int main (void)
CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_double_fn, NULL, code) == FFI_OK);
res = (((cls_ret_double)code))(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 9,
1.0, 1.1, 1.2);
res = (((cls_ret_double)code))(0.1, 0.2, 0.3, 0.4, 5, 0.6, 0.7, 0.8, 0.9, 10,
1.1, 12, 1.3, 14, 1.5, 16);
if (abs(res - expected) < FLT_EPSILON)
exit(0);
else

View File

@@ -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();
}