/*---------------------------------------------------------------------------+
 |  reg_ld_str.c                                                             |
 |                                                                           |
 | All of the functions which transfer data between user memory and FPU_REGs.|
 |                                                                           |
 | Copyright (C) 1992,1993,1994,1996,1997                                    |
 |                  W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia |
 |                  E-mail   billm@suburbia.net                              |
 |                                                                           |
 |                                                                           |
 +---------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------+
 | Note:                                                                     |
 |    The file contains code which accesses user memory.                     |
 |    Emulator static data may change when user memory is accessed, due to   |
 |    other processes using the emulator while swapping is in progress.      |
 +---------------------------------------------------------------------------*/

#include "fpu_emu.h"

#include <asm/uaccess.h>

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


#define DOUBLE_Emax 1023         /* largest valid exponent */
#define DOUBLE_Ebias 1023
#define DOUBLE_Emin (-1022)      /* smallest valid exponent */

#define SINGLE_Emax 127          /* largest valid exponent */
#define SINGLE_Ebias 127
#define SINGLE_Emin (-126)       /* smallest valid exponent */


static u_char normalize_no_excep(FPU_REG *r, int exp, int sign)
{
  u_char tag;

  setexponent16(r, exp);

  tag = FPU_normalize_nuo(r);
  stdexp(r);
  if ( sign )
    setnegative(r);

  return tag;
}


int FPU_tagof(FPU_REG *ptr)
{
  int exp;

  exp = exponent16(ptr) & 0x7fff;
  if ( exp == 0 )
    {
      if ( !(ptr->sigh | ptr->sigl) )
	{
	  return TAG_Zero;
	}
      /* The number is a de-normal or pseudodenormal. */
      return TAG_Special;
    }

  if ( exp == 0x7fff )
    {
      /* Is an Infinity, a NaN, or an unsupported data type. */
      return TAG_Special;
    }

  if ( !(ptr->sigh & 0x80000000) )
    {
      /* Unsupported data type. */
      /* Valid numbers have the ms bit set to 1. */
      /* Unnormal. */
      return TAG_Special;
    }

  return TAG_Valid;
}


/* Get a long double from user memory */
int FPU_load_extended(long double __user *s, int stnr)
{
  FPU_REG *sti_ptr = &st(stnr);

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_READ, s, 10);
  __copy_from_user(sti_ptr, s, 10);
  RE_ENTRANT_CHECK_ON;

  return FPU_tagof(sti_ptr);
}


/* Get a double from user memory */
int FPU_load_double(double __user *dfloat, FPU_REG *loaded_data)
{
  int exp, tag, negative;
  unsigned m64, l64;

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_READ, dfloat, 8);
  FPU_get_user(m64, 1 + (unsigned long __user *) dfloat);
  FPU_get_user(l64, (unsigned long __user *) dfloat);
  RE_ENTRANT_CHECK_ON;

  negative = (m64 & 0x80000000) ? SIGN_Negative : SIGN_Positive;
  exp = ((m64 & 0x7ff00000) >> 20) - DOUBLE_Ebias + EXTENDED_Ebias;
  m64 &= 0xfffff;
  if ( exp > DOUBLE_Emax + EXTENDED_Ebias )
    {
      /* Infinity or NaN */
      if ((m64 == 0) && (l64 == 0))
	{
	  /* +- infinity */
	  loaded_data->sigh = 0x80000000;
	  loaded_data->sigl = 0x00000000;
	  exp = EXP_Infinity + EXTENDED_Ebias;
	  tag = TAG_Special;
	}
      else
	{
	  /* Must be a signaling or quiet NaN */
	  exp = EXP_NaN + EXTENDED_Ebias;
	  loaded_data->sigh = (m64 << 11) | 0x80000000;
	  loaded_data->sigh |= l64 >> 21;
	  loaded_data->sigl = l64 << 11;
	  tag = TAG_Special;    /* The calling function must look for NaNs */
	}
    }
  else if ( exp < DOUBLE_Emin + EXTENDED_Ebias )
    {
      /* Zero or de-normal */
      if ((m64 == 0) && (l64 == 0))
	{
	  /* Zero */
	  reg_copy(&CONST_Z, loaded_data);
	  exp = 0;
	  tag = TAG_Zero;
	}
      else
	{
	  /* De-normal */
	  loaded_data->sigh = m64 << 11;
	  loaded_data->sigh |= l64 >> 21;
	  loaded_data->sigl = l64 << 11;

	  return normalize_no_excep(loaded_data, DOUBLE_Emin, negative)
	    | (denormal_operand() < 0 ? FPU_Exception : 0);
	}
    }
  else
    {
      loaded_data->sigh = (m64 << 11) | 0x80000000;
      loaded_data->sigh |= l64 >> 21;
      loaded_data->sigl = l64 << 11;

      tag = TAG_Valid;
    }

  setexponent16(loaded_data, exp | negative);

  return tag;
}


