annotate ffmpeg/libavutil/x86/x86util.asm @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
yading@11 1 ;*****************************************************************************
yading@11 2 ;* x86util.asm
yading@11 3 ;*****************************************************************************
yading@11 4 ;* Copyright (C) 2008-2010 x264 project
yading@11 5 ;*
yading@11 6 ;* Authors: Loren Merritt <lorenm@u.washington.edu>
yading@11 7 ;* Holger Lubitz <holger@lubitz.org>
yading@11 8 ;*
yading@11 9 ;* This file is part of FFmpeg.
yading@11 10 ;*
yading@11 11 ;* FFmpeg is free software; you can redistribute it and/or
yading@11 12 ;* modify it under the terms of the GNU Lesser General Public
yading@11 13 ;* License as published by the Free Software Foundation; either
yading@11 14 ;* version 2.1 of the License, or (at your option) any later version.
yading@11 15 ;*
yading@11 16 ;* FFmpeg is distributed in the hope that it will be useful,
yading@11 17 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 18 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 19 ;* Lesser General Public License for more details.
yading@11 20 ;*
yading@11 21 ;* You should have received a copy of the GNU Lesser General Public
yading@11 22 ;* License along with FFmpeg; if not, write to the Free Software
yading@11 23 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 24 ;******************************************************************************
yading@11 25
yading@11 26 %define private_prefix ff
yading@11 27 %define public_prefix avpriv
yading@11 28 %define cpuflags_mmxext cpuflags_mmx2
yading@11 29
yading@11 30 %include "libavutil/x86/x86inc.asm"
yading@11 31
yading@11 32 %macro SBUTTERFLY 4
yading@11 33 %if avx_enabled == 0
yading@11 34 mova m%4, m%2
yading@11 35 punpckl%1 m%2, m%3
yading@11 36 punpckh%1 m%4, m%3
yading@11 37 %else
yading@11 38 punpckh%1 m%4, m%2, m%3
yading@11 39 punpckl%1 m%2, m%3
yading@11 40 %endif
yading@11 41 SWAP %3, %4
yading@11 42 %endmacro
yading@11 43
yading@11 44 %macro SBUTTERFLY2 4
yading@11 45 punpckl%1 m%4, m%2, m%3
yading@11 46 punpckh%1 m%2, m%2, m%3
yading@11 47 SWAP %2, %4, %3
yading@11 48 %endmacro
yading@11 49
yading@11 50 %macro SBUTTERFLYPS 3
yading@11 51 unpcklps m%3, m%1, m%2
yading@11 52 unpckhps m%1, m%1, m%2
yading@11 53 SWAP %1, %3, %2
yading@11 54 %endmacro
yading@11 55
yading@11 56 %macro TRANSPOSE4x4B 5
yading@11 57 SBUTTERFLY bw, %1, %2, %5
yading@11 58 SBUTTERFLY bw, %3, %4, %5
yading@11 59 SBUTTERFLY wd, %1, %3, %5
yading@11 60 SBUTTERFLY wd, %2, %4, %5
yading@11 61 SWAP %2, %3
yading@11 62 %endmacro
yading@11 63
yading@11 64 %macro TRANSPOSE4x4W 5
yading@11 65 SBUTTERFLY wd, %1, %2, %5
yading@11 66 SBUTTERFLY wd, %3, %4, %5
yading@11 67 SBUTTERFLY dq, %1, %3, %5
yading@11 68 SBUTTERFLY dq, %2, %4, %5
yading@11 69 SWAP %2, %3
yading@11 70 %endmacro
yading@11 71
yading@11 72 %macro TRANSPOSE2x4x4W 5
yading@11 73 SBUTTERFLY wd, %1, %2, %5
yading@11 74 SBUTTERFLY wd, %3, %4, %5
yading@11 75 SBUTTERFLY dq, %1, %3, %5
yading@11 76 SBUTTERFLY dq, %2, %4, %5
yading@11 77 SBUTTERFLY qdq, %1, %2, %5
yading@11 78 SBUTTERFLY qdq, %3, %4, %5
yading@11 79 %endmacro
yading@11 80
yading@11 81 %macro TRANSPOSE4x4D 5
yading@11 82 SBUTTERFLY dq, %1, %2, %5
yading@11 83 SBUTTERFLY dq, %3, %4, %5
yading@11 84 SBUTTERFLY qdq, %1, %3, %5
yading@11 85 SBUTTERFLY qdq, %2, %4, %5
yading@11 86 SWAP %2, %3
yading@11 87 %endmacro
yading@11 88
yading@11 89 ; identical behavior to TRANSPOSE4x4D, but using SSE1 float ops
yading@11 90 %macro TRANSPOSE4x4PS 5
yading@11 91 SBUTTERFLYPS %1, %2, %5
yading@11 92 SBUTTERFLYPS %3, %4, %5
yading@11 93 movlhps m%5, m%1, m%3
yading@11 94 movhlps m%3, m%1
yading@11 95 SWAP %5, %1
yading@11 96 movlhps m%5, m%2, m%4
yading@11 97 movhlps m%4, m%2
yading@11 98 SWAP %5, %2, %3
yading@11 99 %endmacro
yading@11 100
yading@11 101 %macro TRANSPOSE8x8W 9-11
yading@11 102 %if ARCH_X86_64
yading@11 103 SBUTTERFLY wd, %1, %2, %9
yading@11 104 SBUTTERFLY wd, %3, %4, %9
yading@11 105 SBUTTERFLY wd, %5, %6, %9
yading@11 106 SBUTTERFLY wd, %7, %8, %9
yading@11 107 SBUTTERFLY dq, %1, %3, %9
yading@11 108 SBUTTERFLY dq, %2, %4, %9
yading@11 109 SBUTTERFLY dq, %5, %7, %9
yading@11 110 SBUTTERFLY dq, %6, %8, %9
yading@11 111 SBUTTERFLY qdq, %1, %5, %9
yading@11 112 SBUTTERFLY qdq, %2, %6, %9
yading@11 113 SBUTTERFLY qdq, %3, %7, %9
yading@11 114 SBUTTERFLY qdq, %4, %8, %9
yading@11 115 SWAP %2, %5
yading@11 116 SWAP %4, %7
yading@11 117 %else
yading@11 118 ; in: m0..m7, unless %11 in which case m6 is in %9
yading@11 119 ; out: m0..m7, unless %11 in which case m4 is in %10
yading@11 120 ; spills into %9 and %10
yading@11 121 %if %0<11
yading@11 122 movdqa %9, m%7
yading@11 123 %endif
yading@11 124 SBUTTERFLY wd, %1, %2, %7
yading@11 125 movdqa %10, m%2
yading@11 126 movdqa m%7, %9
yading@11 127 SBUTTERFLY wd, %3, %4, %2
yading@11 128 SBUTTERFLY wd, %5, %6, %2
yading@11 129 SBUTTERFLY wd, %7, %8, %2
yading@11 130 SBUTTERFLY dq, %1, %3, %2
yading@11 131 movdqa %9, m%3
yading@11 132 movdqa m%2, %10
yading@11 133 SBUTTERFLY dq, %2, %4, %3
yading@11 134 SBUTTERFLY dq, %5, %7, %3
yading@11 135 SBUTTERFLY dq, %6, %8, %3
yading@11 136 SBUTTERFLY qdq, %1, %5, %3
yading@11 137 SBUTTERFLY qdq, %2, %6, %3
yading@11 138 movdqa %10, m%2
yading@11 139 movdqa m%3, %9
yading@11 140 SBUTTERFLY qdq, %3, %7, %2
yading@11 141 SBUTTERFLY qdq, %4, %8, %2
yading@11 142 SWAP %2, %5
yading@11 143 SWAP %4, %7
yading@11 144 %if %0<11
yading@11 145 movdqa m%5, %10
yading@11 146 %endif
yading@11 147 %endif
yading@11 148 %endmacro
yading@11 149
yading@11 150 ; PABSW macro assumes %1 != %2, while ABS1/2 macros work in-place
yading@11 151 %macro PABSW 2
yading@11 152 %if cpuflag(ssse3)
yading@11 153 pabsw %1, %2
yading@11 154 %elif cpuflag(mmxext)
yading@11 155 pxor %1, %1
yading@11 156 psubw %1, %2
yading@11 157 pmaxsw %1, %2
yading@11 158 %else
yading@11 159 pxor %1, %1
yading@11 160 pcmpgtw %1, %2
yading@11 161 pxor %2, %1
yading@11 162 psubw %2, %1
yading@11 163 SWAP %1, %2
yading@11 164 %endif
yading@11 165 %endmacro
yading@11 166
yading@11 167 %macro PSIGNW_MMX 2
yading@11 168 pxor %1, %2
yading@11 169 psubw %1, %2
yading@11 170 %endmacro
yading@11 171
yading@11 172 %macro PSIGNW_SSSE3 2
yading@11 173 psignw %1, %2
yading@11 174 %endmacro
yading@11 175
yading@11 176 %macro ABS1 2
yading@11 177 %if cpuflag(ssse3)
yading@11 178 pabsw %1, %1
yading@11 179 %elif cpuflag(mmxext) ; a, tmp
yading@11 180 pxor %2, %2
yading@11 181 psubw %2, %1
yading@11 182 pmaxsw %1, %2
yading@11 183 %else ; a, tmp
yading@11 184 pxor %2, %2
yading@11 185 pcmpgtw %2, %1
yading@11 186 pxor %1, %2
yading@11 187 psubw %1, %2
yading@11 188 %endif
yading@11 189 %endmacro
yading@11 190
yading@11 191 %macro ABS2 4
yading@11 192 %if cpuflag(ssse3)
yading@11 193 pabsw %1, %1
yading@11 194 pabsw %2, %2
yading@11 195 %elif cpuflag(mmxext) ; a, b, tmp0, tmp1
yading@11 196 pxor %3, %3
yading@11 197 pxor %4, %4
yading@11 198 psubw %3, %1
yading@11 199 psubw %4, %2
yading@11 200 pmaxsw %1, %3
yading@11 201 pmaxsw %2, %4
yading@11 202 %else ; a, b, tmp0, tmp1
yading@11 203 pxor %3, %3
yading@11 204 pxor %4, %4
yading@11 205 pcmpgtw %3, %1
yading@11 206 pcmpgtw %4, %2
yading@11 207 pxor %1, %3
yading@11 208 pxor %2, %4
yading@11 209 psubw %1, %3
yading@11 210 psubw %2, %4
yading@11 211 %endif
yading@11 212 %endmacro
yading@11 213
yading@11 214 %macro ABSB 2 ; source mmreg, temp mmreg (unused for ssse3)
yading@11 215 %if cpuflag(ssse3)
yading@11 216 pabsb %1, %1
yading@11 217 %else
yading@11 218 pxor %2, %2
yading@11 219 psubb %2, %1
yading@11 220 pminub %1, %2
yading@11 221 %endif
yading@11 222 %endmacro
yading@11 223
yading@11 224 %macro ABSB2 4 ; src1, src2, tmp1, tmp2 (tmp1/2 unused for SSSE3)
yading@11 225 %if cpuflag(ssse3)
yading@11 226 pabsb %1, %1
yading@11 227 pabsb %2, %2
yading@11 228 %else
yading@11 229 pxor %3, %3
yading@11 230 pxor %4, %4
yading@11 231 psubb %3, %1
yading@11 232 psubb %4, %2
yading@11 233 pminub %1, %3
yading@11 234 pminub %2, %4
yading@11 235 %endif
yading@11 236 %endmacro
yading@11 237
yading@11 238 %macro ABSD2_MMX 4
yading@11 239 pxor %3, %3
yading@11 240 pxor %4, %4
yading@11 241 pcmpgtd %3, %1
yading@11 242 pcmpgtd %4, %2
yading@11 243 pxor %1, %3
yading@11 244 pxor %2, %4
yading@11 245 psubd %1, %3
yading@11 246 psubd %2, %4
yading@11 247 %endmacro
yading@11 248
yading@11 249 %macro ABS4 6
yading@11 250 ABS2 %1, %2, %5, %6
yading@11 251 ABS2 %3, %4, %5, %6
yading@11 252 %endmacro
yading@11 253
yading@11 254 %macro SPLATB_LOAD 3
yading@11 255 %if cpuflag(ssse3)
yading@11 256 movd %1, [%2-3]
yading@11 257 pshufb %1, %3
yading@11 258 %else
yading@11 259 movd %1, [%2-3] ;to avoid crossing a cacheline
yading@11 260 punpcklbw %1, %1
yading@11 261 SPLATW %1, %1, 3
yading@11 262 %endif
yading@11 263 %endmacro
yading@11 264
yading@11 265 %macro SPLATB_REG 3
yading@11 266 %if cpuflag(ssse3)
yading@11 267 movd %1, %2d
yading@11 268 pshufb %1, %3
yading@11 269 %else
yading@11 270 movd %1, %2d
yading@11 271 punpcklbw %1, %1
yading@11 272 SPLATW %1, %1, 0
yading@11 273 %endif
yading@11 274 %endmacro
yading@11 275
yading@11 276 %macro PALIGNR 4-5
yading@11 277 %if cpuflag(ssse3)
yading@11 278 %if %0==5
yading@11 279 palignr %1, %2, %3, %4
yading@11 280 %else
yading@11 281 palignr %1, %2, %3
yading@11 282 %endif
yading@11 283 %elif cpuflag(mmx) ; [dst,] src1, src2, imm, tmp
yading@11 284 %define %%dst %1
yading@11 285 %if %0==5
yading@11 286 %ifnidn %1, %2
yading@11 287 mova %%dst, %2
yading@11 288 %endif
yading@11 289 %rotate 1
yading@11 290 %endif
yading@11 291 %ifnidn %4, %2
yading@11 292 mova %4, %2
yading@11 293 %endif
yading@11 294 %if mmsize==8
yading@11 295 psllq %%dst, (8-%3)*8
yading@11 296 psrlq %4, %3*8
yading@11 297 %else
yading@11 298 pslldq %%dst, 16-%3
yading@11 299 psrldq %4, %3
yading@11 300 %endif
yading@11 301 por %%dst, %4
yading@11 302 %endif
yading@11 303 %endmacro
yading@11 304
yading@11 305 %macro PAVGB 2
yading@11 306 %if cpuflag(mmxext)
yading@11 307 pavgb %1, %2
yading@11 308 %elif cpuflag(3dnow)
yading@11 309 pavgusb %1, %2
yading@11 310 %endif
yading@11 311 %endmacro
yading@11 312
yading@11 313 %macro PSHUFLW 1+
yading@11 314 %if mmsize == 8
yading@11 315 pshufw %1
yading@11 316 %else
yading@11 317 pshuflw %1
yading@11 318 %endif
yading@11 319 %endmacro
yading@11 320
yading@11 321 %macro PSWAPD 2
yading@11 322 %if cpuflag(mmxext)
yading@11 323 pshufw %1, %2, q1032
yading@11 324 %elif cpuflag(3dnowext)
yading@11 325 pswapd %1, %2
yading@11 326 %elif cpuflag(3dnow)
yading@11 327 movq %1, %2
yading@11 328 psrlq %1, 32
yading@11 329 punpckldq %1, %2
yading@11 330 %endif
yading@11 331 %endmacro
yading@11 332
yading@11 333 %macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
yading@11 334 %ifnum %5
yading@11 335 pand m%3, m%5, m%4 ; src .. y6 .. y4
yading@11 336 pand m%1, m%5, m%2 ; dst .. y6 .. y4
yading@11 337 %else
yading@11 338 mova m%1, %5
yading@11 339 pand m%3, m%1, m%4 ; src .. y6 .. y4
yading@11 340 pand m%1, m%1, m%2 ; dst .. y6 .. y4
yading@11 341 %endif
yading@11 342 psrlw m%2, 8 ; dst .. y7 .. y5
yading@11 343 psrlw m%4, 8 ; src .. y7 .. y5
yading@11 344 %endmacro
yading@11 345
yading@11 346 %macro SUMSUB_BA 3-4
yading@11 347 %if %0==3
yading@11 348 padd%1 m%2, m%3
yading@11 349 padd%1 m%3, m%3
yading@11 350 psub%1 m%3, m%2
yading@11 351 %else
yading@11 352 %if avx_enabled == 0
yading@11 353 mova m%4, m%2
yading@11 354 padd%1 m%2, m%3
yading@11 355 psub%1 m%3, m%4
yading@11 356 %else
yading@11 357 padd%1 m%4, m%2, m%3
yading@11 358 psub%1 m%3, m%2
yading@11 359 SWAP %2, %4
yading@11 360 %endif
yading@11 361 %endif
yading@11 362 %endmacro
yading@11 363
yading@11 364 %macro SUMSUB_BADC 5-6
yading@11 365 %if %0==6
yading@11 366 SUMSUB_BA %1, %2, %3, %6
yading@11 367 SUMSUB_BA %1, %4, %5, %6
yading@11 368 %else
yading@11 369 padd%1 m%2, m%3
yading@11 370 padd%1 m%4, m%5
yading@11 371 padd%1 m%3, m%3
yading@11 372 padd%1 m%5, m%5
yading@11 373 psub%1 m%3, m%2
yading@11 374 psub%1 m%5, m%4
yading@11 375 %endif
yading@11 376 %endmacro
yading@11 377
yading@11 378 %macro SUMSUB2_AB 4
yading@11 379 %ifnum %3
yading@11 380 psub%1 m%4, m%2, m%3
yading@11 381 psub%1 m%4, m%3
yading@11 382 padd%1 m%2, m%2
yading@11 383 padd%1 m%2, m%3
yading@11 384 %else
yading@11 385 mova m%4, m%2
yading@11 386 padd%1 m%2, m%2
yading@11 387 padd%1 m%2, %3
yading@11 388 psub%1 m%4, %3
yading@11 389 psub%1 m%4, %3
yading@11 390 %endif
yading@11 391 %endmacro
yading@11 392
yading@11 393 %macro SUMSUB2_BA 4
yading@11 394 %if avx_enabled == 0
yading@11 395 mova m%4, m%2
yading@11 396 padd%1 m%2, m%3
yading@11 397 padd%1 m%2, m%3
yading@11 398 psub%1 m%3, m%4
yading@11 399 psub%1 m%3, m%4
yading@11 400 %else
yading@11 401 padd%1 m%4, m%2, m%3
yading@11 402 padd%1 m%4, m%3
yading@11 403 psub%1 m%3, m%2
yading@11 404 psub%1 m%3, m%2
yading@11 405 SWAP %2, %4
yading@11 406 %endif
yading@11 407 %endmacro
yading@11 408
yading@11 409 %macro SUMSUBD2_AB 5
yading@11 410 %ifnum %4
yading@11 411 psra%1 m%5, m%2, 1 ; %3: %3>>1
yading@11 412 psra%1 m%4, m%3, 1 ; %2: %2>>1
yading@11 413 padd%1 m%4, m%2 ; %3: %3>>1+%2
yading@11 414 psub%1 m%5, m%3 ; %2: %2>>1-%3
yading@11 415 SWAP %2, %5
yading@11 416 SWAP %3, %4
yading@11 417 %else
yading@11 418 mova %5, m%2
yading@11 419 mova %4, m%3
yading@11 420 psra%1 m%3, 1 ; %3: %3>>1
yading@11 421 psra%1 m%2, 1 ; %2: %2>>1
yading@11 422 padd%1 m%3, %5 ; %3: %3>>1+%2
yading@11 423 psub%1 m%2, %4 ; %2: %2>>1-%3
yading@11 424 %endif
yading@11 425 %endmacro
yading@11 426
yading@11 427 %macro DCT4_1D 5
yading@11 428 %ifnum %5
yading@11 429 SUMSUB_BADC w, %4, %1, %3, %2, %5
yading@11 430 SUMSUB_BA w, %3, %4, %5
yading@11 431 SUMSUB2_AB w, %1, %2, %5
yading@11 432 SWAP %1, %3, %4, %5, %2
yading@11 433 %else
yading@11 434 SUMSUB_BADC w, %4, %1, %3, %2
yading@11 435 SUMSUB_BA w, %3, %4
yading@11 436 mova [%5], m%2
yading@11 437 SUMSUB2_AB w, %1, [%5], %2
yading@11 438 SWAP %1, %3, %4, %2
yading@11 439 %endif
yading@11 440 %endmacro
yading@11 441
yading@11 442 %macro IDCT4_1D 6-7
yading@11 443 %ifnum %6
yading@11 444 SUMSUBD2_AB %1, %3, %5, %7, %6
yading@11 445 ; %3: %3>>1-%5 %5: %3+%5>>1
yading@11 446 SUMSUB_BA %1, %4, %2, %7
yading@11 447 ; %4: %2+%4 %2: %2-%4
yading@11 448 SUMSUB_BADC %1, %5, %4, %3, %2, %7
yading@11 449 ; %5: %2+%4 + (%3+%5>>1)
yading@11 450 ; %4: %2+%4 - (%3+%5>>1)
yading@11 451 ; %3: %2-%4 + (%3>>1-%5)
yading@11 452 ; %2: %2-%4 - (%3>>1-%5)
yading@11 453 %else
yading@11 454 %ifidn %1, w
yading@11 455 SUMSUBD2_AB %1, %3, %5, [%6], [%6+16]
yading@11 456 %else
yading@11 457 SUMSUBD2_AB %1, %3, %5, [%6], [%6+32]
yading@11 458 %endif
yading@11 459 SUMSUB_BA %1, %4, %2
yading@11 460 SUMSUB_BADC %1, %5, %4, %3, %2
yading@11 461 %endif
yading@11 462 SWAP %2, %5, %4
yading@11 463 ; %2: %2+%4 + (%3+%5>>1) row0
yading@11 464 ; %3: %2-%4 + (%3>>1-%5) row1
yading@11 465 ; %4: %2-%4 - (%3>>1-%5) row2
yading@11 466 ; %5: %2+%4 - (%3+%5>>1) row3
yading@11 467 %endmacro
yading@11 468
yading@11 469
yading@11 470 %macro LOAD_DIFF 5
yading@11 471 %ifidn %3, none
yading@11 472 movh %1, %4
yading@11 473 movh %2, %5
yading@11 474 punpcklbw %1, %2
yading@11 475 punpcklbw %2, %2
yading@11 476 psubw %1, %2
yading@11 477 %else
yading@11 478 movh %1, %4
yading@11 479 punpcklbw %1, %3
yading@11 480 movh %2, %5
yading@11 481 punpcklbw %2, %3
yading@11 482 psubw %1, %2
yading@11 483 %endif
yading@11 484 %endmacro
yading@11 485
yading@11 486 %macro STORE_DCT 6
yading@11 487 movq [%5+%6+ 0], m%1
yading@11 488 movq [%5+%6+ 8], m%2
yading@11 489 movq [%5+%6+16], m%3
yading@11 490 movq [%5+%6+24], m%4
yading@11 491 movhps [%5+%6+32], m%1
yading@11 492 movhps [%5+%6+40], m%2
yading@11 493 movhps [%5+%6+48], m%3
yading@11 494 movhps [%5+%6+56], m%4
yading@11 495 %endmacro
yading@11 496
yading@11 497 %macro LOAD_DIFF_8x4P 7-10 r0,r2,0 ; 4x dest, 2x temp, 2x pointer, increment?
yading@11 498 LOAD_DIFF m%1, m%5, m%7, [%8], [%9]
yading@11 499 LOAD_DIFF m%2, m%6, m%7, [%8+r1], [%9+r3]
yading@11 500 LOAD_DIFF m%3, m%5, m%7, [%8+2*r1], [%9+2*r3]
yading@11 501 LOAD_DIFF m%4, m%6, m%7, [%8+r4], [%9+r5]
yading@11 502 %if %10
yading@11 503 lea %8, [%8+4*r1]
yading@11 504 lea %9, [%9+4*r3]
yading@11 505 %endif
yading@11 506 %endmacro
yading@11 507
yading@11 508 %macro DIFFx2 6-7
yading@11 509 movh %3, %5
yading@11 510 punpcklbw %3, %4
yading@11 511 psraw %1, 6
yading@11 512 paddsw %1, %3
yading@11 513 movh %3, %6
yading@11 514 punpcklbw %3, %4
yading@11 515 psraw %2, 6
yading@11 516 paddsw %2, %3
yading@11 517 packuswb %2, %1
yading@11 518 %endmacro
yading@11 519
yading@11 520 %macro STORE_DIFF 4
yading@11 521 movh %2, %4
yading@11 522 punpcklbw %2, %3
yading@11 523 psraw %1, 6
yading@11 524 paddsw %1, %2
yading@11 525 packuswb %1, %1
yading@11 526 movh %4, %1
yading@11 527 %endmacro
yading@11 528
yading@11 529 %macro STORE_DIFFx2 8 ; add1, add2, reg1, reg2, zero, shift, source, stride
yading@11 530 movh %3, [%7]
yading@11 531 movh %4, [%7+%8]
yading@11 532 psraw %1, %6
yading@11 533 psraw %2, %6
yading@11 534 punpcklbw %3, %5
yading@11 535 punpcklbw %4, %5
yading@11 536 paddw %3, %1
yading@11 537 paddw %4, %2
yading@11 538 packuswb %3, %5
yading@11 539 packuswb %4, %5
yading@11 540 movh [%7], %3
yading@11 541 movh [%7+%8], %4
yading@11 542 %endmacro
yading@11 543
yading@11 544 %macro PMINUB 3 ; dst, src, ignored
yading@11 545 %if cpuflag(mmxext)
yading@11 546 pminub %1, %2
yading@11 547 %else ; dst, src, tmp
yading@11 548 mova %3, %1
yading@11 549 psubusb %3, %2
yading@11 550 psubb %1, %3
yading@11 551 %endif
yading@11 552 %endmacro
yading@11 553
yading@11 554 %macro SPLATW 2-3 0
yading@11 555 %if mmsize == 16
yading@11 556 pshuflw %1, %2, (%3)*0x55
yading@11 557 punpcklqdq %1, %1
yading@11 558 %elif cpuflag(mmxext)
yading@11 559 pshufw %1, %2, (%3)*0x55
yading@11 560 %else
yading@11 561 %ifnidn %1, %2
yading@11 562 mova %1, %2
yading@11 563 %endif
yading@11 564 %if %3 & 2
yading@11 565 punpckhwd %1, %1
yading@11 566 %else
yading@11 567 punpcklwd %1, %1
yading@11 568 %endif
yading@11 569 %if %3 & 1
yading@11 570 punpckhwd %1, %1
yading@11 571 %else
yading@11 572 punpcklwd %1, %1
yading@11 573 %endif
yading@11 574 %endif
yading@11 575 %endmacro
yading@11 576
yading@11 577 %macro SPLATD 1
yading@11 578 %if mmsize == 8
yading@11 579 punpckldq %1, %1
yading@11 580 %elif cpuflag(sse2)
yading@11 581 pshufd %1, %1, 0
yading@11 582 %elif cpuflag(sse)
yading@11 583 shufps %1, %1, 0
yading@11 584 %endif
yading@11 585 %endmacro
yading@11 586
yading@11 587 %macro CLIPW 3 ;(dst, min, max)
yading@11 588 pmaxsw %1, %2
yading@11 589 pminsw %1, %3
yading@11 590 %endmacro
yading@11 591
yading@11 592 %macro PMINSD_MMX 3 ; dst, src, tmp
yading@11 593 mova %3, %2
yading@11 594 pcmpgtd %3, %1
yading@11 595 pxor %1, %2
yading@11 596 pand %1, %3
yading@11 597 pxor %1, %2
yading@11 598 %endmacro
yading@11 599
yading@11 600 %macro PMAXSD_MMX 3 ; dst, src, tmp
yading@11 601 mova %3, %1
yading@11 602 pcmpgtd %3, %2
yading@11 603 pand %1, %3
yading@11 604 pandn %3, %2
yading@11 605 por %1, %3
yading@11 606 %endmacro
yading@11 607
yading@11 608 %macro CLIPD_MMX 3-4 ; src/dst, min, max, tmp
yading@11 609 PMINSD_MMX %1, %3, %4
yading@11 610 PMAXSD_MMX %1, %2, %4
yading@11 611 %endmacro
yading@11 612
yading@11 613 %macro CLIPD_SSE2 3-4 ; src/dst, min (float), max (float), unused
yading@11 614 cvtdq2ps %1, %1
yading@11 615 minps %1, %3
yading@11 616 maxps %1, %2
yading@11 617 cvtps2dq %1, %1
yading@11 618 %endmacro
yading@11 619
yading@11 620 %macro CLIPD_SSE41 3-4 ; src/dst, min, max, unused
yading@11 621 pminsd %1, %3
yading@11 622 pmaxsd %1, %2
yading@11 623 %endmacro
yading@11 624
yading@11 625 %macro VBROADCASTSS 2 ; dst xmm/ymm, src m32
yading@11 626 %if cpuflag(avx)
yading@11 627 vbroadcastss %1, %2
yading@11 628 %else ; sse
yading@11 629 movss %1, %2
yading@11 630 shufps %1, %1, 0
yading@11 631 %endif
yading@11 632 %endmacro
yading@11 633
yading@11 634 %macro VBROADCASTSD 2 ; dst xmm/ymm, src m64
yading@11 635 %if cpuflag(avx) && mmsize == 32
yading@11 636 vbroadcastsd %1, %2
yading@11 637 %elif cpuflag(sse3)
yading@11 638 movddup %1, %2
yading@11 639 %else ; sse2
yading@11 640 movsd %1, %2
yading@11 641 movlhps %1, %1
yading@11 642 %endif
yading@11 643 %endmacro
yading@11 644
yading@11 645 %macro SHUFFLE_MASK_W 8
yading@11 646 %rep 8
yading@11 647 %if %1>=0x80
yading@11 648 db %1, %1
yading@11 649 %else
yading@11 650 db %1*2
yading@11 651 db %1*2+1
yading@11 652 %endif
yading@11 653 %rotate 1
yading@11 654 %endrep
yading@11 655 %endmacro
yading@11 656
yading@11 657 %macro PMOVSXWD 2; dst, src
yading@11 658 %if cpuflag(sse4)
yading@11 659 pmovsxwd %1, %2
yading@11 660 %else
yading@11 661 %ifnidn %1, %2
yading@11 662 mova %1, %2
yading@11 663 %endif
yading@11 664 punpcklwd %1, %1
yading@11 665 psrad %1, 16
yading@11 666 %endif
yading@11 667 %endmacro