x86_64-gcc.c revision 656d9c7f52f88b3a3daccafa7655dec086c4756e
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef __SUNPRO_C
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project# include "../bn_asm.c"	/* kind of dirty hack for Sun Studio */
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * x86_64 BIGNUM accelerator version 0.1, December 2002.
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Implemented by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * project.
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Rights for redistribution and usage in source and binary forms are
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * granted according to the OpenSSL license. Warranty of any kind is
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * disclaimed.
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Q. Version 0.1? It doesn't sound like Andy, he used to assign real
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    versions, like 1.0...
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * A. Well, that's because this code is basically a quick-n-dirty
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    proof-of-concept hack. As you can see it's implemented with
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    inline assembler, which means that you're bound to GCC and that
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    there might be enough room for further improvement.
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Q. Why inline assembler?
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * A. x86_64 features own ABI which I'm not familiar with. This is
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    why I decided to let the compiler take care of subroutine
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    prologue/epilogue as well as register allocation. For reference.
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    Win64 implements different ABI for AMD64, different from Linux.
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Q. How much faster does it get?
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * A. 'apps/openssl speed rsa dsa' output with no-asm:
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	                  sign    verify    sign/s verify/s
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	rsa  512 bits   0.0006s   0.0001s   1683.8  18456.2
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	rsa 1024 bits   0.0028s   0.0002s    356.0   6407.0
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	rsa 2048 bits   0.0172s   0.0005s     58.0   1957.8
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	rsa 4096 bits   0.1155s   0.0018s      8.7    555.6
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	                  sign    verify    sign/s verify/s
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	dsa  512 bits   0.0005s   0.0006s   2100.8   1768.3
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	dsa 1024 bits   0.0014s   0.0018s    692.3    559.2
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	dsa 2048 bits   0.0049s   0.0061s    204.7    165.0
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    'apps/openssl speed rsa dsa' output with this module:
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	                  sign    verify    sign/s verify/s
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	rsa  512 bits   0.0004s   0.0000s   2767.1  33297.9
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	rsa 1024 bits   0.0012s   0.0001s    867.4  14674.7
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	rsa 2048 bits   0.0061s   0.0002s    164.0   5270.0
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	rsa 4096 bits   0.0384s   0.0006s     26.1   1650.8
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	                  sign    verify    sign/s verify/s
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	dsa  512 bits   0.0002s   0.0003s   4442.2   3786.3
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	dsa 1024 bits   0.0005s   0.0007s   1835.1   1497.4
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *	dsa 2048 bits   0.0016s   0.0020s    620.4    504.6
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    For the reference. IA-32 assembler implementation performs
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    very much like 64-bit code compiled with no-asm on the same
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    machine.
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define BN_ULONG unsigned long
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "m"(a), "+m"(r)	is the way to favor DirectPath �-code;
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "g"(0)		let the compiler to decide where does it
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *			want to keep the value of zero;
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define mul_add(r,a,word,carry) do {	\
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	register BN_ULONG high,low;	\
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm ("mulq %3"			\
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "=a"(low),"=d"(high)	\
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "a"(word),"m"(a)	\
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc");		\
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm ("addq %2,%0; adcq %3,%1"	\
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "+r"(carry),"+d"(high)\
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "a"(low),"g"(0)	\
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc");		\
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm ("addq %2,%0; adcq %3,%1"	\
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "+m"(r),"+d"(high)	\
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "r"(carry),"g"(0)	\
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc");		\
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	carry=high;			\
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} while (0)
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define mul(r,a,word,carry) do {	\
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	register BN_ULONG high,low;	\
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm ("mulq %3"			\
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "=a"(low),"=d"(high)	\
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "a"(word),"g"(a)	\
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc");		\
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm ("addq %2,%0; adcq %3,%1"	\
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "+r"(carry),"+d"(high)\
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "a"(low),"g"(0)	\
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc");		\
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	(r)=carry, carry=high;		\
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} while (0)
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define sqr(r0,r1,a)			\
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm ("mulq %2"			\
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "=a"(r0),"=d"(r1)	\
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "a"(a)		\
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc");
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBN_ULONG bn_mul_add_words(BN_ULONG *rp, BN_ULONG *ap, int num, BN_ULONG w)
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BN_ULONG c1=0;
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (num <= 0) return(c1);
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while (num&~3)
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mul_add(rp[0],ap[0],w,c1);
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mul_add(rp[1],ap[1],w,c1);
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mul_add(rp[2],ap[2],w,c1);
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mul_add(rp[3],ap[3],w,c1);
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ap+=4; rp+=4; num-=4;
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (num)
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mul_add(rp[0],ap[0],w,c1); if (--num==0) return c1;
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mul_add(rp[1],ap[1],w,c1); if (--num==0) return c1;
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mul_add(rp[2],ap[2],w,c1); return c1;
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(c1);
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBN_ULONG bn_mul_words(BN_ULONG *rp, BN_ULONG *ap, int num, BN_ULONG w)
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BN_ULONG c1=0;
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (num <= 0) return(c1);
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while (num&~3)
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mul(rp[0],ap[0],w,c1);
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mul(rp[1],ap[1],w,c1);
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mul(rp[2],ap[2],w,c1);
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mul(rp[3],ap[3],w,c1);
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ap+=4; rp+=4; num-=4;
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (num)
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mul(rp[0],ap[0],w,c1); if (--num == 0) return c1;
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mul(rp[1],ap[1],w,c1); if (--num == 0) return c1;
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		mul(rp[2],ap[2],w,c1);
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(c1);
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid bn_sqr_words(BN_ULONG *r, BN_ULONG *a, int n)
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        {
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (n <= 0) return;
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	while (n&~3)
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sqr(r[0],r[1],a[0]);
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sqr(r[2],r[3],a[1]);
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sqr(r[4],r[5],a[2]);
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sqr(r[6],r[7],a[3]);
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		a+=4; r+=8; n-=4;
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (n)
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sqr(r[0],r[1],a[0]); if (--n == 0) return;
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sqr(r[2],r[3],a[1]); if (--n == 0) return;
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		sqr(r[4],r[5],a[2]);
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d)
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{	BN_ULONG ret,waste;
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm ("divq	%4"
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "=a"(ret),"=d"(waste)
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "a"(l),"d"(h),"g"(d)
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc");
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBN_ULONG bn_add_words (BN_ULONG *rp, BN_ULONG *ap, BN_ULONG *bp,int n)
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ BN_ULONG ret=0,i=0;
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (n <= 0) return 0;
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm (
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"	subq	%2,%2		\n"
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	".align 16			\n"
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"1:	movq	(%4,%2,8),%0	\n"
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"	adcq	(%5,%2,8),%0	\n"
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"	movq	%0,(%3,%2,8)	\n"
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"	leaq	1(%2),%2	\n"
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"	loop	1b		\n"
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"	sbbq	%0,%0		\n"
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "=&a"(ret),"+c"(n),"=&r"(i)
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "r"(rp),"r"(ap),"r"(bp)
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc"
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	);
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  return ret&1;
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef SIMICS
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBN_ULONG bn_sub_words (BN_ULONG *rp, BN_ULONG *ap, BN_ULONG *bp,int n)
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{ BN_ULONG ret=0,i=0;
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (n <= 0) return 0;
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm (
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"	subq	%2,%2		\n"
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	".align 16			\n"
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"1:	movq	(%4,%2,8),%0	\n"
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"	sbbq	(%5,%2,8),%0	\n"
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"	movq	%0,(%3,%2,8)	\n"
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"	leaq	1(%2),%2	\n"
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"	loop	1b		\n"
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	"	sbbq	%0,%0		\n"
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "=&a"(ret),"+c"(n),"=&r"(i)
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "r"(rp),"r"(ap),"r"(bp)
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc"
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	);
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  return ret&1;
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Simics 1.4<7 has buggy sbbq:-( */
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define BN_MASK2 0xffffffffffffffffL
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBN_ULONG bn_sub_words(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, int n)
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        {
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BN_ULONG t1,t2;
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int c=0;
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (n <= 0) return((BN_ULONG)0);
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (;;)
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		t1=a[0]; t2=b[0];
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		r[0]=(t1-t2-c)&BN_MASK2;
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (t1 != t2) c=(t1 < t2);
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (--n <= 0) break;
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		t1=a[1]; t2=b[1];
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		r[1]=(t1-t2-c)&BN_MASK2;
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (t1 != t2) c=(t1 < t2);
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (--n <= 0) break;
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		t1=a[2]; t2=b[2];
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		r[2]=(t1-t2-c)&BN_MASK2;
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (t1 != t2) c=(t1 < t2);
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (--n <= 0) break;
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		t1=a[3]; t2=b[3];
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		r[3]=(t1-t2-c)&BN_MASK2;
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (t1 != t2) c=(t1 < t2);
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (--n <= 0) break;
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		a+=4;
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		b+=4;
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		r+=4;
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(c);
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* mul_add_c(a,b,c0,c1,c2)  -- c+=a*b for three word number c=(c2,c1,c0) */
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* mul_add_c2(a,b,c0,c1,c2) -- c+=2*a*b for three word number c=(c2,c1,c0) */
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* sqr_add_c(a,i,c0,c1,c2)  -- c+=a[i]^2 for three word number c=(c2,c1,c0) */
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* sqr_add_c2(a,i,c0,c1,c2) -- c+=2*a[i]*a[j] for three word number c=(c2,c1,c0) */
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#if 0
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* original macros are kept for reference purposes */
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define mul_add_c(a,b,c0,c1,c2) {	\
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BN_ULONG ta=(a),tb=(b);		\
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	t1 = ta * tb;			\
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	t2 = BN_UMULT_HIGH(ta,tb);	\
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c0 += t1; t2 += (c0<t1)?1:0;	\
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1 += t2; c2 += (c1<t2)?1:0;	\
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define mul_add_c2(a,b,c0,c1,c2) {	\
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BN_ULONG ta=(a),tb=(b),t0;	\
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	t1 = BN_UMULT_HIGH(ta,tb);	\
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	t0 = ta * tb;			\
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	t2 = t1+t1; c2 += (t2<t1)?1:0;	\
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	t1 = t0+t0; t2 += (t1<t0)?1:0;	\
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c0 += t1; t2 += (c0<t1)?1:0;	\
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1 += t2; c2 += (c1<t2)?1:0;	\
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define mul_add_c(a,b,c0,c1,c2)	do {	\
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm ("mulq %3"			\
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "=a"(t1),"=d"(t2)	\
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "a"(a),"m"(b)		\
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc");		\
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm ("addq %2,%0; adcq %3,%1"	\
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "+r"(c0),"+d"(t2)	\
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "a"(t1),"g"(0)	\
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc");		\
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm ("addq %2,%0; adcq %3,%1"	\
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "+r"(c1),"+r"(c2)	\
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "d"(t2),"g"(0)	\
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc");		\
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} while (0)
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define sqr_add_c(a,i,c0,c1,c2)	do {	\
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm ("mulq %2"			\
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "=a"(t1),"=d"(t2)	\
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "a"(a[i])		\
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc");		\
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm ("addq %2,%0; adcq %3,%1"	\
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "+r"(c0),"+d"(t2)	\
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "a"(t1),"g"(0)	\
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc");		\
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm ("addq %2,%0; adcq %3,%1"	\
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "+r"(c1),"+r"(c2)	\
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "d"(t2),"g"(0)	\
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc");		\
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} while (0)
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define mul_add_c2(a,b,c0,c1,c2) do {	\
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm ("mulq %3"			\
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "=a"(t1),"=d"(t2)	\
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "a"(a),"m"(b)		\
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc");		\
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm ("addq %0,%0; adcq %2,%1"	\
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "+d"(t2),"+r"(c2)	\
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "g"(0)		\
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc");		\
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm ("addq %0,%0; adcq %2,%1"	\
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "+a"(t1),"+d"(t2)	\
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "g"(0)		\
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc");		\
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm ("addq %2,%0; adcq %3,%1"	\
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "+r"(c0),"+d"(t2)	\
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "a"(t1),"g"(0)	\
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc");		\
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	asm ("addq %2,%0; adcq %3,%1"	\
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "+r"(c1),"+r"(c2)	\
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "d"(t2),"g"(0)	\
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: "cc");		\
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	} while (0)
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define sqr_add_c2(a,i,j,c0,c1,c2)	\
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c2((a)[i],(a)[j],c0,c1,c2)
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid bn_mul_comba8(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b)
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BN_ULONG t1,t2;
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BN_ULONG c1,c2,c3;
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1=0;
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2=0;
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c3=0;
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[0],b[0],c1,c2,c3);
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[0]=c1;
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1=0;
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[0],b[1],c2,c3,c1);
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[1],b[0],c2,c3,c1);
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[1]=c2;
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2=0;
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[2],b[0],c3,c1,c2);
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[1],b[1],c3,c1,c2);
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[0],b[2],c3,c1,c2);
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[2]=c3;
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c3=0;
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[0],b[3],c1,c2,c3);
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[1],b[2],c1,c2,c3);
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[2],b[1],c1,c2,c3);
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[3],b[0],c1,c2,c3);
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[3]=c1;
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1=0;
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[4],b[0],c2,c3,c1);
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[3],b[1],c2,c3,c1);
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[2],b[2],c2,c3,c1);
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[1],b[3],c2,c3,c1);
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[0],b[4],c2,c3,c1);
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[4]=c2;
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2=0;
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[0],b[5],c3,c1,c2);
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[1],b[4],c3,c1,c2);
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[2],b[3],c3,c1,c2);
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[3],b[2],c3,c1,c2);
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[4],b[1],c3,c1,c2);
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[5],b[0],c3,c1,c2);
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[5]=c3;
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c3=0;
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[6],b[0],c1,c2,c3);
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[5],b[1],c1,c2,c3);
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[4],b[2],c1,c2,c3);
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[3],b[3],c1,c2,c3);
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[2],b[4],c1,c2,c3);
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[1],b[5],c1,c2,c3);
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[0],b[6],c1,c2,c3);
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[6]=c1;
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1=0;
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[0],b[7],c2,c3,c1);
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[1],b[6],c2,c3,c1);
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[2],b[5],c2,c3,c1);
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[3],b[4],c2,c3,c1);
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[4],b[3],c2,c3,c1);
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[5],b[2],c2,c3,c1);
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[6],b[1],c2,c3,c1);
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[7],b[0],c2,c3,c1);
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[7]=c2;
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2=0;
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[7],b[1],c3,c1,c2);
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[6],b[2],c3,c1,c2);
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[5],b[3],c3,c1,c2);
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[4],b[4],c3,c1,c2);
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[3],b[5],c3,c1,c2);
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[2],b[6],c3,c1,c2);
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[1],b[7],c3,c1,c2);
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[8]=c3;
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c3=0;
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[2],b[7],c1,c2,c3);
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[3],b[6],c1,c2,c3);
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[4],b[5],c1,c2,c3);
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[5],b[4],c1,c2,c3);
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[6],b[3],c1,c2,c3);
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[7],b[2],c1,c2,c3);
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[9]=c1;
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1=0;
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[7],b[3],c2,c3,c1);
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[6],b[4],c2,c3,c1);
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[5],b[5],c2,c3,c1);
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[4],b[6],c2,c3,c1);
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[3],b[7],c2,c3,c1);
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[10]=c2;
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2=0;
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[4],b[7],c3,c1,c2);
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[5],b[6],c3,c1,c2);
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[6],b[5],c3,c1,c2);
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[7],b[4],c3,c1,c2);
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[11]=c3;
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c3=0;
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[7],b[5],c1,c2,c3);
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[6],b[6],c1,c2,c3);
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[5],b[7],c1,c2,c3);
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[12]=c1;
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1=0;
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[6],b[7],c2,c3,c1);
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[7],b[6],c2,c3,c1);
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[13]=c2;
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2=0;
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[7],b[7],c3,c1,c2);
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[14]=c3;
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[15]=c1;
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid bn_mul_comba4(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b)
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BN_ULONG t1,t2;
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BN_ULONG c1,c2,c3;
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1=0;
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2=0;
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c3=0;
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[0],b[0],c1,c2,c3);
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[0]=c1;
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1=0;
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[0],b[1],c2,c3,c1);
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[1],b[0],c2,c3,c1);
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[1]=c2;
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2=0;
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[2],b[0],c3,c1,c2);
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[1],b[1],c3,c1,c2);
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[0],b[2],c3,c1,c2);
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[2]=c3;
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c3=0;
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[0],b[3],c1,c2,c3);
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[1],b[2],c1,c2,c3);
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[2],b[1],c1,c2,c3);
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[3],b[0],c1,c2,c3);
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[3]=c1;
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1=0;
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[3],b[1],c2,c3,c1);
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[2],b[2],c2,c3,c1);
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[1],b[3],c2,c3,c1);
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[4]=c2;
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2=0;
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[2],b[3],c3,c1,c2);
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[3],b[2],c3,c1,c2);
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[5]=c3;
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c3=0;
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mul_add_c(a[3],b[3],c1,c2,c3);
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[6]=c1;
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[7]=c2;
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid bn_sqr_comba8(BN_ULONG *r, BN_ULONG *a)
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BN_ULONG t1,t2;
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BN_ULONG c1,c2,c3;
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1=0;
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2=0;
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c3=0;
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c(a,0,c1,c2,c3);
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[0]=c1;
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1=0;
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,1,0,c2,c3,c1);
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[1]=c2;
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2=0;
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c(a,1,c3,c1,c2);
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,2,0,c3,c1,c2);
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[2]=c3;
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c3=0;
506656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,3,0,c1,c2,c3);
507656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,2,1,c1,c2,c3);
508656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[3]=c1;
509656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1=0;
510656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c(a,2,c2,c3,c1);
511656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,3,1,c2,c3,c1);
512656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,4,0,c2,c3,c1);
513656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[4]=c2;
514656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2=0;
515656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,5,0,c3,c1,c2);
516656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,4,1,c3,c1,c2);
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,3,2,c3,c1,c2);
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[5]=c3;
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c3=0;
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c(a,3,c1,c2,c3);
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,4,2,c1,c2,c3);
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,5,1,c1,c2,c3);
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,6,0,c1,c2,c3);
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[6]=c1;
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1=0;
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,7,0,c2,c3,c1);
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,6,1,c2,c3,c1);
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,5,2,c2,c3,c1);
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,4,3,c2,c3,c1);
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[7]=c2;
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2=0;
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c(a,4,c3,c1,c2);
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,5,3,c3,c1,c2);
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,6,2,c3,c1,c2);
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,7,1,c3,c1,c2);
536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[8]=c3;
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c3=0;
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,7,2,c1,c2,c3);
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,6,3,c1,c2,c3);
540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,5,4,c1,c2,c3);
541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[9]=c1;
542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1=0;
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c(a,5,c2,c3,c1);
544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,6,4,c2,c3,c1);
545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,7,3,c2,c3,c1);
546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[10]=c2;
547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2=0;
548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,7,4,c3,c1,c2);
549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,6,5,c3,c1,c2);
550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[11]=c3;
551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c3=0;
552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c(a,6,c1,c2,c3);
553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,7,5,c1,c2,c3);
554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[12]=c1;
555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1=0;
556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,7,6,c2,c3,c1);
557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[13]=c2;
558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2=0;
559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c(a,7,c3,c1,c2);
560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[14]=c3;
561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[15]=c1;
562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid bn_sqr_comba4(BN_ULONG *r, BN_ULONG *a)
565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BN_ULONG t1,t2;
567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BN_ULONG c1,c2,c3;
568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1=0;
570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2=0;
571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c3=0;
572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c(a,0,c1,c2,c3);
573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[0]=c1;
574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1=0;
575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,1,0,c2,c3,c1);
576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[1]=c2;
577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2=0;
578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c(a,1,c3,c1,c2);
579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,2,0,c3,c1,c2);
580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[2]=c3;
581656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c3=0;
582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,3,0,c1,c2,c3);
583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,2,1,c1,c2,c3);
584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[3]=c1;
585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c1=0;
586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c(a,2,c2,c3,c1);
587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,3,1,c2,c3,c1);
588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[4]=c2;
589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2=0;
590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c2(a,3,2,c3,c1,c2);
591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[5]=c3;
592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c3=0;
593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sqr_add_c(a,3,c1,c2,c3);
594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[6]=c1;
595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[7]=c2;
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
598