1e1051a39Sopenharmony_ci.ident "s390x.S, version 1.1"
2e1051a39Sopenharmony_ci// ====================================================================
3e1051a39Sopenharmony_ci// Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved.
4e1051a39Sopenharmony_ci//
5e1051a39Sopenharmony_ci// Licensed under the Apache License 2.0 (the "License").  You may not use
6e1051a39Sopenharmony_ci// this file except in compliance with the License.  You can obtain a copy
7e1051a39Sopenharmony_ci// in the file LICENSE in the source distribution or at
8e1051a39Sopenharmony_ci// https://www.openssl.org/source/license.html
9e1051a39Sopenharmony_ci// ====================================================================
10e1051a39Sopenharmony_ci
11e1051a39Sopenharmony_ci.text
12e1051a39Sopenharmony_ci
13e1051a39Sopenharmony_ci#define zero	%r0
14e1051a39Sopenharmony_ci
15e1051a39Sopenharmony_ci// BN_ULONG bn_mul_add_words(BN_ULONG *r2,BN_ULONG *r3,int r4,BN_ULONG r5);
16e1051a39Sopenharmony_ci.globl	bn_mul_add_words
17e1051a39Sopenharmony_ci.type	bn_mul_add_words,@function
18e1051a39Sopenharmony_ci.align	4
19e1051a39Sopenharmony_cibn_mul_add_words:
20e1051a39Sopenharmony_ci	lghi	zero,0		// zero = 0
21e1051a39Sopenharmony_ci	la	%r1,0(%r2)	// put rp aside [to give way to]
22e1051a39Sopenharmony_ci	lghi	%r2,0		// return value
23e1051a39Sopenharmony_ci	ltgfr	%r4,%r4
24e1051a39Sopenharmony_ci	bler	%r14		// if (len<=0) return 0;
25e1051a39Sopenharmony_ci
26e1051a39Sopenharmony_ci	stmg	%r6,%r13,48(%r15)
27e1051a39Sopenharmony_ci	lghi	%r2,3
28e1051a39Sopenharmony_ci	lghi	%r12,0		// carry = 0
29e1051a39Sopenharmony_ci	slgr	%r1,%r3		// rp-=ap
30e1051a39Sopenharmony_ci	nr	%r2,%r4		// len%4
31e1051a39Sopenharmony_ci	sra	%r4,2		// cnt=len/4
32e1051a39Sopenharmony_ci	jz	.Loop1_madd	// carry is incidentally cleared if branch taken
33e1051a39Sopenharmony_ci	algr	zero,zero	// clear carry
34e1051a39Sopenharmony_ci
35e1051a39Sopenharmony_ci	lg	%r7,0(%r3)	// ap[0]
36e1051a39Sopenharmony_ci	lg	%r9,8(%r3)	// ap[1]
37e1051a39Sopenharmony_ci	mlgr	%r6,%r5		// *=w
38e1051a39Sopenharmony_ci	brct	%r4,.Loop4_madd
39e1051a39Sopenharmony_ci	j	.Loop4_madd_tail
40e1051a39Sopenharmony_ci
41e1051a39Sopenharmony_ci.Loop4_madd:
42e1051a39Sopenharmony_ci	mlgr	%r8,%r5
43e1051a39Sopenharmony_ci	lg	%r11,16(%r3)	// ap[i+2]
44e1051a39Sopenharmony_ci	alcgr	%r7,%r12	// +=carry
45e1051a39Sopenharmony_ci	alcgr	%r6,zero
46e1051a39Sopenharmony_ci	alg	%r7,0(%r3,%r1)	// +=rp[i]
47e1051a39Sopenharmony_ci	stg	%r7,0(%r3,%r1)	// rp[i]=
48e1051a39Sopenharmony_ci
49e1051a39Sopenharmony_ci	mlgr	%r10,%r5
50e1051a39Sopenharmony_ci	lg	%r13,24(%r3)
51e1051a39Sopenharmony_ci	alcgr	%r9,%r6
52e1051a39Sopenharmony_ci	alcgr	%r8,zero
53e1051a39Sopenharmony_ci	alg	%r9,8(%r3,%r1)
54e1051a39Sopenharmony_ci	stg	%r9,8(%r3,%r1)
55e1051a39Sopenharmony_ci
56e1051a39Sopenharmony_ci	mlgr	%r12,%r5
57e1051a39Sopenharmony_ci	lg	%r7,32(%r3)
58e1051a39Sopenharmony_ci	alcgr	%r11,%r8
59e1051a39Sopenharmony_ci	alcgr	%r10,zero
60e1051a39Sopenharmony_ci	alg	%r11,16(%r3,%r1)
61e1051a39Sopenharmony_ci	stg	%r11,16(%r3,%r1)
62e1051a39Sopenharmony_ci
63e1051a39Sopenharmony_ci	mlgr	%r6,%r5
64e1051a39Sopenharmony_ci	lg	%r9,40(%r3)
65e1051a39Sopenharmony_ci	alcgr	%r13,%r10
66e1051a39Sopenharmony_ci	alcgr	%r12,zero
67e1051a39Sopenharmony_ci	alg	%r13,24(%r3,%r1)
68e1051a39Sopenharmony_ci	stg	%r13,24(%r3,%r1)
69e1051a39Sopenharmony_ci
70e1051a39Sopenharmony_ci	la	%r3,32(%r3)	// i+=4
71e1051a39Sopenharmony_ci	brct	%r4,.Loop4_madd
72e1051a39Sopenharmony_ci
73e1051a39Sopenharmony_ci.Loop4_madd_tail:
74e1051a39Sopenharmony_ci	mlgr	%r8,%r5
75e1051a39Sopenharmony_ci	lg	%r11,16(%r3)
76e1051a39Sopenharmony_ci	alcgr	%r7,%r12	// +=carry
77e1051a39Sopenharmony_ci	alcgr	%r6,zero
78e1051a39Sopenharmony_ci	alg	%r7,0(%r3,%r1)	// +=rp[i]
79e1051a39Sopenharmony_ci	stg	%r7,0(%r3,%r1)	// rp[i]=
80e1051a39Sopenharmony_ci
81e1051a39Sopenharmony_ci	mlgr	%r10,%r5
82e1051a39Sopenharmony_ci	lg	%r13,24(%r3)
83e1051a39Sopenharmony_ci	alcgr	%r9,%r6
84e1051a39Sopenharmony_ci	alcgr	%r8,zero
85e1051a39Sopenharmony_ci	alg	%r9,8(%r3,%r1)
86e1051a39Sopenharmony_ci	stg	%r9,8(%r3,%r1)
87e1051a39Sopenharmony_ci
88e1051a39Sopenharmony_ci	mlgr	%r12,%r5
89e1051a39Sopenharmony_ci	alcgr	%r11,%r8
90e1051a39Sopenharmony_ci	alcgr	%r10,zero
91e1051a39Sopenharmony_ci	alg	%r11,16(%r3,%r1)
92e1051a39Sopenharmony_ci	stg	%r11,16(%r3,%r1)
93e1051a39Sopenharmony_ci
94e1051a39Sopenharmony_ci	alcgr	%r13,%r10
95e1051a39Sopenharmony_ci	alcgr	%r12,zero
96e1051a39Sopenharmony_ci	alg	%r13,24(%r3,%r1)
97e1051a39Sopenharmony_ci	stg	%r13,24(%r3,%r1)
98e1051a39Sopenharmony_ci
99e1051a39Sopenharmony_ci	la	%r3,32(%r3)	// i+=4
100e1051a39Sopenharmony_ci
101e1051a39Sopenharmony_ci	la	%r2,1(%r2)	// see if len%4 is zero ...
102e1051a39Sopenharmony_ci	brct	%r2,.Loop1_madd	// without touching condition code:-)
103e1051a39Sopenharmony_ci
104e1051a39Sopenharmony_ci.Lend_madd:
105e1051a39Sopenharmony_ci	lgr	%r2,zero	// return value
106e1051a39Sopenharmony_ci	alcgr	%r2,%r12	// collect even carry bit
107e1051a39Sopenharmony_ci	lmg	%r6,%r13,48(%r15)
108e1051a39Sopenharmony_ci	br	%r14
109e1051a39Sopenharmony_ci
110e1051a39Sopenharmony_ci.Loop1_madd:
111e1051a39Sopenharmony_ci	lg	%r7,0(%r3)	// ap[i]
112e1051a39Sopenharmony_ci	mlgr	%r6,%r5		// *=w
113e1051a39Sopenharmony_ci	alcgr	%r7,%r12	// +=carry
114e1051a39Sopenharmony_ci	alcgr	%r6,zero
115e1051a39Sopenharmony_ci	alg	%r7,0(%r3,%r1)	// +=rp[i]
116e1051a39Sopenharmony_ci	stg	%r7,0(%r3,%r1)	// rp[i]=
117e1051a39Sopenharmony_ci
118e1051a39Sopenharmony_ci	lgr	%r12,%r6
119e1051a39Sopenharmony_ci	la	%r3,8(%r3)	// i++
120e1051a39Sopenharmony_ci	brct	%r2,.Loop1_madd
121e1051a39Sopenharmony_ci
122e1051a39Sopenharmony_ci	j	.Lend_madd
123e1051a39Sopenharmony_ci.size	bn_mul_add_words,.-bn_mul_add_words
124e1051a39Sopenharmony_ci
125e1051a39Sopenharmony_ci// BN_ULONG bn_mul_words(BN_ULONG *r2,BN_ULONG *r3,int r4,BN_ULONG r5);
126e1051a39Sopenharmony_ci.globl	bn_mul_words
127e1051a39Sopenharmony_ci.type	bn_mul_words,@function
128e1051a39Sopenharmony_ci.align	4
129e1051a39Sopenharmony_cibn_mul_words:
130e1051a39Sopenharmony_ci	lghi	zero,0		// zero = 0
131e1051a39Sopenharmony_ci	la	%r1,0(%r2)	// put rp aside
132e1051a39Sopenharmony_ci	lghi	%r2,0		// i=0;
133e1051a39Sopenharmony_ci	ltgfr	%r4,%r4
134e1051a39Sopenharmony_ci	bler	%r14		// if (len<=0) return 0;
135e1051a39Sopenharmony_ci
136e1051a39Sopenharmony_ci	stmg	%r6,%r10,48(%r15)
137e1051a39Sopenharmony_ci	lghi	%r10,3
138e1051a39Sopenharmony_ci	lghi	%r8,0		// carry = 0
139e1051a39Sopenharmony_ci	nr	%r10,%r4	// len%4
140e1051a39Sopenharmony_ci	sra	%r4,2		// cnt=len/4
141e1051a39Sopenharmony_ci	jz	.Loop1_mul	// carry is incidentally cleared if branch taken
142e1051a39Sopenharmony_ci	algr	zero,zero	// clear carry
143e1051a39Sopenharmony_ci
144e1051a39Sopenharmony_ci.Loop4_mul:
145e1051a39Sopenharmony_ci	lg	%r7,0(%r2,%r3)	// ap[i]
146e1051a39Sopenharmony_ci	mlgr	%r6,%r5		// *=w
147e1051a39Sopenharmony_ci	alcgr	%r7,%r8		// +=carry
148e1051a39Sopenharmony_ci	stg	%r7,0(%r2,%r1)	// rp[i]=
149e1051a39Sopenharmony_ci
150e1051a39Sopenharmony_ci	lg	%r9,8(%r2,%r3)
151e1051a39Sopenharmony_ci	mlgr	%r8,%r5
152e1051a39Sopenharmony_ci	alcgr	%r9,%r6
153e1051a39Sopenharmony_ci	stg	%r9,8(%r2,%r1)
154e1051a39Sopenharmony_ci
155e1051a39Sopenharmony_ci	lg	%r7,16(%r2,%r3)
156e1051a39Sopenharmony_ci	mlgr	%r6,%r5
157e1051a39Sopenharmony_ci	alcgr	%r7,%r8
158e1051a39Sopenharmony_ci	stg	%r7,16(%r2,%r1)
159e1051a39Sopenharmony_ci
160e1051a39Sopenharmony_ci	lg	%r9,24(%r2,%r3)
161e1051a39Sopenharmony_ci	mlgr	%r8,%r5
162e1051a39Sopenharmony_ci	alcgr	%r9,%r6
163e1051a39Sopenharmony_ci	stg	%r9,24(%r2,%r1)
164e1051a39Sopenharmony_ci
165e1051a39Sopenharmony_ci	la	%r2,32(%r2)	// i+=4
166e1051a39Sopenharmony_ci	brct	%r4,.Loop4_mul
167e1051a39Sopenharmony_ci
168e1051a39Sopenharmony_ci	la	%r10,1(%r10)		// see if len%4 is zero ...
169e1051a39Sopenharmony_ci	brct	%r10,.Loop1_mul		// without touching condition code:-)
170e1051a39Sopenharmony_ci
171e1051a39Sopenharmony_ci.Lend_mul:
172e1051a39Sopenharmony_ci	alcgr	%r8,zero	// collect carry bit
173e1051a39Sopenharmony_ci	lgr	%r2,%r8
174e1051a39Sopenharmony_ci	lmg	%r6,%r10,48(%r15)
175e1051a39Sopenharmony_ci	br	%r14
176e1051a39Sopenharmony_ci
177e1051a39Sopenharmony_ci.Loop1_mul:
178e1051a39Sopenharmony_ci	lg	%r7,0(%r2,%r3)	// ap[i]
179e1051a39Sopenharmony_ci	mlgr	%r6,%r5		// *=w
180e1051a39Sopenharmony_ci	alcgr	%r7,%r8		// +=carry
181e1051a39Sopenharmony_ci	stg	%r7,0(%r2,%r1)	// rp[i]=
182e1051a39Sopenharmony_ci
183e1051a39Sopenharmony_ci	lgr	%r8,%r6
184e1051a39Sopenharmony_ci	la	%r2,8(%r2)	// i++
185e1051a39Sopenharmony_ci	brct	%r10,.Loop1_mul
186e1051a39Sopenharmony_ci
187e1051a39Sopenharmony_ci	j	.Lend_mul
188e1051a39Sopenharmony_ci.size	bn_mul_words,.-bn_mul_words
189e1051a39Sopenharmony_ci
190e1051a39Sopenharmony_ci// void bn_sqr_words(BN_ULONG *r2,BN_ULONG *r2,int r4)
191e1051a39Sopenharmony_ci.globl	bn_sqr_words
192e1051a39Sopenharmony_ci.type	bn_sqr_words,@function
193e1051a39Sopenharmony_ci.align	4
194e1051a39Sopenharmony_cibn_sqr_words:
195e1051a39Sopenharmony_ci	ltgfr	%r4,%r4
196e1051a39Sopenharmony_ci	bler	%r14
197e1051a39Sopenharmony_ci
198e1051a39Sopenharmony_ci	stmg	%r6,%r7,48(%r15)
199e1051a39Sopenharmony_ci	srag	%r1,%r4,2	// cnt=len/4
200e1051a39Sopenharmony_ci	jz	.Loop1_sqr
201e1051a39Sopenharmony_ci
202e1051a39Sopenharmony_ci.Loop4_sqr:
203e1051a39Sopenharmony_ci	lg	%r7,0(%r3)
204e1051a39Sopenharmony_ci	mlgr	%r6,%r7
205e1051a39Sopenharmony_ci	stg	%r7,0(%r2)
206e1051a39Sopenharmony_ci	stg	%r6,8(%r2)
207e1051a39Sopenharmony_ci
208e1051a39Sopenharmony_ci	lg	%r7,8(%r3)
209e1051a39Sopenharmony_ci	mlgr	%r6,%r7
210e1051a39Sopenharmony_ci	stg	%r7,16(%r2)
211e1051a39Sopenharmony_ci	stg	%r6,24(%r2)
212e1051a39Sopenharmony_ci
213e1051a39Sopenharmony_ci	lg	%r7,16(%r3)
214e1051a39Sopenharmony_ci	mlgr	%r6,%r7
215e1051a39Sopenharmony_ci	stg	%r7,32(%r2)
216e1051a39Sopenharmony_ci	stg	%r6,40(%r2)
217e1051a39Sopenharmony_ci
218e1051a39Sopenharmony_ci	lg	%r7,24(%r3)
219e1051a39Sopenharmony_ci	mlgr	%r6,%r7
220e1051a39Sopenharmony_ci	stg	%r7,48(%r2)
221e1051a39Sopenharmony_ci	stg	%r6,56(%r2)
222e1051a39Sopenharmony_ci
223e1051a39Sopenharmony_ci	la	%r3,32(%r3)
224e1051a39Sopenharmony_ci	la	%r2,64(%r2)
225e1051a39Sopenharmony_ci	brct	%r1,.Loop4_sqr
226e1051a39Sopenharmony_ci
227e1051a39Sopenharmony_ci	lghi	%r1,3
228e1051a39Sopenharmony_ci	nr	%r4,%r1		// cnt=len%4
229e1051a39Sopenharmony_ci	jz	.Lend_sqr
230e1051a39Sopenharmony_ci
231e1051a39Sopenharmony_ci.Loop1_sqr:
232e1051a39Sopenharmony_ci	lg	%r7,0(%r3)
233e1051a39Sopenharmony_ci	mlgr	%r6,%r7
234e1051a39Sopenharmony_ci	stg	%r7,0(%r2)
235e1051a39Sopenharmony_ci	stg	%r6,8(%r2)
236e1051a39Sopenharmony_ci
237e1051a39Sopenharmony_ci	la	%r3,8(%r3)
238e1051a39Sopenharmony_ci	la	%r2,16(%r2)
239e1051a39Sopenharmony_ci	brct	%r4,.Loop1_sqr
240e1051a39Sopenharmony_ci
241e1051a39Sopenharmony_ci.Lend_sqr:
242e1051a39Sopenharmony_ci	lmg	%r6,%r7,48(%r15)
243e1051a39Sopenharmony_ci	br	%r14
244e1051a39Sopenharmony_ci.size	bn_sqr_words,.-bn_sqr_words
245e1051a39Sopenharmony_ci
246e1051a39Sopenharmony_ci// BN_ULONG bn_div_words(BN_ULONG h,BN_ULONG l,BN_ULONG d);
247e1051a39Sopenharmony_ci.globl	bn_div_words
248e1051a39Sopenharmony_ci.type	bn_div_words,@function
249e1051a39Sopenharmony_ci.align	4
250e1051a39Sopenharmony_cibn_div_words:
251e1051a39Sopenharmony_ci	dlgr	%r2,%r4
252e1051a39Sopenharmony_ci	lgr	%r2,%r3
253e1051a39Sopenharmony_ci	br	%r14
254e1051a39Sopenharmony_ci.size	bn_div_words,.-bn_div_words
255e1051a39Sopenharmony_ci
256e1051a39Sopenharmony_ci// BN_ULONG bn_add_words(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4,int r5);
257e1051a39Sopenharmony_ci.globl	bn_add_words
258e1051a39Sopenharmony_ci.type	bn_add_words,@function
259e1051a39Sopenharmony_ci.align	4
260e1051a39Sopenharmony_cibn_add_words:
261e1051a39Sopenharmony_ci	la	%r1,0(%r2)	// put rp aside
262e1051a39Sopenharmony_ci	lghi	%r2,0		// i=0
263e1051a39Sopenharmony_ci	ltgfr	%r5,%r5
264e1051a39Sopenharmony_ci	bler	%r14		// if (len<=0) return 0;
265e1051a39Sopenharmony_ci
266e1051a39Sopenharmony_ci	stg	%r6,48(%r15)
267e1051a39Sopenharmony_ci	lghi	%r6,3
268e1051a39Sopenharmony_ci	nr	%r6,%r5		// len%4
269e1051a39Sopenharmony_ci	sra	%r5,2		// len/4, use sra because it sets condition code
270e1051a39Sopenharmony_ci	jz	.Loop1_add	// carry is incidentally cleared if branch taken
271e1051a39Sopenharmony_ci	algr	%r2,%r2		// clear carry
272e1051a39Sopenharmony_ci
273e1051a39Sopenharmony_ci.Loop4_add:
274e1051a39Sopenharmony_ci	lg	%r0,0(%r2,%r3)
275e1051a39Sopenharmony_ci	alcg	%r0,0(%r2,%r4)
276e1051a39Sopenharmony_ci	stg	%r0,0(%r2,%r1)
277e1051a39Sopenharmony_ci	lg	%r0,8(%r2,%r3)
278e1051a39Sopenharmony_ci	alcg	%r0,8(%r2,%r4)
279e1051a39Sopenharmony_ci	stg	%r0,8(%r2,%r1)
280e1051a39Sopenharmony_ci	lg	%r0,16(%r2,%r3)
281e1051a39Sopenharmony_ci	alcg	%r0,16(%r2,%r4)
282e1051a39Sopenharmony_ci	stg	%r0,16(%r2,%r1)
283e1051a39Sopenharmony_ci	lg	%r0,24(%r2,%r3)
284e1051a39Sopenharmony_ci	alcg	%r0,24(%r2,%r4)
285e1051a39Sopenharmony_ci	stg	%r0,24(%r2,%r1)
286e1051a39Sopenharmony_ci
287e1051a39Sopenharmony_ci	la	%r2,32(%r2)	// i+=4
288e1051a39Sopenharmony_ci	brct	%r5,.Loop4_add
289e1051a39Sopenharmony_ci
290e1051a39Sopenharmony_ci	la	%r6,1(%r6)	// see if len%4 is zero ...
291e1051a39Sopenharmony_ci	brct	%r6,.Loop1_add	// without touching condition code:-)
292e1051a39Sopenharmony_ci
293e1051a39Sopenharmony_ci.Lexit_add:
294e1051a39Sopenharmony_ci	lghi	%r2,0
295e1051a39Sopenharmony_ci	alcgr	%r2,%r2
296e1051a39Sopenharmony_ci	lg	%r6,48(%r15)
297e1051a39Sopenharmony_ci	br	%r14
298e1051a39Sopenharmony_ci
299e1051a39Sopenharmony_ci.Loop1_add:
300e1051a39Sopenharmony_ci	lg	%r0,0(%r2,%r3)
301e1051a39Sopenharmony_ci	alcg	%r0,0(%r2,%r4)
302e1051a39Sopenharmony_ci	stg	%r0,0(%r2,%r1)
303e1051a39Sopenharmony_ci
304e1051a39Sopenharmony_ci	la	%r2,8(%r2)	// i++
305e1051a39Sopenharmony_ci	brct	%r6,.Loop1_add
306e1051a39Sopenharmony_ci
307e1051a39Sopenharmony_ci	j	.Lexit_add
308e1051a39Sopenharmony_ci.size	bn_add_words,.-bn_add_words
309e1051a39Sopenharmony_ci
310e1051a39Sopenharmony_ci// BN_ULONG bn_sub_words(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4,int r5);
311e1051a39Sopenharmony_ci.globl	bn_sub_words
312e1051a39Sopenharmony_ci.type	bn_sub_words,@function
313e1051a39Sopenharmony_ci.align	4
314e1051a39Sopenharmony_cibn_sub_words:
315e1051a39Sopenharmony_ci	la	%r1,0(%r2)	// put rp aside
316e1051a39Sopenharmony_ci	lghi	%r2,0		// i=0
317e1051a39Sopenharmony_ci	ltgfr	%r5,%r5
318e1051a39Sopenharmony_ci	bler	%r14		// if (len<=0) return 0;
319e1051a39Sopenharmony_ci
320e1051a39Sopenharmony_ci	stg	%r6,48(%r15)
321e1051a39Sopenharmony_ci	lghi	%r6,3
322e1051a39Sopenharmony_ci	nr	%r6,%r5		// len%4
323e1051a39Sopenharmony_ci	sra	%r5,2		// len/4, use sra because it sets condition code
324e1051a39Sopenharmony_ci	jnz	.Loop4_sub	// borrow is incidentally cleared if branch taken
325e1051a39Sopenharmony_ci	slgr	%r2,%r2		// clear borrow
326e1051a39Sopenharmony_ci
327e1051a39Sopenharmony_ci.Loop1_sub:
328e1051a39Sopenharmony_ci	lg	%r0,0(%r2,%r3)
329e1051a39Sopenharmony_ci	slbg	%r0,0(%r2,%r4)
330e1051a39Sopenharmony_ci	stg	%r0,0(%r2,%r1)
331e1051a39Sopenharmony_ci
332e1051a39Sopenharmony_ci	la	%r2,8(%r2)	// i++
333e1051a39Sopenharmony_ci	brct	%r6,.Loop1_sub
334e1051a39Sopenharmony_ci	j	.Lexit_sub
335e1051a39Sopenharmony_ci
336e1051a39Sopenharmony_ci.Loop4_sub:
337e1051a39Sopenharmony_ci	lg	%r0,0(%r2,%r3)
338e1051a39Sopenharmony_ci	slbg	%r0,0(%r2,%r4)
339e1051a39Sopenharmony_ci	stg	%r0,0(%r2,%r1)
340e1051a39Sopenharmony_ci	lg	%r0,8(%r2,%r3)
341e1051a39Sopenharmony_ci	slbg	%r0,8(%r2,%r4)
342e1051a39Sopenharmony_ci	stg	%r0,8(%r2,%r1)
343e1051a39Sopenharmony_ci	lg	%r0,16(%r2,%r3)
344e1051a39Sopenharmony_ci	slbg	%r0,16(%r2,%r4)
345e1051a39Sopenharmony_ci	stg	%r0,16(%r2,%r1)
346e1051a39Sopenharmony_ci	lg	%r0,24(%r2,%r3)
347e1051a39Sopenharmony_ci	slbg	%r0,24(%r2,%r4)
348e1051a39Sopenharmony_ci	stg	%r0,24(%r2,%r1)
349e1051a39Sopenharmony_ci
350e1051a39Sopenharmony_ci	la	%r2,32(%r2)	// i+=4
351e1051a39Sopenharmony_ci	brct	%r5,.Loop4_sub
352e1051a39Sopenharmony_ci
353e1051a39Sopenharmony_ci	la	%r6,1(%r6)	// see if len%4 is zero ...
354e1051a39Sopenharmony_ci	brct	%r6,.Loop1_sub	// without touching condition code:-)
355e1051a39Sopenharmony_ci
356e1051a39Sopenharmony_ci.Lexit_sub:
357e1051a39Sopenharmony_ci	lghi	%r2,0
358e1051a39Sopenharmony_ci	slbgr	%r2,%r2
359e1051a39Sopenharmony_ci	lcgr	%r2,%r2
360e1051a39Sopenharmony_ci	lg	%r6,48(%r15)
361e1051a39Sopenharmony_ci	br	%r14
362e1051a39Sopenharmony_ci.size	bn_sub_words,.-bn_sub_words
363e1051a39Sopenharmony_ci
364e1051a39Sopenharmony_ci#define c1	%r1
365e1051a39Sopenharmony_ci#define c2	%r5
366e1051a39Sopenharmony_ci#define c3	%r8
367e1051a39Sopenharmony_ci
368e1051a39Sopenharmony_ci#define mul_add_c(ai,bi,c1,c2,c3)	\
369e1051a39Sopenharmony_ci	lg	%r7,ai*8(%r3);		\
370e1051a39Sopenharmony_ci	mlg	%r6,bi*8(%r4);		\
371e1051a39Sopenharmony_ci	algr	c1,%r7;			\
372e1051a39Sopenharmony_ci	alcgr	c2,%r6;			\
373e1051a39Sopenharmony_ci	alcgr	c3,zero
374e1051a39Sopenharmony_ci
375e1051a39Sopenharmony_ci// void bn_mul_comba8(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4);
376e1051a39Sopenharmony_ci.globl	bn_mul_comba8
377e1051a39Sopenharmony_ci.type	bn_mul_comba8,@function
378e1051a39Sopenharmony_ci.align	4
379e1051a39Sopenharmony_cibn_mul_comba8:
380e1051a39Sopenharmony_ci	stmg	%r6,%r8,48(%r15)
381e1051a39Sopenharmony_ci
382e1051a39Sopenharmony_ci	lghi	c1,0
383e1051a39Sopenharmony_ci	lghi	c2,0
384e1051a39Sopenharmony_ci	lghi	c3,0
385e1051a39Sopenharmony_ci	lghi	zero,0
386e1051a39Sopenharmony_ci
387e1051a39Sopenharmony_ci	mul_add_c(0,0,c1,c2,c3);
388e1051a39Sopenharmony_ci	stg	c1,0*8(%r2)
389e1051a39Sopenharmony_ci	lghi	c1,0
390e1051a39Sopenharmony_ci
391e1051a39Sopenharmony_ci	mul_add_c(0,1,c2,c3,c1);
392e1051a39Sopenharmony_ci	mul_add_c(1,0,c2,c3,c1);
393e1051a39Sopenharmony_ci	stg	c2,1*8(%r2)
394e1051a39Sopenharmony_ci	lghi	c2,0
395e1051a39Sopenharmony_ci
396e1051a39Sopenharmony_ci	mul_add_c(2,0,c3,c1,c2);
397e1051a39Sopenharmony_ci	mul_add_c(1,1,c3,c1,c2);
398e1051a39Sopenharmony_ci	mul_add_c(0,2,c3,c1,c2);
399e1051a39Sopenharmony_ci	stg	c3,2*8(%r2)
400e1051a39Sopenharmony_ci	lghi	c3,0
401e1051a39Sopenharmony_ci
402e1051a39Sopenharmony_ci	mul_add_c(0,3,c1,c2,c3);
403e1051a39Sopenharmony_ci	mul_add_c(1,2,c1,c2,c3);
404e1051a39Sopenharmony_ci	mul_add_c(2,1,c1,c2,c3);
405e1051a39Sopenharmony_ci	mul_add_c(3,0,c1,c2,c3);
406e1051a39Sopenharmony_ci	stg	c1,3*8(%r2)
407e1051a39Sopenharmony_ci	lghi	c1,0
408e1051a39Sopenharmony_ci
409e1051a39Sopenharmony_ci	mul_add_c(4,0,c2,c3,c1);
410e1051a39Sopenharmony_ci	mul_add_c(3,1,c2,c3,c1);
411e1051a39Sopenharmony_ci	mul_add_c(2,2,c2,c3,c1);
412e1051a39Sopenharmony_ci	mul_add_c(1,3,c2,c3,c1);
413e1051a39Sopenharmony_ci	mul_add_c(0,4,c2,c3,c1);
414e1051a39Sopenharmony_ci	stg	c2,4*8(%r2)
415e1051a39Sopenharmony_ci	lghi	c2,0
416e1051a39Sopenharmony_ci
417e1051a39Sopenharmony_ci	mul_add_c(0,5,c3,c1,c2);
418e1051a39Sopenharmony_ci	mul_add_c(1,4,c3,c1,c2);
419e1051a39Sopenharmony_ci	mul_add_c(2,3,c3,c1,c2);
420e1051a39Sopenharmony_ci	mul_add_c(3,2,c3,c1,c2);
421e1051a39Sopenharmony_ci	mul_add_c(4,1,c3,c1,c2);
422e1051a39Sopenharmony_ci	mul_add_c(5,0,c3,c1,c2);
423e1051a39Sopenharmony_ci	stg	c3,5*8(%r2)
424e1051a39Sopenharmony_ci	lghi	c3,0
425e1051a39Sopenharmony_ci
426e1051a39Sopenharmony_ci	mul_add_c(6,0,c1,c2,c3);
427e1051a39Sopenharmony_ci	mul_add_c(5,1,c1,c2,c3);
428e1051a39Sopenharmony_ci	mul_add_c(4,2,c1,c2,c3);
429e1051a39Sopenharmony_ci	mul_add_c(3,3,c1,c2,c3);
430e1051a39Sopenharmony_ci	mul_add_c(2,4,c1,c2,c3);
431e1051a39Sopenharmony_ci	mul_add_c(1,5,c1,c2,c3);
432e1051a39Sopenharmony_ci	mul_add_c(0,6,c1,c2,c3);
433e1051a39Sopenharmony_ci	stg	c1,6*8(%r2)
434e1051a39Sopenharmony_ci	lghi	c1,0
435e1051a39Sopenharmony_ci
436e1051a39Sopenharmony_ci	mul_add_c(0,7,c2,c3,c1);
437e1051a39Sopenharmony_ci	mul_add_c(1,6,c2,c3,c1);
438e1051a39Sopenharmony_ci	mul_add_c(2,5,c2,c3,c1);
439e1051a39Sopenharmony_ci	mul_add_c(3,4,c2,c3,c1);
440e1051a39Sopenharmony_ci	mul_add_c(4,3,c2,c3,c1);
441e1051a39Sopenharmony_ci	mul_add_c(5,2,c2,c3,c1);
442e1051a39Sopenharmony_ci	mul_add_c(6,1,c2,c3,c1);
443e1051a39Sopenharmony_ci	mul_add_c(7,0,c2,c3,c1);
444e1051a39Sopenharmony_ci	stg	c2,7*8(%r2)
445e1051a39Sopenharmony_ci	lghi	c2,0
446e1051a39Sopenharmony_ci
447e1051a39Sopenharmony_ci	mul_add_c(7,1,c3,c1,c2);
448e1051a39Sopenharmony_ci	mul_add_c(6,2,c3,c1,c2);
449e1051a39Sopenharmony_ci	mul_add_c(5,3,c3,c1,c2);
450e1051a39Sopenharmony_ci	mul_add_c(4,4,c3,c1,c2);
451e1051a39Sopenharmony_ci	mul_add_c(3,5,c3,c1,c2);
452e1051a39Sopenharmony_ci	mul_add_c(2,6,c3,c1,c2);
453e1051a39Sopenharmony_ci	mul_add_c(1,7,c3,c1,c2);
454e1051a39Sopenharmony_ci	stg	c3,8*8(%r2)
455e1051a39Sopenharmony_ci	lghi	c3,0
456e1051a39Sopenharmony_ci
457e1051a39Sopenharmony_ci	mul_add_c(2,7,c1,c2,c3);
458e1051a39Sopenharmony_ci	mul_add_c(3,6,c1,c2,c3);
459e1051a39Sopenharmony_ci	mul_add_c(4,5,c1,c2,c3);
460e1051a39Sopenharmony_ci	mul_add_c(5,4,c1,c2,c3);
461e1051a39Sopenharmony_ci	mul_add_c(6,3,c1,c2,c3);
462e1051a39Sopenharmony_ci	mul_add_c(7,2,c1,c2,c3);
463e1051a39Sopenharmony_ci	stg	c1,9*8(%r2)
464e1051a39Sopenharmony_ci	lghi	c1,0
465e1051a39Sopenharmony_ci
466e1051a39Sopenharmony_ci	mul_add_c(7,3,c2,c3,c1);
467e1051a39Sopenharmony_ci	mul_add_c(6,4,c2,c3,c1);
468e1051a39Sopenharmony_ci	mul_add_c(5,5,c2,c3,c1);
469e1051a39Sopenharmony_ci	mul_add_c(4,6,c2,c3,c1);
470e1051a39Sopenharmony_ci	mul_add_c(3,7,c2,c3,c1);
471e1051a39Sopenharmony_ci	stg	c2,10*8(%r2)
472e1051a39Sopenharmony_ci	lghi	c2,0
473e1051a39Sopenharmony_ci
474e1051a39Sopenharmony_ci	mul_add_c(4,7,c3,c1,c2);
475e1051a39Sopenharmony_ci	mul_add_c(5,6,c3,c1,c2);
476e1051a39Sopenharmony_ci	mul_add_c(6,5,c3,c1,c2);
477e1051a39Sopenharmony_ci	mul_add_c(7,4,c3,c1,c2);
478e1051a39Sopenharmony_ci	stg	c3,11*8(%r2)
479e1051a39Sopenharmony_ci	lghi	c3,0
480e1051a39Sopenharmony_ci
481e1051a39Sopenharmony_ci	mul_add_c(7,5,c1,c2,c3);
482e1051a39Sopenharmony_ci	mul_add_c(6,6,c1,c2,c3);
483e1051a39Sopenharmony_ci	mul_add_c(5,7,c1,c2,c3);
484e1051a39Sopenharmony_ci	stg	c1,12*8(%r2)
485e1051a39Sopenharmony_ci	lghi	c1,0
486e1051a39Sopenharmony_ci
487e1051a39Sopenharmony_ci
488e1051a39Sopenharmony_ci	mul_add_c(6,7,c2,c3,c1);
489e1051a39Sopenharmony_ci	mul_add_c(7,6,c2,c3,c1);
490e1051a39Sopenharmony_ci	stg	c2,13*8(%r2)
491e1051a39Sopenharmony_ci	lghi	c2,0
492e1051a39Sopenharmony_ci
493e1051a39Sopenharmony_ci	mul_add_c(7,7,c3,c1,c2);
494e1051a39Sopenharmony_ci	stg	c3,14*8(%r2)
495e1051a39Sopenharmony_ci	stg	c1,15*8(%r2)
496e1051a39Sopenharmony_ci
497e1051a39Sopenharmony_ci	lmg	%r6,%r8,48(%r15)
498e1051a39Sopenharmony_ci	br	%r14
499e1051a39Sopenharmony_ci.size	bn_mul_comba8,.-bn_mul_comba8
500e1051a39Sopenharmony_ci
501e1051a39Sopenharmony_ci// void bn_mul_comba4(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4);
502e1051a39Sopenharmony_ci.globl	bn_mul_comba4
503e1051a39Sopenharmony_ci.type	bn_mul_comba4,@function
504e1051a39Sopenharmony_ci.align	4
505e1051a39Sopenharmony_cibn_mul_comba4:
506e1051a39Sopenharmony_ci	stmg	%r6,%r8,48(%r15)
507e1051a39Sopenharmony_ci
508e1051a39Sopenharmony_ci	lghi	c1,0
509e1051a39Sopenharmony_ci	lghi	c2,0
510e1051a39Sopenharmony_ci	lghi	c3,0
511e1051a39Sopenharmony_ci	lghi	zero,0
512e1051a39Sopenharmony_ci
513e1051a39Sopenharmony_ci	mul_add_c(0,0,c1,c2,c3);
514e1051a39Sopenharmony_ci	stg	c1,0*8(%r2)
515e1051a39Sopenharmony_ci	lghi	c1,0
516e1051a39Sopenharmony_ci
517e1051a39Sopenharmony_ci	mul_add_c(0,1,c2,c3,c1);
518e1051a39Sopenharmony_ci	mul_add_c(1,0,c2,c3,c1);
519e1051a39Sopenharmony_ci	stg	c2,1*8(%r2)
520e1051a39Sopenharmony_ci	lghi	c2,0
521e1051a39Sopenharmony_ci
522e1051a39Sopenharmony_ci	mul_add_c(2,0,c3,c1,c2);
523e1051a39Sopenharmony_ci	mul_add_c(1,1,c3,c1,c2);
524e1051a39Sopenharmony_ci	mul_add_c(0,2,c3,c1,c2);
525e1051a39Sopenharmony_ci	stg	c3,2*8(%r2)
526e1051a39Sopenharmony_ci	lghi	c3,0
527e1051a39Sopenharmony_ci
528e1051a39Sopenharmony_ci	mul_add_c(0,3,c1,c2,c3);
529e1051a39Sopenharmony_ci	mul_add_c(1,2,c1,c2,c3);
530e1051a39Sopenharmony_ci	mul_add_c(2,1,c1,c2,c3);
531e1051a39Sopenharmony_ci	mul_add_c(3,0,c1,c2,c3);
532e1051a39Sopenharmony_ci	stg	c1,3*8(%r2)
533e1051a39Sopenharmony_ci	lghi	c1,0
534e1051a39Sopenharmony_ci
535e1051a39Sopenharmony_ci	mul_add_c(3,1,c2,c3,c1);
536e1051a39Sopenharmony_ci	mul_add_c(2,2,c2,c3,c1);
537e1051a39Sopenharmony_ci	mul_add_c(1,3,c2,c3,c1);
538e1051a39Sopenharmony_ci	stg	c2,4*8(%r2)
539e1051a39Sopenharmony_ci	lghi	c2,0
540e1051a39Sopenharmony_ci
541e1051a39Sopenharmony_ci	mul_add_c(2,3,c3,c1,c2);
542e1051a39Sopenharmony_ci	mul_add_c(3,2,c3,c1,c2);
543e1051a39Sopenharmony_ci	stg	c3,5*8(%r2)
544e1051a39Sopenharmony_ci	lghi	c3,0
545e1051a39Sopenharmony_ci
546e1051a39Sopenharmony_ci	mul_add_c(3,3,c1,c2,c3);
547e1051a39Sopenharmony_ci	stg	c1,6*8(%r2)
548e1051a39Sopenharmony_ci	stg	c2,7*8(%r2)
549e1051a39Sopenharmony_ci
550e1051a39Sopenharmony_ci	stmg	%r6,%r8,48(%r15)
551e1051a39Sopenharmony_ci	br	%r14
552e1051a39Sopenharmony_ci.size	bn_mul_comba4,.-bn_mul_comba4
553e1051a39Sopenharmony_ci
554e1051a39Sopenharmony_ci#define sqr_add_c(ai,c1,c2,c3)		\
555e1051a39Sopenharmony_ci	lg	%r7,ai*8(%r3);		\
556e1051a39Sopenharmony_ci	mlgr	%r6,%r7;		\
557e1051a39Sopenharmony_ci	algr	c1,%r7;			\
558e1051a39Sopenharmony_ci	alcgr	c2,%r6;			\
559e1051a39Sopenharmony_ci	alcgr	c3,zero
560e1051a39Sopenharmony_ci
561e1051a39Sopenharmony_ci#define sqr_add_c2(ai,aj,c1,c2,c3)	\
562e1051a39Sopenharmony_ci	lg	%r7,ai*8(%r3);		\
563e1051a39Sopenharmony_ci	mlg	%r6,aj*8(%r3);		\
564e1051a39Sopenharmony_ci	algr	c1,%r7;			\
565e1051a39Sopenharmony_ci	alcgr	c2,%r6;			\
566e1051a39Sopenharmony_ci	alcgr	c3,zero;		\
567e1051a39Sopenharmony_ci	algr	c1,%r7;			\
568e1051a39Sopenharmony_ci	alcgr	c2,%r6;			\
569e1051a39Sopenharmony_ci	alcgr	c3,zero
570e1051a39Sopenharmony_ci
571e1051a39Sopenharmony_ci// void bn_sqr_comba8(BN_ULONG *r2,BN_ULONG *r3);
572e1051a39Sopenharmony_ci.globl	bn_sqr_comba8
573e1051a39Sopenharmony_ci.type	bn_sqr_comba8,@function
574e1051a39Sopenharmony_ci.align	4
575e1051a39Sopenharmony_cibn_sqr_comba8:
576e1051a39Sopenharmony_ci	stmg	%r6,%r8,48(%r15)
577e1051a39Sopenharmony_ci
578e1051a39Sopenharmony_ci	lghi	c1,0
579e1051a39Sopenharmony_ci	lghi	c2,0
580e1051a39Sopenharmony_ci	lghi	c3,0
581e1051a39Sopenharmony_ci	lghi	zero,0
582e1051a39Sopenharmony_ci
583e1051a39Sopenharmony_ci	sqr_add_c(0,c1,c2,c3);
584e1051a39Sopenharmony_ci	stg	c1,0*8(%r2)
585e1051a39Sopenharmony_ci	lghi	c1,0
586e1051a39Sopenharmony_ci
587e1051a39Sopenharmony_ci	sqr_add_c2(1,0,c2,c3,c1);
588e1051a39Sopenharmony_ci	stg	c2,1*8(%r2)
589e1051a39Sopenharmony_ci	lghi	c2,0
590e1051a39Sopenharmony_ci
591e1051a39Sopenharmony_ci	sqr_add_c(1,c3,c1,c2);
592e1051a39Sopenharmony_ci	sqr_add_c2(2,0,c3,c1,c2);
593e1051a39Sopenharmony_ci	stg	c3,2*8(%r2)
594e1051a39Sopenharmony_ci	lghi	c3,0
595e1051a39Sopenharmony_ci
596e1051a39Sopenharmony_ci	sqr_add_c2(3,0,c1,c2,c3);
597e1051a39Sopenharmony_ci	sqr_add_c2(2,1,c1,c2,c3);
598e1051a39Sopenharmony_ci	stg	c1,3*8(%r2)
599e1051a39Sopenharmony_ci	lghi	c1,0
600e1051a39Sopenharmony_ci
601e1051a39Sopenharmony_ci	sqr_add_c(2,c2,c3,c1);
602e1051a39Sopenharmony_ci	sqr_add_c2(3,1,c2,c3,c1);
603e1051a39Sopenharmony_ci	sqr_add_c2(4,0,c2,c3,c1);
604e1051a39Sopenharmony_ci	stg	c2,4*8(%r2)
605e1051a39Sopenharmony_ci	lghi	c2,0
606e1051a39Sopenharmony_ci
607e1051a39Sopenharmony_ci	sqr_add_c2(5,0,c3,c1,c2);
608e1051a39Sopenharmony_ci	sqr_add_c2(4,1,c3,c1,c2);
609e1051a39Sopenharmony_ci	sqr_add_c2(3,2,c3,c1,c2);
610e1051a39Sopenharmony_ci	stg	c3,5*8(%r2)
611e1051a39Sopenharmony_ci	lghi	c3,0
612e1051a39Sopenharmony_ci
613e1051a39Sopenharmony_ci	sqr_add_c(3,c1,c2,c3);
614e1051a39Sopenharmony_ci	sqr_add_c2(4,2,c1,c2,c3);
615e1051a39Sopenharmony_ci	sqr_add_c2(5,1,c1,c2,c3);
616e1051a39Sopenharmony_ci	sqr_add_c2(6,0,c1,c2,c3);
617e1051a39Sopenharmony_ci	stg	c1,6*8(%r2)
618e1051a39Sopenharmony_ci	lghi	c1,0
619e1051a39Sopenharmony_ci
620e1051a39Sopenharmony_ci	sqr_add_c2(7,0,c2,c3,c1);
621e1051a39Sopenharmony_ci	sqr_add_c2(6,1,c2,c3,c1);
622e1051a39Sopenharmony_ci	sqr_add_c2(5,2,c2,c3,c1);
623e1051a39Sopenharmony_ci	sqr_add_c2(4,3,c2,c3,c1);
624e1051a39Sopenharmony_ci	stg	c2,7*8(%r2)
625e1051a39Sopenharmony_ci	lghi	c2,0
626e1051a39Sopenharmony_ci
627e1051a39Sopenharmony_ci	sqr_add_c(4,c3,c1,c2);
628e1051a39Sopenharmony_ci	sqr_add_c2(5,3,c3,c1,c2);
629e1051a39Sopenharmony_ci	sqr_add_c2(6,2,c3,c1,c2);
630e1051a39Sopenharmony_ci	sqr_add_c2(7,1,c3,c1,c2);
631e1051a39Sopenharmony_ci	stg	c3,8*8(%r2)
632e1051a39Sopenharmony_ci	lghi	c3,0
633e1051a39Sopenharmony_ci
634e1051a39Sopenharmony_ci	sqr_add_c2(7,2,c1,c2,c3);
635e1051a39Sopenharmony_ci	sqr_add_c2(6,3,c1,c2,c3);
636e1051a39Sopenharmony_ci	sqr_add_c2(5,4,c1,c2,c3);
637e1051a39Sopenharmony_ci	stg	c1,9*8(%r2)
638e1051a39Sopenharmony_ci	lghi	c1,0
639e1051a39Sopenharmony_ci
640e1051a39Sopenharmony_ci	sqr_add_c(5,c2,c3,c1);
641e1051a39Sopenharmony_ci	sqr_add_c2(6,4,c2,c3,c1);
642e1051a39Sopenharmony_ci	sqr_add_c2(7,3,c2,c3,c1);
643e1051a39Sopenharmony_ci	stg	c2,10*8(%r2)
644e1051a39Sopenharmony_ci	lghi	c2,0
645e1051a39Sopenharmony_ci
646e1051a39Sopenharmony_ci	sqr_add_c2(7,4,c3,c1,c2);
647e1051a39Sopenharmony_ci	sqr_add_c2(6,5,c3,c1,c2);
648e1051a39Sopenharmony_ci	stg	c3,11*8(%r2)
649e1051a39Sopenharmony_ci	lghi	c3,0
650e1051a39Sopenharmony_ci
651e1051a39Sopenharmony_ci	sqr_add_c(6,c1,c2,c3);
652e1051a39Sopenharmony_ci	sqr_add_c2(7,5,c1,c2,c3);
653e1051a39Sopenharmony_ci	stg	c1,12*8(%r2)
654e1051a39Sopenharmony_ci	lghi	c1,0
655e1051a39Sopenharmony_ci
656e1051a39Sopenharmony_ci	sqr_add_c2(7,6,c2,c3,c1);
657e1051a39Sopenharmony_ci	stg	c2,13*8(%r2)
658e1051a39Sopenharmony_ci	lghi	c2,0
659e1051a39Sopenharmony_ci
660e1051a39Sopenharmony_ci	sqr_add_c(7,c3,c1,c2);
661e1051a39Sopenharmony_ci	stg	c3,14*8(%r2)
662e1051a39Sopenharmony_ci	stg	c1,15*8(%r2)
663e1051a39Sopenharmony_ci
664e1051a39Sopenharmony_ci	lmg	%r6,%r8,48(%r15)
665e1051a39Sopenharmony_ci	br	%r14
666e1051a39Sopenharmony_ci.size	bn_sqr_comba8,.-bn_sqr_comba8
667e1051a39Sopenharmony_ci
668e1051a39Sopenharmony_ci// void bn_sqr_comba4(BN_ULONG *r2,BN_ULONG *r3);
669e1051a39Sopenharmony_ci.globl bn_sqr_comba4
670e1051a39Sopenharmony_ci.type	bn_sqr_comba4,@function
671e1051a39Sopenharmony_ci.align	4
672e1051a39Sopenharmony_cibn_sqr_comba4:
673e1051a39Sopenharmony_ci	stmg	%r6,%r8,48(%r15)
674e1051a39Sopenharmony_ci
675e1051a39Sopenharmony_ci	lghi	c1,0
676e1051a39Sopenharmony_ci	lghi	c2,0
677e1051a39Sopenharmony_ci	lghi	c3,0
678e1051a39Sopenharmony_ci	lghi	zero,0
679e1051a39Sopenharmony_ci
680e1051a39Sopenharmony_ci	sqr_add_c(0,c1,c2,c3);
681e1051a39Sopenharmony_ci	stg	c1,0*8(%r2)
682e1051a39Sopenharmony_ci	lghi	c1,0
683e1051a39Sopenharmony_ci
684e1051a39Sopenharmony_ci	sqr_add_c2(1,0,c2,c3,c1);
685e1051a39Sopenharmony_ci	stg	c2,1*8(%r2)
686e1051a39Sopenharmony_ci	lghi	c2,0
687e1051a39Sopenharmony_ci
688e1051a39Sopenharmony_ci	sqr_add_c(1,c3,c1,c2);
689e1051a39Sopenharmony_ci	sqr_add_c2(2,0,c3,c1,c2);
690e1051a39Sopenharmony_ci	stg	c3,2*8(%r2)
691e1051a39Sopenharmony_ci	lghi	c3,0
692e1051a39Sopenharmony_ci
693e1051a39Sopenharmony_ci	sqr_add_c2(3,0,c1,c2,c3);
694e1051a39Sopenharmony_ci	sqr_add_c2(2,1,c1,c2,c3);
695e1051a39Sopenharmony_ci	stg	c1,3*8(%r2)
696e1051a39Sopenharmony_ci	lghi	c1,0
697e1051a39Sopenharmony_ci
698e1051a39Sopenharmony_ci	sqr_add_c(2,c2,c3,c1);
699e1051a39Sopenharmony_ci	sqr_add_c2(3,1,c2,c3,c1);
700e1051a39Sopenharmony_ci	stg	c2,4*8(%r2)
701e1051a39Sopenharmony_ci	lghi	c2,0
702e1051a39Sopenharmony_ci
703e1051a39Sopenharmony_ci	sqr_add_c2(3,2,c3,c1,c2);
704e1051a39Sopenharmony_ci	stg	c3,5*8(%r2)
705e1051a39Sopenharmony_ci	lghi	c3,0
706e1051a39Sopenharmony_ci
707e1051a39Sopenharmony_ci	sqr_add_c(3,c1,c2,c3);
708e1051a39Sopenharmony_ci	stg	c1,6*8(%r2)
709e1051a39Sopenharmony_ci	stg	c2,7*8(%r2)
710e1051a39Sopenharmony_ci
711e1051a39Sopenharmony_ci	lmg	%r6,%r8,48(%r15)
712e1051a39Sopenharmony_ci	br	%r14
713e1051a39Sopenharmony_ci.size	bn_sqr_comba4,.-bn_sqr_comba4
714