sha256-armv4.S 62 KB

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