You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

chacha_vec_arm.S 29 KiB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426
  1. # Copyright (c) 2014, Google Inc.
  2. #
  3. # Permission to use, copy, modify, and/or distribute this software for any
  4. # purpose with or without fee is hereby granted, provided that the above
  5. # copyright notice and this permission notice appear in all copies.
  6. #
  7. # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  8. # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  9. # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
  10. # SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  11. # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  12. # OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  13. # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  14. # This file contains a pre-compiled version of chacha_vec.c for ARM. This is
  15. # needed to support switching on NEON code at runtime. If the whole of OpenSSL
  16. # were to be compiled with the needed flags to build chacha_vec.c, then it
  17. # wouldn't be possible to run on non-NEON systems.
  18. #
  19. # This file was generated by chacha_vec_arm_generate.go using the following
  20. # compiler command:
  21. #
  22. # /opt/gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc -O3 -mcpu=cortex-a8 -mfpu=neon -fpic -DASM_GEN -I ../../include -S chacha_vec.c -o -
  23. #if !defined(OPENSSL_NO_ASM)
  24. .syntax unified
  25. .cpu cortex-a8
  26. .eabi_attribute 27, 3
  27. # EABI attribute 28 sets whether VFP register arguments were used to build this
  28. # file. If object files are inconsistent on this point, the linker will refuse
  29. # to link them. Thus we report whatever the compiler expects since we don't use
  30. # VFP arguments.
  31. #if defined(__ARM_PCS_VFP)
  32. .eabi_attribute 28, 1
  33. #else
  34. .eabi_attribute 28, 0
  35. #endif
  36. .fpu neon
  37. .eabi_attribute 20, 1
  38. .eabi_attribute 21, 1
  39. .eabi_attribute 23, 3
  40. .eabi_attribute 24, 1
  41. .eabi_attribute 25, 1
  42. .eabi_attribute 26, 2
  43. .eabi_attribute 30, 2
  44. .eabi_attribute 34, 1
  45. .eabi_attribute 18, 4
  46. .thumb
  47. .file "chacha_vec.c"
  48. .text
  49. .align 2
  50. .global CRYPTO_chacha_20_neon
  51. .hidden CRYPTO_chacha_20_neon
  52. .thumb
  53. .thumb_func
  54. .type CRYPTO_chacha_20_neon, %function
  55. CRYPTO_chacha_20_neon:
  56. @ args = 8, pretend = 0, frame = 152
  57. @ frame_needed = 1, uses_anonymous_args = 0
  58. push {r4, r5, r6, r7, r8, r9, r10, fp, lr}
  59. mov r8, r3
  60. vpush.64 {d8, d9, d10, d11, d12, d13, d14, d15}
  61. mov r9, r2
  62. ldr r4, .L91+16
  63. mov fp, r0
  64. mov r10, r1
  65. mov lr, r8
  66. .LPIC16:
  67. add r4, pc
  68. sub sp, sp, #156
  69. add r7, sp, #0
  70. sub sp, sp, #112
  71. add r6, r7, #144
  72. str r0, [r7, #88]
  73. str r1, [r7, #12]
  74. str r2, [r7, #8]
  75. ldmia r4, {r0, r1, r2, r3}
  76. add r4, sp, #15
  77. bic r4, r4, #15
  78. ldr ip, [r7, #256]
  79. str r4, [r7, #84]
  80. mov r5, r4
  81. adds r4, r4, #64
  82. adds r5, r5, #80
  83. str r8, [r7, #68]
  84. stmia r4, {r0, r1, r2, r3}
  85. movw r4, #43691
  86. ldr r0, [ip] @ unaligned
  87. movt r4, 43690
  88. ldr r1, [ip, #4] @ unaligned
  89. ldr r3, [r7, #84]
  90. ldr r2, [r8, #8] @ unaligned
  91. mov r8, #0
  92. stmia r6!, {r0, r1}
  93. mov r6, r5
  94. ldr r1, [lr, #4] @ unaligned
  95. ldr r0, [lr] @ unaligned
  96. vldr d24, [r3, #64]
  97. vldr d25, [r3, #72]
  98. ldr r3, [lr, #12] @ unaligned
  99. str r5, [r7, #80]
  100. stmia r5!, {r0, r1, r2, r3}
  101. ldr r0, [lr, #16]! @ unaligned
  102. ldr r2, [r7, #84]
  103. umull r4, r5, r9, r4
  104. vldr d26, [r2, #80]
  105. vldr d27, [r2, #88]
  106. ldr r1, [lr, #4] @ unaligned
  107. ldr r2, [lr, #8] @ unaligned
  108. ldr r3, [lr, #12] @ unaligned
  109. ldr r4, [r7, #260]
  110. stmia r6!, {r0, r1, r2, r3}
  111. ldr r3, [ip]
  112. ldr r1, [r7, #84]
  113. ldr r2, [ip, #4]
  114. str r3, [r7, #64]
  115. vldr d28, [r1, #80]
  116. vldr d29, [r1, #88]
  117. str r3, [r7, #136]
  118. lsrs r3, r5, #7
  119. str r4, [r7, #128]
  120. str r2, [r7, #140]
  121. str r8, [r7, #132]
  122. str r2, [r7, #60]
  123. vldr d22, [r7, #128]
  124. vldr d23, [r7, #136]
  125. beq .L26
  126. lsls r2, r3, #8
  127. ldr r5, [r1, #64]
  128. sub r3, r2, r3, lsl #6
  129. ldr r2, [r1, #68]
  130. vldr d0, .L91
  131. vldr d1, .L91+8
  132. adds r4, r4, #2
  133. str r5, [r7, #56]
  134. str r2, [r7, #52]
  135. ldr r5, [r1, #72]
  136. ldr r2, [r1, #76]
  137. str r3, [r7, #4]
  138. str r5, [r7, #48]
  139. str r2, [r7, #44]
  140. mov r2, fp
  141. str r4, [r7, #72]
  142. adds r3, r2, r3
  143. str r10, [r7, #76]
  144. str r3, [r7, #16]
  145. .L4:
  146. ldr r5, [r7, #68]
  147. add r8, r7, #44
  148. ldr r4, [r7, #72]
  149. vadd.i32 q3, q11, q0
  150. ldmia r8, {r8, r9, r10, fp}
  151. vmov q8, q14 @ v4si
  152. ldr r2, [r5, #4]
  153. vmov q1, q13 @ v4si
  154. ldr r3, [r5]
  155. vmov q9, q12 @ v4si
  156. ldr lr, [r5, #20]
  157. vmov q2, q11 @ v4si
  158. mov r0, r2
  159. ldr r2, [r5, #8]
  160. str r3, [r7, #108]
  161. mov r3, r5
  162. ldr ip, [r5, #16]
  163. vmov q15, q14 @ v4si
  164. mov r1, r2
  165. ldr r2, [r5, #12]
  166. ldr r5, [r5, #24]
  167. vmov q5, q13 @ v4si
  168. ldr r6, [r3, #28]
  169. vmov q10, q12 @ v4si
  170. ldr r3, [r7, #64]
  171. str r5, [r7, #116]
  172. movs r5, #10
  173. str r6, [r7, #120]
  174. str r4, [r7, #112]
  175. ldr r6, [r7, #60]
  176. str r8, [r7, #96]
  177. mov r8, r10
  178. ldr r4, [r7, #108]
  179. mov r10, r9
  180. ldr r9, [r7, #116]
  181. str lr, [r7, #104]
  182. mov lr, r3
  183. str r5, [r7, #92]
  184. movs r5, #0
  185. str r6, [r7, #124]
  186. str r5, [r7, #100]
  187. b .L92
  188. .L93:
  189. .align 3
  190. .L91:
  191. .word 1
  192. .word 0
  193. .word 0
  194. .word 0
  195. .word .LANCHOR0-(.LPIC16+4)
  196. .L92:
  197. .L3:
  198. vadd.i32 q9, q9, q1
  199. add r3, r8, r0
  200. vadd.i32 q10, q10, q5
  201. add r5, fp, r4
  202. veor q3, q3, q9
  203. mov r6, r3
  204. veor q2, q2, q10
  205. ldr r3, [r7, #96]
  206. str r5, [r7, #116]
  207. add r10, r10, r1
  208. vrev32.16 q3, q3
  209. eor lr, lr, r10
  210. vadd.i32 q8, q8, q3
  211. vrev32.16 q2, q2
  212. vadd.i32 q15, q15, q2
  213. mov fp, r3
  214. ldr r3, [r7, #112]
  215. veor q4, q8, q1
  216. str r6, [r7, #112]
  217. veor q6, q15, q5
  218. eors r3, r3, r5
  219. mov r5, r6
  220. ldr r6, [r7, #100]
  221. vshl.i32 q1, q4, #12
  222. vshl.i32 q5, q6, #12
  223. add fp, fp, r2
  224. eors r6, r6, r5
  225. ror r3, r3, #16
  226. vsri.32 q1, q4, #20
  227. ror lr, lr, #16
  228. mov r5, r6
  229. ldr r6, [r7, #124]
  230. vsri.32 q5, q6, #20
  231. str r3, [r7, #124]
  232. eor r6, r6, fp
  233. ror r5, r5, #16
  234. vadd.i32 q9, q9, q1
  235. add r9, r9, lr
  236. ror r3, r6, #16
  237. ldr r6, [r7, #124]
  238. vadd.i32 q10, q10, q5
  239. str r3, [r7, #108]
  240. veor q4, q9, q3
  241. add ip, ip, r6
  242. ldr r6, [r7, #104]
  243. veor q6, q10, q2
  244. eor r4, ip, r4
  245. eor r1, r9, r1
  246. vshl.i32 q3, q4, #8
  247. mov r8, r6
  248. ldr r6, [r7, #120]
  249. vshl.i32 q2, q6, #8
  250. ror r4, r4, #20
  251. add r6, r6, r3
  252. vsri.32 q3, q4, #24
  253. str r6, [r7, #104]
  254. eors r2, r2, r6
  255. ldr r6, [r7, #116]
  256. vsri.32 q2, q6, #24
  257. add r8, r8, r5
  258. ror r2, r2, #20
  259. adds r6, r4, r6
  260. vadd.i32 q4, q8, q3
  261. eor r0, r8, r0
  262. vadd.i32 q15, q15, q2
  263. mov r3, r6
  264. ldr r6, [r7, #112]
  265. veor q6, q4, q1
  266. ror r0, r0, #20
  267. str r3, [r7, #112]
  268. veor q5, q15, q5
  269. adds r6, r0, r6
  270. str r6, [r7, #120]
  271. mov r6, r3
  272. ldr r3, [r7, #124]
  273. vshl.i32 q8, q6, #7
  274. add fp, fp, r2
  275. eors r3, r3, r6
  276. ldr r6, [r7, #120]
  277. vshl.i32 q1, q5, #7
  278. ror r1, r1, #20
  279. eors r5, r5, r6
  280. vsri.32 q8, q6, #25
  281. ldr r6, [r7, #108]
  282. ror r3, r3, #24
  283. ror r5, r5, #24
  284. vsri.32 q1, q5, #25
  285. str r5, [r7, #116]
  286. eor r6, fp, r6
  287. ldr r5, [r7, #116]
  288. add r10, r10, r1
  289. add ip, r3, ip
  290. vext.32 q8, q8, q8, #1
  291. str ip, [r7, #124]
  292. add ip, r5, r8
  293. ldr r5, [r7, #104]
  294. eor lr, r10, lr
  295. ror r6, r6, #24
  296. vext.32 q1, q1, q1, #1
  297. add r8, r6, r5
  298. vadd.i32 q9, q9, q8
  299. ldr r5, [r7, #124]
  300. vext.32 q3, q3, q3, #3
  301. vadd.i32 q10, q10, q1
  302. ror lr, lr, #24
  303. eor r0, ip, r0
  304. vext.32 q2, q2, q2, #3
  305. add r9, r9, lr
  306. eors r4, r4, r5
  307. veor q3, q9, q3
  308. ldr r5, [r7, #112]
  309. eor r1, r9, r1
  310. ror r0, r0, #25
  311. veor q2, q10, q2
  312. adds r5, r0, r5
  313. vext.32 q4, q4, q4, #2
  314. str r5, [r7, #112]
  315. ldr r5, [r7, #120]
  316. ror r1, r1, #25
  317. vrev32.16 q3, q3
  318. eor r2, r8, r2
  319. vext.32 q15, q15, q15, #2
  320. adds r5, r1, r5
  321. vadd.i32 q4, q4, q3
  322. ror r4, r4, #25
  323. vrev32.16 q2, q2
  324. str r5, [r7, #100]
  325. vadd.i32 q15, q15, q2
  326. eors r3, r3, r5
  327. ldr r5, [r7, #112]
  328. add fp, fp, r4
  329. veor q8, q4, q8
  330. ror r2, r2, #25
  331. veor q1, q15, q1
  332. eor lr, fp, lr
  333. eors r6, r6, r5
  334. ror r3, r3, #16
  335. ldr r5, [r7, #116]
  336. add r10, r10, r2
  337. str r3, [r7, #120]
  338. ror lr, lr, #16
  339. ldr r3, [r7, #120]
  340. eor r5, r10, r5
  341. vshl.i32 q5, q8, #12
  342. add ip, lr, ip
  343. vshl.i32 q6, q1, #12
  344. str ip, [r7, #104]
  345. add ip, r3, r8
  346. str ip, [r7, #116]
  347. ldr r3, [r7, #124]
  348. ror r5, r5, #16
  349. vsri.32 q5, q8, #20
  350. ror r6, r6, #16
  351. add ip, r5, r3
  352. ldr r3, [r7, #104]
  353. vsri.32 q6, q1, #20
  354. add r9, r9, r6
  355. eor r2, ip, r2
  356. eors r4, r4, r3
  357. ldr r3, [r7, #116]
  358. eor r0, r9, r0
  359. vadd.i32 q9, q9, q5
  360. ror r4, r4, #20
  361. eors r1, r1, r3
  362. vadd.i32 q10, q10, q6
  363. ror r3, r2, #20
  364. str r3, [r7, #108]
  365. ldr r3, [r7, #112]
  366. veor q3, q9, q3
  367. ror r0, r0, #20
  368. add r8, r4, fp
  369. veor q2, q10, q2
  370. add fp, r0, r3
  371. ldr r3, [r7, #100]
  372. ror r1, r1, #20
  373. mov r2, r8
  374. vshl.i32 q8, q3, #8
  375. str r8, [r7, #96]
  376. add r8, r1, r3
  377. ldr r3, [r7, #108]
  378. vmov q1, q6 @ v4si
  379. vshl.i32 q6, q2, #8
  380. eor r6, fp, r6
  381. add r10, r10, r3
  382. ldr r3, [r7, #120]
  383. vsri.32 q8, q3, #24
  384. eor lr, r2, lr
  385. eor r3, r8, r3
  386. ror r2, r6, #24
  387. vsri.32 q6, q2, #24
  388. eor r5, r10, r5
  389. str r2, [r7, #124]
  390. ror r2, r3, #24
  391. ldr r3, [r7, #104]
  392. vmov q3, q8 @ v4si
  393. vadd.i32 q15, q15, q6
  394. ror lr, lr, #24
  395. vadd.i32 q8, q4, q8
  396. ror r6, r5, #24
  397. add r5, lr, r3
  398. ldr r3, [r7, #124]
  399. veor q4, q8, q5
  400. add ip, ip, r6
  401. vmov q2, q6 @ v4si
  402. add r9, r9, r3
  403. veor q6, q15, q1
  404. ldr r3, [r7, #116]
  405. vshl.i32 q1, q4, #7
  406. str r2, [r7, #112]
  407. add r3, r3, r2
  408. str r3, [r7, #120]
  409. vshl.i32 q5, q6, #7
  410. eors r1, r1, r3
  411. ldr r3, [r7, #108]
  412. vsri.32 q1, q4, #25
  413. eors r4, r4, r5
  414. eor r0, r9, r0
  415. eor r2, ip, r3
  416. vsri.32 q5, q6, #25
  417. ldr r3, [r7, #92]
  418. ror r4, r4, #25
  419. str r6, [r7, #100]
  420. ror r0, r0, #25
  421. subs r3, r3, #1
  422. str r5, [r7, #104]
  423. ror r1, r1, #25
  424. ror r2, r2, #25
  425. vext.32 q15, q15, q15, #2
  426. str r3, [r7, #92]
  427. vext.32 q2, q2, q2, #1
  428. vext.32 q8, q8, q8, #2
  429. vext.32 q3, q3, q3, #1
  430. vext.32 q5, q5, q5, #3
  431. vext.32 q1, q1, q1, #3
  432. bne .L3
  433. ldr r3, [r7, #80]
  434. vadd.i32 q4, q12, q10
  435. str r9, [r7, #116]
  436. mov r9, r10
  437. mov r10, r8
  438. ldr r8, [r7, #96]
  439. str lr, [r7, #96]
  440. mov lr, r5
  441. ldr r5, [r7, #56]
  442. vadd.i32 q5, q13, q5
  443. ldr r6, [r7, #76]
  444. vadd.i32 q15, q14, q15
  445. add fp, fp, r5
  446. ldr r5, [r7, #52]
  447. str r4, [r7, #108]
  448. vadd.i32 q7, q14, q8
  449. ldr r4, [r7, #112]
  450. add r5, r10, r5
  451. str r3, [r7, #112]
  452. vadd.i32 q2, q11, q2
  453. ldr r3, [r6, #12] @ unaligned
  454. vadd.i32 q6, q12, q9
  455. str r0, [r7, #92]
  456. vadd.i32 q1, q13, q1
  457. ldr r0, [r6] @ unaligned
  458. vadd.i32 q11, q11, q0
  459. str r1, [r7, #40]
  460. str r2, [r7, #36]
  461. vadd.i32 q3, q11, q3
  462. ldr r1, [r6, #4] @ unaligned
  463. vadd.i32 q11, q11, q0
  464. ldr r2, [r6, #8] @ unaligned
  465. str r5, [r7, #104]
  466. vadd.i32 q11, q11, q0
  467. ldr r5, [r7, #112]
  468. ldr r10, [r7, #80]
  469. stmia r5!, {r0, r1, r2, r3}
  470. mov r5, r10
  471. ldr r0, [r7, #84]
  472. ldr r2, [r7, #48]
  473. ldr r3, [r7, #72]
  474. vldr d20, [r0, #80]
  475. vldr d21, [r0, #88]
  476. add r9, r9, r2
  477. veor q10, q10, q4
  478. ldr r2, [r7, #44]
  479. adds r1, r4, r3
  480. str r1, [r7, #28]
  481. add r2, r8, r2
  482. str r2, [r7, #32]
  483. vstr d20, [r0, #80]
  484. vstr d21, [r0, #88]
  485. ldmia r5!, {r0, r1, r2, r3}
  486. ldr r4, [r7, #96]
  487. ldr r5, [r7, #64]
  488. add r4, r4, r5
  489. ldr r5, [r7, #124]
  490. str r4, [r7, #96]
  491. ldr r4, [r7, #60]
  492. add r5, r5, r4
  493. ldr r4, [r7, #88]
  494. str r5, [r7, #24]
  495. mov r5, r10
  496. str r0, [r4] @ unaligned
  497. mov r0, r4
  498. str r1, [r4, #4] @ unaligned
  499. mov r8, r0
  500. str r2, [r0, #8] @ unaligned
  501. mov r4, r10
  502. str r3, [r0, #12] @ unaligned
  503. ldr r0, [r6, #16]! @ unaligned
  504. ldr r1, [r6, #4] @ unaligned
  505. ldr r2, [r6, #8] @ unaligned
  506. ldr r3, [r6, #12] @ unaligned
  507. ldr r6, [r7, #76]
  508. stmia r5!, {r0, r1, r2, r3}
  509. mov r5, r10
  510. ldr r3, [r7, #84]
  511. vldr d20, [r3, #80]
  512. vldr d21, [r3, #88]
  513. veor q10, q10, q5
  514. vstr d20, [r3, #80]
  515. vstr d21, [r3, #88]
  516. ldmia r4!, {r0, r1, r2, r3}
  517. mov r4, r8
  518. str r0, [r8, #16] @ unaligned
  519. str r1, [r8, #20] @ unaligned
  520. str r2, [r8, #24] @ unaligned
  521. str r3, [r8, #28] @ unaligned
  522. mov r8, r4
  523. ldr r0, [r6, #32]! @ unaligned
  524. str r10, [r7, #124]
  525. ldr r1, [r6, #4] @ unaligned
  526. ldr r2, [r6, #8] @ unaligned
  527. ldr r3, [r6, #12] @ unaligned
  528. ldr r6, [r7, #76]
  529. stmia r5!, {r0, r1, r2, r3}
  530. mov r5, r10
  531. ldr r2, [r7, #84]
  532. vldr d16, [r2, #80]
  533. vldr d17, [r2, #88]
  534. veor q15, q8, q15
  535. vstr d30, [r2, #80]
  536. vstr d31, [r2, #88]
  537. ldmia r10!, {r0, r1, r2, r3}
  538. str r0, [r4, #32] @ unaligned
  539. str r1, [r4, #36] @ unaligned
  540. str r2, [r4, #40] @ unaligned
  541. str r3, [r4, #44] @ unaligned
  542. ldr r0, [r6, #48]! @ unaligned
  543. ldr r1, [r6, #4] @ unaligned
  544. ldr r2, [r6, #8] @ unaligned
  545. ldr r3, [r6, #12] @ unaligned
  546. ldr r6, [r7, #76]
  547. stmia r5!, {r0, r1, r2, r3}
  548. ldr r1, [r7, #84]
  549. vldr d18, [r1, #80]
  550. vldr d19, [r1, #88]
  551. veor q9, q9, q2
  552. vstr d18, [r1, #80]
  553. vstr d19, [r1, #88]
  554. ldr r3, [r7, #112]
  555. ldr r5, [r7, #80]
  556. mov r10, r3
  557. ldmia r10!, {r0, r1, r2, r3}
  558. str r0, [r4, #48] @ unaligned
  559. str r1, [r4, #52] @ unaligned
  560. str r2, [r4, #56] @ unaligned
  561. str r3, [r4, #60] @ unaligned
  562. ldr r0, [r6, #64]! @ unaligned
  563. ldr r1, [r6, #4] @ unaligned
  564. ldr r2, [r6, #8] @ unaligned
  565. ldr r3, [r6, #12] @ unaligned
  566. ldr r6, [r7, #76]
  567. stmia r5!, {r0, r1, r2, r3}
  568. ldr r1, [r7, #84]
  569. ldr r3, [r7, #112]
  570. ldr r5, [r7, #80]
  571. vldr d18, [r1, #80]
  572. vldr d19, [r1, #88]
  573. veor q9, q9, q6
  574. mov r10, r3
  575. str r5, [r7, #20]
  576. vstr d18, [r1, #80]
  577. vstr d19, [r1, #88]
  578. ldmia r10!, {r0, r1, r2, r3}
  579. str r1, [r4, #68] @ unaligned
  580. str r2, [r4, #72] @ unaligned
  581. str r3, [r4, #76] @ unaligned
  582. str r0, [r4, #64] @ unaligned
  583. ldr r0, [r6, #80]! @ unaligned
  584. ldr r1, [r6, #4] @ unaligned
  585. ldr r2, [r6, #8] @ unaligned
  586. ldr r3, [r6, #12] @ unaligned
  587. ldr r6, [r7, #76]
  588. stmia r5!, {r0, r1, r2, r3}
  589. ldr r1, [r7, #84]
  590. ldr r3, [r7, #20]
  591. ldr r5, [r7, #80]
  592. vldr d18, [r1, #80]
  593. vldr d19, [r1, #88]
  594. veor q1, q9, q1
  595. mov r10, r3
  596. vstr d2, [r1, #80]
  597. vstr d3, [r1, #88]
  598. ldmia r10!, {r0, r1, r2, r3}
  599. mov r10, r5
  600. str r0, [r4, #80] @ unaligned
  601. str r1, [r4, #84] @ unaligned
  602. str r2, [r4, #88] @ unaligned
  603. str r3, [r4, #92] @ unaligned
  604. ldr r0, [r6, #96]! @ unaligned
  605. ldr r1, [r6, #4] @ unaligned
  606. ldr r2, [r6, #8] @ unaligned
  607. ldr r3, [r6, #12] @ unaligned
  608. ldr r6, [r7, #76]
  609. stmia r5!, {r0, r1, r2, r3}
  610. mov r5, r10
  611. ldr r3, [r7, #84]
  612. vldr d16, [r3, #80]
  613. vldr d17, [r3, #88]
  614. veor q8, q8, q7
  615. vstr d16, [r3, #80]
  616. vstr d17, [r3, #88]
  617. ldmia r10!, {r0, r1, r2, r3}
  618. str r0, [r4, #96] @ unaligned
  619. str r1, [r4, #100] @ unaligned
  620. str r2, [r4, #104] @ unaligned
  621. str r3, [r4, #108] @ unaligned
  622. ldr r0, [r6, #112]! @ unaligned
  623. ldr r1, [r6, #4] @ unaligned
  624. ldr r2, [r6, #8] @ unaligned
  625. ldr r3, [r6, #12] @ unaligned
  626. mov r6, r5
  627. stmia r6!, {r0, r1, r2, r3}
  628. ldr r3, [r7, #84]
  629. vldr d16, [r3, #80]
  630. vldr d17, [r3, #88]
  631. veor q8, q8, q3
  632. vstr d16, [r3, #80]
  633. vstr d17, [r3, #88]
  634. ldmia r5!, {r0, r1, r2, r3}
  635. str r1, [r4, #116] @ unaligned
  636. ldr r1, [r7, #76]
  637. str r0, [r4, #112] @ unaligned
  638. str r2, [r4, #120] @ unaligned
  639. str r3, [r4, #124] @ unaligned
  640. ldr r3, [r1, #128]
  641. ldr r2, [r7, #104]
  642. eor r3, fp, r3
  643. str r3, [r4, #128]
  644. ldr r3, [r1, #132]
  645. eors r2, r2, r3
  646. str r2, [r8, #132]
  647. ldr r3, [r1, #136]
  648. ldr r5, [r7, #68]
  649. ldr r6, [r7, #32]
  650. eor r3, r9, r3
  651. str r3, [r4, #136]
  652. ldr r3, [r1, #140]
  653. ldr r0, [r7, #92]
  654. eors r3, r3, r6
  655. ldr r6, [r7, #108]
  656. str r3, [r4, #140]
  657. ldr r3, [r5]
  658. ldr r2, [r1, #144]
  659. add r6, r6, r3
  660. eors r2, r2, r6
  661. str r2, [r4, #144]
  662. ldr r2, [r5, #4]
  663. ldr r3, [r1, #148]
  664. add r0, r0, r2
  665. ldr r6, [r7, #36]
  666. eors r3, r3, r0
  667. ldr r0, [r7, #40]
  668. str r3, [r4, #148]
  669. ldr r2, [r5, #8]
  670. ldr r3, [r1, #152]
  671. add r0, r0, r2
  672. eors r3, r3, r0
  673. str r3, [r4, #152]
  674. ldr r2, [r5, #12]
  675. mov r0, r4
  676. ldr r3, [r1, #156]
  677. mov r4, r1
  678. add r6, r6, r2
  679. mov r1, r0
  680. eors r3, r3, r6
  681. str r3, [r0, #156]
  682. ldr r2, [r5, #16]
  683. ldr r3, [r4, #160]
  684. add ip, ip, r2
  685. eor r3, ip, r3
  686. str r3, [r1, #160]
  687. ldr r2, [r5, #20]
  688. ldr r3, [r4, #164]
  689. add lr, lr, r2
  690. ldr r2, [r7, #116]
  691. eor r3, lr, r3
  692. str r3, [r1, #164]
  693. ldr r6, [r5, #24]
  694. mov lr, r4
  695. ldr r3, [r4, #168]
  696. add r2, r2, r6
  697. mov r6, r4
  698. eors r3, r3, r2
  699. str r3, [r1, #168]
  700. ldr r5, [r5, #28]
  701. mov r2, r1
  702. ldr r3, [r4, #172]
  703. ldr r0, [r7, #120]
  704. add r0, r0, r5
  705. ldr r5, [r7, #24]
  706. eors r3, r3, r0
  707. str r3, [r1, #172]
  708. ldr r3, [r7, #72]
  709. ldr r4, [r4, #176]
  710. ldr r1, [r7, #28]
  711. eors r4, r4, r1
  712. adds r1, r3, #3
  713. str r4, [r2, #176]
  714. ldr r3, [r7, #100]
  715. ldr r0, [lr, #180]
  716. str r1, [r7, #72]
  717. eors r3, r3, r0
  718. mov r0, r3
  719. mov r3, r2
  720. str r0, [r2, #180]
  721. adds r3, r3, #192
  722. ldr r1, [lr, #184]
  723. ldr r2, [r7, #96]
  724. eors r1, r1, r2
  725. str r1, [r3, #-8]
  726. ldr r2, [lr, #188]
  727. mov r1, r6
  728. adds r1, r1, #192
  729. str r1, [r7, #76]
  730. eors r2, r2, r5
  731. str r2, [r3, #-4]
  732. ldr r2, [r7, #16]
  733. str r3, [r7, #88]
  734. cmp r2, r3
  735. bne .L4
  736. ldr r3, [r7, #12]
  737. ldr r2, [r7, #4]
  738. add r3, r3, r2
  739. str r3, [r7, #12]
  740. .L2:
  741. ldr r1, [r7, #8]
  742. movw r2, #43691
  743. movt r2, 43690
  744. umull r2, r3, r1, r2
  745. lsr fp, r3, #7
  746. lsl r3, fp, #8
  747. sub fp, r3, fp, lsl #6
  748. rsb fp, fp, r1
  749. lsrs fp, fp, #6
  750. beq .L6
  751. ldr r5, [r7, #12]
  752. ldr r4, [r7, #16]
  753. ldr r6, [r7, #84]
  754. ldr lr, [r7, #80]
  755. vldr d30, .L94
  756. vldr d31, .L94+8
  757. str fp, [r7, #120]
  758. str fp, [r7, #124]
  759. .L8:
  760. vmov q2, q11 @ v4si
  761. movs r3, #10
  762. vmov q8, q14 @ v4si
  763. vmov q9, q13 @ v4si
  764. vmov q10, q12 @ v4si
  765. .L7:
  766. vadd.i32 q10, q10, q9
  767. subs r3, r3, #1
  768. veor q3, q2, q10
  769. vrev32.16 q3, q3
  770. vadd.i32 q8, q8, q3
  771. veor q9, q8, q9
  772. vshl.i32 q2, q9, #12
  773. vsri.32 q2, q9, #20
  774. vadd.i32 q10, q10, q2
  775. veor q3, q10, q3
  776. vshl.i32 q9, q3, #8
  777. vsri.32 q9, q3, #24
  778. vadd.i32 q8, q8, q9
  779. vext.32 q9, q9, q9, #3
  780. veor q2, q8, q2
  781. vext.32 q8, q8, q8, #2
  782. vshl.i32 q3, q2, #7
  783. vsri.32 q3, q2, #25
  784. vext.32 q3, q3, q3, #1
  785. vadd.i32 q10, q10, q3
  786. veor q9, q10, q9
  787. vrev32.16 q9, q9
  788. vadd.i32 q8, q8, q9
  789. veor q3, q8, q3
  790. vshl.i32 q2, q3, #12
  791. vsri.32 q2, q3, #20
  792. vadd.i32 q10, q10, q2
  793. vmov q3, q2 @ v4si
  794. veor q9, q10, q9
  795. vshl.i32 q2, q9, #8
  796. vsri.32 q2, q9, #24
  797. vadd.i32 q8, q8, q2
  798. vext.32 q2, q2, q2, #1
  799. veor q3, q8, q3
  800. vext.32 q8, q8, q8, #2
  801. vshl.i32 q9, q3, #7
  802. vsri.32 q9, q3, #25
  803. vext.32 q9, q9, q9, #3
  804. bne .L7
  805. ldr r0, [r5] @ unaligned
  806. vadd.i32 q1, q12, q10
  807. ldr r1, [r5, #4] @ unaligned
  808. mov ip, lr
  809. ldr r2, [r5, #8] @ unaligned
  810. mov r9, lr
  811. ldr r3, [r5, #12] @ unaligned
  812. mov r10, r5
  813. vadd.i32 q9, q13, q9
  814. mov r8, lr
  815. vadd.i32 q8, q14, q8
  816. stmia ip!, {r0, r1, r2, r3}
  817. mov ip, lr
  818. vldr d20, [r6, #80]
  819. vldr d21, [r6, #88]
  820. vadd.i32 q3, q11, q2
  821. veor q10, q10, q1
  822. vadd.i32 q11, q11, q15
  823. vstr d20, [r6, #80]
  824. vstr d21, [r6, #88]
  825. ldmia r9!, {r0, r1, r2, r3}
  826. mov r9, r5
  827. str r0, [r4] @ unaligned
  828. str r1, [r4, #4] @ unaligned
  829. str r2, [r4, #8] @ unaligned
  830. str r3, [r4, #12] @ unaligned
  831. ldr r0, [r10, #16]! @ unaligned
  832. ldr r1, [r10, #4] @ unaligned
  833. ldr r2, [r10, #8] @ unaligned
  834. ldr r3, [r10, #12] @ unaligned
  835. add r10, r4, #48
  836. adds r4, r4, #64
  837. stmia r8!, {r0, r1, r2, r3}
  838. mov r8, lr
  839. vldr d20, [r6, #80]
  840. vldr d21, [r6, #88]
  841. veor q10, q10, q9
  842. vstr d20, [r6, #80]
  843. vstr d21, [r6, #88]
  844. ldmia ip!, {r0, r1, r2, r3}
  845. mov ip, lr
  846. str r0, [r4, #-48] @ unaligned
  847. str r1, [r4, #-44] @ unaligned
  848. str r2, [r4, #-40] @ unaligned
  849. str r3, [r4, #-36] @ unaligned
  850. ldr r0, [r9, #32]! @ unaligned
  851. ldr r1, [r9, #4] @ unaligned
  852. ldr r2, [r9, #8] @ unaligned
  853. ldr r3, [r9, #12] @ unaligned
  854. mov r9, r5
  855. adds r5, r5, #64
  856. stmia r8!, {r0, r1, r2, r3}
  857. mov r8, lr
  858. vldr d18, [r6, #80]
  859. vldr d19, [r6, #88]
  860. veor q9, q9, q8
  861. vstr d18, [r6, #80]
  862. vstr d19, [r6, #88]
  863. ldmia ip!, {r0, r1, r2, r3}
  864. mov ip, lr
  865. str r0, [r4, #-32] @ unaligned
  866. str r1, [r4, #-28] @ unaligned
  867. str r2, [r4, #-24] @ unaligned
  868. str r3, [r4, #-20] @ unaligned
  869. ldr r0, [r9, #48]! @ unaligned
  870. ldr r1, [r9, #4] @ unaligned
  871. ldr r2, [r9, #8] @ unaligned
  872. ldr r3, [r9, #12] @ unaligned
  873. stmia r8!, {r0, r1, r2, r3}
  874. vldr d16, [r6, #80]
  875. vldr d17, [r6, #88]
  876. veor q8, q8, q3
  877. vstr d16, [r6, #80]
  878. vstr d17, [r6, #88]
  879. ldmia ip!, {r0, r1, r2, r3}
  880. str r0, [r4, #-16] @ unaligned
  881. str r1, [r4, #-12] @ unaligned
  882. str r3, [r10, #12] @ unaligned
  883. ldr r3, [r7, #124]
  884. str r2, [r10, #8] @ unaligned
  885. cmp r3, #1
  886. beq .L87
  887. movs r3, #1
  888. str r3, [r7, #124]
  889. b .L8
  890. .L95:
  891. .align 3
  892. .L94:
  893. .word 1
  894. .word 0
  895. .word 0
  896. .word 0
  897. .L87:
  898. ldr fp, [r7, #120]
  899. ldr r3, [r7, #12]
  900. lsl fp, fp, #6
  901. add r3, r3, fp
  902. str r3, [r7, #12]
  903. ldr r3, [r7, #16]
  904. add r3, r3, fp
  905. str r3, [r7, #16]
  906. .L6:
  907. ldr r3, [r7, #8]
  908. ands r9, r3, #63
  909. beq .L1
  910. vmov q3, q11 @ v4si
  911. movs r3, #10
  912. vmov q8, q14 @ v4si
  913. mov r5, r9
  914. vmov q15, q13 @ v4si
  915. vmov q10, q12 @ v4si
  916. .L10:
  917. vadd.i32 q10, q10, q15
  918. subs r3, r3, #1
  919. veor q9, q3, q10
  920. vrev32.16 q9, q9
  921. vadd.i32 q8, q8, q9
  922. veor q15, q8, q15
  923. vshl.i32 q3, q15, #12
  924. vsri.32 q3, q15, #20
  925. vadd.i32 q10, q10, q3
  926. veor q15, q10, q9
  927. vshl.i32 q9, q15, #8
  928. vsri.32 q9, q15, #24
  929. vadd.i32 q8, q8, q9
  930. vext.32 q9, q9, q9, #3
  931. veor q3, q8, q3
  932. vext.32 q8, q8, q8, #2
  933. vshl.i32 q15, q3, #7
  934. vsri.32 q15, q3, #25
  935. vext.32 q15, q15, q15, #1
  936. vadd.i32 q10, q10, q15
  937. veor q9, q10, q9
  938. vrev32.16 q9, q9
  939. vadd.i32 q8, q8, q9
  940. veor q15, q8, q15
  941. vshl.i32 q3, q15, #12
  942. vsri.32 q3, q15, #20
  943. vadd.i32 q10, q10, q3
  944. vmov q15, q3 @ v4si
  945. veor q9, q10, q9
  946. vshl.i32 q3, q9, #8
  947. vsri.32 q3, q9, #24
  948. vadd.i32 q8, q8, q3
  949. vext.32 q3, q3, q3, #1
  950. veor q9, q8, q15
  951. vext.32 q8, q8, q8, #2
  952. vshl.i32 q15, q9, #7
  953. vsri.32 q15, q9, #25
  954. vext.32 q15, q15, q15, #3
  955. bne .L10
  956. cmp r5, #15
  957. mov r9, r5
  958. bhi .L88
  959. vadd.i32 q12, q12, q10
  960. ldr r3, [r7, #84]
  961. vst1.64 {d24-d25}, [r3:128]
  962. .L14:
  963. ldr r3, [r7, #8]
  964. and r2, r3, #48
  965. cmp r9, r2
  966. bls .L1
  967. ldr r6, [r7, #16]
  968. add r3, r2, #16
  969. ldr r1, [r7, #12]
  970. rsb ip, r2, r9
  971. adds r0, r1, r2
  972. mov r4, r6
  973. add r1, r1, r3
  974. add r4, r4, r2
  975. add r3, r3, r6
  976. cmp r0, r3
  977. it cc
  978. cmpcc r4, r1
  979. ite cs
  980. movcs r3, #1
  981. movcc r3, #0
  982. cmp ip, #18
  983. ite ls
  984. movls r3, #0
  985. andhi r3, r3, #1
  986. cmp r3, #0
  987. beq .L16
  988. and r1, r0, #7
  989. mov r3, r2
  990. negs r1, r1
  991. and r1, r1, #15
  992. cmp r1, ip
  993. it cs
  994. movcs r1, ip
  995. cmp r1, #0
  996. beq .L17
  997. ldr r5, [r7, #84]
  998. cmp r1, #1
  999. ldrb r0, [r0] @ zero_extendqisi2
  1000. add r3, r2, #1
  1001. ldrb lr, [r5, r2] @ zero_extendqisi2
  1002. mov r6, r5
  1003. eor r0, lr, r0
  1004. strb r0, [r4]
  1005. beq .L17
  1006. ldr r0, [r7, #12]
  1007. cmp r1, #2
  1008. ldrb r4, [r5, r3] @ zero_extendqisi2
  1009. ldr r5, [r7, #16]
  1010. ldrb r0, [r0, r3] @ zero_extendqisi2
  1011. eor r0, r0, r4
  1012. strb r0, [r5, r3]
  1013. add r3, r2, #2
  1014. beq .L17
  1015. ldr r0, [r7, #12]
  1016. cmp r1, #3
  1017. ldrb r4, [r6, r3] @ zero_extendqisi2
  1018. ldrb r0, [r0, r3] @ zero_extendqisi2
  1019. eor r0, r0, r4
  1020. strb r0, [r5, r3]
  1021. add r3, r2, #3
  1022. beq .L17
  1023. ldr r0, [r7, #12]
  1024. cmp r1, #4
  1025. ldrb r4, [r6, r3] @ zero_extendqisi2
  1026. ldrb r0, [r0, r3] @ zero_extendqisi2
  1027. eor r0, r0, r4
  1028. strb r0, [r5, r3]
  1029. add r3, r2, #4
  1030. beq .L17
  1031. ldr r0, [r7, #12]
  1032. cmp r1, #5
  1033. ldrb r4, [r6, r3] @ zero_extendqisi2
  1034. ldrb r0, [r0, r3] @ zero_extendqisi2
  1035. eor r0, r0, r4
  1036. strb r0, [r5, r3]
  1037. add r3, r2, #5
  1038. beq .L17
  1039. ldr r0, [r7, #12]
  1040. cmp r1, #6
  1041. ldrb r4, [r6, r3] @ zero_extendqisi2
  1042. ldrb r0, [r0, r3] @ zero_extendqisi2
  1043. eor r0, r0, r4
  1044. strb r0, [r5, r3]
  1045. add r3, r2, #6
  1046. beq .L17
  1047. ldr r0, [r7, #12]
  1048. cmp r1, #7
  1049. ldrb r4, [r6, r3] @ zero_extendqisi2
  1050. ldrb r0, [r0, r3] @ zero_extendqisi2
  1051. eor r0, r0, r4
  1052. strb r0, [r5, r3]
  1053. add r3, r2, #7
  1054. beq .L17
  1055. ldr r0, [r7, #12]
  1056. cmp r1, #8
  1057. ldrb r4, [r6, r3] @ zero_extendqisi2
  1058. ldrb r0, [r0, r3] @ zero_extendqisi2
  1059. eor r0, r0, r4
  1060. strb r0, [r5, r3]
  1061. add r3, r2, #8
  1062. beq .L17
  1063. ldr r0, [r7, #12]
  1064. cmp r1, #9
  1065. ldrb r4, [r6, r3] @ zero_extendqisi2
  1066. ldrb r0, [r0, r3] @ zero_extendqisi2
  1067. eor r0, r0, r4
  1068. strb r0, [r5, r3]
  1069. add r3, r2, #9
  1070. beq .L17
  1071. ldr r0, [r7, #12]
  1072. cmp r1, #10
  1073. ldrb r4, [r6, r3] @ zero_extendqisi2
  1074. ldrb r0, [r0, r3] @ zero_extendqisi2
  1075. eor r0, r0, r4
  1076. strb r0, [r5, r3]
  1077. add r3, r2, #10
  1078. beq .L17
  1079. ldr r0, [r7, #12]
  1080. cmp r1, #11
  1081. ldrb r4, [r6, r3] @ zero_extendqisi2
  1082. ldrb r0, [r0, r3] @ zero_extendqisi2
  1083. eor r0, r0, r4
  1084. strb r0, [r5, r3]
  1085. add r3, r2, #11
  1086. beq .L17
  1087. ldr r0, [r7, #12]
  1088. cmp r1, #12
  1089. ldrb r4, [r6, r3] @ zero_extendqisi2
  1090. ldrb r0, [r0, r3] @ zero_extendqisi2
  1091. eor r0, r0, r4
  1092. strb r0, [r5, r3]
  1093. add r3, r2, #12
  1094. beq .L17
  1095. ldr r0, [r7, #12]
  1096. cmp r1, #13
  1097. ldrb r4, [r6, r3] @ zero_extendqisi2
  1098. ldrb r0, [r0, r3] @ zero_extendqisi2
  1099. eor r0, r0, r4
  1100. strb r0, [r5, r3]
  1101. add r3, r2, #13
  1102. beq .L17
  1103. ldr r0, [r7, #12]
  1104. cmp r1, #15
  1105. ldrb r4, [r6, r3] @ zero_extendqisi2
  1106. ldrb r0, [r0, r3] @ zero_extendqisi2
  1107. eor r0, r0, r4
  1108. strb r0, [r5, r3]
  1109. add r3, r2, #14
  1110. bne .L17
  1111. ldr r0, [r7, #12]
  1112. ldrb r4, [r6, r3] @ zero_extendqisi2
  1113. ldrb r0, [r0, r3] @ zero_extendqisi2
  1114. eors r0, r0, r4
  1115. strb r0, [r5, r3]
  1116. add r3, r2, #15
  1117. .L17:
  1118. rsb r4, r1, ip
  1119. add r0, ip, #-1
  1120. sub r6, r4, #16
  1121. subs r0, r0, r1
  1122. cmp r0, #14
  1123. lsr r6, r6, #4
  1124. add r6, r6, #1
  1125. lsl lr, r6, #4
  1126. bls .L19
  1127. add r2, r2, r1
  1128. ldr r1, [r7, #12]
  1129. ldr r5, [r7, #16]
  1130. cmp r6, #1
  1131. add r0, r1, r2
  1132. ldr r1, [r7, #84]
  1133. add r1, r1, r2
  1134. vld1.64 {d18-d19}, [r0:64]
  1135. add r2, r2, r5
  1136. vld1.8 {q8}, [r1]
  1137. veor q8, q8, q9
  1138. vst1.8 {q8}, [r2]
  1139. beq .L20
  1140. add r8, r1, #16
  1141. add ip, r2, #16
  1142. vldr d18, [r0, #16]
  1143. vldr d19, [r0, #24]
  1144. cmp r6, #2
  1145. vld1.8 {q8}, [r8]
  1146. veor q8, q8, q9
  1147. vst1.8 {q8}, [ip]
  1148. beq .L20
  1149. add r8, r1, #32
  1150. add ip, r2, #32
  1151. vldr d18, [r0, #32]
  1152. vldr d19, [r0, #40]
  1153. cmp r6, #3
  1154. vld1.8 {q8}, [r8]
  1155. veor q8, q8, q9
  1156. vst1.8 {q8}, [ip]
  1157. beq .L20
  1158. adds r1, r1, #48
  1159. adds r2, r2, #48
  1160. vldr d18, [r0, #48]
  1161. vldr d19, [r0, #56]
  1162. vld1.8 {q8}, [r1]
  1163. veor q8, q8, q9
  1164. vst1.8 {q8}, [r2]
  1165. .L20:
  1166. cmp lr, r4
  1167. add r3, r3, lr
  1168. beq .L1
  1169. .L19:
  1170. ldr r4, [r7, #84]
  1171. adds r2, r3, #1
  1172. ldr r1, [r7, #12]
  1173. cmp r2, r9
  1174. ldr r5, [r7, #16]
  1175. ldrb r0, [r4, r3] @ zero_extendqisi2
  1176. ldrb r1, [r1, r3] @ zero_extendqisi2
  1177. eor r1, r1, r0
  1178. strb r1, [r5, r3]
  1179. bcs .L1
  1180. ldr r0, [r7, #12]
  1181. adds r1, r3, #2
  1182. mov r6, r4
  1183. cmp r9, r1
  1184. ldrb r4, [r4, r2] @ zero_extendqisi2
  1185. ldrb r0, [r0, r2] @ zero_extendqisi2
  1186. eor r0, r0, r4
  1187. strb r0, [r5, r2]
  1188. bls .L1
  1189. ldr r0, [r7, #12]
  1190. adds r2, r3, #3
  1191. ldrb r4, [r6, r1] @ zero_extendqisi2
  1192. cmp r9, r2
  1193. ldrb r0, [r0, r1] @ zero_extendqisi2
  1194. eor r0, r0, r4
  1195. strb r0, [r5, r1]
  1196. bls .L1
  1197. ldr r0, [r7, #12]
  1198. adds r1, r3, #4
  1199. ldrb r4, [r6, r2] @ zero_extendqisi2
  1200. cmp r9, r1
  1201. ldrb r0, [r0, r2] @ zero_extendqisi2
  1202. eor r0, r0, r4
  1203. strb r0, [r5, r2]
  1204. bls .L1
  1205. ldr r0, [r7, #12]
  1206. adds r2, r3, #5
  1207. ldrb r4, [r6, r1] @ zero_extendqisi2
  1208. cmp r9, r2
  1209. ldrb r0, [r0, r1] @ zero_extendqisi2
  1210. eor r0, r0, r4
  1211. strb r0, [r5, r1]
  1212. bls .L1
  1213. ldr r0, [r7, #12]
  1214. adds r1, r3, #6
  1215. ldrb r4, [r6, r2] @ zero_extendqisi2
  1216. cmp r9, r1
  1217. ldrb r0, [r0, r2] @ zero_extendqisi2
  1218. eor r0, r0, r4
  1219. strb r0, [r5, r2]
  1220. bls .L1
  1221. ldr r0, [r7, #12]
  1222. adds r2, r3, #7
  1223. ldrb r4, [r6, r1] @ zero_extendqisi2
  1224. cmp r9, r2
  1225. ldrb r0, [r0, r1] @ zero_extendqisi2
  1226. eor r0, r0, r4
  1227. strb r0, [r5, r1]
  1228. bls .L1
  1229. ldr r0, [r7, #12]
  1230. add r1, r3, #8
  1231. ldrb r4, [r6, r2] @ zero_extendqisi2
  1232. cmp r9, r1
  1233. ldrb r0, [r0, r2] @ zero_extendqisi2
  1234. eor r0, r0, r4
  1235. strb r0, [r5, r2]
  1236. bls .L1
  1237. ldr r0, [r7, #12]
  1238. add r2, r3, #9
  1239. ldrb r4, [r6, r1] @ zero_extendqisi2
  1240. cmp r9, r2
  1241. ldrb r0, [r0, r1] @ zero_extendqisi2
  1242. eor r0, r0, r4
  1243. strb r0, [r5, r1]
  1244. bls .L1
  1245. ldr r0, [r7, #12]
  1246. add r1, r3, #10
  1247. ldrb r4, [r6, r2] @ zero_extendqisi2
  1248. cmp r9, r1
  1249. ldrb r0, [r0, r2] @ zero_extendqisi2
  1250. eor r0, r0, r4
  1251. strb r0, [r5, r2]
  1252. bls .L1
  1253. ldr r0, [r7, #12]
  1254. add r2, r3, #11
  1255. ldrb r4, [r6, r1] @ zero_extendqisi2
  1256. cmp r9, r2
  1257. ldrb r0, [r0, r1] @ zero_extendqisi2
  1258. eor r0, r0, r4
  1259. strb r0, [r5, r1]
  1260. bls .L1
  1261. ldr r0, [r7, #12]
  1262. add r1, r3, #12
  1263. ldrb r4, [r6, r2] @ zero_extendqisi2
  1264. cmp r9, r1
  1265. ldrb r0, [r0, r2] @ zero_extendqisi2
  1266. eor r0, r0, r4
  1267. strb r0, [r5, r2]
  1268. bls .L1
  1269. ldr r0, [r7, #12]
  1270. add r2, r3, #13
  1271. ldrb r4, [r6, r1] @ zero_extendqisi2
  1272. cmp r9, r2
  1273. ldrb r0, [r0, r1] @ zero_extendqisi2
  1274. eor r0, r0, r4
  1275. strb r0, [r5, r1]
  1276. bls .L1
  1277. ldr r1, [r7, #12]
  1278. adds r3, r3, #14
  1279. ldrb r0, [r6, r2] @ zero_extendqisi2
  1280. cmp r9, r3
  1281. ldrb r1, [r1, r2] @ zero_extendqisi2
  1282. eor r1, r1, r0
  1283. strb r1, [r5, r2]
  1284. bls .L1
  1285. ldr r2, [r7, #84]
  1286. ldrb r1, [r2, r3] @ zero_extendqisi2
  1287. ldr r2, [r7, #12]
  1288. ldrb r2, [r2, r3] @ zero_extendqisi2
  1289. eors r2, r2, r1
  1290. ldr r1, [r7, #16]
  1291. strb r2, [r1, r3]
  1292. .L1:
  1293. adds r7, r7, #156
  1294. mov sp, r7
  1295. @ sp needed
  1296. vldm sp!, {d8-d15}
  1297. pop {r4, r5, r6, r7, r8, r9, r10, fp, pc}
  1298. .L88:
  1299. ldr r5, [r7, #12]
  1300. vadd.i32 q12, q12, q10
  1301. ldr r4, [r7, #80]
  1302. cmp r9, #31
  1303. ldr r0, [r5] @ unaligned
  1304. ldr r1, [r5, #4] @ unaligned
  1305. mov r6, r4
  1306. ldr r2, [r5, #8] @ unaligned
  1307. ldr r3, [r5, #12] @ unaligned
  1308. stmia r6!, {r0, r1, r2, r3}
  1309. ldr r2, [r7, #84]
  1310. ldr r6, [r7, #16]
  1311. vldr d18, [r2, #80]
  1312. vldr d19, [r2, #88]
  1313. veor q9, q9, q12
  1314. vstr d18, [r2, #80]
  1315. vstr d19, [r2, #88]
  1316. ldmia r4!, {r0, r1, r2, r3}
  1317. str r1, [r6, #4] @ unaligned
  1318. mov r1, r6
  1319. str r0, [r6] @ unaligned
  1320. str r2, [r6, #8] @ unaligned
  1321. str r3, [r6, #12] @ unaligned
  1322. bhi .L89
  1323. vadd.i32 q13, q13, q15
  1324. ldr r3, [r7, #84]
  1325. vstr d26, [r3, #16]
  1326. vstr d27, [r3, #24]
  1327. b .L14
  1328. .L16:
  1329. subs r3, r2, #1
  1330. ldr r2, [r7, #12]
  1331. add r2, r2, r9
  1332. mov r5, r2
  1333. ldr r2, [r7, #84]
  1334. add r2, r2, r3
  1335. mov r3, r2
  1336. .L24:
  1337. ldrb r1, [r0], #1 @ zero_extendqisi2
  1338. ldrb r2, [r3, #1]! @ zero_extendqisi2
  1339. cmp r0, r5
  1340. eor r2, r2, r1
  1341. strb r2, [r4], #1
  1342. bne .L24
  1343. adds r7, r7, #156
  1344. mov sp, r7
  1345. @ sp needed
  1346. vldm sp!, {d8-d15}
  1347. pop {r4, r5, r6, r7, r8, r9, r10, fp, pc}
  1348. .L26:
  1349. str fp, [r7, #16]
  1350. b .L2
  1351. .L89:
  1352. mov r3, r5
  1353. ldr r4, [r7, #80]
  1354. ldr r0, [r3, #16]! @ unaligned
  1355. add lr, r1, #16
  1356. mov r5, r1
  1357. vadd.i32 q13, q13, q15
  1358. mov r6, r4
  1359. cmp r9, #47
  1360. ldr r1, [r3, #4] @ unaligned
  1361. ldr r2, [r3, #8] @ unaligned
  1362. ldr r3, [r3, #12] @ unaligned
  1363. stmia r6!, {r0, r1, r2, r3}
  1364. ldr r2, [r7, #84]
  1365. vldr d18, [r2, #80]
  1366. vldr d19, [r2, #88]
  1367. veor q13, q9, q13
  1368. vstr d26, [r2, #80]
  1369. vstr d27, [r2, #88]
  1370. ldmia r4!, {r0, r1, r2, r3}
  1371. str r0, [r5, #16] @ unaligned
  1372. str r1, [lr, #4] @ unaligned
  1373. str r2, [lr, #8] @ unaligned
  1374. str r3, [lr, #12] @ unaligned
  1375. bhi .L90
  1376. vadd.i32 q8, q14, q8
  1377. ldr r3, [r7, #84]
  1378. vstr d16, [r3, #32]
  1379. vstr d17, [r3, #40]
  1380. b .L14
  1381. .L90:
  1382. ldr r3, [r7, #12]
  1383. add lr, r5, #32
  1384. ldr r4, [r7, #80]
  1385. vadd.i32 q8, q14, q8
  1386. ldr r5, [r7, #84]
  1387. vadd.i32 q11, q11, q3
  1388. ldr r0, [r3, #32]! @ unaligned
  1389. mov r6, r4
  1390. vstr d22, [r5, #48]
  1391. vstr d23, [r5, #56]
  1392. ldr r1, [r3, #4] @ unaligned
  1393. ldr r2, [r3, #8] @ unaligned
  1394. ldr r3, [r3, #12] @ unaligned
  1395. stmia r4!, {r0, r1, r2, r3}
  1396. vldr d18, [r5, #80]
  1397. vldr d19, [r5, #88]
  1398. veor q9, q9, q8
  1399. ldr r4, [r7, #16]
  1400. vstr d18, [r5, #80]
  1401. vstr d19, [r5, #88]
  1402. ldmia r6!, {r0, r1, r2, r3}
  1403. str r0, [r4, #32] @ unaligned
  1404. str r1, [lr, #4] @ unaligned
  1405. str r2, [lr, #8] @ unaligned
  1406. str r3, [lr, #12] @ unaligned
  1407. b .L14
  1408. .size CRYPTO_chacha_20_neon, .-CRYPTO_chacha_20_neon
  1409. .section .rodata
  1410. .align 2
  1411. .LANCHOR0 = . + 0
  1412. .LC0:
  1413. .word 1634760805
  1414. .word 857760878
  1415. .word 2036477234
  1416. .word 1797285236
  1417. .ident "GCC: (Linaro GCC 2014.11) 4.9.3 20141031 (prerelease)"
  1418. .section .note.GNU-stack,"",%progbits
  1419. #endif /* !OPENSSL_NO_ASM */