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
67add_extra_half:67add_extra_half:
68 dd 16384,0,0,068 dd 16384,0,0,0
69 69
70shufb_mask_quarter:
71db 00h, 04h, 08h, 0ch, 80h, 80h, 80h, 80h, 01h, 05h, 09h, 0dh, 80h, 80h, 80h, 80h
72
73shufb_mask_onethird_low_1:
74db 00h, 03h, 06h, 09h, 0ch, 0fh, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h
75shufb_mask_onethird_low_2:
76db 80h, 80h, 80h, 80h, 80h, 80h, 02h, 05h, 08h, 0bh, 0eh, 80h, 80h, 80h, 80h, 80h
77shufb_mask_onethird_low_3:
78db 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 01h, 04h, 07h, 0ah, 0dh
79
80shufb_mask_onethird_high_1:
81db 01h, 04h, 07h, 0ah, 0dh, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h
82shufb_mask_onethird_high_2:
83db 80h, 80h, 80h, 80h, 80h, 00h, 03h, 06h, 09h, 0ch, 0fh, 80h, 80h, 80h, 80h, 80h
84shufb_mask_onethird_high_3:
85db 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 80h, 02h, 05h, 08h, 0bh, 0eh
70 86
71;***********************************************************************87;***********************************************************************
72; Code88; Code
@@ -1896,3 +1912,686 @@ FAST_LAST_ROW_END: · 1823 unmodified lines
1896 pop r121912 pop r12
1897 ret1913 ret
1898%endif1914%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;***********************************************************************
1921WELS_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;***********************************************************************
2071WELS_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;***********************************************************************
2221WELS_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;***********************************************************************
2379WELS_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;***********************************************************************
2499WELS_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