/* Get a float from user memory */
int FPU_load_single(float __user *single, FPU_REG *loaded_data)
{
  unsigned m32;
  int exp, tag, negative;

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_READ, single, 4);
  FPU_get_user(m32, (unsigned long __user *) single);
  RE_ENTRANT_CHECK_ON;

  negative = (m32 & 0x80000000) ? SIGN_Negative : SIGN_Positive;

  if (!(m32 & 0x7fffffff))
    {
      /* Zero */
      reg_copy(&CONST_Z, loaded_data);
      addexponent(loaded_data, negative);
      return TAG_Zero;
    }
  exp = ((m32 & 0x7f800000) >> 23) - SINGLE_Ebias + EXTENDED_Ebias;
  m32 = (m32 & 0x7fffff) << 8;
  if ( exp < SINGLE_Emin + EXTENDED_Ebias )
    {
      /* De-normals */
      loaded_data->sigh = m32;
      loaded_data->sigl = 0;

      return normalize_no_excep(loaded_data, SINGLE_Emin, negative)
	| (denormal_operand() < 0 ? FPU_Exception : 0);
    }
  else if ( exp > SINGLE_Emax + EXTENDED_Ebias )
    {
    /* Infinity or NaN */
      if ( m32 == 0 )
	{
	  /* +- infinity */
	  loaded_data->sigh = 0x80000000;
	  loaded_data->sigl = 0x00000000;
	  exp = EXP_Infinity + EXTENDED_Ebias;
	  tag = TAG_Special;
	}
      else
	{
	  /* Must be a signaling or quiet NaN */
	  exp = EXP_NaN + EXTENDED_Ebias;
	  loaded_data->sigh = m32 | 0x80000000;
	  loaded_data->sigl = 0;
	  tag = TAG_Special;  /* The calling function must look for NaNs */
	}
    }
  else
    {
      loaded_data->sigh = m32 | 0x80000000;
      loaded_data->sigl = 0;
      tag = TAG_Valid;
    }

  setexponent16(loaded_data, exp | negative);  /* Set the sign. */

  return tag;
}


/* Get a long long from user memory */
int FPU_load_int64(long long __user *_s)
{
  long long s;
  int sign;
  FPU_REG *st0_ptr = &st(0);

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_READ, _s, 8);
  copy_from_user(&s,_s,8);
  RE_ENTRANT_CHECK_ON;

  if (s == 0)
    {
      reg_copy(&CONST_Z, st0_ptr);
      return TAG_Zero;
    }

  if (s > 0)
    sign = SIGN_Positive;
  else
  {
    s = -s;
    sign = SIGN_Negative;
  }

  significand(st0_ptr) = s;

  return normalize_no_excep(st0_ptr, 63, sign);
}


/* Get a long from user memory */
int FPU_load_int32(long __user *_s, FPU_REG *loaded_data)
{
  long s;
  int negative;

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_READ, _s, 4);
  FPU_get_user(s, _s);
  RE_ENTRANT_CHECK_ON;

  if (s == 0)
    { reg_copy(&CONST_Z, loaded_data); return TAG_Zero; }

  if (s > 0)
    negative = SIGN_Positive;
  else
    {
      s = -s;
      negative = SIGN_Negative;
    }

  loaded_data->sigh = s;
  loaded_data->sigl = 0;

  return normalize_no_excep(loaded_data, 31, negative);
}


/* Get a short from user memory */
int FPU_load_int16(short __user *_s, FPU_REG *loaded_data)
{
  int s, negative;

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_READ, _s, 2);
  /* Cast as short to get the sign extended. */
  FPU_get_user(s, _s);
  RE_ENTRANT_CHECK_ON;

  if (s == 0)
    { reg_copy(&CONST_Z, loaded_data); return TAG_Zero; }

  if (s > 0)
    negative = SIGN_Positive;
  else
    {
      s = -s;
      negative = SIGN_Negative;
    }

  loaded_data->sigh = s << 16;
  loaded_data->sigl = 0;

  return normalize_no_excep(loaded_data, 15, negative);
}


/* Get a packed bcd array from user memory */
int FPU_load_bcd(u_char __user *s)
{
  FPU_REG *st0_ptr = &st(0);
  int pos;
  u_char bcd;
  long long l=0;
  int sign;

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_READ, s, 10);
  RE_ENTRANT_CHECK_ON;
  for ( pos = 8; pos >= 0; pos--)
    {
      l *= 10;
      RE_ENTRANT_CHECK_OFF;
      FPU_get_user(bcd, s+pos);
      RE_ENTRANT_CHECK_ON;
      l += bcd >> 4;
      l *= 10;
      l += bcd & 0x0f;
    }
 
  RE_ENTRANT_CHECK_OFF;
  FPU_get_user(sign, s+9);
  sign = sign & 0x80 ? SIGN_Negative : SIGN_Positive;
  RE_ENTRANT_CHECK_ON;

  if ( l == 0 )
    {
      reg_copy(&CONST_Z, st0_ptr);
      addexponent(st0_ptr, sign);   /* Set the sign. */
      return TAG_Zero;
    }
  else
    {
      significand(st0_ptr) = l;
      return normalize_no_excep(st0_ptr, 63, sign);
    }
}

/*===========================================================================*/

