143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom.ident "s390x.S, version 1.1"
2221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// ====================================================================
3221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
4221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// project.
5221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom//
6221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// Rights for redistribution and usage in source and binary forms are
7221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// granted according to the OpenSSL license. Warranty of any kind is
8221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// disclaimed.
9221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// ====================================================================
10221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
11221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.text
12221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
13221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define zero	%r0
14221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
15221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// BN_ULONG bn_mul_add_words(BN_ULONG *r2,BN_ULONG *r3,int r4,BN_ULONG r5);
16221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.globl	bn_mul_add_words
17221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	bn_mul_add_words,@function
18221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	4
19221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrombn_mul_add_words:
20221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	zero,0		// zero = 0
21221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	%r1,0(%r2)	// put rp aside
22221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	%r2,0		// i=0;
23221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ltgfr	%r4,%r4
24221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	bler	%r14		// if (len<=0) return 0;
25221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
26221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stmg	%r6,%r10,48(%r15)
2743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	lghi	%r10,3
28221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	%r8,0		// carry = 0
2943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	nr	%r10,%r4	// len%4
3043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	sra	%r4,2		// cnt=len/4
3143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	jz	.Loop1_madd	// carry is incidentally cleared if branch taken
3243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	algr	zero,zero	// clear carry
33221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
34221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Loop4_madd:
35221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r7,0(%r2,%r3)	// ap[i]
36221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mlgr	%r6,%r5		// *=w
3743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	alcgr	%r7,%r8		// +=carry
38221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alcgr	%r6,zero
39221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alg	%r7,0(%r2,%r1)	// +=rp[i]
40221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r7,0(%r2,%r1)	// rp[i]=
41221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
42221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r9,8(%r2,%r3)
43221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mlgr	%r8,%r5
4443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	alcgr	%r9,%r6
45221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alcgr	%r8,zero
46221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alg	%r9,8(%r2,%r1)
47221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r9,8(%r2,%r1)
48221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
49221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r7,16(%r2,%r3)
50221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mlgr	%r6,%r5
5143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	alcgr	%r7,%r8
52221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alcgr	%r6,zero
53221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alg	%r7,16(%r2,%r1)
54221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r7,16(%r2,%r1)
55221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
56221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r9,24(%r2,%r3)
57221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mlgr	%r8,%r5
5843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	alcgr	%r9,%r6
59221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alcgr	%r8,zero
60221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alg	%r9,24(%r2,%r1)
61221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r9,24(%r2,%r1)
62221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
63221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	%r2,32(%r2)	// i+=4
6443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	brct	%r4,.Loop4_madd
65221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
6643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	la	%r10,1(%r10)		// see if len%4 is zero ...
6743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	brct	%r10,.Loop1_madd	// without touching condition code:-)
6843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
6943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom.Lend_madd:
7043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	alcgr	%r8,zero	// collect carry bit
7143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	lgr	%r2,%r8
7243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	lmg	%r6,%r10,48(%r15)
7343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	br	%r14
74221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
75221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Loop1_madd:
76221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r7,0(%r2,%r3)	// ap[i]
77221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mlgr	%r6,%r5		// *=w
7843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	alcgr	%r7,%r8		// +=carry
79221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alcgr	%r6,zero
80221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alg	%r7,0(%r2,%r1)	// +=rp[i]
81221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r7,0(%r2,%r1)	// rp[i]=
82221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
83221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lgr	%r8,%r6
84221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	%r2,8(%r2)	// i++
8543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	brct	%r10,.Loop1_madd
86221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
8743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	j	.Lend_madd
88221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	bn_mul_add_words,.-bn_mul_add_words
89221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
90221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// BN_ULONG bn_mul_words(BN_ULONG *r2,BN_ULONG *r3,int r4,BN_ULONG r5);
91221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.globl	bn_mul_words
92221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	bn_mul_words,@function
93221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	4
94221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrombn_mul_words:
95221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	zero,0		// zero = 0
96221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	%r1,0(%r2)	// put rp aside
97221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	%r2,0		// i=0;
98221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ltgfr	%r4,%r4
99221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	bler	%r14		// if (len<=0) return 0;
100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stmg	%r6,%r10,48(%r15)
10243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	lghi	%r10,3
103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	%r8,0		// carry = 0
10443c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	nr	%r10,%r4	// len%4
10543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	sra	%r4,2		// cnt=len/4
10643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	jz	.Loop1_mul	// carry is incidentally cleared if branch taken
10743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	algr	zero,zero	// clear carry
108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Loop4_mul:
110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r7,0(%r2,%r3)	// ap[i]
111221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mlgr	%r6,%r5		// *=w
11243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	alcgr	%r7,%r8		// +=carry
113221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r7,0(%r2,%r1)	// rp[i]=
114221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
115221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r9,8(%r2,%r3)
116221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mlgr	%r8,%r5
11743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	alcgr	%r9,%r6
118221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r9,8(%r2,%r1)
119221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
120221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r7,16(%r2,%r3)
121221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mlgr	%r6,%r5
12243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	alcgr	%r7,%r8
123221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r7,16(%r2,%r1)
124221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
125221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r9,24(%r2,%r3)
126221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mlgr	%r8,%r5
12743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	alcgr	%r9,%r6
128221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r9,24(%r2,%r1)
129221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
130221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	%r2,32(%r2)	// i+=4
13143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	brct	%r4,.Loop4_mul
132221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
13343c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	la	%r10,1(%r10)		// see if len%4 is zero ...
134976a034585c7e8ff9dda5ebe032f399b78887f70Brian Carlstrom	brct	%r10,.Loop1_mul		// without touching condition code:-)
13543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom
13643c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom.Lend_mul:
13743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	alcgr	%r8,zero	// collect carry bit
13843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	lgr	%r2,%r8
13943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	lmg	%r6,%r10,48(%r15)
14043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	br	%r14
141221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
142221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Loop1_mul:
143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r7,0(%r2,%r3)	// ap[i]
144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mlgr	%r6,%r5		// *=w
14543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	alcgr	%r7,%r8		// +=carry
146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r7,0(%r2,%r1)	// rp[i]=
147221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
148221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lgr	%r8,%r6
149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	%r2,8(%r2)	// i++
15043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	brct	%r10,.Loop1_mul
151221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
15243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	j	.Lend_mul
153221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	bn_mul_words,.-bn_mul_words
154221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
155221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// void bn_sqr_words(BN_ULONG *r2,BN_ULONG *r2,int r4)
156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.globl	bn_sqr_words
157221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	bn_sqr_words,@function
158221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	4
159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrombn_sqr_words:
160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ltgfr	%r4,%r4
161221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	bler	%r14
162221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stmg	%r6,%r7,48(%r15)
164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	srag	%r1,%r4,2	// cnt=len/4
165221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jz	.Loop1_sqr
166221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
167221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Loop4_sqr:
168221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r7,0(%r3)
169221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mlgr	%r6,%r7
170221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r7,0(%r2)
171221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r6,8(%r2)
172221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
173221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r7,8(%r3)
174221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mlgr	%r6,%r7
175221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r7,16(%r2)
176221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r6,24(%r2)
177221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
178221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r7,16(%r3)
179221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mlgr	%r6,%r7
180221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r7,32(%r2)
181221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r6,40(%r2)
182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r7,24(%r3)
184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mlgr	%r6,%r7
185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r7,48(%r2)
186221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r6,56(%r2)
187221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
188221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	%r3,32(%r3)
189221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	%r2,64(%r2)
190221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	brct	%r1,.Loop4_sqr
191221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	%r1,3
193221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nr	%r4,%r1		// cnt=len%4
194221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jz	.Lend_sqr
195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Loop1_sqr:
197221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r7,0(%r3)
198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mlgr	%r6,%r7
199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r7,0(%r2)
200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r6,8(%r2)
201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	%r3,8(%r3)
203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	%r2,16(%r2)
204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	brct	%r4,.Loop1_sqr
205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lend_sqr:
207221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lmg	%r6,%r7,48(%r15)
208221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	br	%r14
209221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	bn_sqr_words,.-bn_sqr_words
210221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
211221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// BN_ULONG bn_div_words(BN_ULONG h,BN_ULONG l,BN_ULONG d);
212221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.globl	bn_div_words
213221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	bn_div_words,@function
214221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	4
215221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrombn_div_words:
216221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	dlgr	%r2,%r4
217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lgr	%r2,%r3
218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	br	%r14
219221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	bn_div_words,.-bn_div_words
220221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
221221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// BN_ULONG bn_add_words(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4,int r5);
222221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.globl	bn_add_words
223221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	bn_add_words,@function
224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	4
225221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrombn_add_words:
226221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	%r1,0(%r2)	// put rp aside
227221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	%r2,0		// i=0
228221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ltgfr	%r5,%r5
229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	bler	%r14		// if (len<=0) return 0;
230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
231221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r6,48(%r15)
232221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	%r6,3
233221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nr	%r6,%r5		// len%4
234221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sra	%r5,2		// len/4, use sra because it sets condition code
235221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jz	.Loop1_add	// carry is incidentally cleared if branch taken
236221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	algr	%r2,%r2		// clear carry
237221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
238221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Loop4_add:
239221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r0,0(%r2,%r3)
240221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alcg	%r0,0(%r2,%r4)
241221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r0,0(%r2,%r1)
242221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r0,8(%r2,%r3)
243221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alcg	%r0,8(%r2,%r4)
244221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r0,8(%r2,%r1)
245221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r0,16(%r2,%r3)
246221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alcg	%r0,16(%r2,%r4)
247221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r0,16(%r2,%r1)
248221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r0,24(%r2,%r3)
249221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alcg	%r0,24(%r2,%r4)
250221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r0,24(%r2,%r1)
251221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
252221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	%r2,32(%r2)	// i+=4
253221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	brct	%r5,.Loop4_add
254221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
255221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	%r6,1(%r6)	// see if len%4 is zero ...
256221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	brct	%r6,.Loop1_add	// without touching condition code:-)
257221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
258221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lexit_add:
259221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	%r2,0
260221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alcgr	%r2,%r2
261221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r6,48(%r15)
262221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	br	%r14
263221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
264221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Loop1_add:
265221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r0,0(%r2,%r3)
266221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alcg	%r0,0(%r2,%r4)
267221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r0,0(%r2,%r1)
268221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
269221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	%r2,8(%r2)	// i++
270221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	brct	%r6,.Loop1_add
271221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
272221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	j	.Lexit_add
273221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	bn_add_words,.-bn_add_words
274221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
275221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// BN_ULONG bn_sub_words(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4,int r5);
276221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.globl	bn_sub_words
277221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	bn_sub_words,@function
278221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	4
279221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrombn_sub_words:
280221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	%r1,0(%r2)	// put rp aside
281221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	%r2,0		// i=0
282221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ltgfr	%r5,%r5
283221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	bler	%r14		// if (len<=0) return 0;
284221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
285221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r6,48(%r15)
286221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	%r6,3
287221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	nr	%r6,%r5		// len%4
288221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sra	%r5,2		// len/4, use sra because it sets condition code
289221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	jnz	.Loop4_sub	// borrow is incidentally cleared if branch taken
290221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	slgr	%r2,%r2		// clear borrow
291221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
292221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Loop1_sub:
293221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r0,0(%r2,%r3)
294221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	slbg	%r0,0(%r2,%r4)
295221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r0,0(%r2,%r1)
296221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
297221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	%r2,8(%r2)	// i++
298221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	brct	%r6,.Loop1_sub
299221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	j	.Lexit_sub
300221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
301221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Loop4_sub:
302221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r0,0(%r2,%r3)
303221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	slbg	%r0,0(%r2,%r4)
304221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r0,0(%r2,%r1)
305221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r0,8(%r2,%r3)
306221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	slbg	%r0,8(%r2,%r4)
307221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r0,8(%r2,%r1)
308221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r0,16(%r2,%r3)
309221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	slbg	%r0,16(%r2,%r4)
310221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r0,16(%r2,%r1)
311221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r0,24(%r2,%r3)
312221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	slbg	%r0,24(%r2,%r4)
313221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	%r0,24(%r2,%r1)
314221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
315221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	%r2,32(%r2)	// i+=4
316221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	brct	%r5,.Loop4_sub
317221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
318221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	la	%r6,1(%r6)	// see if len%4 is zero ...
319221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	brct	%r6,.Loop1_sub	// without touching condition code:-)
320221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
321221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.Lexit_sub:
322221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	%r2,0
323221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	slbgr	%r2,%r2
324221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lcgr	%r2,%r2
325221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r6,48(%r15)
326221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	br	%r14
327221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	bn_sub_words,.-bn_sub_words
328221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
329221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define c1	%r1
330221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define c2	%r5
331221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define c3	%r8
332221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
333221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define mul_add_c(ai,bi,c1,c2,c3)	\
334221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r7,ai*8(%r3);		\
335221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mlg	%r6,bi*8(%r4);		\
336221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	algr	c1,%r7;			\
337221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alcgr	c2,%r6;			\
338221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alcgr	c3,zero
339221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
340221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// void bn_mul_comba8(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4);
341221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.globl	bn_mul_comba8
342221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	bn_mul_comba8,@function
343221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	4
344221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrombn_mul_comba8:
345221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stmg	%r6,%r8,48(%r15)
346221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
347221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c1,0
348221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c2,0
349221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c3,0
350221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	zero,0
351221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
352221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(0,0,c1,c2,c3);
353221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c1,0*8(%r2)
354221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c1,0
355221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
356221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(0,1,c2,c3,c1);
357221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(1,0,c2,c3,c1);
358221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c2,1*8(%r2)
359221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c2,0
360221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
361221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(2,0,c3,c1,c2);
362221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(1,1,c3,c1,c2);
363221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(0,2,c3,c1,c2);
364221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c3,2*8(%r2)
365221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c3,0
366221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
367221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(0,3,c1,c2,c3);
368221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(1,2,c1,c2,c3);
369221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(2,1,c1,c2,c3);
370221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(3,0,c1,c2,c3);
371221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c1,3*8(%r2)
372221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c1,0
373221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
374221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(4,0,c2,c3,c1);
375221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(3,1,c2,c3,c1);
376221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(2,2,c2,c3,c1);
377221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(1,3,c2,c3,c1);
378221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(0,4,c2,c3,c1);
379221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c2,4*8(%r2)
380221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c2,0
381221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
382221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(0,5,c3,c1,c2);
383221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(1,4,c3,c1,c2);
384221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(2,3,c3,c1,c2);
385221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(3,2,c3,c1,c2);
386221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(4,1,c3,c1,c2);
387221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(5,0,c3,c1,c2);
388221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c3,5*8(%r2)
389221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c3,0
390221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
391221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(6,0,c1,c2,c3);
392221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(5,1,c1,c2,c3);
393221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(4,2,c1,c2,c3);
394221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(3,3,c1,c2,c3);
395221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(2,4,c1,c2,c3);
396221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(1,5,c1,c2,c3);
397221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(0,6,c1,c2,c3);
398221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c1,6*8(%r2)
399221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c1,0
400221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
401221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(0,7,c2,c3,c1);
402221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(1,6,c2,c3,c1);
403221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(2,5,c2,c3,c1);
404221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(3,4,c2,c3,c1);
405221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(4,3,c2,c3,c1);
406221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(5,2,c2,c3,c1);
407221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(6,1,c2,c3,c1);
408221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(7,0,c2,c3,c1);
409221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c2,7*8(%r2)
410221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c2,0
411221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
412221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(7,1,c3,c1,c2);
413221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(6,2,c3,c1,c2);
414221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(5,3,c3,c1,c2);
415221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(4,4,c3,c1,c2);
416221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(3,5,c3,c1,c2);
417221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(2,6,c3,c1,c2);
418221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(1,7,c3,c1,c2);
419221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c3,8*8(%r2)
420221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c3,0
421221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
422221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(2,7,c1,c2,c3);
423221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(3,6,c1,c2,c3);
424221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(4,5,c1,c2,c3);
425221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(5,4,c1,c2,c3);
426221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(6,3,c1,c2,c3);
427221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(7,2,c1,c2,c3);
428221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c1,9*8(%r2)
429221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c1,0
430221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
431221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(7,3,c2,c3,c1);
432221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(6,4,c2,c3,c1);
433221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(5,5,c2,c3,c1);
434221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(4,6,c2,c3,c1);
435221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(3,7,c2,c3,c1);
436221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c2,10*8(%r2)
437221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c2,0
438221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
439221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(4,7,c3,c1,c2);
440221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(5,6,c3,c1,c2);
441221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(6,5,c3,c1,c2);
442221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(7,4,c3,c1,c2);
443221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c3,11*8(%r2)
444221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c3,0
445221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
446221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(7,5,c1,c2,c3);
447221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(6,6,c1,c2,c3);
448221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(5,7,c1,c2,c3);
449221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c1,12*8(%r2)
450221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c1,0
451221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
452221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
453221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(6,7,c2,c3,c1);
454221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(7,6,c2,c3,c1);
455221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c2,13*8(%r2)
456221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c2,0
457221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
458221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(7,7,c3,c1,c2);
459221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c3,14*8(%r2)
460221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c1,15*8(%r2)
461221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
462221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lmg	%r6,%r8,48(%r15)
463221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	br	%r14
464221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	bn_mul_comba8,.-bn_mul_comba8
465221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
466221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// void bn_mul_comba4(BN_ULONG *r2,BN_ULONG *r3,BN_ULONG *r4);
467221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.globl	bn_mul_comba4
468221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	bn_mul_comba4,@function
469221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	4
470221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrombn_mul_comba4:
471221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stmg	%r6,%r8,48(%r15)
472221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
473221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c1,0
474221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c2,0
475221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c3,0
476221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	zero,0
477221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
478221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(0,0,c1,c2,c3);
479221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c1,0*8(%r3)
480221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c1,0
481221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
482221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(0,1,c2,c3,c1);
483221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(1,0,c2,c3,c1);
484221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c2,1*8(%r2)
485221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c2,0
486221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
487221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(2,0,c3,c1,c2);
488221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(1,1,c3,c1,c2);
489221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(0,2,c3,c1,c2);
490221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c3,2*8(%r2)
491221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c3,0
492221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
493221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(0,3,c1,c2,c3);
494221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(1,2,c1,c2,c3);
495221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(2,1,c1,c2,c3);
496221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(3,0,c1,c2,c3);
497221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c1,3*8(%r2)
498221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c1,0
499221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
500221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(3,1,c2,c3,c1);
501221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(2,2,c2,c3,c1);
502221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(1,3,c2,c3,c1);
503221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c2,4*8(%r2)
504221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c2,0
505221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
506221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(2,3,c3,c1,c2);
507221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(3,2,c3,c1,c2);
508221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c3,5*8(%r2)
509221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c3,0
510221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
511221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mul_add_c(3,3,c1,c2,c3);
512221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c1,6*8(%r2)
513221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c2,7*8(%r2)
514221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
515221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stmg	%r6,%r8,48(%r15)
516221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	br	%r14
517221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	bn_mul_comba4,.-bn_mul_comba4
518221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
519221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define sqr_add_c(ai,c1,c2,c3)		\
520221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r7,ai*8(%r3);		\
521221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mlgr	%r6,%r7;		\
522221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	algr	c1,%r7;			\
523221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alcgr	c2,%r6;			\
524221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alcgr	c3,zero
525221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
526221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#define sqr_add_c2(ai,aj,c1,c2,c3)	\
527221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lg	%r7,ai*8(%r3);		\
528221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	mlg	%r6,aj*8(%r3);		\
529221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	algr	c1,%r7;			\
530221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alcgr	c2,%r6;			\
531221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alcgr	c3,zero;		\
532221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	algr	c1,%r7;			\
533221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alcgr	c2,%r6;			\
534221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	alcgr	c3,zero
535221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
536221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// void bn_sqr_comba8(BN_ULONG *r2,BN_ULONG *r3);
537221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.globl	bn_sqr_comba8
538221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	bn_sqr_comba8,@function
539221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	4
540221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrombn_sqr_comba8:
541221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stmg	%r6,%r8,48(%r15)
542221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
543221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c1,0
544221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c2,0
545221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c3,0
546221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	zero,0
547221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
548221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c(0,c1,c2,c3);
549221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c1,0*8(%r2)
550221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c1,0
551221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
552221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(1,0,c2,c3,c1);
553221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c2,1*8(%r2)
554221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c2,0
555221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
556221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c(1,c3,c1,c2);
557221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(2,0,c3,c1,c2);
558221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c3,2*8(%r2)
559221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c3,0
560221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
561221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(3,0,c1,c2,c3);
562221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(2,1,c1,c2,c3);
563221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c1,3*8(%r2)
564221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c1,0
565221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
566221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c(2,c2,c3,c1);
567221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(3,1,c2,c3,c1);
568221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(4,0,c2,c3,c1);
569221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c2,4*8(%r2)
570221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c2,0
571221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
572221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(5,0,c3,c1,c2);
573221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(4,1,c3,c1,c2);
574221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(3,2,c3,c1,c2);
575221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c3,5*8(%r2)
576221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c3,0
577221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
578221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c(3,c1,c2,c3);
579221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(4,2,c1,c2,c3);
580221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(5,1,c1,c2,c3);
581221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(6,0,c1,c2,c3);
582221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c1,6*8(%r2)
583221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c1,0
584221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
585221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(7,0,c2,c3,c1);
586221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(6,1,c2,c3,c1);
587221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(5,2,c2,c3,c1);
588221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(4,3,c2,c3,c1);
589221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c2,7*8(%r2)
590221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c2,0
591221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
592221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c(4,c3,c1,c2);
593221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(5,3,c3,c1,c2);
594221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(6,2,c3,c1,c2);
595221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(7,1,c3,c1,c2);
596221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c3,8*8(%r2)
597221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c3,0
598221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
599221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(7,2,c1,c2,c3);
600221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(6,3,c1,c2,c3);
601221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(5,4,c1,c2,c3);
602221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c1,9*8(%r2)
603221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c1,0
604221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
605221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c(5,c2,c3,c1);
606221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(6,4,c2,c3,c1);
607221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(7,3,c2,c3,c1);
608221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c2,10*8(%r2)
609221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c2,0
610221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
611221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(7,4,c3,c1,c2);
612221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(6,5,c3,c1,c2);
613221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c3,11*8(%r2)
614221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c3,0
615221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
616221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c(6,c1,c2,c3);
617221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(7,5,c1,c2,c3);
618221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c1,12*8(%r2)
619221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c1,0
620221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
621221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(7,6,c2,c3,c1);
622221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c2,13*8(%r2)
623221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c2,0
624221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
625221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c(7,c3,c1,c2);
626221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c3,14*8(%r2)
627221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c1,15*8(%r2)
628221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
629221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lmg	%r6,%r8,48(%r15)
630221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	br	%r14
631221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	bn_sqr_comba8,.-bn_sqr_comba8
632221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
633221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom// void bn_sqr_comba4(BN_ULONG *r2,BN_ULONG *r3);
634221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.globl bn_sqr_comba4
635221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.type	bn_sqr_comba4,@function
636221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.align	4
637221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrombn_sqr_comba4:
638221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stmg	%r6,%r8,48(%r15)
639221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
640221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c1,0
641221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c2,0
642221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c3,0
643221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	zero,0
644221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
645221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c(0,c1,c2,c3);
646221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c1,0*8(%r2)
647221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c1,0
648221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
649221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(1,0,c2,c3,c1);
650221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c2,1*8(%r2)
651221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c2,0
652221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
653221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c(1,c3,c1,c2);
654221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(2,0,c3,c1,c2);
655221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c3,2*8(%r2)
656221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c3,0
657221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
658221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(3,0,c1,c2,c3);
659221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(2,1,c1,c2,c3);
660221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c1,3*8(%r2)
661221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c1,0
662221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
663221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c(2,c2,c3,c1);
664221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(3,1,c2,c3,c1);
665221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c2,4*8(%r2)
666221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c2,0
667221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
668221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c2(3,2,c3,c1,c2);
669221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c3,5*8(%r2)
670221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lghi	c3,0
671221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
672221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	sqr_add_c(3,c1,c2,c3);
673221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c1,6*8(%r2)
674221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	stg	c2,7*8(%r2)
675221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
676221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	lmg	%r6,%r8,48(%r15)
677221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	br	%r14
678221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom.size	bn_sqr_comba4,.-bn_sqr_comba4
679