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