]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /*---------------------------------------------------------------------------+ |
2 | | fpu_tags.c | | |
3 | | | | |
4 | | Set FPU register tags. | | |
5 | | | | |
6 | | Copyright (C) 1997 | | |
7 | | W. Metzenthen, 22 Parker St, Ormond, Vic 3163, Australia | | |
8 | | E-mail billm@jacobi.maths.monash.edu.au | | |
9 | | | | |
10 | | | | |
11 | +---------------------------------------------------------------------------*/ | |
12 | ||
13 | #include "fpu_emu.h" | |
14 | #include "fpu_system.h" | |
15 | #include "exception.h" | |
16 | ||
1da177e4 LT |
17 | void FPU_pop(void) |
18 | { | |
3d0d14f9 IM |
19 | fpu_tag_word |= 3 << ((top & 7) * 2); |
20 | top++; | |
1da177e4 LT |
21 | } |
22 | ||
1da177e4 LT |
23 | int FPU_gettag0(void) |
24 | { | |
3d0d14f9 | 25 | return (fpu_tag_word >> ((top & 7) * 2)) & 3; |
1da177e4 LT |
26 | } |
27 | ||
1da177e4 LT |
28 | int FPU_gettagi(int stnr) |
29 | { | |
3d0d14f9 | 30 | return (fpu_tag_word >> (((top + stnr) & 7) * 2)) & 3; |
1da177e4 LT |
31 | } |
32 | ||
1da177e4 LT |
33 | int FPU_gettag(int regnr) |
34 | { | |
3d0d14f9 | 35 | return (fpu_tag_word >> ((regnr & 7) * 2)) & 3; |
1da177e4 LT |
36 | } |
37 | ||
1da177e4 LT |
38 | void FPU_settag0(int tag) |
39 | { | |
3d0d14f9 IM |
40 | int regnr = top; |
41 | regnr &= 7; | |
42 | fpu_tag_word &= ~(3 << (regnr * 2)); | |
43 | fpu_tag_word |= (tag & 3) << (regnr * 2); | |
1da177e4 LT |
44 | } |
45 | ||
1da177e4 LT |
46 | void FPU_settagi(int stnr, int tag) |
47 | { | |
3d0d14f9 IM |
48 | int regnr = stnr + top; |
49 | regnr &= 7; | |
50 | fpu_tag_word &= ~(3 << (regnr * 2)); | |
51 | fpu_tag_word |= (tag & 3) << (regnr * 2); | |
1da177e4 LT |
52 | } |
53 | ||
1da177e4 LT |
54 | void FPU_settag(int regnr, int tag) |
55 | { | |
3d0d14f9 IM |
56 | regnr &= 7; |
57 | fpu_tag_word &= ~(3 << (regnr * 2)); | |
58 | fpu_tag_word |= (tag & 3) << (regnr * 2); | |
1da177e4 LT |
59 | } |
60 | ||
1da177e4 LT |
61 | int FPU_Special(FPU_REG const *ptr) |
62 | { | |
3d0d14f9 IM |
63 | int exp = exponent(ptr); |
64 | ||
65 | if (exp == EXP_BIAS + EXP_UNDER) | |
66 | return TW_Denormal; | |
67 | else if (exp != EXP_BIAS + EXP_OVER) | |
68 | return TW_NaN; | |
69 | else if ((ptr->sigh == 0x80000000) && (ptr->sigl == 0)) | |
70 | return TW_Infinity; | |
71 | return TW_NaN; | |
1da177e4 LT |
72 | } |
73 | ||
1da177e4 LT |
74 | int isNaN(FPU_REG const *ptr) |
75 | { | |
3d0d14f9 IM |
76 | return ((exponent(ptr) == EXP_BIAS + EXP_OVER) |
77 | && !((ptr->sigh == 0x80000000) && (ptr->sigl == 0))); | |
1da177e4 LT |
78 | } |
79 | ||
1da177e4 LT |
80 | int FPU_empty_i(int stnr) |
81 | { | |
3d0d14f9 | 82 | int regnr = (top + stnr) & 7; |
1da177e4 | 83 | |
3d0d14f9 | 84 | return ((fpu_tag_word >> (regnr * 2)) & 3) == TAG_Empty; |
1da177e4 LT |
85 | } |
86 | ||
3d0d14f9 | 87 | int FPU_stackoverflow(FPU_REG ** st_new_ptr) |
1da177e4 | 88 | { |
3d0d14f9 | 89 | *st_new_ptr = &st(-1); |
1da177e4 | 90 | |
3d0d14f9 | 91 | return ((fpu_tag_word >> (((top - 1) & 7) * 2)) & 3) != TAG_Empty; |
1da177e4 LT |
92 | } |
93 | ||
1da177e4 LT |
94 | void FPU_copy_to_regi(FPU_REG const *r, u_char tag, int stnr) |
95 | { | |
3d0d14f9 IM |
96 | reg_copy(r, &st(stnr)); |
97 | FPU_settagi(stnr, tag); | |
1da177e4 LT |
98 | } |
99 | ||
100 | void FPU_copy_to_reg1(FPU_REG const *r, u_char tag) | |
101 | { | |
3d0d14f9 IM |
102 | reg_copy(r, &st(1)); |
103 | FPU_settagi(1, tag); | |
1da177e4 LT |
104 | } |
105 | ||
106 | void FPU_copy_to_reg0(FPU_REG const *r, u_char tag) | |
107 | { | |
3d0d14f9 IM |
108 | int regnr = top; |
109 | regnr &= 7; | |
1da177e4 | 110 | |
3d0d14f9 | 111 | reg_copy(r, &st(0)); |
1da177e4 | 112 | |
3d0d14f9 IM |
113 | fpu_tag_word &= ~(3 << (regnr * 2)); |
114 | fpu_tag_word |= (tag & 3) << (regnr * 2); | |
1da177e4 | 115 | } |