sha256-core.S_shipped 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817
  1. @ SPDX-License-Identifier: GPL-2.0
  2. @ This code is taken from the OpenSSL project but the author (Andy Polyakov)
  3. @ has relicensed it under the GPLv2. Therefore this program is free software;
  4. @ you can redistribute it and/or modify it under the terms of the GNU General
  5. @ Public License version 2 as published by the Free Software Foundation.
  6. @
  7. @ The original headers, including the original license headers, are
  8. @ included below for completeness.
  9. @ ====================================================================
  10. @ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
  11. @ project. The module is, however, dual licensed under OpenSSL and
  12. @ CRYPTOGAMS licenses depending on where you obtain it. For further
  13. @ details see http://www.openssl.org/~appro/cryptogams/.
  14. @ ====================================================================
  15. @ SHA256 block procedure for ARMv4. May 2007.
  16. @ Performance is ~2x better than gcc 3.4 generated code and in "abso-
  17. @ lute" terms is ~2250 cycles per 64-byte block or ~35 cycles per
  18. @ byte [on single-issue Xscale PXA250 core].
  19. @ July 2010.
  20. @
  21. @ Rescheduling for dual-issue pipeline resulted in 22% improvement on
  22. @ Cortex A8 core and ~20 cycles per processed byte.
  23. @ February 2011.
  24. @
  25. @ Profiler-assisted and platform-specific optimization resulted in 16%
  26. @ improvement on Cortex A8 core and ~15.4 cycles per processed byte.
  27. @ September 2013.
  28. @
  29. @ Add NEON implementation. On Cortex A8 it was measured to process one
  30. @ byte in 12.5 cycles or 23% faster than integer-only code. Snapdragon
  31. @ S4 does it in 12.5 cycles too, but it's 50% faster than integer-only
  32. @ code (meaning that latter performs sub-optimally, nothing was done
  33. @ about it).
  34. @ May 2014.
  35. @
  36. @ Add ARMv8 code path performing at 2.0 cpb on Apple A7.
  37. #ifndef __KERNEL__
  38. # include "arm_arch.h"
  39. #else
  40. # define __ARM_ARCH__ __LINUX_ARM_ARCH__
  41. # define __ARM_MAX_ARCH__ 7
  42. #endif
  43. .text
  44. #if __ARM_ARCH__<7
  45. .code 32
  46. #else
  47. .syntax unified
  48. # ifdef __thumb2__
  49. # define adrl adr
  50. .thumb
  51. # else
  52. .code 32
  53. # endif
  54. #endif
  55. .type K256,%object
  56. .align 5
  57. K256:
  58. .word 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
  59. .word 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
  60. .word 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
  61. .word 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
  62. .word 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
  63. .word 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
  64. .word 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
  65. .word 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
  66. .word 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
  67. .word 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
  68. .word 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
  69. .word 0xd192e819,0xd6990624,0xf40e3585,0x106aa070
  70. .word 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
  71. .word 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
  72. .word 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
  73. .word 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
  74. .size K256,.-K256
  75. .word 0 @ terminator
  76. #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
  77. .LOPENSSL_armcap:
  78. .word OPENSSL_armcap_P-sha256_block_data_order
  79. #endif
  80. .align 5
  81. .global sha256_block_data_order
  82. .type sha256_block_data_order,%function
  83. sha256_block_data_order:
  84. .Lsha256_block_data_order:
  85. #if __ARM_ARCH__<7
  86. sub r3,pc,#8 @ sha256_block_data_order
  87. #else
  88. adr r3,.Lsha256_block_data_order
  89. #endif
  90. #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
  91. ldr r12,.LOPENSSL_armcap
  92. ldr r12,[r3,r12] @ OPENSSL_armcap_P
  93. tst r12,#ARMV8_SHA256
  94. bne .LARMv8
  95. tst r12,#ARMV7_NEON
  96. bne .LNEON
  97. #endif
  98. add r2,r1,r2,lsl#6 @ len to point at the end of inp
  99. stmdb sp!,{r0,r1,r2,r4-r11,lr}
  100. ldmia r0,{r4,r5,r6,r7,r8,r9,r10,r11}
  101. sub r14,r3,#256+32 @ K256
  102. sub sp,sp,#16*4 @ alloca(X[16])
  103. .Loop:
  104. # if __ARM_ARCH__>=7
  105. ldr r2,[r1],#4
  106. # else
  107. ldrb r2,[r1,#3]
  108. # endif
  109. eor r3,r5,r6 @ magic
  110. eor r12,r12,r12
  111. #if __ARM_ARCH__>=7
  112. @ ldr r2,[r1],#4 @ 0
  113. # if 0==15
  114. str r1,[sp,#17*4] @ make room for r1
  115. # endif
  116. eor r0,r8,r8,ror#5
  117. add r4,r4,r12 @ h+=Maj(a,b,c) from the past
  118. eor r0,r0,r8,ror#19 @ Sigma1(e)
  119. # ifndef __ARMEB__
  120. rev r2,r2
  121. # endif
  122. #else
  123. @ ldrb r2,[r1,#3] @ 0
  124. add r4,r4,r12 @ h+=Maj(a,b,c) from the past
  125. ldrb r12,[r1,#2]
  126. ldrb r0,[r1,#1]
  127. orr r2,r2,r12,lsl#8
  128. ldrb r12,[r1],#4
  129. orr r2,r2,r0,lsl#16
  130. # if 0==15
  131. str r1,[sp,#17*4] @ make room for r1
  132. # endif
  133. eor r0,r8,r8,ror#5
  134. orr r2,r2,r12,lsl#24
  135. eor r0,r0,r8,ror#19 @ Sigma1(e)
  136. #endif
  137. ldr r12,[r14],#4 @ *K256++
  138. add r11,r11,r2 @ h+=X[i]
  139. str r2,[sp,#0*4]
  140. eor r2,r9,r10
  141. add r11,r11,r0,ror#6 @ h+=Sigma1(e)
  142. and r2,r2,r8
  143. add r11,r11,r12 @ h+=K256[i]
  144. eor r2,r2,r10 @ Ch(e,f,g)
  145. eor r0,r4,r4,ror#11
  146. add r11,r11,r2 @ h+=Ch(e,f,g)
  147. #if 0==31
  148. and r12,r12,#0xff
  149. cmp r12,#0xf2 @ done?
  150. #endif
  151. #if 0<15
  152. # if __ARM_ARCH__>=7
  153. ldr r2,[r1],#4 @ prefetch
  154. # else
  155. ldrb r2,[r1,#3]
  156. # endif
  157. eor r12,r4,r5 @ a^b, b^c in next round
  158. #else
  159. ldr r2,[sp,#2*4] @ from future BODY_16_xx
  160. eor r12,r4,r5 @ a^b, b^c in next round
  161. ldr r1,[sp,#15*4] @ from future BODY_16_xx
  162. #endif
  163. eor r0,r0,r4,ror#20 @ Sigma0(a)
  164. and r3,r3,r12 @ (b^c)&=(a^b)
  165. add r7,r7,r11 @ d+=h
  166. eor r3,r3,r5 @ Maj(a,b,c)
  167. add r11,r11,r0,ror#2 @ h+=Sigma0(a)
  168. @ add r11,r11,r3 @ h+=Maj(a,b,c)
  169. #if __ARM_ARCH__>=7
  170. @ ldr r2,[r1],#4 @ 1
  171. # if 1==15
  172. str r1,[sp,#17*4] @ make room for r1
  173. # endif
  174. eor r0,r7,r7,ror#5
  175. add r11,r11,r3 @ h+=Maj(a,b,c) from the past
  176. eor r0,r0,r7,ror#19 @ Sigma1(e)
  177. # ifndef __ARMEB__
  178. rev r2,r2
  179. # endif
  180. #else
  181. @ ldrb r2,[r1,#3] @ 1
  182. add r11,r11,r3 @ h+=Maj(a,b,c) from the past
  183. ldrb r3,[r1,#2]
  184. ldrb r0,[r1,#1]
  185. orr r2,r2,r3,lsl#8
  186. ldrb r3,[r1],#4
  187. orr r2,r2,r0,lsl#16
  188. # if 1==15
  189. str r1,[sp,#17*4] @ make room for r1
  190. # endif
  191. eor r0,r7,r7,ror#5
  192. orr r2,r2,r3,lsl#24
  193. eor r0,r0,r7,ror#19 @ Sigma1(e)
  194. #endif
  195. ldr r3,[r14],#4 @ *K256++
  196. add r10,r10,r2 @ h+=X[i]
  197. str r2,[sp,#1*4]
  198. eor r2,r8,r9
  199. add r10,r10,r0,ror#6 @ h+=Sigma1(e)
  200. and r2,r2,r7
  201. add r10,r10,r3 @ h+=K256[i]
  202. eor r2,r2,r9 @ Ch(e,f,g)
  203. eor r0,r11,r11,ror#11
  204. add r10,r10,r2 @ h+=Ch(e,f,g)
  205. #if 1==31
  206. and r3,r3,#0xff
  207. cmp r3,#0xf2 @ done?
  208. #endif
  209. #if 1<15
  210. # if __ARM_ARCH__>=7
  211. ldr r2,[r1],#4 @ prefetch
  212. # else
  213. ldrb r2,[r1,#3]
  214. # endif
  215. eor r3,r11,r4 @ a^b, b^c in next round
  216. #else
  217. ldr r2,[sp,#3*4] @ from future BODY_16_xx
  218. eor r3,r11,r4 @ a^b, b^c in next round
  219. ldr r1,[sp,#0*4] @ from future BODY_16_xx
  220. #endif
  221. eor r0,r0,r11,ror#20 @ Sigma0(a)
  222. and r12,r12,r3 @ (b^c)&=(a^b)
  223. add r6,r6,r10 @ d+=h
  224. eor r12,r12,r4 @ Maj(a,b,c)
  225. add r10,r10,r0,ror#2 @ h+=Sigma0(a)
  226. @ add r10,r10,r12 @ h+=Maj(a,b,c)
  227. #if __ARM_ARCH__>=7
  228. @ ldr r2,[r1],#4 @ 2
  229. # if 2==15
  230. str r1,[sp,#17*4] @ make room for r1
  231. # endif
  232. eor r0,r6,r6,ror#5
  233. add r10,r10,r12 @ h+=Maj(a,b,c) from the past
  234. eor r0,r0,r6,ror#19 @ Sigma1(e)
  235. # ifndef __ARMEB__
  236. rev r2,r2
  237. # endif
  238. #else
  239. @ ldrb r2,[r1,#3] @ 2
  240. add r10,r10,r12 @ h+=Maj(a,b,c) from the past
  241. ldrb r12,[r1,#2]
  242. ldrb r0,[r1,#1]
  243. orr r2,r2,r12,lsl#8
  244. ldrb r12,[r1],#4
  245. orr r2,r2,r0,lsl#16
  246. # if 2==15
  247. str r1,[sp,#17*4] @ make room for r1
  248. # endif
  249. eor r0,r6,r6,ror#5
  250. orr r2,r2,r12,lsl#24
  251. eor r0,r0,r6,ror#19 @ Sigma1(e)
  252. #endif
  253. ldr r12,[r14],#4 @ *K256++
  254. add r9,r9,r2 @ h+=X[i]
  255. str r2,[sp,#2*4]
  256. eor r2,r7,r8
  257. add r9,r9,r0,ror#6 @ h+=Sigma1(e)
  258. and r2,r2,r6
  259. add r9,r9,r12 @ h+=K256[i]
  260. eor r2,r2,r8 @ Ch(e,f,g)
  261. eor r0,r10,r10,ror#11
  262. add r9,r9,r2 @ h+=Ch(e,f,g)
  263. #if 2==31
  264. and r12,r12,#0xff
  265. cmp r12,#0xf2 @ done?
  266. #endif
  267. #if 2<15
  268. # if __ARM_ARCH__>=7
  269. ldr r2,[r1],#4 @ prefetch
  270. # else
  271. ldrb r2,[r1,#3]
  272. # endif
  273. eor r12,r10,r11 @ a^b, b^c in next round
  274. #else
  275. ldr r2,[sp,#4*4] @ from future BODY_16_xx
  276. eor r12,r10,r11 @ a^b, b^c in next round
  277. ldr r1,[sp,#1*4] @ from future BODY_16_xx
  278. #endif
  279. eor r0,r0,r10,ror#20 @ Sigma0(a)
  280. and r3,r3,r12 @ (b^c)&=(a^b)
  281. add r5,r5,r9 @ d+=h
  282. eor r3,r3,r11 @ Maj(a,b,c)
  283. add r9,r9,r0,ror#2 @ h+=Sigma0(a)
  284. @ add r9,r9,r3 @ h+=Maj(a,b,c)
  285. #if __ARM_ARCH__>=7
  286. @ ldr r2,[r1],#4 @ 3
  287. # if 3==15
  288. str r1,[sp,#17*4] @ make room for r1
  289. # endif
  290. eor r0,r5,r5,ror#5
  291. add r9,r9,r3 @ h+=Maj(a,b,c) from the past
  292. eor r0,r0,r5,ror#19 @ Sigma1(e)
  293. # ifndef __ARMEB__
  294. rev r2,r2
  295. # endif
  296. #else
  297. @ ldrb r2,[r1,#3] @ 3
  298. add r9,r9,r3 @ h+=Maj(a,b,c) from the past
  299. ldrb r3,[r1,#2]
  300. ldrb r0,[r1,#1]
  301. orr r2,r2,r3,lsl#8
  302. ldrb r3,[r1],#4
  303. orr r2,r2,r0,lsl#16
  304. # if 3==15
  305. str r1,[sp,#17*4] @ make room for r1
  306. # endif
  307. eor r0,r5,r5,ror#5
  308. orr r2,r2,r3,lsl#24
  309. eor r0,r0,r5,ror#19 @ Sigma1(e)
  310. #endif
  311. ldr r3,[r14],#4 @ *K256++
  312. add r8,r8,r2 @ h+=X[i]
  313. str r2,[sp,#3*4]
  314. eor r2,r6,r7
  315. add r8,r8,r0,ror#6 @ h+=Sigma1(e)
  316. and r2,r2,r5
  317. add r8,r8,r3 @ h+=K256[i]
  318. eor r2,r2,r7 @ Ch(e,f,g)
  319. eor r0,r9,r9,ror#11
  320. add r8,r8,r2 @ h+=Ch(e,f,g)
  321. #if 3==31
  322. and r3,r3,#0xff
  323. cmp r3,#0xf2 @ done?
  324. #endif
  325. #if 3<15
  326. # if __ARM_ARCH__>=7
  327. ldr r2,[r1],#4 @ prefetch
  328. # else
  329. ldrb r2,[r1,#3]
  330. # endif
  331. eor r3,r9,r10 @ a^b, b^c in next round
  332. #else
  333. ldr r2,[sp,#5*4] @ from future BODY_16_xx
  334. eor r3,r9,r10 @ a^b, b^c in next round
  335. ldr r1,[sp,#2*4] @ from future BODY_16_xx
  336. #endif
  337. eor r0,r0,r9,ror#20 @ Sigma0(a)
  338. and r12,r12,r3 @ (b^c)&=(a^b)
  339. add r4,r4,r8 @ d+=h
  340. eor r12,r12,r10 @ Maj(a,b,c)
  341. add r8,r8,r0,ror#2 @ h+=Sigma0(a)
  342. @ add r8,r8,r12 @ h+=Maj(a,b,c)
  343. #if __ARM_ARCH__>=7
  344. @ ldr r2,[r1],#4 @ 4
  345. # if 4==15
  346. str r1,[sp,#17*4] @ make room for r1
  347. # endif
  348. eor r0,r4,r4,ror#5
  349. add r8,r8,r12 @ h+=Maj(a,b,c) from the past
  350. eor r0,r0,r4,ror#19 @ Sigma1(e)
  351. # ifndef __ARMEB__
  352. rev r2,r2
  353. # endif
  354. #else
  355. @ ldrb r2,[r1,#3] @ 4
  356. add r8,r8,r12 @ h+=Maj(a,b,c) from the past
  357. ldrb r12,[r1,#2]
  358. ldrb r0,[r1,#1]
  359. orr r2,r2,r12,lsl#8
  360. ldrb r12,[r1],#4
  361. orr r2,r2,r0,lsl#16
  362. # if 4==15
  363. str r1,[sp,#17*4] @ make room for r1
  364. # endif
  365. eor r0,r4,r4,ror#5
  366. orr r2,r2,r12,lsl#24
  367. eor r0,r0,r4,ror#19 @ Sigma1(e)
  368. #endif
  369. ldr r12,[r14],#4 @ *K256++
  370. add r7,r7,r2 @ h+=X[i]
  371. str r2,[sp,#4*4]
  372. eor r2,r5,r6
  373. add r7,r7,r0,ror#6 @ h+=Sigma1(e)
  374. and r2,r2,r4
  375. add r7,r7,r12 @ h+=K256[i]
  376. eor r2,r2,r6 @ Ch(e,f,g)
  377. eor r0,r8,r8,ror#11
  378. add r7,r7,r2 @ h+=Ch(e,f,g)
  379. #if 4==31
  380. and r12,r12,#0xff
  381. cmp r12,#0xf2 @ done?
  382. #endif
  383. #if 4<15
  384. # if __ARM_ARCH__>=7
  385. ldr r2,[r1],#4 @ prefetch
  386. # else
  387. ldrb r2,[r1,#3]
  388. # endif
  389. eor r12,r8,r9 @ a^b, b^c in next round
  390. #else
  391. ldr r2,[sp,#6*4] @ from future BODY_16_xx
  392. eor r12,r8,r9 @ a^b, b^c in next round
  393. ldr r1,[sp,#3*4] @ from future BODY_16_xx
  394. #endif
  395. eor r0,r0,r8,ror#20 @ Sigma0(a)
  396. and r3,r3,r12 @ (b^c)&=(a^b)
  397. add r11,r11,r7 @ d+=h
  398. eor r3,r3,r9 @ Maj(a,b,c)
  399. add r7,r7,r0,ror#2 @ h+=Sigma0(a)
  400. @ add r7,r7,r3 @ h+=Maj(a,b,c)
  401. #if __ARM_ARCH__>=7
  402. @ ldr r2,[r1],#4 @ 5
  403. # if 5==15
  404. str r1,[sp,#17*4] @ make room for r1
  405. # endif
  406. eor r0,r11,r11,ror#5
  407. add r7,r7,r3 @ h+=Maj(a,b,c) from the past
  408. eor r0,r0,r11,ror#19 @ Sigma1(e)
  409. # ifndef __ARMEB__
  410. rev r2,r2
  411. # endif
  412. #else
  413. @ ldrb r2,[r1,#3] @ 5
  414. add r7,r7,r3 @ h+=Maj(a,b,c) from the past
  415. ldrb r3,[r1,#2]
  416. ldrb r0,[r1,#1]
  417. orr r2,r2,r3,lsl#8
  418. ldrb r3,[r1],#4
  419. orr r2,r2,r0,lsl#16
  420. # if 5==15
  421. str r1,[sp,#17*4] @ make room for r1
  422. # endif
  423. eor r0,r11,r11,ror#5
  424. orr r2,r2,r3,lsl#24
  425. eor r0,r0,r11,ror#19 @ Sigma1(e)
  426. #endif
  427. ldr r3,[r14],#4 @ *K256++
  428. add r6,r6,r2 @ h+=X[i]
  429. str r2,[sp,#5*4]
  430. eor r2,r4,r5
  431. add r6,r6,r0,ror#6 @ h+=Sigma1(e)
  432. and r2,r2,r11
  433. add r6,r6,r3 @ h+=K256[i]
  434. eor r2,r2,r5 @ Ch(e,f,g)
  435. eor r0,r7,r7,ror#11
  436. add r6,r6,r2 @ h+=Ch(e,f,g)
  437. #if 5==31
  438. and r3,r3,#0xff
  439. cmp r3,#0xf2 @ done?
  440. #endif
  441. #if 5<15
  442. # if __ARM_ARCH__>=7
  443. ldr r2,[r1],#4 @ prefetch
  444. # else
  445. ldrb r2,[r1,#3]
  446. # endif
  447. eor r3,r7,r8 @ a^b, b^c in next round
  448. #else
  449. ldr r2,[sp,#7*4] @ from future BODY_16_xx
  450. eor r3,r7,r8 @ a^b, b^c in next round
  451. ldr r1,[sp,#4*4] @ from future BODY_16_xx
  452. #endif
  453. eor r0,r0,r7,ror#20 @ Sigma0(a)
  454. and r12,r12,r3 @ (b^c)&=(a^b)
  455. add r10,r10,r6 @ d+=h
  456. eor r12,r12,r8 @ Maj(a,b,c)
  457. add r6,r6,r0,ror#2 @ h+=Sigma0(a)
  458. @ add r6,r6,r12 @ h+=Maj(a,b,c)
  459. #if __ARM_ARCH__>=7
  460. @ ldr r2,[r1],#4 @ 6
  461. # if 6==15
  462. str r1,[sp,#17*4] @ make room for r1
  463. # endif
  464. eor r0,r10,r10,ror#5
  465. add r6,r6,r12 @ h+=Maj(a,b,c) from the past
  466. eor r0,r0,r10,ror#19 @ Sigma1(e)
  467. # ifndef __ARMEB__
  468. rev r2,r2
  469. # endif
  470. #else
  471. @ ldrb r2,[r1,#3] @ 6
  472. add r6,r6,r12 @ h+=Maj(a,b,c) from the past
  473. ldrb r12,[r1,#2]
  474. ldrb r0,[r1,#1]
  475. orr r2,r2,r12,lsl#8
  476. ldrb r12,[r1],#4
  477. orr r2,r2,r0,lsl#16
  478. # if 6==15
  479. str r1,[sp,#17*4] @ make room for r1
  480. # endif
  481. eor r0,r10,r10,ror#5
  482. orr r2,r2,r12,lsl#24
  483. eor r0,r0,r10,ror#19 @ Sigma1(e)
  484. #endif
  485. ldr r12,[r14],#4 @ *K256++
  486. add r5,r5,r2 @ h+=X[i]
  487. str r2,[sp,#6*4]
  488. eor r2,r11,r4
  489. add r5,r5,r0,ror#6 @ h+=Sigma1(e)
  490. and r2,r2,r10
  491. add r5,r5,r12 @ h+=K256[i]
  492. eor r2,r2,r4 @ Ch(e,f,g)
  493. eor r0,r6,r6,ror#11
  494. add r5,r5,r2 @ h+=Ch(e,f,g)
  495. #if 6==31
  496. and r12,r12,#0xff
  497. cmp r12,#0xf2 @ done?
  498. #endif
  499. #if 6<15
  500. # if __ARM_ARCH__>=7
  501. ldr r2,[r1],#4 @ prefetch
  502. # else
  503. ldrb r2,[r1,#3]
  504. # endif
  505. eor r12,r6,r7 @ a^b, b^c in next round
  506. #else
  507. ldr r2,[sp,#8*4] @ from future BODY_16_xx
  508. eor r12,r6,r7 @ a^b, b^c in next round
  509. ldr r1,[sp,#5*4] @ from future BODY_16_xx
  510. #endif
  511. eor r0,r0,r6,ror#20 @ Sigma0(a)
  512. and r3,r3,r12 @ (b^c)&=(a^b)
  513. add r9,r9,r5 @ d+=h
  514. eor r3,r3,r7 @ Maj(a,b,c)
  515. add r5,r5,r0,ror#2 @ h+=Sigma0(a)
  516. @ add r5,r5,r3 @ h+=Maj(a,b,c)
  517. #if __ARM_ARCH__>=7
  518. @ ldr r2,[r1],#4 @ 7
  519. # if 7==15
  520. str r1,[sp,#17*4] @ make room for r1
  521. # endif
  522. eor r0,r9,r9,ror#5
  523. add r5,r5,r3 @ h+=Maj(a,b,c) from the past
  524. eor r0,r0,r9,ror#19 @ Sigma1(e)
  525. # ifndef __ARMEB__
  526. rev r2,r2
  527. # endif
  528. #else
  529. @ ldrb r2,[r1,#3] @ 7
  530. add r5,r5,r3 @ h+=Maj(a,b,c) from the past
  531. ldrb r3,[r1,#2]
  532. ldrb r0,[r1,#1]
  533. orr r2,r2,r3,lsl#8
  534. ldrb r3,[r1],#4
  535. orr r2,r2,r0,lsl#16
  536. # if 7==15
  537. str r1,[sp,#17*4] @ make room for r1
  538. # endif
  539. eor r0,r9,r9,ror#5
  540. orr r2,r2,r3,lsl#24
  541. eor r0,r0,r9,ror#19 @ Sigma1(e)
  542. #endif
  543. ldr r3,[r14],#4 @ *K256++
  544. add r4,r4,r2 @ h+=X[i]
  545. str r2,[sp,#7*4]
  546. eor r2,r10,r11
  547. add r4,r4,r0,ror#6 @ h+=Sigma1(e)
  548. and r2,r2,r9
  549. add r4,r4,r3 @ h+=K256[i]
  550. eor r2,r2,r11 @ Ch(e,f,g)
  551. eor r0,r5,r5,ror#11
  552. add r4,r4,r2 @ h+=Ch(e,f,g)
  553. #if 7==31
  554. and r3,r3,#0xff
  555. cmp r3,#0xf2 @ done?
  556. #endif
  557. #if 7<15
  558. # if __ARM_ARCH__>=7
  559. ldr r2,[r1],#4 @ prefetch
  560. # else
  561. ldrb r2,[r1,#3]
  562. # endif
  563. eor r3,r5,r6 @ a^b, b^c in next round
  564. #else
  565. ldr r2,[sp,#9*4] @ from future BODY_16_xx
  566. eor r3,r5,r6 @ a^b, b^c in next round
  567. ldr r1,[sp,#6*4] @ from future BODY_16_xx
  568. #endif
  569. eor r0,r0,r5,ror#20 @ Sigma0(a)
  570. and r12,r12,r3 @ (b^c)&=(a^b)
  571. add r8,r8,r4 @ d+=h
  572. eor r12,r12,r6 @ Maj(a,b,c)
  573. add r4,r4,r0,ror#2 @ h+=Sigma0(a)
  574. @ add r4,r4,r12 @ h+=Maj(a,b,c)
  575. #if __ARM_ARCH__>=7
  576. @ ldr r2,[r1],#4 @ 8
  577. # if 8==15
  578. str r1,[sp,#17*4] @ make room for r1
  579. # endif
  580. eor r0,r8,r8,ror#5
  581. add r4,r4,r12 @ h+=Maj(a,b,c) from the past
  582. eor r0,r0,r8,ror#19 @ Sigma1(e)
  583. # ifndef __ARMEB__
  584. rev r2,r2
  585. # endif
  586. #else
  587. @ ldrb r2,[r1,#3] @ 8
  588. add r4,r4,r12 @ h+=Maj(a,b,c) from the past
  589. ldrb r12,[r1,#2]
  590. ldrb r0,[r1,#1]
  591. orr r2,r2,r12,lsl#8
  592. ldrb r12,[r1],#4
  593. orr r2,r2,r0,lsl#16
  594. # if 8==15
  595. str r1,[sp,#17*4] @ make room for r1
  596. # endif
  597. eor r0,r8,r8,ror#5
  598. orr r2,r2,r12,lsl#24
  599. eor r0,r0,r8,ror#19 @ Sigma1(e)
  600. #endif
  601. ldr r12,[r14],#4 @ *K256++
  602. add r11,r11,r2 @ h+=X[i]
  603. str r2,[sp,#8*4]
  604. eor r2,r9,r10
  605. add r11,r11,r0,ror#6 @ h+=Sigma1(e)
  606. and r2,r2,r8
  607. add r11,r11,r12 @ h+=K256[i]
  608. eor r2,r2,r10 @ Ch(e,f,g)
  609. eor r0,r4,r4,ror#11
  610. add r11,r11,r2 @ h+=Ch(e,f,g)
  611. #if 8==31
  612. and r12,r12,#0xff
  613. cmp r12,#0xf2 @ done?
  614. #endif
  615. #if 8<15
  616. # if __ARM_ARCH__>=7
  617. ldr r2,[r1],#4 @ prefetch
  618. # else
  619. ldrb r2,[r1,#3]
  620. # endif
  621. eor r12,r4,r5 @ a^b, b^c in next round
  622. #else
  623. ldr r2,[sp,#10*4] @ from future BODY_16_xx
  624. eor r12,r4,r5 @ a^b, b^c in next round
  625. ldr r1,[sp,#7*4] @ from future BODY_16_xx
  626. #endif
  627. eor r0,r0,r4,ror#20 @ Sigma0(a)
  628. and r3,r3,r12 @ (b^c)&=(a^b)
  629. add r7,r7,r11 @ d+=h
  630. eor r3,r3,r5 @ Maj(a,b,c)
  631. add r11,r11,r0,ror#2 @ h+=Sigma0(a)
  632. @ add r11,r11,r3 @ h+=Maj(a,b,c)
  633. #if __ARM_ARCH__>=7
  634. @ ldr r2,[r1],#4 @ 9
  635. # if 9==15
  636. str r1,[sp,#17*4] @ make room for r1
  637. # endif
  638. eor r0,r7,r7,ror#5
  639. add r11,r11,r3 @ h+=Maj(a,b,c) from the past
  640. eor r0,r0,r7,ror#19 @ Sigma1(e)
  641. # ifndef __ARMEB__
  642. rev r2,r2
  643. # endif
  644. #else
  645. @ ldrb r2,[r1,#3] @ 9
  646. add r11,r11,r3 @ h+=Maj(a,b,c) from the past
  647. ldrb r3,[r1,#2]
  648. ldrb r0,[r1,#1]
  649. orr r2,r2,r3,lsl#8
  650. ldrb r3,[r1],#4
  651. orr r2,r2,r0,lsl#16
  652. # if 9==15
  653. str r1,[sp,#17*4] @ make room for r1
  654. # endif
  655. eor r0,r7,r7,ror#5
  656. orr r2,r2,r3,lsl#24
  657. eor r0,r0,r7,ror#19 @ Sigma1(e)
  658. #endif
  659. ldr r3,[r14],#4 @ *K256++
  660. add r10,r10,r2 @ h+=X[i]
  661. str r2,[sp,#9*4]
  662. eor r2,r8,r9
  663. add r10,r10,r0,ror#6 @ h+=Sigma1(e)
  664. and r2,r2,r7
  665. add r10,r10,r3 @ h+=K256[i]
  666. eor r2,r2,r9 @ Ch(e,f,g)
  667. eor r0,r11,r11,ror#11
  668. add r10,r10,r2 @ h+=Ch(e,f,g)
  669. #if 9==31
  670. and r3,r3,#0xff
  671. cmp r3,#0xf2 @ done?
  672. #endif
  673. #if 9<15
  674. # if __ARM_ARCH__>=7
  675. ldr r2,[r1],#4 @ prefetch
  676. # else
  677. ldrb r2,[r1,#3]
  678. # endif
  679. eor r3,r11,r4 @ a^b, b^c in next round
  680. #else
  681. ldr r2,[sp,#11*4] @ from future BODY_16_xx
  682. eor r3,r11,r4 @ a^b, b^c in next round
  683. ldr r1,[sp,#8*4] @ from future BODY_16_xx
  684. #endif
  685. eor r0,r0,r11,ror#20 @ Sigma0(a)
  686. and r12,r12,r3 @ (b^c)&=(a^b)
  687. add r6,r6,r10 @ d+=h
  688. eor r12,r12,r4 @ Maj(a,b,c)
  689. add r10,r10,r0,ror#2 @ h+=Sigma0(a)
  690. @ add r10,r10,r12 @ h+=Maj(a,b,c)
  691. #if __ARM_ARCH__>=7
  692. @ ldr r2,[r1],#4 @ 10
  693. # if 10==15
  694. str r1,[sp,#17*4] @ make room for r1
  695. # endif
  696. eor r0,r6,r6,ror#5
  697. add r10,r10,r12 @ h+=Maj(a,b,c) from the past
  698. eor r0,r0,r6,ror#19 @ Sigma1(e)
  699. # ifndef __ARMEB__
  700. rev r2,r2
  701. # endif
  702. #else
  703. @ ldrb r2,[r1,#3] @ 10
  704. add r10,r10,r12 @ h+=Maj(a,b,c) from the past
  705. ldrb r12,[r1,#2]
  706. ldrb r0,[r1,#1]
  707. orr r2,r2,r12,lsl#8
  708. ldrb r12,[r1],#4
  709. orr r2,r2,r0,lsl#16
  710. # if 10==15
  711. str r1,[sp,#17*4] @ make room for r1
  712. # endif
  713. eor r0,r6,r6,ror#5
  714. orr r2,r2,r12,lsl#24
  715. eor r0,r0,r6,ror#19 @ Sigma1(e)
  716. #endif
  717. ldr r12,[r14],#4 @ *K256++
  718. add r9,r9,r2 @ h+=X[i]
  719. str r2,[sp,#10*4]
  720. eor r2,r7,r8
  721. add r9,r9,r0,ror#6 @ h+=Sigma1(e)
  722. and r2,r2,r6
  723. add r9,r9,r12 @ h+=K256[i]
  724. eor r2,r2,r8 @ Ch(e,f,g)
  725. eor r0,r10,r10,ror#11
  726. add r9,r9,r2 @ h+=Ch(e,f,g)
  727. #if 10==31
  728. and r12,r12,#0xff
  729. cmp r12,#0xf2 @ done?
  730. #endif
  731. #if 10<15
  732. # if __ARM_ARCH__>=7
  733. ldr r2,[r1],#4 @ prefetch
  734. # else
  735. ldrb r2,[r1,#3]
  736. # endif
  737. eor r12,r10,r11 @ a^b, b^c in next round
  738. #else
  739. ldr r2,[sp,#12*4] @ from future BODY_16_xx
  740. eor r12,r10,r11 @ a^b, b^c in next round
  741. ldr r1,[sp,#9*4] @ from future BODY_16_xx
  742. #endif
  743. eor r0,r0,r10,ror#20 @ Sigma0(a)
  744. and r3,r3,r12 @ (b^c)&=(a^b)
  745. add r5,r5,r9 @ d+=h
  746. eor r3,r3,r11 @ Maj(a,b,c)
  747. add r9,r9,r0,ror#2 @ h+=Sigma0(a)
  748. @ add r9,r9,r3 @ h+=Maj(a,b,c)
  749. #if __ARM_ARCH__>=7
  750. @ ldr r2,[r1],#4 @ 11
  751. # if 11==15
  752. str r1,[sp,#17*4] @ make room for r1
  753. # endif
  754. eor r0,r5,r5,ror#5
  755. add r9,r9,r3 @ h+=Maj(a,b,c) from the past
  756. eor r0,r0,r5,ror#19 @ Sigma1(e)
  757. # ifndef __ARMEB__
  758. rev r2,r2
  759. # endif
  760. #else
  761. @ ldrb r2,[r1,#3] @ 11
  762. add r9,r9,r3 @ h+=Maj(a,b,c) from the past
  763. ldrb r3,[r1,#2]
  764. ldrb r0,[r1,#1]
  765. orr r2,r2,r3,lsl#8
  766. ldrb r3,[r1],#4
  767. orr r2,r2,r0,lsl#16
  768. # if 11==15
  769. str r1,[sp,#17*4] @ make room for r1
  770. # endif
  771. eor r0,r5,r5,ror#5
  772. orr r2,r2,r3,lsl#24
  773. eor r0,r0,r5,ror#19 @ Sigma1(e)
  774. #endif
  775. ldr r3,[r14],#4 @ *K256++
  776. add r8,r8,r2 @ h+=X[i]
  777. str r2,[sp,#11*4]
  778. eor r2,r6,r7
  779. add r8,r8,r0,ror#6 @ h+=Sigma1(e)
  780. and r2,r2,r5
  781. add r8,r8,r3 @ h+=K256[i]
  782. eor r2,r2,r7 @ Ch(e,f,g)
  783. eor r0,r9,r9,ror#11
  784. add r8,r8,r2 @ h+=Ch(e,f,g)
  785. #if 11==31
  786. and r3,r3,#0xff
  787. cmp r3,#0xf2 @ done?
  788. #endif
  789. #if 11<15
  790. # if __ARM_ARCH__>=7
  791. ldr r2,[r1],#4 @ prefetch
  792. # else
  793. ldrb r2,[r1,#3]
  794. # endif
  795. eor r3,r9,r10 @ a^b, b^c in next round
  796. #else
  797. ldr r2,[sp,#13*4] @ from future BODY_16_xx
  798. eor r3,r9,r10 @ a^b, b^c in next round
  799. ldr r1,[sp,#10*4] @ from future BODY_16_xx
  800. #endif
  801. eor r0,r0,r9,ror#20 @ Sigma0(a)
  802. and r12,r12,r3 @ (b^c)&=(a^b)
  803. add r4,r4,r8 @ d+=h
  804. eor r12,r12,r10 @ Maj(a,b,c)
  805. add r8,r8,r0,ror#2 @ h+=Sigma0(a)
  806. @ add r8,r8,r12 @ h+=Maj(a,b,c)
  807. #if __ARM_ARCH__>=7
  808. @ ldr r2,[r1],#4 @ 12
  809. # if 12==15
  810. str r1,[sp,#17*4] @ make room for r1
  811. # endif
  812. eor r0,r4,r4,ror#5
  813. add r8,r8,r12 @ h+=Maj(a,b,c) from the past
  814. eor r0,r0,r4,ror#19 @ Sigma1(e)
  815. # ifndef __ARMEB__
  816. rev r2,r2
  817. # endif
  818. #else
  819. @ ldrb r2,[r1,#3] @ 12
  820. add r8,r8,r12 @ h+=Maj(a,b,c) from the past
  821. ldrb r12,[r1,#2]
  822. ldrb r0,[r1,#1]
  823. orr r2,r2,r12,lsl#8
  824. ldrb r12,[r1],#4
  825. orr r2,r2,r0,lsl#16
  826. # if 12==15
  827. str r1,[sp,#17*4] @ make room for r1
  828. # endif
  829. eor r0,r4,r4,ror#5
  830. orr r2,r2,r12,lsl#24
  831. eor r0,r0,r4,ror#19 @ Sigma1(e)
  832. #endif
  833. ldr r12,[r14],#4 @ *K256++
  834. add r7,r7,r2 @ h+=X[i]
  835. str r2,[sp,#12*4]
  836. eor r2,r5,r6
  837. add r7,r7,r0,ror#6 @ h+=Sigma1(e)
  838. and r2,r2,r4
  839. add r7,r7,r12 @ h+=K256[i]
  840. eor r2,r2,r6 @ Ch(e,f,g)
  841. eor r0,r8,r8,ror#11
  842. add r7,r7,r2 @ h+=Ch(e,f,g)
  843. #if 12==31
  844. and r12,r12,#0xff
  845. cmp r12,#0xf2 @ done?
  846. #endif
  847. #if 12<15
  848. # if __ARM_ARCH__>=7
  849. ldr r2,[r1],#4 @ prefetch
  850. # else
  851. ldrb r2,[r1,#3]
  852. # endif
  853. eor r12,r8,r9 @ a^b, b^c in next round
  854. #else
  855. ldr r2,[sp,#14*4] @ from future BODY_16_xx
  856. eor r12,r8,r9 @ a^b, b^c in next round
  857. ldr r1,[sp,#11*4] @ from future BODY_16_xx
  858. #endif
  859. eor r0,r0,r8,ror#20 @ Sigma0(a)
  860. and r3,r3,r12 @ (b^c)&=(a^b)
  861. add r11,r11,r7 @ d+=h
  862. eor r3,r3,r9 @ Maj(a,b,c)
  863. add r7,r7,r0,ror#2 @ h+=Sigma0(a)
  864. @ add r7,r7,r3 @ h+=Maj(a,b,c)
  865. #if __ARM_ARCH__>=7
  866. @ ldr r2,[r1],#4 @ 13
  867. # if 13==15
  868. str r1,[sp,#17*4] @ make room for r1
  869. # endif
  870. eor r0,r11,r11,ror#5
  871. add r7,r7,r3 @ h+=Maj(a,b,c) from the past
  872. eor r0,r0,r11,ror#19 @ Sigma1(e)
  873. # ifndef __ARMEB__
  874. rev r2,r2
  875. # endif
  876. #else
  877. @ ldrb r2,[r1,#3] @ 13
  878. add r7,r7,r3 @ h+=Maj(a,b,c) from the past
  879. ldrb r3,[r1,#2]
  880. ldrb r0,[r1,#1]
  881. orr r2,r2,r3,lsl#8
  882. ldrb r3,[r1],#4
  883. orr r2,r2,r0,lsl#16
  884. # if 13==15
  885. str r1,[sp,#17*4] @ make room for r1
  886. # endif
  887. eor r0,r11,r11,ror#5
  888. orr r2,r2,r3,lsl#24
  889. eor r0,r0,r11,ror#19 @ Sigma1(e)
  890. #endif
  891. ldr r3,[r14],#4 @ *K256++
  892. add r6,r6,r2 @ h+=X[i]
  893. str r2,[sp,#13*4]
  894. eor r2,r4,r5
  895. add r6,r6,r0,ror#6 @ h+=Sigma1(e)
  896. and r2,r2,r11
  897. add r6,r6,r3 @ h+=K256[i]
  898. eor r2,r2,r5 @ Ch(e,f,g)
  899. eor r0,r7,r7,ror#11
  900. add r6,r6,r2 @ h+=Ch(e,f,g)
  901. #if 13==31
  902. and r3,r3,#0xff
  903. cmp r3,#0xf2 @ done?
  904. #endif
  905. #if 13<15
  906. # if __ARM_ARCH__>=7
  907. ldr r2,[r1],#4 @ prefetch
  908. # else
  909. ldrb r2,[r1,#3]
  910. # endif
  911. eor r3,r7,r8 @ a^b, b^c in next round
  912. #else
  913. ldr r2,[sp,#15*4] @ from future BODY_16_xx
  914. eor r3,r7,r8 @ a^b, b^c in next round
  915. ldr r1,[sp,#12*4] @ from future BODY_16_xx
  916. #endif
  917. eor r0,r0,r7,ror#20 @ Sigma0(a)
  918. and r12,r12,r3 @ (b^c)&=(a^b)
  919. add r10,r10,r6 @ d+=h
  920. eor r12,r12,r8 @ Maj(a,b,c)
  921. add r6,r6,r0,ror#2 @ h+=Sigma0(a)
  922. @ add r6,r6,r12 @ h+=Maj(a,b,c)
  923. #if __ARM_ARCH__>=7
  924. @ ldr r2,[r1],#4 @ 14
  925. # if 14==15
  926. str r1,[sp,#17*4] @ make room for r1
  927. # endif
  928. eor r0,r10,r10,ror#5
  929. add r6,r6,r12 @ h+=Maj(a,b,c) from the past
  930. eor r0,r0,r10,ror#19 @ Sigma1(e)
  931. # ifndef __ARMEB__
  932. rev r2,r2
  933. # endif
  934. #else
  935. @ ldrb r2,[r1,#3] @ 14
  936. add r6,r6,r12 @ h+=Maj(a,b,c) from the past
  937. ldrb r12,[r1,#2]
  938. ldrb r0,[r1,#1]
  939. orr r2,r2,r12,lsl#8
  940. ldrb r12,[r1],#4
  941. orr r2,r2,r0,lsl#16
  942. # if 14==15
  943. str r1,[sp,#17*4] @ make room for r1
  944. # endif
  945. eor r0,r10,r10,ror#5
  946. orr r2,r2,r12,lsl#24
  947. eor r0,r0,r10,ror#19 @ Sigma1(e)
  948. #endif
  949. ldr r12,[r14],#4 @ *K256++
  950. add r5,r5,r2 @ h+=X[i]
  951. str r2,[sp,#14*4]
  952. eor r2,r11,r4
  953. add r5,r5,r0,ror#6 @ h+=Sigma1(e)
  954. and r2,r2,r10
  955. add r5,r5,r12 @ h+=K256[i]
  956. eor r2,r2,r4 @ Ch(e,f,g)
  957. eor r0,r6,r6,ror#11
  958. add r5,r5,r2 @ h+=Ch(e,f,g)
  959. #if 14==31
  960. and r12,r12,#0xff
  961. cmp r12,#0xf2 @ done?
  962. #endif
  963. #if 14<15
  964. # if __ARM_ARCH__>=7
  965. ldr r2,[r1],#4 @ prefetch
  966. # else
  967. ldrb r2,[r1,#3]
  968. # endif
  969. eor r12,r6,r7 @ a^b, b^c in next round
  970. #else
  971. ldr r2,[sp,#0*4] @ from future BODY_16_xx
  972. eor r12,r6,r7 @ a^b, b^c in next round
  973. ldr r1,[sp,#13*4] @ from future BODY_16_xx
  974. #endif
  975. eor r0,r0,r6,ror#20 @ Sigma0(a)
  976. and r3,r3,r12 @ (b^c)&=(a^b)
  977. add r9,r9,r5 @ d+=h
  978. eor r3,r3,r7 @ Maj(a,b,c)
  979. add r5,r5,r0,ror#2 @ h+=Sigma0(a)
  980. @ add r5,r5,r3 @ h+=Maj(a,b,c)
  981. #if __ARM_ARCH__>=7
  982. @ ldr r2,[r1],#4 @ 15
  983. # if 15==15
  984. str r1,[sp,#17*4] @ make room for r1
  985. # endif
  986. eor r0,r9,r9,ror#5
  987. add r5,r5,r3 @ h+=Maj(a,b,c) from the past
  988. eor r0,r0,r9,ror#19 @ Sigma1(e)
  989. # ifndef __ARMEB__
  990. rev r2,r2
  991. # endif
  992. #else
  993. @ ldrb r2,[r1,#3] @ 15
  994. add r5,r5,r3 @ h+=Maj(a,b,c) from the past
  995. ldrb r3,[r1,#2]
  996. ldrb r0,[r1,#1]
  997. orr r2,r2,r3,lsl#8
  998. ldrb r3,[r1],#4
  999. orr r2,r2,r0,lsl#16
  1000. # if 15==15
  1001. str r1,[sp,#17*4] @ make room for r1
  1002. # endif
  1003. eor r0,r9,r9,ror#5
  1004. orr r2,r2,r3,lsl#24
  1005. eor r0,r0,r9,ror#19 @ Sigma1(e)
  1006. #endif
  1007. ldr r3,[r14],#4 @ *K256++
  1008. add r4,r4,r2 @ h+=X[i]
  1009. str r2,[sp,#15*4]
  1010. eor r2,r10,r11
  1011. add r4,r4,r0,ror#6 @ h+=Sigma1(e)
  1012. and r2,r2,r9
  1013. add r4,r4,r3 @ h+=K256[i]
  1014. eor r2,r2,r11 @ Ch(e,f,g)
  1015. eor r0,r5,r5,ror#11
  1016. add r4,r4,r2 @ h+=Ch(e,f,g)
  1017. #if 15==31
  1018. and r3,r3,#0xff
  1019. cmp r3,#0xf2 @ done?
  1020. #endif
  1021. #if 15<15
  1022. # if __ARM_ARCH__>=7
  1023. ldr r2,[r1],#4 @ prefetch
  1024. # else
  1025. ldrb r2,[r1,#3]
  1026. # endif
  1027. eor r3,r5,r6 @ a^b, b^c in next round
  1028. #else
  1029. ldr r2,[sp,#1*4] @ from future BODY_16_xx
  1030. eor r3,r5,r6 @ a^b, b^c in next round
  1031. ldr r1,[sp,#14*4] @ from future BODY_16_xx
  1032. #endif
  1033. eor r0,r0,r5,ror#20 @ Sigma0(a)
  1034. and r12,r12,r3 @ (b^c)&=(a^b)
  1035. add r8,r8,r4 @ d+=h
  1036. eor r12,r12,r6 @ Maj(a,b,c)
  1037. add r4,r4,r0,ror#2 @ h+=Sigma0(a)
  1038. @ add r4,r4,r12 @ h+=Maj(a,b,c)
  1039. .Lrounds_16_xx:
  1040. @ ldr r2,[sp,#1*4] @ 16
  1041. @ ldr r1,[sp,#14*4]
  1042. mov r0,r2,ror#7
  1043. add r4,r4,r12 @ h+=Maj(a,b,c) from the past
  1044. mov r12,r1,ror#17
  1045. eor r0,r0,r2,ror#18
  1046. eor r12,r12,r1,ror#19
  1047. eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
  1048. ldr r2,[sp,#0*4]
  1049. eor r12,r12,r1,lsr#10 @ sigma1(X[i+14])
  1050. ldr r1,[sp,#9*4]
  1051. add r12,r12,r0
  1052. eor r0,r8,r8,ror#5 @ from BODY_00_15
  1053. add r2,r2,r12
  1054. eor r0,r0,r8,ror#19 @ Sigma1(e)
  1055. add r2,r2,r1 @ X[i]
  1056. ldr r12,[r14],#4 @ *K256++
  1057. add r11,r11,r2 @ h+=X[i]
  1058. str r2,[sp,#0*4]
  1059. eor r2,r9,r10
  1060. add r11,r11,r0,ror#6 @ h+=Sigma1(e)
  1061. and r2,r2,r8
  1062. add r11,r11,r12 @ h+=K256[i]
  1063. eor r2,r2,r10 @ Ch(e,f,g)
  1064. eor r0,r4,r4,ror#11
  1065. add r11,r11,r2 @ h+=Ch(e,f,g)
  1066. #if 16==31
  1067. and r12,r12,#0xff
  1068. cmp r12,#0xf2 @ done?
  1069. #endif
  1070. #if 16<15
  1071. # if __ARM_ARCH__>=7
  1072. ldr r2,[r1],#4 @ prefetch
  1073. # else
  1074. ldrb r2,[r1,#3]
  1075. # endif
  1076. eor r12,r4,r5 @ a^b, b^c in next round
  1077. #else
  1078. ldr r2,[sp,#2*4] @ from future BODY_16_xx
  1079. eor r12,r4,r5 @ a^b, b^c in next round
  1080. ldr r1,[sp,#15*4] @ from future BODY_16_xx
  1081. #endif
  1082. eor r0,r0,r4,ror#20 @ Sigma0(a)
  1083. and r3,r3,r12 @ (b^c)&=(a^b)
  1084. add r7,r7,r11 @ d+=h
  1085. eor r3,r3,r5 @ Maj(a,b,c)
  1086. add r11,r11,r0,ror#2 @ h+=Sigma0(a)
  1087. @ add r11,r11,r3 @ h+=Maj(a,b,c)
  1088. @ ldr r2,[sp,#2*4] @ 17
  1089. @ ldr r1,[sp,#15*4]
  1090. mov r0,r2,ror#7
  1091. add r11,r11,r3 @ h+=Maj(a,b,c) from the past
  1092. mov r3,r1,ror#17
  1093. eor r0,r0,r2,ror#18
  1094. eor r3,r3,r1,ror#19
  1095. eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
  1096. ldr r2,[sp,#1*4]
  1097. eor r3,r3,r1,lsr#10 @ sigma1(X[i+14])
  1098. ldr r1,[sp,#10*4]
  1099. add r3,r3,r0
  1100. eor r0,r7,r7,ror#5 @ from BODY_00_15
  1101. add r2,r2,r3
  1102. eor r0,r0,r7,ror#19 @ Sigma1(e)
  1103. add r2,r2,r1 @ X[i]
  1104. ldr r3,[r14],#4 @ *K256++
  1105. add r10,r10,r2 @ h+=X[i]
  1106. str r2,[sp,#1*4]
  1107. eor r2,r8,r9
  1108. add r10,r10,r0,ror#6 @ h+=Sigma1(e)
  1109. and r2,r2,r7
  1110. add r10,r10,r3 @ h+=K256[i]
  1111. eor r2,r2,r9 @ Ch(e,f,g)
  1112. eor r0,r11,r11,ror#11
  1113. add r10,r10,r2 @ h+=Ch(e,f,g)
  1114. #if 17==31
  1115. and r3,r3,#0xff
  1116. cmp r3,#0xf2 @ done?
  1117. #endif
  1118. #if 17<15
  1119. # if __ARM_ARCH__>=7
  1120. ldr r2,[r1],#4 @ prefetch
  1121. # else
  1122. ldrb r2,[r1,#3]
  1123. # endif
  1124. eor r3,r11,r4 @ a^b, b^c in next round
  1125. #else
  1126. ldr r2,[sp,#3*4] @ from future BODY_16_xx
  1127. eor r3,r11,r4 @ a^b, b^c in next round
  1128. ldr r1,[sp,#0*4] @ from future BODY_16_xx
  1129. #endif
  1130. eor r0,r0,r11,ror#20 @ Sigma0(a)
  1131. and r12,r12,r3 @ (b^c)&=(a^b)
  1132. add r6,r6,r10 @ d+=h
  1133. eor r12,r12,r4 @ Maj(a,b,c)
  1134. add r10,r10,r0,ror#2 @ h+=Sigma0(a)
  1135. @ add r10,r10,r12 @ h+=Maj(a,b,c)
  1136. @ ldr r2,[sp,#3*4] @ 18
  1137. @ ldr r1,[sp,#0*4]
  1138. mov r0,r2,ror#7
  1139. add r10,r10,r12 @ h+=Maj(a,b,c) from the past
  1140. mov r12,r1,ror#17
  1141. eor r0,r0,r2,ror#18
  1142. eor r12,r12,r1,ror#19
  1143. eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
  1144. ldr r2,[sp,#2*4]
  1145. eor r12,r12,r1,lsr#10 @ sigma1(X[i+14])
  1146. ldr r1,[sp,#11*4]
  1147. add r12,r12,r0
  1148. eor r0,r6,r6,ror#5 @ from BODY_00_15
  1149. add r2,r2,r12
  1150. eor r0,r0,r6,ror#19 @ Sigma1(e)
  1151. add r2,r2,r1 @ X[i]
  1152. ldr r12,[r14],#4 @ *K256++
  1153. add r9,r9,r2 @ h+=X[i]
  1154. str r2,[sp,#2*4]
  1155. eor r2,r7,r8
  1156. add r9,r9,r0,ror#6 @ h+=Sigma1(e)
  1157. and r2,r2,r6
  1158. add r9,r9,r12 @ h+=K256[i]
  1159. eor r2,r2,r8 @ Ch(e,f,g)
  1160. eor r0,r10,r10,ror#11
  1161. add r9,r9,r2 @ h+=Ch(e,f,g)
  1162. #if 18==31
  1163. and r12,r12,#0xff
  1164. cmp r12,#0xf2 @ done?
  1165. #endif
  1166. #if 18<15
  1167. # if __ARM_ARCH__>=7
  1168. ldr r2,[r1],#4 @ prefetch
  1169. # else
  1170. ldrb r2,[r1,#3]
  1171. # endif
  1172. eor r12,r10,r11 @ a^b, b^c in next round
  1173. #else
  1174. ldr r2,[sp,#4*4] @ from future BODY_16_xx
  1175. eor r12,r10,r11 @ a^b, b^c in next round
  1176. ldr r1,[sp,#1*4] @ from future BODY_16_xx
  1177. #endif
  1178. eor r0,r0,r10,ror#20 @ Sigma0(a)
  1179. and r3,r3,r12 @ (b^c)&=(a^b)
  1180. add r5,r5,r9 @ d+=h
  1181. eor r3,r3,r11 @ Maj(a,b,c)
  1182. add r9,r9,r0,ror#2 @ h+=Sigma0(a)
  1183. @ add r9,r9,r3 @ h+=Maj(a,b,c)
  1184. @ ldr r2,[sp,#4*4] @ 19
  1185. @ ldr r1,[sp,#1*4]
  1186. mov r0,r2,ror#7
  1187. add r9,r9,r3 @ h+=Maj(a,b,c) from the past
  1188. mov r3,r1,ror#17
  1189. eor r0,r0,r2,ror#18
  1190. eor r3,r3,r1,ror#19
  1191. eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
  1192. ldr r2,[sp,#3*4]
  1193. eor r3,r3,r1,lsr#10 @ sigma1(X[i+14])
  1194. ldr r1,[sp,#12*4]
  1195. add r3,r3,r0
  1196. eor r0,r5,r5,ror#5 @ from BODY_00_15
  1197. add r2,r2,r3
  1198. eor r0,r0,r5,ror#19 @ Sigma1(e)
  1199. add r2,r2,r1 @ X[i]
  1200. ldr r3,[r14],#4 @ *K256++
  1201. add r8,r8,r2 @ h+=X[i]
  1202. str r2,[sp,#3*4]
  1203. eor r2,r6,r7
  1204. add r8,r8,r0,ror#6 @ h+=Sigma1(e)
  1205. and r2,r2,r5
  1206. add r8,r8,r3 @ h+=K256[i]
  1207. eor r2,r2,r7 @ Ch(e,f,g)
  1208. eor r0,r9,r9,ror#11
  1209. add r8,r8,r2 @ h+=Ch(e,f,g)
  1210. #if 19==31
  1211. and r3,r3,#0xff
  1212. cmp r3,#0xf2 @ done?
  1213. #endif
  1214. #if 19<15
  1215. # if __ARM_ARCH__>=7
  1216. ldr r2,[r1],#4 @ prefetch
  1217. # else
  1218. ldrb r2,[r1,#3]
  1219. # endif
  1220. eor r3,r9,r10 @ a^b, b^c in next round
  1221. #else
  1222. ldr r2,[sp,#5*4] @ from future BODY_16_xx
  1223. eor r3,r9,r10 @ a^b, b^c in next round
  1224. ldr r1,[sp,#2*4] @ from future BODY_16_xx
  1225. #endif
  1226. eor r0,r0,r9,ror#20 @ Sigma0(a)
  1227. and r12,r12,r3 @ (b^c)&=(a^b)
  1228. add r4,r4,r8 @ d+=h
  1229. eor r12,r12,r10 @ Maj(a,b,c)
  1230. add r8,r8,r0,ror#2 @ h+=Sigma0(a)
  1231. @ add r8,r8,r12 @ h+=Maj(a,b,c)
  1232. @ ldr r2,[sp,#5*4] @ 20
  1233. @ ldr r1,[sp,#2*4]
  1234. mov r0,r2,ror#7
  1235. add r8,r8,r12 @ h+=Maj(a,b,c) from the past
  1236. mov r12,r1,ror#17
  1237. eor r0,r0,r2,ror#18
  1238. eor r12,r12,r1,ror#19
  1239. eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
  1240. ldr r2,[sp,#4*4]
  1241. eor r12,r12,r1,lsr#10 @ sigma1(X[i+14])
  1242. ldr r1,[sp,#13*4]
  1243. add r12,r12,r0
  1244. eor r0,r4,r4,ror#5 @ from BODY_00_15
  1245. add r2,r2,r12
  1246. eor r0,r0,r4,ror#19 @ Sigma1(e)
  1247. add r2,r2,r1 @ X[i]
  1248. ldr r12,[r14],#4 @ *K256++
  1249. add r7,r7,r2 @ h+=X[i]
  1250. str r2,[sp,#4*4]
  1251. eor r2,r5,r6
  1252. add r7,r7,r0,ror#6 @ h+=Sigma1(e)
  1253. and r2,r2,r4
  1254. add r7,r7,r12 @ h+=K256[i]
  1255. eor r2,r2,r6 @ Ch(e,f,g)
  1256. eor r0,r8,r8,ror#11
  1257. add r7,r7,r2 @ h+=Ch(e,f,g)
  1258. #if 20==31
  1259. and r12,r12,#0xff
  1260. cmp r12,#0xf2 @ done?
  1261. #endif
  1262. #if 20<15
  1263. # if __ARM_ARCH__>=7
  1264. ldr r2,[r1],#4 @ prefetch
  1265. # else
  1266. ldrb r2,[r1,#3]
  1267. # endif
  1268. eor r12,r8,r9 @ a^b, b^c in next round
  1269. #else
  1270. ldr r2,[sp,#6*4] @ from future BODY_16_xx
  1271. eor r12,r8,r9 @ a^b, b^c in next round
  1272. ldr r1,[sp,#3*4] @ from future BODY_16_xx
  1273. #endif
  1274. eor r0,r0,r8,ror#20 @ Sigma0(a)
  1275. and r3,r3,r12 @ (b^c)&=(a^b)
  1276. add r11,r11,r7 @ d+=h
  1277. eor r3,r3,r9 @ Maj(a,b,c)
  1278. add r7,r7,r0,ror#2 @ h+=Sigma0(a)
  1279. @ add r7,r7,r3 @ h+=Maj(a,b,c)
  1280. @ ldr r2,[sp,#6*4] @ 21
  1281. @ ldr r1,[sp,#3*4]
  1282. mov r0,r2,ror#7
  1283. add r7,r7,r3 @ h+=Maj(a,b,c) from the past
  1284. mov r3,r1,ror#17
  1285. eor r0,r0,r2,ror#18
  1286. eor r3,r3,r1,ror#19
  1287. eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
  1288. ldr r2,[sp,#5*4]
  1289. eor r3,r3,r1,lsr#10 @ sigma1(X[i+14])
  1290. ldr r1,[sp,#14*4]
  1291. add r3,r3,r0
  1292. eor r0,r11,r11,ror#5 @ from BODY_00_15
  1293. add r2,r2,r3
  1294. eor r0,r0,r11,ror#19 @ Sigma1(e)
  1295. add r2,r2,r1 @ X[i]
  1296. ldr r3,[r14],#4 @ *K256++
  1297. add r6,r6,r2 @ h+=X[i]
  1298. str r2,[sp,#5*4]
  1299. eor r2,r4,r5
  1300. add r6,r6,r0,ror#6 @ h+=Sigma1(e)
  1301. and r2,r2,r11
  1302. add r6,r6,r3 @ h+=K256[i]
  1303. eor r2,r2,r5 @ Ch(e,f,g)
  1304. eor r0,r7,r7,ror#11
  1305. add r6,r6,r2 @ h+=Ch(e,f,g)
  1306. #if 21==31
  1307. and r3,r3,#0xff
  1308. cmp r3,#0xf2 @ done?
  1309. #endif
  1310. #if 21<15
  1311. # if __ARM_ARCH__>=7
  1312. ldr r2,[r1],#4 @ prefetch
  1313. # else
  1314. ldrb r2,[r1,#3]
  1315. # endif
  1316. eor r3,r7,r8 @ a^b, b^c in next round
  1317. #else
  1318. ldr r2,[sp,#7*4] @ from future BODY_16_xx
  1319. eor r3,r7,r8 @ a^b, b^c in next round
  1320. ldr r1,[sp,#4*4] @ from future BODY_16_xx
  1321. #endif
  1322. eor r0,r0,r7,ror#20 @ Sigma0(a)
  1323. and r12,r12,r3 @ (b^c)&=(a^b)
  1324. add r10,r10,r6 @ d+=h
  1325. eor r12,r12,r8 @ Maj(a,b,c)
  1326. add r6,r6,r0,ror#2 @ h+=Sigma0(a)
  1327. @ add r6,r6,r12 @ h+=Maj(a,b,c)
  1328. @ ldr r2,[sp,#7*4] @ 22
  1329. @ ldr r1,[sp,#4*4]
  1330. mov r0,r2,ror#7
  1331. add r6,r6,r12 @ h+=Maj(a,b,c) from the past
  1332. mov r12,r1,ror#17
  1333. eor r0,r0,r2,ror#18
  1334. eor r12,r12,r1,ror#19
  1335. eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
  1336. ldr r2,[sp,#6*4]
  1337. eor r12,r12,r1,lsr#10 @ sigma1(X[i+14])
  1338. ldr r1,[sp,#15*4]
  1339. add r12,r12,r0
  1340. eor r0,r10,r10,ror#5 @ from BODY_00_15
  1341. add r2,r2,r12
  1342. eor r0,r0,r10,ror#19 @ Sigma1(e)
  1343. add r2,r2,r1 @ X[i]
  1344. ldr r12,[r14],#4 @ *K256++
  1345. add r5,r5,r2 @ h+=X[i]
  1346. str r2,[sp,#6*4]
  1347. eor r2,r11,r4
  1348. add r5,r5,r0,ror#6 @ h+=Sigma1(e)
  1349. and r2,r2,r10
  1350. add r5,r5,r12 @ h+=K256[i]
  1351. eor r2,r2,r4 @ Ch(e,f,g)
  1352. eor r0,r6,r6,ror#11
  1353. add r5,r5,r2 @ h+=Ch(e,f,g)
  1354. #if 22==31
  1355. and r12,r12,#0xff
  1356. cmp r12,#0xf2 @ done?
  1357. #endif
  1358. #if 22<15
  1359. # if __ARM_ARCH__>=7
  1360. ldr r2,[r1],#4 @ prefetch
  1361. # else
  1362. ldrb r2,[r1,#3]
  1363. # endif
  1364. eor r12,r6,r7 @ a^b, b^c in next round
  1365. #else
  1366. ldr r2,[sp,#8*4] @ from future BODY_16_xx
  1367. eor r12,r6,r7 @ a^b, b^c in next round
  1368. ldr r1,[sp,#5*4] @ from future BODY_16_xx
  1369. #endif
  1370. eor r0,r0,r6,ror#20 @ Sigma0(a)
  1371. and r3,r3,r12 @ (b^c)&=(a^b)
  1372. add r9,r9,r5 @ d+=h
  1373. eor r3,r3,r7 @ Maj(a,b,c)
  1374. add r5,r5,r0,ror#2 @ h+=Sigma0(a)
  1375. @ add r5,r5,r3 @ h+=Maj(a,b,c)
  1376. @ ldr r2,[sp,#8*4] @ 23
  1377. @ ldr r1,[sp,#5*4]
  1378. mov r0,r2,ror#7
  1379. add r5,r5,r3 @ h+=Maj(a,b,c) from the past
  1380. mov r3,r1,ror#17
  1381. eor r0,r0,r2,ror#18
  1382. eor r3,r3,r1,ror#19
  1383. eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
  1384. ldr r2,[sp,#7*4]
  1385. eor r3,r3,r1,lsr#10 @ sigma1(X[i+14])
  1386. ldr r1,[sp,#0*4]
  1387. add r3,r3,r0
  1388. eor r0,r9,r9,ror#5 @ from BODY_00_15
  1389. add r2,r2,r3
  1390. eor r0,r0,r9,ror#19 @ Sigma1(e)
  1391. add r2,r2,r1 @ X[i]
  1392. ldr r3,[r14],#4 @ *K256++
  1393. add r4,r4,r2 @ h+=X[i]
  1394. str r2,[sp,#7*4]
  1395. eor r2,r10,r11
  1396. add r4,r4,r0,ror#6 @ h+=Sigma1(e)
  1397. and r2,r2,r9
  1398. add r4,r4,r3 @ h+=K256[i]
  1399. eor r2,r2,r11 @ Ch(e,f,g)
  1400. eor r0,r5,r5,ror#11
  1401. add r4,r4,r2 @ h+=Ch(e,f,g)
  1402. #if 23==31
  1403. and r3,r3,#0xff
  1404. cmp r3,#0xf2 @ done?
  1405. #endif
  1406. #if 23<15
  1407. # if __ARM_ARCH__>=7
  1408. ldr r2,[r1],#4 @ prefetch
  1409. # else
  1410. ldrb r2,[r1,#3]
  1411. # endif
  1412. eor r3,r5,r6 @ a^b, b^c in next round
  1413. #else
  1414. ldr r2,[sp,#9*4] @ from future BODY_16_xx
  1415. eor r3,r5,r6 @ a^b, b^c in next round
  1416. ldr r1,[sp,#6*4] @ from future BODY_16_xx
  1417. #endif
  1418. eor r0,r0,r5,ror#20 @ Sigma0(a)
  1419. and r12,r12,r3 @ (b^c)&=(a^b)
  1420. add r8,r8,r4 @ d+=h
  1421. eor r12,r12,r6 @ Maj(a,b,c)
  1422. add r4,r4,r0,ror#2 @ h+=Sigma0(a)
  1423. @ add r4,r4,r12 @ h+=Maj(a,b,c)
  1424. @ ldr r2,[sp,#9*4] @ 24
  1425. @ ldr r1,[sp,#6*4]
  1426. mov r0,r2,ror#7
  1427. add r4,r4,r12 @ h+=Maj(a,b,c) from the past
  1428. mov r12,r1,ror#17
  1429. eor r0,r0,r2,ror#18
  1430. eor r12,r12,r1,ror#19
  1431. eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
  1432. ldr r2,[sp,#8*4]
  1433. eor r12,r12,r1,lsr#10 @ sigma1(X[i+14])
  1434. ldr r1,[sp,#1*4]
  1435. add r12,r12,r0
  1436. eor r0,r8,r8,ror#5 @ from BODY_00_15
  1437. add r2,r2,r12
  1438. eor r0,r0,r8,ror#19 @ Sigma1(e)
  1439. add r2,r2,r1 @ X[i]
  1440. ldr r12,[r14],#4 @ *K256++
  1441. add r11,r11,r2 @ h+=X[i]
  1442. str r2,[sp,#8*4]
  1443. eor r2,r9,r10
  1444. add r11,r11,r0,ror#6 @ h+=Sigma1(e)
  1445. and r2,r2,r8
  1446. add r11,r11,r12 @ h+=K256[i]
  1447. eor r2,r2,r10 @ Ch(e,f,g)
  1448. eor r0,r4,r4,ror#11
  1449. add r11,r11,r2 @ h+=Ch(e,f,g)
  1450. #if 24==31
  1451. and r12,r12,#0xff
  1452. cmp r12,#0xf2 @ done?
  1453. #endif
  1454. #if 24<15
  1455. # if __ARM_ARCH__>=7
  1456. ldr r2,[r1],#4 @ prefetch
  1457. # else
  1458. ldrb r2,[r1,#3]
  1459. # endif
  1460. eor r12,r4,r5 @ a^b, b^c in next round
  1461. #else
  1462. ldr r2,[sp,#10*4] @ from future BODY_16_xx
  1463. eor r12,r4,r5 @ a^b, b^c in next round
  1464. ldr r1,[sp,#7*4] @ from future BODY_16_xx
  1465. #endif
  1466. eor r0,r0,r4,ror#20 @ Sigma0(a)
  1467. and r3,r3,r12 @ (b^c)&=(a^b)
  1468. add r7,r7,r11 @ d+=h
  1469. eor r3,r3,r5 @ Maj(a,b,c)
  1470. add r11,r11,r0,ror#2 @ h+=Sigma0(a)
  1471. @ add r11,r11,r3 @ h+=Maj(a,b,c)
  1472. @ ldr r2,[sp,#10*4] @ 25
  1473. @ ldr r1,[sp,#7*4]
  1474. mov r0,r2,ror#7
  1475. add r11,r11,r3 @ h+=Maj(a,b,c) from the past
  1476. mov r3,r1,ror#17
  1477. eor r0,r0,r2,ror#18
  1478. eor r3,r3,r1,ror#19
  1479. eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
  1480. ldr r2,[sp,#9*4]
  1481. eor r3,r3,r1,lsr#10 @ sigma1(X[i+14])
  1482. ldr r1,[sp,#2*4]
  1483. add r3,r3,r0
  1484. eor r0,r7,r7,ror#5 @ from BODY_00_15
  1485. add r2,r2,r3
  1486. eor r0,r0,r7,ror#19 @ Sigma1(e)
  1487. add r2,r2,r1 @ X[i]
  1488. ldr r3,[r14],#4 @ *K256++
  1489. add r10,r10,r2 @ h+=X[i]
  1490. str r2,[sp,#9*4]
  1491. eor r2,r8,r9
  1492. add r10,r10,r0,ror#6 @ h+=Sigma1(e)
  1493. and r2,r2,r7
  1494. add r10,r10,r3 @ h+=K256[i]
  1495. eor r2,r2,r9 @ Ch(e,f,g)
  1496. eor r0,r11,r11,ror#11
  1497. add r10,r10,r2 @ h+=Ch(e,f,g)
  1498. #if 25==31
  1499. and r3,r3,#0xff
  1500. cmp r3,#0xf2 @ done?
  1501. #endif
  1502. #if 25<15
  1503. # if __ARM_ARCH__>=7
  1504. ldr r2,[r1],#4 @ prefetch
  1505. # else
  1506. ldrb r2,[r1,#3]
  1507. # endif
  1508. eor r3,r11,r4 @ a^b, b^c in next round
  1509. #else
  1510. ldr r2,[sp,#11*4] @ from future BODY_16_xx
  1511. eor r3,r11,r4 @ a^b, b^c in next round
  1512. ldr r1,[sp,#8*4] @ from future BODY_16_xx
  1513. #endif
  1514. eor r0,r0,r11,ror#20 @ Sigma0(a)
  1515. and r12,r12,r3 @ (b^c)&=(a^b)
  1516. add r6,r6,r10 @ d+=h
  1517. eor r12,r12,r4 @ Maj(a,b,c)
  1518. add r10,r10,r0,ror#2 @ h+=Sigma0(a)
  1519. @ add r10,r10,r12 @ h+=Maj(a,b,c)
  1520. @ ldr r2,[sp,#11*4] @ 26
  1521. @ ldr r1,[sp,#8*4]
  1522. mov r0,r2,ror#7
  1523. add r10,r10,r12 @ h+=Maj(a,b,c) from the past
  1524. mov r12,r1,ror#17
  1525. eor r0,r0,r2,ror#18
  1526. eor r12,r12,r1,ror#19
  1527. eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
  1528. ldr r2,[sp,#10*4]
  1529. eor r12,r12,r1,lsr#10 @ sigma1(X[i+14])
  1530. ldr r1,[sp,#3*4]
  1531. add r12,r12,r0
  1532. eor r0,r6,r6,ror#5 @ from BODY_00_15
  1533. add r2,r2,r12
  1534. eor r0,r0,r6,ror#19 @ Sigma1(e)
  1535. add r2,r2,r1 @ X[i]
  1536. ldr r12,[r14],#4 @ *K256++
  1537. add r9,r9,r2 @ h+=X[i]
  1538. str r2,[sp,#10*4]
  1539. eor r2,r7,r8
  1540. add r9,r9,r0,ror#6 @ h+=Sigma1(e)
  1541. and r2,r2,r6
  1542. add r9,r9,r12 @ h+=K256[i]
  1543. eor r2,r2,r8 @ Ch(e,f,g)
  1544. eor r0,r10,r10,ror#11
  1545. add r9,r9,r2 @ h+=Ch(e,f,g)
  1546. #if 26==31
  1547. and r12,r12,#0xff
  1548. cmp r12,#0xf2 @ done?
  1549. #endif
  1550. #if 26<15
  1551. # if __ARM_ARCH__>=7
  1552. ldr r2,[r1],#4 @ prefetch
  1553. # else
  1554. ldrb r2,[r1,#3]
  1555. # endif
  1556. eor r12,r10,r11 @ a^b, b^c in next round
  1557. #else
  1558. ldr r2,[sp,#12*4] @ from future BODY_16_xx
  1559. eor r12,r10,r11 @ a^b, b^c in next round
  1560. ldr r1,[sp,#9*4] @ from future BODY_16_xx
  1561. #endif
  1562. eor r0,r0,r10,ror#20 @ Sigma0(a)
  1563. and r3,r3,r12 @ (b^c)&=(a^b)
  1564. add r5,r5,r9 @ d+=h
  1565. eor r3,r3,r11 @ Maj(a,b,c)
  1566. add r9,r9,r0,ror#2 @ h+=Sigma0(a)
  1567. @ add r9,r9,r3 @ h+=Maj(a,b,c)
  1568. @ ldr r2,[sp,#12*4] @ 27
  1569. @ ldr r1,[sp,#9*4]
  1570. mov r0,r2,ror#7
  1571. add r9,r9,r3 @ h+=Maj(a,b,c) from the past
  1572. mov r3,r1,ror#17
  1573. eor r0,r0,r2,ror#18
  1574. eor r3,r3,r1,ror#19
  1575. eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
  1576. ldr r2,[sp,#11*4]
  1577. eor r3,r3,r1,lsr#10 @ sigma1(X[i+14])
  1578. ldr r1,[sp,#4*4]
  1579. add r3,r3,r0
  1580. eor r0,r5,r5,ror#5 @ from BODY_00_15
  1581. add r2,r2,r3
  1582. eor r0,r0,r5,ror#19 @ Sigma1(e)
  1583. add r2,r2,r1 @ X[i]
  1584. ldr r3,[r14],#4 @ *K256++
  1585. add r8,r8,r2 @ h+=X[i]
  1586. str r2,[sp,#11*4]
  1587. eor r2,r6,r7
  1588. add r8,r8,r0,ror#6 @ h+=Sigma1(e)
  1589. and r2,r2,r5
  1590. add r8,r8,r3 @ h+=K256[i]
  1591. eor r2,r2,r7 @ Ch(e,f,g)
  1592. eor r0,r9,r9,ror#11
  1593. add r8,r8,r2 @ h+=Ch(e,f,g)
  1594. #if 27==31
  1595. and r3,r3,#0xff
  1596. cmp r3,#0xf2 @ done?
  1597. #endif
  1598. #if 27<15
  1599. # if __ARM_ARCH__>=7
  1600. ldr r2,[r1],#4 @ prefetch
  1601. # else
  1602. ldrb r2,[r1,#3]
  1603. # endif
  1604. eor r3,r9,r10 @ a^b, b^c in next round
  1605. #else
  1606. ldr r2,[sp,#13*4] @ from future BODY_16_xx
  1607. eor r3,r9,r10 @ a^b, b^c in next round
  1608. ldr r1,[sp,#10*4] @ from future BODY_16_xx
  1609. #endif
  1610. eor r0,r0,r9,ror#20 @ Sigma0(a)
  1611. and r12,r12,r3 @ (b^c)&=(a^b)
  1612. add r4,r4,r8 @ d+=h
  1613. eor r12,r12,r10 @ Maj(a,b,c)
  1614. add r8,r8,r0,ror#2 @ h+=Sigma0(a)
  1615. @ add r8,r8,r12 @ h+=Maj(a,b,c)
  1616. @ ldr r2,[sp,#13*4] @ 28
  1617. @ ldr r1,[sp,#10*4]
  1618. mov r0,r2,ror#7
  1619. add r8,r8,r12 @ h+=Maj(a,b,c) from the past
  1620. mov r12,r1,ror#17
  1621. eor r0,r0,r2,ror#18
  1622. eor r12,r12,r1,ror#19
  1623. eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
  1624. ldr r2,[sp,#12*4]
  1625. eor r12,r12,r1,lsr#10 @ sigma1(X[i+14])
  1626. ldr r1,[sp,#5*4]
  1627. add r12,r12,r0
  1628. eor r0,r4,r4,ror#5 @ from BODY_00_15
  1629. add r2,r2,r12
  1630. eor r0,r0,r4,ror#19 @ Sigma1(e)
  1631. add r2,r2,r1 @ X[i]
  1632. ldr r12,[r14],#4 @ *K256++
  1633. add r7,r7,r2 @ h+=X[i]
  1634. str r2,[sp,#12*4]
  1635. eor r2,r5,r6
  1636. add r7,r7,r0,ror#6 @ h+=Sigma1(e)
  1637. and r2,r2,r4
  1638. add r7,r7,r12 @ h+=K256[i]
  1639. eor r2,r2,r6 @ Ch(e,f,g)
  1640. eor r0,r8,r8,ror#11
  1641. add r7,r7,r2 @ h+=Ch(e,f,g)
  1642. #if 28==31
  1643. and r12,r12,#0xff
  1644. cmp r12,#0xf2 @ done?
  1645. #endif
  1646. #if 28<15
  1647. # if __ARM_ARCH__>=7
  1648. ldr r2,[r1],#4 @ prefetch
  1649. # else
  1650. ldrb r2,[r1,#3]
  1651. # endif
  1652. eor r12,r8,r9 @ a^b, b^c in next round
  1653. #else
  1654. ldr r2,[sp,#14*4] @ from future BODY_16_xx
  1655. eor r12,r8,r9 @ a^b, b^c in next round
  1656. ldr r1,[sp,#11*4] @ from future BODY_16_xx
  1657. #endif
  1658. eor r0,r0,r8,ror#20 @ Sigma0(a)
  1659. and r3,r3,r12 @ (b^c)&=(a^b)
  1660. add r11,r11,r7 @ d+=h
  1661. eor r3,r3,r9 @ Maj(a,b,c)
  1662. add r7,r7,r0,ror#2 @ h+=Sigma0(a)
  1663. @ add r7,r7,r3 @ h+=Maj(a,b,c)
  1664. @ ldr r2,[sp,#14*4] @ 29
  1665. @ ldr r1,[sp,#11*4]
  1666. mov r0,r2,ror#7
  1667. add r7,r7,r3 @ h+=Maj(a,b,c) from the past
  1668. mov r3,r1,ror#17
  1669. eor r0,r0,r2,ror#18
  1670. eor r3,r3,r1,ror#19
  1671. eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
  1672. ldr r2,[sp,#13*4]
  1673. eor r3,r3,r1,lsr#10 @ sigma1(X[i+14])
  1674. ldr r1,[sp,#6*4]
  1675. add r3,r3,r0
  1676. eor r0,r11,r11,ror#5 @ from BODY_00_15
  1677. add r2,r2,r3
  1678. eor r0,r0,r11,ror#19 @ Sigma1(e)
  1679. add r2,r2,r1 @ X[i]
  1680. ldr r3,[r14],#4 @ *K256++
  1681. add r6,r6,r2 @ h+=X[i]
  1682. str r2,[sp,#13*4]
  1683. eor r2,r4,r5
  1684. add r6,r6,r0,ror#6 @ h+=Sigma1(e)
  1685. and r2,r2,r11
  1686. add r6,r6,r3 @ h+=K256[i]
  1687. eor r2,r2,r5 @ Ch(e,f,g)
  1688. eor r0,r7,r7,ror#11
  1689. add r6,r6,r2 @ h+=Ch(e,f,g)
  1690. #if 29==31
  1691. and r3,r3,#0xff
  1692. cmp r3,#0xf2 @ done?
  1693. #endif
  1694. #if 29<15
  1695. # if __ARM_ARCH__>=7
  1696. ldr r2,[r1],#4 @ prefetch
  1697. # else
  1698. ldrb r2,[r1,#3]
  1699. # endif
  1700. eor r3,r7,r8 @ a^b, b^c in next round
  1701. #else
  1702. ldr r2,[sp,#15*4] @ from future BODY_16_xx
  1703. eor r3,r7,r8 @ a^b, b^c in next round
  1704. ldr r1,[sp,#12*4] @ from future BODY_16_xx
  1705. #endif
  1706. eor r0,r0,r7,ror#20 @ Sigma0(a)
  1707. and r12,r12,r3 @ (b^c)&=(a^b)
  1708. add r10,r10,r6 @ d+=h
  1709. eor r12,r12,r8 @ Maj(a,b,c)
  1710. add r6,r6,r0,ror#2 @ h+=Sigma0(a)
  1711. @ add r6,r6,r12 @ h+=Maj(a,b,c)
  1712. @ ldr r2,[sp,#15*4] @ 30
  1713. @ ldr r1,[sp,#12*4]
  1714. mov r0,r2,ror#7
  1715. add r6,r6,r12 @ h+=Maj(a,b,c) from the past
  1716. mov r12,r1,ror#17
  1717. eor r0,r0,r2,ror#18
  1718. eor r12,r12,r1,ror#19
  1719. eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
  1720. ldr r2,[sp,#14*4]
  1721. eor r12,r12,r1,lsr#10 @ sigma1(X[i+14])
  1722. ldr r1,[sp,#7*4]
  1723. add r12,r12,r0
  1724. eor r0,r10,r10,ror#5 @ from BODY_00_15
  1725. add r2,r2,r12
  1726. eor r0,r0,r10,ror#19 @ Sigma1(e)
  1727. add r2,r2,r1 @ X[i]
  1728. ldr r12,[r14],#4 @ *K256++
  1729. add r5,r5,r2 @ h+=X[i]
  1730. str r2,[sp,#14*4]
  1731. eor r2,r11,r4
  1732. add r5,r5,r0,ror#6 @ h+=Sigma1(e)
  1733. and r2,r2,r10
  1734. add r5,r5,r12 @ h+=K256[i]
  1735. eor r2,r2,r4 @ Ch(e,f,g)
  1736. eor r0,r6,r6,ror#11
  1737. add r5,r5,r2 @ h+=Ch(e,f,g)
  1738. #if 30==31
  1739. and r12,r12,#0xff
  1740. cmp r12,#0xf2 @ done?
  1741. #endif
  1742. #if 30<15
  1743. # if __ARM_ARCH__>=7
  1744. ldr r2,[r1],#4 @ prefetch
  1745. # else
  1746. ldrb r2,[r1,#3]
  1747. # endif
  1748. eor r12,r6,r7 @ a^b, b^c in next round
  1749. #else
  1750. ldr r2,[sp,#0*4] @ from future BODY_16_xx
  1751. eor r12,r6,r7 @ a^b, b^c in next round
  1752. ldr r1,[sp,#13*4] @ from future BODY_16_xx
  1753. #endif
  1754. eor r0,r0,r6,ror#20 @ Sigma0(a)
  1755. and r3,r3,r12 @ (b^c)&=(a^b)
  1756. add r9,r9,r5 @ d+=h
  1757. eor r3,r3,r7 @ Maj(a,b,c)
  1758. add r5,r5,r0,ror#2 @ h+=Sigma0(a)
  1759. @ add r5,r5,r3 @ h+=Maj(a,b,c)
  1760. @ ldr r2,[sp,#0*4] @ 31
  1761. @ ldr r1,[sp,#13*4]
  1762. mov r0,r2,ror#7
  1763. add r5,r5,r3 @ h+=Maj(a,b,c) from the past
  1764. mov r3,r1,ror#17
  1765. eor r0,r0,r2,ror#18
  1766. eor r3,r3,r1,ror#19
  1767. eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
  1768. ldr r2,[sp,#15*4]
  1769. eor r3,r3,r1,lsr#10 @ sigma1(X[i+14])
  1770. ldr r1,[sp,#8*4]
  1771. add r3,r3,r0
  1772. eor r0,r9,r9,ror#5 @ from BODY_00_15
  1773. add r2,r2,r3
  1774. eor r0,r0,r9,ror#19 @ Sigma1(e)
  1775. add r2,r2,r1 @ X[i]
  1776. ldr r3,[r14],#4 @ *K256++
  1777. add r4,r4,r2 @ h+=X[i]
  1778. str r2,[sp,#15*4]
  1779. eor r2,r10,r11
  1780. add r4,r4,r0,ror#6 @ h+=Sigma1(e)
  1781. and r2,r2,r9
  1782. add r4,r4,r3 @ h+=K256[i]
  1783. eor r2,r2,r11 @ Ch(e,f,g)
  1784. eor r0,r5,r5,ror#11
  1785. add r4,r4,r2 @ h+=Ch(e,f,g)
  1786. #if 31==31
  1787. and r3,r3,#0xff
  1788. cmp r3,#0xf2 @ done?
  1789. #endif
  1790. #if 31<15
  1791. # if __ARM_ARCH__>=7
  1792. ldr r2,[r1],#4 @ prefetch
  1793. # else
  1794. ldrb r2,[r1,#3]
  1795. # endif
  1796. eor r3,r5,r6 @ a^b, b^c in next round
  1797. #else
  1798. ldr r2,[sp,#1*4] @ from future BODY_16_xx
  1799. eor r3,r5,r6 @ a^b, b^c in next round
  1800. ldr r1,[sp,#14*4] @ from future BODY_16_xx
  1801. #endif
  1802. eor r0,r0,r5,ror#20 @ Sigma0(a)
  1803. and r12,r12,r3 @ (b^c)&=(a^b)
  1804. add r8,r8,r4 @ d+=h
  1805. eor r12,r12,r6 @ Maj(a,b,c)
  1806. add r4,r4,r0,ror#2 @ h+=Sigma0(a)
  1807. @ add r4,r4,r12 @ h+=Maj(a,b,c)
  1808. #if __ARM_ARCH__>=7
  1809. ite eq @ Thumb2 thing, sanity check in ARM
  1810. #endif
  1811. ldreq r3,[sp,#16*4] @ pull ctx
  1812. bne .Lrounds_16_xx
  1813. add r4,r4,r12 @ h+=Maj(a,b,c) from the past
  1814. ldr r0,[r3,#0]
  1815. ldr r2,[r3,#4]
  1816. ldr r12,[r3,#8]
  1817. add r4,r4,r0
  1818. ldr r0,[r3,#12]
  1819. add r5,r5,r2
  1820. ldr r2,[r3,#16]
  1821. add r6,r6,r12
  1822. ldr r12,[r3,#20]
  1823. add r7,r7,r0
  1824. ldr r0,[r3,#24]
  1825. add r8,r8,r2
  1826. ldr r2,[r3,#28]
  1827. add r9,r9,r12
  1828. ldr r1,[sp,#17*4] @ pull inp
  1829. ldr r12,[sp,#18*4] @ pull inp+len
  1830. add r10,r10,r0
  1831. add r11,r11,r2
  1832. stmia r3,{r4,r5,r6,r7,r8,r9,r10,r11}
  1833. cmp r1,r12
  1834. sub r14,r14,#256 @ rewind Ktbl
  1835. bne .Loop
  1836. add sp,sp,#19*4 @ destroy frame
  1837. #if __ARM_ARCH__>=5
  1838. ldmia sp!,{r4-r11,pc}
  1839. #else
  1840. ldmia sp!,{r4-r11,lr}
  1841. tst lr,#1
  1842. moveq pc,lr @ be binary compatible with V4, yet
  1843. .word 0xe12fff1e @ interoperable with Thumb ISA:-)
  1844. #endif
  1845. .size sha256_block_data_order,.-sha256_block_data_order
  1846. #if __ARM_MAX_ARCH__>=7
  1847. .arch armv7-a
  1848. .fpu neon
  1849. .global sha256_block_data_order_neon
  1850. .type sha256_block_data_order_neon,%function
  1851. .align 4
  1852. sha256_block_data_order_neon:
  1853. .LNEON:
  1854. stmdb sp!,{r4-r12,lr}
  1855. sub r11,sp,#16*4+16
  1856. adrl r14,K256
  1857. bic r11,r11,#15 @ align for 128-bit stores
  1858. mov r12,sp
  1859. mov sp,r11 @ alloca
  1860. add r2,r1,r2,lsl#6 @ len to point at the end of inp
  1861. vld1.8 {q0},[r1]!
  1862. vld1.8 {q1},[r1]!
  1863. vld1.8 {q2},[r1]!
  1864. vld1.8 {q3},[r1]!
  1865. vld1.32 {q8},[r14,:128]!
  1866. vld1.32 {q9},[r14,:128]!
  1867. vld1.32 {q10},[r14,:128]!
  1868. vld1.32 {q11},[r14,:128]!
  1869. vrev32.8 q0,q0 @ yes, even on
  1870. str r0,[sp,#64]
  1871. vrev32.8 q1,q1 @ big-endian
  1872. str r1,[sp,#68]
  1873. mov r1,sp
  1874. vrev32.8 q2,q2
  1875. str r2,[sp,#72]
  1876. vrev32.8 q3,q3
  1877. str r12,[sp,#76] @ save original sp
  1878. vadd.i32 q8,q8,q0
  1879. vadd.i32 q9,q9,q1
  1880. vst1.32 {q8},[r1,:128]!
  1881. vadd.i32 q10,q10,q2
  1882. vst1.32 {q9},[r1,:128]!
  1883. vadd.i32 q11,q11,q3
  1884. vst1.32 {q10},[r1,:128]!
  1885. vst1.32 {q11},[r1,:128]!
  1886. ldmia r0,{r4-r11}
  1887. sub r1,r1,#64
  1888. ldr r2,[sp,#0]
  1889. eor r12,r12,r12
  1890. eor r3,r5,r6
  1891. b .L_00_48
  1892. .align 4
  1893. .L_00_48:
  1894. vext.8 q8,q0,q1,#4
  1895. add r11,r11,r2
  1896. eor r2,r9,r10
  1897. eor r0,r8,r8,ror#5
  1898. vext.8 q9,q2,q3,#4
  1899. add r4,r4,r12
  1900. and r2,r2,r8
  1901. eor r12,r0,r8,ror#19
  1902. vshr.u32 q10,q8,#7
  1903. eor r0,r4,r4,ror#11
  1904. eor r2,r2,r10
  1905. vadd.i32 q0,q0,q9
  1906. add r11,r11,r12,ror#6
  1907. eor r12,r4,r5
  1908. vshr.u32 q9,q8,#3
  1909. eor r0,r0,r4,ror#20
  1910. add r11,r11,r2
  1911. vsli.32 q10,q8,#25
  1912. ldr r2,[sp,#4]
  1913. and r3,r3,r12
  1914. vshr.u32 q11,q8,#18
  1915. add r7,r7,r11
  1916. add r11,r11,r0,ror#2
  1917. eor r3,r3,r5
  1918. veor q9,q9,q10
  1919. add r10,r10,r2
  1920. vsli.32 q11,q8,#14
  1921. eor r2,r8,r9
  1922. eor r0,r7,r7,ror#5
  1923. vshr.u32 d24,d7,#17
  1924. add r11,r11,r3
  1925. and r2,r2,r7
  1926. veor q9,q9,q11
  1927. eor r3,r0,r7,ror#19
  1928. eor r0,r11,r11,ror#11
  1929. vsli.32 d24,d7,#15
  1930. eor r2,r2,r9
  1931. add r10,r10,r3,ror#6
  1932. vshr.u32 d25,d7,#10
  1933. eor r3,r11,r4
  1934. eor r0,r0,r11,ror#20
  1935. vadd.i32 q0,q0,q9
  1936. add r10,r10,r2
  1937. ldr r2,[sp,#8]
  1938. veor d25,d25,d24
  1939. and r12,r12,r3
  1940. add r6,r6,r10
  1941. vshr.u32 d24,d7,#19
  1942. add r10,r10,r0,ror#2
  1943. eor r12,r12,r4
  1944. vsli.32 d24,d7,#13
  1945. add r9,r9,r2
  1946. eor r2,r7,r8
  1947. veor d25,d25,d24
  1948. eor r0,r6,r6,ror#5
  1949. add r10,r10,r12
  1950. vadd.i32 d0,d0,d25
  1951. and r2,r2,r6
  1952. eor r12,r0,r6,ror#19
  1953. vshr.u32 d24,d0,#17
  1954. eor r0,r10,r10,ror#11
  1955. eor r2,r2,r8
  1956. vsli.32 d24,d0,#15
  1957. add r9,r9,r12,ror#6
  1958. eor r12,r10,r11
  1959. vshr.u32 d25,d0,#10
  1960. eor r0,r0,r10,ror#20
  1961. add r9,r9,r2
  1962. veor d25,d25,d24
  1963. ldr r2,[sp,#12]
  1964. and r3,r3,r12
  1965. vshr.u32 d24,d0,#19
  1966. add r5,r5,r9
  1967. add r9,r9,r0,ror#2
  1968. eor r3,r3,r11
  1969. vld1.32 {q8},[r14,:128]!
  1970. add r8,r8,r2
  1971. vsli.32 d24,d0,#13
  1972. eor r2,r6,r7
  1973. eor r0,r5,r5,ror#5
  1974. veor d25,d25,d24
  1975. add r9,r9,r3
  1976. and r2,r2,r5
  1977. vadd.i32 d1,d1,d25
  1978. eor r3,r0,r5,ror#19
  1979. eor r0,r9,r9,ror#11
  1980. vadd.i32 q8,q8,q0
  1981. eor r2,r2,r7
  1982. add r8,r8,r3,ror#6
  1983. eor r3,r9,r10
  1984. eor r0,r0,r9,ror#20
  1985. add r8,r8,r2
  1986. ldr r2,[sp,#16]
  1987. and r12,r12,r3
  1988. add r4,r4,r8
  1989. vst1.32 {q8},[r1,:128]!
  1990. add r8,r8,r0,ror#2
  1991. eor r12,r12,r10
  1992. vext.8 q8,q1,q2,#4
  1993. add r7,r7,r2
  1994. eor r2,r5,r6
  1995. eor r0,r4,r4,ror#5
  1996. vext.8 q9,q3,q0,#4
  1997. add r8,r8,r12
  1998. and r2,r2,r4
  1999. eor r12,r0,r4,ror#19
  2000. vshr.u32 q10,q8,#7
  2001. eor r0,r8,r8,ror#11
  2002. eor r2,r2,r6
  2003. vadd.i32 q1,q1,q9
  2004. add r7,r7,r12,ror#6
  2005. eor r12,r8,r9
  2006. vshr.u32 q9,q8,#3
  2007. eor r0,r0,r8,ror#20
  2008. add r7,r7,r2
  2009. vsli.32 q10,q8,#25
  2010. ldr r2,[sp,#20]
  2011. and r3,r3,r12
  2012. vshr.u32 q11,q8,#18
  2013. add r11,r11,r7
  2014. add r7,r7,r0,ror#2
  2015. eor r3,r3,r9
  2016. veor q9,q9,q10
  2017. add r6,r6,r2
  2018. vsli.32 q11,q8,#14
  2019. eor r2,r4,r5
  2020. eor r0,r11,r11,ror#5
  2021. vshr.u32 d24,d1,#17
  2022. add r7,r7,r3
  2023. and r2,r2,r11
  2024. veor q9,q9,q11
  2025. eor r3,r0,r11,ror#19
  2026. eor r0,r7,r7,ror#11
  2027. vsli.32 d24,d1,#15
  2028. eor r2,r2,r5
  2029. add r6,r6,r3,ror#6
  2030. vshr.u32 d25,d1,#10
  2031. eor r3,r7,r8
  2032. eor r0,r0,r7,ror#20
  2033. vadd.i32 q1,q1,q9
  2034. add r6,r6,r2
  2035. ldr r2,[sp,#24]
  2036. veor d25,d25,d24
  2037. and r12,r12,r3
  2038. add r10,r10,r6
  2039. vshr.u32 d24,d1,#19
  2040. add r6,r6,r0,ror#2
  2041. eor r12,r12,r8
  2042. vsli.32 d24,d1,#13
  2043. add r5,r5,r2
  2044. eor r2,r11,r4
  2045. veor d25,d25,d24
  2046. eor r0,r10,r10,ror#5
  2047. add r6,r6,r12
  2048. vadd.i32 d2,d2,d25
  2049. and r2,r2,r10
  2050. eor r12,r0,r10,ror#19
  2051. vshr.u32 d24,d2,#17
  2052. eor r0,r6,r6,ror#11
  2053. eor r2,r2,r4
  2054. vsli.32 d24,d2,#15
  2055. add r5,r5,r12,ror#6
  2056. eor r12,r6,r7
  2057. vshr.u32 d25,d2,#10
  2058. eor r0,r0,r6,ror#20
  2059. add r5,r5,r2
  2060. veor d25,d25,d24
  2061. ldr r2,[sp,#28]
  2062. and r3,r3,r12
  2063. vshr.u32 d24,d2,#19
  2064. add r9,r9,r5
  2065. add r5,r5,r0,ror#2
  2066. eor r3,r3,r7
  2067. vld1.32 {q8},[r14,:128]!
  2068. add r4,r4,r2
  2069. vsli.32 d24,d2,#13
  2070. eor r2,r10,r11
  2071. eor r0,r9,r9,ror#5
  2072. veor d25,d25,d24
  2073. add r5,r5,r3
  2074. and r2,r2,r9
  2075. vadd.i32 d3,d3,d25
  2076. eor r3,r0,r9,ror#19
  2077. eor r0,r5,r5,ror#11
  2078. vadd.i32 q8,q8,q1
  2079. eor r2,r2,r11
  2080. add r4,r4,r3,ror#6
  2081. eor r3,r5,r6
  2082. eor r0,r0,r5,ror#20
  2083. add r4,r4,r2
  2084. ldr r2,[sp,#32]
  2085. and r12,r12,r3
  2086. add r8,r8,r4
  2087. vst1.32 {q8},[r1,:128]!
  2088. add r4,r4,r0,ror#2
  2089. eor r12,r12,r6
  2090. vext.8 q8,q2,q3,#4
  2091. add r11,r11,r2
  2092. eor r2,r9,r10
  2093. eor r0,r8,r8,ror#5
  2094. vext.8 q9,q0,q1,#4
  2095. add r4,r4,r12
  2096. and r2,r2,r8
  2097. eor r12,r0,r8,ror#19
  2098. vshr.u32 q10,q8,#7
  2099. eor r0,r4,r4,ror#11
  2100. eor r2,r2,r10
  2101. vadd.i32 q2,q2,q9
  2102. add r11,r11,r12,ror#6
  2103. eor r12,r4,r5
  2104. vshr.u32 q9,q8,#3
  2105. eor r0,r0,r4,ror#20
  2106. add r11,r11,r2
  2107. vsli.32 q10,q8,#25
  2108. ldr r2,[sp,#36]
  2109. and r3,r3,r12
  2110. vshr.u32 q11,q8,#18
  2111. add r7,r7,r11
  2112. add r11,r11,r0,ror#2
  2113. eor r3,r3,r5
  2114. veor q9,q9,q10
  2115. add r10,r10,r2
  2116. vsli.32 q11,q8,#14
  2117. eor r2,r8,r9
  2118. eor r0,r7,r7,ror#5
  2119. vshr.u32 d24,d3,#17
  2120. add r11,r11,r3
  2121. and r2,r2,r7
  2122. veor q9,q9,q11
  2123. eor r3,r0,r7,ror#19
  2124. eor r0,r11,r11,ror#11
  2125. vsli.32 d24,d3,#15
  2126. eor r2,r2,r9
  2127. add r10,r10,r3,ror#6
  2128. vshr.u32 d25,d3,#10
  2129. eor r3,r11,r4
  2130. eor r0,r0,r11,ror#20
  2131. vadd.i32 q2,q2,q9
  2132. add r10,r10,r2
  2133. ldr r2,[sp,#40]
  2134. veor d25,d25,d24
  2135. and r12,r12,r3
  2136. add r6,r6,r10
  2137. vshr.u32 d24,d3,#19
  2138. add r10,r10,r0,ror#2
  2139. eor r12,r12,r4
  2140. vsli.32 d24,d3,#13
  2141. add r9,r9,r2
  2142. eor r2,r7,r8
  2143. veor d25,d25,d24
  2144. eor r0,r6,r6,ror#5
  2145. add r10,r10,r12
  2146. vadd.i32 d4,d4,d25
  2147. and r2,r2,r6
  2148. eor r12,r0,r6,ror#19
  2149. vshr.u32 d24,d4,#17
  2150. eor r0,r10,r10,ror#11
  2151. eor r2,r2,r8
  2152. vsli.32 d24,d4,#15
  2153. add r9,r9,r12,ror#6
  2154. eor r12,r10,r11
  2155. vshr.u32 d25,d4,#10
  2156. eor r0,r0,r10,ror#20
  2157. add r9,r9,r2
  2158. veor d25,d25,d24
  2159. ldr r2,[sp,#44]
  2160. and r3,r3,r12
  2161. vshr.u32 d24,d4,#19
  2162. add r5,r5,r9
  2163. add r9,r9,r0,ror#2
  2164. eor r3,r3,r11
  2165. vld1.32 {q8},[r14,:128]!
  2166. add r8,r8,r2
  2167. vsli.32 d24,d4,#13
  2168. eor r2,r6,r7
  2169. eor r0,r5,r5,ror#5
  2170. veor d25,d25,d24
  2171. add r9,r9,r3
  2172. and r2,r2,r5
  2173. vadd.i32 d5,d5,d25
  2174. eor r3,r0,r5,ror#19
  2175. eor r0,r9,r9,ror#11
  2176. vadd.i32 q8,q8,q2
  2177. eor r2,r2,r7
  2178. add r8,r8,r3,ror#6
  2179. eor r3,r9,r10
  2180. eor r0,r0,r9,ror#20
  2181. add r8,r8,r2
  2182. ldr r2,[sp,#48]
  2183. and r12,r12,r3
  2184. add r4,r4,r8
  2185. vst1.32 {q8},[r1,:128]!
  2186. add r8,r8,r0,ror#2
  2187. eor r12,r12,r10
  2188. vext.8 q8,q3,q0,#4
  2189. add r7,r7,r2
  2190. eor r2,r5,r6
  2191. eor r0,r4,r4,ror#5
  2192. vext.8 q9,q1,q2,#4
  2193. add r8,r8,r12
  2194. and r2,r2,r4
  2195. eor r12,r0,r4,ror#19
  2196. vshr.u32 q10,q8,#7
  2197. eor r0,r8,r8,ror#11
  2198. eor r2,r2,r6
  2199. vadd.i32 q3,q3,q9
  2200. add r7,r7,r12,ror#6
  2201. eor r12,r8,r9
  2202. vshr.u32 q9,q8,#3
  2203. eor r0,r0,r8,ror#20
  2204. add r7,r7,r2
  2205. vsli.32 q10,q8,#25
  2206. ldr r2,[sp,#52]
  2207. and r3,r3,r12
  2208. vshr.u32 q11,q8,#18
  2209. add r11,r11,r7
  2210. add r7,r7,r0,ror#2
  2211. eor r3,r3,r9
  2212. veor q9,q9,q10
  2213. add r6,r6,r2
  2214. vsli.32 q11,q8,#14
  2215. eor r2,r4,r5
  2216. eor r0,r11,r11,ror#5
  2217. vshr.u32 d24,d5,#17
  2218. add r7,r7,r3
  2219. and r2,r2,r11
  2220. veor q9,q9,q11
  2221. eor r3,r0,r11,ror#19
  2222. eor r0,r7,r7,ror#11
  2223. vsli.32 d24,d5,#15
  2224. eor r2,r2,r5
  2225. add r6,r6,r3,ror#6
  2226. vshr.u32 d25,d5,#10
  2227. eor r3,r7,r8
  2228. eor r0,r0,r7,ror#20
  2229. vadd.i32 q3,q3,q9
  2230. add r6,r6,r2
  2231. ldr r2,[sp,#56]
  2232. veor d25,d25,d24
  2233. and r12,r12,r3
  2234. add r10,r10,r6
  2235. vshr.u32 d24,d5,#19
  2236. add r6,r6,r0,ror#2
  2237. eor r12,r12,r8
  2238. vsli.32 d24,d5,#13
  2239. add r5,r5,r2
  2240. eor r2,r11,r4
  2241. veor d25,d25,d24
  2242. eor r0,r10,r10,ror#5
  2243. add r6,r6,r12
  2244. vadd.i32 d6,d6,d25
  2245. and r2,r2,r10
  2246. eor r12,r0,r10,ror#19
  2247. vshr.u32 d24,d6,#17
  2248. eor r0,r6,r6,ror#11
  2249. eor r2,r2,r4
  2250. vsli.32 d24,d6,#15
  2251. add r5,r5,r12,ror#6
  2252. eor r12,r6,r7
  2253. vshr.u32 d25,d6,#10
  2254. eor r0,r0,r6,ror#20
  2255. add r5,r5,r2
  2256. veor d25,d25,d24
  2257. ldr r2,[sp,#60]
  2258. and r3,r3,r12
  2259. vshr.u32 d24,d6,#19
  2260. add r9,r9,r5
  2261. add r5,r5,r0,ror#2
  2262. eor r3,r3,r7
  2263. vld1.32 {q8},[r14,:128]!
  2264. add r4,r4,r2
  2265. vsli.32 d24,d6,#13
  2266. eor r2,r10,r11
  2267. eor r0,r9,r9,ror#5
  2268. veor d25,d25,d24
  2269. add r5,r5,r3
  2270. and r2,r2,r9
  2271. vadd.i32 d7,d7,d25
  2272. eor r3,r0,r9,ror#19
  2273. eor r0,r5,r5,ror#11
  2274. vadd.i32 q8,q8,q3
  2275. eor r2,r2,r11
  2276. add r4,r4,r3,ror#6
  2277. eor r3,r5,r6
  2278. eor r0,r0,r5,ror#20
  2279. add r4,r4,r2
  2280. ldr r2,[r14]
  2281. and r12,r12,r3
  2282. add r8,r8,r4
  2283. vst1.32 {q8},[r1,:128]!
  2284. add r4,r4,r0,ror#2
  2285. eor r12,r12,r6
  2286. teq r2,#0 @ check for K256 terminator
  2287. ldr r2,[sp,#0]
  2288. sub r1,r1,#64
  2289. bne .L_00_48
  2290. ldr r1,[sp,#68]
  2291. ldr r0,[sp,#72]
  2292. sub r14,r14,#256 @ rewind r14
  2293. teq r1,r0
  2294. it eq
  2295. subeq r1,r1,#64 @ avoid SEGV
  2296. vld1.8 {q0},[r1]! @ load next input block
  2297. vld1.8 {q1},[r1]!
  2298. vld1.8 {q2},[r1]!
  2299. vld1.8 {q3},[r1]!
  2300. it ne
  2301. strne r1,[sp,#68]
  2302. mov r1,sp
  2303. add r11,r11,r2
  2304. eor r2,r9,r10
  2305. eor r0,r8,r8,ror#5
  2306. add r4,r4,r12
  2307. vld1.32 {q8},[r14,:128]!
  2308. and r2,r2,r8
  2309. eor r12,r0,r8,ror#19
  2310. eor r0,r4,r4,ror#11
  2311. eor r2,r2,r10
  2312. vrev32.8 q0,q0
  2313. add r11,r11,r12,ror#6
  2314. eor r12,r4,r5
  2315. eor r0,r0,r4,ror#20
  2316. add r11,r11,r2
  2317. vadd.i32 q8,q8,q0
  2318. ldr r2,[sp,#4]
  2319. and r3,r3,r12
  2320. add r7,r7,r11
  2321. add r11,r11,r0,ror#2
  2322. eor r3,r3,r5
  2323. add r10,r10,r2
  2324. eor r2,r8,r9
  2325. eor r0,r7,r7,ror#5
  2326. add r11,r11,r3
  2327. and r2,r2,r7
  2328. eor r3,r0,r7,ror#19
  2329. eor r0,r11,r11,ror#11
  2330. eor r2,r2,r9
  2331. add r10,r10,r3,ror#6
  2332. eor r3,r11,r4
  2333. eor r0,r0,r11,ror#20
  2334. add r10,r10,r2
  2335. ldr r2,[sp,#8]
  2336. and r12,r12,r3
  2337. add r6,r6,r10
  2338. add r10,r10,r0,ror#2
  2339. eor r12,r12,r4
  2340. add r9,r9,r2
  2341. eor r2,r7,r8
  2342. eor r0,r6,r6,ror#5
  2343. add r10,r10,r12
  2344. and r2,r2,r6
  2345. eor r12,r0,r6,ror#19
  2346. eor r0,r10,r10,ror#11
  2347. eor r2,r2,r8
  2348. add r9,r9,r12,ror#6
  2349. eor r12,r10,r11
  2350. eor r0,r0,r10,ror#20
  2351. add r9,r9,r2
  2352. ldr r2,[sp,#12]
  2353. and r3,r3,r12
  2354. add r5,r5,r9
  2355. add r9,r9,r0,ror#2
  2356. eor r3,r3,r11
  2357. add r8,r8,r2
  2358. eor r2,r6,r7
  2359. eor r0,r5,r5,ror#5
  2360. add r9,r9,r3
  2361. and r2,r2,r5
  2362. eor r3,r0,r5,ror#19
  2363. eor r0,r9,r9,ror#11
  2364. eor r2,r2,r7
  2365. add r8,r8,r3,ror#6
  2366. eor r3,r9,r10
  2367. eor r0,r0,r9,ror#20
  2368. add r8,r8,r2
  2369. ldr r2,[sp,#16]
  2370. and r12,r12,r3
  2371. add r4,r4,r8
  2372. add r8,r8,r0,ror#2
  2373. eor r12,r12,r10
  2374. vst1.32 {q8},[r1,:128]!
  2375. add r7,r7,r2
  2376. eor r2,r5,r6
  2377. eor r0,r4,r4,ror#5
  2378. add r8,r8,r12
  2379. vld1.32 {q8},[r14,:128]!
  2380. and r2,r2,r4
  2381. eor r12,r0,r4,ror#19
  2382. eor r0,r8,r8,ror#11
  2383. eor r2,r2,r6
  2384. vrev32.8 q1,q1
  2385. add r7,r7,r12,ror#6
  2386. eor r12,r8,r9
  2387. eor r0,r0,r8,ror#20
  2388. add r7,r7,r2
  2389. vadd.i32 q8,q8,q1
  2390. ldr r2,[sp,#20]
  2391. and r3,r3,r12
  2392. add r11,r11,r7
  2393. add r7,r7,r0,ror#2
  2394. eor r3,r3,r9
  2395. add r6,r6,r2
  2396. eor r2,r4,r5
  2397. eor r0,r11,r11,ror#5
  2398. add r7,r7,r3
  2399. and r2,r2,r11
  2400. eor r3,r0,r11,ror#19
  2401. eor r0,r7,r7,ror#11
  2402. eor r2,r2,r5
  2403. add r6,r6,r3,ror#6
  2404. eor r3,r7,r8
  2405. eor r0,r0,r7,ror#20
  2406. add r6,r6,r2
  2407. ldr r2,[sp,#24]
  2408. and r12,r12,r3
  2409. add r10,r10,r6
  2410. add r6,r6,r0,ror#2
  2411. eor r12,r12,r8
  2412. add r5,r5,r2
  2413. eor r2,r11,r4
  2414. eor r0,r10,r10,ror#5
  2415. add r6,r6,r12
  2416. and r2,r2,r10
  2417. eor r12,r0,r10,ror#19
  2418. eor r0,r6,r6,ror#11
  2419. eor r2,r2,r4
  2420. add r5,r5,r12,ror#6
  2421. eor r12,r6,r7
  2422. eor r0,r0,r6,ror#20
  2423. add r5,r5,r2
  2424. ldr r2,[sp,#28]
  2425. and r3,r3,r12
  2426. add r9,r9,r5
  2427. add r5,r5,r0,ror#2
  2428. eor r3,r3,r7
  2429. add r4,r4,r2
  2430. eor r2,r10,r11
  2431. eor r0,r9,r9,ror#5
  2432. add r5,r5,r3
  2433. and r2,r2,r9
  2434. eor r3,r0,r9,ror#19
  2435. eor r0,r5,r5,ror#11
  2436. eor r2,r2,r11
  2437. add r4,r4,r3,ror#6
  2438. eor r3,r5,r6
  2439. eor r0,r0,r5,ror#20
  2440. add r4,r4,r2
  2441. ldr r2,[sp,#32]
  2442. and r12,r12,r3
  2443. add r8,r8,r4
  2444. add r4,r4,r0,ror#2
  2445. eor r12,r12,r6
  2446. vst1.32 {q8},[r1,:128]!
  2447. add r11,r11,r2
  2448. eor r2,r9,r10
  2449. eor r0,r8,r8,ror#5
  2450. add r4,r4,r12
  2451. vld1.32 {q8},[r14,:128]!
  2452. and r2,r2,r8
  2453. eor r12,r0,r8,ror#19
  2454. eor r0,r4,r4,ror#11
  2455. eor r2,r2,r10
  2456. vrev32.8 q2,q2
  2457. add r11,r11,r12,ror#6
  2458. eor r12,r4,r5
  2459. eor r0,r0,r4,ror#20
  2460. add r11,r11,r2
  2461. vadd.i32 q8,q8,q2
  2462. ldr r2,[sp,#36]
  2463. and r3,r3,r12
  2464. add r7,r7,r11
  2465. add r11,r11,r0,ror#2
  2466. eor r3,r3,r5
  2467. add r10,r10,r2
  2468. eor r2,r8,r9
  2469. eor r0,r7,r7,ror#5
  2470. add r11,r11,r3
  2471. and r2,r2,r7
  2472. eor r3,r0,r7,ror#19
  2473. eor r0,r11,r11,ror#11
  2474. eor r2,r2,r9
  2475. add r10,r10,r3,ror#6
  2476. eor r3,r11,r4
  2477. eor r0,r0,r11,ror#20
  2478. add r10,r10,r2
  2479. ldr r2,[sp,#40]
  2480. and r12,r12,r3
  2481. add r6,r6,r10
  2482. add r10,r10,r0,ror#2
  2483. eor r12,r12,r4
  2484. add r9,r9,r2
  2485. eor r2,r7,r8
  2486. eor r0,r6,r6,ror#5
  2487. add r10,r10,r12
  2488. and r2,r2,r6
  2489. eor r12,r0,r6,ror#19
  2490. eor r0,r10,r10,ror#11
  2491. eor r2,r2,r8
  2492. add r9,r9,r12,ror#6
  2493. eor r12,r10,r11
  2494. eor r0,r0,r10,ror#20
  2495. add r9,r9,r2
  2496. ldr r2,[sp,#44]
  2497. and r3,r3,r12
  2498. add r5,r5,r9
  2499. add r9,r9,r0,ror#2
  2500. eor r3,r3,r11
  2501. add r8,r8,r2
  2502. eor r2,r6,r7
  2503. eor r0,r5,r5,ror#5
  2504. add r9,r9,r3
  2505. and r2,r2,r5
  2506. eor r3,r0,r5,ror#19
  2507. eor r0,r9,r9,ror#11
  2508. eor r2,r2,r7
  2509. add r8,r8,r3,ror#6
  2510. eor r3,r9,r10
  2511. eor r0,r0,r9,ror#20
  2512. add r8,r8,r2
  2513. ldr r2,[sp,#48]
  2514. and r12,r12,r3
  2515. add r4,r4,r8
  2516. add r8,r8,r0,ror#2
  2517. eor r12,r12,r10
  2518. vst1.32 {q8},[r1,:128]!
  2519. add r7,r7,r2
  2520. eor r2,r5,r6
  2521. eor r0,r4,r4,ror#5
  2522. add r8,r8,r12
  2523. vld1.32 {q8},[r14,:128]!
  2524. and r2,r2,r4
  2525. eor r12,r0,r4,ror#19
  2526. eor r0,r8,r8,ror#11
  2527. eor r2,r2,r6
  2528. vrev32.8 q3,q3
  2529. add r7,r7,r12,ror#6
  2530. eor r12,r8,r9
  2531. eor r0,r0,r8,ror#20
  2532. add r7,r7,r2
  2533. vadd.i32 q8,q8,q3
  2534. ldr r2,[sp,#52]
  2535. and r3,r3,r12
  2536. add r11,r11,r7
  2537. add r7,r7,r0,ror#2
  2538. eor r3,r3,r9
  2539. add r6,r6,r2
  2540. eor r2,r4,r5
  2541. eor r0,r11,r11,ror#5
  2542. add r7,r7,r3
  2543. and r2,r2,r11
  2544. eor r3,r0,r11,ror#19
  2545. eor r0,r7,r7,ror#11
  2546. eor r2,r2,r5
  2547. add r6,r6,r3,ror#6
  2548. eor r3,r7,r8
  2549. eor r0,r0,r7,ror#20
  2550. add r6,r6,r2
  2551. ldr r2,[sp,#56]
  2552. and r12,r12,r3
  2553. add r10,r10,r6
  2554. add r6,r6,r0,ror#2
  2555. eor r12,r12,r8
  2556. add r5,r5,r2
  2557. eor r2,r11,r4
  2558. eor r0,r10,r10,ror#5
  2559. add r6,r6,r12
  2560. and r2,r2,r10
  2561. eor r12,r0,r10,ror#19
  2562. eor r0,r6,r6,ror#11
  2563. eor r2,r2,r4
  2564. add r5,r5,r12,ror#6
  2565. eor r12,r6,r7
  2566. eor r0,r0,r6,ror#20
  2567. add r5,r5,r2
  2568. ldr r2,[sp,#60]
  2569. and r3,r3,r12
  2570. add r9,r9,r5
  2571. add r5,r5,r0,ror#2
  2572. eor r3,r3,r7
  2573. add r4,r4,r2
  2574. eor r2,r10,r11
  2575. eor r0,r9,r9,ror#5
  2576. add r5,r5,r3
  2577. and r2,r2,r9
  2578. eor r3,r0,r9,ror#19
  2579. eor r0,r5,r5,ror#11
  2580. eor r2,r2,r11
  2581. add r4,r4,r3,ror#6
  2582. eor r3,r5,r6
  2583. eor r0,r0,r5,ror#20
  2584. add r4,r4,r2
  2585. ldr r2,[sp,#64]
  2586. and r12,r12,r3
  2587. add r8,r8,r4
  2588. add r4,r4,r0,ror#2
  2589. eor r12,r12,r6
  2590. vst1.32 {q8},[r1,:128]!
  2591. ldr r0,[r2,#0]
  2592. add r4,r4,r12 @ h+=Maj(a,b,c) from the past
  2593. ldr r12,[r2,#4]
  2594. ldr r3,[r2,#8]
  2595. ldr r1,[r2,#12]
  2596. add r4,r4,r0 @ accumulate
  2597. ldr r0,[r2,#16]
  2598. add r5,r5,r12
  2599. ldr r12,[r2,#20]
  2600. add r6,r6,r3
  2601. ldr r3,[r2,#24]
  2602. add r7,r7,r1
  2603. ldr r1,[r2,#28]
  2604. add r8,r8,r0
  2605. str r4,[r2],#4
  2606. add r9,r9,r12
  2607. str r5,[r2],#4
  2608. add r10,r10,r3
  2609. str r6,[r2],#4
  2610. add r11,r11,r1
  2611. str r7,[r2],#4
  2612. stmia r2,{r8-r11}
  2613. ittte ne
  2614. movne r1,sp
  2615. ldrne r2,[sp,#0]
  2616. eorne r12,r12,r12
  2617. ldreq sp,[sp,#76] @ restore original sp
  2618. itt ne
  2619. eorne r3,r5,r6
  2620. bne .L_00_48
  2621. ldmia sp!,{r4-r12,pc}
  2622. .size sha256_block_data_order_neon,.-sha256_block_data_order_neon
  2623. #endif
  2624. #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
  2625. # ifdef __thumb2__
  2626. # define INST(a,b,c,d) .byte c,d|0xc,a,b
  2627. # else
  2628. # define INST(a,b,c,d) .byte a,b,c,d
  2629. # endif
  2630. .type sha256_block_data_order_armv8,%function
  2631. .align 5
  2632. sha256_block_data_order_armv8:
  2633. .LARMv8:
  2634. vld1.32 {q0,q1},[r0]
  2635. # ifdef __thumb2__
  2636. adr r3,.LARMv8
  2637. sub r3,r3,#.LARMv8-K256
  2638. # else
  2639. adrl r3,K256
  2640. # endif
  2641. add r2,r1,r2,lsl#6 @ len to point at the end of inp
  2642. .Loop_v8:
  2643. vld1.8 {q8-q9},[r1]!
  2644. vld1.8 {q10-q11},[r1]!
  2645. vld1.32 {q12},[r3]!
  2646. vrev32.8 q8,q8
  2647. vrev32.8 q9,q9
  2648. vrev32.8 q10,q10
  2649. vrev32.8 q11,q11
  2650. vmov q14,q0 @ offload
  2651. vmov q15,q1
  2652. teq r1,r2
  2653. vld1.32 {q13},[r3]!
  2654. vadd.i32 q12,q12,q8
  2655. INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9
  2656. vmov q2,q0
  2657. INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12
  2658. INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12
  2659. INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11
  2660. vld1.32 {q12},[r3]!
  2661. vadd.i32 q13,q13,q9
  2662. INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10
  2663. vmov q2,q0
  2664. INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13
  2665. INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13
  2666. INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8
  2667. vld1.32 {q13},[r3]!
  2668. vadd.i32 q12,q12,q10
  2669. INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11
  2670. vmov q2,q0
  2671. INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12
  2672. INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12
  2673. INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9
  2674. vld1.32 {q12},[r3]!
  2675. vadd.i32 q13,q13,q11
  2676. INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8
  2677. vmov q2,q0
  2678. INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13
  2679. INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13
  2680. INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10
  2681. vld1.32 {q13},[r3]!
  2682. vadd.i32 q12,q12,q8
  2683. INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9
  2684. vmov q2,q0
  2685. INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12
  2686. INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12
  2687. INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11
  2688. vld1.32 {q12},[r3]!
  2689. vadd.i32 q13,q13,q9
  2690. INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10
  2691. vmov q2,q0
  2692. INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13
  2693. INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13
  2694. INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8
  2695. vld1.32 {q13},[r3]!
  2696. vadd.i32 q12,q12,q10
  2697. INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11
  2698. vmov q2,q0
  2699. INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12
  2700. INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12
  2701. INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9
  2702. vld1.32 {q12},[r3]!
  2703. vadd.i32 q13,q13,q11
  2704. INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8
  2705. vmov q2,q0
  2706. INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13
  2707. INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13
  2708. INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10
  2709. vld1.32 {q13},[r3]!
  2710. vadd.i32 q12,q12,q8
  2711. INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9
  2712. vmov q2,q0
  2713. INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12
  2714. INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12
  2715. INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11
  2716. vld1.32 {q12},[r3]!
  2717. vadd.i32 q13,q13,q9
  2718. INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10
  2719. vmov q2,q0
  2720. INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13
  2721. INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13
  2722. INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8
  2723. vld1.32 {q13},[r3]!
  2724. vadd.i32 q12,q12,q10
  2725. INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11
  2726. vmov q2,q0
  2727. INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12
  2728. INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12
  2729. INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9
  2730. vld1.32 {q12},[r3]!
  2731. vadd.i32 q13,q13,q11
  2732. INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8
  2733. vmov q2,q0
  2734. INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13
  2735. INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13
  2736. INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10
  2737. vld1.32 {q13},[r3]!
  2738. vadd.i32 q12,q12,q8
  2739. vmov q2,q0
  2740. INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12
  2741. INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12
  2742. vld1.32 {q12},[r3]!
  2743. vadd.i32 q13,q13,q9
  2744. vmov q2,q0
  2745. INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13
  2746. INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13
  2747. vld1.32 {q13},[r3]
  2748. vadd.i32 q12,q12,q10
  2749. sub r3,r3,#256-16 @ rewind
  2750. vmov q2,q0
  2751. INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12
  2752. INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12
  2753. vadd.i32 q13,q13,q11
  2754. vmov q2,q0
  2755. INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13
  2756. INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13
  2757. vadd.i32 q0,q0,q14
  2758. vadd.i32 q1,q1,q15
  2759. it ne
  2760. bne .Loop_v8
  2761. vst1.32 {q0,q1},[r0]
  2762. bx lr @ bx lr
  2763. .size sha256_block_data_order_armv8,.-sha256_block_data_order_armv8
  2764. #endif
  2765. .asciz "SHA256 block transform for ARMv4/NEON/ARMv8, CRYPTOGAMS by <appro@openssl.org>"
  2766. .align 2
  2767. #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
  2768. .comm OPENSSL_armcap_P,4,4
  2769. #endif