/* Put a long double into user memory */
int FPU_store_extended(FPU_REG *st0_ptr, u_char st0_tag, long double __user *d)
{
  /*
    The only exception raised by an attempt to store to an
    extended format is the Invalid Stack exception, i.e.
    attempting to store from an empty register.
   */

  if ( st0_tag != TAG_Empty )
    {
      RE_ENTRANT_CHECK_OFF;
      FPU_verify_area(VERIFY_WRITE, d, 10);

      FPU_put_user(st0_ptr->sigl, (unsigned long __user *) d);
      FPU_put_user(st0_ptr->sigh, (unsigned long __user *) ((u_char __user *)d + 4));
      FPU_put_user(exponent16(st0_ptr), (unsigned short __user *) ((u_char __user *)d + 8));
      RE_ENTRANT_CHECK_ON;

      return 1;
    }

  /* Empty register (stack underflow) */
  EXCEPTION(EX_StackUnder);
  if ( control_word & CW_Invalid )
    {
      /* The masked response */
      /* Put out the QNaN indefinite */
      RE_ENTRANT_CHECK_OFF;
      FPU_verify_area(VERIFY_WRITE,d,10);
      FPU_put_user(0, (unsigned long __user *) d);
      FPU_put_user(0xc0000000, 1 + (unsigned long __user *) d);
      FPU_put_user(0xffff, 4 + (short __user *) d);
      RE_ENTRANT_CHECK_ON;
      return 1;
    }
  else
    return 0;

}


/* Put a double into user memory */
int FPU_store_double(FPU_REG *st0_ptr, u_char st0_tag, double __user *dfloat)
{
  unsigned long l[2];
  unsigned long increment = 0;	/* avoid gcc warnings */
  int precision_loss;
  int exp;
  FPU_REG tmp;

  if ( st0_tag == TAG_Valid )
    {
      reg_copy(st0_ptr, &tmp);
      exp = exponent(&tmp);

      if ( exp < DOUBLE_Emin )     /* It may be a denormal */
	{
	  addexponent(&tmp, -DOUBLE_Emin + 52);  /* largest exp to be 51 */

	denormal_arg:

	  if ( (precision_loss = FPU_round_to_int(&tmp, st0_tag)) )
	    {
#ifdef PECULIAR_486
	      /* Did it round to a non-denormal ? */
	      /* This behaviour might be regarded as peculiar, it appears
		 that the 80486 rounds to the dest precision, then
		 converts to decide underflow. */
	      if ( !((tmp.sigh == 0x00100000) && (tmp.sigl == 0) &&
		  (st0_ptr->sigl & 0x000007ff)) )
#endif /* PECULIAR_486 */
		{
		  EXCEPTION(EX_Underflow);
		  /* This is a special case: see sec 16.2.5.1 of
		     the 80486 book */
		  if ( !(control_word & CW_Underflow) )
		    return 0;
		}
	      EXCEPTION(precision_loss);
	      if ( !(control_word & CW_Precision) )
		return 0;
	    }
	  l[0] = tmp.sigl;
	  l[1] = tmp.sigh;
	}
      else
	{
	  if ( tmp.sigl & 0x000007ff )
	    {
	      precision_loss = 1;
	      switch (control_word & CW_RC)
		{
		case RC_RND:
		  /* Rounding can get a little messy.. */
		  increment = ((tmp.sigl & 0x7ff) > 0x400) |  /* nearest */
		    ((tmp.sigl & 0xc00) == 0xc00);            /* odd -> even */
		  break;
		case RC_DOWN:   /* towards -infinity */
		  increment = signpositive(&tmp) ? 0 : tmp.sigl & 0x7ff;
		  break;
		case RC_UP:     /* towards +infinity */
		  increment = signpositive(&tmp) ? tmp.sigl & 0x7ff : 0;
		  break;
		case RC_CHOP:
		  increment = 0;
		  break;
		}
	  
	      /* Truncate the mantissa */
	      tmp.sigl &= 0xfffff800;
	  
	      if ( increment )
		{
		  if ( tmp.sigl >= 0xfffff800 )
		    {
		      /* the sigl part overflows */
		      if ( tmp.sigh == 0xffffffff )
			{
			  /* The sigh part overflows */
			  tmp.sigh = 0x80000000;
			  exp++;
			  if (exp >= EXP_OVER)
			    goto overflow;
			}
		      else
			{
			  tmp.sigh ++;
			}
		      tmp.sigl = 0x00000000;
		    }
		  else
		    {
		      /* We only need to increment sigl */
		      tmp.sigl += 0x00000800;
		    }
		}
	    }
	  else
	    precision_loss = 0;
	  
	  l[0] = (tmp.sigl >> 11) | (tmp.sigh << 21);
	  l[1] = ((tmp.sigh >> 11) & 0xfffff);

	  if ( exp > DOUBLE_Emax )
	    {
	    overflow:
	      EXCEPTION(EX_Overflow);
	      if ( !(control_word & CW_Overflow) )
		return 0;
	      set_precision_flag_up();
	      if ( !(control_word & CW_Precision) )
		return 0;

	      /* This is a special case: see sec 16.2.5.1 of the 80486 book */
	      /* Overflow to infinity */
	      l[0] = 0x00000000;	/* Set to */
	      l[1] = 0x7ff00000;	/* + INF */
	    }
	  else
	    {
	      if ( precision_loss )
		{
		  if ( increment )
		    set_precision_flag_up();
		  else
		    set_precision_flag_down();
		}
	      /* Add the exponent */
	      l[1] |= (((exp+DOUBLE_Ebias) & 0x7ff) << 20);
	    }
	}
    }
  else if (st0_tag == TAG_Zero)
    {
      /* Number is zero */
      l[0] = 0;
      l[1] = 0;
    }
  else if ( st0_tag == TAG_Special )
    {
      st0_tag = FPU_Special(st0_ptr);
      if ( st0_tag == TW_Denormal )
	{
	  /* A denormal will always underflow. */
#ifndef PECULIAR_486
	  /* An 80486 is supposed to be able to generate
	     a denormal exception here, but... */
	  /* Underflow has priority. */
	  if ( control_word & CW_Underflow )
	    denormal_operand();
#endif /* PECULIAR_486 */
	  reg_copy(st0_ptr, &tmp);
	  goto denormal_arg;
	}
      else if (st0_tag == TW_Infinity)
	{
	  l[0] = 0;
	  l[1] = 0x7ff00000;
	}
      else if (st0_tag == TW_NaN)
	{
	  /* Is it really a NaN ? */
	  if ( (exponent(st0_ptr) == EXP_OVER)
	       && (st0_ptr->sigh & 0x80000000) )
	    {
	      /* See if we can get a valid NaN from the FPU_REG */
	      l[0] = (st0_ptr->sigl >> 11) | (st0_ptr->sigh << 21);
	      l[1] = ((st0_ptr->sigh >> 11) & 0xfffff);
	      if ( !(st0_ptr->sigh & 0x40000000) )
		{
		  /* It is a signalling NaN */
		  EXCEPTION(EX_Invalid);
		  if ( !(control_word & CW_Invalid) )
		    return 0;
		  l[1] |= (0x40000000 >> 11);
		}
	      l[1] |= 0x7ff00000;
	    }
	  else
	    {
	      /* It is an unsupported data type */
	      EXCEPTION(EX_Invalid);
	      if ( !(control_word & CW_Invalid) )
		return 0;
	      l[0] = 0;
	      l[1] = 0xfff80000;
	    }
	}
    }
  else if ( st0_tag == TAG_Empty )
    {
      /* Empty register (stack underflow) */
      EXCEPTION(EX_StackUnder);
      if ( control_word & CW_Invalid )
	{
	  /* The masked response */
	  /* Put out the QNaN indefinite */
	  RE_ENTRANT_CHECK_OFF;
	  FPU_verify_area(VERIFY_WRITE,dfloat,8);
	  FPU_put_user(0, (unsigned long __user *) dfloat);
	  FPU_put_user(0xfff80000, 1 + (unsigned long __user *) dfloat);
	  RE_ENTRANT_CHECK_ON;
	  return 1;
	}
      else
	return 0;
    }
  if ( getsign(st0_ptr) )
    l[1] |= 0x80000000;

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_WRITE,dfloat,8);
  FPU_put_user(l[0], (unsigned long __user *)dfloat);
  FPU_put_user(l[1], 1 + (unsigned long __user *)dfloat);
  RE_ENTRANT_CHECK_ON;

  return 1;
}


