File: /usr/src/linux/arch/i386/math-emu/reg_convert.c

1     /*---------------------------------------------------------------------------+
2      |  reg_convert.c                                                            |
3      |                                                                           |
4      |  Convert register representation.                                         |
5      |                                                                           |
6      | Copyright (C) 1992,1993,1994,1996,1997                                    |
7      |                  W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia |
8      |                  E-mail   billm@suburbia.net                              |
9      |                                                                           |
10      |                                                                           |
11      +---------------------------------------------------------------------------*/
12     
13     #include "exception.h"
14     #include "fpu_emu.h"
15     
16     
17     int FPU_to_exp16(FPU_REG const *a, FPU_REG *x)
18     {
19       int sign = getsign(a);
20     
21       *(long long *)&(x->sigl) = *(const long long *)&(a->sigl);
22     
23       /* Set up the exponent as a 16 bit quantity. */
24       setexponent16(x, exponent(a));
25     
26       if ( exponent16(x) == EXP_UNDER )
27         {
28           /* The number is a de-normal or pseudodenormal. */
29           /* We only deal with the significand and exponent. */
30     
31           if (x->sigh & 0x80000000)
32     	{
33     	  /* Is a pseudodenormal. */
34     	  /* This is non-80486 behaviour because the number
35     	     loses its 'denormal' identity. */
36     	  addexponent(x, 1);
37     	}
38           else
39     	{
40     	  /* Is a denormal. */
41     	  addexponent(x, 1);
42     	  FPU_normalize_nuo(x);
43     	}
44         }
45     
46       if ( !(x->sigh & 0x80000000) )
47         {
48           EXCEPTION(EX_INTERNAL | 0x180);
49         }
50     
51       return sign;
52     }
53     
54