// SPDX-License-Identifier: GPL-2.0
/*---------------------------------------------------------------------------+
 |  fpu_trig.c                                                               |
 |                                                                           |
 | Implementation of the FPU "transcendental" functions.                     |
 |                                                                           |
 | Copyright (C) 1992,1993,1994,1997,1999                                    |
 |                       W. Metzenthen, 22 Parker St, Ormond, Vic 3163,      |
 |                       Australia.  E-mail   billm@melbpc.org.au            |
 |                                                                           |
 |                                                                           |
 +---------------------------------------------------------------------------*/

#include "fpu_system.h"
#include "exception.h"
#include "fpu_emu.h"
#include "status_w.h"
#include "control_w.h"
#include "reg_constant.h"

static void rem_kernel(unsigned long long st0, unsigned long long *y,
		       unsigned long long st1, unsigned long long q, int n);

#define BETTER_THAN_486

#define FCOS  4

/* Used only by fptan, fsin, fcos, and fsincos. */
/* This routine produces very accurate results, similar to
   using a value of pi with more than 128 bits precision. */
/* Limited measurements show no results worse than 64 bit precision
   except for the results for arguments close to 2^63, where the
   precision of the result sometimes degrades to about 63.9 bits */
static int trig_arg(FPU_REG *st0_ptr, int even)
{
	FPU_REG tmp;
	u_char tmptag;
	unsigned long long q;
	int old_cw = control_word, saved_status = partial_status;
	int tag, st0_tag = TAG_Valid;

	if (exponent(st0_ptr) >= 63) {
		partial_status |= SW_C2;	/* Reduction incomplete. */
		return -1;
	}

	control_word &= ~CW_RC;
	control_word |= RC_CHOP;

	setpositive(st0_ptr);
	tag = FPU_u_div(st0_ptr, &CONST_PI2, &tmp, PR_64_BITS | RC_CHOP | 0x3f,
			SIGN_POS);

	FPU_round_to_int(&tmp, tag);	/* Fortunately, this can't overflow
					   to 2^64 */
	q = significand(&tmp);
	if (q) {
		rem_kernel(significand(st0_ptr),
			   &significand(&tmp),
			   significand(&CONST_PI2),
			   q, exponent(st0_ptr) - exponent(&CONST_PI2));
		setexponent16(&tmp, exponent(&CONST_PI2));
		st0_tag = FPU_normalize(&tmp);
		FPU_copy_to_reg0(&tmp, st0_tag);
	}

	if ((even && !(q & 1)) || (!even && (q & 1))) {
		st0_tag =
		    FPU_sub(REV | LOADED | TAG_Valid, (int)&CONST_PI2,
			    FULL_PRECISION);

#ifdef BETTER_THAN_486
		/* So far, the results are exact but based upon a 64 bit
		   precision approximation to pi/2. The technique used
		   now is equivalent to using an approximation to pi/2 which
		   is accurate to about 128 bits. */
		if ((exponent(st0_ptr) <= exponent(&CONST_PI2extra) + 64)
		    || (q > 1)) {
			/* This code gives the effect of having pi/2 to better than
			   128 bits precision. */

			significand(&tmp) = q + 1;
			setexponent16(&tmp, 63);
			FPU_normalize(&tmp);
			tmptag =
			    FPU_u_mul(&CONST_PI2extra, &tmp, &tmp,
				      FULL_PRECISION, SIGN_POS,
				      exponent(&CONST_PI2extra) +
				      exponent(&tmp));
			setsign(&tmp, getsign(&CONST_PI2extra));
			st0_tag = FPU_add(&tmp, tmptag, 0, FULL_PRECISION);
			if (signnegative(st0_ptr)) {
				/* CONST_PI2extra is negative, so the result of the addition
				   can be negative. This means that the argument is actually
				   in a different quadrant. The correction is always < pi/2,
				   so it can't overflow into yet another quadrant. */
				setpositive(st0_ptr);
				q++;
			}
		}
#endif /* BETTER_THAN_486 */
	}
#ifdef BETTER_THAN_486
	else {
		/* So far, the results are exact but based upon a 64 bit
		   precision approximation to pi/2. The technique used
		   now is equivalent to using an approximation to pi/2 which
		   is accurate to about 128 bits. */
		if (((q > 0)
		     && (exponent(st0_ptr) <= exponent(&CONST_PI2extra) + 64))
		    || (q > 1)) {
			/* This code gives the effect of having p/2 to better than
			   128 bits precision. */

			significand(&tmp) = q;
			setexponent16(&tmp, 63);
			FPU_normalize(&tmp);	/* This must return TAG_Valid */
			tmptag =
			    FPU_u_mul(&CONST_PI2extra, &tmp, &tmp,
				      FULL_PRECISION, SIGN_POS,
				      exponent(&CONST_PI2extra) +
				      exponent(&tmp));
			setsign(&tmp, getsign(&CONST_PI2extra));
			st0_tag = FPU_sub(LOADED | (tmptag & 0x0f), (int)&tmp,
					  FULL_PRECISION);
			if ((exponent(st0_ptr) == exponent(&CONST_PI2)) &&
			    ((st0_ptr->sigh > CONST_PI2.sigh)
			     || ((st0_ptr->sigh == CONST_PI2.sigh)
				 && (st0_ptr->sigl > CONST_PI2.sigl)))) {
				/* CONST_PI2extra is negative, so the result of the
				   subtraction can be larger than pi/2. This means
				   that the argument is actually in a different quadrant.
				   The correction is always < pi/2, so it can't overflow
				   into yet another quadrant. */
				st0_tag =
				    FPU_sub(REV | LOADED | TAG_Valid,
					    (int)&CONST_PI2, FULL_PRECISION);
				q++;
			}
		}
	}
#endif /* BETTER_THAN_486 */

	FPU_settag0(st0_tag);
	control_word = old_cw;
	partial_status = saved_status & ~SW_C2;	/* Reduction complete. */

	return (q & 3) | even;
}

/* Convert a long to register */
static void convert_l2reg(long const *arg, int deststnr)
{
	int tag;
	long num = *arg;
	u_char sign;
	FPU_REG *dest = &st(deststnr);

	if (num == 0) {
		FPU_copy_to_regi(&CONST_Z, TAG_Zero, deststnr);
		return;
	}

	if (num > 0) {
		sign = SIGN_POS;
	} else {
		num = -num;
		sign = SIGN_NEG;
	}

	dest->sigh = num;
	dest->sigl = 0;
	setexponent16(dest, 31);
	tag = FPU_normalize(dest);
	FPU_settagi(deststnr, tag);
	setsign(dest, sign);
	return;
}

