sha512-core.S_shipped 42 KB

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