sparcv8.S 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458
  1. .ident "sparcv8.s, Version 1.4"
  2. .ident "SPARC v8 ISA artwork by Andy Polyakov <appro@fy.chalmers.se>"
  3. /*
  4. * ====================================================================
  5. * Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
  6. * project.
  7. *
  8. * Rights for redistribution and usage in source and binary forms are
  9. * granted according to the OpenSSL license. Warranty of any kind is
  10. * disclaimed.
  11. * ====================================================================
  12. */
  13. /*
  14. * This is my modest contributon to OpenSSL project (see
  15. * http://www.openssl.org/ for more information about it) and is
  16. * a drop-in SuperSPARC ISA replacement for crypto/bn/bn_asm.c
  17. * module. For updates see http://fy.chalmers.se/~appro/hpe/.
  18. *
  19. * See bn_asm.sparc.v8plus.S for more details.
  20. */
  21. /*
  22. * Revision history.
  23. *
  24. * 1.1 - new loop unrolling model(*);
  25. * 1.2 - made gas friendly;
  26. * 1.3 - fixed problem with /usr/ccs/lib/cpp;
  27. * 1.4 - some retunes;
  28. *
  29. * (*) see bn_asm.sparc.v8plus.S for details
  30. */
  31. .section ".text",#alloc,#execinstr
  32. .file "bn_asm.sparc.v8.S"
  33. .align 32
  34. .global bn_mul_add_words
  35. /*
  36. * BN_ULONG bn_mul_add_words(rp,ap,num,w)
  37. * BN_ULONG *rp,*ap;
  38. * int num;
  39. * BN_ULONG w;
  40. */
  41. bn_mul_add_words:
  42. cmp %o2,0
  43. bg,a .L_bn_mul_add_words_proceed
  44. ld [%o1],%g2
  45. retl
  46. clr %o0
  47. .L_bn_mul_add_words_proceed:
  48. andcc %o2,-4,%g0
  49. bz .L_bn_mul_add_words_tail
  50. clr %o5
  51. .L_bn_mul_add_words_loop:
  52. ld [%o0],%o4
  53. ld [%o1+4],%g3
  54. umul %o3,%g2,%g2
  55. rd %y,%g1
  56. addcc %o4,%o5,%o4
  57. addx %g1,0,%g1
  58. addcc %o4,%g2,%o4
  59. st %o4,[%o0]
  60. addx %g1,0,%o5
  61. ld [%o0+4],%o4
  62. ld [%o1+8],%g2
  63. umul %o3,%g3,%g3
  64. dec 4,%o2
  65. rd %y,%g1
  66. addcc %o4,%o5,%o4
  67. addx %g1,0,%g1
  68. addcc %o4,%g3,%o4
  69. st %o4,[%o0+4]
  70. addx %g1,0,%o5
  71. ld [%o0+8],%o4
  72. ld [%o1+12],%g3
  73. umul %o3,%g2,%g2
  74. inc 16,%o1
  75. rd %y,%g1
  76. addcc %o4,%o5,%o4
  77. addx %g1,0,%g1
  78. addcc %o4,%g2,%o4
  79. st %o4,[%o0+8]
  80. addx %g1,0,%o5
  81. ld [%o0+12],%o4
  82. umul %o3,%g3,%g3
  83. inc 16,%o0
  84. rd %y,%g1
  85. addcc %o4,%o5,%o4
  86. addx %g1,0,%g1
  87. addcc %o4,%g3,%o4
  88. st %o4,[%o0-4]
  89. addx %g1,0,%o5
  90. andcc %o2,-4,%g0
  91. bnz,a .L_bn_mul_add_words_loop
  92. ld [%o1],%g2
  93. tst %o2
  94. bnz,a .L_bn_mul_add_words_tail
  95. ld [%o1],%g2
  96. .L_bn_mul_add_words_return:
  97. retl
  98. mov %o5,%o0
  99. nop
  100. .L_bn_mul_add_words_tail:
  101. ld [%o0],%o4
  102. umul %o3,%g2,%g2
  103. addcc %o4,%o5,%o4
  104. rd %y,%g1
  105. addx %g1,0,%g1
  106. addcc %o4,%g2,%o4
  107. addx %g1,0,%o5
  108. deccc %o2
  109. bz .L_bn_mul_add_words_return
  110. st %o4,[%o0]
  111. ld [%o1+4],%g2
  112. ld [%o0+4],%o4
  113. umul %o3,%g2,%g2
  114. rd %y,%g1
  115. addcc %o4,%o5,%o4
  116. addx %g1,0,%g1
  117. addcc %o4,%g2,%o4
  118. addx %g1,0,%o5
  119. deccc %o2
  120. bz .L_bn_mul_add_words_return
  121. st %o4,[%o0+4]
  122. ld [%o1+8],%g2
  123. ld [%o0+8],%o4
  124. umul %o3,%g2,%g2
  125. rd %y,%g1
  126. addcc %o4,%o5,%o4
  127. addx %g1,0,%g1
  128. addcc %o4,%g2,%o4
  129. st %o4,[%o0+8]
  130. retl
  131. addx %g1,0,%o0
  132. .type bn_mul_add_words,#function
  133. .size bn_mul_add_words,(.-bn_mul_add_words)
  134. .align 32
  135. .global bn_mul_words
  136. /*
  137. * BN_ULONG bn_mul_words(rp,ap,num,w)
  138. * BN_ULONG *rp,*ap;
  139. * int num;
  140. * BN_ULONG w;
  141. */
  142. bn_mul_words:
  143. cmp %o2,0
  144. bg,a .L_bn_mul_words_proceeed
  145. ld [%o1],%g2
  146. retl
  147. clr %o0
  148. .L_bn_mul_words_proceeed:
  149. andcc %o2,-4,%g0
  150. bz .L_bn_mul_words_tail
  151. clr %o5
  152. .L_bn_mul_words_loop:
  153. ld [%o1+4],%g3
  154. umul %o3,%g2,%g2
  155. addcc %g2,%o5,%g2
  156. rd %y,%g1
  157. addx %g1,0,%o5
  158. st %g2,[%o0]
  159. ld [%o1+8],%g2
  160. umul %o3,%g3,%g3
  161. addcc %g3,%o5,%g3
  162. rd %y,%g1
  163. dec 4,%o2
  164. addx %g1,0,%o5
  165. st %g3,[%o0+4]
  166. ld [%o1+12],%g3
  167. umul %o3,%g2,%g2
  168. addcc %g2,%o5,%g2
  169. rd %y,%g1
  170. inc 16,%o1
  171. st %g2,[%o0+8]
  172. addx %g1,0,%o5
  173. umul %o3,%g3,%g3
  174. addcc %g3,%o5,%g3
  175. rd %y,%g1
  176. inc 16,%o0
  177. addx %g1,0,%o5
  178. st %g3,[%o0-4]
  179. andcc %o2,-4,%g0
  180. nop
  181. bnz,a .L_bn_mul_words_loop
  182. ld [%o1],%g2
  183. tst %o2
  184. bnz,a .L_bn_mul_words_tail
  185. ld [%o1],%g2
  186. .L_bn_mul_words_return:
  187. retl
  188. mov %o5,%o0
  189. nop
  190. .L_bn_mul_words_tail:
  191. umul %o3,%g2,%g2
  192. addcc %g2,%o5,%g2
  193. rd %y,%g1
  194. addx %g1,0,%o5
  195. deccc %o2
  196. bz .L_bn_mul_words_return
  197. st %g2,[%o0]
  198. nop
  199. ld [%o1+4],%g2
  200. umul %o3,%g2,%g2
  201. addcc %g2,%o5,%g2
  202. rd %y,%g1
  203. addx %g1,0,%o5
  204. deccc %o2
  205. bz .L_bn_mul_words_return
  206. st %g2,[%o0+4]
  207. ld [%o1+8],%g2
  208. umul %o3,%g2,%g2
  209. addcc %g2,%o5,%g2
  210. rd %y,%g1
  211. st %g2,[%o0+8]
  212. retl
  213. addx %g1,0,%o0
  214. .type bn_mul_words,#function
  215. .size bn_mul_words,(.-bn_mul_words)
  216. .align 32
  217. .global bn_sqr_words
  218. /*
  219. * void bn_sqr_words(r,a,n)
  220. * BN_ULONG *r,*a;
  221. * int n;
  222. */
  223. bn_sqr_words:
  224. cmp %o2,0
  225. bg,a .L_bn_sqr_words_proceeed
  226. ld [%o1],%g2
  227. retl
  228. clr %o0
  229. .L_bn_sqr_words_proceeed:
  230. andcc %o2,-4,%g0
  231. bz .L_bn_sqr_words_tail
  232. clr %o5
  233. .L_bn_sqr_words_loop:
  234. ld [%o1+4],%g3
  235. umul %g2,%g2,%o4
  236. st %o4,[%o0]
  237. rd %y,%o5
  238. st %o5,[%o0+4]
  239. ld [%o1+8],%g2
  240. umul %g3,%g3,%o4
  241. dec 4,%o2
  242. st %o4,[%o0+8]
  243. rd %y,%o5
  244. st %o5,[%o0+12]
  245. nop
  246. ld [%o1+12],%g3
  247. umul %g2,%g2,%o4
  248. st %o4,[%o0+16]
  249. rd %y,%o5
  250. inc 16,%o1
  251. st %o5,[%o0+20]
  252. umul %g3,%g3,%o4
  253. inc 32,%o0
  254. st %o4,[%o0-8]
  255. rd %y,%o5
  256. st %o5,[%o0-4]
  257. andcc %o2,-4,%g2
  258. bnz,a .L_bn_sqr_words_loop
  259. ld [%o1],%g2
  260. tst %o2
  261. nop
  262. bnz,a .L_bn_sqr_words_tail
  263. ld [%o1],%g2
  264. .L_bn_sqr_words_return:
  265. retl
  266. clr %o0
  267. .L_bn_sqr_words_tail:
  268. umul %g2,%g2,%o4
  269. st %o4,[%o0]
  270. deccc %o2
  271. rd %y,%o5
  272. bz .L_bn_sqr_words_return
  273. st %o5,[%o0+4]
  274. ld [%o1+4],%g2
  275. umul %g2,%g2,%o4
  276. st %o4,[%o0+8]
  277. deccc %o2
  278. rd %y,%o5
  279. nop
  280. bz .L_bn_sqr_words_return
  281. st %o5,[%o0+12]
  282. ld [%o1+8],%g2
  283. umul %g2,%g2,%o4
  284. st %o4,[%o0+16]
  285. rd %y,%o5
  286. st %o5,[%o0+20]
  287. retl
  288. clr %o0
  289. .type bn_sqr_words,#function
  290. .size bn_sqr_words,(.-bn_sqr_words)
  291. .align 32
  292. .global bn_div_words
  293. /*
  294. * BN_ULONG bn_div_words(h,l,d)
  295. * BN_ULONG h,l,d;
  296. */
  297. bn_div_words:
  298. wr %o0,%y
  299. udiv %o1,%o2,%o0
  300. retl
  301. nop
  302. .type bn_div_words,#function
  303. .size bn_div_words,(.-bn_div_words)
  304. .align 32
  305. .global bn_add_words
  306. /*
  307. * BN_ULONG bn_add_words(rp,ap,bp,n)
  308. * BN_ULONG *rp,*ap,*bp;
  309. * int n;
  310. */
  311. bn_add_words:
  312. cmp %o3,0
  313. bg,a .L_bn_add_words_proceed
  314. ld [%o1],%o4
  315. retl
  316. clr %o0
  317. .L_bn_add_words_proceed:
  318. andcc %o3,-4,%g0
  319. bz .L_bn_add_words_tail
  320. clr %g1
  321. ba .L_bn_add_words_warn_loop
  322. addcc %g0,0,%g0 ! clear carry flag
  323. .L_bn_add_words_loop:
  324. ld [%o1],%o4
  325. .L_bn_add_words_warn_loop:
  326. ld [%o2],%o5
  327. ld [%o1+4],%g3
  328. ld [%o2+4],%g4
  329. dec 4,%o3
  330. addxcc %o5,%o4,%o5
  331. st %o5,[%o0]
  332. ld [%o1+8],%o4
  333. ld [%o2+8],%o5
  334. inc 16,%o1
  335. addxcc %g3,%g4,%g3
  336. st %g3,[%o0+4]
  337. ld [%o1-4],%g3
  338. ld [%o2+12],%g4
  339. inc 16,%o2
  340. addxcc %o5,%o4,%o5
  341. st %o5,[%o0+8]
  342. inc 16,%o0
  343. addxcc %g3,%g4,%g3
  344. st %g3,[%o0-4]
  345. addx %g0,0,%g1
  346. andcc %o3,-4,%g0
  347. bnz,a .L_bn_add_words_loop
  348. addcc %g1,-1,%g0
  349. tst %o3
  350. bnz,a .L_bn_add_words_tail
  351. ld [%o1],%o4
  352. .L_bn_add_words_return:
  353. retl
  354. mov %g1,%o0
  355. .L_bn_add_words_tail:
  356. addcc %g1,-1,%g0
  357. ld [%o2],%o5
  358. addxcc %o5,%o4,%o5
  359. addx %g0,0,%g1
  360. deccc %o3
  361. bz .L_bn_add_words_return
  362. st %o5,[%o0]
  363. ld [%o1+4],%o4
  364. addcc %g1,-1,%g0
  365. ld [%o2+4],%o5
  366. addxcc %o5,%o4,%o5
  367. addx %g0,0,%g1
  368. deccc %o3
  369. bz .L_bn_add_words_return
  370. st %o5,[%o0+4]
  371. ld [%o1+8],%o4
  372. addcc %g1,-1,%g0
  373. ld [%o2+8],%o5
  374. addxcc %o5,%o4,%o5
  375. st %o5,[%o0+8]
  376. retl
  377. addx %g0,0,%o0
  378. .type bn_add_words,#function
  379. .size bn_add_words,(.-bn_add_words)
  380. .align 32
  381. .global bn_sub_words
  382. /*
  383. * BN_ULONG bn_sub_words(rp,ap,bp,n)
  384. * BN_ULONG *rp,*ap,*bp;
  385. * int n;
  386. */
  387. bn_sub_words:
  388. cmp %o3,0
  389. bg,a .L_bn_sub_words_proceed
  390. ld [%o1],%o4
  391. retl
  392. clr %o0
  393. .L_bn_sub_words_proceed:
  394. andcc %o3,-4,%g0
  395. bz .L_bn_sub_words_tail
  396. clr %g1
  397. ba .L_bn_sub_words_warm_loop
  398. addcc %g0,0,%g0 ! clear carry flag
  399. .L_bn_sub_words_loop:
  400. ld [%o1],%o4
  401. .L_bn_sub_words_warm_loop:
  402. ld [%o2],%o5
  403. ld [%o1+4],%g3
  404. ld [%o2+4],%g4
  405. dec 4,%o3
  406. subxcc %o4,%o5,%o5
  407. st %o5,[%o0]
  408. ld [%o1+8],%o4
  409. ld [%o2+8],%o5
  410. inc 16,%o1
  411. subxcc %g3,%g4,%g4
  412. st %g4,[%o0+4]
  413. ld [%o1-4],%g3
  414. ld [%o2+12],%g4
  415. inc 16,%o2
  416. subxcc %o4,%o5,%o5
  417. st %o5,[%o0+8]
  418. inc 16,%o0
  419. subxcc %g3,%g4,%g4
  420. st %g4,[%o0-4]
  421. addx %g0,0,%g1
  422. andcc %o3,-4,%g0
  423. bnz,a .L_bn_sub_words_loop
  424. addcc %g1,-1,%g0
  425. tst %o3
  426. nop
  427. bnz,a .L_bn_sub_words_tail
  428. ld [%o1],%o4
  429. .L_bn_sub_words_return:
  430. retl
  431. mov %g1,%o0
  432. .L_bn_sub_words_tail:
  433. addcc %g1,-1,%g0
  434. ld [%o2],%o5
  435. subxcc %o4,%o5,%o5
  436. addx %g0,0,%g1
  437. deccc %o3
  438. bz .L_bn_sub_words_return
  439. st %o5,[%o0]
  440. nop
  441. ld [%o1+4],%o4
  442. addcc %g1,-1,%g0
  443. ld [%o2+4],%o5
  444. subxcc %o4,%o5,%o5
  445. addx %g0,0,%g1
  446. deccc %o3
  447. bz .L_bn_sub_words_return
  448. st %o5,[%o0+4]
  449. ld [%o1+8],%o4
  450. addcc %g1,-1,%g0
  451. ld [%o2+8],%o5
  452. subxcc %o4,%o5,%o5
  453. st %o5,[%o0+8]
  454. retl
  455. addx %g0,0,%o0
  456. .type bn_sub_words,#function
  457. .size bn_sub_words,(.-bn_sub_words)
  458. #define FRAME_SIZE -96
  459. /*
  460. * Here is register usage map for *all* routines below.
  461. */
  462. #define t_1 %o0
  463. #define t_2 %o1
  464. #define c_1 %o2
  465. #define c_2 %o3
  466. #define c_3 %o4
  467. #define ap(I) [%i1+4*I]
  468. #define bp(I) [%i2+4*I]
  469. #define rp(I) [%i0+4*I]
  470. #define a_0 %l0
  471. #define a_1 %l1
  472. #define a_2 %l2
  473. #define a_3 %l3
  474. #define a_4 %l4
  475. #define a_5 %l5
  476. #define a_6 %l6
  477. #define a_7 %l7
  478. #define b_0 %i3
  479. #define b_1 %i4
  480. #define b_2 %i5
  481. #define b_3 %o5
  482. #define b_4 %g1
  483. #define b_5 %g2
  484. #define b_6 %g3
  485. #define b_7 %g4
  486. .align 32
  487. .global bn_mul_comba8
  488. /*
  489. * void bn_mul_comba8(r,a,b)
  490. * BN_ULONG *r,*a,*b;
  491. */
  492. bn_mul_comba8:
  493. save %sp,FRAME_SIZE,%sp
  494. ld ap(0),a_0
  495. ld bp(0),b_0
  496. umul a_0,b_0,c_1 !=!mul_add_c(a[0],b[0],c1,c2,c3);
  497. ld bp(1),b_1
  498. rd %y,c_2
  499. st c_1,rp(0) !r[0]=c1;
  500. umul a_0,b_1,t_1 !=!mul_add_c(a[0],b[1],c2,c3,c1);
  501. ld ap(1),a_1
  502. addcc c_2,t_1,c_2
  503. rd %y,t_2
  504. addxcc %g0,t_2,c_3 !=
  505. addx %g0,%g0,c_1
  506. ld ap(2),a_2
  507. umul a_1,b_0,t_1 !mul_add_c(a[1],b[0],c2,c3,c1);
  508. addcc c_2,t_1,c_2 !=
  509. rd %y,t_2
  510. addxcc c_3,t_2,c_3
  511. st c_2,rp(1) !r[1]=c2;
  512. addx c_1,%g0,c_1 !=
  513. umul a_2,b_0,t_1 !mul_add_c(a[2],b[0],c3,c1,c2);
  514. addcc c_3,t_1,c_3
  515. rd %y,t_2
  516. addxcc c_1,t_2,c_1 !=
  517. addx %g0,%g0,c_2
  518. ld bp(2),b_2
  519. umul a_1,b_1,t_1 !mul_add_c(a[1],b[1],c3,c1,c2);
  520. addcc c_3,t_1,c_3 !=
  521. rd %y,t_2
  522. addxcc c_1,t_2,c_1
  523. ld bp(3),b_3
  524. addx c_2,%g0,c_2 !=
  525. umul a_0,b_2,t_1 !mul_add_c(a[0],b[2],c3,c1,c2);
  526. addcc c_3,t_1,c_3
  527. rd %y,t_2
  528. addxcc c_1,t_2,c_1 !=
  529. addx c_2,%g0,c_2
  530. st c_3,rp(2) !r[2]=c3;
  531. umul a_0,b_3,t_1 !mul_add_c(a[0],b[3],c1,c2,c3);
  532. addcc c_1,t_1,c_1 !=
  533. rd %y,t_2
  534. addxcc c_2,t_2,c_2
  535. addx %g0,%g0,c_3
  536. umul a_1,b_2,t_1 !=!mul_add_c(a[1],b[2],c1,c2,c3);
  537. addcc c_1,t_1,c_1
  538. rd %y,t_2
  539. addxcc c_2,t_2,c_2
  540. addx c_3,%g0,c_3 !=
  541. ld ap(3),a_3
  542. umul a_2,b_1,t_1 !mul_add_c(a[2],b[1],c1,c2,c3);
  543. addcc c_1,t_1,c_1
  544. rd %y,t_2 !=
  545. addxcc c_2,t_2,c_2
  546. addx c_3,%g0,c_3
  547. ld ap(4),a_4
  548. umul a_3,b_0,t_1 !mul_add_c(a[3],b[0],c1,c2,c3);!=
  549. addcc c_1,t_1,c_1
  550. rd %y,t_2
  551. addxcc c_2,t_2,c_2
  552. addx c_3,%g0,c_3 !=
  553. st c_1,rp(3) !r[3]=c1;
  554. umul a_4,b_0,t_1 !mul_add_c(a[4],b[0],c2,c3,c1);
  555. addcc c_2,t_1,c_2
  556. rd %y,t_2 !=
  557. addxcc c_3,t_2,c_3
  558. addx %g0,%g0,c_1
  559. umul a_3,b_1,t_1 !mul_add_c(a[3],b[1],c2,c3,c1);
  560. addcc c_2,t_1,c_2 !=
  561. rd %y,t_2
  562. addxcc c_3,t_2,c_3
  563. addx c_1,%g0,c_1
  564. umul a_2,b_2,t_1 !=!mul_add_c(a[2],b[2],c2,c3,c1);
  565. addcc c_2,t_1,c_2
  566. rd %y,t_2
  567. addxcc c_3,t_2,c_3
  568. addx c_1,%g0,c_1 !=
  569. ld bp(4),b_4
  570. umul a_1,b_3,t_1 !mul_add_c(a[1],b[3],c2,c3,c1);
  571. addcc c_2,t_1,c_2
  572. rd %y,t_2 !=
  573. addxcc c_3,t_2,c_3
  574. addx c_1,%g0,c_1
  575. ld bp(5),b_5
  576. umul a_0,b_4,t_1 !=!mul_add_c(a[0],b[4],c2,c3,c1);
  577. addcc c_2,t_1,c_2
  578. rd %y,t_2
  579. addxcc c_3,t_2,c_3
  580. addx c_1,%g0,c_1 !=
  581. st c_2,rp(4) !r[4]=c2;
  582. umul a_0,b_5,t_1 !mul_add_c(a[0],b[5],c3,c1,c2);
  583. addcc c_3,t_1,c_3
  584. rd %y,t_2 !=
  585. addxcc c_1,t_2,c_1
  586. addx %g0,%g0,c_2
  587. umul a_1,b_4,t_1 !mul_add_c(a[1],b[4],c3,c1,c2);
  588. addcc c_3,t_1,c_3 !=
  589. rd %y,t_2
  590. addxcc c_1,t_2,c_1
  591. addx c_2,%g0,c_2
  592. umul a_2,b_3,t_1 !=!mul_add_c(a[2],b[3],c3,c1,c2);
  593. addcc c_3,t_1,c_3
  594. rd %y,t_2
  595. addxcc c_1,t_2,c_1
  596. addx c_2,%g0,c_2 !=
  597. umul a_3,b_2,t_1 !mul_add_c(a[3],b[2],c3,c1,c2);
  598. addcc c_3,t_1,c_3
  599. rd %y,t_2
  600. addxcc c_1,t_2,c_1 !=
  601. addx c_2,%g0,c_2
  602. ld ap(5),a_5
  603. umul a_4,b_1,t_1 !mul_add_c(a[4],b[1],c3,c1,c2);
  604. addcc c_3,t_1,c_3 !=
  605. rd %y,t_2
  606. addxcc c_1,t_2,c_1
  607. ld ap(6),a_6
  608. addx c_2,%g0,c_2 !=
  609. umul a_5,b_0,t_1 !mul_add_c(a[5],b[0],c3,c1,c2);
  610. addcc c_3,t_1,c_3
  611. rd %y,t_2
  612. addxcc c_1,t_2,c_1 !=
  613. addx c_2,%g0,c_2
  614. st c_3,rp(5) !r[5]=c3;
  615. umul a_6,b_0,t_1 !mul_add_c(a[6],b[0],c1,c2,c3);
  616. addcc c_1,t_1,c_1 !=
  617. rd %y,t_2
  618. addxcc c_2,t_2,c_2
  619. addx %g0,%g0,c_3
  620. umul a_5,b_1,t_1 !=!mul_add_c(a[5],b[1],c1,c2,c3);
  621. addcc c_1,t_1,c_1
  622. rd %y,t_2
  623. addxcc c_2,t_2,c_2
  624. addx c_3,%g0,c_3 !=
  625. umul a_4,b_2,t_1 !mul_add_c(a[4],b[2],c1,c2,c3);
  626. addcc c_1,t_1,c_1
  627. rd %y,t_2
  628. addxcc c_2,t_2,c_2 !=
  629. addx c_3,%g0,c_3
  630. umul a_3,b_3,t_1 !mul_add_c(a[3],b[3],c1,c2,c3);
  631. addcc c_1,t_1,c_1
  632. rd %y,t_2 !=
  633. addxcc c_2,t_2,c_2
  634. addx c_3,%g0,c_3
  635. umul a_2,b_4,t_1 !mul_add_c(a[2],b[4],c1,c2,c3);
  636. addcc c_1,t_1,c_1 !=
  637. rd %y,t_2
  638. addxcc c_2,t_2,c_2
  639. ld bp(6),b_6
  640. addx c_3,%g0,c_3 !=
  641. umul a_1,b_5,t_1 !mul_add_c(a[1],b[5],c1,c2,c3);
  642. addcc c_1,t_1,c_1
  643. rd %y,t_2
  644. addxcc c_2,t_2,c_2 !=
  645. addx c_3,%g0,c_3
  646. ld bp(7),b_7
  647. umul a_0,b_6,t_1 !mul_add_c(a[0],b[6],c1,c2,c3);
  648. addcc c_1,t_1,c_1 !=
  649. rd %y,t_2
  650. addxcc c_2,t_2,c_2
  651. st c_1,rp(6) !r[6]=c1;
  652. addx c_3,%g0,c_3 !=
  653. umul a_0,b_7,t_1 !mul_add_c(a[0],b[7],c2,c3,c1);
  654. addcc c_2,t_1,c_2
  655. rd %y,t_2
  656. addxcc c_3,t_2,c_3 !=
  657. addx %g0,%g0,c_1
  658. umul a_1,b_6,t_1 !mul_add_c(a[1],b[6],c2,c3,c1);
  659. addcc c_2,t_1,c_2
  660. rd %y,t_2 !=
  661. addxcc c_3,t_2,c_3
  662. addx c_1,%g0,c_1
  663. umul a_2,b_5,t_1 !mul_add_c(a[2],b[5],c2,c3,c1);
  664. addcc c_2,t_1,c_2 !=
  665. rd %y,t_2
  666. addxcc c_3,t_2,c_3
  667. addx c_1,%g0,c_1
  668. umul a_3,b_4,t_1 !=!mul_add_c(a[3],b[4],c2,c3,c1);
  669. addcc c_2,t_1,c_2
  670. rd %y,t_2
  671. addxcc c_3,t_2,c_3
  672. addx c_1,%g0,c_1 !=
  673. umul a_4,b_3,t_1 !mul_add_c(a[4],b[3],c2,c3,c1);
  674. addcc c_2,t_1,c_2
  675. rd %y,t_2
  676. addxcc c_3,t_2,c_3 !=
  677. addx c_1,%g0,c_1
  678. umul a_5,b_2,t_1 !mul_add_c(a[5],b[2],c2,c3,c1);
  679. addcc c_2,t_1,c_2
  680. rd %y,t_2 !=
  681. addxcc c_3,t_2,c_3
  682. addx c_1,%g0,c_1
  683. ld ap(7),a_7
  684. umul a_6,b_1,t_1 !=!mul_add_c(a[6],b[1],c2,c3,c1);
  685. addcc c_2,t_1,c_2
  686. rd %y,t_2
  687. addxcc c_3,t_2,c_3
  688. addx c_1,%g0,c_1 !=
  689. umul a_7,b_0,t_1 !mul_add_c(a[7],b[0],c2,c3,c1);
  690. addcc c_2,t_1,c_2
  691. rd %y,t_2
  692. addxcc c_3,t_2,c_3 !=
  693. addx c_1,%g0,c_1
  694. st c_2,rp(7) !r[7]=c2;
  695. umul a_7,b_1,t_1 !mul_add_c(a[7],b[1],c3,c1,c2);
  696. addcc c_3,t_1,c_3 !=
  697. rd %y,t_2
  698. addxcc c_1,t_2,c_1
  699. addx %g0,%g0,c_2
  700. umul a_6,b_2,t_1 !=!mul_add_c(a[6],b[2],c3,c1,c2);
  701. addcc c_3,t_1,c_3
  702. rd %y,t_2
  703. addxcc c_1,t_2,c_1
  704. addx c_2,%g0,c_2 !=
  705. umul a_5,b_3,t_1 !mul_add_c(a[5],b[3],c3,c1,c2);
  706. addcc c_3,t_1,c_3
  707. rd %y,t_2
  708. addxcc c_1,t_2,c_1 !=
  709. addx c_2,%g0,c_2
  710. umul a_4,b_4,t_1 !mul_add_c(a[4],b[4],c3,c1,c2);
  711. addcc c_3,t_1,c_3
  712. rd %y,t_2 !=
  713. addxcc c_1,t_2,c_1
  714. addx c_2,%g0,c_2
  715. umul a_3,b_5,t_1 !mul_add_c(a[3],b[5],c3,c1,c2);
  716. addcc c_3,t_1,c_3 !=
  717. rd %y,t_2
  718. addxcc c_1,t_2,c_1
  719. addx c_2,%g0,c_2
  720. umul a_2,b_6,t_1 !=!mul_add_c(a[2],b[6],c3,c1,c2);
  721. addcc c_3,t_1,c_3
  722. rd %y,t_2
  723. addxcc c_1,t_2,c_1
  724. addx c_2,%g0,c_2 !=
  725. umul a_1,b_7,t_1 !mul_add_c(a[1],b[7],c3,c1,c2);
  726. addcc c_3,t_1,c_3
  727. rd %y,t_2
  728. addxcc c_1,t_2,c_1 !
  729. addx c_2,%g0,c_2
  730. st c_3,rp(8) !r[8]=c3;
  731. umul a_2,b_7,t_1 !mul_add_c(a[2],b[7],c1,c2,c3);
  732. addcc c_1,t_1,c_1 !=
  733. rd %y,t_2
  734. addxcc c_2,t_2,c_2
  735. addx %g0,%g0,c_3
  736. umul a_3,b_6,t_1 !=!mul_add_c(a[3],b[6],c1,c2,c3);
  737. addcc c_1,t_1,c_1
  738. rd %y,t_2
  739. addxcc c_2,t_2,c_2
  740. addx c_3,%g0,c_3 !=
  741. umul a_4,b_5,t_1 !mul_add_c(a[4],b[5],c1,c2,c3);
  742. addcc c_1,t_1,c_1
  743. rd %y,t_2
  744. addxcc c_2,t_2,c_2 !=
  745. addx c_3,%g0,c_3
  746. umul a_5,b_4,t_1 !mul_add_c(a[5],b[4],c1,c2,c3);
  747. addcc c_1,t_1,c_1
  748. rd %y,t_2 !=
  749. addxcc c_2,t_2,c_2
  750. addx c_3,%g0,c_3
  751. umul a_6,b_3,t_1 !mul_add_c(a[6],b[3],c1,c2,c3);
  752. addcc c_1,t_1,c_1 !=
  753. rd %y,t_2
  754. addxcc c_2,t_2,c_2
  755. addx c_3,%g0,c_3
  756. umul a_7,b_2,t_1 !=!mul_add_c(a[7],b[2],c1,c2,c3);
  757. addcc c_1,t_1,c_1
  758. rd %y,t_2
  759. addxcc c_2,t_2,c_2
  760. addx c_3,%g0,c_3 !=
  761. st c_1,rp(9) !r[9]=c1;
  762. umul a_7,b_3,t_1 !mul_add_c(a[7],b[3],c2,c3,c1);
  763. addcc c_2,t_1,c_2
  764. rd %y,t_2 !=
  765. addxcc c_3,t_2,c_3
  766. addx %g0,%g0,c_1
  767. umul a_6,b_4,t_1 !mul_add_c(a[6],b[4],c2,c3,c1);
  768. addcc c_2,t_1,c_2 !=
  769. rd %y,t_2
  770. addxcc c_3,t_2,c_3
  771. addx c_1,%g0,c_1
  772. umul a_5,b_5,t_1 !=!mul_add_c(a[5],b[5],c2,c3,c1);
  773. addcc c_2,t_1,c_2
  774. rd %y,t_2
  775. addxcc c_3,t_2,c_3
  776. addx c_1,%g0,c_1 !=
  777. umul a_4,b_6,t_1 !mul_add_c(a[4],b[6],c2,c3,c1);
  778. addcc c_2,t_1,c_2
  779. rd %y,t_2
  780. addxcc c_3,t_2,c_3 !=
  781. addx c_1,%g0,c_1
  782. umul a_3,b_7,t_1 !mul_add_c(a[3],b[7],c2,c3,c1);
  783. addcc c_2,t_1,c_2
  784. rd %y,t_2 !=
  785. addxcc c_3,t_2,c_3
  786. addx c_1,%g0,c_1
  787. st c_2,rp(10) !r[10]=c2;
  788. umul a_4,b_7,t_1 !=!mul_add_c(a[4],b[7],c3,c1,c2);
  789. addcc c_3,t_1,c_3
  790. rd %y,t_2
  791. addxcc c_1,t_2,c_1
  792. addx %g0,%g0,c_2 !=
  793. umul a_5,b_6,t_1 !mul_add_c(a[5],b[6],c3,c1,c2);
  794. addcc c_3,t_1,c_3
  795. rd %y,t_2
  796. addxcc c_1,t_2,c_1 !=
  797. addx c_2,%g0,c_2
  798. umul a_6,b_5,t_1 !mul_add_c(a[6],b[5],c3,c1,c2);
  799. addcc c_3,t_1,c_3
  800. rd %y,t_2 !=
  801. addxcc c_1,t_2,c_1
  802. addx c_2,%g0,c_2
  803. umul a_7,b_4,t_1 !mul_add_c(a[7],b[4],c3,c1,c2);
  804. addcc c_3,t_1,c_3 !=
  805. rd %y,t_2
  806. addxcc c_1,t_2,c_1
  807. st c_3,rp(11) !r[11]=c3;
  808. addx c_2,%g0,c_2 !=
  809. umul a_7,b_5,t_1 !mul_add_c(a[7],b[5],c1,c2,c3);
  810. addcc c_1,t_1,c_1
  811. rd %y,t_2
  812. addxcc c_2,t_2,c_2 !=
  813. addx %g0,%g0,c_3
  814. umul a_6,b_6,t_1 !mul_add_c(a[6],b[6],c1,c2,c3);
  815. addcc c_1,t_1,c_1
  816. rd %y,t_2 !=
  817. addxcc c_2,t_2,c_2
  818. addx c_3,%g0,c_3
  819. umul a_5,b_7,t_1 !mul_add_c(a[5],b[7],c1,c2,c3);
  820. addcc c_1,t_1,c_1 !=
  821. rd %y,t_2
  822. addxcc c_2,t_2,c_2
  823. st c_1,rp(12) !r[12]=c1;
  824. addx c_3,%g0,c_3 !=
  825. umul a_6,b_7,t_1 !mul_add_c(a[6],b[7],c2,c3,c1);
  826. addcc c_2,t_1,c_2
  827. rd %y,t_2
  828. addxcc c_3,t_2,c_3 !=
  829. addx %g0,%g0,c_1
  830. umul a_7,b_6,t_1 !mul_add_c(a[7],b[6],c2,c3,c1);
  831. addcc c_2,t_1,c_2
  832. rd %y,t_2 !=
  833. addxcc c_3,t_2,c_3
  834. addx c_1,%g0,c_1
  835. st c_2,rp(13) !r[13]=c2;
  836. umul a_7,b_7,t_1 !=!mul_add_c(a[7],b[7],c3,c1,c2);
  837. addcc c_3,t_1,c_3
  838. rd %y,t_2
  839. addxcc c_1,t_2,c_1
  840. nop !=
  841. st c_3,rp(14) !r[14]=c3;
  842. st c_1,rp(15) !r[15]=c1;
  843. ret
  844. restore %g0,%g0,%o0
  845. .type bn_mul_comba8,#function
  846. .size bn_mul_comba8,(.-bn_mul_comba8)
  847. .align 32
  848. .global bn_mul_comba4
  849. /*
  850. * void bn_mul_comba4(r,a,b)
  851. * BN_ULONG *r,*a,*b;
  852. */
  853. bn_mul_comba4:
  854. save %sp,FRAME_SIZE,%sp
  855. ld ap(0),a_0
  856. ld bp(0),b_0
  857. umul a_0,b_0,c_1 !=!mul_add_c(a[0],b[0],c1,c2,c3);
  858. ld bp(1),b_1
  859. rd %y,c_2
  860. st c_1,rp(0) !r[0]=c1;
  861. umul a_0,b_1,t_1 !=!mul_add_c(a[0],b[1],c2,c3,c1);
  862. ld ap(1),a_1
  863. addcc c_2,t_1,c_2
  864. rd %y,t_2 !=
  865. addxcc %g0,t_2,c_3
  866. addx %g0,%g0,c_1
  867. ld ap(2),a_2
  868. umul a_1,b_0,t_1 !=!mul_add_c(a[1],b[0],c2,c3,c1);
  869. addcc c_2,t_1,c_2
  870. rd %y,t_2
  871. addxcc c_3,t_2,c_3
  872. addx c_1,%g0,c_1 !=
  873. st c_2,rp(1) !r[1]=c2;
  874. umul a_2,b_0,t_1 !mul_add_c(a[2],b[0],c3,c1,c2);
  875. addcc c_3,t_1,c_3
  876. rd %y,t_2 !=
  877. addxcc c_1,t_2,c_1
  878. addx %g0,%g0,c_2
  879. ld bp(2),b_2
  880. umul a_1,b_1,t_1 !=!mul_add_c(a[1],b[1],c3,c1,c2);
  881. addcc c_3,t_1,c_3
  882. rd %y,t_2
  883. addxcc c_1,t_2,c_1
  884. addx c_2,%g0,c_2 !=
  885. ld bp(3),b_3
  886. umul a_0,b_2,t_1 !mul_add_c(a[0],b[2],c3,c1,c2);
  887. addcc c_3,t_1,c_3
  888. rd %y,t_2 !=
  889. addxcc c_1,t_2,c_1
  890. addx c_2,%g0,c_2
  891. st c_3,rp(2) !r[2]=c3;
  892. umul a_0,b_3,t_1 !=!mul_add_c(a[0],b[3],c1,c2,c3);
  893. addcc c_1,t_1,c_1
  894. rd %y,t_2
  895. addxcc c_2,t_2,c_2
  896. addx %g0,%g0,c_3 !=
  897. umul a_1,b_2,t_1 !mul_add_c(a[1],b[2],c1,c2,c3);
  898. addcc c_1,t_1,c_1
  899. rd %y,t_2
  900. addxcc c_2,t_2,c_2 !=
  901. addx c_3,%g0,c_3
  902. ld ap(3),a_3
  903. umul a_2,b_1,t_1 !mul_add_c(a[2],b[1],c1,c2,c3);
  904. addcc c_1,t_1,c_1 !=
  905. rd %y,t_2
  906. addxcc c_2,t_2,c_2
  907. addx c_3,%g0,c_3
  908. umul a_3,b_0,t_1 !=!mul_add_c(a[3],b[0],c1,c2,c3);
  909. addcc c_1,t_1,c_1
  910. rd %y,t_2
  911. addxcc c_2,t_2,c_2
  912. addx c_3,%g0,c_3 !=
  913. st c_1,rp(3) !r[3]=c1;
  914. umul a_3,b_1,t_1 !mul_add_c(a[3],b[1],c2,c3,c1);
  915. addcc c_2,t_1,c_2
  916. rd %y,t_2 !=
  917. addxcc c_3,t_2,c_3
  918. addx %g0,%g0,c_1
  919. umul a_2,b_2,t_1 !mul_add_c(a[2],b[2],c2,c3,c1);
  920. addcc c_2,t_1,c_2 !=
  921. rd %y,t_2
  922. addxcc c_3,t_2,c_3
  923. addx c_1,%g0,c_1
  924. umul a_1,b_3,t_1 !=!mul_add_c(a[1],b[3],c2,c3,c1);
  925. addcc c_2,t_1,c_2
  926. rd %y,t_2
  927. addxcc c_3,t_2,c_3
  928. addx c_1,%g0,c_1 !=
  929. st c_2,rp(4) !r[4]=c2;
  930. umul a_2,b_3,t_1 !mul_add_c(a[2],b[3],c3,c1,c2);
  931. addcc c_3,t_1,c_3
  932. rd %y,t_2 !=
  933. addxcc c_1,t_2,c_1
  934. addx %g0,%g0,c_2
  935. umul a_3,b_2,t_1 !mul_add_c(a[3],b[2],c3,c1,c2);
  936. addcc c_3,t_1,c_3 !=
  937. rd %y,t_2
  938. addxcc c_1,t_2,c_1
  939. st c_3,rp(5) !r[5]=c3;
  940. addx c_2,%g0,c_2 !=
  941. umul a_3,b_3,t_1 !mul_add_c(a[3],b[3],c1,c2,c3);
  942. addcc c_1,t_1,c_1
  943. rd %y,t_2
  944. addxcc c_2,t_2,c_2 !=
  945. st c_1,rp(6) !r[6]=c1;
  946. st c_2,rp(7) !r[7]=c2;
  947. ret
  948. restore %g0,%g0,%o0
  949. .type bn_mul_comba4,#function
  950. .size bn_mul_comba4,(.-bn_mul_comba4)
  951. .align 32
  952. .global bn_sqr_comba8
  953. bn_sqr_comba8:
  954. save %sp,FRAME_SIZE,%sp
  955. ld ap(0),a_0
  956. ld ap(1),a_1
  957. umul a_0,a_0,c_1 !=!sqr_add_c(a,0,c1,c2,c3);
  958. rd %y,c_2
  959. st c_1,rp(0) !r[0]=c1;
  960. ld ap(2),a_2
  961. umul a_0,a_1,t_1 !=!sqr_add_c2(a,1,0,c2,c3,c1);
  962. addcc c_2,t_1,c_2
  963. rd %y,t_2
  964. addxcc %g0,t_2,c_3
  965. addx %g0,%g0,c_1 !=
  966. addcc c_2,t_1,c_2
  967. addxcc c_3,t_2,c_3
  968. st c_2,rp(1) !r[1]=c2;
  969. addx c_1,%g0,c_1 !=
  970. umul a_2,a_0,t_1 !sqr_add_c2(a,2,0,c3,c1,c2);
  971. addcc c_3,t_1,c_3
  972. rd %y,t_2
  973. addxcc c_1,t_2,c_1 !=
  974. addx %g0,%g0,c_2
  975. addcc c_3,t_1,c_3
  976. addxcc c_1,t_2,c_1
  977. addx c_2,%g0,c_2 !=
  978. ld ap(3),a_3
  979. umul a_1,a_1,t_1 !sqr_add_c(a,1,c3,c1,c2);
  980. addcc c_3,t_1,c_3
  981. rd %y,t_2 !=
  982. addxcc c_1,t_2,c_1
  983. addx c_2,%g0,c_2
  984. st c_3,rp(2) !r[2]=c3;
  985. umul a_0,a_3,t_1 !=!sqr_add_c2(a,3,0,c1,c2,c3);
  986. addcc c_1,t_1,c_1
  987. rd %y,t_2
  988. addxcc c_2,t_2,c_2
  989. addx %g0,%g0,c_3 !=
  990. addcc c_1,t_1,c_1
  991. addxcc c_2,t_2,c_2
  992. ld ap(4),a_4
  993. addx c_3,%g0,c_3 !=
  994. umul a_1,a_2,t_1 !sqr_add_c2(a,2,1,c1,c2,c3);
  995. addcc c_1,t_1,c_1
  996. rd %y,t_2
  997. addxcc c_2,t_2,c_2 !=
  998. addx c_3,%g0,c_3
  999. addcc c_1,t_1,c_1
  1000. addxcc c_2,t_2,c_2
  1001. addx c_3,%g0,c_3 !=
  1002. st c_1,rp(3) !r[3]=c1;
  1003. umul a_4,a_0,t_1 !sqr_add_c2(a,4,0,c2,c3,c1);
  1004. addcc c_2,t_1,c_2
  1005. rd %y,t_2 !=
  1006. addxcc c_3,t_2,c_3
  1007. addx %g0,%g0,c_1
  1008. addcc c_2,t_1,c_2
  1009. addxcc c_3,t_2,c_3 !=
  1010. addx c_1,%g0,c_1
  1011. umul a_3,a_1,t_1 !sqr_add_c2(a,3,1,c2,c3,c1);
  1012. addcc c_2,t_1,c_2
  1013. rd %y,t_2 !=
  1014. addxcc c_3,t_2,c_3
  1015. addx c_1,%g0,c_1
  1016. addcc c_2,t_1,c_2
  1017. addxcc c_3,t_2,c_3 !=
  1018. addx c_1,%g0,c_1
  1019. ld ap(5),a_5
  1020. umul a_2,a_2,t_1 !sqr_add_c(a,2,c2,c3,c1);
  1021. addcc c_2,t_1,c_2 !=
  1022. rd %y,t_2
  1023. addxcc c_3,t_2,c_3
  1024. st c_2,rp(4) !r[4]=c2;
  1025. addx c_1,%g0,c_1 !=
  1026. umul a_0,a_5,t_1 !sqr_add_c2(a,5,0,c3,c1,c2);
  1027. addcc c_3,t_1,c_3
  1028. rd %y,t_2
  1029. addxcc c_1,t_2,c_1 !=
  1030. addx %g0,%g0,c_2
  1031. addcc c_3,t_1,c_3
  1032. addxcc c_1,t_2,c_1
  1033. addx c_2,%g0,c_2 !=
  1034. umul a_1,a_4,t_1 !sqr_add_c2(a,4,1,c3,c1,c2);
  1035. addcc c_3,t_1,c_3
  1036. rd %y,t_2
  1037. addxcc c_1,t_2,c_1 !=
  1038. addx c_2,%g0,c_2
  1039. addcc c_3,t_1,c_3
  1040. addxcc c_1,t_2,c_1
  1041. addx c_2,%g0,c_2 !=
  1042. ld ap(6),a_6
  1043. umul a_2,a_3,t_1 !sqr_add_c2(a,3,2,c3,c1,c2);
  1044. addcc c_3,t_1,c_3
  1045. rd %y,t_2 !=
  1046. addxcc c_1,t_2,c_1
  1047. addx c_2,%g0,c_2
  1048. addcc c_3,t_1,c_3
  1049. addxcc c_1,t_2,c_1 !=
  1050. addx c_2,%g0,c_2
  1051. st c_3,rp(5) !r[5]=c3;
  1052. umul a_6,a_0,t_1 !sqr_add_c2(a,6,0,c1,c2,c3);
  1053. addcc c_1,t_1,c_1 !=
  1054. rd %y,t_2
  1055. addxcc c_2,t_2,c_2
  1056. addx %g0,%g0,c_3
  1057. addcc c_1,t_1,c_1 !=
  1058. addxcc c_2,t_2,c_2
  1059. addx c_3,%g0,c_3
  1060. umul a_5,a_1,t_1 !sqr_add_c2(a,5,1,c1,c2,c3);
  1061. addcc c_1,t_1,c_1 !=
  1062. rd %y,t_2
  1063. addxcc c_2,t_2,c_2
  1064. addx c_3,%g0,c_3
  1065. addcc c_1,t_1,c_1 !=
  1066. addxcc c_2,t_2,c_2
  1067. addx c_3,%g0,c_3
  1068. umul a_4,a_2,t_1 !sqr_add_c2(a,4,2,c1,c2,c3);
  1069. addcc c_1,t_1,c_1 !=
  1070. rd %y,t_2
  1071. addxcc c_2,t_2,c_2
  1072. addx c_3,%g0,c_3
  1073. addcc c_1,t_1,c_1 !=
  1074. addxcc c_2,t_2,c_2
  1075. addx c_3,%g0,c_3
  1076. ld ap(7),a_7
  1077. umul a_3,a_3,t_1 !=!sqr_add_c(a,3,c1,c2,c3);
  1078. addcc c_1,t_1,c_1
  1079. rd %y,t_2
  1080. addxcc c_2,t_2,c_2
  1081. addx c_3,%g0,c_3 !=
  1082. st c_1,rp(6) !r[6]=c1;
  1083. umul a_0,a_7,t_1 !sqr_add_c2(a,7,0,c2,c3,c1);
  1084. addcc c_2,t_1,c_2
  1085. rd %y,t_2 !=
  1086. addxcc c_3,t_2,c_3
  1087. addx %g0,%g0,c_1
  1088. addcc c_2,t_1,c_2
  1089. addxcc c_3,t_2,c_3 !=
  1090. addx c_1,%g0,c_1
  1091. umul a_1,a_6,t_1 !sqr_add_c2(a,6,1,c2,c3,c1);
  1092. addcc c_2,t_1,c_2
  1093. rd %y,t_2 !=
  1094. addxcc c_3,t_2,c_3
  1095. addx c_1,%g0,c_1
  1096. addcc c_2,t_1,c_2
  1097. addxcc c_3,t_2,c_3 !=
  1098. addx c_1,%g0,c_1
  1099. umul a_2,a_5,t_1 !sqr_add_c2(a,5,2,c2,c3,c1);
  1100. addcc c_2,t_1,c_2
  1101. rd %y,t_2 !=
  1102. addxcc c_3,t_2,c_3
  1103. addx c_1,%g0,c_1
  1104. addcc c_2,t_1,c_2
  1105. addxcc c_3,t_2,c_3 !=
  1106. addx c_1,%g0,c_1
  1107. umul a_3,a_4,t_1 !sqr_add_c2(a,4,3,c2,c3,c1);
  1108. addcc c_2,t_1,c_2
  1109. rd %y,t_2 !=
  1110. addxcc c_3,t_2,c_3
  1111. addx c_1,%g0,c_1
  1112. addcc c_2,t_1,c_2
  1113. addxcc c_3,t_2,c_3 !=
  1114. addx c_1,%g0,c_1
  1115. st c_2,rp(7) !r[7]=c2;
  1116. umul a_7,a_1,t_1 !sqr_add_c2(a,7,1,c3,c1,c2);
  1117. addcc c_3,t_1,c_3 !=
  1118. rd %y,t_2
  1119. addxcc c_1,t_2,c_1
  1120. addx %g0,%g0,c_2
  1121. addcc c_3,t_1,c_3 !=
  1122. addxcc c_1,t_2,c_1
  1123. addx c_2,%g0,c_2
  1124. umul a_6,a_2,t_1 !sqr_add_c2(a,6,2,c3,c1,c2);
  1125. addcc c_3,t_1,c_3 !=
  1126. rd %y,t_2
  1127. addxcc c_1,t_2,c_1
  1128. addx c_2,%g0,c_2
  1129. addcc c_3,t_1,c_3 !=
  1130. addxcc c_1,t_2,c_1
  1131. addx c_2,%g0,c_2
  1132. umul a_5,a_3,t_1 !sqr_add_c2(a,5,3,c3,c1,c2);
  1133. addcc c_3,t_1,c_3 !=
  1134. rd %y,t_2
  1135. addxcc c_1,t_2,c_1
  1136. addx c_2,%g0,c_2
  1137. addcc c_3,t_1,c_3 !=
  1138. addxcc c_1,t_2,c_1
  1139. addx c_2,%g0,c_2
  1140. umul a_4,a_4,t_1 !sqr_add_c(a,4,c3,c1,c2);
  1141. addcc c_3,t_1,c_3 !=
  1142. rd %y,t_2
  1143. addxcc c_1,t_2,c_1
  1144. st c_3,rp(8) !r[8]=c3;
  1145. addx c_2,%g0,c_2 !=
  1146. umul a_2,a_7,t_1 !sqr_add_c2(a,7,2,c1,c2,c3);
  1147. addcc c_1,t_1,c_1
  1148. rd %y,t_2
  1149. addxcc c_2,t_2,c_2 !=
  1150. addx %g0,%g0,c_3
  1151. addcc c_1,t_1,c_1
  1152. addxcc c_2,t_2,c_2
  1153. addx c_3,%g0,c_3 !=
  1154. umul a_3,a_6,t_1 !sqr_add_c2(a,6,3,c1,c2,c3);
  1155. addcc c_1,t_1,c_1
  1156. rd %y,t_2
  1157. addxcc c_2,t_2,c_2 !=
  1158. addx c_3,%g0,c_3
  1159. addcc c_1,t_1,c_1
  1160. addxcc c_2,t_2,c_2
  1161. addx c_3,%g0,c_3 !=
  1162. umul a_4,a_5,t_1 !sqr_add_c2(a,5,4,c1,c2,c3);
  1163. addcc c_1,t_1,c_1
  1164. rd %y,t_2
  1165. addxcc c_2,t_2,c_2 !=
  1166. addx c_3,%g0,c_3
  1167. addcc c_1,t_1,c_1
  1168. addxcc c_2,t_2,c_2
  1169. addx c_3,%g0,c_3 !=
  1170. st c_1,rp(9) !r[9]=c1;
  1171. umul a_7,a_3,t_1 !sqr_add_c2(a,7,3,c2,c3,c1);
  1172. addcc c_2,t_1,c_2
  1173. rd %y,t_2 !=
  1174. addxcc c_3,t_2,c_3
  1175. addx %g0,%g0,c_1
  1176. addcc c_2,t_1,c_2
  1177. addxcc c_3,t_2,c_3 !=
  1178. addx c_1,%g0,c_1
  1179. umul a_6,a_4,t_1 !sqr_add_c2(a,6,4,c2,c3,c1);
  1180. addcc c_2,t_1,c_2
  1181. rd %y,t_2 !=
  1182. addxcc c_3,t_2,c_3
  1183. addx c_1,%g0,c_1
  1184. addcc c_2,t_1,c_2
  1185. addxcc c_3,t_2,c_3 !=
  1186. addx c_1,%g0,c_1
  1187. umul a_5,a_5,t_1 !sqr_add_c(a,5,c2,c3,c1);
  1188. addcc c_2,t_1,c_2
  1189. rd %y,t_2 !=
  1190. addxcc c_3,t_2,c_3
  1191. addx c_1,%g0,c_1
  1192. st c_2,rp(10) !r[10]=c2;
  1193. umul a_4,a_7,t_1 !=!sqr_add_c2(a,7,4,c3,c1,c2);
  1194. addcc c_3,t_1,c_3
  1195. rd %y,t_2
  1196. addxcc c_1,t_2,c_1
  1197. addx %g0,%g0,c_2 !=
  1198. addcc c_3,t_1,c_3
  1199. addxcc c_1,t_2,c_1
  1200. addx c_2,%g0,c_2
  1201. umul a_5,a_6,t_1 !=!sqr_add_c2(a,6,5,c3,c1,c2);
  1202. addcc c_3,t_1,c_3
  1203. rd %y,t_2
  1204. addxcc c_1,t_2,c_1
  1205. addx c_2,%g0,c_2 !=
  1206. addcc c_3,t_1,c_3
  1207. addxcc c_1,t_2,c_1
  1208. st c_3,rp(11) !r[11]=c3;
  1209. addx c_2,%g0,c_2 !=
  1210. umul a_7,a_5,t_1 !sqr_add_c2(a,7,5,c1,c2,c3);
  1211. addcc c_1,t_1,c_1
  1212. rd %y,t_2
  1213. addxcc c_2,t_2,c_2 !=
  1214. addx %g0,%g0,c_3
  1215. addcc c_1,t_1,c_1
  1216. addxcc c_2,t_2,c_2
  1217. addx c_3,%g0,c_3 !=
  1218. umul a_6,a_6,t_1 !sqr_add_c(a,6,c1,c2,c3);
  1219. addcc c_1,t_1,c_1
  1220. rd %y,t_2
  1221. addxcc c_2,t_2,c_2 !=
  1222. addx c_3,%g0,c_3
  1223. st c_1,rp(12) !r[12]=c1;
  1224. umul a_6,a_7,t_1 !sqr_add_c2(a,7,6,c2,c3,c1);
  1225. addcc c_2,t_1,c_2 !=
  1226. rd %y,t_2
  1227. addxcc c_3,t_2,c_3
  1228. addx %g0,%g0,c_1
  1229. addcc c_2,t_1,c_2 !=
  1230. addxcc c_3,t_2,c_3
  1231. st c_2,rp(13) !r[13]=c2;
  1232. addx c_1,%g0,c_1 !=
  1233. umul a_7,a_7,t_1 !sqr_add_c(a,7,c3,c1,c2);
  1234. addcc c_3,t_1,c_3
  1235. rd %y,t_2
  1236. addxcc c_1,t_2,c_1 !=
  1237. st c_3,rp(14) !r[14]=c3;
  1238. st c_1,rp(15) !r[15]=c1;
  1239. ret
  1240. restore %g0,%g0,%o0
  1241. .type bn_sqr_comba8,#function
  1242. .size bn_sqr_comba8,(.-bn_sqr_comba8)
  1243. .align 32
  1244. .global bn_sqr_comba4
  1245. /*
  1246. * void bn_sqr_comba4(r,a)
  1247. * BN_ULONG *r,*a;
  1248. */
  1249. bn_sqr_comba4:
  1250. save %sp,FRAME_SIZE,%sp
  1251. ld ap(0),a_0
  1252. umul a_0,a_0,c_1 !sqr_add_c(a,0,c1,c2,c3);
  1253. ld ap(1),a_1 !=
  1254. rd %y,c_2
  1255. st c_1,rp(0) !r[0]=c1;
  1256. ld ap(2),a_2
  1257. umul a_0,a_1,t_1 !=!sqr_add_c2(a,1,0,c2,c3,c1);
  1258. addcc c_2,t_1,c_2
  1259. rd %y,t_2
  1260. addxcc %g0,t_2,c_3
  1261. addx %g0,%g0,c_1 !=
  1262. addcc c_2,t_1,c_2
  1263. addxcc c_3,t_2,c_3
  1264. addx c_1,%g0,c_1 !=
  1265. st c_2,rp(1) !r[1]=c2;
  1266. umul a_2,a_0,t_1 !sqr_add_c2(a,2,0,c3,c1,c2);
  1267. addcc c_3,t_1,c_3
  1268. rd %y,t_2 !=
  1269. addxcc c_1,t_2,c_1
  1270. addx %g0,%g0,c_2
  1271. addcc c_3,t_1,c_3
  1272. addxcc c_1,t_2,c_1 !=
  1273. addx c_2,%g0,c_2
  1274. ld ap(3),a_3
  1275. umul a_1,a_1,t_1 !sqr_add_c(a,1,c3,c1,c2);
  1276. addcc c_3,t_1,c_3 !=
  1277. rd %y,t_2
  1278. addxcc c_1,t_2,c_1
  1279. st c_3,rp(2) !r[2]=c3;
  1280. addx c_2,%g0,c_2 !=
  1281. umul a_0,a_3,t_1 !sqr_add_c2(a,3,0,c1,c2,c3);
  1282. addcc c_1,t_1,c_1
  1283. rd %y,t_2
  1284. addxcc c_2,t_2,c_2 !=
  1285. addx %g0,%g0,c_3
  1286. addcc c_1,t_1,c_1
  1287. addxcc c_2,t_2,c_2
  1288. addx c_3,%g0,c_3 !=
  1289. umul a_1,a_2,t_1 !sqr_add_c2(a,2,1,c1,c2,c3);
  1290. addcc c_1,t_1,c_1
  1291. rd %y,t_2
  1292. addxcc c_2,t_2,c_2 !=
  1293. addx c_3,%g0,c_3
  1294. addcc c_1,t_1,c_1
  1295. addxcc c_2,t_2,c_2
  1296. addx c_3,%g0,c_3 !=
  1297. st c_1,rp(3) !r[3]=c1;
  1298. umul a_3,a_1,t_1 !sqr_add_c2(a,3,1,c2,c3,c1);
  1299. addcc c_2,t_1,c_2
  1300. rd %y,t_2 !=
  1301. addxcc c_3,t_2,c_3
  1302. addx %g0,%g0,c_1
  1303. addcc c_2,t_1,c_2
  1304. addxcc c_3,t_2,c_3 !=
  1305. addx c_1,%g0,c_1
  1306. umul a_2,a_2,t_1 !sqr_add_c(a,2,c2,c3,c1);
  1307. addcc c_2,t_1,c_2
  1308. rd %y,t_2 !=
  1309. addxcc c_3,t_2,c_3
  1310. addx c_1,%g0,c_1
  1311. st c_2,rp(4) !r[4]=c2;
  1312. umul a_2,a_3,t_1 !=!sqr_add_c2(a,3,2,c3,c1,c2);
  1313. addcc c_3,t_1,c_3
  1314. rd %y,t_2
  1315. addxcc c_1,t_2,c_1
  1316. addx %g0,%g0,c_2 !=
  1317. addcc c_3,t_1,c_3
  1318. addxcc c_1,t_2,c_1
  1319. st c_3,rp(5) !r[5]=c3;
  1320. addx c_2,%g0,c_2 !=
  1321. umul a_3,a_3,t_1 !sqr_add_c(a,3,c1,c2,c3);
  1322. addcc c_1,t_1,c_1
  1323. rd %y,t_2
  1324. addxcc c_2,t_2,c_2 !=
  1325. st c_1,rp(6) !r[6]=c1;
  1326. st c_2,rp(7) !r[7]=c2;
  1327. ret
  1328. restore %g0,%g0,%o0
  1329. .type bn_sqr_comba4,#function
  1330. .size bn_sqr_comba4,(.-bn_sqr_comba4)
  1331. .align 32