/* Put a float into user memory */
int FPU_store_single(FPU_REG *st0_ptr, u_char st0_tag, float __user *single)
{
  long templ = 0;
  unsigned long increment = 0;     	/* avoid gcc warnings */
  int precision_loss;
  int exp;
  FPU_REG tmp;

  if ( st0_tag == TAG_Valid )
    {

      reg_copy(st0_ptr, &tmp);
      exp = exponent(&tmp);

      if ( exp < SINGLE_Emin )
	{
	  addexponent(&tmp, -SINGLE_Emin + 23);  /* largest exp to be 22 */

	denormal_arg:

	  if ( (precision_loss = FPU_round_to_int(&tmp, st0_tag)) )
	    {
#ifdef PECULIAR_486
	      /* Did it round to a non-denormal ? */
	      /* This behaviour might be regarded as peculiar, it appears
		 that the 80486 rounds to the dest precision, then
		 converts to decide underflow. */
	      if ( !((tmp.sigl == 0x00800000) &&
		  ((st0_ptr->sigh & 0x000000ff) || st0_ptr->sigl)) )
#endif /* PECULIAR_486 */
		{
		  EXCEPTION(EX_Underflow);
		  /* This is a special case: see sec 16.2.5.1 of
		     the 80486 book */
		  if ( !(control_word & CW_Underflow) )
		    return 0;
		}
	      EXCEPTION(precision_loss);
	      if ( !(control_word & CW_Precision) )
		return 0;
	    }
	  templ = tmp.sigl;
      }
      else
	{
	  if ( tmp.sigl | (tmp.sigh & 0x000000ff) )
	    {
	      unsigned long sigh = tmp.sigh;
	      unsigned long sigl = tmp.sigl;
	      
	      precision_loss = 1;
	      switch (control_word & CW_RC)
		{
		case RC_RND:
		  increment = ((sigh & 0xff) > 0x80)       /* more than half */
		    || (((sigh & 0xff) == 0x80) && sigl)   /* more than half */
		    || ((sigh & 0x180) == 0x180);        /* round to even */
		  break;
		case RC_DOWN:   /* towards -infinity */
		  increment = signpositive(&tmp)
		    ? 0 : (sigl | (sigh & 0xff));
		  break;
		case RC_UP:     /* towards +infinity */
		  increment = signpositive(&tmp)
		    ? (sigl | (sigh & 0xff)) : 0;
		  break;
		case RC_CHOP:
		  increment = 0;
		  break;
		}
	  
	      /* Truncate part of the mantissa */
	      tmp.sigl = 0;
	  
	      if (increment)
		{
		  if ( sigh >= 0xffffff00 )
		    {
		      /* The sigh part overflows */
		      tmp.sigh = 0x80000000;
		      exp++;
		      if ( exp >= EXP_OVER )
			goto overflow;
		    }
		  else
		    {
		      tmp.sigh &= 0xffffff00;
		      tmp.sigh += 0x100;
		    }
		}
	      else
		{
		  tmp.sigh &= 0xffffff00;  /* Finish the truncation */
		}
	    }
	  else
	    precision_loss = 0;
      
	  templ = (tmp.sigh >> 8) & 0x007fffff;

	  if ( exp > SINGLE_Emax )
	    {
	    overflow:
	      EXCEPTION(EX_Overflow);
	      if ( !(control_word & CW_Overflow) )
		return 0;
	      set_precision_flag_up();
	      if ( !(control_word & CW_Precision) )
		return 0;

	      /* This is a special case: see sec 16.2.5.1 of the 80486 book. */
	      /* Masked response is overflow to infinity. */
	      templ = 0x7f800000;
	    }
	  else
	    {
	      if ( precision_loss )
		{
		  if ( increment )
		    set_precision_flag_up();
		  else
		    set_precision_flag_down();
		}
	      /* Add the exponent */
	      templ |= ((exp+SINGLE_Ebias) & 0xff) << 23;
	    }
	}
    }
  else if (st0_tag == TAG_Zero)
    {
      templ = 0;
    }
  else if ( st0_tag == TAG_Special )
    {
      st0_tag = FPU_Special(st0_ptr);
      if (st0_tag == TW_Denormal)
	{
	  reg_copy(st0_ptr, &tmp);

	  /* A denormal will always underflow. */
#ifndef PECULIAR_486
	  /* An 80486 is supposed to be able to generate
	     a denormal exception here, but... */
	  /* Underflow has priority. */
	  if ( control_word & CW_Underflow )
	    denormal_operand();
#endif /* PECULIAR_486 */ 
	  goto denormal_arg;
	}
      else if (st0_tag == TW_Infinity)
	{
	  templ = 0x7f800000;
	}
      else if (st0_tag == TW_NaN)
	{
	  /* Is it really a NaN ? */
	  if ( (exponent(st0_ptr) == EXP_OVER) && (st0_ptr->sigh & 0x80000000) )
	    {
	      /* See if we can get a valid NaN from the FPU_REG */
	      templ = st0_ptr->sigh >> 8;
	      if ( !(st0_ptr->sigh & 0x40000000) )
		{
		  /* It is a signalling NaN */
		  EXCEPTION(EX_Invalid);
		  if ( !(control_word & CW_Invalid) )
		    return 0;
		  templ |= (0x40000000 >> 8);
		}
	      templ |= 0x7f800000;
	    }
	  else
	    {
	      /* It is an unsupported data type */
	      EXCEPTION(EX_Invalid);
	      if ( !(control_word & CW_Invalid) )
		return 0;
	      templ = 0xffc00000;
	    }
	}
#ifdef PARANOID
      else
	{
	  EXCEPTION(EX_INTERNAL|0x164);
	  return 0;
	}
#endif
    }
  else if ( st0_tag == TAG_Empty )
    {
      /* Empty register (stack underflow) */
      EXCEPTION(EX_StackUnder);
      if ( control_word & EX_Invalid )
	{
	  /* The masked response */
	  /* Put out the QNaN indefinite */
	  RE_ENTRANT_CHECK_OFF;
	  FPU_verify_area(VERIFY_WRITE,single,4);
	  FPU_put_user(0xffc00000, (unsigned long __user *) single);
	  RE_ENTRANT_CHECK_ON;
	  return 1;
	}
      else
	return 0;
    }
#ifdef PARANOID
  else
    {
      EXCEPTION(EX_INTERNAL|0x163);
      return 0;
    }
#endif
  if ( getsign(st0_ptr) )
    templ |= 0x80000000;

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_WRITE,single,4);
  FPU_put_user(templ,(unsigned long __user *) single);
  RE_ENTRANT_CHECK_ON;

  return 1;
}


