This source file includes following definitions.
- load_store_instr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #include <asm/segment.h>
22
23 #include "fpu_system.h"
24 #include "exception.h"
25 #include "fpu_emu.h"
26 #include "status_w.h"
27
28
29 #define _NONE_ 0
30 #define _REG0_ 1
31 #define _PUSH_ 3
32 #define _null_ 4
33
34 #define pop_0() { pop_ptr->tag = TW_Empty; top++; }
35
36
37 static unsigned char type_table[32] = {
38 _PUSH_, _PUSH_, _PUSH_, _PUSH_,
39 _null_, _null_, _null_, _null_,
40 _REG0_, _REG0_, _REG0_, _REG0_,
41 _REG0_, _REG0_, _REG0_, _REG0_,
42 _NONE_, _null_, _NONE_, _PUSH_,
43 _NONE_, _PUSH_, _null_, _PUSH_,
44 _NONE_, _null_, _NONE_, _REG0_,
45 _NONE_, _REG0_, _NONE_, _REG0_
46 };
47
48 void load_store_instr(char type)
49 {
50 FPU_REG *pop_ptr;
51
52 pop_ptr = NULL;
53 switch ( type_table[(int) (unsigned) type] )
54 {
55 case _NONE_:
56 break;
57 case _REG0_:
58 pop_ptr = &st(0);
59
60
61 FPU_st0_ptr = pop_ptr;
62 FPU_st0_tag = FPU_st0_ptr->tag;
63 break;
64 case _PUSH_:
65 {
66 pop_ptr = &st(-1);
67 if ( pop_ptr->tag != TW_Empty )
68 { stack_overflow(); return; }
69 top--;
70 }
71 break;
72 case _null_:
73 Un_impl();
74 return;
75 #ifdef PARANOID
76 default:
77 EXCEPTION(EX_INTERNAL);
78 return;
79 #endif PARANOID
80 }
81
82 switch ( type )
83 {
84 case 000:
85 reg_load_single();
86 setcc(0);
87 reg_move(&FPU_loaded_data, pop_ptr);
88 break;
89 case 001:
90 reg_load_int32();
91 setcc(0);
92 reg_move(&FPU_loaded_data, pop_ptr);
93 break;
94 case 002:
95 reg_load_double();
96 setcc(0);
97 reg_move(&FPU_loaded_data, pop_ptr);
98 break;
99 case 003:
100 reg_load_int16();
101 setcc(0);
102 reg_move(&FPU_loaded_data, pop_ptr);
103 break;
104 case 010:
105 reg_store_single();
106 break;
107 case 011:
108 reg_store_int32();
109 break;
110 case 012:
111 reg_store_double();
112 break;
113 case 013:
114 reg_store_int16();
115 break;
116 case 014:
117 if ( reg_store_single() )
118 pop_0();
119
120 break;
121 case 015:
122 if ( reg_store_int32() )
123 pop_0();
124
125 break;
126 case 016:
127 if ( reg_store_double() )
128 pop_0();
129
130 break;
131 case 017:
132 if ( reg_store_int16() )
133 pop_0();
134
135 break;
136 case 020:
137 fldenv();
138 break;
139 case 022:
140 frstor();
141 break;
142 case 023:
143 reg_load_bcd();
144 setcc(0);
145 reg_move(&FPU_loaded_data, pop_ptr);
146 break;
147 case 024:
148 RE_ENTRANT_CHECK_OFF
149 control_word = get_fs_word((unsigned short *) FPU_data_address);
150 RE_ENTRANT_CHECK_ON
151 #ifdef NO_UNDERFLOW_TRAP
152 if ( !(control_word & EX_Underflow) )
153 {
154 control_word |= EX_Underflow;
155 }
156 #endif
157 FPU_data_address = (void *)data_operand_offset;
158 FPU_entry_eip = ip_offset;
159 break;
160 case 025:
161 reg_load_extended();
162 setcc(0);
163 reg_move(&FPU_loaded_data, pop_ptr);
164 break;
165 case 027:
166 reg_load_int64();
167 setcc(0);
168 reg_move(&FPU_loaded_data, pop_ptr);
169 break;
170 case 030:
171 fstenv();
172 FPU_data_address = (void *)data_operand_offset;
173 FPU_entry_eip = ip_offset;
174 break;
175 case 032:
176 fsave();
177 FPU_data_address = (void *)data_operand_offset;
178 FPU_entry_eip = ip_offset;
179 break;
180 case 033:
181 if ( reg_store_bcd() )
182 pop_0();
183
184 break;
185 case 034:
186 RE_ENTRANT_CHECK_OFF
187 verify_area(VERIFY_WRITE,FPU_data_address,2);
188 put_fs_word(control_word, (short *) FPU_data_address);
189 RE_ENTRANT_CHECK_ON
190 FPU_data_address = (void *)data_operand_offset;
191 FPU_entry_eip = ip_offset;
192 break;
193 case 035:
194 if ( reg_store_extended() )
195 pop_0();
196
197 break;
198 case 036:
199 status_word &= ~SW_Top;
200 status_word |= (top&7) << SW_Top_Shift;
201 RE_ENTRANT_CHECK_OFF
202 verify_area(VERIFY_WRITE,FPU_data_address,2);
203 put_fs_word(status_word,(short *) FPU_data_address);
204 RE_ENTRANT_CHECK_ON
205 FPU_data_address = (void *)data_operand_offset;
206 FPU_entry_eip = ip_offset;
207 break;
208 case 037:
209 if ( reg_store_int64() )
210 pop_0();
211
212 break;
213 }
214 }