Revision d94536f4
b/target-mips/translate.c | ||
---|---|---|
643 | 643 |
} |
644 | 644 |
} |
645 | 645 |
|
646 |
static inline void get_fp_cond (TCGv_i32 t)
|
|
646 |
static inline int get_fp_bit (int cc)
|
|
647 | 647 |
{ |
648 |
TCGv_i32 r_tmp1 = tcg_temp_new_i32(); |
|
649 |
TCGv_i32 r_tmp2 = tcg_temp_new_i32(); |
|
650 |
|
|
651 |
tcg_gen_shri_i32(r_tmp2, fpu_fcr31, 24); |
|
652 |
tcg_gen_andi_i32(r_tmp2, r_tmp2, 0xfe); |
|
653 |
tcg_gen_shri_i32(r_tmp1, fpu_fcr31, 23); |
|
654 |
tcg_gen_andi_i32(r_tmp1, r_tmp1, 0x1); |
|
655 |
tcg_gen_or_i32(t, r_tmp1, r_tmp2); |
|
656 |
tcg_temp_free_i32(r_tmp1); |
|
657 |
tcg_temp_free_i32(r_tmp2); |
|
648 |
if (cc) |
|
649 |
return 24 + cc; |
|
650 |
else |
|
651 |
return 23; |
|
658 | 652 |
} |
659 | 653 |
|
660 | 654 |
#define FOP_CONDS(type, fmt, bits) \ |
... | ... | |
5500 | 5494 |
|
5501 | 5495 |
switch (op) { |
5502 | 5496 |
case OPC_BC1F: |
5503 |
{ |
|
5504 |
int l1 = gen_new_label(); |
|
5505 |
int l2 = gen_new_label(); |
|
5506 |
|
|
5507 |
get_fp_cond(t0); |
|
5508 |
tcg_gen_andi_i32(t0, t0, 0x1 << cc); |
|
5509 |
tcg_gen_brcondi_i32(TCG_COND_EQ, t0, 0, l1); |
|
5510 |
tcg_gen_movi_tl(bcond, 0); |
|
5511 |
tcg_gen_br(l2); |
|
5512 |
gen_set_label(l1); |
|
5513 |
tcg_gen_movi_tl(bcond, 1); |
|
5514 |
gen_set_label(l2); |
|
5515 |
} |
|
5497 |
tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc)); |
|
5498 |
tcg_gen_not_i32(t0, t0); |
|
5499 |
tcg_gen_andi_i32(t0, t0, 1); |
|
5500 |
tcg_gen_extu_i32_tl(bcond, t0); |
|
5516 | 5501 |
opn = "bc1f"; |
5517 | 5502 |
goto not_likely; |
5518 | 5503 |
case OPC_BC1FL: |
5519 |
{ |
|
5520 |
int l1 = gen_new_label(); |
|
5521 |
int l2 = gen_new_label(); |
|
5522 |
|
|
5523 |
get_fp_cond(t0); |
|
5524 |
tcg_gen_andi_i32(t0, t0, 0x1 << cc); |
|
5525 |
tcg_gen_brcondi_i32(TCG_COND_EQ, t0, 0, l1); |
|
5526 |
tcg_gen_movi_tl(bcond, 0); |
|
5527 |
tcg_gen_br(l2); |
|
5528 |
gen_set_label(l1); |
|
5529 |
tcg_gen_movi_tl(bcond, 1); |
|
5530 |
gen_set_label(l2); |
|
5531 |
} |
|
5504 |
tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc)); |
|
5505 |
tcg_gen_not_i32(t0, t0); |
|
5506 |
tcg_gen_andi_i32(t0, t0, 1); |
|
5507 |
tcg_gen_extu_i32_tl(bcond, t0); |
|
5532 | 5508 |
opn = "bc1fl"; |
5533 | 5509 |
goto likely; |
5534 | 5510 |
case OPC_BC1T: |
5535 |
{ |
|
5536 |
int l1 = gen_new_label(); |
|
5537 |
int l2 = gen_new_label(); |
|
5538 |
|
|
5539 |
get_fp_cond(t0); |
|
5540 |
tcg_gen_andi_i32(t0, t0, 0x1 << cc); |
|
5541 |
tcg_gen_brcondi_i32(TCG_COND_NE, t0, 0, l1); |
|
5542 |
tcg_gen_movi_tl(bcond, 0); |
|
5543 |
tcg_gen_br(l2); |
|
5544 |
gen_set_label(l1); |
|
5545 |
tcg_gen_movi_tl(bcond, 1); |
|
5546 |
gen_set_label(l2); |
|
5547 |
} |
|
5511 |
tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc)); |
|
5512 |
tcg_gen_andi_i32(t0, t0, 1); |
|
5513 |
tcg_gen_extu_i32_tl(bcond, t0); |
|
5548 | 5514 |
opn = "bc1t"; |
5549 | 5515 |
goto not_likely; |
5550 | 5516 |
case OPC_BC1TL: |
5551 |
{ |
|
5552 |
int l1 = gen_new_label(); |
|
5553 |
int l2 = gen_new_label(); |
|
5554 |
|
|
5555 |
get_fp_cond(t0); |
|
5556 |
tcg_gen_andi_i32(t0, t0, 0x1 << cc); |
|
5557 |
tcg_gen_brcondi_i32(TCG_COND_NE, t0, 0, l1); |
|
5558 |
tcg_gen_movi_tl(bcond, 0); |
|
5559 |
tcg_gen_br(l2); |
|
5560 |
gen_set_label(l1); |
|
5561 |
tcg_gen_movi_tl(bcond, 1); |
|
5562 |
gen_set_label(l2); |
|
5563 |
} |
|
5517 |
tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc)); |
|
5518 |
tcg_gen_andi_i32(t0, t0, 1); |
|
5519 |
tcg_gen_extu_i32_tl(bcond, t0); |
|
5564 | 5520 |
opn = "bc1tl"; |
5565 | 5521 |
likely: |
5566 | 5522 |
ctx->hflags |= MIPS_HFLAG_BL; |
5567 | 5523 |
break; |
5568 | 5524 |
case OPC_BC1FANY2: |
5569 | 5525 |
{ |
5570 |
int l1 = gen_new_label(); |
|
5571 |
int l2 = gen_new_label(); |
|
5572 |
|
|
5573 |
get_fp_cond(t0); |
|
5574 |
tcg_gen_andi_i32(t0, t0, 0x3 << cc); |
|
5575 |
tcg_gen_brcondi_i32(TCG_COND_EQ, t0, 0, l1); |
|
5576 |
tcg_gen_movi_tl(bcond, 0); |
|
5577 |
tcg_gen_br(l2); |
|
5578 |
gen_set_label(l1); |
|
5579 |
tcg_gen_movi_tl(bcond, 1); |
|
5580 |
gen_set_label(l2); |
|
5526 |
TCGv_i32 t1 = tcg_temp_new_i32(); |
|
5527 |
tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc)); |
|
5528 |
tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1)); |
|
5529 |
tcg_gen_or_i32(t0, t0, t1); |
|
5530 |
tcg_temp_free_i32(t1); |
|
5531 |
tcg_gen_not_i32(t0, t0); |
|
5532 |
tcg_gen_andi_i32(t0, t0, 1); |
|
5533 |
tcg_gen_extu_i32_tl(bcond, t0); |
|
5581 | 5534 |
} |
5582 | 5535 |
opn = "bc1any2f"; |
5583 | 5536 |
goto not_likely; |
5584 | 5537 |
case OPC_BC1TANY2: |
5585 | 5538 |
{ |
5586 |
int l1 = gen_new_label(); |
|
5587 |
int l2 = gen_new_label(); |
|
5588 |
|
|
5589 |
get_fp_cond(t0); |
|
5590 |
tcg_gen_andi_i32(t0, t0, 0x3 << cc); |
|
5591 |
tcg_gen_brcondi_i32(TCG_COND_NE, t0, 0, l1); |
|
5592 |
tcg_gen_movi_tl(bcond, 0); |
|
5593 |
tcg_gen_br(l2); |
|
5594 |
gen_set_label(l1); |
|
5595 |
tcg_gen_movi_tl(bcond, 1); |
|
5596 |
gen_set_label(l2); |
|
5539 |
TCGv_i32 t1 = tcg_temp_new_i32(); |
|
5540 |
tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc)); |
|
5541 |
tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1)); |
|
5542 |
tcg_gen_or_i32(t0, t0, t1); |
|
5543 |
tcg_temp_free_i32(t1); |
|
5544 |
tcg_gen_andi_i32(t0, t0, 1); |
|
5545 |
tcg_gen_extu_i32_tl(bcond, t0); |
|
5597 | 5546 |
} |
5598 | 5547 |
opn = "bc1any2t"; |
5599 | 5548 |
goto not_likely; |
5600 | 5549 |
case OPC_BC1FANY4: |
5601 | 5550 |
{ |
5602 |
int l1 = gen_new_label(); |
|
5603 |
int l2 = gen_new_label(); |
|
5604 |
|
|
5605 |
get_fp_cond(t0); |
|
5606 |
tcg_gen_andi_i32(t0, t0, 0xf << cc); |
|
5607 |
tcg_gen_brcondi_i32(TCG_COND_EQ, t0, 0, l1); |
|
5608 |
tcg_gen_movi_tl(bcond, 0); |
|
5609 |
tcg_gen_br(l2); |
|
5610 |
gen_set_label(l1); |
|
5611 |
tcg_gen_movi_tl(bcond, 1); |
|
5612 |
gen_set_label(l2); |
|
5551 |
TCGv_i32 t1 = tcg_temp_new_i32(); |
|
5552 |
tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc)); |
|
5553 |
tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1)); |
|
5554 |
tcg_gen_or_i32(t0, t0, t1); |
|
5555 |
tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2)); |
|
5556 |
tcg_gen_or_i32(t0, t0, t1); |
|
5557 |
tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3)); |
|
5558 |
tcg_gen_or_i32(t0, t0, t1); |
|
5559 |
tcg_temp_free_i32(t1); |
|
5560 |
tcg_gen_not_i32(t0, t0); |
|
5561 |
tcg_gen_andi_i32(t0, t0, 1); |
|
5562 |
tcg_gen_extu_i32_tl(bcond, t0); |
|
5613 | 5563 |
} |
5614 | 5564 |
opn = "bc1any4f"; |
5615 | 5565 |
goto not_likely; |
5616 | 5566 |
case OPC_BC1TANY4: |
5617 | 5567 |
{ |
5618 |
int l1 = gen_new_label();
|
|
5619 |
int l2 = gen_new_label();
|
|
5620 |
|
|
5621 |
get_fp_cond(t0);
|
|
5622 |
tcg_gen_andi_i32(t0, t0, 0xf << cc);
|
|
5623 |
tcg_gen_brcondi_i32(TCG_COND_NE, t0, 0, l1);
|
|
5624 |
tcg_gen_movi_tl(bcond, 0);
|
|
5625 |
tcg_gen_br(l2);
|
|
5626 |
gen_set_label(l1);
|
|
5627 |
tcg_gen_movi_tl(bcond, 1);
|
|
5628 |
gen_set_label(l2);
|
|
5568 |
TCGv_i32 t1 = tcg_temp_new_i32();
|
|
5569 |
tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
|
|
5570 |
tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1)); |
|
5571 |
tcg_gen_or_i32(t0, t0, t1);
|
|
5572 |
tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2));
|
|
5573 |
tcg_gen_or_i32(t0, t0, t1);
|
|
5574 |
tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3));
|
|
5575 |
tcg_gen_or_i32(t0, t0, t1);
|
|
5576 |
tcg_temp_free_i32(t1);
|
|
5577 |
tcg_gen_andi_i32(t0, t0, 1);
|
|
5578 |
tcg_gen_extu_i32_tl(bcond, t0);
|
|
5629 | 5579 |
} |
5630 | 5580 |
opn = "bc1any4t"; |
5631 | 5581 |
not_likely: |
Also available in: Unified diff