static void single_arg_error(FPU_REG *st0_ptr, u_char st0_tag)
{
	if (st0_tag == TAG_Empty)
		FPU_stack_underflow();	/* Puts a QNaN in st(0) */
	else if (st0_tag == TW_NaN)
		real_1op_NaN(st0_ptr);	/* return with a NaN in st(0) */
#ifdef PARANOID
	else
		EXCEPTION(EX_INTERNAL | 0x0112);
#endif /* PARANOID */
}

static void single_arg_2_error(FPU_REG *st0_ptr, u_char st0_tag)
{
	int isNaN;

	switch (st0_tag) {
	case TW_NaN:
		isNaN = (exponent(st0_ptr) == EXP_OVER)
		    && (st0_ptr->sigh & 0x80000000);
		if (isNaN && !(st0_ptr->sigh & 0x40000000)) {	/* Signaling ? */
			EXCEPTION(EX_Invalid);
			if (control_word & CW_Invalid) {
				/* The masked response */
				/* Convert to a QNaN */
				st0_ptr->sigh |= 0x40000000;
				push();
				FPU_copy_to_reg0(st0_ptr, TAG_Special);
			}
		} else if (isNaN) {
			/* A QNaN */
			push();
			FPU_copy_to_reg0(st0_ptr, TAG_Special);
		} else {
			/* pseudoNaN or other unsupported */
			EXCEPTION(EX_Invalid);
			if (control_word & CW_Invalid) {
				/* The masked response */
				FPU_copy_to_reg0(&CONST_QNaN, TAG_Special);
				push();
				FPU_copy_to_reg0(&CONST_QNaN, TAG_Special);
			}
		}
		break;		/* return with a NaN in st(0) */
#ifdef PARANOID
	default:
		EXCEPTION(EX_INTERNAL | 0x0112);
#endif /* PARANOID */
	}
}

/*---------------------------------------------------------------------------*/

static void f2xm1(FPU_REG *st0_ptr, u_char tag)
{
	FPU_REG a;

	clear_C1();

	if (tag == TAG_Valid) {
		/* For an 80486 FPU, the result is undefined if the arg is >= 1.0 */
		if (exponent(st0_ptr) < 0) {
		      denormal_arg:

			FPU_to_exp16(st0_ptr, &a);

			/* poly_2xm1(x) requires 0 < st(0) < 1. */
			poly_2xm1(getsign(st0_ptr), &a, st0_ptr);
		}
		set_precision_flag_up();	/* 80486 appears to always do this */
		return;
	}

	if (tag == TAG_Zero)
		return;

	if (tag == TAG_Special)
		tag = FPU_Special(st0_ptr);

	switch (tag) {
	case TW_Denormal:
		if (denormal_operand() < 0)
			return;
		goto denormal_arg;
	case TW_Infinity:
		if (signnegative(st0_ptr)) {
			/* -infinity gives -1 (p16-10) */
			FPU_copy_to_reg0(&CONST_1, TAG_Valid);
			setnegative(st0_ptr);
		}
		return;
	default:
		single_arg_error(st0_ptr, tag);
	}
}

static void fptan(FPU_REG *st0_ptr, u_char st0_tag)
{
	FPU_REG *st_new_ptr;
	int q;
	u_char arg_sign = getsign(st0_ptr);

	/* Stack underflow has higher priority */
	if (st0_tag == TAG_Empty) {
		FPU_stack_underflow();	/* Puts a QNaN in st(0) */
		if (control_word & CW_Invalid) {
			st_new_ptr = &st(-1);
			push();
			FPU_stack_underflow();	/* Puts a QNaN in the new st(0) */
		}
		return;
	}

	if (STACK_OVERFLOW) {
		FPU_stack_overflow();
		return;
	}

	if (st0_tag == TAG_Valid) {
		if (exponent(st0_ptr) > -40) {
			if ((q = trig_arg(st0_ptr, 0)) == -1) {
				/* Operand is out of range */
				return;
			}

			poly_tan(st0_ptr);
			setsign(st0_ptr, (q & 1) ^ (arg_sign != 0));
			set_precision_flag_up();	/* We do not really know if up or down */
		} else {
			/* For a small arg, the result == the argument */
			/* Underflow may happen */

		      denormal_arg:

			FPU_to_exp16(st0_ptr, st0_ptr);

			st0_tag =
			    FPU_round(st0_ptr, 1, 0, FULL_PRECISION, arg_sign);
			FPU_settag0(st0_tag);
		}
		push();
		FPU_copy_to_reg0(&CONST_1, TAG_Valid);
		return;
	}

	if (st0_tag == TAG_Zero) {
		push();
		FPU_copy_to_reg0(&CONST_1, TAG_Valid);
		setcc(0);
		return;
	}

	if (st0_tag == TAG_Special)
		st0_tag = FPU_Special(st0_ptr);

	if (st0_tag == TW_Denormal) {
		if (denormal_operand() < 0)
			return;

		goto denormal_arg;
	}

	if (st0_tag == TW_Infinity) {
		/* The 80486 treats infinity as an invalid operand */
		if (arith_invalid(0) >= 0) {
			st_new_ptr = &st(-1);
			push();
			arith_invalid(0);
		}
		return;
	}

	single_arg_2_error(st0_ptr, st0_tag);
}

