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