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.

avx2.S 26KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018
  1. #include "../macro.S"
  2. #include "constants.S"
  3. SECTION_TEXT
  4. GLOBAL_HIDDEN_FN chacha_blocks_avx2
  5. chacha_blocks_avx2_local:
  6. pushq %rbx
  7. pushq %rbp
  8. pushq %r12
  9. pushq %r13
  10. pushq %r14
  11. movq %rsp, %rbp
  12. andq $~63, %rsp
  13. subq $512, %rsp
  14. LOAD_VAR_PIC chacha_constants, %rax
  15. vmovdqa 0(%rax), %xmm8
  16. vmovdqa 16(%rax), %xmm6
  17. vmovdqa 32(%rax), %xmm7
  18. vmovdqu 0(%rdi), %xmm9
  19. vmovdqu 16(%rdi), %xmm10
  20. vmovdqu 32(%rdi), %xmm11
  21. movq 48(%rdi), %rax
  22. movq $1, %r9
  23. vmovdqa %xmm8, 0(%rsp)
  24. vmovdqa %xmm9, 16(%rsp)
  25. vmovdqa %xmm10, 32(%rsp)
  26. vmovdqa %xmm11, 48(%rsp)
  27. movq %rax, 64(%rsp)
  28. vmovdqa %xmm6, 448(%rsp)
  29. vmovdqa %xmm6, 464(%rsp)
  30. vmovdqa %xmm7, 480(%rsp)
  31. vmovdqa %xmm7, 496(%rsp)
  32. cmpq $512, %rcx
  33. jae chacha_blocks_avx2_atleast512
  34. cmp $256, %rcx
  35. jae chacha_blocks_avx2_atleast256
  36. jmp chacha_blocks_avx2_below256
  37. .p2align 6,,63
  38. chacha_blocks_avx2_atleast512:
  39. movq 48(%rsp), %rax
  40. leaq 1(%rax), %r8
  41. leaq 2(%rax), %r9
  42. leaq 3(%rax), %r10
  43. leaq 4(%rax), %rbx
  44. leaq 5(%rax), %r11
  45. leaq 6(%rax), %r12
  46. leaq 7(%rax), %r13
  47. leaq 8(%rax), %r14
  48. movl %eax, 128(%rsp)
  49. movl %r8d, 4+128(%rsp)
  50. movl %r9d, 8+128(%rsp)
  51. movl %r10d, 12+128(%rsp)
  52. movl %ebx, 16+128(%rsp)
  53. movl %r11d, 20+128(%rsp)
  54. movl %r12d, 24+128(%rsp)
  55. movl %r13d, 28+128(%rsp)
  56. shrq $32, %rax
  57. shrq $32, %r8
  58. shrq $32, %r9
  59. shrq $32, %r10
  60. shrq $32, %rbx
  61. shrq $32, %r11
  62. shrq $32, %r12
  63. shrq $32, %r13
  64. movl %eax, 160(%rsp)
  65. movl %r8d, 4+160(%rsp)
  66. movl %r9d, 8+160(%rsp)
  67. movl %r10d, 12+160(%rsp)
  68. movl %ebx, 16+160(%rsp)
  69. movl %r11d, 20+160(%rsp)
  70. movl %r12d, 24+160(%rsp)
  71. movl %r13d, 28+160(%rsp)
  72. movq %r14, 48(%rsp)
  73. movq 64(%rsp), %rax
  74. vpbroadcastd 0(%rsp), %ymm0
  75. vpbroadcastd 4+0(%rsp), %ymm1
  76. vpbroadcastd 8+0(%rsp), %ymm2
  77. vpbroadcastd 12+0(%rsp), %ymm3
  78. vpbroadcastd 16(%rsp), %ymm4
  79. vpbroadcastd 4+16(%rsp), %ymm5
  80. vpbroadcastd 8+16(%rsp), %ymm6
  81. vpbroadcastd 12+16(%rsp), %ymm7
  82. vpbroadcastd 32(%rsp), %ymm8
  83. vpbroadcastd 4+32(%rsp), %ymm9
  84. vpbroadcastd 8+32(%rsp), %ymm10
  85. vpbroadcastd 12+32(%rsp), %ymm11
  86. vpbroadcastd 8+48(%rsp), %ymm14
  87. vpbroadcastd 12+48(%rsp), %ymm15
  88. vmovdqa 128(%rsp), %ymm12
  89. vmovdqa 160(%rsp), %ymm13
  90. chacha_blocks_avx2_mainloop1:
  91. vpaddd %ymm0, %ymm4, %ymm0
  92. vpaddd %ymm1, %ymm5, %ymm1
  93. vpxor %ymm12, %ymm0, %ymm12
  94. vpxor %ymm13, %ymm1, %ymm13
  95. vpaddd %ymm2, %ymm6, %ymm2
  96. vpaddd %ymm3, %ymm7, %ymm3
  97. vpxor %ymm14, %ymm2, %ymm14
  98. vpxor %ymm15, %ymm3, %ymm15
  99. vpshufb 448(%rsp), %ymm12, %ymm12
  100. vpshufb 448(%rsp), %ymm13, %ymm13
  101. vpaddd %ymm8, %ymm12, %ymm8
  102. vpaddd %ymm9, %ymm13, %ymm9
  103. vpshufb 448(%rsp), %ymm14, %ymm14
  104. vpshufb 448(%rsp), %ymm15, %ymm15
  105. vpaddd %ymm10, %ymm14, %ymm10
  106. vpaddd %ymm11, %ymm15, %ymm11
  107. vmovdqa %ymm12, 96(%rsp)
  108. vpxor %ymm4, %ymm8, %ymm4
  109. vpxor %ymm5, %ymm9, %ymm5
  110. vpslld $ 12, %ymm4, %ymm12
  111. vpsrld $20, %ymm4, %ymm4
  112. vpxor %ymm4, %ymm12, %ymm4
  113. vpslld $ 12, %ymm5, %ymm12
  114. vpsrld $20, %ymm5, %ymm5
  115. vpxor %ymm5, %ymm12, %ymm5
  116. vpxor %ymm6, %ymm10, %ymm6
  117. vpxor %ymm7, %ymm11, %ymm7
  118. vpslld $ 12, %ymm6, %ymm12
  119. vpsrld $20, %ymm6, %ymm6
  120. vpxor %ymm6, %ymm12, %ymm6
  121. vpslld $ 12, %ymm7, %ymm12
  122. vpsrld $20, %ymm7, %ymm7
  123. vpxor %ymm7, %ymm12, %ymm7
  124. vpaddd %ymm0, %ymm4, %ymm0
  125. vpaddd %ymm1, %ymm5, %ymm1
  126. vpxor 96(%rsp), %ymm0, %ymm12
  127. vpxor %ymm13, %ymm1, %ymm13
  128. vpaddd %ymm2, %ymm6, %ymm2
  129. vpaddd %ymm3, %ymm7, %ymm3
  130. vpxor %ymm14, %ymm2, %ymm14
  131. vpxor %ymm15, %ymm3, %ymm15
  132. vpshufb 480(%rsp), %ymm12, %ymm12
  133. vpshufb 480(%rsp), %ymm13, %ymm13
  134. vpaddd %ymm8, %ymm12, %ymm8
  135. vpaddd %ymm9, %ymm13, %ymm9
  136. vpshufb 480(%rsp), %ymm14, %ymm14
  137. vpshufb 480(%rsp), %ymm15, %ymm15
  138. vpaddd %ymm10, %ymm14, %ymm10
  139. vpaddd %ymm11, %ymm15, %ymm11
  140. vmovdqa %ymm12, 96(%rsp)
  141. vpxor %ymm4, %ymm8, %ymm4
  142. vpxor %ymm5, %ymm9, %ymm5
  143. vpslld $ 7, %ymm4, %ymm12
  144. vpsrld $25, %ymm4, %ymm4
  145. vpxor %ymm4, %ymm12, %ymm4
  146. vpslld $ 7, %ymm5, %ymm12
  147. vpsrld $25, %ymm5, %ymm5
  148. vpxor %ymm5, %ymm12, %ymm5
  149. vpxor %ymm6, %ymm10, %ymm6
  150. vpxor %ymm7, %ymm11, %ymm7
  151. vpslld $ 7, %ymm6, %ymm12
  152. vpsrld $25, %ymm6, %ymm6
  153. vpxor %ymm6, %ymm12, %ymm6
  154. vpslld $ 7, %ymm7, %ymm12
  155. vpsrld $25, %ymm7, %ymm7
  156. vpxor %ymm7, %ymm12, %ymm7
  157. vpaddd %ymm0, %ymm5, %ymm0
  158. vpaddd %ymm1, %ymm6, %ymm1
  159. vpxor %ymm15, %ymm0, %ymm15
  160. vpxor 96(%rsp), %ymm1, %ymm12
  161. vpaddd %ymm2, %ymm7, %ymm2
  162. vpaddd %ymm3, %ymm4, %ymm3
  163. vpxor %ymm13, %ymm2, %ymm13
  164. vpxor %ymm14, %ymm3, %ymm14
  165. vpshufb 448(%rsp), %ymm15, %ymm15
  166. vpshufb 448(%rsp), %ymm12, %ymm12
  167. vpaddd %ymm10, %ymm15, %ymm10
  168. vpaddd %ymm11, %ymm12, %ymm11
  169. vpshufb 448(%rsp), %ymm13, %ymm13
  170. vpshufb 448(%rsp), %ymm14, %ymm14
  171. vpaddd %ymm8, %ymm13, %ymm8
  172. vpaddd %ymm9, %ymm14, %ymm9
  173. vmovdqa %ymm15, 96(%rsp)
  174. vpxor %ymm5, %ymm10, %ymm5
  175. vpxor %ymm6, %ymm11, %ymm6
  176. vpslld $ 12, %ymm5, %ymm15
  177. vpsrld $20, %ymm5, %ymm5
  178. vpxor %ymm5, %ymm15, %ymm5
  179. vpslld $ 12, %ymm6, %ymm15
  180. vpsrld $20, %ymm6, %ymm6
  181. vpxor %ymm6, %ymm15, %ymm6
  182. vpxor %ymm7, %ymm8, %ymm7
  183. vpxor %ymm4, %ymm9, %ymm4
  184. vpslld $ 12, %ymm7, %ymm15
  185. vpsrld $20, %ymm7, %ymm7
  186. vpxor %ymm7, %ymm15, %ymm7
  187. vpslld $ 12, %ymm4, %ymm15
  188. vpsrld $20, %ymm4, %ymm4
  189. vpxor %ymm4, %ymm15, %ymm4
  190. vpaddd %ymm0, %ymm5, %ymm0
  191. vpaddd %ymm1, %ymm6, %ymm1
  192. vpxor 96(%rsp), %ymm0, %ymm15
  193. vpxor %ymm12, %ymm1, %ymm12
  194. vpaddd %ymm2, %ymm7, %ymm2
  195. vpaddd %ymm3, %ymm4, %ymm3
  196. vpxor %ymm13, %ymm2, %ymm13
  197. vpxor %ymm14, %ymm3, %ymm14
  198. vpshufb 480(%rsp), %ymm15, %ymm15
  199. vpshufb 480(%rsp), %ymm12, %ymm12
  200. vpaddd %ymm10, %ymm15, %ymm10
  201. vpaddd %ymm11, %ymm12, %ymm11
  202. vpshufb 480(%rsp), %ymm13, %ymm13
  203. vpshufb 480(%rsp), %ymm14, %ymm14
  204. vpaddd %ymm8, %ymm13, %ymm8
  205. vpaddd %ymm9, %ymm14, %ymm9
  206. vmovdqa %ymm15, 96(%rsp)
  207. vpxor %ymm5, %ymm10, %ymm5
  208. vpxor %ymm6, %ymm11, %ymm6
  209. vpslld $ 7, %ymm5, %ymm15
  210. vpsrld $25, %ymm5, %ymm5
  211. vpxor %ymm5, %ymm15, %ymm5
  212. vpslld $ 7, %ymm6, %ymm15
  213. vpsrld $25, %ymm6, %ymm6
  214. vpxor %ymm6, %ymm15, %ymm6
  215. vpxor %ymm7, %ymm8, %ymm7
  216. vpxor %ymm4, %ymm9, %ymm4
  217. vpslld $ 7, %ymm7, %ymm15
  218. vpsrld $25, %ymm7, %ymm7
  219. vpxor %ymm7, %ymm15, %ymm7
  220. vpslld $ 7, %ymm4, %ymm15
  221. vpsrld $25, %ymm4, %ymm4
  222. vpxor %ymm4, %ymm15, %ymm4
  223. vmovdqa 96(%rsp), %ymm15
  224. subq $2, %rax
  225. jnz chacha_blocks_avx2_mainloop1
  226. vmovdqa %ymm8, 192(%rsp)
  227. vmovdqa %ymm9, 224(%rsp)
  228. vmovdqa %ymm10, 256(%rsp)
  229. vmovdqa %ymm11, 288(%rsp)
  230. vmovdqa %ymm12, 320(%rsp)
  231. vmovdqa %ymm13, 352(%rsp)
  232. vmovdqa %ymm14, 384(%rsp)
  233. vmovdqa %ymm15, 416(%rsp)
  234. vpbroadcastd 0(%rsp), %ymm8
  235. vpbroadcastd 4+0(%rsp), %ymm9
  236. vpbroadcastd 8+0(%rsp), %ymm10
  237. vpbroadcastd 12+0(%rsp), %ymm11
  238. vpbroadcastd 16(%rsp), %ymm12
  239. vpbroadcastd 4+16(%rsp), %ymm13
  240. vpbroadcastd 8+16(%rsp), %ymm14
  241. vpbroadcastd 12+16(%rsp), %ymm15
  242. vpaddd %ymm8, %ymm0, %ymm0
  243. vpaddd %ymm9, %ymm1, %ymm1
  244. vpaddd %ymm10, %ymm2, %ymm2
  245. vpaddd %ymm11, %ymm3, %ymm3
  246. vpaddd %ymm12, %ymm4, %ymm4
  247. vpaddd %ymm13, %ymm5, %ymm5
  248. vpaddd %ymm14, %ymm6, %ymm6
  249. vpaddd %ymm15, %ymm7, %ymm7
  250. vpunpckldq %ymm1, %ymm0, %ymm8
  251. vpunpckldq %ymm3, %ymm2, %ymm9
  252. vpunpckhdq %ymm1, %ymm0, %ymm12
  253. vpunpckhdq %ymm3, %ymm2, %ymm13
  254. vpunpckldq %ymm5, %ymm4, %ymm10
  255. vpunpckldq %ymm7, %ymm6, %ymm11
  256. vpunpckhdq %ymm5, %ymm4, %ymm14
  257. vpunpckhdq %ymm7, %ymm6, %ymm15
  258. vpunpcklqdq %ymm9, %ymm8, %ymm0
  259. vpunpcklqdq %ymm11, %ymm10, %ymm1
  260. vpunpckhqdq %ymm9, %ymm8, %ymm2
  261. vpunpckhqdq %ymm11, %ymm10, %ymm3
  262. vpunpcklqdq %ymm13, %ymm12, %ymm4
  263. vpunpcklqdq %ymm15, %ymm14, %ymm5
  264. vpunpckhqdq %ymm13, %ymm12, %ymm6
  265. vpunpckhqdq %ymm15, %ymm14, %ymm7
  266. vperm2i128 $0x20, %ymm1, %ymm0, %ymm8
  267. vperm2i128 $0x20, %ymm3, %ymm2, %ymm9
  268. vperm2i128 $0x31, %ymm1, %ymm0, %ymm12
  269. vperm2i128 $0x31, %ymm3, %ymm2, %ymm13
  270. vperm2i128 $0x20, %ymm5, %ymm4, %ymm10
  271. vperm2i128 $0x20, %ymm7, %ymm6, %ymm11
  272. vperm2i128 $0x31, %ymm5, %ymm4, %ymm14
  273. vperm2i128 $0x31, %ymm7, %ymm6, %ymm15
  274. andq %rsi, %rsi
  275. jz chacha_blocks_avx2_noinput1
  276. vpxor 0(%rsi), %ymm8, %ymm8
  277. vpxor 64(%rsi), %ymm9, %ymm9
  278. vpxor 128(%rsi), %ymm10, %ymm10
  279. vpxor 192(%rsi), %ymm11, %ymm11
  280. vpxor 256(%rsi), %ymm12, %ymm12
  281. vpxor 320(%rsi), %ymm13, %ymm13
  282. vpxor 384(%rsi), %ymm14, %ymm14
  283. vpxor 448(%rsi), %ymm15, %ymm15
  284. vmovdqu %ymm8, 0(%rdx)
  285. vmovdqu %ymm9, 64(%rdx)
  286. vmovdqu %ymm10, 128(%rdx)
  287. vmovdqu %ymm11, 192(%rdx)
  288. vmovdqu %ymm12, 256(%rdx)
  289. vmovdqu %ymm13, 320(%rdx)
  290. vmovdqu %ymm14, 384(%rdx)
  291. vmovdqu %ymm15, 448(%rdx)
  292. vmovdqa 192(%rsp), %ymm0
  293. vmovdqa 224(%rsp), %ymm1
  294. vmovdqa 256(%rsp), %ymm2
  295. vmovdqa 288(%rsp), %ymm3
  296. vmovdqa 320(%rsp), %ymm4
  297. vmovdqa 352(%rsp), %ymm5
  298. vmovdqa 384(%rsp), %ymm6
  299. vmovdqa 416(%rsp), %ymm7
  300. vpbroadcastd 32(%rsp), %ymm8
  301. vpbroadcastd 4+32(%rsp), %ymm9
  302. vpbroadcastd 8+32(%rsp), %ymm10
  303. vpbroadcastd 12+32(%rsp), %ymm11
  304. vmovdqa 128(%rsp), %ymm12
  305. vmovdqa 160(%rsp), %ymm13
  306. vpbroadcastd 8+48(%rsp), %ymm14
  307. vpbroadcastd 12+48(%rsp), %ymm15
  308. vpaddd %ymm8, %ymm0, %ymm0
  309. vpaddd %ymm9, %ymm1, %ymm1
  310. vpaddd %ymm10, %ymm2, %ymm2
  311. vpaddd %ymm11, %ymm3, %ymm3
  312. vpaddd %ymm12, %ymm4, %ymm4
  313. vpaddd %ymm13, %ymm5, %ymm5
  314. vpaddd %ymm14, %ymm6, %ymm6
  315. vpaddd %ymm15, %ymm7, %ymm7
  316. vpunpckldq %ymm1, %ymm0, %ymm8
  317. vpunpckldq %ymm3, %ymm2, %ymm9
  318. vpunpckhdq %ymm1, %ymm0, %ymm12
  319. vpunpckhdq %ymm3, %ymm2, %ymm13
  320. vpunpckldq %ymm5, %ymm4, %ymm10
  321. vpunpckldq %ymm7, %ymm6, %ymm11
  322. vpunpckhdq %ymm5, %ymm4, %ymm14
  323. vpunpckhdq %ymm7, %ymm6, %ymm15
  324. vpunpcklqdq %ymm9, %ymm8, %ymm0
  325. vpunpcklqdq %ymm11, %ymm10, %ymm1
  326. vpunpckhqdq %ymm9, %ymm8, %ymm2
  327. vpunpckhqdq %ymm11, %ymm10, %ymm3
  328. vpunpcklqdq %ymm13, %ymm12, %ymm4
  329. vpunpcklqdq %ymm15, %ymm14, %ymm5
  330. vpunpckhqdq %ymm13, %ymm12, %ymm6
  331. vpunpckhqdq %ymm15, %ymm14, %ymm7
  332. vperm2i128 $0x20, %ymm1, %ymm0, %ymm8
  333. vperm2i128 $0x20, %ymm3, %ymm2, %ymm9
  334. vperm2i128 $0x31, %ymm1, %ymm0, %ymm12
  335. vperm2i128 $0x31, %ymm3, %ymm2, %ymm13
  336. vperm2i128 $0x20, %ymm5, %ymm4, %ymm10
  337. vperm2i128 $0x20, %ymm7, %ymm6, %ymm11
  338. vperm2i128 $0x31, %ymm5, %ymm4, %ymm14
  339. vperm2i128 $0x31, %ymm7, %ymm6, %ymm15
  340. vpxor 32(%rsi), %ymm8, %ymm8
  341. vpxor 96(%rsi), %ymm9, %ymm9
  342. vpxor 160(%rsi), %ymm10, %ymm10
  343. vpxor 224(%rsi), %ymm11, %ymm11
  344. vpxor 288(%rsi), %ymm12, %ymm12
  345. vpxor 352(%rsi), %ymm13, %ymm13
  346. vpxor 416(%rsi), %ymm14, %ymm14
  347. vpxor 480(%rsi), %ymm15, %ymm15
  348. vmovdqu %ymm8, 32(%rdx)
  349. vmovdqu %ymm9, 96(%rdx)
  350. vmovdqu %ymm10, 160(%rdx)
  351. vmovdqu %ymm11, 224(%rdx)
  352. vmovdqu %ymm12, 288(%rdx)
  353. vmovdqu %ymm13, 352(%rdx)
  354. vmovdqu %ymm14, 416(%rdx)
  355. vmovdqu %ymm15, 480(%rdx)
  356. addq $512, %rsi
  357. jmp chacha_blocks_avx2_mainloop1_cont
  358. chacha_blocks_avx2_noinput1:
  359. vmovdqu %ymm8, 0(%rdx)
  360. vmovdqu %ymm9, 64(%rdx)
  361. vmovdqu %ymm10, 128(%rdx)
  362. vmovdqu %ymm11, 192(%rdx)
  363. vmovdqu %ymm12, 256(%rdx)
  364. vmovdqu %ymm13, 320(%rdx)
  365. vmovdqu %ymm14, 384(%rdx)
  366. vmovdqu %ymm15, 448(%rdx)
  367. vmovdqa 192(%rsp), %ymm0
  368. vmovdqa 224(%rsp), %ymm1
  369. vmovdqa 256(%rsp), %ymm2
  370. vmovdqa 288(%rsp), %ymm3
  371. vmovdqa 320(%rsp), %ymm4
  372. vmovdqa 352(%rsp), %ymm5
  373. vmovdqa 384(%rsp), %ymm6
  374. vmovdqa 416(%rsp), %ymm7
  375. vpbroadcastd 32(%rsp), %ymm8
  376. vpbroadcastd 4+32(%rsp), %ymm9
  377. vpbroadcastd 8+32(%rsp), %ymm10
  378. vpbroadcastd 12+32(%rsp), %ymm11
  379. vmovdqa 128(%rsp), %ymm12
  380. vmovdqa 160(%rsp), %ymm13
  381. vpbroadcastd 8+48(%rsp), %ymm14
  382. vpbroadcastd 12+48(%rsp), %ymm15
  383. vpaddd %ymm8, %ymm0, %ymm0
  384. vpaddd %ymm9, %ymm1, %ymm1
  385. vpaddd %ymm10, %ymm2, %ymm2
  386. vpaddd %ymm11, %ymm3, %ymm3
  387. vpaddd %ymm12, %ymm4, %ymm4
  388. vpaddd %ymm13, %ymm5, %ymm5
  389. vpaddd %ymm14, %ymm6, %ymm6
  390. vpaddd %ymm15, %ymm7, %ymm7
  391. vpunpckldq %ymm1, %ymm0, %ymm8
  392. vpunpckldq %ymm3, %ymm2, %ymm9
  393. vpunpckhdq %ymm1, %ymm0, %ymm12
  394. vpunpckhdq %ymm3, %ymm2, %ymm13
  395. vpunpckldq %ymm5, %ymm4, %ymm10
  396. vpunpckldq %ymm7, %ymm6, %ymm11
  397. vpunpckhdq %ymm5, %ymm4, %ymm14
  398. vpunpckhdq %ymm7, %ymm6, %ymm15
  399. vpunpcklqdq %ymm9, %ymm8, %ymm0
  400. vpunpcklqdq %ymm11, %ymm10, %ymm1
  401. vpunpckhqdq %ymm9, %ymm8, %ymm2
  402. vpunpckhqdq %ymm11, %ymm10, %ymm3
  403. vpunpcklqdq %ymm13, %ymm12, %ymm4
  404. vpunpcklqdq %ymm15, %ymm14, %ymm5
  405. vpunpckhqdq %ymm13, %ymm12, %ymm6
  406. vpunpckhqdq %ymm15, %ymm14, %ymm7
  407. vperm2i128 $0x20, %ymm1, %ymm0, %ymm8
  408. vperm2i128 $0x20, %ymm3, %ymm2, %ymm9
  409. vperm2i128 $0x31, %ymm1, %ymm0, %ymm12
  410. vperm2i128 $0x31, %ymm3, %ymm2, %ymm13
  411. vperm2i128 $0x20, %ymm5, %ymm4, %ymm10
  412. vperm2i128 $0x20, %ymm7, %ymm6, %ymm11
  413. vperm2i128 $0x31, %ymm5, %ymm4, %ymm14
  414. vperm2i128 $0x31, %ymm7, %ymm6, %ymm15
  415. vmovdqu %ymm8, 32(%rdx)
  416. vmovdqu %ymm9, 96(%rdx)
  417. vmovdqu %ymm10, 160(%rdx)
  418. vmovdqu %ymm11, 224(%rdx)
  419. vmovdqu %ymm12, 288(%rdx)
  420. vmovdqu %ymm13, 352(%rdx)
  421. vmovdqu %ymm14, 416(%rdx)
  422. vmovdqu %ymm15, 480(%rdx)
  423. chacha_blocks_avx2_mainloop1_cont:
  424. addq $512, %rdx
  425. subq $512, %rcx
  426. cmp $512, %rcx
  427. jae chacha_blocks_avx2_atleast512
  428. cmp $256, %rcx
  429. jb chacha_blocks_avx2_below256_fixup
  430. chacha_blocks_avx2_atleast256:
  431. movq 48(%rsp), %rax
  432. leaq 1(%rax), %r8
  433. leaq 2(%rax), %r9
  434. leaq 3(%rax), %r10
  435. leaq 4(%rax), %rbx
  436. movl %eax, 128(%rsp)
  437. movl %r8d, 4+128(%rsp)
  438. movl %r9d, 8+128(%rsp)
  439. movl %r10d, 12+128(%rsp)
  440. shrq $32, %rax
  441. shrq $32, %r8
  442. shrq $32, %r9
  443. shrq $32, %r10
  444. movl %eax, 160(%rsp)
  445. movl %r8d, 4+160(%rsp)
  446. movl %r9d, 8+160(%rsp)
  447. movl %r10d, 12+160(%rsp)
  448. movq %rbx, 48(%rsp)
  449. movq 64(%rsp), %rax
  450. vpbroadcastd 0(%rsp), %xmm0
  451. vpbroadcastd 4+0(%rsp), %xmm1
  452. vpbroadcastd 8+0(%rsp), %xmm2
  453. vpbroadcastd 12+0(%rsp), %xmm3
  454. vpbroadcastd 16(%rsp), %xmm4
  455. vpbroadcastd 4+16(%rsp), %xmm5
  456. vpbroadcastd 8+16(%rsp), %xmm6
  457. vpbroadcastd 12+16(%rsp), %xmm7
  458. vpbroadcastd 32(%rsp), %xmm8
  459. vpbroadcastd 4+32(%rsp), %xmm9
  460. vpbroadcastd 8+32(%rsp), %xmm10
  461. vpbroadcastd 12+32(%rsp), %xmm11
  462. vmovdqa 128(%rsp), %xmm12
  463. vmovdqa 160(%rsp), %xmm13
  464. vpbroadcastd 8+48(%rsp), %xmm14
  465. vpbroadcastd 12+48(%rsp), %xmm15
  466. chacha_blocks_avx2_mainloop2:
  467. vpaddd %xmm0, %xmm4, %xmm0
  468. vpaddd %xmm1, %xmm5, %xmm1
  469. vpxor %xmm12, %xmm0, %xmm12
  470. vpxor %xmm13, %xmm1, %xmm13
  471. vpaddd %xmm2, %xmm6, %xmm2
  472. vpaddd %xmm3, %xmm7, %xmm3
  473. vpxor %xmm14, %xmm2, %xmm14
  474. vpxor %xmm15, %xmm3, %xmm15
  475. vpshufb 448(%rsp), %xmm12, %xmm12
  476. vpshufb 448(%rsp), %xmm13, %xmm13
  477. vpaddd %xmm8, %xmm12, %xmm8
  478. vpaddd %xmm9, %xmm13, %xmm9
  479. vpshufb 448(%rsp), %xmm14, %xmm14
  480. vpshufb 448(%rsp), %xmm15, %xmm15
  481. vpaddd %xmm10, %xmm14, %xmm10
  482. vpaddd %xmm11, %xmm15, %xmm11
  483. vmovdqa %xmm12, 96(%rsp)
  484. vpxor %xmm4, %xmm8, %xmm4
  485. vpxor %xmm5, %xmm9, %xmm5
  486. vpslld $ 12, %xmm4, %xmm12
  487. vpsrld $20, %xmm4, %xmm4
  488. vpxor %xmm4, %xmm12, %xmm4
  489. vpslld $ 12, %xmm5, %xmm12
  490. vpsrld $20, %xmm5, %xmm5
  491. vpxor %xmm5, %xmm12, %xmm5
  492. vpxor %xmm6, %xmm10, %xmm6
  493. vpxor %xmm7, %xmm11, %xmm7
  494. vpslld $ 12, %xmm6, %xmm12
  495. vpsrld $20, %xmm6, %xmm6
  496. vpxor %xmm6, %xmm12, %xmm6
  497. vpslld $ 12, %xmm7, %xmm12
  498. vpsrld $20, %xmm7, %xmm7
  499. vpxor %xmm7, %xmm12, %xmm7
  500. vpaddd %xmm0, %xmm4, %xmm0
  501. vpaddd %xmm1, %xmm5, %xmm1
  502. vpxor 96(%rsp), %xmm0, %xmm12
  503. vpxor %xmm13, %xmm1, %xmm13
  504. vpaddd %xmm2, %xmm6, %xmm2
  505. vpaddd %xmm3, %xmm7, %xmm3
  506. vpxor %xmm14, %xmm2, %xmm14
  507. vpxor %xmm15, %xmm3, %xmm15
  508. vpshufb 480(%rsp), %xmm12, %xmm12
  509. vpshufb 480(%rsp), %xmm13, %xmm13
  510. vpaddd %xmm8, %xmm12, %xmm8
  511. vpaddd %xmm9, %xmm13, %xmm9
  512. vpshufb 480(%rsp), %xmm14, %xmm14
  513. vpshufb 480(%rsp), %xmm15, %xmm15
  514. vpaddd %xmm10, %xmm14, %xmm10
  515. vpaddd %xmm11, %xmm15, %xmm11
  516. vmovdqa %xmm12, 96(%rsp)
  517. vpxor %xmm4, %xmm8, %xmm4
  518. vpxor %xmm5, %xmm9, %xmm5
  519. vpslld $ 7, %xmm4, %xmm12
  520. vpsrld $25, %xmm4, %xmm4
  521. vpxor %xmm4, %xmm12, %xmm4
  522. vpslld $ 7, %xmm5, %xmm12
  523. vpsrld $25, %xmm5, %xmm5
  524. vpxor %xmm5, %xmm12, %xmm5
  525. vpxor %xmm6, %xmm10, %xmm6
  526. vpxor %xmm7, %xmm11, %xmm7
  527. vpslld $ 7, %xmm6, %xmm12
  528. vpsrld $25, %xmm6, %xmm6
  529. vpxor %xmm6, %xmm12, %xmm6
  530. vpslld $ 7, %xmm7, %xmm12
  531. vpsrld $25, %xmm7, %xmm7
  532. vpxor %xmm7, %xmm12, %xmm7
  533. vpaddd %xmm0, %xmm5, %xmm0
  534. vpaddd %xmm1, %xmm6, %xmm1
  535. vpxor %xmm15, %xmm0, %xmm15
  536. vpxor 96(%rsp), %xmm1, %xmm12
  537. vpaddd %xmm2, %xmm7, %xmm2
  538. vpaddd %xmm3, %xmm4, %xmm3
  539. vpxor %xmm13, %xmm2, %xmm13
  540. vpxor %xmm14, %xmm3, %xmm14
  541. vpshufb 448(%rsp), %xmm15, %xmm15
  542. vpshufb 448(%rsp), %xmm12, %xmm12
  543. vpaddd %xmm10, %xmm15, %xmm10
  544. vpaddd %xmm11, %xmm12, %xmm11
  545. vpshufb 448(%rsp), %xmm13, %xmm13
  546. vpshufb 448(%rsp), %xmm14, %xmm14
  547. vpaddd %xmm8, %xmm13, %xmm8
  548. vpaddd %xmm9, %xmm14, %xmm9
  549. vmovdqa %xmm15, 96(%rsp)
  550. vpxor %xmm5, %xmm10, %xmm5
  551. vpxor %xmm6, %xmm11, %xmm6
  552. vpslld $ 12, %xmm5, %xmm15
  553. vpsrld $20, %xmm5, %xmm5
  554. vpxor %xmm5, %xmm15, %xmm5
  555. vpslld $ 12, %xmm6, %xmm15
  556. vpsrld $20, %xmm6, %xmm6
  557. vpxor %xmm6, %xmm15, %xmm6
  558. vpxor %xmm7, %xmm8, %xmm7
  559. vpxor %xmm4, %xmm9, %xmm4
  560. vpslld $ 12, %xmm7, %xmm15
  561. vpsrld $20, %xmm7, %xmm7
  562. vpxor %xmm7, %xmm15, %xmm7
  563. vpslld $ 12, %xmm4, %xmm15
  564. vpsrld $20, %xmm4, %xmm4
  565. vpxor %xmm4, %xmm15, %xmm4
  566. vpaddd %xmm0, %xmm5, %xmm0
  567. vpaddd %xmm1, %xmm6, %xmm1
  568. vpxor 96(%rsp), %xmm0, %xmm15
  569. vpxor %xmm12, %xmm1, %xmm12
  570. vpaddd %xmm2, %xmm7, %xmm2
  571. vpaddd %xmm3, %xmm4, %xmm3
  572. vpxor %xmm13, %xmm2, %xmm13
  573. vpxor %xmm14, %xmm3, %xmm14
  574. vpshufb 480(%rsp), %xmm15, %xmm15
  575. vpshufb 480(%rsp), %xmm12, %xmm12
  576. vpaddd %xmm10, %xmm15, %xmm10
  577. vpaddd %xmm11, %xmm12, %xmm11
  578. vpshufb 480(%rsp), %xmm13, %xmm13
  579. vpshufb 480(%rsp), %xmm14, %xmm14
  580. vpaddd %xmm8, %xmm13, %xmm8
  581. vpaddd %xmm9, %xmm14, %xmm9
  582. vmovdqa %xmm15, 96(%rsp)
  583. vpxor %xmm5, %xmm10, %xmm5
  584. vpxor %xmm6, %xmm11, %xmm6
  585. vpslld $ 7, %xmm5, %xmm15
  586. vpsrld $25, %xmm5, %xmm5
  587. vpxor %xmm5, %xmm15, %xmm5
  588. vpslld $ 7, %xmm6, %xmm15
  589. vpsrld $25, %xmm6, %xmm6
  590. vpxor %xmm6, %xmm15, %xmm6
  591. vpxor %xmm7, %xmm8, %xmm7
  592. vpxor %xmm4, %xmm9, %xmm4
  593. vpslld $ 7, %xmm7, %xmm15
  594. vpsrld $25, %xmm7, %xmm7
  595. vpxor %xmm7, %xmm15, %xmm7
  596. vpslld $ 7, %xmm4, %xmm15
  597. vpsrld $25, %xmm4, %xmm4
  598. vpxor %xmm4, %xmm15, %xmm4
  599. vmovdqa 96(%rsp), %xmm15
  600. subq $2, %rax
  601. jnz chacha_blocks_avx2_mainloop2
  602. vmovdqa %xmm8, 192(%rsp)
  603. vmovdqa %xmm9, 208(%rsp)
  604. vmovdqa %xmm10, 224(%rsp)
  605. vmovdqa %xmm11, 240(%rsp)
  606. vmovdqa %xmm12, 256(%rsp)
  607. vmovdqa %xmm13, 272(%rsp)
  608. vmovdqa %xmm14, 288(%rsp)
  609. vmovdqa %xmm15, 304(%rsp)
  610. vpbroadcastd 0(%rsp), %xmm8
  611. vpbroadcastd 4+0(%rsp), %xmm9
  612. vpbroadcastd 8+0(%rsp), %xmm10
  613. vpbroadcastd 12+0(%rsp), %xmm11
  614. vpbroadcastd 16(%rsp), %xmm12
  615. vpbroadcastd 4+16(%rsp), %xmm13
  616. vpbroadcastd 8+16(%rsp), %xmm14
  617. vpbroadcastd 12+16(%rsp), %xmm15
  618. vpaddd %xmm8, %xmm0, %xmm0
  619. vpaddd %xmm9, %xmm1, %xmm1
  620. vpaddd %xmm10, %xmm2, %xmm2
  621. vpaddd %xmm11, %xmm3, %xmm3
  622. vpaddd %xmm12, %xmm4, %xmm4
  623. vpaddd %xmm13, %xmm5, %xmm5
  624. vpaddd %xmm14, %xmm6, %xmm6
  625. vpaddd %xmm15, %xmm7, %xmm7
  626. vpunpckldq %xmm1, %xmm0, %xmm8
  627. vpunpckldq %xmm3, %xmm2, %xmm9
  628. vpunpckhdq %xmm1, %xmm0, %xmm12
  629. vpunpckhdq %xmm3, %xmm2, %xmm13
  630. vpunpckldq %xmm5, %xmm4, %xmm10
  631. vpunpckldq %xmm7, %xmm6, %xmm11
  632. vpunpckhdq %xmm5, %xmm4, %xmm14
  633. vpunpckhdq %xmm7, %xmm6, %xmm15
  634. vpunpcklqdq %xmm9, %xmm8, %xmm0
  635. vpunpcklqdq %xmm11, %xmm10, %xmm1
  636. vpunpckhqdq %xmm9, %xmm8, %xmm2
  637. vpunpckhqdq %xmm11, %xmm10, %xmm3
  638. vpunpcklqdq %xmm13, %xmm12, %xmm4
  639. vpunpcklqdq %xmm15, %xmm14, %xmm5
  640. vpunpckhqdq %xmm13, %xmm12, %xmm6
  641. vpunpckhqdq %xmm15, %xmm14, %xmm7
  642. andq %rsi, %rsi
  643. jz chacha_blocks_avx2_noinput2
  644. vpxor 0(%rsi), %xmm0, %xmm0
  645. vpxor 16(%rsi), %xmm1, %xmm1
  646. vpxor 64(%rsi), %xmm2, %xmm2
  647. vpxor 80(%rsi), %xmm3, %xmm3
  648. vpxor 128(%rsi), %xmm4, %xmm4
  649. vpxor 144(%rsi), %xmm5, %xmm5
  650. vpxor 192(%rsi), %xmm6, %xmm6
  651. vpxor 208(%rsi), %xmm7, %xmm7
  652. vmovdqu %xmm0, 0(%rdx)
  653. vmovdqu %xmm1, 16(%rdx)
  654. vmovdqu %xmm2, 64(%rdx)
  655. vmovdqu %xmm3, 80(%rdx)
  656. vmovdqu %xmm4, 128(%rdx)
  657. vmovdqu %xmm5, 144(%rdx)
  658. vmovdqu %xmm6, 192(%rdx)
  659. vmovdqu %xmm7, 208(%rdx)
  660. vmovdqa 192(%rsp), %xmm0
  661. vmovdqa 208(%rsp), %xmm1
  662. vmovdqa 224(%rsp), %xmm2
  663. vmovdqa 240(%rsp), %xmm3
  664. vmovdqa 256(%rsp), %xmm4
  665. vmovdqa 272(%rsp), %xmm5
  666. vmovdqa 288(%rsp), %xmm6
  667. vmovdqa 304(%rsp), %xmm7
  668. vpbroadcastd 32(%rsp), %xmm8
  669. vpbroadcastd 4+32(%rsp), %xmm9
  670. vpbroadcastd 8+32(%rsp), %xmm10
  671. vpbroadcastd 12+32(%rsp), %xmm11
  672. vmovdqa 128(%rsp), %xmm12
  673. vmovdqa 160(%rsp), %xmm13
  674. vpbroadcastd 8+48(%rsp), %xmm14
  675. vpbroadcastd 12+48(%rsp), %xmm15
  676. vpaddd %xmm8, %xmm0, %xmm0
  677. vpaddd %xmm9, %xmm1, %xmm1
  678. vpaddd %xmm10, %xmm2, %xmm2
  679. vpaddd %xmm11, %xmm3, %xmm3
  680. vpaddd %xmm12, %xmm4, %xmm4
  681. vpaddd %xmm13, %xmm5, %xmm5
  682. vpaddd %xmm14, %xmm6, %xmm6
  683. vpaddd %xmm15, %xmm7, %xmm7
  684. vpunpckldq %xmm1, %xmm0, %xmm8
  685. vpunpckldq %xmm3, %xmm2, %xmm9
  686. vpunpckhdq %xmm1, %xmm0, %xmm12
  687. vpunpckhdq %xmm3, %xmm2, %xmm13
  688. vpunpckldq %xmm5, %xmm4, %xmm10
  689. vpunpckldq %xmm7, %xmm6, %xmm11
  690. vpunpckhdq %xmm5, %xmm4, %xmm14
  691. vpunpckhdq %xmm7, %xmm6, %xmm15
  692. vpunpcklqdq %xmm9, %xmm8, %xmm0
  693. vpunpcklqdq %xmm11, %xmm10, %xmm1
  694. vpunpckhqdq %xmm9, %xmm8, %xmm2
  695. vpunpckhqdq %xmm11, %xmm10, %xmm3
  696. vpunpcklqdq %xmm13, %xmm12, %xmm4
  697. vpunpcklqdq %xmm15, %xmm14, %xmm5
  698. vpunpckhqdq %xmm13, %xmm12, %xmm6
  699. vpunpckhqdq %xmm15, %xmm14, %xmm7
  700. vpxor 32(%rsi), %xmm0, %xmm0
  701. vpxor 48(%rsi), %xmm1, %xmm1
  702. vpxor 96(%rsi), %xmm2, %xmm2
  703. vpxor 112(%rsi), %xmm3, %xmm3
  704. vpxor 160(%rsi), %xmm4, %xmm4
  705. vpxor 176(%rsi), %xmm5, %xmm5
  706. vpxor 224(%rsi), %xmm6, %xmm6
  707. vpxor 240(%rsi), %xmm7, %xmm7
  708. vmovdqu %xmm0, 32(%rdx)
  709. vmovdqu %xmm1, 48(%rdx)
  710. vmovdqu %xmm2, 96(%rdx)
  711. vmovdqu %xmm3, 112(%rdx)
  712. vmovdqu %xmm4, 160(%rdx)
  713. vmovdqu %xmm5, 176(%rdx)
  714. vmovdqu %xmm6, 224(%rdx)
  715. vmovdqu %xmm7, 240(%rdx)
  716. addq $256, %rsi
  717. jmp chacha_blocks_avx2_mainloop2_cont
  718. chacha_blocks_avx2_noinput2:
  719. vmovdqu %xmm0, 0(%rdx)
  720. vmovdqu %xmm1, 16(%rdx)
  721. vmovdqu %xmm2, 64(%rdx)
  722. vmovdqu %xmm3, 80(%rdx)
  723. vmovdqu %xmm4, 128(%rdx)
  724. vmovdqu %xmm5, 144(%rdx)
  725. vmovdqu %xmm6, 192(%rdx)
  726. vmovdqu %xmm7, 208(%rdx)
  727. vmovdqa 192(%rsp), %xmm0
  728. vmovdqa 208(%rsp), %xmm1
  729. vmovdqa 224(%rsp), %xmm2
  730. vmovdqa 240(%rsp), %xmm3
  731. vmovdqa 256(%rsp), %xmm4
  732. vmovdqa 272(%rsp), %xmm5
  733. vmovdqa 288(%rsp), %xmm6
  734. vmovdqa 304(%rsp), %xmm7
  735. vpbroadcastd 32(%rsp), %xmm8
  736. vpbroadcastd 4+32(%rsp), %xmm9
  737. vpbroadcastd 8+32(%rsp), %xmm10
  738. vpbroadcastd 12+32(%rsp), %xmm11
  739. vmovdqa 128(%rsp), %xmm12
  740. vmovdqa 160(%rsp), %xmm13
  741. vpbroadcastd 8+48(%rsp), %xmm14
  742. vpbroadcastd 12+48(%rsp), %xmm15
  743. vpaddd %xmm8, %xmm0, %xmm0
  744. vpaddd %xmm9, %xmm1, %xmm1
  745. vpaddd %xmm10, %xmm2, %xmm2
  746. vpaddd %xmm11, %xmm3, %xmm3
  747. vpaddd %xmm12, %xmm4, %xmm4
  748. vpaddd %xmm13, %xmm5, %xmm5
  749. vpaddd %xmm14, %xmm6, %xmm6
  750. vpaddd %xmm15, %xmm7, %xmm7
  751. vpunpckldq %xmm1, %xmm0, %xmm8
  752. vpunpckldq %xmm3, %xmm2, %xmm9
  753. vpunpckhdq %xmm1, %xmm0, %xmm12
  754. vpunpckhdq %xmm3, %xmm2, %xmm13
  755. vpunpckldq %xmm5, %xmm4, %xmm10
  756. vpunpckldq %xmm7, %xmm6, %xmm11
  757. vpunpckhdq %xmm5, %xmm4, %xmm14
  758. vpunpckhdq %xmm7, %xmm6, %xmm15
  759. vpunpcklqdq %xmm9, %xmm8, %xmm0
  760. vpunpcklqdq %xmm11, %xmm10, %xmm1
  761. vpunpckhqdq %xmm9, %xmm8, %xmm2
  762. vpunpckhqdq %xmm11, %xmm10, %xmm3
  763. vpunpcklqdq %xmm13, %xmm12, %xmm4
  764. vpunpcklqdq %xmm15, %xmm14, %xmm5
  765. vpunpckhqdq %xmm13, %xmm12, %xmm6
  766. vpunpckhqdq %xmm15, %xmm14, %xmm7
  767. vmovdqu %xmm0, 32(%rdx)
  768. vmovdqu %xmm1, 48(%rdx)
  769. vmovdqu %xmm2, 96(%rdx)
  770. vmovdqu %xmm3, 112(%rdx)
  771. vmovdqu %xmm4, 160(%rdx)
  772. vmovdqu %xmm5, 176(%rdx)
  773. vmovdqu %xmm6, 224(%rdx)
  774. vmovdqu %xmm7, 240(%rdx)
  775. chacha_blocks_avx2_mainloop2_cont:
  776. addq $256, %rdx
  777. subq $256, %rcx
  778. cmp $256, %rcx
  779. jae chacha_blocks_avx2_atleast256
  780. chacha_blocks_avx2_below256_fixup:
  781. vmovdqa 448(%rsp), %xmm6
  782. vmovdqa 480(%rsp), %xmm7
  783. vmovdqa 0(%rsp), %xmm8
  784. vmovdqa 16(%rsp), %xmm9
  785. vmovdqa 32(%rsp), %xmm10
  786. vmovdqa 48(%rsp), %xmm11
  787. movq $1, %r9
  788. chacha_blocks_avx2_below256:
  789. vmovq %r9, %xmm5
  790. andq %rcx, %rcx
  791. jz chacha_blocks_avx2_done
  792. cmpq $64, %rcx
  793. jae chacha_blocks_avx2_above63
  794. movq %rdx, %r9
  795. andq %rsi, %rsi
  796. jz chacha_blocks_avx2_noinput3
  797. movq %rcx, %r10
  798. movq %rsp, %rdx
  799. addq %r10, %rsi
  800. addq %r10, %rdx
  801. negq %r10
  802. chacha_blocks_avx2_copyinput:
  803. movb (%rsi, %r10), %al
  804. movb %al, (%rdx, %r10)
  805. incq %r10
  806. jnz chacha_blocks_avx2_copyinput
  807. movq %rsp, %rsi
  808. chacha_blocks_avx2_noinput3:
  809. movq %rsp, %rdx
  810. chacha_blocks_avx2_above63:
  811. vmovdqa %xmm8, %xmm0
  812. vmovdqa %xmm9, %xmm1
  813. vmovdqa %xmm10, %xmm2
  814. vmovdqa %xmm11, %xmm3
  815. movq 64(%rsp), %rax
  816. chacha_blocks_avx2_mainloop3:
  817. vpaddd %xmm0, %xmm1, %xmm0
  818. vpxor %xmm3, %xmm0, %xmm3
  819. vpshufb %xmm6, %xmm3, %xmm3
  820. vpaddd %xmm2, %xmm3, %xmm2
  821. vpxor %xmm1, %xmm2, %xmm1
  822. vpslld $12, %xmm1, %xmm4
  823. vpsrld $20, %xmm1, %xmm1
  824. vpxor %xmm1, %xmm4, %xmm1
  825. vpaddd %xmm0, %xmm1, %xmm0
  826. vpxor %xmm3, %xmm0, %xmm3
  827. vpshufb %xmm7, %xmm3, %xmm3
  828. vpshufd $0x93, %xmm0, %xmm0
  829. vpaddd %xmm2, %xmm3, %xmm2
  830. vpshufd $0x4e, %xmm3, %xmm3
  831. vpxor %xmm1, %xmm2, %xmm1
  832. vpshufd $0x39, %xmm2, %xmm2
  833. vpslld $7, %xmm1, %xmm4
  834. vpsrld $25, %xmm1, %xmm1
  835. vpxor %xmm1, %xmm4, %xmm1
  836. vpaddd %xmm0, %xmm1, %xmm0
  837. vpxor %xmm3, %xmm0, %xmm3
  838. vpshufb %xmm6, %xmm3, %xmm3
  839. vpaddd %xmm2, %xmm3, %xmm2
  840. vpxor %xmm1, %xmm2, %xmm1
  841. vpslld $12, %xmm1, %xmm4
  842. vpsrld $20, %xmm1, %xmm1
  843. vpxor %xmm1, %xmm4, %xmm1
  844. vpaddd %xmm0, %xmm1, %xmm0
  845. vpxor %xmm3, %xmm0, %xmm3
  846. vpshufb %xmm7, %xmm3, %xmm3
  847. vpshufd $0x39, %xmm0, %xmm0
  848. vpaddd %xmm2, %xmm3, %xmm2
  849. vpshufd $0x4e, %xmm3, %xmm3
  850. vpxor %xmm1, %xmm2, %xmm1
  851. vpshufd $0x93, %xmm2, %xmm2
  852. vpslld $7, %xmm1, %xmm4
  853. vpsrld $25, %xmm1, %xmm1
  854. vpxor %xmm1, %xmm4, %xmm1
  855. subq $2, %rax
  856. jnz chacha_blocks_avx2_mainloop3
  857. vpaddd %xmm0, %xmm8, %xmm0
  858. vpaddd %xmm1, %xmm9, %xmm1
  859. vpaddd %xmm2, %xmm10, %xmm2
  860. vpaddd %xmm3, %xmm11, %xmm3
  861. andq %rsi, %rsi
  862. jz chacha_blocks_avx2_noinput4
  863. vpxor 0(%rsi), %xmm0, %xmm0
  864. vpxor 16(%rsi), %xmm1, %xmm1
  865. vpxor 32(%rsi), %xmm2, %xmm2
  866. vpxor 48(%rsi), %xmm3, %xmm3
  867. addq $64, %rsi
  868. chacha_blocks_avx2_noinput4:
  869. vmovdqu %xmm0, 0(%rdx)
  870. vmovdqu %xmm1, 16(%rdx)
  871. vmovdqu %xmm2, 32(%rdx)
  872. vmovdqu %xmm3, 48(%rdx)
  873. vpaddq %xmm11, %xmm5, %xmm11
  874. cmpq $64, %rcx
  875. jbe chacha_blocks_avx2_mainloop3_finishup
  876. addq $64, %rdx
  877. subq $64, %rcx
  878. jmp chacha_blocks_avx2_below256
  879. chacha_blocks_avx2_mainloop3_finishup:
  880. cmpq $64, %rcx
  881. je chacha_blocks_avx2_done
  882. addq %rcx, %r9
  883. addq %rcx, %rdx
  884. negq %rcx
  885. chacha_blocks_avx2_copyoutput:
  886. movb (%rdx, %rcx), %al
  887. movb %al, (%r9, %rcx)
  888. incq %rcx
  889. jnz chacha_blocks_avx2_copyoutput
  890. chacha_blocks_avx2_done:
  891. vmovdqu %xmm11, 32(%rdi)
  892. movq %rbp, %rsp
  893. popq %r14
  894. popq %r13
  895. popq %r12
  896. popq %rbp
  897. popq %rbx
  898. vzeroupper
  899. ret
  900. FN_END chacha_blocks_avx2
  901. GLOBAL_HIDDEN_FN hchacha_avx2
  902. hchacha_avx2_local:
  903. LOAD_VAR_PIC chacha_constants, %rax
  904. vmovdqa 0(%rax), %xmm0
  905. vmovdqa 16(%rax), %xmm6
  906. vmovdqa 32(%rax), %xmm5
  907. vmovdqu 0(%rdi), %xmm1
  908. vmovdqu 16(%rdi), %xmm2
  909. vmovdqu 0(%rsi), %xmm3
  910. hhacha_mainloop_avx2:
  911. vpaddd %xmm0, %xmm1, %xmm0
  912. vpxor %xmm3, %xmm0, %xmm3
  913. vpshufb %xmm6, %xmm3, %xmm3
  914. vpaddd %xmm2, %xmm3, %xmm2
  915. vpxor %xmm1, %xmm2, %xmm1
  916. vpslld $12, %xmm1, %xmm4
  917. vpsrld $20, %xmm1, %xmm1
  918. vpxor %xmm1, %xmm4, %xmm1
  919. vpaddd %xmm0, %xmm1, %xmm0
  920. vpxor %xmm3, %xmm0, %xmm3
  921. vpshufb %xmm5, %xmm3, %xmm3
  922. vpaddd %xmm2, %xmm3, %xmm2
  923. vpxor %xmm1, %xmm2, %xmm1
  924. vpslld $7, %xmm1, %xmm4
  925. vpsrld $25, %xmm1, %xmm1
  926. vpshufd $0x93, %xmm0, %xmm0
  927. vpxor %xmm1, %xmm4, %xmm1
  928. vpshufd $0x4e, %xmm3, %xmm3
  929. vpaddd %xmm0, %xmm1, %xmm0
  930. vpxor %xmm3, %xmm0, %xmm3
  931. vpshufb %xmm6, %xmm3, %xmm3
  932. vpshufd $0x39, %xmm2, %xmm2
  933. vpaddd %xmm2, %xmm3, %xmm2
  934. vpxor %xmm1, %xmm2, %xmm1
  935. vpslld $12, %xmm1, %xmm4
  936. vpsrld $20, %xmm1, %xmm1
  937. vpxor %xmm1, %xmm4, %xmm1
  938. vpaddd %xmm0, %xmm1, %xmm0
  939. vpxor %xmm3, %xmm0, %xmm3
  940. vpshufb %xmm5, %xmm3, %xmm3
  941. vpaddd %xmm2, %xmm3, %xmm2
  942. vpxor %xmm1, %xmm2, %xmm1
  943. vpshufd $0x39, %xmm0, %xmm0
  944. vpslld $7, %xmm1, %xmm4
  945. vpshufd $0x4e, %xmm3, %xmm3
  946. vpsrld $25, %xmm1, %xmm1
  947. vpshufd $0x93, %xmm2, %xmm2
  948. vpxor %xmm1, %xmm4, %xmm1
  949. subl $2, %ecx
  950. jne hhacha_mainloop_avx2
  951. vmovdqu %xmm0, (%rdx)
  952. vmovdqu %xmm3, 16(%rdx)
  953. ret
  954. FN_END hchacha_avx2
  955. GLOBAL_HIDDEN_FN_EXT chacha_avx2, 6, 16
  956. pushq %rbp
  957. movq %rsp, %rbp
  958. subq $64, %rsp
  959. andq $~63, %rsp
  960. vmovdqu 0(%rdi), %xmm0
  961. vmovdqu 16(%rdi), %xmm1
  962. vmovdqa %xmm0, 0(%rsp)
  963. vmovdqa %xmm1, 16(%rsp)
  964. xorq %rdi, %rdi
  965. movq %rdi, 32(%rsp)
  966. movq 0(%rsi), %rsi
  967. movq %rsi, 40(%rsp)
  968. movq %r9, 48(%rsp)
  969. movq %rsp, %rdi
  970. movq %rdx, %rsi
  971. movq %rcx, %rdx
  972. movq %r8, %rcx
  973. call chacha_blocks_avx2_local
  974. vpxor %xmm0, %xmm0, %xmm0
  975. vmovdqa %xmm0, 0(%rsp)
  976. vmovdqa %xmm0, 16(%rsp)
  977. vmovdqa %xmm0, 32(%rsp)
  978. movq %rbp, %rsp
  979. popq %rbp
  980. ret
  981. FN_END chacha_avx2
  982. GLOBAL_HIDDEN_FN_EXT xchacha_avx2, 6, 16
  983. pushq %rbp
  984. pushq %rbx
  985. movq %rsp, %rbp
  986. subq $64, %rsp
  987. andq $~63, %rsp
  988. movq %rsp, %rbx
  989. xorq %rax, %rax
  990. movq %rax, 32(%rbx)
  991. movq 16(%rsi), %rax
  992. movq %rax, 40(%rbx)
  993. movq %r9, 48(%rbx)
  994. pushq %rdx
  995. pushq %rcx
  996. pushq %r8
  997. movq %rbx, %rdx
  998. movq %r9, %rcx
  999. call hchacha_avx2_local
  1000. movq %rbx, %rdi
  1001. popq %rcx
  1002. popq %rdx
  1003. popq %rsi
  1004. call chacha_blocks_avx2_local
  1005. vpxor %xmm0, %xmm0, %xmm0
  1006. vmovdqa %xmm0, 0(%rbx)
  1007. vmovdqa %xmm0, 16(%rbx)
  1008. vmovdqa %xmm0, 32(%rbx)
  1009. movq %rbp, %rsp
  1010. popq %rbx
  1011. popq %rbp
  1012. ret
  1013. FN_END xchacha_avx2