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.

avx.S 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613
  1. #include "macro.S"
  2. SECTION_TEXT
  3. GLOBAL_HIDDEN_FN chacha_blocks_avx
  4. chacha_blocks_avx_local:
  5. pushq %rbx
  6. pushq %rbp
  7. movq %rsp, %rbp
  8. andq $~63, %rsp
  9. subq $512, %rsp
  10. LOAD_VAR_PIC chacha_constants, %rax
  11. vmovdqa 0(%rax), %xmm8
  12. vmovdqa 16(%rax), %xmm6
  13. vmovdqa 32(%rax), %xmm7
  14. vmovdqu 0(%rdi), %xmm9
  15. vmovdqu 16(%rdi), %xmm10
  16. vmovdqu 32(%rdi), %xmm11
  17. movq 48(%rdi), %rax
  18. movq $1, %r9
  19. vmovdqa %xmm8, 0(%rsp)
  20. vmovdqa %xmm9, 16(%rsp)
  21. vmovdqa %xmm10, 32(%rsp)
  22. vmovdqa %xmm11, 48(%rsp)
  23. vmovdqa %xmm6, 80(%rsp)
  24. vmovdqa %xmm7, 96(%rsp)
  25. movq %rax, 64(%rsp)
  26. cmpq $256, %rcx
  27. jb chacha_blocks_avx_below256
  28. vpshufd $0x00, %xmm8, %xmm0
  29. vpshufd $0x55, %xmm8, %xmm1
  30. vpshufd $0xaa, %xmm8, %xmm2
  31. vpshufd $0xff, %xmm8, %xmm3
  32. vmovdqa %xmm0, 128(%rsp)
  33. vmovdqa %xmm1, 144(%rsp)
  34. vmovdqa %xmm2, 160(%rsp)
  35. vmovdqa %xmm3, 176(%rsp)
  36. vpshufd $0x00, %xmm9, %xmm0
  37. vpshufd $0x55, %xmm9, %xmm1
  38. vpshufd $0xaa, %xmm9, %xmm2
  39. vpshufd $0xff, %xmm9, %xmm3
  40. vmovdqa %xmm0, 192(%rsp)
  41. vmovdqa %xmm1, 208(%rsp)
  42. vmovdqa %xmm2, 224(%rsp)
  43. vmovdqa %xmm3, 240(%rsp)
  44. vpshufd $0x00, %xmm10, %xmm0
  45. vpshufd $0x55, %xmm10, %xmm1
  46. vpshufd $0xaa, %xmm10, %xmm2
  47. vpshufd $0xff, %xmm10, %xmm3
  48. vmovdqa %xmm0, 256(%rsp)
  49. vmovdqa %xmm1, 272(%rsp)
  50. vmovdqa %xmm2, 288(%rsp)
  51. vmovdqa %xmm3, 304(%rsp)
  52. vpshufd $0xaa, %xmm11, %xmm0
  53. vpshufd $0xff, %xmm11, %xmm1
  54. vmovdqa %xmm0, 352(%rsp)
  55. vmovdqa %xmm1, 368(%rsp)
  56. jmp chacha_blocks_avx_atleast256
  57. .p2align 6,,63
  58. nop
  59. nop
  60. nop
  61. nop
  62. nop
  63. chacha_blocks_avx_atleast256:
  64. movq 48(%rsp), %rax
  65. leaq 1(%rax), %r8
  66. leaq 2(%rax), %r9
  67. leaq 3(%rax), %r10
  68. leaq 4(%rax), %rbx
  69. movl %eax, 320(%rsp)
  70. movl %r8d, 4+320(%rsp)
  71. movl %r9d, 8+320(%rsp)
  72. movl %r10d, 12+320(%rsp)
  73. shrq $32, %rax
  74. shrq $32, %r8
  75. shrq $32, %r9
  76. shrq $32, %r10
  77. movl %eax, 336(%rsp)
  78. movl %r8d, 4+336(%rsp)
  79. movl %r9d, 8+336(%rsp)
  80. movl %r10d, 12+336(%rsp)
  81. movq %rbx, 48(%rsp)
  82. movq 64(%rsp), %rax
  83. vmovdqa 128(%rsp), %xmm0
  84. vmovdqa 144(%rsp), %xmm1
  85. vmovdqa 160(%rsp), %xmm2
  86. vmovdqa 176(%rsp), %xmm3
  87. vmovdqa 192(%rsp), %xmm4
  88. vmovdqa 208(%rsp), %xmm5
  89. vmovdqa 224(%rsp), %xmm6
  90. vmovdqa 240(%rsp), %xmm7
  91. vmovdqa 256(%rsp), %xmm8
  92. vmovdqa 272(%rsp), %xmm9
  93. vmovdqa 288(%rsp), %xmm10
  94. vmovdqa 304(%rsp), %xmm11
  95. vmovdqa 320(%rsp), %xmm12
  96. vmovdqa 336(%rsp), %xmm13
  97. vmovdqa 352(%rsp), %xmm14
  98. vmovdqa 368(%rsp), %xmm15
  99. chacha_blocks_avx_mainloop1:
  100. vpaddd %xmm0, %xmm4, %xmm0
  101. vpaddd %xmm1, %xmm5, %xmm1
  102. vpxor %xmm12, %xmm0, %xmm12
  103. vpxor %xmm13, %xmm1, %xmm13
  104. vpaddd %xmm2, %xmm6, %xmm2
  105. vpaddd %xmm3, %xmm7, %xmm3
  106. vpxor %xmm14, %xmm2, %xmm14
  107. vpxor %xmm15, %xmm3, %xmm15
  108. vpshufb 80(%rsp), %xmm12, %xmm12
  109. vpshufb 80(%rsp), %xmm13, %xmm13
  110. vpaddd %xmm8, %xmm12, %xmm8
  111. vpaddd %xmm9, %xmm13, %xmm9
  112. vpshufb 80(%rsp), %xmm14, %xmm14
  113. vpshufb 80(%rsp), %xmm15, %xmm15
  114. vpaddd %xmm10, %xmm14, %xmm10
  115. vpaddd %xmm11, %xmm15, %xmm11
  116. vmovdqa %xmm12, 112(%rsp)
  117. vpxor %xmm4, %xmm8, %xmm4
  118. vpxor %xmm5, %xmm9, %xmm5
  119. vpslld $ 12, %xmm4, %xmm12
  120. vpsrld $20, %xmm4, %xmm4
  121. vpxor %xmm4, %xmm12, %xmm4
  122. vpslld $ 12, %xmm5, %xmm12
  123. vpsrld $20, %xmm5, %xmm5
  124. vpxor %xmm5, %xmm12, %xmm5
  125. vpxor %xmm6, %xmm10, %xmm6
  126. vpxor %xmm7, %xmm11, %xmm7
  127. vpslld $ 12, %xmm6, %xmm12
  128. vpsrld $20, %xmm6, %xmm6
  129. vpxor %xmm6, %xmm12, %xmm6
  130. vpslld $ 12, %xmm7, %xmm12
  131. vpsrld $20, %xmm7, %xmm7
  132. vpxor %xmm7, %xmm12, %xmm7
  133. vpaddd %xmm0, %xmm4, %xmm0
  134. vpaddd %xmm1, %xmm5, %xmm1
  135. vpxor 112(%rsp), %xmm0, %xmm12
  136. vpxor %xmm13, %xmm1, %xmm13
  137. vpaddd %xmm2, %xmm6, %xmm2
  138. vpaddd %xmm3, %xmm7, %xmm3
  139. vpxor %xmm14, %xmm2, %xmm14
  140. vpxor %xmm15, %xmm3, %xmm15
  141. vpshufb 96(%rsp), %xmm12, %xmm12
  142. vpshufb 96(%rsp), %xmm13, %xmm13
  143. vpaddd %xmm8, %xmm12, %xmm8
  144. vpaddd %xmm9, %xmm13, %xmm9
  145. vpshufb 96(%rsp), %xmm14, %xmm14
  146. vpshufb 96(%rsp), %xmm15, %xmm15
  147. vpaddd %xmm10, %xmm14, %xmm10
  148. vpaddd %xmm11, %xmm15, %xmm11
  149. vmovdqa %xmm12, 112(%rsp)
  150. vpxor %xmm4, %xmm8, %xmm4
  151. vpxor %xmm5, %xmm9, %xmm5
  152. vpslld $ 7, %xmm4, %xmm12
  153. vpsrld $25, %xmm4, %xmm4
  154. vpxor %xmm4, %xmm12, %xmm4
  155. vpslld $ 7, %xmm5, %xmm12
  156. vpsrld $25, %xmm5, %xmm5
  157. vpxor %xmm5, %xmm12, %xmm5
  158. vpxor %xmm6, %xmm10, %xmm6
  159. vpxor %xmm7, %xmm11, %xmm7
  160. vpslld $ 7, %xmm6, %xmm12
  161. vpsrld $25, %xmm6, %xmm6
  162. vpxor %xmm6, %xmm12, %xmm6
  163. vpslld $ 7, %xmm7, %xmm12
  164. vpsrld $25, %xmm7, %xmm7
  165. vpxor %xmm7, %xmm12, %xmm7
  166. vpaddd %xmm0, %xmm5, %xmm0
  167. vpaddd %xmm1, %xmm6, %xmm1
  168. vpxor %xmm15, %xmm0, %xmm15
  169. vpxor 112(%rsp), %xmm1, %xmm12
  170. vpaddd %xmm2, %xmm7, %xmm2
  171. vpaddd %xmm3, %xmm4, %xmm3
  172. vpxor %xmm13, %xmm2, %xmm13
  173. vpxor %xmm14, %xmm3, %xmm14
  174. vpshufb 80(%rsp), %xmm15, %xmm15
  175. vpshufb 80(%rsp), %xmm12, %xmm12
  176. vpaddd %xmm10, %xmm15, %xmm10
  177. vpaddd %xmm11, %xmm12, %xmm11
  178. vpshufb 80(%rsp), %xmm13, %xmm13
  179. vpshufb 80(%rsp), %xmm14, %xmm14
  180. vpaddd %xmm8, %xmm13, %xmm8
  181. vpaddd %xmm9, %xmm14, %xmm9
  182. vmovdqa %xmm15, 112(%rsp)
  183. vpxor %xmm5, %xmm10, %xmm5
  184. vpxor %xmm6, %xmm11, %xmm6
  185. vpslld $ 12, %xmm5, %xmm15
  186. vpsrld $20, %xmm5, %xmm5
  187. vpxor %xmm5, %xmm15, %xmm5
  188. vpslld $ 12, %xmm6, %xmm15
  189. vpsrld $20, %xmm6, %xmm6
  190. vpxor %xmm6, %xmm15, %xmm6
  191. vpxor %xmm7, %xmm8, %xmm7
  192. vpxor %xmm4, %xmm9, %xmm4
  193. vpslld $ 12, %xmm7, %xmm15
  194. vpsrld $20, %xmm7, %xmm7
  195. vpxor %xmm7, %xmm15, %xmm7
  196. vpslld $ 12, %xmm4, %xmm15
  197. vpsrld $20, %xmm4, %xmm4
  198. vpxor %xmm4, %xmm15, %xmm4
  199. vpaddd %xmm0, %xmm5, %xmm0
  200. vpaddd %xmm1, %xmm6, %xmm1
  201. vpxor 112(%rsp), %xmm0, %xmm15
  202. vpxor %xmm12, %xmm1, %xmm12
  203. vpaddd %xmm2, %xmm7, %xmm2
  204. vpaddd %xmm3, %xmm4, %xmm3
  205. vpxor %xmm13, %xmm2, %xmm13
  206. vpxor %xmm14, %xmm3, %xmm14
  207. vpshufb 96(%rsp), %xmm15, %xmm15
  208. vpshufb 96(%rsp), %xmm12, %xmm12
  209. vpaddd %xmm10, %xmm15, %xmm10
  210. vpaddd %xmm11, %xmm12, %xmm11
  211. vpshufb 96(%rsp), %xmm13, %xmm13
  212. vpshufb 96(%rsp), %xmm14, %xmm14
  213. vpaddd %xmm8, %xmm13, %xmm8
  214. vpaddd %xmm9, %xmm14, %xmm9
  215. vmovdqa %xmm15, 112(%rsp)
  216. vpxor %xmm5, %xmm10, %xmm5
  217. vpxor %xmm6, %xmm11, %xmm6
  218. vpslld $ 7, %xmm5, %xmm15
  219. vpsrld $25, %xmm5, %xmm5
  220. vpxor %xmm5, %xmm15, %xmm5
  221. vpslld $ 7, %xmm6, %xmm15
  222. vpsrld $25, %xmm6, %xmm6
  223. vpxor %xmm6, %xmm15, %xmm6
  224. vpxor %xmm7, %xmm8, %xmm7
  225. vpxor %xmm4, %xmm9, %xmm4
  226. vpslld $ 7, %xmm7, %xmm15
  227. vpsrld $25, %xmm7, %xmm7
  228. vpxor %xmm7, %xmm15, %xmm7
  229. vpslld $ 7, %xmm4, %xmm15
  230. vpsrld $25, %xmm4, %xmm4
  231. vpxor %xmm4, %xmm15, %xmm4
  232. vmovdqa 112(%rsp), %xmm15
  233. subq $2, %rax
  234. jnz chacha_blocks_avx_mainloop1
  235. vpaddd 128(%rsp), %xmm0, %xmm0
  236. vpaddd 144(%rsp), %xmm1, %xmm1
  237. vpaddd 160(%rsp), %xmm2, %xmm2
  238. vpaddd 176(%rsp), %xmm3, %xmm3
  239. vpaddd 192(%rsp), %xmm4, %xmm4
  240. vpaddd 208(%rsp), %xmm5, %xmm5
  241. vpaddd 224(%rsp), %xmm6, %xmm6
  242. vpaddd 240(%rsp), %xmm7, %xmm7
  243. vpaddd 256(%rsp), %xmm8, %xmm8
  244. vpaddd 272(%rsp), %xmm9, %xmm9
  245. vpaddd 288(%rsp), %xmm10, %xmm10
  246. vpaddd 304(%rsp), %xmm11, %xmm11
  247. vpaddd 320(%rsp), %xmm12, %xmm12
  248. vpaddd 336(%rsp), %xmm13, %xmm13
  249. vpaddd 352(%rsp), %xmm14, %xmm14
  250. vpaddd 368(%rsp), %xmm15, %xmm15
  251. vmovdqa %xmm8, 384(%rsp)
  252. vmovdqa %xmm9, 400(%rsp)
  253. vmovdqa %xmm10, 416(%rsp)
  254. vmovdqa %xmm11, 432(%rsp)
  255. vmovdqa %xmm12, 448(%rsp)
  256. vmovdqa %xmm13, 464(%rsp)
  257. vmovdqa %xmm14, 480(%rsp)
  258. vmovdqa %xmm15, 496(%rsp)
  259. vpunpckldq %xmm1, %xmm0, %xmm8
  260. vpunpckldq %xmm3, %xmm2, %xmm9
  261. vpunpckhdq %xmm1, %xmm0, %xmm12
  262. vpunpckhdq %xmm3, %xmm2, %xmm13
  263. vpunpckldq %xmm5, %xmm4, %xmm10
  264. vpunpckldq %xmm7, %xmm6, %xmm11
  265. vpunpckhdq %xmm5, %xmm4, %xmm14
  266. vpunpckhdq %xmm7, %xmm6, %xmm15
  267. vpunpcklqdq %xmm9, %xmm8, %xmm0
  268. vpunpcklqdq %xmm11, %xmm10, %xmm1
  269. vpunpckhqdq %xmm9, %xmm8, %xmm2
  270. vpunpckhqdq %xmm11, %xmm10, %xmm3
  271. vpunpcklqdq %xmm13, %xmm12, %xmm4
  272. vpunpcklqdq %xmm15, %xmm14, %xmm5
  273. vpunpckhqdq %xmm13, %xmm12, %xmm6
  274. vpunpckhqdq %xmm15, %xmm14, %xmm7
  275. andq %rsi, %rsi
  276. jz chacha_blocks_avx_noinput1
  277. vpxor 0(%rsi), %xmm0, %xmm0
  278. vpxor 16(%rsi), %xmm1, %xmm1
  279. vpxor 64(%rsi), %xmm2, %xmm2
  280. vpxor 80(%rsi), %xmm3, %xmm3
  281. vpxor 128(%rsi), %xmm4, %xmm4
  282. vpxor 144(%rsi), %xmm5, %xmm5
  283. vpxor 192(%rsi), %xmm6, %xmm6
  284. vpxor 208(%rsi), %xmm7, %xmm7
  285. vmovdqu %xmm0, 0(%rdx)
  286. vmovdqu %xmm1, 16(%rdx)
  287. vmovdqu %xmm2, 64(%rdx)
  288. vmovdqu %xmm3, 80(%rdx)
  289. vmovdqu %xmm4, 128(%rdx)
  290. vmovdqu %xmm5, 144(%rdx)
  291. vmovdqu %xmm6, 192(%rdx)
  292. vmovdqu %xmm7, 208(%rdx)
  293. vmovdqa 384(%rsp), %xmm0
  294. vmovdqa 400(%rsp), %xmm1
  295. vmovdqa 416(%rsp), %xmm2
  296. vmovdqa 432(%rsp), %xmm3
  297. vmovdqa 448(%rsp), %xmm4
  298. vmovdqa 464(%rsp), %xmm5
  299. vmovdqa 480(%rsp), %xmm6
  300. vmovdqa 496(%rsp), %xmm7
  301. vpunpckldq %xmm1, %xmm0, %xmm8
  302. vpunpckldq %xmm3, %xmm2, %xmm9
  303. vpunpckhdq %xmm1, %xmm0, %xmm12
  304. vpunpckhdq %xmm3, %xmm2, %xmm13
  305. vpunpckldq %xmm5, %xmm4, %xmm10
  306. vpunpckldq %xmm7, %xmm6, %xmm11
  307. vpunpckhdq %xmm5, %xmm4, %xmm14
  308. vpunpckhdq %xmm7, %xmm6, %xmm15
  309. vpunpcklqdq %xmm9, %xmm8, %xmm0
  310. vpunpcklqdq %xmm11, %xmm10, %xmm1
  311. vpunpckhqdq %xmm9, %xmm8, %xmm2
  312. vpunpckhqdq %xmm11, %xmm10, %xmm3
  313. vpunpcklqdq %xmm13, %xmm12, %xmm4
  314. vpunpcklqdq %xmm15, %xmm14, %xmm5
  315. vpunpckhqdq %xmm13, %xmm12, %xmm6
  316. vpunpckhqdq %xmm15, %xmm14, %xmm7
  317. vpxor 32(%rsi), %xmm0, %xmm0
  318. vpxor 48(%rsi), %xmm1, %xmm1
  319. vpxor 96(%rsi), %xmm2, %xmm2
  320. vpxor 112(%rsi), %xmm3, %xmm3
  321. vpxor 160(%rsi), %xmm4, %xmm4
  322. vpxor 176(%rsi), %xmm5, %xmm5
  323. vpxor 224(%rsi), %xmm6, %xmm6
  324. vpxor 240(%rsi), %xmm7, %xmm7
  325. vmovdqu %xmm0, 32(%rdx)
  326. vmovdqu %xmm1, 48(%rdx)
  327. vmovdqu %xmm2, 96(%rdx)
  328. vmovdqu %xmm3, 112(%rdx)
  329. vmovdqu %xmm4, 160(%rdx)
  330. vmovdqu %xmm5, 176(%rdx)
  331. vmovdqu %xmm6, 224(%rdx)
  332. vmovdqu %xmm7, 240(%rdx)
  333. addq $256, %rsi
  334. jmp chacha_blocks_avx_mainloop_cont
  335. chacha_blocks_avx_noinput1:
  336. vmovdqu %xmm0, 0(%rdx)
  337. vmovdqu %xmm1, 16(%rdx)
  338. vmovdqu %xmm2, 64(%rdx)
  339. vmovdqu %xmm3, 80(%rdx)
  340. vmovdqu %xmm4, 128(%rdx)
  341. vmovdqu %xmm5, 144(%rdx)
  342. vmovdqu %xmm6, 192(%rdx)
  343. vmovdqu %xmm7, 208(%rdx)
  344. vmovdqa 384(%rsp), %xmm0
  345. vmovdqa 400(%rsp), %xmm1
  346. vmovdqa 416(%rsp), %xmm2
  347. vmovdqa 432(%rsp), %xmm3
  348. vmovdqa 448(%rsp), %xmm4
  349. vmovdqa 464(%rsp), %xmm5
  350. vmovdqa 480(%rsp), %xmm6
  351. vmovdqa 496(%rsp), %xmm7
  352. vpunpckldq %xmm1, %xmm0, %xmm8
  353. vpunpckldq %xmm3, %xmm2, %xmm9
  354. vpunpckhdq %xmm1, %xmm0, %xmm12
  355. vpunpckhdq %xmm3, %xmm2, %xmm13
  356. vpunpckldq %xmm5, %xmm4, %xmm10
  357. vpunpckldq %xmm7, %xmm6, %xmm11
  358. vpunpckhdq %xmm5, %xmm4, %xmm14
  359. vpunpckhdq %xmm7, %xmm6, %xmm15
  360. vpunpcklqdq %xmm9, %xmm8, %xmm0
  361. vpunpcklqdq %xmm11, %xmm10, %xmm1
  362. vpunpckhqdq %xmm9, %xmm8, %xmm2
  363. vpunpckhqdq %xmm11, %xmm10, %xmm3
  364. vpunpcklqdq %xmm13, %xmm12, %xmm4
  365. vpunpcklqdq %xmm15, %xmm14, %xmm5
  366. vpunpckhqdq %xmm13, %xmm12, %xmm6
  367. vpunpckhqdq %xmm15, %xmm14, %xmm7
  368. vmovdqu %xmm0, 32(%rdx)
  369. vmovdqu %xmm1, 48(%rdx)
  370. vmovdqu %xmm2, 96(%rdx)
  371. vmovdqu %xmm3, 112(%rdx)
  372. vmovdqu %xmm4, 160(%rdx)
  373. vmovdqu %xmm5, 176(%rdx)
  374. vmovdqu %xmm6, 224(%rdx)
  375. vmovdqu %xmm7, 240(%rdx)
  376. chacha_blocks_avx_mainloop_cont:
  377. addq $256, %rdx
  378. subq $256, %rcx
  379. cmp $256, %rcx
  380. jae chacha_blocks_avx_atleast256
  381. vmovdqa 80(%rsp), %xmm6
  382. vmovdqa 96(%rsp), %xmm7
  383. vmovdqa 0(%rsp), %xmm8
  384. vmovdqa 16(%rsp), %xmm9
  385. vmovdqa 32(%rsp), %xmm10
  386. vmovdqa 48(%rsp), %xmm11
  387. movq $1, %r9
  388. chacha_blocks_avx_below256:
  389. vmovq %r9, %xmm5
  390. andq %rcx, %rcx
  391. jz chacha_blocks_avx_done
  392. cmpq $64, %rcx
  393. jae chacha_blocks_avx_above63
  394. movq %rdx, %r9
  395. andq %rsi, %rsi
  396. jz chacha_blocks_avx_noinput2
  397. movq %rcx, %r10
  398. movq %rsp, %rdx
  399. addq %r10, %rsi
  400. addq %r10, %rdx
  401. negq %r10
  402. chacha_blocks_avx_copyinput:
  403. movb (%rsi, %r10), %al
  404. movb %al, (%rdx, %r10)
  405. incq %r10
  406. jnz chacha_blocks_avx_copyinput
  407. movq %rsp, %rsi
  408. chacha_blocks_avx_noinput2:
  409. movq %rsp, %rdx
  410. chacha_blocks_avx_above63:
  411. vmovdqa %xmm8, %xmm0
  412. vmovdqa %xmm9, %xmm1
  413. vmovdqa %xmm10, %xmm2
  414. vmovdqa %xmm11, %xmm3
  415. movq 64(%rsp), %rax
  416. chacha_blocks_avx_mainloop2:
  417. vpaddd %xmm0, %xmm1, %xmm0
  418. vpxor %xmm3, %xmm0, %xmm3
  419. vpshufb %xmm6, %xmm3, %xmm3
  420. vpaddd %xmm2, %xmm3, %xmm2
  421. vpxor %xmm1, %xmm2, %xmm1
  422. vpslld $12, %xmm1, %xmm4
  423. vpsrld $20, %xmm1, %xmm1
  424. vpxor %xmm1, %xmm4, %xmm1
  425. vpaddd %xmm0, %xmm1, %xmm0
  426. vpxor %xmm3, %xmm0, %xmm3
  427. vpshufb %xmm7, %xmm3, %xmm3
  428. vpshufd $0x93, %xmm0, %xmm0
  429. vpaddd %xmm2, %xmm3, %xmm2
  430. vpshufd $0x4e, %xmm3, %xmm3
  431. vpxor %xmm1, %xmm2, %xmm1
  432. vpshufd $0x39, %xmm2, %xmm2
  433. vpslld $7, %xmm1, %xmm4
  434. vpsrld $25, %xmm1, %xmm1
  435. vpxor %xmm1, %xmm4, %xmm1
  436. vpaddd %xmm0, %xmm1, %xmm0
  437. vpxor %xmm3, %xmm0, %xmm3
  438. vpshufb %xmm6, %xmm3, %xmm3
  439. vpaddd %xmm2, %xmm3, %xmm2
  440. vpxor %xmm1, %xmm2, %xmm1
  441. vpslld $12, %xmm1, %xmm4
  442. vpsrld $20, %xmm1, %xmm1
  443. vpxor %xmm1, %xmm4, %xmm1
  444. vpaddd %xmm0, %xmm1, %xmm0
  445. vpxor %xmm3, %xmm0, %xmm3
  446. vpshufb %xmm7, %xmm3, %xmm3
  447. vpshufd $0x39, %xmm0, %xmm0
  448. vpaddd %xmm2, %xmm3, %xmm2
  449. vpshufd $0x4e, %xmm3, %xmm3
  450. vpxor %xmm1, %xmm2, %xmm1
  451. vpshufd $0x93, %xmm2, %xmm2
  452. vpslld $7, %xmm1, %xmm4
  453. vpsrld $25, %xmm1, %xmm1
  454. vpxor %xmm1, %xmm4, %xmm1
  455. subq $2, %rax
  456. jnz chacha_blocks_avx_mainloop2
  457. vpaddd %xmm0, %xmm8, %xmm0
  458. vpaddd %xmm1, %xmm9, %xmm1
  459. vpaddd %xmm2, %xmm10, %xmm2
  460. vpaddd %xmm3, %xmm11, %xmm3
  461. andq %rsi, %rsi
  462. jz chacha_blocks_avx_noinput3
  463. vpxor 0(%rsi), %xmm0, %xmm0
  464. vpxor 16(%rsi), %xmm1, %xmm1
  465. vpxor 32(%rsi), %xmm2, %xmm2
  466. vpxor 48(%rsi), %xmm3, %xmm3
  467. addq $64, %rsi
  468. chacha_blocks_avx_noinput3:
  469. vmovdqu %xmm0, 0(%rdx)
  470. vmovdqu %xmm1, 16(%rdx)
  471. vmovdqu %xmm2, 32(%rdx)
  472. vmovdqu %xmm3, 48(%rdx)
  473. vpaddq %xmm11, %xmm5, %xmm11
  474. cmpq $64, %rcx
  475. jbe chacha_blocks_avx_mainloop2_finishup
  476. addq $64, %rdx
  477. subq $64, %rcx
  478. jmp chacha_blocks_avx_below256
  479. chacha_blocks_avx_mainloop2_finishup:
  480. cmpq $64, %rcx
  481. je chacha_blocks_avx_done
  482. addq %rcx, %r9
  483. addq %rcx, %rdx
  484. negq %rcx
  485. chacha_blocks_avx_copyoutput:
  486. movb (%rdx, %rcx), %al
  487. movb %al, (%r9, %rcx)
  488. incq %rcx
  489. jnz chacha_blocks_avx_copyoutput
  490. chacha_blocks_avx_done:
  491. vmovdqu %xmm11, 32(%rdi)
  492. movq %rbp, %rsp
  493. popq %rbp
  494. popq %rbx
  495. ret
  496. FN_END chacha_blocks_avx
  497. GLOBAL_HIDDEN_FN hchacha_avx
  498. hchacha_avx_local:
  499. LOAD_VAR_PIC chacha_constants, %rax
  500. vmovdqa 0(%rax), %xmm0
  501. vmovdqa 16(%rax), %xmm6
  502. vmovdqa 32(%rax), %xmm5
  503. vmovdqu 0(%rdi), %xmm1
  504. vmovdqu 16(%rdi), %xmm2
  505. vmovdqu 0(%rsi), %xmm3
  506. hhacha_mainloop_avx:
  507. vpaddd %xmm0, %xmm1, %xmm0
  508. vpxor %xmm3, %xmm0, %xmm3
  509. vpshufb %xmm6, %xmm3, %xmm3
  510. vpaddd %xmm2, %xmm3, %xmm2
  511. vpxor %xmm1, %xmm2, %xmm1
  512. vpslld $12, %xmm1, %xmm4
  513. vpsrld $20, %xmm1, %xmm1
  514. vpxor %xmm1, %xmm4, %xmm1
  515. vpaddd %xmm0, %xmm1, %xmm0
  516. vpxor %xmm3, %xmm0, %xmm3
  517. vpshufb %xmm5, %xmm3, %xmm3
  518. vpaddd %xmm2, %xmm3, %xmm2
  519. vpxor %xmm1, %xmm2, %xmm1
  520. vpslld $7, %xmm1, %xmm4
  521. vpsrld $25, %xmm1, %xmm1
  522. vpshufd $0x93, %xmm0, %xmm0
  523. vpxor %xmm1, %xmm4, %xmm1
  524. vpshufd $0x4e, %xmm3, %xmm3
  525. vpaddd %xmm0, %xmm1, %xmm0
  526. vpxor %xmm3, %xmm0, %xmm3
  527. vpshufb %xmm6, %xmm3, %xmm3
  528. vpshufd $0x39, %xmm2, %xmm2
  529. vpaddd %xmm2, %xmm3, %xmm2
  530. vpxor %xmm1, %xmm2, %xmm1
  531. vpslld $12, %xmm1, %xmm4
  532. vpsrld $20, %xmm1, %xmm1
  533. vpxor %xmm1, %xmm4, %xmm1
  534. vpaddd %xmm0, %xmm1, %xmm0
  535. vpxor %xmm3, %xmm0, %xmm3
  536. vpshufb %xmm5, %xmm3, %xmm3
  537. vpaddd %xmm2, %xmm3, %xmm2
  538. vpxor %xmm1, %xmm2, %xmm1
  539. vpshufd $0x39, %xmm0, %xmm0
  540. vpslld $7, %xmm1, %xmm4
  541. vpshufd $0x4e, %xmm3, %xmm3
  542. vpsrld $25, %xmm1, %xmm1
  543. vpshufd $0x93, %xmm2, %xmm2
  544. vpxor %xmm1, %xmm4, %xmm1
  545. subl $2, %ecx
  546. jne hhacha_mainloop_avx
  547. vmovdqu %xmm0, (%rdx)
  548. vmovdqu %xmm3, 16(%rdx)
  549. ret
  550. FN_END hchacha_avx
  551. GLOBAL_HIDDEN_FN_EXT chacha_avx, 6, 16
  552. pushq %rbp
  553. movq %rsp, %rbp
  554. subq $64, %rsp
  555. andq $~63, %rsp
  556. vmovdqu 0(%rdi), %xmm0
  557. vmovdqu 16(%rdi), %xmm1
  558. vmovdqa %xmm0, 0(%rsp)
  559. vmovdqa %xmm1, 16(%rsp)
  560. xorq %rdi, %rdi
  561. movq %rdi, 32(%rsp)
  562. movq 0(%rsi), %rsi
  563. movq %rsi, 40(%rsp)
  564. movq %r9, 48(%rsp)
  565. movq %rsp, %rdi
  566. movq %rdx, %rsi
  567. movq %rcx, %rdx
  568. movq %r8, %rcx
  569. call chacha_blocks_avx_local
  570. vpxor %xmm0, %xmm0, %xmm0
  571. vmovdqa %xmm0, 0(%rsp)
  572. vmovdqa %xmm0, 16(%rsp)
  573. vmovdqa %xmm0, 32(%rsp)
  574. movq %rbp, %rsp
  575. popq %rbp
  576. ret
  577. FN_END chacha_avx
  578. GLOBAL_HIDDEN_FN_EXT xchacha_avx, 6, 16
  579. pushq %rbp
  580. pushq %rbx
  581. movq %rsp, %rbp
  582. subq $64, %rsp
  583. andq $~63, %rsp
  584. movq %rsp, %rbx
  585. xorq %rax, %rax
  586. movq %rax, 32(%rbx)
  587. movq 16(%rsi), %rax
  588. movq %rax, 40(%rbx)
  589. movq %r9, 48(%rbx)
  590. pushq %rdx
  591. pushq %rcx
  592. pushq %r8
  593. movq %rbx, %rdx
  594. movq %r9, %rcx
  595. call hchacha_avx_local
  596. movq %rbx, %rdi
  597. popq %rcx
  598. popq %rdx
  599. popq %rsi
  600. call chacha_blocks_avx_local
  601. vpxor %xmm0, %xmm0, %xmm0
  602. vmovdqa %xmm0, 0(%rbx)
  603. vmovdqa %xmm0, 16(%rbx)
  604. vmovdqa %xmm0, 32(%rbx)
  605. movq %rbp, %rsp
  606. popq %rbx
  607. popq %rbp
  608. ret
  609. FN_END xchacha_avx