Commit a16336e4792c4f092bd2fdcd20c9d70c979b2b22
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
Showing
4 changed files
with
426 additions
and
363 deletions
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"; |