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 | 67 | add_extra_half: |
| 68 | 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 | 88 | ; Code |
| @@ -1896,3 +1912,686 @@ FAST_LAST_ROW_END: · 1823 unmodified lines | ||
| 1896 | 1912 | pop r12 |
| 1897 | 1913 | ret |
| 1898 | 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 | + | |