armv4-mont.S 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982
  1. // This file is generated from a similarly-named Perl script in the BoringSSL
  2. // source tree. Do not edit by hand.
  3. #if !defined(__has_feature)
  4. #define __has_feature(x) 0
  5. #endif
  6. #if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
  7. #define OPENSSL_NO_ASM
  8. #endif
  9. #if !defined(OPENSSL_NO_ASM)
  10. #if defined(BORINGSSL_PREFIX)
  11. #include <boringssl_prefix_symbols_asm.h>
  12. #endif
  13. #include <openssl/arm_arch.h>
  14. @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both
  15. @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions.
  16. .text
  17. #if defined(__thumb2__)
  18. .syntax unified
  19. .thumb
  20. #else
  21. .code 32
  22. #endif
  23. #if __ARM_MAX_ARCH__>=7
  24. .align 5
  25. LOPENSSL_armcap:
  26. .word OPENSSL_armcap_P-Lbn_mul_mont
  27. #endif
  28. .globl _bn_mul_mont
  29. .private_extern _bn_mul_mont
  30. #ifdef __thumb2__
  31. .thumb_func _bn_mul_mont
  32. #endif
  33. .align 5
  34. _bn_mul_mont:
  35. Lbn_mul_mont:
  36. ldr ip,[sp,#4] @ load num
  37. stmdb sp!,{r0,r2} @ sp points at argument block
  38. #if __ARM_MAX_ARCH__>=7
  39. tst ip,#7
  40. bne Lialu
  41. adr r0,Lbn_mul_mont
  42. ldr r2,LOPENSSL_armcap
  43. ldr r0,[r0,r2]
  44. #ifdef __APPLE__
  45. ldr r0,[r0]
  46. #endif
  47. tst r0,#ARMV7_NEON @ NEON available?
  48. ldmia sp, {r0,r2}
  49. beq Lialu
  50. add sp,sp,#8
  51. b bn_mul8x_mont_neon
  52. .align 4
  53. Lialu:
  54. #endif
  55. cmp ip,#2
  56. mov r0,ip @ load num
  57. #ifdef __thumb2__
  58. ittt lt
  59. #endif
  60. movlt r0,#0
  61. addlt sp,sp,#2*4
  62. blt Labrt
  63. stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ save 10 registers
  64. mov r0,r0,lsl#2 @ rescale r0 for byte count
  65. sub sp,sp,r0 @ alloca(4*num)
  66. sub sp,sp,#4 @ +extra dword
  67. sub r0,r0,#4 @ "num=num-1"
  68. add r4,r2,r0 @ &bp[num-1]
  69. add r0,sp,r0 @ r0 to point at &tp[num-1]
  70. ldr r8,[r0,#14*4] @ &n0
  71. ldr r2,[r2] @ bp[0]
  72. ldr r5,[r1],#4 @ ap[0],ap++
  73. ldr r6,[r3],#4 @ np[0],np++
  74. ldr r8,[r8] @ *n0
  75. str r4,[r0,#15*4] @ save &bp[num]
  76. umull r10,r11,r5,r2 @ ap[0]*bp[0]
  77. str r8,[r0,#14*4] @ save n0 value
  78. mul r8,r10,r8 @ "tp[0]"*n0
  79. mov r12,#0
  80. umlal r10,r12,r6,r8 @ np[0]*n0+"t[0]"
  81. mov r4,sp
  82. L1st:
  83. ldr r5,[r1],#4 @ ap[j],ap++
  84. mov r10,r11
  85. ldr r6,[r3],#4 @ np[j],np++
  86. mov r11,#0
  87. umlal r10,r11,r5,r2 @ ap[j]*bp[0]
  88. mov r14,#0
  89. umlal r12,r14,r6,r8 @ np[j]*n0
  90. adds r12,r12,r10
  91. str r12,[r4],#4 @ tp[j-1]=,tp++
  92. adc r12,r14,#0
  93. cmp r4,r0
  94. bne L1st
  95. adds r12,r12,r11
  96. ldr r4,[r0,#13*4] @ restore bp
  97. mov r14,#0
  98. ldr r8,[r0,#14*4] @ restore n0
  99. adc r14,r14,#0
  100. str r12,[r0] @ tp[num-1]=
  101. mov r7,sp
  102. str r14,[r0,#4] @ tp[num]=
  103. Louter:
  104. sub r7,r0,r7 @ "original" r0-1 value
  105. sub r1,r1,r7 @ "rewind" ap to &ap[1]
  106. ldr r2,[r4,#4]! @ *(++bp)
  107. sub r3,r3,r7 @ "rewind" np to &np[1]
  108. ldr r5,[r1,#-4] @ ap[0]
  109. ldr r10,[sp] @ tp[0]
  110. ldr r6,[r3,#-4] @ np[0]
  111. ldr r7,[sp,#4] @ tp[1]
  112. mov r11,#0
  113. umlal r10,r11,r5,r2 @ ap[0]*bp[i]+tp[0]
  114. str r4,[r0,#13*4] @ save bp
  115. mul r8,r10,r8
  116. mov r12,#0
  117. umlal r10,r12,r6,r8 @ np[0]*n0+"tp[0]"
  118. mov r4,sp
  119. Linner:
  120. ldr r5,[r1],#4 @ ap[j],ap++
  121. adds r10,r11,r7 @ +=tp[j]
  122. ldr r6,[r3],#4 @ np[j],np++
  123. mov r11,#0
  124. umlal r10,r11,r5,r2 @ ap[j]*bp[i]
  125. mov r14,#0
  126. umlal r12,r14,r6,r8 @ np[j]*n0
  127. adc r11,r11,#0
  128. ldr r7,[r4,#8] @ tp[j+1]
  129. adds r12,r12,r10
  130. str r12,[r4],#4 @ tp[j-1]=,tp++
  131. adc r12,r14,#0
  132. cmp r4,r0
  133. bne Linner
  134. adds r12,r12,r11
  135. mov r14,#0
  136. ldr r4,[r0,#13*4] @ restore bp
  137. adc r14,r14,#0
  138. ldr r8,[r0,#14*4] @ restore n0
  139. adds r12,r12,r7
  140. ldr r7,[r0,#15*4] @ restore &bp[num]
  141. adc r14,r14,#0
  142. str r12,[r0] @ tp[num-1]=
  143. str r14,[r0,#4] @ tp[num]=
  144. cmp r4,r7
  145. #ifdef __thumb2__
  146. itt ne
  147. #endif
  148. movne r7,sp
  149. bne Louter
  150. ldr r2,[r0,#12*4] @ pull rp
  151. mov r5,sp
  152. add r0,r0,#4 @ r0 to point at &tp[num]
  153. sub r5,r0,r5 @ "original" num value
  154. mov r4,sp @ "rewind" r4
  155. mov r1,r4 @ "borrow" r1
  156. sub r3,r3,r5 @ "rewind" r3 to &np[0]
  157. subs r7,r7,r7 @ "clear" carry flag
  158. Lsub: ldr r7,[r4],#4
  159. ldr r6,[r3],#4
  160. sbcs r7,r7,r6 @ tp[j]-np[j]
  161. str r7,[r2],#4 @ rp[j]=
  162. teq r4,r0 @ preserve carry
  163. bne Lsub
  164. sbcs r14,r14,#0 @ upmost carry
  165. mov r4,sp @ "rewind" r4
  166. sub r2,r2,r5 @ "rewind" r2
  167. Lcopy: ldr r7,[r4] @ conditional copy
  168. ldr r5,[r2]
  169. str sp,[r4],#4 @ zap tp
  170. #ifdef __thumb2__
  171. it cc
  172. #endif
  173. movcc r5,r7
  174. str r5,[r2],#4
  175. teq r4,r0 @ preserve carry
  176. bne Lcopy
  177. mov sp,r0
  178. add sp,sp,#4 @ skip over tp[num+1]
  179. ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ restore registers
  180. add sp,sp,#2*4 @ skip over {r0,r2}
  181. mov r0,#1
  182. Labrt:
  183. #if __ARM_ARCH__>=5
  184. bx lr @ bx lr
  185. #else
  186. tst lr,#1
  187. moveq pc,lr @ be binary compatible with V4, yet
  188. .word 0xe12fff1e @ interoperable with Thumb ISA:-)
  189. #endif
  190. #if __ARM_MAX_ARCH__>=7
  191. #ifdef __thumb2__
  192. .thumb_func bn_mul8x_mont_neon
  193. #endif
  194. .align 5
  195. bn_mul8x_mont_neon:
  196. mov ip,sp
  197. stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11}
  198. vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI specification says so
  199. ldmia ip,{r4,r5} @ load rest of parameter block
  200. mov ip,sp
  201. cmp r5,#8
  202. bhi LNEON_8n
  203. @ special case for r5==8, everything is in register bank...
  204. vld1.32 {d28[0]}, [r2,:32]!
  205. veor d8,d8,d8
  206. sub r7,sp,r5,lsl#4
  207. vld1.32 {d0,d1,d2,d3}, [r1]! @ can't specify :32 :-(
  208. and r7,r7,#-64
  209. vld1.32 {d30[0]}, [r4,:32]
  210. mov sp,r7 @ alloca
  211. vzip.16 d28,d8
  212. vmull.u32 q6,d28,d0[0]
  213. vmull.u32 q7,d28,d0[1]
  214. vmull.u32 q8,d28,d1[0]
  215. vshl.i64 d29,d13,#16
  216. vmull.u32 q9,d28,d1[1]
  217. vadd.u64 d29,d29,d12
  218. veor d8,d8,d8
  219. vmul.u32 d29,d29,d30
  220. vmull.u32 q10,d28,d2[0]
  221. vld1.32 {d4,d5,d6,d7}, [r3]!
  222. vmull.u32 q11,d28,d2[1]
  223. vmull.u32 q12,d28,d3[0]
  224. vzip.16 d29,d8
  225. vmull.u32 q13,d28,d3[1]
  226. vmlal.u32 q6,d29,d4[0]
  227. sub r9,r5,#1
  228. vmlal.u32 q7,d29,d4[1]
  229. vmlal.u32 q8,d29,d5[0]
  230. vmlal.u32 q9,d29,d5[1]
  231. vmlal.u32 q10,d29,d6[0]
  232. vmov q5,q6
  233. vmlal.u32 q11,d29,d6[1]
  234. vmov q6,q7
  235. vmlal.u32 q12,d29,d7[0]
  236. vmov q7,q8
  237. vmlal.u32 q13,d29,d7[1]
  238. vmov q8,q9
  239. vmov q9,q10
  240. vshr.u64 d10,d10,#16
  241. vmov q10,q11
  242. vmov q11,q12
  243. vadd.u64 d10,d10,d11
  244. vmov q12,q13
  245. veor q13,q13
  246. vshr.u64 d10,d10,#16
  247. b LNEON_outer8
  248. .align 4
  249. LNEON_outer8:
  250. vld1.32 {d28[0]}, [r2,:32]!
  251. veor d8,d8,d8
  252. vzip.16 d28,d8
  253. vadd.u64 d12,d12,d10
  254. vmlal.u32 q6,d28,d0[0]
  255. vmlal.u32 q7,d28,d0[1]
  256. vmlal.u32 q8,d28,d1[0]
  257. vshl.i64 d29,d13,#16
  258. vmlal.u32 q9,d28,d1[1]
  259. vadd.u64 d29,d29,d12
  260. veor d8,d8,d8
  261. subs r9,r9,#1
  262. vmul.u32 d29,d29,d30
  263. vmlal.u32 q10,d28,d2[0]
  264. vmlal.u32 q11,d28,d2[1]
  265. vmlal.u32 q12,d28,d3[0]
  266. vzip.16 d29,d8
  267. vmlal.u32 q13,d28,d3[1]
  268. vmlal.u32 q6,d29,d4[0]
  269. vmlal.u32 q7,d29,d4[1]
  270. vmlal.u32 q8,d29,d5[0]
  271. vmlal.u32 q9,d29,d5[1]
  272. vmlal.u32 q10,d29,d6[0]
  273. vmov q5,q6
  274. vmlal.u32 q11,d29,d6[1]
  275. vmov q6,q7
  276. vmlal.u32 q12,d29,d7[0]
  277. vmov q7,q8
  278. vmlal.u32 q13,d29,d7[1]
  279. vmov q8,q9
  280. vmov q9,q10
  281. vshr.u64 d10,d10,#16
  282. vmov q10,q11
  283. vmov q11,q12
  284. vadd.u64 d10,d10,d11
  285. vmov q12,q13
  286. veor q13,q13
  287. vshr.u64 d10,d10,#16
  288. bne LNEON_outer8
  289. vadd.u64 d12,d12,d10
  290. mov r7,sp
  291. vshr.u64 d10,d12,#16
  292. mov r8,r5
  293. vadd.u64 d13,d13,d10
  294. add r6,sp,#96
  295. vshr.u64 d10,d13,#16
  296. vzip.16 d12,d13
  297. b LNEON_tail_entry
  298. .align 4
  299. LNEON_8n:
  300. veor q6,q6,q6
  301. sub r7,sp,#128
  302. veor q7,q7,q7
  303. sub r7,r7,r5,lsl#4
  304. veor q8,q8,q8
  305. and r7,r7,#-64
  306. veor q9,q9,q9
  307. mov sp,r7 @ alloca
  308. veor q10,q10,q10
  309. add r7,r7,#256
  310. veor q11,q11,q11
  311. sub r8,r5,#8
  312. veor q12,q12,q12
  313. veor q13,q13,q13
  314. LNEON_8n_init:
  315. vst1.64 {q6,q7},[r7,:256]!
  316. subs r8,r8,#8
  317. vst1.64 {q8,q9},[r7,:256]!
  318. vst1.64 {q10,q11},[r7,:256]!
  319. vst1.64 {q12,q13},[r7,:256]!
  320. bne LNEON_8n_init
  321. add r6,sp,#256
  322. vld1.32 {d0,d1,d2,d3},[r1]!
  323. add r10,sp,#8
  324. vld1.32 {d30[0]},[r4,:32]
  325. mov r9,r5
  326. b LNEON_8n_outer
  327. .align 4
  328. LNEON_8n_outer:
  329. vld1.32 {d28[0]},[r2,:32]! @ *b++
  330. veor d8,d8,d8
  331. vzip.16 d28,d8
  332. add r7,sp,#128
  333. vld1.32 {d4,d5,d6,d7},[r3]!
  334. vmlal.u32 q6,d28,d0[0]
  335. vmlal.u32 q7,d28,d0[1]
  336. veor d8,d8,d8
  337. vmlal.u32 q8,d28,d1[0]
  338. vshl.i64 d29,d13,#16
  339. vmlal.u32 q9,d28,d1[1]
  340. vadd.u64 d29,d29,d12
  341. vmlal.u32 q10,d28,d2[0]
  342. vmul.u32 d29,d29,d30
  343. vmlal.u32 q11,d28,d2[1]
  344. vst1.32 {d28},[sp,:64] @ put aside smashed b[8*i+0]
  345. vmlal.u32 q12,d28,d3[0]
  346. vzip.16 d29,d8
  347. vmlal.u32 q13,d28,d3[1]
  348. vld1.32 {d28[0]},[r2,:32]! @ *b++
  349. vmlal.u32 q6,d29,d4[0]
  350. veor d10,d10,d10
  351. vmlal.u32 q7,d29,d4[1]
  352. vzip.16 d28,d10
  353. vmlal.u32 q8,d29,d5[0]
  354. vshr.u64 d12,d12,#16
  355. vmlal.u32 q9,d29,d5[1]
  356. vmlal.u32 q10,d29,d6[0]
  357. vadd.u64 d12,d12,d13
  358. vmlal.u32 q11,d29,d6[1]
  359. vshr.u64 d12,d12,#16
  360. vmlal.u32 q12,d29,d7[0]
  361. vmlal.u32 q13,d29,d7[1]
  362. vadd.u64 d14,d14,d12
  363. vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+0]
  364. vmlal.u32 q7,d28,d0[0]
  365. vld1.64 {q6},[r6,:128]!
  366. vmlal.u32 q8,d28,d0[1]
  367. veor d8,d8,d8
  368. vmlal.u32 q9,d28,d1[0]
  369. vshl.i64 d29,d15,#16
  370. vmlal.u32 q10,d28,d1[1]
  371. vadd.u64 d29,d29,d14
  372. vmlal.u32 q11,d28,d2[0]
  373. vmul.u32 d29,d29,d30
  374. vmlal.u32 q12,d28,d2[1]
  375. vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+1]
  376. vmlal.u32 q13,d28,d3[0]
  377. vzip.16 d29,d8
  378. vmlal.u32 q6,d28,d3[1]
  379. vld1.32 {d28[0]},[r2,:32]! @ *b++
  380. vmlal.u32 q7,d29,d4[0]
  381. veor d10,d10,d10
  382. vmlal.u32 q8,d29,d4[1]
  383. vzip.16 d28,d10
  384. vmlal.u32 q9,d29,d5[0]
  385. vshr.u64 d14,d14,#16
  386. vmlal.u32 q10,d29,d5[1]
  387. vmlal.u32 q11,d29,d6[0]
  388. vadd.u64 d14,d14,d15
  389. vmlal.u32 q12,d29,d6[1]
  390. vshr.u64 d14,d14,#16
  391. vmlal.u32 q13,d29,d7[0]
  392. vmlal.u32 q6,d29,d7[1]
  393. vadd.u64 d16,d16,d14
  394. vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+1]
  395. vmlal.u32 q8,d28,d0[0]
  396. vld1.64 {q7},[r6,:128]!
  397. vmlal.u32 q9,d28,d0[1]
  398. veor d8,d8,d8
  399. vmlal.u32 q10,d28,d1[0]
  400. vshl.i64 d29,d17,#16
  401. vmlal.u32 q11,d28,d1[1]
  402. vadd.u64 d29,d29,d16
  403. vmlal.u32 q12,d28,d2[0]
  404. vmul.u32 d29,d29,d30
  405. vmlal.u32 q13,d28,d2[1]
  406. vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+2]
  407. vmlal.u32 q6,d28,d3[0]
  408. vzip.16 d29,d8
  409. vmlal.u32 q7,d28,d3[1]
  410. vld1.32 {d28[0]},[r2,:32]! @ *b++
  411. vmlal.u32 q8,d29,d4[0]
  412. veor d10,d10,d10
  413. vmlal.u32 q9,d29,d4[1]
  414. vzip.16 d28,d10
  415. vmlal.u32 q10,d29,d5[0]
  416. vshr.u64 d16,d16,#16
  417. vmlal.u32 q11,d29,d5[1]
  418. vmlal.u32 q12,d29,d6[0]
  419. vadd.u64 d16,d16,d17
  420. vmlal.u32 q13,d29,d6[1]
  421. vshr.u64 d16,d16,#16
  422. vmlal.u32 q6,d29,d7[0]
  423. vmlal.u32 q7,d29,d7[1]
  424. vadd.u64 d18,d18,d16
  425. vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+2]
  426. vmlal.u32 q9,d28,d0[0]
  427. vld1.64 {q8},[r6,:128]!
  428. vmlal.u32 q10,d28,d0[1]
  429. veor d8,d8,d8
  430. vmlal.u32 q11,d28,d1[0]
  431. vshl.i64 d29,d19,#16
  432. vmlal.u32 q12,d28,d1[1]
  433. vadd.u64 d29,d29,d18
  434. vmlal.u32 q13,d28,d2[0]
  435. vmul.u32 d29,d29,d30
  436. vmlal.u32 q6,d28,d2[1]
  437. vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+3]
  438. vmlal.u32 q7,d28,d3[0]
  439. vzip.16 d29,d8
  440. vmlal.u32 q8,d28,d3[1]
  441. vld1.32 {d28[0]},[r2,:32]! @ *b++
  442. vmlal.u32 q9,d29,d4[0]
  443. veor d10,d10,d10
  444. vmlal.u32 q10,d29,d4[1]
  445. vzip.16 d28,d10
  446. vmlal.u32 q11,d29,d5[0]
  447. vshr.u64 d18,d18,#16
  448. vmlal.u32 q12,d29,d5[1]
  449. vmlal.u32 q13,d29,d6[0]
  450. vadd.u64 d18,d18,d19
  451. vmlal.u32 q6,d29,d6[1]
  452. vshr.u64 d18,d18,#16
  453. vmlal.u32 q7,d29,d7[0]
  454. vmlal.u32 q8,d29,d7[1]
  455. vadd.u64 d20,d20,d18
  456. vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+3]
  457. vmlal.u32 q10,d28,d0[0]
  458. vld1.64 {q9},[r6,:128]!
  459. vmlal.u32 q11,d28,d0[1]
  460. veor d8,d8,d8
  461. vmlal.u32 q12,d28,d1[0]
  462. vshl.i64 d29,d21,#16
  463. vmlal.u32 q13,d28,d1[1]
  464. vadd.u64 d29,d29,d20
  465. vmlal.u32 q6,d28,d2[0]
  466. vmul.u32 d29,d29,d30
  467. vmlal.u32 q7,d28,d2[1]
  468. vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+4]
  469. vmlal.u32 q8,d28,d3[0]
  470. vzip.16 d29,d8
  471. vmlal.u32 q9,d28,d3[1]
  472. vld1.32 {d28[0]},[r2,:32]! @ *b++
  473. vmlal.u32 q10,d29,d4[0]
  474. veor d10,d10,d10
  475. vmlal.u32 q11,d29,d4[1]
  476. vzip.16 d28,d10
  477. vmlal.u32 q12,d29,d5[0]
  478. vshr.u64 d20,d20,#16
  479. vmlal.u32 q13,d29,d5[1]
  480. vmlal.u32 q6,d29,d6[0]
  481. vadd.u64 d20,d20,d21
  482. vmlal.u32 q7,d29,d6[1]
  483. vshr.u64 d20,d20,#16
  484. vmlal.u32 q8,d29,d7[0]
  485. vmlal.u32 q9,d29,d7[1]
  486. vadd.u64 d22,d22,d20
  487. vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+4]
  488. vmlal.u32 q11,d28,d0[0]
  489. vld1.64 {q10},[r6,:128]!
  490. vmlal.u32 q12,d28,d0[1]
  491. veor d8,d8,d8
  492. vmlal.u32 q13,d28,d1[0]
  493. vshl.i64 d29,d23,#16
  494. vmlal.u32 q6,d28,d1[1]
  495. vadd.u64 d29,d29,d22
  496. vmlal.u32 q7,d28,d2[0]
  497. vmul.u32 d29,d29,d30
  498. vmlal.u32 q8,d28,d2[1]
  499. vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+5]
  500. vmlal.u32 q9,d28,d3[0]
  501. vzip.16 d29,d8
  502. vmlal.u32 q10,d28,d3[1]
  503. vld1.32 {d28[0]},[r2,:32]! @ *b++
  504. vmlal.u32 q11,d29,d4[0]
  505. veor d10,d10,d10
  506. vmlal.u32 q12,d29,d4[1]
  507. vzip.16 d28,d10
  508. vmlal.u32 q13,d29,d5[0]
  509. vshr.u64 d22,d22,#16
  510. vmlal.u32 q6,d29,d5[1]
  511. vmlal.u32 q7,d29,d6[0]
  512. vadd.u64 d22,d22,d23
  513. vmlal.u32 q8,d29,d6[1]
  514. vshr.u64 d22,d22,#16
  515. vmlal.u32 q9,d29,d7[0]
  516. vmlal.u32 q10,d29,d7[1]
  517. vadd.u64 d24,d24,d22
  518. vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+5]
  519. vmlal.u32 q12,d28,d0[0]
  520. vld1.64 {q11},[r6,:128]!
  521. vmlal.u32 q13,d28,d0[1]
  522. veor d8,d8,d8
  523. vmlal.u32 q6,d28,d1[0]
  524. vshl.i64 d29,d25,#16
  525. vmlal.u32 q7,d28,d1[1]
  526. vadd.u64 d29,d29,d24
  527. vmlal.u32 q8,d28,d2[0]
  528. vmul.u32 d29,d29,d30
  529. vmlal.u32 q9,d28,d2[1]
  530. vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+6]
  531. vmlal.u32 q10,d28,d3[0]
  532. vzip.16 d29,d8
  533. vmlal.u32 q11,d28,d3[1]
  534. vld1.32 {d28[0]},[r2,:32]! @ *b++
  535. vmlal.u32 q12,d29,d4[0]
  536. veor d10,d10,d10
  537. vmlal.u32 q13,d29,d4[1]
  538. vzip.16 d28,d10
  539. vmlal.u32 q6,d29,d5[0]
  540. vshr.u64 d24,d24,#16
  541. vmlal.u32 q7,d29,d5[1]
  542. vmlal.u32 q8,d29,d6[0]
  543. vadd.u64 d24,d24,d25
  544. vmlal.u32 q9,d29,d6[1]
  545. vshr.u64 d24,d24,#16
  546. vmlal.u32 q10,d29,d7[0]
  547. vmlal.u32 q11,d29,d7[1]
  548. vadd.u64 d26,d26,d24
  549. vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+6]
  550. vmlal.u32 q13,d28,d0[0]
  551. vld1.64 {q12},[r6,:128]!
  552. vmlal.u32 q6,d28,d0[1]
  553. veor d8,d8,d8
  554. vmlal.u32 q7,d28,d1[0]
  555. vshl.i64 d29,d27,#16
  556. vmlal.u32 q8,d28,d1[1]
  557. vadd.u64 d29,d29,d26
  558. vmlal.u32 q9,d28,d2[0]
  559. vmul.u32 d29,d29,d30
  560. vmlal.u32 q10,d28,d2[1]
  561. vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+7]
  562. vmlal.u32 q11,d28,d3[0]
  563. vzip.16 d29,d8
  564. vmlal.u32 q12,d28,d3[1]
  565. vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0]
  566. vmlal.u32 q13,d29,d4[0]
  567. vld1.32 {d0,d1,d2,d3},[r1]!
  568. vmlal.u32 q6,d29,d4[1]
  569. vmlal.u32 q7,d29,d5[0]
  570. vshr.u64 d26,d26,#16
  571. vmlal.u32 q8,d29,d5[1]
  572. vmlal.u32 q9,d29,d6[0]
  573. vadd.u64 d26,d26,d27
  574. vmlal.u32 q10,d29,d6[1]
  575. vshr.u64 d26,d26,#16
  576. vmlal.u32 q11,d29,d7[0]
  577. vmlal.u32 q12,d29,d7[1]
  578. vadd.u64 d12,d12,d26
  579. vst1.32 {d29},[r10,:64] @ put aside smashed m[8*i+7]
  580. add r10,sp,#8 @ rewind
  581. sub r8,r5,#8
  582. b LNEON_8n_inner
  583. .align 4
  584. LNEON_8n_inner:
  585. subs r8,r8,#8
  586. vmlal.u32 q6,d28,d0[0]
  587. vld1.64 {q13},[r6,:128]
  588. vmlal.u32 q7,d28,d0[1]
  589. vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+0]
  590. vmlal.u32 q8,d28,d1[0]
  591. vld1.32 {d4,d5,d6,d7},[r3]!
  592. vmlal.u32 q9,d28,d1[1]
  593. it ne
  594. addne r6,r6,#16 @ don't advance in last iteration
  595. vmlal.u32 q10,d28,d2[0]
  596. vmlal.u32 q11,d28,d2[1]
  597. vmlal.u32 q12,d28,d3[0]
  598. vmlal.u32 q13,d28,d3[1]
  599. vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+1]
  600. vmlal.u32 q6,d29,d4[0]
  601. vmlal.u32 q7,d29,d4[1]
  602. vmlal.u32 q8,d29,d5[0]
  603. vmlal.u32 q9,d29,d5[1]
  604. vmlal.u32 q10,d29,d6[0]
  605. vmlal.u32 q11,d29,d6[1]
  606. vmlal.u32 q12,d29,d7[0]
  607. vmlal.u32 q13,d29,d7[1]
  608. vst1.64 {q6},[r7,:128]!
  609. vmlal.u32 q7,d28,d0[0]
  610. vld1.64 {q6},[r6,:128]
  611. vmlal.u32 q8,d28,d0[1]
  612. vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+1]
  613. vmlal.u32 q9,d28,d1[0]
  614. it ne
  615. addne r6,r6,#16 @ don't advance in last iteration
  616. vmlal.u32 q10,d28,d1[1]
  617. vmlal.u32 q11,d28,d2[0]
  618. vmlal.u32 q12,d28,d2[1]
  619. vmlal.u32 q13,d28,d3[0]
  620. vmlal.u32 q6,d28,d3[1]
  621. vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+2]
  622. vmlal.u32 q7,d29,d4[0]
  623. vmlal.u32 q8,d29,d4[1]
  624. vmlal.u32 q9,d29,d5[0]
  625. vmlal.u32 q10,d29,d5[1]
  626. vmlal.u32 q11,d29,d6[0]
  627. vmlal.u32 q12,d29,d6[1]
  628. vmlal.u32 q13,d29,d7[0]
  629. vmlal.u32 q6,d29,d7[1]
  630. vst1.64 {q7},[r7,:128]!
  631. vmlal.u32 q8,d28,d0[0]
  632. vld1.64 {q7},[r6,:128]
  633. vmlal.u32 q9,d28,d0[1]
  634. vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+2]
  635. vmlal.u32 q10,d28,d1[0]
  636. it ne
  637. addne r6,r6,#16 @ don't advance in last iteration
  638. vmlal.u32 q11,d28,d1[1]
  639. vmlal.u32 q12,d28,d2[0]
  640. vmlal.u32 q13,d28,d2[1]
  641. vmlal.u32 q6,d28,d3[0]
  642. vmlal.u32 q7,d28,d3[1]
  643. vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+3]
  644. vmlal.u32 q8,d29,d4[0]
  645. vmlal.u32 q9,d29,d4[1]
  646. vmlal.u32 q10,d29,d5[0]
  647. vmlal.u32 q11,d29,d5[1]
  648. vmlal.u32 q12,d29,d6[0]
  649. vmlal.u32 q13,d29,d6[1]
  650. vmlal.u32 q6,d29,d7[0]
  651. vmlal.u32 q7,d29,d7[1]
  652. vst1.64 {q8},[r7,:128]!
  653. vmlal.u32 q9,d28,d0[0]
  654. vld1.64 {q8},[r6,:128]
  655. vmlal.u32 q10,d28,d0[1]
  656. vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+3]
  657. vmlal.u32 q11,d28,d1[0]
  658. it ne
  659. addne r6,r6,#16 @ don't advance in last iteration
  660. vmlal.u32 q12,d28,d1[1]
  661. vmlal.u32 q13,d28,d2[0]
  662. vmlal.u32 q6,d28,d2[1]
  663. vmlal.u32 q7,d28,d3[0]
  664. vmlal.u32 q8,d28,d3[1]
  665. vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+4]
  666. vmlal.u32 q9,d29,d4[0]
  667. vmlal.u32 q10,d29,d4[1]
  668. vmlal.u32 q11,d29,d5[0]
  669. vmlal.u32 q12,d29,d5[1]
  670. vmlal.u32 q13,d29,d6[0]
  671. vmlal.u32 q6,d29,d6[1]
  672. vmlal.u32 q7,d29,d7[0]
  673. vmlal.u32 q8,d29,d7[1]
  674. vst1.64 {q9},[r7,:128]!
  675. vmlal.u32 q10,d28,d0[0]
  676. vld1.64 {q9},[r6,:128]
  677. vmlal.u32 q11,d28,d0[1]
  678. vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+4]
  679. vmlal.u32 q12,d28,d1[0]
  680. it ne
  681. addne r6,r6,#16 @ don't advance in last iteration
  682. vmlal.u32 q13,d28,d1[1]
  683. vmlal.u32 q6,d28,d2[0]
  684. vmlal.u32 q7,d28,d2[1]
  685. vmlal.u32 q8,d28,d3[0]
  686. vmlal.u32 q9,d28,d3[1]
  687. vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+5]
  688. vmlal.u32 q10,d29,d4[0]
  689. vmlal.u32 q11,d29,d4[1]
  690. vmlal.u32 q12,d29,d5[0]
  691. vmlal.u32 q13,d29,d5[1]
  692. vmlal.u32 q6,d29,d6[0]
  693. vmlal.u32 q7,d29,d6[1]
  694. vmlal.u32 q8,d29,d7[0]
  695. vmlal.u32 q9,d29,d7[1]
  696. vst1.64 {q10},[r7,:128]!
  697. vmlal.u32 q11,d28,d0[0]
  698. vld1.64 {q10},[r6,:128]
  699. vmlal.u32 q12,d28,d0[1]
  700. vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+5]
  701. vmlal.u32 q13,d28,d1[0]
  702. it ne
  703. addne r6,r6,#16 @ don't advance in last iteration
  704. vmlal.u32 q6,d28,d1[1]
  705. vmlal.u32 q7,d28,d2[0]
  706. vmlal.u32 q8,d28,d2[1]
  707. vmlal.u32 q9,d28,d3[0]
  708. vmlal.u32 q10,d28,d3[1]
  709. vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+6]
  710. vmlal.u32 q11,d29,d4[0]
  711. vmlal.u32 q12,d29,d4[1]
  712. vmlal.u32 q13,d29,d5[0]
  713. vmlal.u32 q6,d29,d5[1]
  714. vmlal.u32 q7,d29,d6[0]
  715. vmlal.u32 q8,d29,d6[1]
  716. vmlal.u32 q9,d29,d7[0]
  717. vmlal.u32 q10,d29,d7[1]
  718. vst1.64 {q11},[r7,:128]!
  719. vmlal.u32 q12,d28,d0[0]
  720. vld1.64 {q11},[r6,:128]
  721. vmlal.u32 q13,d28,d0[1]
  722. vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+6]
  723. vmlal.u32 q6,d28,d1[0]
  724. it ne
  725. addne r6,r6,#16 @ don't advance in last iteration
  726. vmlal.u32 q7,d28,d1[1]
  727. vmlal.u32 q8,d28,d2[0]
  728. vmlal.u32 q9,d28,d2[1]
  729. vmlal.u32 q10,d28,d3[0]
  730. vmlal.u32 q11,d28,d3[1]
  731. vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+7]
  732. vmlal.u32 q12,d29,d4[0]
  733. vmlal.u32 q13,d29,d4[1]
  734. vmlal.u32 q6,d29,d5[0]
  735. vmlal.u32 q7,d29,d5[1]
  736. vmlal.u32 q8,d29,d6[0]
  737. vmlal.u32 q9,d29,d6[1]
  738. vmlal.u32 q10,d29,d7[0]
  739. vmlal.u32 q11,d29,d7[1]
  740. vst1.64 {q12},[r7,:128]!
  741. vmlal.u32 q13,d28,d0[0]
  742. vld1.64 {q12},[r6,:128]
  743. vmlal.u32 q6,d28,d0[1]
  744. vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+7]
  745. vmlal.u32 q7,d28,d1[0]
  746. it ne
  747. addne r6,r6,#16 @ don't advance in last iteration
  748. vmlal.u32 q8,d28,d1[1]
  749. vmlal.u32 q9,d28,d2[0]
  750. vmlal.u32 q10,d28,d2[1]
  751. vmlal.u32 q11,d28,d3[0]
  752. vmlal.u32 q12,d28,d3[1]
  753. it eq
  754. subeq r1,r1,r5,lsl#2 @ rewind
  755. vmlal.u32 q13,d29,d4[0]
  756. vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0]
  757. vmlal.u32 q6,d29,d4[1]
  758. vld1.32 {d0,d1,d2,d3},[r1]!
  759. vmlal.u32 q7,d29,d5[0]
  760. add r10,sp,#8 @ rewind
  761. vmlal.u32 q8,d29,d5[1]
  762. vmlal.u32 q9,d29,d6[0]
  763. vmlal.u32 q10,d29,d6[1]
  764. vmlal.u32 q11,d29,d7[0]
  765. vst1.64 {q13},[r7,:128]!
  766. vmlal.u32 q12,d29,d7[1]
  767. bne LNEON_8n_inner
  768. add r6,sp,#128
  769. vst1.64 {q6,q7},[r7,:256]!
  770. veor q2,q2,q2 @ d4-d5
  771. vst1.64 {q8,q9},[r7,:256]!
  772. veor q3,q3,q3 @ d6-d7
  773. vst1.64 {q10,q11},[r7,:256]!
  774. vst1.64 {q12},[r7,:128]
  775. subs r9,r9,#8
  776. vld1.64 {q6,q7},[r6,:256]!
  777. vld1.64 {q8,q9},[r6,:256]!
  778. vld1.64 {q10,q11},[r6,:256]!
  779. vld1.64 {q12,q13},[r6,:256]!
  780. itt ne
  781. subne r3,r3,r5,lsl#2 @ rewind
  782. bne LNEON_8n_outer
  783. add r7,sp,#128
  784. vst1.64 {q2,q3}, [sp,:256]! @ start wiping stack frame
  785. vshr.u64 d10,d12,#16
  786. vst1.64 {q2,q3},[sp,:256]!
  787. vadd.u64 d13,d13,d10
  788. vst1.64 {q2,q3}, [sp,:256]!
  789. vshr.u64 d10,d13,#16
  790. vst1.64 {q2,q3}, [sp,:256]!
  791. vzip.16 d12,d13
  792. mov r8,r5
  793. b LNEON_tail_entry
  794. .align 4
  795. LNEON_tail:
  796. vadd.u64 d12,d12,d10
  797. vshr.u64 d10,d12,#16
  798. vld1.64 {q8,q9}, [r6, :256]!
  799. vadd.u64 d13,d13,d10
  800. vld1.64 {q10,q11}, [r6, :256]!
  801. vshr.u64 d10,d13,#16
  802. vld1.64 {q12,q13}, [r6, :256]!
  803. vzip.16 d12,d13
  804. LNEON_tail_entry:
  805. vadd.u64 d14,d14,d10
  806. vst1.32 {d12[0]}, [r7, :32]!
  807. vshr.u64 d10,d14,#16
  808. vadd.u64 d15,d15,d10
  809. vshr.u64 d10,d15,#16
  810. vzip.16 d14,d15
  811. vadd.u64 d16,d16,d10
  812. vst1.32 {d14[0]}, [r7, :32]!
  813. vshr.u64 d10,d16,#16
  814. vadd.u64 d17,d17,d10
  815. vshr.u64 d10,d17,#16
  816. vzip.16 d16,d17
  817. vadd.u64 d18,d18,d10
  818. vst1.32 {d16[0]}, [r7, :32]!
  819. vshr.u64 d10,d18,#16
  820. vadd.u64 d19,d19,d10
  821. vshr.u64 d10,d19,#16
  822. vzip.16 d18,d19
  823. vadd.u64 d20,d20,d10
  824. vst1.32 {d18[0]}, [r7, :32]!
  825. vshr.u64 d10,d20,#16
  826. vadd.u64 d21,d21,d10
  827. vshr.u64 d10,d21,#16
  828. vzip.16 d20,d21
  829. vadd.u64 d22,d22,d10
  830. vst1.32 {d20[0]}, [r7, :32]!
  831. vshr.u64 d10,d22,#16
  832. vadd.u64 d23,d23,d10
  833. vshr.u64 d10,d23,#16
  834. vzip.16 d22,d23
  835. vadd.u64 d24,d24,d10
  836. vst1.32 {d22[0]}, [r7, :32]!
  837. vshr.u64 d10,d24,#16
  838. vadd.u64 d25,d25,d10
  839. vshr.u64 d10,d25,#16
  840. vzip.16 d24,d25
  841. vadd.u64 d26,d26,d10
  842. vst1.32 {d24[0]}, [r7, :32]!
  843. vshr.u64 d10,d26,#16
  844. vadd.u64 d27,d27,d10
  845. vshr.u64 d10,d27,#16
  846. vzip.16 d26,d27
  847. vld1.64 {q6,q7}, [r6, :256]!
  848. subs r8,r8,#8
  849. vst1.32 {d26[0]}, [r7, :32]!
  850. bne LNEON_tail
  851. vst1.32 {d10[0]}, [r7, :32] @ top-most bit
  852. sub r3,r3,r5,lsl#2 @ rewind r3
  853. subs r1,sp,#0 @ clear carry flag
  854. add r2,sp,r5,lsl#2
  855. LNEON_sub:
  856. ldmia r1!, {r4,r5,r6,r7}
  857. ldmia r3!, {r8,r9,r10,r11}
  858. sbcs r8, r4,r8
  859. sbcs r9, r5,r9
  860. sbcs r10,r6,r10
  861. sbcs r11,r7,r11
  862. teq r1,r2 @ preserves carry
  863. stmia r0!, {r8,r9,r10,r11}
  864. bne LNEON_sub
  865. ldr r10, [r1] @ load top-most bit
  866. mov r11,sp
  867. veor q0,q0,q0
  868. sub r11,r2,r11 @ this is num*4
  869. veor q1,q1,q1
  870. mov r1,sp
  871. sub r0,r0,r11 @ rewind r0
  872. mov r3,r2 @ second 3/4th of frame
  873. sbcs r10,r10,#0 @ result is carry flag
  874. LNEON_copy_n_zap:
  875. ldmia r1!, {r4,r5,r6,r7}
  876. ldmia r0, {r8,r9,r10,r11}
  877. it cc
  878. movcc r8, r4
  879. vst1.64 {q0,q1}, [r3,:256]! @ wipe
  880. itt cc
  881. movcc r9, r5
  882. movcc r10,r6
  883. vst1.64 {q0,q1}, [r3,:256]! @ wipe
  884. it cc
  885. movcc r11,r7
  886. ldmia r1, {r4,r5,r6,r7}
  887. stmia r0!, {r8,r9,r10,r11}
  888. sub r1,r1,#16
  889. ldmia r0, {r8,r9,r10,r11}
  890. it cc
  891. movcc r8, r4
  892. vst1.64 {q0,q1}, [r1,:256]! @ wipe
  893. itt cc
  894. movcc r9, r5
  895. movcc r10,r6
  896. vst1.64 {q0,q1}, [r3,:256]! @ wipe
  897. it cc
  898. movcc r11,r7
  899. teq r1,r2 @ preserves carry
  900. stmia r0!, {r8,r9,r10,r11}
  901. bne LNEON_copy_n_zap
  902. mov sp,ip
  903. vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15}
  904. ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11}
  905. bx lr @ bx lr
  906. #endif
  907. .byte 77,111,110,116,103,111,109,101,114,121,32,109,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
  908. .align 2
  909. .align 2
  910. #if __ARM_MAX_ARCH__>=7
  911. .comm _OPENSSL_armcap_P,4
  912. .non_lazy_symbol_pointer
  913. OPENSSL_armcap_P:
  914. .indirect_symbol _OPENSSL_armcap_P
  915. .long 0
  916. .private_extern _OPENSSL_armcap_P
  917. #endif
  918. #endif // !OPENSSL_NO_ASM