1#!/usr/local/bin/perl
2# alpha assember
3
4sub bn_mul_words
5	{
6	local($name)=@_;
7	local($cc,$a,$b,$r,$couny);
8
9	&init_pool(4);
10	($cc)=GR("r0");
11
12	$rp=&wparam(0);
13	$ap=&wparam(1);
14	$count=&wparam(2);
15	$word=&wparam(3);
16
17	&function_begin($name,"");
18
19	&comment("");
20	&sub($count,4,$count);
21	&mov("zero",$cc);
22	&br(&label("finish"));
23	&blt($count,&label("finish"));
24
25	($a0,$r0)=&NR(2);
26	&ld($a0,&QWPw(0,$ap));
27	&ld($r0,&QWPw(0,$rp));
28
29$a=<<'EOF';
30##########################################################
31	&set_label("loop");
32
33	($a1)=&NR(1); &ld($a1,&QWPw(1,$ap));
34	($b1)=&NR(1); &ld($b1,&QWPw(1,$bp));
35	($a2)=&NR(1); &ld($a2,&QWPw(2,$ap));
36	($b2)=&NR(1); &ld($b2,&QWPw(2,$bp));
37	($a3)=&NR(1); &ld($a3,&QWPw(3,$ap));
38	($b3)=&NR(1); &ld($b3,&QWPw(3,$bp));
39
40	($o0,$t0)=&NR(2);
41	&add($a0,$b0,$o0);
42	&cmpult($o0,$b0,$t0);
43	&add($o0,$cc,$o0);
44	&cmpult($o0,$cc,$cc);
45	&add($cc,$t0,$cc);	&FR($t0);
46
47	($t1,$o1)=&NR(2);
48
49	&add($a1,$b1,$o1);	&FR($a1);
50	&cmpult($o1,$b1,$t1);	&FR($b1);
51	&add($o1,$cc,$o1);
52	&cmpult($o1,$cc,$cc);
53	&add($cc,$t1,$cc);	&FR($t1);
54
55	($t2,$o2)=&NR(2);
56
57	&add($a2,$b2,$o2);	&FR($a2);
58	&cmpult($o2,$b2,$t2);	&FR($b2);
59	&add($o2,$cc,$o2);
60	&cmpult($o2,$cc,$cc);
61	&add($cc,$t2,$cc);	&FR($t2);
62
63	($t3,$o3)=&NR(2);
64
65	&add($a3,$b3,$o3);	&FR($a3);
66	&cmpult($o3,$b3,$t3);	&FR($b3);
67	&add($o3,$cc,$o3);
68	&cmpult($o3,$cc,$cc);
69	&add($cc,$t3,$cc);	&FR($t3);
70
71	&st($o0,&QWPw(0,$rp)); &FR($o0);
72	&st($o1,&QWPw(0,$rp)); &FR($o1);
73	&st($o2,&QWPw(0,$rp)); &FR($o2);
74	&st($o3,&QWPw(0,$rp)); &FR($o3);
75
76	&sub($count,4,$count);	# count-=4
77	&add($ap,4*$QWS,$ap);	# count+=4
78	&add($bp,4*$QWS,$bp);	# count+=4
79	&add($rp,4*$QWS,$rp);	# count+=4
80
81	&blt($count,&label("finish"));
82	&ld($a0,&QWPw(0,$ap));
83	 &ld($b0,&QWPw(0,$bp));
84	&br(&label("loop"));
85EOF
86##################################################
87	# Do the last 0..3 words
88
89	&set_label("last_loop");
90
91	&ld(($a0)=&NR(1),&QWPw(0,$ap));	# get a
92	&mul($a0,$word,($l0)=&NR(1));
93	 &add($ap,$QWS,$ap);
94	&muh($a0,$word,($h0)=&NR(1));	&FR($a0);
95	&add($l0,$cc,$l0);
96	 &add($rp,$QWS,$rp);
97	 &sub($count,1,$count);
98	&cmpult($l0,$cc,$cc);
99	&st($l0,&QWPw(-1,$rp));		&FR($l0);
100	&add($h0,$cc,$cc);		&FR($h0);
101
102	&bgt($count,&label("last_loop"));
103	&function_end_A($name);
104
105######################################################
106	&set_label("finish");
107	&add($count,4,$count);
108	&bgt($count,&label("last_loop"));
109
110	&set_label("end");
111	&function_end($name);
112
113	&fin_pool;
114	}
115
1161;
117