static void fxtract(FPU_REG *st0_ptr, u_char st0_tag)
{
	FPU_REG *st_new_ptr;
	u_char sign;
	register FPU_REG *st1_ptr = st0_ptr;	/* anticipate */

	if (STACK_OVERFLOW) {
		FPU_stack_overflow();
		return;
	}

	clear_C1();

	if (st0_tag == TAG_Valid) {
		long e;

		push();
		sign = getsign(st1_ptr);
		reg_copy(st1_ptr, st_new_ptr);
		setexponent16(st_new_ptr, exponent(st_new_ptr));

	      denormal_arg:

		e = exponent16(st_new_ptr);
		convert_l2reg(&e, 1);
		setexponentpos(st_new_ptr, 0);
		setsign(st_new_ptr, sign);
		FPU_settag0(TAG_Valid);	/* Needed if arg was a denormal */
		return;
	} else if (st0_tag == TAG_Zero) {
		sign = getsign(st0_ptr);

		if (FPU_divide_by_zero(0, SIGN_NEG) < 0)
			return;

		push();
		FPU_copy_to_reg0(&CONST_Z, TAG_Zero);
		setsign(st_new_ptr, sign);
		return;
	}

	if (st0_tag == TAG_Special)
		st0_tag = FPU_Special(st0_ptr);

	if (st0_tag == TW_Denormal) {
		if (denormal_operand() < 0)
			return;

		push();
		sign = getsign(st1_ptr);
		FPU_to_exp16(st1_ptr, st_new_ptr);
		goto denormal_arg;
	} else if (st0_tag == TW_Infinity) {
		sign = getsign(st0_ptr);
		setpositive(st0_ptr);
		push();
		FPU_copy_to_reg0(&CONST_INF, TAG_Special);
		setsign(st_new_ptr, sign);
		return;
	} else if (st0_tag == TW_NaN) {
		if (real_1op_NaN(st0_ptr) < 0)
			return;

		push();
		FPU_copy_to_reg0(st0_ptr, TAG_Special);
		return;
	} else if (st0_tag == TAG_Empty) {
		/* Is this the correct behaviour? */
		if (control_word & EX_Invalid) {
			FPU_stack_underflow();
			push();
			FPU_stack_underflow();
		} else
			EXCEPTION(EX_StackUnder);
	}
#ifdef PARANOID
	else
		EXCEPTION(EX_INTERNAL | 0x119);
#endif /* PARANOID */
}

static void fdecstp(void)
{
	clear_C1();
	top--;
}

static void fincstp(void)
{
	clear_C1();
	top++;
}

static void fsqrt_(FPU_REG *st0_ptr, u_char st0_tag)
{
	int expon;

	clear_C1();

	if (st0_tag == TAG_Valid) {
		u_char tag;

		if (signnegative(st0_ptr)) {
			arith_invalid(0);	/* sqrt(negative) is invalid */
			return;
		}

		/* make st(0) in  [1.0 .. 4.0) */
		expon = exponent(st0_ptr);

	      denormal_arg:

		setexponent16(st0_ptr, (expon & 1));

		/* Do the computation, the sign of the result will be positive. */
		tag = wm_sqrt(st0_ptr, 0, 0, control_word, SIGN_POS);
		addexponent(st0_ptr, expon >> 1);
		FPU_settag0(tag);
		return;
	}

	if (st0_tag == TAG_Zero)
		return;

	if (st0_tag == TAG_Special)
		st0_tag = FPU_Special(st0_ptr);

	if (st0_tag == TW_Infinity) {
		if (signnegative(st0_ptr))
			arith_invalid(0);	/* sqrt(-Infinity) is invalid */
		return;
	} else if (st0_tag == TW_Denormal) {
		if (signnegative(st0_ptr)) {
			arith_invalid(0);	/* sqrt(negative) is invalid */
			return;
		}

		if (denormal_operand() < 0)
			return;

		FPU_to_exp16(st0_ptr, st0_ptr);

		expon = exponent16(st0_ptr);

		goto denormal_arg;
	}

	single_arg_error(st0_ptr, st0_tag);

}

static void frndint_(FPU_REG *st0_ptr, u_char st0_tag)
{
	int flags, tag;

	if (st0_tag == TAG_Valid) {
		u_char sign;

	      denormal_arg:

		sign = getsign(st0_ptr);

		if (exponent(st0_ptr) > 63)
			return;

		if (st0_tag == TW_Denormal) {
			if (denormal_operand() < 0)
				return;
		}

		/* Fortunately, this can't overflow to 2^64 */
		if ((flags = FPU_round_to_int(st0_ptr, st0_tag)))
			set_precision_flag(flags);

		setexponent16(st0_ptr, 63);
		tag = FPU_normalize(st0_ptr);
		setsign(st0_ptr, sign);
		FPU_settag0(tag);
		return;
	}

	if (st0_tag == TAG_Zero)
		return;

	if (st0_tag == TAG_Special)
		st0_tag = FPU_Special(st0_ptr);

	if (st0_tag == TW_Denormal)
		goto denormal_arg;
	else if (st0_tag == TW_Infinity)
		return;
	else
		single_arg_error(st0_ptr, st0_tag);
}

static int fsin(FPU_REG *st0_ptr, u_char tag)
{
	u_char arg_sign = getsign(st0_ptr);

	if (tag == TAG_Valid) {
		int q;

		if (exponent(st0_ptr) > -40) {
			if ((q = trig_arg(st0_ptr, 0)) == -1) {
				/* Operand is out of range */
				return 1;
			}

			poly_sine(st0_ptr);

			if (q & 2)
				changesign(st0_ptr);

			setsign(st0_ptr, getsign(st0_ptr) ^ arg_sign);

			/* We do not really know if up or down */
			set_precision_flag_up();
			return 0;
		} else {
			/* For a small arg, the result == the argument */
			set_precision_flag_up();	/* Must be up. */
			return 0;
		}
	}

	if (tag == TAG_Zero) {
		setcc(0);
		return 0;
	}

	if (tag == TAG_Special)
		tag = FPU_Special(st0_ptr);

	if (tag == TW_Denormal) {
		if (denormal_operand() < 0)
			return 1;

		/* For a small arg, the result == the argument */
		/* Underflow may happen */
		FPU_to_exp16(st0_ptr, st0_ptr);

		tag = FPU_round(st0_ptr, 1, 0, FULL_PRECISION, arg_sign);

		FPU_settag0(tag);

		return 0;
	} else if (tag == TW_Infinity) {
		/* The 80486 treats infinity as an invalid operand */
		arith_invalid(0);
		return 1;
	} else {
		single_arg_error(st0_ptr, tag);
		return 1;
	}
}

static int f_cos(FPU_REG *st0_ptr, u_char tag)
{
	u_char st0_sign;

	st0_sign = getsign(st0_ptr);

	if (tag == TAG_Valid) {
		int q;

		if (exponent(st0_ptr) > -40) {
			if ((exponent(st0_ptr) < 0)
			    || ((exponent(st0_ptr) == 0)
				&& (significand(st0_ptr) <=
				    0xc90fdaa22168c234LL))) {
				poly_cos(st0_ptr);

				/* We do not really know if up or down */
				set_precision_flag_down();

				return 0;
			} else if ((q = trig_arg(st0_ptr, FCOS)) != -1) {
				poly_sine(st0_ptr);

				if ((q + 1) & 2)
					changesign(st0_ptr);

				/* We do not really know if up or down */
				set_precision_flag_down();

				return 0;
			} else {
				/* Operand is out of range */
				return 1;
			}
		} else {
		      denormal_arg:

			setcc(0);
			FPU_copy_to_reg0(&CONST_1, TAG_Valid);
#ifdef PECULIAR_486
			set_precision_flag_down();	/* 80486 appears to do this. */
#else
			set_precision_flag_up();	/* Must be up. */
#endif /* PECULIAR_486 */
			return 0;
		}
	} else if (tag == TAG_Zero) {
		FPU_copy_to_reg0(&CONST_1, TAG_Valid);
		setcc(0);
		return 0;
	}

	if (tag == TAG_Special)
		tag = FPU_Special(st0_ptr);

	if (tag == TW_Denormal) {
		if (denormal_operand() < 0)
			return 1;

		goto denormal_arg;
	} else if (tag == TW_Infinity) {
		/* The 80486 treats infinity as an invalid operand */
		arith_invalid(0);
		return 1;
	} else {
		single_arg_error(st0_ptr, tag);	/* requires st0_ptr == &st(0) */
		return 1;
	}
}

