sha256-armv4.S 63 KB

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