x86util.asm 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. ;*****************************************************************************
  2. ;* x86util.asm
  3. ;*****************************************************************************
  4. ;* Copyright (C) 2008 Loren Merritt <lorenm@u.washington.edu>
  5. ;*
  6. ;* This program is free software; you can redistribute it and/or modify
  7. ;* it under the terms of the GNU General Public License as published by
  8. ;* the Free Software Foundation; either version 2 of the License, or
  9. ;* (at your option) any later version.
  10. ;*
  11. ;* This program is distributed in the hope that it will be useful,
  12. ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. ;* GNU General Public License for more details.
  15. ;*
  16. ;* You should have received a copy of the GNU General Public License
  17. ;* along with this program; if not, write to the Free Software
  18. ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
  19. ;*****************************************************************************
  20. %macro SBUTTERFLY 4
  21. mova m%4, m%2
  22. punpckl%1 m%2, m%3
  23. punpckh%1 m%4, m%3
  24. SWAP %3, %4
  25. %endmacro
  26. %macro TRANSPOSE4x4W 5
  27. SBUTTERFLY wd, %1, %2, %5
  28. SBUTTERFLY wd, %3, %4, %5
  29. SBUTTERFLY dq, %1, %3, %5
  30. SBUTTERFLY dq, %2, %4, %5
  31. SWAP %2, %3
  32. %endmacro
  33. %macro TRANSPOSE2x4x4W 5
  34. SBUTTERFLY wd, %1, %2, %5
  35. SBUTTERFLY wd, %3, %4, %5
  36. SBUTTERFLY dq, %1, %3, %5
  37. SBUTTERFLY dq, %2, %4, %5
  38. SBUTTERFLY qdq, %1, %2, %5
  39. SBUTTERFLY qdq, %3, %4, %5
  40. %endmacro
  41. %macro TRANSPOSE4x4D 5
  42. SBUTTERFLY dq, %1, %2, %5
  43. SBUTTERFLY dq, %3, %4, %5
  44. SBUTTERFLY qdq, %1, %3, %5
  45. SBUTTERFLY qdq, %2, %4, %5
  46. SWAP %2, %3
  47. %endmacro
  48. %macro TRANSPOSE8x8W 9-11
  49. %ifdef ARCH_X86_64
  50. SBUTTERFLY wd, %1, %2, %9
  51. SBUTTERFLY wd, %3, %4, %9
  52. SBUTTERFLY wd, %5, %6, %9
  53. SBUTTERFLY wd, %7, %8, %9
  54. SBUTTERFLY dq, %1, %3, %9
  55. SBUTTERFLY dq, %2, %4, %9
  56. SBUTTERFLY dq, %5, %7, %9
  57. SBUTTERFLY dq, %6, %8, %9
  58. SBUTTERFLY qdq, %1, %5, %9
  59. SBUTTERFLY qdq, %2, %6, %9
  60. SBUTTERFLY qdq, %3, %7, %9
  61. SBUTTERFLY qdq, %4, %8, %9
  62. SWAP %2, %5
  63. SWAP %4, %7
  64. %else
  65. ; in: m0..m7, unless %11 in which case m6 is in %9
  66. ; out: m0..m7, unless %11 in which case m4 is in %10
  67. ; spills into %9 and %10
  68. %if %0<11
  69. movdqa %9, m%7
  70. %endif
  71. SBUTTERFLY wd, %1, %2, %7
  72. movdqa %10, m%2
  73. movdqa m%7, %9
  74. SBUTTERFLY wd, %3, %4, %2
  75. SBUTTERFLY wd, %5, %6, %2
  76. SBUTTERFLY wd, %7, %8, %2
  77. SBUTTERFLY dq, %1, %3, %2
  78. movdqa %9, m%3
  79. movdqa m%2, %10
  80. SBUTTERFLY dq, %2, %4, %3
  81. SBUTTERFLY dq, %5, %7, %3
  82. SBUTTERFLY dq, %6, %8, %3
  83. SBUTTERFLY qdq, %1, %5, %3
  84. SBUTTERFLY qdq, %2, %6, %3
  85. movdqa %10, m%2
  86. movdqa m%3, %9
  87. SBUTTERFLY qdq, %3, %7, %2
  88. SBUTTERFLY qdq, %4, %8, %2
  89. SWAP %2, %5
  90. SWAP %4, %7
  91. %if 0<11
  92. movdqa m%5, %10
  93. %endif
  94. %endif
  95. %endmacro
  96. %macro ABS1_MMX 2 ; a, tmp
  97. pxor %2, %2
  98. psubw %2, %1
  99. pmaxsw %1, %2
  100. %endmacro
  101. %macro ABS2_MMX 4 ; a, b, tmp0, tmp1
  102. pxor %3, %3
  103. pxor %4, %4
  104. psubw %3, %1
  105. psubw %4, %2
  106. pmaxsw %1, %3
  107. pmaxsw %2, %4
  108. %endmacro
  109. %macro ABS1_SSSE3 2
  110. pabsw %1, %1
  111. %endmacro
  112. %macro ABS2_SSSE3 4
  113. pabsw %1, %1
  114. pabsw %2, %2
  115. %endmacro
  116. %define ABS1 ABS1_MMX
  117. %define ABS2 ABS2_MMX
  118. %macro ABS4 6
  119. ABS2 %1, %2, %5, %6
  120. ABS2 %3, %4, %5, %6
  121. %endmacro
  122. %macro SPLATB_MMX 3
  123. movd %1, [%2-3] ;to avoid crossing a cacheline
  124. punpcklbw %1, %1
  125. %if mmsize==16
  126. pshuflw %1, %1, 0xff
  127. punpcklqdq %1, %1
  128. %else
  129. pshufw %1, %1, 0xff
  130. %endif
  131. %endmacro
  132. %macro SPLATB_SSSE3 3
  133. movd %1, [%2-3]
  134. pshufb %1, %3
  135. %endmacro
  136. %macro PALIGNR_MMX 4
  137. %ifnidn %4, %2
  138. mova %4, %2
  139. %endif
  140. %if mmsize == 8
  141. psllq %1, (8-%3)*8
  142. psrlq %4, %3*8
  143. %else
  144. pslldq %1, 16-%3
  145. psrldq %4, %3
  146. %endif
  147. por %1, %4
  148. %endmacro
  149. %macro PALIGNR_SSSE3 4
  150. palignr %1, %2, %3
  151. %endmacro
  152. %macro SUMSUB_BA 2
  153. paddw %1, %2
  154. paddw %2, %2
  155. psubw %2, %1
  156. %endmacro
  157. %macro SUMSUB_BADC 4
  158. paddw %1, %2
  159. paddw %3, %4
  160. paddw %2, %2
  161. paddw %4, %4
  162. psubw %2, %1
  163. psubw %4, %3
  164. %endmacro
  165. %macro HADAMARD8_1D 8
  166. SUMSUB_BADC %1, %5, %2, %6
  167. SUMSUB_BADC %3, %7, %4, %8
  168. SUMSUB_BADC %1, %3, %2, %4
  169. SUMSUB_BADC %5, %7, %6, %8
  170. SUMSUB_BADC %1, %2, %3, %4
  171. SUMSUB_BADC %5, %6, %7, %8
  172. %endmacro
  173. %macro SUMSUB2_AB 3
  174. mova %3, %1
  175. paddw %1, %1
  176. paddw %1, %2
  177. psubw %3, %2
  178. psubw %3, %2
  179. %endmacro
  180. %macro SUMSUBD2_AB 4
  181. mova %4, %1
  182. mova %3, %2
  183. psraw %2, 1
  184. psraw %4, 1
  185. paddw %1, %2
  186. psubw %4, %3
  187. %endmacro
  188. %macro LOAD_DIFF 5
  189. %ifidn %3, none
  190. movh %1, %4
  191. movh %2, %5
  192. punpcklbw %1, %2
  193. punpcklbw %2, %2
  194. psubw %1, %2
  195. %else
  196. movh %1, %4
  197. punpcklbw %1, %3
  198. movh %2, %5
  199. punpcklbw %2, %3
  200. psubw %1, %2
  201. %endif
  202. %endmacro
  203. %macro LOAD_DIFF_8x4P 6-8 r0,r2 ; 4x dest, 2x temp, 2x pointer
  204. LOAD_DIFF %1, %5, none, [%7], [%8]
  205. LOAD_DIFF %2, %6, none, [%7+r1], [%8+r3]
  206. LOAD_DIFF %3, %5, none, [%7+2*r1], [%8+2*r3]
  207. LOAD_DIFF %4, %6, none, [%7+r4], [%8+r5]
  208. %endmacro
  209. %macro STORE_DIFF 4
  210. psraw %1, 6
  211. movh %2, %4
  212. punpcklbw %2, %3
  213. paddsw %1, %2
  214. packuswb %1, %1
  215. movh %4, %1
  216. %endmacro