static void fcos(FPU_REG *st0_ptr, u_char st0_tag)
{
	f_cos(st0_ptr, st0_tag);
}

static void fsincos(FPU_REG *st0_ptr, u_char st0_tag)
{
	FPU_REG *st_new_ptr;
	FPU_REG arg;
	u_char tag;

	/* Stack underflow has higher priority */
	if (st0_tag == TAG_Empty) {
		FPU_stack_underflow();	/* Puts a QNaN in st(0) */
		if (control_word & CW_Invalid) {
			st_new_ptr = &st(-1);
			push();
			FPU_stack_underflow();	/* Puts a QNaN in the new st(0) */
		}
		return;
	}

	if (STACK_OVERFLOW) {
		FPU_stack_overflow();
		return;
	}

	if (st0_tag == TAG_Special)
		tag = FPU_Special(st0_ptr);
	else
		tag = st0_tag;

	if (tag == TW_NaN) {
		single_arg_2_error(st0_ptr, TW_NaN);
		return;
	} else if (tag == TW_Infinity) {
		/* The 80486 treats infinity as an invalid operand */
		if (arith_invalid(0) >= 0) {
			/* Masked response */
			push();
			arith_invalid(0);
		}
		return;
	}

	reg_copy(st0_ptr, &arg);
	if (!fsin(st0_ptr, st0_tag)) {
		push();
		FPU_copy_to_reg0(&arg, st0_tag);
		f_cos(&st(0), st0_tag);
	} else {
		/* An error, so restore st(0) */
		FPU_copy_to_reg0(&arg, st0_tag);
	}
}

/*---------------------------------------------------------------------------*/
/* The following all require two arguments: st(0) and st(1) */

/* A lean, mean kernel for the fprem instructions. This relies upon
   the division and rounding to an integer in do_fprem giving an
   exact result. Because of this, rem_kernel() needs to deal only with
   the least significant 64 bits, the more significant bits of the
   result must be zero.
 */
static void rem_kernel(unsigned long long st0, unsigned long long *y,
		       unsigned long long st1, unsigned long long q, int n)
{
	int dummy;
	unsigned long long x;

	x = st0 << n;

	/* Do the required multiplication and subtraction in the one operation */

	/* lsw x -= lsw st1 * lsw q */
	asm volatile ("mull %4; subl %%eax,%0; sbbl %%edx,%1":"=m"
		      (((unsigned *)&x)[0]), "=m"(((unsigned *)&x)[1]),
		      "=a"(dummy)
		      :"2"(((unsigned *)&st1)[0]), "m"(((unsigned *)&q)[0])
		      :"%dx");
	/* msw x -= msw st1 * lsw q */
	asm volatile ("mull %3; subl %%eax,%0":"=m" (((unsigned *)&x)[1]),
		      "=a"(dummy)
		      :"1"(((unsigned *)&st1)[1]), "m"(((unsigned *)&q)[0])
		      :"%dx");
	/* msw x -= lsw st1 * msw q */
	asm volatile ("mull %3; subl %%eax,%0":"=m" (((unsigned *)&x)[1]),
		      "=a"(dummy)
		      :"1"(((unsigned *)&st1)[0]), "m"(((unsigned *)&q)[1])
		      :"%dx");

	*y = x;
}

/* Remainder of st(0) / st(1) */
/* This routine produces exact results, i.e. there is never any
   rounding or truncation, etc of the result. */
