keccakf_amd64.s 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. // Copyright 2015 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. //go:build amd64 && !purego && gc
  5. // +build amd64,!purego,gc
  6. // This code was translated into a form compatible with 6a from the public
  7. // domain sources at https://github.com/gvanas/KeccakCodePackage
  8. // Offsets in state
  9. #define _ba (0*8)
  10. #define _be (1*8)
  11. #define _bi (2*8)
  12. #define _bo (3*8)
  13. #define _bu (4*8)
  14. #define _ga (5*8)
  15. #define _ge (6*8)
  16. #define _gi (7*8)
  17. #define _go (8*8)
  18. #define _gu (9*8)
  19. #define _ka (10*8)
  20. #define _ke (11*8)
  21. #define _ki (12*8)
  22. #define _ko (13*8)
  23. #define _ku (14*8)
  24. #define _ma (15*8)
  25. #define _me (16*8)
  26. #define _mi (17*8)
  27. #define _mo (18*8)
  28. #define _mu (19*8)
  29. #define _sa (20*8)
  30. #define _se (21*8)
  31. #define _si (22*8)
  32. #define _so (23*8)
  33. #define _su (24*8)
  34. // Temporary registers
  35. #define rT1 AX
  36. // Round vars
  37. #define rpState DI
  38. #define rpStack SP
  39. #define rDa BX
  40. #define rDe CX
  41. #define rDi DX
  42. #define rDo R8
  43. #define rDu R9
  44. #define rBa R10
  45. #define rBe R11
  46. #define rBi R12
  47. #define rBo R13
  48. #define rBu R14
  49. #define rCa SI
  50. #define rCe BP
  51. #define rCi rBi
  52. #define rCo rBo
  53. #define rCu R15
  54. #define MOVQ_RBI_RCE MOVQ rBi, rCe
  55. #define XORQ_RT1_RCA XORQ rT1, rCa
  56. #define XORQ_RT1_RCE XORQ rT1, rCe
  57. #define XORQ_RBA_RCU XORQ rBa, rCu
  58. #define XORQ_RBE_RCU XORQ rBe, rCu
  59. #define XORQ_RDU_RCU XORQ rDu, rCu
  60. #define XORQ_RDA_RCA XORQ rDa, rCa
  61. #define XORQ_RDE_RCE XORQ rDe, rCe
  62. #define mKeccakRound(iState, oState, rc, B_RBI_RCE, G_RT1_RCA, G_RT1_RCE, G_RBA_RCU, K_RT1_RCA, K_RT1_RCE, K_RBA_RCU, M_RT1_RCA, M_RT1_RCE, M_RBE_RCU, S_RDU_RCU, S_RDA_RCA, S_RDE_RCE) \
  63. /* Prepare round */ \
  64. MOVQ rCe, rDa; \
  65. ROLQ $1, rDa; \
  66. \
  67. MOVQ _bi(iState), rCi; \
  68. XORQ _gi(iState), rDi; \
  69. XORQ rCu, rDa; \
  70. XORQ _ki(iState), rCi; \
  71. XORQ _mi(iState), rDi; \
  72. XORQ rDi, rCi; \
  73. \
  74. MOVQ rCi, rDe; \
  75. ROLQ $1, rDe; \
  76. \
  77. MOVQ _bo(iState), rCo; \
  78. XORQ _go(iState), rDo; \
  79. XORQ rCa, rDe; \
  80. XORQ _ko(iState), rCo; \
  81. XORQ _mo(iState), rDo; \
  82. XORQ rDo, rCo; \
  83. \
  84. MOVQ rCo, rDi; \
  85. ROLQ $1, rDi; \
  86. \
  87. MOVQ rCu, rDo; \
  88. XORQ rCe, rDi; \
  89. ROLQ $1, rDo; \
  90. \
  91. MOVQ rCa, rDu; \
  92. XORQ rCi, rDo; \
  93. ROLQ $1, rDu; \
  94. \
  95. /* Result b */ \
  96. MOVQ _ba(iState), rBa; \
  97. MOVQ _ge(iState), rBe; \
  98. XORQ rCo, rDu; \
  99. MOVQ _ki(iState), rBi; \
  100. MOVQ _mo(iState), rBo; \
  101. MOVQ _su(iState), rBu; \
  102. XORQ rDe, rBe; \
  103. ROLQ $44, rBe; \
  104. XORQ rDi, rBi; \
  105. XORQ rDa, rBa; \
  106. ROLQ $43, rBi; \
  107. \
  108. MOVQ rBe, rCa; \
  109. MOVQ rc, rT1; \
  110. ORQ rBi, rCa; \
  111. XORQ rBa, rT1; \
  112. XORQ rT1, rCa; \
  113. MOVQ rCa, _ba(oState); \
  114. \
  115. XORQ rDu, rBu; \
  116. ROLQ $14, rBu; \
  117. MOVQ rBa, rCu; \
  118. ANDQ rBe, rCu; \
  119. XORQ rBu, rCu; \
  120. MOVQ rCu, _bu(oState); \
  121. \
  122. XORQ rDo, rBo; \
  123. ROLQ $21, rBo; \
  124. MOVQ rBo, rT1; \
  125. ANDQ rBu, rT1; \
  126. XORQ rBi, rT1; \
  127. MOVQ rT1, _bi(oState); \
  128. \
  129. NOTQ rBi; \
  130. ORQ rBa, rBu; \
  131. ORQ rBo, rBi; \
  132. XORQ rBo, rBu; \
  133. XORQ rBe, rBi; \
  134. MOVQ rBu, _bo(oState); \
  135. MOVQ rBi, _be(oState); \
  136. B_RBI_RCE; \
  137. \
  138. /* Result g */ \
  139. MOVQ _gu(iState), rBe; \
  140. XORQ rDu, rBe; \
  141. MOVQ _ka(iState), rBi; \
  142. ROLQ $20, rBe; \
  143. XORQ rDa, rBi; \
  144. ROLQ $3, rBi; \
  145. MOVQ _bo(iState), rBa; \
  146. MOVQ rBe, rT1; \
  147. ORQ rBi, rT1; \
  148. XORQ rDo, rBa; \
  149. MOVQ _me(iState), rBo; \
  150. MOVQ _si(iState), rBu; \
  151. ROLQ $28, rBa; \
  152. XORQ rBa, rT1; \
  153. MOVQ rT1, _ga(oState); \
  154. G_RT1_RCA; \
  155. \
  156. XORQ rDe, rBo; \
  157. ROLQ $45, rBo; \
  158. MOVQ rBi, rT1; \
  159. ANDQ rBo, rT1; \
  160. XORQ rBe, rT1; \
  161. MOVQ rT1, _ge(oState); \
  162. G_RT1_RCE; \
  163. \
  164. XORQ rDi, rBu; \
  165. ROLQ $61, rBu; \
  166. MOVQ rBu, rT1; \
  167. ORQ rBa, rT1; \
  168. XORQ rBo, rT1; \
  169. MOVQ rT1, _go(oState); \
  170. \
  171. ANDQ rBe, rBa; \
  172. XORQ rBu, rBa; \
  173. MOVQ rBa, _gu(oState); \
  174. NOTQ rBu; \
  175. G_RBA_RCU; \
  176. \
  177. ORQ rBu, rBo; \
  178. XORQ rBi, rBo; \
  179. MOVQ rBo, _gi(oState); \
  180. \
  181. /* Result k */ \
  182. MOVQ _be(iState), rBa; \
  183. MOVQ _gi(iState), rBe; \
  184. MOVQ _ko(iState), rBi; \
  185. MOVQ _mu(iState), rBo; \
  186. MOVQ _sa(iState), rBu; \
  187. XORQ rDi, rBe; \
  188. ROLQ $6, rBe; \
  189. XORQ rDo, rBi; \
  190. ROLQ $25, rBi; \
  191. MOVQ rBe, rT1; \
  192. ORQ rBi, rT1; \
  193. XORQ rDe, rBa; \
  194. ROLQ $1, rBa; \
  195. XORQ rBa, rT1; \
  196. MOVQ rT1, _ka(oState); \
  197. K_RT1_RCA; \
  198. \
  199. XORQ rDu, rBo; \
  200. ROLQ $8, rBo; \
  201. MOVQ rBi, rT1; \
  202. ANDQ rBo, rT1; \
  203. XORQ rBe, rT1; \
  204. MOVQ rT1, _ke(oState); \
  205. K_RT1_RCE; \
  206. \
  207. XORQ rDa, rBu; \
  208. ROLQ $18, rBu; \
  209. NOTQ rBo; \
  210. MOVQ rBo, rT1; \
  211. ANDQ rBu, rT1; \
  212. XORQ rBi, rT1; \
  213. MOVQ rT1, _ki(oState); \
  214. \
  215. MOVQ rBu, rT1; \
  216. ORQ rBa, rT1; \
  217. XORQ rBo, rT1; \
  218. MOVQ rT1, _ko(oState); \
  219. \
  220. ANDQ rBe, rBa; \
  221. XORQ rBu, rBa; \
  222. MOVQ rBa, _ku(oState); \
  223. K_RBA_RCU; \
  224. \
  225. /* Result m */ \
  226. MOVQ _ga(iState), rBe; \
  227. XORQ rDa, rBe; \
  228. MOVQ _ke(iState), rBi; \
  229. ROLQ $36, rBe; \
  230. XORQ rDe, rBi; \
  231. MOVQ _bu(iState), rBa; \
  232. ROLQ $10, rBi; \
  233. MOVQ rBe, rT1; \
  234. MOVQ _mi(iState), rBo; \
  235. ANDQ rBi, rT1; \
  236. XORQ rDu, rBa; \
  237. MOVQ _so(iState), rBu; \
  238. ROLQ $27, rBa; \
  239. XORQ rBa, rT1; \
  240. MOVQ rT1, _ma(oState); \
  241. M_RT1_RCA; \
  242. \
  243. XORQ rDi, rBo; \
  244. ROLQ $15, rBo; \
  245. MOVQ rBi, rT1; \
  246. ORQ rBo, rT1; \
  247. XORQ rBe, rT1; \
  248. MOVQ rT1, _me(oState); \
  249. M_RT1_RCE; \
  250. \
  251. XORQ rDo, rBu; \
  252. ROLQ $56, rBu; \
  253. NOTQ rBo; \
  254. MOVQ rBo, rT1; \
  255. ORQ rBu, rT1; \
  256. XORQ rBi, rT1; \
  257. MOVQ rT1, _mi(oState); \
  258. \
  259. ORQ rBa, rBe; \
  260. XORQ rBu, rBe; \
  261. MOVQ rBe, _mu(oState); \
  262. \
  263. ANDQ rBa, rBu; \
  264. XORQ rBo, rBu; \
  265. MOVQ rBu, _mo(oState); \
  266. M_RBE_RCU; \
  267. \
  268. /* Result s */ \
  269. MOVQ _bi(iState), rBa; \
  270. MOVQ _go(iState), rBe; \
  271. MOVQ _ku(iState), rBi; \
  272. XORQ rDi, rBa; \
  273. MOVQ _ma(iState), rBo; \
  274. ROLQ $62, rBa; \
  275. XORQ rDo, rBe; \
  276. MOVQ _se(iState), rBu; \
  277. ROLQ $55, rBe; \
  278. \
  279. XORQ rDu, rBi; \
  280. MOVQ rBa, rDu; \
  281. XORQ rDe, rBu; \
  282. ROLQ $2, rBu; \
  283. ANDQ rBe, rDu; \
  284. XORQ rBu, rDu; \
  285. MOVQ rDu, _su(oState); \
  286. \
  287. ROLQ $39, rBi; \
  288. S_RDU_RCU; \
  289. NOTQ rBe; \
  290. XORQ rDa, rBo; \
  291. MOVQ rBe, rDa; \
  292. ANDQ rBi, rDa; \
  293. XORQ rBa, rDa; \
  294. MOVQ rDa, _sa(oState); \
  295. S_RDA_RCA; \
  296. \
  297. ROLQ $41, rBo; \
  298. MOVQ rBi, rDe; \
  299. ORQ rBo, rDe; \
  300. XORQ rBe, rDe; \
  301. MOVQ rDe, _se(oState); \
  302. S_RDE_RCE; \
  303. \
  304. MOVQ rBo, rDi; \
  305. MOVQ rBu, rDo; \
  306. ANDQ rBu, rDi; \
  307. ORQ rBa, rDo; \
  308. XORQ rBi, rDi; \
  309. XORQ rBo, rDo; \
  310. MOVQ rDi, _si(oState); \
  311. MOVQ rDo, _so(oState) \
  312. // func keccakF1600(state *[25]uint64)
  313. TEXT ·keccakF1600(SB), 0, $200-8
  314. MOVQ state+0(FP), rpState
  315. // Convert the user state into an internal state
  316. NOTQ _be(rpState)
  317. NOTQ _bi(rpState)
  318. NOTQ _go(rpState)
  319. NOTQ _ki(rpState)
  320. NOTQ _mi(rpState)
  321. NOTQ _sa(rpState)
  322. // Execute the KeccakF permutation
  323. MOVQ _ba(rpState), rCa
  324. MOVQ _be(rpState), rCe
  325. MOVQ _bu(rpState), rCu
  326. XORQ _ga(rpState), rCa
  327. XORQ _ge(rpState), rCe
  328. XORQ _gu(rpState), rCu
  329. XORQ _ka(rpState), rCa
  330. XORQ _ke(rpState), rCe
  331. XORQ _ku(rpState), rCu
  332. XORQ _ma(rpState), rCa
  333. XORQ _me(rpState), rCe
  334. XORQ _mu(rpState), rCu
  335. XORQ _sa(rpState), rCa
  336. XORQ _se(rpState), rCe
  337. MOVQ _si(rpState), rDi
  338. MOVQ _so(rpState), rDo
  339. XORQ _su(rpState), rCu
  340. mKeccakRound(rpState, rpStack, $0x0000000000000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  341. mKeccakRound(rpStack, rpState, $0x0000000000008082, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  342. mKeccakRound(rpState, rpStack, $0x800000000000808a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  343. mKeccakRound(rpStack, rpState, $0x8000000080008000, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  344. mKeccakRound(rpState, rpStack, $0x000000000000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  345. mKeccakRound(rpStack, rpState, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  346. mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  347. mKeccakRound(rpStack, rpState, $0x8000000000008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  348. mKeccakRound(rpState, rpStack, $0x000000000000008a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  349. mKeccakRound(rpStack, rpState, $0x0000000000000088, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  350. mKeccakRound(rpState, rpStack, $0x0000000080008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  351. mKeccakRound(rpStack, rpState, $0x000000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  352. mKeccakRound(rpState, rpStack, $0x000000008000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  353. mKeccakRound(rpStack, rpState, $0x800000000000008b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  354. mKeccakRound(rpState, rpStack, $0x8000000000008089, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  355. mKeccakRound(rpStack, rpState, $0x8000000000008003, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  356. mKeccakRound(rpState, rpStack, $0x8000000000008002, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  357. mKeccakRound(rpStack, rpState, $0x8000000000000080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  358. mKeccakRound(rpState, rpStack, $0x000000000000800a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  359. mKeccakRound(rpStack, rpState, $0x800000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  360. mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  361. mKeccakRound(rpStack, rpState, $0x8000000000008080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  362. mKeccakRound(rpState, rpStack, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE)
  363. mKeccakRound(rpStack, rpState, $0x8000000080008008, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP)
  364. // Revert the internal state to the user state
  365. NOTQ _be(rpState)
  366. NOTQ _bi(rpState)
  367. NOTQ _go(rpState)
  368. NOTQ _ki(rpState)
  369. NOTQ _mi(rpState)
  370. NOTQ _sa(rpState)
  371. RET