/* Put a long long into user memory */
int FPU_store_int64(FPU_REG *st0_ptr, u_char st0_tag, long long __user *d)
{
  FPU_REG t;
  long long tll;
  int precision_loss;

  if ( st0_tag == TAG_Empty )
    {
      /* Empty register (stack underflow) */
      EXCEPTION(EX_StackUnder);
      goto invalid_operand;
    }
  else if ( st0_tag == TAG_Special )
    {
      st0_tag = FPU_Special(st0_ptr);
      if ( (st0_tag == TW_Infinity) ||
	   (st0_tag == TW_NaN) )
	{
	  EXCEPTION(EX_Invalid);
	  goto invalid_operand;
	}
    }

  reg_copy(st0_ptr, &t);
  precision_loss = FPU_round_to_int(&t, st0_tag);
  ((long *)&tll)[0] = t.sigl;
  ((long *)&tll)[1] = t.sigh;
  if ( (precision_loss == 1) ||
      ((t.sigh & 0x80000000) &&
       !((t.sigh == 0x80000000) && (t.sigl == 0) &&
	 signnegative(&t))) )
    {
      EXCEPTION(EX_Invalid);
      /* This is a special case: see sec 16.2.5.1 of the 80486 book */
    invalid_operand:
      if ( control_word & EX_Invalid )
	{
	  /* Produce something like QNaN "indefinite" */
	  tll = 0x8000000000000000LL;
	}
      else
	return 0;
    }
  else
    {
      if ( precision_loss )
	set_precision_flag(precision_loss);
      if ( signnegative(&t) )
	tll = - tll;
    }

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_WRITE,d,8);
  copy_to_user(d, &tll, 8);
  RE_ENTRANT_CHECK_ON;

  return 1;
}


