📄 comba.pl
字号:
#!/usr/local/bin/perl$num=8;$num2=8/2;print <<"EOF";/* crypto/bn/bn_comba.c */#include <stdio.h>#include "bn_lcl.h"/* Auto generated from crypto/bn/comba.pl */#undef bn_mul_comba8#undef bn_mul_comba4#undef bn_sqr_comba8#undef bn_sqr_comba4#ifdef BN_LLONG#define mul_add_c(a,b,c0,c1,c2) \\ t=(BN_ULLONG)a*b; \\ t1=(BN_ULONG)Lw(t); \\ t2=(BN_ULONG)Hw(t); \\ c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \\ c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;#define mul_add_c2(a,b,c0,c1,c2) \\ t=(BN_ULLONG)a*b; \\ tt=(t+t)&BN_MASK; \\ if (tt < t) c2++; \\ t1=(BN_ULONG)Lw(tt); \\ t2=(BN_ULONG)Hw(tt); \\ c0=(c0+t1)&BN_MASK2; \\ if ((c0 < t1) && (((++t2)&BN_MASK2) == 0)) c2++; \\ c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;#define sqr_add_c(a,i,c0,c1,c2) \\ t=(BN_ULLONG)a[i]*a[i]; \\ t1=(BN_ULONG)Lw(t); \\ t2=(BN_ULONG)Hw(t); \\ c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \\ c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;#define sqr_add_c2(a,i,j,c0,c1,c2) \\ mul_add_c2((a)[i],(a)[j],c0,c1,c2)#else#define mul_add_c(a,b,c0,c1,c2) \\ t1=LBITS(a); t2=HBITS(a); \\ bl=LBITS(b); bh=HBITS(b); \\ mul64(t1,t2,bl,bh); \\ c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \\ c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;#define mul_add_c2(a,b,c0,c1,c2) \\ t1=LBITS(a); t2=HBITS(a); \\ bl=LBITS(b); bh=HBITS(b); \\ mul64(t1,t2,bl,bh); \\ if (t2 & BN_TBIT) c2++; \\ t2=(t2+t2)&BN_MASK2; \\ if (t1 & BN_TBIT) t2++; \\ t1=(t1+t1)&BN_MASK2; \\ c0=(c0+t1)&BN_MASK2; \\ if ((c0 < t1) && (((++t2)&BN_MASK2) == 0)) c2++; \\ c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;#define sqr_add_c(a,i,c0,c1,c2) \\ sqr64(t1,t2,(a)[i]); \\ c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \\ c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++;#define sqr_add_c2(a,i,j,c0,c1,c2) \\ mul_add_c2((a)[i],(a)[j],c0,c1,c2)#endifvoid bn_mul_comba${num}(r,a,b)BN_ULONG *r,*a,*b; {#ifdef BN_LLONG BN_ULLONG t;#else BN_ULONG bl,bh;#endif BN_ULONG t1,t2; BN_ULONG c1,c2,c3;EOF$ret=&combas_mul("r","a","b",$num,"c1","c2","c3");printf <<"EOF"; }void bn_mul_comba${num2}(r,a,b)BN_ULONG *r,*a,*b; {#ifdef BN_LLONG BN_ULLONG t;#else BN_ULONG bl,bh;#endif BN_ULONG t1,t2; BN_ULONG c1,c2,c3;EOF$ret=&combas_mul("r","a","b",$num2,"c1","c2","c3");printf <<"EOF"; }void bn_sqr_comba${num}(r,a)BN_ULONG *r,*a; {#ifdef BN_LLONG BN_ULLONG t,tt;#else BN_ULONG bl,bh;#endif BN_ULONG t1,t2; BN_ULONG c1,c2,c3;EOF$ret=&combas_sqr("r","a",$num,"c1","c2","c3");printf <<"EOF"; }void bn_sqr_comba${num2}(r,a)BN_ULONG *r,*a; {#ifdef BN_LLONG BN_ULLONG t,tt;#else BN_ULONG bl,bh;#endif BN_ULONG t1,t2; BN_ULONG c1,c2,c3;EOF$ret=&combas_sqr("r","a",$num2,"c1","c2","c3");printf <<"EOF"; }EOFsub bn_str { local($var,$val)=@_; print "\t$var=$val;\n"; }sub bn_ary { local($var,$idx)=@_; return("${var}[$idx]"); }sub bn_clr { local($var)=@_; print "\t$var=0;\n"; }sub bn_mad { local($a,$b,$c0,$c1,$c2,$num)=@_; if ($num == 2) { printf("\tmul_add_c2($a,$b,$c0,$c1,$c2);\n"); } else { printf("\tmul_add_c($a,$b,$c0,$c1,$c2);\n"); } }sub bn_sad { local($a,$i,$j,$c0,$c1,$c2,$num)=@_; if ($num == 2) { printf("\tsqr_add_c2($a,$i,$j,$c0,$c1,$c2);\n"); } else { printf("\tsqr_add_c($a,$i,$c0,$c1,$c2);\n"); } }sub combas_mul { local($r,$a,$b,$num,$c0,$c1,$c2)=@_; local($i,$as,$ae,$bs,$be,$ai,$bi); local($tot,$end); $as=0; $ae=0; $bs=0; $be=0; $tot=$num+$num-1; &bn_clr($c0); &bn_clr($c1); for ($i=0; $i<$tot; $i++) { $ai=$as; $bi=$bs; $end=$be+1; @numa=@numb=();#print "($as $ae) ($bs $be) $bs -> $end [$i $num]\n"; for ($j=$bs; $j<$end; $j++) { push(@numa,$ai); push(@numb,$bi); $ai--; $bi++; } if ($i & 1) { @numa=reverse(@numa); @numb=reverse(@numb); } &bn_clr($c2); for ($j=0; $j<=$#numa; $j++) { &bn_mad(&bn_ary($a,$numa[$j]), &bn_ary($b,$numb[$j]),$c0,$c1,$c2,1); } &bn_str(&bn_ary($r,$i),$c0); ($c0,$c1,$c2)=($c1,$c2,$c0); $as++ if ($i < ($num-1)); $ae++ if ($i >= ($num-1)); $bs++ if ($i >= ($num-1)); $be++ if ($i < ($num-1)); } &bn_str(&bn_ary($r,$i),$c0); }sub combas_sqr { local($r,$a,$num,$c0,$c1,$c2)=@_; local($i,$as,$ae,$bs,$be,$ai,$bi); local($b,$tot,$end,$half); $b=$a; $as=0; $ae=0; $bs=0; $be=0; $tot=$num+$num-1; &bn_clr($c0); &bn_clr($c1); for ($i=0; $i<$tot; $i++) { $ai=$as; $bi=$bs; $end=$be+1; @numa=@numb=();#print "($as $ae) ($bs $be) $bs -> $end [$i $num]\n"; for ($j=$bs; $j<$end; $j++) { push(@numa,$ai); push(@numb,$bi); $ai--; $bi++; last if ($ai < $bi); } if (!($i & 1)) { @numa=reverse(@numa); @numb=reverse(@numb); } &bn_clr($c2); for ($j=0; $j <= $#numa; $j++) { if ($numa[$j] == $numb[$j]) {&bn_sad($a,$numa[$j],$numb[$j],$c0,$c1,$c2,1);} else {&bn_sad($a,$numa[$j],$numb[$j],$c0,$c1,$c2,2);} } &bn_str(&bn_ary($r,$i),$c0); ($c0,$c1,$c2)=($c1,$c2,$c0); $as++ if ($i < ($num-1)); $ae++ if ($i >= ($num-1)); $bs++ if ($i >= ($num-1)); $be++ if ($i < ($num-1)); } &bn_str(&bn_ary($r,$i),$c0); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -