sha256-armv8.S 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211
  1. // This file is generated from a similarly-named Perl script in the BoringSSL
  2. // source tree. Do not edit by hand.
  3. #if !defined(__has_feature)
  4. #define __has_feature(x) 0
  5. #endif
  6. #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
  7. #define OPENSSL_NO_ASM
  8. #endif
  9. #if !defined(OPENSSL_NO_ASM)
  10. #if defined(BORINGSSL_PREFIX)
  11. #include <boringssl_prefix_symbols_asm.h>
  12. #endif
  13. // Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
  14. //
  15. // Licensed under the OpenSSL license (the "License"). You may not use
  16. // this file except in compliance with the License. You can obtain a copy
  17. // in the file LICENSE in the source distribution or at
  18. // https://www.openssl.org/source/license.html
  19. // ====================================================================
  20. // Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
  21. // project. The module is, however, dual licensed under OpenSSL and
  22. // CRYPTOGAMS licenses depending on where you obtain it. For further
  23. // details see http://www.openssl.org/~appro/cryptogams/.
  24. //
  25. // Permission to use under GPLv2 terms is granted.
  26. // ====================================================================
  27. //
  28. // SHA256/512 for ARMv8.
  29. //
  30. // Performance in cycles per processed byte and improvement coefficient
  31. // over code generated with "default" compiler:
  32. //
  33. // SHA256-hw SHA256(*) SHA512
  34. // Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**))
  35. // Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***))
  36. // Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***))
  37. // Denver 2.01 10.5 (+26%) 6.70 (+8%)
  38. // X-Gene 20.0 (+100%) 12.8 (+300%(***))
  39. // Mongoose 2.36 13.0 (+50%) 8.36 (+33%)
  40. //
  41. // (*) Software SHA256 results are of lesser relevance, presented
  42. // mostly for informational purposes.
  43. // (**) The result is a trade-off: it's possible to improve it by
  44. // 10% (or by 1 cycle per round), but at the cost of 20% loss
  45. // on Cortex-A53 (or by 4 cycles per round).
  46. // (***) Super-impressive coefficients over gcc-generated code are
  47. // indication of some compiler "pathology", most notably code
  48. // generated with -mgeneral-regs-only is significanty faster
  49. // and the gap is only 40-90%.
  50. #ifndef __KERNEL__
  51. # include <openssl/arm_arch.h>
  52. #endif
  53. .text
  54. .private_extern _OPENSSL_armcap_P
  55. .globl _sha256_block_data_order
  56. .private_extern _sha256_block_data_order
  57. .align 6
  58. _sha256_block_data_order:
  59. AARCH64_VALID_CALL_TARGET
  60. #ifndef __KERNEL__
  61. #if __has_feature(hwaddress_sanitizer) && __clang_major__ >= 10
  62. adrp x16,:pg_hi21_nc:_OPENSSL_armcap_P
  63. #else
  64. adrp x16,_OPENSSL_armcap_P@PAGE
  65. #endif
  66. ldr w16,[x16,_OPENSSL_armcap_P@PAGEOFF]
  67. tst w16,#ARMV8_SHA256
  68. b.ne Lv8_entry
  69. #endif
  70. AARCH64_SIGN_LINK_REGISTER
  71. stp x29,x30,[sp,#-128]!
  72. add x29,sp,#0
  73. stp x19,x20,[sp,#16]
  74. stp x21,x22,[sp,#32]
  75. stp x23,x24,[sp,#48]
  76. stp x25,x26,[sp,#64]
  77. stp x27,x28,[sp,#80]
  78. sub sp,sp,#4*4
  79. ldp w20,w21,[x0] // load context
  80. ldp w22,w23,[x0,#2*4]
  81. ldp w24,w25,[x0,#4*4]
  82. add x2,x1,x2,lsl#6 // end of input
  83. ldp w26,w27,[x0,#6*4]
  84. adrp x30,LK256@PAGE
  85. add x30,x30,LK256@PAGEOFF
  86. stp x0,x2,[x29,#96]
  87. Loop:
  88. ldp w3,w4,[x1],#2*4
  89. ldr w19,[x30],#4 // *K++
  90. eor w28,w21,w22 // magic seed
  91. str x1,[x29,#112]
  92. #ifndef __ARMEB__
  93. rev w3,w3 // 0
  94. #endif
  95. ror w16,w24,#6
  96. add w27,w27,w19 // h+=K[i]
  97. eor w6,w24,w24,ror#14
  98. and w17,w25,w24
  99. bic w19,w26,w24
  100. add w27,w27,w3 // h+=X[i]
  101. orr w17,w17,w19 // Ch(e,f,g)
  102. eor w19,w20,w21 // a^b, b^c in next round
  103. eor w16,w16,w6,ror#11 // Sigma1(e)
  104. ror w6,w20,#2
  105. add w27,w27,w17 // h+=Ch(e,f,g)
  106. eor w17,w20,w20,ror#9
  107. add w27,w27,w16 // h+=Sigma1(e)
  108. and w28,w28,w19 // (b^c)&=(a^b)
  109. add w23,w23,w27 // d+=h
  110. eor w28,w28,w21 // Maj(a,b,c)
  111. eor w17,w6,w17,ror#13 // Sigma0(a)
  112. add w27,w27,w28 // h+=Maj(a,b,c)
  113. ldr w28,[x30],#4 // *K++, w19 in next round
  114. //add w27,w27,w17 // h+=Sigma0(a)
  115. #ifndef __ARMEB__
  116. rev w4,w4 // 1
  117. #endif
  118. ldp w5,w6,[x1],#2*4
  119. add w27,w27,w17 // h+=Sigma0(a)
  120. ror w16,w23,#6
  121. add w26,w26,w28 // h+=K[i]
  122. eor w7,w23,w23,ror#14
  123. and w17,w24,w23
  124. bic w28,w25,w23
  125. add w26,w26,w4 // h+=X[i]
  126. orr w17,w17,w28 // Ch(e,f,g)
  127. eor w28,w27,w20 // a^b, b^c in next round
  128. eor w16,w16,w7,ror#11 // Sigma1(e)
  129. ror w7,w27,#2
  130. add w26,w26,w17 // h+=Ch(e,f,g)
  131. eor w17,w27,w27,ror#9
  132. add w26,w26,w16 // h+=Sigma1(e)
  133. and w19,w19,w28 // (b^c)&=(a^b)
  134. add w22,w22,w26 // d+=h
  135. eor w19,w19,w20 // Maj(a,b,c)
  136. eor w17,w7,w17,ror#13 // Sigma0(a)
  137. add w26,w26,w19 // h+=Maj(a,b,c)
  138. ldr w19,[x30],#4 // *K++, w28 in next round
  139. //add w26,w26,w17 // h+=Sigma0(a)
  140. #ifndef __ARMEB__
  141. rev w5,w5 // 2
  142. #endif
  143. add w26,w26,w17 // h+=Sigma0(a)
  144. ror w16,w22,#6
  145. add w25,w25,w19 // h+=K[i]
  146. eor w8,w22,w22,ror#14
  147. and w17,w23,w22
  148. bic w19,w24,w22
  149. add w25,w25,w5 // h+=X[i]
  150. orr w17,w17,w19 // Ch(e,f,g)
  151. eor w19,w26,w27 // a^b, b^c in next round
  152. eor w16,w16,w8,ror#11 // Sigma1(e)
  153. ror w8,w26,#2
  154. add w25,w25,w17 // h+=Ch(e,f,g)
  155. eor w17,w26,w26,ror#9
  156. add w25,w25,w16 // h+=Sigma1(e)
  157. and w28,w28,w19 // (b^c)&=(a^b)
  158. add w21,w21,w25 // d+=h
  159. eor w28,w28,w27 // Maj(a,b,c)
  160. eor w17,w8,w17,ror#13 // Sigma0(a)
  161. add w25,w25,w28 // h+=Maj(a,b,c)
  162. ldr w28,[x30],#4 // *K++, w19 in next round
  163. //add w25,w25,w17 // h+=Sigma0(a)
  164. #ifndef __ARMEB__
  165. rev w6,w6 // 3
  166. #endif
  167. ldp w7,w8,[x1],#2*4
  168. add w25,w25,w17 // h+=Sigma0(a)
  169. ror w16,w21,#6
  170. add w24,w24,w28 // h+=K[i]
  171. eor w9,w21,w21,ror#14
  172. and w17,w22,w21
  173. bic w28,w23,w21
  174. add w24,w24,w6 // h+=X[i]
  175. orr w17,w17,w28 // Ch(e,f,g)
  176. eor w28,w25,w26 // a^b, b^c in next round
  177. eor w16,w16,w9,ror#11 // Sigma1(e)
  178. ror w9,w25,#2
  179. add w24,w24,w17 // h+=Ch(e,f,g)
  180. eor w17,w25,w25,ror#9
  181. add w24,w24,w16 // h+=Sigma1(e)
  182. and w19,w19,w28 // (b^c)&=(a^b)
  183. add w20,w20,w24 // d+=h
  184. eor w19,w19,w26 // Maj(a,b,c)
  185. eor w17,w9,w17,ror#13 // Sigma0(a)
  186. add w24,w24,w19 // h+=Maj(a,b,c)
  187. ldr w19,[x30],#4 // *K++, w28 in next round
  188. //add w24,w24,w17 // h+=Sigma0(a)
  189. #ifndef __ARMEB__
  190. rev w7,w7 // 4
  191. #endif
  192. add w24,w24,w17 // h+=Sigma0(a)
  193. ror w16,w20,#6
  194. add w23,w23,w19 // h+=K[i]
  195. eor w10,w20,w20,ror#14
  196. and w17,w21,w20
  197. bic w19,w22,w20
  198. add w23,w23,w7 // h+=X[i]
  199. orr w17,w17,w19 // Ch(e,f,g)
  200. eor w19,w24,w25 // a^b, b^c in next round
  201. eor w16,w16,w10,ror#11 // Sigma1(e)
  202. ror w10,w24,#2
  203. add w23,w23,w17 // h+=Ch(e,f,g)
  204. eor w17,w24,w24,ror#9
  205. add w23,w23,w16 // h+=Sigma1(e)
  206. and w28,w28,w19 // (b^c)&=(a^b)
  207. add w27,w27,w23 // d+=h
  208. eor w28,w28,w25 // Maj(a,b,c)
  209. eor w17,w10,w17,ror#13 // Sigma0(a)
  210. add w23,w23,w28 // h+=Maj(a,b,c)
  211. ldr w28,[x30],#4 // *K++, w19 in next round
  212. //add w23,w23,w17 // h+=Sigma0(a)
  213. #ifndef __ARMEB__
  214. rev w8,w8 // 5
  215. #endif
  216. ldp w9,w10,[x1],#2*4
  217. add w23,w23,w17 // h+=Sigma0(a)
  218. ror w16,w27,#6
  219. add w22,w22,w28 // h+=K[i]
  220. eor w11,w27,w27,ror#14
  221. and w17,w20,w27
  222. bic w28,w21,w27
  223. add w22,w22,w8 // h+=X[i]
  224. orr w17,w17,w28 // Ch(e,f,g)
  225. eor w28,w23,w24 // a^b, b^c in next round
  226. eor w16,w16,w11,ror#11 // Sigma1(e)
  227. ror w11,w23,#2
  228. add w22,w22,w17 // h+=Ch(e,f,g)
  229. eor w17,w23,w23,ror#9
  230. add w22,w22,w16 // h+=Sigma1(e)
  231. and w19,w19,w28 // (b^c)&=(a^b)
  232. add w26,w26,w22 // d+=h
  233. eor w19,w19,w24 // Maj(a,b,c)
  234. eor w17,w11,w17,ror#13 // Sigma0(a)
  235. add w22,w22,w19 // h+=Maj(a,b,c)
  236. ldr w19,[x30],#4 // *K++, w28 in next round
  237. //add w22,w22,w17 // h+=Sigma0(a)
  238. #ifndef __ARMEB__
  239. rev w9,w9 // 6
  240. #endif
  241. add w22,w22,w17 // h+=Sigma0(a)
  242. ror w16,w26,#6
  243. add w21,w21,w19 // h+=K[i]
  244. eor w12,w26,w26,ror#14
  245. and w17,w27,w26
  246. bic w19,w20,w26
  247. add w21,w21,w9 // h+=X[i]
  248. orr w17,w17,w19 // Ch(e,f,g)
  249. eor w19,w22,w23 // a^b, b^c in next round
  250. eor w16,w16,w12,ror#11 // Sigma1(e)
  251. ror w12,w22,#2
  252. add w21,w21,w17 // h+=Ch(e,f,g)
  253. eor w17,w22,w22,ror#9
  254. add w21,w21,w16 // h+=Sigma1(e)
  255. and w28,w28,w19 // (b^c)&=(a^b)
  256. add w25,w25,w21 // d+=h
  257. eor w28,w28,w23 // Maj(a,b,c)
  258. eor w17,w12,w17,ror#13 // Sigma0(a)
  259. add w21,w21,w28 // h+=Maj(a,b,c)
  260. ldr w28,[x30],#4 // *K++, w19 in next round
  261. //add w21,w21,w17 // h+=Sigma0(a)
  262. #ifndef __ARMEB__
  263. rev w10,w10 // 7
  264. #endif
  265. ldp w11,w12,[x1],#2*4
  266. add w21,w21,w17 // h+=Sigma0(a)
  267. ror w16,w25,#6
  268. add w20,w20,w28 // h+=K[i]
  269. eor w13,w25,w25,ror#14
  270. and w17,w26,w25
  271. bic w28,w27,w25
  272. add w20,w20,w10 // h+=X[i]
  273. orr w17,w17,w28 // Ch(e,f,g)
  274. eor w28,w21,w22 // a^b, b^c in next round
  275. eor w16,w16,w13,ror#11 // Sigma1(e)
  276. ror w13,w21,#2
  277. add w20,w20,w17 // h+=Ch(e,f,g)
  278. eor w17,w21,w21,ror#9
  279. add w20,w20,w16 // h+=Sigma1(e)
  280. and w19,w19,w28 // (b^c)&=(a^b)
  281. add w24,w24,w20 // d+=h
  282. eor w19,w19,w22 // Maj(a,b,c)
  283. eor w17,w13,w17,ror#13 // Sigma0(a)
  284. add w20,w20,w19 // h+=Maj(a,b,c)
  285. ldr w19,[x30],#4 // *K++, w28 in next round
  286. //add w20,w20,w17 // h+=Sigma0(a)
  287. #ifndef __ARMEB__
  288. rev w11,w11 // 8
  289. #endif
  290. add w20,w20,w17 // h+=Sigma0(a)
  291. ror w16,w24,#6
  292. add w27,w27,w19 // h+=K[i]
  293. eor w14,w24,w24,ror#14
  294. and w17,w25,w24
  295. bic w19,w26,w24
  296. add w27,w27,w11 // h+=X[i]
  297. orr w17,w17,w19 // Ch(e,f,g)
  298. eor w19,w20,w21 // a^b, b^c in next round
  299. eor w16,w16,w14,ror#11 // Sigma1(e)
  300. ror w14,w20,#2
  301. add w27,w27,w17 // h+=Ch(e,f,g)
  302. eor w17,w20,w20,ror#9
  303. add w27,w27,w16 // h+=Sigma1(e)
  304. and w28,w28,w19 // (b^c)&=(a^b)
  305. add w23,w23,w27 // d+=h
  306. eor w28,w28,w21 // Maj(a,b,c)
  307. eor w17,w14,w17,ror#13 // Sigma0(a)
  308. add w27,w27,w28 // h+=Maj(a,b,c)
  309. ldr w28,[x30],#4 // *K++, w19 in next round
  310. //add w27,w27,w17 // h+=Sigma0(a)
  311. #ifndef __ARMEB__
  312. rev w12,w12 // 9
  313. #endif
  314. ldp w13,w14,[x1],#2*4
  315. add w27,w27,w17 // h+=Sigma0(a)
  316. ror w16,w23,#6
  317. add w26,w26,w28 // h+=K[i]
  318. eor w15,w23,w23,ror#14
  319. and w17,w24,w23
  320. bic w28,w25,w23
  321. add w26,w26,w12 // h+=X[i]
  322. orr w17,w17,w28 // Ch(e,f,g)
  323. eor w28,w27,w20 // a^b, b^c in next round
  324. eor w16,w16,w15,ror#11 // Sigma1(e)
  325. ror w15,w27,#2
  326. add w26,w26,w17 // h+=Ch(e,f,g)
  327. eor w17,w27,w27,ror#9
  328. add w26,w26,w16 // h+=Sigma1(e)
  329. and w19,w19,w28 // (b^c)&=(a^b)
  330. add w22,w22,w26 // d+=h
  331. eor w19,w19,w20 // Maj(a,b,c)
  332. eor w17,w15,w17,ror#13 // Sigma0(a)
  333. add w26,w26,w19 // h+=Maj(a,b,c)
  334. ldr w19,[x30],#4 // *K++, w28 in next round
  335. //add w26,w26,w17 // h+=Sigma0(a)
  336. #ifndef __ARMEB__
  337. rev w13,w13 // 10
  338. #endif
  339. add w26,w26,w17 // h+=Sigma0(a)
  340. ror w16,w22,#6
  341. add w25,w25,w19 // h+=K[i]
  342. eor w0,w22,w22,ror#14
  343. and w17,w23,w22
  344. bic w19,w24,w22
  345. add w25,w25,w13 // h+=X[i]
  346. orr w17,w17,w19 // Ch(e,f,g)
  347. eor w19,w26,w27 // a^b, b^c in next round
  348. eor w16,w16,w0,ror#11 // Sigma1(e)
  349. ror w0,w26,#2
  350. add w25,w25,w17 // h+=Ch(e,f,g)
  351. eor w17,w26,w26,ror#9
  352. add w25,w25,w16 // h+=Sigma1(e)
  353. and w28,w28,w19 // (b^c)&=(a^b)
  354. add w21,w21,w25 // d+=h
  355. eor w28,w28,w27 // Maj(a,b,c)
  356. eor w17,w0,w17,ror#13 // Sigma0(a)
  357. add w25,w25,w28 // h+=Maj(a,b,c)
  358. ldr w28,[x30],#4 // *K++, w19 in next round
  359. //add w25,w25,w17 // h+=Sigma0(a)
  360. #ifndef __ARMEB__
  361. rev w14,w14 // 11
  362. #endif
  363. ldp w15,w0,[x1],#2*4
  364. add w25,w25,w17 // h+=Sigma0(a)
  365. str w6,[sp,#12]
  366. ror w16,w21,#6
  367. add w24,w24,w28 // h+=K[i]
  368. eor w6,w21,w21,ror#14
  369. and w17,w22,w21
  370. bic w28,w23,w21
  371. add w24,w24,w14 // h+=X[i]
  372. orr w17,w17,w28 // Ch(e,f,g)
  373. eor w28,w25,w26 // a^b, b^c in next round
  374. eor w16,w16,w6,ror#11 // Sigma1(e)
  375. ror w6,w25,#2
  376. add w24,w24,w17 // h+=Ch(e,f,g)
  377. eor w17,w25,w25,ror#9
  378. add w24,w24,w16 // h+=Sigma1(e)
  379. and w19,w19,w28 // (b^c)&=(a^b)
  380. add w20,w20,w24 // d+=h
  381. eor w19,w19,w26 // Maj(a,b,c)
  382. eor w17,w6,w17,ror#13 // Sigma0(a)
  383. add w24,w24,w19 // h+=Maj(a,b,c)
  384. ldr w19,[x30],#4 // *K++, w28 in next round
  385. //add w24,w24,w17 // h+=Sigma0(a)
  386. #ifndef __ARMEB__
  387. rev w15,w15 // 12
  388. #endif
  389. add w24,w24,w17 // h+=Sigma0(a)
  390. str w7,[sp,#0]
  391. ror w16,w20,#6
  392. add w23,w23,w19 // h+=K[i]
  393. eor w7,w20,w20,ror#14
  394. and w17,w21,w20
  395. bic w19,w22,w20
  396. add w23,w23,w15 // h+=X[i]
  397. orr w17,w17,w19 // Ch(e,f,g)
  398. eor w19,w24,w25 // a^b, b^c in next round
  399. eor w16,w16,w7,ror#11 // Sigma1(e)
  400. ror w7,w24,#2
  401. add w23,w23,w17 // h+=Ch(e,f,g)
  402. eor w17,w24,w24,ror#9
  403. add w23,w23,w16 // h+=Sigma1(e)
  404. and w28,w28,w19 // (b^c)&=(a^b)
  405. add w27,w27,w23 // d+=h
  406. eor w28,w28,w25 // Maj(a,b,c)
  407. eor w17,w7,w17,ror#13 // Sigma0(a)
  408. add w23,w23,w28 // h+=Maj(a,b,c)
  409. ldr w28,[x30],#4 // *K++, w19 in next round
  410. //add w23,w23,w17 // h+=Sigma0(a)
  411. #ifndef __ARMEB__
  412. rev w0,w0 // 13
  413. #endif
  414. ldp w1,w2,[x1]
  415. add w23,w23,w17 // h+=Sigma0(a)
  416. str w8,[sp,#4]
  417. ror w16,w27,#6
  418. add w22,w22,w28 // h+=K[i]
  419. eor w8,w27,w27,ror#14
  420. and w17,w20,w27
  421. bic w28,w21,w27
  422. add w22,w22,w0 // h+=X[i]
  423. orr w17,w17,w28 // Ch(e,f,g)
  424. eor w28,w23,w24 // a^b, b^c in next round
  425. eor w16,w16,w8,ror#11 // Sigma1(e)
  426. ror w8,w23,#2
  427. add w22,w22,w17 // h+=Ch(e,f,g)
  428. eor w17,w23,w23,ror#9
  429. add w22,w22,w16 // h+=Sigma1(e)
  430. and w19,w19,w28 // (b^c)&=(a^b)
  431. add w26,w26,w22 // d+=h
  432. eor w19,w19,w24 // Maj(a,b,c)
  433. eor w17,w8,w17,ror#13 // Sigma0(a)
  434. add w22,w22,w19 // h+=Maj(a,b,c)
  435. ldr w19,[x30],#4 // *K++, w28 in next round
  436. //add w22,w22,w17 // h+=Sigma0(a)
  437. #ifndef __ARMEB__
  438. rev w1,w1 // 14
  439. #endif
  440. ldr w6,[sp,#12]
  441. add w22,w22,w17 // h+=Sigma0(a)
  442. str w9,[sp,#8]
  443. ror w16,w26,#6
  444. add w21,w21,w19 // h+=K[i]
  445. eor w9,w26,w26,ror#14
  446. and w17,w27,w26
  447. bic w19,w20,w26
  448. add w21,w21,w1 // h+=X[i]
  449. orr w17,w17,w19 // Ch(e,f,g)
  450. eor w19,w22,w23 // a^b, b^c in next round
  451. eor w16,w16,w9,ror#11 // Sigma1(e)
  452. ror w9,w22,#2
  453. add w21,w21,w17 // h+=Ch(e,f,g)
  454. eor w17,w22,w22,ror#9
  455. add w21,w21,w16 // h+=Sigma1(e)
  456. and w28,w28,w19 // (b^c)&=(a^b)
  457. add w25,w25,w21 // d+=h
  458. eor w28,w28,w23 // Maj(a,b,c)
  459. eor w17,w9,w17,ror#13 // Sigma0(a)
  460. add w21,w21,w28 // h+=Maj(a,b,c)
  461. ldr w28,[x30],#4 // *K++, w19 in next round
  462. //add w21,w21,w17 // h+=Sigma0(a)
  463. #ifndef __ARMEB__
  464. rev w2,w2 // 15
  465. #endif
  466. ldr w7,[sp,#0]
  467. add w21,w21,w17 // h+=Sigma0(a)
  468. str w10,[sp,#12]
  469. ror w16,w25,#6
  470. add w20,w20,w28 // h+=K[i]
  471. ror w9,w4,#7
  472. and w17,w26,w25
  473. ror w8,w1,#17
  474. bic w28,w27,w25
  475. ror w10,w21,#2
  476. add w20,w20,w2 // h+=X[i]
  477. eor w16,w16,w25,ror#11
  478. eor w9,w9,w4,ror#18
  479. orr w17,w17,w28 // Ch(e,f,g)
  480. eor w28,w21,w22 // a^b, b^c in next round
  481. eor w16,w16,w25,ror#25 // Sigma1(e)
  482. eor w10,w10,w21,ror#13
  483. add w20,w20,w17 // h+=Ch(e,f,g)
  484. and w19,w19,w28 // (b^c)&=(a^b)
  485. eor w8,w8,w1,ror#19
  486. eor w9,w9,w4,lsr#3 // sigma0(X[i+1])
  487. add w20,w20,w16 // h+=Sigma1(e)
  488. eor w19,w19,w22 // Maj(a,b,c)
  489. eor w17,w10,w21,ror#22 // Sigma0(a)
  490. eor w8,w8,w1,lsr#10 // sigma1(X[i+14])
  491. add w3,w3,w12
  492. add w24,w24,w20 // d+=h
  493. add w20,w20,w19 // h+=Maj(a,b,c)
  494. ldr w19,[x30],#4 // *K++, w28 in next round
  495. add w3,w3,w9
  496. add w20,w20,w17 // h+=Sigma0(a)
  497. add w3,w3,w8
  498. Loop_16_xx:
  499. ldr w8,[sp,#4]
  500. str w11,[sp,#0]
  501. ror w16,w24,#6
  502. add w27,w27,w19 // h+=K[i]
  503. ror w10,w5,#7
  504. and w17,w25,w24
  505. ror w9,w2,#17
  506. bic w19,w26,w24
  507. ror w11,w20,#2
  508. add w27,w27,w3 // h+=X[i]
  509. eor w16,w16,w24,ror#11
  510. eor w10,w10,w5,ror#18
  511. orr w17,w17,w19 // Ch(e,f,g)
  512. eor w19,w20,w21 // a^b, b^c in next round
  513. eor w16,w16,w24,ror#25 // Sigma1(e)
  514. eor w11,w11,w20,ror#13
  515. add w27,w27,w17 // h+=Ch(e,f,g)
  516. and w28,w28,w19 // (b^c)&=(a^b)
  517. eor w9,w9,w2,ror#19
  518. eor w10,w10,w5,lsr#3 // sigma0(X[i+1])
  519. add w27,w27,w16 // h+=Sigma1(e)
  520. eor w28,w28,w21 // Maj(a,b,c)
  521. eor w17,w11,w20,ror#22 // Sigma0(a)
  522. eor w9,w9,w2,lsr#10 // sigma1(X[i+14])
  523. add w4,w4,w13
  524. add w23,w23,w27 // d+=h
  525. add w27,w27,w28 // h+=Maj(a,b,c)
  526. ldr w28,[x30],#4 // *K++, w19 in next round
  527. add w4,w4,w10
  528. add w27,w27,w17 // h+=Sigma0(a)
  529. add w4,w4,w9
  530. ldr w9,[sp,#8]
  531. str w12,[sp,#4]
  532. ror w16,w23,#6
  533. add w26,w26,w28 // h+=K[i]
  534. ror w11,w6,#7
  535. and w17,w24,w23
  536. ror w10,w3,#17
  537. bic w28,w25,w23
  538. ror w12,w27,#2
  539. add w26,w26,w4 // h+=X[i]
  540. eor w16,w16,w23,ror#11
  541. eor w11,w11,w6,ror#18
  542. orr w17,w17,w28 // Ch(e,f,g)
  543. eor w28,w27,w20 // a^b, b^c in next round
  544. eor w16,w16,w23,ror#25 // Sigma1(e)
  545. eor w12,w12,w27,ror#13
  546. add w26,w26,w17 // h+=Ch(e,f,g)
  547. and w19,w19,w28 // (b^c)&=(a^b)
  548. eor w10,w10,w3,ror#19
  549. eor w11,w11,w6,lsr#3 // sigma0(X[i+1])
  550. add w26,w26,w16 // h+=Sigma1(e)
  551. eor w19,w19,w20 // Maj(a,b,c)
  552. eor w17,w12,w27,ror#22 // Sigma0(a)
  553. eor w10,w10,w3,lsr#10 // sigma1(X[i+14])
  554. add w5,w5,w14
  555. add w22,w22,w26 // d+=h
  556. add w26,w26,w19 // h+=Maj(a,b,c)
  557. ldr w19,[x30],#4 // *K++, w28 in next round
  558. add w5,w5,w11
  559. add w26,w26,w17 // h+=Sigma0(a)
  560. add w5,w5,w10
  561. ldr w10,[sp,#12]
  562. str w13,[sp,#8]
  563. ror w16,w22,#6
  564. add w25,w25,w19 // h+=K[i]
  565. ror w12,w7,#7
  566. and w17,w23,w22
  567. ror w11,w4,#17
  568. bic w19,w24,w22
  569. ror w13,w26,#2
  570. add w25,w25,w5 // h+=X[i]
  571. eor w16,w16,w22,ror#11
  572. eor w12,w12,w7,ror#18
  573. orr w17,w17,w19 // Ch(e,f,g)
  574. eor w19,w26,w27 // a^b, b^c in next round
  575. eor w16,w16,w22,ror#25 // Sigma1(e)
  576. eor w13,w13,w26,ror#13
  577. add w25,w25,w17 // h+=Ch(e,f,g)
  578. and w28,w28,w19 // (b^c)&=(a^b)
  579. eor w11,w11,w4,ror#19
  580. eor w12,w12,w7,lsr#3 // sigma0(X[i+1])
  581. add w25,w25,w16 // h+=Sigma1(e)
  582. eor w28,w28,w27 // Maj(a,b,c)
  583. eor w17,w13,w26,ror#22 // Sigma0(a)
  584. eor w11,w11,w4,lsr#10 // sigma1(X[i+14])
  585. add w6,w6,w15
  586. add w21,w21,w25 // d+=h
  587. add w25,w25,w28 // h+=Maj(a,b,c)
  588. ldr w28,[x30],#4 // *K++, w19 in next round
  589. add w6,w6,w12
  590. add w25,w25,w17 // h+=Sigma0(a)
  591. add w6,w6,w11
  592. ldr w11,[sp,#0]
  593. str w14,[sp,#12]
  594. ror w16,w21,#6
  595. add w24,w24,w28 // h+=K[i]
  596. ror w13,w8,#7
  597. and w17,w22,w21
  598. ror w12,w5,#17
  599. bic w28,w23,w21
  600. ror w14,w25,#2
  601. add w24,w24,w6 // h+=X[i]
  602. eor w16,w16,w21,ror#11
  603. eor w13,w13,w8,ror#18
  604. orr w17,w17,w28 // Ch(e,f,g)
  605. eor w28,w25,w26 // a^b, b^c in next round
  606. eor w16,w16,w21,ror#25 // Sigma1(e)
  607. eor w14,w14,w25,ror#13
  608. add w24,w24,w17 // h+=Ch(e,f,g)
  609. and w19,w19,w28 // (b^c)&=(a^b)
  610. eor w12,w12,w5,ror#19
  611. eor w13,w13,w8,lsr#3 // sigma0(X[i+1])
  612. add w24,w24,w16 // h+=Sigma1(e)
  613. eor w19,w19,w26 // Maj(a,b,c)
  614. eor w17,w14,w25,ror#22 // Sigma0(a)
  615. eor w12,w12,w5,lsr#10 // sigma1(X[i+14])
  616. add w7,w7,w0
  617. add w20,w20,w24 // d+=h
  618. add w24,w24,w19 // h+=Maj(a,b,c)
  619. ldr w19,[x30],#4 // *K++, w28 in next round
  620. add w7,w7,w13
  621. add w24,w24,w17 // h+=Sigma0(a)
  622. add w7,w7,w12
  623. ldr w12,[sp,#4]
  624. str w15,[sp,#0]
  625. ror w16,w20,#6
  626. add w23,w23,w19 // h+=K[i]
  627. ror w14,w9,#7
  628. and w17,w21,w20
  629. ror w13,w6,#17
  630. bic w19,w22,w20
  631. ror w15,w24,#2
  632. add w23,w23,w7 // h+=X[i]
  633. eor w16,w16,w20,ror#11
  634. eor w14,w14,w9,ror#18
  635. orr w17,w17,w19 // Ch(e,f,g)
  636. eor w19,w24,w25 // a^b, b^c in next round
  637. eor w16,w16,w20,ror#25 // Sigma1(e)
  638. eor w15,w15,w24,ror#13
  639. add w23,w23,w17 // h+=Ch(e,f,g)
  640. and w28,w28,w19 // (b^c)&=(a^b)
  641. eor w13,w13,w6,ror#19
  642. eor w14,w14,w9,lsr#3 // sigma0(X[i+1])
  643. add w23,w23,w16 // h+=Sigma1(e)
  644. eor w28,w28,w25 // Maj(a,b,c)
  645. eor w17,w15,w24,ror#22 // Sigma0(a)
  646. eor w13,w13,w6,lsr#10 // sigma1(X[i+14])
  647. add w8,w8,w1
  648. add w27,w27,w23 // d+=h
  649. add w23,w23,w28 // h+=Maj(a,b,c)
  650. ldr w28,[x30],#4 // *K++, w19 in next round
  651. add w8,w8,w14
  652. add w23,w23,w17 // h+=Sigma0(a)
  653. add w8,w8,w13
  654. ldr w13,[sp,#8]
  655. str w0,[sp,#4]
  656. ror w16,w27,#6
  657. add w22,w22,w28 // h+=K[i]
  658. ror w15,w10,#7
  659. and w17,w20,w27
  660. ror w14,w7,#17
  661. bic w28,w21,w27
  662. ror w0,w23,#2
  663. add w22,w22,w8 // h+=X[i]
  664. eor w16,w16,w27,ror#11
  665. eor w15,w15,w10,ror#18
  666. orr w17,w17,w28 // Ch(e,f,g)
  667. eor w28,w23,w24 // a^b, b^c in next round
  668. eor w16,w16,w27,ror#25 // Sigma1(e)
  669. eor w0,w0,w23,ror#13
  670. add w22,w22,w17 // h+=Ch(e,f,g)
  671. and w19,w19,w28 // (b^c)&=(a^b)
  672. eor w14,w14,w7,ror#19
  673. eor w15,w15,w10,lsr#3 // sigma0(X[i+1])
  674. add w22,w22,w16 // h+=Sigma1(e)
  675. eor w19,w19,w24 // Maj(a,b,c)
  676. eor w17,w0,w23,ror#22 // Sigma0(a)
  677. eor w14,w14,w7,lsr#10 // sigma1(X[i+14])
  678. add w9,w9,w2
  679. add w26,w26,w22 // d+=h
  680. add w22,w22,w19 // h+=Maj(a,b,c)
  681. ldr w19,[x30],#4 // *K++, w28 in next round
  682. add w9,w9,w15
  683. add w22,w22,w17 // h+=Sigma0(a)
  684. add w9,w9,w14
  685. ldr w14,[sp,#12]
  686. str w1,[sp,#8]
  687. ror w16,w26,#6
  688. add w21,w21,w19 // h+=K[i]
  689. ror w0,w11,#7
  690. and w17,w27,w26
  691. ror w15,w8,#17
  692. bic w19,w20,w26
  693. ror w1,w22,#2
  694. add w21,w21,w9 // h+=X[i]
  695. eor w16,w16,w26,ror#11
  696. eor w0,w0,w11,ror#18
  697. orr w17,w17,w19 // Ch(e,f,g)
  698. eor w19,w22,w23 // a^b, b^c in next round
  699. eor w16,w16,w26,ror#25 // Sigma1(e)
  700. eor w1,w1,w22,ror#13
  701. add w21,w21,w17 // h+=Ch(e,f,g)
  702. and w28,w28,w19 // (b^c)&=(a^b)
  703. eor w15,w15,w8,ror#19
  704. eor w0,w0,w11,lsr#3 // sigma0(X[i+1])
  705. add w21,w21,w16 // h+=Sigma1(e)
  706. eor w28,w28,w23 // Maj(a,b,c)
  707. eor w17,w1,w22,ror#22 // Sigma0(a)
  708. eor w15,w15,w8,lsr#10 // sigma1(X[i+14])
  709. add w10,w10,w3
  710. add w25,w25,w21 // d+=h
  711. add w21,w21,w28 // h+=Maj(a,b,c)
  712. ldr w28,[x30],#4 // *K++, w19 in next round
  713. add w10,w10,w0
  714. add w21,w21,w17 // h+=Sigma0(a)
  715. add w10,w10,w15
  716. ldr w15,[sp,#0]
  717. str w2,[sp,#12]
  718. ror w16,w25,#6
  719. add w20,w20,w28 // h+=K[i]
  720. ror w1,w12,#7
  721. and w17,w26,w25
  722. ror w0,w9,#17
  723. bic w28,w27,w25
  724. ror w2,w21,#2
  725. add w20,w20,w10 // h+=X[i]
  726. eor w16,w16,w25,ror#11
  727. eor w1,w1,w12,ror#18
  728. orr w17,w17,w28 // Ch(e,f,g)
  729. eor w28,w21,w22 // a^b, b^c in next round
  730. eor w16,w16,w25,ror#25 // Sigma1(e)
  731. eor w2,w2,w21,ror#13
  732. add w20,w20,w17 // h+=Ch(e,f,g)
  733. and w19,w19,w28 // (b^c)&=(a^b)
  734. eor w0,w0,w9,ror#19
  735. eor w1,w1,w12,lsr#3 // sigma0(X[i+1])
  736. add w20,w20,w16 // h+=Sigma1(e)
  737. eor w19,w19,w22 // Maj(a,b,c)
  738. eor w17,w2,w21,ror#22 // Sigma0(a)
  739. eor w0,w0,w9,lsr#10 // sigma1(X[i+14])
  740. add w11,w11,w4
  741. add w24,w24,w20 // d+=h
  742. add w20,w20,w19 // h+=Maj(a,b,c)
  743. ldr w19,[x30],#4 // *K++, w28 in next round
  744. add w11,w11,w1
  745. add w20,w20,w17 // h+=Sigma0(a)
  746. add w11,w11,w0
  747. ldr w0,[sp,#4]
  748. str w3,[sp,#0]
  749. ror w16,w24,#6
  750. add w27,w27,w19 // h+=K[i]
  751. ror w2,w13,#7
  752. and w17,w25,w24
  753. ror w1,w10,#17
  754. bic w19,w26,w24
  755. ror w3,w20,#2
  756. add w27,w27,w11 // h+=X[i]
  757. eor w16,w16,w24,ror#11
  758. eor w2,w2,w13,ror#18
  759. orr w17,w17,w19 // Ch(e,f,g)
  760. eor w19,w20,w21 // a^b, b^c in next round
  761. eor w16,w16,w24,ror#25 // Sigma1(e)
  762. eor w3,w3,w20,ror#13
  763. add w27,w27,w17 // h+=Ch(e,f,g)
  764. and w28,w28,w19 // (b^c)&=(a^b)
  765. eor w1,w1,w10,ror#19
  766. eor w2,w2,w13,lsr#3 // sigma0(X[i+1])
  767. add w27,w27,w16 // h+=Sigma1(e)
  768. eor w28,w28,w21 // Maj(a,b,c)
  769. eor w17,w3,w20,ror#22 // Sigma0(a)
  770. eor w1,w1,w10,lsr#10 // sigma1(X[i+14])
  771. add w12,w12,w5
  772. add w23,w23,w27 // d+=h
  773. add w27,w27,w28 // h+=Maj(a,b,c)
  774. ldr w28,[x30],#4 // *K++, w19 in next round
  775. add w12,w12,w2
  776. add w27,w27,w17 // h+=Sigma0(a)
  777. add w12,w12,w1
  778. ldr w1,[sp,#8]
  779. str w4,[sp,#4]
  780. ror w16,w23,#6
  781. add w26,w26,w28 // h+=K[i]
  782. ror w3,w14,#7
  783. and w17,w24,w23
  784. ror w2,w11,#17
  785. bic w28,w25,w23
  786. ror w4,w27,#2
  787. add w26,w26,w12 // h+=X[i]
  788. eor w16,w16,w23,ror#11
  789. eor w3,w3,w14,ror#18
  790. orr w17,w17,w28 // Ch(e,f,g)
  791. eor w28,w27,w20 // a^b, b^c in next round
  792. eor w16,w16,w23,ror#25 // Sigma1(e)
  793. eor w4,w4,w27,ror#13
  794. add w26,w26,w17 // h+=Ch(e,f,g)
  795. and w19,w19,w28 // (b^c)&=(a^b)
  796. eor w2,w2,w11,ror#19
  797. eor w3,w3,w14,lsr#3 // sigma0(X[i+1])
  798. add w26,w26,w16 // h+=Sigma1(e)
  799. eor w19,w19,w20 // Maj(a,b,c)
  800. eor w17,w4,w27,ror#22 // Sigma0(a)
  801. eor w2,w2,w11,lsr#10 // sigma1(X[i+14])
  802. add w13,w13,w6
  803. add w22,w22,w26 // d+=h
  804. add w26,w26,w19 // h+=Maj(a,b,c)
  805. ldr w19,[x30],#4 // *K++, w28 in next round
  806. add w13,w13,w3
  807. add w26,w26,w17 // h+=Sigma0(a)
  808. add w13,w13,w2
  809. ldr w2,[sp,#12]
  810. str w5,[sp,#8]
  811. ror w16,w22,#6
  812. add w25,w25,w19 // h+=K[i]
  813. ror w4,w15,#7
  814. and w17,w23,w22
  815. ror w3,w12,#17
  816. bic w19,w24,w22
  817. ror w5,w26,#2
  818. add w25,w25,w13 // h+=X[i]
  819. eor w16,w16,w22,ror#11
  820. eor w4,w4,w15,ror#18
  821. orr w17,w17,w19 // Ch(e,f,g)
  822. eor w19,w26,w27 // a^b, b^c in next round
  823. eor w16,w16,w22,ror#25 // Sigma1(e)
  824. eor w5,w5,w26,ror#13
  825. add w25,w25,w17 // h+=Ch(e,f,g)
  826. and w28,w28,w19 // (b^c)&=(a^b)
  827. eor w3,w3,w12,ror#19
  828. eor w4,w4,w15,lsr#3 // sigma0(X[i+1])
  829. add w25,w25,w16 // h+=Sigma1(e)
  830. eor w28,w28,w27 // Maj(a,b,c)
  831. eor w17,w5,w26,ror#22 // Sigma0(a)
  832. eor w3,w3,w12,lsr#10 // sigma1(X[i+14])
  833. add w14,w14,w7
  834. add w21,w21,w25 // d+=h
  835. add w25,w25,w28 // h+=Maj(a,b,c)
  836. ldr w28,[x30],#4 // *K++, w19 in next round
  837. add w14,w14,w4
  838. add w25,w25,w17 // h+=Sigma0(a)
  839. add w14,w14,w3
  840. ldr w3,[sp,#0]
  841. str w6,[sp,#12]
  842. ror w16,w21,#6
  843. add w24,w24,w28 // h+=K[i]
  844. ror w5,w0,#7
  845. and w17,w22,w21
  846. ror w4,w13,#17
  847. bic w28,w23,w21
  848. ror w6,w25,#2
  849. add w24,w24,w14 // h+=X[i]
  850. eor w16,w16,w21,ror#11
  851. eor w5,w5,w0,ror#18
  852. orr w17,w17,w28 // Ch(e,f,g)
  853. eor w28,w25,w26 // a^b, b^c in next round
  854. eor w16,w16,w21,ror#25 // Sigma1(e)
  855. eor w6,w6,w25,ror#13
  856. add w24,w24,w17 // h+=Ch(e,f,g)
  857. and w19,w19,w28 // (b^c)&=(a^b)
  858. eor w4,w4,w13,ror#19
  859. eor w5,w5,w0,lsr#3 // sigma0(X[i+1])
  860. add w24,w24,w16 // h+=Sigma1(e)
  861. eor w19,w19,w26 // Maj(a,b,c)
  862. eor w17,w6,w25,ror#22 // Sigma0(a)
  863. eor w4,w4,w13,lsr#10 // sigma1(X[i+14])
  864. add w15,w15,w8
  865. add w20,w20,w24 // d+=h
  866. add w24,w24,w19 // h+=Maj(a,b,c)
  867. ldr w19,[x30],#4 // *K++, w28 in next round
  868. add w15,w15,w5
  869. add w24,w24,w17 // h+=Sigma0(a)
  870. add w15,w15,w4
  871. ldr w4,[sp,#4]
  872. str w7,[sp,#0]
  873. ror w16,w20,#6
  874. add w23,w23,w19 // h+=K[i]
  875. ror w6,w1,#7
  876. and w17,w21,w20
  877. ror w5,w14,#17
  878. bic w19,w22,w20
  879. ror w7,w24,#2
  880. add w23,w23,w15 // h+=X[i]
  881. eor w16,w16,w20,ror#11
  882. eor w6,w6,w1,ror#18
  883. orr w17,w17,w19 // Ch(e,f,g)
  884. eor w19,w24,w25 // a^b, b^c in next round
  885. eor w16,w16,w20,ror#25 // Sigma1(e)
  886. eor w7,w7,w24,ror#13
  887. add w23,w23,w17 // h+=Ch(e,f,g)
  888. and w28,w28,w19 // (b^c)&=(a^b)
  889. eor w5,w5,w14,ror#19
  890. eor w6,w6,w1,lsr#3 // sigma0(X[i+1])
  891. add w23,w23,w16 // h+=Sigma1(e)
  892. eor w28,w28,w25 // Maj(a,b,c)
  893. eor w17,w7,w24,ror#22 // Sigma0(a)
  894. eor w5,w5,w14,lsr#10 // sigma1(X[i+14])
  895. add w0,w0,w9
  896. add w27,w27,w23 // d+=h
  897. add w23,w23,w28 // h+=Maj(a,b,c)
  898. ldr w28,[x30],#4 // *K++, w19 in next round
  899. add w0,w0,w6
  900. add w23,w23,w17 // h+=Sigma0(a)
  901. add w0,w0,w5
  902. ldr w5,[sp,#8]
  903. str w8,[sp,#4]
  904. ror w16,w27,#6
  905. add w22,w22,w28 // h+=K[i]
  906. ror w7,w2,#7
  907. and w17,w20,w27
  908. ror w6,w15,#17
  909. bic w28,w21,w27
  910. ror w8,w23,#2
  911. add w22,w22,w0 // h+=X[i]
  912. eor w16,w16,w27,ror#11
  913. eor w7,w7,w2,ror#18
  914. orr w17,w17,w28 // Ch(e,f,g)
  915. eor w28,w23,w24 // a^b, b^c in next round
  916. eor w16,w16,w27,ror#25 // Sigma1(e)
  917. eor w8,w8,w23,ror#13
  918. add w22,w22,w17 // h+=Ch(e,f,g)
  919. and w19,w19,w28 // (b^c)&=(a^b)
  920. eor w6,w6,w15,ror#19
  921. eor w7,w7,w2,lsr#3 // sigma0(X[i+1])
  922. add w22,w22,w16 // h+=Sigma1(e)
  923. eor w19,w19,w24 // Maj(a,b,c)
  924. eor w17,w8,w23,ror#22 // Sigma0(a)
  925. eor w6,w6,w15,lsr#10 // sigma1(X[i+14])
  926. add w1,w1,w10
  927. add w26,w26,w22 // d+=h
  928. add w22,w22,w19 // h+=Maj(a,b,c)
  929. ldr w19,[x30],#4 // *K++, w28 in next round
  930. add w1,w1,w7
  931. add w22,w22,w17 // h+=Sigma0(a)
  932. add w1,w1,w6
  933. ldr w6,[sp,#12]
  934. str w9,[sp,#8]
  935. ror w16,w26,#6
  936. add w21,w21,w19 // h+=K[i]
  937. ror w8,w3,#7
  938. and w17,w27,w26
  939. ror w7,w0,#17
  940. bic w19,w20,w26
  941. ror w9,w22,#2
  942. add w21,w21,w1 // h+=X[i]
  943. eor w16,w16,w26,ror#11
  944. eor w8,w8,w3,ror#18
  945. orr w17,w17,w19 // Ch(e,f,g)
  946. eor w19,w22,w23 // a^b, b^c in next round
  947. eor w16,w16,w26,ror#25 // Sigma1(e)
  948. eor w9,w9,w22,ror#13
  949. add w21,w21,w17 // h+=Ch(e,f,g)
  950. and w28,w28,w19 // (b^c)&=(a^b)
  951. eor w7,w7,w0,ror#19
  952. eor w8,w8,w3,lsr#3 // sigma0(X[i+1])
  953. add w21,w21,w16 // h+=Sigma1(e)
  954. eor w28,w28,w23 // Maj(a,b,c)
  955. eor w17,w9,w22,ror#22 // Sigma0(a)
  956. eor w7,w7,w0,lsr#10 // sigma1(X[i+14])
  957. add w2,w2,w11
  958. add w25,w25,w21 // d+=h
  959. add w21,w21,w28 // h+=Maj(a,b,c)
  960. ldr w28,[x30],#4 // *K++, w19 in next round
  961. add w2,w2,w8
  962. add w21,w21,w17 // h+=Sigma0(a)
  963. add w2,w2,w7
  964. ldr w7,[sp,#0]
  965. str w10,[sp,#12]
  966. ror w16,w25,#6
  967. add w20,w20,w28 // h+=K[i]
  968. ror w9,w4,#7
  969. and w17,w26,w25
  970. ror w8,w1,#17
  971. bic w28,w27,w25
  972. ror w10,w21,#2
  973. add w20,w20,w2 // h+=X[i]
  974. eor w16,w16,w25,ror#11
  975. eor w9,w9,w4,ror#18
  976. orr w17,w17,w28 // Ch(e,f,g)
  977. eor w28,w21,w22 // a^b, b^c in next round
  978. eor w16,w16,w25,ror#25 // Sigma1(e)
  979. eor w10,w10,w21,ror#13
  980. add w20,w20,w17 // h+=Ch(e,f,g)
  981. and w19,w19,w28 // (b^c)&=(a^b)
  982. eor w8,w8,w1,ror#19
  983. eor w9,w9,w4,lsr#3 // sigma0(X[i+1])
  984. add w20,w20,w16 // h+=Sigma1(e)
  985. eor w19,w19,w22 // Maj(a,b,c)
  986. eor w17,w10,w21,ror#22 // Sigma0(a)
  987. eor w8,w8,w1,lsr#10 // sigma1(X[i+14])
  988. add w3,w3,w12
  989. add w24,w24,w20 // d+=h
  990. add w20,w20,w19 // h+=Maj(a,b,c)
  991. ldr w19,[x30],#4 // *K++, w28 in next round
  992. add w3,w3,w9
  993. add w20,w20,w17 // h+=Sigma0(a)
  994. add w3,w3,w8
  995. cbnz w19,Loop_16_xx
  996. ldp x0,x2,[x29,#96]
  997. ldr x1,[x29,#112]
  998. sub x30,x30,#260 // rewind
  999. ldp w3,w4,[x0]
  1000. ldp w5,w6,[x0,#2*4]
  1001. add x1,x1,#14*4 // advance input pointer
  1002. ldp w7,w8,[x0,#4*4]
  1003. add w20,w20,w3
  1004. ldp w9,w10,[x0,#6*4]
  1005. add w21,w21,w4
  1006. add w22,w22,w5
  1007. add w23,w23,w6
  1008. stp w20,w21,[x0]
  1009. add w24,w24,w7
  1010. add w25,w25,w8
  1011. stp w22,w23,[x0,#2*4]
  1012. add w26,w26,w9
  1013. add w27,w27,w10
  1014. cmp x1,x2
  1015. stp w24,w25,[x0,#4*4]
  1016. stp w26,w27,[x0,#6*4]
  1017. b.ne Loop
  1018. ldp x19,x20,[x29,#16]
  1019. add sp,sp,#4*4
  1020. ldp x21,x22,[x29,#32]
  1021. ldp x23,x24,[x29,#48]
  1022. ldp x25,x26,[x29,#64]
  1023. ldp x27,x28,[x29,#80]
  1024. ldp x29,x30,[sp],#128
  1025. AARCH64_VALIDATE_LINK_REGISTER
  1026. ret
  1027. .section __TEXT,__const
  1028. .align 6
  1029. LK256:
  1030. .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
  1031. .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
  1032. .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
  1033. .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
  1034. .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
  1035. .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
  1036. .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
  1037. .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
  1038. .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
  1039. .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
  1040. .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
  1041. .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070
  1042. .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
  1043. .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
  1044. .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
  1045. .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
  1046. .long 0 //terminator
  1047. .byte 83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,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
  1048. .align 2
  1049. .align 2
  1050. .text
  1051. #ifndef __KERNEL__
  1052. .align 6
  1053. sha256_block_armv8:
  1054. Lv8_entry:
  1055. // Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later.
  1056. stp x29,x30,[sp,#-16]!
  1057. add x29,sp,#0
  1058. ld1 {v0.4s,v1.4s},[x0]
  1059. adrp x3,LK256@PAGE
  1060. add x3,x3,LK256@PAGEOFF
  1061. Loop_hw:
  1062. ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64
  1063. sub x2,x2,#1
  1064. ld1 {v16.4s},[x3],#16
  1065. rev32 v4.16b,v4.16b
  1066. rev32 v5.16b,v5.16b
  1067. rev32 v6.16b,v6.16b
  1068. rev32 v7.16b,v7.16b
  1069. orr v18.16b,v0.16b,v0.16b // offload
  1070. orr v19.16b,v1.16b,v1.16b
  1071. ld1 {v17.4s},[x3],#16
  1072. add v16.4s,v16.4s,v4.4s
  1073. .long 0x5e2828a4 //sha256su0 v4.16b,v5.16b
  1074. orr v2.16b,v0.16b,v0.16b
  1075. .long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
  1076. .long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
  1077. .long 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
  1078. ld1 {v16.4s},[x3],#16
  1079. add v17.4s,v17.4s,v5.4s
  1080. .long 0x5e2828c5 //sha256su0 v5.16b,v6.16b
  1081. orr v2.16b,v0.16b,v0.16b
  1082. .long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
  1083. .long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
  1084. .long 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
  1085. ld1 {v17.4s},[x3],#16
  1086. add v16.4s,v16.4s,v6.4s
  1087. .long 0x5e2828e6 //sha256su0 v6.16b,v7.16b
  1088. orr v2.16b,v0.16b,v0.16b
  1089. .long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
  1090. .long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
  1091. .long 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
  1092. ld1 {v16.4s},[x3],#16
  1093. add v17.4s,v17.4s,v7.4s
  1094. .long 0x5e282887 //sha256su0 v7.16b,v4.16b
  1095. orr v2.16b,v0.16b,v0.16b
  1096. .long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
  1097. .long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
  1098. .long 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
  1099. ld1 {v17.4s},[x3],#16
  1100. add v16.4s,v16.4s,v4.4s
  1101. .long 0x5e2828a4 //sha256su0 v4.16b,v5.16b
  1102. orr v2.16b,v0.16b,v0.16b
  1103. .long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
  1104. .long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
  1105. .long 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
  1106. ld1 {v16.4s},[x3],#16
  1107. add v17.4s,v17.4s,v5.4s
  1108. .long 0x5e2828c5 //sha256su0 v5.16b,v6.16b
  1109. orr v2.16b,v0.16b,v0.16b
  1110. .long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
  1111. .long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
  1112. .long 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
  1113. ld1 {v17.4s},[x3],#16
  1114. add v16.4s,v16.4s,v6.4s
  1115. .long 0x5e2828e6 //sha256su0 v6.16b,v7.16b
  1116. orr v2.16b,v0.16b,v0.16b
  1117. .long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
  1118. .long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
  1119. .long 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
  1120. ld1 {v16.4s},[x3],#16
  1121. add v17.4s,v17.4s,v7.4s
  1122. .long 0x5e282887 //sha256su0 v7.16b,v4.16b
  1123. orr v2.16b,v0.16b,v0.16b
  1124. .long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
  1125. .long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
  1126. .long 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
  1127. ld1 {v17.4s},[x3],#16
  1128. add v16.4s,v16.4s,v4.4s
  1129. .long 0x5e2828a4 //sha256su0 v4.16b,v5.16b
  1130. orr v2.16b,v0.16b,v0.16b
  1131. .long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
  1132. .long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
  1133. .long 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
  1134. ld1 {v16.4s},[x3],#16
  1135. add v17.4s,v17.4s,v5.4s
  1136. .long 0x5e2828c5 //sha256su0 v5.16b,v6.16b
  1137. orr v2.16b,v0.16b,v0.16b
  1138. .long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
  1139. .long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
  1140. .long 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
  1141. ld1 {v17.4s},[x3],#16
  1142. add v16.4s,v16.4s,v6.4s
  1143. .long 0x5e2828e6 //sha256su0 v6.16b,v7.16b
  1144. orr v2.16b,v0.16b,v0.16b
  1145. .long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
  1146. .long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
  1147. .long 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
  1148. ld1 {v16.4s},[x3],#16
  1149. add v17.4s,v17.4s,v7.4s
  1150. .long 0x5e282887 //sha256su0 v7.16b,v4.16b
  1151. orr v2.16b,v0.16b,v0.16b
  1152. .long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
  1153. .long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
  1154. .long 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
  1155. ld1 {v17.4s},[x3],#16
  1156. add v16.4s,v16.4s,v4.4s
  1157. orr v2.16b,v0.16b,v0.16b
  1158. .long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
  1159. .long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
  1160. ld1 {v16.4s},[x3],#16
  1161. add v17.4s,v17.4s,v5.4s
  1162. orr v2.16b,v0.16b,v0.16b
  1163. .long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
  1164. .long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
  1165. ld1 {v17.4s},[x3]
  1166. add v16.4s,v16.4s,v6.4s
  1167. sub x3,x3,#64*4-16 // rewind
  1168. orr v2.16b,v0.16b,v0.16b
  1169. .long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
  1170. .long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
  1171. add v17.4s,v17.4s,v7.4s
  1172. orr v2.16b,v0.16b,v0.16b
  1173. .long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
  1174. .long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
  1175. add v0.4s,v0.4s,v18.4s
  1176. add v1.4s,v1.4s,v19.4s
  1177. cbnz x2,Loop_hw
  1178. st1 {v0.4s,v1.4s},[x0]
  1179. ldr x29,[sp],#16
  1180. ret
  1181. #endif
  1182. #endif // !OPENSSL_NO_ASM