sha512_armv4.S 41 KB

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