sha512-core.S_shipped 42 KB

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