Core commit. Compile and run on the OpenPandora
[mupen64plus-pandora.git] / source / mupen64plus-core / src / r4300 / x86 / gcop1_d.c
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
31 void 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
46 void 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
61 void 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
76 void 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
91 void 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
105 void 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
119 void 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
134 void 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
148 void 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
163 void 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
178 void 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
193 void 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
208 void 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
223 void 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
238 void 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
253 void 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
268 void 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
281 void 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
294 void 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
307 void 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
317 void 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
336 void 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
355 void 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
375 void 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
394 void 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
414 void 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
433 void 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
453 void 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
469 void 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
488 void 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
507 void 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
527 void 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
546 void 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
566 void 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
585 void 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