Revision 2fdbad25
b/target-mips/translate.c | ||
---|---|---|
427 | 427 |
|
428 | 428 |
#include "gen-icount.h" |
429 | 429 |
|
430 |
static inline void tcg_gen_helper_0_i(void *func, TCGv arg) |
|
430 |
static inline void tcg_gen_helper_0_i(void *func, uint32_t arg) |
|
431 |
|
|
431 | 432 |
{ |
432 | 433 |
TCGv tmp = tcg_const_i32(arg); |
433 | 434 |
|
... | ... | |
435 | 436 |
tcg_temp_free(tmp); |
436 | 437 |
} |
437 | 438 |
|
438 |
static inline void tcg_gen_helper_0_ii(void *func, TCGv arg1, TCGv arg2)
|
|
439 |
static inline void tcg_gen_helper_0_ii(void *func, uint32_t arg1, uint32_t arg2)
|
|
439 | 440 |
{ |
440 | 441 |
TCGv tmp1 = tcg_const_i32(arg1); |
441 | 442 |
TCGv tmp2 = tcg_const_i32(arg2); |
... | ... | |
445 | 446 |
tcg_temp_free(tmp2); |
446 | 447 |
} |
447 | 448 |
|
448 |
static inline void tcg_gen_helper_0_1i(void *func, TCGv arg1, TCGv arg2)
|
|
449 |
static inline void tcg_gen_helper_0_1i(void *func, TCGv arg1, uint32_t arg2)
|
|
449 | 450 |
{ |
450 | 451 |
TCGv tmp = tcg_const_i32(arg2); |
451 | 452 |
|
... | ... | |
453 | 454 |
tcg_temp_free(tmp); |
454 | 455 |
} |
455 | 456 |
|
456 |
static inline void tcg_gen_helper_0_2i(void *func, TCGv arg1, TCGv arg2, TCGv arg3)
|
|
457 |
static inline void tcg_gen_helper_0_2i(void *func, TCGv arg1, TCGv arg2, uint32_t arg3)
|
|
457 | 458 |
{ |
458 | 459 |
TCGv tmp = tcg_const_i32(arg3); |
459 | 460 |
|
... | ... | |
461 | 462 |
tcg_temp_free(tmp); |
462 | 463 |
} |
463 | 464 |
|
464 |
static inline void tcg_gen_helper_0_1ii(void *func, TCGv arg1, TCGv arg2, TCGv arg3)
|
|
465 |
static inline void tcg_gen_helper_0_1ii(void *func, TCGv arg1, uint32_t arg2, uint32_t arg3)
|
|
465 | 466 |
{ |
466 | 467 |
TCGv tmp1 = tcg_const_i32(arg2); |
467 | 468 |
TCGv tmp2 = tcg_const_i32(arg3); |
... | ... | |
471 | 472 |
tcg_temp_free(tmp2); |
472 | 473 |
} |
473 | 474 |
|
474 |
static inline void tcg_gen_helper_1_i(void *func, TCGv ret, TCGv arg)
|
|
475 |
static inline void tcg_gen_helper_1_i(void *func, TCGv ret, uint32_t arg)
|
|
475 | 476 |
{ |
476 | 477 |
TCGv tmp = tcg_const_i32(arg); |
477 | 478 |
|
... | ... | |
479 | 480 |
tcg_temp_free(tmp); |
480 | 481 |
} |
481 | 482 |
|
482 |
static inline void tcg_gen_helper_1_1i(void *func, TCGv ret, TCGv arg1, TCGv arg2)
|
|
483 |
static inline void tcg_gen_helper_1_1i(void *func, TCGv ret, TCGv arg1, uint32_t arg2)
|
|
483 | 484 |
{ |
484 | 485 |
TCGv tmp = tcg_const_i32(arg2); |
485 | 486 |
|
... | ... | |
487 | 488 |
tcg_temp_free(tmp); |
488 | 489 |
} |
489 | 490 |
|
490 |
static inline void tcg_gen_helper_1_1ii(void *func, TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3)
|
|
491 |
static inline void tcg_gen_helper_1_1ii(void *func, TCGv ret, TCGv arg1, uint32_t arg2, uint32_t arg3)
|
|
491 | 492 |
{ |
492 | 493 |
TCGv tmp1 = tcg_const_i32(arg2); |
493 | 494 |
TCGv tmp2 = tcg_const_i32(arg3); |
... | ... | |
497 | 498 |
tcg_temp_free(tmp2); |
498 | 499 |
} |
499 | 500 |
|
500 |
static inline void tcg_gen_helper_1_2i(void *func, TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3)
|
|
501 |
static inline void tcg_gen_helper_1_2i(void *func, TCGv ret, TCGv arg1, TCGv arg2, uint32_t arg3)
|
|
501 | 502 |
{ |
502 | 503 |
TCGv tmp = tcg_const_i32(arg3); |
503 | 504 |
|
... | ... | |
505 | 506 |
tcg_temp_free(tmp); |
506 | 507 |
} |
507 | 508 |
|
508 |
static inline void tcg_gen_helper_1_2ii(void *func, TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3, TCGv arg4)
|
|
509 |
static inline void tcg_gen_helper_1_2ii(void *func, TCGv ret, TCGv arg1, TCGv arg2, uint32_t arg3, uint32_t arg4)
|
|
509 | 510 |
{ |
510 | 511 |
TCGv tmp1 = tcg_const_i32(arg3); |
511 | 512 |
TCGv tmp2 = tcg_const_i32(arg4); |
... | ... | |
722 | 723 |
typedef void (fcmp_fun32)(uint32_t, uint32_t, int); |
723 | 724 |
typedef void (fcmp_fun64)(uint64_t, uint64_t, int); |
724 | 725 |
|
725 |
#define FOP_CONDS(fcmp_fun, type, arg0, arg1, fmt) \
|
|
726 |
#define FOP_CONDS(fcmp_fun, type, fmt) \
|
|
726 | 727 |
static fcmp_fun * fcmp ## type ## _ ## fmt ## _table[16] = { \ |
727 | 728 |
do_cmp ## type ## _ ## fmt ## _f, \ |
728 | 729 |
do_cmp ## type ## _ ## fmt ## _un, \ |
... | ... | |
741 | 742 |
do_cmp ## type ## _ ## fmt ## _le, \ |
742 | 743 |
do_cmp ## type ## _ ## fmt ## _ngt, \ |
743 | 744 |
}; \ |
744 |
static inline void gen_cmp ## type ## _ ## fmt(int n, arg0 a, arg1 b, int cc) \
|
|
745 |
static inline void gen_cmp ## type ## _ ## fmt(int n, TCGv a, TCGv b, int cc) \
|
|
745 | 746 |
{ \ |
746 | 747 |
tcg_gen_helper_0_2i(fcmp ## type ## _ ## fmt ## _table[n], a, b, cc); \ |
747 | 748 |
} |
748 | 749 |
|
749 |
FOP_CONDS(fcmp_fun64, , uint64_t, uint64_t, d)
|
|
750 |
FOP_CONDS(fcmp_fun64, abs, uint64_t, uint64_t, d)
|
|
751 |
FOP_CONDS(fcmp_fun32, , uint32_t, uint32_t, s)
|
|
752 |
FOP_CONDS(fcmp_fun32, abs, uint32_t, uint32_t, s)
|
|
753 |
FOP_CONDS(fcmp_fun64, , uint64_t, uint64_t, ps)
|
|
754 |
FOP_CONDS(fcmp_fun64, abs, uint64_t, uint64_t, ps)
|
|
750 |
FOP_CONDS(fcmp_fun64, , d) |
|
751 |
FOP_CONDS(fcmp_fun64, abs, d) |
|
752 |
FOP_CONDS(fcmp_fun32, , s) |
|
753 |
FOP_CONDS(fcmp_fun32, abs, s) |
|
754 |
FOP_CONDS(fcmp_fun64, , ps) |
|
755 |
FOP_CONDS(fcmp_fun64, abs, ps) |
|
755 | 756 |
#undef FOP_CONDS |
756 | 757 |
|
757 | 758 |
/* Tests */ |
... | ... | |
2498 | 2499 |
{ |
2499 | 2500 |
target_ulong btgt = -1; |
2500 | 2501 |
int blink = 0; |
2501 |
int bcond = 0; |
|
2502 |
int bcond_compute = 0;
|
|
2502 | 2503 |
TCGv t0 = tcg_temp_local_new(TCG_TYPE_TL); |
2503 | 2504 |
TCGv t1 = tcg_temp_local_new(TCG_TYPE_TL); |
2504 | 2505 |
|
... | ... | |
2524 | 2525 |
if (rs != rt) { |
2525 | 2526 |
gen_load_gpr(t0, rs); |
2526 | 2527 |
gen_load_gpr(t1, rt); |
2527 |
bcond = 1; |
|
2528 |
bcond_compute = 1;
|
|
2528 | 2529 |
} |
2529 | 2530 |
btgt = ctx->pc + 4 + offset; |
2530 | 2531 |
break; |
... | ... | |
2543 | 2544 |
/* Compare to zero */ |
2544 | 2545 |
if (rs != 0) { |
2545 | 2546 |
gen_load_gpr(t0, rs); |
2546 |
bcond = 1; |
|
2547 |
bcond_compute = 1;
|
|
2547 | 2548 |
} |
2548 | 2549 |
btgt = ctx->pc + 4 + offset; |
2549 | 2550 |
break; |
... | ... | |
2569 | 2570 |
generate_exception(ctx, EXCP_RI); |
2570 | 2571 |
goto out; |
2571 | 2572 |
} |
2572 |
if (bcond == 0) { |
|
2573 |
if (bcond_compute == 0) {
|
|
2573 | 2574 |
/* No condition to be computed */ |
2574 | 2575 |
switch (opc) { |
2575 | 2576 |
case OPC_BEQ: /* rx == rx */ |
... | ... | |
6045 | 6046 |
tcg_gen_ld_i32(r_tmp1, current_fpu, offsetof(CPUMIPSFPUContext, fcr31)); |
6046 | 6047 |
tcg_gen_andi_i32(r_tmp1, r_tmp1, ccbit); |
6047 | 6048 |
tcg_gen_brcondi_i32(cond, r_tmp1, 0, l1); |
6048 |
tcg_gen_movi_i32(fp1, fp0);
|
|
6049 |
tcg_gen_mov_i32(fp1, fp0); |
|
6049 | 6050 |
tcg_temp_free(fp0); |
6050 | 6051 |
gen_set_label(l1); |
6051 | 6052 |
tcg_temp_free(r_tmp1); |
... | ... | |
6077 | 6078 |
tcg_gen_ld_i32(r_tmp1, current_fpu, offsetof(CPUMIPSFPUContext, fcr31)); |
6078 | 6079 |
tcg_gen_andi_i32(r_tmp1, r_tmp1, ccbit); |
6079 | 6080 |
tcg_gen_brcondi_i32(cond, r_tmp1, 0, l1); |
6080 |
tcg_gen_movi_i64(fp1, fp0);
|
|
6081 |
tcg_gen_mov_i64(fp1, fp0); |
|
6081 | 6082 |
tcg_temp_free(fp0); |
6082 | 6083 |
gen_set_label(l1); |
6083 | 6084 |
tcg_temp_free(r_tmp1); |
... | ... | |
6110 | 6111 |
tcg_gen_shri_i32(r_tmp1, r_tmp1, cc); |
6111 | 6112 |
tcg_gen_andi_i32(r_tmp2, r_tmp1, 0x1); |
6112 | 6113 |
tcg_gen_brcondi_i32(cond, r_tmp2, 0, l1); |
6113 |
tcg_gen_movi_i32(fp1, fp0);
|
|
6114 |
tcg_gen_mov_i32(fp1, fp0); |
|
6114 | 6115 |
tcg_temp_free(fp0); |
6115 | 6116 |
gen_set_label(l1); |
6116 | 6117 |
tcg_gen_andi_i32(r_tmp2, r_tmp1, 0x2); |
6117 | 6118 |
tcg_gen_brcondi_i32(cond, r_tmp2, 0, l2); |
6118 |
tcg_gen_movi_i32(fph1, fph0);
|
|
6119 |
tcg_gen_mov_i32(fph1, fph0); |
|
6119 | 6120 |
tcg_temp_free(fph0); |
6120 | 6121 |
gen_set_label(l2); |
6121 | 6122 |
tcg_temp_free(r_tmp1); |
Also available in: Unified diff