keccak1600-x86_64.s 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. .text
  2. .p2align 5
  3. __KeccakF1600:
  4. movq 60(%rdi),%rax
  5. movq 68(%rdi),%rbx
  6. movq 76(%rdi),%rcx
  7. movq 84(%rdi),%rdx
  8. movq 92(%rdi),%rbp
  9. jmp L$oop
  10. .p2align 5
  11. L$oop:
  12. movq -100(%rdi),%r8
  13. movq -52(%rdi),%r9
  14. movq -4(%rdi),%r10
  15. movq 44(%rdi),%r11
  16. xorq -84(%rdi),%rcx
  17. xorq -76(%rdi),%rdx
  18. xorq %r8,%rax
  19. xorq -92(%rdi),%rbx
  20. xorq -44(%rdi),%rcx
  21. xorq -60(%rdi),%rax
  22. movq %rbp,%r12
  23. xorq -68(%rdi),%rbp
  24. xorq %r10,%rcx
  25. xorq -20(%rdi),%rax
  26. xorq -36(%rdi),%rdx
  27. xorq %r9,%rbx
  28. xorq -28(%rdi),%rbp
  29. xorq 36(%rdi),%rcx
  30. xorq 20(%rdi),%rax
  31. xorq 4(%rdi),%rdx
  32. xorq -12(%rdi),%rbx
  33. xorq 12(%rdi),%rbp
  34. movq %rcx,%r13
  35. rolq $1,%rcx
  36. xorq %rax,%rcx
  37. xorq %r11,%rdx
  38. rolq $1,%rax
  39. xorq %rdx,%rax
  40. xorq 28(%rdi),%rbx
  41. rolq $1,%rdx
  42. xorq %rbx,%rdx
  43. xorq 52(%rdi),%rbp
  44. rolq $1,%rbx
  45. xorq %rbp,%rbx
  46. rolq $1,%rbp
  47. xorq %r13,%rbp
  48. xorq %rcx,%r9
  49. xorq %rdx,%r10
  50. rolq $44,%r9
  51. xorq %rbp,%r11
  52. xorq %rax,%r12
  53. rolq $43,%r10
  54. xorq %rbx,%r8
  55. movq %r9,%r13
  56. rolq $21,%r11
  57. orq %r10,%r9
  58. xorq %r8,%r9
  59. rolq $14,%r12
  60. xorq (%r15),%r9
  61. leaq 8(%r15),%r15
  62. movq %r12,%r14
  63. andq %r11,%r12
  64. movq %r9,-100(%rsi)
  65. xorq %r10,%r12
  66. notq %r10
  67. movq %r12,-84(%rsi)
  68. orq %r11,%r10
  69. movq 76(%rdi),%r12
  70. xorq %r13,%r10
  71. movq %r10,-92(%rsi)
  72. andq %r8,%r13
  73. movq -28(%rdi),%r9
  74. xorq %r14,%r13
  75. movq -20(%rdi),%r10
  76. movq %r13,-68(%rsi)
  77. orq %r8,%r14
  78. movq -76(%rdi),%r8
  79. xorq %r11,%r14
  80. movq 28(%rdi),%r11
  81. movq %r14,-76(%rsi)
  82. xorq %rbp,%r8
  83. xorq %rdx,%r12
  84. rolq $28,%r8
  85. xorq %rcx,%r11
  86. xorq %rax,%r9
  87. rolq $61,%r12
  88. rolq $45,%r11
  89. xorq %rbx,%r10
  90. rolq $20,%r9
  91. movq %r8,%r13
  92. orq %r12,%r8
  93. rolq $3,%r10
  94. xorq %r11,%r8
  95. movq %r8,-36(%rsi)
  96. movq %r9,%r14
  97. andq %r13,%r9
  98. movq -92(%rdi),%r8
  99. xorq %r12,%r9
  100. notq %r12
  101. movq %r9,-28(%rsi)
  102. orq %r11,%r12
  103. movq -44(%rdi),%r9
  104. xorq %r10,%r12
  105. movq %r12,-44(%rsi)
  106. andq %r10,%r11
  107. movq 60(%rdi),%r12
  108. xorq %r14,%r11
  109. movq %r11,-52(%rsi)
  110. orq %r10,%r14
  111. movq 4(%rdi),%r10
  112. xorq %r13,%r14
  113. movq 52(%rdi),%r11
  114. movq %r14,-60(%rsi)
  115. xorq %rbp,%r10
  116. xorq %rax,%r11
  117. rolq $25,%r10
  118. xorq %rdx,%r9
  119. rolq $8,%r11
  120. xorq %rbx,%r12
  121. rolq $6,%r9
  122. xorq %rcx,%r8
  123. rolq $18,%r12
  124. movq %r10,%r13
  125. andq %r11,%r10
  126. rolq $1,%r8
  127. notq %r11
  128. xorq %r9,%r10
  129. movq %r10,-12(%rsi)
  130. movq %r12,%r14
  131. andq %r11,%r12
  132. movq -12(%rdi),%r10
  133. xorq %r13,%r12
  134. movq %r12,-4(%rsi)
  135. orq %r9,%r13
  136. movq 84(%rdi),%r12
  137. xorq %r8,%r13
  138. movq %r13,-20(%rsi)
  139. andq %r8,%r9
  140. xorq %r14,%r9
  141. movq %r9,12(%rsi)
  142. orq %r8,%r14
  143. movq -60(%rdi),%r9
  144. xorq %r11,%r14
  145. movq 36(%rdi),%r11
  146. movq %r14,4(%rsi)
  147. movq -68(%rdi),%r8
  148. xorq %rcx,%r10
  149. xorq %rdx,%r11
  150. rolq $10,%r10
  151. xorq %rbx,%r9
  152. rolq $15,%r11
  153. xorq %rbp,%r12
  154. rolq $36,%r9
  155. xorq %rax,%r8
  156. rolq $56,%r12
  157. movq %r10,%r13
  158. orq %r11,%r10
  159. rolq $27,%r8
  160. notq %r11
  161. xorq %r9,%r10
  162. movq %r10,28(%rsi)
  163. movq %r12,%r14
  164. orq %r11,%r12
  165. xorq %r13,%r12
  166. movq %r12,36(%rsi)
  167. andq %r9,%r13
  168. xorq %r8,%r13
  169. movq %r13,20(%rsi)
  170. orq %r8,%r9
  171. xorq %r14,%r9
  172. movq %r9,52(%rsi)
  173. andq %r14,%r8
  174. xorq %r11,%r8
  175. movq %r8,44(%rsi)
  176. xorq -84(%rdi),%rdx
  177. xorq -36(%rdi),%rbp
  178. rolq $62,%rdx
  179. xorq 68(%rdi),%rcx
  180. rolq $55,%rbp
  181. xorq 12(%rdi),%rax
  182. rolq $2,%rcx
  183. xorq 20(%rdi),%rbx
  184. xchgq %rsi,%rdi
  185. rolq $39,%rax
  186. rolq $41,%rbx
  187. movq %rdx,%r13
  188. andq %rbp,%rdx
  189. notq %rbp
  190. xorq %rcx,%rdx
  191. movq %rdx,92(%rdi)
  192. movq %rax,%r14
  193. andq %rbp,%rax
  194. xorq %r13,%rax
  195. movq %rax,60(%rdi)
  196. orq %rcx,%r13
  197. xorq %rbx,%r13
  198. movq %r13,84(%rdi)
  199. andq %rbx,%rcx
  200. xorq %r14,%rcx
  201. movq %rcx,76(%rdi)
  202. orq %r14,%rbx
  203. xorq %rbp,%rbx
  204. movq %rbx,68(%rdi)
  205. movq %rdx,%rbp
  206. movq %r13,%rdx
  207. testq $255,%r15
  208. jnz L$oop
  209. leaq -192(%r15),%r15
  210. .byte 0xf3,0xc3
  211. .p2align 5
  212. KeccakF1600:
  213. pushq %rbx
  214. pushq %rbp
  215. pushq %r12
  216. pushq %r13
  217. pushq %r14
  218. pushq %r15
  219. leaq 100(%rdi),%rdi
  220. subq $200,%rsp
  221. notq -92(%rdi)
  222. notq -84(%rdi)
  223. notq -36(%rdi)
  224. notq -4(%rdi)
  225. notq 36(%rdi)
  226. notq 60(%rdi)
  227. leaq iotas(%rip),%r15
  228. leaq 100(%rsp),%rsi
  229. call __KeccakF1600
  230. notq -92(%rdi)
  231. notq -84(%rdi)
  232. notq -36(%rdi)
  233. notq -4(%rdi)
  234. notq 36(%rdi)
  235. notq 60(%rdi)
  236. leaq -100(%rdi),%rdi
  237. addq $200,%rsp
  238. popq %r15
  239. popq %r14
  240. popq %r13
  241. popq %r12
  242. popq %rbp
  243. popq %rbx
  244. .byte 0xf3,0xc3
  245. .globl _SHA3_absorb
  246. .p2align 5
  247. _SHA3_absorb:
  248. pushq %rbx
  249. pushq %rbp
  250. pushq %r12
  251. pushq %r13
  252. pushq %r14
  253. pushq %r15
  254. leaq 100(%rdi),%rdi
  255. subq $232,%rsp
  256. movq %rsi,%r9
  257. leaq 100(%rsp),%rsi
  258. notq -92(%rdi)
  259. notq -84(%rdi)
  260. notq -36(%rdi)
  261. notq -4(%rdi)
  262. notq 36(%rdi)
  263. notq 60(%rdi)
  264. leaq iotas(%rip),%r15
  265. movq %rcx,216-100(%rsi)
  266. L$oop_absorb:
  267. cmpq %rcx,%rdx
  268. jc L$done_absorb
  269. shrq $3,%rcx
  270. leaq -100(%rdi),%r8
  271. L$block_absorb:
  272. movq (%r9),%rax
  273. leaq 8(%r9),%r9
  274. xorq (%r8),%rax
  275. leaq 8(%r8),%r8
  276. subq $8,%rdx
  277. movq %rax,-8(%r8)
  278. subq $1,%rcx
  279. jnz L$block_absorb
  280. movq %r9,200-100(%rsi)
  281. movq %rdx,208-100(%rsi)
  282. call __KeccakF1600
  283. movq 200-100(%rsi),%r9
  284. movq 208-100(%rsi),%rdx
  285. movq 216-100(%rsi),%rcx
  286. jmp L$oop_absorb
  287. .p2align 5
  288. L$done_absorb:
  289. movq %rdx,%rax
  290. notq -92(%rdi)
  291. notq -84(%rdi)
  292. notq -36(%rdi)
  293. notq -4(%rdi)
  294. notq 36(%rdi)
  295. notq 60(%rdi)
  296. addq $232,%rsp
  297. popq %r15
  298. popq %r14
  299. popq %r13
  300. popq %r12
  301. popq %rbp
  302. popq %rbx
  303. .byte 0xf3,0xc3
  304. .globl _SHA3_squeeze
  305. .p2align 5
  306. _SHA3_squeeze:
  307. pushq %r12
  308. pushq %r13
  309. pushq %r14
  310. shrq $3,%rcx
  311. movq %rdi,%r8
  312. movq %rsi,%r12
  313. movq %rdx,%r13
  314. movq %rcx,%r14
  315. jmp L$oop_squeeze
  316. .p2align 5
  317. L$oop_squeeze:
  318. cmpq $8,%r13
  319. jb L$tail_squeeze
  320. movq (%r8),%rax
  321. leaq 8(%r8),%r8
  322. movq %rax,(%r12)
  323. leaq 8(%r12),%r12
  324. subq $8,%r13
  325. jz L$done_squeeze
  326. subq $1,%rcx
  327. jnz L$oop_squeeze
  328. call KeccakF1600
  329. movq %rdi,%r8
  330. movq %r14,%rcx
  331. jmp L$oop_squeeze
  332. L$tail_squeeze:
  333. movq %r8,%rsi
  334. movq %r12,%rdi
  335. movq %r13,%rcx
  336. .byte 0xf3,0xa4
  337. L$done_squeeze:
  338. popq %r14
  339. popq %r13
  340. popq %r12
  341. .byte 0xf3,0xc3
  342. .p2align 8
  343. .quad 0,0,0,0,0,0,0,0
  344. iotas:
  345. .quad 0x0000000000000001
  346. .quad 0x0000000000008082
  347. .quad 0x800000000000808a
  348. .quad 0x8000000080008000
  349. .quad 0x000000000000808b
  350. .quad 0x0000000080000001
  351. .quad 0x8000000080008081
  352. .quad 0x8000000000008009
  353. .quad 0x000000000000008a
  354. .quad 0x0000000000000088
  355. .quad 0x0000000080008009
  356. .quad 0x000000008000000a
  357. .quad 0x000000008000808b
  358. .quad 0x800000000000008b
  359. .quad 0x8000000000008089
  360. .quad 0x8000000000008003
  361. .quad 0x8000000000008002
  362. .quad 0x8000000000000080
  363. .quad 0x000000000000800a
  364. .quad 0x800000008000000a
  365. .quad 0x8000000080008081
  366. .quad 0x8000000000008080
  367. .quad 0x0000000080000001
  368. .quad 0x8000000080008008
  369. .byte 75,101,99,99,97,107,45,49,54,48,48,32,97,98,115,111,114,98,32,97,110,100,32,115,113,117,101,101,122,101,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0