1#!/usr/local/bin/perl
2# alpha assember
3
4sub sqr_add_c
5	{
6	local($a,$c0,$c1,$c2)=@_;
7	local($l1,$h1,$t1,$t2);
8
9	&mul($a,$a,($l1)=&NR(1));
10	&muh($a,$a,($h1)=&NR(1));
11	&add($c0,$l1,$c0);
12	&add($c1,$h1,$c1);
13	&cmpult($c0,$l1,($t1)=&NR(1));	&FR($l1);
14	&cmpult($c1,$h1,($t2)=&NR(1));	&FR($h1);
15	&add($c1,$t1,$c1);		&FR($t1);
16	&add($c2,$t2,$c2);		&FR($t2);
17	}
18
19sub sqr_add_c2
20	{
21	local($a,$b,$c0,$c1,$c2)=@_;
22	local($l1,$h1,$t1,$t2);
23
24	&mul($a,$b,($l1)=&NR(1));
25	&muh($a,$b,($h1)=&NR(1));
26	&cmplt($l1,"zero",($lc1)=&NR(1));
27	&cmplt($h1,"zero",($hc1)=&NR(1));
28	&add($l1,$l1,$l1);
29	&add($h1,$h1,$h1);
30	&add($h1,$lc1,$h1);		&FR($lc1);
31	&add($c2,$hc1,$c2);		&FR($hc1);
32
33	&add($c0,$l1,$c0);
34	&add($c1,$h1,$c1);
35	&cmpult($c0,$l1,($lc1)=&NR(1));	&FR($l1);
36	&cmpult($c1,$h1,($hc1)=&NR(1));	&FR($h1);
37
38	&add($c1,$lc1,$c1);		&FR($lc1);
39	&add($c2,$hc1,$c2);		&FR($hc1);
40	}
41
42
43sub bn_sqr_comba4
44	{
45	local($name)=@_;
46	local(@a,@b,$r,$c0,$c1,$c2);
47
48	$cnt=1;
49	&init_pool(2);
50
51	$rp=&wparam(0);
52	$ap=&wparam(1);
53
54	&function_begin($name,"");
55
56	&comment("");
57
58	&ld(($a[0])=&NR(1),&QWPw(0,$ap));
59	&ld(($a[1])=&NR(1),&QWPw(1,$ap));
60	&ld(($a[2])=&NR(1),&QWPw(2,$ap));
61        &ld(($a[3])=&NR(1),&QWPw(3,$ap)); &FR($ap);
62
63	($c0,$c1,$c2)=&NR(3);
64
65	&mov("zero",$c2);
66	&mul($a[0],$a[0],$c0);
67	&muh($a[0],$a[0],$c1);
68	&st($c0,&QWPw(0,$rp));
69	($c0,$c1,$c2)=($c1,$c2,$c0);
70	&mov("zero",$c2);
71
72	&sqr_add_c2($a[0],$a[1],$c0,$c1,$c2);
73	&st($c0,&QWPw(1,$rp));
74	($c0,$c1,$c2)=($c1,$c2,$c0);
75	&mov("zero",$c2);
76
77	&sqr_add_c($a[1],$c0,$c1,$c2);
78	&sqr_add_c2($a[2],$a[0],$c0,$c1,$c2);
79	&st($c0,&QWPw(2,$rp));
80	($c0,$c1,$c2)=($c1,$c2,$c0);
81	&mov("zero",$c2);
82
83	&sqr_add_c2($a[3],$a[0],$c0,$c1,$c2);
84	&sqr_add_c2($a[2],$a[1],$c0,$c1,$c2);
85	&st($c0,&QWPw(3,$rp));
86	($c0,$c1,$c2)=($c1,$c2,$c0);
87	&mov("zero",$c2);
88
89	&sqr_add_c($a[2],$c0,$c1,$c2);
90	&sqr_add_c2($a[3],$a[1],$c0,$c1,$c2);
91	&st($c0,&QWPw(4,$rp));
92	($c0,$c1,$c2)=($c1,$c2,$c0);
93	&mov("zero",$c2);
94
95	&sqr_add_c2($a[3],$a[2],$c0,$c1,$c2);
96	&st($c0,&QWPw(5,$rp));
97	($c0,$c1,$c2)=($c1,$c2,$c0);
98	&mov("zero",$c2);
99
100	&sqr_add_c($a[3],$c0,$c1,$c2);
101	&st($c0,&QWPw(6,$rp));
102	&st($c1,&QWPw(7,$rp));
103
104	&function_end($name);
105
106	&fin_pool;
107	}
108
1091;
110