s390x.S 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678
  1. .ident "s390x.S, version 1.1"
  2. // ====================================================================
  3. // Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
  4. // project.
  5. //
  6. // Rights for redistribution and usage in source and binary forms are
  7. // granted according to the OpenSSL license. Warranty of any kind is
  8. // disclaimed.
  9. // ====================================================================
  10. .text
  11. #define zero %r0
  12. // BN_ULONG bn_mul_add_words(BN_ULONG *r2,BN_ULONG *r3,int r4,BN_ULONG r5);
  13. .globl bn_mul_add_words
  14. .type bn_mul_add_words,@function
  15. .align 4
  16. bn_mul_add_words:
  17. lghi zero,0 // zero = 0
  18. la %r1,0(%r2) // put rp aside
  19. lghi %r2,0 // i=0;
  20. ltgfr %r4,%r4
  21. bler %r14 // if (len<=0) return 0;
  22. stmg %r6,%r10,48(%r15)
  23. lghi %r10,3
  24. lghi %r8,0 // carry = 0
  25. nr %r10,%r4 // len%4
  26. sra %r4,2 // cnt=len/4
  27. jz .Loop1_madd // carry is incidentally cleared if branch taken
  28. algr zero,zero // clear carry
  29. .Loop4_madd:
  30. lg %r7,0(%r2,%r3) // ap[i]
  31. mlgr %r6,%r5 // *=w
  32. alcgr %r7,%r8 // +=carry
  33. alcgr %r6,zero
  34. alg %r7,0(%r2,%r1) // +=rp[i]
  35. stg %r7,0(%r2,%r1) // rp[i]=
  36. lg %r9,8(%r2,%r3)
  37. mlgr %r8,%r5
  38. alcgr %r9,%r6
  39. alcgr %r8,zero
  40. alg %r9,8(%r2,%r1)
  41. stg %r9,8(%r2,%r1)
  42. lg %r7,16(%r2,%r3)
  43. mlgr %r6,%r5
  44. alcgr %r7,%r8
  45. alcgr %r6,zero
  46. alg %r7,16(%r2,%r1)
  47. stg %r7,16(%r2,%r1)
  48. lg %r9,24(%r2,%r3)
  49. mlgr %r8,%r5
  50. alcgr %r9,%r6
  51. alcgr %r8,zero
  52. alg %r9,24(%r2,%r1)
  53. stg %r9,24(%r2,%r1)
  54. la %r2,32(%r2) // i+=4
  55. brct %r4,.Loop4_madd
  56. la %r10,1(%r10) // see if len%4 is zero ...
  57. brct %r10,.Loop1_madd // without touching condition code:-)
  58. .Lend_madd:
  59. alcgr %r8,zero // collect carry bit
  60. lgr %r2,%r8
  61. lmg %r6,%r10,48(%r15)
  62. br %r14
  63. .Loop1_madd:
  64. lg %r7,0(%r2,%r3) // ap[i]
  65. mlgr %r6,%r5 // *=w
  66. alcgr %r7,%r8 // +=carry
  67. alcgr %r6,zero
  68. alg %r7,0(%r2,%r1) // +=rp[i]
  69. stg %r7,0(%r2,%r1) // rp[i]=
  70. lgr %r8,%r6
  71. la %r2,8(%r2) // i++
  72. brct %r10,.Loop1_madd
  73. j .Lend_madd
  74. .size bn_mul_add_words,.-bn_mul_add_words
  75. // BN_ULONG bn_mul_words(BN_ULONG *r2,BN_ULONG *r3,int r4,BN_ULONG r5);
  76. .globl bn_mul_words
  77. .type bn_mul_words,@function
  78. .align 4
  79. bn_mul_words:
  80. lghi zero,0 // zero = 0
  81. la %r1,0(%r2) // put rp aside
  82. lghi %r2,0 // i=0;
  83. ltgfr %r4,%r4
  84. bler %r14 // if (len<=0) return 0;
  85. stmg %r6,%r10,48(%r15)
  86. lghi %r10,3
  87. lghi %r8,0 // carry = 0
  88. nr %r10,%r4 // len%4
  89. sra %r4,2 // cnt=len/4
  90. jz .Loop1_mul // carry is incidentally cleared if branch taken
  91. algr zero,zero // clear carry
  92. .Loop4_mul:
  93. lg %r7,0(%r2,%r3) // ap[i]
  94. mlgr %r6,%r5 // *=w
  95. alcgr %r7,%r8 // +=carry
  96. stg %r7,0(%r2,%r1) // rp[i]=
  97. lg %r9,8(%r2,%r3)
  98. mlgr %r8,%r5
  99. alcgr %r9,%r6
  100. stg %r9,8(%r2,%r1)
  101. lg %r7,16(%r2,%r3)
  102. mlgr %r6,%r5
  103. alcgr %r7,%r8
  104. stg %r7,16(%r2,%r1)
  105. lg %r9,24(%r2,%r3)
  106. mlgr %r8,%r5
  107. alcgr %r9,%r6
  108. stg %r9,24(%r2,%r1)
  109. la %r2,32(%r2) // i+=4
  110. brct %r4,.Loop4_mul
  111. la %r10,1(%r10) // see if len%4 is zero ...
  112. brct %r10,.Loop1_mul // without touching condition code:-)
  113. .Lend_mul:
  114. alcgr %r8,zero // collect carry bit
  115. lgr %r2,%r8
  116. lmg %r6,%r10,48(%r15)
  117. br %r14
  118. .Loop1_mul:
  119. lg %r7,0(%r2,%r3) // ap[i]
  120. mlgr %r6,%r5 // *=w
  121. alcgr %r7,%r8 // +=carry
  122. stg %r7,0(%r2,%r1) // rp[i]=
  123. lgr %r8,%r6
  124. la %r2,8(%r2) // i++
  125. brct %r10,.Loop1_mul
  126. j .Lend_mul
  127. .size bn_mul_words,.-bn_mul_words
  128. // void bn_sqr_words(BN_ULONG *r2,BN_ULONG *r2,int r4)
  129. .globl bn_sqr_words
  130. .type bn_sqr_words,@function
  131. .align 4
  132. bn_sqr_words:
  133. ltgfr %r4,%r4
  134. bler %r14
  135. stmg %r6,%r7,48(%r15)
  136. srag %r1,%r4,2 // cnt=len/4
  137. jz .Loop1_sqr
  138. .Loop4_sqr:
  139. lg %r7,0(%r3)
  140. mlgr %r6,%r7
  141. stg %r7,0(%r2)
  142. stg %r6,8(%r2)
  143. lg %r7,8(%r3)
  144. mlgr %r6,%r7
  145. stg %r7,16(%r2)
  146. stg %r6,24(%r2)
  147. lg %r7,16(%r3)
  148. mlgr %r6,%r7
  149. stg %r7,32(%r2)
  150. stg %r6,40(%r2)
  151. lg %r7,24(%r3)
  152. mlgr %r6,%r7
  153. stg %r7,48(%r2)
  154. stg %r6,56(%r2)
  155. la %r3,32(%r3)
  156. la %r2,64(%r2)
  157. brct %r1,.Loop4_sqr
  158. lghi %r1,3
  159. nr %r4,%r1 // cnt=len%4
  160. jz .Lend_sqr
  161. .Loop1_sqr:
  162. lg %r7,0(%r3)
  163. mlgr %r6,%r7
  164. stg %r7,0(%r2)
  165. stg %r6,8(%r2)
  166. la %r3,8(%r3)
  167. la %r2,16(%r2)
  168. brct %r4,.Loop1_sqr
  169. .Lend_sqr:
  170. lmg %r6,%r7,48(%r15)
  171. br %r14
  172. .size bn_sqr_words,.-bn_sqr_words
  173. // BN_ULONG bn_div_words(BN_ULONG h,BN_ULONG l,BN_ULONG d);
  174. .globl bn_div_words
  175. .type bn_div_words,@function
  176. .align 4
  177. bn_div_words:
  178. dlgr %r2,%r4
  179. lgr %r2,%r3
  180. br %r14
  181. .size bn_div_words,.-bn_div_words
  182. // BN_ULONG bn_add_words(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4,int r5);
  183. .globl bn_add_words
  184. .type bn_add_words,@function
  185. .align 4
  186. bn_add_words:
  187. la %r1,0(%r2) // put rp aside
  188. lghi %r2,0 // i=0
  189. ltgfr %r5,%r5
  190. bler %r14 // if (len<=0) return 0;
  191. stg %r6,48(%r15)
  192. lghi %r6,3
  193. nr %r6,%r5 // len%4
  194. sra %r5,2 // len/4, use sra because it sets condition code
  195. jz .Loop1_add // carry is incidentally cleared if branch taken
  196. algr %r2,%r2 // clear carry
  197. .Loop4_add:
  198. lg %r0,0(%r2,%r3)
  199. alcg %r0,0(%r2,%r4)
  200. stg %r0,0(%r2,%r1)
  201. lg %r0,8(%r2,%r3)
  202. alcg %r0,8(%r2,%r4)
  203. stg %r0,8(%r2,%r1)
  204. lg %r0,16(%r2,%r3)
  205. alcg %r0,16(%r2,%r4)
  206. stg %r0,16(%r2,%r1)
  207. lg %r0,24(%r2,%r3)
  208. alcg %r0,24(%r2,%r4)
  209. stg %r0,24(%r2,%r1)
  210. la %r2,32(%r2) // i+=4
  211. brct %r5,.Loop4_add
  212. la %r6,1(%r6) // see if len%4 is zero ...
  213. brct %r6,.Loop1_add // without touching condition code:-)
  214. .Lexit_add:
  215. lghi %r2,0
  216. alcgr %r2,%r2
  217. lg %r6,48(%r15)
  218. br %r14
  219. .Loop1_add:
  220. lg %r0,0(%r2,%r3)
  221. alcg %r0,0(%r2,%r4)
  222. stg %r0,0(%r2,%r1)
  223. la %r2,8(%r2) // i++
  224. brct %r6,.Loop1_add
  225. j .Lexit_add
  226. .size bn_add_words,.-bn_add_words
  227. // BN_ULONG bn_sub_words(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4,int r5);
  228. .globl bn_sub_words
  229. .type bn_sub_words,@function
  230. .align 4
  231. bn_sub_words:
  232. la %r1,0(%r2) // put rp aside
  233. lghi %r2,0 // i=0
  234. ltgfr %r5,%r5
  235. bler %r14 // if (len<=0) return 0;
  236. stg %r6,48(%r15)
  237. lghi %r6,3
  238. nr %r6,%r5 // len%4
  239. sra %r5,2 // len/4, use sra because it sets condition code
  240. jnz .Loop4_sub // borrow is incidentally cleared if branch taken
  241. slgr %r2,%r2 // clear borrow
  242. .Loop1_sub:
  243. lg %r0,0(%r2,%r3)
  244. slbg %r0,0(%r2,%r4)
  245. stg %r0,0(%r2,%r1)
  246. la %r2,8(%r2) // i++
  247. brct %r6,.Loop1_sub
  248. j .Lexit_sub
  249. .Loop4_sub:
  250. lg %r0,0(%r2,%r3)
  251. slbg %r0,0(%r2,%r4)
  252. stg %r0,0(%r2,%r1)
  253. lg %r0,8(%r2,%r3)
  254. slbg %r0,8(%r2,%r4)
  255. stg %r0,8(%r2,%r1)
  256. lg %r0,16(%r2,%r3)
  257. slbg %r0,16(%r2,%r4)
  258. stg %r0,16(%r2,%r1)
  259. lg %r0,24(%r2,%r3)
  260. slbg %r0,24(%r2,%r4)
  261. stg %r0,24(%r2,%r1)
  262. la %r2,32(%r2) // i+=4
  263. brct %r5,.Loop4_sub
  264. la %r6,1(%r6) // see if len%4 is zero ...
  265. brct %r6,.Loop1_sub // without touching condition code:-)
  266. .Lexit_sub:
  267. lghi %r2,0
  268. slbgr %r2,%r2
  269. lcgr %r2,%r2
  270. lg %r6,48(%r15)
  271. br %r14
  272. .size bn_sub_words,.-bn_sub_words
  273. #define c1 %r1
  274. #define c2 %r5
  275. #define c3 %r8
  276. #define mul_add_c(ai,bi,c1,c2,c3) \
  277. lg %r7,ai*8(%r3); \
  278. mlg %r6,bi*8(%r4); \
  279. algr c1,%r7; \
  280. alcgr c2,%r6; \
  281. alcgr c3,zero
  282. // void bn_mul_comba8(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4);
  283. .globl bn_mul_comba8
  284. .type bn_mul_comba8,@function
  285. .align 4
  286. bn_mul_comba8:
  287. stmg %r6,%r8,48(%r15)
  288. lghi c1,0
  289. lghi c2,0
  290. lghi c3,0
  291. lghi zero,0
  292. mul_add_c(0,0,c1,c2,c3);
  293. stg c1,0*8(%r2)
  294. lghi c1,0
  295. mul_add_c(0,1,c2,c3,c1);
  296. mul_add_c(1,0,c2,c3,c1);
  297. stg c2,1*8(%r2)
  298. lghi c2,0
  299. mul_add_c(2,0,c3,c1,c2);
  300. mul_add_c(1,1,c3,c1,c2);
  301. mul_add_c(0,2,c3,c1,c2);
  302. stg c3,2*8(%r2)
  303. lghi c3,0
  304. mul_add_c(0,3,c1,c2,c3);
  305. mul_add_c(1,2,c1,c2,c3);
  306. mul_add_c(2,1,c1,c2,c3);
  307. mul_add_c(3,0,c1,c2,c3);
  308. stg c1,3*8(%r2)
  309. lghi c1,0
  310. mul_add_c(4,0,c2,c3,c1);
  311. mul_add_c(3,1,c2,c3,c1);
  312. mul_add_c(2,2,c2,c3,c1);
  313. mul_add_c(1,3,c2,c3,c1);
  314. mul_add_c(0,4,c2,c3,c1);
  315. stg c2,4*8(%r2)
  316. lghi c2,0
  317. mul_add_c(0,5,c3,c1,c2);
  318. mul_add_c(1,4,c3,c1,c2);
  319. mul_add_c(2,3,c3,c1,c2);
  320. mul_add_c(3,2,c3,c1,c2);
  321. mul_add_c(4,1,c3,c1,c2);
  322. mul_add_c(5,0,c3,c1,c2);
  323. stg c3,5*8(%r2)
  324. lghi c3,0
  325. mul_add_c(6,0,c1,c2,c3);
  326. mul_add_c(5,1,c1,c2,c3);
  327. mul_add_c(4,2,c1,c2,c3);
  328. mul_add_c(3,3,c1,c2,c3);
  329. mul_add_c(2,4,c1,c2,c3);
  330. mul_add_c(1,5,c1,c2,c3);
  331. mul_add_c(0,6,c1,c2,c3);
  332. stg c1,6*8(%r2)
  333. lghi c1,0
  334. mul_add_c(0,7,c2,c3,c1);
  335. mul_add_c(1,6,c2,c3,c1);
  336. mul_add_c(2,5,c2,c3,c1);
  337. mul_add_c(3,4,c2,c3,c1);
  338. mul_add_c(4,3,c2,c3,c1);
  339. mul_add_c(5,2,c2,c3,c1);
  340. mul_add_c(6,1,c2,c3,c1);
  341. mul_add_c(7,0,c2,c3,c1);
  342. stg c2,7*8(%r2)
  343. lghi c2,0
  344. mul_add_c(7,1,c3,c1,c2);
  345. mul_add_c(6,2,c3,c1,c2);
  346. mul_add_c(5,3,c3,c1,c2);
  347. mul_add_c(4,4,c3,c1,c2);
  348. mul_add_c(3,5,c3,c1,c2);
  349. mul_add_c(2,6,c3,c1,c2);
  350. mul_add_c(1,7,c3,c1,c2);
  351. stg c3,8*8(%r2)
  352. lghi c3,0
  353. mul_add_c(2,7,c1,c2,c3);
  354. mul_add_c(3,6,c1,c2,c3);
  355. mul_add_c(4,5,c1,c2,c3);
  356. mul_add_c(5,4,c1,c2,c3);
  357. mul_add_c(6,3,c1,c2,c3);
  358. mul_add_c(7,2,c1,c2,c3);
  359. stg c1,9*8(%r2)
  360. lghi c1,0
  361. mul_add_c(7,3,c2,c3,c1);
  362. mul_add_c(6,4,c2,c3,c1);
  363. mul_add_c(5,5,c2,c3,c1);
  364. mul_add_c(4,6,c2,c3,c1);
  365. mul_add_c(3,7,c2,c3,c1);
  366. stg c2,10*8(%r2)
  367. lghi c2,0
  368. mul_add_c(4,7,c3,c1,c2);
  369. mul_add_c(5,6,c3,c1,c2);
  370. mul_add_c(6,5,c3,c1,c2);
  371. mul_add_c(7,4,c3,c1,c2);
  372. stg c3,11*8(%r2)
  373. lghi c3,0
  374. mul_add_c(7,5,c1,c2,c3);
  375. mul_add_c(6,6,c1,c2,c3);
  376. mul_add_c(5,7,c1,c2,c3);
  377. stg c1,12*8(%r2)
  378. lghi c1,0
  379. mul_add_c(6,7,c2,c3,c1);
  380. mul_add_c(7,6,c2,c3,c1);
  381. stg c2,13*8(%r2)
  382. lghi c2,0
  383. mul_add_c(7,7,c3,c1,c2);
  384. stg c3,14*8(%r2)
  385. stg c1,15*8(%r2)
  386. lmg %r6,%r8,48(%r15)
  387. br %r14
  388. .size bn_mul_comba8,.-bn_mul_comba8
  389. // void bn_mul_comba4(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4);
  390. .globl bn_mul_comba4
  391. .type bn_mul_comba4,@function
  392. .align 4
  393. bn_mul_comba4:
  394. stmg %r6,%r8,48(%r15)
  395. lghi c1,0
  396. lghi c2,0
  397. lghi c3,0
  398. lghi zero,0
  399. mul_add_c(0,0,c1,c2,c3);
  400. stg c1,0*8(%r3)
  401. lghi c1,0
  402. mul_add_c(0,1,c2,c3,c1);
  403. mul_add_c(1,0,c2,c3,c1);
  404. stg c2,1*8(%r2)
  405. lghi c2,0
  406. mul_add_c(2,0,c3,c1,c2);
  407. mul_add_c(1,1,c3,c1,c2);
  408. mul_add_c(0,2,c3,c1,c2);
  409. stg c3,2*8(%r2)
  410. lghi c3,0
  411. mul_add_c(0,3,c1,c2,c3);
  412. mul_add_c(1,2,c1,c2,c3);
  413. mul_add_c(2,1,c1,c2,c3);
  414. mul_add_c(3,0,c1,c2,c3);
  415. stg c1,3*8(%r2)
  416. lghi c1,0
  417. mul_add_c(3,1,c2,c3,c1);
  418. mul_add_c(2,2,c2,c3,c1);
  419. mul_add_c(1,3,c2,c3,c1);
  420. stg c2,4*8(%r2)
  421. lghi c2,0
  422. mul_add_c(2,3,c3,c1,c2);
  423. mul_add_c(3,2,c3,c1,c2);
  424. stg c3,5*8(%r2)
  425. lghi c3,0
  426. mul_add_c(3,3,c1,c2,c3);
  427. stg c1,6*8(%r2)
  428. stg c2,7*8(%r2)
  429. stmg %r6,%r8,48(%r15)
  430. br %r14
  431. .size bn_mul_comba4,.-bn_mul_comba4
  432. #define sqr_add_c(ai,c1,c2,c3) \
  433. lg %r7,ai*8(%r3); \
  434. mlgr %r6,%r7; \
  435. algr c1,%r7; \
  436. alcgr c2,%r6; \
  437. alcgr c3,zero
  438. #define sqr_add_c2(ai,aj,c1,c2,c3) \
  439. lg %r7,ai*8(%r3); \
  440. mlg %r6,aj*8(%r3); \
  441. algr c1,%r7; \
  442. alcgr c2,%r6; \
  443. alcgr c3,zero; \
  444. algr c1,%r7; \
  445. alcgr c2,%r6; \
  446. alcgr c3,zero
  447. // void bn_sqr_comba8(BN_ULONG *r2,BN_ULONG *r3);
  448. .globl bn_sqr_comba8
  449. .type bn_sqr_comba8,@function
  450. .align 4
  451. bn_sqr_comba8:
  452. stmg %r6,%r8,48(%r15)
  453. lghi c1,0
  454. lghi c2,0
  455. lghi c3,0
  456. lghi zero,0
  457. sqr_add_c(0,c1,c2,c3);
  458. stg c1,0*8(%r2)
  459. lghi c1,0
  460. sqr_add_c2(1,0,c2,c3,c1);
  461. stg c2,1*8(%r2)
  462. lghi c2,0
  463. sqr_add_c(1,c3,c1,c2);
  464. sqr_add_c2(2,0,c3,c1,c2);
  465. stg c3,2*8(%r2)
  466. lghi c3,0
  467. sqr_add_c2(3,0,c1,c2,c3);
  468. sqr_add_c2(2,1,c1,c2,c3);
  469. stg c1,3*8(%r2)
  470. lghi c1,0
  471. sqr_add_c(2,c2,c3,c1);
  472. sqr_add_c2(3,1,c2,c3,c1);
  473. sqr_add_c2(4,0,c2,c3,c1);
  474. stg c2,4*8(%r2)
  475. lghi c2,0
  476. sqr_add_c2(5,0,c3,c1,c2);
  477. sqr_add_c2(4,1,c3,c1,c2);
  478. sqr_add_c2(3,2,c3,c1,c2);
  479. stg c3,5*8(%r2)
  480. lghi c3,0
  481. sqr_add_c(3,c1,c2,c3);
  482. sqr_add_c2(4,2,c1,c2,c3);
  483. sqr_add_c2(5,1,c1,c2,c3);
  484. sqr_add_c2(6,0,c1,c2,c3);
  485. stg c1,6*8(%r2)
  486. lghi c1,0
  487. sqr_add_c2(7,0,c2,c3,c1);
  488. sqr_add_c2(6,1,c2,c3,c1);
  489. sqr_add_c2(5,2,c2,c3,c1);
  490. sqr_add_c2(4,3,c2,c3,c1);
  491. stg c2,7*8(%r2)
  492. lghi c2,0
  493. sqr_add_c(4,c3,c1,c2);
  494. sqr_add_c2(5,3,c3,c1,c2);
  495. sqr_add_c2(6,2,c3,c1,c2);
  496. sqr_add_c2(7,1,c3,c1,c2);
  497. stg c3,8*8(%r2)
  498. lghi c3,0
  499. sqr_add_c2(7,2,c1,c2,c3);
  500. sqr_add_c2(6,3,c1,c2,c3);
  501. sqr_add_c2(5,4,c1,c2,c3);
  502. stg c1,9*8(%r2)
  503. lghi c1,0
  504. sqr_add_c(5,c2,c3,c1);
  505. sqr_add_c2(6,4,c2,c3,c1);
  506. sqr_add_c2(7,3,c2,c3,c1);
  507. stg c2,10*8(%r2)
  508. lghi c2,0
  509. sqr_add_c2(7,4,c3,c1,c2);
  510. sqr_add_c2(6,5,c3,c1,c2);
  511. stg c3,11*8(%r2)
  512. lghi c3,0
  513. sqr_add_c(6,c1,c2,c3);
  514. sqr_add_c2(7,5,c1,c2,c3);
  515. stg c1,12*8(%r2)
  516. lghi c1,0
  517. sqr_add_c2(7,6,c2,c3,c1);
  518. stg c2,13*8(%r2)
  519. lghi c2,0
  520. sqr_add_c(7,c3,c1,c2);
  521. stg c3,14*8(%r2)
  522. stg c1,15*8(%r2)
  523. lmg %r6,%r8,48(%r15)
  524. br %r14
  525. .size bn_sqr_comba8,.-bn_sqr_comba8
  526. // void bn_sqr_comba4(BN_ULONG *r2,BN_ULONG *r3);
  527. .globl bn_sqr_comba4
  528. .type bn_sqr_comba4,@function
  529. .align 4
  530. bn_sqr_comba4:
  531. stmg %r6,%r8,48(%r15)
  532. lghi c1,0
  533. lghi c2,0
  534. lghi c3,0
  535. lghi zero,0
  536. sqr_add_c(0,c1,c2,c3);
  537. stg c1,0*8(%r2)
  538. lghi c1,0
  539. sqr_add_c2(1,0,c2,c3,c1);
  540. stg c2,1*8(%r2)
  541. lghi c2,0
  542. sqr_add_c(1,c3,c1,c2);
  543. sqr_add_c2(2,0,c3,c1,c2);
  544. stg c3,2*8(%r2)
  545. lghi c3,0
  546. sqr_add_c2(3,0,c1,c2,c3);
  547. sqr_add_c2(2,1,c1,c2,c3);
  548. stg c1,3*8(%r2)
  549. lghi c1,0
  550. sqr_add_c(2,c2,c3,c1);
  551. sqr_add_c2(3,1,c2,c3,c1);
  552. stg c2,4*8(%r2)
  553. lghi c2,0
  554. sqr_add_c2(3,2,c3,c1,c2);
  555. stg c3,5*8(%r2)
  556. lghi c3,0
  557. sqr_add_c(3,c1,c2,c3);
  558. stg c1,6*8(%r2)
  559. stg c2,7*8(%r2)
  560. lmg %r6,%r8,48(%r15)
  561. br %r14
  562. .size bn_sqr_comba4,.-bn_sqr_comba4