sha512-armv4.S 43 KB

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