comparison postproc/postprocess_template.c @ 2475:3369845d92f4

3dnow dering
author michael
date Thu, 25 Oct 2001 22:50:03 +0000
parents 94a0265c408c
children a6c5a537f30a
comparison
equal deleted inserted replaced
2474:2e9442544447 2475:3369845d92f4
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"