armv4-mont.S 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977
  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(__arm__)
  11. #if defined(BORINGSSL_PREFIX)
  12. #include <boringssl_prefix_symbols_asm.h>
  13. #endif
  14. #include <openssl/arm_arch.h>
  15. @ Silence ARMv8 deprecated IT instruction warnings. This file is used by both
  16. @ ARMv7 and ARMv8 processors and does not use ARMv8 instructions.
  17. .arch armv7-a
  18. .text
  19. #if defined(__thumb2__)
  20. .syntax unified
  21. .thumb
  22. #else
  23. .code 32
  24. #endif
  25. #if __ARM_MAX_ARCH__>=7
  26. .align 5
  27. .LOPENSSL_armcap:
  28. .word OPENSSL_armcap_P-.Lbn_mul_mont
  29. #endif
  30. .globl bn_mul_mont
  31. .hidden bn_mul_mont
  32. .type bn_mul_mont,%function
  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. .size bn_mul_mont,.-bn_mul_mont
  191. #if __ARM_MAX_ARCH__>=7
  192. .arch armv7-a
  193. .fpu neon
  194. .type bn_mul8x_mont_neon,%function
  195. .align 5
  196. bn_mul8x_mont_neon:
  197. mov ip,sp
  198. stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11}
  199. vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI specification says so
  200. ldmia ip,{r4,r5} @ load rest of parameter block
  201. mov ip,sp
  202. cmp r5,#8
  203. bhi .LNEON_8n
  204. @ special case for r5==8, everything is in register bank...
  205. vld1.32 {d28[0]}, [r2,:32]!
  206. veor d8,d8,d8
  207. sub r7,sp,r5,lsl#4
  208. vld1.32 {d0,d1,d2,d3}, [r1]! @ can't specify :32 :-(
  209. and r7,r7,#-64
  210. vld1.32 {d30[0]}, [r4,:32]
  211. mov sp,r7 @ alloca
  212. vzip.16 d28,d8
  213. vmull.u32 q6,d28,d0[0]
  214. vmull.u32 q7,d28,d0[1]
  215. vmull.u32 q8,d28,d1[0]
  216. vshl.i64 d29,d13,#16
  217. vmull.u32 q9,d28,d1[1]
  218. vadd.u64 d29,d29,d12
  219. veor d8,d8,d8
  220. vmul.u32 d29,d29,d30
  221. vmull.u32 q10,d28,d2[0]
  222. vld1.32 {d4,d5,d6,d7}, [r3]!
  223. vmull.u32 q11,d28,d2[1]
  224. vmull.u32 q12,d28,d3[0]
  225. vzip.16 d29,d8
  226. vmull.u32 q13,d28,d3[1]
  227. vmlal.u32 q6,d29,d4[0]
  228. sub r9,r5,#1
  229. vmlal.u32 q7,d29,d4[1]
  230. vmlal.u32 q8,d29,d5[0]
  231. vmlal.u32 q9,d29,d5[1]
  232. vmlal.u32 q10,d29,d6[0]
  233. vmov q5,q6
  234. vmlal.u32 q11,d29,d6[1]
  235. vmov q6,q7
  236. vmlal.u32 q12,d29,d7[0]
  237. vmov q7,q8
  238. vmlal.u32 q13,d29,d7[1]
  239. vmov q8,q9
  240. vmov q9,q10
  241. vshr.u64 d10,d10,#16
  242. vmov q10,q11
  243. vmov q11,q12
  244. vadd.u64 d10,d10,d11
  245. vmov q12,q13
  246. veor q13,q13
  247. vshr.u64 d10,d10,#16
  248. b .LNEON_outer8
  249. .align 4
  250. .LNEON_outer8:
  251. vld1.32 {d28[0]}, [r2,:32]!
  252. veor d8,d8,d8
  253. vzip.16 d28,d8
  254. vadd.u64 d12,d12,d10
  255. vmlal.u32 q6,d28,d0[0]
  256. vmlal.u32 q7,d28,d0[1]
  257. vmlal.u32 q8,d28,d1[0]
  258. vshl.i64 d29,d13,#16
  259. vmlal.u32 q9,d28,d1[1]
  260. vadd.u64 d29,d29,d12
  261. veor d8,d8,d8
  262. subs r9,r9,#1
  263. vmul.u32 d29,d29,d30
  264. vmlal.u32 q10,d28,d2[0]
  265. vmlal.u32 q11,d28,d2[1]
  266. vmlal.u32 q12,d28,d3[0]
  267. vzip.16 d29,d8
  268. vmlal.u32 q13,d28,d3[1]
  269. vmlal.u32 q6,d29,d4[0]
  270. vmlal.u32 q7,d29,d4[1]
  271. vmlal.u32 q8,d29,d5[0]
  272. vmlal.u32 q9,d29,d5[1]
  273. vmlal.u32 q10,d29,d6[0]
  274. vmov q5,q6
  275. vmlal.u32 q11,d29,d6[1]
  276. vmov q6,q7
  277. vmlal.u32 q12,d29,d7[0]
  278. vmov q7,q8
  279. vmlal.u32 q13,d29,d7[1]
  280. vmov q8,q9
  281. vmov q9,q10
  282. vshr.u64 d10,d10,#16
  283. vmov q10,q11
  284. vmov q11,q12
  285. vadd.u64 d10,d10,d11
  286. vmov q12,q13
  287. veor q13,q13
  288. vshr.u64 d10,d10,#16
  289. bne .LNEON_outer8
  290. vadd.u64 d12,d12,d10
  291. mov r7,sp
  292. vshr.u64 d10,d12,#16
  293. mov r8,r5
  294. vadd.u64 d13,d13,d10
  295. add r6,sp,#96
  296. vshr.u64 d10,d13,#16
  297. vzip.16 d12,d13
  298. b .LNEON_tail_entry
  299. .align 4
  300. .LNEON_8n:
  301. veor q6,q6,q6
  302. sub r7,sp,#128
  303. veor q7,q7,q7
  304. sub r7,r7,r5,lsl#4
  305. veor q8,q8,q8
  306. and r7,r7,#-64
  307. veor q9,q9,q9
  308. mov sp,r7 @ alloca
  309. veor q10,q10,q10
  310. add r7,r7,#256
  311. veor q11,q11,q11
  312. sub r8,r5,#8
  313. veor q12,q12,q12
  314. veor q13,q13,q13
  315. .LNEON_8n_init:
  316. vst1.64 {q6,q7},[r7,:256]!
  317. subs r8,r8,#8
  318. vst1.64 {q8,q9},[r7,:256]!
  319. vst1.64 {q10,q11},[r7,:256]!
  320. vst1.64 {q12,q13},[r7,:256]!
  321. bne .LNEON_8n_init
  322. add r6,sp,#256
  323. vld1.32 {d0,d1,d2,d3},[r1]!
  324. add r10,sp,#8
  325. vld1.32 {d30[0]},[r4,:32]
  326. mov r9,r5
  327. b .LNEON_8n_outer
  328. .align 4
  329. .LNEON_8n_outer:
  330. vld1.32 {d28[0]},[r2,:32]! @ *b++
  331. veor d8,d8,d8
  332. vzip.16 d28,d8
  333. add r7,sp,#128
  334. vld1.32 {d4,d5,d6,d7},[r3]!
  335. vmlal.u32 q6,d28,d0[0]
  336. vmlal.u32 q7,d28,d0[1]
  337. veor d8,d8,d8
  338. vmlal.u32 q8,d28,d1[0]
  339. vshl.i64 d29,d13,#16
  340. vmlal.u32 q9,d28,d1[1]
  341. vadd.u64 d29,d29,d12
  342. vmlal.u32 q10,d28,d2[0]
  343. vmul.u32 d29,d29,d30
  344. vmlal.u32 q11,d28,d2[1]
  345. vst1.32 {d28},[sp,:64] @ put aside smashed b[8*i+0]
  346. vmlal.u32 q12,d28,d3[0]
  347. vzip.16 d29,d8
  348. vmlal.u32 q13,d28,d3[1]
  349. vld1.32 {d28[0]},[r2,:32]! @ *b++
  350. vmlal.u32 q6,d29,d4[0]
  351. veor d10,d10,d10
  352. vmlal.u32 q7,d29,d4[1]
  353. vzip.16 d28,d10
  354. vmlal.u32 q8,d29,d5[0]
  355. vshr.u64 d12,d12,#16
  356. vmlal.u32 q9,d29,d5[1]
  357. vmlal.u32 q10,d29,d6[0]
  358. vadd.u64 d12,d12,d13
  359. vmlal.u32 q11,d29,d6[1]
  360. vshr.u64 d12,d12,#16
  361. vmlal.u32 q12,d29,d7[0]
  362. vmlal.u32 q13,d29,d7[1]
  363. vadd.u64 d14,d14,d12
  364. vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+0]
  365. vmlal.u32 q7,d28,d0[0]
  366. vld1.64 {q6},[r6,:128]!
  367. vmlal.u32 q8,d28,d0[1]
  368. veor d8,d8,d8
  369. vmlal.u32 q9,d28,d1[0]
  370. vshl.i64 d29,d15,#16
  371. vmlal.u32 q10,d28,d1[1]
  372. vadd.u64 d29,d29,d14
  373. vmlal.u32 q11,d28,d2[0]
  374. vmul.u32 d29,d29,d30
  375. vmlal.u32 q12,d28,d2[1]
  376. vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+1]
  377. vmlal.u32 q13,d28,d3[0]
  378. vzip.16 d29,d8
  379. vmlal.u32 q6,d28,d3[1]
  380. vld1.32 {d28[0]},[r2,:32]! @ *b++
  381. vmlal.u32 q7,d29,d4[0]
  382. veor d10,d10,d10
  383. vmlal.u32 q8,d29,d4[1]
  384. vzip.16 d28,d10
  385. vmlal.u32 q9,d29,d5[0]
  386. vshr.u64 d14,d14,#16
  387. vmlal.u32 q10,d29,d5[1]
  388. vmlal.u32 q11,d29,d6[0]
  389. vadd.u64 d14,d14,d15
  390. vmlal.u32 q12,d29,d6[1]
  391. vshr.u64 d14,d14,#16
  392. vmlal.u32 q13,d29,d7[0]
  393. vmlal.u32 q6,d29,d7[1]
  394. vadd.u64 d16,d16,d14
  395. vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+1]
  396. vmlal.u32 q8,d28,d0[0]
  397. vld1.64 {q7},[r6,:128]!
  398. vmlal.u32 q9,d28,d0[1]
  399. veor d8,d8,d8
  400. vmlal.u32 q10,d28,d1[0]
  401. vshl.i64 d29,d17,#16
  402. vmlal.u32 q11,d28,d1[1]
  403. vadd.u64 d29,d29,d16
  404. vmlal.u32 q12,d28,d2[0]
  405. vmul.u32 d29,d29,d30
  406. vmlal.u32 q13,d28,d2[1]
  407. vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+2]
  408. vmlal.u32 q6,d28,d3[0]
  409. vzip.16 d29,d8
  410. vmlal.u32 q7,d28,d3[1]
  411. vld1.32 {d28[0]},[r2,:32]! @ *b++
  412. vmlal.u32 q8,d29,d4[0]
  413. veor d10,d10,d10
  414. vmlal.u32 q9,d29,d4[1]
  415. vzip.16 d28,d10
  416. vmlal.u32 q10,d29,d5[0]
  417. vshr.u64 d16,d16,#16
  418. vmlal.u32 q11,d29,d5[1]
  419. vmlal.u32 q12,d29,d6[0]
  420. vadd.u64 d16,d16,d17
  421. vmlal.u32 q13,d29,d6[1]
  422. vshr.u64 d16,d16,#16
  423. vmlal.u32 q6,d29,d7[0]
  424. vmlal.u32 q7,d29,d7[1]
  425. vadd.u64 d18,d18,d16
  426. vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+2]
  427. vmlal.u32 q9,d28,d0[0]
  428. vld1.64 {q8},[r6,:128]!
  429. vmlal.u32 q10,d28,d0[1]
  430. veor d8,d8,d8
  431. vmlal.u32 q11,d28,d1[0]
  432. vshl.i64 d29,d19,#16
  433. vmlal.u32 q12,d28,d1[1]
  434. vadd.u64 d29,d29,d18
  435. vmlal.u32 q13,d28,d2[0]
  436. vmul.u32 d29,d29,d30
  437. vmlal.u32 q6,d28,d2[1]
  438. vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+3]
  439. vmlal.u32 q7,d28,d3[0]
  440. vzip.16 d29,d8
  441. vmlal.u32 q8,d28,d3[1]
  442. vld1.32 {d28[0]},[r2,:32]! @ *b++
  443. vmlal.u32 q9,d29,d4[0]
  444. veor d10,d10,d10
  445. vmlal.u32 q10,d29,d4[1]
  446. vzip.16 d28,d10
  447. vmlal.u32 q11,d29,d5[0]
  448. vshr.u64 d18,d18,#16
  449. vmlal.u32 q12,d29,d5[1]
  450. vmlal.u32 q13,d29,d6[0]
  451. vadd.u64 d18,d18,d19
  452. vmlal.u32 q6,d29,d6[1]
  453. vshr.u64 d18,d18,#16
  454. vmlal.u32 q7,d29,d7[0]
  455. vmlal.u32 q8,d29,d7[1]
  456. vadd.u64 d20,d20,d18
  457. vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+3]
  458. vmlal.u32 q10,d28,d0[0]
  459. vld1.64 {q9},[r6,:128]!
  460. vmlal.u32 q11,d28,d0[1]
  461. veor d8,d8,d8
  462. vmlal.u32 q12,d28,d1[0]
  463. vshl.i64 d29,d21,#16
  464. vmlal.u32 q13,d28,d1[1]
  465. vadd.u64 d29,d29,d20
  466. vmlal.u32 q6,d28,d2[0]
  467. vmul.u32 d29,d29,d30
  468. vmlal.u32 q7,d28,d2[1]
  469. vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+4]
  470. vmlal.u32 q8,d28,d3[0]
  471. vzip.16 d29,d8
  472. vmlal.u32 q9,d28,d3[1]
  473. vld1.32 {d28[0]},[r2,:32]! @ *b++
  474. vmlal.u32 q10,d29,d4[0]
  475. veor d10,d10,d10
  476. vmlal.u32 q11,d29,d4[1]
  477. vzip.16 d28,d10
  478. vmlal.u32 q12,d29,d5[0]
  479. vshr.u64 d20,d20,#16
  480. vmlal.u32 q13,d29,d5[1]
  481. vmlal.u32 q6,d29,d6[0]
  482. vadd.u64 d20,d20,d21
  483. vmlal.u32 q7,d29,d6[1]
  484. vshr.u64 d20,d20,#16
  485. vmlal.u32 q8,d29,d7[0]
  486. vmlal.u32 q9,d29,d7[1]
  487. vadd.u64 d22,d22,d20
  488. vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+4]
  489. vmlal.u32 q11,d28,d0[0]
  490. vld1.64 {q10},[r6,:128]!
  491. vmlal.u32 q12,d28,d0[1]
  492. veor d8,d8,d8
  493. vmlal.u32 q13,d28,d1[0]
  494. vshl.i64 d29,d23,#16
  495. vmlal.u32 q6,d28,d1[1]
  496. vadd.u64 d29,d29,d22
  497. vmlal.u32 q7,d28,d2[0]
  498. vmul.u32 d29,d29,d30
  499. vmlal.u32 q8,d28,d2[1]
  500. vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+5]
  501. vmlal.u32 q9,d28,d3[0]
  502. vzip.16 d29,d8
  503. vmlal.u32 q10,d28,d3[1]
  504. vld1.32 {d28[0]},[r2,:32]! @ *b++
  505. vmlal.u32 q11,d29,d4[0]
  506. veor d10,d10,d10
  507. vmlal.u32 q12,d29,d4[1]
  508. vzip.16 d28,d10
  509. vmlal.u32 q13,d29,d5[0]
  510. vshr.u64 d22,d22,#16
  511. vmlal.u32 q6,d29,d5[1]
  512. vmlal.u32 q7,d29,d6[0]
  513. vadd.u64 d22,d22,d23
  514. vmlal.u32 q8,d29,d6[1]
  515. vshr.u64 d22,d22,#16
  516. vmlal.u32 q9,d29,d7[0]
  517. vmlal.u32 q10,d29,d7[1]
  518. vadd.u64 d24,d24,d22
  519. vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+5]
  520. vmlal.u32 q12,d28,d0[0]
  521. vld1.64 {q11},[r6,:128]!
  522. vmlal.u32 q13,d28,d0[1]
  523. veor d8,d8,d8
  524. vmlal.u32 q6,d28,d1[0]
  525. vshl.i64 d29,d25,#16
  526. vmlal.u32 q7,d28,d1[1]
  527. vadd.u64 d29,d29,d24
  528. vmlal.u32 q8,d28,d2[0]
  529. vmul.u32 d29,d29,d30
  530. vmlal.u32 q9,d28,d2[1]
  531. vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+6]
  532. vmlal.u32 q10,d28,d3[0]
  533. vzip.16 d29,d8
  534. vmlal.u32 q11,d28,d3[1]
  535. vld1.32 {d28[0]},[r2,:32]! @ *b++
  536. vmlal.u32 q12,d29,d4[0]
  537. veor d10,d10,d10
  538. vmlal.u32 q13,d29,d4[1]
  539. vzip.16 d28,d10
  540. vmlal.u32 q6,d29,d5[0]
  541. vshr.u64 d24,d24,#16
  542. vmlal.u32 q7,d29,d5[1]
  543. vmlal.u32 q8,d29,d6[0]
  544. vadd.u64 d24,d24,d25
  545. vmlal.u32 q9,d29,d6[1]
  546. vshr.u64 d24,d24,#16
  547. vmlal.u32 q10,d29,d7[0]
  548. vmlal.u32 q11,d29,d7[1]
  549. vadd.u64 d26,d26,d24
  550. vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+6]
  551. vmlal.u32 q13,d28,d0[0]
  552. vld1.64 {q12},[r6,:128]!
  553. vmlal.u32 q6,d28,d0[1]
  554. veor d8,d8,d8
  555. vmlal.u32 q7,d28,d1[0]
  556. vshl.i64 d29,d27,#16
  557. vmlal.u32 q8,d28,d1[1]
  558. vadd.u64 d29,d29,d26
  559. vmlal.u32 q9,d28,d2[0]
  560. vmul.u32 d29,d29,d30
  561. vmlal.u32 q10,d28,d2[1]
  562. vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+7]
  563. vmlal.u32 q11,d28,d3[0]
  564. vzip.16 d29,d8
  565. vmlal.u32 q12,d28,d3[1]
  566. vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0]
  567. vmlal.u32 q13,d29,d4[0]
  568. vld1.32 {d0,d1,d2,d3},[r1]!
  569. vmlal.u32 q6,d29,d4[1]
  570. vmlal.u32 q7,d29,d5[0]
  571. vshr.u64 d26,d26,#16
  572. vmlal.u32 q8,d29,d5[1]
  573. vmlal.u32 q9,d29,d6[0]
  574. vadd.u64 d26,d26,d27
  575. vmlal.u32 q10,d29,d6[1]
  576. vshr.u64 d26,d26,#16
  577. vmlal.u32 q11,d29,d7[0]
  578. vmlal.u32 q12,d29,d7[1]
  579. vadd.u64 d12,d12,d26
  580. vst1.32 {d29},[r10,:64] @ put aside smashed m[8*i+7]
  581. add r10,sp,#8 @ rewind
  582. sub r8,r5,#8
  583. b .LNEON_8n_inner
  584. .align 4
  585. .LNEON_8n_inner:
  586. subs r8,r8,#8
  587. vmlal.u32 q6,d28,d0[0]
  588. vld1.64 {q13},[r6,:128]
  589. vmlal.u32 q7,d28,d0[1]
  590. vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+0]
  591. vmlal.u32 q8,d28,d1[0]
  592. vld1.32 {d4,d5,d6,d7},[r3]!
  593. vmlal.u32 q9,d28,d1[1]
  594. it ne
  595. addne r6,r6,#16 @ don't advance in last iteration
  596. vmlal.u32 q10,d28,d2[0]
  597. vmlal.u32 q11,d28,d2[1]
  598. vmlal.u32 q12,d28,d3[0]
  599. vmlal.u32 q13,d28,d3[1]
  600. vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+1]
  601. vmlal.u32 q6,d29,d4[0]
  602. vmlal.u32 q7,d29,d4[1]
  603. vmlal.u32 q8,d29,d5[0]
  604. vmlal.u32 q9,d29,d5[1]
  605. vmlal.u32 q10,d29,d6[0]
  606. vmlal.u32 q11,d29,d6[1]
  607. vmlal.u32 q12,d29,d7[0]
  608. vmlal.u32 q13,d29,d7[1]
  609. vst1.64 {q6},[r7,:128]!
  610. vmlal.u32 q7,d28,d0[0]
  611. vld1.64 {q6},[r6,:128]
  612. vmlal.u32 q8,d28,d0[1]
  613. vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+1]
  614. vmlal.u32 q9,d28,d1[0]
  615. it ne
  616. addne r6,r6,#16 @ don't advance in last iteration
  617. vmlal.u32 q10,d28,d1[1]
  618. vmlal.u32 q11,d28,d2[0]
  619. vmlal.u32 q12,d28,d2[1]
  620. vmlal.u32 q13,d28,d3[0]
  621. vmlal.u32 q6,d28,d3[1]
  622. vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+2]
  623. vmlal.u32 q7,d29,d4[0]
  624. vmlal.u32 q8,d29,d4[1]
  625. vmlal.u32 q9,d29,d5[0]
  626. vmlal.u32 q10,d29,d5[1]
  627. vmlal.u32 q11,d29,d6[0]
  628. vmlal.u32 q12,d29,d6[1]
  629. vmlal.u32 q13,d29,d7[0]
  630. vmlal.u32 q6,d29,d7[1]
  631. vst1.64 {q7},[r7,:128]!
  632. vmlal.u32 q8,d28,d0[0]
  633. vld1.64 {q7},[r6,:128]
  634. vmlal.u32 q9,d28,d0[1]
  635. vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+2]
  636. vmlal.u32 q10,d28,d1[0]
  637. it ne
  638. addne r6,r6,#16 @ don't advance in last iteration
  639. vmlal.u32 q11,d28,d1[1]
  640. vmlal.u32 q12,d28,d2[0]
  641. vmlal.u32 q13,d28,d2[1]
  642. vmlal.u32 q6,d28,d3[0]
  643. vmlal.u32 q7,d28,d3[1]
  644. vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+3]
  645. vmlal.u32 q8,d29,d4[0]
  646. vmlal.u32 q9,d29,d4[1]
  647. vmlal.u32 q10,d29,d5[0]
  648. vmlal.u32 q11,d29,d5[1]
  649. vmlal.u32 q12,d29,d6[0]
  650. vmlal.u32 q13,d29,d6[1]
  651. vmlal.u32 q6,d29,d7[0]
  652. vmlal.u32 q7,d29,d7[1]
  653. vst1.64 {q8},[r7,:128]!
  654. vmlal.u32 q9,d28,d0[0]
  655. vld1.64 {q8},[r6,:128]
  656. vmlal.u32 q10,d28,d0[1]
  657. vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+3]
  658. vmlal.u32 q11,d28,d1[0]
  659. it ne
  660. addne r6,r6,#16 @ don't advance in last iteration
  661. vmlal.u32 q12,d28,d1[1]
  662. vmlal.u32 q13,d28,d2[0]
  663. vmlal.u32 q6,d28,d2[1]
  664. vmlal.u32 q7,d28,d3[0]
  665. vmlal.u32 q8,d28,d3[1]
  666. vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+4]
  667. vmlal.u32 q9,d29,d4[0]
  668. vmlal.u32 q10,d29,d4[1]
  669. vmlal.u32 q11,d29,d5[0]
  670. vmlal.u32 q12,d29,d5[1]
  671. vmlal.u32 q13,d29,d6[0]
  672. vmlal.u32 q6,d29,d6[1]
  673. vmlal.u32 q7,d29,d7[0]
  674. vmlal.u32 q8,d29,d7[1]
  675. vst1.64 {q9},[r7,:128]!
  676. vmlal.u32 q10,d28,d0[0]
  677. vld1.64 {q9},[r6,:128]
  678. vmlal.u32 q11,d28,d0[1]
  679. vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+4]
  680. vmlal.u32 q12,d28,d1[0]
  681. it ne
  682. addne r6,r6,#16 @ don't advance in last iteration
  683. vmlal.u32 q13,d28,d1[1]
  684. vmlal.u32 q6,d28,d2[0]
  685. vmlal.u32 q7,d28,d2[1]
  686. vmlal.u32 q8,d28,d3[0]
  687. vmlal.u32 q9,d28,d3[1]
  688. vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+5]
  689. vmlal.u32 q10,d29,d4[0]
  690. vmlal.u32 q11,d29,d4[1]
  691. vmlal.u32 q12,d29,d5[0]
  692. vmlal.u32 q13,d29,d5[1]
  693. vmlal.u32 q6,d29,d6[0]
  694. vmlal.u32 q7,d29,d6[1]
  695. vmlal.u32 q8,d29,d7[0]
  696. vmlal.u32 q9,d29,d7[1]
  697. vst1.64 {q10},[r7,:128]!
  698. vmlal.u32 q11,d28,d0[0]
  699. vld1.64 {q10},[r6,:128]
  700. vmlal.u32 q12,d28,d0[1]
  701. vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+5]
  702. vmlal.u32 q13,d28,d1[0]
  703. it ne
  704. addne r6,r6,#16 @ don't advance in last iteration
  705. vmlal.u32 q6,d28,d1[1]
  706. vmlal.u32 q7,d28,d2[0]
  707. vmlal.u32 q8,d28,d2[1]
  708. vmlal.u32 q9,d28,d3[0]
  709. vmlal.u32 q10,d28,d3[1]
  710. vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+6]
  711. vmlal.u32 q11,d29,d4[0]
  712. vmlal.u32 q12,d29,d4[1]
  713. vmlal.u32 q13,d29,d5[0]
  714. vmlal.u32 q6,d29,d5[1]
  715. vmlal.u32 q7,d29,d6[0]
  716. vmlal.u32 q8,d29,d6[1]
  717. vmlal.u32 q9,d29,d7[0]
  718. vmlal.u32 q10,d29,d7[1]
  719. vst1.64 {q11},[r7,:128]!
  720. vmlal.u32 q12,d28,d0[0]
  721. vld1.64 {q11},[r6,:128]
  722. vmlal.u32 q13,d28,d0[1]
  723. vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+6]
  724. vmlal.u32 q6,d28,d1[0]
  725. it ne
  726. addne r6,r6,#16 @ don't advance in last iteration
  727. vmlal.u32 q7,d28,d1[1]
  728. vmlal.u32 q8,d28,d2[0]
  729. vmlal.u32 q9,d28,d2[1]
  730. vmlal.u32 q10,d28,d3[0]
  731. vmlal.u32 q11,d28,d3[1]
  732. vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+7]
  733. vmlal.u32 q12,d29,d4[0]
  734. vmlal.u32 q13,d29,d4[1]
  735. vmlal.u32 q6,d29,d5[0]
  736. vmlal.u32 q7,d29,d5[1]
  737. vmlal.u32 q8,d29,d6[0]
  738. vmlal.u32 q9,d29,d6[1]
  739. vmlal.u32 q10,d29,d7[0]
  740. vmlal.u32 q11,d29,d7[1]
  741. vst1.64 {q12},[r7,:128]!
  742. vmlal.u32 q13,d28,d0[0]
  743. vld1.64 {q12},[r6,:128]
  744. vmlal.u32 q6,d28,d0[1]
  745. vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+7]
  746. vmlal.u32 q7,d28,d1[0]
  747. it ne
  748. addne r6,r6,#16 @ don't advance in last iteration
  749. vmlal.u32 q8,d28,d1[1]
  750. vmlal.u32 q9,d28,d2[0]
  751. vmlal.u32 q10,d28,d2[1]
  752. vmlal.u32 q11,d28,d3[0]
  753. vmlal.u32 q12,d28,d3[1]
  754. it eq
  755. subeq r1,r1,r5,lsl#2 @ rewind
  756. vmlal.u32 q13,d29,d4[0]
  757. vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0]
  758. vmlal.u32 q6,d29,d4[1]
  759. vld1.32 {d0,d1,d2,d3},[r1]!
  760. vmlal.u32 q7,d29,d5[0]
  761. add r10,sp,#8 @ rewind
  762. vmlal.u32 q8,d29,d5[1]
  763. vmlal.u32 q9,d29,d6[0]
  764. vmlal.u32 q10,d29,d6[1]
  765. vmlal.u32 q11,d29,d7[0]
  766. vst1.64 {q13},[r7,:128]!
  767. vmlal.u32 q12,d29,d7[1]
  768. bne .LNEON_8n_inner
  769. add r6,sp,#128
  770. vst1.64 {q6,q7},[r7,:256]!
  771. veor q2,q2,q2 @ d4-d5
  772. vst1.64 {q8,q9},[r7,:256]!
  773. veor q3,q3,q3 @ d6-d7
  774. vst1.64 {q10,q11},[r7,:256]!
  775. vst1.64 {q12},[r7,:128]
  776. subs r9,r9,#8
  777. vld1.64 {q6,q7},[r6,:256]!
  778. vld1.64 {q8,q9},[r6,:256]!
  779. vld1.64 {q10,q11},[r6,:256]!
  780. vld1.64 {q12,q13},[r6,:256]!
  781. itt ne
  782. subne r3,r3,r5,lsl#2 @ rewind
  783. bne .LNEON_8n_outer
  784. add r7,sp,#128
  785. vst1.64 {q2,q3}, [sp,:256]! @ start wiping stack frame
  786. vshr.u64 d10,d12,#16
  787. vst1.64 {q2,q3},[sp,:256]!
  788. vadd.u64 d13,d13,d10
  789. vst1.64 {q2,q3}, [sp,:256]!
  790. vshr.u64 d10,d13,#16
  791. vst1.64 {q2,q3}, [sp,:256]!
  792. vzip.16 d12,d13
  793. mov r8,r5
  794. b .LNEON_tail_entry
  795. .align 4
  796. .LNEON_tail:
  797. vadd.u64 d12,d12,d10
  798. vshr.u64 d10,d12,#16
  799. vld1.64 {q8,q9}, [r6, :256]!
  800. vadd.u64 d13,d13,d10
  801. vld1.64 {q10,q11}, [r6, :256]!
  802. vshr.u64 d10,d13,#16
  803. vld1.64 {q12,q13}, [r6, :256]!
  804. vzip.16 d12,d13
  805. .LNEON_tail_entry:
  806. vadd.u64 d14,d14,d10
  807. vst1.32 {d12[0]}, [r7, :32]!
  808. vshr.u64 d10,d14,#16
  809. vadd.u64 d15,d15,d10
  810. vshr.u64 d10,d15,#16
  811. vzip.16 d14,d15
  812. vadd.u64 d16,d16,d10
  813. vst1.32 {d14[0]}, [r7, :32]!
  814. vshr.u64 d10,d16,#16
  815. vadd.u64 d17,d17,d10
  816. vshr.u64 d10,d17,#16
  817. vzip.16 d16,d17
  818. vadd.u64 d18,d18,d10
  819. vst1.32 {d16[0]}, [r7, :32]!
  820. vshr.u64 d10,d18,#16
  821. vadd.u64 d19,d19,d10
  822. vshr.u64 d10,d19,#16
  823. vzip.16 d18,d19
  824. vadd.u64 d20,d20,d10
  825. vst1.32 {d18[0]}, [r7, :32]!
  826. vshr.u64 d10,d20,#16
  827. vadd.u64 d21,d21,d10
  828. vshr.u64 d10,d21,#16
  829. vzip.16 d20,d21
  830. vadd.u64 d22,d22,d10
  831. vst1.32 {d20[0]}, [r7, :32]!
  832. vshr.u64 d10,d22,#16
  833. vadd.u64 d23,d23,d10
  834. vshr.u64 d10,d23,#16
  835. vzip.16 d22,d23
  836. vadd.u64 d24,d24,d10
  837. vst1.32 {d22[0]}, [r7, :32]!
  838. vshr.u64 d10,d24,#16
  839. vadd.u64 d25,d25,d10
  840. vshr.u64 d10,d25,#16
  841. vzip.16 d24,d25
  842. vadd.u64 d26,d26,d10
  843. vst1.32 {d24[0]}, [r7, :32]!
  844. vshr.u64 d10,d26,#16
  845. vadd.u64 d27,d27,d10
  846. vshr.u64 d10,d27,#16
  847. vzip.16 d26,d27
  848. vld1.64 {q6,q7}, [r6, :256]!
  849. subs r8,r8,#8
  850. vst1.32 {d26[0]}, [r7, :32]!
  851. bne .LNEON_tail
  852. vst1.32 {d10[0]}, [r7, :32] @ top-most bit
  853. sub r3,r3,r5,lsl#2 @ rewind r3
  854. subs r1,sp,#0 @ clear carry flag
  855. add r2,sp,r5,lsl#2
  856. .LNEON_sub:
  857. ldmia r1!, {r4,r5,r6,r7}
  858. ldmia r3!, {r8,r9,r10,r11}
  859. sbcs r8, r4,r8
  860. sbcs r9, r5,r9
  861. sbcs r10,r6,r10
  862. sbcs r11,r7,r11
  863. teq r1,r2 @ preserves carry
  864. stmia r0!, {r8,r9,r10,r11}
  865. bne .LNEON_sub
  866. ldr r10, [r1] @ load top-most bit
  867. mov r11,sp
  868. veor q0,q0,q0
  869. sub r11,r2,r11 @ this is num*4
  870. veor q1,q1,q1
  871. mov r1,sp
  872. sub r0,r0,r11 @ rewind r0
  873. mov r3,r2 @ second 3/4th of frame
  874. sbcs r10,r10,#0 @ result is carry flag
  875. .LNEON_copy_n_zap:
  876. ldmia r1!, {r4,r5,r6,r7}
  877. ldmia r0, {r8,r9,r10,r11}
  878. it cc
  879. movcc r8, r4
  880. vst1.64 {q0,q1}, [r3,:256]! @ wipe
  881. itt cc
  882. movcc r9, r5
  883. movcc r10,r6
  884. vst1.64 {q0,q1}, [r3,:256]! @ wipe
  885. it cc
  886. movcc r11,r7
  887. ldmia r1, {r4,r5,r6,r7}
  888. stmia r0!, {r8,r9,r10,r11}
  889. sub r1,r1,#16
  890. ldmia r0, {r8,r9,r10,r11}
  891. it cc
  892. movcc r8, r4
  893. vst1.64 {q0,q1}, [r1,:256]! @ wipe
  894. itt cc
  895. movcc r9, r5
  896. movcc r10,r6
  897. vst1.64 {q0,q1}, [r3,:256]! @ wipe
  898. it cc
  899. movcc r11,r7
  900. teq r1,r2 @ preserves carry
  901. stmia r0!, {r8,r9,r10,r11}
  902. bne .LNEON_copy_n_zap
  903. mov sp,ip
  904. vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15}
  905. ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11}
  906. bx lr @ bx lr
  907. .size bn_mul8x_mont_neon,.-bn_mul8x_mont_neon
  908. #endif
  909. .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
  910. .align 2
  911. .align 2
  912. #if __ARM_MAX_ARCH__>=7
  913. .comm OPENSSL_armcap_P,4,4
  914. .hidden OPENSSL_armcap_P
  915. #endif
  916. #endif
  917. #endif // !OPENSSL_NO_ASM
  918. .section .note.GNU-stack,"",%progbits