diff options
Diffstat (limited to 'arch/i386/math-emu/reg_convert.c')
-rw-r--r-- | arch/i386/math-emu/reg_convert.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/arch/i386/math-emu/reg_convert.c b/arch/i386/math-emu/reg_convert.c new file mode 100644 index 000000000000..45a258752703 --- /dev/null +++ b/arch/i386/math-emu/reg_convert.c | |||
@@ -0,0 +1,53 @@ | |||
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 | |||