Core commit. Compile and run on the OpenPandora
[mupen64plus-pandora.git] / source / mupen64plus-core / src / r4300 / x86_64 / gcop1_d.c
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 *)(&reg_cop1_double[dst->f.cf.fs]));
42    fld_preg64_qword(RAX);
43    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_cop1_double[dst->f.cf.ft]));
44    fadd_preg64_qword(RAX);
45    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.fs]));
60    fld_preg64_qword(RAX);
61    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_cop1_double[dst->f.cf.ft]));
62    fsub_preg64_qword(RAX);
63    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.fs]));
78    fld_preg64_qword(RAX);
79    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_cop1_double[dst->f.cf.ft]));
80    fmul_preg64_qword(RAX);
81    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.fs]));
96    fld_preg64_qword(RAX);
97    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_cop1_double[dst->f.cf.ft]));
98    fdiv_preg64_qword(RAX);
99    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.fs]));
114    fld_preg64_qword(RAX);
115    fsqrt();
116    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.fs]));
131    fld_preg64_qword(RAX);
132    fabs_();
133    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_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 *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.fs]));
166    fld_preg64_qword(RAX);
167    fchs();
168    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.fs]));
184    fld_preg64_qword(RAX);
185    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.fs]));
202    fld_preg64_qword(RAX);
203    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.fs]));
220    fld_preg64_qword(RAX);
221    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.fs]));
238    fld_preg64_qword(RAX);
239    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.fs]));
256    fld_preg64_qword(RAX);
257    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.fs]));
274    fld_preg64_qword(RAX);
275    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.fs]));
292    fld_preg64_qword(RAX);
293    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.fs]));
310    fld_preg64_qword(RAX);
311    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.fs]));
327    fld_preg64_qword(RAX);
328    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.fs]));
343    fld_preg64_qword(RAX);
344    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.fs]));
359    fld_preg64_qword(RAX);
360    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.ft]));
388    fld_preg64_qword(RAX);
389    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.ft]));
410    fld_preg64_qword(RAX);
411    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.ft]));
432    fld_preg64_qword(RAX);
433    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.ft]));
455    fld_preg64_qword(RAX);
456    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.ft]));
477    fld_preg64_qword(RAX);
478    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.ft]));
500    fld_preg64_qword(RAX);
501    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.ft]));
522    fld_preg64_qword(RAX);
523    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.ft]));
545    fld_preg64_qword(RAX);
546    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.ft]));
564    fld_preg64_qword(RAX);
565    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.ft]));
586    fld_preg64_qword(RAX);
587    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.ft]));
608    fld_preg64_qword(RAX);
609    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.ft]));
631    fld_preg64_qword(RAX);
632    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.ft]));
653    fld_preg64_qword(RAX);
654    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.ft]));
676    fld_preg64_qword(RAX);
677    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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 *)(&reg_cop1_double[dst->f.cf.ft]));
698    fld_preg64_qword(RAX);
699    mov_xreg64_m64rel(RAX, (unsigned long long *)(&reg_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