static void do_fprem(FPU_REG *st0_ptr, u_char st0_tag, int round)
{
	FPU_REG *st1_ptr = &st(1);
	u_char st1_tag = FPU_gettagi(1);

	if (!((st0_tag ^ TAG_Valid) | (st1_tag ^ TAG_Valid))) {
		FPU_REG tmp, st0, st1;
		u_char st0_sign, st1_sign;
		u_char tmptag;
		int tag;
		int old_cw;
		int expdif;
		long long q;
		unsigned short saved_status;
		int cc;

	      fprem_valid:
		/* Convert registers for internal use. */
		st0_sign = FPU_to_exp16(st0_ptr, &st0);
		st1_sign = FPU_to_exp16(st1_ptr, &st1);
		expdif = exponent16(&st0) - exponent16(&st1);

		old_cw = control_word;
		cc = 0;

		/* We want the status following the denorm tests, but don't want
		   the status changed by the arithmetic operations. */
		saved_status = partial_status;
		control_word &= ~CW_RC;
		control_word |= RC_CHOP;

		if (expdif < 64) {
			/* This should be the most common case */

			if (expdif > -2) {
				u_char sign = st0_sign ^ st1_sign;
				tag = FPU_u_div(&st0, &st1, &tmp,
						PR_64_BITS | RC_CHOP | 0x3f,
						sign);
				setsign(&tmp, sign);

				if (exponent(&tmp) >= 0) {
					FPU_round_to_int(&tmp, tag);	/* Fortunately, this can't
									   overflow to 2^64 */
					q = significand(&tmp);

					rem_kernel(significand(&st0),
						   &significand(&tmp),
						   significand(&st1),
						   q, expdif);

					setexponent16(&tmp, exponent16(&st1));
				} else {
					reg_copy(&st0, &tmp);
					q = 0;
				}

				if ((round == RC_RND)
				    && (tmp.sigh & 0xc0000000)) {
					/* We may need to subtract st(1) once more,
					   to get a result <= 1/2 of st(1). */
					unsigned long long x;
					expdif =
					    exponent16(&st1) - exponent16(&tmp);
					if (expdif <= 1) {
						if (expdif == 0)
							x = significand(&st1) -
							    significand(&tmp);
						else	/* expdif is 1 */
							x = (significand(&st1)
							     << 1) -
							    significand(&tmp);
						if ((x < significand(&tmp)) ||
						    /* or equi-distant (from 0 & st(1)) and q is odd */
						    ((x == significand(&tmp))
						     && (q & 1))) {
							st0_sign = !st0_sign;
							significand(&tmp) = x;
							q++;
						}
					}
				}

				if (q & 4)
					cc |= SW_C0;
				if (q & 2)
					cc |= SW_C3;
				if (q & 1)
					cc |= SW_C1;
			} else {
				control_word = old_cw;
				setcc(0);
				return;
			}
		} else {
			/* There is a large exponent difference ( >= 64 ) */
			/* To make much sense, the code in this section should
			   be done at high precision. */
			int exp_1, N;
			u_char sign;

			/* prevent overflow here */
			/* N is 'a number between 32 and 63' (p26-113) */
			reg_copy(&st0, &tmp);
			tmptag = st0_tag;
			N = (expdif & 0x0000001f) + 32;	/* This choice gives results
							   identical to an AMD 486 */
			setexponent16(&tmp, N);
			exp_1 = exponent16(&st1);
			setexponent16(&st1, 0);
			expdif -= N;

			sign = getsign(&tmp) ^ st1_sign;
			tag =
			    FPU_u_div(&tmp, &st1, &tmp,
				      PR_64_BITS | RC_CHOP | 0x3f, sign);
			setsign(&tmp, sign);

			FPU_round_to_int(&tmp, tag);	/* Fortunately, this can't
							   overflow to 2^64 */

			rem_kernel(significand(&st0),
				   &significand(&tmp),
				   significand(&st1),
				   significand(&tmp), exponent(&tmp)
			    );
			setexponent16(&tmp, exp_1 + expdif);

			/* It is possible for the operation to be complete here.
			   What does the IEEE standard say? The Intel 80486 manual
			   implies that the operation will never be completed at this
			   point, and the behaviour of a real 80486 confirms this.
			 */
			if (!(tmp.sigh | tmp.sigl)) {
				/* The result is zero */
				control_word = old_cw;
				partial_status = saved_status;
				FPU_copy_to_reg0(&CONST_Z, TAG_Zero);
				setsign(&st0, st0_sign);
#ifdef PECULIAR_486
				setcc(SW_C2);
#else
				setcc(0);
#endif /* PECULIAR_486 */
				return;
			}
			cc = SW_C2;
		}

		control_word = old_cw;
		partial_status = saved_status;
		tag = FPU_normalize_nuo(&tmp);
		reg_copy(&tmp, st0_ptr);

		/* The only condition to be looked for is underflow,
		   and it can occur here only if underflow is unmasked. */
		if ((exponent16(&tmp) <= EXP_UNDER) && (tag != TAG_Zero)
		    && !(control_word & CW_Underflow)) {
			setcc(cc);
			tag = arith_underflow(st0_ptr);
			setsign(st0_ptr, st0_sign);
			FPU_settag0(tag);
			return;
		} else if ((exponent16(&tmp) > EXP_UNDER) || (tag == TAG_Zero)) {
			stdexp(st0_ptr);
			setsign(st0_ptr, st0_sign);
		} else {
			tag =
			    FPU_round(st0_ptr, 0, 0, FULL_PRECISION, st0_sign);
		}
		FPU_settag0(tag);
		setcc(cc);

		return;
	}

	if (st0_tag == TAG_Special)
		st0_tag = FPU_Special(st0_ptr);
	if (st1_tag == TAG_Special)
		st1_tag = FPU_Special(st1_ptr);

	if (((st0_tag == TAG_Valid) && (st1_tag == TW_Denormal))
	    || ((st0_tag == TW_Denormal) && (st1_tag == TAG_Valid))
	    || ((st0_tag == TW_Denormal) && (st1_tag == TW_Denormal))) {
		if (denormal_operand() < 0)
			return;
		goto fprem_valid;
	} else if ((st0_tag == TAG_Empty) || (st1_tag == TAG_Empty)) {
		FPU_stack_underflow();
		return;
	} else if (st0_tag == TAG_Zero) {
		if (st1_tag == TAG_Valid) {
			setcc(0);
			return;
		} else if (st1_tag == TW_Denormal) {
			if (denormal_operand() < 0)
				return;
			setcc(0);
			return;
		} else if (st1_tag == TAG_Zero) {
			arith_invalid(0);
			return;
		} /* fprem(?,0) always invalid */
		else if (st1_tag == TW_Infinity) {
			setcc(0);
			return;
		}
	} else if ((st0_tag == TAG_Valid) || (st0_tag == TW_Denormal)) {
		if (st1_tag == TAG_Zero) {
			arith_invalid(0);	/* fprem(Valid,Zero) is invalid */
			return;
		} else if (st1_tag != TW_NaN) {
			if (((st0_tag == TW_Denormal)
			     || (st1_tag == TW_Denormal))
			    && (denormal_operand() < 0))
				return;

			if (st1_tag == TW_Infinity) {
				/* fprem(Valid,Infinity) is o.k. */
				setcc(0);
				return;
			}
		}
	} else if (st0_tag == TW_Infinity) {
		if (st1_tag != TW_NaN) {
			arith_invalid(0);	/* fprem(Infinity,?) is invalid */
			return;
		}
	}

	/* One of the registers must contain a NaN if we got here. */

#ifdef PARANOID
	if ((st0_tag != TW_NaN) && (st1_tag != TW_NaN))
		EXCEPTION(EX_INTERNAL | 0x118);
#endif /* PARANOID */

	real_2op_NaN(st1_ptr, st1_tag, 0, st1_ptr);

}

