Mercurial > libavcodec.hg
comparison libpostproc/postprocess_template.c @ 132:c4caf29acc1a libavcodec
3dnow dering
| author | michael |
|---|---|
| date | Thu, 25 Oct 2001 22:50:03 +0000 |
| parents | 0cce5d30d1d8 |
| children | e0bf2e9ce24c |
comparison
equal
deleted
inserted
replaced
| 131:f91bb7527628 | 132:c4caf29acc1a |
|---|---|
| 24 doVertDefFilter Ec Ec Ec | 24 doVertDefFilter Ec Ec Ec |
| 25 isHorizDC Ec Ec | 25 isHorizDC Ec Ec |
| 26 isHorizMinMaxOk a E | 26 isHorizMinMaxOk a E |
| 27 doHorizLowPass E e e | 27 doHorizLowPass E e e |
| 28 doHorizDefFilter Ec Ec Ec | 28 doHorizDefFilter Ec Ec Ec |
| 29 deRing e | 29 deRing e e* |
| 30 Vertical RKAlgo1 E a a | 30 Vertical RKAlgo1 E a a |
| 31 Horizontal RKAlgo1 a a | 31 Horizontal RKAlgo1 a a |
| 32 Vertical X1 a E E | 32 Vertical X1 a E E |
| 33 Horizontal X1 a E E | 33 Horizontal X1 a E E |
| 34 LinIpolDeinterlace e E E* | 34 LinIpolDeinterlace e E E* |
| 1806 #endif | 1806 #endif |
| 1807 } | 1807 } |
| 1808 | 1808 |
| 1809 static inline void dering(uint8_t src[], int stride, int QP) | 1809 static inline void dering(uint8_t src[], int stride, int QP) |
| 1810 { | 1810 { |
| 1811 #ifdef HAVE_MMX2 | 1811 #if defined (HAVE_MMX2) || defined (HAVE_3DNOW) |
| 1812 asm volatile( | 1812 asm volatile( |
| 1813 "movq pQPb, %%mm0 \n\t" | 1813 "movq pQPb, %%mm0 \n\t" |
| 1814 "paddusb %%mm0, %%mm0 \n\t" | 1814 "paddusb %%mm0, %%mm0 \n\t" |
| 1815 "movq %%mm0, pQPb2 \n\t" | 1815 "movq %%mm0, pQPb2 \n\t" |
| 1816 | 1816 |
| 1819 // 0 1 2 3 4 5 6 7 8 9 | 1819 // 0 1 2 3 4 5 6 7 8 9 |
| 1820 // %0 eax eax+%1 eax+2%1 %0+4%1 ebx ebx+%1 ebx+2%1 %0+8%1 ebx+4%1 | 1820 // %0 eax eax+%1 eax+2%1 %0+4%1 ebx ebx+%1 ebx+2%1 %0+8%1 ebx+4%1 |
| 1821 | 1821 |
| 1822 "pcmpeqb %%mm6, %%mm6 \n\t" | 1822 "pcmpeqb %%mm6, %%mm6 \n\t" |
| 1823 "pxor %%mm7, %%mm7 \n\t" | 1823 "pxor %%mm7, %%mm7 \n\t" |
| 1824 | 1824 #ifdef HAVE_MMX2 |
| 1825 #define FIND_MIN_MAX(addr)\ | 1825 #define FIND_MIN_MAX(addr)\ |
| 1826 "movq " #addr ", %%mm0 \n\t"\ | 1826 "movq " #addr ", %%mm0 \n\t"\ |
| 1827 "pminub %%mm0, %%mm6 \n\t"\ | 1827 "pminub %%mm0, %%mm6 \n\t"\ |
| 1828 "pmaxub %%mm0, %%mm7 \n\t" | 1828 "pmaxub %%mm0, %%mm7 \n\t" |
| 1829 #else | |
| 1830 #define FIND_MIN_MAX(addr)\ | |
| 1831 "movq " #addr ", %%mm0 \n\t"\ | |
| 1832 "movq %%mm6, %%mm1 \n\t"\ | |
| 1833 "psubusb %%mm0, %%mm7 \n\t"\ | |
| 1834 "paddb %%mm0, %%mm7 \n\t"\ | |
| 1835 "psubusb %%mm0, %%mm1 \n\t"\ | |
| 1836 "psubb %%mm1, %%mm6 \n\t" | |
| 1837 #endif | |
| 1829 | 1838 |
| 1830 FIND_MIN_MAX((%%eax)) | 1839 FIND_MIN_MAX((%%eax)) |
| 1831 FIND_MIN_MAX((%%eax, %1)) | 1840 FIND_MIN_MAX((%%eax, %1)) |
| 1832 FIND_MIN_MAX((%%eax, %1, 2)) | 1841 FIND_MIN_MAX((%%eax, %1, 2)) |
| 1833 FIND_MIN_MAX((%0, %1, 4)) | 1842 FIND_MIN_MAX((%0, %1, 4)) |
| 1836 FIND_MIN_MAX((%%ebx, %1, 2)) | 1845 FIND_MIN_MAX((%%ebx, %1, 2)) |
| 1837 FIND_MIN_MAX((%0, %1, 8)) | 1846 FIND_MIN_MAX((%0, %1, 8)) |
| 1838 | 1847 |
| 1839 "movq %%mm6, %%mm4 \n\t" | 1848 "movq %%mm6, %%mm4 \n\t" |
| 1840 "psrlq $8, %%mm6 \n\t" | 1849 "psrlq $8, %%mm6 \n\t" |
| 1850 #ifdef HAVE_MMX2 | |
| 1841 "pminub %%mm4, %%mm6 \n\t" // min of pixels | 1851 "pminub %%mm4, %%mm6 \n\t" // min of pixels |
| 1842 #ifdef HAVE_MMX2 | |
| 1843 "pshufw $0xF9, %%mm6, %%mm4 \n\t" | 1852 "pshufw $0xF9, %%mm6, %%mm4 \n\t" |
| 1844 "pminub %%mm4, %%mm6 \n\t" // min of pixels | 1853 "pminub %%mm4, %%mm6 \n\t" // min of pixels |
| 1845 "pshufw $0xFE, %%mm6, %%mm4 \n\t" | 1854 "pshufw $0xFE, %%mm6, %%mm4 \n\t" |
| 1855 "pminub %%mm4, %%mm6 \n\t" | |
| 1846 #else | 1856 #else |
| 1857 "movq %%mm6, %%mm1 \n\t" | |
| 1858 "psubusb %%mm4, %%mm1 \n\t" | |
| 1859 "psubb %%mm1, %%mm6 \n\t" | |
| 1847 "movq %%mm6, %%mm4 \n\t" | 1860 "movq %%mm6, %%mm4 \n\t" |
| 1848 "psrlq $16, %%mm6 \n\t" | 1861 "psrlq $16, %%mm6 \n\t" |
| 1849 "pminub %%mm4, %%mm6 \n\t" | 1862 "movq %%mm6, %%mm1 \n\t" |
| 1863 "psubusb %%mm4, %%mm1 \n\t" | |
| 1864 "psubb %%mm1, %%mm6 \n\t" | |
| 1850 "movq %%mm6, %%mm4 \n\t" | 1865 "movq %%mm6, %%mm4 \n\t" |
| 1851 "psrlq $32, %%mm6 \n\t" | 1866 "psrlq $32, %%mm6 \n\t" |
| 1852 #endif | 1867 "movq %%mm6, %%mm1 \n\t" |
| 1853 "pminub %%mm4, %%mm6 \n\t" | 1868 "psubusb %%mm4, %%mm1 \n\t" |
| 1869 "psubb %%mm1, %%mm6 \n\t" | |
| 1870 #endif | |
| 1854 | 1871 |
| 1855 | 1872 |
| 1856 "movq %%mm7, %%mm4 \n\t" | 1873 "movq %%mm7, %%mm4 \n\t" |
| 1857 "psrlq $8, %%mm7 \n\t" | 1874 "psrlq $8, %%mm7 \n\t" |
| 1875 #ifdef HAVE_MMX2 | |
| 1858 "pmaxub %%mm4, %%mm7 \n\t" // max of pixels | 1876 "pmaxub %%mm4, %%mm7 \n\t" // max of pixels |
| 1859 #ifdef HAVE_MMX2 | |
| 1860 "pshufw $0xF9, %%mm7, %%mm4 \n\t" | 1877 "pshufw $0xF9, %%mm7, %%mm4 \n\t" |
| 1861 "pmaxub %%mm4, %%mm7 \n\t" // min of pixels | 1878 "pmaxub %%mm4, %%mm7 \n\t" |
| 1862 "pshufw $0xFE, %%mm7, %%mm4 \n\t" | 1879 "pshufw $0xFE, %%mm7, %%mm4 \n\t" |
| 1880 "pmaxub %%mm4, %%mm7 \n\t" | |
| 1863 #else | 1881 #else |
| 1882 "psubusb %%mm4, %%mm7 \n\t" | |
| 1883 "paddb %%mm4, %%mm7 \n\t" | |
| 1864 "movq %%mm7, %%mm4 \n\t" | 1884 "movq %%mm7, %%mm4 \n\t" |
| 1865 "psrlq $16, %%mm7 \n\t" | 1885 "psrlq $16, %%mm7 \n\t" |
| 1866 "pmaxub %%mm4, %%mm7 \n\t" | 1886 "psubusb %%mm4, %%mm7 \n\t" |
| 1887 "paddb %%mm4, %%mm7 \n\t" | |
| 1867 "movq %%mm7, %%mm4 \n\t" | 1888 "movq %%mm7, %%mm4 \n\t" |
| 1868 "psrlq $32, %%mm7 \n\t" | 1889 "psrlq $32, %%mm7 \n\t" |
| 1869 #endif | 1890 "psubusb %%mm4, %%mm7 \n\t" |
| 1870 "pmaxub %%mm4, %%mm7 \n\t" | 1891 "paddb %%mm4, %%mm7 \n\t" |
| 1892 #endif | |
| 1871 PAVGB(%%mm6, %%mm7) // a=(max + min)/2 | 1893 PAVGB(%%mm6, %%mm7) // a=(max + min)/2 |
| 1872 "punpcklbw %%mm7, %%mm7 \n\t" | 1894 "punpcklbw %%mm7, %%mm7 \n\t" |
| 1873 "punpcklbw %%mm7, %%mm7 \n\t" | 1895 "punpcklbw %%mm7, %%mm7 \n\t" |
| 1874 "punpcklbw %%mm7, %%mm7 \n\t" | 1896 "punpcklbw %%mm7, %%mm7 \n\t" |
| 1875 "movq %%mm7, temp0 \n\t" | 1897 "movq %%mm7, temp0 \n\t" |
