About 2x faster than the c version.
Unified · Split
| @@ -166,6 +166,129 @@ align 16 · 165 unmodified lines | |||
| 166 | jl .loop | 166 | jl .loop |
| 167 | REP_RET | 167 | REP_RET |
| 168 | 168 | ||
| 169 | ;*********************************************************** | ||
| 170 | ;void ps_hybrid_synthesis_deint_sse4(float out[2][38][64], | ||
| 171 | ; float (*in)[32][2], | ||
| 172 | ; int i, int len) | ||
| 173 | ;*********************************************************** | ||
| 174 | %macro HYBRID_SYNTHESIS_DEINT 0 | ||
| 175 | cglobal ps_hybrid_synthesis_deint, 3, 7, 5, out, in, i, len, out0, out1, tmp | ||
| 176 | %if cpuflag(sse4) | ||
| 177 | %define MOVH movsd | ||
| 178 | %else | ||
| 179 | %define MOVH movlps | ||
| 180 | %endif | ||
| 181 | movsxdifnidn iq, id | ||
| 182 | mov lend, 32 << 3 | ||
| 183 | lea outq, [outq+iq*4] | ||
| 184 | mov tmpd, id | ||
| 185 | shl tmpd, 8 | ||
| 186 | add inq, tmpq | ||
| 187 | mov tmpd, 64 | ||
| 188 | sub tmpd, id | ||
| 189 | mov id, tmpd | ||
| 190 | |||
| 191 | test id, 1 | ||
| 192 | jne .loop4 | ||
| 193 | test id, 2 | ||
| 194 | jne .loop8 | ||
| 195 | |||
| 196 | align 16 | ||
| 197 | .loop16: | ||
| 198 | mov out0q, outq | ||
| 199 | mov out1q, 38*64*4 | ||
| 200 | add out1q, out0q | ||
| 201 | mov tmpd, lend | ||
| 202 | |||
| 203 | .inner_loop16: | ||
| 204 | movaps m0, [inq] | ||
| 205 | movaps m1, [inq+lenq] | ||
| 206 | movaps m2, [inq+lenq*2] | ||
| 207 | movaps m3, [inq+3*32*2*4] | ||
| 208 | TRANSPOSE4x4PS 0, 1, 2, 3, 4 | ||
| 209 | movaps [out0q], m0 | ||
| 210 | movaps [out1q], m1 | ||
| 211 | movaps [out0q+lenq], m2 | ||
| 212 | movaps [out1q+lenq], m3 | ||
| 213 | lea out0q, [out0q+lenq*2] | ||
| 214 | lea out1q, [out1q+lenq*2] | ||
| 215 | add inq, mmsize | ||
| 216 | sub tmpd, mmsize | ||
| 217 | jg .inner_loop16 | ||
| 218 | add outq, 16 | ||
| 219 | add inq, 3*32*2*4 | ||
| 220 | sub id, 4 | ||
| 221 | jg .loop16 | ||
| 222 | RET | ||
| 223 | |||
| 224 | align 16 | ||
| 225 | .loop8: | ||
| 226 | mov out0q, outq | ||
| 227 | mov out1q, 38*64*4 | ||
| 228 | add out1q, out0q | ||
| 229 | mov tmpd, lend | ||
| 230 | |||
| 231 | .inner_loop8: | ||
| 232 | movaps m0, [inq] | ||
| 233 | movaps m1, [inq+lenq] | ||
| 234 | SBUTTERFLYPS 0, 1, 2 | ||
| 235 | SBUTTERFLYPD 0, 1, 2 | ||
| 236 | MOVH [out0q], m0 | ||
| 237 | MOVH [out1q], m1 | ||
| 238 | movhps [out0q+lenq], m0 | ||
| 239 | movhps [out1q+lenq], m1 | ||
| 240 | lea out0q, [out0q+lenq*2] | ||
| 241 | lea out1q, [out1q+lenq*2] | ||
| 242 | add inq, mmsize | ||
| 243 | sub tmpd, mmsize | ||
| 244 | jg .inner_loop8 | ||
| 245 | add outq, 8 | ||
| 246 | add inq, lenq | ||
| 247 | sub id, 2 | ||
| 248 | jg .loop16 | ||
| 249 | RET | ||
| 250 | |||
| 251 | align 16 | ||
| 252 | .loop4: | ||
| 253 | mov out0q, outq | ||
| 254 | mov out1q, 38*64*4 | ||
| 255 | add out1q, out0q | ||
| 256 | mov tmpd, lend | ||
| 257 | |||
| 258 | .inner_loop4: | ||
| 259 | movaps m0, [inq] | ||
| 260 | movss [out0q], m0 | ||
| 261 | %if cpuflag(sse4) | ||
| 262 | extractps [out1q], m0, 1 | ||
| 263 | extractps [out0q+lenq], m0, 2 | ||
| 264 | extractps [out1q+lenq], m0, 3 | ||
| 265 | %else | ||
| 266 | movhlps m1, m0 | ||
| 267 | movss [out0q+lenq], m1 | ||
| 268 | shufps m0, m0, 0xb1 | ||
| 269 | movss [out1q], m0 | ||
| 270 | movhlps m1, m0 | ||
| 271 | movss [out1q+lenq], m1 | ||
| 272 | %endif | ||
| 273 | lea out0q, [out0q+lenq*2] | ||
| 274 | lea out1q, [out1q+lenq*2] | ||
| 275 | add inq, mmsize | ||
| 276 | sub tmpd, mmsize | ||
| 277 | jg .inner_loop4 | ||
| 278 | add outq, 4 | ||
| 279 | sub id, 1 | ||
| 280 | test id, 2 | ||
| 281 | jne .loop8 | ||
| 282 | cmp id, 4 | ||
| 283 | jge .loop16 | ||
| 284 | RET | ||
| 285 | %endmacro | ||
| 286 | |||
| 287 | INIT_XMM sse | ||
| 288 | HYBRID_SYNTHESIS_DEINT | ||
| 289 | INIT_XMM sse4 | ||
| 290 | HYBRID_SYNTHESIS_DEINT | ||
| 291 | |||
| 169 | ;******************************************************************* | 292 | ;******************************************************************* |
| 170 | ;void ff_ps_hybrid_analysis_<opt>(float (*out)[2], float (*in)[2], | 293 | ;void ff_ps_hybrid_analysis_<opt>(float (*out)[2], float (*in)[2], |
| 171 | ; const float (*filter)[8][2], | 294 | ; const float (*filter)[8][2], |
| @@ -40,6 +40,10 @@ void ff_ps_stereo_interpolate_sse3(float (*l)[2], float (*r)[2], · 39 unmodified lines | |||
| 40 | void ff_ps_stereo_interpolate_ipdopd_sse3(float (*l)[2], float (*r)[2], | 40 | void ff_ps_stereo_interpolate_ipdopd_sse3(float (*l)[2], float (*r)[2], |
| 41 | float h[2][4], float h_step[2][4], | 41 | float h[2][4], float h_step[2][4], |
| 42 | int len); | 42 | int len); |
| 43 | void ff_ps_hybrid_synthesis_deint_sse(float out[2][38][64], float (*in)[32][2], | ||
| 44 | int i, int len); | ||
| 45 | void ff_ps_hybrid_synthesis_deint_sse4(float out[2][38][64], float (*in)[32][2], | ||
| 46 | int i, int len); | ||
| 43 | 47 | ||
| 44 | av_cold void ff_psdsp_init_x86(PSDSPContext *s) | 48 | av_cold void ff_psdsp_init_x86(PSDSPContext *s) |
| 45 | { | 49 | { |
| @@ -48,6 +52,7 @@ av_cold void ff_psdsp_init_x86(PSDSPContext *s) · 2 unmodified lines | |||
| 48 | if (EXTERNAL_SSE(cpu_flags)) { | 52 | if (EXTERNAL_SSE(cpu_flags)) { |
| 49 | s->add_squares = ff_ps_add_squares_sse; | 53 | s->add_squares = ff_ps_add_squares_sse; |
| 50 | s->mul_pair_single = ff_ps_mul_pair_single_sse; | 54 | s->mul_pair_single = ff_ps_mul_pair_single_sse; |
| 55 | s->hybrid_synthesis_deint = ff_ps_hybrid_synthesis_deint_sse; | ||
| 51 | s->hybrid_analysis = ff_ps_hybrid_analysis_sse; | 56 | s->hybrid_analysis = ff_ps_hybrid_analysis_sse; |
| 52 | } | 57 | } |
| 53 | if (EXTERNAL_SSE3(cpu_flags)) { | 58 | if (EXTERNAL_SSE3(cpu_flags)) { |
| @@ -56,4 +61,7 @@ av_cold void ff_psdsp_init_x86(PSDSPContext *s) · 2 unmodified lines | |||
| 56 | s->stereo_interpolate[1] = ff_ps_stereo_interpolate_ipdopd_sse3; | 61 | s->stereo_interpolate[1] = ff_ps_stereo_interpolate_ipdopd_sse3; |
| 57 | s->hybrid_analysis = ff_ps_hybrid_analysis_sse3; | 62 | s->hybrid_analysis = ff_ps_hybrid_analysis_sse3; |
| 58 | } | 63 | } |
| 64 | if (EXTERNAL_SSE4(cpu_flags)) { | ||
| 65 | s->hybrid_synthesis_deint = ff_ps_hybrid_synthesis_deint_sse4; | ||
| 66 | } | ||
| 59 | } | 67 | } |
| @@ -71,6 +71,12 @@ · 70 unmodified lines | |||
| 71 | SWAP %1, %3, %2 | 71 | SWAP %1, %3, %2 |
| 72 | %endmacro | 72 | %endmacro |
| 73 | 73 | ||
| 74 | %macro SBUTTERFLYPD 3 | ||
| 75 | movlhps m%3, m%1, m%2 | ||
| 76 | movhlps m%2, m%2, m%1 | ||
| 77 | SWAP %1, %3 | ||
| 78 | %endmacro | ||
| 79 | |||
| 74 | %macro TRANSPOSE4x4B 5 | 80 | %macro TRANSPOSE4x4B 5 |
| 75 | SBUTTERFLY bw, %1, %2, %5 | 81 | SBUTTERFLY bw, %1, %2, %5 |
| 76 | SBUTTERFLY bw, %3, %4, %5 | 82 | SBUTTERFLY bw, %3, %4, %5 |
| @@ -117,12 +123,9 @@ · 40 unmodified lines | |||
| 117 | %macro TRANSPOSE4x4PS 5 | 123 | %macro TRANSPOSE4x4PS 5 |
| 118 | SBUTTERFLYPS %1, %2, %5 | 124 | SBUTTERFLYPS %1, %2, %5 |
| 119 | SBUTTERFLYPS %3, %4, %5 | 125 | SBUTTERFLYPS %3, %4, %5 |
| 120 | movlhps m%5, m%1, m%3 | 126 | SBUTTERFLYPD %1, %3, %5 |
| 121 | movhlps m%3, m%1 | 127 | SBUTTERFLYPD %2, %4, %5 |
| 122 | SWAP %5, %1 | 128 | SWAP %2, %3 |
| 123 | movlhps m%5, m%2, m%4 | ||
| 124 | movhlps m%4, m%2 | ||
| 125 | SWAP %5, %2, %3 | ||
| 126 | %endmacro | 129 | %endmacro |
| 127 | 130 | ||
| 128 | %macro TRANSPOSE8x4D 9-11 | 131 | %macro TRANSPOSE8x4D 9-11 |