/* Put a long into user memory */
int FPU_store_int32(FPU_REG *st0_ptr, u_char st0_tag, long __user *d)
{
  FPU_REG t;
  int precision_loss;

  if ( st0_tag == TAG_Empty )
    {
      /* Empty register (stack underflow) */
      EXCEPTION(EX_StackUnder);
      goto invalid_operand;
    }
  else if ( st0_tag == TAG_Special )
    {
      st0_tag = FPU_Special(st0_ptr);
      if ( (st0_tag == TW_Infinity) ||
	   (st0_tag == TW_NaN) )
	{
	  EXCEPTION(EX_Invalid);
	  goto invalid_operand;
	}
    }

  reg_copy(st0_ptr, &t);
  precision_loss = FPU_round_to_int(&t, st0_tag);
  if (t.sigh ||
      ((t.sigl & 0x80000000) &&
       !((t.sigl == 0x80000000) && signnegative(&t))) )
    {
      EXCEPTION(EX_Invalid);
      /* This is a special case: see sec 16.2.5.1 of the 80486 book */
    invalid_operand:
      if ( control_word & EX_Invalid )
	{
	  /* Produce something like QNaN "indefinite" */
	  t.sigl = 0x80000000;
	}
      else
	return 0;
    }
  else
    {
      if ( precision_loss )
	set_precision_flag(precision_loss);
      if ( signnegative(&t) )
	t.sigl = -(long)t.sigl;
    }

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_WRITE,d,4);
  FPU_put_user(t.sigl, (unsigned long __user *) d);
  RE_ENTRANT_CHECK_ON;

  return 1;
}


/* Put a short into user memory */
int FPU_store_int16(FPU_REG *st0_ptr, u_char st0_tag, short __user *d)
{
  FPU_REG t;
  int precision_loss;

  if ( st0_tag == TAG_Empty )
    {
      /* Empty register (stack underflow) */
      EXCEPTION(EX_StackUnder);
      goto invalid_operand;
    }
  else if ( st0_tag == TAG_Special )
    {
      st0_tag = FPU_Special(st0_ptr);
      if ( (st0_tag == TW_Infinity) ||
	   (st0_tag == TW_NaN) )
	{
	  EXCEPTION(EX_Invalid);
	  goto invalid_operand;
	}
    }

  reg_copy(st0_ptr, &t);
  precision_loss = FPU_round_to_int(&t, st0_tag);
  if (t.sigh ||
      ((t.sigl & 0xffff8000) &&
       !((t.sigl == 0x8000) && signnegative(&t))) )
    {
      EXCEPTION(EX_Invalid);
      /* This is a special case: see sec 16.2.5.1 of the 80486 book */
    invalid_operand:
      if ( control_word & EX_Invalid )
	{
	  /* Produce something like QNaN "indefinite" */
	  t.sigl = 0x8000;
	}
      else
	return 0;
    }
  else
    {
      if ( precision_loss )
	set_precision_flag(precision_loss);
      if ( signnegative(&t) )
	t.sigl = -t.sigl;
    }

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_WRITE,d,2);
  FPU_put_user((short)t.sigl, d);
  RE_ENTRANT_CHECK_ON;

  return 1;
}


/* Put a packed bcd array into user memory */
int FPU_store_bcd(FPU_REG *st0_ptr, u_char st0_tag, u_char __user *d)
{
  FPU_REG t;
  unsigned long long ll;
  u_char b;
  int i, precision_loss;
  u_char sign = (getsign(st0_ptr) == SIGN_NEG) ? 0x80 : 0;

  if ( st0_tag == TAG_Empty )
    {
      /* Empty register (stack underflow) */
      EXCEPTION(EX_StackUnder);
      goto invalid_operand;
    }
  else if ( st0_tag == TAG_Special )
    {
      st0_tag = FPU_Special(st0_ptr);
      if ( (st0_tag == TW_Infinity) ||
	   (st0_tag == TW_NaN) )
	{
	  EXCEPTION(EX_Invalid);
	  goto invalid_operand;
	}
    }

  reg_copy(st0_ptr, &t);
  precision_loss = FPU_round_to_int(&t, st0_tag);
  ll = significand(&t);

  /* Check for overflow, by comparing with 999999999999999999 decimal. */
  if ( (t.sigh > 0x0de0b6b3) ||
      ((t.sigh == 0x0de0b6b3) && (t.sigl > 0xa763ffff)) )
    {
      EXCEPTION(EX_Invalid);
      /* This is a special case: see sec 16.2.5.1 of the 80486 book */
    invalid_operand:
      if ( control_word & CW_Invalid )
	{
	  /* Produce the QNaN "indefinite" */
	  RE_ENTRANT_CHECK_OFF;
	  FPU_verify_area(VERIFY_WRITE,d,10);
	  for ( i = 0; i < 7; i++)
	    FPU_put_user(0, d+i); /* These bytes "undefined" */
	  FPU_put_user(0xc0, d+7); /* This byte "undefined" */
	  FPU_put_user(0xff, d+8);
	  FPU_put_user(0xff, d+9);
	  RE_ENTRANT_CHECK_ON;
	  return 1;
	}
      else
	return 0;
    }
  else if ( precision_loss )
    {
      /* Precision loss doesn't stop the data transfer */
      set_precision_flag(precision_loss);
    }

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_WRITE,d,10);
  RE_ENTRANT_CHECK_ON;
  for ( i = 0; i < 9; i++)
    {
      b = FPU_div_small(&ll, 10);
      b |= (FPU_div_small(&ll, 10)) << 4;
      RE_ENTRANT_CHECK_OFF;
      FPU_put_user(b, d+i);
      RE_ENTRANT_CHECK_ON;
    }
  RE_ENTRANT_CHECK_OFF;
  FPU_put_user(sign, d+9);
  RE_ENTRANT_CHECK_ON;

  return 1;
}

