2
0

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