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