Blame soft-fp/testit.c

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