diff options
Diffstat (limited to 'arch/x86/math-emu/reg_convert.c')
-rw-r--r-- | arch/x86/math-emu/reg_convert.c | 59 |
1 files changed, 26 insertions, 33 deletions
diff --git a/arch/x86/math-emu/reg_convert.c b/arch/x86/math-emu/reg_convert.c index 45a258752703..afd31b31000d 100644 --- a/arch/x86/math-emu/reg_convert.c +++ b/arch/x86/math-emu/reg_convert.c | |||
@@ -13,41 +13,34 @@ | |||
13 | #include "exception.h" | 13 | #include "exception.h" |
14 | #include "fpu_emu.h" | 14 | #include "fpu_emu.h" |
15 | 15 | ||
16 | 16 | int FPU_to_exp16(FPU_REG const *a, FPU_REG * x) | |
17 | int FPU_to_exp16(FPU_REG const *a, FPU_REG *x) | ||
18 | { | 17 | { |
19 | int sign = getsign(a); | 18 | int sign = getsign(a); |
20 | 19 | ||
21 | *(long long *)&(x->sigl) = *(const long long *)&(a->sigl); | 20 | *(long long *)&(x->sigl) = *(const long long *)&(a->sigl); |
22 | 21 | ||
23 | /* Set up the exponent as a 16 bit quantity. */ | 22 | /* Set up the exponent as a 16 bit quantity. */ |
24 | setexponent16(x, exponent(a)); | 23 | setexponent16(x, exponent(a)); |
25 | 24 | ||
26 | if ( exponent16(x) == EXP_UNDER ) | 25 | if (exponent16(x) == EXP_UNDER) { |
27 | { | 26 | /* The number is a de-normal or pseudodenormal. */ |
28 | /* The number is a de-normal or pseudodenormal. */ | 27 | /* We only deal with the significand and exponent. */ |
29 | /* We only deal with the significand and exponent. */ | 28 | |
30 | 29 | if (x->sigh & 0x80000000) { | |
31 | if (x->sigh & 0x80000000) | 30 | /* Is a pseudodenormal. */ |
32 | { | 31 | /* This is non-80486 behaviour because the number |
33 | /* Is a pseudodenormal. */ | 32 | loses its 'denormal' identity. */ |
34 | /* This is non-80486 behaviour because the number | 33 | addexponent(x, 1); |
35 | loses its 'denormal' identity. */ | 34 | } else { |
36 | addexponent(x, 1); | 35 | /* Is a denormal. */ |
37 | } | 36 | addexponent(x, 1); |
38 | else | 37 | FPU_normalize_nuo(x); |
39 | { | 38 | } |
40 | /* Is a denormal. */ | ||
41 | addexponent(x, 1); | ||
42 | FPU_normalize_nuo(x); | ||
43 | } | 39 | } |
44 | } | ||
45 | 40 | ||
46 | if ( !(x->sigh & 0x80000000) ) | 41 | if (!(x->sigh & 0x80000000)) { |
47 | { | 42 | EXCEPTION(EX_INTERNAL | 0x180); |
48 | EXCEPTION(EX_INTERNAL | 0x180); | 43 | } |
49 | } | ||
50 | 44 | ||
51 | return sign; | 45 | return sign; |
52 | } | 46 | } |
53 | |||