sha512-armv4.S 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894
  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(__arm__)
  11. #if defined(BORINGSSL_PREFIX)
  12. #include <boringssl_prefix_symbols_asm.h>
  13. #endif
  14. @ Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved.
  15. @
  16. @ Licensed under the OpenSSL license (the "License"). You may not use
  17. @ this file except in compliance with the License. You can obtain a copy
  18. @ in the file LICENSE in the source distribution or at
  19. @ https://www.openssl.org/source/license.html
  20. @ ====================================================================
  21. @ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
  22. @ project. The module is, however, dual licensed under OpenSSL and
  23. @ CRYPTOGAMS licenses depending on where you obtain it. For further
  24. @ details see http://www.openssl.org/~appro/cryptogams/.
  25. @
  26. @ Permission to use under GPL terms is granted.
  27. @ ====================================================================
  28. @ SHA512 block procedure for ARMv4. September 2007.
  29. @ This code is ~4.5 (four and a half) times faster than code generated
  30. @ by gcc 3.4 and it spends ~72 clock cycles per byte [on single-issue
  31. @ Xscale PXA250 core].
  32. @
  33. @ July 2010.
  34. @
  35. @ Rescheduling for dual-issue pipeline resulted in 6% improvement on
  36. @ Cortex A8 core and ~40 cycles per processed byte.
  37. @ February 2011.
  38. @
  39. @ Profiler-assisted and platform-specific optimization resulted in 7%
  40. @ improvement on Coxtex A8 core and ~38 cycles per byte.
  41. @ March 2011.
  42. @
  43. @ Add NEON implementation. On Cortex A8 it was measured to process
  44. @ one byte in 23.3 cycles or ~60% faster than integer-only code.
  45. @ August 2012.
  46. @
  47. @ Improve NEON performance by 12% on Snapdragon S4. In absolute
  48. @ terms it's 22.6 cycles per byte, which is disappointing result.
  49. @ Technical writers asserted that 3-way S4 pipeline can sustain
  50. @ multiple NEON instructions per cycle, but dual NEON issue could
  51. @ not be observed, see http://www.openssl.org/~appro/Snapdragon-S4.html
  52. @ for further details. On side note Cortex-A15 processes one byte in
  53. @ 16 cycles.
  54. @ Byte order [in]dependence. =========================================
  55. @
  56. @ Originally caller was expected to maintain specific *dword* order in
  57. @ h[0-7], namely with most significant dword at *lower* address, which
  58. @ was reflected in below two parameters as 0 and 4. Now caller is
  59. @ expected to maintain native byte order for whole 64-bit values.
  60. #ifndef __KERNEL__
  61. # include <openssl/arm_arch.h>
  62. # define VFP_ABI_PUSH vstmdb sp!,{d8-d15}
  63. # define VFP_ABI_POP vldmia sp!,{d8-d15}
  64. #else
  65. # define __ARM_ARCH__ __LINUX_ARM_ARCH__
  66. # define __ARM_MAX_ARCH__ 7
  67. # define VFP_ABI_PUSH
  68. # define VFP_ABI_POP
  69. #endif
  70. @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both
  71. @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions.
  72. .arch armv7-a
  73. #ifdef __ARMEL__
  74. # define LO 0
  75. # define HI 4
  76. # define WORD64(hi0,lo0,hi1,lo1) .word lo0,hi0, lo1,hi1
  77. #else
  78. # define HI 0
  79. # define LO 4
  80. # define WORD64(hi0,lo0,hi1,lo1) .word hi0,lo0, hi1,lo1
  81. #endif
  82. .text
  83. #if defined(__thumb2__)
  84. .syntax unified
  85. .thumb
  86. # define adrl adr
  87. #else
  88. .code 32
  89. #endif
  90. .type K512,%object
  91. .align 5
  92. K512:
  93. WORD64(0x428a2f98,0xd728ae22, 0x71374491,0x23ef65cd)
  94. WORD64(0xb5c0fbcf,0xec4d3b2f, 0xe9b5dba5,0x8189dbbc)
  95. WORD64(0x3956c25b,0xf348b538, 0x59f111f1,0xb605d019)
  96. WORD64(0x923f82a4,0xaf194f9b, 0xab1c5ed5,0xda6d8118)
  97. WORD64(0xd807aa98,0xa3030242, 0x12835b01,0x45706fbe)
  98. WORD64(0x243185be,0x4ee4b28c, 0x550c7dc3,0xd5ffb4e2)
  99. WORD64(0x72be5d74,0xf27b896f, 0x80deb1fe,0x3b1696b1)
  100. WORD64(0x9bdc06a7,0x25c71235, 0xc19bf174,0xcf692694)
  101. WORD64(0xe49b69c1,0x9ef14ad2, 0xefbe4786,0x384f25e3)
  102. WORD64(0x0fc19dc6,0x8b8cd5b5, 0x240ca1cc,0x77ac9c65)
  103. WORD64(0x2de92c6f,0x592b0275, 0x4a7484aa,0x6ea6e483)
  104. WORD64(0x5cb0a9dc,0xbd41fbd4, 0x76f988da,0x831153b5)
  105. WORD64(0x983e5152,0xee66dfab, 0xa831c66d,0x2db43210)
  106. WORD64(0xb00327c8,0x98fb213f, 0xbf597fc7,0xbeef0ee4)
  107. WORD64(0xc6e00bf3,0x3da88fc2, 0xd5a79147,0x930aa725)
  108. WORD64(0x06ca6351,0xe003826f, 0x14292967,0x0a0e6e70)
  109. WORD64(0x27b70a85,0x46d22ffc, 0x2e1b2138,0x5c26c926)
  110. WORD64(0x4d2c6dfc,0x5ac42aed, 0x53380d13,0x9d95b3df)
  111. WORD64(0x650a7354,0x8baf63de, 0x766a0abb,0x3c77b2a8)
  112. WORD64(0x81c2c92e,0x47edaee6, 0x92722c85,0x1482353b)
  113. WORD64(0xa2bfe8a1,0x4cf10364, 0xa81a664b,0xbc423001)
  114. WORD64(0xc24b8b70,0xd0f89791, 0xc76c51a3,0x0654be30)
  115. WORD64(0xd192e819,0xd6ef5218, 0xd6990624,0x5565a910)
  116. WORD64(0xf40e3585,0x5771202a, 0x106aa070,0x32bbd1b8)
  117. WORD64(0x19a4c116,0xb8d2d0c8, 0x1e376c08,0x5141ab53)
  118. WORD64(0x2748774c,0xdf8eeb99, 0x34b0bcb5,0xe19b48a8)
  119. WORD64(0x391c0cb3,0xc5c95a63, 0x4ed8aa4a,0xe3418acb)
  120. WORD64(0x5b9cca4f,0x7763e373, 0x682e6ff3,0xd6b2b8a3)
  121. WORD64(0x748f82ee,0x5defb2fc, 0x78a5636f,0x43172f60)
  122. WORD64(0x84c87814,0xa1f0ab72, 0x8cc70208,0x1a6439ec)
  123. WORD64(0x90befffa,0x23631e28, 0xa4506ceb,0xde82bde9)
  124. WORD64(0xbef9a3f7,0xb2c67915, 0xc67178f2,0xe372532b)
  125. WORD64(0xca273ece,0xea26619c, 0xd186b8c7,0x21c0c207)
  126. WORD64(0xeada7dd6,0xcde0eb1e, 0xf57d4f7f,0xee6ed178)
  127. WORD64(0x06f067aa,0x72176fba, 0x0a637dc5,0xa2c898a6)
  128. WORD64(0x113f9804,0xbef90dae, 0x1b710b35,0x131c471b)
  129. WORD64(0x28db77f5,0x23047d84, 0x32caab7b,0x40c72493)
  130. WORD64(0x3c9ebe0a,0x15c9bebc, 0x431d67c4,0x9c100d4c)
  131. WORD64(0x4cc5d4be,0xcb3e42b6, 0x597f299c,0xfc657e2a)
  132. WORD64(0x5fcb6fab,0x3ad6faec, 0x6c44198c,0x4a475817)
  133. .size K512,.-K512
  134. #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
  135. .LOPENSSL_armcap:
  136. .word OPENSSL_armcap_P-.Lsha512_block_data_order
  137. .skip 32-4
  138. #else
  139. .skip 32
  140. #endif
  141. .globl sha512_block_data_order
  142. .hidden sha512_block_data_order
  143. .type sha512_block_data_order,%function
  144. sha512_block_data_order:
  145. .Lsha512_block_data_order:
  146. #if __ARM_ARCH__<7 && !defined(__thumb2__)
  147. sub r3,pc,#8 @ sha512_block_data_order
  148. #else
  149. adr r3,.Lsha512_block_data_order
  150. #endif
  151. #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
  152. ldr r12,.LOPENSSL_armcap
  153. ldr r12,[r3,r12] @ OPENSSL_armcap_P
  154. #ifdef __APPLE__
  155. ldr r12,[r12]
  156. #endif
  157. tst r12,#ARMV7_NEON
  158. bne .LNEON
  159. #endif
  160. add r2,r1,r2,lsl#7 @ len to point at the end of inp
  161. stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
  162. sub r14,r3,#672 @ K512
  163. sub sp,sp,#9*8
  164. ldr r7,[r0,#32+LO]
  165. ldr r8,[r0,#32+HI]
  166. ldr r9, [r0,#48+LO]
  167. ldr r10, [r0,#48+HI]
  168. ldr r11, [r0,#56+LO]
  169. ldr r12, [r0,#56+HI]
  170. .Loop:
  171. str r9, [sp,#48+0]
  172. str r10, [sp,#48+4]
  173. str r11, [sp,#56+0]
  174. str r12, [sp,#56+4]
  175. ldr r5,[r0,#0+LO]
  176. ldr r6,[r0,#0+HI]
  177. ldr r3,[r0,#8+LO]
  178. ldr r4,[r0,#8+HI]
  179. ldr r9, [r0,#16+LO]
  180. ldr r10, [r0,#16+HI]
  181. ldr r11, [r0,#24+LO]
  182. ldr r12, [r0,#24+HI]
  183. str r3,[sp,#8+0]
  184. str r4,[sp,#8+4]
  185. str r9, [sp,#16+0]
  186. str r10, [sp,#16+4]
  187. str r11, [sp,#24+0]
  188. str r12, [sp,#24+4]
  189. ldr r3,[r0,#40+LO]
  190. ldr r4,[r0,#40+HI]
  191. str r3,[sp,#40+0]
  192. str r4,[sp,#40+4]
  193. .L00_15:
  194. #if __ARM_ARCH__<7
  195. ldrb r3,[r1,#7]
  196. ldrb r9, [r1,#6]
  197. ldrb r10, [r1,#5]
  198. ldrb r11, [r1,#4]
  199. ldrb r4,[r1,#3]
  200. ldrb r12, [r1,#2]
  201. orr r3,r3,r9,lsl#8
  202. ldrb r9, [r1,#1]
  203. orr r3,r3,r10,lsl#16
  204. ldrb r10, [r1],#8
  205. orr r3,r3,r11,lsl#24
  206. orr r4,r4,r12,lsl#8
  207. orr r4,r4,r9,lsl#16
  208. orr r4,r4,r10,lsl#24
  209. #else
  210. ldr r3,[r1,#4]
  211. ldr r4,[r1],#8
  212. #ifdef __ARMEL__
  213. rev r3,r3
  214. rev r4,r4
  215. #endif
  216. #endif
  217. @ Sigma1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41))
  218. @ LO lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23
  219. @ HI hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23
  220. mov r9,r7,lsr#14
  221. str r3,[sp,#64+0]
  222. mov r10,r8,lsr#14
  223. str r4,[sp,#64+4]
  224. eor r9,r9,r8,lsl#18
  225. ldr r11,[sp,#56+0] @ h.lo
  226. eor r10,r10,r7,lsl#18
  227. ldr r12,[sp,#56+4] @ h.hi
  228. eor r9,r9,r7,lsr#18
  229. eor r10,r10,r8,lsr#18
  230. eor r9,r9,r8,lsl#14
  231. eor r10,r10,r7,lsl#14
  232. eor r9,r9,r8,lsr#9
  233. eor r10,r10,r7,lsr#9
  234. eor r9,r9,r7,lsl#23
  235. eor r10,r10,r8,lsl#23 @ Sigma1(e)
  236. adds r3,r3,r9
  237. ldr r9,[sp,#40+0] @ f.lo
  238. adc r4,r4,r10 @ T += Sigma1(e)
  239. ldr r10,[sp,#40+4] @ f.hi
  240. adds r3,r3,r11
  241. ldr r11,[sp,#48+0] @ g.lo
  242. adc r4,r4,r12 @ T += h
  243. ldr r12,[sp,#48+4] @ g.hi
  244. eor r9,r9,r11
  245. str r7,[sp,#32+0]
  246. eor r10,r10,r12
  247. str r8,[sp,#32+4]
  248. and r9,r9,r7
  249. str r5,[sp,#0+0]
  250. and r10,r10,r8
  251. str r6,[sp,#0+4]
  252. eor r9,r9,r11
  253. ldr r11,[r14,#LO] @ K[i].lo
  254. eor r10,r10,r12 @ Ch(e,f,g)
  255. ldr r12,[r14,#HI] @ K[i].hi
  256. adds r3,r3,r9
  257. ldr r7,[sp,#24+0] @ d.lo
  258. adc r4,r4,r10 @ T += Ch(e,f,g)
  259. ldr r8,[sp,#24+4] @ d.hi
  260. adds r3,r3,r11
  261. and r9,r11,#0xff
  262. adc r4,r4,r12 @ T += K[i]
  263. adds r7,r7,r3
  264. ldr r11,[sp,#8+0] @ b.lo
  265. adc r8,r8,r4 @ d += T
  266. teq r9,#148
  267. ldr r12,[sp,#16+0] @ c.lo
  268. #if __ARM_ARCH__>=7
  269. it eq @ Thumb2 thing, sanity check in ARM
  270. #endif
  271. orreq r14,r14,#1
  272. @ Sigma0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39))
  273. @ LO lo>>28^hi<<4 ^ hi>>2^lo<<30 ^ hi>>7^lo<<25
  274. @ HI hi>>28^lo<<4 ^ lo>>2^hi<<30 ^ lo>>7^hi<<25
  275. mov r9,r5,lsr#28
  276. mov r10,r6,lsr#28
  277. eor r9,r9,r6,lsl#4
  278. eor r10,r10,r5,lsl#4
  279. eor r9,r9,r6,lsr#2
  280. eor r10,r10,r5,lsr#2
  281. eor r9,r9,r5,lsl#30
  282. eor r10,r10,r6,lsl#30
  283. eor r9,r9,r6,lsr#7
  284. eor r10,r10,r5,lsr#7
  285. eor r9,r9,r5,lsl#25
  286. eor r10,r10,r6,lsl#25 @ Sigma0(a)
  287. adds r3,r3,r9
  288. and r9,r5,r11
  289. adc r4,r4,r10 @ T += Sigma0(a)
  290. ldr r10,[sp,#8+4] @ b.hi
  291. orr r5,r5,r11
  292. ldr r11,[sp,#16+4] @ c.hi
  293. and r5,r5,r12
  294. and r12,r6,r10
  295. orr r6,r6,r10
  296. orr r5,r5,r9 @ Maj(a,b,c).lo
  297. and r6,r6,r11
  298. adds r5,r5,r3
  299. orr r6,r6,r12 @ Maj(a,b,c).hi
  300. sub sp,sp,#8
  301. adc r6,r6,r4 @ h += T
  302. tst r14,#1
  303. add r14,r14,#8
  304. tst r14,#1
  305. beq .L00_15
  306. ldr r9,[sp,#184+0]
  307. ldr r10,[sp,#184+4]
  308. bic r14,r14,#1
  309. .L16_79:
  310. @ sigma0(x) (ROTR((x),1) ^ ROTR((x),8) ^ ((x)>>7))
  311. @ LO lo>>1^hi<<31 ^ lo>>8^hi<<24 ^ lo>>7^hi<<25
  312. @ HI hi>>1^lo<<31 ^ hi>>8^lo<<24 ^ hi>>7
  313. mov r3,r9,lsr#1
  314. ldr r11,[sp,#80+0]
  315. mov r4,r10,lsr#1
  316. ldr r12,[sp,#80+4]
  317. eor r3,r3,r10,lsl#31
  318. eor r4,r4,r9,lsl#31
  319. eor r3,r3,r9,lsr#8
  320. eor r4,r4,r10,lsr#8
  321. eor r3,r3,r10,lsl#24
  322. eor r4,r4,r9,lsl#24
  323. eor r3,r3,r9,lsr#7
  324. eor r4,r4,r10,lsr#7
  325. eor r3,r3,r10,lsl#25
  326. @ sigma1(x) (ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6))
  327. @ LO lo>>19^hi<<13 ^ hi>>29^lo<<3 ^ lo>>6^hi<<26
  328. @ HI hi>>19^lo<<13 ^ lo>>29^hi<<3 ^ hi>>6
  329. mov r9,r11,lsr#19
  330. mov r10,r12,lsr#19
  331. eor r9,r9,r12,lsl#13
  332. eor r10,r10,r11,lsl#13
  333. eor r9,r9,r12,lsr#29
  334. eor r10,r10,r11,lsr#29
  335. eor r9,r9,r11,lsl#3
  336. eor r10,r10,r12,lsl#3
  337. eor r9,r9,r11,lsr#6
  338. eor r10,r10,r12,lsr#6
  339. ldr r11,[sp,#120+0]
  340. eor r9,r9,r12,lsl#26
  341. ldr r12,[sp,#120+4]
  342. adds r3,r3,r9
  343. ldr r9,[sp,#192+0]
  344. adc r4,r4,r10
  345. ldr r10,[sp,#192+4]
  346. adds r3,r3,r11
  347. adc r4,r4,r12
  348. adds r3,r3,r9
  349. adc r4,r4,r10
  350. @ Sigma1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41))
  351. @ LO lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23
  352. @ HI hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23
  353. mov r9,r7,lsr#14
  354. str r3,[sp,#64+0]
  355. mov r10,r8,lsr#14
  356. str r4,[sp,#64+4]
  357. eor r9,r9,r8,lsl#18
  358. ldr r11,[sp,#56+0] @ h.lo
  359. eor r10,r10,r7,lsl#18
  360. ldr r12,[sp,#56+4] @ h.hi
  361. eor r9,r9,r7,lsr#18
  362. eor r10,r10,r8,lsr#18
  363. eor r9,r9,r8,lsl#14
  364. eor r10,r10,r7,lsl#14
  365. eor r9,r9,r8,lsr#9
  366. eor r10,r10,r7,lsr#9
  367. eor r9,r9,r7,lsl#23
  368. eor r10,r10,r8,lsl#23 @ Sigma1(e)
  369. adds r3,r3,r9
  370. ldr r9,[sp,#40+0] @ f.lo
  371. adc r4,r4,r10 @ T += Sigma1(e)
  372. ldr r10,[sp,#40+4] @ f.hi
  373. adds r3,r3,r11
  374. ldr r11,[sp,#48+0] @ g.lo
  375. adc r4,r4,r12 @ T += h
  376. ldr r12,[sp,#48+4] @ g.hi
  377. eor r9,r9,r11
  378. str r7,[sp,#32+0]
  379. eor r10,r10,r12
  380. str r8,[sp,#32+4]
  381. and r9,r9,r7
  382. str r5,[sp,#0+0]
  383. and r10,r10,r8
  384. str r6,[sp,#0+4]
  385. eor r9,r9,r11
  386. ldr r11,[r14,#LO] @ K[i].lo
  387. eor r10,r10,r12 @ Ch(e,f,g)
  388. ldr r12,[r14,#HI] @ K[i].hi
  389. adds r3,r3,r9
  390. ldr r7,[sp,#24+0] @ d.lo
  391. adc r4,r4,r10 @ T += Ch(e,f,g)
  392. ldr r8,[sp,#24+4] @ d.hi
  393. adds r3,r3,r11
  394. and r9,r11,#0xff
  395. adc r4,r4,r12 @ T += K[i]
  396. adds r7,r7,r3
  397. ldr r11,[sp,#8+0] @ b.lo
  398. adc r8,r8,r4 @ d += T
  399. teq r9,#23
  400. ldr r12,[sp,#16+0] @ c.lo
  401. #if __ARM_ARCH__>=7
  402. it eq @ Thumb2 thing, sanity check in ARM
  403. #endif
  404. orreq r14,r14,#1
  405. @ Sigma0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39))
  406. @ LO lo>>28^hi<<4 ^ hi>>2^lo<<30 ^ hi>>7^lo<<25
  407. @ HI hi>>28^lo<<4 ^ lo>>2^hi<<30 ^ lo>>7^hi<<25
  408. mov r9,r5,lsr#28
  409. mov r10,r6,lsr#28
  410. eor r9,r9,r6,lsl#4
  411. eor r10,r10,r5,lsl#4
  412. eor r9,r9,r6,lsr#2
  413. eor r10,r10,r5,lsr#2
  414. eor r9,r9,r5,lsl#30
  415. eor r10,r10,r6,lsl#30
  416. eor r9,r9,r6,lsr#7
  417. eor r10,r10,r5,lsr#7
  418. eor r9,r9,r5,lsl#25
  419. eor r10,r10,r6,lsl#25 @ Sigma0(a)
  420. adds r3,r3,r9
  421. and r9,r5,r11
  422. adc r4,r4,r10 @ T += Sigma0(a)
  423. ldr r10,[sp,#8+4] @ b.hi
  424. orr r5,r5,r11
  425. ldr r11,[sp,#16+4] @ c.hi
  426. and r5,r5,r12
  427. and r12,r6,r10
  428. orr r6,r6,r10
  429. orr r5,r5,r9 @ Maj(a,b,c).lo
  430. and r6,r6,r11
  431. adds r5,r5,r3
  432. orr r6,r6,r12 @ Maj(a,b,c).hi
  433. sub sp,sp,#8
  434. adc r6,r6,r4 @ h += T
  435. tst r14,#1
  436. add r14,r14,#8
  437. #if __ARM_ARCH__>=7
  438. ittt eq @ Thumb2 thing, sanity check in ARM
  439. #endif
  440. ldreq r9,[sp,#184+0]
  441. ldreq r10,[sp,#184+4]
  442. beq .L16_79
  443. bic r14,r14,#1
  444. ldr r3,[sp,#8+0]
  445. ldr r4,[sp,#8+4]
  446. ldr r9, [r0,#0+LO]
  447. ldr r10, [r0,#0+HI]
  448. ldr r11, [r0,#8+LO]
  449. ldr r12, [r0,#8+HI]
  450. adds r9,r5,r9
  451. str r9, [r0,#0+LO]
  452. adc r10,r6,r10
  453. str r10, [r0,#0+HI]
  454. adds r11,r3,r11
  455. str r11, [r0,#8+LO]
  456. adc r12,r4,r12
  457. str r12, [r0,#8+HI]
  458. ldr r5,[sp,#16+0]
  459. ldr r6,[sp,#16+4]
  460. ldr r3,[sp,#24+0]
  461. ldr r4,[sp,#24+4]
  462. ldr r9, [r0,#16+LO]
  463. ldr r10, [r0,#16+HI]
  464. ldr r11, [r0,#24+LO]
  465. ldr r12, [r0,#24+HI]
  466. adds r9,r5,r9
  467. str r9, [r0,#16+LO]
  468. adc r10,r6,r10
  469. str r10, [r0,#16+HI]
  470. adds r11,r3,r11
  471. str r11, [r0,#24+LO]
  472. adc r12,r4,r12
  473. str r12, [r0,#24+HI]
  474. ldr r3,[sp,#40+0]
  475. ldr r4,[sp,#40+4]
  476. ldr r9, [r0,#32+LO]
  477. ldr r10, [r0,#32+HI]
  478. ldr r11, [r0,#40+LO]
  479. ldr r12, [r0,#40+HI]
  480. adds r7,r7,r9
  481. str r7,[r0,#32+LO]
  482. adc r8,r8,r10
  483. str r8,[r0,#32+HI]
  484. adds r11,r3,r11
  485. str r11, [r0,#40+LO]
  486. adc r12,r4,r12
  487. str r12, [r0,#40+HI]
  488. ldr r5,[sp,#48+0]
  489. ldr r6,[sp,#48+4]
  490. ldr r3,[sp,#56+0]
  491. ldr r4,[sp,#56+4]
  492. ldr r9, [r0,#48+LO]
  493. ldr r10, [r0,#48+HI]
  494. ldr r11, [r0,#56+LO]
  495. ldr r12, [r0,#56+HI]
  496. adds r9,r5,r9
  497. str r9, [r0,#48+LO]
  498. adc r10,r6,r10
  499. str r10, [r0,#48+HI]
  500. adds r11,r3,r11
  501. str r11, [r0,#56+LO]
  502. adc r12,r4,r12
  503. str r12, [r0,#56+HI]
  504. add sp,sp,#640
  505. sub r14,r14,#640
  506. teq r1,r2
  507. bne .Loop
  508. add sp,sp,#8*9 @ destroy frame
  509. #if __ARM_ARCH__>=5
  510. ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc}
  511. #else
  512. ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
  513. tst lr,#1
  514. moveq pc,lr @ be binary compatible with V4, yet
  515. .word 0xe12fff1e @ interoperable with Thumb ISA:-)
  516. #endif
  517. .size sha512_block_data_order,.-sha512_block_data_order
  518. #if __ARM_MAX_ARCH__>=7
  519. .arch armv7-a
  520. .fpu neon
  521. .globl sha512_block_data_order_neon
  522. .hidden sha512_block_data_order_neon
  523. .type sha512_block_data_order_neon,%function
  524. .align 4
  525. sha512_block_data_order_neon:
  526. .LNEON:
  527. dmb @ errata #451034 on early Cortex A8
  528. add r2,r1,r2,lsl#7 @ len to point at the end of inp
  529. adr r3,K512
  530. VFP_ABI_PUSH
  531. vldmia r0,{d16,d17,d18,d19,d20,d21,d22,d23} @ load context
  532. .Loop_neon:
  533. vshr.u64 d24,d20,#14 @ 0
  534. #if 0<16
  535. vld1.64 {d0},[r1]! @ handles unaligned
  536. #endif
  537. vshr.u64 d25,d20,#18
  538. #if 0>0
  539. vadd.i64 d16,d30 @ h+=Maj from the past
  540. #endif
  541. vshr.u64 d26,d20,#41
  542. vld1.64 {d28},[r3,:64]! @ K[i++]
  543. vsli.64 d24,d20,#50
  544. vsli.64 d25,d20,#46
  545. vmov d29,d20
  546. vsli.64 d26,d20,#23
  547. #if 0<16 && defined(__ARMEL__)
  548. vrev64.8 d0,d0
  549. #endif
  550. veor d25,d24
  551. vbsl d29,d21,d22 @ Ch(e,f,g)
  552. vshr.u64 d24,d16,#28
  553. veor d26,d25 @ Sigma1(e)
  554. vadd.i64 d27,d29,d23
  555. vshr.u64 d25,d16,#34
  556. vsli.64 d24,d16,#36
  557. vadd.i64 d27,d26
  558. vshr.u64 d26,d16,#39
  559. vadd.i64 d28,d0
  560. vsli.64 d25,d16,#30
  561. veor d30,d16,d17
  562. vsli.64 d26,d16,#25
  563. veor d23,d24,d25
  564. vadd.i64 d27,d28
  565. vbsl d30,d18,d17 @ Maj(a,b,c)
  566. veor d23,d26 @ Sigma0(a)
  567. vadd.i64 d19,d27
  568. vadd.i64 d30,d27
  569. @ vadd.i64 d23,d30
  570. vshr.u64 d24,d19,#14 @ 1
  571. #if 1<16
  572. vld1.64 {d1},[r1]! @ handles unaligned
  573. #endif
  574. vshr.u64 d25,d19,#18
  575. #if 1>0
  576. vadd.i64 d23,d30 @ h+=Maj from the past
  577. #endif
  578. vshr.u64 d26,d19,#41
  579. vld1.64 {d28},[r3,:64]! @ K[i++]
  580. vsli.64 d24,d19,#50
  581. vsli.64 d25,d19,#46
  582. vmov d29,d19
  583. vsli.64 d26,d19,#23
  584. #if 1<16 && defined(__ARMEL__)
  585. vrev64.8 d1,d1
  586. #endif
  587. veor d25,d24
  588. vbsl d29,d20,d21 @ Ch(e,f,g)
  589. vshr.u64 d24,d23,#28
  590. veor d26,d25 @ Sigma1(e)
  591. vadd.i64 d27,d29,d22
  592. vshr.u64 d25,d23,#34
  593. vsli.64 d24,d23,#36
  594. vadd.i64 d27,d26
  595. vshr.u64 d26,d23,#39
  596. vadd.i64 d28,d1
  597. vsli.64 d25,d23,#30
  598. veor d30,d23,d16
  599. vsli.64 d26,d23,#25
  600. veor d22,d24,d25
  601. vadd.i64 d27,d28
  602. vbsl d30,d17,d16 @ Maj(a,b,c)
  603. veor d22,d26 @ Sigma0(a)
  604. vadd.i64 d18,d27
  605. vadd.i64 d30,d27
  606. @ vadd.i64 d22,d30
  607. vshr.u64 d24,d18,#14 @ 2
  608. #if 2<16
  609. vld1.64 {d2},[r1]! @ handles unaligned
  610. #endif
  611. vshr.u64 d25,d18,#18
  612. #if 2>0
  613. vadd.i64 d22,d30 @ h+=Maj from the past
  614. #endif
  615. vshr.u64 d26,d18,#41
  616. vld1.64 {d28},[r3,:64]! @ K[i++]
  617. vsli.64 d24,d18,#50
  618. vsli.64 d25,d18,#46
  619. vmov d29,d18
  620. vsli.64 d26,d18,#23
  621. #if 2<16 && defined(__ARMEL__)
  622. vrev64.8 d2,d2
  623. #endif
  624. veor d25,d24
  625. vbsl d29,d19,d20 @ Ch(e,f,g)
  626. vshr.u64 d24,d22,#28
  627. veor d26,d25 @ Sigma1(e)
  628. vadd.i64 d27,d29,d21
  629. vshr.u64 d25,d22,#34
  630. vsli.64 d24,d22,#36
  631. vadd.i64 d27,d26
  632. vshr.u64 d26,d22,#39
  633. vadd.i64 d28,d2
  634. vsli.64 d25,d22,#30
  635. veor d30,d22,d23
  636. vsli.64 d26,d22,#25
  637. veor d21,d24,d25
  638. vadd.i64 d27,d28
  639. vbsl d30,d16,d23 @ Maj(a,b,c)
  640. veor d21,d26 @ Sigma0(a)
  641. vadd.i64 d17,d27
  642. vadd.i64 d30,d27
  643. @ vadd.i64 d21,d30
  644. vshr.u64 d24,d17,#14 @ 3
  645. #if 3<16
  646. vld1.64 {d3},[r1]! @ handles unaligned
  647. #endif
  648. vshr.u64 d25,d17,#18
  649. #if 3>0
  650. vadd.i64 d21,d30 @ h+=Maj from the past
  651. #endif
  652. vshr.u64 d26,d17,#41
  653. vld1.64 {d28},[r3,:64]! @ K[i++]
  654. vsli.64 d24,d17,#50
  655. vsli.64 d25,d17,#46
  656. vmov d29,d17
  657. vsli.64 d26,d17,#23
  658. #if 3<16 && defined(__ARMEL__)
  659. vrev64.8 d3,d3
  660. #endif
  661. veor d25,d24
  662. vbsl d29,d18,d19 @ Ch(e,f,g)
  663. vshr.u64 d24,d21,#28
  664. veor d26,d25 @ Sigma1(e)
  665. vadd.i64 d27,d29,d20
  666. vshr.u64 d25,d21,#34
  667. vsli.64 d24,d21,#36
  668. vadd.i64 d27,d26
  669. vshr.u64 d26,d21,#39
  670. vadd.i64 d28,d3
  671. vsli.64 d25,d21,#30
  672. veor d30,d21,d22
  673. vsli.64 d26,d21,#25
  674. veor d20,d24,d25
  675. vadd.i64 d27,d28
  676. vbsl d30,d23,d22 @ Maj(a,b,c)
  677. veor d20,d26 @ Sigma0(a)
  678. vadd.i64 d16,d27
  679. vadd.i64 d30,d27
  680. @ vadd.i64 d20,d30
  681. vshr.u64 d24,d16,#14 @ 4
  682. #if 4<16
  683. vld1.64 {d4},[r1]! @ handles unaligned
  684. #endif
  685. vshr.u64 d25,d16,#18
  686. #if 4>0
  687. vadd.i64 d20,d30 @ h+=Maj from the past
  688. #endif
  689. vshr.u64 d26,d16,#41
  690. vld1.64 {d28},[r3,:64]! @ K[i++]
  691. vsli.64 d24,d16,#50
  692. vsli.64 d25,d16,#46
  693. vmov d29,d16
  694. vsli.64 d26,d16,#23
  695. #if 4<16 && defined(__ARMEL__)
  696. vrev64.8 d4,d4
  697. #endif
  698. veor d25,d24
  699. vbsl d29,d17,d18 @ Ch(e,f,g)
  700. vshr.u64 d24,d20,#28
  701. veor d26,d25 @ Sigma1(e)
  702. vadd.i64 d27,d29,d19
  703. vshr.u64 d25,d20,#34
  704. vsli.64 d24,d20,#36
  705. vadd.i64 d27,d26
  706. vshr.u64 d26,d20,#39
  707. vadd.i64 d28,d4
  708. vsli.64 d25,d20,#30
  709. veor d30,d20,d21
  710. vsli.64 d26,d20,#25
  711. veor d19,d24,d25
  712. vadd.i64 d27,d28
  713. vbsl d30,d22,d21 @ Maj(a,b,c)
  714. veor d19,d26 @ Sigma0(a)
  715. vadd.i64 d23,d27
  716. vadd.i64 d30,d27
  717. @ vadd.i64 d19,d30
  718. vshr.u64 d24,d23,#14 @ 5
  719. #if 5<16
  720. vld1.64 {d5},[r1]! @ handles unaligned
  721. #endif
  722. vshr.u64 d25,d23,#18
  723. #if 5>0
  724. vadd.i64 d19,d30 @ h+=Maj from the past
  725. #endif
  726. vshr.u64 d26,d23,#41
  727. vld1.64 {d28},[r3,:64]! @ K[i++]
  728. vsli.64 d24,d23,#50
  729. vsli.64 d25,d23,#46
  730. vmov d29,d23
  731. vsli.64 d26,d23,#23
  732. #if 5<16 && defined(__ARMEL__)
  733. vrev64.8 d5,d5
  734. #endif
  735. veor d25,d24
  736. vbsl d29,d16,d17 @ Ch(e,f,g)
  737. vshr.u64 d24,d19,#28
  738. veor d26,d25 @ Sigma1(e)
  739. vadd.i64 d27,d29,d18
  740. vshr.u64 d25,d19,#34
  741. vsli.64 d24,d19,#36
  742. vadd.i64 d27,d26
  743. vshr.u64 d26,d19,#39
  744. vadd.i64 d28,d5
  745. vsli.64 d25,d19,#30
  746. veor d30,d19,d20
  747. vsli.64 d26,d19,#25
  748. veor d18,d24,d25
  749. vadd.i64 d27,d28
  750. vbsl d30,d21,d20 @ Maj(a,b,c)
  751. veor d18,d26 @ Sigma0(a)
  752. vadd.i64 d22,d27
  753. vadd.i64 d30,d27
  754. @ vadd.i64 d18,d30
  755. vshr.u64 d24,d22,#14 @ 6
  756. #if 6<16
  757. vld1.64 {d6},[r1]! @ handles unaligned
  758. #endif
  759. vshr.u64 d25,d22,#18
  760. #if 6>0
  761. vadd.i64 d18,d30 @ h+=Maj from the past
  762. #endif
  763. vshr.u64 d26,d22,#41
  764. vld1.64 {d28},[r3,:64]! @ K[i++]
  765. vsli.64 d24,d22,#50
  766. vsli.64 d25,d22,#46
  767. vmov d29,d22
  768. vsli.64 d26,d22,#23
  769. #if 6<16 && defined(__ARMEL__)
  770. vrev64.8 d6,d6
  771. #endif
  772. veor d25,d24
  773. vbsl d29,d23,d16 @ Ch(e,f,g)
  774. vshr.u64 d24,d18,#28
  775. veor d26,d25 @ Sigma1(e)
  776. vadd.i64 d27,d29,d17
  777. vshr.u64 d25,d18,#34
  778. vsli.64 d24,d18,#36
  779. vadd.i64 d27,d26
  780. vshr.u64 d26,d18,#39
  781. vadd.i64 d28,d6
  782. vsli.64 d25,d18,#30
  783. veor d30,d18,d19
  784. vsli.64 d26,d18,#25
  785. veor d17,d24,d25
  786. vadd.i64 d27,d28
  787. vbsl d30,d20,d19 @ Maj(a,b,c)
  788. veor d17,d26 @ Sigma0(a)
  789. vadd.i64 d21,d27
  790. vadd.i64 d30,d27
  791. @ vadd.i64 d17,d30
  792. vshr.u64 d24,d21,#14 @ 7
  793. #if 7<16
  794. vld1.64 {d7},[r1]! @ handles unaligned
  795. #endif
  796. vshr.u64 d25,d21,#18
  797. #if 7>0
  798. vadd.i64 d17,d30 @ h+=Maj from the past
  799. #endif
  800. vshr.u64 d26,d21,#41
  801. vld1.64 {d28},[r3,:64]! @ K[i++]
  802. vsli.64 d24,d21,#50
  803. vsli.64 d25,d21,#46
  804. vmov d29,d21
  805. vsli.64 d26,d21,#23
  806. #if 7<16 && defined(__ARMEL__)
  807. vrev64.8 d7,d7
  808. #endif
  809. veor d25,d24
  810. vbsl d29,d22,d23 @ Ch(e,f,g)
  811. vshr.u64 d24,d17,#28
  812. veor d26,d25 @ Sigma1(e)
  813. vadd.i64 d27,d29,d16
  814. vshr.u64 d25,d17,#34
  815. vsli.64 d24,d17,#36
  816. vadd.i64 d27,d26
  817. vshr.u64 d26,d17,#39
  818. vadd.i64 d28,d7
  819. vsli.64 d25,d17,#30
  820. veor d30,d17,d18
  821. vsli.64 d26,d17,#25
  822. veor d16,d24,d25
  823. vadd.i64 d27,d28
  824. vbsl d30,d19,d18 @ Maj(a,b,c)
  825. veor d16,d26 @ Sigma0(a)
  826. vadd.i64 d20,d27
  827. vadd.i64 d30,d27
  828. @ vadd.i64 d16,d30
  829. vshr.u64 d24,d20,#14 @ 8
  830. #if 8<16
  831. vld1.64 {d8},[r1]! @ handles unaligned
  832. #endif
  833. vshr.u64 d25,d20,#18
  834. #if 8>0
  835. vadd.i64 d16,d30 @ h+=Maj from the past
  836. #endif
  837. vshr.u64 d26,d20,#41
  838. vld1.64 {d28},[r3,:64]! @ K[i++]
  839. vsli.64 d24,d20,#50
  840. vsli.64 d25,d20,#46
  841. vmov d29,d20
  842. vsli.64 d26,d20,#23
  843. #if 8<16 && defined(__ARMEL__)
  844. vrev64.8 d8,d8
  845. #endif
  846. veor d25,d24
  847. vbsl d29,d21,d22 @ Ch(e,f,g)
  848. vshr.u64 d24,d16,#28
  849. veor d26,d25 @ Sigma1(e)
  850. vadd.i64 d27,d29,d23
  851. vshr.u64 d25,d16,#34
  852. vsli.64 d24,d16,#36
  853. vadd.i64 d27,d26
  854. vshr.u64 d26,d16,#39
  855. vadd.i64 d28,d8
  856. vsli.64 d25,d16,#30
  857. veor d30,d16,d17
  858. vsli.64 d26,d16,#25
  859. veor d23,d24,d25
  860. vadd.i64 d27,d28
  861. vbsl d30,d18,d17 @ Maj(a,b,c)
  862. veor d23,d26 @ Sigma0(a)
  863. vadd.i64 d19,d27
  864. vadd.i64 d30,d27
  865. @ vadd.i64 d23,d30
  866. vshr.u64 d24,d19,#14 @ 9
  867. #if 9<16
  868. vld1.64 {d9},[r1]! @ handles unaligned
  869. #endif
  870. vshr.u64 d25,d19,#18
  871. #if 9>0
  872. vadd.i64 d23,d30 @ h+=Maj from the past
  873. #endif
  874. vshr.u64 d26,d19,#41
  875. vld1.64 {d28},[r3,:64]! @ K[i++]
  876. vsli.64 d24,d19,#50
  877. vsli.64 d25,d19,#46
  878. vmov d29,d19
  879. vsli.64 d26,d19,#23
  880. #if 9<16 && defined(__ARMEL__)
  881. vrev64.8 d9,d9
  882. #endif
  883. veor d25,d24
  884. vbsl d29,d20,d21 @ Ch(e,f,g)
  885. vshr.u64 d24,d23,#28
  886. veor d26,d25 @ Sigma1(e)
  887. vadd.i64 d27,d29,d22
  888. vshr.u64 d25,d23,#34
  889. vsli.64 d24,d23,#36
  890. vadd.i64 d27,d26
  891. vshr.u64 d26,d23,#39
  892. vadd.i64 d28,d9
  893. vsli.64 d25,d23,#30
  894. veor d30,d23,d16
  895. vsli.64 d26,d23,#25
  896. veor d22,d24,d25
  897. vadd.i64 d27,d28
  898. vbsl d30,d17,d16 @ Maj(a,b,c)
  899. veor d22,d26 @ Sigma0(a)
  900. vadd.i64 d18,d27
  901. vadd.i64 d30,d27
  902. @ vadd.i64 d22,d30
  903. vshr.u64 d24,d18,#14 @ 10
  904. #if 10<16
  905. vld1.64 {d10},[r1]! @ handles unaligned
  906. #endif
  907. vshr.u64 d25,d18,#18
  908. #if 10>0
  909. vadd.i64 d22,d30 @ h+=Maj from the past
  910. #endif
  911. vshr.u64 d26,d18,#41
  912. vld1.64 {d28},[r3,:64]! @ K[i++]
  913. vsli.64 d24,d18,#50
  914. vsli.64 d25,d18,#46
  915. vmov d29,d18
  916. vsli.64 d26,d18,#23
  917. #if 10<16 && defined(__ARMEL__)
  918. vrev64.8 d10,d10
  919. #endif
  920. veor d25,d24
  921. vbsl d29,d19,d20 @ Ch(e,f,g)
  922. vshr.u64 d24,d22,#28
  923. veor d26,d25 @ Sigma1(e)
  924. vadd.i64 d27,d29,d21
  925. vshr.u64 d25,d22,#34
  926. vsli.64 d24,d22,#36
  927. vadd.i64 d27,d26
  928. vshr.u64 d26,d22,#39
  929. vadd.i64 d28,d10
  930. vsli.64 d25,d22,#30
  931. veor d30,d22,d23
  932. vsli.64 d26,d22,#25
  933. veor d21,d24,d25
  934. vadd.i64 d27,d28
  935. vbsl d30,d16,d23 @ Maj(a,b,c)
  936. veor d21,d26 @ Sigma0(a)
  937. vadd.i64 d17,d27
  938. vadd.i64 d30,d27
  939. @ vadd.i64 d21,d30
  940. vshr.u64 d24,d17,#14 @ 11
  941. #if 11<16
  942. vld1.64 {d11},[r1]! @ handles unaligned
  943. #endif
  944. vshr.u64 d25,d17,#18
  945. #if 11>0
  946. vadd.i64 d21,d30 @ h+=Maj from the past
  947. #endif
  948. vshr.u64 d26,d17,#41
  949. vld1.64 {d28},[r3,:64]! @ K[i++]
  950. vsli.64 d24,d17,#50
  951. vsli.64 d25,d17,#46
  952. vmov d29,d17
  953. vsli.64 d26,d17,#23
  954. #if 11<16 && defined(__ARMEL__)
  955. vrev64.8 d11,d11
  956. #endif
  957. veor d25,d24
  958. vbsl d29,d18,d19 @ Ch(e,f,g)
  959. vshr.u64 d24,d21,#28
  960. veor d26,d25 @ Sigma1(e)
  961. vadd.i64 d27,d29,d20
  962. vshr.u64 d25,d21,#34
  963. vsli.64 d24,d21,#36
  964. vadd.i64 d27,d26
  965. vshr.u64 d26,d21,#39
  966. vadd.i64 d28,d11
  967. vsli.64 d25,d21,#30
  968. veor d30,d21,d22
  969. vsli.64 d26,d21,#25
  970. veor d20,d24,d25
  971. vadd.i64 d27,d28
  972. vbsl d30,d23,d22 @ Maj(a,b,c)
  973. veor d20,d26 @ Sigma0(a)
  974. vadd.i64 d16,d27
  975. vadd.i64 d30,d27
  976. @ vadd.i64 d20,d30
  977. vshr.u64 d24,d16,#14 @ 12
  978. #if 12<16
  979. vld1.64 {d12},[r1]! @ handles unaligned
  980. #endif
  981. vshr.u64 d25,d16,#18
  982. #if 12>0
  983. vadd.i64 d20,d30 @ h+=Maj from the past
  984. #endif
  985. vshr.u64 d26,d16,#41
  986. vld1.64 {d28},[r3,:64]! @ K[i++]
  987. vsli.64 d24,d16,#50
  988. vsli.64 d25,d16,#46
  989. vmov d29,d16
  990. vsli.64 d26,d16,#23
  991. #if 12<16 && defined(__ARMEL__)
  992. vrev64.8 d12,d12
  993. #endif
  994. veor d25,d24
  995. vbsl d29,d17,d18 @ Ch(e,f,g)
  996. vshr.u64 d24,d20,#28
  997. veor d26,d25 @ Sigma1(e)
  998. vadd.i64 d27,d29,d19
  999. vshr.u64 d25,d20,#34
  1000. vsli.64 d24,d20,#36
  1001. vadd.i64 d27,d26
  1002. vshr.u64 d26,d20,#39
  1003. vadd.i64 d28,d12
  1004. vsli.64 d25,d20,#30
  1005. veor d30,d20,d21
  1006. vsli.64 d26,d20,#25
  1007. veor d19,d24,d25
  1008. vadd.i64 d27,d28
  1009. vbsl d30,d22,d21 @ Maj(a,b,c)
  1010. veor d19,d26 @ Sigma0(a)
  1011. vadd.i64 d23,d27
  1012. vadd.i64 d30,d27
  1013. @ vadd.i64 d19,d30
  1014. vshr.u64 d24,d23,#14 @ 13
  1015. #if 13<16
  1016. vld1.64 {d13},[r1]! @ handles unaligned
  1017. #endif
  1018. vshr.u64 d25,d23,#18
  1019. #if 13>0
  1020. vadd.i64 d19,d30 @ h+=Maj from the past
  1021. #endif
  1022. vshr.u64 d26,d23,#41
  1023. vld1.64 {d28},[r3,:64]! @ K[i++]
  1024. vsli.64 d24,d23,#50
  1025. vsli.64 d25,d23,#46
  1026. vmov d29,d23
  1027. vsli.64 d26,d23,#23
  1028. #if 13<16 && defined(__ARMEL__)
  1029. vrev64.8 d13,d13
  1030. #endif
  1031. veor d25,d24
  1032. vbsl d29,d16,d17 @ Ch(e,f,g)
  1033. vshr.u64 d24,d19,#28
  1034. veor d26,d25 @ Sigma1(e)
  1035. vadd.i64 d27,d29,d18
  1036. vshr.u64 d25,d19,#34
  1037. vsli.64 d24,d19,#36
  1038. vadd.i64 d27,d26
  1039. vshr.u64 d26,d19,#39
  1040. vadd.i64 d28,d13
  1041. vsli.64 d25,d19,#30
  1042. veor d30,d19,d20
  1043. vsli.64 d26,d19,#25
  1044. veor d18,d24,d25
  1045. vadd.i64 d27,d28
  1046. vbsl d30,d21,d20 @ Maj(a,b,c)
  1047. veor d18,d26 @ Sigma0(a)
  1048. vadd.i64 d22,d27
  1049. vadd.i64 d30,d27
  1050. @ vadd.i64 d18,d30
  1051. vshr.u64 d24,d22,#14 @ 14
  1052. #if 14<16
  1053. vld1.64 {d14},[r1]! @ handles unaligned
  1054. #endif
  1055. vshr.u64 d25,d22,#18
  1056. #if 14>0
  1057. vadd.i64 d18,d30 @ h+=Maj from the past
  1058. #endif
  1059. vshr.u64 d26,d22,#41
  1060. vld1.64 {d28},[r3,:64]! @ K[i++]
  1061. vsli.64 d24,d22,#50
  1062. vsli.64 d25,d22,#46
  1063. vmov d29,d22
  1064. vsli.64 d26,d22,#23
  1065. #if 14<16 && defined(__ARMEL__)
  1066. vrev64.8 d14,d14
  1067. #endif
  1068. veor d25,d24
  1069. vbsl d29,d23,d16 @ Ch(e,f,g)
  1070. vshr.u64 d24,d18,#28
  1071. veor d26,d25 @ Sigma1(e)
  1072. vadd.i64 d27,d29,d17
  1073. vshr.u64 d25,d18,#34
  1074. vsli.64 d24,d18,#36
  1075. vadd.i64 d27,d26
  1076. vshr.u64 d26,d18,#39
  1077. vadd.i64 d28,d14
  1078. vsli.64 d25,d18,#30
  1079. veor d30,d18,d19
  1080. vsli.64 d26,d18,#25
  1081. veor d17,d24,d25
  1082. vadd.i64 d27,d28
  1083. vbsl d30,d20,d19 @ Maj(a,b,c)
  1084. veor d17,d26 @ Sigma0(a)
  1085. vadd.i64 d21,d27
  1086. vadd.i64 d30,d27
  1087. @ vadd.i64 d17,d30
  1088. vshr.u64 d24,d21,#14 @ 15
  1089. #if 15<16
  1090. vld1.64 {d15},[r1]! @ handles unaligned
  1091. #endif
  1092. vshr.u64 d25,d21,#18
  1093. #if 15>0
  1094. vadd.i64 d17,d30 @ h+=Maj from the past
  1095. #endif
  1096. vshr.u64 d26,d21,#41
  1097. vld1.64 {d28},[r3,:64]! @ K[i++]
  1098. vsli.64 d24,d21,#50
  1099. vsli.64 d25,d21,#46
  1100. vmov d29,d21
  1101. vsli.64 d26,d21,#23
  1102. #if 15<16 && defined(__ARMEL__)
  1103. vrev64.8 d15,d15
  1104. #endif
  1105. veor d25,d24
  1106. vbsl d29,d22,d23 @ Ch(e,f,g)
  1107. vshr.u64 d24,d17,#28
  1108. veor d26,d25 @ Sigma1(e)
  1109. vadd.i64 d27,d29,d16
  1110. vshr.u64 d25,d17,#34
  1111. vsli.64 d24,d17,#36
  1112. vadd.i64 d27,d26
  1113. vshr.u64 d26,d17,#39
  1114. vadd.i64 d28,d15
  1115. vsli.64 d25,d17,#30
  1116. veor d30,d17,d18
  1117. vsli.64 d26,d17,#25
  1118. veor d16,d24,d25
  1119. vadd.i64 d27,d28
  1120. vbsl d30,d19,d18 @ Maj(a,b,c)
  1121. veor d16,d26 @ Sigma0(a)
  1122. vadd.i64 d20,d27
  1123. vadd.i64 d30,d27
  1124. @ vadd.i64 d16,d30
  1125. mov r12,#4
  1126. .L16_79_neon:
  1127. subs r12,#1
  1128. vshr.u64 q12,q7,#19
  1129. vshr.u64 q13,q7,#61
  1130. vadd.i64 d16,d30 @ h+=Maj from the past
  1131. vshr.u64 q15,q7,#6
  1132. vsli.64 q12,q7,#45
  1133. vext.8 q14,q0,q1,#8 @ X[i+1]
  1134. vsli.64 q13,q7,#3
  1135. veor q15,q12
  1136. vshr.u64 q12,q14,#1
  1137. veor q15,q13 @ sigma1(X[i+14])
  1138. vshr.u64 q13,q14,#8
  1139. vadd.i64 q0,q15
  1140. vshr.u64 q15,q14,#7
  1141. vsli.64 q12,q14,#63
  1142. vsli.64 q13,q14,#56
  1143. vext.8 q14,q4,q5,#8 @ X[i+9]
  1144. veor q15,q12
  1145. vshr.u64 d24,d20,#14 @ from NEON_00_15
  1146. vadd.i64 q0,q14
  1147. vshr.u64 d25,d20,#18 @ from NEON_00_15
  1148. veor q15,q13 @ sigma0(X[i+1])
  1149. vshr.u64 d26,d20,#41 @ from NEON_00_15
  1150. vadd.i64 q0,q15
  1151. vld1.64 {d28},[r3,:64]! @ K[i++]
  1152. vsli.64 d24,d20,#50
  1153. vsli.64 d25,d20,#46
  1154. vmov d29,d20
  1155. vsli.64 d26,d20,#23
  1156. #if 16<16 && defined(__ARMEL__)
  1157. vrev64.8 ,
  1158. #endif
  1159. veor d25,d24
  1160. vbsl d29,d21,d22 @ Ch(e,f,g)
  1161. vshr.u64 d24,d16,#28
  1162. veor d26,d25 @ Sigma1(e)
  1163. vadd.i64 d27,d29,d23
  1164. vshr.u64 d25,d16,#34
  1165. vsli.64 d24,d16,#36
  1166. vadd.i64 d27,d26
  1167. vshr.u64 d26,d16,#39
  1168. vadd.i64 d28,d0
  1169. vsli.64 d25,d16,#30
  1170. veor d30,d16,d17
  1171. vsli.64 d26,d16,#25
  1172. veor d23,d24,d25
  1173. vadd.i64 d27,d28
  1174. vbsl d30,d18,d17 @ Maj(a,b,c)
  1175. veor d23,d26 @ Sigma0(a)
  1176. vadd.i64 d19,d27
  1177. vadd.i64 d30,d27
  1178. @ vadd.i64 d23,d30
  1179. vshr.u64 d24,d19,#14 @ 17
  1180. #if 17<16
  1181. vld1.64 {d1},[r1]! @ handles unaligned
  1182. #endif
  1183. vshr.u64 d25,d19,#18
  1184. #if 17>0
  1185. vadd.i64 d23,d30 @ h+=Maj from the past
  1186. #endif
  1187. vshr.u64 d26,d19,#41
  1188. vld1.64 {d28},[r3,:64]! @ K[i++]
  1189. vsli.64 d24,d19,#50
  1190. vsli.64 d25,d19,#46
  1191. vmov d29,d19
  1192. vsli.64 d26,d19,#23
  1193. #if 17<16 && defined(__ARMEL__)
  1194. vrev64.8 ,
  1195. #endif
  1196. veor d25,d24
  1197. vbsl d29,d20,d21 @ Ch(e,f,g)
  1198. vshr.u64 d24,d23,#28
  1199. veor d26,d25 @ Sigma1(e)
  1200. vadd.i64 d27,d29,d22
  1201. vshr.u64 d25,d23,#34
  1202. vsli.64 d24,d23,#36
  1203. vadd.i64 d27,d26
  1204. vshr.u64 d26,d23,#39
  1205. vadd.i64 d28,d1
  1206. vsli.64 d25,d23,#30
  1207. veor d30,d23,d16
  1208. vsli.64 d26,d23,#25
  1209. veor d22,d24,d25
  1210. vadd.i64 d27,d28
  1211. vbsl d30,d17,d16 @ Maj(a,b,c)
  1212. veor d22,d26 @ Sigma0(a)
  1213. vadd.i64 d18,d27
  1214. vadd.i64 d30,d27
  1215. @ vadd.i64 d22,d30
  1216. vshr.u64 q12,q0,#19
  1217. vshr.u64 q13,q0,#61
  1218. vadd.i64 d22,d30 @ h+=Maj from the past
  1219. vshr.u64 q15,q0,#6
  1220. vsli.64 q12,q0,#45
  1221. vext.8 q14,q1,q2,#8 @ X[i+1]
  1222. vsli.64 q13,q0,#3
  1223. veor q15,q12
  1224. vshr.u64 q12,q14,#1
  1225. veor q15,q13 @ sigma1(X[i+14])
  1226. vshr.u64 q13,q14,#8
  1227. vadd.i64 q1,q15
  1228. vshr.u64 q15,q14,#7
  1229. vsli.64 q12,q14,#63
  1230. vsli.64 q13,q14,#56
  1231. vext.8 q14,q5,q6,#8 @ X[i+9]
  1232. veor q15,q12
  1233. vshr.u64 d24,d18,#14 @ from NEON_00_15
  1234. vadd.i64 q1,q14
  1235. vshr.u64 d25,d18,#18 @ from NEON_00_15
  1236. veor q15,q13 @ sigma0(X[i+1])
  1237. vshr.u64 d26,d18,#41 @ from NEON_00_15
  1238. vadd.i64 q1,q15
  1239. vld1.64 {d28},[r3,:64]! @ K[i++]
  1240. vsli.64 d24,d18,#50
  1241. vsli.64 d25,d18,#46
  1242. vmov d29,d18
  1243. vsli.64 d26,d18,#23
  1244. #if 18<16 && defined(__ARMEL__)
  1245. vrev64.8 ,
  1246. #endif
  1247. veor d25,d24
  1248. vbsl d29,d19,d20 @ Ch(e,f,g)
  1249. vshr.u64 d24,d22,#28
  1250. veor d26,d25 @ Sigma1(e)
  1251. vadd.i64 d27,d29,d21
  1252. vshr.u64 d25,d22,#34
  1253. vsli.64 d24,d22,#36
  1254. vadd.i64 d27,d26
  1255. vshr.u64 d26,d22,#39
  1256. vadd.i64 d28,d2
  1257. vsli.64 d25,d22,#30
  1258. veor d30,d22,d23
  1259. vsli.64 d26,d22,#25
  1260. veor d21,d24,d25
  1261. vadd.i64 d27,d28
  1262. vbsl d30,d16,d23 @ Maj(a,b,c)
  1263. veor d21,d26 @ Sigma0(a)
  1264. vadd.i64 d17,d27
  1265. vadd.i64 d30,d27
  1266. @ vadd.i64 d21,d30
  1267. vshr.u64 d24,d17,#14 @ 19
  1268. #if 19<16
  1269. vld1.64 {d3},[r1]! @ handles unaligned
  1270. #endif
  1271. vshr.u64 d25,d17,#18
  1272. #if 19>0
  1273. vadd.i64 d21,d30 @ h+=Maj from the past
  1274. #endif
  1275. vshr.u64 d26,d17,#41
  1276. vld1.64 {d28},[r3,:64]! @ K[i++]
  1277. vsli.64 d24,d17,#50
  1278. vsli.64 d25,d17,#46
  1279. vmov d29,d17
  1280. vsli.64 d26,d17,#23
  1281. #if 19<16 && defined(__ARMEL__)
  1282. vrev64.8 ,
  1283. #endif
  1284. veor d25,d24
  1285. vbsl d29,d18,d19 @ Ch(e,f,g)
  1286. vshr.u64 d24,d21,#28
  1287. veor d26,d25 @ Sigma1(e)
  1288. vadd.i64 d27,d29,d20
  1289. vshr.u64 d25,d21,#34
  1290. vsli.64 d24,d21,#36
  1291. vadd.i64 d27,d26
  1292. vshr.u64 d26,d21,#39
  1293. vadd.i64 d28,d3
  1294. vsli.64 d25,d21,#30
  1295. veor d30,d21,d22
  1296. vsli.64 d26,d21,#25
  1297. veor d20,d24,d25
  1298. vadd.i64 d27,d28
  1299. vbsl d30,d23,d22 @ Maj(a,b,c)
  1300. veor d20,d26 @ Sigma0(a)
  1301. vadd.i64 d16,d27
  1302. vadd.i64 d30,d27
  1303. @ vadd.i64 d20,d30
  1304. vshr.u64 q12,q1,#19
  1305. vshr.u64 q13,q1,#61
  1306. vadd.i64 d20,d30 @ h+=Maj from the past
  1307. vshr.u64 q15,q1,#6
  1308. vsli.64 q12,q1,#45
  1309. vext.8 q14,q2,q3,#8 @ X[i+1]
  1310. vsli.64 q13,q1,#3
  1311. veor q15,q12
  1312. vshr.u64 q12,q14,#1
  1313. veor q15,q13 @ sigma1(X[i+14])
  1314. vshr.u64 q13,q14,#8
  1315. vadd.i64 q2,q15
  1316. vshr.u64 q15,q14,#7
  1317. vsli.64 q12,q14,#63
  1318. vsli.64 q13,q14,#56
  1319. vext.8 q14,q6,q7,#8 @ X[i+9]
  1320. veor q15,q12
  1321. vshr.u64 d24,d16,#14 @ from NEON_00_15
  1322. vadd.i64 q2,q14
  1323. vshr.u64 d25,d16,#18 @ from NEON_00_15
  1324. veor q15,q13 @ sigma0(X[i+1])
  1325. vshr.u64 d26,d16,#41 @ from NEON_00_15
  1326. vadd.i64 q2,q15
  1327. vld1.64 {d28},[r3,:64]! @ K[i++]
  1328. vsli.64 d24,d16,#50
  1329. vsli.64 d25,d16,#46
  1330. vmov d29,d16
  1331. vsli.64 d26,d16,#23
  1332. #if 20<16 && defined(__ARMEL__)
  1333. vrev64.8 ,
  1334. #endif
  1335. veor d25,d24
  1336. vbsl d29,d17,d18 @ Ch(e,f,g)
  1337. vshr.u64 d24,d20,#28
  1338. veor d26,d25 @ Sigma1(e)
  1339. vadd.i64 d27,d29,d19
  1340. vshr.u64 d25,d20,#34
  1341. vsli.64 d24,d20,#36
  1342. vadd.i64 d27,d26
  1343. vshr.u64 d26,d20,#39
  1344. vadd.i64 d28,d4
  1345. vsli.64 d25,d20,#30
  1346. veor d30,d20,d21
  1347. vsli.64 d26,d20,#25
  1348. veor d19,d24,d25
  1349. vadd.i64 d27,d28
  1350. vbsl d30,d22,d21 @ Maj(a,b,c)
  1351. veor d19,d26 @ Sigma0(a)
  1352. vadd.i64 d23,d27
  1353. vadd.i64 d30,d27
  1354. @ vadd.i64 d19,d30
  1355. vshr.u64 d24,d23,#14 @ 21
  1356. #if 21<16
  1357. vld1.64 {d5},[r1]! @ handles unaligned
  1358. #endif
  1359. vshr.u64 d25,d23,#18
  1360. #if 21>0
  1361. vadd.i64 d19,d30 @ h+=Maj from the past
  1362. #endif
  1363. vshr.u64 d26,d23,#41
  1364. vld1.64 {d28},[r3,:64]! @ K[i++]
  1365. vsli.64 d24,d23,#50
  1366. vsli.64 d25,d23,#46
  1367. vmov d29,d23
  1368. vsli.64 d26,d23,#23
  1369. #if 21<16 && defined(__ARMEL__)
  1370. vrev64.8 ,
  1371. #endif
  1372. veor d25,d24
  1373. vbsl d29,d16,d17 @ Ch(e,f,g)
  1374. vshr.u64 d24,d19,#28
  1375. veor d26,d25 @ Sigma1(e)
  1376. vadd.i64 d27,d29,d18
  1377. vshr.u64 d25,d19,#34
  1378. vsli.64 d24,d19,#36
  1379. vadd.i64 d27,d26
  1380. vshr.u64 d26,d19,#39
  1381. vadd.i64 d28,d5
  1382. vsli.64 d25,d19,#30
  1383. veor d30,d19,d20
  1384. vsli.64 d26,d19,#25
  1385. veor d18,d24,d25
  1386. vadd.i64 d27,d28
  1387. vbsl d30,d21,d20 @ Maj(a,b,c)
  1388. veor d18,d26 @ Sigma0(a)
  1389. vadd.i64 d22,d27
  1390. vadd.i64 d30,d27
  1391. @ vadd.i64 d18,d30
  1392. vshr.u64 q12,q2,#19
  1393. vshr.u64 q13,q2,#61
  1394. vadd.i64 d18,d30 @ h+=Maj from the past
  1395. vshr.u64 q15,q2,#6
  1396. vsli.64 q12,q2,#45
  1397. vext.8 q14,q3,q4,#8 @ X[i+1]
  1398. vsli.64 q13,q2,#3
  1399. veor q15,q12
  1400. vshr.u64 q12,q14,#1
  1401. veor q15,q13 @ sigma1(X[i+14])
  1402. vshr.u64 q13,q14,#8
  1403. vadd.i64 q3,q15
  1404. vshr.u64 q15,q14,#7
  1405. vsli.64 q12,q14,#63
  1406. vsli.64 q13,q14,#56
  1407. vext.8 q14,q7,q0,#8 @ X[i+9]
  1408. veor q15,q12
  1409. vshr.u64 d24,d22,#14 @ from NEON_00_15
  1410. vadd.i64 q3,q14
  1411. vshr.u64 d25,d22,#18 @ from NEON_00_15
  1412. veor q15,q13 @ sigma0(X[i+1])
  1413. vshr.u64 d26,d22,#41 @ from NEON_00_15
  1414. vadd.i64 q3,q15
  1415. vld1.64 {d28},[r3,:64]! @ K[i++]
  1416. vsli.64 d24,d22,#50
  1417. vsli.64 d25,d22,#46
  1418. vmov d29,d22
  1419. vsli.64 d26,d22,#23
  1420. #if 22<16 && defined(__ARMEL__)
  1421. vrev64.8 ,
  1422. #endif
  1423. veor d25,d24
  1424. vbsl d29,d23,d16 @ Ch(e,f,g)
  1425. vshr.u64 d24,d18,#28
  1426. veor d26,d25 @ Sigma1(e)
  1427. vadd.i64 d27,d29,d17
  1428. vshr.u64 d25,d18,#34
  1429. vsli.64 d24,d18,#36
  1430. vadd.i64 d27,d26
  1431. vshr.u64 d26,d18,#39
  1432. vadd.i64 d28,d6
  1433. vsli.64 d25,d18,#30
  1434. veor d30,d18,d19
  1435. vsli.64 d26,d18,#25
  1436. veor d17,d24,d25
  1437. vadd.i64 d27,d28
  1438. vbsl d30,d20,d19 @ Maj(a,b,c)
  1439. veor d17,d26 @ Sigma0(a)
  1440. vadd.i64 d21,d27
  1441. vadd.i64 d30,d27
  1442. @ vadd.i64 d17,d30
  1443. vshr.u64 d24,d21,#14 @ 23
  1444. #if 23<16
  1445. vld1.64 {d7},[r1]! @ handles unaligned
  1446. #endif
  1447. vshr.u64 d25,d21,#18
  1448. #if 23>0
  1449. vadd.i64 d17,d30 @ h+=Maj from the past
  1450. #endif
  1451. vshr.u64 d26,d21,#41
  1452. vld1.64 {d28},[r3,:64]! @ K[i++]
  1453. vsli.64 d24,d21,#50
  1454. vsli.64 d25,d21,#46
  1455. vmov d29,d21
  1456. vsli.64 d26,d21,#23
  1457. #if 23<16 && defined(__ARMEL__)
  1458. vrev64.8 ,
  1459. #endif
  1460. veor d25,d24
  1461. vbsl d29,d22,d23 @ Ch(e,f,g)
  1462. vshr.u64 d24,d17,#28
  1463. veor d26,d25 @ Sigma1(e)
  1464. vadd.i64 d27,d29,d16
  1465. vshr.u64 d25,d17,#34
  1466. vsli.64 d24,d17,#36
  1467. vadd.i64 d27,d26
  1468. vshr.u64 d26,d17,#39
  1469. vadd.i64 d28,d7
  1470. vsli.64 d25,d17,#30
  1471. veor d30,d17,d18
  1472. vsli.64 d26,d17,#25
  1473. veor d16,d24,d25
  1474. vadd.i64 d27,d28
  1475. vbsl d30,d19,d18 @ Maj(a,b,c)
  1476. veor d16,d26 @ Sigma0(a)
  1477. vadd.i64 d20,d27
  1478. vadd.i64 d30,d27
  1479. @ vadd.i64 d16,d30
  1480. vshr.u64 q12,q3,#19
  1481. vshr.u64 q13,q3,#61
  1482. vadd.i64 d16,d30 @ h+=Maj from the past
  1483. vshr.u64 q15,q3,#6
  1484. vsli.64 q12,q3,#45
  1485. vext.8 q14,q4,q5,#8 @ X[i+1]
  1486. vsli.64 q13,q3,#3
  1487. veor q15,q12
  1488. vshr.u64 q12,q14,#1
  1489. veor q15,q13 @ sigma1(X[i+14])
  1490. vshr.u64 q13,q14,#8
  1491. vadd.i64 q4,q15
  1492. vshr.u64 q15,q14,#7
  1493. vsli.64 q12,q14,#63
  1494. vsli.64 q13,q14,#56
  1495. vext.8 q14,q0,q1,#8 @ X[i+9]
  1496. veor q15,q12
  1497. vshr.u64 d24,d20,#14 @ from NEON_00_15
  1498. vadd.i64 q4,q14
  1499. vshr.u64 d25,d20,#18 @ from NEON_00_15
  1500. veor q15,q13 @ sigma0(X[i+1])
  1501. vshr.u64 d26,d20,#41 @ from NEON_00_15
  1502. vadd.i64 q4,q15
  1503. vld1.64 {d28},[r3,:64]! @ K[i++]
  1504. vsli.64 d24,d20,#50
  1505. vsli.64 d25,d20,#46
  1506. vmov d29,d20
  1507. vsli.64 d26,d20,#23
  1508. #if 24<16 && defined(__ARMEL__)
  1509. vrev64.8 ,
  1510. #endif
  1511. veor d25,d24
  1512. vbsl d29,d21,d22 @ Ch(e,f,g)
  1513. vshr.u64 d24,d16,#28
  1514. veor d26,d25 @ Sigma1(e)
  1515. vadd.i64 d27,d29,d23
  1516. vshr.u64 d25,d16,#34
  1517. vsli.64 d24,d16,#36
  1518. vadd.i64 d27,d26
  1519. vshr.u64 d26,d16,#39
  1520. vadd.i64 d28,d8
  1521. vsli.64 d25,d16,#30
  1522. veor d30,d16,d17
  1523. vsli.64 d26,d16,#25
  1524. veor d23,d24,d25
  1525. vadd.i64 d27,d28
  1526. vbsl d30,d18,d17 @ Maj(a,b,c)
  1527. veor d23,d26 @ Sigma0(a)
  1528. vadd.i64 d19,d27
  1529. vadd.i64 d30,d27
  1530. @ vadd.i64 d23,d30
  1531. vshr.u64 d24,d19,#14 @ 25
  1532. #if 25<16
  1533. vld1.64 {d9},[r1]! @ handles unaligned
  1534. #endif
  1535. vshr.u64 d25,d19,#18
  1536. #if 25>0
  1537. vadd.i64 d23,d30 @ h+=Maj from the past
  1538. #endif
  1539. vshr.u64 d26,d19,#41
  1540. vld1.64 {d28},[r3,:64]! @ K[i++]
  1541. vsli.64 d24,d19,#50
  1542. vsli.64 d25,d19,#46
  1543. vmov d29,d19
  1544. vsli.64 d26,d19,#23
  1545. #if 25<16 && defined(__ARMEL__)
  1546. vrev64.8 ,
  1547. #endif
  1548. veor d25,d24
  1549. vbsl d29,d20,d21 @ Ch(e,f,g)
  1550. vshr.u64 d24,d23,#28
  1551. veor d26,d25 @ Sigma1(e)
  1552. vadd.i64 d27,d29,d22
  1553. vshr.u64 d25,d23,#34
  1554. vsli.64 d24,d23,#36
  1555. vadd.i64 d27,d26
  1556. vshr.u64 d26,d23,#39
  1557. vadd.i64 d28,d9
  1558. vsli.64 d25,d23,#30
  1559. veor d30,d23,d16
  1560. vsli.64 d26,d23,#25
  1561. veor d22,d24,d25
  1562. vadd.i64 d27,d28
  1563. vbsl d30,d17,d16 @ Maj(a,b,c)
  1564. veor d22,d26 @ Sigma0(a)
  1565. vadd.i64 d18,d27
  1566. vadd.i64 d30,d27
  1567. @ vadd.i64 d22,d30
  1568. vshr.u64 q12,q4,#19
  1569. vshr.u64 q13,q4,#61
  1570. vadd.i64 d22,d30 @ h+=Maj from the past
  1571. vshr.u64 q15,q4,#6
  1572. vsli.64 q12,q4,#45
  1573. vext.8 q14,q5,q6,#8 @ X[i+1]
  1574. vsli.64 q13,q4,#3
  1575. veor q15,q12
  1576. vshr.u64 q12,q14,#1
  1577. veor q15,q13 @ sigma1(X[i+14])
  1578. vshr.u64 q13,q14,#8
  1579. vadd.i64 q5,q15
  1580. vshr.u64 q15,q14,#7
  1581. vsli.64 q12,q14,#63
  1582. vsli.64 q13,q14,#56
  1583. vext.8 q14,q1,q2,#8 @ X[i+9]
  1584. veor q15,q12
  1585. vshr.u64 d24,d18,#14 @ from NEON_00_15
  1586. vadd.i64 q5,q14
  1587. vshr.u64 d25,d18,#18 @ from NEON_00_15
  1588. veor q15,q13 @ sigma0(X[i+1])
  1589. vshr.u64 d26,d18,#41 @ from NEON_00_15
  1590. vadd.i64 q5,q15
  1591. vld1.64 {d28},[r3,:64]! @ K[i++]
  1592. vsli.64 d24,d18,#50
  1593. vsli.64 d25,d18,#46
  1594. vmov d29,d18
  1595. vsli.64 d26,d18,#23
  1596. #if 26<16 && defined(__ARMEL__)
  1597. vrev64.8 ,
  1598. #endif
  1599. veor d25,d24
  1600. vbsl d29,d19,d20 @ Ch(e,f,g)
  1601. vshr.u64 d24,d22,#28
  1602. veor d26,d25 @ Sigma1(e)
  1603. vadd.i64 d27,d29,d21
  1604. vshr.u64 d25,d22,#34
  1605. vsli.64 d24,d22,#36
  1606. vadd.i64 d27,d26
  1607. vshr.u64 d26,d22,#39
  1608. vadd.i64 d28,d10
  1609. vsli.64 d25,d22,#30
  1610. veor d30,d22,d23
  1611. vsli.64 d26,d22,#25
  1612. veor d21,d24,d25
  1613. vadd.i64 d27,d28
  1614. vbsl d30,d16,d23 @ Maj(a,b,c)
  1615. veor d21,d26 @ Sigma0(a)
  1616. vadd.i64 d17,d27
  1617. vadd.i64 d30,d27
  1618. @ vadd.i64 d21,d30
  1619. vshr.u64 d24,d17,#14 @ 27
  1620. #if 27<16
  1621. vld1.64 {d11},[r1]! @ handles unaligned
  1622. #endif
  1623. vshr.u64 d25,d17,#18
  1624. #if 27>0
  1625. vadd.i64 d21,d30 @ h+=Maj from the past
  1626. #endif
  1627. vshr.u64 d26,d17,#41
  1628. vld1.64 {d28},[r3,:64]! @ K[i++]
  1629. vsli.64 d24,d17,#50
  1630. vsli.64 d25,d17,#46
  1631. vmov d29,d17
  1632. vsli.64 d26,d17,#23
  1633. #if 27<16 && defined(__ARMEL__)
  1634. vrev64.8 ,
  1635. #endif
  1636. veor d25,d24
  1637. vbsl d29,d18,d19 @ Ch(e,f,g)
  1638. vshr.u64 d24,d21,#28
  1639. veor d26,d25 @ Sigma1(e)
  1640. vadd.i64 d27,d29,d20
  1641. vshr.u64 d25,d21,#34
  1642. vsli.64 d24,d21,#36
  1643. vadd.i64 d27,d26
  1644. vshr.u64 d26,d21,#39
  1645. vadd.i64 d28,d11
  1646. vsli.64 d25,d21,#30
  1647. veor d30,d21,d22
  1648. vsli.64 d26,d21,#25
  1649. veor d20,d24,d25
  1650. vadd.i64 d27,d28
  1651. vbsl d30,d23,d22 @ Maj(a,b,c)
  1652. veor d20,d26 @ Sigma0(a)
  1653. vadd.i64 d16,d27
  1654. vadd.i64 d30,d27
  1655. @ vadd.i64 d20,d30
  1656. vshr.u64 q12,q5,#19
  1657. vshr.u64 q13,q5,#61
  1658. vadd.i64 d20,d30 @ h+=Maj from the past
  1659. vshr.u64 q15,q5,#6
  1660. vsli.64 q12,q5,#45
  1661. vext.8 q14,q6,q7,#8 @ X[i+1]
  1662. vsli.64 q13,q5,#3
  1663. veor q15,q12
  1664. vshr.u64 q12,q14,#1
  1665. veor q15,q13 @ sigma1(X[i+14])
  1666. vshr.u64 q13,q14,#8
  1667. vadd.i64 q6,q15
  1668. vshr.u64 q15,q14,#7
  1669. vsli.64 q12,q14,#63
  1670. vsli.64 q13,q14,#56
  1671. vext.8 q14,q2,q3,#8 @ X[i+9]
  1672. veor q15,q12
  1673. vshr.u64 d24,d16,#14 @ from NEON_00_15
  1674. vadd.i64 q6,q14
  1675. vshr.u64 d25,d16,#18 @ from NEON_00_15
  1676. veor q15,q13 @ sigma0(X[i+1])
  1677. vshr.u64 d26,d16,#41 @ from NEON_00_15
  1678. vadd.i64 q6,q15
  1679. vld1.64 {d28},[r3,:64]! @ K[i++]
  1680. vsli.64 d24,d16,#50
  1681. vsli.64 d25,d16,#46
  1682. vmov d29,d16
  1683. vsli.64 d26,d16,#23
  1684. #if 28<16 && defined(__ARMEL__)
  1685. vrev64.8 ,
  1686. #endif
  1687. veor d25,d24
  1688. vbsl d29,d17,d18 @ Ch(e,f,g)
  1689. vshr.u64 d24,d20,#28
  1690. veor d26,d25 @ Sigma1(e)
  1691. vadd.i64 d27,d29,d19
  1692. vshr.u64 d25,d20,#34
  1693. vsli.64 d24,d20,#36
  1694. vadd.i64 d27,d26
  1695. vshr.u64 d26,d20,#39
  1696. vadd.i64 d28,d12
  1697. vsli.64 d25,d20,#30
  1698. veor d30,d20,d21
  1699. vsli.64 d26,d20,#25
  1700. veor d19,d24,d25
  1701. vadd.i64 d27,d28
  1702. vbsl d30,d22,d21 @ Maj(a,b,c)
  1703. veor d19,d26 @ Sigma0(a)
  1704. vadd.i64 d23,d27
  1705. vadd.i64 d30,d27
  1706. @ vadd.i64 d19,d30
  1707. vshr.u64 d24,d23,#14 @ 29
  1708. #if 29<16
  1709. vld1.64 {d13},[r1]! @ handles unaligned
  1710. #endif
  1711. vshr.u64 d25,d23,#18
  1712. #if 29>0
  1713. vadd.i64 d19,d30 @ h+=Maj from the past
  1714. #endif
  1715. vshr.u64 d26,d23,#41
  1716. vld1.64 {d28},[r3,:64]! @ K[i++]
  1717. vsli.64 d24,d23,#50
  1718. vsli.64 d25,d23,#46
  1719. vmov d29,d23
  1720. vsli.64 d26,d23,#23
  1721. #if 29<16 && defined(__ARMEL__)
  1722. vrev64.8 ,
  1723. #endif
  1724. veor d25,d24
  1725. vbsl d29,d16,d17 @ Ch(e,f,g)
  1726. vshr.u64 d24,d19,#28
  1727. veor d26,d25 @ Sigma1(e)
  1728. vadd.i64 d27,d29,d18
  1729. vshr.u64 d25,d19,#34
  1730. vsli.64 d24,d19,#36
  1731. vadd.i64 d27,d26
  1732. vshr.u64 d26,d19,#39
  1733. vadd.i64 d28,d13
  1734. vsli.64 d25,d19,#30
  1735. veor d30,d19,d20
  1736. vsli.64 d26,d19,#25
  1737. veor d18,d24,d25
  1738. vadd.i64 d27,d28
  1739. vbsl d30,d21,d20 @ Maj(a,b,c)
  1740. veor d18,d26 @ Sigma0(a)
  1741. vadd.i64 d22,d27
  1742. vadd.i64 d30,d27
  1743. @ vadd.i64 d18,d30
  1744. vshr.u64 q12,q6,#19
  1745. vshr.u64 q13,q6,#61
  1746. vadd.i64 d18,d30 @ h+=Maj from the past
  1747. vshr.u64 q15,q6,#6
  1748. vsli.64 q12,q6,#45
  1749. vext.8 q14,q7,q0,#8 @ X[i+1]
  1750. vsli.64 q13,q6,#3
  1751. veor q15,q12
  1752. vshr.u64 q12,q14,#1
  1753. veor q15,q13 @ sigma1(X[i+14])
  1754. vshr.u64 q13,q14,#8
  1755. vadd.i64 q7,q15
  1756. vshr.u64 q15,q14,#7
  1757. vsli.64 q12,q14,#63
  1758. vsli.64 q13,q14,#56
  1759. vext.8 q14,q3,q4,#8 @ X[i+9]
  1760. veor q15,q12
  1761. vshr.u64 d24,d22,#14 @ from NEON_00_15
  1762. vadd.i64 q7,q14
  1763. vshr.u64 d25,d22,#18 @ from NEON_00_15
  1764. veor q15,q13 @ sigma0(X[i+1])
  1765. vshr.u64 d26,d22,#41 @ from NEON_00_15
  1766. vadd.i64 q7,q15
  1767. vld1.64 {d28},[r3,:64]! @ K[i++]
  1768. vsli.64 d24,d22,#50
  1769. vsli.64 d25,d22,#46
  1770. vmov d29,d22
  1771. vsli.64 d26,d22,#23
  1772. #if 30<16 && defined(__ARMEL__)
  1773. vrev64.8 ,
  1774. #endif
  1775. veor d25,d24
  1776. vbsl d29,d23,d16 @ Ch(e,f,g)
  1777. vshr.u64 d24,d18,#28
  1778. veor d26,d25 @ Sigma1(e)
  1779. vadd.i64 d27,d29,d17
  1780. vshr.u64 d25,d18,#34
  1781. vsli.64 d24,d18,#36
  1782. vadd.i64 d27,d26
  1783. vshr.u64 d26,d18,#39
  1784. vadd.i64 d28,d14
  1785. vsli.64 d25,d18,#30
  1786. veor d30,d18,d19
  1787. vsli.64 d26,d18,#25
  1788. veor d17,d24,d25
  1789. vadd.i64 d27,d28
  1790. vbsl d30,d20,d19 @ Maj(a,b,c)
  1791. veor d17,d26 @ Sigma0(a)
  1792. vadd.i64 d21,d27
  1793. vadd.i64 d30,d27
  1794. @ vadd.i64 d17,d30
  1795. vshr.u64 d24,d21,#14 @ 31
  1796. #if 31<16
  1797. vld1.64 {d15},[r1]! @ handles unaligned
  1798. #endif
  1799. vshr.u64 d25,d21,#18
  1800. #if 31>0
  1801. vadd.i64 d17,d30 @ h+=Maj from the past
  1802. #endif
  1803. vshr.u64 d26,d21,#41
  1804. vld1.64 {d28},[r3,:64]! @ K[i++]
  1805. vsli.64 d24,d21,#50
  1806. vsli.64 d25,d21,#46
  1807. vmov d29,d21
  1808. vsli.64 d26,d21,#23
  1809. #if 31<16 && defined(__ARMEL__)
  1810. vrev64.8 ,
  1811. #endif
  1812. veor d25,d24
  1813. vbsl d29,d22,d23 @ Ch(e,f,g)
  1814. vshr.u64 d24,d17,#28
  1815. veor d26,d25 @ Sigma1(e)
  1816. vadd.i64 d27,d29,d16
  1817. vshr.u64 d25,d17,#34
  1818. vsli.64 d24,d17,#36
  1819. vadd.i64 d27,d26
  1820. vshr.u64 d26,d17,#39
  1821. vadd.i64 d28,d15
  1822. vsli.64 d25,d17,#30
  1823. veor d30,d17,d18
  1824. vsli.64 d26,d17,#25
  1825. veor d16,d24,d25
  1826. vadd.i64 d27,d28
  1827. vbsl d30,d19,d18 @ Maj(a,b,c)
  1828. veor d16,d26 @ Sigma0(a)
  1829. vadd.i64 d20,d27
  1830. vadd.i64 d30,d27
  1831. @ vadd.i64 d16,d30
  1832. bne .L16_79_neon
  1833. vadd.i64 d16,d30 @ h+=Maj from the past
  1834. vldmia r0,{d24,d25,d26,d27,d28,d29,d30,d31} @ load context to temp
  1835. vadd.i64 q8,q12 @ vectorized accumulate
  1836. vadd.i64 q9,q13
  1837. vadd.i64 q10,q14
  1838. vadd.i64 q11,q15
  1839. vstmia r0,{d16,d17,d18,d19,d20,d21,d22,d23} @ save context
  1840. teq r1,r2
  1841. sub r3,#640 @ rewind K512
  1842. bne .Loop_neon
  1843. VFP_ABI_POP
  1844. bx lr @ .word 0xe12fff1e
  1845. .size sha512_block_data_order_neon,.-sha512_block_data_order_neon
  1846. #endif
  1847. .byte 83,72,65,53,49,50,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,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
  1848. .align 2
  1849. .align 2
  1850. #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
  1851. .comm OPENSSL_armcap_P,4,4
  1852. .hidden OPENSSL_armcap_P
  1853. #endif
  1854. #endif
  1855. #endif // !OPENSSL_NO_ASM
  1856. .section .note.GNU-stack,"",%progbits