Showing the changes to codec/processing/src/x86 (1 of 9 files). Show all
Unified · Split
| @@ -67,6 +67,22 @@ shufb_mask_high: · 66 unmodified lines | |||
| 67 | add_extra_half: | 67 | add_extra_half: |
| 68 | dd 16384,0,0,0 | 68 | dd 16384,0,0,0 |
| 69 | 69 | ||
| 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 | ||
| 70 | 86 | ||
| 71 | ;*********************************************************************** | 87 | ;*********************************************************************** |
| 72 | ; Code | 88 | ; Code |
| @@ -1896,3 +1912,686 @@ FAST_LAST_ROW_END: · 1823 unmodified lines | |||
| 1896 | pop r12 | 1912 | pop r12 |
| 1897 | ret | 1913 | ret |
| 1898 | %endif | 1914 | %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 | |||