sha256-core.S 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062
  1. // Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved.
  2. //
  3. // Licensed under the OpenSSL license (the "License"). You may not use
  4. // this file except in compliance with the License. You can obtain a copy
  5. // in the file LICENSE in the source distribution or at
  6. // https://www.openssl.org/source/license.html
  7. // ====================================================================
  8. // Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
  9. // project. The module is, however, dual licensed under OpenSSL and
  10. // CRYPTOGAMS licenses depending on where you obtain it. For further
  11. // details see http://www.openssl.org/~appro/cryptogams/.
  12. //
  13. // Permission to use under GPLv2 terms is granted.
  14. // ====================================================================
  15. //
  16. // SHA256/512 for ARMv8.
  17. //
  18. // Performance in cycles per processed byte and improvement coefficient
  19. // over code generated with "default" compiler:
  20. //
  21. // SHA256-hw SHA256(*) SHA512
  22. // Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**))
  23. // Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***))
  24. // Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***))
  25. // Denver 2.01 10.5 (+26%) 6.70 (+8%)
  26. // X-Gene 20.0 (+100%) 12.8 (+300%(***))
  27. // Mongoose 2.36 13.0 (+50%) 8.36 (+33%)
  28. //
  29. // (*) Software SHA256 results are of lesser relevance, presented
  30. // mostly for informational purposes.
  31. // (**) The result is a trade-off: it's possible to improve it by
  32. // 10% (or by 1 cycle per round), but at the cost of 20% loss
  33. // on Cortex-A53 (or by 4 cycles per round).
  34. // (***) Super-impressive coefficients over gcc-generated code are
  35. // indication of some compiler "pathology", most notably code
  36. // generated with -mgeneral-regs-only is significanty faster
  37. // and the gap is only 40-90%.
  38. //
  39. // October 2016.
  40. //
  41. // Originally it was reckoned that it makes no sense to implement NEON
  42. // version of SHA256 for 64-bit processors. This is because performance
  43. // improvement on most wide-spread Cortex-A5x processors was observed
  44. // to be marginal, same on Cortex-A53 and ~10% on A57. But then it was
  45. // observed that 32-bit NEON SHA256 performs significantly better than
  46. // 64-bit scalar version on *some* of the more recent processors. As
  47. // result 64-bit NEON version of SHA256 was added to provide best
  48. // all-round performance. For example it executes ~30% faster on X-Gene
  49. // and Mongoose. [For reference, NEON version of SHA512 is bound to
  50. // deliver much less improvement, likely *negative* on Cortex-A5x.
  51. // Which is why NEON support is limited to SHA256.]
  52. #ifndef __KERNEL__
  53. # include "arm_arch.h"
  54. #endif
  55. .text
  56. .extern OPENSSL_armcap_P
  57. .globl sha256_block_data_order
  58. .type sha256_block_data_order,%function
  59. .align 6
  60. sha256_block_data_order:
  61. #ifndef __KERNEL__
  62. # ifdef __ILP32__
  63. ldrsw x16,.LOPENSSL_armcap_P
  64. # else
  65. ldr x16,.LOPENSSL_armcap_P
  66. # endif
  67. adr x17,.LOPENSSL_armcap_P
  68. add x16,x16,x17
  69. ldr w16,[x16]
  70. tst w16,#ARMV8_SHA256
  71. b.ne .Lv8_entry
  72. tst w16,#ARMV7_NEON
  73. b.ne .Lneon_entry
  74. #endif
  75. stp x29,x30,[sp,#-128]!
  76. add x29,sp,#0
  77. stp x19,x20,[sp,#16]
  78. stp x21,x22,[sp,#32]
  79. stp x23,x24,[sp,#48]
  80. stp x25,x26,[sp,#64]
  81. stp x27,x28,[sp,#80]
  82. sub sp,sp,#4*4
  83. ldp w20,w21,[x0] // load context
  84. ldp w22,w23,[x0,#2*4]
  85. ldp w24,w25,[x0,#4*4]
  86. add x2,x1,x2,lsl#6 // end of input
  87. ldp w26,w27,[x0,#6*4]
  88. adr x30,.LK256
  89. stp x0,x2,[x29,#96]
  90. .Loop:
  91. ldp w3,w4,[x1],#2*4
  92. ldr w19,[x30],#4 // *K++
  93. eor w28,w21,w22 // magic seed
  94. str x1,[x29,#112]
  95. #ifndef __AARCH64EB__
  96. rev w3,w3 // 0
  97. #endif
  98. ror w16,w24,#6
  99. add w27,w27,w19 // h+=K[i]
  100. eor w6,w24,w24,ror#14
  101. and w17,w25,w24
  102. bic w19,w26,w24
  103. add w27,w27,w3 // h+=X[i]
  104. orr w17,w17,w19 // Ch(e,f,g)
  105. eor w19,w20,w21 // a^b, b^c in next round
  106. eor w16,w16,w6,ror#11 // Sigma1(e)
  107. ror w6,w20,#2
  108. add w27,w27,w17 // h+=Ch(e,f,g)
  109. eor w17,w20,w20,ror#9
  110. add w27,w27,w16 // h+=Sigma1(e)
  111. and w28,w28,w19 // (b^c)&=(a^b)
  112. add w23,w23,w27 // d+=h
  113. eor w28,w28,w21 // Maj(a,b,c)
  114. eor w17,w6,w17,ror#13 // Sigma0(a)
  115. add w27,w27,w28 // h+=Maj(a,b,c)
  116. ldr w28,[x30],#4 // *K++, w19 in next round
  117. //add w27,w27,w17 // h+=Sigma0(a)
  118. #ifndef __AARCH64EB__
  119. rev w4,w4 // 1
  120. #endif
  121. ldp w5,w6,[x1],#2*4
  122. add w27,w27,w17 // h+=Sigma0(a)
  123. ror w16,w23,#6
  124. add w26,w26,w28 // h+=K[i]
  125. eor w7,w23,w23,ror#14
  126. and w17,w24,w23
  127. bic w28,w25,w23
  128. add w26,w26,w4 // h+=X[i]
  129. orr w17,w17,w28 // Ch(e,f,g)
  130. eor w28,w27,w20 // a^b, b^c in next round
  131. eor w16,w16,w7,ror#11 // Sigma1(e)
  132. ror w7,w27,#2
  133. add w26,w26,w17 // h+=Ch(e,f,g)
  134. eor w17,w27,w27,ror#9
  135. add w26,w26,w16 // h+=Sigma1(e)
  136. and w19,w19,w28 // (b^c)&=(a^b)
  137. add w22,w22,w26 // d+=h
  138. eor w19,w19,w20 // Maj(a,b,c)
  139. eor w17,w7,w17,ror#13 // Sigma0(a)
  140. add w26,w26,w19 // h+=Maj(a,b,c)
  141. ldr w19,[x30],#4 // *K++, w28 in next round
  142. //add w26,w26,w17 // h+=Sigma0(a)
  143. #ifndef __AARCH64EB__
  144. rev w5,w5 // 2
  145. #endif
  146. add w26,w26,w17 // h+=Sigma0(a)
  147. ror w16,w22,#6
  148. add w25,w25,w19 // h+=K[i]
  149. eor w8,w22,w22,ror#14
  150. and w17,w23,w22
  151. bic w19,w24,w22
  152. add w25,w25,w5 // h+=X[i]
  153. orr w17,w17,w19 // Ch(e,f,g)
  154. eor w19,w26,w27 // a^b, b^c in next round
  155. eor w16,w16,w8,ror#11 // Sigma1(e)
  156. ror w8,w26,#2
  157. add w25,w25,w17 // h+=Ch(e,f,g)
  158. eor w17,w26,w26,ror#9
  159. add w25,w25,w16 // h+=Sigma1(e)
  160. and w28,w28,w19 // (b^c)&=(a^b)
  161. add w21,w21,w25 // d+=h
  162. eor w28,w28,w27 // Maj(a,b,c)
  163. eor w17,w8,w17,ror#13 // Sigma0(a)
  164. add w25,w25,w28 // h+=Maj(a,b,c)
  165. ldr w28,[x30],#4 // *K++, w19 in next round
  166. //add w25,w25,w17 // h+=Sigma0(a)
  167. #ifndef __AARCH64EB__
  168. rev w6,w6 // 3
  169. #endif
  170. ldp w7,w8,[x1],#2*4
  171. add w25,w25,w17 // h+=Sigma0(a)
  172. ror w16,w21,#6
  173. add w24,w24,w28 // h+=K[i]
  174. eor w9,w21,w21,ror#14
  175. and w17,w22,w21
  176. bic w28,w23,w21
  177. add w24,w24,w6 // h+=X[i]
  178. orr w17,w17,w28 // Ch(e,f,g)
  179. eor w28,w25,w26 // a^b, b^c in next round
  180. eor w16,w16,w9,ror#11 // Sigma1(e)
  181. ror w9,w25,#2
  182. add w24,w24,w17 // h+=Ch(e,f,g)
  183. eor w17,w25,w25,ror#9
  184. add w24,w24,w16 // h+=Sigma1(e)
  185. and w19,w19,w28 // (b^c)&=(a^b)
  186. add w20,w20,w24 // d+=h
  187. eor w19,w19,w26 // Maj(a,b,c)
  188. eor w17,w9,w17,ror#13 // Sigma0(a)
  189. add w24,w24,w19 // h+=Maj(a,b,c)
  190. ldr w19,[x30],#4 // *K++, w28 in next round
  191. //add w24,w24,w17 // h+=Sigma0(a)
  192. #ifndef __AARCH64EB__
  193. rev w7,w7 // 4
  194. #endif
  195. add w24,w24,w17 // h+=Sigma0(a)
  196. ror w16,w20,#6
  197. add w23,w23,w19 // h+=K[i]
  198. eor w10,w20,w20,ror#14
  199. and w17,w21,w20
  200. bic w19,w22,w20
  201. add w23,w23,w7 // h+=X[i]
  202. orr w17,w17,w19 // Ch(e,f,g)
  203. eor w19,w24,w25 // a^b, b^c in next round
  204. eor w16,w16,w10,ror#11 // Sigma1(e)
  205. ror w10,w24,#2
  206. add w23,w23,w17 // h+=Ch(e,f,g)
  207. eor w17,w24,w24,ror#9
  208. add w23,w23,w16 // h+=Sigma1(e)
  209. and w28,w28,w19 // (b^c)&=(a^b)
  210. add w27,w27,w23 // d+=h
  211. eor w28,w28,w25 // Maj(a,b,c)
  212. eor w17,w10,w17,ror#13 // Sigma0(a)
  213. add w23,w23,w28 // h+=Maj(a,b,c)
  214. ldr w28,[x30],#4 // *K++, w19 in next round
  215. //add w23,w23,w17 // h+=Sigma0(a)
  216. #ifndef __AARCH64EB__
  217. rev w8,w8 // 5
  218. #endif
  219. ldp w9,w10,[x1],#2*4
  220. add w23,w23,w17 // h+=Sigma0(a)
  221. ror w16,w27,#6
  222. add w22,w22,w28 // h+=K[i]
  223. eor w11,w27,w27,ror#14
  224. and w17,w20,w27
  225. bic w28,w21,w27
  226. add w22,w22,w8 // h+=X[i]
  227. orr w17,w17,w28 // Ch(e,f,g)
  228. eor w28,w23,w24 // a^b, b^c in next round
  229. eor w16,w16,w11,ror#11 // Sigma1(e)
  230. ror w11,w23,#2
  231. add w22,w22,w17 // h+=Ch(e,f,g)
  232. eor w17,w23,w23,ror#9
  233. add w22,w22,w16 // h+=Sigma1(e)
  234. and w19,w19,w28 // (b^c)&=(a^b)
  235. add w26,w26,w22 // d+=h
  236. eor w19,w19,w24 // Maj(a,b,c)
  237. eor w17,w11,w17,ror#13 // Sigma0(a)
  238. add w22,w22,w19 // h+=Maj(a,b,c)
  239. ldr w19,[x30],#4 // *K++, w28 in next round
  240. //add w22,w22,w17 // h+=Sigma0(a)
  241. #ifndef __AARCH64EB__
  242. rev w9,w9 // 6
  243. #endif
  244. add w22,w22,w17 // h+=Sigma0(a)
  245. ror w16,w26,#6
  246. add w21,w21,w19 // h+=K[i]
  247. eor w12,w26,w26,ror#14
  248. and w17,w27,w26
  249. bic w19,w20,w26
  250. add w21,w21,w9 // h+=X[i]
  251. orr w17,w17,w19 // Ch(e,f,g)
  252. eor w19,w22,w23 // a^b, b^c in next round
  253. eor w16,w16,w12,ror#11 // Sigma1(e)
  254. ror w12,w22,#2
  255. add w21,w21,w17 // h+=Ch(e,f,g)
  256. eor w17,w22,w22,ror#9
  257. add w21,w21,w16 // h+=Sigma1(e)
  258. and w28,w28,w19 // (b^c)&=(a^b)
  259. add w25,w25,w21 // d+=h
  260. eor w28,w28,w23 // Maj(a,b,c)
  261. eor w17,w12,w17,ror#13 // Sigma0(a)
  262. add w21,w21,w28 // h+=Maj(a,b,c)
  263. ldr w28,[x30],#4 // *K++, w19 in next round
  264. //add w21,w21,w17 // h+=Sigma0(a)
  265. #ifndef __AARCH64EB__
  266. rev w10,w10 // 7
  267. #endif
  268. ldp w11,w12,[x1],#2*4
  269. add w21,w21,w17 // h+=Sigma0(a)
  270. ror w16,w25,#6
  271. add w20,w20,w28 // h+=K[i]
  272. eor w13,w25,w25,ror#14
  273. and w17,w26,w25
  274. bic w28,w27,w25
  275. add w20,w20,w10 // h+=X[i]
  276. orr w17,w17,w28 // Ch(e,f,g)
  277. eor w28,w21,w22 // a^b, b^c in next round
  278. eor w16,w16,w13,ror#11 // Sigma1(e)
  279. ror w13,w21,#2
  280. add w20,w20,w17 // h+=Ch(e,f,g)
  281. eor w17,w21,w21,ror#9
  282. add w20,w20,w16 // h+=Sigma1(e)
  283. and w19,w19,w28 // (b^c)&=(a^b)
  284. add w24,w24,w20 // d+=h
  285. eor w19,w19,w22 // Maj(a,b,c)
  286. eor w17,w13,w17,ror#13 // Sigma0(a)
  287. add w20,w20,w19 // h+=Maj(a,b,c)
  288. ldr w19,[x30],#4 // *K++, w28 in next round
  289. //add w20,w20,w17 // h+=Sigma0(a)
  290. #ifndef __AARCH64EB__
  291. rev w11,w11 // 8
  292. #endif
  293. add w20,w20,w17 // h+=Sigma0(a)
  294. ror w16,w24,#6
  295. add w27,w27,w19 // h+=K[i]
  296. eor w14,w24,w24,ror#14
  297. and w17,w25,w24
  298. bic w19,w26,w24
  299. add w27,w27,w11 // h+=X[i]
  300. orr w17,w17,w19 // Ch(e,f,g)
  301. eor w19,w20,w21 // a^b, b^c in next round
  302. eor w16,w16,w14,ror#11 // Sigma1(e)
  303. ror w14,w20,#2
  304. add w27,w27,w17 // h+=Ch(e,f,g)
  305. eor w17,w20,w20,ror#9
  306. add w27,w27,w16 // h+=Sigma1(e)
  307. and w28,w28,w19 // (b^c)&=(a^b)
  308. add w23,w23,w27 // d+=h
  309. eor w28,w28,w21 // Maj(a,b,c)
  310. eor w17,w14,w17,ror#13 // Sigma0(a)
  311. add w27,w27,w28 // h+=Maj(a,b,c)
  312. ldr w28,[x30],#4 // *K++, w19 in next round
  313. //add w27,w27,w17 // h+=Sigma0(a)
  314. #ifndef __AARCH64EB__
  315. rev w12,w12 // 9
  316. #endif
  317. ldp w13,w14,[x1],#2*4
  318. add w27,w27,w17 // h+=Sigma0(a)
  319. ror w16,w23,#6
  320. add w26,w26,w28 // h+=K[i]
  321. eor w15,w23,w23,ror#14
  322. and w17,w24,w23
  323. bic w28,w25,w23
  324. add w26,w26,w12 // h+=X[i]
  325. orr w17,w17,w28 // Ch(e,f,g)
  326. eor w28,w27,w20 // a^b, b^c in next round
  327. eor w16,w16,w15,ror#11 // Sigma1(e)
  328. ror w15,w27,#2
  329. add w26,w26,w17 // h+=Ch(e,f,g)
  330. eor w17,w27,w27,ror#9
  331. add w26,w26,w16 // h+=Sigma1(e)
  332. and w19,w19,w28 // (b^c)&=(a^b)
  333. add w22,w22,w26 // d+=h
  334. eor w19,w19,w20 // Maj(a,b,c)
  335. eor w17,w15,w17,ror#13 // Sigma0(a)
  336. add w26,w26,w19 // h+=Maj(a,b,c)
  337. ldr w19,[x30],#4 // *K++, w28 in next round
  338. //add w26,w26,w17 // h+=Sigma0(a)
  339. #ifndef __AARCH64EB__
  340. rev w13,w13 // 10
  341. #endif
  342. add w26,w26,w17 // h+=Sigma0(a)
  343. ror w16,w22,#6
  344. add w25,w25,w19 // h+=K[i]
  345. eor w0,w22,w22,ror#14
  346. and w17,w23,w22
  347. bic w19,w24,w22
  348. add w25,w25,w13 // h+=X[i]
  349. orr w17,w17,w19 // Ch(e,f,g)
  350. eor w19,w26,w27 // a^b, b^c in next round
  351. eor w16,w16,w0,ror#11 // Sigma1(e)
  352. ror w0,w26,#2
  353. add w25,w25,w17 // h+=Ch(e,f,g)
  354. eor w17,w26,w26,ror#9
  355. add w25,w25,w16 // h+=Sigma1(e)
  356. and w28,w28,w19 // (b^c)&=(a^b)
  357. add w21,w21,w25 // d+=h
  358. eor w28,w28,w27 // Maj(a,b,c)
  359. eor w17,w0,w17,ror#13 // Sigma0(a)
  360. add w25,w25,w28 // h+=Maj(a,b,c)
  361. ldr w28,[x30],#4 // *K++, w19 in next round
  362. //add w25,w25,w17 // h+=Sigma0(a)
  363. #ifndef __AARCH64EB__
  364. rev w14,w14 // 11
  365. #endif
  366. ldp w15,w0,[x1],#2*4
  367. add w25,w25,w17 // h+=Sigma0(a)
  368. str w6,[sp,#12]
  369. ror w16,w21,#6
  370. add w24,w24,w28 // h+=K[i]
  371. eor w6,w21,w21,ror#14
  372. and w17,w22,w21
  373. bic w28,w23,w21
  374. add w24,w24,w14 // h+=X[i]
  375. orr w17,w17,w28 // Ch(e,f,g)
  376. eor w28,w25,w26 // a^b, b^c in next round
  377. eor w16,w16,w6,ror#11 // Sigma1(e)
  378. ror w6,w25,#2
  379. add w24,w24,w17 // h+=Ch(e,f,g)
  380. eor w17,w25,w25,ror#9
  381. add w24,w24,w16 // h+=Sigma1(e)
  382. and w19,w19,w28 // (b^c)&=(a^b)
  383. add w20,w20,w24 // d+=h
  384. eor w19,w19,w26 // Maj(a,b,c)
  385. eor w17,w6,w17,ror#13 // Sigma0(a)
  386. add w24,w24,w19 // h+=Maj(a,b,c)
  387. ldr w19,[x30],#4 // *K++, w28 in next round
  388. //add w24,w24,w17 // h+=Sigma0(a)
  389. #ifndef __AARCH64EB__
  390. rev w15,w15 // 12
  391. #endif
  392. add w24,w24,w17 // h+=Sigma0(a)
  393. str w7,[sp,#0]
  394. ror w16,w20,#6
  395. add w23,w23,w19 // h+=K[i]
  396. eor w7,w20,w20,ror#14
  397. and w17,w21,w20
  398. bic w19,w22,w20
  399. add w23,w23,w15 // h+=X[i]
  400. orr w17,w17,w19 // Ch(e,f,g)
  401. eor w19,w24,w25 // a^b, b^c in next round
  402. eor w16,w16,w7,ror#11 // Sigma1(e)
  403. ror w7,w24,#2
  404. add w23,w23,w17 // h+=Ch(e,f,g)
  405. eor w17,w24,w24,ror#9
  406. add w23,w23,w16 // h+=Sigma1(e)
  407. and w28,w28,w19 // (b^c)&=(a^b)
  408. add w27,w27,w23 // d+=h
  409. eor w28,w28,w25 // Maj(a,b,c)
  410. eor w17,w7,w17,ror#13 // Sigma0(a)
  411. add w23,w23,w28 // h+=Maj(a,b,c)
  412. ldr w28,[x30],#4 // *K++, w19 in next round
  413. //add w23,w23,w17 // h+=Sigma0(a)
  414. #ifndef __AARCH64EB__
  415. rev w0,w0 // 13
  416. #endif
  417. ldp w1,w2,[x1]
  418. add w23,w23,w17 // h+=Sigma0(a)
  419. str w8,[sp,#4]
  420. ror w16,w27,#6
  421. add w22,w22,w28 // h+=K[i]
  422. eor w8,w27,w27,ror#14
  423. and w17,w20,w27
  424. bic w28,w21,w27
  425. add w22,w22,w0 // h+=X[i]
  426. orr w17,w17,w28 // Ch(e,f,g)
  427. eor w28,w23,w24 // a^b, b^c in next round
  428. eor w16,w16,w8,ror#11 // Sigma1(e)
  429. ror w8,w23,#2
  430. add w22,w22,w17 // h+=Ch(e,f,g)
  431. eor w17,w23,w23,ror#9
  432. add w22,w22,w16 // h+=Sigma1(e)
  433. and w19,w19,w28 // (b^c)&=(a^b)
  434. add w26,w26,w22 // d+=h
  435. eor w19,w19,w24 // Maj(a,b,c)
  436. eor w17,w8,w17,ror#13 // Sigma0(a)
  437. add w22,w22,w19 // h+=Maj(a,b,c)
  438. ldr w19,[x30],#4 // *K++, w28 in next round
  439. //add w22,w22,w17 // h+=Sigma0(a)
  440. #ifndef __AARCH64EB__
  441. rev w1,w1 // 14
  442. #endif
  443. ldr w6,[sp,#12]
  444. add w22,w22,w17 // h+=Sigma0(a)
  445. str w9,[sp,#8]
  446. ror w16,w26,#6
  447. add w21,w21,w19 // h+=K[i]
  448. eor w9,w26,w26,ror#14
  449. and w17,w27,w26
  450. bic w19,w20,w26
  451. add w21,w21,w1 // h+=X[i]
  452. orr w17,w17,w19 // Ch(e,f,g)
  453. eor w19,w22,w23 // a^b, b^c in next round
  454. eor w16,w16,w9,ror#11 // Sigma1(e)
  455. ror w9,w22,#2
  456. add w21,w21,w17 // h+=Ch(e,f,g)
  457. eor w17,w22,w22,ror#9
  458. add w21,w21,w16 // h+=Sigma1(e)
  459. and w28,w28,w19 // (b^c)&=(a^b)
  460. add w25,w25,w21 // d+=h
  461. eor w28,w28,w23 // Maj(a,b,c)
  462. eor w17,w9,w17,ror#13 // Sigma0(a)
  463. add w21,w21,w28 // h+=Maj(a,b,c)
  464. ldr w28,[x30],#4 // *K++, w19 in next round
  465. //add w21,w21,w17 // h+=Sigma0(a)
  466. #ifndef __AARCH64EB__
  467. rev w2,w2 // 15
  468. #endif
  469. ldr w7,[sp,#0]
  470. add w21,w21,w17 // h+=Sigma0(a)
  471. str w10,[sp,#12]
  472. ror w16,w25,#6
  473. add w20,w20,w28 // h+=K[i]
  474. ror w9,w4,#7
  475. and w17,w26,w25
  476. ror w8,w1,#17
  477. bic w28,w27,w25
  478. ror w10,w21,#2
  479. add w20,w20,w2 // h+=X[i]
  480. eor w16,w16,w25,ror#11
  481. eor w9,w9,w4,ror#18
  482. orr w17,w17,w28 // Ch(e,f,g)
  483. eor w28,w21,w22 // a^b, b^c in next round
  484. eor w16,w16,w25,ror#25 // Sigma1(e)
  485. eor w10,w10,w21,ror#13
  486. add w20,w20,w17 // h+=Ch(e,f,g)
  487. and w19,w19,w28 // (b^c)&=(a^b)
  488. eor w8,w8,w1,ror#19
  489. eor w9,w9,w4,lsr#3 // sigma0(X[i+1])
  490. add w20,w20,w16 // h+=Sigma1(e)
  491. eor w19,w19,w22 // Maj(a,b,c)
  492. eor w17,w10,w21,ror#22 // Sigma0(a)
  493. eor w8,w8,w1,lsr#10 // sigma1(X[i+14])
  494. add w3,w3,w12
  495. add w24,w24,w20 // d+=h
  496. add w20,w20,w19 // h+=Maj(a,b,c)
  497. ldr w19,[x30],#4 // *K++, w28 in next round
  498. add w3,w3,w9
  499. add w20,w20,w17 // h+=Sigma0(a)
  500. add w3,w3,w8
  501. .Loop_16_xx:
  502. ldr w8,[sp,#4]
  503. str w11,[sp,#0]
  504. ror w16,w24,#6
  505. add w27,w27,w19 // h+=K[i]
  506. ror w10,w5,#7
  507. and w17,w25,w24
  508. ror w9,w2,#17
  509. bic w19,w26,w24
  510. ror w11,w20,#2
  511. add w27,w27,w3 // h+=X[i]
  512. eor w16,w16,w24,ror#11
  513. eor w10,w10,w5,ror#18
  514. orr w17,w17,w19 // Ch(e,f,g)
  515. eor w19,w20,w21 // a^b, b^c in next round
  516. eor w16,w16,w24,ror#25 // Sigma1(e)
  517. eor w11,w11,w20,ror#13
  518. add w27,w27,w17 // h+=Ch(e,f,g)
  519. and w28,w28,w19 // (b^c)&=(a^b)
  520. eor w9,w9,w2,ror#19
  521. eor w10,w10,w5,lsr#3 // sigma0(X[i+1])
  522. add w27,w27,w16 // h+=Sigma1(e)
  523. eor w28,w28,w21 // Maj(a,b,c)
  524. eor w17,w11,w20,ror#22 // Sigma0(a)
  525. eor w9,w9,w2,lsr#10 // sigma1(X[i+14])
  526. add w4,w4,w13
  527. add w23,w23,w27 // d+=h
  528. add w27,w27,w28 // h+=Maj(a,b,c)
  529. ldr w28,[x30],#4 // *K++, w19 in next round
  530. add w4,w4,w10
  531. add w27,w27,w17 // h+=Sigma0(a)
  532. add w4,w4,w9
  533. ldr w9,[sp,#8]
  534. str w12,[sp,#4]
  535. ror w16,w23,#6
  536. add w26,w26,w28 // h+=K[i]
  537. ror w11,w6,#7
  538. and w17,w24,w23
  539. ror w10,w3,#17
  540. bic w28,w25,w23
  541. ror w12,w27,#2
  542. add w26,w26,w4 // h+=X[i]
  543. eor w16,w16,w23,ror#11
  544. eor w11,w11,w6,ror#18
  545. orr w17,w17,w28 // Ch(e,f,g)
  546. eor w28,w27,w20 // a^b, b^c in next round
  547. eor w16,w16,w23,ror#25 // Sigma1(e)
  548. eor w12,w12,w27,ror#13
  549. add w26,w26,w17 // h+=Ch(e,f,g)
  550. and w19,w19,w28 // (b^c)&=(a^b)
  551. eor w10,w10,w3,ror#19
  552. eor w11,w11,w6,lsr#3 // sigma0(X[i+1])
  553. add w26,w26,w16 // h+=Sigma1(e)
  554. eor w19,w19,w20 // Maj(a,b,c)
  555. eor w17,w12,w27,ror#22 // Sigma0(a)
  556. eor w10,w10,w3,lsr#10 // sigma1(X[i+14])
  557. add w5,w5,w14
  558. add w22,w22,w26 // d+=h
  559. add w26,w26,w19 // h+=Maj(a,b,c)
  560. ldr w19,[x30],#4 // *K++, w28 in next round
  561. add w5,w5,w11
  562. add w26,w26,w17 // h+=Sigma0(a)
  563. add w5,w5,w10
  564. ldr w10,[sp,#12]
  565. str w13,[sp,#8]
  566. ror w16,w22,#6
  567. add w25,w25,w19 // h+=K[i]
  568. ror w12,w7,#7
  569. and w17,w23,w22
  570. ror w11,w4,#17
  571. bic w19,w24,w22
  572. ror w13,w26,#2
  573. add w25,w25,w5 // h+=X[i]
  574. eor w16,w16,w22,ror#11
  575. eor w12,w12,w7,ror#18
  576. orr w17,w17,w19 // Ch(e,f,g)
  577. eor w19,w26,w27 // a^b, b^c in next round
  578. eor w16,w16,w22,ror#25 // Sigma1(e)
  579. eor w13,w13,w26,ror#13
  580. add w25,w25,w17 // h+=Ch(e,f,g)
  581. and w28,w28,w19 // (b^c)&=(a^b)
  582. eor w11,w11,w4,ror#19
  583. eor w12,w12,w7,lsr#3 // sigma0(X[i+1])
  584. add w25,w25,w16 // h+=Sigma1(e)
  585. eor w28,w28,w27 // Maj(a,b,c)
  586. eor w17,w13,w26,ror#22 // Sigma0(a)
  587. eor w11,w11,w4,lsr#10 // sigma1(X[i+14])
  588. add w6,w6,w15
  589. add w21,w21,w25 // d+=h
  590. add w25,w25,w28 // h+=Maj(a,b,c)
  591. ldr w28,[x30],#4 // *K++, w19 in next round
  592. add w6,w6,w12
  593. add w25,w25,w17 // h+=Sigma0(a)
  594. add w6,w6,w11
  595. ldr w11,[sp,#0]
  596. str w14,[sp,#12]
  597. ror w16,w21,#6
  598. add w24,w24,w28 // h+=K[i]
  599. ror w13,w8,#7
  600. and w17,w22,w21
  601. ror w12,w5,#17
  602. bic w28,w23,w21
  603. ror w14,w25,#2
  604. add w24,w24,w6 // h+=X[i]
  605. eor w16,w16,w21,ror#11
  606. eor w13,w13,w8,ror#18
  607. orr w17,w17,w28 // Ch(e,f,g)
  608. eor w28,w25,w26 // a^b, b^c in next round
  609. eor w16,w16,w21,ror#25 // Sigma1(e)
  610. eor w14,w14,w25,ror#13
  611. add w24,w24,w17 // h+=Ch(e,f,g)
  612. and w19,w19,w28 // (b^c)&=(a^b)
  613. eor w12,w12,w5,ror#19
  614. eor w13,w13,w8,lsr#3 // sigma0(X[i+1])
  615. add w24,w24,w16 // h+=Sigma1(e)
  616. eor w19,w19,w26 // Maj(a,b,c)
  617. eor w17,w14,w25,ror#22 // Sigma0(a)
  618. eor w12,w12,w5,lsr#10 // sigma1(X[i+14])
  619. add w7,w7,w0
  620. add w20,w20,w24 // d+=h
  621. add w24,w24,w19 // h+=Maj(a,b,c)
  622. ldr w19,[x30],#4 // *K++, w28 in next round
  623. add w7,w7,w13
  624. add w24,w24,w17 // h+=Sigma0(a)
  625. add w7,w7,w12
  626. ldr w12,[sp,#4]
  627. str w15,[sp,#0]
  628. ror w16,w20,#6
  629. add w23,w23,w19 // h+=K[i]
  630. ror w14,w9,#7
  631. and w17,w21,w20
  632. ror w13,w6,#17
  633. bic w19,w22,w20
  634. ror w15,w24,#2
  635. add w23,w23,w7 // h+=X[i]
  636. eor w16,w16,w20,ror#11
  637. eor w14,w14,w9,ror#18
  638. orr w17,w17,w19 // Ch(e,f,g)
  639. eor w19,w24,w25 // a^b, b^c in next round
  640. eor w16,w16,w20,ror#25 // Sigma1(e)
  641. eor w15,w15,w24,ror#13
  642. add w23,w23,w17 // h+=Ch(e,f,g)
  643. and w28,w28,w19 // (b^c)&=(a^b)
  644. eor w13,w13,w6,ror#19
  645. eor w14,w14,w9,lsr#3 // sigma0(X[i+1])
  646. add w23,w23,w16 // h+=Sigma1(e)
  647. eor w28,w28,w25 // Maj(a,b,c)
  648. eor w17,w15,w24,ror#22 // Sigma0(a)
  649. eor w13,w13,w6,lsr#10 // sigma1(X[i+14])
  650. add w8,w8,w1
  651. add w27,w27,w23 // d+=h
  652. add w23,w23,w28 // h+=Maj(a,b,c)
  653. ldr w28,[x30],#4 // *K++, w19 in next round
  654. add w8,w8,w14
  655. add w23,w23,w17 // h+=Sigma0(a)
  656. add w8,w8,w13
  657. ldr w13,[sp,#8]
  658. str w0,[sp,#4]
  659. ror w16,w27,#6
  660. add w22,w22,w28 // h+=K[i]
  661. ror w15,w10,#7
  662. and w17,w20,w27
  663. ror w14,w7,#17
  664. bic w28,w21,w27
  665. ror w0,w23,#2
  666. add w22,w22,w8 // h+=X[i]
  667. eor w16,w16,w27,ror#11
  668. eor w15,w15,w10,ror#18
  669. orr w17,w17,w28 // Ch(e,f,g)
  670. eor w28,w23,w24 // a^b, b^c in next round
  671. eor w16,w16,w27,ror#25 // Sigma1(e)
  672. eor w0,w0,w23,ror#13
  673. add w22,w22,w17 // h+=Ch(e,f,g)
  674. and w19,w19,w28 // (b^c)&=(a^b)
  675. eor w14,w14,w7,ror#19
  676. eor w15,w15,w10,lsr#3 // sigma0(X[i+1])
  677. add w22,w22,w16 // h+=Sigma1(e)
  678. eor w19,w19,w24 // Maj(a,b,c)
  679. eor w17,w0,w23,ror#22 // Sigma0(a)
  680. eor w14,w14,w7,lsr#10 // sigma1(X[i+14])
  681. add w9,w9,w2
  682. add w26,w26,w22 // d+=h
  683. add w22,w22,w19 // h+=Maj(a,b,c)
  684. ldr w19,[x30],#4 // *K++, w28 in next round
  685. add w9,w9,w15
  686. add w22,w22,w17 // h+=Sigma0(a)
  687. add w9,w9,w14
  688. ldr w14,[sp,#12]
  689. str w1,[sp,#8]
  690. ror w16,w26,#6
  691. add w21,w21,w19 // h+=K[i]
  692. ror w0,w11,#7
  693. and w17,w27,w26
  694. ror w15,w8,#17
  695. bic w19,w20,w26
  696. ror w1,w22,#2
  697. add w21,w21,w9 // h+=X[i]
  698. eor w16,w16,w26,ror#11
  699. eor w0,w0,w11,ror#18
  700. orr w17,w17,w19 // Ch(e,f,g)
  701. eor w19,w22,w23 // a^b, b^c in next round
  702. eor w16,w16,w26,ror#25 // Sigma1(e)
  703. eor w1,w1,w22,ror#13
  704. add w21,w21,w17 // h+=Ch(e,f,g)
  705. and w28,w28,w19 // (b^c)&=(a^b)
  706. eor w15,w15,w8,ror#19
  707. eor w0,w0,w11,lsr#3 // sigma0(X[i+1])
  708. add w21,w21,w16 // h+=Sigma1(e)
  709. eor w28,w28,w23 // Maj(a,b,c)
  710. eor w17,w1,w22,ror#22 // Sigma0(a)
  711. eor w15,w15,w8,lsr#10 // sigma1(X[i+14])
  712. add w10,w10,w3
  713. add w25,w25,w21 // d+=h
  714. add w21,w21,w28 // h+=Maj(a,b,c)
  715. ldr w28,[x30],#4 // *K++, w19 in next round
  716. add w10,w10,w0
  717. add w21,w21,w17 // h+=Sigma0(a)
  718. add w10,w10,w15
  719. ldr w15,[sp,#0]
  720. str w2,[sp,#12]
  721. ror w16,w25,#6
  722. add w20,w20,w28 // h+=K[i]
  723. ror w1,w12,#7
  724. and w17,w26,w25
  725. ror w0,w9,#17
  726. bic w28,w27,w25
  727. ror w2,w21,#2
  728. add w20,w20,w10 // h+=X[i]
  729. eor w16,w16,w25,ror#11
  730. eor w1,w1,w12,ror#18
  731. orr w17,w17,w28 // Ch(e,f,g)
  732. eor w28,w21,w22 // a^b, b^c in next round
  733. eor w16,w16,w25,ror#25 // Sigma1(e)
  734. eor w2,w2,w21,ror#13
  735. add w20,w20,w17 // h+=Ch(e,f,g)
  736. and w19,w19,w28 // (b^c)&=(a^b)
  737. eor w0,w0,w9,ror#19
  738. eor w1,w1,w12,lsr#3 // sigma0(X[i+1])
  739. add w20,w20,w16 // h+=Sigma1(e)
  740. eor w19,w19,w22 // Maj(a,b,c)
  741. eor w17,w2,w21,ror#22 // Sigma0(a)
  742. eor w0,w0,w9,lsr#10 // sigma1(X[i+14])
  743. add w11,w11,w4
  744. add w24,w24,w20 // d+=h
  745. add w20,w20,w19 // h+=Maj(a,b,c)
  746. ldr w19,[x30],#4 // *K++, w28 in next round
  747. add w11,w11,w1
  748. add w20,w20,w17 // h+=Sigma0(a)
  749. add w11,w11,w0
  750. ldr w0,[sp,#4]
  751. str w3,[sp,#0]
  752. ror w16,w24,#6
  753. add w27,w27,w19 // h+=K[i]
  754. ror w2,w13,#7
  755. and w17,w25,w24
  756. ror w1,w10,#17
  757. bic w19,w26,w24
  758. ror w3,w20,#2
  759. add w27,w27,w11 // h+=X[i]
  760. eor w16,w16,w24,ror#11
  761. eor w2,w2,w13,ror#18
  762. orr w17,w17,w19 // Ch(e,f,g)
  763. eor w19,w20,w21 // a^b, b^c in next round
  764. eor w16,w16,w24,ror#25 // Sigma1(e)
  765. eor w3,w3,w20,ror#13
  766. add w27,w27,w17 // h+=Ch(e,f,g)
  767. and w28,w28,w19 // (b^c)&=(a^b)
  768. eor w1,w1,w10,ror#19
  769. eor w2,w2,w13,lsr#3 // sigma0(X[i+1])
  770. add w27,w27,w16 // h+=Sigma1(e)
  771. eor w28,w28,w21 // Maj(a,b,c)
  772. eor w17,w3,w20,ror#22 // Sigma0(a)
  773. eor w1,w1,w10,lsr#10 // sigma1(X[i+14])
  774. add w12,w12,w5
  775. add w23,w23,w27 // d+=h
  776. add w27,w27,w28 // h+=Maj(a,b,c)
  777. ldr w28,[x30],#4 // *K++, w19 in next round
  778. add w12,w12,w2
  779. add w27,w27,w17 // h+=Sigma0(a)
  780. add w12,w12,w1
  781. ldr w1,[sp,#8]
  782. str w4,[sp,#4]
  783. ror w16,w23,#6
  784. add w26,w26,w28 // h+=K[i]
  785. ror w3,w14,#7
  786. and w17,w24,w23
  787. ror w2,w11,#17
  788. bic w28,w25,w23
  789. ror w4,w27,#2
  790. add w26,w26,w12 // h+=X[i]
  791. eor w16,w16,w23,ror#11
  792. eor w3,w3,w14,ror#18
  793. orr w17,w17,w28 // Ch(e,f,g)
  794. eor w28,w27,w20 // a^b, b^c in next round
  795. eor w16,w16,w23,ror#25 // Sigma1(e)
  796. eor w4,w4,w27,ror#13
  797. add w26,w26,w17 // h+=Ch(e,f,g)
  798. and w19,w19,w28 // (b^c)&=(a^b)
  799. eor w2,w2,w11,ror#19
  800. eor w3,w3,w14,lsr#3 // sigma0(X[i+1])
  801. add w26,w26,w16 // h+=Sigma1(e)
  802. eor w19,w19,w20 // Maj(a,b,c)
  803. eor w17,w4,w27,ror#22 // Sigma0(a)
  804. eor w2,w2,w11,lsr#10 // sigma1(X[i+14])
  805. add w13,w13,w6
  806. add w22,w22,w26 // d+=h
  807. add w26,w26,w19 // h+=Maj(a,b,c)
  808. ldr w19,[x30],#4 // *K++, w28 in next round
  809. add w13,w13,w3
  810. add w26,w26,w17 // h+=Sigma0(a)
  811. add w13,w13,w2
  812. ldr w2,[sp,#12]
  813. str w5,[sp,#8]
  814. ror w16,w22,#6
  815. add w25,w25,w19 // h+=K[i]
  816. ror w4,w15,#7
  817. and w17,w23,w22
  818. ror w3,w12,#17
  819. bic w19,w24,w22
  820. ror w5,w26,#2
  821. add w25,w25,w13 // h+=X[i]
  822. eor w16,w16,w22,ror#11
  823. eor w4,w4,w15,ror#18
  824. orr w17,w17,w19 // Ch(e,f,g)
  825. eor w19,w26,w27 // a^b, b^c in next round
  826. eor w16,w16,w22,ror#25 // Sigma1(e)
  827. eor w5,w5,w26,ror#13
  828. add w25,w25,w17 // h+=Ch(e,f,g)
  829. and w28,w28,w19 // (b^c)&=(a^b)
  830. eor w3,w3,w12,ror#19
  831. eor w4,w4,w15,lsr#3 // sigma0(X[i+1])
  832. add w25,w25,w16 // h+=Sigma1(e)
  833. eor w28,w28,w27 // Maj(a,b,c)
  834. eor w17,w5,w26,ror#22 // Sigma0(a)
  835. eor w3,w3,w12,lsr#10 // sigma1(X[i+14])
  836. add w14,w14,w7
  837. add w21,w21,w25 // d+=h
  838. add w25,w25,w28 // h+=Maj(a,b,c)
  839. ldr w28,[x30],#4 // *K++, w19 in next round
  840. add w14,w14,w4
  841. add w25,w25,w17 // h+=Sigma0(a)
  842. add w14,w14,w3
  843. ldr w3,[sp,#0]
  844. str w6,[sp,#12]
  845. ror w16,w21,#6
  846. add w24,w24,w28 // h+=K[i]
  847. ror w5,w0,#7
  848. and w17,w22,w21
  849. ror w4,w13,#17
  850. bic w28,w23,w21
  851. ror w6,w25,#2
  852. add w24,w24,w14 // h+=X[i]
  853. eor w16,w16,w21,ror#11
  854. eor w5,w5,w0,ror#18
  855. orr w17,w17,w28 // Ch(e,f,g)
  856. eor w28,w25,w26 // a^b, b^c in next round
  857. eor w16,w16,w21,ror#25 // Sigma1(e)
  858. eor w6,w6,w25,ror#13
  859. add w24,w24,w17 // h+=Ch(e,f,g)
  860. and w19,w19,w28 // (b^c)&=(a^b)
  861. eor w4,w4,w13,ror#19
  862. eor w5,w5,w0,lsr#3 // sigma0(X[i+1])
  863. add w24,w24,w16 // h+=Sigma1(e)
  864. eor w19,w19,w26 // Maj(a,b,c)
  865. eor w17,w6,w25,ror#22 // Sigma0(a)
  866. eor w4,w4,w13,lsr#10 // sigma1(X[i+14])
  867. add w15,w15,w8
  868. add w20,w20,w24 // d+=h
  869. add w24,w24,w19 // h+=Maj(a,b,c)
  870. ldr w19,[x30],#4 // *K++, w28 in next round
  871. add w15,w15,w5
  872. add w24,w24,w17 // h+=Sigma0(a)
  873. add w15,w15,w4
  874. ldr w4,[sp,#4]
  875. str w7,[sp,#0]
  876. ror w16,w20,#6
  877. add w23,w23,w19 // h+=K[i]
  878. ror w6,w1,#7
  879. and w17,w21,w20
  880. ror w5,w14,#17
  881. bic w19,w22,w20
  882. ror w7,w24,#2
  883. add w23,w23,w15 // h+=X[i]
  884. eor w16,w16,w20,ror#11
  885. eor w6,w6,w1,ror#18
  886. orr w17,w17,w19 // Ch(e,f,g)
  887. eor w19,w24,w25 // a^b, b^c in next round
  888. eor w16,w16,w20,ror#25 // Sigma1(e)
  889. eor w7,w7,w24,ror#13
  890. add w23,w23,w17 // h+=Ch(e,f,g)
  891. and w28,w28,w19 // (b^c)&=(a^b)
  892. eor w5,w5,w14,ror#19
  893. eor w6,w6,w1,lsr#3 // sigma0(X[i+1])
  894. add w23,w23,w16 // h+=Sigma1(e)
  895. eor w28,w28,w25 // Maj(a,b,c)
  896. eor w17,w7,w24,ror#22 // Sigma0(a)
  897. eor w5,w5,w14,lsr#10 // sigma1(X[i+14])
  898. add w0,w0,w9
  899. add w27,w27,w23 // d+=h
  900. add w23,w23,w28 // h+=Maj(a,b,c)
  901. ldr w28,[x30],#4 // *K++, w19 in next round
  902. add w0,w0,w6
  903. add w23,w23,w17 // h+=Sigma0(a)
  904. add w0,w0,w5
  905. ldr w5,[sp,#8]
  906. str w8,[sp,#4]
  907. ror w16,w27,#6
  908. add w22,w22,w28 // h+=K[i]
  909. ror w7,w2,#7
  910. and w17,w20,w27
  911. ror w6,w15,#17
  912. bic w28,w21,w27
  913. ror w8,w23,#2
  914. add w22,w22,w0 // h+=X[i]
  915. eor w16,w16,w27,ror#11
  916. eor w7,w7,w2,ror#18
  917. orr w17,w17,w28 // Ch(e,f,g)
  918. eor w28,w23,w24 // a^b, b^c in next round
  919. eor w16,w16,w27,ror#25 // Sigma1(e)
  920. eor w8,w8,w23,ror#13
  921. add w22,w22,w17 // h+=Ch(e,f,g)
  922. and w19,w19,w28 // (b^c)&=(a^b)
  923. eor w6,w6,w15,ror#19
  924. eor w7,w7,w2,lsr#3 // sigma0(X[i+1])
  925. add w22,w22,w16 // h+=Sigma1(e)
  926. eor w19,w19,w24 // Maj(a,b,c)
  927. eor w17,w8,w23,ror#22 // Sigma0(a)
  928. eor w6,w6,w15,lsr#10 // sigma1(X[i+14])
  929. add w1,w1,w10
  930. add w26,w26,w22 // d+=h
  931. add w22,w22,w19 // h+=Maj(a,b,c)
  932. ldr w19,[x30],#4 // *K++, w28 in next round
  933. add w1,w1,w7
  934. add w22,w22,w17 // h+=Sigma0(a)
  935. add w1,w1,w6
  936. ldr w6,[sp,#12]
  937. str w9,[sp,#8]
  938. ror w16,w26,#6
  939. add w21,w21,w19 // h+=K[i]
  940. ror w8,w3,#7
  941. and w17,w27,w26
  942. ror w7,w0,#17
  943. bic w19,w20,w26
  944. ror w9,w22,#2
  945. add w21,w21,w1 // h+=X[i]
  946. eor w16,w16,w26,ror#11
  947. eor w8,w8,w3,ror#18
  948. orr w17,w17,w19 // Ch(e,f,g)
  949. eor w19,w22,w23 // a^b, b^c in next round
  950. eor w16,w16,w26,ror#25 // Sigma1(e)
  951. eor w9,w9,w22,ror#13
  952. add w21,w21,w17 // h+=Ch(e,f,g)
  953. and w28,w28,w19 // (b^c)&=(a^b)
  954. eor w7,w7,w0,ror#19
  955. eor w8,w8,w3,lsr#3 // sigma0(X[i+1])
  956. add w21,w21,w16 // h+=Sigma1(e)
  957. eor w28,w28,w23 // Maj(a,b,c)
  958. eor w17,w9,w22,ror#22 // Sigma0(a)
  959. eor w7,w7,w0,lsr#10 // sigma1(X[i+14])
  960. add w2,w2,w11
  961. add w25,w25,w21 // d+=h
  962. add w21,w21,w28 // h+=Maj(a,b,c)
  963. ldr w28,[x30],#4 // *K++, w19 in next round
  964. add w2,w2,w8
  965. add w21,w21,w17 // h+=Sigma0(a)
  966. add w2,w2,w7
  967. ldr w7,[sp,#0]
  968. str w10,[sp,#12]
  969. ror w16,w25,#6
  970. add w20,w20,w28 // h+=K[i]
  971. ror w9,w4,#7
  972. and w17,w26,w25
  973. ror w8,w1,#17
  974. bic w28,w27,w25
  975. ror w10,w21,#2
  976. add w20,w20,w2 // h+=X[i]
  977. eor w16,w16,w25,ror#11
  978. eor w9,w9,w4,ror#18
  979. orr w17,w17,w28 // Ch(e,f,g)
  980. eor w28,w21,w22 // a^b, b^c in next round
  981. eor w16,w16,w25,ror#25 // Sigma1(e)
  982. eor w10,w10,w21,ror#13
  983. add w20,w20,w17 // h+=Ch(e,f,g)
  984. and w19,w19,w28 // (b^c)&=(a^b)
  985. eor w8,w8,w1,ror#19
  986. eor w9,w9,w4,lsr#3 // sigma0(X[i+1])
  987. add w20,w20,w16 // h+=Sigma1(e)
  988. eor w19,w19,w22 // Maj(a,b,c)
  989. eor w17,w10,w21,ror#22 // Sigma0(a)
  990. eor w8,w8,w1,lsr#10 // sigma1(X[i+14])
  991. add w3,w3,w12
  992. add w24,w24,w20 // d+=h
  993. add w20,w20,w19 // h+=Maj(a,b,c)
  994. ldr w19,[x30],#4 // *K++, w28 in next round
  995. add w3,w3,w9
  996. add w20,w20,w17 // h+=Sigma0(a)
  997. add w3,w3,w8
  998. cbnz w19,.Loop_16_xx
  999. ldp x0,x2,[x29,#96]
  1000. ldr x1,[x29,#112]
  1001. sub x30,x30,#260 // rewind
  1002. ldp w3,w4,[x0]
  1003. ldp w5,w6,[x0,#2*4]
  1004. add x1,x1,#14*4 // advance input pointer
  1005. ldp w7,w8,[x0,#4*4]
  1006. add w20,w20,w3
  1007. ldp w9,w10,[x0,#6*4]
  1008. add w21,w21,w4
  1009. add w22,w22,w5
  1010. add w23,w23,w6
  1011. stp w20,w21,[x0]
  1012. add w24,w24,w7
  1013. add w25,w25,w8
  1014. stp w22,w23,[x0,#2*4]
  1015. add w26,w26,w9
  1016. add w27,w27,w10
  1017. cmp x1,x2
  1018. stp w24,w25,[x0,#4*4]
  1019. stp w26,w27,[x0,#6*4]
  1020. b.ne .Loop
  1021. ldp x19,x20,[x29,#16]
  1022. add sp,sp,#4*4
  1023. ldp x21,x22,[x29,#32]
  1024. ldp x23,x24,[x29,#48]
  1025. ldp x25,x26,[x29,#64]
  1026. ldp x27,x28,[x29,#80]
  1027. ldp x29,x30,[sp],#128
  1028. ret
  1029. .size sha256_block_data_order,.-sha256_block_data_order
  1030. .align 6
  1031. .type .LK256,%object
  1032. .LK256:
  1033. .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
  1034. .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
  1035. .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
  1036. .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
  1037. .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
  1038. .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
  1039. .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
  1040. .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
  1041. .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
  1042. .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
  1043. .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
  1044. .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070
  1045. .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
  1046. .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
  1047. .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
  1048. .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
  1049. .long 0 //terminator
  1050. .size .LK256,.-.LK256
  1051. #ifndef __KERNEL__
  1052. .align 3
  1053. .LOPENSSL_armcap_P:
  1054. # ifdef __ILP32__
  1055. .long OPENSSL_armcap_P-.
  1056. # else
  1057. .quad OPENSSL_armcap_P-.
  1058. # endif
  1059. #endif
  1060. .asciz "SHA256 block transform for ARMv8, CRYPTOGAMS by <appro@openssl.org>"
  1061. .align 2
  1062. #ifndef __KERNEL__
  1063. .type sha256_block_armv8,%function
  1064. .align 6
  1065. sha256_block_armv8:
  1066. .Lv8_entry:
  1067. stp x29,x30,[sp,#-16]!
  1068. add x29,sp,#0
  1069. ld1 {v0.4s,v1.4s},[x0]
  1070. adr x3,.LK256
  1071. .Loop_hw:
  1072. ld1 {v4.16b-v7.16b},[x1],#64
  1073. sub x2,x2,#1
  1074. ld1 {v16.4s},[x3],#16
  1075. rev32 v4.16b,v4.16b
  1076. rev32 v5.16b,v5.16b
  1077. rev32 v6.16b,v6.16b
  1078. rev32 v7.16b,v7.16b
  1079. orr v18.16b,v0.16b,v0.16b // offload
  1080. orr v19.16b,v1.16b,v1.16b
  1081. ld1 {v17.4s},[x3],#16
  1082. add v16.4s,v16.4s,v4.4s
  1083. .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
  1084. orr v2.16b,v0.16b,v0.16b
  1085. .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
  1086. .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
  1087. .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
  1088. ld1 {v16.4s},[x3],#16
  1089. add v17.4s,v17.4s,v5.4s
  1090. .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
  1091. orr v2.16b,v0.16b,v0.16b
  1092. .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
  1093. .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
  1094. .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
  1095. ld1 {v17.4s},[x3],#16
  1096. add v16.4s,v16.4s,v6.4s
  1097. .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
  1098. orr v2.16b,v0.16b,v0.16b
  1099. .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
  1100. .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
  1101. .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
  1102. ld1 {v16.4s},[x3],#16
  1103. add v17.4s,v17.4s,v7.4s
  1104. .inst 0x5e282887 //sha256su0 v7.16b,v4.16b
  1105. orr v2.16b,v0.16b,v0.16b
  1106. .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
  1107. .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
  1108. .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
  1109. ld1 {v17.4s},[x3],#16
  1110. add v16.4s,v16.4s,v4.4s
  1111. .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
  1112. orr v2.16b,v0.16b,v0.16b
  1113. .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
  1114. .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
  1115. .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
  1116. ld1 {v16.4s},[x3],#16
  1117. add v17.4s,v17.4s,v5.4s
  1118. .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
  1119. orr v2.16b,v0.16b,v0.16b
  1120. .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
  1121. .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
  1122. .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
  1123. ld1 {v17.4s},[x3],#16
  1124. add v16.4s,v16.4s,v6.4s
  1125. .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
  1126. orr v2.16b,v0.16b,v0.16b
  1127. .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
  1128. .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
  1129. .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
  1130. ld1 {v16.4s},[x3],#16
  1131. add v17.4s,v17.4s,v7.4s
  1132. .inst 0x5e282887 //sha256su0 v7.16b,v4.16b
  1133. orr v2.16b,v0.16b,v0.16b
  1134. .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
  1135. .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
  1136. .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
  1137. ld1 {v17.4s},[x3],#16
  1138. add v16.4s,v16.4s,v4.4s
  1139. .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b
  1140. orr v2.16b,v0.16b,v0.16b
  1141. .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
  1142. .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
  1143. .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
  1144. ld1 {v16.4s},[x3],#16
  1145. add v17.4s,v17.4s,v5.4s
  1146. .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b
  1147. orr v2.16b,v0.16b,v0.16b
  1148. .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
  1149. .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
  1150. .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
  1151. ld1 {v17.4s},[x3],#16
  1152. add v16.4s,v16.4s,v6.4s
  1153. .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b
  1154. orr v2.16b,v0.16b,v0.16b
  1155. .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
  1156. .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
  1157. .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
  1158. ld1 {v16.4s},[x3],#16
  1159. add v17.4s,v17.4s,v7.4s
  1160. .inst 0x5e282887 //sha256su0 v7.16b,v4.16b
  1161. orr v2.16b,v0.16b,v0.16b
  1162. .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
  1163. .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
  1164. .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
  1165. ld1 {v17.4s},[x3],#16
  1166. add v16.4s,v16.4s,v4.4s
  1167. orr v2.16b,v0.16b,v0.16b
  1168. .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
  1169. .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
  1170. ld1 {v16.4s},[x3],#16
  1171. add v17.4s,v17.4s,v5.4s
  1172. orr v2.16b,v0.16b,v0.16b
  1173. .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
  1174. .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
  1175. ld1 {v17.4s},[x3]
  1176. add v16.4s,v16.4s,v6.4s
  1177. sub x3,x3,#64*4-16 // rewind
  1178. orr v2.16b,v0.16b,v0.16b
  1179. .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
  1180. .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
  1181. add v17.4s,v17.4s,v7.4s
  1182. orr v2.16b,v0.16b,v0.16b
  1183. .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
  1184. .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
  1185. add v0.4s,v0.4s,v18.4s
  1186. add v1.4s,v1.4s,v19.4s
  1187. cbnz x2,.Loop_hw
  1188. st1 {v0.4s,v1.4s},[x0]
  1189. ldr x29,[sp],#16
  1190. ret
  1191. .size sha256_block_armv8,.-sha256_block_armv8
  1192. #endif
  1193. #ifdef __KERNEL__
  1194. .globl sha256_block_neon
  1195. #endif
  1196. .type sha256_block_neon,%function
  1197. .align 4
  1198. sha256_block_neon:
  1199. .Lneon_entry:
  1200. stp x29, x30, [sp, #-16]!
  1201. mov x29, sp
  1202. sub sp,sp,#16*4
  1203. adr x16,.LK256
  1204. add x2,x1,x2,lsl#6 // len to point at the end of inp
  1205. ld1 {v0.16b},[x1], #16
  1206. ld1 {v1.16b},[x1], #16
  1207. ld1 {v2.16b},[x1], #16
  1208. ld1 {v3.16b},[x1], #16
  1209. ld1 {v4.4s},[x16], #16
  1210. ld1 {v5.4s},[x16], #16
  1211. ld1 {v6.4s},[x16], #16
  1212. ld1 {v7.4s},[x16], #16
  1213. rev32 v0.16b,v0.16b // yes, even on
  1214. rev32 v1.16b,v1.16b // big-endian
  1215. rev32 v2.16b,v2.16b
  1216. rev32 v3.16b,v3.16b
  1217. mov x17,sp
  1218. add v4.4s,v4.4s,v0.4s
  1219. add v5.4s,v5.4s,v1.4s
  1220. add v6.4s,v6.4s,v2.4s
  1221. st1 {v4.4s-v5.4s},[x17], #32
  1222. add v7.4s,v7.4s,v3.4s
  1223. st1 {v6.4s-v7.4s},[x17]
  1224. sub x17,x17,#32
  1225. ldp w3,w4,[x0]
  1226. ldp w5,w6,[x0,#8]
  1227. ldp w7,w8,[x0,#16]
  1228. ldp w9,w10,[x0,#24]
  1229. ldr w12,[sp,#0]
  1230. mov w13,wzr
  1231. eor w14,w4,w5
  1232. mov w15,wzr
  1233. b .L_00_48
  1234. .align 4
  1235. .L_00_48:
  1236. ext v4.16b,v0.16b,v1.16b,#4
  1237. add w10,w10,w12
  1238. add w3,w3,w15
  1239. and w12,w8,w7
  1240. bic w15,w9,w7
  1241. ext v7.16b,v2.16b,v3.16b,#4
  1242. eor w11,w7,w7,ror#5
  1243. add w3,w3,w13
  1244. mov d19,v3.d[1]
  1245. orr w12,w12,w15
  1246. eor w11,w11,w7,ror#19
  1247. ushr v6.4s,v4.4s,#7
  1248. eor w15,w3,w3,ror#11
  1249. ushr v5.4s,v4.4s,#3
  1250. add w10,w10,w12
  1251. add v0.4s,v0.4s,v7.4s
  1252. ror w11,w11,#6
  1253. sli v6.4s,v4.4s,#25
  1254. eor w13,w3,w4
  1255. eor w15,w15,w3,ror#20
  1256. ushr v7.4s,v4.4s,#18
  1257. add w10,w10,w11
  1258. ldr w12,[sp,#4]
  1259. and w14,w14,w13
  1260. eor v5.16b,v5.16b,v6.16b
  1261. ror w15,w15,#2
  1262. add w6,w6,w10
  1263. sli v7.4s,v4.4s,#14
  1264. eor w14,w14,w4
  1265. ushr v16.4s,v19.4s,#17
  1266. add w9,w9,w12
  1267. add w10,w10,w15
  1268. and w12,w7,w6
  1269. eor v5.16b,v5.16b,v7.16b
  1270. bic w15,w8,w6
  1271. eor w11,w6,w6,ror#5
  1272. sli v16.4s,v19.4s,#15
  1273. add w10,w10,w14
  1274. orr w12,w12,w15
  1275. ushr v17.4s,v19.4s,#10
  1276. eor w11,w11,w6,ror#19
  1277. eor w15,w10,w10,ror#11
  1278. ushr v7.4s,v19.4s,#19
  1279. add w9,w9,w12
  1280. ror w11,w11,#6
  1281. add v0.4s,v0.4s,v5.4s
  1282. eor w14,w10,w3
  1283. eor w15,w15,w10,ror#20
  1284. sli v7.4s,v19.4s,#13
  1285. add w9,w9,w11
  1286. ldr w12,[sp,#8]
  1287. and w13,w13,w14
  1288. eor v17.16b,v17.16b,v16.16b
  1289. ror w15,w15,#2
  1290. add w5,w5,w9
  1291. eor w13,w13,w3
  1292. eor v17.16b,v17.16b,v7.16b
  1293. add w8,w8,w12
  1294. add w9,w9,w15
  1295. and w12,w6,w5
  1296. add v0.4s,v0.4s,v17.4s
  1297. bic w15,w7,w5
  1298. eor w11,w5,w5,ror#5
  1299. add w9,w9,w13
  1300. ushr v18.4s,v0.4s,#17
  1301. orr w12,w12,w15
  1302. ushr v19.4s,v0.4s,#10
  1303. eor w11,w11,w5,ror#19
  1304. eor w15,w9,w9,ror#11
  1305. sli v18.4s,v0.4s,#15
  1306. add w8,w8,w12
  1307. ushr v17.4s,v0.4s,#19
  1308. ror w11,w11,#6
  1309. eor w13,w9,w10
  1310. eor v19.16b,v19.16b,v18.16b
  1311. eor w15,w15,w9,ror#20
  1312. add w8,w8,w11
  1313. sli v17.4s,v0.4s,#13
  1314. ldr w12,[sp,#12]
  1315. and w14,w14,w13
  1316. ror w15,w15,#2
  1317. ld1 {v4.4s},[x16], #16
  1318. add w4,w4,w8
  1319. eor v19.16b,v19.16b,v17.16b
  1320. eor w14,w14,w10
  1321. eor v17.16b,v17.16b,v17.16b
  1322. add w7,w7,w12
  1323. add w8,w8,w15
  1324. and w12,w5,w4
  1325. mov v17.d[1],v19.d[0]
  1326. bic w15,w6,w4
  1327. eor w11,w4,w4,ror#5
  1328. add w8,w8,w14
  1329. add v0.4s,v0.4s,v17.4s
  1330. orr w12,w12,w15
  1331. eor w11,w11,w4,ror#19
  1332. eor w15,w8,w8,ror#11
  1333. add v4.4s,v4.4s,v0.4s
  1334. add w7,w7,w12
  1335. ror w11,w11,#6
  1336. eor w14,w8,w9
  1337. eor w15,w15,w8,ror#20
  1338. add w7,w7,w11
  1339. ldr w12,[sp,#16]
  1340. and w13,w13,w14
  1341. ror w15,w15,#2
  1342. add w3,w3,w7
  1343. eor w13,w13,w9
  1344. st1 {v4.4s},[x17], #16
  1345. ext v4.16b,v1.16b,v2.16b,#4
  1346. add w6,w6,w12
  1347. add w7,w7,w15
  1348. and w12,w4,w3
  1349. bic w15,w5,w3
  1350. ext v7.16b,v3.16b,v0.16b,#4
  1351. eor w11,w3,w3,ror#5
  1352. add w7,w7,w13
  1353. mov d19,v0.d[1]
  1354. orr w12,w12,w15
  1355. eor w11,w11,w3,ror#19
  1356. ushr v6.4s,v4.4s,#7
  1357. eor w15,w7,w7,ror#11
  1358. ushr v5.4s,v4.4s,#3
  1359. add w6,w6,w12
  1360. add v1.4s,v1.4s,v7.4s
  1361. ror w11,w11,#6
  1362. sli v6.4s,v4.4s,#25
  1363. eor w13,w7,w8
  1364. eor w15,w15,w7,ror#20
  1365. ushr v7.4s,v4.4s,#18
  1366. add w6,w6,w11
  1367. ldr w12,[sp,#20]
  1368. and w14,w14,w13
  1369. eor v5.16b,v5.16b,v6.16b
  1370. ror w15,w15,#2
  1371. add w10,w10,w6
  1372. sli v7.4s,v4.4s,#14
  1373. eor w14,w14,w8
  1374. ushr v16.4s,v19.4s,#17
  1375. add w5,w5,w12
  1376. add w6,w6,w15
  1377. and w12,w3,w10
  1378. eor v5.16b,v5.16b,v7.16b
  1379. bic w15,w4,w10
  1380. eor w11,w10,w10,ror#5
  1381. sli v16.4s,v19.4s,#15
  1382. add w6,w6,w14
  1383. orr w12,w12,w15
  1384. ushr v17.4s,v19.4s,#10
  1385. eor w11,w11,w10,ror#19
  1386. eor w15,w6,w6,ror#11
  1387. ushr v7.4s,v19.4s,#19
  1388. add w5,w5,w12
  1389. ror w11,w11,#6
  1390. add v1.4s,v1.4s,v5.4s
  1391. eor w14,w6,w7
  1392. eor w15,w15,w6,ror#20
  1393. sli v7.4s,v19.4s,#13
  1394. add w5,w5,w11
  1395. ldr w12,[sp,#24]
  1396. and w13,w13,w14
  1397. eor v17.16b,v17.16b,v16.16b
  1398. ror w15,w15,#2
  1399. add w9,w9,w5
  1400. eor w13,w13,w7
  1401. eor v17.16b,v17.16b,v7.16b
  1402. add w4,w4,w12
  1403. add w5,w5,w15
  1404. and w12,w10,w9
  1405. add v1.4s,v1.4s,v17.4s
  1406. bic w15,w3,w9
  1407. eor w11,w9,w9,ror#5
  1408. add w5,w5,w13
  1409. ushr v18.4s,v1.4s,#17
  1410. orr w12,w12,w15
  1411. ushr v19.4s,v1.4s,#10
  1412. eor w11,w11,w9,ror#19
  1413. eor w15,w5,w5,ror#11
  1414. sli v18.4s,v1.4s,#15
  1415. add w4,w4,w12
  1416. ushr v17.4s,v1.4s,#19
  1417. ror w11,w11,#6
  1418. eor w13,w5,w6
  1419. eor v19.16b,v19.16b,v18.16b
  1420. eor w15,w15,w5,ror#20
  1421. add w4,w4,w11
  1422. sli v17.4s,v1.4s,#13
  1423. ldr w12,[sp,#28]
  1424. and w14,w14,w13
  1425. ror w15,w15,#2
  1426. ld1 {v4.4s},[x16], #16
  1427. add w8,w8,w4
  1428. eor v19.16b,v19.16b,v17.16b
  1429. eor w14,w14,w6
  1430. eor v17.16b,v17.16b,v17.16b
  1431. add w3,w3,w12
  1432. add w4,w4,w15
  1433. and w12,w9,w8
  1434. mov v17.d[1],v19.d[0]
  1435. bic w15,w10,w8
  1436. eor w11,w8,w8,ror#5
  1437. add w4,w4,w14
  1438. add v1.4s,v1.4s,v17.4s
  1439. orr w12,w12,w15
  1440. eor w11,w11,w8,ror#19
  1441. eor w15,w4,w4,ror#11
  1442. add v4.4s,v4.4s,v1.4s
  1443. add w3,w3,w12
  1444. ror w11,w11,#6
  1445. eor w14,w4,w5
  1446. eor w15,w15,w4,ror#20
  1447. add w3,w3,w11
  1448. ldr w12,[sp,#32]
  1449. and w13,w13,w14
  1450. ror w15,w15,#2
  1451. add w7,w7,w3
  1452. eor w13,w13,w5
  1453. st1 {v4.4s},[x17], #16
  1454. ext v4.16b,v2.16b,v3.16b,#4
  1455. add w10,w10,w12
  1456. add w3,w3,w15
  1457. and w12,w8,w7
  1458. bic w15,w9,w7
  1459. ext v7.16b,v0.16b,v1.16b,#4
  1460. eor w11,w7,w7,ror#5
  1461. add w3,w3,w13
  1462. mov d19,v1.d[1]
  1463. orr w12,w12,w15
  1464. eor w11,w11,w7,ror#19
  1465. ushr v6.4s,v4.4s,#7
  1466. eor w15,w3,w3,ror#11
  1467. ushr v5.4s,v4.4s,#3
  1468. add w10,w10,w12
  1469. add v2.4s,v2.4s,v7.4s
  1470. ror w11,w11,#6
  1471. sli v6.4s,v4.4s,#25
  1472. eor w13,w3,w4
  1473. eor w15,w15,w3,ror#20
  1474. ushr v7.4s,v4.4s,#18
  1475. add w10,w10,w11
  1476. ldr w12,[sp,#36]
  1477. and w14,w14,w13
  1478. eor v5.16b,v5.16b,v6.16b
  1479. ror w15,w15,#2
  1480. add w6,w6,w10
  1481. sli v7.4s,v4.4s,#14
  1482. eor w14,w14,w4
  1483. ushr v16.4s,v19.4s,#17
  1484. add w9,w9,w12
  1485. add w10,w10,w15
  1486. and w12,w7,w6
  1487. eor v5.16b,v5.16b,v7.16b
  1488. bic w15,w8,w6
  1489. eor w11,w6,w6,ror#5
  1490. sli v16.4s,v19.4s,#15
  1491. add w10,w10,w14
  1492. orr w12,w12,w15
  1493. ushr v17.4s,v19.4s,#10
  1494. eor w11,w11,w6,ror#19
  1495. eor w15,w10,w10,ror#11
  1496. ushr v7.4s,v19.4s,#19
  1497. add w9,w9,w12
  1498. ror w11,w11,#6
  1499. add v2.4s,v2.4s,v5.4s
  1500. eor w14,w10,w3
  1501. eor w15,w15,w10,ror#20
  1502. sli v7.4s,v19.4s,#13
  1503. add w9,w9,w11
  1504. ldr w12,[sp,#40]
  1505. and w13,w13,w14
  1506. eor v17.16b,v17.16b,v16.16b
  1507. ror w15,w15,#2
  1508. add w5,w5,w9
  1509. eor w13,w13,w3
  1510. eor v17.16b,v17.16b,v7.16b
  1511. add w8,w8,w12
  1512. add w9,w9,w15
  1513. and w12,w6,w5
  1514. add v2.4s,v2.4s,v17.4s
  1515. bic w15,w7,w5
  1516. eor w11,w5,w5,ror#5
  1517. add w9,w9,w13
  1518. ushr v18.4s,v2.4s,#17
  1519. orr w12,w12,w15
  1520. ushr v19.4s,v2.4s,#10
  1521. eor w11,w11,w5,ror#19
  1522. eor w15,w9,w9,ror#11
  1523. sli v18.4s,v2.4s,#15
  1524. add w8,w8,w12
  1525. ushr v17.4s,v2.4s,#19
  1526. ror w11,w11,#6
  1527. eor w13,w9,w10
  1528. eor v19.16b,v19.16b,v18.16b
  1529. eor w15,w15,w9,ror#20
  1530. add w8,w8,w11
  1531. sli v17.4s,v2.4s,#13
  1532. ldr w12,[sp,#44]
  1533. and w14,w14,w13
  1534. ror w15,w15,#2
  1535. ld1 {v4.4s},[x16], #16
  1536. add w4,w4,w8
  1537. eor v19.16b,v19.16b,v17.16b
  1538. eor w14,w14,w10
  1539. eor v17.16b,v17.16b,v17.16b
  1540. add w7,w7,w12
  1541. add w8,w8,w15
  1542. and w12,w5,w4
  1543. mov v17.d[1],v19.d[0]
  1544. bic w15,w6,w4
  1545. eor w11,w4,w4,ror#5
  1546. add w8,w8,w14
  1547. add v2.4s,v2.4s,v17.4s
  1548. orr w12,w12,w15
  1549. eor w11,w11,w4,ror#19
  1550. eor w15,w8,w8,ror#11
  1551. add v4.4s,v4.4s,v2.4s
  1552. add w7,w7,w12
  1553. ror w11,w11,#6
  1554. eor w14,w8,w9
  1555. eor w15,w15,w8,ror#20
  1556. add w7,w7,w11
  1557. ldr w12,[sp,#48]
  1558. and w13,w13,w14
  1559. ror w15,w15,#2
  1560. add w3,w3,w7
  1561. eor w13,w13,w9
  1562. st1 {v4.4s},[x17], #16
  1563. ext v4.16b,v3.16b,v0.16b,#4
  1564. add w6,w6,w12
  1565. add w7,w7,w15
  1566. and w12,w4,w3
  1567. bic w15,w5,w3
  1568. ext v7.16b,v1.16b,v2.16b,#4
  1569. eor w11,w3,w3,ror#5
  1570. add w7,w7,w13
  1571. mov d19,v2.d[1]
  1572. orr w12,w12,w15
  1573. eor w11,w11,w3,ror#19
  1574. ushr v6.4s,v4.4s,#7
  1575. eor w15,w7,w7,ror#11
  1576. ushr v5.4s,v4.4s,#3
  1577. add w6,w6,w12
  1578. add v3.4s,v3.4s,v7.4s
  1579. ror w11,w11,#6
  1580. sli v6.4s,v4.4s,#25
  1581. eor w13,w7,w8
  1582. eor w15,w15,w7,ror#20
  1583. ushr v7.4s,v4.4s,#18
  1584. add w6,w6,w11
  1585. ldr w12,[sp,#52]
  1586. and w14,w14,w13
  1587. eor v5.16b,v5.16b,v6.16b
  1588. ror w15,w15,#2
  1589. add w10,w10,w6
  1590. sli v7.4s,v4.4s,#14
  1591. eor w14,w14,w8
  1592. ushr v16.4s,v19.4s,#17
  1593. add w5,w5,w12
  1594. add w6,w6,w15
  1595. and w12,w3,w10
  1596. eor v5.16b,v5.16b,v7.16b
  1597. bic w15,w4,w10
  1598. eor w11,w10,w10,ror#5
  1599. sli v16.4s,v19.4s,#15
  1600. add w6,w6,w14
  1601. orr w12,w12,w15
  1602. ushr v17.4s,v19.4s,#10
  1603. eor w11,w11,w10,ror#19
  1604. eor w15,w6,w6,ror#11
  1605. ushr v7.4s,v19.4s,#19
  1606. add w5,w5,w12
  1607. ror w11,w11,#6
  1608. add v3.4s,v3.4s,v5.4s
  1609. eor w14,w6,w7
  1610. eor w15,w15,w6,ror#20
  1611. sli v7.4s,v19.4s,#13
  1612. add w5,w5,w11
  1613. ldr w12,[sp,#56]
  1614. and w13,w13,w14
  1615. eor v17.16b,v17.16b,v16.16b
  1616. ror w15,w15,#2
  1617. add w9,w9,w5
  1618. eor w13,w13,w7
  1619. eor v17.16b,v17.16b,v7.16b
  1620. add w4,w4,w12
  1621. add w5,w5,w15
  1622. and w12,w10,w9
  1623. add v3.4s,v3.4s,v17.4s
  1624. bic w15,w3,w9
  1625. eor w11,w9,w9,ror#5
  1626. add w5,w5,w13
  1627. ushr v18.4s,v3.4s,#17
  1628. orr w12,w12,w15
  1629. ushr v19.4s,v3.4s,#10
  1630. eor w11,w11,w9,ror#19
  1631. eor w15,w5,w5,ror#11
  1632. sli v18.4s,v3.4s,#15
  1633. add w4,w4,w12
  1634. ushr v17.4s,v3.4s,#19
  1635. ror w11,w11,#6
  1636. eor w13,w5,w6
  1637. eor v19.16b,v19.16b,v18.16b
  1638. eor w15,w15,w5,ror#20
  1639. add w4,w4,w11
  1640. sli v17.4s,v3.4s,#13
  1641. ldr w12,[sp,#60]
  1642. and w14,w14,w13
  1643. ror w15,w15,#2
  1644. ld1 {v4.4s},[x16], #16
  1645. add w8,w8,w4
  1646. eor v19.16b,v19.16b,v17.16b
  1647. eor w14,w14,w6
  1648. eor v17.16b,v17.16b,v17.16b
  1649. add w3,w3,w12
  1650. add w4,w4,w15
  1651. and w12,w9,w8
  1652. mov v17.d[1],v19.d[0]
  1653. bic w15,w10,w8
  1654. eor w11,w8,w8,ror#5
  1655. add w4,w4,w14
  1656. add v3.4s,v3.4s,v17.4s
  1657. orr w12,w12,w15
  1658. eor w11,w11,w8,ror#19
  1659. eor w15,w4,w4,ror#11
  1660. add v4.4s,v4.4s,v3.4s
  1661. add w3,w3,w12
  1662. ror w11,w11,#6
  1663. eor w14,w4,w5
  1664. eor w15,w15,w4,ror#20
  1665. add w3,w3,w11
  1666. ldr w12,[x16]
  1667. and w13,w13,w14
  1668. ror w15,w15,#2
  1669. add w7,w7,w3
  1670. eor w13,w13,w5
  1671. st1 {v4.4s},[x17], #16
  1672. cmp w12,#0 // check for K256 terminator
  1673. ldr w12,[sp,#0]
  1674. sub x17,x17,#64
  1675. bne .L_00_48
  1676. sub x16,x16,#256 // rewind x16
  1677. cmp x1,x2
  1678. mov x17, #64
  1679. csel x17, x17, xzr, eq
  1680. sub x1,x1,x17 // avoid SEGV
  1681. mov x17,sp
  1682. add w10,w10,w12
  1683. add w3,w3,w15
  1684. and w12,w8,w7
  1685. ld1 {v0.16b},[x1],#16
  1686. bic w15,w9,w7
  1687. eor w11,w7,w7,ror#5
  1688. ld1 {v4.4s},[x16],#16
  1689. add w3,w3,w13
  1690. orr w12,w12,w15
  1691. eor w11,w11,w7,ror#19
  1692. eor w15,w3,w3,ror#11
  1693. rev32 v0.16b,v0.16b
  1694. add w10,w10,w12
  1695. ror w11,w11,#6
  1696. eor w13,w3,w4
  1697. eor w15,w15,w3,ror#20
  1698. add v4.4s,v4.4s,v0.4s
  1699. add w10,w10,w11
  1700. ldr w12,[sp,#4]
  1701. and w14,w14,w13
  1702. ror w15,w15,#2
  1703. add w6,w6,w10
  1704. eor w14,w14,w4
  1705. add w9,w9,w12
  1706. add w10,w10,w15
  1707. and w12,w7,w6
  1708. bic w15,w8,w6
  1709. eor w11,w6,w6,ror#5
  1710. add w10,w10,w14
  1711. orr w12,w12,w15
  1712. eor w11,w11,w6,ror#19
  1713. eor w15,w10,w10,ror#11
  1714. add w9,w9,w12
  1715. ror w11,w11,#6
  1716. eor w14,w10,w3
  1717. eor w15,w15,w10,ror#20
  1718. add w9,w9,w11
  1719. ldr w12,[sp,#8]
  1720. and w13,w13,w14
  1721. ror w15,w15,#2
  1722. add w5,w5,w9
  1723. eor w13,w13,w3
  1724. add w8,w8,w12
  1725. add w9,w9,w15
  1726. and w12,w6,w5
  1727. bic w15,w7,w5
  1728. eor w11,w5,w5,ror#5
  1729. add w9,w9,w13
  1730. orr w12,w12,w15
  1731. eor w11,w11,w5,ror#19
  1732. eor w15,w9,w9,ror#11
  1733. add w8,w8,w12
  1734. ror w11,w11,#6
  1735. eor w13,w9,w10
  1736. eor w15,w15,w9,ror#20
  1737. add w8,w8,w11
  1738. ldr w12,[sp,#12]
  1739. and w14,w14,w13
  1740. ror w15,w15,#2
  1741. add w4,w4,w8
  1742. eor w14,w14,w10
  1743. add w7,w7,w12
  1744. add w8,w8,w15
  1745. and w12,w5,w4
  1746. bic w15,w6,w4
  1747. eor w11,w4,w4,ror#5
  1748. add w8,w8,w14
  1749. orr w12,w12,w15
  1750. eor w11,w11,w4,ror#19
  1751. eor w15,w8,w8,ror#11
  1752. add w7,w7,w12
  1753. ror w11,w11,#6
  1754. eor w14,w8,w9
  1755. eor w15,w15,w8,ror#20
  1756. add w7,w7,w11
  1757. ldr w12,[sp,#16]
  1758. and w13,w13,w14
  1759. ror w15,w15,#2
  1760. add w3,w3,w7
  1761. eor w13,w13,w9
  1762. st1 {v4.4s},[x17], #16
  1763. add w6,w6,w12
  1764. add w7,w7,w15
  1765. and w12,w4,w3
  1766. ld1 {v1.16b},[x1],#16
  1767. bic w15,w5,w3
  1768. eor w11,w3,w3,ror#5
  1769. ld1 {v4.4s},[x16],#16
  1770. add w7,w7,w13
  1771. orr w12,w12,w15
  1772. eor w11,w11,w3,ror#19
  1773. eor w15,w7,w7,ror#11
  1774. rev32 v1.16b,v1.16b
  1775. add w6,w6,w12
  1776. ror w11,w11,#6
  1777. eor w13,w7,w8
  1778. eor w15,w15,w7,ror#20
  1779. add v4.4s,v4.4s,v1.4s
  1780. add w6,w6,w11
  1781. ldr w12,[sp,#20]
  1782. and w14,w14,w13
  1783. ror w15,w15,#2
  1784. add w10,w10,w6
  1785. eor w14,w14,w8
  1786. add w5,w5,w12
  1787. add w6,w6,w15
  1788. and w12,w3,w10
  1789. bic w15,w4,w10
  1790. eor w11,w10,w10,ror#5
  1791. add w6,w6,w14
  1792. orr w12,w12,w15
  1793. eor w11,w11,w10,ror#19
  1794. eor w15,w6,w6,ror#11
  1795. add w5,w5,w12
  1796. ror w11,w11,#6
  1797. eor w14,w6,w7
  1798. eor w15,w15,w6,ror#20
  1799. add w5,w5,w11
  1800. ldr w12,[sp,#24]
  1801. and w13,w13,w14
  1802. ror w15,w15,#2
  1803. add w9,w9,w5
  1804. eor w13,w13,w7
  1805. add w4,w4,w12
  1806. add w5,w5,w15
  1807. and w12,w10,w9
  1808. bic w15,w3,w9
  1809. eor w11,w9,w9,ror#5
  1810. add w5,w5,w13
  1811. orr w12,w12,w15
  1812. eor w11,w11,w9,ror#19
  1813. eor w15,w5,w5,ror#11
  1814. add w4,w4,w12
  1815. ror w11,w11,#6
  1816. eor w13,w5,w6
  1817. eor w15,w15,w5,ror#20
  1818. add w4,w4,w11
  1819. ldr w12,[sp,#28]
  1820. and w14,w14,w13
  1821. ror w15,w15,#2
  1822. add w8,w8,w4
  1823. eor w14,w14,w6
  1824. add w3,w3,w12
  1825. add w4,w4,w15
  1826. and w12,w9,w8
  1827. bic w15,w10,w8
  1828. eor w11,w8,w8,ror#5
  1829. add w4,w4,w14
  1830. orr w12,w12,w15
  1831. eor w11,w11,w8,ror#19
  1832. eor w15,w4,w4,ror#11
  1833. add w3,w3,w12
  1834. ror w11,w11,#6
  1835. eor w14,w4,w5
  1836. eor w15,w15,w4,ror#20
  1837. add w3,w3,w11
  1838. ldr w12,[sp,#32]
  1839. and w13,w13,w14
  1840. ror w15,w15,#2
  1841. add w7,w7,w3
  1842. eor w13,w13,w5
  1843. st1 {v4.4s},[x17], #16
  1844. add w10,w10,w12
  1845. add w3,w3,w15
  1846. and w12,w8,w7
  1847. ld1 {v2.16b},[x1],#16
  1848. bic w15,w9,w7
  1849. eor w11,w7,w7,ror#5
  1850. ld1 {v4.4s},[x16],#16
  1851. add w3,w3,w13
  1852. orr w12,w12,w15
  1853. eor w11,w11,w7,ror#19
  1854. eor w15,w3,w3,ror#11
  1855. rev32 v2.16b,v2.16b
  1856. add w10,w10,w12
  1857. ror w11,w11,#6
  1858. eor w13,w3,w4
  1859. eor w15,w15,w3,ror#20
  1860. add v4.4s,v4.4s,v2.4s
  1861. add w10,w10,w11
  1862. ldr w12,[sp,#36]
  1863. and w14,w14,w13
  1864. ror w15,w15,#2
  1865. add w6,w6,w10
  1866. eor w14,w14,w4
  1867. add w9,w9,w12
  1868. add w10,w10,w15
  1869. and w12,w7,w6
  1870. bic w15,w8,w6
  1871. eor w11,w6,w6,ror#5
  1872. add w10,w10,w14
  1873. orr w12,w12,w15
  1874. eor w11,w11,w6,ror#19
  1875. eor w15,w10,w10,ror#11
  1876. add w9,w9,w12
  1877. ror w11,w11,#6
  1878. eor w14,w10,w3
  1879. eor w15,w15,w10,ror#20
  1880. add w9,w9,w11
  1881. ldr w12,[sp,#40]
  1882. and w13,w13,w14
  1883. ror w15,w15,#2
  1884. add w5,w5,w9
  1885. eor w13,w13,w3
  1886. add w8,w8,w12
  1887. add w9,w9,w15
  1888. and w12,w6,w5
  1889. bic w15,w7,w5
  1890. eor w11,w5,w5,ror#5
  1891. add w9,w9,w13
  1892. orr w12,w12,w15
  1893. eor w11,w11,w5,ror#19
  1894. eor w15,w9,w9,ror#11
  1895. add w8,w8,w12
  1896. ror w11,w11,#6
  1897. eor w13,w9,w10
  1898. eor w15,w15,w9,ror#20
  1899. add w8,w8,w11
  1900. ldr w12,[sp,#44]
  1901. and w14,w14,w13
  1902. ror w15,w15,#2
  1903. add w4,w4,w8
  1904. eor w14,w14,w10
  1905. add w7,w7,w12
  1906. add w8,w8,w15
  1907. and w12,w5,w4
  1908. bic w15,w6,w4
  1909. eor w11,w4,w4,ror#5
  1910. add w8,w8,w14
  1911. orr w12,w12,w15
  1912. eor w11,w11,w4,ror#19
  1913. eor w15,w8,w8,ror#11
  1914. add w7,w7,w12
  1915. ror w11,w11,#6
  1916. eor w14,w8,w9
  1917. eor w15,w15,w8,ror#20
  1918. add w7,w7,w11
  1919. ldr w12,[sp,#48]
  1920. and w13,w13,w14
  1921. ror w15,w15,#2
  1922. add w3,w3,w7
  1923. eor w13,w13,w9
  1924. st1 {v4.4s},[x17], #16
  1925. add w6,w6,w12
  1926. add w7,w7,w15
  1927. and w12,w4,w3
  1928. ld1 {v3.16b},[x1],#16
  1929. bic w15,w5,w3
  1930. eor w11,w3,w3,ror#5
  1931. ld1 {v4.4s},[x16],#16
  1932. add w7,w7,w13
  1933. orr w12,w12,w15
  1934. eor w11,w11,w3,ror#19
  1935. eor w15,w7,w7,ror#11
  1936. rev32 v3.16b,v3.16b
  1937. add w6,w6,w12
  1938. ror w11,w11,#6
  1939. eor w13,w7,w8
  1940. eor w15,w15,w7,ror#20
  1941. add v4.4s,v4.4s,v3.4s
  1942. add w6,w6,w11
  1943. ldr w12,[sp,#52]
  1944. and w14,w14,w13
  1945. ror w15,w15,#2
  1946. add w10,w10,w6
  1947. eor w14,w14,w8
  1948. add w5,w5,w12
  1949. add w6,w6,w15
  1950. and w12,w3,w10
  1951. bic w15,w4,w10
  1952. eor w11,w10,w10,ror#5
  1953. add w6,w6,w14
  1954. orr w12,w12,w15
  1955. eor w11,w11,w10,ror#19
  1956. eor w15,w6,w6,ror#11
  1957. add w5,w5,w12
  1958. ror w11,w11,#6
  1959. eor w14,w6,w7
  1960. eor w15,w15,w6,ror#20
  1961. add w5,w5,w11
  1962. ldr w12,[sp,#56]
  1963. and w13,w13,w14
  1964. ror w15,w15,#2
  1965. add w9,w9,w5
  1966. eor w13,w13,w7
  1967. add w4,w4,w12
  1968. add w5,w5,w15
  1969. and w12,w10,w9
  1970. bic w15,w3,w9
  1971. eor w11,w9,w9,ror#5
  1972. add w5,w5,w13
  1973. orr w12,w12,w15
  1974. eor w11,w11,w9,ror#19
  1975. eor w15,w5,w5,ror#11
  1976. add w4,w4,w12
  1977. ror w11,w11,#6
  1978. eor w13,w5,w6
  1979. eor w15,w15,w5,ror#20
  1980. add w4,w4,w11
  1981. ldr w12,[sp,#60]
  1982. and w14,w14,w13
  1983. ror w15,w15,#2
  1984. add w8,w8,w4
  1985. eor w14,w14,w6
  1986. add w3,w3,w12
  1987. add w4,w4,w15
  1988. and w12,w9,w8
  1989. bic w15,w10,w8
  1990. eor w11,w8,w8,ror#5
  1991. add w4,w4,w14
  1992. orr w12,w12,w15
  1993. eor w11,w11,w8,ror#19
  1994. eor w15,w4,w4,ror#11
  1995. add w3,w3,w12
  1996. ror w11,w11,#6
  1997. eor w14,w4,w5
  1998. eor w15,w15,w4,ror#20
  1999. add w3,w3,w11
  2000. and w13,w13,w14
  2001. ror w15,w15,#2
  2002. add w7,w7,w3
  2003. eor w13,w13,w5
  2004. st1 {v4.4s},[x17], #16
  2005. add w3,w3,w15 // h+=Sigma0(a) from the past
  2006. ldp w11,w12,[x0,#0]
  2007. add w3,w3,w13 // h+=Maj(a,b,c) from the past
  2008. ldp w13,w14,[x0,#8]
  2009. add w3,w3,w11 // accumulate
  2010. add w4,w4,w12
  2011. ldp w11,w12,[x0,#16]
  2012. add w5,w5,w13
  2013. add w6,w6,w14
  2014. ldp w13,w14,[x0,#24]
  2015. add w7,w7,w11
  2016. add w8,w8,w12
  2017. ldr w12,[sp,#0]
  2018. stp w3,w4,[x0,#0]
  2019. add w9,w9,w13
  2020. mov w13,wzr
  2021. stp w5,w6,[x0,#8]
  2022. add w10,w10,w14
  2023. stp w7,w8,[x0,#16]
  2024. eor w14,w4,w5
  2025. stp w9,w10,[x0,#24]
  2026. mov w15,wzr
  2027. mov x17,sp
  2028. b.ne .L_00_48
  2029. ldr x29,[x29]
  2030. add sp,sp,#16*4+16
  2031. ret
  2032. .size sha256_block_neon,.-sha256_block_neon
  2033. #ifndef __KERNEL__
  2034. .comm OPENSSL_armcap_P,4,4
  2035. #endif