|
|
|
Lines 166-181
jpeg_idct_ifast_mmx (j_decompress_ptr ci
|
Link Here
|
|---|
|
| 166 |
JCOEFPTR coef_block, |
166 |
JCOEFPTR coef_block, |
| 167 |
JSAMPARRAY output_buf, JDIMENSION output_col); |
167 |
JSAMPARRAY output_buf, JDIMENSION output_col); |
| 168 |
__inline GLOBAL(void) |
168 |
__inline GLOBAL(void) |
| 169 |
jpeg_idct_ifast_orig (j_decompress_ptr cinfo, jpeg_component_info * compptr, |
169 |
jpeg_idct_ifast_orig (j_decompress_ptr cinfo, jpeg_component_info * compptr, |
| 170 |
JCOEFPTR coef_block, |
170 |
JCOEFPTR coef_block, |
| 171 |
JSAMPARRAY output_buf, JDIMENSION output_col); |
171 |
JSAMPARRAY output_buf, JDIMENSION output_col); |
| 172 |
#endif |
172 |
#endif |
| 173 |
|
173 |
|
|
|
174 |
#ifdef HAVE_SSE2_INTRINSICS |
| 175 |
GLOBAL(void) |
| 176 |
jpeg_idct_ifast_sse2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, |
| 177 |
JCOEFPTR coef_block, |
| 178 |
JSAMPARRAY output_buf, JDIMENSION output_col); |
| 179 |
#endif /* HAVE_SSE2_INTRINSICS */ |
| 180 |
|
| 174 |
GLOBAL(void) |
181 |
GLOBAL(void) |
| 175 |
jpeg_idct_ifast(j_decompress_ptr cinfo, jpeg_component_info * compptr, |
182 |
jpeg_idct_ifast(j_decompress_ptr cinfo, jpeg_component_info * compptr, |
| 176 |
JCOEFPTR coef_block, |
183 |
JCOEFPTR coef_block, |
| 177 |
JSAMPARRAY output_buf, JDIMENSION output_col); |
184 |
JSAMPARRAY output_buf, JDIMENSION output_col); |
| 178 |
|
185 |
|
| 179 |
|
186 |
|
| 180 |
#ifdef HAVE_MMX_INTEL_MNEMONICS |
187 |
#ifdef HAVE_MMX_INTEL_MNEMONICS |
| 181 |
GLOBAL(void) |
188 |
GLOBAL(void) |
|
Lines 1642-1650
jpeg_idct_ifast_mmx (j_decompress_ptr ci
|
Link Here
|
|---|
|
| 1642 |
|
1649 |
|
| 1643 |
movq [ebx], mm3 |
1650 |
movq [ebx], mm3 |
| 1644 |
|
1651 |
|
| 1645 |
emms |
1652 |
emms |
| 1646 |
} |
1653 |
} |
| 1647 |
} |
1654 |
} |
| 1648 |
#endif |
1655 |
#endif |
| 1649 |
|
1656 |
|
|
|
1657 |
#ifdef HAVE_SSE2_INTRINSICS |
| 1658 |
#include "xmmintrin.h" |
| 1659 |
#include "emmintrin.h" |
| 1660 |
|
| 1661 |
/* These values are taken from the decimal shifted left 14. When multiplying */ |
| 1662 |
/* by these constants, we have to shift left the other multiplier so that we */ |
| 1663 |
/* we can use pmulhw which will descale us by the 16 bits. */ |
| 1664 |
|
| 1665 |
SSE2_ALIGN(unsigned short SSE2_1_414213562[8]) = |
| 1666 |
{23170, 23170, 23170, 23170, 23170, 23170, 23170, 23170}; |
| 1667 |
SSE2_ALIGN(unsigned short SSE2_1_847759065[8]) = |
| 1668 |
{30274, 30274, 30274, 30274, 30274, 30274, 30274, 30274}; |
| 1669 |
SSE2_ALIGN(unsigned short SSE2_1_082392200[8]) = |
| 1670 |
{17734, 17734, 17734, 17734, 17734, 17734, 17734, 17734}; |
| 1671 |
SSE2_ALIGN(unsigned short SSE2_NEG_0_765366865[8]) = |
| 1672 |
{52996, 52996, 52996, 52996, 52996, 52996, 52996, 52996}; |
| 1673 |
|
| 1674 |
/* This following is to compensate for range_limit and is shifted five to */ |
| 1675 |
/* the left as that's what we're scaled for at the time. */ |
| 1676 |
|
| 1677 |
SSE2_ALIGN(unsigned short SSE2_ADD_128[8]) = |
| 1678 |
{4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096}; |
| 1679 |
|
| 1680 |
/*---------------------------------------------------------------------------*/ |
| 1681 |
|
| 1682 |
inline GLOBAL(void) |
| 1683 |
jpeg_idct_ifast_sse2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, |
| 1684 |
JCOEFPTR coef_block, |
| 1685 |
JSAMPARRAY output_buf, JDIMENSION output_col) |
| 1686 |
{ |
| 1687 |
__m128i row0, row1, row2, row3, row4, row5, row6, row7; |
| 1688 |
__m128i tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; |
| 1689 |
__m128i tmp10, tmp11, tmp12, tmp13, z10, z11, z12, z13; |
| 1690 |
__m128i xps0, xps1, xps2, xps3, rowa; |
| 1691 |
__m128i * quantptr; |
| 1692 |
__m128i * coefptr; |
| 1693 |
JSAMPROW outptr0, outptr1, outptr2, outptr3, outptr4, outptr5, outptr6, outptr7; |
| 1694 |
|
| 1695 |
/* ====================================================================== */ |
| 1696 |
/* Load registers from the coefficient block */ |
| 1697 |
/* ====================================================================== */ |
| 1698 |
|
| 1699 |
quantptr = (__m128i *) compptr->dct_table; |
| 1700 |
coefptr = (__m128i *) coef_block; |
| 1701 |
|
| 1702 |
row0 = *(coefptr+0); |
| 1703 |
row1 = *(coefptr+1); |
| 1704 |
row2 = *(coefptr+2); |
| 1705 |
row3 = *(coefptr+3); |
| 1706 |
row4 = *(coefptr+4); |
| 1707 |
row5 = *(coefptr+5); |
| 1708 |
row6 = *(coefptr+6); |
| 1709 |
row7 = *(coefptr+7); |
| 1710 |
row0 = _mm_mullo_epi16(row0, *(quantptr+0)); |
| 1711 |
row1 = _mm_mullo_epi16(row1, *(quantptr+1)); |
| 1712 |
row2 = _mm_mullo_epi16(row2, *(quantptr+2)); |
| 1713 |
row3 = _mm_mullo_epi16(row3, *(quantptr+3)); |
| 1714 |
row4 = _mm_mullo_epi16(row4, *(quantptr+4)); |
| 1715 |
row5 = _mm_mullo_epi16(row5, *(quantptr+5)); |
| 1716 |
row6 = _mm_mullo_epi16(row6, *(quantptr+6)); |
| 1717 |
row7 = _mm_mullo_epi16(row7, *(quantptr+7)); |
| 1718 |
|
| 1719 |
/* ====================================================================== */ |
| 1720 |
/* Inverse Discrete Cosine Transform Column Processing */ |
| 1721 |
/* ====================================================================== */ |
| 1722 |
|
| 1723 |
/* Even part */ |
| 1724 |
|
| 1725 |
/* tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]); */ |
| 1726 |
/* tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]); */ |
| 1727 |
|
| 1728 |
tmp10 = _mm_add_epi16(row0, row4); |
| 1729 |
tmp11 = _mm_sub_epi16(row0, row4); |
| 1730 |
|
| 1731 |
/* tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]); */ |
| 1732 |
/* tmp12 = MULTIPLY((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6], FIX_1_414213562) */ |
| 1733 |
/* - tmp13; */ |
| 1734 |
|
| 1735 |
tmp13 = _mm_add_epi16(row2, row6); |
| 1736 |
tmp12 = _mm_mulhi_epi16(_mm_slli_epi16(_mm_sub_epi16(row2, row6), 2), |
| 1737 |
*((__m128i *) SSE2_1_414213562)); |
| 1738 |
tmp12 = _mm_sub_epi16(tmp12, tmp13); |
| 1739 |
|
| 1740 |
/* tmp0 = tmp10 + tmp13; */ |
| 1741 |
/* tmp3 = tmp10 - tmp13; */ |
| 1742 |
/* tmp1 = tmp11 + tmp12; */ |
| 1743 |
/* tmp2 = tmp11 - tmp12; */ |
| 1744 |
|
| 1745 |
tmp0 = _mm_add_epi16(tmp10, tmp13); |
| 1746 |
tmp3 = _mm_sub_epi16(tmp10, tmp13); |
| 1747 |
tmp1 = _mm_add_epi16(tmp11, tmp12); |
| 1748 |
tmp2 = _mm_sub_epi16(tmp11, tmp12); |
| 1749 |
|
| 1750 |
/* Odd part */ |
| 1751 |
|
| 1752 |
/* z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3]; */ |
| 1753 |
/* z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3]; */ |
| 1754 |
/* z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7]; */ |
| 1755 |
/* z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7]; */ |
| 1756 |
|
| 1757 |
z13 = _mm_add_epi16(row5, row3); |
| 1758 |
z10 = _mm_sub_epi16(row5, row3); |
| 1759 |
z11 = _mm_add_epi16(row1, row7); |
| 1760 |
z12 = _mm_sub_epi16(row1, row7); |
| 1761 |
|
| 1762 |
/* phase 5 */ |
| 1763 |
|
| 1764 |
/* tmp7 = z11 + z13; */ |
| 1765 |
/* tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); */ |
| 1766 |
|
| 1767 |
tmp7 = _mm_add_epi16(z11, z13); |
| 1768 |
tmp11 = _mm_mulhi_epi16(_mm_slli_epi16(_mm_sub_epi16(z11, z13), 2), |
| 1769 |
*((__m128i *) SSE2_1_414213562)); |
| 1770 |
|
| 1771 |
/* z5 = MULTIPLY(z10 + z12, FIX_1_847759065); */ |
| 1772 |
/* tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; */ |
| 1773 |
/* tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; */ |
| 1774 |
|
| 1775 |
/* This is really a mess as the negative 2.61 doesn't work well */ |
| 1776 |
/* as we're working with 16-bit integers. So we're going to apply */ |
| 1777 |
/* a little algebra to get: */ |
| 1778 |
|
| 1779 |
/* tmp10 = z12 * (FIX_1_082392200 - FIX_1_847759065) - z10*FIX_1_847759065 */ |
| 1780 |
/* tmp12 = z10 * (FIX_1_847759065 - FIX_2_613125930) + z12*FIX_1_847759065 */ |
| 1781 |
|
| 1782 |
/* or */ |
| 1783 |
|
| 1784 |
/* tmp10 = z12 * FIX_NEG_0_765366865 - z10 * FIX_1_847759065 */ |
| 1785 |
/* tmp12 = z10 * FIX_NEG_0_765366865 + z12 * FIX_1_847759065 */ |
| 1786 |
|
| 1787 |
z10 = _mm_slli_epi16(z10, 2); |
| 1788 |
z12 = _mm_slli_epi16(z12, 2); |
| 1789 |
|
| 1790 |
tmp10 = _mm_sub_epi16(_mm_mulhi_epi16(z12, *((__m128i *)SSE2_NEG_0_765366865)), |
| 1791 |
_mm_mulhi_epi16(z10, *((__m128i *)SSE2_1_847759065))); |
| 1792 |
tmp12 = _mm_add_epi16(_mm_mulhi_epi16(z10, *((__m128i *)SSE2_NEG_0_765366865)), |
| 1793 |
_mm_mulhi_epi16(z12, *((__m128i *)SSE2_1_847759065))); |
| 1794 |
|
| 1795 |
/* phase 2 */ |
| 1796 |
|
| 1797 |
/* tmp6 = tmp12 - tmp7; */ |
| 1798 |
/* tmp5 = tmp11 - tmp6; */ |
| 1799 |
/* tmp4 = tmp10 + tmp5; */ |
| 1800 |
|
| 1801 |
tmp6 = _mm_sub_epi16(tmp12, tmp7); |
| 1802 |
tmp5 = _mm_sub_epi16(tmp11, tmp6); |
| 1803 |
tmp4 = _mm_add_epi16(tmp10, tmp5); |
| 1804 |
|
| 1805 |
/* outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3) */ |
| 1806 |
/* & RANGE_MASK]; */ |
| 1807 |
/* outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3) */ |
| 1808 |
/* & RANGE_MASK]; */ |
| 1809 |
|
| 1810 |
row0 = _mm_add_epi16(tmp0, tmp7); |
| 1811 |
row7 = _mm_sub_epi16(tmp0, tmp7); |
| 1812 |
|
| 1813 |
/* outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3) */ |
| 1814 |
/* & RANGE_MASK]; */ |
| 1815 |
/* outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3) */ |
| 1816 |
/* & RANGE_MASK]; */ |
| 1817 |
|
| 1818 |
row1 = _mm_add_epi16(tmp1, tmp6); |
| 1819 |
row6 = _mm_sub_epi16(tmp1, tmp6); |
| 1820 |
|
| 1821 |
/* outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3) */ |
| 1822 |
/* & RANGE_MASK]; */ |
| 1823 |
/* outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3) */ |
| 1824 |
/* & RANGE_MASK]; */ |
| 1825 |
|
| 1826 |
row2 = _mm_add_epi16(tmp2, tmp5); |
| 1827 |
row5 = _mm_sub_epi16(tmp2, tmp5); |
| 1828 |
|
| 1829 |
/* outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3) */ |
| 1830 |
/* & RANGE_MASK]; */ |
| 1831 |
/* outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3) */ |
| 1832 |
/* & RANGE_MASK]; */ |
| 1833 |
|
| 1834 |
row4 = _mm_add_epi16(tmp3, tmp4); |
| 1835 |
row3 = _mm_sub_epi16(tmp3, tmp4); |
| 1836 |
|
| 1837 |
/* ====================================================================== */ |
| 1838 |
/* Transpose Matrix (Word) */ |
| 1839 |
/* ====================================================================== */ |
| 1840 |
|
| 1841 |
/* Save off the low quadwords from the even rows */ |
| 1842 |
|
| 1843 |
xps0 = _mm_move_epi64(row0); |
| 1844 |
xps1 = _mm_move_epi64(row2); |
| 1845 |
xps2 = _mm_move_epi64(row4); |
| 1846 |
xps3 = _mm_move_epi64(row6); |
| 1847 |
|
| 1848 |
/* Interleave the high quadwords */ |
| 1849 |
|
| 1850 |
row0 = _mm_unpackhi_epi16(row0, row1); /* 04 14 05 15 06 16 07 17 */ |
| 1851 |
row2 = _mm_unpackhi_epi16(row2, row3); /* 24 34 25 35 26 36 27 37 */ |
| 1852 |
row4 = _mm_unpackhi_epi16(row4, row5); /* 44 54 45 55 46 56 47 57 */ |
| 1853 |
row6 = _mm_unpackhi_epi16(row6, row7); /* 64 74 65 75 66 76 67 77 */ |
| 1854 |
|
| 1855 |
rowa = row0; |
| 1856 |
row0 = _mm_unpacklo_epi32(row0, row2); /* 04 14 24 34 05 15 25 35 */ |
| 1857 |
rowa = _mm_unpackhi_epi32(rowa, row2); /* 06 16 26 36 07 17 27 37 */ |
| 1858 |
|
| 1859 |
row2 = row4; |
| 1860 |
row4 = _mm_unpacklo_epi32(row4, row6); /* 44 54 64 74 45 55 65 75 */ |
| 1861 |
row2 = _mm_unpackhi_epi32(row2, row6); /* 46 56 66 76 47 57 67 77 */ |
| 1862 |
|
| 1863 |
row6 = row0; |
| 1864 |
row0 = _mm_unpacklo_epi64(row0, row4); /* 04 14 24 34 44 54 64 74 */ |
| 1865 |
row6 = _mm_unpackhi_epi64(row6, row4); /* 05 15 25 35 45 55 65 75 */ |
| 1866 |
|
| 1867 |
row4 = rowa; |
| 1868 |
rowa = _mm_unpacklo_epi64(rowa, row2); /* 06 16 26 36 46 56 66 76 */ |
| 1869 |
row4 = _mm_unpackhi_epi64(row4, row2); /* 07 17 27 37 47 57 67 77 */ |
| 1870 |
|
| 1871 |
/* row0, row6, rowa, row4 now contain *4, *5, *6, *7 */ |
| 1872 |
|
| 1873 |
/* Interleave the low quadwords */ |
| 1874 |
|
| 1875 |
xps0 = _mm_unpacklo_epi16(xps0, row1); /* 00 10 01 11 02 12 03 13 */ |
| 1876 |
xps1 = _mm_unpacklo_epi16(xps1, row3); /* 20 30 21 31 22 32 23 33 */ |
| 1877 |
xps2 = _mm_unpacklo_epi16(xps2, row5); /* 40 50 41 51 42 52 43 43 */ |
| 1878 |
xps3 = _mm_unpacklo_epi16(xps3, row7); /* 60 70 61 71 62 72 63 73 */ |
| 1879 |
|
| 1880 |
row2 = xps0; |
| 1881 |
xps0 = _mm_unpacklo_epi32(xps0, xps1); /* 00 10 20 30 01 11 21 31 */ |
| 1882 |
row2 = _mm_unpackhi_epi32(row2, xps1); /* 02 12 22 32 03 13 23 33 */ |
| 1883 |
|
| 1884 |
xps1 = xps2; |
| 1885 |
xps2 = _mm_unpacklo_epi32(xps2, xps3); /* 40 50 60 70 41 51 61 71 */ |
| 1886 |
xps1 = _mm_unpackhi_epi32(xps1, xps3); /* 42 52 62 72 43 53 63 73 */ |
| 1887 |
|
| 1888 |
xps3 = xps0; |
| 1889 |
xps0 = _mm_unpacklo_epi64(xps0, xps2); /* 00 10 20 30 40 50 60 70 */ |
| 1890 |
xps3 = _mm_unpackhi_epi64(xps3, xps2); /* 01 11 21 31 41 51 61 71 */ |
| 1891 |
|
| 1892 |
xps2 = row2; |
| 1893 |
row2 = _mm_unpacklo_epi64(row2, xps1); /* 02 12 22 32 42 52 62 72 */ |
| 1894 |
xps2 = _mm_unpackhi_epi64(xps2, xps1); /* 03 13 23 33 43 53 63 73 */ |
| 1895 |
|
| 1896 |
/* xps0, xps3, row2, xps2 now contain *0, *1, *2, *3 */ |
| 1897 |
|
| 1898 |
/* Restructure back to row0 to row7. */ |
| 1899 |
|
| 1900 |
row7 = row4; |
| 1901 |
row5 = row6; |
| 1902 |
row6 = rowa; |
| 1903 |
row4 = row0; |
| 1904 |
row0 = xps0; |
| 1905 |
row1 = xps3; |
| 1906 |
row3 = xps2; |
| 1907 |
|
| 1908 |
/* ====================================================================== */ |
| 1909 |
/* Inverse Discrete Cosine Transform Row Processing */ |
| 1910 |
/* ====================================================================== */ |
| 1911 |
|
| 1912 |
/* Even part */ |
| 1913 |
|
| 1914 |
/* tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]); */ |
| 1915 |
/* tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]); */ |
| 1916 |
|
| 1917 |
tmp10 = _mm_add_epi16(row0, row4); |
| 1918 |
tmp11 = _mm_sub_epi16(row0, row4); |
| 1919 |
|
| 1920 |
/* tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]); */ |
| 1921 |
/* tmp12 = MULTIPLY((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6], FIX_1_414213562) */ |
| 1922 |
/* - tmp13; */ |
| 1923 |
|
| 1924 |
tmp13 = _mm_add_epi16(row2, row6); |
| 1925 |
tmp12 = _mm_mulhi_epi16(_mm_slli_epi16(_mm_sub_epi16(row2, row6), 2), |
| 1926 |
*((__m128i *) SSE2_1_414213562)); |
| 1927 |
tmp12 = _mm_sub_epi16(tmp12, tmp13); |
| 1928 |
|
| 1929 |
/* tmp0 = tmp10 + tmp13; */ |
| 1930 |
/* tmp3 = tmp10 - tmp13; */ |
| 1931 |
/* tmp1 = tmp11 + tmp12; */ |
| 1932 |
/* tmp2 = tmp11 - tmp12; */ |
| 1933 |
|
| 1934 |
tmp0 = _mm_add_epi16(tmp10, tmp13); |
| 1935 |
tmp3 = _mm_sub_epi16(tmp10, tmp13); |
| 1936 |
tmp1 = _mm_add_epi16(tmp11, tmp12); |
| 1937 |
tmp2 = _mm_sub_epi16(tmp11, tmp12); |
| 1938 |
|
| 1939 |
/* Odd part */ |
| 1940 |
|
| 1941 |
/* z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3]; */ |
| 1942 |
/* z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3]; */ |
| 1943 |
/* z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7]; */ |
| 1944 |
/* z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7]; */ |
| 1945 |
|
| 1946 |
z13 = _mm_add_epi16(row5, row3); |
| 1947 |
z10 = _mm_sub_epi16(row5, row3); |
| 1948 |
z11 = _mm_add_epi16(row1, row7); |
| 1949 |
z12 = _mm_sub_epi16(row1, row7); |
| 1950 |
|
| 1951 |
/* phase 5 */ |
| 1952 |
|
| 1953 |
/* tmp7 = z11 + z13; */ |
| 1954 |
/* tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); */ |
| 1955 |
|
| 1956 |
tmp7 = _mm_add_epi16(z11, z13); |
| 1957 |
tmp11 = _mm_mulhi_epi16(_mm_slli_epi16(_mm_sub_epi16(z11, z13), 2), |
| 1958 |
*((__m128i *) SSE2_1_414213562)); |
| 1959 |
|
| 1960 |
/* z5 = MULTIPLY(z10 + z12, FIX_1_847759065); */ |
| 1961 |
/* tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; */ |
| 1962 |
/* tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; */ |
| 1963 |
|
| 1964 |
/* This is really a mess as the negative 2.61 doesn't work well */ |
| 1965 |
/* as we're working with 16-bit integers. So we're going to apply */ |
| 1966 |
/* a little algebra to get: */ |
| 1967 |
|
| 1968 |
/* tmp10 = z12 * (FIX_1_082392200 - FIX_1_847759065) - z10*FIX_1_847759065 */ |
| 1969 |
/* tmp12 = z10 * (FIX_1_847759065 - FIX_2_613125930) + z12*FIX_1_847759065 */ |
| 1970 |
|
| 1971 |
/* or */ |
| 1972 |
|
| 1973 |
/* tmp10 = z12 * FIX_NEG_0_765366865 - z10 * FIX_1_847759065 */ |
| 1974 |
/* tmp12 = z10 * FIX_NEG_0_765366865 + z12 * FIX_1_847759065 */ |
| 1975 |
|
| 1976 |
z10 = _mm_slli_epi16(z10, 2); |
| 1977 |
z12 = _mm_slli_epi16(z12, 2); |
| 1978 |
|
| 1979 |
tmp10 = _mm_sub_epi16(_mm_mulhi_epi16(z12, *((__m128i *)SSE2_NEG_0_765366865)), |
| 1980 |
_mm_mulhi_epi16(z10, *((__m128i *)SSE2_1_847759065))); |
| 1981 |
tmp12 = _mm_add_epi16(_mm_mulhi_epi16(z10, *((__m128i *)SSE2_NEG_0_765366865)), |
| 1982 |
_mm_mulhi_epi16(z12, *((__m128i *)SSE2_1_847759065))); |
| 1983 |
|
| 1984 |
/* phase 2 */ |
| 1985 |
|
| 1986 |
/* tmp6 = tmp12 - tmp7; */ |
| 1987 |
/* tmp5 = tmp11 - tmp6; */ |
| 1988 |
/* tmp4 = tmp10 + tmp5; */ |
| 1989 |
|
| 1990 |
tmp6 = _mm_sub_epi16(tmp12, tmp7); |
| 1991 |
tmp5 = _mm_sub_epi16(tmp11, tmp6); |
| 1992 |
tmp4 = _mm_add_epi16(tmp10, tmp5); |
| 1993 |
|
| 1994 |
/* outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3) */ |
| 1995 |
/* & RANGE_MASK]; */ |
| 1996 |
/* outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3) */ |
| 1997 |
/* & RANGE_MASK]; */ |
| 1998 |
|
| 1999 |
row0 = _mm_add_epi16(tmp0, tmp7); |
| 2000 |
row7 = _mm_sub_epi16(tmp0, tmp7); |
| 2001 |
|
| 2002 |
/* outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3) */ |
| 2003 |
/* & RANGE_MASK]; */ |
| 2004 |
/* outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3) */ |
| 2005 |
/* & RANGE_MASK]; */ |
| 2006 |
|
| 2007 |
row1 = _mm_add_epi16(tmp1, tmp6); |
| 2008 |
row6 = _mm_sub_epi16(tmp1, tmp6); |
| 2009 |
|
| 2010 |
/* outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3) */ |
| 2011 |
/* & RANGE_MASK]; */ |
| 2012 |
/* outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3) */ |
| 2013 |
/* & RANGE_MASK]; */ |
| 2014 |
|
| 2015 |
row2 = _mm_add_epi16(tmp2, tmp5); |
| 2016 |
row5 = _mm_sub_epi16(tmp2, tmp5); |
| 2017 |
|
| 2018 |
/* outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3) */ |
| 2019 |
/* & RANGE_MASK]; */ |
| 2020 |
/* outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3) */ |
| 2021 |
/* & RANGE_MASK]; */ |
| 2022 |
|
| 2023 |
row4 = _mm_add_epi16(tmp3, tmp4); |
| 2024 |
row3 = _mm_sub_epi16(tmp3, tmp4); |
| 2025 |
|
| 2026 |
/* ====================================================================== */ |
| 2027 |
/* Transpose Matrix (Byte) */ |
| 2028 |
/* ====================================================================== */ |
| 2029 |
|
| 2030 |
/* Shift right after adding half to descale */ |
| 2031 |
|
| 2032 |
row0 = _mm_add_epi16(row0, *((__m128i *) SSE2_ADD_128)); |
| 2033 |
row1 = _mm_add_epi16(row1, *((__m128i *) SSE2_ADD_128)); |
| 2034 |
row2 = _mm_add_epi16(row2, *((__m128i *) SSE2_ADD_128)); |
| 2035 |
row3 = _mm_add_epi16(row3, *((__m128i *) SSE2_ADD_128)); |
| 2036 |
row4 = _mm_add_epi16(row4, *((__m128i *) SSE2_ADD_128)); |
| 2037 |
row5 = _mm_add_epi16(row5, *((__m128i *) SSE2_ADD_128)); |
| 2038 |
row6 = _mm_add_epi16(row6, *((__m128i *) SSE2_ADD_128)); |
| 2039 |
row7 = _mm_add_epi16(row7, *((__m128i *) SSE2_ADD_128)); |
| 2040 |
|
| 2041 |
row0 = _mm_srai_epi16(row0, 5); |
| 2042 |
row1 = _mm_srai_epi16(row1, 5); |
| 2043 |
row2 = _mm_srai_epi16(row2, 5); |
| 2044 |
row3 = _mm_srai_epi16(row3, 5); |
| 2045 |
row4 = _mm_srai_epi16(row4, 5); |
| 2046 |
row5 = _mm_srai_epi16(row5, 5); |
| 2047 |
row6 = _mm_srai_epi16(row6, 5); |
| 2048 |
row7 = _mm_srai_epi16(row7, 5); |
| 2049 |
|
| 2050 |
/* Range Limit and convert Words to Bytes */ |
| 2051 |
|
| 2052 |
row0 = _mm_packus_epi16(row0, row4); |
| 2053 |
row1 = _mm_packus_epi16(row1, row5); |
| 2054 |
row2 = _mm_packus_epi16(row2, row6); |
| 2055 |
row3 = _mm_packus_epi16(row3, row7); |
| 2056 |
|
| 2057 |
/* Transpose from rows back to columns */ |
| 2058 |
|
| 2059 |
row4 = _mm_unpackhi_epi8(row0, row1); /* 40 50 41 51 42 52 43 43 ... */ |
| 2060 |
row5 = _mm_unpackhi_epi8(row2, row3); /* 60 70 61 71 62 72 63 73 ... */ |
| 2061 |
row0 = _mm_unpacklo_epi8(row0, row1); /* 00 10 01 11 02 12 03 13 ... */ |
| 2062 |
row2 = _mm_unpacklo_epi8(row2, row3); /* 20 30 21 31 22 32 23 33 ... */ |
| 2063 |
|
| 2064 |
row6 = _mm_unpackhi_epi16(row0, row2); /* 04 14 24 34 05 15 25 35 ... */ |
| 2065 |
row7 = _mm_unpackhi_epi16(row4, row5); /* 44 54 64 74 45 55 65 75 ... */ |
| 2066 |
row0 = _mm_unpacklo_epi16(row0, row2); /* 00 10 20 30 01 11 21 31 ... */ |
| 2067 |
row4 = _mm_unpacklo_epi16(row4, row5); /* 40 50 60 70 41 51 61 71 ... */ |
| 2068 |
|
| 2069 |
row1 = _mm_unpackhi_epi32(row0, row4); /* 02 12 22 32 42 52 62 72 ... */ |
| 2070 |
row2 = _mm_unpackhi_epi32(row6, row7); /* 06 16 26 36 46 56 66 76 ... */ |
| 2071 |
row0 = _mm_unpacklo_epi32(row0, row4); /* 00 10 20 30 40 50 60 70 ... */ |
| 2072 |
row6 = _mm_unpacklo_epi32(row6, row7); /* 04 14 24 34 55 54 64 74 ... */ |
| 2073 |
|
| 2074 |
/* Rearrange for readability */ |
| 2075 |
|
| 2076 |
row3 = row2; |
| 2077 |
row2 = row6; |
| 2078 |
|
| 2079 |
/* ====================================================================== */ |
| 2080 |
/* Final output */ |
| 2081 |
/* ====================================================================== */ |
| 2082 |
|
| 2083 |
outptr0 = output_buf[0] + output_col; |
| 2084 |
outptr1 = output_buf[1] + output_col; |
| 2085 |
outptr2 = output_buf[2] + output_col; |
| 2086 |
outptr3 = output_buf[3] + output_col; |
| 2087 |
outptr4 = output_buf[4] + output_col; |
| 2088 |
outptr5 = output_buf[5] + output_col; |
| 2089 |
outptr6 = output_buf[6] + output_col; |
| 2090 |
outptr7 = output_buf[7] + output_col; |
| 2091 |
|
| 2092 |
/* We can't use the faster FP instructions to write out the high quad */ |
| 2093 |
/* so do a rotate right and write them out as the low quad */ |
| 2094 |
|
| 2095 |
row4 = _mm_srli_si128(row0, 8); |
| 2096 |
row5 = _mm_srli_si128(row1, 8); |
| 2097 |
row6 = _mm_srli_si128(row2, 8); |
| 2098 |
row7 = _mm_srli_si128(row3, 8); |
| 2099 |
|
| 2100 |
_mm_storel_epi64((__m128i *) outptr0, row0); |
| 2101 |
_mm_storel_epi64((__m128i *) outptr2, row1); |
| 2102 |
_mm_storel_epi64((__m128i *) outptr4, row2); |
| 2103 |
_mm_storel_epi64((__m128i *) outptr6, row3); |
| 2104 |
_mm_storel_epi64((__m128i *) outptr1, row4); |
| 2105 |
_mm_storel_epi64((__m128i *) outptr3, row5); |
| 2106 |
_mm_storel_epi64((__m128i *) outptr5, row6); |
| 2107 |
_mm_storel_epi64((__m128i *) outptr7, row7); |
| 2108 |
} |
| 2109 |
#endif /* HAVE_SSE2_INTRINSICS */ |
| 2110 |
|
| 1650 |
#endif /* DCT_IFAST_SUPPORTED */ |
2111 |
#endif /* DCT_IFAST_SUPPORTED */ |