Commit 54843a58610e0ef43200d0e23a057589876a4b6f
1 parent
15824571
target-ppc: use the new rotr/rotri instructions
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5608 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
47 additions
and
59 deletions
target-ppc/translate.c
@@ -1673,20 +1673,21 @@ GEN_HANDLER(rlwimi, 0x14, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) | @@ -1673,20 +1673,21 @@ GEN_HANDLER(rlwimi, 0x14, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) | ||
1673 | target_ulong mask; | 1673 | target_ulong mask; |
1674 | 1674 | ||
1675 | t0 = tcg_temp_new(TCG_TYPE_TL); | 1675 | t0 = tcg_temp_new(TCG_TYPE_TL); |
1676 | - t1 = tcg_temp_new(TCG_TYPE_TL); | ||
1677 | - if (likely(sh == 0)) { | ||
1678 | - tcg_gen_mov_tl(t0, cpu_gpr[rS(ctx->opcode)]); | ||
1679 | - } else { | ||
1680 | - tcg_gen_ext32u_tl(t1, cpu_gpr[rS(ctx->opcode)]); | ||
1681 | - tcg_gen_shli_tl(t0, t1, sh); | ||
1682 | - tcg_gen_shri_tl(t1, t1, 32 - sh); | ||
1683 | - tcg_gen_or_tl(t0, t0, t1); | ||
1684 | - } | 1676 | +#if defined(TARGET_PPC64) |
1677 | + t1 = tcg_temp_new(TCG_TYPE_I32); | ||
1678 | + tcg_gen_trunc_i64_i32(t1, cpu_gpr[rS(ctx->opcode)]); | ||
1679 | + tcg_gen_rotli_i32(t1, t1, sh); | ||
1680 | + tcg_gen_extu_i32_i64(t0, t1); | ||
1681 | + tcg_temp_free(t1); | ||
1682 | +#else | ||
1683 | + tcg_gen_rotli_i32(t0, cpu_gpr[rS(ctx->opcode)], sh); | ||
1684 | +#endif | ||
1685 | #if defined(TARGET_PPC64) | 1685 | #if defined(TARGET_PPC64) |
1686 | mb += 32; | 1686 | mb += 32; |
1687 | me += 32; | 1687 | me += 32; |
1688 | #endif | 1688 | #endif |
1689 | mask = MASK(mb, me); | 1689 | mask = MASK(mb, me); |
1690 | + t1 = tcg_temp_new(TCG_TYPE_TL); | ||
1690 | tcg_gen_andi_tl(t0, t0, mask); | 1691 | tcg_gen_andi_tl(t0, t0, mask); |
1691 | tcg_gen_andi_tl(t1, cpu_gpr[rA(ctx->opcode)], ~mask); | 1692 | tcg_gen_andi_tl(t1, cpu_gpr[rA(ctx->opcode)], ~mask); |
1692 | tcg_gen_or_tl(cpu_gpr[rA(ctx->opcode)], t0, t1); | 1693 | tcg_gen_or_tl(cpu_gpr[rA(ctx->opcode)], t0, t1); |
@@ -1723,16 +1724,15 @@ GEN_HANDLER(rlwinm, 0x15, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) | @@ -1723,16 +1724,15 @@ GEN_HANDLER(rlwinm, 0x15, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) | ||
1723 | tcg_temp_free(t0); | 1724 | tcg_temp_free(t0); |
1724 | } else { | 1725 | } else { |
1725 | TCGv t0 = tcg_temp_new(TCG_TYPE_TL); | 1726 | TCGv t0 = tcg_temp_new(TCG_TYPE_TL); |
1726 | - if (likely(sh != 0)) { | ||
1727 | - TCGv t1 = tcg_temp_new(TCG_TYPE_TL); | ||
1728 | - tcg_gen_ext32u_tl(t0, cpu_gpr[rS(ctx->opcode)]); | ||
1729 | - tcg_gen_shli_tl(t1, t0, sh); | ||
1730 | - tcg_gen_shri_tl(t0, t0, 32 - sh); | ||
1731 | - tcg_gen_or_tl(t0, t0, t1); | ||
1732 | - tcg_temp_free(t1); | ||
1733 | - } else { | ||
1734 | - tcg_gen_mov_tl(t0, cpu_gpr[rS(ctx->opcode)]); | ||
1735 | - } | 1727 | +#if defined(TARGET_PPC64) |
1728 | + TCGv t1 = tcg_temp_new(TCG_TYPE_I32); | ||
1729 | + tcg_gen_trunc_i64_i32(t1, cpu_gpr[rS(ctx->opcode)]); | ||
1730 | + tcg_gen_rotli_i32(t1, t1, sh); | ||
1731 | + tcg_gen_extu_i32_i64(t0, t1); | ||
1732 | + tcg_temp_free(t1); | ||
1733 | +#else | ||
1734 | + tcg_gen_rotli_i32(t0, cpu_gpr[rS(ctx->opcode)], sh); | ||
1735 | +#endif | ||
1736 | #if defined(TARGET_PPC64) | 1736 | #if defined(TARGET_PPC64) |
1737 | mb += 32; | 1737 | mb += 32; |
1738 | me += 32; | 1738 | me += 32; |
@@ -1747,31 +1747,37 @@ GEN_HANDLER(rlwinm, 0x15, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) | @@ -1747,31 +1747,37 @@ GEN_HANDLER(rlwinm, 0x15, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) | ||
1747 | GEN_HANDLER(rlwnm, 0x17, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) | 1747 | GEN_HANDLER(rlwnm, 0x17, 0xFF, 0xFF, 0x00000000, PPC_INTEGER) |
1748 | { | 1748 | { |
1749 | uint32_t mb, me; | 1749 | uint32_t mb, me; |
1750 | - TCGv t0, t1, t2; | 1750 | + TCGv t0; |
1751 | +#if defined(TARGET_PPC64) | ||
1752 | + TCGv t1, t2; | ||
1753 | +#endif | ||
1751 | 1754 | ||
1752 | mb = MB(ctx->opcode); | 1755 | mb = MB(ctx->opcode); |
1753 | me = ME(ctx->opcode); | 1756 | me = ME(ctx->opcode); |
1754 | t0 = tcg_temp_new(TCG_TYPE_TL); | 1757 | t0 = tcg_temp_new(TCG_TYPE_TL); |
1755 | tcg_gen_andi_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x1f); | 1758 | tcg_gen_andi_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x1f); |
1756 | - t1 = tcg_temp_new(TCG_TYPE_TL); | ||
1757 | - tcg_gen_ext32u_tl(t1, cpu_gpr[rS(ctx->opcode)]); | ||
1758 | - t2 = tcg_temp_new(TCG_TYPE_TL); | ||
1759 | - tcg_gen_shl_tl(t2, t1, t0); | ||
1760 | - tcg_gen_subfi_tl(t0, 32, t0); | ||
1761 | - tcg_gen_shr_tl(t1, t1, t0); | ||
1762 | - tcg_temp_free(t0); | ||
1763 | - tcg_gen_or_tl(t2, t2, t1); | 1759 | +#if defined(TARGET_PPC64) |
1760 | + t1 = tcg_temp_new(TCG_TYPE_I32); | ||
1761 | + t2 = tcg_temp_new(TCG_TYPE_I32); | ||
1762 | + tcg_gen_trunc_i64_i32(t1, cpu_gpr[rS(ctx->opcode)]); | ||
1763 | + tcg_gen_trunc_i64_i32(t2, t0); | ||
1764 | + tcg_gen_rotl_i32(t1, t1, t2); | ||
1765 | + tcg_gen_extu_i32_i64(t0, t1); | ||
1764 | tcg_temp_free(t1); | 1766 | tcg_temp_free(t1); |
1767 | + tcg_temp_free(t2); | ||
1768 | +#else | ||
1769 | + tcg_gen_rotl_i32(t0, cpu_gpr[rS(ctx->opcode)], t0); | ||
1770 | +#endif | ||
1765 | if (unlikely(mb != 0 || me != 31)) { | 1771 | if (unlikely(mb != 0 || me != 31)) { |
1766 | #if defined(TARGET_PPC64) | 1772 | #if defined(TARGET_PPC64) |
1767 | mb += 32; | 1773 | mb += 32; |
1768 | me += 32; | 1774 | me += 32; |
1769 | #endif | 1775 | #endif |
1770 | - tcg_gen_andi_tl(cpu_gpr[rA(ctx->opcode)], t2, MASK(mb, me)); | 1776 | + tcg_gen_andi_tl(cpu_gpr[rA(ctx->opcode)], t0, MASK(mb, me)); |
1771 | } else { | 1777 | } else { |
1772 | - tcg_gen_ext32u_tl(cpu_gpr[rA(ctx->opcode)], t2); | 1778 | + tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], t0); |
1773 | } | 1779 | } |
1774 | - tcg_temp_free(t2); | 1780 | + tcg_temp_free(t0); |
1775 | if (unlikely(Rc(ctx->opcode) != 0)) | 1781 | if (unlikely(Rc(ctx->opcode) != 0)) |
1776 | gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]); | 1782 | gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]); |
1777 | } | 1783 | } |
@@ -1817,17 +1823,9 @@ static always_inline void gen_rldinm (DisasContext *ctx, uint32_t mb, | @@ -1817,17 +1823,9 @@ static always_inline void gen_rldinm (DisasContext *ctx, uint32_t mb, | ||
1817 | tcg_gen_shri_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)], mb); | 1823 | tcg_gen_shri_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rS(ctx->opcode)], mb); |
1818 | } else { | 1824 | } else { |
1819 | TCGv t0 = tcg_temp_new(TCG_TYPE_TL); | 1825 | TCGv t0 = tcg_temp_new(TCG_TYPE_TL); |
1820 | - if (likely(sh != 0)) { | ||
1821 | - TCGv t1 = tcg_temp_new(TCG_TYPE_TL); | ||
1822 | - tcg_gen_shli_tl(t0, cpu_gpr[rS(ctx->opcode)], sh); | ||
1823 | - tcg_gen_shri_tl(t1, cpu_gpr[rS(ctx->opcode)], 64 - sh); | ||
1824 | - tcg_gen_or_tl(t0, t0, t1); | ||
1825 | - tcg_temp_free(t1); | ||
1826 | - } else { | ||
1827 | - tcg_gen_mov_tl(t0, cpu_gpr[rS(ctx->opcode)]); | ||
1828 | - } | 1826 | + tcg_gen_rotli_tl(t0, cpu_gpr[rS(ctx->opcode)], sh); |
1829 | if (likely(mb == 0 && me == 63)) { | 1827 | if (likely(mb == 0 && me == 63)) { |
1830 | - tcg_gen_ext32u_tl(cpu_gpr[rA(ctx->opcode)], t0); | 1828 | + tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], t0); |
1831 | } else { | 1829 | } else { |
1832 | tcg_gen_andi_tl(cpu_gpr[rA(ctx->opcode)], t0, MASK(mb, me)); | 1830 | tcg_gen_andi_tl(cpu_gpr[rA(ctx->opcode)], t0, MASK(mb, me)); |
1833 | } | 1831 | } |
@@ -1870,23 +1868,19 @@ GEN_PPC64_R4(rldic, 0x1E, 0x04); | @@ -1870,23 +1868,19 @@ GEN_PPC64_R4(rldic, 0x1E, 0x04); | ||
1870 | static always_inline void gen_rldnm (DisasContext *ctx, uint32_t mb, | 1868 | static always_inline void gen_rldnm (DisasContext *ctx, uint32_t mb, |
1871 | uint32_t me) | 1869 | uint32_t me) |
1872 | { | 1870 | { |
1873 | - TCGv t0, t1; | 1871 | + TCGv t0; |
1874 | 1872 | ||
1875 | mb = MB(ctx->opcode); | 1873 | mb = MB(ctx->opcode); |
1876 | me = ME(ctx->opcode); | 1874 | me = ME(ctx->opcode); |
1877 | t0 = tcg_temp_new(TCG_TYPE_TL); | 1875 | t0 = tcg_temp_new(TCG_TYPE_TL); |
1878 | tcg_gen_andi_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x3f); | 1876 | tcg_gen_andi_tl(t0, cpu_gpr[rB(ctx->opcode)], 0x3f); |
1879 | - t1 = tcg_temp_new(TCG_TYPE_TL); | ||
1880 | - tcg_gen_shl_tl(t1, cpu_gpr[rS(ctx->opcode)], t0); | ||
1881 | - tcg_gen_subfi_tl(t0, 64, t0); | ||
1882 | - tcg_gen_shr_tl(t0, cpu_gpr[rS(ctx->opcode)], t0); | ||
1883 | - tcg_gen_or_tl(t1, t1, t0); | ||
1884 | - tcg_temp_free(t0); | 1877 | + tcg_gen_rotl_tl(t0, cpu_gpr[rS(ctx->opcode)], t0); |
1885 | if (unlikely(mb != 0 || me != 63)) { | 1878 | if (unlikely(mb != 0 || me != 63)) { |
1886 | - tcg_gen_andi_tl(cpu_gpr[rA(ctx->opcode)], t1, MASK(mb, me)); | ||
1887 | - } else | ||
1888 | - tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], t1); | ||
1889 | - tcg_temp_free(t1); | 1879 | + tcg_gen_andi_tl(cpu_gpr[rA(ctx->opcode)], t0, MASK(mb, me)); |
1880 | + } else { | ||
1881 | + tcg_gen_mov_tl(cpu_gpr[rA(ctx->opcode)], t0); | ||
1882 | + } | ||
1883 | + tcg_temp_free(t0); | ||
1890 | if (unlikely(Rc(ctx->opcode) != 0)) | 1884 | if (unlikely(Rc(ctx->opcode) != 0)) |
1891 | gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]); | 1885 | gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]); |
1892 | } | 1886 | } |
@@ -1924,14 +1918,8 @@ static always_inline void gen_rldimi (DisasContext *ctx, int mbn, int shn) | @@ -1924,14 +1918,8 @@ static always_inline void gen_rldimi (DisasContext *ctx, int mbn, int shn) | ||
1924 | target_ulong mask; | 1918 | target_ulong mask; |
1925 | 1919 | ||
1926 | t0 = tcg_temp_new(TCG_TYPE_TL); | 1920 | t0 = tcg_temp_new(TCG_TYPE_TL); |
1921 | + tcg_gen_rotli_tl(t0, cpu_gpr[rS(ctx->opcode)], sh); | ||
1927 | t1 = tcg_temp_new(TCG_TYPE_TL); | 1922 | t1 = tcg_temp_new(TCG_TYPE_TL); |
1928 | - if (likely(sh == 0)) { | ||
1929 | - tcg_gen_mov_tl(t0, cpu_gpr[rS(ctx->opcode)]); | ||
1930 | - } else { | ||
1931 | - tcg_gen_shli_tl(t0, cpu_gpr[rS(ctx->opcode)], sh); | ||
1932 | - tcg_gen_shri_tl(t1, cpu_gpr[rS(ctx->opcode)], 64 - sh); | ||
1933 | - tcg_gen_or_tl(t0, t0, t1); | ||
1934 | - } | ||
1935 | mask = MASK(mb, me); | 1923 | mask = MASK(mb, me); |
1936 | tcg_gen_andi_tl(t0, t0, mask); | 1924 | tcg_gen_andi_tl(t0, t0, mask); |
1937 | tcg_gen_andi_tl(t1, cpu_gpr[rA(ctx->opcode)], ~mask); | 1925 | tcg_gen_andi_tl(t1, cpu_gpr[rA(ctx->opcode)], ~mask); |