sha512-core.S_shipped 42 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862
  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