/* ST(1) <- ST(1) * log ST;  pop ST */
static void fyl2x(FPU_REG *st0_ptr, u_char st0_tag)
{
	FPU_REG *st1_ptr = &st(1), exponent;
	u_char st1_tag = FPU_gettagi(1);
	u_char sign;
	int e, tag;

	clear_C1();

	if ((st0_tag == TAG_Valid) && (st1_tag == TAG_Valid)) {
	      both_valid:
		/* Both regs are Valid or Denormal */
		if (signpositive(st0_ptr)) {
			if (st0_tag == TW_Denormal)
				FPU_to_exp16(st0_ptr, st0_ptr);
			else
				/* Convert st(0) for internal use. */
				setexponent16(st0_ptr, exponent(st0_ptr));

			if ((st0_ptr->sigh == 0x80000000)
			    && (st0_ptr->sigl == 0)) {
				/* Special case. The result can be precise. */
				u_char esign;
				e = exponent16(st0_ptr);
				if (e >= 0) {
					exponent.sigh = e;
					esign = SIGN_POS;
				} else {
					exponent.sigh = -e;
					esign = SIGN_NEG;
				}
				exponent.sigl = 0;
				setexponent16(&exponent, 31);
				tag = FPU_normalize_nuo(&exponent);
				stdexp(&exponent);
				setsign(&exponent, esign);
				tag =
				    FPU_mul(&exponent, tag, 1, FULL_PRECISION);
				if (tag >= 0)
					FPU_settagi(1, tag);
			} else {
				/* The usual case */
				sign = getsign(st1_ptr);
				if (st1_tag == TW_Denormal)
					FPU_to_exp16(st1_ptr, st1_ptr);
				else
					/* Convert st(1) for internal use. */
					setexponent16(st1_ptr,
						      exponent(st1_ptr));
				poly_l2(st0_ptr, st1_ptr, sign);
			}
		} else {
			/* negative */
			if (arith_invalid(1) < 0)
				return;
		}

		FPU_pop();

		return;
	}

	if (st0_tag == TAG_Special)
		st0_tag = FPU_Special(st0_ptr);
	if (st1_tag == TAG_Special)
		st1_tag = FPU_Special(st1_ptr);

	if ((st0_tag == TAG_Empty) || (st1_tag == TAG_Empty)) {
		FPU_stack_underflow_pop(1);
		return;
	} else if ((st0_tag <= TW_Denormal) && (st1_tag <= TW_Denormal)) {
		if (st0_tag == TAG_Zero) {
			if (st1_tag == TAG_Zero) {
				/* Both args zero is invalid */
				if (arith_invalid(1) < 0)
					return;
			} else {
				u_char sign;
				sign = getsign(st1_ptr) ^ SIGN_NEG;
				if (FPU_divide_by_zero(1, sign) < 0)
					return;

				setsign(st1_ptr, sign);
			}
		} else if (st1_tag == TAG_Zero) {
			/* st(1) contains zero, st(0) valid <> 0 */
			/* Zero is the valid answer */
			sign = getsign(st1_ptr);

			if (signnegative(st0_ptr)) {
				/* log(negative) */
				if (arith_invalid(1) < 0)
					return;
			} else if ((st0_tag == TW_Denormal)
				   && (denormal_operand() < 0))
				return;
			else {
				if (exponent(st0_ptr) < 0)
					sign ^= SIGN_NEG;

				FPU_copy_to_reg1(&CONST_Z, TAG_Zero);
				setsign(st1_ptr, sign);
			}
		} else {
			/* One or both operands are denormals. */
			if (denormal_operand() < 0)
				return;
			goto both_valid;
		}
	} else if ((st0_tag == TW_NaN) || (st1_tag == TW_NaN)) {
		if (real_2op_NaN(st0_ptr, st0_tag, 1, st0_ptr) < 0)
			return;
	}
	/* One or both arg must be an infinity */
	else if (st0_tag == TW_Infinity) {
		if ((signnegative(st0_ptr)) || (st1_tag == TAG_Zero)) {
			/* log(-infinity) or 0*log(infinity) */
			if (arith_invalid(1) < 0)
				return;
		} else {
			u_char sign = getsign(st1_ptr);

			if ((st1_tag == TW_Denormal)
			    && (denormal_operand() < 0))
				return;

			FPU_copy_to_reg1(&CONST_INF, TAG_Special);
			setsign(st1_ptr, sign);
		}
	}
	/* st(1) must be infinity here */
	else if (((st0_tag == TAG_Valid) || (st0_tag == TW_Denormal))
		 && (signpositive(st0_ptr))) {
		if (exponent(st0_ptr) >= 0) {
			if ((exponent(st0_ptr) == 0) &&
			    (st0_ptr->sigh == 0x80000000) &&
			    (st0_ptr->sigl == 0)) {
				/* st(0) holds 1.0 */
				/* infinity*log(1) */
				if (arith_invalid(1) < 0)
					return;
			}
			/* else st(0) is positive and > 1.0 */
		} else {
			/* st(0) is positive and < 1.0 */

			if ((st0_tag == TW_Denormal)
			    && (denormal_operand() < 0))
				return;

			changesign(st1_ptr);
		}
	} else {
		/* st(0) must be zero or negative */
		if (st0_tag == TAG_Zero) {
			/* This should be invalid, but a real 80486 is happy with it. */

#ifndef PECULIAR_486
			sign = getsign(st1_ptr);
			if (FPU_divide_by_zero(1, sign) < 0)
				return;
#endif /* PECULIAR_486 */

			changesign(st1_ptr);
		} else if (arith_invalid(1) < 0)	/* log(negative) */
			return;
	}

	FPU_pop();
}

