Commit d94536f417cd472ccf7dda4603e0cbee4f892ed2
1 parent
58a2c436
target-mips: optimize gen_compute_branch1()
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6955 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
57 additions
and
107 deletions
target-mips/translate.c
... | ... | @@ -643,18 +643,12 @@ static inline void gen_store_fpr64 (DisasContext *ctx, TCGv_i64 t, int reg) |
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,132 +5494,88 @@ static void gen_compute_branch1 (CPUState *env, DisasContext *ctx, uint32_t op, |
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: | ... | ... |