History

add new c and assembly functions to optimize downsampler when downscale equal 1:3/1:4

Guangwei Wang committed 11 years ago

Commit 64657d31 parent 69a62ea9 files · +1125 −8Browse files

Showing the changes to codec/processing/src/x86 (1 of 9 files). Show all

Unified · Split

codec/processing/src/x86/downsample_bilinear.asm+699−0
@@ -67,6 +67,22 @@ shufb_mask_high: · 66 unmodified lines
6767 add_extra_half:
6868 dd 16384,0,0,0
6969
70+shufb_mask_quarter:
71+db 00h, 04h, 08h, 0ch, 80h, 80h, 80h, 80h, 01h, 05h, 09h, 0dh, 80h, 80h, 80h, 80h
72+
73+shufb_mask_onethird_low_1:
74+db 00h, 03h, 06h, 09h, 0ch, 0fh, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h
75+shufb_mask_onethird_low_2:
76+db 80h, 80h, 80h, 80h, 80h, 80h, 02h, 05h, 08h, 0bh, 0eh, 80h, 80h, 80h, 80h, 80h
77+shufb_mask_onethird_low_3:
78+db 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 01h, 04h, 07h, 0ah, 0dh
79+
80+shufb_mask_onethird_high_1:
81+db 01h, 04h, 07h, 0ah, 0dh, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h
82+shufb_mask_onethird_high_2:
83+db 80h, 80h, 80h, 80h, 80h, 00h, 03h, 06h, 09h, 0ch, 0fh, 80h, 80h, 80h, 80h, 80h
84+shufb_mask_onethird_high_3:
85+db 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 02h, 05h, 08h, 0bh, 0eh
7086
7187 ;***********************************************************************
7288 ; Code
@@ -1896,3 +1912,686 @@ FAST_LAST_ROW_END: · 1823 unmodified lines
18961912 pop r12
18971913 ret
18981914 %endif
1915+
1916+;***********************************************************************
1917+; void DyadicBilinearOneThirdDownsampler_ssse3( unsigned char* pDst, const int iDstStride,
1918+; unsigned char* pSrc, const int iSrcStride,
1919+; const int iSrcWidth, const int iSrcHeight );
1920+;***********************************************************************
1921+WELS_EXTERN DyadicBilinearOneThirdDownsampler_ssse3
1922+%ifdef X86_32
1923+ push r6
1924+ %assign push_num 1
1925+%else
1926+ %assign push_num 0
1927+%endif
1928+ LOAD_6_PARA
1929+ PUSH_XMM 8
1930+ SIGN_EXTENSION r1, r1d
1931+ SIGN_EXTENSION r3, r3d
1932+ SIGN_EXTENSION r4, r4d
1933+ SIGN_EXTENSION r5, r5d
1934+
1935+%ifndef X86_32
1936+ push r12
1937+ mov r12, r4
1938+%endif
1939+
1940+ mov r6, r1 ;Save the tailer for the unasigned size
1941+ imul r6, r5
1942+ add r6, r0
1943+ movdqa xmm7, [r6]
1944+
1945+.yloops_onethird_sse3:
1946+%ifdef X86_32
1947+ mov r4, arg5
1948+%else
1949+ mov r4, r12
1950+%endif
1951+
1952+ mov r6, r0 ;save base address
1953+ ; each loop = source bandwidth: 48 bytes
1954+.xloops_onethird_sse3:
1955+ ; 1st part horizonal loop: x48 bytes
1956+ ; mem hi<- ->lo
1957+ ;1st Line Src: xmm0: F * e E * d D * c C * b B * a A
1958+ ; xmm2: k K * j J * i I * h H * g G * f
1959+ ; xmm2: * p P * o O * n N * m M * l L *
1960+ ;
1961+ ;2nd Line Src: xmm2: F' * e' E' * d' D' * c' C' * b' B' * a' A'
1962+ ; xmm1: k' K' * j' J' * i' I' * h' H' * g' G' * f'
1963+ ; xmm1: * p' P' * o' O' * n' N' * m' M' * l' L' *
1964+ ;=> target:
1965+ ;: P O N M L K J I H G F E D C B A
1966+ ;: p o n m l k j i h g f e d c b a
1967+ ;: P' .. A'
1968+ ;: p' .. a'
1969+
1970+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1971+ ;1st line
1972+ movdqa xmm0, [r2] ;F * e E * d D * c C * b B * a A
1973+ movdqa xmm1, xmm0
1974+ movdqa xmm5, [shufb_mask_onethird_low_1]
1975+ movdqa xmm6, [shufb_mask_onethird_high_1]
1976+ pshufb xmm0, xmm5 ;0 0 0 0 0 0 0 0 0 0 F E D C B A -> xmm0
1977+ pshufb xmm1, xmm6 ;0 0 0 0 0 0 0 0 0 0 0 e d c b a -> xmm1
1978+
1979+ movdqa xmm2, [r2+16] ;k K * j J * i I * h H * g G * f
1980+ movdqa xmm3, xmm2
1981+ movdqa xmm5, [shufb_mask_onethird_low_2]
1982+ movdqa xmm6, [shufb_mask_onethird_high_2]
1983+ pshufb xmm2, xmm5 ;0 0 0 0 0 K J I H G 0 0 0 0 0 0 -> xmm2
1984+ pshufb xmm3, xmm6 ;0 0 0 0 0 k j i h g f 0 0 0 0 0 -> xmm3
1985+
1986+ paddusb xmm0, xmm2 ;0 0 0 0 0 K J I H G F E D C B A -> xmm0
1987+ paddusb xmm1, xmm3 ;0 0 0 0 0 k j i h g f e d c b a -> xmm1
1988+
1989+ movdqa xmm2, [r2+32] ;* p P * o O * n N * m M * l L *
1990+ movdqa xmm3, xmm2
1991+ movdqa xmm5, [shufb_mask_onethird_low_3]
1992+ movdqa xmm6, [shufb_mask_onethird_high_3]
1993+ pshufb xmm2, xmm5 ;P O N M L 0 0 0 0 0 0 0 0 0 0 0 -> xmm2
1994+ pshufb xmm3, xmm6 ;p o n m l 0 0 0 0 0 0 0 0 0 0 0 -> xmm3
1995+
1996+ paddusb xmm0, xmm2 ;P O N M L K J I H G F E D C B A -> xmm0
1997+ paddusb xmm1, xmm3 ;p o n m l k j i h g f e d c b a -> xmm1
1998+ pavgb xmm0, xmm1 ;1st line average -> xmm0
1999+
2000+ ;2nd line
2001+ movdqa xmm2, [r2+r3] ;F' * e' E' * d' D' * c' C' * b' B' * a' A'
2002+ movdqa xmm3, xmm2
2003+ movdqa xmm5, [shufb_mask_onethird_low_1]
2004+ movdqa xmm6, [shufb_mask_onethird_high_1]
2005+ pshufb xmm2, xmm5 ;0 0 0 0 0 0 0 0 0 0 F' E' D' C' B' A' -> xmm2
2006+ pshufb xmm3, xmm6 ;0 0 0 0 0 0 0 0 0 0 0 e' d' c' b' a' -> xmm3
2007+
2008+ movdqa xmm1, [r2+r3+16] ;k' K' * j' J' * i' I' * h' H' * g' G' * f'
2009+ movdqa xmm4, xmm1
2010+ movdqa xmm5, [shufb_mask_onethird_low_2]
2011+ movdqa xmm6, [shufb_mask_onethird_high_2]
2012+ pshufb xmm1, xmm5 ;0 0 0 0 0 K' J' I' H' G' 0 0 0 0 0 0 -> xmm1
2013+ pshufb xmm4, xmm6 ;0 0 0 0 0 k' j' i' h' g' f' 0 0 0 0 0 -> xmm4
2014+
2015+ paddusb xmm2, xmm1 ;0 0 0 0 0 K' J' I' H' G' F' E' D' C' B' A' -> xmm2
2016+ paddusb xmm3, xmm4 ;0 0 0 0 0 k' j' i' h' g' f' e' d' c' b' a' -> xmm3
2017+
2018+ movdqa xmm1, [r2+r3+32] ; * p' P' * o' O' * n' N' * m' M' * l' L' *
2019+ movdqa xmm4, xmm1
2020+ movdqa xmm5, [shufb_mask_onethird_low_3]
2021+ movdqa xmm6, [shufb_mask_onethird_high_3]
2022+ pshufb xmm1, xmm5 ;P' O' N' M' L' 0 0 0 0 0 0 0 0 0 0 0 -> xmm1
2023+ pshufb xmm4, xmm6 ;p' o' n' m' l' 0 0 0 0 0 0 0 0 0 0 0 -> xmm4
2024+
2025+ paddusb xmm2, xmm1 ;P' O' N' M' L' K' J' I' H' G' F' E' D' C' B' A' -> xmm2
2026+ paddusb xmm3, xmm4 ;p' o' n' m' l' k' j' i' h' g' f' e' d' c' b' a' -> xmm3
2027+ pavgb xmm2, xmm3 ;2nd line average -> xmm2
2028+
2029+ pavgb xmm0, xmm2 ; bytes-average(1st line , 2nd line )
2030+
2031+ ; write pDst
2032+ movdqa [r0], xmm0 ;write result in dst
2033+
2034+ ; next SMB
2035+ lea r2, [r2+48] ;current src address
2036+ lea r0, [r0+16] ;current dst address
2037+
2038+ sub r4, 48 ;xloops counter
2039+ cmp r4, 0
2040+ jg near .xloops_onethird_sse3
2041+
2042+ sub r6, r0 ;offset = base address - current address
2043+ lea r2, [r2+2*r3] ;
2044+ lea r2, [r2+r3] ;
2045+ lea r2, [r2+2*r6] ;current line + 3 lines
2046+ lea r2, [r2+r6]
2047+ lea r0, [r0+r1]
2048+ lea r0, [r0+r6] ;current dst lien + 1 line
2049+
2050+ dec r5
2051+ jg near .yloops_onethird_sse3
2052+
2053+ movdqa [r0], xmm7 ;restore the tailer for the unasigned size
2054+
2055+%ifndef X86_32
2056+ pop r12
2057+%endif
2058+
2059+ POP_XMM
2060+ LOAD_6_PARA_POP
2061+%ifdef X86_32
2062+ pop r6
2063+%endif
2064+ ret
2065+
2066+;***********************************************************************
2067+; void DyadicBilinearOneThirdDownsampler_sse4( unsigned char* pDst, const int iDstStride,
2068+; unsigned char* pSrc, const int iSrcStride,
2069+; const int iSrcWidth, const int iSrcHeight );
2070+;***********************************************************************
2071+WELS_EXTERN DyadicBilinearOneThirdDownsampler_sse4
2072+%ifdef X86_32
2073+ push r6
2074+ %assign push_num 1
2075+%else
2076+ %assign push_num 0
2077+%endif
2078+ LOAD_6_PARA
2079+ PUSH_XMM 8
2080+ SIGN_EXTENSION r1, r1d
2081+ SIGN_EXTENSION r3, r3d
2082+ SIGN_EXTENSION r4, r4d
2083+ SIGN_EXTENSION r5, r5d
2084+
2085+%ifndef X86_32
2086+ push r12
2087+ mov r12, r4
2088+%endif
2089+
2090+ mov r6, r1 ;Save the tailer for the unasigned size
2091+ imul r6, r5
2092+ add r6, r0
2093+ movdqa xmm7, [r6]
2094+
2095+.yloops_onethird_sse4:
2096+%ifdef X86_32
2097+ mov r4, arg5
2098+%else
2099+ mov r4, r12
2100+%endif
2101+
2102+ mov r6, r0 ;save base address
2103+ ; each loop = source bandwidth: 48 bytes
2104+.xloops_onethird_sse4:
2105+ ; 1st part horizonal loop: x48 bytes
2106+ ; mem hi<- ->lo
2107+ ;1st Line Src: xmm0: F * e E * d D * c C * b B * a A
2108+ ; xmm2: k K * j J * i I * h H * g G * f
2109+ ; xmm2: * p P * o O * n N * m M * l L *
2110+ ;
2111+ ;2nd Line Src: xmm2: F' * e' E' * d' D' * c' C' * b' B' * a' A'
2112+ ; xmm1: k' K' * j' J' * i' I' * h' H' * g' G' * f'
2113+ ; xmm1: * p' P' * o' O' * n' N' * m' M' * l' L' *
2114+ ;=> target:
2115+ ;: P O N M L K J I H G F E D C B A
2116+ ;: p o n m l k j i h g f e d c b a
2117+ ;: P' .. A'
2118+ ;: p' .. a'
2119+
2120+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2121+ ;1st line
2122+ movntdqa xmm0, [r2] ;F * e E * d D * c C * b B * a A
2123+ movdqa xmm1, xmm0
2124+ movdqa xmm5, [shufb_mask_onethird_low_1]
2125+ movdqa xmm6, [shufb_mask_onethird_high_1]
2126+ pshufb xmm0, xmm5 ;0 0 0 0 0 0 0 0 0 0 F E D C B A -> xmm0
2127+ pshufb xmm1, xmm6 ;0 0 0 0 0 0 0 0 0 0 0 e d c b a -> xmm1
2128+
2129+ movntdqa xmm2, [r2+16] ;k K * j J * i I * h H * g G * f
2130+ movdqa xmm3, xmm2
2131+ movdqa xmm5, [shufb_mask_onethird_low_2]
2132+ movdqa xmm6, [shufb_mask_onethird_high_2]
2133+ pshufb xmm2, xmm5 ;0 0 0 0 0 K J I H G 0 0 0 0 0 0 -> xmm2
2134+ pshufb xmm3, xmm6 ;0 0 0 0 0 k j i h g f 0 0 0 0 0 -> xmm3
2135+
2136+ paddusb xmm0, xmm2 ;0 0 0 0 0 K J I H G F E D C B A -> xmm0
2137+ paddusb xmm1, xmm3 ;0 0 0 0 0 k j i h g f e d c b a -> xmm1
2138+
2139+ movntdqa xmm2, [r2+32] ;* p P * o O * n N * m M * l L *
2140+ movdqa xmm3, xmm2
2141+ movdqa xmm5, [shufb_mask_onethird_low_3]
2142+ movdqa xmm6, [shufb_mask_onethird_high_3]
2143+ pshufb xmm2, xmm5 ;P O N M L 0 0 0 0 0 0 0 0 0 0 0 -> xmm2
2144+ pshufb xmm3, xmm6 ;p o n m l 0 0 0 0 0 0 0 0 0 0 0 -> xmm3
2145+
2146+ paddusb xmm0, xmm2 ;P O N M L K J I H G F E D C B A -> xmm0
2147+ paddusb xmm1, xmm3 ;p o n m l k j i h g f e d c b a -> xmm1
2148+ pavgb xmm0, xmm1 ;1st line average -> xmm0
2149+
2150+ ;2nd line
2151+ movntdqa xmm2, [r2+r3] ;F' * e' E' * d' D' * c' C' * b' B' * a' A'
2152+ movdqa xmm3, xmm2
2153+ movdqa xmm5, [shufb_mask_onethird_low_1]
2154+ movdqa xmm6, [shufb_mask_onethird_high_1]
2155+ pshufb xmm2, xmm5 ;0 0 0 0 0 0 0 0 0 0 F' E' D' C' B' A' -> xmm2
2156+ pshufb xmm3, xmm6 ;0 0 0 0 0 0 0 0 0 0 0 e' d' c' b' a' -> xmm3
2157+
2158+ movntdqa xmm1, [r2+r3+16] ;k' K' * j' J' * i' I' * h' H' * g' G' * f'
2159+ movdqa xmm4, xmm1
2160+ movdqa xmm5, [shufb_mask_onethird_low_2]
2161+ movdqa xmm6, [shufb_mask_onethird_high_2]
2162+ pshufb xmm1, xmm5 ;0 0 0 0 0 K' J' I' H' G' 0 0 0 0 0 0 -> xmm1
2163+ pshufb xmm4, xmm6 ;0 0 0 0 0 k' j' i' h' g' f' 0 0 0 0 0 -> xmm4
2164+
2165+ paddusb xmm2, xmm1 ;0 0 0 0 0 K' J' I' H' G' F' E' D' C' B' A' -> xmm2
2166+ paddusb xmm3, xmm4 ;0 0 0 0 0 k' j' i' h' g' f' e' d' c' b' a' -> xmm3
2167+
2168+ movntdqa xmm1, [r2+r3+32] ; * p' P' * o' O' * n' N' * m' M' * l' L' *
2169+ movdqa xmm4, xmm1
2170+ movdqa xmm5, [shufb_mask_onethird_low_3]
2171+ movdqa xmm6, [shufb_mask_onethird_high_3]
2172+ pshufb xmm1, xmm5 ;P' O' N' M' L' 0 0 0 0 0 0 0 0 0 0 0 -> xmm1
2173+ pshufb xmm4, xmm6 ;p' o' n' m' l' 0 0 0 0 0 0 0 0 0 0 0 -> xmm4
2174+
2175+ paddusb xmm2, xmm1 ;P' O' N' M' L' K' J' I' H' G' F' E' D' C' B' A' -> xmm2
2176+ paddusb xmm3, xmm4 ;p' o' n' m' l' k' j' i' h' g' f' e' d' c' b' a' -> xmm3
2177+ pavgb xmm2, xmm3 ;2nd line average -> xmm2
2178+
2179+ pavgb xmm0, xmm2 ; bytes-average(1st line , 2nd line )
2180+
2181+ ; write pDst
2182+ movdqa [r0], xmm0 ;write result in dst
2183+
2184+ ; next SMB
2185+ lea r2, [r2+48] ;current src address
2186+ lea r0, [r0+16] ;current dst address
2187+
2188+ sub r4, 48 ;xloops counter
2189+ cmp r4, 0
2190+ jg near .xloops_onethird_sse4
2191+
2192+ sub r6, r0 ;offset = base address - current address
2193+ lea r2, [r2+2*r3] ;
2194+ lea r2, [r2+r3] ;
2195+ lea r2, [r2+2*r6] ;current line + 3 lines
2196+ lea r2, [r2+r6]
2197+ lea r0, [r0+r1]
2198+ lea r0, [r0+r6] ;current dst lien + 1 line
2199+
2200+ dec r5
2201+ jg near .yloops_onethird_sse4
2202+
2203+ movdqa [r0], xmm7 ;restore the tailer for the unasigned size
2204+
2205+%ifndef X86_32
2206+ pop r12
2207+%endif
2208+
2209+ POP_XMM
2210+ LOAD_6_PARA_POP
2211+%ifdef X86_32
2212+ pop r6
2213+%endif
2214+ ret
2215+
2216+;***********************************************************************
2217+; void DyadicBilinearQuarterDownsampler_sse( unsigned char* pDst, const int iDstStride,
2218+; unsigned char* pSrc, const int iSrcStride,
2219+; const int iSrcWidth, const int iSrcHeight );
2220+;***********************************************************************
2221+WELS_EXTERN DyadicBilinearQuarterDownsampler_sse
2222+%ifdef X86_32
2223+ push r6
2224+ %assign push_num 1
2225+%else
2226+ %assign push_num 0
2227+%endif
2228+ LOAD_6_PARA
2229+ SIGN_EXTENSION r1, r1d
2230+ SIGN_EXTENSION r3, r3d
2231+ SIGN_EXTENSION r4, r4d
2232+ SIGN_EXTENSION r5, r5d
2233+
2234+%ifndef X86_32
2235+ push r12
2236+ mov r12, r4
2237+%endif
2238+ sar r5, $02 ; iSrcHeight >> 2
2239+
2240+ mov r6, r1 ;Save the tailer for the unasigned size
2241+ imul r6, r5
2242+ add r6, r0
2243+ movq xmm7, [r6]
2244+
2245+.yloops_quarter_sse:
2246+%ifdef X86_32
2247+ mov r4, arg5
2248+%else
2249+ mov r4, r12
2250+%endif
2251+
2252+ mov r6, r0 ;save base address
2253+ ; each loop = source bandwidth: 32 bytes
2254+.xloops_quarter_sse:
2255+ ; 1st part horizonal loop: x16 bytes
2256+ ; mem hi<- ->lo
2257+ ;1st Line Src: mm0: d D c C b B a A mm1: h H g G f F e E
2258+ ;2nd Line Src: mm2: l L k K j J i I mm3: p P o O n N m M
2259+ ;
2260+ ;=> target:
2261+ ;: G E C A,
2262+ ;:
2263+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2264+ movq mm0, [r2] ; 1st pSrc line
2265+ movq mm1, [r2+8] ; 1st pSrc line + 8
2266+ movq mm2, [r2+r3] ; 2nd pSrc line
2267+ movq mm3, [r2+r3+8] ; 2nd pSrc line + 8
2268+
2269+ pshufw mm0, mm0, 0d8h ; x X x X c C a A
2270+ pshufw mm1, mm1, 0d8h ; x X x X g G e E
2271+ pshufw mm2, mm2, 0d8h ; x X x X k K i I
2272+ pshufw mm3, mm3, 0d8h ; x X x X o O m M
2273+
2274+ punpckldq mm0, mm1 ; g G e E c C a A
2275+ punpckldq mm2, mm3 ; o O m M k K i I
2276+
2277+ ; to handle mm0,mm2
2278+ pshufw mm4, mm0, 0d8h ;g G c C e E a A
2279+ pshufw mm5, mm4, 04eh ;e E a A g G c C
2280+ punpcklbw mm4, mm5 ;g e G E c a C A -> mm4
2281+ pshufw mm4, mm4, 0d8h ;g e c a G E C A -> mm4
2282+
2283+ pshufw mm5, mm2, 0d8h ;o O k K m M i I
2284+ pshufw mm6, mm5, 04eh ;m M i I o O k K
2285+ punpcklbw mm5, mm6 ;o m O M k i K I
2286+ pshufw mm5, mm5, 0d8h ;o m k i O M K I -> mm5
2287+
2288+ ; to handle mm4, mm5
2289+ movq mm0, mm4
2290+ punpckldq mm0, mm6 ;x x x x G E C A
2291+ punpckhdq mm4, mm6 ;x x x x g e c a
2292+
2293+ movq mm1, mm5
2294+ punpckldq mm1, mm6 ;x x x x O M K I
2295+ punpckhdq mm5, mm6 ;x x x x o m k i
2296+
2297+ ; avg within MB horizon width (8 x 2 lines)
2298+ pavgb mm0, mm4 ; (A+a+1)>>1, .., (H+h+1)>>1, temp_row1
2299+ pavgb mm1, mm5 ; (I+i+1)>>1, .., (P+p+1)>>1, temp_row2
2300+ pavgb mm0, mm1 ; (temp_row1+temp_row2+1)>>1, pending here and wait another horizonal part done then write memory once
2301+
2302+ ; 2nd part horizonal loop: x16 bytes
2303+ movq mm1, [r2+16] ; 1st pSrc line + 16
2304+ movq mm2, [r2+24] ; 1st pSrc line + 24
2305+ movq mm3, [r2+r3+16] ; 2nd pSrc line + 16
2306+ movq mm4, [r2+r3+24] ; 2nd pSrc line + 24
2307+
2308+ pshufw mm1, mm1, 0d8h
2309+ pshufw mm2, mm2, 0d8h
2310+ pshufw mm3, mm3, 0d8h
2311+ pshufw mm4, mm4, 0d8h
2312+
2313+ punpckldq mm1, mm2
2314+ punpckldq mm3, mm4
2315+
2316+ ; to handle mm1, mm3
2317+ pshufw mm4, mm1, 0d8h
2318+ pshufw mm5, mm4, 04eh
2319+ punpcklbw mm4, mm5
2320+ pshufw mm4, mm4, 0d8h
2321+
2322+ pshufw mm5, mm3, 0d8h
2323+ pshufw mm6, mm5, 04eh
2324+ punpcklbw mm5, mm6
2325+ pshufw mm5, mm5, 0d8h
2326+
2327+ ; to handle mm4, mm5
2328+ movq mm2, mm4
2329+ punpckldq mm2, mm6
2330+ punpckhdq mm4, mm6
2331+
2332+ movq mm3, mm5
2333+ punpckldq mm3, mm6
2334+ punpckhdq mm5, mm6
2335+
2336+ ; avg within MB horizon width (8 x 2 lines)
2337+ pavgb mm2, mm4 ; (A+a+1)>>1, .., (H+h+1)>>1, temp_row1
2338+ pavgb mm3, mm5 ; (I+i+1)>>1, .., (P+p+1)>>1, temp_row2
2339+ pavgb mm2, mm3 ; (temp_row1+temp_row2+1)>>1, done in another 2nd horizonal part
2340+
2341+ movd [r0 ], mm0
2342+ movd [r0+4], mm2
2343+
2344+ ; next SMB
2345+ lea r2, [r2+32]
2346+ lea r0, [r0+8]
2347+
2348+ sub r4, 32
2349+ cmp r4, 0
2350+ jg near .xloops_quarter_sse
2351+
2352+ sub r6, r0
2353+ ; next line
2354+ lea r2, [r2+4*r3] ; next 4 end of lines
2355+ lea r2, [r2+4*r6] ; reset to base 0 [- 4 * iDstWidth]
2356+ lea r0, [r0+r1]
2357+ lea r0, [r0+r6] ; reset to base 0 [- iDstWidth]
2358+
2359+ dec r5
2360+ jg near .yloops_quarter_sse
2361+
2362+ movq [r0], xmm7 ;restored the tailer for the unasigned size
2363+
2364+ WELSEMMS
2365+%ifndef X86_32
2366+ pop r12
2367+%endif
2368+ LOAD_6_PARA_POP
2369+%ifdef X86_32
2370+ pop r6
2371+%endif
2372+ ret
2373+
2374+;***********************************************************************
2375+; void DyadicBilinearQuarterDownsampler_ssse3( unsigned char* pDst, const int iDstStride,
2376+; unsigned char* pSrc, const int iSrcStride,
2377+; const int iSrcWidth, const int iSrcHeight );
2378+;***********************************************************************
2379+WELS_EXTERN DyadicBilinearQuarterDownsampler_ssse3
2380+ ;push ebx
2381+ ;push edx
2382+ ;push esi
2383+ ;push edi
2384+ ;push ebp
2385+
2386+ ;mov edi, [esp+24] ; pDst
2387+ ;mov edx, [esp+28] ; iDstStride
2388+ ;mov esi, [esp+32] ; pSrc
2389+ ;mov ecx, [esp+36] ; iSrcStride
2390+ ;mov ebp, [esp+44] ; iSrcHeight
2391+%ifdef X86_32
2392+ push r6
2393+ %assign push_num 1
2394+%else
2395+ %assign push_num 0
2396+%endif
2397+ LOAD_6_PARA
2398+ PUSH_XMM 8
2399+ SIGN_EXTENSION r1, r1d
2400+ SIGN_EXTENSION r3, r3d
2401+ SIGN_EXTENSION r4, r4d
2402+ SIGN_EXTENSION r5, r5d
2403+
2404+%ifndef X86_32
2405+ push r12
2406+ mov r12, r4
2407+%endif
2408+ sar r5, $02 ; iSrcHeight >> 2
2409+
2410+ mov r6, r1 ;Save the tailer for the unasigned size
2411+ imul r6, r5
2412+ add r6, r0
2413+ movq xmm7, [r6]
2414+
2415+ movdqa xmm6, [shufb_mask_quarter]
2416+.yloops_quarter_sse3:
2417+ ;mov eax, [esp+40] ; iSrcWidth
2418+ ;sar eax, $02 ; iSrcWidth >> 2
2419+ ;mov ebx, eax ; iDstWidth restored at ebx
2420+ ;sar eax, $04 ; (iSrcWidth >> 2) / 16 ; loop count = num_of_mb
2421+ ;neg ebx ; - (iSrcWidth >> 2)
2422+%ifdef X86_32
2423+ mov r4, arg5
2424+%else
2425+ mov r4, r12
2426+%endif
2427+
2428+ mov r6, r0
2429+ ; each loop = source bandwidth: 32 bytes
2430+.xloops_quarter_sse3:
2431+ ; 1st part horizonal loop: x32 bytes
2432+ ; mem hi<- ->lo
2433+ ;1st Line Src: xmm0: h H g G f F e E d D c C b B a A
2434+ ; xmm1: p P o O n N m M l L k K j J i I
2435+ ;2nd Line Src: xmm2: h H g G f F e E d D c C b B a A
2436+ ; xmm3: p P o O n N m M l L k K j J i I
2437+
2438+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2439+ movdqa xmm0, [r2] ; 1st_src_line
2440+ movdqa xmm1, [r2+16] ; 1st_src_line + 16
2441+ movdqa xmm2, [r2+r3] ; 2nd_src_line
2442+ movdqa xmm3, [r2+r3+16] ; 2nd_src_line + 16
2443+
2444+ pshufb xmm0, xmm6 ;1st line: 0 0 0 0 g e c a 0 0 0 0 G E C A
2445+ pshufb xmm1, xmm6 ;1st line: 0 0 0 0 o m k i 0 0 0 0 O M K I
2446+ pshufb xmm2, xmm6 ;2nd line: 0 0 0 0 g e c a 0 0 0 0 G E C A
2447+ pshufb xmm3, xmm6 ;2nd line: 0 0 0 0 o m k i 0 0 0 0 O M K I
2448+
2449+ movdqa xmm4, xmm0
2450+ movdqa xmm5, xmm2
2451+ punpckldq xmm0, xmm1 ;1st line: 0 0 0 0 0 0 0 0 O M K I G E C A -> xmm0
2452+ punpckhdq xmm4, xmm1 ;1st line: 0 0 0 0 0 0 0 0 o m k i g e c a -> xmm4
2453+ punpckldq xmm2, xmm3 ;2nd line: 0 0 0 0 0 0 0 0 O M K I G E C A -> xmm2
2454+ punpckhdq xmm5, xmm3 ;2nd line: 0 0 0 0 0 0 0 0 o m k i g e c a -> xmm5
2455+
2456+ pavgb xmm0, xmm4
2457+ pavgb xmm2, xmm5
2458+ pavgb xmm0, xmm2 ;average
2459+
2460+ ; write pDst
2461+ movq [r0], xmm0
2462+
2463+ ; next SMB
2464+ lea r2, [r2+32]
2465+ lea r0, [r0+8]
2466+
2467+ sub r4, 32
2468+ cmp r4, 0
2469+ jg near .xloops_quarter_sse3
2470+
2471+ sub r6, r0
2472+ ; next line
2473+ lea r2, [r2+4*r3] ; next end of lines
2474+ lea r2, [r2+4*r6] ; reset to base 0 [- 4 * iDstWidth]
2475+ lea r0, [r0+r1]
2476+ lea r0, [r0+r6] ; reset to base 0 [- iDstWidth]
2477+
2478+ dec r5
2479+ jg near .yloops_quarter_sse3
2480+
2481+ movq [r0], xmm7 ;restored the tailer for the unasigned size
2482+
2483+%ifndef X86_32
2484+ pop r12
2485+%endif
2486+
2487+ POP_XMM
2488+ LOAD_6_PARA_POP
2489+%ifdef X86_32
2490+ pop r6
2491+%endif
2492+ ret
2493+
2494+;***********************************************************************
2495+; void DyadicBilinearQuarterDownsampler_sse4( unsigned char* pDst, const int iDstStride,
2496+; unsigned char* pSrc, const int iSrcStride,
2497+; const int iSrcWidth, const int iSrcHeight );
2498+;***********************************************************************
2499+WELS_EXTERN DyadicBilinearQuarterDownsampler_sse4
2500+%ifdef X86_32
2501+ push r6
2502+ %assign push_num 1
2503+%else
2504+ %assign push_num 0
2505+%endif
2506+ LOAD_6_PARA
2507+ PUSH_XMM 8
2508+ SIGN_EXTENSION r1, r1d
2509+ SIGN_EXTENSION r3, r3d
2510+ SIGN_EXTENSION r4, r4d
2511+ SIGN_EXTENSION r5, r5d
2512+
2513+%ifndef X86_32
2514+ push r12
2515+ mov r12, r4
2516+%endif
2517+ sar r5, $02 ; iSrcHeight >> 2
2518+
2519+ mov r6, r1 ;Save the tailer for the unasigned size
2520+ imul r6, r5
2521+ add r6, r0
2522+ movq xmm7, [r6]
2523+
2524+ movdqa xmm6, [shufb_mask_quarter] ;mask
2525+
2526+.yloops_quarter_sse4:
2527+%ifdef X86_32
2528+ mov r4, arg5
2529+%else
2530+ mov r4, r12
2531+%endif
2532+
2533+ mov r6, r0
2534+ ; each loop = source bandwidth: 32 bytes
2535+.xloops_quarter_sse4:
2536+ ; 1st part horizonal loop: x16 bytes
2537+ ; mem hi<- ->lo
2538+ ;1st Line Src: xmm0: h H g G f F e E d D c C b B a A
2539+ ; xmm1: p P o O n N m M l L k K j J i I
2540+ ;2nd Line Src: xmm2: h H g G f F e E d D c C b B a A
2541+ ; xmm3: p P o O n N m M l L k K j J i I
2542+
2543+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2544+ movntdqa xmm0, [r2] ; 1st_src_line
2545+ movntdqa xmm1, [r2+16] ; 1st_src_line + 16
2546+ movntdqa xmm2, [r2+r3] ; 2nd_src_line
2547+ movntdqa xmm3, [r2+r3+16] ; 2nd_src_line + 16
2548+
2549+ pshufb xmm0, xmm6 ;1st line: 0 0 0 0 g e c a 0 0 0 0 G E C A
2550+ pshufb xmm1, xmm6 ;1st line: 0 0 0 0 o m k i 0 0 0 0 O M K I
2551+ pshufb xmm2, xmm6 ;2nd line: 0 0 0 0 g e c a 0 0 0 0 G E C A
2552+ pshufb xmm3, xmm6 ;2nd line: 0 0 0 0 o m k i 0 0 0 0 O M K I
2553+
2554+ movdqa xmm4, xmm0
2555+ movdqa xmm5, xmm2
2556+ punpckldq xmm0, xmm1 ;1st line: 0 0 0 0 0 0 0 0 O M K I G E C A -> xmm0
2557+ punpckhdq xmm4, xmm1 ;1st line: 0 0 0 0 0 0 0 0 o m k i g e c a -> xmm4
2558+ punpckldq xmm2, xmm3 ;2nd line: 0 0 0 0 0 0 0 0 O M K I G E C A -> xmm2
2559+ punpckhdq xmm5, xmm3 ;2nd line: 0 0 0 0 0 0 0 0 o m k i g e c a -> xmm5
2560+
2561+ pavgb xmm0, xmm4
2562+ pavgb xmm2, xmm5
2563+ pavgb xmm0, xmm2 ;average
2564+
2565+ ; write pDst
2566+ movq [r0], xmm0
2567+
2568+ ; next SMB
2569+ lea r2, [r2+32]
2570+ lea r0, [r0+8]
2571+
2572+ sub r4, 32
2573+ cmp r4, 0
2574+ jg near .xloops_quarter_sse4
2575+
2576+ sub r6, r0
2577+ lea r2, [r2+4*r3] ; next end of lines
2578+ lea r2, [r2+4*r6] ; reset to base 0 [- 2 * iDstWidth]
2579+ lea r0, [r0+r1]
2580+ lea r0, [r0+r6] ; reset to base 0 [- iDstWidth]
2581+
2582+ dec r5
2583+ jg near .yloops_quarter_sse4
2584+
2585+ movq [r0], xmm7 ;restore the tailer for the unasigned size
2586+
2587+%ifndef X86_32
2588+ pop r12
2589+%endif
2590+
2591+ POP_XMM
2592+ LOAD_6_PARA_POP
2593+%ifdef X86_32
2594+ pop r6
2595+%endif
2596+ ret
2597+

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t