451ab91e |
1 | /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
2 | * Mupen64plus - gcop1_d.c * |
3 | * Mupen64Plus homepage: http://code.google.com/p/mupen64plus/ * |
4 | * Copyright (C) 2007 Richard Goedeken (Richard42) * |
5 | * Copyright (C) 2002 Hacktarux * |
6 | * * |
7 | * This program is free software; you can redistribute it and/or modify * |
8 | * it under the terms of the GNU General Public License as published by * |
9 | * the Free Software Foundation; either version 2 of the License, or * |
10 | * (at your option) any later version. * |
11 | * * |
12 | * This program is distributed in the hope that it will be useful, * |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * |
15 | * GNU General Public License for more details. * |
16 | * * |
17 | * You should have received a copy of the GNU General Public License * |
18 | * along with this program; if not, write to the * |
19 | * Free Software Foundation, Inc., * |
20 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * |
21 | * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ |
22 | |
23 | #include <stdio.h> |
24 | |
25 | #include "assemble.h" |
26 | #include "interpret.h" |
27 | |
28 | #include "r4300/recomph.h" |
29 | #include "r4300/r4300.h" |
30 | #include "r4300/ops.h" |
31 | |
32 | void genadd_d(void) |
33 | { |
34 | #if defined(COUNT_INSTR) |
35 | inc_m32rel(&instr_count[119]); |
36 | #endif |
37 | #ifdef INTERPRET_ADD_D |
38 | gencallinterp((unsigned long long)cached_interpreter_table.ADD_D, 0); |
39 | #else |
40 | gencheck_cop1_unusable(); |
41 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
42 | fld_preg64_qword(RAX); |
43 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.ft])); |
44 | fadd_preg64_qword(RAX); |
45 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fd])); |
46 | fstp_preg64_qword(RAX); |
47 | #endif |
48 | } |
49 | |
50 | void gensub_d(void) |
51 | { |
52 | #if defined(COUNT_INSTR) |
53 | inc_m32rel(&instr_count[120]); |
54 | #endif |
55 | #ifdef INTERPRET_SUB_D |
56 | gencallinterp((unsigned long long)cached_interpreter_table.SUB_D, 0); |
57 | #else |
58 | gencheck_cop1_unusable(); |
59 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
60 | fld_preg64_qword(RAX); |
61 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.ft])); |
62 | fsub_preg64_qword(RAX); |
63 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fd])); |
64 | fstp_preg64_qword(RAX); |
65 | #endif |
66 | } |
67 | |
68 | void genmul_d(void) |
69 | { |
70 | #if defined(COUNT_INSTR) |
71 | inc_m32rel(&instr_count[121]); |
72 | #endif |
73 | #ifdef INTERPRET_MUL_D |
74 | gencallinterp((unsigned long long)cached_interpreter_table.MUL_D, 0); |
75 | #else |
76 | gencheck_cop1_unusable(); |
77 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
78 | fld_preg64_qword(RAX); |
79 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.ft])); |
80 | fmul_preg64_qword(RAX); |
81 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fd])); |
82 | fstp_preg64_qword(RAX); |
83 | #endif |
84 | } |
85 | |
86 | void gendiv_d(void) |
87 | { |
88 | #if defined(COUNT_INSTR) |
89 | inc_m32rel(&instr_count[122]); |
90 | #endif |
91 | #ifdef INTERPRET_DIV_D |
92 | gencallinterp((unsigned long long)cached_interpreter_table.DIV_D, 0); |
93 | #else |
94 | gencheck_cop1_unusable(); |
95 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
96 | fld_preg64_qword(RAX); |
97 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.ft])); |
98 | fdiv_preg64_qword(RAX); |
99 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fd])); |
100 | fstp_preg64_qword(RAX); |
101 | #endif |
102 | } |
103 | |
104 | void gensqrt_d(void) |
105 | { |
106 | #if defined(COUNT_INSTR) |
107 | inc_m32rel(&instr_count[123]); |
108 | #endif |
109 | #ifdef INTERPRET_SQRT_D |
110 | gencallinterp((unsigned long long)cached_interpreter_table.SQRT_D, 0); |
111 | #else |
112 | gencheck_cop1_unusable(); |
113 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
114 | fld_preg64_qword(RAX); |
115 | fsqrt(); |
116 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fd])); |
117 | fstp_preg64_qword(RAX); |
118 | #endif |
119 | } |
120 | |
121 | void genabs_d(void) |
122 | { |
123 | #if defined(COUNT_INSTR) |
124 | inc_m32rel(&instr_count[124]); |
125 | #endif |
126 | #ifdef INTERPRET_ABS_D |
127 | gencallinterp((unsigned long long)cached_interpreter_table.ABS_D, 0); |
128 | #else |
129 | gencheck_cop1_unusable(); |
130 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
131 | fld_preg64_qword(RAX); |
132 | fabs_(); |
133 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fd])); |
134 | fstp_preg64_qword(RAX); |
135 | #endif |
136 | } |
137 | |
138 | void genmov_d(void) |
139 | { |
140 | #if defined(COUNT_INSTR) |
141 | inc_m32rel(&instr_count[125]); |
142 | #endif |
143 | #ifdef INTERPRET_MOV_D |
144 | gencallinterp((unsigned long long)cached_interpreter_table.MOV_D, 0); |
145 | #else |
146 | gencheck_cop1_unusable(); |
147 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
148 | mov_reg32_preg64(EBX, RAX); |
149 | mov_reg32_preg64pimm32(ECX, RAX, 4); |
150 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fd])); |
151 | mov_preg64_reg32(RAX, EBX); |
152 | mov_preg64pimm32_reg32(RAX, 4, ECX); |
153 | #endif |
154 | } |
155 | |
156 | void genneg_d(void) |
157 | { |
158 | #if defined(COUNT_INSTR) |
159 | inc_m32rel(&instr_count[126]); |
160 | #endif |
161 | #ifdef INTERPRET_NEG_D |
162 | gencallinterp((unsigned long long)cached_interpreter_table.NEG_D, 0); |
163 | #else |
164 | gencheck_cop1_unusable(); |
165 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
166 | fld_preg64_qword(RAX); |
167 | fchs(); |
168 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fd])); |
169 | fstp_preg64_qword(RAX); |
170 | #endif |
171 | } |
172 | |
173 | void genround_l_d(void) |
174 | { |
175 | #if defined(COUNT_INSTR) |
176 | inc_m32rel(&instr_count[127]); |
177 | #endif |
178 | #ifdef INTERPRET_ROUND_L_D |
179 | gencallinterp((unsigned long long)cached_interpreter_table.ROUND_L_D, 0); |
180 | #else |
181 | gencheck_cop1_unusable(); |
182 | fldcw_m16rel((unsigned short*)&round_mode); |
183 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
184 | fld_preg64_qword(RAX); |
185 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fd])); |
186 | fistp_preg64_qword(RAX); |
187 | fldcw_m16rel((unsigned short*)&rounding_mode); |
188 | #endif |
189 | } |
190 | |
191 | void gentrunc_l_d(void) |
192 | { |
193 | #if defined(COUNT_INSTR) |
194 | inc_m32rel(&instr_count[128]); |
195 | #endif |
196 | #ifdef INTERPRET_TRUNC_L_D |
197 | gencallinterp((unsigned long long)cached_interpreter_table.TRUNC_L_D, 0); |
198 | #else |
199 | gencheck_cop1_unusable(); |
200 | fldcw_m16rel((unsigned short*)&trunc_mode); |
201 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
202 | fld_preg64_qword(RAX); |
203 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fd])); |
204 | fistp_preg64_qword(RAX); |
205 | fldcw_m16rel((unsigned short*)&rounding_mode); |
206 | #endif |
207 | } |
208 | |
209 | void genceil_l_d(void) |
210 | { |
211 | #if defined(COUNT_INSTR) |
212 | inc_m32rel(&instr_count[129]); |
213 | #endif |
214 | #ifdef INTERPRET_CEIL_L_D |
215 | gencallinterp((unsigned long long)cached_interpreter_table.CEIL_L_D, 0); |
216 | #else |
217 | gencheck_cop1_unusable(); |
218 | fldcw_m16rel((unsigned short*)&ceil_mode); |
219 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
220 | fld_preg64_qword(RAX); |
221 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fd])); |
222 | fistp_preg64_qword(RAX); |
223 | fldcw_m16rel((unsigned short*)&rounding_mode); |
224 | #endif |
225 | } |
226 | |
227 | void genfloor_l_d(void) |
228 | { |
229 | #if defined(COUNT_INSTR) |
230 | inc_m32rel(&instr_count[130]); |
231 | #endif |
232 | #ifdef INTERPRET_FLOOR_L_D |
233 | gencallinterp((unsigned long long)cached_interpreter_table.FLOOR_L_D, 0); |
234 | #else |
235 | gencheck_cop1_unusable(); |
236 | fldcw_m16rel((unsigned short*)&floor_mode); |
237 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
238 | fld_preg64_qword(RAX); |
239 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fd])); |
240 | fistp_preg64_qword(RAX); |
241 | fldcw_m16rel((unsigned short*)&rounding_mode); |
242 | #endif |
243 | } |
244 | |
245 | void genround_w_d(void) |
246 | { |
247 | #if defined(COUNT_INSTR) |
248 | inc_m32rel(&instr_count[127]); |
249 | #endif |
250 | #ifdef INTERPRET_ROUND_W_D |
251 | gencallinterp((unsigned long long)cached_interpreter_table.ROUND_W_D, 0); |
252 | #else |
253 | gencheck_cop1_unusable(); |
254 | fldcw_m16rel((unsigned short*)&round_mode); |
255 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
256 | fld_preg64_qword(RAX); |
257 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_simple[dst->f.cf.fd])); |
258 | fistp_preg64_dword(RAX); |
259 | fldcw_m16rel((unsigned short*)&rounding_mode); |
260 | #endif |
261 | } |
262 | |
263 | void gentrunc_w_d(void) |
264 | { |
265 | #if defined(COUNT_INSTR) |
266 | inc_m32rel(&instr_count[128]); |
267 | #endif |
268 | #ifdef INTERPRET_TRUNC_W_D |
269 | gencallinterp((unsigned long long)cached_interpreter_table.TRUNC_W_D, 0); |
270 | #else |
271 | gencheck_cop1_unusable(); |
272 | fldcw_m16rel((unsigned short*)&trunc_mode); |
273 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
274 | fld_preg64_qword(RAX); |
275 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_simple[dst->f.cf.fd])); |
276 | fistp_preg64_dword(RAX); |
277 | fldcw_m16rel((unsigned short*)&rounding_mode); |
278 | #endif |
279 | } |
280 | |
281 | void genceil_w_d(void) |
282 | { |
283 | #if defined(COUNT_INSTR) |
284 | inc_m32rel(&instr_count[129]); |
285 | #endif |
286 | #ifdef INTERPRET_CEIL_W_D |
287 | gencallinterp((unsigned long long)cached_interpreter_table.CEIL_W_D, 0); |
288 | #else |
289 | gencheck_cop1_unusable(); |
290 | fldcw_m16rel((unsigned short*)&ceil_mode); |
291 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
292 | fld_preg64_qword(RAX); |
293 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_simple[dst->f.cf.fd])); |
294 | fistp_preg64_dword(RAX); |
295 | fldcw_m16rel((unsigned short*)&rounding_mode); |
296 | #endif |
297 | } |
298 | |
299 | void genfloor_w_d(void) |
300 | { |
301 | #if defined(COUNT_INSTR) |
302 | inc_m32rel(&instr_count[130]); |
303 | #endif |
304 | #ifdef INTERPRET_FLOOR_W_D |
305 | gencallinterp((unsigned long long)cached_interpreter_table.FLOOR_W_D, 0); |
306 | #else |
307 | gencheck_cop1_unusable(); |
308 | fldcw_m16rel((unsigned short*)&floor_mode); |
309 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
310 | fld_preg64_qword(RAX); |
311 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_simple[dst->f.cf.fd])); |
312 | fistp_preg64_dword(RAX); |
313 | fldcw_m16rel((unsigned short*)&rounding_mode); |
314 | #endif |
315 | } |
316 | |
317 | void gencvt_s_d(void) |
318 | { |
319 | #if defined(COUNT_INSTR) |
320 | inc_m32rel(&instr_count[117]); |
321 | #endif |
322 | #ifdef INTERPRET_CVT_S_D |
323 | gencallinterp((unsigned long long)cached_interpreter_table.CVT_S_D, 0); |
324 | #else |
325 | gencheck_cop1_unusable(); |
326 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
327 | fld_preg64_qword(RAX); |
328 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_simple[dst->f.cf.fd])); |
329 | fstp_preg64_dword(RAX); |
330 | #endif |
331 | } |
332 | |
333 | void gencvt_w_d(void) |
334 | { |
335 | #if defined(COUNT_INSTR) |
336 | inc_m32rel(&instr_count[117]); |
337 | #endif |
338 | #ifdef INTERPRET_CVT_W_D |
339 | gencallinterp((unsigned long long)cached_interpreter_table.CVT_W_D, 0); |
340 | #else |
341 | gencheck_cop1_unusable(); |
342 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
343 | fld_preg64_qword(RAX); |
344 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_simple[dst->f.cf.fd])); |
345 | fistp_preg64_dword(RAX); |
346 | #endif |
347 | } |
348 | |
349 | void gencvt_l_d(void) |
350 | { |
351 | #if defined(COUNT_INSTR) |
352 | inc_m32rel(&instr_count[117]); |
353 | #endif |
354 | #ifdef INTERPRET_CVT_L_D |
355 | gencallinterp((unsigned long long)cached_interpreter_table.CVT_L_D, 0); |
356 | #else |
357 | gencheck_cop1_unusable(); |
358 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
359 | fld_preg64_qword(RAX); |
360 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fd])); |
361 | fistp_preg64_qword(RAX); |
362 | #endif |
363 | } |
364 | |
365 | void genc_f_d(void) |
366 | { |
367 | #if defined(COUNT_INSTR) |
368 | inc_m32rel(&instr_count[118]); |
369 | #endif |
370 | #ifdef INTERPRET_C_F_D |
371 | gencallinterp((unsigned long long)cached_interpreter_table.C_F_D, 0); |
372 | #else |
373 | gencheck_cop1_unusable(); |
374 | and_m32rel_imm32((unsigned int*)&FCR31, ~0x800000); |
375 | #endif |
376 | } |
377 | |
378 | void genc_un_d(void) |
379 | { |
380 | #if defined(COUNT_INSTR) |
381 | inc_m32rel(&instr_count[118]); |
382 | #endif |
383 | #ifdef INTERPRET_C_UN_D |
384 | gencallinterp((unsigned long long)cached_interpreter_table.C_UN_D, 0); |
385 | #else |
386 | gencheck_cop1_unusable(); |
387 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.ft])); |
388 | fld_preg64_qword(RAX); |
389 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
390 | fld_preg64_qword(RAX); |
391 | fucomip_fpreg(1); |
392 | ffree_fpreg(0); |
393 | jp_rj(13); |
394 | and_m32rel_imm32((unsigned int*)&FCR31, ~0x800000); // 11 |
395 | jmp_imm_short(11); // 2 |
396 | or_m32rel_imm32((unsigned int*)&FCR31, 0x800000); // 11 |
397 | #endif |
398 | } |
399 | |
400 | void genc_eq_d(void) |
401 | { |
402 | #if defined(COUNT_INSTR) |
403 | inc_m32rel(&instr_count[118]); |
404 | #endif |
405 | #ifdef INTERPRET_C_EQ_D |
406 | gencallinterp((unsigned long long)cached_interpreter_table.C_EQ_D, 0); |
407 | #else |
408 | gencheck_cop1_unusable(); |
409 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.ft])); |
410 | fld_preg64_qword(RAX); |
411 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
412 | fld_preg64_qword(RAX); |
413 | fucomip_fpreg(1); |
414 | ffree_fpreg(0); |
415 | jne_rj(13); // 2 |
416 | or_m32rel_imm32((unsigned int*)&FCR31, 0x800000); // 11 |
417 | jmp_imm_short(11); // 2 |
418 | and_m32rel_imm32((unsigned int*)&FCR31, ~0x800000); // 11 |
419 | #endif |
420 | } |
421 | |
422 | void genc_ueq_d(void) |
423 | { |
424 | #if defined(COUNT_INSTR) |
425 | inc_m32rel(&instr_count[118]); |
426 | #endif |
427 | #ifdef INTERPRET_C_UEQ_D |
428 | gencallinterp((unsigned long long)cached_interpreter_table.C_UEQ_D, 0); |
429 | #else |
430 | gencheck_cop1_unusable(); |
431 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.ft])); |
432 | fld_preg64_qword(RAX); |
433 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
434 | fld_preg64_qword(RAX); |
435 | fucomip_fpreg(1); |
436 | ffree_fpreg(0); |
437 | jp_rj(15); |
438 | jne_rj(13); |
439 | or_m32rel_imm32((unsigned int*)&FCR31, 0x800000); // 11 |
440 | jmp_imm_short(11); // 2 |
441 | and_m32rel_imm32((unsigned int*)&FCR31, ~0x800000); // 11 |
442 | #endif |
443 | } |
444 | |
445 | void genc_olt_d(void) |
446 | { |
447 | #if defined(COUNT_INSTR) |
448 | inc_m32rel(&instr_count[118]); |
449 | #endif |
450 | #ifdef INTERPRET_C_OLT_D |
451 | gencallinterp((unsigned long long)cached_interpreter_table.C_OLT_D, 0); |
452 | #else |
453 | gencheck_cop1_unusable(); |
454 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.ft])); |
455 | fld_preg64_qword(RAX); |
456 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
457 | fld_preg64_qword(RAX); |
458 | fucomip_fpreg(1); |
459 | ffree_fpreg(0); |
460 | jae_rj(13); // 2 |
461 | or_m32rel_imm32((unsigned int*)&FCR31, 0x800000); // 11 |
462 | jmp_imm_short(11); // 2 |
463 | and_m32rel_imm32((unsigned int*)&FCR31, ~0x800000); // 11 |
464 | #endif |
465 | } |
466 | |
467 | void genc_ult_d(void) |
468 | { |
469 | #if defined(COUNT_INSTR) |
470 | inc_m32rel(&instr_count[118]); |
471 | #endif |
472 | #ifdef INTERPRET_C_ULT_D |
473 | gencallinterp((unsigned long long)cached_interpreter_table.C_ULT_D, 0); |
474 | #else |
475 | gencheck_cop1_unusable(); |
476 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.ft])); |
477 | fld_preg64_qword(RAX); |
478 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
479 | fld_preg64_qword(RAX); |
480 | fucomip_fpreg(1); |
481 | ffree_fpreg(0); |
482 | jp_rj(15); |
483 | jae_rj(13); // 2 |
484 | or_m32rel_imm32((unsigned int*)&FCR31, 0x800000); // 11 |
485 | jmp_imm_short(11); // 2 |
486 | and_m32rel_imm32((unsigned int*)&FCR31, ~0x800000); // 11 |
487 | #endif |
488 | } |
489 | |
490 | void genc_ole_d(void) |
491 | { |
492 | #if defined(COUNT_INSTR) |
493 | inc_m32rel(&instr_count[118]); |
494 | #endif |
495 | #ifdef INTERPRET_C_OLE_D |
496 | gencallinterp((unsigned long long)cached_interpreter_table.C_OLE_D, 0); |
497 | #else |
498 | gencheck_cop1_unusable(); |
499 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.ft])); |
500 | fld_preg64_qword(RAX); |
501 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
502 | fld_preg64_qword(RAX); |
503 | fucomip_fpreg(1); |
504 | ffree_fpreg(0); |
505 | ja_rj(13); // 2 |
506 | or_m32rel_imm32((unsigned int*)&FCR31, 0x800000); // 11 |
507 | jmp_imm_short(11); // 2 |
508 | and_m32rel_imm32((unsigned int*)&FCR31, ~0x800000); // 11 |
509 | #endif |
510 | } |
511 | |
512 | void genc_ule_d(void) |
513 | { |
514 | #if defined(COUNT_INSTR) |
515 | inc_m32rel(&instr_count[118]); |
516 | #endif |
517 | #ifdef INTERPRET_C_ULE_D |
518 | gencallinterp((unsigned long long)cached_interpreter_table.C_ULE_D, 0); |
519 | #else |
520 | gencheck_cop1_unusable(); |
521 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.ft])); |
522 | fld_preg64_qword(RAX); |
523 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
524 | fld_preg64_qword(RAX); |
525 | fucomip_fpreg(1); |
526 | ffree_fpreg(0); |
527 | jp_rj(15); |
528 | ja_rj(13); // 2 |
529 | or_m32rel_imm32((unsigned int*)&FCR31, 0x800000); // 11 |
530 | jmp_imm_short(11); // 2 |
531 | and_m32rel_imm32((unsigned int*)&FCR31, ~0x800000); // 11 |
532 | #endif |
533 | } |
534 | |
535 | void genc_sf_d(void) |
536 | { |
537 | #if defined(COUNT_INSTR) |
538 | inc_m32rel(&instr_count[118]); |
539 | #endif |
540 | #ifdef INTERPRET_C_SF_D |
541 | gencallinterp((unsigned long long)cached_interpreter_table.C_SF_D, 0); |
542 | #else |
543 | gencheck_cop1_unusable(); |
544 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.ft])); |
545 | fld_preg64_qword(RAX); |
546 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
547 | fld_preg64_qword(RAX); |
548 | fcomip_fpreg(1); |
549 | ffree_fpreg(0); |
550 | and_m32rel_imm32((unsigned int*)&FCR31, ~0x800000); |
551 | #endif |
552 | } |
553 | |
554 | void genc_ngle_d(void) |
555 | { |
556 | #if defined(COUNT_INSTR) |
557 | inc_m32rel(&instr_count[118]); |
558 | #endif |
559 | #ifdef INTERPRET_C_NGLE_D |
560 | gencallinterp((unsigned long long)cached_interpreter_table.C_NGLE_D, 0); |
561 | #else |
562 | gencheck_cop1_unusable(); |
563 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.ft])); |
564 | fld_preg64_qword(RAX); |
565 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
566 | fld_preg64_qword(RAX); |
567 | fcomip_fpreg(1); |
568 | ffree_fpreg(0); |
569 | jp_rj(13); |
570 | and_m32rel_imm32((unsigned int*)&FCR31, ~0x800000); // 11 |
571 | jmp_imm_short(11); // 2 |
572 | or_m32rel_imm32((unsigned int*)&FCR31, 0x800000); // 11 |
573 | #endif |
574 | } |
575 | |
576 | void genc_seq_d(void) |
577 | { |
578 | #if defined(COUNT_INSTR) |
579 | inc_m32rel(&instr_count[118]); |
580 | #endif |
581 | #ifdef INTERPRET_C_SEQ_D |
582 | gencallinterp((unsigned long long)cached_interpreter_table.C_SEQ_D, 0); |
583 | #else |
584 | gencheck_cop1_unusable(); |
585 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.ft])); |
586 | fld_preg64_qword(RAX); |
587 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
588 | fld_preg64_qword(RAX); |
589 | fcomip_fpreg(1); |
590 | ffree_fpreg(0); |
591 | jne_rj(13); // 2 |
592 | or_m32rel_imm32((unsigned int*)&FCR31, 0x800000); // 11 |
593 | jmp_imm_short(11); // 2 |
594 | and_m32rel_imm32((unsigned int*)&FCR31, ~0x800000); // 11 |
595 | #endif |
596 | } |
597 | |
598 | void genc_ngl_d(void) |
599 | { |
600 | #if defined(COUNT_INSTR) |
601 | inc_m32rel(&instr_count[118]); |
602 | #endif |
603 | #ifdef INTERPRET_C_NGL_D |
604 | gencallinterp((unsigned long long)cached_interpreter_table.C_NGL_D, 0); |
605 | #else |
606 | gencheck_cop1_unusable(); |
607 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.ft])); |
608 | fld_preg64_qword(RAX); |
609 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
610 | fld_preg64_qword(RAX); |
611 | fcomip_fpreg(1); |
612 | ffree_fpreg(0); |
613 | jp_rj(15); |
614 | jne_rj(13); |
615 | or_m32rel_imm32((unsigned int*)&FCR31, 0x800000); // 11 |
616 | jmp_imm_short(11); // 2 |
617 | and_m32rel_imm32((unsigned int*)&FCR31, ~0x800000); // 11 |
618 | #endif |
619 | } |
620 | |
621 | void genc_lt_d(void) |
622 | { |
623 | #if defined(COUNT_INSTR) |
624 | inc_m32rel(&instr_count[118]); |
625 | #endif |
626 | #ifdef INTERPRET_C_LT_D |
627 | gencallinterp((unsigned long long)cached_interpreter_table.C_LT_D, 0); |
628 | #else |
629 | gencheck_cop1_unusable(); |
630 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.ft])); |
631 | fld_preg64_qword(RAX); |
632 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
633 | fld_preg64_qword(RAX); |
634 | fcomip_fpreg(1); |
635 | ffree_fpreg(0); |
636 | jae_rj(13); // 2 |
637 | or_m32rel_imm32((unsigned int*)&FCR31, 0x800000); // 11 |
638 | jmp_imm_short(11); // 2 |
639 | and_m32rel_imm32((unsigned int*)&FCR31, ~0x800000); // 11 |
640 | #endif |
641 | } |
642 | |
643 | void genc_nge_d(void) |
644 | { |
645 | #if defined(COUNT_INSTR) |
646 | inc_m32rel(&instr_count[118]); |
647 | #endif |
648 | #ifdef INTERPRET_C_NGE_D |
649 | gencallinterp((unsigned long long)cached_interpreter_table.C_NGE_D, 0); |
650 | #else |
651 | gencheck_cop1_unusable(); |
652 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.ft])); |
653 | fld_preg64_qword(RAX); |
654 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
655 | fld_preg64_qword(RAX); |
656 | fcomip_fpreg(1); |
657 | ffree_fpreg(0); |
658 | jp_rj(15); |
659 | jae_rj(13); // 2 |
660 | or_m32rel_imm32((unsigned int*)&FCR31, 0x800000); // 11 |
661 | jmp_imm_short(11); // 2 |
662 | and_m32rel_imm32((unsigned int*)&FCR31, ~0x800000); // 11 |
663 | #endif |
664 | } |
665 | |
666 | void genc_le_d(void) |
667 | { |
668 | #if defined(COUNT_INSTR) |
669 | inc_m32rel(&instr_count[118]); |
670 | #endif |
671 | #ifdef INTERPRET_C_LE_D |
672 | gencallinterp((unsigned long long)cached_interpreter_table.C_LE_D, 0); |
673 | #else |
674 | gencheck_cop1_unusable(); |
675 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.ft])); |
676 | fld_preg64_qword(RAX); |
677 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
678 | fld_preg64_qword(RAX); |
679 | fcomip_fpreg(1); |
680 | ffree_fpreg(0); |
681 | ja_rj(13); // 2 |
682 | or_m32rel_imm32((unsigned int*)&FCR31, 0x800000); // 11 |
683 | jmp_imm_short(11); // 2 |
684 | and_m32rel_imm32((unsigned int*)&FCR31, ~0x800000); // 11 |
685 | #endif |
686 | } |
687 | |
688 | void genc_ngt_d(void) |
689 | { |
690 | #if defined(COUNT_INSTR) |
691 | inc_m32rel(&instr_count[118]); |
692 | #endif |
693 | #ifdef INTERPRET_C_NGT_D |
694 | gencallinterp((unsigned long long)cached_interpreter_table.C_NGT_D, 0); |
695 | #else |
696 | gencheck_cop1_unusable(); |
697 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.ft])); |
698 | fld_preg64_qword(RAX); |
699 | mov_xreg64_m64rel(RAX, (unsigned long long *)(®_cop1_double[dst->f.cf.fs])); |
700 | fld_preg64_qword(RAX); |
701 | fcomip_fpreg(1); |
702 | ffree_fpreg(0); |
703 | jp_rj(15); |
704 | ja_rj(13); // 2 |
705 | or_m32rel_imm32((unsigned int*)&FCR31, 0x800000); // 11 |
706 | jmp_imm_short(11); // 2 |
707 | and_m32rel_imm32((unsigned int*)&FCR31, ~0x800000); // 11 |
708 | #endif |
709 | } |
710 | |