chacha_asm.S 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453
  1. /* chacha_asm
  2. *
  3. * Copyright (C) 2006-2022 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. #ifdef WOLFSSL_USER_SETTINGS
  22. #ifdef WOLFSSL_USER_SETTINGS_ASM
  23. /*
  24. * user_settings_asm.h is a file generated by the script user_settings_asm.sh.
  25. * The script takes in a user_settings.h and produces user_settings_asm.h, which
  26. * is a stripped down version of user_settings.h containing only preprocessor
  27. * directives. This makes the header safe to include in assembly (.S) files.
  28. */
  29. #include "user_settings_asm.h"
  30. #else
  31. /*
  32. * Note: if user_settings.h contains any C code (e.g. a typedef or function
  33. * prototype), including it here in an assembly (.S) file will cause an
  34. * assembler failure. See user_settings_asm.h above.
  35. */
  36. #include "user_settings.h"
  37. #endif /* WOLFSSL_USER_SETTINGS_ASM */
  38. #endif /* WOLFSSL_USER_SETTINGS */
  39. #ifndef HAVE_INTEL_AVX1
  40. #define HAVE_INTEL_AVX1
  41. #endif /* HAVE_INTEL_AVX1 */
  42. #ifndef NO_AVX2_SUPPORT
  43. #define HAVE_INTEL_AVX2
  44. #endif /* NO_AVX2_SUPPORT */
  45. #ifdef WOLFSSL_X86_64_BUILD
  46. #ifndef __APPLE__
  47. .text
  48. .globl chacha_encrypt_x64
  49. .type chacha_encrypt_x64,@function
  50. .align 16
  51. chacha_encrypt_x64:
  52. #else
  53. .section __TEXT,__text
  54. .globl _chacha_encrypt_x64
  55. .p2align 4
  56. _chacha_encrypt_x64:
  57. #endif /* __APPLE__ */
  58. pushq %rbx
  59. pushq %rbp
  60. pushq %r12
  61. pushq %r13
  62. pushq %r14
  63. pushq %r15
  64. subq $0x40, %rsp
  65. cmpl $0x40, %ecx
  66. jl L_chacha_x64_small
  67. L_chacha_x64_start:
  68. subq $48, %rsp
  69. movq %rdx, 24(%rsp)
  70. movq %rsi, 32(%rsp)
  71. movq %rcx, 40(%rsp)
  72. movq 32(%rdi), %rax
  73. movq 40(%rdi), %rbx
  74. movq %rax, 8(%rsp)
  75. movq %rbx, 16(%rsp)
  76. movl (%rdi), %eax
  77. movl 4(%rdi), %ebx
  78. movl 8(%rdi), %ecx
  79. movl 12(%rdi), %edx
  80. movl 16(%rdi), %r8d
  81. movl 20(%rdi), %r9d
  82. movl 24(%rdi), %r10d
  83. movl 28(%rdi), %r11d
  84. movl 48(%rdi), %r12d
  85. movl 52(%rdi), %r13d
  86. movl 56(%rdi), %r14d
  87. movl 60(%rdi), %r15d
  88. movb $10, (%rsp)
  89. movl 8(%rsp), %esi
  90. movl 12(%rsp), %ebp
  91. L_chacha_x64_block_crypt_start:
  92. addl %r8d, %eax
  93. addl %r9d, %ebx
  94. xorl %eax, %r12d
  95. xorl %ebx, %r13d
  96. roll $16, %r12d
  97. roll $16, %r13d
  98. addl %r12d, %esi
  99. addl %r13d, %ebp
  100. xorl %esi, %r8d
  101. xorl %ebp, %r9d
  102. roll $12, %r8d
  103. roll $12, %r9d
  104. addl %r8d, %eax
  105. addl %r9d, %ebx
  106. xorl %eax, %r12d
  107. xorl %ebx, %r13d
  108. roll $8, %r12d
  109. roll $8, %r13d
  110. addl %r12d, %esi
  111. addl %r13d, %ebp
  112. xorl %esi, %r8d
  113. xorl %ebp, %r9d
  114. roll $7, %r8d
  115. roll $7, %r9d
  116. movl %esi, 8(%rsp)
  117. movl %ebp, 12(%rsp)
  118. movl 16(%rsp), %esi
  119. movl 20(%rsp), %ebp
  120. addl %r10d, %ecx
  121. addl %r11d, %edx
  122. xorl %ecx, %r14d
  123. xorl %edx, %r15d
  124. roll $16, %r14d
  125. roll $16, %r15d
  126. addl %r14d, %esi
  127. addl %r15d, %ebp
  128. xorl %esi, %r10d
  129. xorl %ebp, %r11d
  130. roll $12, %r10d
  131. roll $12, %r11d
  132. addl %r10d, %ecx
  133. addl %r11d, %edx
  134. xorl %ecx, %r14d
  135. xorl %edx, %r15d
  136. roll $8, %r14d
  137. roll $8, %r15d
  138. addl %r14d, %esi
  139. addl %r15d, %ebp
  140. xorl %esi, %r10d
  141. xorl %ebp, %r11d
  142. roll $7, %r10d
  143. roll $7, %r11d
  144. addl %r9d, %eax
  145. addl %r10d, %ebx
  146. xorl %eax, %r15d
  147. xorl %ebx, %r12d
  148. roll $16, %r15d
  149. roll $16, %r12d
  150. addl %r15d, %esi
  151. addl %r12d, %ebp
  152. xorl %esi, %r9d
  153. xorl %ebp, %r10d
  154. roll $12, %r9d
  155. roll $12, %r10d
  156. addl %r9d, %eax
  157. addl %r10d, %ebx
  158. xorl %eax, %r15d
  159. xorl %ebx, %r12d
  160. roll $8, %r15d
  161. roll $8, %r12d
  162. addl %r15d, %esi
  163. addl %r12d, %ebp
  164. xorl %esi, %r9d
  165. xorl %ebp, %r10d
  166. roll $7, %r9d
  167. roll $7, %r10d
  168. movl %esi, 16(%rsp)
  169. movl %ebp, 20(%rsp)
  170. movl 8(%rsp), %esi
  171. movl 12(%rsp), %ebp
  172. addl %r11d, %ecx
  173. addl %r8d, %edx
  174. xorl %ecx, %r13d
  175. xorl %edx, %r14d
  176. roll $16, %r13d
  177. roll $16, %r14d
  178. addl %r13d, %esi
  179. addl %r14d, %ebp
  180. xorl %esi, %r11d
  181. xorl %ebp, %r8d
  182. roll $12, %r11d
  183. roll $12, %r8d
  184. addl %r11d, %ecx
  185. addl %r8d, %edx
  186. xorl %ecx, %r13d
  187. xorl %edx, %r14d
  188. roll $8, %r13d
  189. roll $8, %r14d
  190. addl %r13d, %esi
  191. addl %r14d, %ebp
  192. xorl %esi, %r11d
  193. xorl %ebp, %r8d
  194. roll $7, %r11d
  195. roll $7, %r8d
  196. decb (%rsp)
  197. jnz L_chacha_x64_block_crypt_start
  198. movl %esi, 8(%rsp)
  199. movl %ebp, 12(%rsp)
  200. movq 32(%rsp), %rsi
  201. movq 24(%rsp), %rbp
  202. addl (%rdi), %eax
  203. addl 4(%rdi), %ebx
  204. addl 8(%rdi), %ecx
  205. addl 12(%rdi), %edx
  206. addl 16(%rdi), %r8d
  207. addl 20(%rdi), %r9d
  208. addl 24(%rdi), %r10d
  209. addl 28(%rdi), %r11d
  210. addl 48(%rdi), %r12d
  211. addl 52(%rdi), %r13d
  212. addl 56(%rdi), %r14d
  213. addl 60(%rdi), %r15d
  214. xorl (%rsi), %eax
  215. xorl 4(%rsi), %ebx
  216. xorl 8(%rsi), %ecx
  217. xorl 12(%rsi), %edx
  218. xorl 16(%rsi), %r8d
  219. xorl 20(%rsi), %r9d
  220. xorl 24(%rsi), %r10d
  221. xorl 28(%rsi), %r11d
  222. xorl 48(%rsi), %r12d
  223. xorl 52(%rsi), %r13d
  224. xorl 56(%rsi), %r14d
  225. xorl 60(%rsi), %r15d
  226. movl %eax, (%rbp)
  227. movl %ebx, 4(%rbp)
  228. movl %ecx, 8(%rbp)
  229. movl %edx, 12(%rbp)
  230. movl %r8d, 16(%rbp)
  231. movl %r9d, 20(%rbp)
  232. movl %r10d, 24(%rbp)
  233. movl %r11d, 28(%rbp)
  234. movl %r12d, 48(%rbp)
  235. movl %r13d, 52(%rbp)
  236. movl %r14d, 56(%rbp)
  237. movl %r15d, 60(%rbp)
  238. movl 8(%rsp), %eax
  239. movl 12(%rsp), %ebx
  240. movl 16(%rsp), %ecx
  241. movl 20(%rsp), %edx
  242. addl 32(%rdi), %eax
  243. addl 36(%rdi), %ebx
  244. addl 40(%rdi), %ecx
  245. addl 44(%rdi), %edx
  246. xorl 32(%rsi), %eax
  247. xorl 36(%rsi), %ebx
  248. xorl 40(%rsi), %ecx
  249. xorl 44(%rsi), %edx
  250. movl %eax, 32(%rbp)
  251. movl %ebx, 36(%rbp)
  252. movl %ecx, 40(%rbp)
  253. movl %edx, 44(%rbp)
  254. movq 24(%rsp), %rdx
  255. movq 40(%rsp), %rcx
  256. addl $0x01, 48(%rdi)
  257. addq $48, %rsp
  258. subl $0x40, %ecx
  259. addq $0x40, %rsi
  260. addq $0x40, %rdx
  261. cmpl $0x40, %ecx
  262. jge L_chacha_x64_start
  263. L_chacha_x64_small:
  264. cmpl $0x00, %ecx
  265. je L_chacha_x64_done
  266. subq $48, %rsp
  267. movq %rdx, 24(%rsp)
  268. movq %rsi, 32(%rsp)
  269. movq %rcx, 40(%rsp)
  270. movq 32(%rdi), %rax
  271. movq 40(%rdi), %rbx
  272. movq %rax, 8(%rsp)
  273. movq %rbx, 16(%rsp)
  274. movl (%rdi), %eax
  275. movl 4(%rdi), %ebx
  276. movl 8(%rdi), %ecx
  277. movl 12(%rdi), %edx
  278. movl 16(%rdi), %r8d
  279. movl 20(%rdi), %r9d
  280. movl 24(%rdi), %r10d
  281. movl 28(%rdi), %r11d
  282. movl 48(%rdi), %r12d
  283. movl 52(%rdi), %r13d
  284. movl 56(%rdi), %r14d
  285. movl 60(%rdi), %r15d
  286. movb $10, (%rsp)
  287. movl 8(%rsp), %esi
  288. movl 12(%rsp), %ebp
  289. L_chacha_x64_partial_crypt_start:
  290. addl %r8d, %eax
  291. addl %r9d, %ebx
  292. xorl %eax, %r12d
  293. xorl %ebx, %r13d
  294. roll $16, %r12d
  295. roll $16, %r13d
  296. addl %r12d, %esi
  297. addl %r13d, %ebp
  298. xorl %esi, %r8d
  299. xorl %ebp, %r9d
  300. roll $12, %r8d
  301. roll $12, %r9d
  302. addl %r8d, %eax
  303. addl %r9d, %ebx
  304. xorl %eax, %r12d
  305. xorl %ebx, %r13d
  306. roll $8, %r12d
  307. roll $8, %r13d
  308. addl %r12d, %esi
  309. addl %r13d, %ebp
  310. xorl %esi, %r8d
  311. xorl %ebp, %r9d
  312. roll $7, %r8d
  313. roll $7, %r9d
  314. movl %esi, 8(%rsp)
  315. movl %ebp, 12(%rsp)
  316. movl 16(%rsp), %esi
  317. movl 20(%rsp), %ebp
  318. addl %r10d, %ecx
  319. addl %r11d, %edx
  320. xorl %ecx, %r14d
  321. xorl %edx, %r15d
  322. roll $16, %r14d
  323. roll $16, %r15d
  324. addl %r14d, %esi
  325. addl %r15d, %ebp
  326. xorl %esi, %r10d
  327. xorl %ebp, %r11d
  328. roll $12, %r10d
  329. roll $12, %r11d
  330. addl %r10d, %ecx
  331. addl %r11d, %edx
  332. xorl %ecx, %r14d
  333. xorl %edx, %r15d
  334. roll $8, %r14d
  335. roll $8, %r15d
  336. addl %r14d, %esi
  337. addl %r15d, %ebp
  338. xorl %esi, %r10d
  339. xorl %ebp, %r11d
  340. roll $7, %r10d
  341. roll $7, %r11d
  342. addl %r9d, %eax
  343. addl %r10d, %ebx
  344. xorl %eax, %r15d
  345. xorl %ebx, %r12d
  346. roll $16, %r15d
  347. roll $16, %r12d
  348. addl %r15d, %esi
  349. addl %r12d, %ebp
  350. xorl %esi, %r9d
  351. xorl %ebp, %r10d
  352. roll $12, %r9d
  353. roll $12, %r10d
  354. addl %r9d, %eax
  355. addl %r10d, %ebx
  356. xorl %eax, %r15d
  357. xorl %ebx, %r12d
  358. roll $8, %r15d
  359. roll $8, %r12d
  360. addl %r15d, %esi
  361. addl %r12d, %ebp
  362. xorl %esi, %r9d
  363. xorl %ebp, %r10d
  364. roll $7, %r9d
  365. roll $7, %r10d
  366. movl %esi, 16(%rsp)
  367. movl %ebp, 20(%rsp)
  368. movl 8(%rsp), %esi
  369. movl 12(%rsp), %ebp
  370. addl %r11d, %ecx
  371. addl %r8d, %edx
  372. xorl %ecx, %r13d
  373. xorl %edx, %r14d
  374. roll $16, %r13d
  375. roll $16, %r14d
  376. addl %r13d, %esi
  377. addl %r14d, %ebp
  378. xorl %esi, %r11d
  379. xorl %ebp, %r8d
  380. roll $12, %r11d
  381. roll $12, %r8d
  382. addl %r11d, %ecx
  383. addl %r8d, %edx
  384. xorl %ecx, %r13d
  385. xorl %edx, %r14d
  386. roll $8, %r13d
  387. roll $8, %r14d
  388. addl %r13d, %esi
  389. addl %r14d, %ebp
  390. xorl %esi, %r11d
  391. xorl %ebp, %r8d
  392. roll $7, %r11d
  393. roll $7, %r8d
  394. decb (%rsp)
  395. jnz L_chacha_x64_partial_crypt_start
  396. movl %esi, 8(%rsp)
  397. movl %ebp, 12(%rsp)
  398. movq 32(%rsp), %rsi
  399. addl (%rdi), %eax
  400. addl 4(%rdi), %ebx
  401. addl 8(%rdi), %ecx
  402. addl 12(%rdi), %edx
  403. addl 16(%rdi), %r8d
  404. addl 20(%rdi), %r9d
  405. addl 24(%rdi), %r10d
  406. addl 28(%rdi), %r11d
  407. addl 48(%rdi), %r12d
  408. addl 52(%rdi), %r13d
  409. addl 56(%rdi), %r14d
  410. addl 60(%rdi), %r15d
  411. leaq 80(%rdi), %rbp
  412. movl %eax, (%rbp)
  413. movl %ebx, 4(%rbp)
  414. movl %ecx, 8(%rbp)
  415. movl %edx, 12(%rbp)
  416. movl %r8d, 16(%rbp)
  417. movl %r9d, 20(%rbp)
  418. movl %r10d, 24(%rbp)
  419. movl %r11d, 28(%rbp)
  420. movl %r12d, 48(%rbp)
  421. movl %r13d, 52(%rbp)
  422. movl %r14d, 56(%rbp)
  423. movl %r15d, 60(%rbp)
  424. movl 8(%rsp), %eax
  425. movl 12(%rsp), %ebx
  426. movl 16(%rsp), %ecx
  427. movl 20(%rsp), %edx
  428. addl 32(%rdi), %eax
  429. addl 36(%rdi), %ebx
  430. addl 40(%rdi), %ecx
  431. addl 44(%rdi), %edx
  432. movl %eax, 32(%rbp)
  433. movl %ebx, 36(%rbp)
  434. movl %ecx, 40(%rbp)
  435. movl %edx, 44(%rbp)
  436. movq 24(%rsp), %rdx
  437. movq 40(%rsp), %rcx
  438. addl $0x01, 48(%rdi)
  439. addq $48, %rsp
  440. movl %ecx, %r8d
  441. xorq %rbx, %rbx
  442. andl $7, %r8d
  443. jz L_chacha_x64_partial_start64
  444. L_chacha_x64_partial_start8:
  445. movzbl (%rbp,%rbx,1), %eax
  446. xorb (%rsi,%rbx,1), %al
  447. movb %al, (%rdx,%rbx,1)
  448. incl %ebx
  449. cmpl %r8d, %ebx
  450. jne L_chacha_x64_partial_start8
  451. je L_chacha_x64_partial_end64
  452. L_chacha_x64_partial_start64:
  453. movq (%rbp,%rbx,1), %rax
  454. xorq (%rsi,%rbx,1), %rax
  455. movq %rax, (%rdx,%rbx,1)
  456. addl $8, %ebx
  457. L_chacha_x64_partial_end64:
  458. cmpl %ecx, %ebx
  459. jne L_chacha_x64_partial_start64
  460. movl $0x40, %ecx
  461. subl %ebx, %ecx
  462. movl %ecx, 76(%rdi)
  463. L_chacha_x64_done:
  464. addq $0x40, %rsp
  465. popq %r15
  466. popq %r14
  467. popq %r13
  468. popq %r12
  469. popq %rbp
  470. popq %rbx
  471. repz retq
  472. #ifndef __APPLE__
  473. .size chacha_encrypt_x64,.-chacha_encrypt_x64
  474. #endif /* __APPLE__ */
  475. #ifdef HAVE_INTEL_AVX1
  476. #ifndef __APPLE__
  477. .data
  478. #else
  479. .section __DATA,__data
  480. #endif /* __APPLE__ */
  481. #ifndef __APPLE__
  482. .align 16
  483. #else
  484. .p2align 4
  485. #endif /* __APPLE__ */
  486. L_chacha20_avx1_rotl8:
  487. .quad 0x605040702010003, 0xe0d0c0f0a09080b
  488. #ifndef __APPLE__
  489. .data
  490. #else
  491. .section __DATA,__data
  492. #endif /* __APPLE__ */
  493. #ifndef __APPLE__
  494. .align 16
  495. #else
  496. .p2align 4
  497. #endif /* __APPLE__ */
  498. L_chacha20_avx1_rotl16:
  499. .quad 0x504070601000302, 0xd0c0f0e09080b0a
  500. #ifndef __APPLE__
  501. .data
  502. #else
  503. .section __DATA,__data
  504. #endif /* __APPLE__ */
  505. #ifndef __APPLE__
  506. .align 16
  507. #else
  508. .p2align 4
  509. #endif /* __APPLE__ */
  510. L_chacha20_avx1_add:
  511. .quad 0x100000000, 0x300000002
  512. #ifndef __APPLE__
  513. .data
  514. #else
  515. .section __DATA,__data
  516. #endif /* __APPLE__ */
  517. #ifndef __APPLE__
  518. .align 16
  519. #else
  520. .p2align 4
  521. #endif /* __APPLE__ */
  522. L_chacha20_avx1_four:
  523. .quad 0x400000004, 0x400000004
  524. #ifndef __APPLE__
  525. .text
  526. .globl chacha_encrypt_avx1
  527. .type chacha_encrypt_avx1,@function
  528. .align 16
  529. chacha_encrypt_avx1:
  530. #else
  531. .section __TEXT,__text
  532. .globl _chacha_encrypt_avx1
  533. .p2align 4
  534. _chacha_encrypt_avx1:
  535. #endif /* __APPLE__ */
  536. subq $0x190, %rsp
  537. movq %rsp, %r9
  538. leaq 256(%rsp), %r10
  539. andq $-16, %r9
  540. andq $-16, %r10
  541. movl %ecx, %eax
  542. shrl $8, %eax
  543. jz L_chacha20_avx1_end128
  544. vpshufd $0x00, (%rdi), %xmm0
  545. vpshufd $0x00, 4(%rdi), %xmm1
  546. vpshufd $0x00, 8(%rdi), %xmm2
  547. vpshufd $0x00, 12(%rdi), %xmm3
  548. vpshufd $0x00, 16(%rdi), %xmm4
  549. vpshufd $0x00, 20(%rdi), %xmm5
  550. vpshufd $0x00, 24(%rdi), %xmm6
  551. vpshufd $0x00, 28(%rdi), %xmm7
  552. vpshufd $0x00, 32(%rdi), %xmm8
  553. vpshufd $0x00, 36(%rdi), %xmm9
  554. vpshufd $0x00, 40(%rdi), %xmm10
  555. vpshufd $0x00, 44(%rdi), %xmm11
  556. vpshufd $0x00, 48(%rdi), %xmm12
  557. vpshufd $0x00, 52(%rdi), %xmm13
  558. vpshufd $0x00, 56(%rdi), %xmm14
  559. vpshufd $0x00, 60(%rdi), %xmm15
  560. vpaddd L_chacha20_avx1_add(%rip), %xmm12, %xmm12
  561. vmovdqa %xmm0, (%r9)
  562. vmovdqa %xmm1, 16(%r9)
  563. vmovdqa %xmm2, 32(%r9)
  564. vmovdqa %xmm3, 48(%r9)
  565. vmovdqa %xmm4, 64(%r9)
  566. vmovdqa %xmm5, 80(%r9)
  567. vmovdqa %xmm6, 96(%r9)
  568. vmovdqa %xmm7, 112(%r9)
  569. vmovdqa %xmm8, 128(%r9)
  570. vmovdqa %xmm9, 144(%r9)
  571. vmovdqa %xmm10, 160(%r9)
  572. vmovdqa %xmm11, 176(%r9)
  573. vmovdqa %xmm12, 192(%r9)
  574. vmovdqa %xmm13, 208(%r9)
  575. vmovdqa %xmm14, 224(%r9)
  576. vmovdqa %xmm15, 240(%r9)
  577. L_chacha20_avx1_start128:
  578. vmovdqa %xmm11, 48(%r10)
  579. movb $10, %r8b
  580. L_chacha20_avx1_loop128:
  581. vpaddd %xmm4, %xmm0, %xmm0
  582. vpxor %xmm0, %xmm12, %xmm12
  583. vmovdqa 48(%r10), %xmm11
  584. vpshufb L_chacha20_avx1_rotl16(%rip), %xmm12, %xmm12
  585. vpaddd %xmm12, %xmm8, %xmm8
  586. vpxor %xmm8, %xmm4, %xmm4
  587. vpaddd %xmm5, %xmm1, %xmm1
  588. vpxor %xmm1, %xmm13, %xmm13
  589. vpshufb L_chacha20_avx1_rotl16(%rip), %xmm13, %xmm13
  590. vpaddd %xmm13, %xmm9, %xmm9
  591. vpxor %xmm9, %xmm5, %xmm5
  592. vpaddd %xmm6, %xmm2, %xmm2
  593. vpxor %xmm2, %xmm14, %xmm14
  594. vpshufb L_chacha20_avx1_rotl16(%rip), %xmm14, %xmm14
  595. vpaddd %xmm14, %xmm10, %xmm10
  596. vpxor %xmm10, %xmm6, %xmm6
  597. vpaddd %xmm7, %xmm3, %xmm3
  598. vpxor %xmm3, %xmm15, %xmm15
  599. vpshufb L_chacha20_avx1_rotl16(%rip), %xmm15, %xmm15
  600. vpaddd %xmm15, %xmm11, %xmm11
  601. vpxor %xmm11, %xmm7, %xmm7
  602. vmovdqa %xmm11, 48(%r10)
  603. vpsrld $20, %xmm4, %xmm11
  604. vpslld $12, %xmm4, %xmm4
  605. vpxor %xmm11, %xmm4, %xmm4
  606. vpsrld $20, %xmm5, %xmm11
  607. vpslld $12, %xmm5, %xmm5
  608. vpxor %xmm11, %xmm5, %xmm5
  609. vpsrld $20, %xmm6, %xmm11
  610. vpslld $12, %xmm6, %xmm6
  611. vpxor %xmm11, %xmm6, %xmm6
  612. vpsrld $20, %xmm7, %xmm11
  613. vpslld $12, %xmm7, %xmm7
  614. vpxor %xmm11, %xmm7, %xmm7
  615. vpaddd %xmm4, %xmm0, %xmm0
  616. vpxor %xmm0, %xmm12, %xmm12
  617. vmovdqa 48(%r10), %xmm11
  618. vpshufb L_chacha20_avx1_rotl8(%rip), %xmm12, %xmm12
  619. vpaddd %xmm12, %xmm8, %xmm8
  620. vpxor %xmm8, %xmm4, %xmm4
  621. vpaddd %xmm5, %xmm1, %xmm1
  622. vpxor %xmm1, %xmm13, %xmm13
  623. vpshufb L_chacha20_avx1_rotl8(%rip), %xmm13, %xmm13
  624. vpaddd %xmm13, %xmm9, %xmm9
  625. vpxor %xmm9, %xmm5, %xmm5
  626. vpaddd %xmm6, %xmm2, %xmm2
  627. vpxor %xmm2, %xmm14, %xmm14
  628. vpshufb L_chacha20_avx1_rotl8(%rip), %xmm14, %xmm14
  629. vpaddd %xmm14, %xmm10, %xmm10
  630. vpxor %xmm10, %xmm6, %xmm6
  631. vpaddd %xmm7, %xmm3, %xmm3
  632. vpxor %xmm3, %xmm15, %xmm15
  633. vpshufb L_chacha20_avx1_rotl8(%rip), %xmm15, %xmm15
  634. vpaddd %xmm15, %xmm11, %xmm11
  635. vpxor %xmm11, %xmm7, %xmm7
  636. vmovdqa %xmm11, 48(%r10)
  637. vpsrld $25, %xmm4, %xmm11
  638. vpslld $7, %xmm4, %xmm4
  639. vpxor %xmm11, %xmm4, %xmm4
  640. vpsrld $25, %xmm5, %xmm11
  641. vpslld $7, %xmm5, %xmm5
  642. vpxor %xmm11, %xmm5, %xmm5
  643. vpsrld $25, %xmm6, %xmm11
  644. vpslld $7, %xmm6, %xmm6
  645. vpxor %xmm11, %xmm6, %xmm6
  646. vpsrld $25, %xmm7, %xmm11
  647. vpslld $7, %xmm7, %xmm7
  648. vpxor %xmm11, %xmm7, %xmm7
  649. vpaddd %xmm5, %xmm0, %xmm0
  650. vpxor %xmm0, %xmm15, %xmm15
  651. vmovdqa 48(%r10), %xmm11
  652. vpshufb L_chacha20_avx1_rotl16(%rip), %xmm15, %xmm15
  653. vpaddd %xmm15, %xmm10, %xmm10
  654. vpxor %xmm10, %xmm5, %xmm5
  655. vpaddd %xmm6, %xmm1, %xmm1
  656. vpxor %xmm1, %xmm12, %xmm12
  657. vpshufb L_chacha20_avx1_rotl16(%rip), %xmm12, %xmm12
  658. vpaddd %xmm12, %xmm11, %xmm11
  659. vpxor %xmm11, %xmm6, %xmm6
  660. vpaddd %xmm7, %xmm2, %xmm2
  661. vpxor %xmm2, %xmm13, %xmm13
  662. vpshufb L_chacha20_avx1_rotl16(%rip), %xmm13, %xmm13
  663. vpaddd %xmm13, %xmm8, %xmm8
  664. vpxor %xmm8, %xmm7, %xmm7
  665. vpaddd %xmm4, %xmm3, %xmm3
  666. vpxor %xmm3, %xmm14, %xmm14
  667. vpshufb L_chacha20_avx1_rotl16(%rip), %xmm14, %xmm14
  668. vpaddd %xmm14, %xmm9, %xmm9
  669. vpxor %xmm9, %xmm4, %xmm4
  670. vmovdqa %xmm11, 48(%r10)
  671. vpsrld $20, %xmm5, %xmm11
  672. vpslld $12, %xmm5, %xmm5
  673. vpxor %xmm11, %xmm5, %xmm5
  674. vpsrld $20, %xmm6, %xmm11
  675. vpslld $12, %xmm6, %xmm6
  676. vpxor %xmm11, %xmm6, %xmm6
  677. vpsrld $20, %xmm7, %xmm11
  678. vpslld $12, %xmm7, %xmm7
  679. vpxor %xmm11, %xmm7, %xmm7
  680. vpsrld $20, %xmm4, %xmm11
  681. vpslld $12, %xmm4, %xmm4
  682. vpxor %xmm11, %xmm4, %xmm4
  683. vpaddd %xmm5, %xmm0, %xmm0
  684. vpxor %xmm0, %xmm15, %xmm15
  685. vmovdqa 48(%r10), %xmm11
  686. vpshufb L_chacha20_avx1_rotl8(%rip), %xmm15, %xmm15
  687. vpaddd %xmm15, %xmm10, %xmm10
  688. vpxor %xmm10, %xmm5, %xmm5
  689. vpaddd %xmm6, %xmm1, %xmm1
  690. vpxor %xmm1, %xmm12, %xmm12
  691. vpshufb L_chacha20_avx1_rotl8(%rip), %xmm12, %xmm12
  692. vpaddd %xmm12, %xmm11, %xmm11
  693. vpxor %xmm11, %xmm6, %xmm6
  694. vpaddd %xmm7, %xmm2, %xmm2
  695. vpxor %xmm2, %xmm13, %xmm13
  696. vpshufb L_chacha20_avx1_rotl8(%rip), %xmm13, %xmm13
  697. vpaddd %xmm13, %xmm8, %xmm8
  698. vpxor %xmm8, %xmm7, %xmm7
  699. vpaddd %xmm4, %xmm3, %xmm3
  700. vpxor %xmm3, %xmm14, %xmm14
  701. vpshufb L_chacha20_avx1_rotl8(%rip), %xmm14, %xmm14
  702. vpaddd %xmm14, %xmm9, %xmm9
  703. vpxor %xmm9, %xmm4, %xmm4
  704. vmovdqa %xmm11, 48(%r10)
  705. vpsrld $25, %xmm5, %xmm11
  706. vpslld $7, %xmm5, %xmm5
  707. vpxor %xmm11, %xmm5, %xmm5
  708. vpsrld $25, %xmm6, %xmm11
  709. vpslld $7, %xmm6, %xmm6
  710. vpxor %xmm11, %xmm6, %xmm6
  711. vpsrld $25, %xmm7, %xmm11
  712. vpslld $7, %xmm7, %xmm7
  713. vpxor %xmm11, %xmm7, %xmm7
  714. vpsrld $25, %xmm4, %xmm11
  715. vpslld $7, %xmm4, %xmm4
  716. vpxor %xmm11, %xmm4, %xmm4
  717. decb %r8b
  718. jnz L_chacha20_avx1_loop128
  719. vmovdqa 48(%r10), %xmm11
  720. vpaddd (%r9), %xmm0, %xmm0
  721. vpaddd 16(%r9), %xmm1, %xmm1
  722. vpaddd 32(%r9), %xmm2, %xmm2
  723. vpaddd 48(%r9), %xmm3, %xmm3
  724. vpaddd 64(%r9), %xmm4, %xmm4
  725. vpaddd 80(%r9), %xmm5, %xmm5
  726. vpaddd 96(%r9), %xmm6, %xmm6
  727. vpaddd 112(%r9), %xmm7, %xmm7
  728. vpaddd 128(%r9), %xmm8, %xmm8
  729. vpaddd 144(%r9), %xmm9, %xmm9
  730. vpaddd 160(%r9), %xmm10, %xmm10
  731. vpaddd 176(%r9), %xmm11, %xmm11
  732. vpaddd 192(%r9), %xmm12, %xmm12
  733. vpaddd 208(%r9), %xmm13, %xmm13
  734. vpaddd 224(%r9), %xmm14, %xmm14
  735. vpaddd 240(%r9), %xmm15, %xmm15
  736. vmovdqa %xmm8, (%r10)
  737. vmovdqa %xmm9, 16(%r10)
  738. vmovdqa %xmm10, 32(%r10)
  739. vmovdqa %xmm11, 48(%r10)
  740. vmovdqa %xmm12, 64(%r10)
  741. vmovdqa %xmm13, 80(%r10)
  742. vmovdqa %xmm14, 96(%r10)
  743. vmovdqa %xmm15, 112(%r10)
  744. vpunpckldq %xmm1, %xmm0, %xmm8
  745. vpunpckldq %xmm3, %xmm2, %xmm9
  746. vpunpckhdq %xmm1, %xmm0, %xmm12
  747. vpunpckhdq %xmm3, %xmm2, %xmm13
  748. vpunpckldq %xmm5, %xmm4, %xmm10
  749. vpunpckldq %xmm7, %xmm6, %xmm11
  750. vpunpckhdq %xmm5, %xmm4, %xmm14
  751. vpunpckhdq %xmm7, %xmm6, %xmm15
  752. vpunpcklqdq %xmm9, %xmm8, %xmm0
  753. vpunpcklqdq %xmm11, %xmm10, %xmm1
  754. vpunpckhqdq %xmm9, %xmm8, %xmm2
  755. vpunpckhqdq %xmm11, %xmm10, %xmm3
  756. vpunpcklqdq %xmm13, %xmm12, %xmm4
  757. vpunpcklqdq %xmm15, %xmm14, %xmm5
  758. vpunpckhqdq %xmm13, %xmm12, %xmm6
  759. vpunpckhqdq %xmm15, %xmm14, %xmm7
  760. vmovdqu (%rsi), %xmm8
  761. vmovdqu 16(%rsi), %xmm9
  762. vmovdqu 64(%rsi), %xmm10
  763. vmovdqu 80(%rsi), %xmm11
  764. vmovdqu 128(%rsi), %xmm12
  765. vmovdqu 144(%rsi), %xmm13
  766. vmovdqu 192(%rsi), %xmm14
  767. vmovdqu 208(%rsi), %xmm15
  768. vpxor %xmm8, %xmm0, %xmm0
  769. vpxor %xmm9, %xmm1, %xmm1
  770. vpxor %xmm10, %xmm2, %xmm2
  771. vpxor %xmm11, %xmm3, %xmm3
  772. vpxor %xmm12, %xmm4, %xmm4
  773. vpxor %xmm13, %xmm5, %xmm5
  774. vpxor %xmm14, %xmm6, %xmm6
  775. vpxor %xmm15, %xmm7, %xmm7
  776. vmovdqu %xmm0, (%rdx)
  777. vmovdqu %xmm1, 16(%rdx)
  778. vmovdqu %xmm2, 64(%rdx)
  779. vmovdqu %xmm3, 80(%rdx)
  780. vmovdqu %xmm4, 128(%rdx)
  781. vmovdqu %xmm5, 144(%rdx)
  782. vmovdqu %xmm6, 192(%rdx)
  783. vmovdqu %xmm7, 208(%rdx)
  784. vmovdqa (%r10), %xmm0
  785. vmovdqa 16(%r10), %xmm1
  786. vmovdqa 32(%r10), %xmm2
  787. vmovdqa 48(%r10), %xmm3
  788. vmovdqa 64(%r10), %xmm4
  789. vmovdqa 80(%r10), %xmm5
  790. vmovdqa 96(%r10), %xmm6
  791. vmovdqa 112(%r10), %xmm7
  792. vpunpckldq %xmm1, %xmm0, %xmm8
  793. vpunpckldq %xmm3, %xmm2, %xmm9
  794. vpunpckhdq %xmm1, %xmm0, %xmm12
  795. vpunpckhdq %xmm3, %xmm2, %xmm13
  796. vpunpckldq %xmm5, %xmm4, %xmm10
  797. vpunpckldq %xmm7, %xmm6, %xmm11
  798. vpunpckhdq %xmm5, %xmm4, %xmm14
  799. vpunpckhdq %xmm7, %xmm6, %xmm15
  800. vpunpcklqdq %xmm9, %xmm8, %xmm0
  801. vpunpcklqdq %xmm11, %xmm10, %xmm1
  802. vpunpckhqdq %xmm9, %xmm8, %xmm2
  803. vpunpckhqdq %xmm11, %xmm10, %xmm3
  804. vpunpcklqdq %xmm13, %xmm12, %xmm4
  805. vpunpcklqdq %xmm15, %xmm14, %xmm5
  806. vpunpckhqdq %xmm13, %xmm12, %xmm6
  807. vpunpckhqdq %xmm15, %xmm14, %xmm7
  808. vmovdqu 32(%rsi), %xmm8
  809. vmovdqu 48(%rsi), %xmm9
  810. vmovdqu 96(%rsi), %xmm10
  811. vmovdqu 112(%rsi), %xmm11
  812. vmovdqu 160(%rsi), %xmm12
  813. vmovdqu 176(%rsi), %xmm13
  814. vmovdqu 224(%rsi), %xmm14
  815. vmovdqu 240(%rsi), %xmm15
  816. vpxor %xmm8, %xmm0, %xmm0
  817. vpxor %xmm9, %xmm1, %xmm1
  818. vpxor %xmm10, %xmm2, %xmm2
  819. vpxor %xmm11, %xmm3, %xmm3
  820. vpxor %xmm12, %xmm4, %xmm4
  821. vpxor %xmm13, %xmm5, %xmm5
  822. vpxor %xmm14, %xmm6, %xmm6
  823. vpxor %xmm15, %xmm7, %xmm7
  824. vmovdqu %xmm0, 32(%rdx)
  825. vmovdqu %xmm1, 48(%rdx)
  826. vmovdqu %xmm2, 96(%rdx)
  827. vmovdqu %xmm3, 112(%rdx)
  828. vmovdqu %xmm4, 160(%rdx)
  829. vmovdqu %xmm5, 176(%rdx)
  830. vmovdqu %xmm6, 224(%rdx)
  831. vmovdqu %xmm7, 240(%rdx)
  832. vmovdqa 192(%r9), %xmm12
  833. addq $0x100, %rsi
  834. addq $0x100, %rdx
  835. vpaddd L_chacha20_avx1_four(%rip), %xmm12, %xmm12
  836. subl $0x100, %ecx
  837. vmovdqa %xmm12, 192(%r9)
  838. cmpl $0x100, %ecx
  839. jl L_chacha20_avx1_done128
  840. vmovdqa (%r9), %xmm0
  841. vmovdqa 16(%r9), %xmm1
  842. vmovdqa 32(%r9), %xmm2
  843. vmovdqa 48(%r9), %xmm3
  844. vmovdqa 64(%r9), %xmm4
  845. vmovdqa 80(%r9), %xmm5
  846. vmovdqa 96(%r9), %xmm6
  847. vmovdqa 112(%r9), %xmm7
  848. vmovdqa 128(%r9), %xmm8
  849. vmovdqa 144(%r9), %xmm9
  850. vmovdqa 160(%r9), %xmm10
  851. vmovdqa 176(%r9), %xmm11
  852. vmovdqa 192(%r9), %xmm12
  853. vmovdqa 208(%r9), %xmm13
  854. vmovdqa 224(%r9), %xmm14
  855. vmovdqa 240(%r9), %xmm15
  856. jmp L_chacha20_avx1_start128
  857. L_chacha20_avx1_done128:
  858. shl $2, %eax
  859. addl %eax, 48(%rdi)
  860. L_chacha20_avx1_end128:
  861. cmpl $0x40, %ecx
  862. jl L_chacha20_avx1_block_done
  863. L_chacha20_avx1_block_start:
  864. vmovdqu (%rdi), %xmm0
  865. vmovdqu 16(%rdi), %xmm1
  866. vmovdqu 32(%rdi), %xmm2
  867. vmovdqu 48(%rdi), %xmm3
  868. vmovdqa %xmm0, %xmm5
  869. vmovdqa %xmm1, %xmm6
  870. vmovdqa %xmm2, %xmm7
  871. vmovdqa %xmm3, %xmm8
  872. movb $10, %al
  873. L_chacha20_avx1_block_crypt_start:
  874. vpaddd %xmm1, %xmm0, %xmm0
  875. vpxor %xmm0, %xmm3, %xmm3
  876. vpshufb L_chacha20_avx1_rotl16(%rip), %xmm3, %xmm3
  877. vpaddd %xmm3, %xmm2, %xmm2
  878. vpxor %xmm2, %xmm1, %xmm1
  879. vpsrld $20, %xmm1, %xmm4
  880. vpslld $12, %xmm1, %xmm1
  881. vpxor %xmm4, %xmm1, %xmm1
  882. vpaddd %xmm1, %xmm0, %xmm0
  883. vpxor %xmm0, %xmm3, %xmm3
  884. vpshufb L_chacha20_avx1_rotl8(%rip), %xmm3, %xmm3
  885. vpaddd %xmm3, %xmm2, %xmm2
  886. vpxor %xmm2, %xmm1, %xmm1
  887. vpsrld $25, %xmm1, %xmm4
  888. vpslld $7, %xmm1, %xmm1
  889. vpxor %xmm4, %xmm1, %xmm1
  890. vpshufd $57, %xmm1, %xmm1
  891. vpshufd $0x4e, %xmm2, %xmm2
  892. vpshufd $0x93, %xmm3, %xmm3
  893. vpaddd %xmm1, %xmm0, %xmm0
  894. vpxor %xmm0, %xmm3, %xmm3
  895. vpshufb L_chacha20_avx1_rotl16(%rip), %xmm3, %xmm3
  896. vpaddd %xmm3, %xmm2, %xmm2
  897. vpxor %xmm2, %xmm1, %xmm1
  898. vpsrld $20, %xmm1, %xmm4
  899. vpslld $12, %xmm1, %xmm1
  900. vpxor %xmm4, %xmm1, %xmm1
  901. vpaddd %xmm1, %xmm0, %xmm0
  902. vpxor %xmm0, %xmm3, %xmm3
  903. vpshufb L_chacha20_avx1_rotl8(%rip), %xmm3, %xmm3
  904. vpaddd %xmm3, %xmm2, %xmm2
  905. vpxor %xmm2, %xmm1, %xmm1
  906. vpsrld $25, %xmm1, %xmm4
  907. vpslld $7, %xmm1, %xmm1
  908. vpxor %xmm4, %xmm1, %xmm1
  909. vpshufd $0x93, %xmm1, %xmm1
  910. vpshufd $0x4e, %xmm2, %xmm2
  911. vpshufd $57, %xmm3, %xmm3
  912. decb %al
  913. jnz L_chacha20_avx1_block_crypt_start
  914. vpaddd %xmm5, %xmm0, %xmm0
  915. vpaddd %xmm6, %xmm1, %xmm1
  916. vpaddd %xmm7, %xmm2, %xmm2
  917. vpaddd %xmm8, %xmm3, %xmm3
  918. vmovdqu (%rsi), %xmm5
  919. vmovdqu 16(%rsi), %xmm6
  920. vmovdqu 32(%rsi), %xmm7
  921. vmovdqu 48(%rsi), %xmm8
  922. vpxor %xmm5, %xmm0, %xmm0
  923. vpxor %xmm6, %xmm1, %xmm1
  924. vpxor %xmm7, %xmm2, %xmm2
  925. vpxor %xmm8, %xmm3, %xmm3
  926. vmovdqu %xmm0, (%rdx)
  927. vmovdqu %xmm1, 16(%rdx)
  928. vmovdqu %xmm2, 32(%rdx)
  929. vmovdqu %xmm3, 48(%rdx)
  930. addl $0x01, 48(%rdi)
  931. subl $0x40, %ecx
  932. addq $0x40, %rsi
  933. addq $0x40, %rdx
  934. cmpl $0x40, %ecx
  935. jge L_chacha20_avx1_block_start
  936. L_chacha20_avx1_block_done:
  937. cmpl $0x00, %ecx
  938. je L_chacha20_avx1_partial_done
  939. leaq 80(%rdi), %r10
  940. vmovdqu (%rdi), %xmm0
  941. vmovdqu 16(%rdi), %xmm1
  942. vmovdqu 32(%rdi), %xmm2
  943. vmovdqu 48(%rdi), %xmm3
  944. vmovdqa %xmm0, %xmm5
  945. vmovdqa %xmm1, %xmm6
  946. vmovdqa %xmm2, %xmm7
  947. vmovdqa %xmm3, %xmm8
  948. movb $10, %al
  949. L_chacha20_avx1_partial_crypt_start:
  950. vpaddd %xmm1, %xmm0, %xmm0
  951. vpxor %xmm0, %xmm3, %xmm3
  952. vpshufb L_chacha20_avx1_rotl16(%rip), %xmm3, %xmm3
  953. vpaddd %xmm3, %xmm2, %xmm2
  954. vpxor %xmm2, %xmm1, %xmm1
  955. vpsrld $20, %xmm1, %xmm4
  956. vpslld $12, %xmm1, %xmm1
  957. vpxor %xmm4, %xmm1, %xmm1
  958. vpaddd %xmm1, %xmm0, %xmm0
  959. vpxor %xmm0, %xmm3, %xmm3
  960. vpshufb L_chacha20_avx1_rotl8(%rip), %xmm3, %xmm3
  961. vpaddd %xmm3, %xmm2, %xmm2
  962. vpxor %xmm2, %xmm1, %xmm1
  963. vpsrld $25, %xmm1, %xmm4
  964. vpslld $7, %xmm1, %xmm1
  965. vpxor %xmm4, %xmm1, %xmm1
  966. vpshufd $57, %xmm1, %xmm1
  967. vpshufd $0x4e, %xmm2, %xmm2
  968. vpshufd $0x93, %xmm3, %xmm3
  969. vpaddd %xmm1, %xmm0, %xmm0
  970. vpxor %xmm0, %xmm3, %xmm3
  971. vpshufb L_chacha20_avx1_rotl16(%rip), %xmm3, %xmm3
  972. vpaddd %xmm3, %xmm2, %xmm2
  973. vpxor %xmm2, %xmm1, %xmm1
  974. vpsrld $20, %xmm1, %xmm4
  975. vpslld $12, %xmm1, %xmm1
  976. vpxor %xmm4, %xmm1, %xmm1
  977. vpaddd %xmm1, %xmm0, %xmm0
  978. vpxor %xmm0, %xmm3, %xmm3
  979. vpshufb L_chacha20_avx1_rotl8(%rip), %xmm3, %xmm3
  980. vpaddd %xmm3, %xmm2, %xmm2
  981. vpxor %xmm2, %xmm1, %xmm1
  982. vpsrld $25, %xmm1, %xmm4
  983. vpslld $7, %xmm1, %xmm1
  984. vpxor %xmm4, %xmm1, %xmm1
  985. vpshufd $0x93, %xmm1, %xmm1
  986. vpshufd $0x4e, %xmm2, %xmm2
  987. vpshufd $57, %xmm3, %xmm3
  988. decb %al
  989. jnz L_chacha20_avx1_partial_crypt_start
  990. vpaddd %xmm5, %xmm0, %xmm0
  991. vpaddd %xmm6, %xmm1, %xmm1
  992. vpaddd %xmm7, %xmm2, %xmm2
  993. vpaddd %xmm8, %xmm3, %xmm3
  994. vmovdqu %xmm0, (%r10)
  995. vmovdqu %xmm1, 16(%r10)
  996. vmovdqu %xmm2, 32(%r10)
  997. vmovdqu %xmm3, 48(%r10)
  998. addl $0x01, 48(%rdi)
  999. movl %ecx, %r8d
  1000. xorq %r11, %r11
  1001. andl $7, %r8d
  1002. jz L_chacha20_avx1_partial_start64
  1003. L_chacha20_avx1_partial_start8:
  1004. movzbl (%r10,%r11,1), %eax
  1005. xorb (%rsi,%r11,1), %al
  1006. movb %al, (%rdx,%r11,1)
  1007. incl %r11d
  1008. cmpl %r8d, %r11d
  1009. jne L_chacha20_avx1_partial_start8
  1010. je L_chacha20_avx1_partial_end64
  1011. L_chacha20_avx1_partial_start64:
  1012. movq (%r10,%r11,1), %rax
  1013. xorq (%rsi,%r11,1), %rax
  1014. movq %rax, (%rdx,%r11,1)
  1015. addl $8, %r11d
  1016. L_chacha20_avx1_partial_end64:
  1017. cmpl %ecx, %r11d
  1018. jne L_chacha20_avx1_partial_start64
  1019. movl $0x40, %r8d
  1020. subl %r11d, %r8d
  1021. movl %r8d, 76(%rdi)
  1022. L_chacha20_avx1_partial_done:
  1023. addq $0x190, %rsp
  1024. repz retq
  1025. #ifndef __APPLE__
  1026. .size chacha_encrypt_avx1,.-chacha_encrypt_avx1
  1027. #endif /* __APPLE__ */
  1028. #endif /* HAVE_INTEL_AVX1 */
  1029. #ifdef HAVE_INTEL_AVX2
  1030. #ifndef __APPLE__
  1031. .data
  1032. #else
  1033. .section __DATA,__data
  1034. #endif /* __APPLE__ */
  1035. #ifndef __APPLE__
  1036. .align 32
  1037. #else
  1038. .p2align 5
  1039. #endif /* __APPLE__ */
  1040. L_chacha20_avx2_rotl8:
  1041. .quad 0x605040702010003, 0xe0d0c0f0a09080b
  1042. .quad 0x605040702010003, 0xe0d0c0f0a09080b
  1043. #ifndef __APPLE__
  1044. .data
  1045. #else
  1046. .section __DATA,__data
  1047. #endif /* __APPLE__ */
  1048. #ifndef __APPLE__
  1049. .align 32
  1050. #else
  1051. .p2align 5
  1052. #endif /* __APPLE__ */
  1053. L_chacha20_avx2_rotl16:
  1054. .quad 0x504070601000302, 0xd0c0f0e09080b0a
  1055. .quad 0x504070601000302, 0xd0c0f0e09080b0a
  1056. #ifndef __APPLE__
  1057. .data
  1058. #else
  1059. .section __DATA,__data
  1060. #endif /* __APPLE__ */
  1061. #ifndef __APPLE__
  1062. .align 32
  1063. #else
  1064. .p2align 5
  1065. #endif /* __APPLE__ */
  1066. L_chacha20_avx2_add:
  1067. .quad 0x100000000, 0x300000002
  1068. .quad 0x500000004, 0x700000006
  1069. #ifndef __APPLE__
  1070. .data
  1071. #else
  1072. .section __DATA,__data
  1073. #endif /* __APPLE__ */
  1074. #ifndef __APPLE__
  1075. .align 32
  1076. #else
  1077. .p2align 5
  1078. #endif /* __APPLE__ */
  1079. L_chacha20_avx2_eight:
  1080. .quad 0x800000008, 0x800000008
  1081. .quad 0x800000008, 0x800000008
  1082. #ifndef __APPLE__
  1083. .text
  1084. .globl chacha_encrypt_avx2
  1085. .type chacha_encrypt_avx2,@function
  1086. .align 16
  1087. chacha_encrypt_avx2:
  1088. #else
  1089. .section __TEXT,__text
  1090. .globl _chacha_encrypt_avx2
  1091. .p2align 4
  1092. _chacha_encrypt_avx2:
  1093. #endif /* __APPLE__ */
  1094. subq $0x310, %rsp
  1095. movq %rsp, %r9
  1096. leaq 512(%rsp), %r10
  1097. andq $-32, %r9
  1098. andq $-32, %r10
  1099. movl %ecx, %eax
  1100. shrl $9, %eax
  1101. jz L_chacha20_avx2_end256
  1102. vpbroadcastd (%rdi), %ymm0
  1103. vpbroadcastd 4(%rdi), %ymm1
  1104. vpbroadcastd 8(%rdi), %ymm2
  1105. vpbroadcastd 12(%rdi), %ymm3
  1106. vpbroadcastd 16(%rdi), %ymm4
  1107. vpbroadcastd 20(%rdi), %ymm5
  1108. vpbroadcastd 24(%rdi), %ymm6
  1109. vpbroadcastd 28(%rdi), %ymm7
  1110. vpbroadcastd 32(%rdi), %ymm8
  1111. vpbroadcastd 36(%rdi), %ymm9
  1112. vpbroadcastd 40(%rdi), %ymm10
  1113. vpbroadcastd 44(%rdi), %ymm11
  1114. vpbroadcastd 48(%rdi), %ymm12
  1115. vpbroadcastd 52(%rdi), %ymm13
  1116. vpbroadcastd 56(%rdi), %ymm14
  1117. vpbroadcastd 60(%rdi), %ymm15
  1118. vpaddd L_chacha20_avx2_add(%rip), %ymm12, %ymm12
  1119. vmovdqa %ymm0, (%r9)
  1120. vmovdqa %ymm1, 32(%r9)
  1121. vmovdqa %ymm2, 64(%r9)
  1122. vmovdqa %ymm3, 96(%r9)
  1123. vmovdqa %ymm4, 128(%r9)
  1124. vmovdqa %ymm5, 160(%r9)
  1125. vmovdqa %ymm6, 192(%r9)
  1126. vmovdqa %ymm7, 224(%r9)
  1127. vmovdqa %ymm8, 256(%r9)
  1128. vmovdqa %ymm9, 288(%r9)
  1129. vmovdqa %ymm10, 320(%r9)
  1130. vmovdqa %ymm11, 352(%r9)
  1131. vmovdqa %ymm12, 384(%r9)
  1132. vmovdqa %ymm13, 416(%r9)
  1133. vmovdqa %ymm14, 448(%r9)
  1134. vmovdqa %ymm15, 480(%r9)
  1135. L_chacha20_avx2_start256:
  1136. movb $10, %r8b
  1137. vmovdqa %ymm11, 96(%r10)
  1138. L_chacha20_avx2_loop256:
  1139. vpaddd %ymm4, %ymm0, %ymm0
  1140. vpxor %ymm0, %ymm12, %ymm12
  1141. vmovdqa 96(%r10), %ymm11
  1142. vpshufb L_chacha20_avx2_rotl16(%rip), %ymm12, %ymm12
  1143. vpaddd %ymm12, %ymm8, %ymm8
  1144. vpxor %ymm8, %ymm4, %ymm4
  1145. vpaddd %ymm5, %ymm1, %ymm1
  1146. vpxor %ymm1, %ymm13, %ymm13
  1147. vpshufb L_chacha20_avx2_rotl16(%rip), %ymm13, %ymm13
  1148. vpaddd %ymm13, %ymm9, %ymm9
  1149. vpxor %ymm9, %ymm5, %ymm5
  1150. vpaddd %ymm6, %ymm2, %ymm2
  1151. vpxor %ymm2, %ymm14, %ymm14
  1152. vpshufb L_chacha20_avx2_rotl16(%rip), %ymm14, %ymm14
  1153. vpaddd %ymm14, %ymm10, %ymm10
  1154. vpxor %ymm10, %ymm6, %ymm6
  1155. vpaddd %ymm7, %ymm3, %ymm3
  1156. vpxor %ymm3, %ymm15, %ymm15
  1157. vpshufb L_chacha20_avx2_rotl16(%rip), %ymm15, %ymm15
  1158. vpaddd %ymm15, %ymm11, %ymm11
  1159. vpxor %ymm11, %ymm7, %ymm7
  1160. vmovdqa %ymm11, 96(%r10)
  1161. vpsrld $20, %ymm4, %ymm11
  1162. vpslld $12, %ymm4, %ymm4
  1163. vpxor %ymm11, %ymm4, %ymm4
  1164. vpsrld $20, %ymm5, %ymm11
  1165. vpslld $12, %ymm5, %ymm5
  1166. vpxor %ymm11, %ymm5, %ymm5
  1167. vpsrld $20, %ymm6, %ymm11
  1168. vpslld $12, %ymm6, %ymm6
  1169. vpxor %ymm11, %ymm6, %ymm6
  1170. vpsrld $20, %ymm7, %ymm11
  1171. vpslld $12, %ymm7, %ymm7
  1172. vpxor %ymm11, %ymm7, %ymm7
  1173. vpaddd %ymm4, %ymm0, %ymm0
  1174. vpxor %ymm0, %ymm12, %ymm12
  1175. vmovdqa 96(%r10), %ymm11
  1176. vpshufb L_chacha20_avx2_rotl8(%rip), %ymm12, %ymm12
  1177. vpaddd %ymm12, %ymm8, %ymm8
  1178. vpxor %ymm8, %ymm4, %ymm4
  1179. vpaddd %ymm5, %ymm1, %ymm1
  1180. vpxor %ymm1, %ymm13, %ymm13
  1181. vpshufb L_chacha20_avx2_rotl8(%rip), %ymm13, %ymm13
  1182. vpaddd %ymm13, %ymm9, %ymm9
  1183. vpxor %ymm9, %ymm5, %ymm5
  1184. vpaddd %ymm6, %ymm2, %ymm2
  1185. vpxor %ymm2, %ymm14, %ymm14
  1186. vpshufb L_chacha20_avx2_rotl8(%rip), %ymm14, %ymm14
  1187. vpaddd %ymm14, %ymm10, %ymm10
  1188. vpxor %ymm10, %ymm6, %ymm6
  1189. vpaddd %ymm7, %ymm3, %ymm3
  1190. vpxor %ymm3, %ymm15, %ymm15
  1191. vpshufb L_chacha20_avx2_rotl8(%rip), %ymm15, %ymm15
  1192. vpaddd %ymm15, %ymm11, %ymm11
  1193. vpxor %ymm11, %ymm7, %ymm7
  1194. vmovdqa %ymm11, 96(%r10)
  1195. vpsrld $25, %ymm4, %ymm11
  1196. vpslld $7, %ymm4, %ymm4
  1197. vpxor %ymm11, %ymm4, %ymm4
  1198. vpsrld $25, %ymm5, %ymm11
  1199. vpslld $7, %ymm5, %ymm5
  1200. vpxor %ymm11, %ymm5, %ymm5
  1201. vpsrld $25, %ymm6, %ymm11
  1202. vpslld $7, %ymm6, %ymm6
  1203. vpxor %ymm11, %ymm6, %ymm6
  1204. vpsrld $25, %ymm7, %ymm11
  1205. vpslld $7, %ymm7, %ymm7
  1206. vpxor %ymm11, %ymm7, %ymm7
  1207. vpaddd %ymm5, %ymm0, %ymm0
  1208. vpxor %ymm0, %ymm15, %ymm15
  1209. vmovdqa 96(%r10), %ymm11
  1210. vpshufb L_chacha20_avx2_rotl16(%rip), %ymm15, %ymm15
  1211. vpaddd %ymm15, %ymm10, %ymm10
  1212. vpxor %ymm10, %ymm5, %ymm5
  1213. vpaddd %ymm6, %ymm1, %ymm1
  1214. vpxor %ymm1, %ymm12, %ymm12
  1215. vpshufb L_chacha20_avx2_rotl16(%rip), %ymm12, %ymm12
  1216. vpaddd %ymm12, %ymm11, %ymm11
  1217. vpxor %ymm11, %ymm6, %ymm6
  1218. vpaddd %ymm7, %ymm2, %ymm2
  1219. vpxor %ymm2, %ymm13, %ymm13
  1220. vpshufb L_chacha20_avx2_rotl16(%rip), %ymm13, %ymm13
  1221. vpaddd %ymm13, %ymm8, %ymm8
  1222. vpxor %ymm8, %ymm7, %ymm7
  1223. vpaddd %ymm4, %ymm3, %ymm3
  1224. vpxor %ymm3, %ymm14, %ymm14
  1225. vpshufb L_chacha20_avx2_rotl16(%rip), %ymm14, %ymm14
  1226. vpaddd %ymm14, %ymm9, %ymm9
  1227. vpxor %ymm9, %ymm4, %ymm4
  1228. vmovdqa %ymm11, 96(%r10)
  1229. vpsrld $20, %ymm5, %ymm11
  1230. vpslld $12, %ymm5, %ymm5
  1231. vpxor %ymm11, %ymm5, %ymm5
  1232. vpsrld $20, %ymm6, %ymm11
  1233. vpslld $12, %ymm6, %ymm6
  1234. vpxor %ymm11, %ymm6, %ymm6
  1235. vpsrld $20, %ymm7, %ymm11
  1236. vpslld $12, %ymm7, %ymm7
  1237. vpxor %ymm11, %ymm7, %ymm7
  1238. vpsrld $20, %ymm4, %ymm11
  1239. vpslld $12, %ymm4, %ymm4
  1240. vpxor %ymm11, %ymm4, %ymm4
  1241. vpaddd %ymm5, %ymm0, %ymm0
  1242. vpxor %ymm0, %ymm15, %ymm15
  1243. vmovdqa 96(%r10), %ymm11
  1244. vpshufb L_chacha20_avx2_rotl8(%rip), %ymm15, %ymm15
  1245. vpaddd %ymm15, %ymm10, %ymm10
  1246. vpxor %ymm10, %ymm5, %ymm5
  1247. vpaddd %ymm6, %ymm1, %ymm1
  1248. vpxor %ymm1, %ymm12, %ymm12
  1249. vpshufb L_chacha20_avx2_rotl8(%rip), %ymm12, %ymm12
  1250. vpaddd %ymm12, %ymm11, %ymm11
  1251. vpxor %ymm11, %ymm6, %ymm6
  1252. vpaddd %ymm7, %ymm2, %ymm2
  1253. vpxor %ymm2, %ymm13, %ymm13
  1254. vpshufb L_chacha20_avx2_rotl8(%rip), %ymm13, %ymm13
  1255. vpaddd %ymm13, %ymm8, %ymm8
  1256. vpxor %ymm8, %ymm7, %ymm7
  1257. vpaddd %ymm4, %ymm3, %ymm3
  1258. vpxor %ymm3, %ymm14, %ymm14
  1259. vpshufb L_chacha20_avx2_rotl8(%rip), %ymm14, %ymm14
  1260. vpaddd %ymm14, %ymm9, %ymm9
  1261. vpxor %ymm9, %ymm4, %ymm4
  1262. vmovdqa %ymm11, 96(%r10)
  1263. vpsrld $25, %ymm5, %ymm11
  1264. vpslld $7, %ymm5, %ymm5
  1265. vpxor %ymm11, %ymm5, %ymm5
  1266. vpsrld $25, %ymm6, %ymm11
  1267. vpslld $7, %ymm6, %ymm6
  1268. vpxor %ymm11, %ymm6, %ymm6
  1269. vpsrld $25, %ymm7, %ymm11
  1270. vpslld $7, %ymm7, %ymm7
  1271. vpxor %ymm11, %ymm7, %ymm7
  1272. vpsrld $25, %ymm4, %ymm11
  1273. vpslld $7, %ymm4, %ymm4
  1274. vpxor %ymm11, %ymm4, %ymm4
  1275. decb %r8b
  1276. jnz L_chacha20_avx2_loop256
  1277. vmovdqa 96(%r10), %ymm11
  1278. vpaddd (%r9), %ymm0, %ymm0
  1279. vpaddd 32(%r9), %ymm1, %ymm1
  1280. vpaddd 64(%r9), %ymm2, %ymm2
  1281. vpaddd 96(%r9), %ymm3, %ymm3
  1282. vpaddd 128(%r9), %ymm4, %ymm4
  1283. vpaddd 160(%r9), %ymm5, %ymm5
  1284. vpaddd 192(%r9), %ymm6, %ymm6
  1285. vpaddd 224(%r9), %ymm7, %ymm7
  1286. vpaddd 256(%r9), %ymm8, %ymm8
  1287. vpaddd 288(%r9), %ymm9, %ymm9
  1288. vpaddd 320(%r9), %ymm10, %ymm10
  1289. vpaddd 352(%r9), %ymm11, %ymm11
  1290. vpaddd 384(%r9), %ymm12, %ymm12
  1291. vpaddd 416(%r9), %ymm13, %ymm13
  1292. vpaddd 448(%r9), %ymm14, %ymm14
  1293. vpaddd 480(%r9), %ymm15, %ymm15
  1294. vmovdqa %ymm8, (%r10)
  1295. vmovdqa %ymm9, 32(%r10)
  1296. vmovdqa %ymm10, 64(%r10)
  1297. vmovdqa %ymm11, 96(%r10)
  1298. vmovdqa %ymm12, 128(%r10)
  1299. vmovdqa %ymm13, 160(%r10)
  1300. vmovdqa %ymm14, 192(%r10)
  1301. vmovdqa %ymm15, 224(%r10)
  1302. vpunpckldq %ymm1, %ymm0, %ymm8
  1303. vpunpckldq %ymm3, %ymm2, %ymm9
  1304. vpunpckhdq %ymm1, %ymm0, %ymm12
  1305. vpunpckhdq %ymm3, %ymm2, %ymm13
  1306. vpunpckldq %ymm5, %ymm4, %ymm10
  1307. vpunpckldq %ymm7, %ymm6, %ymm11
  1308. vpunpckhdq %ymm5, %ymm4, %ymm14
  1309. vpunpckhdq %ymm7, %ymm6, %ymm15
  1310. vpunpcklqdq %ymm9, %ymm8, %ymm0
  1311. vpunpcklqdq %ymm11, %ymm10, %ymm1
  1312. vpunpckhqdq %ymm9, %ymm8, %ymm2
  1313. vpunpckhqdq %ymm11, %ymm10, %ymm3
  1314. vpunpcklqdq %ymm13, %ymm12, %ymm4
  1315. vpunpcklqdq %ymm15, %ymm14, %ymm5
  1316. vpunpckhqdq %ymm13, %ymm12, %ymm6
  1317. vpunpckhqdq %ymm15, %ymm14, %ymm7
  1318. vperm2i128 $32, %ymm1, %ymm0, %ymm8
  1319. vperm2i128 $32, %ymm3, %ymm2, %ymm9
  1320. vperm2i128 $49, %ymm1, %ymm0, %ymm12
  1321. vperm2i128 $49, %ymm3, %ymm2, %ymm13
  1322. vperm2i128 $32, %ymm5, %ymm4, %ymm10
  1323. vperm2i128 $32, %ymm7, %ymm6, %ymm11
  1324. vperm2i128 $49, %ymm5, %ymm4, %ymm14
  1325. vperm2i128 $49, %ymm7, %ymm6, %ymm15
  1326. vmovdqu (%rsi), %ymm0
  1327. vmovdqu 64(%rsi), %ymm1
  1328. vmovdqu 128(%rsi), %ymm2
  1329. vmovdqu 192(%rsi), %ymm3
  1330. vmovdqu 256(%rsi), %ymm4
  1331. vmovdqu 320(%rsi), %ymm5
  1332. vmovdqu 384(%rsi), %ymm6
  1333. vmovdqu 448(%rsi), %ymm7
  1334. vpxor %ymm0, %ymm8, %ymm8
  1335. vpxor %ymm1, %ymm9, %ymm9
  1336. vpxor %ymm2, %ymm10, %ymm10
  1337. vpxor %ymm3, %ymm11, %ymm11
  1338. vpxor %ymm4, %ymm12, %ymm12
  1339. vpxor %ymm5, %ymm13, %ymm13
  1340. vpxor %ymm6, %ymm14, %ymm14
  1341. vpxor %ymm7, %ymm15, %ymm15
  1342. vmovdqu %ymm8, (%rdx)
  1343. vmovdqu %ymm9, 64(%rdx)
  1344. vmovdqu %ymm10, 128(%rdx)
  1345. vmovdqu %ymm11, 192(%rdx)
  1346. vmovdqu %ymm12, 256(%rdx)
  1347. vmovdqu %ymm13, 320(%rdx)
  1348. vmovdqu %ymm14, 384(%rdx)
  1349. vmovdqu %ymm15, 448(%rdx)
  1350. vmovdqa (%r10), %ymm0
  1351. vmovdqa 32(%r10), %ymm1
  1352. vmovdqa 64(%r10), %ymm2
  1353. vmovdqa 96(%r10), %ymm3
  1354. vmovdqa 128(%r10), %ymm4
  1355. vmovdqa 160(%r10), %ymm5
  1356. vmovdqa 192(%r10), %ymm6
  1357. vmovdqa 224(%r10), %ymm7
  1358. vpunpckldq %ymm1, %ymm0, %ymm8
  1359. vpunpckldq %ymm3, %ymm2, %ymm9
  1360. vpunpckhdq %ymm1, %ymm0, %ymm12
  1361. vpunpckhdq %ymm3, %ymm2, %ymm13
  1362. vpunpckldq %ymm5, %ymm4, %ymm10
  1363. vpunpckldq %ymm7, %ymm6, %ymm11
  1364. vpunpckhdq %ymm5, %ymm4, %ymm14
  1365. vpunpckhdq %ymm7, %ymm6, %ymm15
  1366. vpunpcklqdq %ymm9, %ymm8, %ymm0
  1367. vpunpcklqdq %ymm11, %ymm10, %ymm1
  1368. vpunpckhqdq %ymm9, %ymm8, %ymm2
  1369. vpunpckhqdq %ymm11, %ymm10, %ymm3
  1370. vpunpcklqdq %ymm13, %ymm12, %ymm4
  1371. vpunpcklqdq %ymm15, %ymm14, %ymm5
  1372. vpunpckhqdq %ymm13, %ymm12, %ymm6
  1373. vpunpckhqdq %ymm15, %ymm14, %ymm7
  1374. vperm2i128 $32, %ymm1, %ymm0, %ymm8
  1375. vperm2i128 $32, %ymm3, %ymm2, %ymm9
  1376. vperm2i128 $49, %ymm1, %ymm0, %ymm12
  1377. vperm2i128 $49, %ymm3, %ymm2, %ymm13
  1378. vperm2i128 $32, %ymm5, %ymm4, %ymm10
  1379. vperm2i128 $32, %ymm7, %ymm6, %ymm11
  1380. vperm2i128 $49, %ymm5, %ymm4, %ymm14
  1381. vperm2i128 $49, %ymm7, %ymm6, %ymm15
  1382. vmovdqu 32(%rsi), %ymm0
  1383. vmovdqu 96(%rsi), %ymm1
  1384. vmovdqu 160(%rsi), %ymm2
  1385. vmovdqu 224(%rsi), %ymm3
  1386. vmovdqu 288(%rsi), %ymm4
  1387. vmovdqu 352(%rsi), %ymm5
  1388. vmovdqu 416(%rsi), %ymm6
  1389. vmovdqu 480(%rsi), %ymm7
  1390. vpxor %ymm0, %ymm8, %ymm8
  1391. vpxor %ymm1, %ymm9, %ymm9
  1392. vpxor %ymm2, %ymm10, %ymm10
  1393. vpxor %ymm3, %ymm11, %ymm11
  1394. vpxor %ymm4, %ymm12, %ymm12
  1395. vpxor %ymm5, %ymm13, %ymm13
  1396. vpxor %ymm6, %ymm14, %ymm14
  1397. vpxor %ymm7, %ymm15, %ymm15
  1398. vmovdqu %ymm8, 32(%rdx)
  1399. vmovdqu %ymm9, 96(%rdx)
  1400. vmovdqu %ymm10, 160(%rdx)
  1401. vmovdqu %ymm11, 224(%rdx)
  1402. vmovdqu %ymm12, 288(%rdx)
  1403. vmovdqu %ymm13, 352(%rdx)
  1404. vmovdqu %ymm14, 416(%rdx)
  1405. vmovdqu %ymm15, 480(%rdx)
  1406. vmovdqa 384(%r9), %ymm12
  1407. addq $0x200, %rsi
  1408. addq $0x200, %rdx
  1409. vpaddd L_chacha20_avx2_eight(%rip), %ymm12, %ymm12
  1410. subl $0x200, %ecx
  1411. vmovdqa %ymm12, 384(%r9)
  1412. cmpl $0x200, %ecx
  1413. jl L_chacha20_avx2_done256
  1414. vmovdqa (%r9), %ymm0
  1415. vmovdqa 32(%r9), %ymm1
  1416. vmovdqa 64(%r9), %ymm2
  1417. vmovdqa 96(%r9), %ymm3
  1418. vmovdqa 128(%r9), %ymm4
  1419. vmovdqa 160(%r9), %ymm5
  1420. vmovdqa 192(%r9), %ymm6
  1421. vmovdqa 224(%r9), %ymm7
  1422. vmovdqa 256(%r9), %ymm8
  1423. vmovdqa 288(%r9), %ymm9
  1424. vmovdqa 320(%r9), %ymm10
  1425. vmovdqa 352(%r9), %ymm11
  1426. vmovdqa 384(%r9), %ymm12
  1427. vmovdqa 416(%r9), %ymm13
  1428. vmovdqa 448(%r9), %ymm14
  1429. vmovdqa 480(%r9), %ymm15
  1430. jmp L_chacha20_avx2_start256
  1431. L_chacha20_avx2_done256:
  1432. shl $3, %eax
  1433. addl %eax, 48(%rdi)
  1434. L_chacha20_avx2_end256:
  1435. #ifndef __APPLE__
  1436. callq chacha_encrypt_avx1@plt
  1437. #else
  1438. callq _chacha_encrypt_avx1
  1439. #endif /* __APPLE__ */
  1440. addq $0x310, %rsp
  1441. repz retq
  1442. #ifndef __APPLE__
  1443. .size chacha_encrypt_avx2,.-chacha_encrypt_avx2
  1444. #endif /* __APPLE__ */
  1445. #endif /* HAVE_INTEL_AVX2 */
  1446. #endif /* WOLFSSL_X86_64_BUILD */
  1447. #if defined(__linux__) && defined(__ELF__)
  1448. .section .note.GNU-stack,"",%progbits
  1449. #endif