x86util.asm 18 KB

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