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.

906 lines
19KB

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