static void fpatan(FPU_REG *st0_ptr, u_char st0_tag)
{
	FPU_REG *st1_ptr = &st(1);
	u_char st1_tag = FPU_gettagi(1);
	int tag;

	clear_C1();
	if (!((st0_tag ^ TAG_Valid) | (st1_tag ^ TAG_Valid))) {
	      valid_atan:

		poly_atan(st0_ptr, st0_tag, st1_ptr, st1_tag);

		FPU_pop();

		return;
	}

	if (st0_tag == TAG_Special)
		st0_tag = FPU_Special(st0_ptr);
	if (st1_tag == TAG_Special)
		st1_tag = FPU_Special(st1_ptr);

	if (((st0_tag == TAG_Valid) && (st1_tag == TW_Denormal))
	    || ((st0_tag == TW_Denormal) && (st1_tag == TAG_Valid))
	    || ((st0_tag == TW_Denormal) && (st1_tag == TW_Denormal))) {
		if (denormal_operand() < 0)
			return;

		goto valid_atan;
	} else if ((st0_tag == TAG_Empty) || (st1_tag == TAG_Empty)) {
		FPU_stack_underflow_pop(1);
		return;
	} else if ((st0_tag == TW_NaN) || (st1_tag == TW_NaN)) {
		if (real_2op_NaN(st0_ptr, st0_tag, 1, st0_ptr) >= 0)
			FPU_pop();
		return;
	} else if ((st0_tag == TW_Infinity) || (st1_tag == TW_Infinity)) {
		u_char sign = getsign(st1_ptr);
		if (st0_tag == TW_Infinity) {
			if (st1_tag == TW_Infinity) {
				if (signpositive(st0_ptr)) {
					FPU_copy_to_reg1(&CONST_PI4, TAG_Valid);
				} else {
					setpositive(st1_ptr);
					tag =
					    FPU_u_add(&CONST_PI4, &CONST_PI2,
						      st1_ptr, FULL_PRECISION,
						      SIGN_POS,
						      exponent(&CONST_PI4),
						      exponent(&CONST_PI2));
					if (tag >= 0)
						FPU_settagi(1, tag);
				}
			} else {
				if ((st1_tag == TW_Denormal)
				    && (denormal_operand() < 0))
					return;

				if (signpositive(st0_ptr)) {
					FPU_copy_to_reg1(&CONST_Z, TAG_Zero);
					setsign(st1_ptr, sign);	/* An 80486 preserves the sign */
					FPU_pop();
					return;
				} else {
					FPU_copy_to_reg1(&CONST_PI, TAG_Valid);
				}
			}
		} else {
			/* st(1) is infinity, st(0) not infinity */
			if ((st0_tag == TW_Denormal)
			    && (denormal_operand() < 0))
				return;

			FPU_copy_to_reg1(&CONST_PI2, TAG_Valid);
		}
		setsign(st1_ptr, sign);
	} else if (st1_tag == TAG_Zero) {
		/* st(0) must be valid or zero */
		u_char sign = getsign(st1_ptr);

		if ((st0_tag == TW_Denormal) && (denormal_operand() < 0))
			return;

		if (signpositive(st0_ptr)) {
			/* An 80486 preserves the sign */
			FPU_pop();
			return;
		}

		FPU_copy_to_reg1(&CONST_PI, TAG_Valid);
		setsign(st1_ptr, sign);
	} else if (st0_tag == TAG_Zero) {
		/* st(1) must be TAG_Valid here */
		u_char sign = getsign(st1_ptr);

		if ((st1_tag == TW_Denormal) && (denormal_operand() < 0))
			return;

		FPU_copy_to_reg1(&CONST_PI2, TAG_Valid);
		setsign(st1_ptr, sign);
	}
#ifdef PARANOID
	else
		EXCEPTION(EX_INTERNAL | 0x125);
#endif /* PARANOID */

	FPU_pop();
	set_precision_flag_up();	/* We do not really know if up or down */
}

static void fprem(FPU_REG *st0_ptr, u_char st0_tag)
{
	do_fprem(st0_ptr, st0_tag, RC_CHOP);
}

static void fprem1(FPU_REG *st0_ptr, u_char st0_tag)
{
	do_fprem(st0_ptr, st0_tag, RC_RND);
}

static void fyl2xp1(FPU_REG *st0_ptr, u_char st0_tag)
{
	u_char sign, sign1;
	FPU_REG *st1_ptr = &st(1), a, b;
	u_char st1_tag = FPU_gettagi(1);

	clear_C1();
	if (!((st0_tag ^ TAG_Valid) | (st1_tag ^ TAG_Valid))) {
	      valid_yl2xp1:

		sign = getsign(st0_ptr);
		sign1 = getsign(st1_ptr);

		FPU_to_exp16(st0_ptr, &a);
		FPU_to_exp16(st1_ptr, &b);

		if (poly_l2p1(sign, sign1, &a, &b, st1_ptr))
			return;

		FPU_pop();
		return;
	}

	if (st0_tag == TAG_Special)
		st0_tag = FPU_Special(st0_ptr);
	if (st1_tag == TAG_Special)
		st1_tag = FPU_Special(st1_ptr);

	if (((st0_tag == TAG_Valid) && (st1_tag == TW_Denormal))
	    || ((st0_tag == TW_Denormal) && (st1_tag == TAG_Valid))
	    || ((st0_tag == TW_Denormal) && (st1_tag == TW_Denormal))) {
		if (denormal_operand() < 0)
			return;

		goto valid_yl2xp1;
	} else if ((st0_tag == TAG_Empty) | (st1_tag == TAG_Empty)) {
		FPU_stack_underflow_pop(1);
		return;
	} else if (st0_tag == TAG_Zero) {
		switch (st1_tag) {
		case TW_Denormal:
			if (denormal_operand() < 0)
				return;
			/* fall through */
		case TAG_Zero:
		case TAG_Valid:
			setsign(st0_ptr, getsign(st0_ptr) ^ getsign(st1_ptr));
			FPU_copy_to_reg1(st0_ptr, st0_tag);
			break;

		case TW_Infinity:
			/* Infinity*log(1) */
			if (arith_invalid(1) < 0)
				return;
			break;

		case TW_NaN:
			if (real_2op_NaN(st0_ptr, st0_tag, 1, st0_ptr) < 0)
				return;
			break;

		default:
#ifdef PARANOID
			EXCEPTION(EX_INTERNAL | 0x116);
			return;
#endif /* PARANOID */
			break;
		}
	} else if ((st0_tag == TAG_Valid) || (st0_tag == TW_Denormal)) {
		switch (st1_tag) {
		case TAG_Zero:
			if (signnegative(st0_ptr)) {
				if (exponent(st0_ptr) >= 0) {
					/* st(0) holds <= -1.0 */
#ifdef PECULIAR_486		/* Stupid 80486 doesn't worry about log(negative). */
					changesign(st1_ptr);
#else
					if (arith_invalid(1) < 0)
						return;
#endif /* PECULIAR_486 */
				} else if ((st0_tag == TW_Denormal)
					   && (denormal_operand() < 0))
					return;
				else
					changesign(st1_ptr);
			} else if ((st0_tag == TW_Denormal)
				   && (denormal_operand() < 0))
				return;
			break;

		case TW_Infinity:
			if (signnegative(st0_ptr)) {
				if ((exponent(st0_ptr) >= 0) &&
				    !((st0_ptr->sigh == 0x80000000) &&
				      (st0_ptr->sigl == 0))) {
					/* st(0) holds < -1.0 */
#ifdef PECULIAR_486		/* Stupid 80486 doesn't worry about log(negative). */
					changesign(st1_ptr);
#else
					if (arith_invalid(1) < 0)
						return;
#endif /* PECULIAR_486 */
				} else if ((st0_tag == TW_Denormal)
					   && (denormal_operand() < 0))
					return;
				else
					changesign(st1_ptr);
			} else if ((st0_tag == TW_Denormal)
				   && (denormal_operand() < 0))
				return;
			break;

		case TW_NaN:
			if (real_2op_NaN(st0_ptr, st0_tag, 1, st0_ptr) < 0)
				return;
		}

	} else if (st0_tag == TW_NaN) {
		if (real_2op_NaN(st0_ptr, st0_tag, 1, st0_ptr) < 0)
			return;
	} else if (st0_tag == TW_Infinity) {
		if (st1_tag == TW_NaN) {
			if (real_2op_NaN(st0_ptr, st0_tag, 1, st0_ptr) < 0)
				return;
		} else if (signnegative(st0_ptr)) {
#ifndef PECULIAR_486
			/* This should have higher priority than denormals, but... */
			if (arith_invalid(1) < 0)	/* log(-infinity) */
				return;
#endif /* PECULIAR_486 */
			if ((st1_tag == TW_Denormal)
			    && (denormal_operand() < 0))
				return;
#ifdef PECULIAR_486
			/* Denormal operands actually get higher priority */
			if (arith_invalid(1) < 0)	/* log(-infinity) */
				return;
#endif /* PECULIAR_486 */
		} else if (st1_tag == TAG_Zero) {
			/* log(infinity) */
			if (arith_invalid(1) < 0)
				return;
		}

		/* st(1) must be valid here. */

		else if ((st1_tag == TW_Denormal) && (denormal_operand() < 0))
			return;

		/* The Manual says that log(Infinity) is invalid, but a real
		   80486 sensibly says that it is o.k. */
		else {
			u_char sign = getsign(st1_ptr);
			FPU_copy_to_reg1(&CONST_INF, TAG_Special);
			setsign(st1_ptr, sign);
		}
	}
#ifdef PARANOID
	else {
		EXCEPTION(EX_INTERNAL | 0x117);
		return;
	}
#endif /* PARANOID */

	FPU_pop();
	return;

}

