x86util.asm 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902
  1. ;*****************************************************************************
  2. ;* x86util.asm: x86 utility macros
  3. ;*****************************************************************************
  4. ;* Copyright (C) 2008-2018 x264 project
  5. ;*
  6. ;* Authors: Holger Lubitz <holger@lubitz.org>
  7. ;* Loren Merritt <lorenm@u.washington.edu>
  8. ;*
  9. ;* This program is free software; you can redistribute it and/or modify
  10. ;* it under the terms of the GNU General Public License as published by
  11. ;* the Free Software Foundation; either version 2 of the License, or
  12. ;* (at your option) any later version.
  13. ;*
  14. ;* This program is distributed in the hope that it will be useful,
  15. ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. ;* GNU General Public License for more details.
  18. ;*
  19. ;* You should have received a copy of the GNU General Public License
  20. ;* along with this program; if not, write to the Free Software
  21. ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
  22. ;*
  23. ;* This program is also available under a commercial proprietary license.
  24. ;* For more information, contact us at licensing@x264.com.
  25. ;*****************************************************************************
  26. ; like cextern, but with a plain x264 prefix instead of a bitdepth-specific one
  27. %macro cextern_common 1
  28. %xdefine %1 mangle(x264 %+ _ %+ %1)
  29. CAT_XDEFINE cglobaled_, %1, 1
  30. extern %1
  31. %endmacro
  32. %ifndef BIT_DEPTH
  33. %assign BIT_DEPTH 0
  34. %endif
  35. %if BIT_DEPTH > 8
  36. %assign HIGH_BIT_DEPTH 1
  37. %else
  38. %assign HIGH_BIT_DEPTH 0
  39. %endif
  40. %assign FENC_STRIDE 16
  41. %assign FDEC_STRIDE 32
  42. %assign SIZEOF_PIXEL 1
  43. %assign SIZEOF_DCTCOEF 2
  44. %define pixel byte
  45. %define vpbroadcastdct vpbroadcastw
  46. %define vpbroadcastpix vpbroadcastb
  47. %if HIGH_BIT_DEPTH
  48. %assign SIZEOF_PIXEL 2
  49. %assign SIZEOF_DCTCOEF 4
  50. %define pixel word
  51. %define vpbroadcastdct vpbroadcastd
  52. %define vpbroadcastpix vpbroadcastw
  53. %endif
  54. %assign FENC_STRIDEB SIZEOF_PIXEL*FENC_STRIDE
  55. %assign FDEC_STRIDEB SIZEOF_PIXEL*FDEC_STRIDE
  56. %assign PIXEL_MAX ((1 << BIT_DEPTH)-1)
  57. %macro FIX_STRIDES 1-*
  58. %if HIGH_BIT_DEPTH
  59. %rep %0
  60. add %1, %1
  61. %rotate 1
  62. %endrep
  63. %endif
  64. %endmacro
  65. %macro SBUTTERFLY 4
  66. %ifidn %1, dqqq
  67. vperm2i128 m%4, m%2, m%3, q0301 ; punpckh
  68. vinserti128 m%2, m%2, xm%3, 1 ; punpckl
  69. %elif avx_enabled && mmsize >= 16
  70. punpckh%1 m%4, m%2, m%3
  71. punpckl%1 m%2, m%3
  72. %else
  73. mova m%4, m%2
  74. punpckl%1 m%2, m%3
  75. punpckh%1 m%4, m%3
  76. %endif
  77. SWAP %3, %4
  78. %endmacro
  79. %macro SBUTTERFLY2 4
  80. punpckl%1 m%4, m%2, m%3
  81. punpckh%1 m%2, m%2, m%3
  82. SWAP %2, %4, %3
  83. %endmacro
  84. %macro TRANSPOSE4x4W 5
  85. SBUTTERFLY wd, %1, %2, %5
  86. SBUTTERFLY wd, %3, %4, %5
  87. SBUTTERFLY dq, %1, %3, %5
  88. SBUTTERFLY dq, %2, %4, %5
  89. SWAP %2, %3
  90. %endmacro
  91. %macro TRANSPOSE2x4x4W 5
  92. SBUTTERFLY wd, %1, %2, %5
  93. SBUTTERFLY wd, %3, %4, %5
  94. SBUTTERFLY dq, %1, %3, %5
  95. SBUTTERFLY dq, %2, %4, %5
  96. SBUTTERFLY qdq, %1, %2, %5
  97. SBUTTERFLY qdq, %3, %4, %5
  98. %endmacro
  99. %macro TRANSPOSE4x4D 5
  100. SBUTTERFLY dq, %1, %2, %5
  101. SBUTTERFLY dq, %3, %4, %5
  102. SBUTTERFLY qdq, %1, %3, %5
  103. SBUTTERFLY qdq, %2, %4, %5
  104. SWAP %2, %3
  105. %endmacro
  106. %macro TRANSPOSE8x8W 9-11
  107. %if ARCH_X86_64
  108. SBUTTERFLY wd, %1, %2, %9
  109. SBUTTERFLY wd, %3, %4, %9
  110. SBUTTERFLY wd, %5, %6, %9
  111. SBUTTERFLY wd, %7, %8, %9
  112. SBUTTERFLY dq, %1, %3, %9
  113. SBUTTERFLY dq, %2, %4, %9
  114. SBUTTERFLY dq, %5, %7, %9
  115. SBUTTERFLY dq, %6, %8, %9
  116. SBUTTERFLY qdq, %1, %5, %9
  117. SBUTTERFLY qdq, %2, %6, %9
  118. SBUTTERFLY qdq, %3, %7, %9
  119. SBUTTERFLY qdq, %4, %8, %9
  120. SWAP %2, %5
  121. SWAP %4, %7
  122. %else
  123. ; in: m0..m7, unless %11 in which case m6 is in %9
  124. ; out: m0..m7, unless %11 in which case m4 is in %10
  125. ; spills into %9 and %10
  126. %if %0<11
  127. movdqa %9, m%7
  128. %endif
  129. SBUTTERFLY wd, %1, %2, %7
  130. movdqa %10, m%2
  131. movdqa m%7, %9
  132. SBUTTERFLY wd, %3, %4, %2
  133. SBUTTERFLY wd, %5, %6, %2
  134. SBUTTERFLY wd, %7, %8, %2
  135. SBUTTERFLY dq, %1, %3, %2
  136. movdqa %9, m%3
  137. movdqa m%2, %10
  138. SBUTTERFLY dq, %2, %4, %3
  139. SBUTTERFLY dq, %5, %7, %3
  140. SBUTTERFLY dq, %6, %8, %3
  141. SBUTTERFLY qdq, %1, %5, %3
  142. SBUTTERFLY qdq, %2, %6, %3
  143. movdqa %10, m%2
  144. movdqa m%3, %9
  145. SBUTTERFLY qdq, %3, %7, %2
  146. SBUTTERFLY qdq, %4, %8, %2
  147. SWAP %2, %5
  148. SWAP %4, %7
  149. %if %0<11
  150. movdqa m%5, %10
  151. %endif
  152. %endif
  153. %endmacro
  154. %macro WIDEN_SXWD 2
  155. punpckhwd m%2, m%1
  156. psrad m%2, 16
  157. %if cpuflag(sse4)
  158. pmovsxwd m%1, m%1
  159. %else
  160. punpcklwd m%1, m%1
  161. psrad m%1, 16
  162. %endif
  163. %endmacro
  164. %macro ABSW 2-3 ; dst, src, tmp (tmp used only if dst==src)
  165. %if cpuflag(ssse3)
  166. pabsw %1, %2
  167. %elifidn %3, sign ; version for pairing with PSIGNW: modifies src
  168. pxor %1, %1
  169. pcmpgtw %1, %2
  170. pxor %2, %1
  171. psubw %2, %1
  172. SWAP %1, %2
  173. %elifidn %1, %2
  174. pxor %3, %3
  175. psubw %3, %1
  176. pmaxsw %1, %3
  177. %elifid %2
  178. pxor %1, %1
  179. psubw %1, %2
  180. pmaxsw %1, %2
  181. %elif %0 == 2
  182. pxor %1, %1
  183. psubw %1, %2
  184. pmaxsw %1, %2
  185. %else
  186. mova %1, %2
  187. pxor %3, %3
  188. psubw %3, %1
  189. pmaxsw %1, %3
  190. %endif
  191. %endmacro
  192. %macro ABSW2 6 ; dst1, dst2, src1, src2, tmp, tmp
  193. %if cpuflag(ssse3)
  194. pabsw %1, %3
  195. pabsw %2, %4
  196. %elifidn %1, %3
  197. pxor %5, %5
  198. pxor %6, %6
  199. psubw %5, %1
  200. psubw %6, %2
  201. pmaxsw %1, %5
  202. pmaxsw %2, %6
  203. %else
  204. pxor %1, %1
  205. pxor %2, %2
  206. psubw %1, %3
  207. psubw %2, %4
  208. pmaxsw %1, %3
  209. pmaxsw %2, %4
  210. %endif
  211. %endmacro
  212. %macro ABSB 2
  213. %if cpuflag(ssse3)
  214. pabsb %1, %1
  215. %else
  216. pxor %2, %2
  217. psubb %2, %1
  218. pminub %1, %2
  219. %endif
  220. %endmacro
  221. %macro ABSD 2-3
  222. %if cpuflag(ssse3)
  223. pabsd %1, %2
  224. %else
  225. %define %%s %2
  226. %if %0 == 3
  227. mova %3, %2
  228. %define %%s %3
  229. %endif
  230. pxor %1, %1
  231. pcmpgtd %1, %%s
  232. pxor %%s, %1
  233. psubd %%s, %1
  234. SWAP %1, %%s
  235. %endif
  236. %endmacro
  237. %macro PSIGN 3-4
  238. %if cpuflag(ssse3) && %0 == 4
  239. psign%1 %2, %3, %4
  240. %elif cpuflag(ssse3)
  241. psign%1 %2, %3
  242. %elif %0 == 4
  243. pxor %2, %3, %4
  244. psub%1 %2, %4
  245. %else
  246. pxor %2, %3
  247. psub%1 %2, %3
  248. %endif
  249. %endmacro
  250. %define PSIGNW PSIGN w,
  251. %define PSIGND PSIGN d,
  252. %macro SPLATB_LOAD 3
  253. %if cpuflag(ssse3)
  254. movd %1, [%2-3]
  255. pshufb %1, %3
  256. %else
  257. movd %1, [%2-3] ;to avoid crossing a cacheline
  258. punpcklbw %1, %1
  259. SPLATW %1, %1, 3
  260. %endif
  261. %endmacro
  262. %imacro SPLATW 2-3 0
  263. %if cpuflag(avx2) && %3 == 0
  264. vpbroadcastw %1, %2
  265. %else
  266. PSHUFLW %1, %2, (%3)*q1111
  267. %if mmsize == 16
  268. punpcklqdq %1, %1
  269. %endif
  270. %endif
  271. %endmacro
  272. %imacro SPLATD 2-3 0
  273. %if mmsize == 16
  274. pshufd %1, %2, (%3)*q1111
  275. %else
  276. pshufw %1, %2, (%3)*q0101 + ((%3)+1)*q1010
  277. %endif
  278. %endmacro
  279. %macro CLIPW 3 ;(dst, min, max)
  280. pmaxsw %1, %2
  281. pminsw %1, %3
  282. %endmacro
  283. %macro MOVHL 2 ; dst, src
  284. %ifidn %1, %2
  285. punpckhqdq %1, %2
  286. %elif cpuflag(avx)
  287. punpckhqdq %1, %2, %2
  288. %elif cpuflag(sse4)
  289. pshufd %1, %2, q3232 ; pshufd is slow on some older CPUs, so only use it on more modern ones
  290. %else
  291. movhlps %1, %2 ; may cause an int/float domain transition and has a dependency on dst
  292. %endif
  293. %endmacro
  294. %macro HADDD 2 ; sum junk
  295. %if sizeof%1 >= 64
  296. vextracti32x8 ymm%2, zmm%1, 1
  297. paddd ymm%1, ymm%2
  298. %endif
  299. %if sizeof%1 >= 32
  300. vextracti128 xmm%2, ymm%1, 1
  301. paddd xmm%1, xmm%2
  302. %endif
  303. %if sizeof%1 >= 16
  304. MOVHL xmm%2, xmm%1
  305. paddd xmm%1, xmm%2
  306. %endif
  307. %if cpuflag(xop) && sizeof%1 == 16
  308. vphadddq xmm%1, xmm%1
  309. %else
  310. PSHUFLW xmm%2, xmm%1, q1032
  311. paddd xmm%1, xmm%2
  312. %endif
  313. %endmacro
  314. %macro HADDW 2 ; reg, tmp
  315. %if cpuflag(xop) && sizeof%1 == 16
  316. vphaddwq %1, %1
  317. MOVHL %2, %1
  318. paddd %1, %2
  319. %else
  320. pmaddwd %1, [pw_1]
  321. HADDD %1, %2
  322. %endif
  323. %endmacro
  324. %macro HADDUWD 2
  325. %if cpuflag(xop) && sizeof%1 == 16
  326. vphadduwd %1, %1
  327. %else
  328. psrld %2, %1, 16
  329. pslld %1, 16
  330. psrld %1, 16
  331. paddd %1, %2
  332. %endif
  333. %endmacro
  334. %macro HADDUW 2
  335. %if cpuflag(xop) && sizeof%1 == 16
  336. vphadduwq %1, %1
  337. MOVHL %2, %1
  338. paddd %1, %2
  339. %else
  340. HADDUWD %1, %2
  341. HADDD %1, %2
  342. %endif
  343. %endmacro
  344. %macro PALIGNR 4-5 ; [dst,] src1, src2, imm, tmp
  345. ; AVX2 version uses a precalculated extra input that
  346. ; can be re-used across calls
  347. %if sizeof%1==32
  348. ; %3 = abcdefgh ijklmnop (lower address)
  349. ; %2 = ABCDEFGH IJKLMNOP (higher address)
  350. ; vperm2i128 %5, %2, %3, q0003 ; %5 = ijklmnop ABCDEFGH
  351. %if %4 < 16
  352. palignr %1, %5, %3, %4 ; %1 = bcdefghi jklmnopA
  353. %else
  354. palignr %1, %2, %5, %4-16 ; %1 = pABCDEFG HIJKLMNO
  355. %endif
  356. %elif cpuflag(ssse3)
  357. %if %0==5
  358. palignr %1, %2, %3, %4
  359. %else
  360. palignr %1, %2, %3
  361. %endif
  362. %else
  363. %define %%dst %1
  364. %if %0==5
  365. %ifnidn %1, %2
  366. mova %%dst, %2
  367. %endif
  368. %rotate 1
  369. %endif
  370. %ifnidn %4, %2
  371. mova %4, %2
  372. %endif
  373. %if mmsize==8
  374. psllq %%dst, (8-%3)*8
  375. psrlq %4, %3*8
  376. %else
  377. pslldq %%dst, 16-%3
  378. psrldq %4, %3
  379. %endif
  380. por %%dst, %4
  381. %endif
  382. %endmacro
  383. %macro PSHUFLW 1+
  384. %if mmsize == 8
  385. pshufw %1
  386. %else
  387. pshuflw %1
  388. %endif
  389. %endmacro
  390. ; shift a mmxreg by n bytes, or a xmmreg by 2*n bytes
  391. ; values shifted in are undefined
  392. ; faster if dst==src
  393. %define PSLLPIX PSXLPIX l, -1, ;dst, src, shift
  394. %define PSRLPIX PSXLPIX r, 1, ;dst, src, shift
  395. %macro PSXLPIX 5
  396. %if mmsize == 8
  397. %if %5&1
  398. ps%1lq %3, %4, %5*8
  399. %else
  400. pshufw %3, %4, (q3210<<8>>(8+%2*%5))&0xff
  401. %endif
  402. %else
  403. ps%1ldq %3, %4, %5*2
  404. %endif
  405. %endmacro
  406. %macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
  407. %ifnum %5
  408. pand m%3, m%5, m%4 ; src .. y6 .. y4
  409. pand m%1, m%5, m%2 ; dst .. y6 .. y4
  410. %else
  411. mova m%1, %5
  412. pand m%3, m%1, m%4 ; src .. y6 .. y4
  413. pand m%1, m%1, m%2 ; dst .. y6 .. y4
  414. %endif
  415. psrlw m%2, 8 ; dst .. y7 .. y5
  416. psrlw m%4, 8 ; src .. y7 .. y5
  417. %endmacro
  418. %macro SUMSUB_BA 3-4
  419. %if %0==3
  420. padd%1 m%2, m%3
  421. padd%1 m%3, m%3
  422. psub%1 m%3, m%2
  423. %elif avx_enabled
  424. padd%1 m%4, m%2, m%3
  425. psub%1 m%3, m%2
  426. SWAP %2, %4
  427. %else
  428. mova m%4, m%2
  429. padd%1 m%2, m%3
  430. psub%1 m%3, m%4
  431. %endif
  432. %endmacro
  433. %macro SUMSUB_BADC 5-6
  434. %if %0==6
  435. SUMSUB_BA %1, %2, %3, %6
  436. SUMSUB_BA %1, %4, %5, %6
  437. %else
  438. padd%1 m%2, m%3
  439. padd%1 m%4, m%5
  440. padd%1 m%3, m%3
  441. padd%1 m%5, m%5
  442. psub%1 m%3, m%2
  443. psub%1 m%5, m%4
  444. %endif
  445. %endmacro
  446. %macro HADAMARD4_V 4+
  447. SUMSUB_BADC w, %1, %2, %3, %4
  448. SUMSUB_BADC w, %1, %3, %2, %4
  449. %endmacro
  450. %macro HADAMARD8_V 8+
  451. SUMSUB_BADC w, %1, %2, %3, %4
  452. SUMSUB_BADC w, %5, %6, %7, %8
  453. SUMSUB_BADC w, %1, %3, %2, %4
  454. SUMSUB_BADC w, %5, %7, %6, %8
  455. SUMSUB_BADC w, %1, %5, %2, %6
  456. SUMSUB_BADC w, %3, %7, %4, %8
  457. %endmacro
  458. %macro TRANS_SSE2 5-6
  459. ; TRANSPOSE2x2
  460. ; %1: transpose width (d/q) - use SBUTTERFLY qdq for dq
  461. ; %2: ord/unord (for compat with sse4, unused)
  462. ; %3/%4: source regs
  463. ; %5/%6: tmp regs
  464. %ifidn %1, d
  465. %define mask [mask_10]
  466. %define shift 16
  467. %elifidn %1, q
  468. %define mask [mask_1100]
  469. %define shift 32
  470. %endif
  471. %if %0==6 ; less dependency if we have two tmp
  472. mova m%5, mask ; ff00
  473. mova m%6, m%4 ; x5x4
  474. psll%1 m%4, shift ; x4..
  475. pand m%6, m%5 ; x5..
  476. pandn m%5, m%3 ; ..x0
  477. psrl%1 m%3, shift ; ..x1
  478. por m%4, m%5 ; x4x0
  479. por m%3, m%6 ; x5x1
  480. %else ; more dependency, one insn less. sometimes faster, sometimes not
  481. mova m%5, m%4 ; x5x4
  482. psll%1 m%4, shift ; x4..
  483. pxor m%4, m%3 ; (x4^x1)x0
  484. pand m%4, mask ; (x4^x1)..
  485. pxor m%3, m%4 ; x4x0
  486. psrl%1 m%4, shift ; ..(x1^x4)
  487. pxor m%5, m%4 ; x5x1
  488. SWAP %4, %3, %5
  489. %endif
  490. %endmacro
  491. %macro TRANS_SSE4 5-6 ; see above
  492. %ifidn %1, d
  493. %ifidn %2, ord
  494. psrl%1 m%5, m%3, 16
  495. pblendw m%5, m%4, q2222
  496. psll%1 m%4, 16
  497. pblendw m%4, m%3, q1111
  498. SWAP %3, %5
  499. %else
  500. %if avx_enabled
  501. pblendw m%5, m%3, m%4, q2222
  502. SWAP %3, %5
  503. %else
  504. mova m%5, m%3
  505. pblendw m%3, m%4, q2222
  506. %endif
  507. psll%1 m%4, 16
  508. psrl%1 m%5, 16
  509. por m%4, m%5
  510. %endif
  511. %elifidn %1, q
  512. shufps m%5, m%3, m%4, q3131
  513. shufps m%3, m%3, m%4, q2020
  514. SWAP %4, %5
  515. %endif
  516. %endmacro
  517. %macro TRANS_XOP 5-6
  518. %ifidn %1, d
  519. vpperm m%5, m%3, m%4, [transd_shuf1]
  520. vpperm m%3, m%3, m%4, [transd_shuf2]
  521. %elifidn %1, q
  522. shufps m%5, m%3, m%4, q3131
  523. shufps m%3, m%4, q2020
  524. %endif
  525. SWAP %4, %5
  526. %endmacro
  527. %macro HADAMARD 5-6
  528. ; %1=distance in words (0 for vertical pass, 1/2/4 for horizontal passes)
  529. ; %2=sumsub/max/amax (sum and diff / maximum / maximum of absolutes)
  530. ; %3/%4: regs
  531. ; %5(%6): tmpregs
  532. %if %1!=0 ; have to reorder stuff for horizontal op
  533. %ifidn %2, sumsub
  534. %define ORDER ord
  535. ; sumsub needs order because a-b != b-a unless a=b
  536. %else
  537. %define ORDER unord
  538. ; if we just max, order doesn't matter (allows pblendw+or in sse4)
  539. %endif
  540. %if %1==1
  541. TRANS d, ORDER, %3, %4, %5, %6
  542. %elif %1==2
  543. %if mmsize==8
  544. SBUTTERFLY dq, %3, %4, %5
  545. %else
  546. TRANS q, ORDER, %3, %4, %5, %6
  547. %endif
  548. %elif %1==4
  549. SBUTTERFLY qdq, %3, %4, %5
  550. %elif %1==8
  551. SBUTTERFLY dqqq, %3, %4, %5
  552. %endif
  553. %endif
  554. %ifidn %2, sumsub
  555. SUMSUB_BA w, %3, %4, %5
  556. %else
  557. %ifidn %2, amax
  558. %if %0==6
  559. ABSW2 m%3, m%4, m%3, m%4, m%5, m%6
  560. %else
  561. ABSW m%3, m%3, m%5
  562. ABSW m%4, m%4, m%5
  563. %endif
  564. %endif
  565. pmaxsw m%3, m%4
  566. %endif
  567. %endmacro
  568. %macro HADAMARD2_2D 6-7 sumsub
  569. HADAMARD 0, sumsub, %1, %2, %5
  570. HADAMARD 0, sumsub, %3, %4, %5
  571. SBUTTERFLY %6, %1, %2, %5
  572. %ifnum %7
  573. HADAMARD 0, amax, %1, %2, %5, %7
  574. %else
  575. HADAMARD 0, %7, %1, %2, %5
  576. %endif
  577. SBUTTERFLY %6, %3, %4, %5
  578. %ifnum %7
  579. HADAMARD 0, amax, %3, %4, %5, %7
  580. %else
  581. HADAMARD 0, %7, %3, %4, %5
  582. %endif
  583. %endmacro
  584. %macro HADAMARD4_2D 5-6 sumsub
  585. HADAMARD2_2D %1, %2, %3, %4, %5, wd
  586. HADAMARD2_2D %1, %3, %2, %4, %5, dq, %6
  587. SWAP %2, %3
  588. %endmacro
  589. %macro HADAMARD4_2D_SSE 5-6 sumsub
  590. HADAMARD 0, sumsub, %1, %2, %5 ; 1st V row 0 + 1
  591. HADAMARD 0, sumsub, %3, %4, %5 ; 1st V row 2 + 3
  592. SBUTTERFLY wd, %1, %2, %5 ; %1: m0 1+0 %2: m1 1+0
  593. SBUTTERFLY wd, %3, %4, %5 ; %3: m0 3+2 %4: m1 3+2
  594. HADAMARD2_2D %1, %3, %2, %4, %5, dq
  595. SBUTTERFLY qdq, %1, %2, %5
  596. HADAMARD 0, %6, %1, %2, %5 ; 2nd H m1/m0 row 0+1
  597. SBUTTERFLY qdq, %3, %4, %5
  598. HADAMARD 0, %6, %3, %4, %5 ; 2nd H m1/m0 row 2+3
  599. %endmacro
  600. %macro HADAMARD8_2D 9-10 sumsub
  601. HADAMARD2_2D %1, %2, %3, %4, %9, wd
  602. HADAMARD2_2D %5, %6, %7, %8, %9, wd
  603. HADAMARD2_2D %1, %3, %2, %4, %9, dq
  604. HADAMARD2_2D %5, %7, %6, %8, %9, dq
  605. HADAMARD2_2D %1, %5, %3, %7, %9, qdq, %10
  606. HADAMARD2_2D %2, %6, %4, %8, %9, qdq, %10
  607. %ifnidn %10, amax
  608. SWAP %2, %5
  609. SWAP %4, %7
  610. %endif
  611. %endmacro
  612. ; doesn't include the "pmaddubsw hmul_8p" pass
  613. %macro HADAMARD8_2D_HMUL 10
  614. HADAMARD4_V %1, %2, %3, %4, %9
  615. HADAMARD4_V %5, %6, %7, %8, %9
  616. SUMSUB_BADC w, %1, %5, %2, %6, %9
  617. HADAMARD 2, sumsub, %1, %5, %9, %10
  618. HADAMARD 2, sumsub, %2, %6, %9, %10
  619. SUMSUB_BADC w, %3, %7, %4, %8, %9
  620. HADAMARD 2, sumsub, %3, %7, %9, %10
  621. HADAMARD 2, sumsub, %4, %8, %9, %10
  622. HADAMARD 1, amax, %1, %5, %9, %10
  623. HADAMARD 1, amax, %2, %6, %9, %5
  624. HADAMARD 1, amax, %3, %7, %9, %5
  625. HADAMARD 1, amax, %4, %8, %9, %5
  626. %endmacro
  627. %macro SUMSUB2_AB 4
  628. %if cpuflag(xop)
  629. pmacs%1%1 m%4, m%3, [p%1_m2], m%2
  630. pmacs%1%1 m%2, m%2, [p%1_2], m%3
  631. %elifnum %3
  632. psub%1 m%4, m%2, m%3
  633. psub%1 m%4, m%3
  634. padd%1 m%2, m%2
  635. padd%1 m%2, m%3
  636. %else
  637. mova m%4, m%2
  638. padd%1 m%2, m%2
  639. padd%1 m%2, %3
  640. psub%1 m%4, %3
  641. psub%1 m%4, %3
  642. %endif
  643. %endmacro
  644. %macro SUMSUBD2_AB 5
  645. %ifnum %4
  646. psra%1 m%5, m%2, 1 ; %3: %3>>1
  647. psra%1 m%4, m%3, 1 ; %2: %2>>1
  648. padd%1 m%4, m%2 ; %3: %3>>1+%2
  649. psub%1 m%5, m%3 ; %2: %2>>1-%3
  650. SWAP %2, %5
  651. SWAP %3, %4
  652. %else
  653. mova %5, m%2
  654. mova %4, m%3
  655. psra%1 m%3, 1 ; %3: %3>>1
  656. psra%1 m%2, 1 ; %2: %2>>1
  657. padd%1 m%3, %5 ; %3: %3>>1+%2
  658. psub%1 m%2, %4 ; %2: %2>>1-%3
  659. %endif
  660. %endmacro
  661. %macro DCT4_1D 5
  662. %ifnum %5
  663. SUMSUB_BADC w, %4, %1, %3, %2, %5
  664. SUMSUB_BA w, %3, %4, %5
  665. SUMSUB2_AB w, %1, %2, %5
  666. SWAP %1, %3, %4, %5, %2
  667. %else
  668. SUMSUB_BADC w, %4, %1, %3, %2
  669. SUMSUB_BA w, %3, %4
  670. mova [%5], m%2
  671. SUMSUB2_AB w, %1, [%5], %2
  672. SWAP %1, %3, %4, %2
  673. %endif
  674. %endmacro
  675. %macro IDCT4_1D 6-7
  676. %ifnum %6
  677. SUMSUBD2_AB %1, %3, %5, %7, %6
  678. ; %3: %3>>1-%5 %5: %3+%5>>1
  679. SUMSUB_BA %1, %4, %2, %7
  680. ; %4: %2+%4 %2: %2-%4
  681. SUMSUB_BADC %1, %5, %4, %3, %2, %7
  682. ; %5: %2+%4 + (%3+%5>>1)
  683. ; %4: %2+%4 - (%3+%5>>1)
  684. ; %3: %2-%4 + (%3>>1-%5)
  685. ; %2: %2-%4 - (%3>>1-%5)
  686. %else
  687. %ifidn %1, w
  688. SUMSUBD2_AB %1, %3, %5, [%6], [%6+16]
  689. %else
  690. SUMSUBD2_AB %1, %3, %5, [%6], [%6+32]
  691. %endif
  692. SUMSUB_BA %1, %4, %2
  693. SUMSUB_BADC %1, %5, %4, %3, %2
  694. %endif
  695. SWAP %2, %5, %4
  696. ; %2: %2+%4 + (%3+%5>>1) row0
  697. ; %3: %2-%4 + (%3>>1-%5) row1
  698. ; %4: %2-%4 - (%3>>1-%5) row2
  699. ; %5: %2+%4 - (%3+%5>>1) row3
  700. %endmacro
  701. %macro LOAD_DIFF 5-6 1
  702. %if HIGH_BIT_DEPTH
  703. %if %6 ; %5 aligned?
  704. mova %1, %4
  705. psubw %1, %5
  706. %elif cpuflag(avx)
  707. movu %1, %4
  708. psubw %1, %5
  709. %else
  710. movu %1, %4
  711. movu %2, %5
  712. psubw %1, %2
  713. %endif
  714. %else ; !HIGH_BIT_DEPTH
  715. movh %1, %4
  716. movh %2, %5
  717. %ifidn %3, none
  718. punpcklbw %1, %2
  719. punpcklbw %2, %2
  720. %else
  721. punpcklbw %1, %3
  722. punpcklbw %2, %3
  723. %endif
  724. psubw %1, %2
  725. %endif ; HIGH_BIT_DEPTH
  726. %endmacro
  727. %macro LOAD_DIFF8x4 8 ; 4x dst, 1x tmp, 1x mul, 2x ptr
  728. %if BIT_DEPTH == 8 && cpuflag(ssse3)
  729. movh m%2, [%8+%1*FDEC_STRIDE]
  730. movh m%1, [%7+%1*FENC_STRIDE]
  731. punpcklbw m%1, m%2
  732. movh m%3, [%8+%2*FDEC_STRIDE]
  733. movh m%2, [%7+%2*FENC_STRIDE]
  734. punpcklbw m%2, m%3
  735. movh m%4, [%8+%3*FDEC_STRIDE]
  736. movh m%3, [%7+%3*FENC_STRIDE]
  737. punpcklbw m%3, m%4
  738. movh m%5, [%8+%4*FDEC_STRIDE]
  739. movh m%4, [%7+%4*FENC_STRIDE]
  740. punpcklbw m%4, m%5
  741. pmaddubsw m%1, m%6
  742. pmaddubsw m%2, m%6
  743. pmaddubsw m%3, m%6
  744. pmaddubsw m%4, m%6
  745. %else
  746. LOAD_DIFF m%1, m%5, m%6, [%7+%1*FENC_STRIDEB], [%8+%1*FDEC_STRIDEB]
  747. LOAD_DIFF m%2, m%5, m%6, [%7+%2*FENC_STRIDEB], [%8+%2*FDEC_STRIDEB]
  748. LOAD_DIFF m%3, m%5, m%6, [%7+%3*FENC_STRIDEB], [%8+%3*FDEC_STRIDEB]
  749. LOAD_DIFF m%4, m%5, m%6, [%7+%4*FENC_STRIDEB], [%8+%4*FDEC_STRIDEB]
  750. %endif
  751. %endmacro
  752. %macro STORE_DCT 6
  753. movq [%5+%6+ 0], m%1
  754. movq [%5+%6+ 8], m%2
  755. movq [%5+%6+16], m%3
  756. movq [%5+%6+24], m%4
  757. movhps [%5+%6+32], m%1
  758. movhps [%5+%6+40], m%2
  759. movhps [%5+%6+48], m%3
  760. movhps [%5+%6+56], m%4
  761. %endmacro
  762. %macro STORE_IDCT 4
  763. movhps [r0-4*FDEC_STRIDE], %1
  764. movh [r0-3*FDEC_STRIDE], %1
  765. movhps [r0-2*FDEC_STRIDE], %2
  766. movh [r0-1*FDEC_STRIDE], %2
  767. movhps [r0+0*FDEC_STRIDE], %3
  768. movh [r0+1*FDEC_STRIDE], %3
  769. movhps [r0+2*FDEC_STRIDE], %4
  770. movh [r0+3*FDEC_STRIDE], %4
  771. %endmacro
  772. %macro LOAD_DIFF_8x4P 7-11 r0,r2,0,1 ; 4x dest, 2x temp, 2x pointer, increment, aligned?
  773. LOAD_DIFF m%1, m%5, m%7, [%8], [%9], %11
  774. LOAD_DIFF m%2, m%6, m%7, [%8+r1], [%9+r3], %11
  775. LOAD_DIFF m%3, m%5, m%7, [%8+2*r1], [%9+2*r3], %11
  776. LOAD_DIFF m%4, m%6, m%7, [%8+r4], [%9+r5], %11
  777. %if %10
  778. lea %8, [%8+4*r1]
  779. lea %9, [%9+4*r3]
  780. %endif
  781. %endmacro
  782. ; 2xdst, 2xtmp, 2xsrcrow
  783. %macro LOAD_DIFF16x2_AVX2 6
  784. pmovzxbw m%1, [r1+%5*FENC_STRIDE]
  785. pmovzxbw m%2, [r1+%6*FENC_STRIDE]
  786. pmovzxbw m%3, [r2+(%5-4)*FDEC_STRIDE]
  787. pmovzxbw m%4, [r2+(%6-4)*FDEC_STRIDE]
  788. psubw m%1, m%3
  789. psubw m%2, m%4
  790. %endmacro
  791. %macro DIFFx2 6-7
  792. movh %3, %5
  793. punpcklbw %3, %4
  794. psraw %1, 6
  795. paddsw %1, %3
  796. movh %3, %6
  797. punpcklbw %3, %4
  798. psraw %2, 6
  799. paddsw %2, %3
  800. packuswb %2, %1
  801. %endmacro
  802. ; (high depth) in: %1, %2, min to clip, max to clip, mem128
  803. ; in: %1, tmp, %3, mem64
  804. %macro STORE_DIFF 4-5
  805. %if HIGH_BIT_DEPTH
  806. psrad %1, 6
  807. psrad %2, 6
  808. packssdw %1, %2
  809. paddw %1, %5
  810. CLIPW %1, %3, %4
  811. mova %5, %1
  812. %else
  813. movh %2, %4
  814. punpcklbw %2, %3
  815. psraw %1, 6
  816. paddsw %1, %2
  817. packuswb %1, %1
  818. movh %4, %1
  819. %endif
  820. %endmacro
  821. %macro SHUFFLE_MASK_W 8
  822. %rep 8
  823. %if %1>=0x80
  824. db %1, %1
  825. %else
  826. db %1*2
  827. db %1*2+1
  828. %endif
  829. %rotate 1
  830. %endrep
  831. %endmacro
  832. ; instruction, accum, input, iteration (zero to swap, nonzero to add)
  833. %macro ACCUM 4
  834. %if %4
  835. %1 m%2, m%3
  836. %else
  837. SWAP %2, %3
  838. %endif
  839. %endmacro