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

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