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.

sse2.S 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  1. #include "macro.S"
  2. SECTION_TEXT
  3. GLOBAL_HIDDEN_FN chacha_blocks_sse2
  4. chacha_blocks_sse2_local:
  5. pushq %rbx
  6. pushq %rbp
  7. movq %rsp, %rbp
  8. andq $~63, %rsp
  9. subq $512, %rsp
  10. movq $0x3320646e61707865, %rax
  11. movq $0x6b20657479622d32, %r8
  12. movd %rax, %xmm8
  13. movd %r8, %xmm14
  14. punpcklqdq %xmm14, %xmm8
  15. movdqu 0(%rdi), %xmm9
  16. movdqu 16(%rdi), %xmm10
  17. movdqu 32(%rdi), %xmm11
  18. movq 48(%rdi), %rax
  19. movq $1, %r9
  20. movdqa %xmm8, 0(%rsp)
  21. movdqa %xmm9, 16(%rsp)
  22. movdqa %xmm10, 32(%rsp)
  23. movdqa %xmm11, 48(%rsp)
  24. movq %rax, 64(%rsp)
  25. cmpq $256, %rcx
  26. jb chacha_blocks_sse2_below256
  27. pshufd $0x00, %xmm8, %xmm0
  28. pshufd $0x55, %xmm8, %xmm1
  29. pshufd $0xaa, %xmm8, %xmm2
  30. pshufd $0xff, %xmm8, %xmm3
  31. movdqa %xmm0, 128(%rsp)
  32. movdqa %xmm1, 144(%rsp)
  33. movdqa %xmm2, 160(%rsp)
  34. movdqa %xmm3, 176(%rsp)
  35. pshufd $0x00, %xmm9, %xmm0
  36. pshufd $0x55, %xmm9, %xmm1
  37. pshufd $0xaa, %xmm9, %xmm2
  38. pshufd $0xff, %xmm9, %xmm3
  39. movdqa %xmm0, 192(%rsp)
  40. movdqa %xmm1, 208(%rsp)
  41. movdqa %xmm2, 224(%rsp)
  42. movdqa %xmm3, 240(%rsp)
  43. pshufd $0x00, %xmm10, %xmm0
  44. pshufd $0x55, %xmm10, %xmm1
  45. pshufd $0xaa, %xmm10, %xmm2
  46. pshufd $0xff, %xmm10, %xmm3
  47. movdqa %xmm0, 256(%rsp)
  48. movdqa %xmm1, 272(%rsp)
  49. movdqa %xmm2, 288(%rsp)
  50. movdqa %xmm3, 304(%rsp)
  51. pshufd $0xaa, %xmm11, %xmm0
  52. pshufd $0xff, %xmm11, %xmm1
  53. movdqa %xmm0, 352(%rsp)
  54. movdqa %xmm1, 368(%rsp)
  55. jmp chacha_blocks_sse2_atleast256
  56. .p2align 6,,63
  57. chacha_blocks_sse2_atleast256:
  58. movq 48(%rsp), %rax
  59. leaq 1(%rax), %r8
  60. leaq 2(%rax), %r9
  61. leaq 3(%rax), %r10
  62. leaq 4(%rax), %rbx
  63. movl %eax, 320(%rsp)
  64. movl %r8d, 4+320(%rsp)
  65. movl %r9d, 8+320(%rsp)
  66. movl %r10d, 12+320(%rsp)
  67. shrq $32, %rax
  68. shrq $32, %r8
  69. shrq $32, %r9
  70. shrq $32, %r10
  71. movl %eax, 336(%rsp)
  72. movl %r8d, 4+336(%rsp)
  73. movl %r9d, 8+336(%rsp)
  74. movl %r10d, 12+336(%rsp)
  75. movq %rbx, 48(%rsp)
  76. movq 64(%rsp), %rax
  77. movdqa 128(%rsp), %xmm0
  78. movdqa 144(%rsp), %xmm1
  79. movdqa 160(%rsp), %xmm2
  80. movdqa 176(%rsp), %xmm3
  81. movdqa 192(%rsp), %xmm4
  82. movdqa 208(%rsp), %xmm5
  83. movdqa 224(%rsp), %xmm6
  84. movdqa 240(%rsp), %xmm7
  85. movdqa 256(%rsp), %xmm8
  86. movdqa 272(%rsp), %xmm9
  87. movdqa 288(%rsp), %xmm10
  88. movdqa 304(%rsp), %xmm11
  89. movdqa 320(%rsp), %xmm12
  90. movdqa 336(%rsp), %xmm13
  91. movdqa 352(%rsp), %xmm14
  92. movdqa 368(%rsp), %xmm15
  93. chacha_blocks_sse2_mainloop1:
  94. paddd %xmm4, %xmm0
  95. paddd %xmm5, %xmm1
  96. pxor %xmm0, %xmm12
  97. pxor %xmm1, %xmm13
  98. paddd %xmm6, %xmm2
  99. paddd %xmm7, %xmm3
  100. movdqa %xmm6, 96(%rsp)
  101. pxor %xmm2, %xmm14
  102. pxor %xmm3, %xmm15
  103. pshuflw $0xb1,%xmm12,%xmm12
  104. pshufhw $0xb1,%xmm12,%xmm12
  105. pshuflw $0xb1,%xmm13,%xmm13
  106. pshufhw $0xb1,%xmm13,%xmm13
  107. pshuflw $0xb1,%xmm14,%xmm14
  108. pshufhw $0xb1,%xmm14,%xmm14
  109. pshuflw $0xb1,%xmm15,%xmm15
  110. pshufhw $0xb1,%xmm15,%xmm15
  111. paddd %xmm12, %xmm8
  112. paddd %xmm13, %xmm9
  113. paddd %xmm14, %xmm10
  114. paddd %xmm15, %xmm11
  115. movdqa %xmm12, 112(%rsp)
  116. pxor %xmm8, %xmm4
  117. pxor %xmm9, %xmm5
  118. movdqa 96(%rsp), %xmm6
  119. movdqa %xmm4, %xmm12
  120. pslld $ 12, %xmm4
  121. psrld $20, %xmm12
  122. pxor %xmm12, %xmm4
  123. movdqa %xmm5, %xmm12
  124. pslld $ 12, %xmm5
  125. psrld $20, %xmm12
  126. pxor %xmm12, %xmm5
  127. pxor %xmm10, %xmm6
  128. pxor %xmm11, %xmm7
  129. movdqa %xmm6, %xmm12
  130. pslld $ 12, %xmm6
  131. psrld $20, %xmm12
  132. pxor %xmm12, %xmm6
  133. movdqa %xmm7, %xmm12
  134. pslld $ 12, %xmm7
  135. psrld $20, %xmm12
  136. pxor %xmm12, %xmm7
  137. movdqa 112(%rsp), %xmm12
  138. paddd %xmm4, %xmm0
  139. paddd %xmm5, %xmm1
  140. pxor %xmm0, %xmm12
  141. pxor %xmm1, %xmm13
  142. paddd %xmm6, %xmm2
  143. paddd %xmm7, %xmm3
  144. movdqa %xmm6, 96(%rsp)
  145. pxor %xmm2, %xmm14
  146. pxor %xmm3, %xmm15
  147. movdqa %xmm12, %xmm6
  148. pslld $ 8, %xmm12
  149. psrld $24, %xmm6
  150. pxor %xmm6, %xmm12
  151. movdqa %xmm13, %xmm6
  152. pslld $ 8, %xmm13
  153. psrld $24, %xmm6
  154. pxor %xmm6, %xmm13
  155. paddd %xmm12, %xmm8
  156. paddd %xmm13, %xmm9
  157. movdqa %xmm14, %xmm6
  158. pslld $ 8, %xmm14
  159. psrld $24, %xmm6
  160. pxor %xmm6, %xmm14
  161. movdqa %xmm15, %xmm6
  162. pslld $ 8, %xmm15
  163. psrld $24, %xmm6
  164. pxor %xmm6, %xmm15
  165. paddd %xmm14, %xmm10
  166. paddd %xmm15, %xmm11
  167. movdqa %xmm12, 112(%rsp)
  168. pxor %xmm8, %xmm4
  169. pxor %xmm9, %xmm5
  170. movdqa 96(%rsp), %xmm6
  171. movdqa %xmm4, %xmm12
  172. pslld $ 7, %xmm4
  173. psrld $25, %xmm12
  174. pxor %xmm12, %xmm4
  175. movdqa %xmm5, %xmm12
  176. pslld $ 7, %xmm5
  177. psrld $25, %xmm12
  178. pxor %xmm12, %xmm5
  179. pxor %xmm10, %xmm6
  180. pxor %xmm11, %xmm7
  181. movdqa %xmm6, %xmm12
  182. pslld $ 7, %xmm6
  183. psrld $25, %xmm12
  184. pxor %xmm12, %xmm6
  185. movdqa %xmm7, %xmm12
  186. pslld $ 7, %xmm7
  187. psrld $25, %xmm12
  188. pxor %xmm12, %xmm7
  189. movdqa 112(%rsp), %xmm12
  190. paddd %xmm5, %xmm0
  191. paddd %xmm6, %xmm1
  192. pxor %xmm0, %xmm15
  193. pxor %xmm1, %xmm12
  194. paddd %xmm7, %xmm2
  195. paddd %xmm4, %xmm3
  196. movdqa %xmm7, 96(%rsp)
  197. pxor %xmm2, %xmm13
  198. pxor %xmm3, %xmm14
  199. pshuflw $0xb1,%xmm15,%xmm15
  200. pshufhw $0xb1,%xmm15,%xmm15
  201. pshuflw $0xb1,%xmm12,%xmm12
  202. pshufhw $0xb1,%xmm12,%xmm12
  203. pshuflw $0xb1,%xmm13,%xmm13
  204. pshufhw $0xb1,%xmm13,%xmm13
  205. pshuflw $0xb1,%xmm14,%xmm14
  206. pshufhw $0xb1,%xmm14,%xmm14
  207. paddd %xmm15, %xmm10
  208. paddd %xmm12, %xmm11
  209. paddd %xmm13, %xmm8
  210. paddd %xmm14, %xmm9
  211. movdqa %xmm15, 112(%rsp)
  212. pxor %xmm10, %xmm5
  213. pxor %xmm11, %xmm6
  214. movdqa 96(%rsp), %xmm7
  215. movdqa %xmm5, %xmm15
  216. pslld $ 12, %xmm5
  217. psrld $20, %xmm15
  218. pxor %xmm15, %xmm5
  219. movdqa %xmm6, %xmm15
  220. pslld $ 12, %xmm6
  221. psrld $20, %xmm15
  222. pxor %xmm15, %xmm6
  223. pxor %xmm8, %xmm7
  224. pxor %xmm9, %xmm4
  225. movdqa %xmm7, %xmm15
  226. pslld $ 12, %xmm7
  227. psrld $20, %xmm15
  228. pxor %xmm15, %xmm7
  229. movdqa %xmm4, %xmm15
  230. pslld $ 12, %xmm4
  231. psrld $20, %xmm15
  232. pxor %xmm15, %xmm4
  233. movdqa 112(%rsp), %xmm15
  234. paddd %xmm5, %xmm0
  235. paddd %xmm6, %xmm1
  236. pxor %xmm0, %xmm15
  237. pxor %xmm1, %xmm12
  238. paddd %xmm7, %xmm2
  239. paddd %xmm4, %xmm3
  240. movdqa %xmm7, 96(%rsp)
  241. pxor %xmm2, %xmm13
  242. pxor %xmm3, %xmm14
  243. movdqa %xmm15, %xmm7
  244. pslld $ 8, %xmm15
  245. psrld $24, %xmm7
  246. pxor %xmm7, %xmm15
  247. movdqa %xmm12, %xmm7
  248. pslld $ 8, %xmm12
  249. psrld $24, %xmm7
  250. pxor %xmm7, %xmm12
  251. paddd %xmm15, %xmm10
  252. paddd %xmm12, %xmm11
  253. movdqa %xmm13, %xmm7
  254. pslld $ 8, %xmm13
  255. psrld $24, %xmm7
  256. pxor %xmm7, %xmm13
  257. movdqa %xmm14, %xmm7
  258. pslld $ 8, %xmm14
  259. psrld $24, %xmm7
  260. pxor %xmm7, %xmm14
  261. paddd %xmm13, %xmm8
  262. paddd %xmm14, %xmm9
  263. movdqa %xmm15, 112(%rsp)
  264. pxor %xmm10, %xmm5
  265. pxor %xmm11, %xmm6
  266. movdqa 96(%rsp), %xmm7
  267. movdqa %xmm5, %xmm15
  268. pslld $ 7, %xmm5
  269. psrld $25, %xmm15
  270. pxor %xmm15, %xmm5
  271. movdqa %xmm6, %xmm15
  272. pslld $ 7, %xmm6
  273. psrld $25, %xmm15
  274. pxor %xmm15, %xmm6
  275. pxor %xmm8, %xmm7
  276. pxor %xmm9, %xmm4
  277. movdqa %xmm7, %xmm15
  278. pslld $ 7, %xmm7
  279. psrld $25, %xmm15
  280. pxor %xmm15, %xmm7
  281. movdqa %xmm4, %xmm15
  282. pslld $ 7, %xmm4
  283. psrld $25, %xmm15
  284. pxor %xmm15, %xmm4
  285. movdqa 112(%rsp), %xmm15
  286. subq $2, %rax
  287. jnz chacha_blocks_sse2_mainloop1
  288. paddd 128(%rsp), %xmm0
  289. paddd 144(%rsp), %xmm1
  290. paddd 160(%rsp), %xmm2
  291. paddd 176(%rsp), %xmm3
  292. paddd 192(%rsp), %xmm4
  293. paddd 208(%rsp), %xmm5
  294. paddd 224(%rsp), %xmm6
  295. paddd 240(%rsp), %xmm7
  296. paddd 256(%rsp), %xmm8
  297. paddd 272(%rsp), %xmm9
  298. paddd 288(%rsp), %xmm10
  299. paddd 304(%rsp), %xmm11
  300. paddd 320(%rsp), %xmm12
  301. paddd 336(%rsp), %xmm13
  302. paddd 352(%rsp), %xmm14
  303. paddd 368(%rsp), %xmm15
  304. movdqa %xmm8, 384(%rsp)
  305. movdqa %xmm9, 400(%rsp)
  306. movdqa %xmm10, 416(%rsp)
  307. movdqa %xmm11, 432(%rsp)
  308. movdqa %xmm12, 448(%rsp)
  309. movdqa %xmm13, 464(%rsp)
  310. movdqa %xmm14, 480(%rsp)
  311. movdqa %xmm15, 496(%rsp)
  312. movdqa %xmm0, %xmm8
  313. movdqa %xmm2, %xmm9
  314. movdqa %xmm4, %xmm10
  315. movdqa %xmm6, %xmm11
  316. punpckhdq %xmm1, %xmm0
  317. punpckhdq %xmm3, %xmm2
  318. punpckhdq %xmm5, %xmm4
  319. punpckhdq %xmm7, %xmm6
  320. punpckldq %xmm1, %xmm8
  321. punpckldq %xmm3, %xmm9
  322. punpckldq %xmm5, %xmm10
  323. punpckldq %xmm7, %xmm11
  324. movdqa %xmm0, %xmm1
  325. movdqa %xmm4, %xmm3
  326. movdqa %xmm8, %xmm5
  327. movdqa %xmm10, %xmm7
  328. punpckhqdq %xmm2, %xmm0
  329. punpckhqdq %xmm6, %xmm4
  330. punpckhqdq %xmm9, %xmm8
  331. punpckhqdq %xmm11, %xmm10
  332. punpcklqdq %xmm2, %xmm1
  333. punpcklqdq %xmm6, %xmm3
  334. punpcklqdq %xmm9, %xmm5
  335. punpcklqdq %xmm11, %xmm7
  336. andq %rsi, %rsi
  337. jz chacha_blocks_sse2_noinput1
  338. movdqu 0(%rsi), %xmm2
  339. movdqu 16(%rsi), %xmm6
  340. movdqu 64(%rsi), %xmm9
  341. movdqu 80(%rsi), %xmm11
  342. movdqu 128(%rsi), %xmm12
  343. movdqu 144(%rsi), %xmm13
  344. movdqu 192(%rsi), %xmm14
  345. movdqu 208(%rsi), %xmm15
  346. pxor %xmm2, %xmm5
  347. pxor %xmm6, %xmm7
  348. pxor %xmm9, %xmm8
  349. pxor %xmm11, %xmm10
  350. pxor %xmm12, %xmm1
  351. pxor %xmm13, %xmm3
  352. pxor %xmm14, %xmm0
  353. pxor %xmm15, %xmm4
  354. movdqu %xmm5, 0(%rdx)
  355. movdqu %xmm7, 16(%rdx)
  356. movdqu %xmm8, 64(%rdx)
  357. movdqu %xmm10, 80(%rdx)
  358. movdqu %xmm1, 128(%rdx)
  359. movdqu %xmm3, 144(%rdx)
  360. movdqu %xmm0, 192(%rdx)
  361. movdqu %xmm4, 208(%rdx)
  362. movdqa 384(%rsp), %xmm0
  363. movdqa 400(%rsp), %xmm1
  364. movdqa 416(%rsp), %xmm2
  365. movdqa 432(%rsp), %xmm3
  366. movdqa 448(%rsp), %xmm4
  367. movdqa 464(%rsp), %xmm5
  368. movdqa 480(%rsp), %xmm6
  369. movdqa 496(%rsp), %xmm7
  370. movdqa %xmm0, %xmm8
  371. movdqa %xmm2, %xmm9
  372. movdqa %xmm4, %xmm10
  373. movdqa %xmm6, %xmm11
  374. punpckldq %xmm1, %xmm8
  375. punpckldq %xmm3, %xmm9
  376. punpckhdq %xmm1, %xmm0
  377. punpckhdq %xmm3, %xmm2
  378. punpckldq %xmm5, %xmm10
  379. punpckldq %xmm7, %xmm11
  380. punpckhdq %xmm5, %xmm4
  381. punpckhdq %xmm7, %xmm6
  382. movdqa %xmm8, %xmm1
  383. movdqa %xmm0, %xmm3
  384. movdqa %xmm10, %xmm5
  385. movdqa %xmm4, %xmm7
  386. punpcklqdq %xmm9, %xmm1
  387. punpcklqdq %xmm11, %xmm5
  388. punpckhqdq %xmm9, %xmm8
  389. punpckhqdq %xmm11, %xmm10
  390. punpcklqdq %xmm2, %xmm3
  391. punpcklqdq %xmm6, %xmm7
  392. punpckhqdq %xmm2, %xmm0
  393. punpckhqdq %xmm6, %xmm4
  394. movdqu 32(%rsi), %xmm2
  395. movdqu 48(%rsi), %xmm6
  396. movdqu 96(%rsi), %xmm9
  397. movdqu 112(%rsi), %xmm11
  398. movdqu 160(%rsi), %xmm12
  399. movdqu 176(%rsi), %xmm13
  400. movdqu 224(%rsi), %xmm14
  401. movdqu 240(%rsi), %xmm15
  402. pxor %xmm2, %xmm1
  403. pxor %xmm6, %xmm5
  404. pxor %xmm9, %xmm8
  405. pxor %xmm11, %xmm10
  406. pxor %xmm12, %xmm3
  407. pxor %xmm13, %xmm7
  408. pxor %xmm14, %xmm0
  409. pxor %xmm15, %xmm4
  410. movdqu %xmm1, 32(%rdx)
  411. movdqu %xmm5, 48(%rdx)
  412. movdqu %xmm8, 96(%rdx)
  413. movdqu %xmm10, 112(%rdx)
  414. movdqu %xmm3, 160(%rdx)
  415. movdqu %xmm7, 176(%rdx)
  416. movdqu %xmm0, 224(%rdx)
  417. movdqu %xmm4, 240(%rdx)
  418. addq $256, %rsi
  419. jmp chacha_blocks_sse2_mainloop_cont
  420. chacha_blocks_sse2_noinput1:
  421. movdqu %xmm5, 0(%rdx)
  422. movdqu %xmm7, 16(%rdx)
  423. movdqu %xmm8, 64(%rdx)
  424. movdqu %xmm10, 80(%rdx)
  425. movdqu %xmm1, 128(%rdx)
  426. movdqu %xmm3, 144(%rdx)
  427. movdqu %xmm0, 192(%rdx)
  428. movdqu %xmm4, 208(%rdx)
  429. movdqa 384(%rsp), %xmm0
  430. movdqa 400(%rsp), %xmm1
  431. movdqa 416(%rsp), %xmm2
  432. movdqa 432(%rsp), %xmm3
  433. movdqa 448(%rsp), %xmm4
  434. movdqa 464(%rsp), %xmm5
  435. movdqa 480(%rsp), %xmm6
  436. movdqa 496(%rsp), %xmm7
  437. movdqa %xmm0, %xmm8
  438. movdqa %xmm2, %xmm9
  439. movdqa %xmm4, %xmm10
  440. movdqa %xmm6, %xmm11
  441. punpckldq %xmm1, %xmm8
  442. punpckldq %xmm3, %xmm9
  443. punpckhdq %xmm1, %xmm0
  444. punpckhdq %xmm3, %xmm2
  445. punpckldq %xmm5, %xmm10
  446. punpckldq %xmm7, %xmm11
  447. punpckhdq %xmm5, %xmm4
  448. punpckhdq %xmm7, %xmm6
  449. movdqa %xmm8, %xmm1
  450. movdqa %xmm0, %xmm3
  451. movdqa %xmm10, %xmm5
  452. movdqa %xmm4, %xmm7
  453. punpcklqdq %xmm9, %xmm1
  454. punpcklqdq %xmm11, %xmm5
  455. punpckhqdq %xmm9, %xmm8
  456. punpckhqdq %xmm11, %xmm10
  457. punpcklqdq %xmm2, %xmm3
  458. punpcklqdq %xmm6, %xmm7
  459. punpckhqdq %xmm2, %xmm0
  460. punpckhqdq %xmm6, %xmm4
  461. movdqu %xmm1, 32(%rdx)
  462. movdqu %xmm5, 48(%rdx)
  463. movdqu %xmm8, 96(%rdx)
  464. movdqu %xmm10, 112(%rdx)
  465. movdqu %xmm3, 160(%rdx)
  466. movdqu %xmm7, 176(%rdx)
  467. movdqu %xmm0, 224(%rdx)
  468. movdqu %xmm4, 240(%rdx)
  469. chacha_blocks_sse2_mainloop_cont:
  470. addq $256, %rdx
  471. subq $256, %rcx
  472. cmp $256, %rcx
  473. jae chacha_blocks_sse2_atleast256
  474. movdqa 0(%rsp), %xmm8
  475. movdqa 16(%rsp), %xmm9
  476. movdqa 32(%rsp), %xmm10
  477. movdqa 48(%rsp), %xmm11
  478. movq $1, %r9
  479. chacha_blocks_sse2_below256:
  480. movq %r9, %xmm5
  481. andq %rcx, %rcx
  482. jz chacha_blocks_sse2_done
  483. cmpq $64, %rcx
  484. jae chacha_blocks_sse2_above63
  485. movq %rdx, %r9
  486. andq %rsi, %rsi
  487. jz chacha_blocks_sse2_noinput2
  488. movq %rcx, %r10
  489. movq %rsp, %rdx
  490. addq %r10, %rsi
  491. addq %r10, %rdx
  492. negq %r10
  493. chacha_blocks_sse2_copyinput:
  494. movb (%rsi, %r10), %al
  495. movb %al, (%rdx, %r10)
  496. incq %r10
  497. jnz chacha_blocks_sse2_copyinput
  498. movq %rsp, %rsi
  499. chacha_blocks_sse2_noinput2:
  500. movq %rsp, %rdx
  501. chacha_blocks_sse2_above63:
  502. movdqa %xmm8, %xmm0
  503. movdqa %xmm9, %xmm1
  504. movdqa %xmm10, %xmm2
  505. movdqa %xmm11, %xmm3
  506. movq 64(%rsp), %rax
  507. chacha_blocks_sse2_mainloop2:
  508. paddd %xmm1, %xmm0
  509. pxor %xmm0, %xmm3
  510. pshuflw $0xb1,%xmm3,%xmm3
  511. pshufhw $0xb1,%xmm3,%xmm3
  512. paddd %xmm3, %xmm2
  513. pxor %xmm2, %xmm1
  514. movdqa %xmm1,%xmm4
  515. pslld $12, %xmm1
  516. psrld $20, %xmm4
  517. pxor %xmm4, %xmm1
  518. paddd %xmm1, %xmm0
  519. pxor %xmm0, %xmm3
  520. movdqa %xmm3,%xmm4
  521. pslld $8, %xmm3
  522. psrld $24, %xmm4
  523. pshufd $0x93,%xmm0,%xmm0
  524. pxor %xmm4, %xmm3
  525. paddd %xmm3, %xmm2
  526. pshufd $0x4e,%xmm3,%xmm3
  527. pxor %xmm2, %xmm1
  528. pshufd $0x39,%xmm2,%xmm2
  529. movdqa %xmm1,%xmm4
  530. pslld $7, %xmm1
  531. psrld $25, %xmm4
  532. pxor %xmm4, %xmm1
  533. subq $2, %rax
  534. paddd %xmm1, %xmm0
  535. pxor %xmm0, %xmm3
  536. pshuflw $0xb1,%xmm3,%xmm3
  537. pshufhw $0xb1,%xmm3,%xmm3
  538. paddd %xmm3, %xmm2
  539. pxor %xmm2, %xmm1
  540. movdqa %xmm1,%xmm4
  541. pslld $12, %xmm1
  542. psrld $20, %xmm4
  543. pxor %xmm4, %xmm1
  544. paddd %xmm1, %xmm0
  545. pxor %xmm0, %xmm3
  546. movdqa %xmm3,%xmm4
  547. pslld $8, %xmm3
  548. psrld $24, %xmm4
  549. pshufd $0x39,%xmm0,%xmm0
  550. pxor %xmm4, %xmm3
  551. paddd %xmm3, %xmm2
  552. pshufd $0x4e,%xmm3,%xmm3
  553. pxor %xmm2, %xmm1
  554. pshufd $0x93,%xmm2,%xmm2
  555. movdqa %xmm1,%xmm4
  556. pslld $7, %xmm1
  557. psrld $25, %xmm4
  558. pxor %xmm4, %xmm1
  559. jnz chacha_blocks_sse2_mainloop2
  560. paddd %xmm8, %xmm0
  561. paddd %xmm9, %xmm1
  562. paddd %xmm10, %xmm2
  563. paddd %xmm11, %xmm3
  564. andq %rsi, %rsi
  565. jz chacha_blocks_sse2_noinput3
  566. movdqu 0(%rsi), %xmm12
  567. movdqu 16(%rsi), %xmm13
  568. movdqu 32(%rsi), %xmm14
  569. movdqu 48(%rsi), %xmm15
  570. pxor %xmm12, %xmm0
  571. pxor %xmm13, %xmm1
  572. pxor %xmm14, %xmm2
  573. pxor %xmm15, %xmm3
  574. addq $64, %rsi
  575. chacha_blocks_sse2_noinput3:
  576. movdqu %xmm0, 0(%rdx)
  577. movdqu %xmm1, 16(%rdx)
  578. movdqu %xmm2, 32(%rdx)
  579. movdqu %xmm3, 48(%rdx)
  580. paddq %xmm5, %xmm11
  581. cmpq $64, %rcx
  582. jbe chacha_blocks_sse2_mainloop2_finishup
  583. addq $64, %rdx
  584. subq $64, %rcx
  585. jmp chacha_blocks_sse2_below256
  586. chacha_blocks_sse2_mainloop2_finishup:
  587. cmpq $64, %rcx
  588. je chacha_blocks_sse2_done
  589. addq %rcx, %r9
  590. addq %rcx, %rdx
  591. negq %rcx
  592. chacha_blocks_sse2_copyoutput:
  593. movb (%rdx, %rcx), %al
  594. movb %al, (%r9, %rcx)
  595. incq %rcx
  596. jnz chacha_blocks_sse2_copyoutput
  597. chacha_blocks_sse2_done:
  598. movdqu %xmm11, 32(%rdi)
  599. movq %rbp, %rsp
  600. popq %rbp
  601. popq %rbx
  602. ret
  603. FN_END chacha_blocks_sse2
  604. GLOBAL_HIDDEN_FN hchacha_sse2
  605. hchacha_sse2_local:
  606. movq $0x3320646e61707865, %rax
  607. movq $0x6b20657479622d32, %r8
  608. movd %rax, %xmm0
  609. movd %r8, %xmm4
  610. punpcklqdq %xmm4, %xmm0
  611. movdqu 0(%rdi), %xmm1
  612. movdqu 16(%rdi), %xmm2
  613. movdqu 0(%rsi), %xmm3
  614. hchacha_sse2_mainloop:
  615. paddd %xmm1, %xmm0
  616. pxor %xmm0, %xmm3
  617. pshuflw $0xb1,%xmm3,%xmm3
  618. pshufhw $0xb1,%xmm3,%xmm3
  619. paddd %xmm3, %xmm2
  620. pxor %xmm2, %xmm1
  621. movdqa %xmm1,%xmm4
  622. pslld $12, %xmm1
  623. psrld $20, %xmm4
  624. pxor %xmm4, %xmm1
  625. paddd %xmm1, %xmm0
  626. pxor %xmm0, %xmm3
  627. movdqa %xmm3,%xmm4
  628. pslld $8, %xmm3
  629. psrld $24, %xmm4
  630. pshufd $0x93,%xmm0,%xmm0
  631. pxor %xmm4, %xmm3
  632. paddd %xmm3, %xmm2
  633. pshufd $0x4e,%xmm3,%xmm3
  634. pxor %xmm2, %xmm1
  635. pshufd $0x39,%xmm2,%xmm2
  636. movdqa %xmm1,%xmm4
  637. pslld $7, %xmm1
  638. psrld $25, %xmm4
  639. pxor %xmm4, %xmm1
  640. subq $2, %rcx
  641. paddd %xmm1, %xmm0
  642. pxor %xmm0, %xmm3
  643. pshuflw $0xb1,%xmm3,%xmm3
  644. pshufhw $0xb1,%xmm3,%xmm3
  645. paddd %xmm3, %xmm2
  646. pxor %xmm2, %xmm1
  647. movdqa %xmm1,%xmm4
  648. pslld $12, %xmm1
  649. psrld $20, %xmm4
  650. pxor %xmm4, %xmm1
  651. paddd %xmm1, %xmm0
  652. pxor %xmm0, %xmm3
  653. movdqa %xmm3,%xmm4
  654. pslld $8, %xmm3
  655. psrld $24, %xmm4
  656. pshufd $0x39,%xmm0,%xmm0
  657. pxor %xmm4, %xmm3
  658. paddd %xmm3, %xmm2
  659. pshufd $0x4e,%xmm3,%xmm3
  660. pxor %xmm2, %xmm1
  661. pshufd $0x93,%xmm2,%xmm2
  662. movdqa %xmm1,%xmm4
  663. pslld $7, %xmm1
  664. psrld $25, %xmm4
  665. pxor %xmm4, %xmm1
  666. ja hchacha_sse2_mainloop
  667. movdqu %xmm0, 0(%rdx)
  668. movdqu %xmm3, 16(%rdx)
  669. ret
  670. FN_END hchacha_sse2
  671. GLOBAL_HIDDEN_FN_EXT chacha_sse2, 6, 16
  672. pushq %rbp
  673. movq %rsp, %rbp
  674. subq $64, %rsp
  675. andq $~63, %rsp
  676. movdqu 0(%rdi), %xmm0
  677. movdqu 16(%rdi), %xmm1
  678. movdqa %xmm0, 0(%rsp)
  679. movdqa %xmm1, 16(%rsp)
  680. xorq %rdi, %rdi
  681. movq %rdi, 32(%rsp)
  682. movq 0(%rsi), %rsi
  683. movq %rsi, 40(%rsp)
  684. movq %r9, 48(%rsp)
  685. movq %rsp, %rdi
  686. movq %rdx, %rsi
  687. movq %rcx, %rdx
  688. movq %r8, %rcx
  689. call chacha_blocks_sse2_local
  690. pxor %xmm0, %xmm0
  691. movdqa %xmm0, 0(%rsp)
  692. movdqa %xmm0, 16(%rsp)
  693. movdqa %xmm0, 32(%rsp)
  694. movq %rbp, %rsp
  695. popq %rbp
  696. ret
  697. FN_END chacha_sse2
  698. GLOBAL_HIDDEN_FN_EXT xchacha_sse2, 6, 16
  699. pushq %rbp
  700. pushq %rbx
  701. movq %rsp, %rbp
  702. subq $64, %rsp
  703. andq $~63, %rsp
  704. movq %rsp, %rbx
  705. xorq %rax, %rax
  706. movq %rax, 32(%rbx)
  707. movq 16(%rsi), %rax
  708. movq %rax, 40(%rbx)
  709. movq %r9, 48(%rbx)
  710. pushq %rdx
  711. pushq %rcx
  712. pushq %r8
  713. movq %rbx, %rdx
  714. movq %r9, %rcx
  715. call hchacha_sse2_local
  716. movq %rbx, %rdi
  717. popq %rcx
  718. popq %rdx
  719. popq %rsi
  720. call chacha_blocks_sse2_local
  721. pxor %xmm0, %xmm0
  722. movdqa %xmm0, 0(%rbx)
  723. movdqa %xmm0, 16(%rbx)
  724. movdqa %xmm0, 32(%rbx)
  725. movq %rbp, %rsp
  726. popq %rbx
  727. popq %rbp
  728. ret
  729. FN_END xchacha_sse2