Blame soft-fp/testit.c

Packit 6c4009
#include <stdio.h>
Packit 6c4009
#include <stdlib.h>
Packit 6c4009
#include <math.h>
Packit 6c4009
Packit 6c4009
#include "soft-fp.h"
Packit 6c4009
#include "single.h"
Packit 6c4009
#include "double.h"
Packit 6c4009
Packit 6c4009
#include <fpu_control.h>
Packit 6c4009
Packit 6c4009
/*======================================================================*/
Packit 6c4009
/* declarations for the functions we are testing */
Packit 6c4009
Packit 6c4009
double __adddf3(double, double);
Packit 6c4009
double __subdf3(double, double);
Packit 6c4009
double __muldf3(double, double);
Packit 6c4009
double __divdf3(double, double);
Packit 6c4009
double __negdf2(double);
Packit 6c4009
double __sqrtdf2(double);
Packit 6c4009
double __negdf3(double a, double dummy) { return __negdf2(a); }
Packit 6c4009
double __sqrtdf3(double a, double dummy) { return __sqrtdf2(a); }
Packit 6c4009
Packit 6c4009
float __addsf3(float, float);
Packit 6c4009
float __subsf3(float, float);
Packit 6c4009
float __mulsf3(float, float);
Packit 6c4009
float __divsf3(float, float);
Packit 6c4009
float __negsf2(float);
Packit 6c4009
float __sqrtsf2(float);
Packit 6c4009
float __negsf3(float a, float dummy) { return __negsf2(a); }
Packit 6c4009
float __sqrtsf3(float a, float dummy) { return __sqrtsf2(a); }
Packit 6c4009
Packit 6c4009
int __fixdfsi(double);
Packit 6c4009
int __fixsfsi(float);
Packit 6c4009
double __floatsidf(int);
Packit 6c4009
float __floatsisf(int);
Packit 6c4009
double __extendsfdf2(float);
Packit 6c4009
float __truncdfsf2(double);
Packit 6c4009
Packit 6c4009
int __eqdf2(double, double);
Packit 6c4009
int __nedf2(double, double);
Packit 6c4009
int __gtdf2(double, double);
Packit 6c4009
int __gedf2(double, double);
Packit 6c4009
int __ltdf2(double, double);
Packit 6c4009
int __ledf2(double, double);
Packit 6c4009
Packit 6c4009
int __eqsf2(float, float);
Packit 6c4009
int __nesf2(float, float);
Packit 6c4009
int __gtsf2(float, float);
Packit 6c4009
int __gesf2(float, float);
Packit 6c4009
int __ltsf2(float, float);
Packit 6c4009
int __lesf2(float, float);
Packit 6c4009
Packit 6c4009
/*======================================================================*/
Packit 6c4009
/* definitions for functions we are checking against */
Packit 6c4009
Packit 6c4009
double r_adddf3(double a, double b) { return a + b; }
Packit 6c4009
double r_subdf3(double a, double b) { return a - b; }
Packit 6c4009
double r_muldf3(double a, double b) { return a * b; }
Packit 6c4009
double r_divdf3(double a, double b) { return a / b; }
Packit 6c4009
double r_negdf3(double a, double b) { return -a; }
Packit 6c4009
double sqrt(double x);
Packit 6c4009
double r_sqrtdf3(double a, double b) { return sqrt(a); }
Packit 6c4009
Packit 6c4009
float r_addsf3(float a, float b) { return a + b; }
Packit 6c4009
float r_subsf3(float a, float b) { return a - b; }
Packit 6c4009
float r_mulsf3(float a, float b) { return a * b; }
Packit 6c4009
float r_divsf3(float a, float b) { return a / b; }
Packit 6c4009
float r_negsf3(float a, float b) { return -a; }
Packit 6c4009
float sqrtf(float x);
Packit 6c4009
float r_sqrtsf3(float a, float b) { return sqrtf(a); }
Packit 6c4009
Packit 6c4009
int r_fixdfsi(double a) { return (int)a; }
Packit 6c4009
int r_fixsfsi(float a) { return (int)a; }
Packit 6c4009
double r_floatsidf(int a) { return (double)a; }
Packit 6c4009
float r_floatsisf(int a) { return (float)a; }
Packit 6c4009
double r_extendsfdf2(float a) { return (double)a; }
Packit 6c4009
float r_truncdfsf2(double a) { return (float)a; }
Packit 6c4009
Packit 6c4009
int r_eqdf2(double a, double b) { return !(a == b); }
Packit 6c4009
int r_nedf2(double a, double b) { return a != b; }
Packit 6c4009
int r_gtdf2(double a, double b) { return a > b; }
Packit 6c4009
int r_gedf2(double a, double b) { return (a >= b) - 1; }
Packit 6c4009
int r_ltdf2(double a, double b) { return -(a < b); }
Packit 6c4009
int r_ledf2(double a, double b) { return 1 - (a <= b); }
Packit 6c4009
Packit 6c4009
int r_eqsf2(float a, float b) { return !(a == b); }
Packit 6c4009
int r_nesf2(float a, float b) { return a != b; }
Packit 6c4009
int r_gtsf2(float a, float b) { return a > b; }
Packit 6c4009
int r_gesf2(float a, float b) { return (a >= b) - 1; }
Packit 6c4009
int r_ltsf2(float a, float b) { return -(a < b); }
Packit 6c4009
int r_lesf2(float a, float b) { return 1 - (a <= b); }
Packit 6c4009
Packit 6c4009
/*======================================================================*/
Packit 6c4009
Packit 6c4009
void print_float(float x)
Packit 6c4009
{
Packit 6c4009
    union _FP_UNION_S ux;
Packit 6c4009
    ux.flt = x;
Packit 6c4009
    printf("%-20.8e %X %02X %06lX",
Packit 6c4009
	   x, ux.bits.sign, ux.bits.exp, (unsigned long)ux.bits.frac);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
void print_double(double x)
Packit 6c4009
{
Packit 6c4009
    union _FP_UNION_D ux;
Packit 6c4009
    ux.flt = x;
Packit 6c4009
#if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
Packit 6c4009
    printf("%-30.18e %X %04X %06lX%08lX",
Packit 6c4009
	   x, ux.bits.sign, ux.bits.exp,
Packit 6c4009
	   (unsigned long)ux.bits.frac1, (unsigned long)ux.bits.frac0);
Packit 6c4009
#else
Packit 6c4009
    printf("%-30.18e %X %04X %014lX",
Packit 6c4009
	   x, ux.bits.sign, ux.bits.exp,
Packit 6c4009
	   (unsigned long)ux.bits.frac);
Packit 6c4009
#endif
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
float rand_float(void)
Packit 6c4009
{
Packit 6c4009
    union {
Packit 6c4009
	union _FP_UNION_S u;
Packit 6c4009
	int i;
Packit 6c4009
    } u;
Packit 6c4009
Packit 6c4009
    u.i = lrand48() << 1;
Packit 6c4009
Packit 6c4009
    if (u.u.bits.exp == _FP_EXPMAX_S)
Packit 6c4009
	u.u.bits.exp--;
Packit 6c4009
    else if (u.u.bits.exp == 0 && u.u.bits.frac != 0)
Packit 6c4009
	u.u.bits.exp++;
Packit 6c4009
Packit 6c4009
    return u.u.flt;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
double rand_double(void)
Packit 6c4009
{
Packit 6c4009
    union {
Packit 6c4009
	union _FP_UNION_D u;
Packit 6c4009
	int i[2];
Packit 6c4009
    } u;
Packit 6c4009
Packit 6c4009
    u.i[0] = lrand48() << 1;
Packit 6c4009
    u.i[1] = lrand48() << 1;
Packit 6c4009
Packit 6c4009
    if (u.u.bits.exp == _FP_EXPMAX_D)
Packit 6c4009
	u.u.bits.exp--;
Packit 6c4009
#if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
Packit 6c4009
    else if (u.u.bits.exp == 0 && !(u.u.bits.frac0 == 0 && u.u.bits.frac1 == 0))
Packit 6c4009
	u.u.bits.exp++;
Packit 6c4009
#else
Packit 6c4009
    else if (u.u.bits.exp == 0 && u.u.bits.frac != 0)
Packit 6c4009
	u.u.bits.exp++;
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
    return u.u.flt;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
#define NSPECIALS  10
Packit 6c4009
Packit 6c4009
float gen_special_float(int i)
Packit 6c4009
{
Packit 6c4009
    FP_DECL_EX;
Packit 6c4009
    FP_DECL_S(X);
Packit 6c4009
    float x;
Packit 6c4009
Packit 6c4009
    switch (i & ~1)
Packit 6c4009
    {
Packit 6c4009
      case 0:
Packit 6c4009
	X_c = FP_CLS_NAN; X_f = 0x1234;
Packit 6c4009
	break;
Packit 6c4009
      case 2:
Packit 6c4009
	X_c = FP_CLS_NAN; X_f = 0x1;
Packit 6c4009
	break;
Packit 6c4009
      case 4:
Packit 6c4009
	X_c = FP_CLS_INF;
Packit 6c4009
	break;
Packit 6c4009
      case 6:
Packit 6c4009
	X_c = FP_CLS_ZERO;
Packit 6c4009
	break;
Packit 6c4009
      case 8:
Packit 6c4009
	X_c = FP_CLS_NORMAL; X_e = 0;
Packit 6c4009
	X_f = 0x4321;
Packit 6c4009
	break;
Packit 6c4009
    }
Packit 6c4009
    X_s = (i & 1);
Packit 6c4009
Packit 6c4009
    FP_PACK_S(x, X);
Packit 6c4009
    return x;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
double gen_special_double(int i)
Packit 6c4009
{
Packit 6c4009
    FP_DECL_EX;
Packit 6c4009
    FP_DECL_D(X);
Packit 6c4009
    double x;
Packit 6c4009
Packit 6c4009
    switch (i & ~1)
Packit 6c4009
    {
Packit 6c4009
      case 0:
Packit 6c4009
	X_c = FP_CLS_NAN;
Packit 6c4009
#if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
Packit 6c4009
	__FP_FRAC_SET_2(X, _FP_QNANNEGATEDP ? 0 : _FP_QNANBIT_D, 0x1234);
Packit 6c4009
#else
Packit 6c4009
	_FP_FRAC_SET_1(X, (_FP_QNANNEGATEDP ? 0 : _FP_QNANBIT_D) | 0x1234);
Packit 6c4009
#endif
Packit 6c4009
	break;
Packit 6c4009
      case 2:
Packit 6c4009
	X_c = FP_CLS_NAN;
Packit 6c4009
#if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
Packit 6c4009
	__FP_FRAC_SET_2(X, _FP_QNANNEGATEDP ? 0 : _FP_QNANBIT_D, 0x1);
Packit 6c4009
#else
Packit 6c4009
	_FP_FRAC_SET_1(X, (_FP_QNANNEGATEDP ? 0 : _FP_QNANBIT_D) | 0x1);
Packit 6c4009
#endif
Packit 6c4009
	break;
Packit 6c4009
      case 4:
Packit 6c4009
	X_c = FP_CLS_INF;
Packit 6c4009
	break;
Packit 6c4009
      case 6:
Packit 6c4009
	X_c = FP_CLS_ZERO;
Packit 6c4009
	break;
Packit 6c4009
      case 8:
Packit 6c4009
	X_c = FP_CLS_NORMAL; X_e = 0;
Packit 6c4009
#if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
Packit 6c4009
	__FP_FRAC_SET_2(X, 0, 0x87654321);
Packit 6c4009
#else
Packit 6c4009
	_FP_FRAC_SET_1(X, 0x87654321);
Packit 6c4009
#endif
Packit 6c4009
	break;
Packit 6c4009
    }
Packit 6c4009
    X_s = (i & 1);
Packit 6c4009
Packit 6c4009
    FP_PACK_D(x, X);
Packit 6c4009
    return x;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
float build_float(const char *s, const char *e, const char *f)
Packit 6c4009
{
Packit 6c4009
    union _FP_UNION_S u;
Packit 6c4009
Packit 6c4009
    u.bits.sign = strtoul(s, 0, 16);
Packit 6c4009
    u.bits.exp = strtoul(e, 0, 16);
Packit 6c4009
    u.bits.frac = strtoul(f, 0, 16);
Packit 6c4009
Packit 6c4009
    return u.flt;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
double build_double(const char *s, const char *e, const char *f)
Packit 6c4009
{
Packit 6c4009
    union _FP_UNION_D u;
Packit 6c4009
Packit 6c4009
    u.bits.sign = strtoul(s, 0, 16);
Packit 6c4009
    u.bits.exp = strtoul(e, 0, 16);
Packit 6c4009
#if _FP_W_TYPE_SIZE < _FP_FRACBITS_D
Packit 6c4009
    {
Packit 6c4009
	size_t len = strlen(f)+1;
Packit 6c4009
	char *dup = memcpy(alloca(len), f, len);
Packit 6c4009
	char *low = dup + len - _FP_W_TYPE_SIZE/4 - 1;
Packit 6c4009
Packit 6c4009
	u.bits.frac0 = strtoul(low, 0, 16);
Packit 6c4009
	*low = 0;
Packit 6c4009
	u.bits.frac1 = strtoul(dup, 0, 16);
Packit 6c4009
    }
Packit 6c4009
#else
Packit 6c4009
    u.bits.frac = strtoul(f, 0, 16);
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
    return u.flt;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
/*======================================================================*/
Packit 6c4009
Packit 6c4009
fpu_control_t fcw0, fcw1;
Packit 6c4009
Packit 6c4009
void test_float_arith(float (*tf)(float, float),
Packit 6c4009
		      float (*rf)(float, float),
Packit 6c4009
		      float x, float y)
Packit 6c4009
{
Packit 6c4009
    float tr, rr;
Packit 6c4009
    rr = (*rf)(x, y);
Packit 6c4009
    tr = (*tf)(x, y);
Packit 6c4009
    if (memcmp(&tr, &rr, sizeof(float)) != 0)
Packit 6c4009
    {
Packit 6c4009
	fputs("error:\n\tx     = ", stdout); print_float(x);
Packit 6c4009
	fputs("\n\ty     = ", stdout); print_float(y);
Packit 6c4009
	fputs("\n\ttrue  = ", stdout); print_float(rr);
Packit 6c4009
	fputs("\n\tfalse = ", stdout); print_float(tr);
Packit 6c4009
	putchar('\n');
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
void test_double_arith(double (*tf)(double, double),
Packit 6c4009
		       double (*rf)(double, double),
Packit 6c4009
		       double x, double y)
Packit 6c4009
{
Packit 6c4009
    double tr, rr;
Packit 6c4009
#ifdef __i386__
Packit 6c4009
    /* Don't worry.  Even this does not make it error free
Packit 6c4009
       on ia32.  If the result is denormal,  it will not
Packit 6c4009
       honour the double precision and generate bad results
Packit 6c4009
       anyway.  On the other side,  who wants to use ia32
Packit 6c4009
       for IEEE math?  I don't.  */
Packit 6c4009
    _FPU_GETCW(fcw0);
Packit 6c4009
    fcw1 = ((fcw0 & ~_FPU_EXTENDED) | _FPU_DOUBLE);
Packit 6c4009
    _FPU_SETCW(fcw1);
Packit 6c4009
#endif
Packit 6c4009
    rr = (*rf)(x, y);
Packit 6c4009
#ifdef __i386__
Packit 6c4009
    _FPU_SETCW(fcw0);
Packit 6c4009
#endif
Packit 6c4009
    tr = (*tf)(x, y);
Packit 6c4009
    if (memcmp(&tr, &rr, sizeof(double)) != 0)
Packit 6c4009
    {
Packit 6c4009
	fputs("error:\n\tx     = ", stdout); print_double(x);
Packit 6c4009
	fputs("\n\ty     = ", stdout); print_double(y);
Packit 6c4009
	fputs("\n\ttrue  = ", stdout); print_double(rr);
Packit 6c4009
	fputs("\n\tfalse = ", stdout); print_double(tr);
Packit 6c4009
	putchar('\n');
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
void test_float_double_conv(float x)
Packit 6c4009
{
Packit 6c4009
    double tr, rr;
Packit 6c4009
    rr = r_extendsfdf2(x);
Packit 6c4009
    tr = __extendsfdf2(x);
Packit 6c4009
    if (memcmp(&tr, &rr, sizeof(double)) != 0)
Packit 6c4009
    {
Packit 6c4009
	fputs("error:\n\tx     = ", stdout); print_float(x);
Packit 6c4009
	fputs("\n\ttrue  = ", stdout); print_double(rr);
Packit 6c4009
	fputs("\n\tfalse = ", stdout); print_double(tr);
Packit 6c4009
	putchar('\n');
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
void test_double_float_conv(double x)
Packit 6c4009
{
Packit 6c4009
    float tr, rr;
Packit 6c4009
    rr = r_truncdfsf2(x);
Packit 6c4009
    tr = __truncdfsf2(x);
Packit 6c4009
    if (memcmp(&tr, &rr, sizeof(float)) != 0)
Packit 6c4009
    {
Packit 6c4009
	fputs("error:\n\tx     = ", stdout); print_double(x);
Packit 6c4009
	fputs("\n\ttrue  = ", stdout); print_float(rr);
Packit 6c4009
	fputs("\n\tfalse = ", stdout); print_float(tr);
Packit 6c4009
	putchar('\n');
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
void test_int_float_conv(int x)
Packit 6c4009
{
Packit 6c4009
    float tr, rr;
Packit 6c4009
    rr = r_floatsisf(x);
Packit 6c4009
    tr = __floatsisf(x);
Packit 6c4009
    if (memcmp(&tr, &rr, sizeof(float)) != 0)
Packit 6c4009
    {
Packit 6c4009
	printf("error\n\tx     = %d", x);
Packit 6c4009
	fputs("\n\ttrue  = ", stdout); print_float(rr);
Packit 6c4009
	fputs("\n\tfalse = ", stdout); print_float(tr);
Packit 6c4009
	putchar('\n');
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
void test_int_double_conv(int x)
Packit 6c4009
{
Packit 6c4009
    double tr, rr;
Packit 6c4009
    rr = r_floatsidf(x);
Packit 6c4009
    tr = __floatsidf(x);
Packit 6c4009
    if (memcmp(&tr, &rr, sizeof(double)) != 0)
Packit 6c4009
    {
Packit 6c4009
	printf("error\n\tx     = %d", x);
Packit 6c4009
	fputs("\n\ttrue  = ", stdout); print_double(rr);
Packit 6c4009
	fputs("\n\tfalse = ", stdout); print_double(tr);
Packit 6c4009
	putchar('\n');
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
void test_float_int_conv(float x)
Packit 6c4009
{
Packit 6c4009
    int tr, rr;
Packit 6c4009
    rr = r_fixsfsi(x);
Packit 6c4009
    tr = __fixsfsi(x);
Packit 6c4009
    if (rr != tr)
Packit 6c4009
    {
Packit 6c4009
	fputs("error:\n\tx     = ", stdout); print_float(x);
Packit 6c4009
	printf("\n\ttrue  = %d\n\tfalse = %d\n", rr, tr);
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
void test_double_int_conv(double x)
Packit 6c4009
{
Packit 6c4009
    int tr, rr;
Packit 6c4009
    rr = r_fixsfsi(x);
Packit 6c4009
    tr = __fixsfsi(x);
Packit 6c4009
    if (rr != tr)
Packit 6c4009
    {
Packit 6c4009
	fputs("error:\n\tx     = ", stdout); print_double(x);
Packit 6c4009
	printf("\n\ttrue  = %d\n\tfalse = %d\n", rr, tr);
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
int eq0(int x) { return x == 0; }
Packit 6c4009
int ne0(int x) { return x != 0; }
Packit 6c4009
int le0(int x) { return x <= 0; }
Packit 6c4009
int lt0(int x) { return x < 0; }
Packit 6c4009
int ge0(int x) { return x >= 0; }
Packit 6c4009
int gt0(int x) { return x > 0; }
Packit 6c4009
Packit 6c4009
void test_float_cmp(int (*tf)(float, float),
Packit 6c4009
		    int (*rf)(float, float),
Packit 6c4009
		    int (*cmp0)(int),
Packit 6c4009
		    float x, float y)
Packit 6c4009
{
Packit 6c4009
    int tr, rr;
Packit 6c4009
    rr = (*rf)(x, y);
Packit 6c4009
    tr = (*tf)(x, y);
Packit 6c4009
    if (cmp0(rr) != cmp0(tr))
Packit 6c4009
    {
Packit 6c4009
	fputs("error:\n\tx     = ", stdout); print_float(x);
Packit 6c4009
	fputs("\n\ty     = ", stdout); print_float(y);
Packit 6c4009
	printf("\n\ttrue  = %d\n\tfalse = %d\n", rr, tr);
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
void test_double_cmp(int (*tf)(double, double),
Packit 6c4009
		     int (*rf)(double, double),
Packit 6c4009
		     int (*cmp0)(int),
Packit 6c4009
		     double x, double y)
Packit 6c4009
{
Packit 6c4009
    int tr, rr;
Packit 6c4009
    rr = (*rf)(x, y);
Packit 6c4009
    tr = (*tf)(x, y);
Packit 6c4009
    if (cmp0(rr) != cmp0(tr))
Packit 6c4009
    {
Packit 6c4009
	fputs("error:\n\tx     = ", stdout); print_double(x);
Packit 6c4009
	fputs("\n\ty     = ", stdout); print_double(y);
Packit 6c4009
	printf("\n\ttrue  = %d\n\tfalse = %d\n", rr, tr);
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
/*======================================================================*/
Packit 6c4009
Packit 6c4009
Packit 6c4009
int main(int ac, char **av)
Packit 6c4009
{
Packit 6c4009
#ifdef __alpha__
Packit 6c4009
    __ieee_set_fp_control(0);
Packit 6c4009
#endif
Packit 6c4009
    av++, ac--;
Packit 6c4009
    switch (*(*av)++)
Packit 6c4009
    {
Packit 6c4009
	{
Packit 6c4009
	    float (*r)(float, float);
Packit 6c4009
	    float (*t)(float, float);
Packit 6c4009
Packit 6c4009
	    do {
Packit 6c4009
	      case 'a': r = r_addsf3; t = __addsf3; break;
Packit 6c4009
	      case 's': r = r_subsf3; t = __subsf3; break;
Packit 6c4009
	      case 'm': r = r_mulsf3; t = __mulsf3; break;
Packit 6c4009
	      case 'd': r = r_divsf3; t = __divsf3; break;
Packit 6c4009
	      case 'r': r = r_sqrtsf3; t = __sqrtsf3; break;
Packit 6c4009
	      case 'j': r = r_negsf3; t = __negsf3; break;
Packit 6c4009
	    } while (0);
Packit 6c4009
Packit 6c4009
	    switch (*(*av)++)
Packit 6c4009
	    {
Packit 6c4009
	      case 'n':
Packit 6c4009
		{
Packit 6c4009
		    int count = (ac > 1 ? atoi(av[1]) : 100);
Packit 6c4009
		    while (count--)
Packit 6c4009
			test_float_arith(t, r, rand_float(), rand_float());
Packit 6c4009
		}
Packit 6c4009
		break;
Packit 6c4009
Packit 6c4009
	      case 's':
Packit 6c4009
		{
Packit 6c4009
		    int i, j;
Packit 6c4009
		    for (i = 0; i < NSPECIALS; i++)
Packit 6c4009
			for (j = 0; j < NSPECIALS; j++)
Packit 6c4009
			    test_float_arith(t, r, gen_special_float(i),
Packit 6c4009
					      gen_special_float(j));
Packit 6c4009
		}
Packit 6c4009
		break;
Packit 6c4009
Packit 6c4009
	      case 0:
Packit 6c4009
		if (ac < 7) abort();
Packit 6c4009
		test_float_arith(t, r, build_float(av[1], av[2], av[3]),
Packit 6c4009
				 build_float(av[4], av[5], av[6]));
Packit 6c4009
		break;
Packit 6c4009
	    }
Packit 6c4009
	}
Packit 6c4009
	break;
Packit 6c4009
Packit 6c4009
	{
Packit 6c4009
	    double (*r)(double, double);
Packit 6c4009
	    double (*t)(double, double);
Packit 6c4009
Packit 6c4009
	    do {
Packit 6c4009
	      case 'A': r = r_adddf3; t = __adddf3; break;
Packit 6c4009
	      case 'S': r = r_subdf3; t = __subdf3; break;
Packit 6c4009
	      case 'M': r = r_muldf3; t = __muldf3; break;
Packit 6c4009
	      case 'D': r = r_divdf3; t = __divdf3; break;
Packit 6c4009
	      case 'R': r = r_sqrtdf3; t = __sqrtdf3; break;
Packit 6c4009
	      case 'J': r = r_negdf3; t = __negdf3; break;
Packit 6c4009
	    } while (0);
Packit 6c4009
Packit 6c4009
	    switch (*(*av)++)
Packit 6c4009
	    {
Packit 6c4009
	      case 'n':
Packit 6c4009
		{
Packit 6c4009
		    int count = (ac > 1 ? atoi(av[1]) : 100);
Packit 6c4009
		    while (count--)
Packit 6c4009
			test_double_arith(t, r, rand_double(), rand_double());
Packit 6c4009
		}
Packit 6c4009
		break;
Packit 6c4009
Packit 6c4009
	      case 's':
Packit 6c4009
		{
Packit 6c4009
		    int i, j;
Packit 6c4009
		    for (i = 0; i < NSPECIALS; i++)
Packit 6c4009
			for (j = 0; j < NSPECIALS; j++)
Packit 6c4009
			    test_double_arith(t, r, gen_special_double(i),
Packit 6c4009
					      gen_special_double(j));
Packit 6c4009
		}
Packit 6c4009
		break;
Packit 6c4009
Packit 6c4009
	      case 0:
Packit 6c4009
		if (ac < 7) abort();
Packit 6c4009
		test_double_arith(t, r, build_double(av[1], av[2], av[3]),
Packit 6c4009
				  build_double(av[4], av[5], av[6]));
Packit 6c4009
		break;
Packit 6c4009
	    }
Packit 6c4009
	}
Packit 6c4009
	break;
Packit 6c4009
Packit 6c4009
      case 'c':
Packit 6c4009
	switch (*(*av)++)
Packit 6c4009
	{
Packit 6c4009
	  case 'n':
Packit 6c4009
	    {
Packit 6c4009
		int count = (ac > 1 ? atoi(av[1]) : 100);
Packit 6c4009
		while (count--)
Packit 6c4009
		    test_float_double_conv(rand_float());
Packit 6c4009
	    }
Packit 6c4009
	    break;
Packit 6c4009
Packit 6c4009
	  case 's':
Packit 6c4009
	    {
Packit 6c4009
		int i;
Packit 6c4009
		for (i = 0; i < NSPECIALS; i++)
Packit 6c4009
		    test_float_double_conv(gen_special_float(i));
Packit 6c4009
	    }
Packit 6c4009
	    break;
Packit 6c4009
Packit 6c4009
	  case 0:
Packit 6c4009
	    if (ac < 4) abort();
Packit 6c4009
	    test_float_double_conv(build_float(av[1], av[2], av[3]));
Packit 6c4009
	    break;
Packit 6c4009
	}
Packit 6c4009
	break;
Packit 6c4009
Packit 6c4009
      case 'C':
Packit 6c4009
	switch (*(*av)++)
Packit 6c4009
	{
Packit 6c4009
	  case 'n':
Packit 6c4009
	    {
Packit 6c4009
		int count = (ac > 1 ? atoi(av[1]) : 100);
Packit 6c4009
		while (count--)
Packit 6c4009
		    test_double_float_conv(rand_double());
Packit 6c4009
	    }
Packit 6c4009
	    break;
Packit 6c4009
Packit 6c4009
	  case 's':
Packit 6c4009
	    {
Packit 6c4009
		int i;
Packit 6c4009
		for (i = 0; i < NSPECIALS; i++)
Packit 6c4009
		    test_double_float_conv(gen_special_double(i));
Packit 6c4009
	    }
Packit 6c4009
	    break;
Packit 6c4009
Packit 6c4009
	  case 0:
Packit 6c4009
	    if (ac < 4) abort();
Packit 6c4009
	    test_double_float_conv(build_double(av[1], av[2], av[3]));
Packit 6c4009
	    break;
Packit 6c4009
	}
Packit 6c4009
	break;
Packit 6c4009
Packit 6c4009
      case 'i':
Packit 6c4009
	switch (*(*av)++)
Packit 6c4009
	{
Packit 6c4009
	  case 'n':
Packit 6c4009
	    {
Packit 6c4009
		int count = (ac > 1 ? atoi(av[1]) : 100);
Packit 6c4009
		while (count--)
Packit 6c4009
		    test_int_float_conv(lrand48() << 1);
Packit 6c4009
	    }
Packit 6c4009
	    break;
Packit 6c4009
Packit 6c4009
	  case 0:
Packit 6c4009
	    if (ac < 2) abort();
Packit 6c4009
	    test_int_float_conv(strtol(av[1], 0, 0));
Packit 6c4009
	    break;
Packit 6c4009
	}
Packit 6c4009
	break;
Packit 6c4009
Packit 6c4009
      case 'I':
Packit 6c4009
	switch (*(*av)++)
Packit 6c4009
	{
Packit 6c4009
	  case 'n':
Packit 6c4009
	    {
Packit 6c4009
		int count = (ac > 1 ? atoi(av[1]) : 100);
Packit 6c4009
		while (count--)
Packit 6c4009
		    test_int_double_conv(lrand48() << 1);
Packit 6c4009
	    }
Packit 6c4009
	    break;
Packit 6c4009
Packit 6c4009
	  case 0:
Packit 6c4009
	    if (ac < 2) abort();
Packit 6c4009
	    test_int_double_conv(strtol(av[1], 0, 0));
Packit 6c4009
	    break;
Packit 6c4009
	}
Packit 6c4009
	break;
Packit 6c4009
Packit 6c4009
      case 'f':
Packit 6c4009
	switch (*(*av)++)
Packit 6c4009
	{
Packit 6c4009
	  case 'n':
Packit 6c4009
	    {
Packit 6c4009
		int count = (ac > 1 ? atoi(av[1]) : 100);
Packit 6c4009
		while (count--)
Packit 6c4009
		    test_float_int_conv(rand_float());
Packit 6c4009
	    }
Packit 6c4009
	    break;
Packit 6c4009
Packit 6c4009
	  case 's':
Packit 6c4009
	    {
Packit 6c4009
		int i;
Packit 6c4009
		for (i = 0; i < NSPECIALS; i++)
Packit 6c4009
		    test_float_int_conv(gen_special_float(i));
Packit 6c4009
	    }
Packit 6c4009
	    break;
Packit 6c4009
Packit 6c4009
	  case 0:
Packit 6c4009
	    if (ac < 4) abort();
Packit 6c4009
	    test_float_int_conv(build_float(av[1], av[2], av[3]));
Packit 6c4009
	    break;
Packit 6c4009
	}
Packit 6c4009
	break;
Packit 6c4009
Packit 6c4009
      case 'F':
Packit 6c4009
	switch (*(*av)++)
Packit 6c4009
	{
Packit 6c4009
	  case 'n':
Packit 6c4009
	    {
Packit 6c4009
		int count = (ac > 1 ? atoi(av[1]) : 100);
Packit 6c4009
		while (count--)
Packit 6c4009
		    test_double_int_conv(rand_double());
Packit 6c4009
	    }
Packit 6c4009
	    break;
Packit 6c4009
Packit 6c4009
	  case 's':
Packit 6c4009
	    {
Packit 6c4009
		int i;
Packit 6c4009
		for (i = 0; i < NSPECIALS; i++)
Packit 6c4009
		    test_double_int_conv(gen_special_double(i));
Packit 6c4009
	    }
Packit 6c4009
	    break;
Packit 6c4009
Packit 6c4009
	  case 0:
Packit 6c4009
	    if (ac < 4) abort();
Packit 6c4009
	    test_double_int_conv(build_double(av[1], av[2], av[3]));
Packit 6c4009
	    break;
Packit 6c4009
	}
Packit 6c4009
	break;
Packit 6c4009
Packit 6c4009
	{
Packit 6c4009
	    int (*r)(float, float);
Packit 6c4009
	    int (*t)(float, float);
Packit 6c4009
	    int (*c)(int);
Packit 6c4009
Packit 6c4009
	    do {
Packit 6c4009
	      case 'e': r = r_eqsf2; t = __eqsf2; c = eq0; break;
Packit 6c4009
	      case 'n': r = r_nesf2; t = __nesf2; c = ne0; break;
Packit 6c4009
	      case 'l':
Packit 6c4009
		switch (*(*av)++)
Packit 6c4009
		{
Packit 6c4009
		  case 'e': r = r_lesf2; t = __lesf2; c = le0; break;
Packit 6c4009
		  case 't': r = r_ltsf2; t = __ltsf2; c = lt0; break;
Packit 6c4009
		}
Packit 6c4009
		break;
Packit 6c4009
	      case 'g':
Packit 6c4009
		switch (*(*av)++)
Packit 6c4009
		{
Packit 6c4009
		  case 'e': r = r_gesf2; t = __gesf2; c = ge0; break;
Packit 6c4009
		  case 't': r = r_gtsf2; t = __gtsf2; c = gt0; break;
Packit 6c4009
		}
Packit 6c4009
		break;
Packit 6c4009
	    } while (0);
Packit 6c4009
Packit 6c4009
	    switch (*(*av)++)
Packit 6c4009
	    {
Packit 6c4009
	      case 'n':
Packit 6c4009
		{
Packit 6c4009
		    int count = (ac > 1 ? atoi(av[1]) : 100);
Packit 6c4009
		    while (count--)
Packit 6c4009
			test_float_cmp(t, r, c, rand_float(), rand_float());
Packit 6c4009
		}
Packit 6c4009
		break;
Packit 6c4009
Packit 6c4009
	      case 's':
Packit 6c4009
		{
Packit 6c4009
		    int i, j;
Packit 6c4009
		    for (i = 0; i < NSPECIALS; i++)
Packit 6c4009
			for (j = 0; j < NSPECIALS; j++)
Packit 6c4009
			    test_float_cmp(t, r, c, gen_special_float(i),
Packit 6c4009
					   gen_special_float(j));
Packit 6c4009
		}
Packit 6c4009
		break;
Packit 6c4009
Packit 6c4009
	      case 0:
Packit 6c4009
		if (ac < 7) abort();
Packit 6c4009
		test_float_cmp(t, r, c, build_float(av[1], av[2], av[3]),
Packit 6c4009
				build_float(av[4], av[5], av[6]));
Packit 6c4009
		break;
Packit 6c4009
	    }
Packit 6c4009
	}
Packit 6c4009
	break;
Packit 6c4009
Packit 6c4009
	{
Packit 6c4009
	    int (*r)(double, double);
Packit 6c4009
	    int (*t)(double, double);
Packit 6c4009
	    int (*c)(int);
Packit 6c4009
Packit 6c4009
	    do {
Packit 6c4009
	      case 'E': r = r_eqdf2; t = __eqdf2; c = eq0; break;
Packit 6c4009
	      case 'N': r = r_nedf2; t = __nedf2; c = ne0; break;
Packit 6c4009
	      case 'L':
Packit 6c4009
		switch (*(*av)++)
Packit 6c4009
		{
Packit 6c4009
		  case 'E': r = r_ledf2; t = __ledf2; c = le0; break;
Packit 6c4009
		  case 'T': r = r_ltdf2; t = __ltdf2; c = lt0; break;
Packit 6c4009
		}
Packit 6c4009
		break;
Packit 6c4009
	      case 'G':
Packit 6c4009
		switch (*(*av)++)
Packit 6c4009
		{
Packit 6c4009
		  case 'E': r = r_gedf2; t = __gedf2; c = ge0; break;
Packit 6c4009
		  case 'T': r = r_gtdf2; t = __gtdf2; c = gt0; break;
Packit 6c4009
		}
Packit 6c4009
		break;
Packit 6c4009
	    } while (0);
Packit 6c4009
Packit 6c4009
	    switch (*(*av)++)
Packit 6c4009
	    {
Packit 6c4009
	      case 'n':
Packit 6c4009
		{
Packit 6c4009
		    int count = (ac > 1 ? atoi(av[1]) : 100);
Packit 6c4009
		    while (count--)
Packit 6c4009
			test_double_cmp(t, r, c, rand_double(), rand_double());
Packit 6c4009
		}
Packit 6c4009
		break;
Packit 6c4009
Packit 6c4009
	      case 's':
Packit 6c4009
		{
Packit 6c4009
		    int i, j;
Packit 6c4009
		    for (i = 0; i < NSPECIALS; i++)
Packit 6c4009
			for (j = 0; j < NSPECIALS; j++)
Packit 6c4009
			    test_double_cmp(t, r, c, gen_special_double(i),
Packit 6c4009
					    gen_special_double(j));
Packit 6c4009
		}
Packit 6c4009
		break;
Packit 6c4009
Packit 6c4009
	      case 0:
Packit 6c4009
		if (ac < 7) abort();
Packit 6c4009
		test_double_cmp(t, r, c, build_double(av[1], av[2], av[3]),
Packit 6c4009
				build_double(av[4], av[5], av[6]));
Packit 6c4009
		break;
Packit 6c4009
	    }
Packit 6c4009
	}
Packit 6c4009
	break;
Packit 6c4009
Packit 6c4009
      default:
Packit 6c4009
	abort();
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
    return 0;
Packit 6c4009
}