Core commit. Compile and run on the OpenPandora
[mupen64plus-pandora.git] / source / mupen64plus-core / src / r4300 / x86_64 / gcop1_d.c
CommitLineData
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
32void 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
50void 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
68void 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
86void 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
104void 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
121void 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
138void 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
156void 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
173void 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
191void 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
209void 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
227void 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
245void 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
263void 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
281void 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
299void 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
317void 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
333void 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
349void 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
365void 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
378void 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
400void 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
422void 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
445void 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
467void 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
490void 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
512void 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
535void 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
554void 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
576void 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
598void 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
621void 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
643void 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
666void 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
688void 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