vis3-mont.S revision 1.3
1.section	".text",#alloc,#execinstr
2.globl	bn_mul_mont_vis3
3.align	32
4bn_mul_mont_vis3:
5	add	%sp,	0,	%g4	! real top of stack
6	sll	%o5,	2,	%o5	! size in bytes
7	add	%o5,	63,	%g5
8	andn	%g5,	63,	%g5	! buffer size rounded up to 64 bytes
9	add	%g5,	%g5,	%g1
10	add	%g5,	%g1,	%g1	! 3*buffer size
11	sub	%g4,	%g1,	%g1
12	andn	%g1,	63,	%g1	! align at 64 byte
13	sub	%g1,	112,	%g1	! new top of stack
14	sub	%g1,	%g4,	%g1
15
16	save	%sp,	%g1,	%sp
17	ld	[%i4+0],	%l0	! pull n0[0..1] value
18	add	%sp, 0+112, %l5
19	ld	[%i4+4],	%l1
20	add	%l5,	%g5,	%l7
21	ld	[%i2+0],	%l2	! m0=bp[0]
22	sllx	%l1,	32,	%g1
23	ld	[%i2+4],	%l3
24	or	%l0,	%g1,	%g1
25	add	%i2,	8,	%i2
26
27	ld	[%i1+0],	%l0	! ap[0]
28	sllx	%l3,	32,	%g2
29	ld	[%i1+4],	%l1
30	or	%l2,	%g2,	%g2
31
32	ld	[%i1+8],	%l2	! ap[1]
33	sllx	%l1,	32,	%o2
34	ld	[%i1+12],	%l3
35	or	%l0,	%o2,	%o2
36	add	%i1,	16,	%i1
37	stx	%o2,	[%l7]		! converted ap[0]
38
39	mulx	%o2,	%g2,	%g4	! ap[0]*bp[0]
40	.word	0x8bb282c2 !umulxhi	%o2,%g2,%g5
41
42	ld	[%i3+0],	%l0	! np[0]
43	sllx	%l3,	32,	%o2
44	ld	[%i3+4],	%l1
45	or	%l2,	%o2,	%o2
46
47	ld	[%i3+8],	%l2	! np[1]
48	sllx	%l1,	32,	%o4
49	ld	[%i3+12],	%l3
50	or	%l0, %o4,	%o4
51	add	%i3,	16,	%i3
52	stx	%o4,	[%l7+8]	! converted np[0]
53
54	mulx	%g4,	%g1,	%g3	! "tp[0]"*n0
55	stx	%o2,	[%l7+16]	! converted ap[1]
56
57	mulx	%o2,	%g2,	%o3	! ap[1]*bp[0]
58	.word	0x95b282c2 !umulxhi	%o2,%g2,%o2	! ahi=aj
59
60	mulx	%o4,	%g3,	%o0	! np[0]*m1
61	.word	0x93b302c3 !umulxhi	%o4,%g3,%o1
62
63	sllx	%l3,	32,	%o4
64	or	%l2,	%o4,	%o4
65	stx	%o4,	[%l7+24]	! converted np[1]
66	add	%l7,	32,	%l7
67
68	addcc	%g4,	%o0,	%o0
69	.word	0x93b00229 !addxc	%g0,%o1,%o1
70
71	mulx	%o4,	%g3,	%o5	! np[1]*m1
72	.word	0x99b302c3 !umulxhi	%o4,%g3,%o4	! nhi=nj
73
74	ba	.L1st
75	sub	%i5,	24,	%l4	! cnt=num-3
76
77.align	16
78.L1st:
79	ld	[%i1+0],	%l0	! ap[j]
80	addcc	%o3,	%g5,	%g4
81	ld	[%i1+4],	%l1
82	.word	0x8bb28220 !addxc	%o2,%g0,%g5
83
84	sllx	%l1,	32,	%o2
85	add	%i1,	8,	%i1
86	or	%l0,	%o2,	%o2
87	stx	%o2,	[%l7]		! converted ap[j]
88
89	ld	[%i3+0],	%l2	! np[j]
90	addcc	%o5,	%o1,	%o0
91	ld	[%i3+4],	%l3
92	.word	0x93b30220 !addxc	%o4,%g0,%o1	! nhi=nj
93
94	sllx	%l3,	32,	%o4
95	add	%i3,	8,	%i3
96	mulx	%o2,	%g2,	%o3	! ap[j]*bp[0]
97	or	%l2,	%o4,	%o4
98	.word	0x95b282c2 !umulxhi	%o2,%g2,%o2	! ahi=aj
99	stx	%o4,	[%l7+8]	! converted np[j]
100	add	%l7,	16,	%l7	! anp++
101
102	mulx	%o4,	%g3,	%o5	! np[j]*m1
103	addcc	%g4,	%o0,	%o0	! np[j]*m1+ap[j]*bp[0]
104	.word	0x99b302c3 !umulxhi	%o4,%g3,%o4	! nhi=nj
105	.word	0x93b00229 !addxc	%g0,%o1,%o1
106	stx	%o0,	[%l5]		! tp[j-1]
107	add	%l5,	8,	%l5	! tp++
108
109	brnz,pt	%l4,	.L1st
110	sub	%l4,	8,	%l4	! j--
111!.L1st
112	addcc	%o3,	%g5,	%g4
113	.word	0x8bb28220 !addxc	%o2,%g0,%g5	! ahi=aj
114
115	addcc	%o5,	%o1,	%o0
116	.word	0x93b30220 !addxc	%o4,%g0,%o1
117	addcc	%g4,	%o0,	%o0	! np[j]*m1+ap[j]*bp[0]
118	.word	0x93b00229 !addxc	%g0,%o1,%o1
119	stx	%o0,	[%l5]		! tp[j-1]
120	add	%l5,	8,	%l5
121
122	addcc	%g5,	%o1,	%o1
123	.word	0xa1b00220 !addxc	%g0,%g0,%l0	! upmost overflow bit
124	stx	%o1,	[%l5]
125	add	%l5,	8,	%l5
126
127	ba	.Louter
128	sub	%i5,	16,	%l1	! i=num-2
129
130.align	16
131.Louter:
132	ld	[%i2+0],	%l2	! m0=bp[i]
133	ld	[%i2+4],	%l3
134
135	sub	%l7,	%i5,	%l7	! rewind
136	sub	%l5,	%i5,	%l5
137	sub	%l7,	%i5,	%l7
138
139	add	%i2,	8,	%i2
140	sllx	%l3,	32,	%g2
141	ldx	[%l7+0],	%o2	! ap[0]
142	or	%l2,	%g2,	%g2
143	ldx	[%l7+8],	%o4	! np[0]
144
145	mulx	%o2,	%g2,	%g4	! ap[0]*bp[i]
146	ldx	[%l5],		%o7	! tp[0]
147	.word	0x8bb282c2 !umulxhi	%o2,%g2,%g5
148	ldx	[%l7+16],	%o2	! ap[1]
149	addcc	%g4,	%o7,	%g4	! ap[0]*bp[i]+tp[0]
150	mulx	%o2,	%g2,	%o3	! ap[1]*bp[i]
151	.word	0x8bb00225 !addxc	%g0,%g5,%g5
152	mulx	%g4,	%g1,	%g3	! tp[0]*n0
153	.word	0x95b282c2 !umulxhi	%o2,%g2,%o2	! ahi=aj
154	mulx	%o4,	%g3,	%o0	! np[0]*m1
155	.word	0x93b302c3 !umulxhi	%o4,%g3,%o1
156	ldx	[%l7+24],	%o4	! np[1]
157	add	%l7,	32,	%l7
158	addcc	%o0,	%g4,	%o0
159	mulx	%o4,	%g3,	%o5	! np[1]*m1
160	.word	0x93b00229 !addxc	%g0,%o1,%o1
161	.word	0x99b302c3 !umulxhi	%o4,%g3,%o4	! nhi=nj
162
163	ba	.Linner
164	sub	%i5,	24,	%l4	! cnt=num-3
165.align	16
166.Linner:
167	addcc	%o3,	%g5,	%g4
168	ldx	[%l5+8],	%o7	! tp[j]
169	.word	0x8bb28220 !addxc	%o2,%g0,%g5	! ahi=aj
170	ldx	[%l7+0],	%o2	! ap[j]
171	addcc	%o5,	%o1,	%o0
172	mulx	%o2,	%g2,	%o3	! ap[j]*bp[i]
173	.word	0x93b30220 !addxc	%o4,%g0,%o1	! nhi=nj
174	ldx	[%l7+8],	%o4	! np[j]
175	add	%l7,	16,	%l7
176	.word	0x95b282c2 !umulxhi	%o2,%g2,%o2	! ahi=aj
177	addcc	%g4,	%o7,	%g4	! ap[j]*bp[i]+tp[j]
178	mulx	%o4,	%g3,	%o5	! np[j]*m1
179	.word	0x8bb00225 !addxc	%g0,%g5,%g5
180	.word	0x99b302c3 !umulxhi	%o4,%g3,%o4	! nhi=nj
181	addcc	%o0,	%g4,	%o0	! np[j]*m1+ap[j]*bp[i]+tp[j]
182	.word	0x93b00229 !addxc	%g0,%o1,%o1
183	stx	%o0,	[%l5]		! tp[j-1]
184	add	%l5,	8,	%l5
185	brnz,pt	%l4,	.Linner
186	sub	%l4,	8,	%l4
187!.Linner
188	ldx	[%l5+8],	%o7	! tp[j]
189	addcc	%o3,	%g5,	%g4
190	.word	0x8bb28220 !addxc	%o2,%g0,%g5	! ahi=aj
191	addcc	%g4,	%o7,	%g4	! ap[j]*bp[i]+tp[j]
192	.word	0x8bb00225 !addxc	%g0,%g5,%g5
193
194	addcc	%o5,	%o1,	%o0
195	.word	0x93b30220 !addxc	%o4,%g0,%o1	! nhi=nj
196	addcc	%o0,	%g4,	%o0	! np[j]*m1+ap[j]*bp[i]+tp[j]
197	.word	0x93b00229 !addxc	%g0,%o1,%o1
198	stx	%o0,	[%l5]		! tp[j-1]
199
200	subcc	%g0,	%l0,	%g0	! move upmost overflow to CCR.xcc
201	.word	0x93b24265 !addxccc	%o1,%g5,%o1
202	.word	0xa1b00220 !addxc	%g0,%g0,%l0
203	stx	%o1,	[%l5+8]
204	add	%l5,	16,	%l5
205
206	brnz,pt	%l1,	.Louter
207	sub	%l1,	8,	%l1
208
209	sub	%l7,	%i5,	%l7	! rewind
210	sub	%l5,	%i5,	%l5
211	sub	%l7,	%i5,	%l7
212	ba	.Lsub
213	subcc	%i5,	8,	%l4	! cnt=num-1 and clear CCR.xcc
214
215.align	16
216.Lsub:
217	ldx	[%l5],		%o7
218	add	%l5,	8,	%l5
219	ldx	[%l7+8],	%o4
220	add	%l7,	16,	%l7
221	subccc	%o7,	%o4,	%l2	! tp[j]-np[j]
222	srlx	%o7,	32,	%o7
223	srlx	%o4,	32,	%o4
224	subccc	%o7,	%o4,	%l3
225	add	%i0,	8,	%i0
226	st	%l2,	[%i0-4]		! reverse order
227	st	%l3,	[%i0-8]
228	brnz,pt	%l4,	.Lsub
229	sub	%l4,	8,	%l4
230
231	sub	%l7,	%i5,	%l7	! rewind
232	sub	%l5,	%i5,	%l5
233	sub	%l7,	%i5,	%l7
234	sub	%i0,	%i5,	%i0
235
236	subc	%l0,	%g0,	%l0	! handle upmost overflow bit
237	and	%l5,	%l0,	%i1
238	andn	%i0,	%l0,	%i3
239	or	%i3,	%i1,	%i1	! ap=borrow?tp:rp
240	ba	.Lcopy
241	sub	%i5,	8,	%l4
242
243.align	16
244.Lcopy:					! copy or in-place refresh
245	ld	[%i1+0],	%l2
246	ld	[%i1+4],	%l3
247	add	%i1,	8,	%i1
248	stx	%g0,	[%l5]		! zap
249	add	%l5,	8,	%l5
250	stx	%g0,	[%l7]		! zap
251	stx	%g0,	[%l7+8]
252	add	%l7,	16,	%l7
253	st	%l3,	[%i0+0]		! flip order
254	st	%l2,	[%i0+4]
255	add	%i0,	8,	%i0
256	brnz	%l4,	.Lcopy
257	sub	%l4,	8,	%l4
258
259	mov	1,	%o0
260	ret
261	restore
262.type	bn_mul_mont_vis3, #function
263.size	bn_mul_mont_vis3, .-bn_mul_mont_vis3
264.asciz  "Montgomery Multiplication for SPARCv9 VIS3, CRYPTOGAMS by <appro@openssl.org>"
265.align	4
266