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