sha256-armv8.S 34 KB

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