1#!/usr/local/bin/perl
2# alpha assember
3
4# upto
5
6sub mul_add_c
7	{
8	local($a,$b,$c0,$c1,$c2)=@_;
9	local($l1,$h1,$t1,$t2);
10
11	&mul($a,$b,($l1)=&NR(1));
12	&muh($a,$b,($h1)=&NR(1));
13	&add($c0,$l1,$c0);
14	&cmpult($c0,$l1,($t1)=&NR(1));	&FR($l1);
15	&add($t1,$h1,$h1);		&FR($t1);
16	&add($c1,$h1,$c1);
17	&cmpult($c1,$h1,($t2)=&NR(1));	&FR($h1);
18	&add($c2,$t2,$c2);		&FR($t2);
19	}
20
21sub bn_mul_comba4
22	{
23	local($name)=@_;
24	local(@a,@b,$r,$c0,$c1,$c2);
25
26	$cnt=1;
27	&init_pool(3);
28
29	$rp=&wparam(0);
30	$ap=&wparam(1);
31	$bp=&wparam(2);
32
33	&function_begin($name,"");
34
35	&comment("");
36
37	&ld(($a[0])=&NR(1),&QWPw(0,$ap));
38	&ld(($b[0])=&NR(1),&QWPw(0,$bp));
39	&ld(($a[1])=&NR(1),&QWPw(1,$ap));
40	&ld(($b[1])=&NR(1),&QWPw(1,$bp));
41	&mul($a[0],$b[0],($r00)=&NR(1));
42	&ld(($a[2])=&NR(1),&QWPw(2,$ap));
43	&ld(($b[2])=&NR(1),&QWPw(2,$bp));
44	&muh($a[0],$b[0],($r01)=&NR(1));
45	&FR($ap); &ld(($a[3])=&NR(1),&QWPw(3,$ap));
46	&FR($bp); &ld(($b[3])=&NR(1),&QWPw(3,$bp));
47	&mul($a[0],$b[1],($r02)=&NR(1));
48
49	($R,$H1,$H2)=&NR(3);
50
51	&st($r00,&QWPw(0,$rp));	&FR($r00);
52
53	&mov("zero",$R);
54	&mul($a[1],$b[0],($r03)=&NR(1));
55
56	&mov("zero",$H1);
57	&mov("zero",$H0);
58	 &add($R,$r01,$R);
59	&muh($a[0],$b[1],($r04)=&NR(1));
60	 &cmpult($R,$r01,($t01)=&NR(1));	&FR($r01);
61	 &add($R,$r02,$R);
62	 &add($H1,$t01,$H1)			&FR($t01);
63	&muh($a[1],$b[0],($r05)=&NR(1));
64	 &cmpult($R,$r02,($t02)=&NR(1));	&FR($r02);
65	 &add($R,$r03,$R);
66	 &add($H2,$t02,$H2)			&FR($t02);
67	&mul($a[0],$b[2],($r06)=&NR(1));
68	 &cmpult($R,$r03,($t03)=&NR(1));	&FR($r03);
69	 &add($H1,$t03,$H1)			&FR($t03);
70	&st($R,&QWPw(1,$rp));
71	&add($H1,$H2,$R);
72
73	&mov("zero",$H1);
74	 &add($R,$r04,$R);
75	&mov("zero",$H2);
76	&mul($a[1],$b[1],($r07)=&NR(1));
77	 &cmpult($R,$r04,($t04)=&NR(1));	&FR($r04);
78	 &add($R,$r05,$R);
79	 &add($H1,$t04,$H1)			&FR($t04);
80	&mul($a[2],$b[0],($r08)=&NR(1));
81	 &cmpult($R,$r05,($t05)=&NR(1));	&FR($r05);
82	 &add($R,$r01,$R);
83	 &add($H2,$t05,$H2)			&FR($t05);
84	&muh($a[0],$b[2],($r09)=&NR(1));
85	 &cmpult($R,$r06,($t06)=&NR(1));	&FR($r06);
86	 &add($R,$r07,$R);
87	 &add($H1,$t06,$H1)			&FR($t06);
88	&muh($a[1],$b[1],($r10)=&NR(1));
89	 &cmpult($R,$r07,($t07)=&NR(1));	&FR($r07);
90	 &add($R,$r08,$R);
91	 &add($H2,$t07,$H2)			&FR($t07);
92	&muh($a[2],$b[0],($r11)=&NR(1));
93	 &cmpult($R,$r08,($t08)=&NR(1));	&FR($r08);
94	 &add($H1,$t08,$H1)			&FR($t08);
95	&st($R,&QWPw(2,$rp));
96	&add($H1,$H2,$R);
97
98	&mov("zero",$H1);
99	 &add($R,$r09,$R);
100	&mov("zero",$H2);
101	&mul($a[0],$b[3],($r12)=&NR(1));
102	 &cmpult($R,$r09,($t09)=&NR(1));	&FR($r09);
103	 &add($R,$r10,$R);
104	 &add($H1,$t09,$H1)			&FR($t09);
105	&mul($a[1],$b[2],($r13)=&NR(1));
106	 &cmpult($R,$r10,($t10)=&NR(1));	&FR($r10);
107	 &add($R,$r11,$R);
108	 &add($H1,$t10,$H1)			&FR($t10);
109	&mul($a[2],$b[1],($r14)=&NR(1));
110	 &cmpult($R,$r11,($t11)=&NR(1));	&FR($r11);
111	 &add($R,$r12,$R);
112	 &add($H1,$t11,$H1)			&FR($t11);
113	&mul($a[3],$b[0],($r15)=&NR(1));
114	 &cmpult($R,$r12,($t12)=&NR(1));	&FR($r12);
115	 &add($R,$r13,$R);
116	 &add($H1,$t12,$H1)			&FR($t12);
117	&muh($a[0],$b[3],($r16)=&NR(1));
118	 &cmpult($R,$r13,($t13)=&NR(1));	&FR($r13);
119	 &add($R,$r14,$R);
120	 &add($H1,$t13,$H1)			&FR($t13);
121	&muh($a[1],$b[2],($r17)=&NR(1));
122	 &cmpult($R,$r14,($t14)=&NR(1));	&FR($r14);
123	 &add($R,$r15,$R);
124	 &add($H1,$t14,$H1)			&FR($t14);
125	&muh($a[2],$b[1],($r18)=&NR(1));
126	 &cmpult($R,$r15,($t15)=&NR(1));	&FR($r15);
127	 &add($H1,$t15,$H1)			&FR($t15);
128	&st($R,&QWPw(3,$rp));
129	&add($H1,$H2,$R);
130
131	&mov("zero",$H1);
132	 &add($R,$r16,$R);
133	&mov("zero",$H2);
134	&muh($a[3],$b[0],($r19)=&NR(1));
135	 &cmpult($R,$r16,($t16)=&NR(1));	&FR($r16);
136	 &add($R,$r17,$R);
137	 &add($H1,$t16,$H1)			&FR($t16);
138	&mul($a[1],$b[3],($r20)=&NR(1));
139	 &cmpult($R,$r17,($t17)=&NR(1));	&FR($r17);
140	 &add($R,$r18,$R);
141	 &add($H1,$t17,$H1)			&FR($t17);
142	&mul($a[2],$b[2],($r21)=&NR(1));
143	 &cmpult($R,$r18,($t18)=&NR(1));	&FR($r18);
144	 &add($R,$r19,$R);
145	 &add($H1,$t18,$H1)			&FR($t18);
146	&mul($a[3],$b[1],($r22)=&NR(1));
147	 &cmpult($R,$r19,($t19)=&NR(1));	&FR($r19);
148	 &add($R,$r20,$R);
149	 &add($H1,$t19,$H1)			&FR($t19);
150	&muh($a[1],$b[3],($r23)=&NR(1));
151	 &cmpult($R,$r20,($t20)=&NR(1));	&FR($r20);
152	 &add($R,$r21,$R);
153	 &add($H1,$t20,$H1)			&FR($t20);
154	&muh($a[2],$b[2],($r24)=&NR(1));
155	 &cmpult($R,$r21,($t21)=&NR(1));	&FR($r21);
156	 &add($R,$r22,$R);
157	 &add($H1,$t21,$H1)			&FR($t21);
158	&muh($a[3],$b[1],($r25)=&NR(1));
159	 &cmpult($R,$r22,($t22)=&NR(1));	&FR($r22);
160	 &add($H1,$t22,$H1)			&FR($t22);
161	&st($R,&QWPw(4,$rp));
162	&add($H1,$H2,$R);
163
164	&mov("zero",$H1);
165	 &add($R,$r23,$R);
166	&mov("zero",$H2);
167	&mul($a[2],$b[3],($r26)=&NR(1));
168	 &cmpult($R,$r23,($t23)=&NR(1));	&FR($r23);
169	 &add($R,$r24,$R);
170	 &add($H1,$t23,$H1)			&FR($t23);
171	&mul($a[3],$b[2],($r27)=&NR(1));
172	 &cmpult($R,$r24,($t24)=&NR(1));	&FR($r24);
173	 &add($R,$r25,$R);
174	 &add($H1,$t24,$H1)			&FR($t24);
175	&muh($a[2],$b[3],($r28)=&NR(1));
176	 &cmpult($R,$r25,($t25)=&NR(1));	&FR($r25);
177	 &add($R,$r26,$R);
178	 &add($H1,$t25,$H1)			&FR($t25);
179	&muh($a[3],$b[2],($r29)=&NR(1));
180	 &cmpult($R,$r26,($t26)=&NR(1));	&FR($r26);
181	 &add($R,$r27,$R);
182	 &add($H1,$t26,$H1)			&FR($t26);
183	&mul($a[3],$b[3],($r30)=&NR(1));
184	 &cmpult($R,$r27,($t27)=&NR(1));	&FR($r27);
185	 &add($H1,$t27,$H1)			&FR($t27);
186	&st($R,&QWPw(5,$rp));
187	&add($H1,$H2,$R);
188
189	&mov("zero",$H1);
190	 &add($R,$r28,$R);
191	&mov("zero",$H2);
192	&muh($a[3],$b[3],($r31)=&NR(1));
193	 &cmpult($R,$r28,($t28)=&NR(1));	&FR($r28);
194	 &add($R,$r29,$R);
195	 &add($H1,$t28,$H1)			&FR($t28);
196	############
197	 &cmpult($R,$r29,($t29)=&NR(1));	&FR($r29);
198	 &add($R,$r30,$R);
199	 &add($H1,$t29,$H1)			&FR($t29);
200        ############
201	 &cmpult($R,$r30,($t30)=&NR(1));	&FR($r30);
202	 &add($H1,$t30,$H1)			&FR($t30);
203	&st($R,&QWPw(6,$rp));
204	&add($H1,$H2,$R);
205
206	 &add($R,$r31,$R);			&FR($r31);
207	&st($R,&QWPw(7,$rp));
208
209	&FR($R,$H1,$H2);
210	&function_end($name);
211
212	&fin_pool;
213	}
214
2151;
216