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