/*===========================================================================*/

/* r gets mangled such that sig is int, sign: 
   it is NOT normalized */
/* The return value (in eax) is zero if the result is exact,
   if bits are changed due to rounding, truncation, etc, then
   a non-zero value is returned */
/* Overflow is signalled by a non-zero return value (in eax).
   In the case of overflow, the returned significand always has the
   largest possible value */
int FPU_round_to_int(FPU_REG *r, u_char tag)
{
  u_char     very_big;
  unsigned eax;

  if (tag == TAG_Zero)
    {
      /* Make sure that zero is returned */
      significand(r) = 0;
      return 0;        /* o.k. */
    }

  if (exponent(r) > 63)
    {
      r->sigl = r->sigh = ~0;      /* The largest representable number */
      return 1;        /* overflow */
    }

  eax = FPU_shrxs(&r->sigl, 63 - exponent(r));
  very_big = !(~(r->sigh) | ~(r->sigl));  /* test for 0xfff...fff */
#define	half_or_more	(eax & 0x80000000)
#define	frac_part	(eax)
#define more_than_half  ((eax & 0x80000001) == 0x80000001)
  switch (control_word & CW_RC)
    {
    case RC_RND:
      if ( more_than_half               	/* nearest */
	  || (half_or_more && (r->sigl & 1)) )	/* odd -> even */
	{
	  if ( very_big ) return 1;        /* overflow */
	  significand(r) ++;
	  return PRECISION_LOST_UP;
	}
      break;
    case RC_DOWN:
      if (frac_part && getsign(r))
	{
	  if ( very_big ) return 1;        /* overflow */
	  significand(r) ++;
	  return PRECISION_LOST_UP;
	}
      break;
    case RC_UP:
      if (frac_part && !getsign(r))
	{
	  if ( very_big ) return 1;        /* overflow */
	  significand(r) ++;
	  return PRECISION_LOST_UP;
	}
      break;
    case RC_CHOP:
      break;
    }

  return eax ? PRECISION_LOST_DOWN : 0;

}

/*===========================================================================*/

u_char __user *fldenv(fpu_addr_modes addr_modes, u_char __user *s)
{
  unsigned short tag_word = 0;
  u_char tag;
  int i;

  if ( (addr_modes.default_mode == VM86) ||
      ((addr_modes.default_mode == PM16)
      ^ (addr_modes.override.operand_size == OP_SIZE_PREFIX)) )
    {
      RE_ENTRANT_CHECK_OFF;
      FPU_verify_area(VERIFY_READ, s, 0x0e);
      FPU_get_user(control_word, (unsigned short __user *) s);
      FPU_get_user(partial_status, (unsigned short __user *) (s+2));
      FPU_get_user(tag_word, (unsigned short __user *) (s+4));
      FPU_get_user(instruction_address.offset, (unsigned short __user *) (s+6));
      FPU_get_user(instruction_address.selector, (unsigned short __user *) (s+8));
      FPU_get_user(operand_address.offset, (unsigned short __user *) (s+0x0a));
      FPU_get_user(operand_address.selector, (unsigned short __user *) (s+0x0c));
      RE_ENTRANT_CHECK_ON;
      s += 0x0e;
      if ( addr_modes.default_mode == VM86 )
	{
	  instruction_address.offset
	    += (instruction_address.selector & 0xf000) << 4;
	  operand_address.offset += (operand_address.selector & 0xf000) << 4;
	}
    }
  else
    {
      RE_ENTRANT_CHECK_OFF;
      FPU_verify_area(VERIFY_READ, s, 0x1c);
      FPU_get_user(control_word, (unsigned short __user *) s);
      FPU_get_user(partial_status, (unsigned short __user *) (s+4));
      FPU_get_user(tag_word, (unsigned short __user *) (s+8));
      FPU_get_user(instruction_address.offset, (unsigned long __user *) (s+0x0c));
      FPU_get_user(instruction_address.selector, (unsigned short __user *) (s+0x10));
      FPU_get_user(instruction_address.opcode, (unsigned short __user *) (s+0x12));
      FPU_get_user(operand_address.offset, (unsigned long __user *) (s+0x14));
      FPU_get_user(operand_address.selector, (unsigned long __user *) (s+0x18));
      RE_ENTRANT_CHECK_ON;
      s += 0x1c;
    }

#ifdef PECULIAR_486
  control_word &= ~0xe080;
#endif /* PECULIAR_486 */ 

  top = (partial_status >> SW_Top_Shift) & 7;

  if ( partial_status & ~control_word & CW_Exceptions )
    partial_status |= (SW_Summary | SW_Backward);
  else
    partial_status &= ~(SW_Summary | SW_Backward);

  for ( i = 0; i < 8; i++ )
    {
      tag = tag_word & 3;
      tag_word >>= 2;

      if ( tag == TAG_Empty )
	/* New tag is empty.  Accept it */
	FPU_settag(i, TAG_Empty);
      else if ( FPU_gettag(i) == TAG_Empty )
	{
	  /* Old tag is empty and new tag is not empty.  New tag is determined
	     by old reg contents */
	  if ( exponent(&fpu_register(i)) == - EXTENDED_Ebias )
	    {
	      if ( !(fpu_register(i).sigl | fpu_register(i).sigh) )
		FPU_settag(i, TAG_Zero);
	      else
		FPU_settag(i, TAG_Special);
	    }
	  else if ( exponent(&fpu_register(i)) == 0x7fff - EXTENDED_Ebias )
	    {
	      FPU_settag(i, TAG_Special);
	    }
	  else if ( fpu_register(i).sigh & 0x80000000 )
	    FPU_settag(i, TAG_Valid);
	  else
	    FPU_settag(i, TAG_Special);   /* An Un-normal */
  	}
      /* Else old tag is not empty and new tag is not empty.  Old tag
	 remains correct */
    }

  return s;
}


