1#!/usr/local/bin/perl 2# alpha assember 3 4sub bn_mul_add_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 &ld(($r0)=&NR(1),&QWPw(0,$rp)); # get b 93 &mul($a0,$word,($l0)=&NR(1)); 94 &sub($count,1,$count); 95 &add($ap,$QWS,$ap); 96 &muh($a0,$word,($h0)=&NR(1)); &FR($a0); 97 &add($r0,$l0,$r0); 98 &add($rp,$QWS,$rp); 99 &cmpult($r0,$l0,($t0)=&NR(1)); &FR($l0); 100 &add($r0,$cc,$r0); 101 &add($h0,$t0,$h0); &FR($t0); 102 &cmpult($r0,$cc,$cc); 103 &st($r0,&QWPw(-1,$rp)); &FR($r0); 104 &add($h0,$cc,$cc); &FR($h0); 105 106 &bgt($count,&label("last_loop")); 107 &function_end_A($name); 108 109###################################################### 110 &set_label("finish"); 111 &add($count,4,$count); 112 &bgt($count,&label("last_loop")); 113 114 &set_label("end"); 115 &function_end($name); 116 117 &fin_pool; 118 } 119 1201; 121