You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

796 lines
16KB

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