void frstor(fpu_addr_modes addr_modes, u_char __user *data_address)
{
  int i, regnr;
  u_char __user *s = fldenv(addr_modes, data_address);
  int offset = (top & 7) * 10, other = 80 - offset;

  /* Copy all registers in stack order. */
  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_READ,s,80);
  __copy_from_user(register_base+offset, s, other);
  if ( offset )
    __copy_from_user(register_base, s+other, offset);
  RE_ENTRANT_CHECK_ON;

  for ( i = 0; i < 8; i++ )
    {
      regnr = (i+top) & 7;
      if ( FPU_gettag(regnr) != TAG_Empty )
	/* The loaded data over-rides all other cases. */
	FPU_settag(regnr, FPU_tagof(&st(i)));
    }

}


u_char __user *fstenv(fpu_addr_modes addr_modes, u_char __user *d)
{
  if ( (addr_modes.default_mode == VM86) ||
      ((addr_modes.default_mode == PM16)
      ^ (addr_modes.override.operand_size == OP_SIZE_PREFIX)) )
    {
      RE_ENTRANT_CHECK_OFF;
      FPU_verify_area(VERIFY_WRITE,d,14);
#ifdef PECULIAR_486
      FPU_put_user(control_word & ~0xe080, (unsigned long __user *) d);
#else
      FPU_put_user(control_word, (unsigned short __user *) d);
#endif /* PECULIAR_486 */
      FPU_put_user(status_word(), (unsigned short __user *) (d+2));
      FPU_put_user(fpu_tag_word, (unsigned short __user *) (d+4));
      FPU_put_user(instruction_address.offset, (unsigned short __user *) (d+6));
      FPU_put_user(operand_address.offset, (unsigned short __user *) (d+0x0a));
      if ( addr_modes.default_mode == VM86 )
	{
	  FPU_put_user((instruction_address.offset & 0xf0000) >> 4,
		      (unsigned short __user *) (d+8));
	  FPU_put_user((operand_address.offset & 0xf0000) >> 4,
		      (unsigned short __user *) (d+0x0c));
	}
      else
	{
	  FPU_put_user(instruction_address.selector, (unsigned short __user *) (d+8));
	  FPU_put_user(operand_address.selector, (unsigned short __user *) (d+0x0c));
	}
      RE_ENTRANT_CHECK_ON;
      d += 0x0e;
    }
  else
    {
      RE_ENTRANT_CHECK_OFF;
      FPU_verify_area(VERIFY_WRITE, d, 7*4);
#ifdef PECULIAR_486
      control_word &= ~0xe080;
      /* An 80486 sets nearly all of the reserved bits to 1. */
      control_word |= 0xffff0040;
      partial_status = status_word() | 0xffff0000;
      fpu_tag_word |= 0xffff0000;
      I387.soft.fcs &= ~0xf8000000;
      I387.soft.fos |= 0xffff0000;
#endif /* PECULIAR_486 */
      __copy_to_user(d, &control_word, 7*4);
      RE_ENTRANT_CHECK_ON;
      d += 0x1c;
    }
  
  control_word |= CW_Exceptions;
  partial_status &= ~(SW_Summary | SW_Backward);

  return d;
}


void fsave(fpu_addr_modes addr_modes, u_char __user *data_address)
{
  u_char __user *d;
  int offset = (top & 7) * 10, other = 80 - offset;

  d = fstenv(addr_modes, data_address);

  RE_ENTRANT_CHECK_OFF;
  FPU_verify_area(VERIFY_WRITE,d,80);

  /* Copy all registers in stack order. */
  __copy_to_user(d, register_base+offset, other);
  if ( offset )
    __copy_to_user(d+other, register_base, offset);
  RE_ENTRANT_CHECK_ON;

  finit();
}

/*===========================================================================*/
