Revision 3a55fa47 target-mips/translate.c
b/target-mips/translate.c | ||
---|---|---|
2619 | 2619 |
|
2620 | 2620 |
static void gen_bshfl (DisasContext *ctx, uint32_t op2, int rt, int rd) |
2621 | 2621 |
{ |
2622 |
TCGv t0 = tcg_temp_new(); |
|
2623 |
TCGv t1 = tcg_temp_new(); |
|
2622 |
TCGv t0; |
|
2624 | 2623 |
|
2625 |
gen_load_gpr(t1, rt); |
|
2624 |
if (rd == 0) { |
|
2625 |
/* If no destination, treat it as a NOP. */ |
|
2626 |
MIPS_DEBUG("NOP"); |
|
2627 |
return; |
|
2628 |
} |
|
2629 |
|
|
2630 |
t0 = tcg_temp_new(); |
|
2631 |
gen_load_gpr(t0, rt); |
|
2626 | 2632 |
switch (op2) { |
2627 | 2633 |
case OPC_WSBH: |
2628 |
tcg_gen_shri_tl(t0, t1, 8); |
|
2629 |
tcg_gen_andi_tl(t0, t0, 0x00FF00FF); |
|
2630 |
tcg_gen_shli_tl(t1, t1, 8); |
|
2631 |
tcg_gen_andi_tl(t1, t1, ~0x00FF00FF); |
|
2632 |
tcg_gen_or_tl(t0, t0, t1); |
|
2633 |
tcg_gen_ext32s_tl(t0, t0); |
|
2634 |
{ |
|
2635 |
TCGv t1 = tcg_temp_new(); |
|
2636 |
|
|
2637 |
tcg_gen_shri_tl(t1, t0, 8); |
|
2638 |
tcg_gen_andi_tl(t1, t1, 0x00FF00FF); |
|
2639 |
tcg_gen_shli_tl(t0, t0, 8); |
|
2640 |
tcg_gen_andi_tl(t0, t0, ~0x00FF00FF); |
|
2641 |
tcg_gen_or_tl(t0, t0, t1); |
|
2642 |
tcg_temp_free(t1); |
|
2643 |
tcg_gen_ext32s_tl(cpu_gpr[rd], t0); |
|
2644 |
} |
|
2634 | 2645 |
break; |
2635 | 2646 |
case OPC_SEB: |
2636 |
tcg_gen_ext8s_tl(t0, t1);
|
|
2647 |
tcg_gen_ext8s_tl(cpu_gpr[rd], t0);
|
|
2637 | 2648 |
break; |
2638 | 2649 |
case OPC_SEH: |
2639 |
tcg_gen_ext16s_tl(t0, t1);
|
|
2650 |
tcg_gen_ext16s_tl(cpu_gpr[rd], t0);
|
|
2640 | 2651 |
break; |
2641 | 2652 |
#if defined(TARGET_MIPS64) |
2642 | 2653 |
case OPC_DSBH: |
2643 |
gen_load_gpr(t1, rt); |
|
2644 |
tcg_gen_shri_tl(t0, t1, 8); |
|
2645 |
tcg_gen_andi_tl(t0, t0, 0x00FF00FF00FF00FFULL); |
|
2646 |
tcg_gen_shli_tl(t1, t1, 8); |
|
2647 |
tcg_gen_andi_tl(t1, t1, ~0x00FF00FF00FF00FFULL); |
|
2648 |
tcg_gen_or_tl(t0, t0, t1); |
|
2654 |
{ |
|
2655 |
TCGv t1 = tcg_temp_new(); |
|
2656 |
|
|
2657 |
tcg_gen_shri_tl(t1, t0, 8); |
|
2658 |
tcg_gen_andi_tl(t1, t1, 0x00FF00FF00FF00FFULL); |
|
2659 |
tcg_gen_shli_tl(t0, t0, 8); |
|
2660 |
tcg_gen_andi_tl(t0, t0, ~0x00FF00FF00FF00FFULL); |
|
2661 |
tcg_gen_or_tl(cpu_gpr[rd], t0, t1); |
|
2662 |
tcg_temp_free(t1); |
|
2663 |
} |
|
2649 | 2664 |
break; |
2650 | 2665 |
case OPC_DSHD: |
2651 |
gen_load_gpr(t1, rt); |
|
2652 |
tcg_gen_shri_tl(t0, t1, 16); |
|
2653 |
tcg_gen_andi_tl(t0, t0, 0x0000FFFF0000FFFFULL); |
|
2654 |
tcg_gen_shli_tl(t1, t1, 16); |
|
2655 |
tcg_gen_andi_tl(t1, t1, ~0x0000FFFF0000FFFFULL); |
|
2656 |
tcg_gen_or_tl(t1, t0, t1); |
|
2657 |
tcg_gen_shri_tl(t0, t1, 32); |
|
2658 |
tcg_gen_shli_tl(t1, t1, 32); |
|
2659 |
tcg_gen_or_tl(t0, t0, t1); |
|
2666 |
{ |
|
2667 |
TCGv t1 = tcg_temp_new(); |
|
2668 |
|
|
2669 |
tcg_gen_shri_tl(t1, t0, 16); |
|
2670 |
tcg_gen_andi_tl(t1, t1, 0x0000FFFF0000FFFFULL); |
|
2671 |
tcg_gen_shli_tl(t0, t0, 16); |
|
2672 |
tcg_gen_andi_tl(t0, t0, ~0x0000FFFF0000FFFFULL); |
|
2673 |
tcg_gen_or_tl(t0, t0, t1); |
|
2674 |
tcg_gen_shri_tl(t1, t0, 32); |
|
2675 |
tcg_gen_shli_tl(t0, t0, 32); |
|
2676 |
tcg_gen_or_tl(cpu_gpr[rd], t0, t1); |
|
2677 |
tcg_temp_free(t1); |
|
2678 |
} |
|
2660 | 2679 |
break; |
2661 | 2680 |
#endif |
2662 | 2681 |
default: |
2663 | 2682 |
MIPS_INVAL("bsfhl"); |
2664 | 2683 |
generate_exception(ctx, EXCP_RI); |
2665 | 2684 |
tcg_temp_free(t0); |
2666 |
tcg_temp_free(t1); |
|
2667 | 2685 |
return; |
2668 | 2686 |
} |
2669 |
gen_store_gpr(t0, rd); |
|
2670 | 2687 |
tcg_temp_free(t0); |
2671 |
tcg_temp_free(t1); |
|
2672 | 2688 |
} |
2673 | 2689 |
|
2674 | 2690 |
#ifndef CONFIG_USER_ONLY |
Also available in: Unified diff