static void fscale(FPU_REG *st0_ptr, u_char st0_tag)
{
	FPU_REG *st1_ptr = &st(1);
	u_char st1_tag = FPU_gettagi(1);
	int old_cw = control_word;
	u_char sign = getsign(st0_ptr);

	clear_C1();
	if (!((st0_tag ^ TAG_Valid) | (st1_tag ^ TAG_Valid))) {
		long scale;
		FPU_REG tmp;

		/* Convert register for internal use. */
		setexponent16(st0_ptr, exponent(st0_ptr));

	      valid_scale:

		if (exponent(st1_ptr) > 30) {
			/* 2^31 is far too large, would require 2^(2^30) or 2^(-2^30) */

			if (signpositive(st1_ptr)) {
				EXCEPTION(EX_Overflow);
				FPU_copy_to_reg0(&CONST_INF, TAG_Special);
			} else {
				EXCEPTION(EX_Underflow);
				FPU_copy_to_reg0(&CONST_Z, TAG_Zero);
			}
			setsign(st0_ptr, sign);
			return;
		}

		control_word &= ~CW_RC;
		control_word |= RC_CHOP;
		reg_copy(st1_ptr, &tmp);
		FPU_round_to_int(&tmp, st1_tag);	/* This can never overflow here */
		control_word = old_cw;
		scale = signnegative(st1_ptr) ? -tmp.sigl : tmp.sigl;
		scale += exponent16(st0_ptr);

		setexponent16(st0_ptr, scale);

		/* Use FPU_round() to properly detect under/overflow etc */
		FPU_round(st0_ptr, 0, 0, control_word, sign);

		return;
	}

	if (st0_tag == TAG_Special)
		st0_tag = FPU_Special(st0_ptr);
	if (st1_tag == TAG_Special)
		st1_tag = FPU_Special(st1_ptr);

	if ((st0_tag == TAG_Valid) || (st0_tag == TW_Denormal)) {
		switch (st1_tag) {
		case TAG_Valid:
			/* st(0) must be a denormal */
			if ((st0_tag == TW_Denormal)
			    && (denormal_operand() < 0))
				return;

			FPU_to_exp16(st0_ptr, st0_ptr);	/* Will not be left on stack */
			goto valid_scale;

		case TAG_Zero:
			if (st0_tag == TW_Denormal)
				denormal_operand();
			return;

		case TW_Denormal:
			denormal_operand();
			return;

		case TW_Infinity:
			if ((st0_tag == TW_Denormal)
			    && (denormal_operand() < 0))
				return;

			if (signpositive(st1_ptr))
				FPU_copy_to_reg0(&CONST_INF, TAG_Special);
			else
				FPU_copy_to_reg0(&CONST_Z, TAG_Zero);
			setsign(st0_ptr, sign);
			return;

		case TW_NaN:
			real_2op_NaN(st1_ptr, st1_tag, 0, st0_ptr);
			return;
		}
	} else if (st0_tag == TAG_Zero) {
		switch (st1_tag) {
		case TAG_Valid:
		case TAG_Zero:
			return;

		case TW_Denormal:
			denormal_operand();
			return;

		case TW_Infinity:
			if (signpositive(st1_ptr))
				arith_invalid(0);	/* Zero scaled by +Infinity */
			return;

		case TW_NaN:
			real_2op_NaN(st1_ptr, st1_tag, 0, st0_ptr);
			return;
		}
	} else if (st0_tag == TW_Infinity) {
		switch (st1_tag) {
		case TAG_Valid:
		case TAG_Zero:
			return;

		case TW_Denormal:
			denormal_operand();
			return;

		case TW_Infinity:
			if (signnegative(st1_ptr))
				arith_invalid(0);	/* Infinity scaled by -Infinity */
			return;

		case TW_NaN:
			real_2op_NaN(st1_ptr, st1_tag, 0, st0_ptr);
			return;
		}
	} else if (st0_tag == TW_NaN) {
		if (st1_tag != TAG_Empty) {
			real_2op_NaN(st1_ptr, st1_tag, 0, st0_ptr);
			return;
		}
	}
#ifdef PARANOID
	if (!((st0_tag == TAG_Empty) || (st1_tag == TAG_Empty))) {
		EXCEPTION(EX_INTERNAL | 0x115);
		return;
	}
#endif

	/* At least one of st(0), st(1) must be empty */
	FPU_stack_underflow();

}

/*---------------------------------------------------------------------------*/

static FUNC_ST0 const trig_table_a[] = {
	f2xm1, fyl2x, fptan, fpatan,
	fxtract, fprem1, (FUNC_ST0) fdecstp, (FUNC_ST0) fincstp
};

void FPU_triga(void)
{
	(trig_table_a[FPU_rm]) (&st(0), FPU_gettag0());
}

static FUNC_ST0 const trig_table_b[] = {
	fprem, fyl2xp1, fsqrt_, fsincos, frndint_, fscale, (FUNC_ST0) fsin, fcos
};

void FPU_trigb(void)
{
	(trig_table_b[FPU_rm]) (&st(0), FPU_gettag0());
}
