Commit a16336e4792c4f092bd2fdcd20c9d70c979b2b22

Authored by ths
1 parent 8f2ad0a3

Convert remaining MIPS FP instructions to TCG.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4753 c046a42c-6fe2-441c-8c8c-71466251a162
target-mips/helper.h
@@ -154,6 +154,7 @@ DEF_HELPER(void, do_float_mulr_ps, (void)) @@ -154,6 +154,7 @@ DEF_HELPER(void, do_float_mulr_ps, (void))
154 #define FOP_PROTO(op) \ 154 #define FOP_PROTO(op) \
155 DEF_HELPER(void, do_float_ ## op ## _s, (void)) \ 155 DEF_HELPER(void, do_float_ ## op ## _s, (void)) \
156 DEF_HELPER(void, do_float_ ## op ## _d, (void)) 156 DEF_HELPER(void, do_float_ ## op ## _d, (void))
  157 +FOP_PROTO(sqrt)
157 FOP_PROTO(roundl) 158 FOP_PROTO(roundl)
158 FOP_PROTO(roundw) 159 FOP_PROTO(roundw)
159 FOP_PROTO(truncl) 160 FOP_PROTO(truncl)
@@ -174,6 +175,12 @@ FOP_PROTO(add) @@ -174,6 +175,12 @@ FOP_PROTO(add)
174 FOP_PROTO(sub) 175 FOP_PROTO(sub)
175 FOP_PROTO(mul) 176 FOP_PROTO(mul)
176 FOP_PROTO(div) 177 FOP_PROTO(div)
  178 +FOP_PROTO(abs)
  179 +FOP_PROTO(chs)
  180 +FOP_PROTO(muladd)
  181 +FOP_PROTO(mulsub)
  182 +FOP_PROTO(nmuladd)
  183 +FOP_PROTO(nmulsub)
177 FOP_PROTO(recip1) 184 FOP_PROTO(recip1)
178 FOP_PROTO(recip2) 185 FOP_PROTO(recip2)
179 FOP_PROTO(rsqrt1) 186 FOP_PROTO(rsqrt1)
target-mips/op.c
@@ -295,295 +295,3 @@ void op_mulshiu (void) @@ -295,295 +295,3 @@ void op_mulshiu (void)
295 #else 295 #else
296 # define DEBUG_FPU_STATE() do { } while(0) 296 # define DEBUG_FPU_STATE() do { } while(0)
297 #endif 297 #endif
298 -  
299 -/* Float support.  
300 - Single precition routines have a "s" suffix, double precision a  
301 - "d" suffix, 32bit integer "w", 64bit integer "l", paired singe "ps",  
302 - paired single lowwer "pl", paired single upper "pu". */  
303 -  
304 -#define FLOAT_OP(name, p) void OPPROTO op_float_##name##_##p(void)  
305 -  
306 -FLOAT_OP(pll, ps)  
307 -{  
308 - DT2 = ((uint64_t)WT0 << 32) | WT1;  
309 - DEBUG_FPU_STATE();  
310 - FORCE_RET();  
311 -}  
312 -FLOAT_OP(plu, ps)  
313 -{  
314 - DT2 = ((uint64_t)WT0 << 32) | WTH1;  
315 - DEBUG_FPU_STATE();  
316 - FORCE_RET();  
317 -}  
318 -FLOAT_OP(pul, ps)  
319 -{  
320 - DT2 = ((uint64_t)WTH0 << 32) | WT1;  
321 - DEBUG_FPU_STATE();  
322 - FORCE_RET();  
323 -}  
324 -FLOAT_OP(puu, ps)  
325 -{  
326 - DT2 = ((uint64_t)WTH0 << 32) | WTH1;  
327 - DEBUG_FPU_STATE();  
328 - FORCE_RET();  
329 -}  
330 -  
331 -FLOAT_OP(movf, d)  
332 -{  
333 - if (!(env->fpu->fcr31 & PARAM1))  
334 - DT2 = DT0;  
335 - DEBUG_FPU_STATE();  
336 - FORCE_RET();  
337 -}  
338 -FLOAT_OP(movf, s)  
339 -{  
340 - if (!(env->fpu->fcr31 & PARAM1))  
341 - WT2 = WT0;  
342 - DEBUG_FPU_STATE();  
343 - FORCE_RET();  
344 -}  
345 -FLOAT_OP(movf, ps)  
346 -{  
347 - unsigned int mask = GET_FP_COND (env->fpu) >> PARAM1;  
348 - if (!(mask & 1))  
349 - WT2 = WT0;  
350 - if (!(mask & 2))  
351 - WTH2 = WTH0;  
352 - DEBUG_FPU_STATE();  
353 - FORCE_RET();  
354 -}  
355 -FLOAT_OP(movt, d)  
356 -{  
357 - if (env->fpu->fcr31 & PARAM1)  
358 - DT2 = DT0;  
359 - DEBUG_FPU_STATE();  
360 - FORCE_RET();  
361 -}  
362 -FLOAT_OP(movt, s)  
363 -{  
364 - if (env->fpu->fcr31 & PARAM1)  
365 - WT2 = WT0;  
366 - DEBUG_FPU_STATE();  
367 - FORCE_RET();  
368 -}  
369 -FLOAT_OP(movt, ps)  
370 -{  
371 - unsigned int mask = GET_FP_COND (env->fpu) >> PARAM1;  
372 - if (mask & 1)  
373 - WT2 = WT0;  
374 - if (mask & 2)  
375 - WTH2 = WTH0;  
376 - DEBUG_FPU_STATE();  
377 - FORCE_RET();  
378 -}  
379 -FLOAT_OP(movz, d)  
380 -{  
381 - if (!T0)  
382 - DT2 = DT0;  
383 - DEBUG_FPU_STATE();  
384 - FORCE_RET();  
385 -}  
386 -FLOAT_OP(movz, s)  
387 -{  
388 - if (!T0)  
389 - WT2 = WT0;  
390 - DEBUG_FPU_STATE();  
391 - FORCE_RET();  
392 -}  
393 -FLOAT_OP(movz, ps)  
394 -{  
395 - if (!T0) {  
396 - WT2 = WT0;  
397 - WTH2 = WTH0;  
398 - }  
399 - DEBUG_FPU_STATE();  
400 - FORCE_RET();  
401 -}  
402 -FLOAT_OP(movn, d)  
403 -{  
404 - if (T0)  
405 - DT2 = DT0;  
406 - DEBUG_FPU_STATE();  
407 - FORCE_RET();  
408 -}  
409 -FLOAT_OP(movn, s)  
410 -{  
411 - if (T0)  
412 - WT2 = WT0;  
413 - DEBUG_FPU_STATE();  
414 - FORCE_RET();  
415 -}  
416 -FLOAT_OP(movn, ps)  
417 -{  
418 - if (T0) {  
419 - WT2 = WT0;  
420 - WTH2 = WTH0;  
421 - }  
422 - DEBUG_FPU_STATE();  
423 - FORCE_RET();  
424 -}  
425 -  
426 -/* ternary operations */  
427 -#define FLOAT_TERNOP(name1, name2) \  
428 -FLOAT_OP(name1 ## name2, d) \  
429 -{ \  
430 - FDT0 = float64_ ## name1 (FDT0, FDT1, &env->fpu->fp_status); \  
431 - FDT2 = float64_ ## name2 (FDT0, FDT2, &env->fpu->fp_status); \  
432 - DEBUG_FPU_STATE(); \  
433 - FORCE_RET(); \  
434 -} \  
435 -FLOAT_OP(name1 ## name2, s) \  
436 -{ \  
437 - FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \  
438 - FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \  
439 - DEBUG_FPU_STATE(); \  
440 - FORCE_RET(); \  
441 -} \  
442 -FLOAT_OP(name1 ## name2, ps) \  
443 -{ \  
444 - FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \  
445 - FSTH0 = float32_ ## name1 (FSTH0, FSTH1, &env->fpu->fp_status); \  
446 - FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \  
447 - FSTH2 = float32_ ## name2 (FSTH0, FSTH2, &env->fpu->fp_status); \  
448 - DEBUG_FPU_STATE(); \  
449 - FORCE_RET(); \  
450 -}  
451 -FLOAT_TERNOP(mul, add)  
452 -FLOAT_TERNOP(mul, sub)  
453 -#undef FLOAT_TERNOP  
454 -  
455 -/* negated ternary operations */  
456 -#define FLOAT_NTERNOP(name1, name2) \  
457 -FLOAT_OP(n ## name1 ## name2, d) \  
458 -{ \  
459 - FDT0 = float64_ ## name1 (FDT0, FDT1, &env->fpu->fp_status); \  
460 - FDT2 = float64_ ## name2 (FDT0, FDT2, &env->fpu->fp_status); \  
461 - FDT2 = float64_chs(FDT2); \  
462 - DEBUG_FPU_STATE(); \  
463 - FORCE_RET(); \  
464 -} \  
465 -FLOAT_OP(n ## name1 ## name2, s) \  
466 -{ \  
467 - FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \  
468 - FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \  
469 - FST2 = float32_chs(FST2); \  
470 - DEBUG_FPU_STATE(); \  
471 - FORCE_RET(); \  
472 -} \  
473 -FLOAT_OP(n ## name1 ## name2, ps) \  
474 -{ \  
475 - FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \  
476 - FSTH0 = float32_ ## name1 (FSTH0, FSTH1, &env->fpu->fp_status); \  
477 - FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \  
478 - FSTH2 = float32_ ## name2 (FSTH0, FSTH2, &env->fpu->fp_status); \  
479 - FST2 = float32_chs(FST2); \  
480 - FSTH2 = float32_chs(FSTH2); \  
481 - DEBUG_FPU_STATE(); \  
482 - FORCE_RET(); \  
483 -}  
484 -FLOAT_NTERNOP(mul, add)  
485 -FLOAT_NTERNOP(mul, sub)  
486 -#undef FLOAT_NTERNOP  
487 -  
488 -/* unary operations, modifying fp status */  
489 -#define FLOAT_UNOP(name) \  
490 -FLOAT_OP(name, d) \  
491 -{ \  
492 - FDT2 = float64_ ## name(FDT0, &env->fpu->fp_status); \  
493 - DEBUG_FPU_STATE(); \  
494 - FORCE_RET(); \  
495 -} \  
496 -FLOAT_OP(name, s) \  
497 -{ \  
498 - FST2 = float32_ ## name(FST0, &env->fpu->fp_status); \  
499 - DEBUG_FPU_STATE(); \  
500 - FORCE_RET(); \  
501 -}  
502 -FLOAT_UNOP(sqrt)  
503 -#undef FLOAT_UNOP  
504 -  
505 -/* unary operations, not modifying fp status */  
506 -#define FLOAT_UNOP(name) \  
507 -FLOAT_OP(name, d) \  
508 -{ \  
509 - FDT2 = float64_ ## name(FDT0); \  
510 - DEBUG_FPU_STATE(); \  
511 - FORCE_RET(); \  
512 -} \  
513 -FLOAT_OP(name, s) \  
514 -{ \  
515 - FST2 = float32_ ## name(FST0); \  
516 - DEBUG_FPU_STATE(); \  
517 - FORCE_RET(); \  
518 -} \  
519 -FLOAT_OP(name, ps) \  
520 -{ \  
521 - FST2 = float32_ ## name(FST0); \  
522 - FSTH2 = float32_ ## name(FSTH0); \  
523 - DEBUG_FPU_STATE(); \  
524 - FORCE_RET(); \  
525 -}  
526 -FLOAT_UNOP(abs)  
527 -FLOAT_UNOP(chs)  
528 -#undef FLOAT_UNOP  
529 -  
530 -FLOAT_OP(alnv, ps)  
531 -{  
532 - switch (T0 & 0x7) {  
533 - case 0:  
534 - FST2 = FST0;  
535 - FSTH2 = FSTH0;  
536 - break;  
537 - case 4:  
538 -#ifdef TARGET_WORDS_BIGENDIAN  
539 - FSTH2 = FST0;  
540 - FST2 = FSTH1;  
541 -#else  
542 - FSTH2 = FST1;  
543 - FST2 = FSTH0;  
544 -#endif  
545 - break;  
546 - default: /* unpredictable */  
547 - break;  
548 - }  
549 - DEBUG_FPU_STATE();  
550 - FORCE_RET();  
551 -}  
552 -  
553 -void op_bc1f (void)  
554 -{  
555 - T0 = !!(~GET_FP_COND(env->fpu) & (0x1 << PARAM1));  
556 - DEBUG_FPU_STATE();  
557 - FORCE_RET();  
558 -}  
559 -void op_bc1any2f (void)  
560 -{  
561 - T0 = !!(~GET_FP_COND(env->fpu) & (0x3 << PARAM1));  
562 - DEBUG_FPU_STATE();  
563 - FORCE_RET();  
564 -}  
565 -void op_bc1any4f (void)  
566 -{  
567 - T0 = !!(~GET_FP_COND(env->fpu) & (0xf << PARAM1));  
568 - DEBUG_FPU_STATE();  
569 - FORCE_RET();  
570 -}  
571 -  
572 -void op_bc1t (void)  
573 -{  
574 - T0 = !!(GET_FP_COND(env->fpu) & (0x1 << PARAM1));  
575 - DEBUG_FPU_STATE();  
576 - FORCE_RET();  
577 -}  
578 -void op_bc1any2t (void)  
579 -{  
580 - T0 = !!(GET_FP_COND(env->fpu) & (0x3 << PARAM1));  
581 - DEBUG_FPU_STATE();  
582 - FORCE_RET();  
583 -}  
584 -void op_bc1any4t (void)  
585 -{  
586 - T0 = !!(GET_FP_COND(env->fpu) & (0xf << PARAM1));  
587 - DEBUG_FPU_STATE();  
588 - FORCE_RET();  
589 -}  
target-mips/op_helper.c
@@ -1703,8 +1703,26 @@ static always_inline void update_fcr31(void) @@ -1703,8 +1703,26 @@ static always_inline void update_fcr31(void)
1703 UPDATE_FP_FLAGS(env->fpu->fcr31, tmp); 1703 UPDATE_FP_FLAGS(env->fpu->fcr31, tmp);
1704 } 1704 }
1705 1705
  1706 +/* Float support.
  1707 + Single precition routines have a "s" suffix, double precision a
  1708 + "d" suffix, 32bit integer "w", 64bit integer "l", paired single "ps",
  1709 + paired single lower "pl", paired single upper "pu". */
  1710 +
1706 #define FLOAT_OP(name, p) void do_float_##name##_##p(void) 1711 #define FLOAT_OP(name, p) void do_float_##name##_##p(void)
1707 1712
  1713 +/* unary operations, modifying fp status */
  1714 +#define FLOAT_UNOP(name) \
  1715 +FLOAT_OP(name, d) \
  1716 +{ \
  1717 + FDT2 = float64_ ## name(FDT0, &env->fpu->fp_status); \
  1718 +} \
  1719 +FLOAT_OP(name, s) \
  1720 +{ \
  1721 + FST2 = float32_ ## name(FST0, &env->fpu->fp_status); \
  1722 +}
  1723 +FLOAT_UNOP(sqrt)
  1724 +#undef FLOAT_UNOP
  1725 +
1708 FLOAT_OP(cvtd, s) 1726 FLOAT_OP(cvtd, s)
1709 { 1727 {
1710 set_float_exception_flags(0, &env->fpu->fp_status); 1728 set_float_exception_flags(0, &env->fpu->fp_status);
@@ -1943,6 +1961,25 @@ FLOAT_OP(floorw, s) @@ -1943,6 +1961,25 @@ FLOAT_OP(floorw, s)
1943 WT2 = FLOAT_SNAN32; 1961 WT2 = FLOAT_SNAN32;
1944 } 1962 }
1945 1963
  1964 +/* unary operations, not modifying fp status */
  1965 +#define FLOAT_UNOP(name) \
  1966 +FLOAT_OP(name, d) \
  1967 +{ \
  1968 + FDT2 = float64_ ## name(FDT0); \
  1969 +} \
  1970 +FLOAT_OP(name, s) \
  1971 +{ \
  1972 + FST2 = float32_ ## name(FST0); \
  1973 +} \
  1974 +FLOAT_OP(name, ps) \
  1975 +{ \
  1976 + FST2 = float32_ ## name(FST0); \
  1977 + FSTH2 = float32_ ## name(FSTH0); \
  1978 +}
  1979 +FLOAT_UNOP(abs)
  1980 +FLOAT_UNOP(chs)
  1981 +#undef FLOAT_UNOP
  1982 +
1946 /* MIPS specific unary operations */ 1983 /* MIPS specific unary operations */
1947 FLOAT_OP(recip, d) 1984 FLOAT_OP(recip, d)
1948 { 1985 {
@@ -2051,6 +2088,56 @@ FLOAT_BINOP(mul) @@ -2051,6 +2088,56 @@ FLOAT_BINOP(mul)
2051 FLOAT_BINOP(div) 2088 FLOAT_BINOP(div)
2052 #undef FLOAT_BINOP 2089 #undef FLOAT_BINOP
2053 2090
  2091 +/* ternary operations */
  2092 +#define FLOAT_TERNOP(name1, name2) \
  2093 +FLOAT_OP(name1 ## name2, d) \
  2094 +{ \
  2095 + FDT0 = float64_ ## name1 (FDT0, FDT1, &env->fpu->fp_status); \
  2096 + FDT2 = float64_ ## name2 (FDT0, FDT2, &env->fpu->fp_status); \
  2097 +} \
  2098 +FLOAT_OP(name1 ## name2, s) \
  2099 +{ \
  2100 + FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \
  2101 + FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \
  2102 +} \
  2103 +FLOAT_OP(name1 ## name2, ps) \
  2104 +{ \
  2105 + FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \
  2106 + FSTH0 = float32_ ## name1 (FSTH0, FSTH1, &env->fpu->fp_status); \
  2107 + FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \
  2108 + FSTH2 = float32_ ## name2 (FSTH0, FSTH2, &env->fpu->fp_status); \
  2109 +}
  2110 +FLOAT_TERNOP(mul, add)
  2111 +FLOAT_TERNOP(mul, sub)
  2112 +#undef FLOAT_TERNOP
  2113 +
  2114 +/* negated ternary operations */
  2115 +#define FLOAT_NTERNOP(name1, name2) \
  2116 +FLOAT_OP(n ## name1 ## name2, d) \
  2117 +{ \
  2118 + FDT0 = float64_ ## name1 (FDT0, FDT1, &env->fpu->fp_status); \
  2119 + FDT2 = float64_ ## name2 (FDT0, FDT2, &env->fpu->fp_status); \
  2120 + FDT2 = float64_chs(FDT2); \
  2121 +} \
  2122 +FLOAT_OP(n ## name1 ## name2, s) \
  2123 +{ \
  2124 + FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \
  2125 + FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \
  2126 + FST2 = float32_chs(FST2); \
  2127 +} \
  2128 +FLOAT_OP(n ## name1 ## name2, ps) \
  2129 +{ \
  2130 + FST0 = float32_ ## name1 (FST0, FST1, &env->fpu->fp_status); \
  2131 + FSTH0 = float32_ ## name1 (FSTH0, FSTH1, &env->fpu->fp_status); \
  2132 + FST2 = float32_ ## name2 (FST0, FST2, &env->fpu->fp_status); \
  2133 + FSTH2 = float32_ ## name2 (FSTH0, FSTH2, &env->fpu->fp_status); \
  2134 + FST2 = float32_chs(FST2); \
  2135 + FSTH2 = float32_chs(FSTH2); \
  2136 +}
  2137 +FLOAT_NTERNOP(mul, add)
  2138 +FLOAT_NTERNOP(mul, sub)
  2139 +#undef FLOAT_NTERNOP
  2140 +
2054 /* MIPS specific binary operations */ 2141 /* MIPS specific binary operations */
2055 FLOAT_OP(recip2, d) 2142 FLOAT_OP(recip2, d)
2056 { 2143 {
target-mips/translate.c
@@ -630,6 +630,21 @@ static inline void gen_store_fpr32h (TCGv t, int reg) @@ -630,6 +630,21 @@ static inline void gen_store_fpr32h (TCGv t, int reg)
630 tcg_gen_st_i32(t, current_fpu, 8 * reg + 4 * !FP_ENDIAN_IDX); 630 tcg_gen_st_i32(t, current_fpu, 8 * reg + 4 * !FP_ENDIAN_IDX);
631 } 631 }
632 632
  633 +static inline void get_fp_cond (TCGv t)
  634 +{
  635 + TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);
  636 + TCGv r_tmp2 = tcg_temp_new(TCG_TYPE_I32);
  637 +
  638 + tcg_gen_ld_i32(r_tmp1, current_fpu, offsetof(CPUMIPSFPUContext, fcr31));
  639 + tcg_gen_shri_i32(r_tmp2, r_tmp1, 24);
  640 + tcg_gen_andi_i32(r_tmp2, r_tmp2, 0xfe);
  641 + tcg_gen_shri_i32(r_tmp1, r_tmp1, 23);
  642 + tcg_gen_andi_i32(r_tmp1, r_tmp1, 0x1);
  643 + tcg_gen_or_i32(t, r_tmp1, r_tmp2);
  644 + tcg_temp_free(r_tmp1);
  645 + tcg_temp_free(r_tmp2);
  646 +}
  647 +
633 #define FOP_CONDS(type, fmt) \ 648 #define FOP_CONDS(type, fmt) \
634 static GenOpFunc1 * fcmp ## type ## _ ## fmt ## _table[16] = { \ 649 static GenOpFunc1 * fcmp ## type ## _ ## fmt ## _table[16] = { \
635 do_cmp ## type ## _ ## fmt ## _f, \ 650 do_cmp ## type ## _ ## fmt ## _f, \
@@ -5541,38 +5556,170 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, @@ -5541,38 +5556,170 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op,
5541 5556
5542 switch (op) { 5557 switch (op) {
5543 case OPC_BC1F: 5558 case OPC_BC1F:
5544 - gen_op_bc1f(cc); 5559 + {
  5560 + int l1 = gen_new_label();
  5561 + int l2 = gen_new_label();
  5562 + TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);
  5563 +
  5564 + get_fp_cond(r_tmp1);
  5565 + tcg_gen_ext_i32_tl(cpu_T[0], r_tmp1);
  5566 + tcg_temp_free(r_tmp1);
  5567 + tcg_gen_not_tl(cpu_T[0], cpu_T[0]);
  5568 + tcg_gen_movi_tl(cpu_T[1], 0x1 << cc);
  5569 + tcg_gen_and_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
  5570 + tcg_gen_brcondi_tl(TCG_COND_NE, cpu_T[0], 0, l1);
  5571 + tcg_gen_movi_tl(cpu_T[0], 0);
  5572 + tcg_gen_br(l2);
  5573 + gen_set_label(l1);
  5574 + tcg_gen_movi_tl(cpu_T[0], 1);
  5575 + gen_set_label(l2);
  5576 + }
5545 opn = "bc1f"; 5577 opn = "bc1f";
5546 goto not_likely; 5578 goto not_likely;
5547 case OPC_BC1FL: 5579 case OPC_BC1FL:
5548 - gen_op_bc1f(cc); 5580 + {
  5581 + int l1 = gen_new_label();
  5582 + int l2 = gen_new_label();
  5583 + TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);
  5584 +
  5585 + get_fp_cond(r_tmp1);
  5586 + tcg_gen_ext_i32_tl(cpu_T[0], r_tmp1);
  5587 + tcg_temp_free(r_tmp1);
  5588 + tcg_gen_not_tl(cpu_T[0], cpu_T[0]);
  5589 + tcg_gen_movi_tl(cpu_T[1], 0x1 << cc);
  5590 + tcg_gen_and_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
  5591 + tcg_gen_brcondi_tl(TCG_COND_NE, cpu_T[0], 0, l1);
  5592 + tcg_gen_movi_tl(cpu_T[0], 0);
  5593 + tcg_gen_br(l2);
  5594 + gen_set_label(l1);
  5595 + tcg_gen_movi_tl(cpu_T[0], 1);
  5596 + gen_set_label(l2);
  5597 + }
5549 opn = "bc1fl"; 5598 opn = "bc1fl";
5550 goto likely; 5599 goto likely;
5551 case OPC_BC1T: 5600 case OPC_BC1T:
5552 - gen_op_bc1t(cc); 5601 + {
  5602 + int l1 = gen_new_label();
  5603 + int l2 = gen_new_label();
  5604 + TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);
  5605 +
  5606 + get_fp_cond(r_tmp1);
  5607 + tcg_gen_ext_i32_tl(cpu_T[0], r_tmp1);
  5608 + tcg_temp_free(r_tmp1);
  5609 + tcg_gen_movi_tl(cpu_T[1], 0x1 << cc);
  5610 + tcg_gen_and_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
  5611 + tcg_gen_brcondi_tl(TCG_COND_NE, cpu_T[0], 0, l1);
  5612 + tcg_gen_movi_tl(cpu_T[0], 0);
  5613 + tcg_gen_br(l2);
  5614 + gen_set_label(l1);
  5615 + tcg_gen_movi_tl(cpu_T[0], 1);
  5616 + gen_set_label(l2);
  5617 + }
5553 opn = "bc1t"; 5618 opn = "bc1t";
5554 goto not_likely; 5619 goto not_likely;
5555 case OPC_BC1TL: 5620 case OPC_BC1TL:
5556 - gen_op_bc1t(cc); 5621 + {
  5622 + int l1 = gen_new_label();
  5623 + int l2 = gen_new_label();
  5624 + TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);
  5625 +
  5626 + get_fp_cond(r_tmp1);
  5627 + tcg_gen_ext_i32_tl(cpu_T[0], r_tmp1);
  5628 + tcg_temp_free(r_tmp1);
  5629 + tcg_gen_movi_tl(cpu_T[1], 0x1 << cc);
  5630 + tcg_gen_and_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
  5631 + tcg_gen_brcondi_tl(TCG_COND_NE, cpu_T[0], 0, l1);
  5632 + tcg_gen_movi_tl(cpu_T[0], 0);
  5633 + tcg_gen_br(l2);
  5634 + gen_set_label(l1);
  5635 + tcg_gen_movi_tl(cpu_T[0], 1);
  5636 + gen_set_label(l2);
  5637 + }
5557 opn = "bc1tl"; 5638 opn = "bc1tl";
5558 likely: 5639 likely:
5559 ctx->hflags |= MIPS_HFLAG_BL; 5640 ctx->hflags |= MIPS_HFLAG_BL;
5560 tcg_gen_st_tl(cpu_T[0], cpu_env, offsetof(CPUState, bcond)); 5641 tcg_gen_st_tl(cpu_T[0], cpu_env, offsetof(CPUState, bcond));
5561 break; 5642 break;
5562 case OPC_BC1FANY2: 5643 case OPC_BC1FANY2:
5563 - gen_op_bc1any2f(cc); 5644 + {
  5645 + int l1 = gen_new_label();
  5646 + int l2 = gen_new_label();
  5647 + TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);
  5648 +
  5649 + get_fp_cond(r_tmp1);
  5650 + tcg_gen_ext_i32_tl(cpu_T[0], r_tmp1);
  5651 + tcg_temp_free(r_tmp1);
  5652 + tcg_gen_not_tl(cpu_T[0], cpu_T[0]);
  5653 + tcg_gen_movi_tl(cpu_T[1], 0x3 << cc);
  5654 + tcg_gen_and_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
  5655 + tcg_gen_brcondi_tl(TCG_COND_NE, cpu_T[0], 0, l1);
  5656 + tcg_gen_movi_tl(cpu_T[0], 0);
  5657 + tcg_gen_br(l2);
  5658 + gen_set_label(l1);
  5659 + tcg_gen_movi_tl(cpu_T[0], 1);
  5660 + gen_set_label(l2);
  5661 + }
5564 opn = "bc1any2f"; 5662 opn = "bc1any2f";
5565 goto not_likely; 5663 goto not_likely;
5566 case OPC_BC1TANY2: 5664 case OPC_BC1TANY2:
5567 - gen_op_bc1any2t(cc); 5665 + {
  5666 + int l1 = gen_new_label();
  5667 + int l2 = gen_new_label();
  5668 + TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);
  5669 +
  5670 + get_fp_cond(r_tmp1);
  5671 + tcg_gen_ext_i32_tl(cpu_T[0], r_tmp1);
  5672 + tcg_temp_free(r_tmp1);
  5673 + tcg_gen_movi_tl(cpu_T[1], 0x3 << cc);
  5674 + tcg_gen_and_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
  5675 + tcg_gen_brcondi_tl(TCG_COND_NE, cpu_T[0], 0, l1);
  5676 + tcg_gen_movi_tl(cpu_T[0], 0);
  5677 + tcg_gen_br(l2);
  5678 + gen_set_label(l1);
  5679 + tcg_gen_movi_tl(cpu_T[0], 1);
  5680 + gen_set_label(l2);
  5681 + }
5568 opn = "bc1any2t"; 5682 opn = "bc1any2t";
5569 goto not_likely; 5683 goto not_likely;
5570 case OPC_BC1FANY4: 5684 case OPC_BC1FANY4:
5571 - gen_op_bc1any4f(cc); 5685 + {
  5686 + int l1 = gen_new_label();
  5687 + int l2 = gen_new_label();
  5688 + TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);
  5689 +
  5690 + get_fp_cond(r_tmp1);
  5691 + tcg_gen_ext_i32_tl(cpu_T[0], r_tmp1);
  5692 + tcg_temp_free(r_tmp1);
  5693 + tcg_gen_not_tl(cpu_T[0], cpu_T[0]);
  5694 + tcg_gen_movi_tl(cpu_T[1], 0xf << cc);
  5695 + tcg_gen_and_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
  5696 + tcg_gen_brcondi_tl(TCG_COND_NE, cpu_T[0], 0, l1);
  5697 + tcg_gen_movi_tl(cpu_T[0], 0);
  5698 + tcg_gen_br(l2);
  5699 + gen_set_label(l1);
  5700 + tcg_gen_movi_tl(cpu_T[0], 1);
  5701 + gen_set_label(l2);
  5702 + }
5572 opn = "bc1any4f"; 5703 opn = "bc1any4f";
5573 goto not_likely; 5704 goto not_likely;
5574 case OPC_BC1TANY4: 5705 case OPC_BC1TANY4:
5575 - gen_op_bc1any4t(cc); 5706 + {
  5707 + int l1 = gen_new_label();
  5708 + int l2 = gen_new_label();
  5709 + TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);
  5710 +
  5711 + get_fp_cond(r_tmp1);
  5712 + tcg_gen_ext_i32_tl(cpu_T[0], r_tmp1);
  5713 + tcg_temp_free(r_tmp1);
  5714 + tcg_gen_movi_tl(cpu_T[1], 0xf << cc);
  5715 + tcg_gen_and_tl(cpu_T[0], cpu_T[0], cpu_T[1]);
  5716 + tcg_gen_brcondi_tl(TCG_COND_NE, cpu_T[0], 0, l1);
  5717 + tcg_gen_movi_tl(cpu_T[0], 0);
  5718 + tcg_gen_br(l2);
  5719 + gen_set_label(l1);
  5720 + tcg_gen_movi_tl(cpu_T[0], 1);
  5721 + gen_set_label(l2);
  5722 + }
5576 opn = "bc1any4t"; 5723 opn = "bc1any4t";
5577 not_likely: 5724 not_likely:
5578 ctx->hflags |= MIPS_HFLAG_BC; 5725 ctx->hflags |= MIPS_HFLAG_BC;
@@ -5685,23 +5832,83 @@ static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf) @@ -5685,23 +5832,83 @@ static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf)
5685 gen_store_gpr(cpu_T[0], rd); 5832 gen_store_gpr(cpu_T[0], rd);
5686 } 5833 }
5687 5834
5688 -#define GEN_MOVCF(fmt) \  
5689 -static void glue(gen_movcf_, fmt) (DisasContext *ctx, int cc, int tf) \  
5690 -{ \  
5691 - uint32_t ccbit; \  
5692 - \  
5693 - if (cc) { \  
5694 - ccbit = 1 << (24 + cc); \  
5695 - } else \  
5696 - ccbit = 1 << 23; \  
5697 - if (!tf) \  
5698 - glue(gen_op_float_movf_, fmt)(ccbit); \  
5699 - else \  
5700 - glue(gen_op_float_movt_, fmt)(ccbit); \ 5835 +static inline void gen_movcf_s (int cc, int tf)
  5836 +{
  5837 + uint32_t ccbit;
  5838 + int cond;
  5839 + TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);
  5840 + int l1 = gen_new_label();
  5841 +
  5842 + if (cc)
  5843 + ccbit = 1 << (24 + cc);
  5844 + else
  5845 + ccbit = 1 << 23;
  5846 +
  5847 + if (tf)
  5848 + cond = TCG_COND_EQ;
  5849 + else
  5850 + cond = TCG_COND_NE;
  5851 +
  5852 + tcg_gen_ld_i32(r_tmp1, current_fpu, offsetof(CPUMIPSFPUContext, fcr31));
  5853 + tcg_gen_andi_i32(r_tmp1, r_tmp1, ccbit);
  5854 + tcg_gen_brcondi_i32(cond, r_tmp1, 0, l1);
  5855 + tcg_gen_movi_i32(fpu32_T[2], fpu32_T[0]);
  5856 + gen_set_label(l1);
  5857 + tcg_temp_free(r_tmp1);
5701 } 5858 }
5702 -GEN_MOVCF(d);  
5703 -GEN_MOVCF(s);  
5704 -#undef GEN_MOVCF 5859 +
  5860 +static inline void gen_movcf_d (int cc, int tf)
  5861 +{
  5862 + uint32_t ccbit;
  5863 + int cond;
  5864 + TCGv r_tmp1 = tcg_temp_new(TCG_TYPE_I32);
  5865 + int l1 = gen_new_label();
  5866 +
  5867 + if (cc)
  5868 + ccbit = 1 << (24 + cc);
  5869 + else
  5870 + ccbit = 1 << 23;
  5871 +
  5872 + if (tf)
  5873 + cond = TCG_COND_EQ;
  5874 + else
  5875 + cond = TCG_COND_NE;
  5876 +
  5877 + tcg_gen_ld_i32(r_tmp1, current_fpu, offsetof(CPUMIPSFPUContext, fcr31));
  5878 + tcg_gen_andi_i32(r_tmp1, r_tmp1, ccbit);
  5879 + tcg_gen_brcondi_i32(cond, r_tmp1, 0, l1);
  5880 + tcg_gen_movi_i64(fpu64_T[2], fpu64_T[0]);
  5881 + gen_set_label(l1);
  5882 + tcg_temp_free(r_tmp1);
  5883 +}
  5884 +
  5885 +static inline void gen_movcf_ps (int cc, int tf)
  5886 +{
  5887 + int cond;
  5888 + TCGv r_tmp1 = tcg_temp_local_new(TCG_TYPE_I32);
  5889 + TCGv r_tmp2 = tcg_temp_local_new(TCG_TYPE_I32);
  5890 + int l1 = gen_new_label();
  5891 + int l2 = gen_new_label();
  5892 +
  5893 + if (tf)
  5894 + cond = TCG_COND_EQ;
  5895 + else
  5896 + cond = TCG_COND_NE;
  5897 +
  5898 + get_fp_cond(r_tmp1);
  5899 + tcg_gen_shri_i32(r_tmp1, r_tmp1, cc);
  5900 + tcg_gen_andi_i32(r_tmp2, r_tmp1, 0x1);
  5901 + tcg_gen_brcondi_i32(cond, r_tmp2, 0, l1);
  5902 + tcg_gen_movi_i32(fpu32_T[2], fpu32_T[0]);
  5903 + gen_set_label(l1);
  5904 + tcg_gen_andi_i32(r_tmp2, r_tmp1, 0x2);
  5905 + tcg_gen_brcondi_i32(cond, r_tmp2, 0, l2);
  5906 + tcg_gen_movi_i32(fpu32h_T[2], fpu32h_T[0]);
  5907 + gen_set_label(l2);
  5908 + tcg_temp_free(r_tmp1);
  5909 + tcg_temp_free(r_tmp2);
  5910 +}
  5911 +
5705 5912
5706 static void gen_farith (DisasContext *ctx, uint32_t op1, 5913 static void gen_farith (DisasContext *ctx, uint32_t op1,
5707 int ft, int fs, int fd, int cc) 5914 int ft, int fs, int fd, int cc)
@@ -5781,13 +5988,13 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, @@ -5781,13 +5988,13 @@ static void gen_farith (DisasContext *ctx, uint32_t op1,
5781 break; 5988 break;
5782 case FOP(4, 16): 5989 case FOP(4, 16):
5783 gen_load_fpr32(fpu32_T[0], fs); 5990 gen_load_fpr32(fpu32_T[0], fs);
5784 - gen_op_float_sqrt_s(); 5991 + tcg_gen_helper_0_0(do_float_sqrt_s);
5785 gen_store_fpr32(fpu32_T[2], fd); 5992 gen_store_fpr32(fpu32_T[2], fd);
5786 opn = "sqrt.s"; 5993 opn = "sqrt.s";
5787 break; 5994 break;
5788 case FOP(5, 16): 5995 case FOP(5, 16):
5789 gen_load_fpr32(fpu32_T[0], fs); 5996 gen_load_fpr32(fpu32_T[0], fs);
5790 - gen_op_float_abs_s(); 5997 + tcg_gen_helper_0_0(do_float_abs_s);
5791 gen_store_fpr32(fpu32_T[2], fd); 5998 gen_store_fpr32(fpu32_T[2], fd);
5792 opn = "abs.s"; 5999 opn = "abs.s";
5793 break; 6000 break;
@@ -5798,7 +6005,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, @@ -5798,7 +6005,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1,
5798 break; 6005 break;
5799 case FOP(7, 16): 6006 case FOP(7, 16):
5800 gen_load_fpr32(fpu32_T[0], fs); 6007 gen_load_fpr32(fpu32_T[0], fs);
5801 - gen_op_float_chs_s(); 6008 + tcg_gen_helper_0_0(do_float_chs_s);
5802 gen_store_fpr32(fpu32_T[2], fd); 6009 gen_store_fpr32(fpu32_T[2], fd);
5803 opn = "neg.s"; 6010 opn = "neg.s";
5804 break; 6011 break;
@@ -5855,10 +6062,9 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, @@ -5855,10 +6062,9 @@ static void gen_farith (DisasContext *ctx, uint32_t op1,
5855 opn = "floor.w.s"; 6062 opn = "floor.w.s";
5856 break; 6063 break;
5857 case FOP(17, 16): 6064 case FOP(17, 16):
5858 - gen_load_gpr(cpu_T[0], ft);  
5859 gen_load_fpr32(fpu32_T[0], fs); 6065 gen_load_fpr32(fpu32_T[0], fs);
5860 gen_load_fpr32(fpu32_T[2], fd); 6066 gen_load_fpr32(fpu32_T[2], fd);
5861 - gen_movcf_s(ctx, (ft >> 2) & 0x7, ft & 0x1); 6067 + gen_movcf_s((ft >> 2) & 0x7, ft & 0x1);
5862 gen_store_fpr32(fpu32_T[2], fd); 6068 gen_store_fpr32(fpu32_T[2], fd);
5863 opn = "movcf.s"; 6069 opn = "movcf.s";
5864 break; 6070 break;
@@ -5866,7 +6072,13 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, @@ -5866,7 +6072,13 @@ static void gen_farith (DisasContext *ctx, uint32_t op1,
5866 gen_load_gpr(cpu_T[0], ft); 6072 gen_load_gpr(cpu_T[0], ft);
5867 gen_load_fpr32(fpu32_T[0], fs); 6073 gen_load_fpr32(fpu32_T[0], fs);
5868 gen_load_fpr32(fpu32_T[2], fd); 6074 gen_load_fpr32(fpu32_T[2], fd);
5869 - gen_op_float_movz_s(); 6075 + {
  6076 + int l1 = gen_new_label();
  6077 +
  6078 + tcg_gen_brcondi_tl(TCG_COND_NE, cpu_T[0], 0, l1);
  6079 + tcg_gen_mov_i32(fpu32_T[2], fpu32_T[0]);
  6080 + gen_set_label(l1);
  6081 + }
5870 gen_store_fpr32(fpu32_T[2], fd); 6082 gen_store_fpr32(fpu32_T[2], fd);
5871 opn = "movz.s"; 6083 opn = "movz.s";
5872 break; 6084 break;
@@ -5874,7 +6086,13 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, @@ -5874,7 +6086,13 @@ static void gen_farith (DisasContext *ctx, uint32_t op1,
5874 gen_load_gpr(cpu_T[0], ft); 6086 gen_load_gpr(cpu_T[0], ft);
5875 gen_load_fpr32(fpu32_T[0], fs); 6087 gen_load_fpr32(fpu32_T[0], fs);
5876 gen_load_fpr32(fpu32_T[2], fd); 6088 gen_load_fpr32(fpu32_T[2], fd);
5877 - gen_op_float_movn_s(); 6089 + {
  6090 + int l1 = gen_new_label();
  6091 +
  6092 + tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_T[0], 0, l1);
  6093 + tcg_gen_mov_i32(fpu32_T[2], fpu32_T[0]);
  6094 + gen_set_label(l1);
  6095 + }
5878 gen_store_fpr32(fpu32_T[2], fd); 6096 gen_store_fpr32(fpu32_T[2], fd);
5879 opn = "movn.s"; 6097 opn = "movn.s";
5880 break; 6098 break;
@@ -6019,14 +6237,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, @@ -6019,14 +6237,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1,
6019 case FOP(4, 17): 6237 case FOP(4, 17):
6020 check_cp1_registers(ctx, fs | fd); 6238 check_cp1_registers(ctx, fs | fd);
6021 gen_load_fpr64(ctx, fpu64_T[0], fs); 6239 gen_load_fpr64(ctx, fpu64_T[0], fs);
6022 - gen_op_float_sqrt_d(); 6240 + tcg_gen_helper_0_0(do_float_sqrt_d);
6023 gen_store_fpr64(ctx, fpu64_T[2], fd); 6241 gen_store_fpr64(ctx, fpu64_T[2], fd);
6024 opn = "sqrt.d"; 6242 opn = "sqrt.d";
6025 break; 6243 break;
6026 case FOP(5, 17): 6244 case FOP(5, 17):
6027 check_cp1_registers(ctx, fs | fd); 6245 check_cp1_registers(ctx, fs | fd);
6028 gen_load_fpr64(ctx, fpu64_T[0], fs); 6246 gen_load_fpr64(ctx, fpu64_T[0], fs);
6029 - gen_op_float_abs_d(); 6247 + tcg_gen_helper_0_0(do_float_abs_d);
6030 gen_store_fpr64(ctx, fpu64_T[2], fd); 6248 gen_store_fpr64(ctx, fpu64_T[2], fd);
6031 opn = "abs.d"; 6249 opn = "abs.d";
6032 break; 6250 break;
@@ -6039,7 +6257,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, @@ -6039,7 +6257,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1,
6039 case FOP(7, 17): 6257 case FOP(7, 17):
6040 check_cp1_registers(ctx, fs | fd); 6258 check_cp1_registers(ctx, fs | fd);
6041 gen_load_fpr64(ctx, fpu64_T[0], fs); 6259 gen_load_fpr64(ctx, fpu64_T[0], fs);
6042 - gen_op_float_chs_d(); 6260 + tcg_gen_helper_0_0(do_float_chs_d);
6043 gen_store_fpr64(ctx, fpu64_T[2], fd); 6261 gen_store_fpr64(ctx, fpu64_T[2], fd);
6044 opn = "neg.d"; 6262 opn = "neg.d";
6045 break; 6263 break;
@@ -6100,10 +6318,9 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, @@ -6100,10 +6318,9 @@ static void gen_farith (DisasContext *ctx, uint32_t op1,
6100 opn = "floor.w.d"; 6318 opn = "floor.w.d";
6101 break; 6319 break;
6102 case FOP(17, 17): 6320 case FOP(17, 17):
6103 - gen_load_gpr(cpu_T[0], ft);  
6104 gen_load_fpr64(ctx, fpu64_T[0], fs); 6321 gen_load_fpr64(ctx, fpu64_T[0], fs);
6105 gen_load_fpr64(ctx, fpu64_T[2], fd); 6322 gen_load_fpr64(ctx, fpu64_T[2], fd);
6106 - gen_movcf_d(ctx, (ft >> 2) & 0x7, ft & 0x1); 6323 + gen_movcf_d((ft >> 2) & 0x7, ft & 0x1);
6107 gen_store_fpr64(ctx, fpu64_T[2], fd); 6324 gen_store_fpr64(ctx, fpu64_T[2], fd);
6108 opn = "movcf.d"; 6325 opn = "movcf.d";
6109 break; 6326 break;
@@ -6111,7 +6328,13 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, @@ -6111,7 +6328,13 @@ static void gen_farith (DisasContext *ctx, uint32_t op1,
6111 gen_load_gpr(cpu_T[0], ft); 6328 gen_load_gpr(cpu_T[0], ft);
6112 gen_load_fpr64(ctx, fpu64_T[0], fs); 6329 gen_load_fpr64(ctx, fpu64_T[0], fs);
6113 gen_load_fpr64(ctx, fpu64_T[2], fd); 6330 gen_load_fpr64(ctx, fpu64_T[2], fd);
6114 - gen_op_float_movz_d(); 6331 + {
  6332 + int l1 = gen_new_label();
  6333 +
  6334 + tcg_gen_brcondi_tl(TCG_COND_NE, cpu_T[0], 0, l1);
  6335 + tcg_gen_mov_i64(fpu64_T[2], fpu64_T[0]);
  6336 + gen_set_label(l1);
  6337 + }
6115 gen_store_fpr64(ctx, fpu64_T[2], fd); 6338 gen_store_fpr64(ctx, fpu64_T[2], fd);
6116 opn = "movz.d"; 6339 opn = "movz.d";
6117 break; 6340 break;
@@ -6119,7 +6342,13 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, @@ -6119,7 +6342,13 @@ static void gen_farith (DisasContext *ctx, uint32_t op1,
6119 gen_load_gpr(cpu_T[0], ft); 6342 gen_load_gpr(cpu_T[0], ft);
6120 gen_load_fpr64(ctx, fpu64_T[0], fs); 6343 gen_load_fpr64(ctx, fpu64_T[0], fs);
6121 gen_load_fpr64(ctx, fpu64_T[2], fd); 6344 gen_load_fpr64(ctx, fpu64_T[2], fd);
6122 - gen_op_float_movn_d(); 6345 + {
  6346 + int l1 = gen_new_label();
  6347 +
  6348 + tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_T[0], 0, l1);
  6349 + tcg_gen_mov_i64(fpu64_T[2], fpu64_T[0]);
  6350 + gen_set_label(l1);
  6351 + }
6123 gen_store_fpr64(ctx, fpu64_T[2], fd); 6352 gen_store_fpr64(ctx, fpu64_T[2], fd);
6124 opn = "movn.d"; 6353 opn = "movn.d";
6125 break; 6354 break;
@@ -6290,7 +6519,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, @@ -6290,7 +6519,7 @@ static void gen_farith (DisasContext *ctx, uint32_t op1,
6290 check_cp1_64bitmode(ctx); 6519 check_cp1_64bitmode(ctx);
6291 gen_load_fpr32(fpu32_T[0], fs); 6520 gen_load_fpr32(fpu32_T[0], fs);
6292 gen_load_fpr32h(fpu32h_T[0], fs); 6521 gen_load_fpr32h(fpu32h_T[0], fs);
6293 - gen_op_float_abs_ps(); 6522 + tcg_gen_helper_0_0(do_float_abs_ps);
6294 gen_store_fpr32(fpu32_T[2], fd); 6523 gen_store_fpr32(fpu32_T[2], fd);
6295 gen_store_fpr32h(fpu32h_T[2], fd); 6524 gen_store_fpr32h(fpu32h_T[2], fd);
6296 opn = "abs.ps"; 6525 opn = "abs.ps";
@@ -6307,22 +6536,18 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, @@ -6307,22 +6536,18 @@ static void gen_farith (DisasContext *ctx, uint32_t op1,
6307 check_cp1_64bitmode(ctx); 6536 check_cp1_64bitmode(ctx);
6308 gen_load_fpr32(fpu32_T[0], fs); 6537 gen_load_fpr32(fpu32_T[0], fs);
6309 gen_load_fpr32h(fpu32h_T[0], fs); 6538 gen_load_fpr32h(fpu32h_T[0], fs);
6310 - gen_op_float_chs_ps(); 6539 + tcg_gen_helper_0_0(do_float_chs_ps);
6311 gen_store_fpr32(fpu32_T[2], fd); 6540 gen_store_fpr32(fpu32_T[2], fd);
6312 gen_store_fpr32h(fpu32h_T[2], fd); 6541 gen_store_fpr32h(fpu32h_T[2], fd);
6313 opn = "neg.ps"; 6542 opn = "neg.ps";
6314 break; 6543 break;
6315 case FOP(17, 22): 6544 case FOP(17, 22):
6316 check_cp1_64bitmode(ctx); 6545 check_cp1_64bitmode(ctx);
6317 - gen_load_gpr(cpu_T[0], ft);  
6318 gen_load_fpr32(fpu32_T[0], fs); 6546 gen_load_fpr32(fpu32_T[0], fs);
6319 gen_load_fpr32h(fpu32h_T[0], fs); 6547 gen_load_fpr32h(fpu32h_T[0], fs);
6320 gen_load_fpr32(fpu32_T[2], fd); 6548 gen_load_fpr32(fpu32_T[2], fd);
6321 gen_load_fpr32h(fpu32h_T[2], fd); 6549 gen_load_fpr32h(fpu32h_T[2], fd);
6322 - if (ft & 0x1)  
6323 - gen_op_float_movt_ps ((ft >> 2) & 0x7);  
6324 - else  
6325 - gen_op_float_movf_ps ((ft >> 2) & 0x7); 6550 + gen_movcf_ps((ft >> 2) & 0x7, ft & 0x1);
6326 gen_store_fpr32(fpu32_T[2], fd); 6551 gen_store_fpr32(fpu32_T[2], fd);
6327 gen_store_fpr32h(fpu32h_T[2], fd); 6552 gen_store_fpr32h(fpu32h_T[2], fd);
6328 opn = "movcf.ps"; 6553 opn = "movcf.ps";
@@ -6334,7 +6559,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, @@ -6334,7 +6559,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1,
6334 gen_load_fpr32h(fpu32h_T[0], fs); 6559 gen_load_fpr32h(fpu32h_T[0], fs);
6335 gen_load_fpr32(fpu32_T[2], fd); 6560 gen_load_fpr32(fpu32_T[2], fd);
6336 gen_load_fpr32h(fpu32h_T[2], fd); 6561 gen_load_fpr32h(fpu32h_T[2], fd);
6337 - gen_op_float_movz_ps(); 6562 + {
  6563 + int l1 = gen_new_label();
  6564 +
  6565 + tcg_gen_brcondi_tl(TCG_COND_NE, cpu_T[0], 0, l1);
  6566 + tcg_gen_mov_i32(fpu32_T[2], fpu32_T[0]);
  6567 + tcg_gen_mov_i32(fpu32h_T[2], fpu32h_T[0]);
  6568 + gen_set_label(l1);
  6569 + }
6338 gen_store_fpr32(fpu32_T[2], fd); 6570 gen_store_fpr32(fpu32_T[2], fd);
6339 gen_store_fpr32h(fpu32h_T[2], fd); 6571 gen_store_fpr32h(fpu32h_T[2], fd);
6340 opn = "movz.ps"; 6572 opn = "movz.ps";
@@ -6346,7 +6578,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, @@ -6346,7 +6578,14 @@ static void gen_farith (DisasContext *ctx, uint32_t op1,
6346 gen_load_fpr32h(fpu32h_T[0], fs); 6578 gen_load_fpr32h(fpu32h_T[0], fs);
6347 gen_load_fpr32(fpu32_T[2], fd); 6579 gen_load_fpr32(fpu32_T[2], fd);
6348 gen_load_fpr32h(fpu32h_T[2], fd); 6580 gen_load_fpr32h(fpu32h_T[2], fd);
6349 - gen_op_float_movn_ps(); 6581 + {
  6582 + int l1 = gen_new_label();
  6583 +
  6584 + tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_T[0], 0, l1);
  6585 + tcg_gen_mov_i32(fpu32_T[2], fpu32_T[0]);
  6586 + tcg_gen_mov_i32(fpu32h_T[2], fpu32h_T[0]);
  6587 + gen_set_label(l1);
  6588 + }
6350 gen_store_fpr32(fpu32_T[2], fd); 6589 gen_store_fpr32(fpu32_T[2], fd);
6351 gen_store_fpr32h(fpu32h_T[2], fd); 6590 gen_store_fpr32h(fpu32h_T[2], fd);
6352 opn = "movn.ps"; 6591 opn = "movn.ps";
@@ -6440,32 +6679,32 @@ static void gen_farith (DisasContext *ctx, uint32_t op1, @@ -6440,32 +6679,32 @@ static void gen_farith (DisasContext *ctx, uint32_t op1,
6440 check_cp1_64bitmode(ctx); 6679 check_cp1_64bitmode(ctx);
6441 gen_load_fpr32(fpu32_T[0], fs); 6680 gen_load_fpr32(fpu32_T[0], fs);
6442 gen_load_fpr32(fpu32_T[1], ft); 6681 gen_load_fpr32(fpu32_T[1], ft);
6443 - gen_op_float_pll_ps();  
6444 - gen_store_fpr64(ctx, fpu64_T[2], fd); 6682 + gen_store_fpr32h(fpu32_T[0], fd);
  6683 + gen_store_fpr32(fpu32_T[1], fd);
6445 opn = "pll.ps"; 6684 opn = "pll.ps";
6446 break; 6685 break;
6447 case FOP(45, 22): 6686 case FOP(45, 22):
6448 check_cp1_64bitmode(ctx); 6687 check_cp1_64bitmode(ctx);
6449 gen_load_fpr32(fpu32_T[0], fs); 6688 gen_load_fpr32(fpu32_T[0], fs);
6450 gen_load_fpr32h(fpu32h_T[1], ft); 6689 gen_load_fpr32h(fpu32h_T[1], ft);
6451 - gen_op_float_plu_ps();  
6452 - gen_store_fpr64(ctx, fpu64_T[2], fd); 6690 + gen_store_fpr32(fpu32h_T[1], fd);
  6691 + gen_store_fpr32h(fpu32_T[0], fd);
6453 opn = "plu.ps"; 6692 opn = "plu.ps";
6454 break; 6693 break;
6455 case FOP(46, 22): 6694 case FOP(46, 22):
6456 check_cp1_64bitmode(ctx); 6695 check_cp1_64bitmode(ctx);
6457 gen_load_fpr32h(fpu32h_T[0], fs); 6696 gen_load_fpr32h(fpu32h_T[0], fs);
6458 gen_load_fpr32(fpu32_T[1], ft); 6697 gen_load_fpr32(fpu32_T[1], ft);
6459 - gen_op_float_pul_ps();  
6460 - gen_store_fpr64(ctx, fpu64_T[2], fd); 6698 + gen_store_fpr32(fpu32_T[1], fd);
  6699 + gen_store_fpr32h(fpu32h_T[0], fd);
6461 opn = "pul.ps"; 6700 opn = "pul.ps";
6462 break; 6701 break;
6463 case FOP(47, 22): 6702 case FOP(47, 22):
6464 check_cp1_64bitmode(ctx); 6703 check_cp1_64bitmode(ctx);
6465 gen_load_fpr32h(fpu32h_T[0], fs); 6704 gen_load_fpr32h(fpu32h_T[0], fs);
6466 gen_load_fpr32h(fpu32h_T[1], ft); 6705 gen_load_fpr32h(fpu32h_T[1], ft);
6467 - gen_op_float_puu_ps();  
6468 - gen_store_fpr64(ctx, fpu64_T[2], fd); 6706 + gen_store_fpr32(fpu32h_T[1], fd);
  6707 + gen_store_fpr32h(fpu32h_T[0], fd);
6469 opn = "puu.ps"; 6708 opn = "puu.ps";
6470 break; 6709 break;
6471 case FOP(48, 22): 6710 case FOP(48, 22):
@@ -6595,10 +6834,32 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, @@ -6595,10 +6834,32 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
6595 case OPC_ALNV_PS: 6834 case OPC_ALNV_PS:
6596 check_cp1_64bitmode(ctx); 6835 check_cp1_64bitmode(ctx);
6597 gen_load_gpr(cpu_T[0], fr); 6836 gen_load_gpr(cpu_T[0], fr);
6598 - gen_load_fpr64(ctx, fpu64_T[0], fs);  
6599 - gen_load_fpr64(ctx, fpu64_T[1], ft);  
6600 - gen_op_float_alnv_ps();  
6601 - gen_store_fpr64(ctx, fpu64_T[2], fd); 6837 + tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 0x7);
  6838 + gen_load_fpr32(fpu32_T[0], fs);
  6839 + gen_load_fpr32h(fpu32h_T[0], fs);
  6840 + gen_load_fpr32(fpu32_T[1], ft);
  6841 + gen_load_fpr32h(fpu32h_T[1], ft);
  6842 + {
  6843 + int l1 = gen_new_label();
  6844 + int l2 = gen_new_label();
  6845 +
  6846 + tcg_gen_brcondi_tl(TCG_COND_NE, cpu_T[0], 0, l1);
  6847 + tcg_gen_mov_i32(fpu32_T[2], fpu32_T[0]);
  6848 + tcg_gen_mov_i32(fpu32h_T[2], fpu32h_T[0]);
  6849 + tcg_gen_br(l2);
  6850 + gen_set_label(l1);
  6851 + tcg_gen_brcondi_tl(TCG_COND_NE, cpu_T[0], 4, l2);
  6852 +#ifdef TARGET_WORDS_BIGENDIAN
  6853 + tcg_gen_mov_i32(fpu32h_T[2], fpu32_T[0]);
  6854 + tcg_gen_mov_i32(fpu32_T[2], fpu32h_T[1]);
  6855 +#else
  6856 + tcg_gen_mov_i32(fpu32h_T[2], fpu32_T[1]);
  6857 + tcg_gen_mov_i32(fpu32_T[2], fpu32h_T[0]);
  6858 +#endif
  6859 + gen_set_label(l2);
  6860 + }
  6861 + gen_store_fpr32(fpu32_T[2], fd);
  6862 + gen_store_fpr32h(fpu32h_T[2], fd);
6602 opn = "alnv.ps"; 6863 opn = "alnv.ps";
6603 break; 6864 break;
6604 case OPC_MADD_S: 6865 case OPC_MADD_S:
@@ -6606,7 +6867,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, @@ -6606,7 +6867,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
6606 gen_load_fpr32(fpu32_T[0], fs); 6867 gen_load_fpr32(fpu32_T[0], fs);
6607 gen_load_fpr32(fpu32_T[1], ft); 6868 gen_load_fpr32(fpu32_T[1], ft);
6608 gen_load_fpr32(fpu32_T[2], fr); 6869 gen_load_fpr32(fpu32_T[2], fr);
6609 - gen_op_float_muladd_s(); 6870 + tcg_gen_helper_0_0(do_float_muladd_s);
6610 gen_store_fpr32(fpu32_T[2], fd); 6871 gen_store_fpr32(fpu32_T[2], fd);
6611 opn = "madd.s"; 6872 opn = "madd.s";
6612 break; 6873 break;
@@ -6616,7 +6877,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, @@ -6616,7 +6877,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
6616 gen_load_fpr64(ctx, fpu64_T[0], fs); 6877 gen_load_fpr64(ctx, fpu64_T[0], fs);
6617 gen_load_fpr64(ctx, fpu64_T[1], ft); 6878 gen_load_fpr64(ctx, fpu64_T[1], ft);
6618 gen_load_fpr64(ctx, fpu64_T[2], fr); 6879 gen_load_fpr64(ctx, fpu64_T[2], fr);
6619 - gen_op_float_muladd_d(); 6880 + tcg_gen_helper_0_0(do_float_muladd_d);
6620 gen_store_fpr64(ctx, fpu64_T[2], fd); 6881 gen_store_fpr64(ctx, fpu64_T[2], fd);
6621 opn = "madd.d"; 6882 opn = "madd.d";
6622 break; 6883 break;
@@ -6628,7 +6889,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, @@ -6628,7 +6889,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
6628 gen_load_fpr32h(fpu32h_T[1], ft); 6889 gen_load_fpr32h(fpu32h_T[1], ft);
6629 gen_load_fpr32(fpu32_T[2], fr); 6890 gen_load_fpr32(fpu32_T[2], fr);
6630 gen_load_fpr32h(fpu32h_T[2], fr); 6891 gen_load_fpr32h(fpu32h_T[2], fr);
6631 - gen_op_float_muladd_ps(); 6892 + tcg_gen_helper_0_0(do_float_muladd_ps);
6632 gen_store_fpr32(fpu32_T[2], fd); 6893 gen_store_fpr32(fpu32_T[2], fd);
6633 gen_store_fpr32h(fpu32h_T[2], fd); 6894 gen_store_fpr32h(fpu32h_T[2], fd);
6634 opn = "madd.ps"; 6895 opn = "madd.ps";
@@ -6638,7 +6899,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, @@ -6638,7 +6899,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
6638 gen_load_fpr32(fpu32_T[0], fs); 6899 gen_load_fpr32(fpu32_T[0], fs);
6639 gen_load_fpr32(fpu32_T[1], ft); 6900 gen_load_fpr32(fpu32_T[1], ft);
6640 gen_load_fpr32(fpu32_T[2], fr); 6901 gen_load_fpr32(fpu32_T[2], fr);
6641 - gen_op_float_mulsub_s(); 6902 + tcg_gen_helper_0_0(do_float_mulsub_s);
6642 gen_store_fpr32(fpu32_T[2], fd); 6903 gen_store_fpr32(fpu32_T[2], fd);
6643 opn = "msub.s"; 6904 opn = "msub.s";
6644 break; 6905 break;
@@ -6648,7 +6909,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, @@ -6648,7 +6909,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
6648 gen_load_fpr64(ctx, fpu64_T[0], fs); 6909 gen_load_fpr64(ctx, fpu64_T[0], fs);
6649 gen_load_fpr64(ctx, fpu64_T[1], ft); 6910 gen_load_fpr64(ctx, fpu64_T[1], ft);
6650 gen_load_fpr64(ctx, fpu64_T[2], fr); 6911 gen_load_fpr64(ctx, fpu64_T[2], fr);
6651 - gen_op_float_mulsub_d(); 6912 + tcg_gen_helper_0_0(do_float_mulsub_d);
6652 gen_store_fpr64(ctx, fpu64_T[2], fd); 6913 gen_store_fpr64(ctx, fpu64_T[2], fd);
6653 opn = "msub.d"; 6914 opn = "msub.d";
6654 break; 6915 break;
@@ -6660,7 +6921,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, @@ -6660,7 +6921,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
6660 gen_load_fpr32h(fpu32h_T[1], ft); 6921 gen_load_fpr32h(fpu32h_T[1], ft);
6661 gen_load_fpr32(fpu32_T[2], fr); 6922 gen_load_fpr32(fpu32_T[2], fr);
6662 gen_load_fpr32h(fpu32h_T[2], fr); 6923 gen_load_fpr32h(fpu32h_T[2], fr);
6663 - gen_op_float_mulsub_ps(); 6924 + tcg_gen_helper_0_0(do_float_mulsub_ps);
6664 gen_store_fpr32(fpu32_T[2], fd); 6925 gen_store_fpr32(fpu32_T[2], fd);
6665 gen_store_fpr32h(fpu32h_T[2], fd); 6926 gen_store_fpr32h(fpu32h_T[2], fd);
6666 opn = "msub.ps"; 6927 opn = "msub.ps";
@@ -6670,7 +6931,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, @@ -6670,7 +6931,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
6670 gen_load_fpr32(fpu32_T[0], fs); 6931 gen_load_fpr32(fpu32_T[0], fs);
6671 gen_load_fpr32(fpu32_T[1], ft); 6932 gen_load_fpr32(fpu32_T[1], ft);
6672 gen_load_fpr32(fpu32_T[2], fr); 6933 gen_load_fpr32(fpu32_T[2], fr);
6673 - gen_op_float_nmuladd_s(); 6934 + tcg_gen_helper_0_0(do_float_nmuladd_s);
6674 gen_store_fpr32(fpu32_T[2], fd); 6935 gen_store_fpr32(fpu32_T[2], fd);
6675 opn = "nmadd.s"; 6936 opn = "nmadd.s";
6676 break; 6937 break;
@@ -6680,7 +6941,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, @@ -6680,7 +6941,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
6680 gen_load_fpr64(ctx, fpu64_T[0], fs); 6941 gen_load_fpr64(ctx, fpu64_T[0], fs);
6681 gen_load_fpr64(ctx, fpu64_T[1], ft); 6942 gen_load_fpr64(ctx, fpu64_T[1], ft);
6682 gen_load_fpr64(ctx, fpu64_T[2], fr); 6943 gen_load_fpr64(ctx, fpu64_T[2], fr);
6683 - gen_op_float_nmuladd_d(); 6944 + tcg_gen_helper_0_0(do_float_nmuladd_d);
6684 gen_store_fpr64(ctx, fpu64_T[2], fd); 6945 gen_store_fpr64(ctx, fpu64_T[2], fd);
6685 opn = "nmadd.d"; 6946 opn = "nmadd.d";
6686 break; 6947 break;
@@ -6692,7 +6953,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, @@ -6692,7 +6953,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
6692 gen_load_fpr32h(fpu32h_T[1], ft); 6953 gen_load_fpr32h(fpu32h_T[1], ft);
6693 gen_load_fpr32(fpu32_T[2], fr); 6954 gen_load_fpr32(fpu32_T[2], fr);
6694 gen_load_fpr32h(fpu32h_T[2], fr); 6955 gen_load_fpr32h(fpu32h_T[2], fr);
6695 - gen_op_float_nmuladd_ps(); 6956 + tcg_gen_helper_0_0(do_float_nmuladd_ps);
6696 gen_store_fpr32(fpu32_T[2], fd); 6957 gen_store_fpr32(fpu32_T[2], fd);
6697 gen_store_fpr32h(fpu32h_T[2], fd); 6958 gen_store_fpr32h(fpu32h_T[2], fd);
6698 opn = "nmadd.ps"; 6959 opn = "nmadd.ps";
@@ -6702,7 +6963,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, @@ -6702,7 +6963,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
6702 gen_load_fpr32(fpu32_T[0], fs); 6963 gen_load_fpr32(fpu32_T[0], fs);
6703 gen_load_fpr32(fpu32_T[1], ft); 6964 gen_load_fpr32(fpu32_T[1], ft);
6704 gen_load_fpr32(fpu32_T[2], fr); 6965 gen_load_fpr32(fpu32_T[2], fr);
6705 - gen_op_float_nmulsub_s(); 6966 + tcg_gen_helper_0_0(do_float_nmulsub_s);
6706 gen_store_fpr32(fpu32_T[2], fd); 6967 gen_store_fpr32(fpu32_T[2], fd);
6707 opn = "nmsub.s"; 6968 opn = "nmsub.s";
6708 break; 6969 break;
@@ -6712,7 +6973,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, @@ -6712,7 +6973,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
6712 gen_load_fpr64(ctx, fpu64_T[0], fs); 6973 gen_load_fpr64(ctx, fpu64_T[0], fs);
6713 gen_load_fpr64(ctx, fpu64_T[1], ft); 6974 gen_load_fpr64(ctx, fpu64_T[1], ft);
6714 gen_load_fpr64(ctx, fpu64_T[2], fr); 6975 gen_load_fpr64(ctx, fpu64_T[2], fr);
6715 - gen_op_float_nmulsub_d(); 6976 + tcg_gen_helper_0_0(do_float_nmulsub_d);
6716 gen_store_fpr64(ctx, fpu64_T[2], fd); 6977 gen_store_fpr64(ctx, fpu64_T[2], fd);
6717 opn = "nmsub.d"; 6978 opn = "nmsub.d";
6718 break; 6979 break;
@@ -6724,7 +6985,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc, @@ -6724,7 +6985,7 @@ static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
6724 gen_load_fpr32h(fpu32h_T[1], ft); 6985 gen_load_fpr32h(fpu32h_T[1], ft);
6725 gen_load_fpr32(fpu32_T[2], fr); 6986 gen_load_fpr32(fpu32_T[2], fr);
6726 gen_load_fpr32h(fpu32h_T[2], fr); 6987 gen_load_fpr32h(fpu32h_T[2], fr);
6727 - gen_op_float_nmulsub_ps(); 6988 + tcg_gen_helper_0_0(do_float_nmulsub_ps);
6728 gen_store_fpr32(fpu32_T[2], fd); 6989 gen_store_fpr32(fpu32_T[2], fd);
6729 gen_store_fpr32h(fpu32h_T[2], fd); 6990 gen_store_fpr32h(fpu32h_T[2], fd);
6730 opn = "nmsub.ps"; 6991 opn = "nmsub.ps";