From da88c2d42ff63f083ea5f9bfe621eb91c84c2272 Mon Sep 17 00:00:00 2001 From: Tom St Denis Date: Wed, 14 Mar 2007 17:58:46 +0000 Subject: [PATCH] added tomsfastmath-0.12 --- changes.txt | 11 + demo/test.c | 91 +- doc/tfm.pdf | Bin 127649 -> 127618 bytes filter.pl | 30 + fp_read_unsigned_bin.c | 28 - gen.pl | 1 + genlist.sh | 9 + makefile | 71 +- makefile.shared | 63 +- mtest/mtest.c | 2 +- parsenames.pl | 26 + pre_gen/mpi.c | 8510 ----------------- fp_add.c => src/addsub/fp_add.c | 0 fp_add_d.c => src/addsub/fp_add_d.c | 0 fp_addmod.c => src/addsub/fp_addmod.c | 0 fp_cmp.c => src/addsub/fp_cmp.c | 0 fp_cmp_d.c => src/addsub/fp_cmp_d.c | 0 fp_cmp_mag.c => src/addsub/fp_cmp_mag.c | 0 fp_sub.c => src/addsub/fp_sub.c | 0 fp_sub_d.c => src/addsub/fp_sub_d.c | 0 fp_submod.c => src/addsub/fp_submod.c | 0 s_fp_add.c => src/addsub/s_fp_add.c | 0 s_fp_sub.c => src/addsub/s_fp_sub.c | 0 fp_radix_size.c => src/bin/fp_radix_size.c | 0 fp_read_radix.c => src/bin/fp_read_radix.c | 0 .../bin/fp_read_signed_bin.c | 0 src/bin/fp_read_unsigned_bin.c | 66 + fp_reverse.c => src/bin/fp_reverse.c | 2 +- fp_s_rmap.c => src/bin/fp_s_rmap.c | 0 .../bin/fp_signed_bin_size.c | 0 .../bin/fp_to_signed_bin.c | 0 .../bin/fp_to_unsigned_bin.c | 2 +- fp_toradix.c => src/bin/fp_toradix.c | 2 +- .../bin/fp_unsigned_bin_size.c | 0 fp_cnt_lsb.c => src/bit/fp_cnt_lsb.c | 0 fp_count_bits.c => src/bit/fp_count_bits.c | 0 fp_div_2.c => src/bit/fp_div_2.c | 0 fp_div_2d.c => src/bit/fp_div_2d.c | 0 fp_lshd.c => src/bit/fp_lshd.c | 0 fp_mod_2d.c => src/bit/fp_mod_2d.c | 0 fp_rshd.c => src/bit/fp_rshd.c | 0 fp_div.c => src/divide/fp_div.c | 0 fp_div_d.c => src/divide/fp_div_d.c | 7 +- fp_mod.c => src/divide/fp_mod.c | 0 fp_mod_d.c => src/divide/fp_mod_d.c | 0 fp_2expt.c => src/exptmod/fp_2expt.c | 0 fp_exptmod.c => src/exptmod/fp_exptmod.c | 0 .../generators/comba_mont_gen.c | 0 .../generators/comba_mult_gen.c | 0 .../generators/comba_mult_smallgen.c | 0 .../generators/comba_sqr_gen.c | 0 .../generators/comba_sqr_smallgen.c | 0 tfm.h => src/headers/tfm.h | 10 +- fp_ident.c => src/misc/fp_ident.c | 0 fp_set.c => src/misc/fp_set.c | 0 fp_mont_small.c => src/mont/fp_mont_small.i | 0 .../mont/fp_montgomery_calc_normalization.c | 0 .../mont/fp_montgomery_reduce.c | 65 +- .../mont/fp_montgomery_setup.c | 0 fp_mul.c => src/mul/fp_mul.c | 0 fp_mul_2.c => src/mul/fp_mul_2.c | 0 fp_mul_2d.c => src/mul/fp_mul_2d.c | 0 fp_mul_comba.c => src/mul/fp_mul_comba.c | 58 +- .../mul/fp_mul_comba_12.c | 3 + .../mul/fp_mul_comba_17.c | 3 + .../mul/fp_mul_comba_20.c | 3 + .../mul/fp_mul_comba_24.c | 3 + .../mul/fp_mul_comba_28.c | 3 + fp_mul_comba_3.i => src/mul/fp_mul_comba_3.c | 3 + .../mul/fp_mul_comba_32.c | 3 + fp_mul_comba_4.i => src/mul/fp_mul_comba_4.c | 3 + .../mul/fp_mul_comba_48.c | 3 + fp_mul_comba_6.i => src/mul/fp_mul_comba_6.c | 3 + .../mul/fp_mul_comba_64.c | 3 + fp_mul_comba_7.i => src/mul/fp_mul_comba_7.c | 3 + fp_mul_comba_8.i => src/mul/fp_mul_comba_8.c | 3 + fp_mul_comba_9.i => src/mul/fp_mul_comba_9.c | 3 + .../mul/fp_mul_comba_small_set.c | 3 + fp_mul_d.c => src/mul/fp_mul_d.c | 0 fp_mulmod.c => src/mul/fp_mulmod.c | 0 fp_gcd.c => src/numtheory/fp_gcd.c | 0 fp_invmod.c => src/numtheory/fp_invmod.c | 0 fp_isprime.c => src/numtheory/fp_isprime.c | 1 + fp_lcm.c => src/numtheory/fp_lcm.c | 0 .../numtheory/fp_prime_miller_rabin.c | 0 .../numtheory/fp_prime_random_ex.c | 0 fp_sqr.c => src/sqr/fp_sqr.c | 0 fp_sqr_comba.c => src/sqr/fp_sqr_comba.c | 161 +- .../sqr/fp_sqr_comba_12.c | 9 + .../sqr/fp_sqr_comba_17.c | 9 + .../sqr/fp_sqr_comba_20.c | 9 + .../sqr/fp_sqr_comba_24.c | 9 + .../sqr/fp_sqr_comba_28.c | 9 + fp_sqr_comba_3.i => src/sqr/fp_sqr_comba_3.c | 9 + .../sqr/fp_sqr_comba_32.c | 9 + fp_sqr_comba_4.i => src/sqr/fp_sqr_comba_4.c | 9 + .../sqr/fp_sqr_comba_48.c | 9 + fp_sqr_comba_6.i => src/sqr/fp_sqr_comba_6.c | 9 + .../sqr/fp_sqr_comba_64.c | 9 + fp_sqr_comba_7.i => src/sqr/fp_sqr_comba_7.c | 9 + fp_sqr_comba_8.i => src/sqr/fp_sqr_comba_8.c | 9 + fp_sqr_comba_9.i => src/sqr/fp_sqr_comba_9.c | 9 + .../sqr/fp_sqr_comba_generic.c | 3 + .../sqr/fp_sqr_comba_small_set.c | 7 + fp_sqrmod.c => src/sqr/fp_sqrmod.c | 0 tfm.dvi | Bin 54216 -> 54212 bytes tfm.log | 4 +- tfm.tex | 2 +- updatemakes.sh | 12 + 109 files changed, 730 insertions(+), 8685 deletions(-) create mode 100644 filter.pl delete mode 100644 fp_read_unsigned_bin.c create mode 100644 genlist.sh create mode 100644 parsenames.pl rename fp_add.c => src/addsub/fp_add.c (100%) rename fp_add_d.c => src/addsub/fp_add_d.c (100%) rename fp_addmod.c => src/addsub/fp_addmod.c (100%) rename fp_cmp.c => src/addsub/fp_cmp.c (100%) rename fp_cmp_d.c => src/addsub/fp_cmp_d.c (100%) rename fp_cmp_mag.c => src/addsub/fp_cmp_mag.c (100%) rename fp_sub.c => src/addsub/fp_sub.c (100%) rename fp_sub_d.c => src/addsub/fp_sub_d.c (100%) rename fp_submod.c => src/addsub/fp_submod.c (100%) rename s_fp_add.c => src/addsub/s_fp_add.c (100%) rename s_fp_sub.c => src/addsub/s_fp_sub.c (100%) rename fp_radix_size.c => src/bin/fp_radix_size.c (100%) rename fp_read_radix.c => src/bin/fp_read_radix.c (100%) rename fp_read_signed_bin.c => src/bin/fp_read_signed_bin.c (100%) create mode 100644 src/bin/fp_read_unsigned_bin.c rename fp_reverse.c => src/bin/fp_reverse.c (92%) rename fp_s_rmap.c => src/bin/fp_s_rmap.c (100%) rename fp_signed_bin_size.c => src/bin/fp_signed_bin_size.c (100%) rename fp_to_signed_bin.c => src/bin/fp_to_signed_bin.c (100%) rename fp_to_unsigned_bin.c => src/bin/fp_to_unsigned_bin.c (96%) rename fp_toradix.c => src/bin/fp_toradix.c (96%) rename fp_unsigned_bin_size.c => src/bin/fp_unsigned_bin_size.c (100%) rename fp_cnt_lsb.c => src/bit/fp_cnt_lsb.c (100%) rename fp_count_bits.c => src/bit/fp_count_bits.c (100%) rename fp_div_2.c => src/bit/fp_div_2.c (100%) rename fp_div_2d.c => src/bit/fp_div_2d.c (100%) rename fp_lshd.c => src/bit/fp_lshd.c (100%) rename fp_mod_2d.c => src/bit/fp_mod_2d.c (100%) rename fp_rshd.c => src/bit/fp_rshd.c (100%) rename fp_div.c => src/divide/fp_div.c (100%) rename fp_div_d.c => src/divide/fp_div_d.c (92%) rename fp_mod.c => src/divide/fp_mod.c (100%) rename fp_mod_d.c => src/divide/fp_mod_d.c (100%) rename fp_2expt.c => src/exptmod/fp_2expt.c (100%) rename fp_exptmod.c => src/exptmod/fp_exptmod.c (100%) rename comba_mont_gen.c => src/generators/comba_mont_gen.c (100%) rename comba_mult_gen.c => src/generators/comba_mult_gen.c (100%) rename comba_mult_smallgen.c => src/generators/comba_mult_smallgen.c (100%) rename comba_sqr_gen.c => src/generators/comba_sqr_gen.c (100%) rename comba_sqr_smallgen.c => src/generators/comba_sqr_smallgen.c (100%) rename tfm.h => src/headers/tfm.h (99%) rename fp_ident.c => src/misc/fp_ident.c (100%) rename fp_set.c => src/misc/fp_set.c (100%) rename fp_mont_small.c => src/mont/fp_mont_small.i (100%) rename fp_montgomery_calc_normalization.c => src/mont/fp_montgomery_calc_normalization.c (100%) rename fp_montgomery_reduce.c => src/mont/fp_montgomery_reduce.c (88%) rename fp_montgomery_setup.c => src/mont/fp_montgomery_setup.c (100%) rename fp_mul.c => src/mul/fp_mul.c (100%) rename fp_mul_2.c => src/mul/fp_mul_2.c (100%) rename fp_mul_2d.c => src/mul/fp_mul_2d.c (100%) rename fp_mul_comba.c => src/mul/fp_mul_comba.c (89%) rename fp_mul_comba_12.i => src/mul/fp_mul_comba_12.c (99%) rename fp_mul_comba_17.i => src/mul/fp_mul_comba_17.c (99%) rename fp_mul_comba_20.i => src/mul/fp_mul_comba_20.c (99%) rename fp_mul_comba_24.i => src/mul/fp_mul_comba_24.c (99%) rename fp_mul_comba_28.i => src/mul/fp_mul_comba_28.c (99%) rename fp_mul_comba_3.i => src/mul/fp_mul_comba_3.c (94%) rename fp_mul_comba_32.i => src/mul/fp_mul_comba_32.c (99%) rename fp_mul_comba_4.i => src/mul/fp_mul_comba_4.c (95%) rename fp_mul_comba_48.i => src/mul/fp_mul_comba_48.c (99%) rename fp_mul_comba_6.i => src/mul/fp_mul_comba_6.c (97%) rename fp_mul_comba_64.i => src/mul/fp_mul_comba_64.c (99%) rename fp_mul_comba_7.i => src/mul/fp_mul_comba_7.c (98%) rename fp_mul_comba_8.i => src/mul/fp_mul_comba_8.c (98%) rename fp_mul_comba_9.i => src/mul/fp_mul_comba_9.c (98%) rename fp_mul_comba_small_set.i => src/mul/fp_mul_comba_small_set.c (99%) rename fp_mul_d.c => src/mul/fp_mul_d.c (100%) rename fp_mulmod.c => src/mul/fp_mulmod.c (100%) rename fp_gcd.c => src/numtheory/fp_gcd.c (100%) rename fp_invmod.c => src/numtheory/fp_invmod.c (100%) rename fp_isprime.c => src/numtheory/fp_isprime.c (99%) rename fp_lcm.c => src/numtheory/fp_lcm.c (100%) rename fp_prime_miller_rabin.c => src/numtheory/fp_prime_miller_rabin.c (100%) rename fp_prime_random_ex.c => src/numtheory/fp_prime_random_ex.c (100%) rename fp_sqr.c => src/sqr/fp_sqr.c (100%) rename fp_sqr_comba.c => src/sqr/fp_sqr_comba.c (83%) rename fp_sqr_comba_12.i => src/sqr/fp_sqr_comba_12.c (96%) rename fp_sqr_comba_17.i => src/sqr/fp_sqr_comba_17.c (97%) rename fp_sqr_comba_20.i => src/sqr/fp_sqr_comba_20.c (98%) rename fp_sqr_comba_24.i => src/sqr/fp_sqr_comba_24.c (98%) rename fp_sqr_comba_28.i => src/sqr/fp_sqr_comba_28.c (99%) rename fp_sqr_comba_3.i => src/sqr/fp_sqr_comba_3.c (85%) rename fp_sqr_comba_32.i => src/sqr/fp_sqr_comba_32.c (99%) rename fp_sqr_comba_4.i => src/sqr/fp_sqr_comba_4.c (88%) rename fp_sqr_comba_48.i => src/sqr/fp_sqr_comba_48.c (99%) rename fp_sqr_comba_6.i => src/sqr/fp_sqr_comba_6.c (91%) rename fp_sqr_comba_64.i => src/sqr/fp_sqr_comba_64.c (99%) rename fp_sqr_comba_7.i => src/sqr/fp_sqr_comba_7.c (93%) rename fp_sqr_comba_8.i => src/sqr/fp_sqr_comba_8.c (94%) rename fp_sqr_comba_9.i => src/sqr/fp_sqr_comba_9.c (94%) rename fp_sqr_comba_generic.c => src/sqr/fp_sqr_comba_generic.c (97%) rename fp_sqr_comba_small_set.i => src/sqr/fp_sqr_comba_small_set.c (99%) rename fp_sqrmod.c => src/sqr/fp_sqrmod.c (100%) create mode 100644 updatemakes.sh diff --git a/changes.txt b/changes.txt index 76f5d37..721e3f3 100644 --- a/changes.txt +++ b/changes.txt @@ -1,3 +1,14 @@ +March 14th, 2007 +0.12 -- Christophe Devine contributed MIPS asm w00t + ++ quick release to get the MIPS code out there + +March 10th, 2007 +0.11 -- re-org'ed the source tree, it's cooler now + -- cleaned up mul/sqr so there is only one file per unit, should help building with older compilers and/or on slower boxes + -- [CRI] optimized fp_read_unsigned_bin + -- fixed -0 ... again ... I now have less hair on my head. + -- [CRI] renamed bn_reverse() -> fp_reverse() + November 1st, 2006 0.10 -- Unrolled Montgomery for 1..16 digits with TFM_SMALL_MONT_SET between 10% and 25% speedup depending on size. -- fixed fp_sqr_comba.c so it builds in ISO C mode [Andreas Lange] diff --git a/demo/test.c b/demo/test.c index d83fe60..c8b9def 100644 --- a/demo/test.c +++ b/demo/test.c @@ -411,6 +411,93 @@ sqrtime: } printf("%5lu-bit: %9llu\n", t * DIGIT_BIT, t2); } +invmodtime: + printf("Invmod:\n"); + for (t = 2; t < FP_SIZE/2; t += 2) { + fp_zero(&a); + for (ix = 0; ix < t; ix++) { + a.dp[ix] = ix | 1; + } + a.used = t; + fp_zero(&b); + for (ix = 0; ix < t; ix++) { + b.dp[ix] = rand(); + } + b.used = t; + fp_clamp(&b); + fp_zero(&c); + t2 = -1; + for (ix = 0; ix < 100; ++ix) { + t1 = TIMFUNC(); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + fp_invmod(&b, &a, &c); + t2 = (TIMFUNC() - t1)>>6; + if (t1`wH;=uyD0|-$BC(|=bm0r?FkA2*9rjj=}T%OUs5m_Qqbd%z{f#1brxy~!Quj{d4I@(#+ncOU5ttBN+rEOij)!PJZujPn ze$8n0FA=5F#WO9>%QH`fp;=_@t7XzXKW$6a$2bmdcUGUZ91ouee`2ZmSa11qih+9g z(Y%sy#D`oeaQ=~~tcLYx`|6~omg%|C`+d^A=Ypu6NT&W}b@(YZ+$P@hYym?gpiJMAp=RAz4wc z=i+dV9{QKBqbEHUj({J0qjAXJCIAD!q(jl7LjhA^rq);0{OgPnF^d(Z1j7=CSz*HT zXaWM-gn*+7IczWl6`p{DBZwF_m=rf;Lt)?;H2QzO4^|)!ej|pm!NiDbbTBk=oDFt| zTHDA#OGAU0#tt(l&alJyh%!7dnie_^*oDi#<3$(1xDVqoNMe2gOpmD91Y;xqD1b3@ z>dF|)n8-NDI0VQz$vF9*JLe$dEJM5|4?D)`;^*P(EaNBRFXQhL4c|BHxrLE4a#XA;Lu7>?aAw062(SS#9bLbSkFRKTJ|13l&~vhV%% zt%?4o$>zv7Mjiov~$(zQ9VG_U<{dOXTr424Z0*7??5z3Nz_d$Ydn z+hJJH7OC7h)ZaGuKirpk*_{)MKFfe zZkp4P=c9fI3oKR&$PCHPRevRV^jUGPs$8eAh?t7rdr|-HaWhu43aTVZQ{(S{J$C=# z@vCUSYMY%?wRuQyqo_*S_;3Yio7bURog3u#!=a!;Aj7LYk%zekkAj_f9U+yN0B``J zh;wQ$7~aD!-7|i}ZOuw^M6gFUU+<*=?dq|-6= zrAn{9`EmT{l)<6R_OjPEZfsgn{8hM4qwf>Pk=F7W#h>vjDM3yi8HK)m5`5Tc*d+z~ zQK8v2tEL*_`MNmARkv+*nzz$@x+=-;N#hF2jv(ZPuHYLpG3AUtWhebI{Q}#al2~}j zVY6a2J@>gzn#*DOF6vl+6hHl1&icx$w`bTcNR^jYQ#5scdCuWJ3#UFNo7D77vMhA) zeQb%%SJcY_sI=WG-e^-2QRM4QW85Reh(W%LgE{bz}b!3^@KJ%GzWjG#V ziyr~(@ew!cd4Eh9xLP@PGOb*4PoUbLoqGON7I{6oI18um<@fgby{IGim)0o)hFbGO zg`AMtuJ6bAp7<;8kFhFVasw9=Zg-?Icr4v-=4iNc7i%;z)T7+D!Q2x(Epa#x{xaug zM|{#)b>CzTE)wSt6EHo zKi9A24rKI5_XQ*@8JY1rfGiU+M_6ehsav1GgzPgT3`>62)-isRJcZ7%a1#jb-kJwn z1*hzYz3)FijU%PAFXcFGfxaN@ZVoQ~Az|J~iIjo>5IQZnq z2*}V=`pPeRmXmuLl{Ai1Cu$xOGU2lD0E4%gE(8v6vd^Sb>bIvYT z;B45SipncNyDl0Gt-5#GcoST&FK+4Ej+>u%Ri$}Y7ASe@(jl>EP)FA`@DX*ufXSeV zjs9f6Q_i!NUQhh!n+}iUufwNH6c5u}5RF~doJOkAg?cEpI6QCt0&J&fjg5@=EPk$@ ziY)OJ^a`2l9e&!!m9^u;r7vxsX>(Z2Un$xr-`44kLGj7nv{~-D)t}RnLF@5NS69ah zkJPu-Tf0r~#oXAb@B=?P{~Q{&2xL2ZGq~K_ZmF?ti*BH)DS_8U=?kT>lX4^)FUj;NWP zN-=Ms_YldVusJ;E`EByq;E+6+mHHC?3@2Nhb7MI+_ow=2x)1vZ5FWavY z7OtB#%J;nxD&Uq6s^}VJxuPF7rMC+&^duZo&(8s@mQ>=WY<~QDJ-;9Sej{Y3kKQcr z@QdNpM0LR|bsr00w=DVtXI0XVJ^4S^XhZhr3ZJL8Y#H&AK_m+yFwq=a5qEB7+hqkJQgO@*BMEH&i7l_ zb`I2&OMCM|ojLZ6nwgd3%!Z1#H_K1WfRE)*ynSuEb>6ePPMdhO)$!jq+k~4NtgBRN zH6hiR5*F!%IcdgHypzw4Rz*DNJSPyrTqMT~WC_1np4T};|6RQL*h>>FVfSc7TTbIt z8;`aXy3ekk_cXztk=)3<$-qQqLf1(ZS%!-rxruW8Y?e(LjmtM0E!VnSI25q8+_}Z- zmhr)wpu3&7+u2C5fjd8_cCMhudZl!ArD&YsNnQ#8)*qNR22qC6)|7F_PaP${N$QNEdCBM3m{zvUM1 zNjq`U&Ne8>uaV(^;{RJiX__iY^v$Na}hOSBNmD2y-e9;%+b>y=NMLa+TZ7sfgnBrj#*k zvbt_ptY}ZcWfry(vRU&eD~v)Ru9Uqaz1XYgjzesR?5e3NZu=IBB`=(-V`qDpwia9L z@nCx-rG0l)fYmE!nCh9tN_=45X&n5p)sD+^g?yt35Z0>mt3$ZeAdyJ9P?G16ubkdj zE_&{26stSy@GIUgCX(`{<&Mq-?Xi&bI^9s_2iyJT10CyJ`cm1$3OwrPd42_Oug(On zNWTlzwqH}NKALE7SK|S}*H<|Tequ%ZtBkjo!j_NMk;lPfMGCMj4>hU#eRmK|TQM$H zDN0qf&0y*4v{KDiGO+u}!>zc80EUHB{Sbo8+8$v>aIxJ(45e)`KLisa!N3Lo-eCLa;9iKeLCnk_7g>pzrl7hKN zw=@j|)O7c)=`ww0CB!dvvUKByXv+DLZEIN?FM!X!&g_{cDm|`qW__G47Z^Uc<(A67 z;PLU+#4)X9svoZ({7g`a8|CZmNUFoxM%$c6OeB1oF?H9TuQc+%G=4|r?S}!SYI+A5 zE3sG8GveAy4gODU^^3~`bCqkmc+aVP?}F7R`41kGJryiv-75WPK}mK#JnJGunp={3 zsbKdd2KasCl&ckgq%B8h* z1=FNf7N;iCSfOflKu&;a{>i7Nb8LdQ8A^3o-G>JUSheKruTSv*5(N z$m4N(-ILGfoKoVj%5gJQo{FowZWX!~rOkP_Y8n{pdAyqHMG`>R_3O4?ErOM>Zi?TR z@ReJz+lLP>$_3Rh8xV=W0RMSYHjOkfp67W?RQgt9@c2&V*o3p}-Jn3nF$1-)w_g}4 zQkO+rQc*D&K2bVLn@)R_MYSt3!;x0tBAVrdvKrN_Q>EA$7UtoZRj;7h;U&uta+`0) z8UvSmr3=D^-@Pu1ENt|@yT0eYOjusuotWR+jRN~s*)GB;H8Z9cMq^jb?vF_B9?t;9 zqd^Nw^+!IF@8Gno%4hB8wPliZG_H7vh0$9gvRTrdUp?p@?2#)v?WIwE=7;4*>dlXa zhUr7u1i!$XQ}X7=3TnHv=5Knfq^jgsX1R1@9v~LA;#BgdQoD$vUF&n6HF7iJeoe@e zca%V3b8V+=9=||oWfqjbQ?_5APE>h0T=SuAdNKR=Gu!&K(>6lM2`3#B)ExQK)ou&E zW#>&$e}2XhVAXEbea>o};PE`bk^1RW1MQW8Oa=?J3AzNP1ul^*(lmYa?>R$c#0U%d zAy-CK&s`5PRydua@GI7Og$mfA+i9_)3<;?MFGYM&=doqoHx5YQk@%^T+Z16{csqBF zKPgVLOj%+n;;Nv9P=JA-(~Hw)>dltaPcHReaK{YtdluE-(um2ZoJ_U8AJ%?XG>@}q z|8;M-z8c-rqa)m31P$F${Z|vy-nXOyXg^n}foD3|+gg0y*~ue@o@XuM8;{p*T;jbJ zg$Jkl8yNH+i0ty9;x@n{GgDV!6#j;q%gaf8_K!iYgLc|J-u3KD<%CSs}hD-VU;O1%%>(S__mpuKepM>QvUp{}o^G!`2pLiWL zN18(zPR8QCNR0s#`b?Gf3$e-))|xQ-Cg#@)jEi}?zW?IGYc#5)!foY8<)Id-%86QfxClw9G>-m5y8{P6YjGS>0zpI@nz2snWS z8y0o~jDkxIv~4L`d6y%%6l-fgNmN^ijaKydN_gG&tx^aHar1wB_S_9=_cS>Y)#DS`XD0grme~W?xYYcXECn)0&xR(3#*|Z15KL{E5@1C7RMEhzHe zN!Mlsy>=K_6=~${JuQ#7-Qap;)#;Lv4pH}aFWPj;Xp3xZ4TyMN~RZwE2307hHgt}|9qIji`K`S?@ z%bfM9Yh<#@W5=DUH(hDXe0C$bL#x_vLg?LhM-<~YFgb@l`YZBPeV83l6>56Yk^}Cv zX!$$+V%WVAwVT<0@yhYu5ycB>ZBFh5TU#Jb~mUvR!$*zbSz!?$p|iLs?ywng3DLttiN zZs6MxSJiN@daWz5y;sk`W_Bg+be9viA;uP|J-|raaZj-veDKS&HC*_Fs`W)VOYnOR zz%UU@>95v##jdZ-V(9S6DNo}`;^kVC4>5LwD%a0nvY=V}m|;gOzC8Ji_I+&9_xkdO z!o~b@Zf&8uhTkdIJ^!Nia>!G#l}uZW%hPXRj_)k|-pq*3bpM$^i`j8SNcUMkbG`YT z`((aEDFvS0je^}>b}G5KC7a*345SmkJG8rppoJLiP>G^pCJ-)pTt!ghWIXNO6Pr^gadHeXEKJV;Ggipb^h-H&7ofH4fP9omH{qm(2x8{Bm(jG--tm|F#rF~CF4h!%73?Va1sXpuU59Se1tuMiQ*6_ z01Xf@cr;d=UPjl~`5;R%wbKV_{_`hd!3-=~0Zo7(;Dmtt!08XZ0VE2GL;Yz(U{PoQ zAhBTxNF17IF$)s~G0@xAgU@dt(0Uy7#`aGe4uL_C*Z>3pK;X&N9eDa$YAp*eQ$qL6~Fr<447#!x0LO>`jEFM6TEkq-r z*Ulta;|M6yiU}xy3@t1UjUinJ5uETx;Dfj*JQ5^_A5Yd2Xe)udVl0BRVgw3>MUp0s zB_K%KkB6G_cY@$QJ;9=pq(N{PJeGuGP}T$_Sr8NfLu$hipxq?NKnaqx=>UH;0wApf zi-zDK*$mlGq&5tJfFvQ@fj<NUH-dC>&{EEECh(9$(jyvy!r<^EbUHZLN!LLmjmG>=@E?)DK(a%M z0>m8BzGDG$-9};XWXcAO8JT=y2@tG*#sC3G+Q2uVKnPaS~-9*Mz{E`%JC%{vAG z2?L2kEL1SrG(jOq;m0Cz2bw1O2mBD<$oh^!K?e?T@Y}y>6$XbR1p|xxpa13m(=7@* z#YpnR;E-fBVljB~u43@NW$7P*$D$Bqfgy)v(+AB3>E#ycG=Xd{77NJ`NrDiJs6Xih zaTRh%c9Vi`-2Zpx|0Xx&knE}l*~n19LDzax>foShAss3_^xy!HY84(jmq-^9P$(oR zB_Kt^{aFbDLHHNG6QJIa&<;`us84?*^INN+D<%Z?pKw8FCfIv#g!gP0*?jgMMTu~&(Qxrml3DF delta 9652 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.delme"); + +$l = 0; +while () { + if ($_ =~ /START_INS/) { + print TMP $_; + $l = 1; + while () { + print TMP $_; + } + close INS; + } elsif ($_ =~ /END_INS/) { + print TMP $_; + $l = 0; + } elsif ($l == 0) { + print TMP $_; + } +} + +close TMP; +close SRC; diff --git a/fp_read_unsigned_bin.c b/fp_read_unsigned_bin.c deleted file mode 100644 index 070e420..0000000 --- a/fp_read_unsigned_bin.c +++ /dev/null @@ -1,28 +0,0 @@ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -void fp_read_unsigned_bin(fp_int *a, unsigned char *b, int c) -{ - /* zero the int */ - fp_zero (a); - - /* read the bytes in */ - for (; c > 0; c--) { - fp_mul_2d (a, 8, a); - a->dp[0] |= *b++; - a->used += 1; - } - fp_clamp (a); -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ diff --git a/gen.pl b/gen.pl index c48dbab..6107499 100644 --- a/gen.pl +++ b/gen.pl @@ -7,6 +7,7 @@ use strict; open( OUT, ">mpi.c" ) or die "Couldn't open mpi.c for writing: $!"; foreach my $filename (glob "*fp_*.c") { + next if ($filename eq "fp_sqr_comba_generic.c"); open( SRC, "<$filename" ) or die "Couldn't open $filename for reading: $!"; print OUT "/* Start: $filename */\n"; print OUT while ; diff --git a/genlist.sh b/genlist.sh new file mode 100644 index 0000000..98239b2 --- /dev/null +++ b/genlist.sh @@ -0,0 +1,9 @@ +#!/bin/bash +export a=`find . -type f | sort | grep "[.]/src" | grep "[.]c" | grep -v generators | sed -e 'sE\./EE' | sed -e 's/\.c/\.o/' | xargs` +perl ./parsenames.pl OBJECTS "$a" +export a=`find . -type f | grep [.]/src | grep [.]h | sed -e 'se\./ee' | xargs` +perl ./parsenames.pl HEADERS "$a" + +# $Source: /cvs/libtom/tomsfastmath/genlist.sh,v $ +# $Revision: 1.1 $ +# $Date: 2006/12/31 21:31:40 $ diff --git a/makefile b/makefile index 458e5a4..5fcd8d1 100644 --- a/makefile +++ b/makefile @@ -1,9 +1,9 @@ #makefile for TomsFastMath # # -VERSION=0.10 +VERSION=0.12 -CFLAGS += -Wall -W -Wshadow -I./ +CFLAGS += -Wall -W -Wshadow -Isrc/headers ifndef MAKE MAKE=make @@ -22,35 +22,34 @@ CFLAGS += -fomit-frame-pointer endif -OBJECTS = \ -fp_set.o \ -\ -fp_rshd.o fp_lshd.o fp_div_2d.o fp_mod_2d.o fp_mul_2d.o fp_2expt.o \ -fp_mul_2.o fp_div_2.o \ -\ -fp_cnt_lsb.o \ -\ -fp_add.o fp_sub.o fp_mul.o fp_sqr.o fp_div.o fp_mod.o \ -s_fp_add.o s_fp_sub.o \ -\ -fp_cmp_d.o fp_add_d.o fp_sub_d.o fp_mul_d.o fp_div_d.o fp_mod_d.o \ -fp_addmod.o fp_submod.o fp_mulmod.o fp_sqrmod.o fp_invmod.o \ -fp_gcd.o fp_lcm.o fp_prime_miller_rabin.o fp_isprime.o \ -fp_prime_random_ex.o fp_mul_comba.o fp_sqr_comba.o \ -\ -fp_montgomery_setup.o fp_montgomery_calc_normalization.o fp_montgomery_reduce.o \ -\ -fp_exptmod.o \ -\ -fp_cmp.o fp_cmp_mag.o \ -\ -fp_unsigned_bin_size.o fp_read_unsigned_bin.o fp_to_unsigned_bin.o \ -fp_signed_bin_size.o fp_read_signed_bin.o fp_to_signed_bin.o \ -fp_read_radix.o fp_toradix.o fp_radix_size.o fp_count_bits.o fp_reverse.o fp_s_rmap.o \ -\ -fp_ident.o +#START_INS +OBJECTS=src/addsub/fp_add.o src/addsub/fp_add_d.o src/addsub/fp_addmod.o src/addsub/fp_cmp.o \ +src/addsub/fp_cmp_d.o src/addsub/fp_cmp_mag.o src/addsub/fp_sub.o src/addsub/fp_sub_d.o \ +src/addsub/fp_submod.o src/addsub/s_fp_add.o src/addsub/s_fp_sub.o src/bin/fp_radix_size.o \ +src/bin/fp_read_radix.o src/bin/fp_read_signed_bin.o src/bin/fp_read_unsigned_bin.o \ +src/bin/fp_reverse.o src/bin/fp_s_rmap.o src/bin/fp_signed_bin_size.o src/bin/fp_to_signed_bin.o \ +src/bin/fp_to_unsigned_bin.o src/bin/fp_toradix.o src/bin/fp_unsigned_bin_size.o src/bit/fp_cnt_lsb.o \ +src/bit/fp_count_bits.o src/bit/fp_div_2.o src/bit/fp_div_2d.o src/bit/fp_lshd.o src/bit/fp_mod_2d.o \ +src/bit/fp_rshd.o src/divide/fp_div.o src/divide/fp_div_d.o src/divide/fp_mod.o src/divide/fp_mod_d.o \ +src/exptmod/fp_2expt.o src/exptmod/fp_exptmod.o src/misc/fp_ident.o src/misc/fp_set.o \ +src/mont/fp_montgomery_calc_normalization.o src/mont/fp_montgomery_reduce.o \ +src/mont/fp_montgomery_setup.o src/mul/fp_mul.o src/mul/fp_mul_2.o src/mul/fp_mul_2d.o \ +src/mul/fp_mul_comba.o src/mul/fp_mul_comba_12.o src/mul/fp_mul_comba_17.o src/mul/fp_mul_comba_20.o \ +src/mul/fp_mul_comba_24.o src/mul/fp_mul_comba_28.o src/mul/fp_mul_comba_3.o src/mul/fp_mul_comba_32.o \ +src/mul/fp_mul_comba_4.o src/mul/fp_mul_comba_48.o src/mul/fp_mul_comba_6.o src/mul/fp_mul_comba_64.o \ +src/mul/fp_mul_comba_7.o src/mul/fp_mul_comba_8.o src/mul/fp_mul_comba_9.o \ +src/mul/fp_mul_comba_small_set.o src/mul/fp_mul_d.o src/mul/fp_mulmod.o src/numtheory/fp_gcd.o \ +src/numtheory/fp_invmod.o src/numtheory/fp_isprime.o src/numtheory/fp_lcm.o \ +src/numtheory/fp_prime_miller_rabin.o src/numtheory/fp_prime_random_ex.o src/sqr/fp_sqr.o \ +src/sqr/fp_sqr_comba.o src/sqr/fp_sqr_comba_12.o src/sqr/fp_sqr_comba_17.o src/sqr/fp_sqr_comba_20.o \ +src/sqr/fp_sqr_comba_24.o src/sqr/fp_sqr_comba_28.o src/sqr/fp_sqr_comba_3.o src/sqr/fp_sqr_comba_32.o \ +src/sqr/fp_sqr_comba_4.o src/sqr/fp_sqr_comba_48.o src/sqr/fp_sqr_comba_6.o src/sqr/fp_sqr_comba_64.o \ +src/sqr/fp_sqr_comba_7.o src/sqr/fp_sqr_comba_8.o src/sqr/fp_sqr_comba_9.o \ +src/sqr/fp_sqr_comba_generic.o src/sqr/fp_sqr_comba_small_set.o src/sqr/fp_sqrmod.o -HEADERS=tfm.h +HEADERS=src/headers/tfm.h + +#END_INS ifndef LIBPATH LIBPATH=/usr/lib @@ -96,6 +95,14 @@ test: $(LIBNAME) demo/test.o mtest/mtest timing: $(LIBNAME) demo/test.o $(CC) $(CFLAGS) demo/test.o $(LIBNAME) $(PROF) -o test + +profiled: + CFLAGS="${CFLAGS} -fprofile-generate" MAKE=${MAKE} ${MAKE} timing + ./test + rm -f `find . -type f | grep "[.]o" | xargs` + rm -f `find . -type f | grep "[.]a" | xargs` + rm -f test + CFLAGS="${CFLAGS} -fprofile-use" MAKE=${MAKE} ${MAKE} timing stest: $(LIBNAME) demo/stest.o $(CC) $(CFLAGS) demo/stest.o $(LIBNAME) -o stest @@ -148,5 +155,5 @@ zipup: no_oops docs clean mv -f tfm* ~ ; rm -rf tomsfastmath-$(VERSION) # $Source: /cvs/libtom/tomsfastmath/makefile,v $ -# $Revision: 1.29 $ -# $Date: 2006/10/22 13:27:10 $ +# $Revision: 1.38 $ +# $Date: 2007/03/13 01:23:03 $ diff --git a/makefile.shared b/makefile.shared index 5852a89..5cc993b 100644 --- a/makefile.shared +++ b/makefile.shared @@ -1,11 +1,11 @@ #makefile for TomsFastMath # # -VERSION=0:10 +VERSION=0:12 CC=libtool --mode=compile --tag=CC gcc -CFLAGS += -Wall -W -Wshadow -I./ +CFLAGS += -Wall -W -Wshadow -Isrc/headers ifndef IGNORE_SPEED @@ -20,36 +20,35 @@ CFLAGS += -fomit-frame-pointer endif +#START_INS +OBJECTS=src/addsub/fp_add.o src/addsub/fp_add_d.o src/addsub/fp_addmod.o src/addsub/fp_cmp.o \ +src/addsub/fp_cmp_d.o src/addsub/fp_cmp_mag.o src/addsub/fp_sub.o src/addsub/fp_sub_d.o \ +src/addsub/fp_submod.o src/addsub/s_fp_add.o src/addsub/s_fp_sub.o src/bin/fp_radix_size.o \ +src/bin/fp_read_radix.o src/bin/fp_read_signed_bin.o src/bin/fp_read_unsigned_bin.o \ +src/bin/fp_reverse.o src/bin/fp_s_rmap.o src/bin/fp_signed_bin_size.o src/bin/fp_to_signed_bin.o \ +src/bin/fp_to_unsigned_bin.o src/bin/fp_toradix.o src/bin/fp_unsigned_bin_size.o src/bit/fp_cnt_lsb.o \ +src/bit/fp_count_bits.o src/bit/fp_div_2.o src/bit/fp_div_2d.o src/bit/fp_lshd.o src/bit/fp_mod_2d.o \ +src/bit/fp_rshd.o src/divide/fp_div.o src/divide/fp_div_d.o src/divide/fp_mod.o src/divide/fp_mod_d.o \ +src/exptmod/fp_2expt.o src/exptmod/fp_exptmod.o src/misc/fp_ident.o src/misc/fp_set.o \ +src/mont/fp_montgomery_calc_normalization.o src/mont/fp_montgomery_reduce.o \ +src/mont/fp_montgomery_setup.o src/mul/fp_mul.o src/mul/fp_mul_2.o src/mul/fp_mul_2d.o \ +src/mul/fp_mul_comba.o src/mul/fp_mul_comba_12.o src/mul/fp_mul_comba_17.o src/mul/fp_mul_comba_20.o \ +src/mul/fp_mul_comba_24.o src/mul/fp_mul_comba_28.o src/mul/fp_mul_comba_3.o src/mul/fp_mul_comba_32.o \ +src/mul/fp_mul_comba_4.o src/mul/fp_mul_comba_48.o src/mul/fp_mul_comba_6.o src/mul/fp_mul_comba_64.o \ +src/mul/fp_mul_comba_7.o src/mul/fp_mul_comba_8.o src/mul/fp_mul_comba_9.o \ +src/mul/fp_mul_comba_small_set.o src/mul/fp_mul_d.o src/mul/fp_mulmod.o src/numtheory/fp_gcd.o \ +src/numtheory/fp_invmod.o src/numtheory/fp_isprime.o src/numtheory/fp_lcm.o \ +src/numtheory/fp_prime_miller_rabin.o src/numtheory/fp_prime_random_ex.o src/sqr/fp_sqr.o \ +src/sqr/fp_sqr_comba.o src/sqr/fp_sqr_comba_12.o src/sqr/fp_sqr_comba_17.o src/sqr/fp_sqr_comba_20.o \ +src/sqr/fp_sqr_comba_24.o src/sqr/fp_sqr_comba_28.o src/sqr/fp_sqr_comba_3.o src/sqr/fp_sqr_comba_32.o \ +src/sqr/fp_sqr_comba_4.o src/sqr/fp_sqr_comba_48.o src/sqr/fp_sqr_comba_6.o src/sqr/fp_sqr_comba_64.o \ +src/sqr/fp_sqr_comba_7.o src/sqr/fp_sqr_comba_8.o src/sqr/fp_sqr_comba_9.o \ +src/sqr/fp_sqr_comba_generic.o src/sqr/fp_sqr_comba_small_set.o src/sqr/fp_sqrmod.o -OBJECTS = \ -fp_set.o \ -\ -fp_rshd.o fp_lshd.o fp_div_2d.o fp_mod_2d.o fp_mul_2d.o fp_2expt.o \ -fp_mul_2.o fp_div_2.o \ -\ -fp_cnt_lsb.o \ -\ -fp_add.o fp_sub.o fp_mul.o fp_sqr.o fp_div.o fp_mod.o \ -s_fp_add.o s_fp_sub.o \ -\ -fp_cmp_d.o fp_add_d.o fp_sub_d.o fp_mul_d.o fp_div_d.o fp_mod_d.o \ -fp_addmod.o fp_submod.o fp_mulmod.o fp_sqrmod.o fp_invmod.o \ -fp_gcd.o fp_lcm.o fp_prime_miller_rabin.o fp_isprime.o \ -fp_prime_random_ex.o fp_mul_comba.o fp_sqr_comba.o \ -\ -fp_montgomery_setup.o fp_montgomery_calc_normalization.o fp_montgomery_reduce.o \ -\ -fp_exptmod.o \ -\ -fp_cmp.o fp_cmp_mag.o \ -\ -fp_unsigned_bin_size.o fp_read_unsigned_bin.o fp_to_unsigned_bin.o \ -fp_signed_bin_size.o fp_read_signed_bin.o fp_to_signed_bin.o \ -fp_read_radix.o fp_toradix.o fp_radix_size.o fp_count_bits.o fp_reverse.o fp_s_rmap.o \ -\ -fp_ident.o +HEADERS=src/headers/tfm.h + +#END_INS -HEADERS=tfm.h ifndef LIBPATH LIBPATH=/usr/lib @@ -105,6 +104,6 @@ stest: $(LIBNAME) demo/stest.o $(CC) $(CFLAGS) demo/stest.o $(LIBNAME_S) -o stest # $Source: /cvs/libtom/tomsfastmath/makefile.shared,v $ -# $Revision: 1.14 $ -# $Date: 2006/10/22 13:27:10 $ +# $Revision: 1.19 $ +# $Date: 2007/03/13 01:23:03 $ diff --git a/mtest/mtest.c b/mtest/mtest.c index 66a2621..b19a0fc 100644 --- a/mtest/mtest.c +++ b/mtest/mtest.c @@ -39,7 +39,7 @@ mulmod #include #include #define CRYPT -#include "../tfm.h" +#include "../src/headers/tfm.h" FILE *rng; diff --git a/parsenames.pl b/parsenames.pl new file mode 100644 index 0000000..d558d27 --- /dev/null +++ b/parsenames.pl @@ -0,0 +1,26 @@ +#!/usr/bin/perl +# +# Splits the list of files and outputs for makefile type files +# wrapped at 80 chars +# +# Tom St Denis +@a = split(" ", $ARGV[1]); +$b = "$ARGV[0]="; +$len = length($b); +print $b; +foreach my $obj (@a) { + $len = $len + length($obj); + $obj =~ s/\*/\$/; + if ($len > 100) { + printf "\\\n"; + $len = length($obj); + } + print "$obj "; +} +#if ($ARGV[0] eq "HEADERS") { print "testprof/tomcrypt_test.h"; } + +print "\n\n"; + +# $Source: /cvs/libtom/tomsfastmath/parsenames.pl,v $ +# $Revision: 1.1 $ +# $Date: 2006/12/31 21:31:40 $ diff --git a/pre_gen/mpi.c b/pre_gen/mpi.c index c50f0fb..6b0c1d9 100644 --- a/pre_gen/mpi.c +++ b/pre_gen/mpi.c @@ -1,8512 +1,2 @@ -/* Start: fp_2expt.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* computes a = 2**b */ -void fp_2expt(fp_int *a, int b) -{ - int z; - - /* zero a as per default */ - fp_zero (a); - - if (b < 0) { - return; - } - - z = b / DIGIT_BIT; - if (z >= FP_SIZE) { - return; - } - - /* set the used count of where the bit will go */ - a->used = z + 1; - - /* put the single bit in its place */ - a->dp[z] = ((fp_digit)1) << (b % DIGIT_BIT); -} - - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_2expt.c */ - -/* Start: fp_add.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -void fp_add(fp_int *a, fp_int *b, fp_int *c) -{ - int sa, sb; - - /* get sign of both inputs */ - sa = a->sign; - sb = b->sign; - - /* handle two cases, not four */ - if (sa == sb) { - /* both positive or both negative */ - /* add their magnitudes, copy the sign */ - c->sign = sa; - s_fp_add (a, b, c); - } else { - /* one positive, the other negative */ - /* subtract the one with the greater magnitude from */ - /* the one of the lesser magnitude. The result gets */ - /* the sign of the one with the greater magnitude. */ - if (fp_cmp_mag (a, b) == FP_LT) { - c->sign = sb; - s_fp_sub (b, a, c); - } else { - c->sign = sa; - s_fp_sub (a, b, c); - } - } -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_add.c */ - -/* Start: fp_add_d.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* c = a + b */ -void fp_add_d(fp_int *a, fp_digit b, fp_int *c) -{ - fp_int tmp; - fp_set(&tmp, b); - fp_add(a,&tmp,c); -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_add_d.c */ - -/* Start: fp_addmod.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* d = a + b (mod c) */ -int fp_addmod(fp_int *a, fp_int *b, fp_int *c, fp_int *d) -{ - fp_int tmp; - fp_zero(&tmp); - fp_add(a, b, &tmp); - return fp_mod(&tmp, c, d); -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_addmod.c */ - -/* Start: fp_cmp.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -int fp_cmp(fp_int *a, fp_int *b) -{ - if (a->sign == FP_NEG && b->sign == FP_ZPOS) { - return FP_LT; - } else if (a->sign == FP_ZPOS && b->sign == FP_NEG) { - return FP_GT; - } else { - /* compare digits */ - if (a->sign == FP_NEG) { - /* if negative compare opposite direction */ - return fp_cmp_mag(b, a); - } else { - return fp_cmp_mag(a, b); - } - } -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_cmp.c */ - -/* Start: fp_cmp_d.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* compare against a single digit */ -int fp_cmp_d(fp_int *a, fp_digit b) -{ - /* compare based on sign */ - if ((b && a->used == 0) || a->sign == FP_NEG) { - return FP_LT; - } - - /* compare based on magnitude */ - if (a->used > 1) { - return FP_GT; - } - - /* compare the only digit of a to b */ - if (a->dp[0] > b) { - return FP_GT; - } else if (a->dp[0] < b) { - return FP_LT; - } else { - return FP_EQ; - } - -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_cmp_d.c */ - -/* Start: fp_cmp_mag.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -int fp_cmp_mag(fp_int *a, fp_int *b) -{ - int x; - - if (a->used > b->used) { - return FP_GT; - } else if (a->used < b->used) { - return FP_LT; - } else { - for (x = a->used - 1; x >= 0; x--) { - if (a->dp[x] > b->dp[x]) { - return FP_GT; - } else if (a->dp[x] < b->dp[x]) { - return FP_LT; - } - } - } - return FP_EQ; -} - - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_cmp_mag.c */ - -/* Start: fp_cnt_lsb.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -static const int lnz[16] = { - 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 -}; - -/* Counts the number of lsbs which are zero before the first zero bit */ -int fp_cnt_lsb(fp_int *a) -{ - int x; - fp_digit q, qq; - - /* easy out */ - if (fp_iszero(a) == 1) { - return 0; - } - - /* scan lower digits until non-zero */ - for (x = 0; x < a->used && a->dp[x] == 0; x++); - q = a->dp[x]; - x *= DIGIT_BIT; - - /* now scan this digit until a 1 is found */ - if ((q & 1) == 0) { - do { - qq = q & 15; - x += lnz[qq]; - q >>= 4; - } while (qq == 0); - } - return x; -} - - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_cnt_lsb.c */ - -/* Start: fp_count_bits.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -int fp_count_bits (fp_int * a) -{ - int r; - fp_digit q; - - /* shortcut */ - if (a->used == 0) { - return 0; - } - - /* get number of digits and add that */ - r = (a->used - 1) * DIGIT_BIT; - - /* take the last digit and count the bits in it */ - q = a->dp[a->used - 1]; - while (q > ((fp_digit) 0)) { - ++r; - q >>= ((fp_digit) 1); - } - return r; -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_count_bits.c */ - -/* Start: fp_div.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* a/b => cb + d == a */ -int fp_div(fp_int *a, fp_int *b, fp_int *c, fp_int *d) -{ - fp_int q, x, y, t1, t2; - int n, t, i, norm, neg; - - /* is divisor zero ? */ - if (fp_iszero (b) == 1) { - return FP_VAL; - } - - /* if a < b then q=0, r = a */ - if (fp_cmp_mag (a, b) == FP_LT) { - if (d != NULL) { - fp_copy (a, d); - } - if (c != NULL) { - fp_zero (c); - } - return FP_OKAY; - } - - fp_init(&q); - q.used = a->used + 2; - - fp_init(&t1); - fp_init(&t2); - fp_init_copy(&x, a); - fp_init_copy(&y, b); - - /* fix the sign */ - neg = (a->sign == b->sign) ? FP_ZPOS : FP_NEG; - x.sign = y.sign = FP_ZPOS; - - /* normalize both x and y, ensure that y >= b/2, [b == 2**DIGIT_BIT] */ - norm = fp_count_bits(&y) % DIGIT_BIT; - if (norm < (int)(DIGIT_BIT-1)) { - norm = (DIGIT_BIT-1) - norm; - fp_mul_2d (&x, norm, &x); - fp_mul_2d (&y, norm, &y); - } else { - norm = 0; - } - - /* note hac does 0 based, so if used==5 then its 0,1,2,3,4, e.g. use 4 */ - n = x.used - 1; - t = y.used - 1; - - /* while (x >= y*b**n-t) do { q[n-t] += 1; x -= y*b**{n-t} } */ - fp_lshd (&y, n - t); /* y = y*b**{n-t} */ - - while (fp_cmp (&x, &y) != FP_LT) { - ++(q.dp[n - t]); - fp_sub (&x, &y, &x); - } - - /* reset y by shifting it back down */ - fp_rshd (&y, n - t); - - /* step 3. for i from n down to (t + 1) */ - for (i = n; i >= (t + 1); i--) { - if (i > x.used) { - continue; - } - - /* step 3.1 if xi == yt then set q{i-t-1} to b-1, - * otherwise set q{i-t-1} to (xi*b + x{i-1})/yt */ - if (x.dp[i] == y.dp[t]) { - q.dp[i - t - 1] = ((((fp_word)1) << DIGIT_BIT) - 1); - } else { - fp_word tmp; - tmp = ((fp_word) x.dp[i]) << ((fp_word) DIGIT_BIT); - tmp |= ((fp_word) x.dp[i - 1]); - tmp /= ((fp_word) y.dp[t]); - q.dp[i - t - 1] = (fp_digit) (tmp); - } - - /* while (q{i-t-1} * (yt * b + y{t-1})) > - xi * b**2 + xi-1 * b + xi-2 - - do q{i-t-1} -= 1; - */ - q.dp[i - t - 1] = (q.dp[i - t - 1] + 1); - do { - q.dp[i - t - 1] = (q.dp[i - t - 1] - 1); - - /* find left hand */ - fp_zero (&t1); - t1.dp[0] = (t - 1 < 0) ? 0 : y.dp[t - 1]; - t1.dp[1] = y.dp[t]; - t1.used = 2; - fp_mul_d (&t1, q.dp[i - t - 1], &t1); - - /* find right hand */ - t2.dp[0] = (i - 2 < 0) ? 0 : x.dp[i - 2]; - t2.dp[1] = (i - 1 < 0) ? 0 : x.dp[i - 1]; - t2.dp[2] = x.dp[i]; - t2.used = 3; - } while (fp_cmp_mag(&t1, &t2) == FP_GT); - - /* step 3.3 x = x - q{i-t-1} * y * b**{i-t-1} */ - fp_mul_d (&y, q.dp[i - t - 1], &t1); - fp_lshd (&t1, i - t - 1); - fp_sub (&x, &t1, &x); - - /* if x < 0 then { x = x + y*b**{i-t-1}; q{i-t-1} -= 1; } */ - if (x.sign == FP_NEG) { - fp_copy (&y, &t1); - fp_lshd (&t1, i - t - 1); - fp_add (&x, &t1, &x); - q.dp[i - t - 1] = q.dp[i - t - 1] - 1; - } - } - - /* now q is the quotient and x is the remainder - * [which we have to normalize] - */ - - /* get sign before writing to c */ - x.sign = x.used == 0 ? FP_ZPOS : a->sign; - - if (c != NULL) { - fp_clamp (&q); - fp_copy (&q, c); - c->sign = neg; - } - - if (d != NULL) { - fp_div_2d (&x, norm, &x, NULL); - -/* the following is a kludge, essentially we were seeing the right remainder but - with excess digits that should have been zero - */ - for (i = b->used; i < x.used; i++) { - x.dp[i] = 0; - } - fp_clamp(&x); - fp_copy (&x, d); - } - - return FP_OKAY; -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_div.c */ - -/* Start: fp_div_2.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* b = a/2 */ -void fp_div_2(fp_int * a, fp_int * b) -{ - int x, oldused; - - oldused = b->used; - b->used = a->used; - { - register fp_digit r, rr, *tmpa, *tmpb; - - /* source alias */ - tmpa = a->dp + b->used - 1; - - /* dest alias */ - tmpb = b->dp + b->used - 1; - - /* carry */ - r = 0; - for (x = b->used - 1; x >= 0; x--) { - /* get the carry for the next iteration */ - rr = *tmpa & 1; - - /* shift the current digit, add in carry and store */ - *tmpb-- = (*tmpa-- >> 1) | (r << (DIGIT_BIT - 1)); - - /* forward carry to next iteration */ - r = rr; - } - - /* zero excess digits */ - tmpb = b->dp + b->used; - for (x = b->used; x < oldused; x++) { - *tmpb++ = 0; - } - } - b->sign = a->sign; - fp_clamp (b); -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_div_2.c */ - -/* Start: fp_div_2d.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* c = a / 2**b */ -void fp_div_2d(fp_int *a, int b, fp_int *c, fp_int *d) -{ - fp_digit D, r, rr; - int x; - fp_int t; - - /* if the shift count is <= 0 then we do no work */ - if (b <= 0) { - fp_copy (a, c); - if (d != NULL) { - fp_zero (d); - } - return; - } - - fp_init(&t); - - /* get the remainder */ - if (d != NULL) { - fp_mod_2d (a, b, &t); - } - - /* copy */ - fp_copy(a, c); - - /* shift by as many digits in the bit count */ - if (b >= (int)DIGIT_BIT) { - fp_rshd (c, b / DIGIT_BIT); - } - - /* shift any bit count < DIGIT_BIT */ - D = (fp_digit) (b % DIGIT_BIT); - if (D != 0) { - register fp_digit *tmpc, mask, shift; - - /* mask */ - mask = (((fp_digit)1) << D) - 1; - - /* shift for lsb */ - shift = DIGIT_BIT - D; - - /* alias */ - tmpc = c->dp + (c->used - 1); - - /* carry */ - r = 0; - for (x = c->used - 1; x >= 0; x--) { - /* get the lower bits of this word in a temp */ - rr = *tmpc & mask; - - /* shift the current word and mix in the carry bits from the previous word */ - *tmpc = (*tmpc >> D) | (r << shift); - --tmpc; - - /* set the carry to the carry bits of the current word found above */ - r = rr; - } - } - fp_clamp (c); - if (d != NULL) { - fp_copy (&t, d); - } -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_div_2d.c */ - -/* Start: fp_div_d.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -static int s_is_power_of_two(fp_digit b, int *p) -{ - int x; - - for (x = 1; x < DIGIT_BIT; x++) { - if (b == (((fp_digit)1)< cb + d == a */ -int fp_div_d(fp_int *a, fp_digit b, fp_int *c, fp_digit *d) -{ - fp_int q; - fp_word w; - fp_digit t; - int ix; - - /* cannot divide by zero */ - if (b == 0) { - return FP_VAL; - } - - /* quick outs */ - if (b == 1 || fp_iszero(a) == 1) { - if (d != NULL) { - *d = 0; - } - if (c != NULL) { - fp_copy(a, c); - } - return FP_OKAY; - } - - /* power of two ? */ - if (s_is_power_of_two(b, &ix) == 1) { - if (d != NULL) { - *d = a->dp[0] & ((((fp_digit)1)<used; - q.sign = a->sign; - w = 0; - for (ix = a->used - 1; ix >= 0; ix--) { - w = (w << ((fp_word)DIGIT_BIT)) | ((fp_word)a->dp[ix]); - - if (w >= b) { - t = (fp_digit)(w / b); - w -= ((fp_word)t) * ((fp_word)b); - } else { - t = 0; - } - q.dp[ix] = (fp_digit)t; - } - - if (d != NULL) { - *d = (fp_digit)w; - } - - if (c != NULL) { - fp_clamp(&q); - fp_copy(&q, c); - } - - return FP_OKAY; -} - - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_div_d.c */ - -/* Start: fp_exptmod.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -#ifdef TFM_TIMING_RESISTANT - -/* timing resistant montgomery ladder based exptmod - - Based on work by Marc Joye, Sung-Ming Yen, "The Montgomery Powering Ladder", Cryptographic Hardware and Embedded Systems, CHES 2002 -*/ -static int _fp_exptmod(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) -{ - fp_int R[2]; - fp_digit buf, mp; - int err, bitcnt, digidx, y; - - /* now setup montgomery */ - if ((err = fp_montgomery_setup (P, &mp)) != FP_OKAY) { - return err; - } - - fp_init(&R[0]); - fp_init(&R[1]); - - /* now we need R mod m */ - fp_montgomery_calc_normalization (&R[0], P); - - /* now set R[0][1] to G * R mod m */ - if (fp_cmp_mag(P, G) != FP_GT) { - /* G > P so we reduce it first */ - fp_mod(G, P, &R[1]); - } else { - fp_copy(G, &R[1]); - } - fp_mulmod (&R[1], &R[0], P, &R[1]); - - /* for j = t-1 downto 0 do - r_!k = R0*R1; r_k = r_k^2 - */ - - /* set initial mode and bit cnt */ - bitcnt = 1; - buf = 0; - digidx = X->used - 1; - - for (;;) { - /* grab next digit as required */ - if (--bitcnt == 0) { - /* if digidx == -1 we are out of digits so break */ - if (digidx == -1) { - break; - } - /* read next digit and reset bitcnt */ - buf = X->dp[digidx--]; - bitcnt = (int)DIGIT_BIT; - } - - /* grab the next msb from the exponent */ - y = (fp_digit)(buf >> (DIGIT_BIT - 1)) & 1; - buf <<= (fp_digit)1; - - /* do ops */ - fp_mul(&R[0], &R[1], &R[y^1]); fp_montgomery_reduce(&R[y^1], P, mp); - fp_sqr(&R[y], &R[y]); fp_montgomery_reduce(&R[y], P, mp); - } - - fp_montgomery_reduce(&R[0], P, mp); - fp_copy(&R[0], Y); - return FP_OKAY; -} - -#else - -/* y = g**x (mod b) - * Some restrictions... x must be positive and < b - */ -static int _fp_exptmod(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) -{ - fp_int M[64], res; - fp_digit buf, mp; - int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; - - /* find window size */ - x = fp_count_bits (X); - if (x <= 21) { - winsize = 1; - } else if (x <= 36) { - winsize = 3; - } else if (x <= 140) { - winsize = 4; - } else if (x <= 450) { - winsize = 5; - } else { - winsize = 6; - } - - /* init M array */ - memset(M, 0, sizeof(M)); - - /* now setup montgomery */ - if ((err = fp_montgomery_setup (P, &mp)) != FP_OKAY) { - return err; - } - - /* setup result */ - fp_init(&res); - - /* create M table - * - * The M table contains powers of the input base, e.g. M[x] = G^x mod P - * - * The first half of the table is not computed though accept for M[0] and M[1] - */ - - /* now we need R mod m */ - fp_montgomery_calc_normalization (&res, P); - - /* now set M[1] to G * R mod m */ - if (fp_cmp_mag(P, G) != FP_GT) { - /* G > P so we reduce it first */ - fp_mod(G, P, &M[1]); - } else { - fp_copy(G, &M[1]); - } - fp_mulmod (&M[1], &res, P, &M[1]); - - /* compute the value at M[1<<(winsize-1)] by squaring M[1] (winsize-1) times */ - fp_copy (&M[1], &M[1 << (winsize - 1)]); - for (x = 0; x < (winsize - 1); x++) { - fp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)]); - fp_montgomery_reduce (&M[1 << (winsize - 1)], P, mp); - } - - /* create upper table */ - for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { - fp_mul(&M[x - 1], &M[1], &M[x]); - fp_montgomery_reduce(&M[x], P, mp); - } - - /* set initial mode and bit cnt */ - mode = 0; - bitcnt = 1; - buf = 0; - digidx = X->used - 1; - bitcpy = 0; - bitbuf = 0; - - for (;;) { - /* grab next digit as required */ - if (--bitcnt == 0) { - /* if digidx == -1 we are out of digits so break */ - if (digidx == -1) { - break; - } - /* read next digit and reset bitcnt */ - buf = X->dp[digidx--]; - bitcnt = (int)DIGIT_BIT; - } - - /* grab the next msb from the exponent */ - y = (fp_digit)(buf >> (DIGIT_BIT - 1)) & 1; - buf <<= (fp_digit)1; - - /* if the bit is zero and mode == 0 then we ignore it - * These represent the leading zero bits before the first 1 bit - * in the exponent. Technically this opt is not required but it - * does lower the # of trivial squaring/reductions used - */ - if (mode == 0 && y == 0) { - continue; - } - - /* if the bit is zero and mode == 1 then we square */ - if (mode == 1 && y == 0) { - fp_sqr(&res, &res); - fp_montgomery_reduce(&res, P, mp); - continue; - } - - /* else we add it to the window */ - bitbuf |= (y << (winsize - ++bitcpy)); - mode = 2; - - if (bitcpy == winsize) { - /* ok window is filled so square as required and multiply */ - /* square first */ - for (x = 0; x < winsize; x++) { - fp_sqr(&res, &res); - fp_montgomery_reduce(&res, P, mp); - } - - /* then multiply */ - fp_mul(&res, &M[bitbuf], &res); - fp_montgomery_reduce(&res, P, mp); - - /* empty window and reset */ - bitcpy = 0; - bitbuf = 0; - mode = 1; - } - } - - /* if bits remain then square/multiply */ - if (mode == 2 && bitcpy > 0) { - /* square then multiply if the bit is set */ - for (x = 0; x < bitcpy; x++) { - fp_sqr(&res, &res); - fp_montgomery_reduce(&res, P, mp); - - /* get next bit of the window */ - bitbuf <<= 1; - if ((bitbuf & (1 << winsize)) != 0) { - /* then multiply */ - fp_mul(&res, &M[1], &res); - fp_montgomery_reduce(&res, P, mp); - } - } - } - - /* fixup result if Montgomery reduction is used - * recall that any value in a Montgomery system is - * actually multiplied by R mod n. So we have - * to reduce one more time to cancel out the factor - * of R. - */ - fp_montgomery_reduce(&res, P, mp); - - /* swap res with Y */ - fp_copy (&res, Y); - return FP_OKAY; -} - -#endif - - -int fp_exptmod(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) -{ - fp_int tmp; - int err; - -#ifdef TFM_CHECK - /* prevent overflows */ - if (P->used > (FP_SIZE/2)) { - return FP_VAL; - } -#endif - - /* is X negative? */ - if (X->sign == FP_NEG) { - /* yes, copy G and invmod it */ - fp_copy(G, &tmp); - if ((err = fp_invmod(&tmp, P, &tmp)) != FP_OKAY) { - return err; - } - X->sign = FP_ZPOS; - err = _fp_exptmod(&tmp, X, P, Y); - if (X != Y) { - X->sign = FP_NEG; - } - return err; - } else { - /* Positive exponent so just exptmod */ - return _fp_exptmod(G, X, P, Y); - } -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_exptmod.c */ - -/* Start: fp_gcd.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* c = (a, b) */ -void fp_gcd(fp_int *a, fp_int *b, fp_int *c) -{ - fp_int u, v, r; - - /* either zero than gcd is the largest */ - if (fp_iszero (a) == 1 && fp_iszero (b) == 0) { - fp_abs (b, c); - return; - } - if (fp_iszero (a) == 0 && fp_iszero (b) == 1) { - fp_abs (a, c); - return; - } - - /* optimized. At this point if a == 0 then - * b must equal zero too - */ - if (fp_iszero (a) == 1) { - fp_zero(c); - return; - } - - /* sort inputs */ - if (fp_cmp_mag(a, b) != FP_LT) { - fp_init_copy(&u, a); - fp_init_copy(&v, b); - } else { - fp_init_copy(&u, b); - fp_init_copy(&v, a); - } - - fp_zero(&r); - while (fp_iszero(&v) == FP_NO) { - fp_mod(&u, &v, &r); - fp_copy(&v, &u); - fp_copy(&r, &v); - } - fp_copy(&u, c); -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_gcd.c */ - -/* Start: fp_ident.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include "tfm.h" - -const char *fp_ident(void) -{ - static char buf[1024]; - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf)-1, -"TomsFastMath (%s)\n" -"\n" -"Sizeofs\n" -"\tfp_digit = %u\n" -"\tfp_word = %u\n" -"\n" -"FP_MAX_SIZE = %u\n" -"\n" -"Defines: \n" -#ifdef __i386__ -" __i386__ " -#endif -#ifdef __x86_64__ -" __x86_64__ " -#endif -#ifdef TFM_X86 -" TFM_X86 " -#endif -#ifdef TFM_X86_64 -" TFM_X86_64 " -#endif -#ifdef TFM_SSE2 -" TFM_SSE2 " -#endif -#ifdef TFM_ARM -" TFM_ARM " -#endif -#ifdef TFM_PPC32 -" TFM_PPC32 " -#endif -#ifdef TFM_AVR32 -" TFM_AVR32 " -#endif -#ifdef TFM_ECC192 -" TFM_ECC192 " -#endif -#ifdef TFM_ECC224 -" TFM_ECC224 " -#endif -#ifdef TFM_ECC384 -" TFM_ECC384 " -#endif -#ifdef TFM_ECC521 -" TFM_ECC521 " -#endif - -#ifdef TFM_NO_ASM -" TFM_NO_ASM " -#endif -#ifdef FP_64BIT -" FP_64BIT " -#endif -#ifdef TFM_HUGE -" TFM_HUGE " -#endif -"\n", __DATE__, sizeof(fp_digit), sizeof(fp_word), FP_MAX_SIZE); - - if (sizeof(fp_digit) == sizeof(fp_word)) { - strncat(buf, "WARNING: sizeof(fp_digit) == sizeof(fp_word), this build is likely to not work properly.\n", - sizeof(buf)-1); - } - return buf; -} - -#ifdef STANDALONE - -int main(void) -{ - printf("%s\n", fp_ident()); - return 0; -} - -#endif - - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_ident.c */ - -/* Start: fp_invmod.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -static int fp_invmod_slow (fp_int * a, fp_int * b, fp_int * c) -{ - fp_int x, y, u, v, A, B, C, D; - int res; - - /* b cannot be negative */ - if (b->sign == FP_NEG || fp_iszero(b) == 1) { - return FP_VAL; - } - - /* init temps */ - fp_init(&x); fp_init(&y); - fp_init(&u); fp_init(&v); - fp_init(&A); fp_init(&B); - fp_init(&C); fp_init(&D); - - /* x = a, y = b */ - if ((res = fp_mod(a, b, &x)) != FP_OKAY) { - return res; - } - fp_copy(b, &y); - - /* 2. [modified] if x,y are both even then return an error! */ - if (fp_iseven (&x) == 1 && fp_iseven (&y) == 1) { - return FP_VAL; - } - - /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ - fp_copy (&x, &u); - fp_copy (&y, &v); - fp_set (&A, 1); - fp_set (&D, 1); - -top: - /* 4. while u is even do */ - while (fp_iseven (&u) == 1) { - /* 4.1 u = u/2 */ - fp_div_2 (&u, &u); - - /* 4.2 if A or B is odd then */ - if (fp_isodd (&A) == 1 || fp_isodd (&B) == 1) { - /* A = (A+y)/2, B = (B-x)/2 */ - fp_add (&A, &y, &A); - fp_sub (&B, &x, &B); - } - /* A = A/2, B = B/2 */ - fp_div_2 (&A, &A); - fp_div_2 (&B, &B); - } - - /* 5. while v is even do */ - while (fp_iseven (&v) == 1) { - /* 5.1 v = v/2 */ - fp_div_2 (&v, &v); - - /* 5.2 if C or D is odd then */ - if (fp_isodd (&C) == 1 || fp_isodd (&D) == 1) { - /* C = (C+y)/2, D = (D-x)/2 */ - fp_add (&C, &y, &C); - fp_sub (&D, &x, &D); - } - /* C = C/2, D = D/2 */ - fp_div_2 (&C, &C); - fp_div_2 (&D, &D); - } - - /* 6. if u >= v then */ - if (fp_cmp (&u, &v) != FP_LT) { - /* u = u - v, A = A - C, B = B - D */ - fp_sub (&u, &v, &u); - fp_sub (&A, &C, &A); - fp_sub (&B, &D, &B); - } else { - /* v - v - u, C = C - A, D = D - B */ - fp_sub (&v, &u, &v); - fp_sub (&C, &A, &C); - fp_sub (&D, &B, &D); - } - - /* if not zero goto step 4 */ - if (fp_iszero (&u) == 0) - goto top; - - /* now a = C, b = D, gcd == g*v */ - - /* if v != 1 then there is no inverse */ - if (fp_cmp_d (&v, 1) != FP_EQ) { - return FP_VAL; - } - - /* if its too low */ - while (fp_cmp_d(&C, 0) == FP_LT) { - fp_add(&C, b, &C); - } - - /* too big */ - while (fp_cmp_mag(&C, b) != FP_LT) { - fp_sub(&C, b, &C); - } - - /* C is now the inverse */ - fp_copy(&C, c); - return FP_OKAY; -} - -/* c = 1/a (mod b) for odd b only */ -int fp_invmod(fp_int *a, fp_int *b, fp_int *c) -{ - fp_int x, y, u, v, B, D; - int neg; - - /* 2. [modified] b must be odd */ - if (fp_iseven (b) == FP_YES) { - return fp_invmod_slow(a,b,c); - } - - /* init all our temps */ - fp_init(&x); fp_init(&y); - fp_init(&u); fp_init(&v); - fp_init(&B); fp_init(&D); - - /* x == modulus, y == value to invert */ - fp_copy(b, &x); - - /* we need y = |a| */ - fp_abs(a, &y); - - /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ - fp_copy(&x, &u); - fp_copy(&y, &v); - fp_set (&D, 1); - -top: - /* 4. while u is even do */ - while (fp_iseven (&u) == FP_YES) { - /* 4.1 u = u/2 */ - fp_div_2 (&u, &u); - - /* 4.2 if B is odd then */ - if (fp_isodd (&B) == FP_YES) { - fp_sub (&B, &x, &B); - } - /* B = B/2 */ - fp_div_2 (&B, &B); - } - - /* 5. while v is even do */ - while (fp_iseven (&v) == FP_YES) { - /* 5.1 v = v/2 */ - fp_div_2 (&v, &v); - - /* 5.2 if D is odd then */ - if (fp_isodd (&D) == FP_YES) { - /* D = (D-x)/2 */ - fp_sub (&D, &x, &D); - } - /* D = D/2 */ - fp_div_2 (&D, &D); - } - - /* 6. if u >= v then */ - if (fp_cmp (&u, &v) != FP_LT) { - /* u = u - v, B = B - D */ - fp_sub (&u, &v, &u); - fp_sub (&B, &D, &B); - } else { - /* v - v - u, D = D - B */ - fp_sub (&v, &u, &v); - fp_sub (&D, &B, &D); - } - - /* if not zero goto step 4 */ - if (fp_iszero (&u) == FP_NO) { - goto top; - } - - /* now a = C, b = D, gcd == g*v */ - - /* if v != 1 then there is no inverse */ - if (fp_cmp_d (&v, 1) != FP_EQ) { - return FP_VAL; - } - - /* b is now the inverse */ - neg = a->sign; - while (D.sign == FP_NEG) { - fp_add (&D, b, &D); - } - fp_copy (&D, c); - c->sign = neg; - return FP_OKAY; -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_invmod.c */ - -/* Start: fp_isprime.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* a few primes */ -static const fp_digit primes[256] = { - 0x0002, 0x0003, 0x0005, 0x0007, 0x000B, 0x000D, 0x0011, 0x0013, - 0x0017, 0x001D, 0x001F, 0x0025, 0x0029, 0x002B, 0x002F, 0x0035, - 0x003B, 0x003D, 0x0043, 0x0047, 0x0049, 0x004F, 0x0053, 0x0059, - 0x0061, 0x0065, 0x0067, 0x006B, 0x006D, 0x0071, 0x007F, 0x0083, - 0x0089, 0x008B, 0x0095, 0x0097, 0x009D, 0x00A3, 0x00A7, 0x00AD, - 0x00B3, 0x00B5, 0x00BF, 0x00C1, 0x00C5, 0x00C7, 0x00D3, 0x00DF, - 0x00E3, 0x00E5, 0x00E9, 0x00EF, 0x00F1, 0x00FB, 0x0101, 0x0107, - 0x010D, 0x010F, 0x0115, 0x0119, 0x011B, 0x0125, 0x0133, 0x0137, - - 0x0139, 0x013D, 0x014B, 0x0151, 0x015B, 0x015D, 0x0161, 0x0167, - 0x016F, 0x0175, 0x017B, 0x017F, 0x0185, 0x018D, 0x0191, 0x0199, - 0x01A3, 0x01A5, 0x01AF, 0x01B1, 0x01B7, 0x01BB, 0x01C1, 0x01C9, - 0x01CD, 0x01CF, 0x01D3, 0x01DF, 0x01E7, 0x01EB, 0x01F3, 0x01F7, - 0x01FD, 0x0209, 0x020B, 0x021D, 0x0223, 0x022D, 0x0233, 0x0239, - 0x023B, 0x0241, 0x024B, 0x0251, 0x0257, 0x0259, 0x025F, 0x0265, - 0x0269, 0x026B, 0x0277, 0x0281, 0x0283, 0x0287, 0x028D, 0x0293, - 0x0295, 0x02A1, 0x02A5, 0x02AB, 0x02B3, 0x02BD, 0x02C5, 0x02CF, - - 0x02D7, 0x02DD, 0x02E3, 0x02E7, 0x02EF, 0x02F5, 0x02F9, 0x0301, - 0x0305, 0x0313, 0x031D, 0x0329, 0x032B, 0x0335, 0x0337, 0x033B, - 0x033D, 0x0347, 0x0355, 0x0359, 0x035B, 0x035F, 0x036D, 0x0371, - 0x0373, 0x0377, 0x038B, 0x038F, 0x0397, 0x03A1, 0x03A9, 0x03AD, - 0x03B3, 0x03B9, 0x03C7, 0x03CB, 0x03D1, 0x03D7, 0x03DF, 0x03E5, - 0x03F1, 0x03F5, 0x03FB, 0x03FD, 0x0407, 0x0409, 0x040F, 0x0419, - 0x041B, 0x0425, 0x0427, 0x042D, 0x043F, 0x0443, 0x0445, 0x0449, - 0x044F, 0x0455, 0x045D, 0x0463, 0x0469, 0x047F, 0x0481, 0x048B, - - 0x0493, 0x049D, 0x04A3, 0x04A9, 0x04B1, 0x04BD, 0x04C1, 0x04C7, - 0x04CD, 0x04CF, 0x04D5, 0x04E1, 0x04EB, 0x04FD, 0x04FF, 0x0503, - 0x0509, 0x050B, 0x0511, 0x0515, 0x0517, 0x051B, 0x0527, 0x0529, - 0x052F, 0x0551, 0x0557, 0x055D, 0x0565, 0x0577, 0x0581, 0x058F, - 0x0593, 0x0595, 0x0599, 0x059F, 0x05A7, 0x05AB, 0x05AD, 0x05B3, - 0x05BF, 0x05C9, 0x05CB, 0x05CF, 0x05D1, 0x05D5, 0x05DB, 0x05E7, - 0x05F3, 0x05FB, 0x0607, 0x060D, 0x0611, 0x0617, 0x061F, 0x0623, - 0x062B, 0x062F, 0x063D, 0x0641, 0x0647, 0x0649, 0x064D, 0x0653 -}; - -int fp_isprime(fp_int *a) -{ - fp_int b; - fp_digit d; - int r, res; - - /* do trial division */ - for (r = 0; r < 256; r++) { - fp_mod_d(a, primes[r], &d); - if (d == 0) { - return FP_NO; - } - } - - /* now do 8 miller rabins */ - for (r = 0; r < 8; r++) { - fp_set(&b, primes[r]); - fp_prime_miller_rabin(a, &b, &res); - if (res == FP_NO) { - return FP_NO; - } - } - return FP_YES; -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_isprime.c */ - -/* Start: fp_lcm.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* c = [a, b] */ -void fp_lcm(fp_int *a, fp_int *b, fp_int *c) -{ - fp_int t1, t2; - - fp_init(&t1); - fp_init(&t2); - fp_gcd(a, b, &t1); - if (fp_cmp_mag(a, b) == FP_GT) { - fp_div(a, &t1, &t2, NULL); - fp_mul(b, &t2, c); - } else { - fp_div(b, &t1, &t2, NULL); - fp_mul(a, &t2, c); - } -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_lcm.c */ - -/* Start: fp_lshd.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -void fp_lshd(fp_int *a, int x) -{ - int y; - - /* move up and truncate as required */ - y = MIN(a->used + x - 1, (int)(FP_SIZE-1)); - - /* store new size */ - a->used = y + 1; - - /* move digits */ - for (; y >= x; y--) { - a->dp[y] = a->dp[y-x]; - } - - /* zero lower digits */ - for (; y >= 0; y--) { - a->dp[y] = 0; - } - - /* clamp digits */ - fp_clamp(a); -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_lshd.c */ - -/* Start: fp_mod.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* c = a mod b, 0 <= c < b */ -int fp_mod(fp_int *a, fp_int *b, fp_int *c) -{ - fp_int t; - int err; - - fp_zero(&t); - if ((err = fp_div(a, b, NULL, &t)) != FP_OKAY) { - return err; - } - if (t.sign != b->sign) { - fp_add(&t, b, c); - } else { - fp_copy(&t, c); - } - return FP_OKAY; -} - - - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_mod.c */ - -/* Start: fp_mod_2d.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* c = a mod 2**d */ -void fp_mod_2d(fp_int *a, int b, fp_int *c) -{ - int x; - - /* zero if count less than or equal to zero */ - if (b <= 0) { - fp_zero(c); - return; - } - - /* get copy of input */ - fp_copy(a, c); - - /* if 2**d is larger than we just return */ - if (b >= (DIGIT_BIT * a->used)) { - return; - } - - /* zero digits above the last digit of the modulus */ - for (x = (b / DIGIT_BIT) + ((b % DIGIT_BIT) == 0 ? 0 : 1); x < c->used; x++) { - c->dp[x] = 0; - } - /* clear the digit that is not completely outside/inside the modulus */ - c->dp[b / DIGIT_BIT] &= ~((fp_digit)0) >> (DIGIT_BIT - b); - fp_clamp (c); -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_mod_2d.c */ - -/* Start: fp_mod_d.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* c = a mod b, 0 <= c < b */ -int fp_mod_d(fp_int *a, fp_digit b, fp_digit *c) -{ - return fp_div_d(a, b, NULL, c); -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_mod_d.c */ - -/* Start: fp_mont_small.c */ -#ifdef TFM_SMALL_MONT_SET -/* computes x/R == x (mod N) via Montgomery Reduction */ -void fp_montgomery_reduce_small(fp_int *a, fp_int *m, fp_digit mp) -{ - fp_digit c[FP_SIZE], *_c, *tmpm, mu, cy; - int oldused, x, y, pa; - -#if defined(USE_MEMSET) - /* now zero the buff */ - memset(c, 0, sizeof c); -#endif - pa = m->used; - - /* copy the input */ - oldused = a->used; - for (x = 0; x < oldused; x++) { - c[x] = a->dp[x]; - } -#if !defined(USE_MEMSET) - for (; x < 2*pa+3; x++) { - c[x] = 0; - } -#endif - MONT_START; - - switch (pa) { - case 1: - x = 0; cy = 0; - LOOP_START; - _c = c + 0; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; -#else - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - break; - case 2: - x = 0; cy = 0; - LOOP_START; - _c = c + 0; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 1; cy = 0; - LOOP_START; - _c = c + 1; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - break; - case 3: - x = 0; cy = 0; - LOOP_START; - _c = c + 0; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 1; cy = 0; - LOOP_START; - _c = c + 1; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 2; cy = 0; - LOOP_START; - _c = c + 2; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - break; - case 4: - x = 0; cy = 0; - LOOP_START; - _c = c + 0; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 1; cy = 0; - LOOP_START; - _c = c + 1; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 2; cy = 0; - LOOP_START; - _c = c + 2; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 3; cy = 0; - LOOP_START; - _c = c + 3; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - break; - case 5: - x = 0; cy = 0; - LOOP_START; - _c = c + 0; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 1; cy = 0; - LOOP_START; - _c = c + 1; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 2; cy = 0; - LOOP_START; - _c = c + 2; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 3; cy = 0; - LOOP_START; - _c = c + 3; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 4; cy = 0; - LOOP_START; - _c = c + 4; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - break; - case 6: - x = 0; cy = 0; - LOOP_START; - _c = c + 0; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 1; cy = 0; - LOOP_START; - _c = c + 1; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 2; cy = 0; - LOOP_START; - _c = c + 2; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 3; cy = 0; - LOOP_START; - _c = c + 3; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 4; cy = 0; - LOOP_START; - _c = c + 4; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 5; cy = 0; - LOOP_START; - _c = c + 5; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - break; - case 7: - x = 0; cy = 0; - LOOP_START; - _c = c + 0; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 1; cy = 0; - LOOP_START; - _c = c + 1; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 2; cy = 0; - LOOP_START; - _c = c + 2; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 3; cy = 0; - LOOP_START; - _c = c + 3; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 4; cy = 0; - LOOP_START; - _c = c + 4; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 5; cy = 0; - LOOP_START; - _c = c + 5; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 6; cy = 0; - LOOP_START; - _c = c + 6; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - break; - case 8: - x = 0; cy = 0; - LOOP_START; - _c = c + 0; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 1; cy = 0; - LOOP_START; - _c = c + 1; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 2; cy = 0; - LOOP_START; - _c = c + 2; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 3; cy = 0; - LOOP_START; - _c = c + 3; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 4; cy = 0; - LOOP_START; - _c = c + 4; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 5; cy = 0; - LOOP_START; - _c = c + 5; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 6; cy = 0; - LOOP_START; - _c = c + 6; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 7; cy = 0; - LOOP_START; - _c = c + 7; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - break; - case 9: - x = 0; cy = 0; - LOOP_START; - _c = c + 0; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 1; cy = 0; - LOOP_START; - _c = c + 1; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 2; cy = 0; - LOOP_START; - _c = c + 2; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 3; cy = 0; - LOOP_START; - _c = c + 3; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 4; cy = 0; - LOOP_START; - _c = c + 4; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 5; cy = 0; - LOOP_START; - _c = c + 5; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 6; cy = 0; - LOOP_START; - _c = c + 6; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 7; cy = 0; - LOOP_START; - _c = c + 7; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 8; cy = 0; - LOOP_START; - _c = c + 8; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - break; - case 10: - x = 0; cy = 0; - LOOP_START; - _c = c + 0; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 1; cy = 0; - LOOP_START; - _c = c + 1; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 2; cy = 0; - LOOP_START; - _c = c + 2; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 3; cy = 0; - LOOP_START; - _c = c + 3; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 4; cy = 0; - LOOP_START; - _c = c + 4; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 5; cy = 0; - LOOP_START; - _c = c + 5; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 6; cy = 0; - LOOP_START; - _c = c + 6; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 7; cy = 0; - LOOP_START; - _c = c + 7; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 8; cy = 0; - LOOP_START; - _c = c + 8; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 9; cy = 0; - LOOP_START; - _c = c + 9; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - break; - case 11: - x = 0; cy = 0; - LOOP_START; - _c = c + 0; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 1; cy = 0; - LOOP_START; - _c = c + 1; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 2; cy = 0; - LOOP_START; - _c = c + 2; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 3; cy = 0; - LOOP_START; - _c = c + 3; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 4; cy = 0; - LOOP_START; - _c = c + 4; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 5; cy = 0; - LOOP_START; - _c = c + 5; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 6; cy = 0; - LOOP_START; - _c = c + 6; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 7; cy = 0; - LOOP_START; - _c = c + 7; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 8; cy = 0; - LOOP_START; - _c = c + 8; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 9; cy = 0; - LOOP_START; - _c = c + 9; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 10; cy = 0; - LOOP_START; - _c = c + 10; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - break; - case 12: - x = 0; cy = 0; - LOOP_START; - _c = c + 0; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 1; cy = 0; - LOOP_START; - _c = c + 1; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 2; cy = 0; - LOOP_START; - _c = c + 2; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 3; cy = 0; - LOOP_START; - _c = c + 3; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 4; cy = 0; - LOOP_START; - _c = c + 4; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 5; cy = 0; - LOOP_START; - _c = c + 5; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 6; cy = 0; - LOOP_START; - _c = c + 6; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 7; cy = 0; - LOOP_START; - _c = c + 7; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 8; cy = 0; - LOOP_START; - _c = c + 8; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 9; cy = 0; - LOOP_START; - _c = c + 9; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 10; cy = 0; - LOOP_START; - _c = c + 10; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 11; cy = 0; - LOOP_START; - _c = c + 11; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - break; - case 13: - x = 0; cy = 0; - LOOP_START; - _c = c + 0; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 1; cy = 0; - LOOP_START; - _c = c + 1; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 2; cy = 0; - LOOP_START; - _c = c + 2; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 3; cy = 0; - LOOP_START; - _c = c + 3; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 4; cy = 0; - LOOP_START; - _c = c + 4; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 5; cy = 0; - LOOP_START; - _c = c + 5; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 6; cy = 0; - LOOP_START; - _c = c + 6; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 7; cy = 0; - LOOP_START; - _c = c + 7; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 8; cy = 0; - LOOP_START; - _c = c + 8; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 9; cy = 0; - LOOP_START; - _c = c + 9; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 10; cy = 0; - LOOP_START; - _c = c + 10; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 11; cy = 0; - LOOP_START; - _c = c + 11; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 12; cy = 0; - LOOP_START; - _c = c + 12; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - break; - case 14: - x = 0; cy = 0; - LOOP_START; - _c = c + 0; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 1; cy = 0; - LOOP_START; - _c = c + 1; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 2; cy = 0; - LOOP_START; - _c = c + 2; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 3; cy = 0; - LOOP_START; - _c = c + 3; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 4; cy = 0; - LOOP_START; - _c = c + 4; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 5; cy = 0; - LOOP_START; - _c = c + 5; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 6; cy = 0; - LOOP_START; - _c = c + 6; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 7; cy = 0; - LOOP_START; - _c = c + 7; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 8; cy = 0; - LOOP_START; - _c = c + 8; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 9; cy = 0; - LOOP_START; - _c = c + 9; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 10; cy = 0; - LOOP_START; - _c = c + 10; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 11; cy = 0; - LOOP_START; - _c = c + 11; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 12; cy = 0; - LOOP_START; - _c = c + 12; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 13; cy = 0; - LOOP_START; - _c = c + 13; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - break; - case 15: - x = 0; cy = 0; - LOOP_START; - _c = c + 0; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 1; cy = 0; - LOOP_START; - _c = c + 1; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 2; cy = 0; - LOOP_START; - _c = c + 2; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 3; cy = 0; - LOOP_START; - _c = c + 3; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 4; cy = 0; - LOOP_START; - _c = c + 4; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 5; cy = 0; - LOOP_START; - _c = c + 5; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 6; cy = 0; - LOOP_START; - _c = c + 6; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 7; cy = 0; - LOOP_START; - _c = c + 7; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 8; cy = 0; - LOOP_START; - _c = c + 8; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 9; cy = 0; - LOOP_START; - _c = c + 9; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 10; cy = 0; - LOOP_START; - _c = c + 10; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 11; cy = 0; - LOOP_START; - _c = c + 11; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 12; cy = 0; - LOOP_START; - _c = c + 12; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 13; cy = 0; - LOOP_START; - _c = c + 13; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 14; cy = 0; - LOOP_START; - _c = c + 14; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - break; - case 16: - x = 0; cy = 0; - LOOP_START; - _c = c + 0; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 1; cy = 0; - LOOP_START; - _c = c + 1; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 2; cy = 0; - LOOP_START; - _c = c + 2; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 3; cy = 0; - LOOP_START; - _c = c + 3; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 4; cy = 0; - LOOP_START; - _c = c + 4; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 5; cy = 0; - LOOP_START; - _c = c + 5; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 6; cy = 0; - LOOP_START; - _c = c + 6; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 7; cy = 0; - LOOP_START; - _c = c + 7; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 8; cy = 0; - LOOP_START; - _c = c + 8; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 9; cy = 0; - LOOP_START; - _c = c + 9; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 10; cy = 0; - LOOP_START; - _c = c + 10; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 11; cy = 0; - LOOP_START; - _c = c + 11; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 12; cy = 0; - LOOP_START; - _c = c + 12; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 13; cy = 0; - LOOP_START; - _c = c + 13; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 14; cy = 0; - LOOP_START; - _c = c + 14; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - x = 15; cy = 0; - LOOP_START; - _c = c + 15; - tmpm = m->dp; -#ifdef INNERMUL8 - INNERMUL8; _c += 8; tmpm += 8; - INNERMUL8; _c += 8; tmpm += 8; -#else - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; - INNERMUL; ++_c; -#endif - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - break; - } - /* now copy out */ - _c = c + pa; - tmpm = a->dp; - for (x = 0; x < pa+1; x++) { - *tmpm++ = *_c++; - } - - for (; x < oldused; x++) { - *tmpm++ = 0; - } - - MONT_FINI; - - a->used = pa+1; - fp_clamp(a); - - /* if A >= m then A = A - m */ - if (fp_cmp_mag (a, m) != FP_LT) { - s_fp_sub (a, m, a); - } -} - -#endif - -/* End: fp_mont_small.c */ - -/* Start: fp_montgomery_calc_normalization.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* computes a = B**n mod b without division or multiplication useful for - * normalizing numbers in a Montgomery system. - */ -void fp_montgomery_calc_normalization(fp_int *a, fp_int *b) -{ - int x, bits; - - /* how many bits of last digit does b use */ - bits = fp_count_bits (b) % DIGIT_BIT; - if (!bits) bits = DIGIT_BIT; - - /* compute A = B^(n-1) * 2^(bits-1) */ - if (b->used > 1) { - fp_2expt (a, (b->used - 1) * DIGIT_BIT + bits - 1); - } else { - fp_set(a, 1); - bits = 1; - } - - /* now compute C = A * B mod b */ - for (x = bits - 1; x < (int)DIGIT_BIT; x++) { - fp_mul_2 (a, a); - if (fp_cmp_mag (a, b) != FP_LT) { - s_fp_sub (a, b, a); - } - } -} - - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_montgomery_calc_normalization.c */ - -/* Start: fp_montgomery_reduce.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/******************************************************************/ -#if defined(TFM_X86) && !defined(TFM_SSE2) -/* x86-32 code */ - -#define MONT_START -#define MONT_FINI -#define LOOP_END -#define LOOP_START \ - mu = c[x] * mp - -#define INNERMUL \ -asm( \ - "movl %5,%%eax \n\t" \ - "mull %4 \n\t" \ - "addl %1,%%eax \n\t" \ - "adcl $0,%%edx \n\t" \ - "addl %%eax,%0 \n\t" \ - "adcl $0,%%edx \n\t" \ - "movl %%edx,%1 \n\t" \ -:"=g"(_c[LO]), "=r"(cy) \ -:"0"(_c[LO]), "1"(cy), "g"(mu), "g"(*tmpm++) \ -: "%eax", "%edx", "%cc") - -#define PROPCARRY \ -asm( \ - "addl %1,%0 \n\t" \ - "setb %%al \n\t" \ - "movzbl %%al,%1 \n\t" \ -:"=g"(_c[LO]), "=r"(cy) \ -:"0"(_c[LO]), "1"(cy) \ -: "%eax", "%cc") - -/******************************************************************/ -#elif defined(TFM_X86_64) -/* x86-64 code */ - -#define MONT_START -#define MONT_FINI -#define LOOP_END -#define LOOP_START \ - mu = c[x] * mp - -#define INNERMUL \ -asm( \ - "movq %5,%%rax \n\t" \ - "mulq %4 \n\t" \ - "addq %1,%%rax \n\t" \ - "adcq $0,%%rdx \n\t" \ - "addq %%rax,%0 \n\t" \ - "adcq $0,%%rdx \n\t" \ - "movq %%rdx,%1 \n\t" \ -:"=g"(_c[LO]), "=r"(cy) \ -:"0"(_c[LO]), "1"(cy), "r"(mu), "r"(*tmpm++) \ -: "%rax", "%rdx", "%cc") - -#define INNERMUL8 \ - asm( \ - "movq 0(%5),%%rax \n\t" \ - "movq 0(%2),%%r10 \n\t" \ - "movq 0x8(%5),%%r11 \n\t" \ - "mulq %4 \n\t" \ - "addq %%r10,%%rax \n\t" \ - "adcq $0,%%rdx \n\t" \ - "movq 0x8(%2),%%r10 \n\t" \ - "addq %3,%%rax \n\t" \ - "adcq $0,%%rdx \n\t" \ - "movq %%rax,0(%0) \n\t" \ - "movq %%rdx,%1 \n\t" \ - \ - "movq %%r11,%%rax \n\t" \ - "movq 0x10(%5),%%r11 \n\t" \ - "mulq %4 \n\t" \ - "addq %%r10,%%rax \n\t" \ - "adcq $0,%%rdx \n\t" \ - "movq 0x10(%2),%%r10 \n\t" \ - "addq %3,%%rax \n\t" \ - "adcq $0,%%rdx \n\t" \ - "movq %%rax,0x8(%0) \n\t" \ - "movq %%rdx,%1 \n\t" \ - \ - "movq %%r11,%%rax \n\t" \ - "movq 0x18(%5),%%r11 \n\t" \ - "mulq %4 \n\t" \ - "addq %%r10,%%rax \n\t" \ - "adcq $0,%%rdx \n\t" \ - "movq 0x18(%2),%%r10 \n\t" \ - "addq %3,%%rax \n\t" \ - "adcq $0,%%rdx \n\t" \ - "movq %%rax,0x10(%0) \n\t" \ - "movq %%rdx,%1 \n\t" \ - \ - "movq %%r11,%%rax \n\t" \ - "movq 0x20(%5),%%r11 \n\t" \ - "mulq %4 \n\t" \ - "addq %%r10,%%rax \n\t" \ - "adcq $0,%%rdx \n\t" \ - "movq 0x20(%2),%%r10 \n\t" \ - "addq %3,%%rax \n\t" \ - "adcq $0,%%rdx \n\t" \ - "movq %%rax,0x18(%0) \n\t" \ - "movq %%rdx,%1 \n\t" \ - \ - "movq %%r11,%%rax \n\t" \ - "movq 0x28(%5),%%r11 \n\t" \ - "mulq %4 \n\t" \ - "addq %%r10,%%rax \n\t" \ - "adcq $0,%%rdx \n\t" \ - "movq 0x28(%2),%%r10 \n\t" \ - "addq %3,%%rax \n\t" \ - "adcq $0,%%rdx \n\t" \ - "movq %%rax,0x20(%0) \n\t" \ - "movq %%rdx,%1 \n\t" \ - \ - "movq %%r11,%%rax \n\t" \ - "movq 0x30(%5),%%r11 \n\t" \ - "mulq %4 \n\t" \ - "addq %%r10,%%rax \n\t" \ - "adcq $0,%%rdx \n\t" \ - "movq 0x30(%2),%%r10 \n\t" \ - "addq %3,%%rax \n\t" \ - "adcq $0,%%rdx \n\t" \ - "movq %%rax,0x28(%0) \n\t" \ - "movq %%rdx,%1 \n\t" \ - \ - "movq %%r11,%%rax \n\t" \ - "movq 0x38(%5),%%r11 \n\t" \ - "mulq %4 \n\t" \ - "addq %%r10,%%rax \n\t" \ - "adcq $0,%%rdx \n\t" \ - "movq 0x38(%2),%%r10 \n\t" \ - "addq %3,%%rax \n\t" \ - "adcq $0,%%rdx \n\t" \ - "movq %%rax,0x30(%0) \n\t" \ - "movq %%rdx,%1 \n\t" \ - \ - "movq %%r11,%%rax \n\t" \ - "mulq %4 \n\t" \ - "addq %%r10,%%rax \n\t" \ - "adcq $0,%%rdx \n\t" \ - "addq %3,%%rax \n\t" \ - "adcq $0,%%rdx \n\t" \ - "movq %%rax,0x38(%0) \n\t" \ - "movq %%rdx,%1 \n\t" \ - \ -:"=r"(_c), "=r"(cy) \ -: "0"(_c), "1"(cy), "g"(mu), "r"(tmpm)\ -: "%rax", "%rdx", "%r10", "%r11", "%cc") - - -#define PROPCARRY \ -asm( \ - "addq %1,%0 \n\t" \ - "setb %%al \n\t" \ - "movzbq %%al,%1 \n\t" \ -:"=g"(_c[LO]), "=r"(cy) \ -:"0"(_c[LO]), "1"(cy) \ -: "%rax", "%cc") - -/******************************************************************/ -#elif defined(TFM_SSE2) -/* SSE2 code (assumes 32-bit fp_digits) */ -/* XMM register assignments: - * xmm0 *tmpm++, then Mu * (*tmpm++) - * xmm1 c[x], then Mu - * xmm2 mp - * xmm3 cy - * xmm4 _c[LO] - */ - -#define MONT_START \ - asm("movd %0,%%mm2"::"g"(mp)) - -#define MONT_FINI \ - asm("emms") - -#define LOOP_START \ -asm( \ -"movd %0,%%mm1 \n\t" \ -"pxor %%mm3,%%mm3 \n\t" \ -"pmuludq %%mm2,%%mm1 \n\t" \ -:: "g"(c[x])) - -/* pmuludq on mmx registers does a 32x32->64 multiply. */ -#define INNERMUL \ -asm( \ - "movd %1,%%mm4 \n\t" \ - "movd %2,%%mm0 \n\t" \ - "paddq %%mm4,%%mm3 \n\t" \ - "pmuludq %%mm1,%%mm0 \n\t" \ - "paddq %%mm0,%%mm3 \n\t" \ - "movd %%mm3,%0 \n\t" \ - "psrlq $32, %%mm3 \n\t" \ -:"=g"(_c[LO]) : "0"(_c[LO]), "g"(*tmpm++) ); - -#define INNERMUL8 \ -asm( \ - "movd 0(%1),%%mm4 \n\t" \ - "movd 0(%2),%%mm0 \n\t" \ - "paddq %%mm4,%%mm3 \n\t" \ - "pmuludq %%mm1,%%mm0 \n\t" \ - "movd 4(%2),%%mm5 \n\t" \ - "paddq %%mm0,%%mm3 \n\t" \ - "movd 4(%1),%%mm6 \n\t" \ - "movd %%mm3,0(%0) \n\t" \ - "psrlq $32, %%mm3 \n\t" \ -\ - "paddq %%mm6,%%mm3 \n\t" \ - "pmuludq %%mm1,%%mm5 \n\t" \ - "movd 8(%2),%%mm6 \n\t" \ - "paddq %%mm5,%%mm3 \n\t" \ - "movd 8(%1),%%mm7 \n\t" \ - "movd %%mm3,4(%0) \n\t" \ - "psrlq $32, %%mm3 \n\t" \ -\ - "paddq %%mm7,%%mm3 \n\t" \ - "pmuludq %%mm1,%%mm6 \n\t" \ - "movd 12(%2),%%mm7 \n\t" \ - "paddq %%mm6,%%mm3 \n\t" \ - "movd 12(%1),%%mm5 \n\t" \ - "movd %%mm3,8(%0) \n\t" \ - "psrlq $32, %%mm3 \n\t" \ -\ - "paddq %%mm5,%%mm3 \n\t" \ - "pmuludq %%mm1,%%mm7 \n\t" \ - "movd 16(%2),%%mm5 \n\t" \ - "paddq %%mm7,%%mm3 \n\t" \ - "movd 16(%1),%%mm6 \n\t" \ - "movd %%mm3,12(%0) \n\t" \ - "psrlq $32, %%mm3 \n\t" \ -\ - "paddq %%mm6,%%mm3 \n\t" \ - "pmuludq %%mm1,%%mm5 \n\t" \ - "movd 20(%2),%%mm6 \n\t" \ - "paddq %%mm5,%%mm3 \n\t" \ - "movd 20(%1),%%mm7 \n\t" \ - "movd %%mm3,16(%0) \n\t" \ - "psrlq $32, %%mm3 \n\t" \ -\ - "paddq %%mm7,%%mm3 \n\t" \ - "pmuludq %%mm1,%%mm6 \n\t" \ - "movd 24(%2),%%mm7 \n\t" \ - "paddq %%mm6,%%mm3 \n\t" \ - "movd 24(%1),%%mm5 \n\t" \ - "movd %%mm3,20(%0) \n\t" \ - "psrlq $32, %%mm3 \n\t" \ -\ - "paddq %%mm5,%%mm3 \n\t" \ - "pmuludq %%mm1,%%mm7 \n\t" \ - "movd 28(%2),%%mm5 \n\t" \ - "paddq %%mm7,%%mm3 \n\t" \ - "movd 28(%1),%%mm6 \n\t" \ - "movd %%mm3,24(%0) \n\t" \ - "psrlq $32, %%mm3 \n\t" \ -\ - "paddq %%mm6,%%mm3 \n\t" \ - "pmuludq %%mm1,%%mm5 \n\t" \ - "paddq %%mm5,%%mm3 \n\t" \ - "movd %%mm3,28(%0) \n\t" \ - "psrlq $32, %%mm3 \n\t" \ -:"=r"(_c) : "0"(_c), "g"(tmpm) ); - -#define LOOP_END \ -asm( "movd %%mm3,%0 \n" :"=r"(cy)) - -#define PROPCARRY \ -asm( \ - "addl %1,%0 \n\t" \ - "setb %%al \n\t" \ - "movzbl %%al,%1 \n\t" \ -:"=g"(_c[LO]), "=r"(cy) \ -:"0"(_c[LO]), "1"(cy) \ -: "%eax", "%cc") - -/******************************************************************/ -#elif defined(TFM_ARM) - /* ARMv4 code */ - -#define MONT_START -#define MONT_FINI -#define LOOP_END -#define LOOP_START \ - mu = c[x] * mp - -#define INNERMUL \ -asm( \ - " LDR r0,%1 \n\t" \ - " ADDS r0,r0,%0 \n\t" \ - " MOVCS %0,#1 \n\t" \ - " MOVCC %0,#0 \n\t" \ - " UMLAL r0,%0,%3,%4 \n\t" \ - " STR r0,%1 \n\t" \ -:"=r"(cy),"=m"(_c[0]):"0"(cy),"r"(mu),"r"(*tmpm++),"1"(_c[0]):"r0","%cc"); - -#define PROPCARRY \ -asm( \ - " LDR r0,%1 \n\t" \ - " ADDS r0,r0,%0 \n\t" \ - " STR r0,%1 \n\t" \ - " MOVCS %0,#1 \n\t" \ - " MOVCC %0,#0 \n\t" \ -:"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"r0","%cc"); - -#elif defined(TFM_PPC32) - -/* PPC32 */ -#define MONT_START -#define MONT_FINI -#define LOOP_END -#define LOOP_START \ - mu = c[x] * mp - -#define INNERMUL \ -asm( \ - " mullw 16,%3,%4 \n\t" \ - " mulhwu 17,%3,%4 \n\t" \ - " addc 16,16,%0 \n\t" \ - " addze 17,17 \n\t" \ - " lwz 18,%1 \n\t" \ - " addc 16,16,18 \n\t" \ - " addze %0,17 \n\t" \ - " stw 16,%1 \n\t" \ -:"=r"(cy),"=m"(_c[0]):"0"(cy),"r"(mu),"r"(tmpm[0]),"1"(_c[0]):"16", "17", "18","%cc"); ++tmpm; - -#define PROPCARRY \ -asm( \ - " lwz 16,%1 \n\t" \ - " addc 16,16,%0 \n\t" \ - " stw 16,%1 \n\t" \ - " xor %0,%0,%0 \n\t" \ - " addze %0,%0 \n\t" \ -:"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"16","%cc"); - -#elif defined(TFM_PPC64) - -/* PPC64 */ -#define MONT_START -#define MONT_FINI -#define LOOP_END -#define LOOP_START \ - mu = c[x] * mp - -#define INNERMUL \ -asm( \ - " mulld 16,%3,%4 \n\t" \ - " mulhdu 17,%3,%4 \n\t" \ - " addc 16,16,%0 \n\t" \ - " addze 17,17 \n\t" \ - " ldx 18,0,%1 \n\t" \ - " addc 16,16,18 \n\t" \ - " addze %0,17 \n\t" \ - " sdx 16,0,%1 \n\t" \ -:"=r"(cy),"=m"(_c[0]):"0"(cy),"r"(mu),"r"(tmpm[0]),"1"(_c[0]):"16", "17", "18","%cc"); ++tmpm; - -#define PROPCARRY \ -asm( \ - " ldx 16,0,%1 \n\t" \ - " addc 16,16,%0 \n\t" \ - " sdx 16,0,%1 \n\t" \ - " xor %0,%0,%0 \n\t" \ - " addze %0,%0 \n\t" \ -:"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"16","%cc"); - -/******************************************************************/ - -#elif defined(TFM_AVR32) - -/* AVR32 */ -#define MONT_START -#define MONT_FINI -#define LOOP_END -#define LOOP_START \ - mu = c[x] * mp - -#define INNERMUL \ -asm( \ - " ld.w r2,%1 \n\t" \ - " add r2,%0 \n\t" \ - " eor r3,r3 \n\t" \ - " acr r3 \n\t" \ - " macu.d r2,%3,%4 \n\t" \ - " st.w %1,r2 \n\t" \ - " mov %0,r3 \n\t" \ -:"=r"(cy),"=r"(_c):"0"(cy),"r"(mu),"r"(*tmpm++),"1"(_c):"r2","r3"); - -#define PROPCARRY \ -asm( \ - " ld.w r2,%1 \n\t" \ - " add r2,%0 \n\t" \ - " st.w %1,r2 \n\t" \ - " eor %0,%0 \n\t" \ - " acr %0 \n\t" \ -:"=r"(cy),"=r"(&_c[0]):"0"(cy),"1"(&_c[0]):"r2","%cc"); - -#else - -/* ISO C code */ -#define MONT_START -#define MONT_FINI -#define LOOP_END -#define LOOP_START \ - mu = c[x] * mp - -#define INNERMUL \ - do { fp_word t; \ - _c[0] = t = ((fp_word)_c[0] + (fp_word)cy) + \ - (((fp_word)mu) * ((fp_word)*tmpm++)); \ - cy = (t >> DIGIT_BIT); \ - } while (0) - -#define PROPCARRY \ - do { fp_digit t = _c[0] += cy; cy = (t < cy); } while (0) - -#endif -/******************************************************************/ - - -#define LO 0 - -#ifdef TFM_SMALL_MONT_SET -#include "fp_mont_small.c" -#endif - -/* computes x/R == x (mod N) via Montgomery Reduction */ -void fp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp) -{ - fp_digit c[FP_SIZE], *_c, *tmpm, mu; - int oldused, x, y, pa; - - /* bail if too large */ - if (m->used > (FP_SIZE/2)) { - return; - } - -#ifdef TFM_SMALL_MONT_SET - if (m->used <= 16) { - fp_montgomery_reduce_small(a, m, mp); - return; - } -#endif - -#if defined(USE_MEMSET) - /* now zero the buff */ - memset(c, 0, sizeof c); -#endif - pa = m->used; - - /* copy the input */ - oldused = a->used; - for (x = 0; x < oldused; x++) { - c[x] = a->dp[x]; - } -#if !defined(USE_MEMSET) - for (; x < 2*pa+1; x++) { - c[x] = 0; - } -#endif - MONT_START; - - for (x = 0; x < pa; x++) { - fp_digit cy = 0; - /* get Mu for this round */ - LOOP_START; - _c = c + x; - tmpm = m->dp; - y = 0; - #if (defined(TFM_SSE2) || defined(TFM_X86_64)) - for (; y < (pa & ~7); y += 8) { - INNERMUL8; - _c += 8; - tmpm += 8; - } - #endif - - for (; y < pa; y++) { - INNERMUL; - ++_c; - } - LOOP_END; - while (cy) { - PROPCARRY; - ++_c; - } - } - - /* now copy out */ - _c = c + pa; - tmpm = a->dp; - for (x = 0; x < pa+1; x++) { - *tmpm++ = *_c++; - } - - for (; x < oldused; x++) { - *tmpm++ = 0; - } - - MONT_FINI; - - a->used = pa+1; - fp_clamp(a); - - /* if A >= m then A = A - m */ - if (fp_cmp_mag (a, m) != FP_LT) { - s_fp_sub (a, m, a); - } -} - - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_montgomery_reduce.c */ - -/* Start: fp_montgomery_setup.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* setups the montgomery reduction */ -int fp_montgomery_setup(fp_int *a, fp_digit *rho) -{ - fp_digit x, b; - -/* fast inversion mod 2**k - * - * Based on the fact that - * - * XA = 1 (mod 2**n) => (X(2-XA)) A = 1 (mod 2**2n) - * => 2*X*A - X*X*A*A = 1 - * => 2*(1) - (1) = 1 - */ - b = a->dp[0]; - - if ((b & 1) == 0) { - return FP_VAL; - } - - x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */ - x *= 2 - b * x; /* here x*a==1 mod 2**8 */ - x *= 2 - b * x; /* here x*a==1 mod 2**16 */ - x *= 2 - b * x; /* here x*a==1 mod 2**32 */ -#ifdef FP_64BIT - x *= 2 - b * x; /* here x*a==1 mod 2**64 */ -#endif - - /* rho = -1/m mod b */ - *rho = (((fp_word) 1 << ((fp_word) DIGIT_BIT)) - ((fp_word)x)); - - return FP_OKAY; -} - - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_montgomery_setup.c */ - -/* Start: fp_mul.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* c = a * b */ -void fp_mul(fp_int *A, fp_int *B, fp_int *C) -{ - int y, yy; - - /* call generic if we're out of range */ - if (A->used + B->used > FP_SIZE) { - fp_mul_comba(A, B, C); - return ; - } - - y = MAX(A->used, B->used); - yy = MIN(A->used, B->used); - /* pick a comba (unrolled 4/8/16/32 x or rolled) based on the size - of the largest input. We also want to avoid doing excess mults if the - inputs are not close to the next power of two. That is, for example, - if say y=17 then we would do (32-17)^2 = 225 unneeded multiplications - */ - -#ifdef TFM_MUL3 - if (y <= 3) { - fp_mul_comba3(A,B,C); - return; - } -#endif -#ifdef TFM_MUL4 - if (y == 4) { - fp_mul_comba4(A,B,C); - return; - } -#endif -#ifdef TFM_MUL6 - if (y <= 6) { - fp_mul_comba6(A,B,C); - return; - } -#endif -#ifdef TFM_MUL7 - if (y == 7) { - fp_mul_comba7(A,B,C); - return; - } -#endif -#ifdef TFM_MUL8 - if (y == 8) { - fp_mul_comba8(A,B,C); - return; - } -#endif -#ifdef TFM_MUL9 - if (y == 9) { - fp_mul_comba9(A,B,C); - return; - } -#endif -#ifdef TFM_MUL12 - if (y <= 12) { - fp_mul_comba12(A,B,C); - return; - } -#endif -#ifdef TFM_MUL17 - if (y <= 17) { - fp_mul_comba17(A,B,C); - return; - } -#endif - -#ifdef TFM_SMALL_SET - if (y <= 16) { - fp_mul_comba_small(A,B,C); - return; - } -#endif -#if defined(TFM_MUL20) - if (y <= 20) { - fp_mul_comba20(A,B,C); - return; - } -#endif -#if defined(TFM_MUL24) - if (yy >= 16 && y <= 24) { - fp_mul_comba24(A,B,C); - return; - } -#endif -#if defined(TFM_MUL28) - if (yy >= 20 && y <= 28) { - fp_mul_comba28(A,B,C); - return; - } -#endif -#if defined(TFM_MUL32) - if (yy >= 24 && y <= 32) { - fp_mul_comba32(A,B,C); - return; - } -#endif -#if defined(TFM_MUL48) - if (yy >= 40 && y <= 48) { - fp_mul_comba48(A,B,C); - return; - } -#endif -#if defined(TFM_MUL64) - if (yy >= 56 && y <= 64) { - fp_mul_comba64(A,B,C); - return; - } -#endif - fp_mul_comba(A,B,C); -} - - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_mul.c */ - -/* Start: fp_mul_2.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -void fp_mul_2(fp_int * a, fp_int * b) -{ - int x, oldused; - - oldused = b->used; - b->used = a->used; - - { - register fp_digit r, rr, *tmpa, *tmpb; - - /* alias for source */ - tmpa = a->dp; - - /* alias for dest */ - tmpb = b->dp; - - /* carry */ - r = 0; - for (x = 0; x < a->used; x++) { - - /* get what will be the *next* carry bit from the - * MSB of the current digit - */ - rr = *tmpa >> ((fp_digit)(DIGIT_BIT - 1)); - - /* now shift up this digit, add in the carry [from the previous] */ - *tmpb++ = ((*tmpa++ << ((fp_digit)1)) | r); - - /* copy the carry that would be from the source - * digit into the next iteration - */ - r = rr; - } - - /* new leading digit? */ - if (r != 0 && b->used != (FP_SIZE-1)) { - /* add a MSB which is always 1 at this point */ - *tmpb = 1; - ++(b->used); - } - - /* now zero any excess digits on the destination - * that we didn't write to - */ - tmpb = b->dp + b->used; - for (x = b->used; x < oldused; x++) { - *tmpb++ = 0; - } - } - b->sign = a->sign; -} - - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_mul_2.c */ - -/* Start: fp_mul_2d.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* c = a * 2**d */ -void fp_mul_2d(fp_int *a, int b, fp_int *c) -{ - fp_digit carry, carrytmp, shift; - int x; - - /* copy it */ - fp_copy(a, c); - - /* handle whole digits */ - if (b >= DIGIT_BIT) { - fp_lshd(c, b/DIGIT_BIT); - } - b %= DIGIT_BIT; - - /* shift the digits */ - if (b != 0) { - carry = 0; - shift = DIGIT_BIT - b; - for (x = 0; x < c->used; x++) { - carrytmp = c->dp[x] >> shift; - c->dp[x] = (c->dp[x] << b) + carry; - carry = carrytmp; - } - /* store last carry if room */ - if (carry && x < FP_SIZE) { - c->dp[c->used++] = carry; - } - } - fp_clamp(c); -} - - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_mul_2d.c */ - -/* Start: fp_mul_comba.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ - -/* About this file... - -*/ - -#include - -#if defined(TFM_PRESCOTT) && defined(TFM_SSE2) - #undef TFM_SSE2 - #define TFM_X86 -#endif - -/* these are the combas. Worship them. */ -#if defined(TFM_X86) -/* Generic x86 optimized code */ - -/* anything you need at the start */ -#define COMBA_START - -/* clear the chaining variables */ -#define COMBA_CLEAR \ - c0 = c1 = c2 = 0; - -/* forward the carry to the next digit */ -#define COMBA_FORWARD \ - do { c0 = c1; c1 = c2; c2 = 0; } while (0); - -/* store the first sum */ -#define COMBA_STORE(x) \ - x = c0; - -/* store the second sum [carry] */ -#define COMBA_STORE2(x) \ - x = c1; - -/* anything you need at the end */ -#define COMBA_FINI - -/* this should multiply i and j */ -#define MULADD(i, j) \ -asm( \ - "movl %6,%%eax \n\t" \ - "mull %7 \n\t" \ - "addl %%eax,%0 \n\t" \ - "adcl %%edx,%1 \n\t" \ - "adcl $0,%2 \n\t" \ - :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j) :"%eax","%edx","%cc"); - -#elif defined(TFM_X86_64) -/* x86-64 optimized */ - -/* anything you need at the start */ -#define COMBA_START - -/* clear the chaining variables */ -#define COMBA_CLEAR \ - c0 = c1 = c2 = 0; - -/* forward the carry to the next digit */ -#define COMBA_FORWARD \ - do { c0 = c1; c1 = c2; c2 = 0; } while (0); - -/* store the first sum */ -#define COMBA_STORE(x) \ - x = c0; - -/* store the second sum [carry] */ -#define COMBA_STORE2(x) \ - x = c1; - -/* anything you need at the end */ -#define COMBA_FINI - -/* this should multiply i and j */ -#define MULADD(i, j) \ -asm ( \ - "movq %6,%%rax \n\t" \ - "mulq %7 \n\t" \ - "addq %%rax,%0 \n\t" \ - "adcq %%rdx,%1 \n\t" \ - "adcq $0,%2 \n\t" \ - :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j) :"%rax","%rdx","%cc"); - -#elif defined(TFM_SSE2) -/* use SSE2 optimizations */ - -/* anything you need at the start */ -#define COMBA_START - -/* clear the chaining variables */ -#define COMBA_CLEAR \ - c0 = c1 = c2 = 0; - -/* forward the carry to the next digit */ -#define COMBA_FORWARD \ - do { c0 = c1; c1 = c2; c2 = 0; } while (0); - -/* store the first sum */ -#define COMBA_STORE(x) \ - x = c0; - -/* store the second sum [carry] */ -#define COMBA_STORE2(x) \ - x = c1; - -/* anything you need at the end */ -#define COMBA_FINI \ - asm("emms"); - -/* this should multiply i and j */ -#define MULADD(i, j) \ -asm( \ - "movd %6,%%mm0 \n\t" \ - "movd %7,%%mm1 \n\t" \ - "pmuludq %%mm1,%%mm0\n\t" \ - "movd %%mm0,%%eax \n\t" \ - "psrlq $32,%%mm0 \n\t" \ - "addl %%eax,%0 \n\t" \ - "movd %%mm0,%%eax \n\t" \ - "adcl %%eax,%1 \n\t" \ - "adcl $0,%2 \n\t" \ - :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j) :"%eax","%cc"); - -#elif defined(TFM_ARM) -/* ARM code */ - -#define COMBA_START - -#define COMBA_CLEAR \ - c0 = c1 = c2 = 0; - -#define COMBA_FORWARD \ - do { c0 = c1; c1 = c2; c2 = 0; } while (0); - -#define COMBA_STORE(x) \ - x = c0; - -#define COMBA_STORE2(x) \ - x = c1; - -#define COMBA_FINI - -#define MULADD(i, j) \ -asm( \ -" UMULL r0,r1,%6,%7 \n\t" \ -" ADDS %0,%0,r0 \n\t" \ -" ADCS %1,%1,r1 \n\t" \ -" ADC %2,%2,#0 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j) : "r0", "r1", "%cc"); - -#elif defined(TFM_PPC32) -/* For 32-bit PPC */ - -#define COMBA_START - -#define COMBA_CLEAR \ - c0 = c1 = c2 = 0; - -#define COMBA_FORWARD \ - do { c0 = c1; c1 = c2; c2 = 0; } while (0); - -#define COMBA_STORE(x) \ - x = c0; - -#define COMBA_STORE2(x) \ - x = c1; - -#define COMBA_FINI - -/* untested: will mulhwu change the flags? Docs say no */ -#define MULADD(i, j) \ -asm( \ - " mullw 16,%6,%7 \n\t" \ - " addc %0,%0,16 \n\t" \ - " mulhwu 16,%6,%7 \n\t" \ - " adde %1,%1,16 \n\t" \ - " addze %2,%2 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"16"); - -#elif defined(TFM_PPC64) -/* For 64-bit PPC */ - -#define COMBA_START - -#define COMBA_CLEAR \ - c0 = c1 = c2 = 0; - -#define COMBA_FORWARD \ - do { c0 = c1; c1 = c2; c2 = 0; } while (0); - -#define COMBA_STORE(x) \ - x = c0; - -#define COMBA_STORE2(x) \ - x = c1; - -#define COMBA_FINI - -/* untested: will mulhwu change the flags? Docs say no */ -#define MULADD(i, j) \ -asm( \ - " mulld 16,%6,%7 \n\t" \ - " addc %0,%0,16 \n\t" \ - " mulhdu 16,%6,%7 \n\t" \ - " adde %1,%1,16 \n\t" \ - " addze %2,%2 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"16"); - -#elif defined(TFM_AVR32) - -/* ISO C code */ - -#define COMBA_START - -#define COMBA_CLEAR \ - c0 = c1 = c2 = 0; - -#define COMBA_FORWARD \ - do { c0 = c1; c1 = c2; c2 = 0; } while (0); - -#define COMBA_STORE(x) \ - x = c0; - -#define COMBA_STORE2(x) \ - x = c1; - -#define COMBA_FINI - -#define MULADD(i, j) \ -asm( \ - " mulu.d r2,%6,%7 \n\t"\ - " add %0,r2 \n\t"\ - " adc %1,%1,r3 \n\t"\ - " acr %2 \n\t"\ -:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"r2","r3"); - -#else -/* ISO C code */ - -#define COMBA_START - -#define COMBA_CLEAR \ - c0 = c1 = c2 = 0; - -#define COMBA_FORWARD \ - do { c0 = c1; c1 = c2; c2 = 0; } while (0); - -#define COMBA_STORE(x) \ - x = c0; - -#define COMBA_STORE2(x) \ - x = c1; - -#define COMBA_FINI - -#define MULADD(i, j) \ - do { fp_word t; \ - t = (fp_word)c0 + ((fp_word)i) * ((fp_word)j); c0 = t; \ - t = (fp_word)c1 + (t >> DIGIT_BIT); c1 = t; c2 += t >> DIGIT_BIT; \ - } while (0); - -#endif - - -/* generic PxQ multiplier */ -void fp_mul_comba(fp_int *A, fp_int *B, fp_int *C) -{ - int ix, iy, iz, tx, ty, pa; - fp_digit c0, c1, c2, *tmpx, *tmpy; - fp_int tmp, *dst; - - COMBA_START; - COMBA_CLEAR; - - /* get size of output and trim */ - pa = A->used + B->used; - if (pa >= FP_SIZE) { - pa = FP_SIZE-1; - } - - if (A == C || B == C) { - fp_zero(&tmp); - dst = &tmp; - } else { - fp_zero(C); - dst = C; - } - - for (ix = 0; ix < pa; ix++) { - /* get offsets into the two bignums */ - ty = MIN(ix, B->used-1); - tx = ix - ty; - - /* setup temp aliases */ - tmpx = A->dp + tx; - tmpy = B->dp + ty; - - /* this is the number of times the loop will iterrate, essentially its - while (tx++ < a->used && ty-- >= 0) { ... } - */ - iy = MIN(A->used-tx, ty+1); - - /* execute loop */ - COMBA_FORWARD; - for (iz = 0; iz < iy; ++iz) { - MULADD(*tmpx++, *tmpy--); - } - - /* store term */ - COMBA_STORE(dst->dp[ix]); - } - COMBA_FINI; - - dst->used = pa; - dst->sign = A->sign ^ B->sign; - fp_clamp(dst); - fp_copy(dst, C); -} - -#include "fp_mul_comba_small_set.i" -#include "fp_mul_comba_3.i" -#include "fp_mul_comba_4.i" -#include "fp_mul_comba_6.i" -#include "fp_mul_comba_7.i" -#include "fp_mul_comba_8.i" -#include "fp_mul_comba_9.i" -#include "fp_mul_comba_12.i" -#include "fp_mul_comba_17.i" -#include "fp_mul_comba_20.i" -#include "fp_mul_comba_24.i" -#include "fp_mul_comba_28.i" -#include "fp_mul_comba_32.i" -#include "fp_mul_comba_48.i" -#include "fp_mul_comba_64.i" - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - - -/* End: fp_mul_comba.c */ - -/* Start: fp_mul_d.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* c = a * b */ -void fp_mul_d(fp_int *a, fp_digit b, fp_int *c) -{ - fp_word w; - int x, oldused; - - oldused = c->used; - c->used = a->used; - c->sign = a->sign; - w = 0; - for (x = 0; x < a->used; x++) { - w = ((fp_word)a->dp[x]) * ((fp_word)b) + w; - c->dp[x] = (fp_digit)w; - w = w >> DIGIT_BIT; - } - if (w != 0 && (a->used != FP_SIZE)) { - c->dp[c->used++] = w; - ++x; - } - for (; x < oldused; x++) { - c->dp[x] = 0; - } - fp_clamp(c); -} - - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_mul_d.c */ - -/* Start: fp_mulmod.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include -/* d = a * b (mod c) */ -int fp_mulmod(fp_int *a, fp_int *b, fp_int *c, fp_int *d) -{ - fp_int tmp; - fp_zero(&tmp); - fp_mul(a, b, &tmp); - return fp_mod(&tmp, c, d); -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_mulmod.c */ - -/* Start: fp_prime_miller_rabin.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* Miller-Rabin test of "a" to the base of "b" as described in - * HAC pp. 139 Algorithm 4.24 - * - * Sets result to 0 if definitely composite or 1 if probably prime. - * Randomly the chance of error is no more than 1/4 and often - * very much lower. - */ -void fp_prime_miller_rabin (fp_int * a, fp_int * b, int *result) -{ - fp_int n1, y, r; - int s, j; - - /* default */ - *result = FP_NO; - - /* ensure b > 1 */ - if (fp_cmp_d(b, 1) != FP_GT) { - return; - } - - /* get n1 = a - 1 */ - fp_init_copy(&n1, a); - fp_sub_d(&n1, 1, &n1); - - /* set 2**s * r = n1 */ - fp_init_copy(&r, &n1); - - /* count the number of least significant bits - * which are zero - */ - s = fp_cnt_lsb(&r); - - /* now divide n - 1 by 2**s */ - fp_div_2d (&r, s, &r, NULL); - - /* compute y = b**r mod a */ - fp_init(&y); - fp_exptmod(b, &r, a, &y); - - /* if y != 1 and y != n1 do */ - if (fp_cmp_d (&y, 1) != FP_EQ && fp_cmp (&y, &n1) != FP_EQ) { - j = 1; - /* while j <= s-1 and y != n1 */ - while ((j <= (s - 1)) && fp_cmp (&y, &n1) != FP_EQ) { - fp_sqrmod (&y, a, &y); - - /* if y == 1 then composite */ - if (fp_cmp_d (&y, 1) == FP_EQ) { - return; - } - ++j; - } - - /* if y != n1 then composite */ - if (fp_cmp (&y, &n1) != FP_EQ) { - return; - } - } - - /* probably prime now */ - *result = FP_YES; -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_prime_miller_rabin.c */ - -/* Start: fp_prime_random_ex.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* This is possibly the mother of all prime generation functions, muahahahahaha! */ -int fp_prime_random_ex(fp_int *a, int t, int size, int flags, tfm_prime_callback cb, void *dat) -{ - unsigned char *tmp, maskAND, maskOR_msb, maskOR_lsb; - int res, err, bsize, maskOR_msb_offset; - - /* sanity check the input */ - if (size <= 1 || t <= 0) { - return FP_VAL; - } - - /* TFM_PRIME_SAFE implies TFM_PRIME_BBS */ - if (flags & TFM_PRIME_SAFE) { - flags |= TFM_PRIME_BBS; - } - - /* calc the byte size */ - bsize = (size>>3)+(size&7?1:0); - - /* we need a buffer of bsize bytes */ - tmp = malloc(bsize); - if (tmp == NULL) { - return FP_MEM; - } - - /* calc the maskAND value for the MSbyte*/ - maskAND = 0xFF >> (8 - (size & 7)); - - /* calc the maskOR_msb */ - maskOR_msb = 0; - maskOR_msb_offset = (size - 2) >> 3; - if (flags & TFM_PRIME_2MSB_ON) { - maskOR_msb |= 1 << ((size - 2) & 7); - } else if (flags & TFM_PRIME_2MSB_OFF) { - maskAND &= ~(1 << ((size - 2) & 7)); - } - - /* get the maskOR_lsb */ - maskOR_lsb = 1; - if (flags & TFM_PRIME_BBS) { - maskOR_lsb |= 3; - } - - do { - /* read the bytes */ - if (cb(tmp, bsize, dat) != bsize) { - err = FP_VAL; - goto error; - } - - /* work over the MSbyte */ - tmp[0] &= maskAND; - tmp[0] |= 1 << ((size - 1) & 7); - - /* mix in the maskORs */ - tmp[maskOR_msb_offset] |= maskOR_msb; - tmp[bsize-1] |= maskOR_lsb; - - /* read it in */ - fp_read_unsigned_bin(a, tmp, bsize); - - /* is it prime? */ - res = fp_isprime(a); - if (res == FP_NO) continue; - - if (flags & TFM_PRIME_SAFE) { - /* see if (a-1)/2 is prime */ - fp_sub_d(a, 1, a); - fp_div_2(a, a); - - /* is it prime? */ - res = fp_isprime(a); - } - } while (res == FP_NO); - - if (flags & TFM_PRIME_SAFE) { - /* restore a to the original value */ - fp_mul_2(a, a); - fp_add_d(a, 1, a); - } - - err = FP_OKAY; -error: - free(tmp); - return err; -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_prime_random_ex.c */ - -/* Start: fp_radix_size.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -int fp_radix_size(fp_int *a, int radix, int *size) -{ - int digs; - fp_int t; - fp_digit d; - - *size = 0; - - /* check range of the radix */ - if (radix < 2 || radix > 64) { - return FP_VAL; - } - - /* quick out if its zero */ - if (fp_iszero(a) == 1) { - *size = 2; - return FP_OKAY; - } - - fp_init_copy(&t, a); - - /* if it is negative output a - */ - if (t.sign == FP_NEG) { - (*size)++; - t.sign = FP_ZPOS; - } - - digs = 0; - while (fp_iszero (&t) == FP_NO) { - fp_div_d (&t, (fp_digit) radix, &t, &d); - (*size)++; - } - - /* append a NULL so the string is properly terminated */ - (*size)++; - return FP_OKAY; - -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_radix_size.c */ - -/* Start: fp_read_radix.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -int fp_read_radix(fp_int *a, char *str, int radix) -{ - int y, neg; - char ch; - - /* make sure the radix is ok */ - if (radix < 2 || radix > 64) { - return FP_VAL; - } - - /* if the leading digit is a - * minus set the sign to negative. - */ - if (*str == '-') { - ++str; - neg = FP_NEG; - } else { - neg = FP_ZPOS; - } - - /* set the integer to the default of zero */ - fp_zero (a); - - /* process each digit of the string */ - while (*str) { - /* if the radix < 36 the conversion is case insensitive - * this allows numbers like 1AB and 1ab to represent the same value - * [e.g. in hex] - */ - ch = (char) ((radix < 36) ? toupper (*str) : *str); - for (y = 0; y < 64; y++) { - if (ch == fp_s_rmap[y]) { - break; - } - } - - /* if the char was found in the map - * and is less than the given radix add it - * to the number, otherwise exit the loop. - */ - if (y < radix) { - fp_mul_d (a, (fp_digit) radix, a); - fp_add_d (a, (fp_digit) y, a); - } else { - break; - } - ++str; - } - - /* set the sign only if a != 0 */ - if (fp_iszero(a) != FP_YES) { - a->sign = neg; - } - return FP_OKAY; -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_read_radix.c */ - -/* Start: fp_read_signed_bin.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -void fp_read_signed_bin(fp_int *a, unsigned char *b, int c) -{ - /* read magnitude */ - fp_read_unsigned_bin (a, b + 1, c - 1); - - /* first byte is 0 for positive, non-zero for negative */ - if (b[0] == 0) { - a->sign = FP_ZPOS; - } else { - a->sign = FP_NEG; - } -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_read_signed_bin.c */ - -/* Start: fp_read_unsigned_bin.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -void fp_read_unsigned_bin(fp_int *a, unsigned char *b, int c) -{ - /* zero the int */ - fp_zero (a); - - /* read the bytes in */ - for (; c > 0; c--) { - fp_mul_2d (a, 8, a); - a->dp[0] |= *b++; - a->used += 1; - } - fp_clamp (a); -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_read_unsigned_bin.c */ - -/* Start: fp_reverse.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* reverse an array, used for radix code */ -void bn_reverse (unsigned char *s, int len) -{ - int ix, iy; - unsigned char t; - - ix = 0; - iy = len - 1; - while (ix < iy) { - t = s[ix]; - s[ix] = s[iy]; - s[iy] = t; - ++ix; - --iy; - } -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_reverse.c */ - -/* Start: fp_rshd.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -void fp_rshd(fp_int *a, int x) -{ - int y; - - /* too many digits just zero and return */ - if (x >= a->used) { - fp_zero(a); - return; - } - - /* shift */ - for (y = 0; y < a->used - x; y++) { - a->dp[y] = a->dp[y+x]; - } - - /* zero rest */ - for (; y < a->used; y++) { - a->dp[y] = 0; - } - - /* decrement count */ - a->used -= x; - fp_clamp(a); -} - - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_rshd.c */ - -/* Start: fp_s_rmap.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* chars used in radix conversions */ -const char *fp_s_rmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_s_rmap.c */ - -/* Start: fp_set.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -void fp_set(fp_int *a, fp_digit b) -{ - fp_zero(a); - a->dp[0] = b; - a->used = a->dp[0] ? 1 : 0; -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_set.c */ - -/* Start: fp_signed_bin_size.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -int fp_signed_bin_size(fp_int *a) -{ - return 1 + fp_unsigned_bin_size (a); -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_signed_bin_size.c */ - -/* Start: fp_sqr.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* b = a*a */ -void fp_sqr(fp_int *A, fp_int *B) -{ - int y; - - /* call generic if we're out of range */ - if (A->used + A->used > FP_SIZE) { - fp_sqr_comba(A, B); - return ; - } - - y = A->used; -#if defined(TFM_SQR3) - if (y <= 3) { - fp_sqr_comba3(A,B); - return; - } -#endif -#if defined(TFM_SQR4) - if (y == 4) { - fp_sqr_comba4(A,B); - return; - } -#endif -#if defined(TFM_SQR6) - if (y <= 6) { - fp_sqr_comba6(A,B); - return; - } -#endif -#if defined(TFM_SQR7) - if (y == 7) { - fp_sqr_comba7(A,B); - return; - } -#endif -#if defined(TFM_SQR8) - if (y == 8) { - fp_sqr_comba8(A,B); - return; - } -#endif -#if defined(TFM_SQR9) - if (y == 9) { - fp_sqr_comba9(A,B); - return; - } -#endif -#if defined(TFM_SQR12) - if (y <= 12) { - fp_sqr_comba12(A,B); - return; - } -#endif -#if defined(TFM_SQR17) - if (y <= 17) { - fp_sqr_comba17(A,B); - return; - } -#endif -#if defined(TFM_SMALL_SET) - if (y <= 16) { - fp_sqr_comba_small(A,B); - return; - } -#endif -#if defined(TFM_SQR20) - if (y <= 20) { - fp_sqr_comba20(A,B); - return; - } -#endif -#if defined(TFM_SQR24) - if (y <= 24) { - fp_sqr_comba24(A,B); - return; - } -#endif -#if defined(TFM_SQR28) - if (y <= 28) { - fp_sqr_comba28(A,B); - return; - } -#endif -#if defined(TFM_SQR32) - if (y <= 32) { - fp_sqr_comba32(A,B); - return; - } -#endif -#if defined(TFM_SQR48) - if (y <= 48) { - fp_sqr_comba48(A,B); - return; - } -#endif -#if defined(TFM_SQR64) - if (y <= 64) { - fp_sqr_comba64(A,B); - return; - } -#endif - fp_sqr_comba(A, B); -} - - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_sqr.c */ - -/* Start: fp_sqr_comba.c */ -/* - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -#if defined(TFM_PRESCOTT) && defined(TFM_SSE2) - #undef TFM_SSE2 - #define TFM_X86 -#endif - - -#if defined(TFM_X86) - -/* x86-32 optimized */ - -#define COMBA_START - -#define CLEAR_CARRY \ - c0 = c1 = c2 = 0; - -#define COMBA_STORE(x) \ - x = c0; - -#define COMBA_STORE2(x) \ - x = c1; - -#define CARRY_FORWARD \ - do { c0 = c1; c1 = c2; c2 = 0; } while (0); - -#define COMBA_FINI - -#define SQRADD(i, j) \ -asm( \ - "movl %6,%%eax \n\t" \ - "mull %%eax \n\t" \ - "addl %%eax,%0 \n\t" \ - "adcl %%edx,%1 \n\t" \ - "adcl $0,%2 \n\t" \ - :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i) :"%eax","%edx","%cc"); - -#define SQRADD2(i, j) \ -asm( \ - "movl %6,%%eax \n\t" \ - "mull %7 \n\t" \ - "addl %%eax,%0 \n\t" \ - "adcl %%edx,%1 \n\t" \ - "adcl $0,%2 \n\t" \ - "addl %%eax,%0 \n\t" \ - "adcl %%edx,%1 \n\t" \ - "adcl $0,%2 \n\t" \ - :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j) :"%eax","%edx","%cc"); - -#define SQRADDSC(i, j) \ -asm( \ - "movl %6,%%eax \n\t" \ - "mull %7 \n\t" \ - "movl %%eax,%0 \n\t" \ - "movl %%edx,%1 \n\t" \ - "xorl %2,%2 \n\t" \ - :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%eax","%edx","%cc"); - -#define SQRADDAC(i, j) \ -asm( \ - "movl %6,%%eax \n\t" \ - "mull %7 \n\t" \ - "addl %%eax,%0 \n\t" \ - "adcl %%edx,%1 \n\t" \ - "adcl $0,%2 \n\t" \ - :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%eax","%edx","%cc"); - -#define SQRADDDB \ -asm( \ - "addl %6,%0 \n\t" \ - "adcl %7,%1 \n\t" \ - "adcl %8,%2 \n\t" \ - "addl %6,%0 \n\t" \ - "adcl %7,%1 \n\t" \ - "adcl %8,%2 \n\t" \ - :"=r"(c0), "=r"(c1), "=r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(sc0), "r"(sc1), "r"(sc2) : "%cc"); - -#elif defined(TFM_X86_64) -/* x86-64 optimized */ - -#define COMBA_START - -#define CLEAR_CARRY \ - c0 = c1 = c2 = 0; - -#define COMBA_STORE(x) \ - x = c0; - -#define COMBA_STORE2(x) \ - x = c1; - -#define CARRY_FORWARD \ - do { c0 = c1; c1 = c2; c2 = 0; } while (0); - -#define COMBA_FINI - -#define SQRADD(i, j) \ -asm( \ - "movq %6,%%rax \n\t" \ - "mulq %%rax \n\t" \ - "addq %%rax,%0 \n\t" \ - "adcq %%rdx,%1 \n\t" \ - "adcq $0,%2 \n\t" \ - :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i) :"%rax","%rdx","%cc"); - -#define SQRADD2(i, j) \ -asm( \ - "movq %6,%%rax \n\t" \ - "mulq %7 \n\t" \ - "addq %%rax,%0 \n\t" \ - "adcq %%rdx,%1 \n\t" \ - "adcq $0,%2 \n\t" \ - "addq %%rax,%0 \n\t" \ - "adcq %%rdx,%1 \n\t" \ - "adcq $0,%2 \n\t" \ - :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j) :"%rax","%rdx","%cc"); - -#define SQRADDSC(i, j) \ -asm( \ - "movq %6,%%rax \n\t" \ - "mulq %7 \n\t" \ - "movq %%rax,%0 \n\t" \ - "movq %%rdx,%1 \n\t" \ - "xorq %2,%2 \n\t" \ - :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%rax","%rdx","%cc"); - -#define SQRADDAC(i, j) \ -asm( \ - "movq %6,%%rax \n\t" \ - "mulq %7 \n\t" \ - "addq %%rax,%0 \n\t" \ - "adcq %%rdx,%1 \n\t" \ - "adcq $0,%2 \n\t" \ - :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%rax","%rdx","%cc"); - -#define SQRADDDB \ -asm( \ - "addq %6,%0 \n\t" \ - "adcq %7,%1 \n\t" \ - "adcq %8,%2 \n\t" \ - "addq %6,%0 \n\t" \ - "adcq %7,%1 \n\t" \ - "adcq %8,%2 \n\t" \ - :"=r"(c0), "=r"(c1), "=r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(sc0), "r"(sc1), "r"(sc2) : "%cc"); - -#elif defined(TFM_SSE2) - -/* SSE2 Optimized */ -#define COMBA_START - -#define CLEAR_CARRY \ - c0 = c1 = c2 = 0; - -#define COMBA_STORE(x) \ - x = c0; - -#define COMBA_STORE2(x) \ - x = c1; - -#define CARRY_FORWARD \ - do { c0 = c1; c1 = c2; c2 = 0; } while (0); - -#define COMBA_FINI \ - asm("emms"); - -#define SQRADD(i, j) \ -asm( \ - "movd %6,%%mm0 \n\t" \ - "pmuludq %%mm0,%%mm0\n\t" \ - "movd %%mm0,%%eax \n\t" \ - "psrlq $32,%%mm0 \n\t" \ - "addl %%eax,%0 \n\t" \ - "movd %%mm0,%%eax \n\t" \ - "adcl %%eax,%1 \n\t" \ - "adcl $0,%2 \n\t" \ - :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i) :"%eax","%cc"); - -#define SQRADD2(i, j) \ -asm( \ - "movd %6,%%mm0 \n\t" \ - "movd %7,%%mm1 \n\t" \ - "pmuludq %%mm1,%%mm0\n\t" \ - "movd %%mm0,%%eax \n\t" \ - "psrlq $32,%%mm0 \n\t" \ - "movd %%mm0,%%edx \n\t" \ - "addl %%eax,%0 \n\t" \ - "adcl %%edx,%1 \n\t" \ - "adcl $0,%2 \n\t" \ - "addl %%eax,%0 \n\t" \ - "adcl %%edx,%1 \n\t" \ - "adcl $0,%2 \n\t" \ - :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j) :"%eax","%edx","%cc"); - -#define SQRADDSC(i, j) \ -asm( \ - "movd %6,%%mm0 \n\t" \ - "movd %7,%%mm1 \n\t" \ - "pmuludq %%mm1,%%mm0\n\t" \ - "movd %%mm0,%0 \n\t" \ - "psrlq $32,%%mm0 \n\t" \ - "movd %%mm0,%1 \n\t" \ - "xorl %2,%2 \n\t" \ - :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "m"(i), "m"(j)); - -#define SQRADDAC(i, j) \ -asm( \ - "movd %6,%%mm0 \n\t" \ - "movd %7,%%mm1 \n\t" \ - "pmuludq %%mm1,%%mm0\n\t" \ - "movd %%mm0,%%eax \n\t" \ - "psrlq $32,%%mm0 \n\t" \ - "movd %%mm0,%%edx \n\t" \ - "addl %%eax,%0 \n\t" \ - "adcl %%edx,%1 \n\t" \ - "adcl $0,%2 \n\t" \ - :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "m"(i), "m"(j) :"%eax","%edx","%cc"); - -#define SQRADDDB \ -asm( \ - "addl %6,%0 \n\t" \ - "adcl %7,%1 \n\t" \ - "adcl %8,%2 \n\t" \ - "addl %6,%0 \n\t" \ - "adcl %7,%1 \n\t" \ - "adcl %8,%2 \n\t" \ - :"=r"(c0), "=r"(c1), "=r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(sc0), "r"(sc1), "r"(sc2) : "%cc"); - -#elif defined(TFM_ARM) - -/* ARM code */ - -#define COMBA_START - -#define CLEAR_CARRY \ - c0 = c1 = c2 = 0; - -#define COMBA_STORE(x) \ - x = c0; - -#define COMBA_STORE2(x) \ - x = c1; - -#define CARRY_FORWARD \ - do { c0 = c1; c1 = c2; c2 = 0; } while (0); - -#define COMBA_FINI - -/* multiplies point i and j, updates carry "c1" and digit c2 */ -#define SQRADD(i, j) \ -asm( \ -" UMULL r0,r1,%6,%6 \n\t" \ -" ADDS %0,%0,r0 \n\t" \ -" ADCS %1,%1,r1 \n\t" \ -" ADC %2,%2,#0 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(i) : "r0", "r1", "%cc"); - -/* for squaring some of the terms are doubled... */ -#define SQRADD2(i, j) \ -asm( \ -" UMULL r0,r1,%6,%7 \n\t" \ -" ADDS %0,%0,r0 \n\t" \ -" ADCS %1,%1,r1 \n\t" \ -" ADC %2,%2,#0 \n\t" \ -" ADDS %0,%0,r0 \n\t" \ -" ADCS %1,%1,r1 \n\t" \ -" ADC %2,%2,#0 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j) : "r0", "r1", "%cc"); - -#define SQRADDSC(i, j) \ -asm( \ -" UMULL %0,%1,%6,%7 \n\t" \ -" SUB %2,%2,%2 \n\t" \ -:"=r"(sc0), "=r"(sc1), "=r"(sc2) : "0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j) : "%cc"); - -#define SQRADDAC(i, j) \ -asm( \ -" UMULL r0,r1,%6,%7 \n\t" \ -" ADDS %0,%0,r0 \n\t" \ -" ADCS %1,%1,r1 \n\t" \ -" ADC %2,%2,#0 \n\t" \ -:"=r"(sc0), "=r"(sc1), "=r"(sc2) : "0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j) : "r0", "r1", "%cc"); - -#define SQRADDDB \ -asm( \ -" ADDS %0,%0,%3 \n\t" \ -" ADCS %1,%1,%4 \n\t" \ -" ADC %2,%2,%5 \n\t" \ -" ADDS %0,%0,%3 \n\t" \ -" ADCS %1,%1,%4 \n\t" \ -" ADC %2,%2,%5 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2) : "r"(sc0), "r"(sc1), "r"(sc2), "0"(c0), "1"(c1), "2"(c2) : "%cc"); - -#elif defined(TFM_PPC32) - -/* PPC32 */ - -#define COMBA_START - -#define CLEAR_CARRY \ - c0 = c1 = c2 = 0; - -#define COMBA_STORE(x) \ - x = c0; - -#define COMBA_STORE2(x) \ - x = c1; - -#define CARRY_FORWARD \ - do { c0 = c1; c1 = c2; c2 = 0; } while (0); - -#define COMBA_FINI - -/* multiplies point i and j, updates carry "c1" and digit c2 */ -#define SQRADD(i, j) \ -asm( \ - " mullw 16,%6,%6 \n\t" \ - " addc %0,%0,16 \n\t" \ - " mulhwu 16,%6,%6 \n\t" \ - " adde %1,%1,16 \n\t" \ - " addze %2,%2 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i):"16","%cc"); - -/* for squaring some of the terms are doubled... */ -#define SQRADD2(i, j) \ -asm( \ - " mullw 16,%6,%7 \n\t" \ - " mulhwu 17,%6,%7 \n\t" \ - " addc %0,%0,16 \n\t" \ - " adde %1,%1,17 \n\t" \ - " addze %2,%2 \n\t" \ - " addc %0,%0,16 \n\t" \ - " adde %1,%1,17 \n\t" \ - " addze %2,%2 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"16", "17","%cc"); - -#define SQRADDSC(i, j) \ -asm( \ - " mullw %0,%6,%7 \n\t" \ - " mulhwu %1,%6,%7 \n\t" \ - " xor %2,%2,%2 \n\t" \ -:"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i),"r"(j) : "%cc"); - -#define SQRADDAC(i, j) \ -asm( \ - " mullw 16,%6,%7 \n\t" \ - " addc %0,%0,16 \n\t" \ - " mulhwu 16,%6,%7 \n\t" \ - " adde %1,%1,16 \n\t" \ - " addze %2,%2 \n\t" \ -:"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j):"16", "%cc"); - -#define SQRADDDB \ -asm( \ - " addc %0,%0,%3 \n\t" \ - " adde %1,%1,%4 \n\t" \ - " adde %2,%2,%5 \n\t" \ - " addc %0,%0,%3 \n\t" \ - " adde %1,%1,%4 \n\t" \ - " adde %2,%2,%5 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2) : "r"(sc0), "r"(sc1), "r"(sc2), "0"(c0), "1"(c1), "2"(c2) : "%cc"); - -#elif defined(TFM_PPC64) -/* PPC64 */ - -#define COMBA_START - -#define CLEAR_CARRY \ - c0 = c1 = c2 = 0; - -#define COMBA_STORE(x) \ - x = c0; - -#define COMBA_STORE2(x) \ - x = c1; - -#define CARRY_FORWARD \ - do { c0 = c1; c1 = c2; c2 = 0; } while (0); - -#define COMBA_FINI - -/* multiplies point i and j, updates carry "c1" and digit c2 */ -#define SQRADD(i, j) \ -asm( \ - " mulld 16,%6,%6 \n\t" \ - " addc %0,%0,16 \n\t" \ - " mulhdu 16,%6,%6 \n\t" \ - " adde %1,%1,16 \n\t" \ - " addze %2,%2 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i):"16","%cc"); - -/* for squaring some of the terms are doubled... */ -#define SQRADD2(i, j) \ -asm( \ - " mulld 16,%6,%7 \n\t" \ - " mulhdu 17,%6,%7 \n\t" \ - " addc %0,%0,16 \n\t" \ - " adde %1,%1,17 \n\t" \ - " addze %2,%2 \n\t" \ - " addc %0,%0,16 \n\t" \ - " adde %1,%1,17 \n\t" \ - " addze %2,%2 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"16", "17","%cc"); - -#define SQRADDSC(i, j) \ -asm( \ - " mulld %0,%6,%7 \n\t" \ - " mulhdu %1,%6,%7 \n\t" \ - " xor %2,%2,%2 \n\t" \ -:"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i),"r"(j) : "%cc"); - -#define SQRADDAC(i, j) \ -asm( \ - " mulld 16,%6,%7 \n\t" \ - " addc %0,%0,16 \n\t" \ - " mulhdu 16,%6,%7 \n\t" \ - " adde %1,%1,16 \n\t" \ - " addze %2,%2 \n\t" \ -:"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j):"16", "%cc"); - -#define SQRADDDB \ -asm( \ - " addc %0,%0,%3 \n\t" \ - " adde %1,%1,%4 \n\t" \ - " adde %2,%2,%5 \n\t" \ - " addc %0,%0,%3 \n\t" \ - " adde %1,%1,%4 \n\t" \ - " adde %2,%2,%5 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2) : "r"(sc0), "r"(sc1), "r"(sc2), "0"(c0), "1"(c1), "2"(c2) : "%cc"); - - -#elif defined(TFM_AVR32) - -/* AVR32 */ - -#define COMBA_START - -#define CLEAR_CARRY \ - c0 = c1 = c2 = 0; - -#define COMBA_STORE(x) \ - x = c0; - -#define COMBA_STORE2(x) \ - x = c1; - -#define CARRY_FORWARD \ - do { c0 = c1; c1 = c2; c2 = 0; } while (0); - -#define COMBA_FINI - -/* multiplies point i and j, updates carry "c1" and digit c2 */ -#define SQRADD(i, j) \ -asm( \ - " mulu.d r2,%6,%6 \n\t" \ - " add %0,%0,r2 \n\t" \ - " adc %1,%1,r3 \n\t" \ - " acr %2 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i):"r2","r3"); - -/* for squaring some of the terms are doubled... */ -#define SQRADD2(i, j) \ -asm( \ - " mulu.d r2,%6,%7 \n\t" \ - " add %0,%0,r2 \n\t" \ - " adc %1,%1,r3 \n\t" \ - " acr %2, \n\t" \ - " add %0,%0,r2 \n\t" \ - " adc %1,%1,r3 \n\t" \ - " acr %2, \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"r2", "r3"); - -#define SQRADDSC(i, j) \ -asm( \ - " mulu.d r2,%6,%7 \n\t" \ - " mov %0,r2 \n\t" \ - " mov %1,r3 \n\t" \ - " eor %2,%2 \n\t" \ -:"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i),"r"(j) : "r2", "r3"); - -#define SQRADDAC(i, j) \ -asm( \ - " mulu.d r2,%6,%7 \n\t" \ - " add %0,%0,r2 \n\t" \ - " adc %1,%1,r3 \n\t" \ - " acr %2 \n\t" \ -:"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j):"r2", "r3"); - -#define SQRADDDB \ -asm( \ - " add %0,%0,%3 \n\t" \ - " adc %1,%1,%4 \n\t" \ - " adc %2,%2,%5 \n\t" \ - " add %0,%0,%3 \n\t" \ - " adc %1,%1,%4 \n\t" \ - " adc %2,%2,%5 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2) : "r"(sc0), "r"(sc1), "r"(sc2), "0"(c0), "1"(c1), "2"(c2) : "%cc"); - - -#else - -#define TFM_ISO - -/* ISO C portable code */ - -#define COMBA_START - -#define CLEAR_CARRY \ - c0 = c1 = c2 = 0; - -#define COMBA_STORE(x) \ - x = c0; - -#define COMBA_STORE2(x) \ - x = c1; - -#define CARRY_FORWARD \ - do { c0 = c1; c1 = c2; c2 = 0; } while (0); - -#define COMBA_FINI - -/* multiplies point i and j, updates carry "c1" and digit c2 */ -#define SQRADD(i, j) \ - do { fp_word t; \ - t = c0 + ((fp_word)i) * ((fp_word)j); c0 = t; \ - t = c1 + (t >> DIGIT_BIT); c1 = t; c2 += t >> DIGIT_BIT; \ - } while (0); - - -/* for squaring some of the terms are doubled... */ -#define SQRADD2(i, j) \ - do { fp_word t; \ - t = ((fp_word)i) * ((fp_word)j); \ - tt = (fp_word)c0 + t; c0 = tt; \ - tt = (fp_word)c1 + (tt >> DIGIT_BIT); c1 = tt; c2 += tt >> DIGIT_BIT; \ - tt = (fp_word)c0 + t; c0 = tt; \ - tt = (fp_word)c1 + (tt >> DIGIT_BIT); c1 = tt; c2 += tt >> DIGIT_BIT; \ - } while (0); - -#define SQRADDSC(i, j) \ - do { fp_word t; \ - t = ((fp_word)i) * ((fp_word)j); \ - sc0 = (fp_digit)t; sc1 = (t >> DIGIT_BIT); sc2 = 0; \ - } while (0); - -#define SQRADDAC(i, j) \ - do { fp_word t; \ - t = sc0 + ((fp_word)i) * ((fp_word)j); sc0 = t; \ - t = sc1 + (t >> DIGIT_BIT); sc1 = t; sc2 += t >> DIGIT_BIT; \ - } while (0); - -#define SQRADDDB \ - do { fp_word t; \ - t = ((fp_word)sc0) + ((fp_word)sc0) + c0; c0 = t; \ - t = ((fp_word)sc1) + ((fp_word)sc1) + c1 + (t >> DIGIT_BIT); c1 = t; \ - c2 = c2 + ((fp_word)sc2) + ((fp_word)sc2) + (t >> DIGIT_BIT); \ - } while (0); - -#endif - -#include "fp_sqr_comba_generic.c" -#include "fp_sqr_comba_small_set.i" -#include "fp_sqr_comba_3.i" -#include "fp_sqr_comba_4.i" -#include "fp_sqr_comba_6.i" -#include "fp_sqr_comba_7.i" -#include "fp_sqr_comba_8.i" -#include "fp_sqr_comba_9.i" -#include "fp_sqr_comba_12.i" -#include "fp_sqr_comba_17.i" -#include "fp_sqr_comba_20.i" -#include "fp_sqr_comba_24.i" -#include "fp_sqr_comba_28.i" -#include "fp_sqr_comba_32.i" -#include "fp_sqr_comba_48.i" -#include "fp_sqr_comba_64.i" - -/* End: fp_sqr_comba.c */ - -/* Start: fp_sqr_comba_generic.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ - -/* generic comba squarer */ -void fp_sqr_comba(fp_int *A, fp_int *B) -{ - int pa, ix, iz; - fp_digit c0, c1, c2; - fp_int tmp, *dst; -#ifdef TFM_ISO - fp_word tt; -#endif - - /* get size of output and trim */ - pa = A->used + A->used; - if (pa >= FP_SIZE) { - pa = FP_SIZE-1; - } - - /* number of output digits to produce */ - COMBA_START; - CLEAR_CARRY; - - if (A == B) { - fp_zero(&tmp); - dst = &tmp; - } else { - fp_zero(B); - dst = B; - } - - for (ix = 0; ix < pa; ix++) { - int tx, ty, iy; - fp_digit *tmpy, *tmpx; - - /* get offsets into the two bignums */ - ty = MIN(A->used-1, ix); - tx = ix - ty; - - /* setup temp aliases */ - tmpx = A->dp + tx; - tmpy = A->dp + ty; - - /* this is the number of times the loop will iterrate, - while (tx++ < a->used && ty-- >= 0) { ... } - */ - iy = MIN(A->used-tx, ty+1); - - /* now for squaring tx can never equal ty - * we halve the distance since they approach - * at a rate of 2x and we have to round because - * odd cases need to be executed - */ - iy = MIN(iy, (ty-tx+1)>>1); - - /* forward carries */ - CARRY_FORWARD; - - /* execute loop */ - for (iz = 0; iz < iy; iz++) { - SQRADD2(*tmpx++, *tmpy--); - } - - /* even columns have the square term in them */ - if ((ix&1) == 0) { - SQRADD(A->dp[ix>>1], A->dp[ix>>1]); - } - - /* store it */ - COMBA_STORE(dst->dp[ix]); - } - - COMBA_FINI; - - /* setup dest */ - dst->used = pa; - fp_clamp (dst); - if (dst != B) { - fp_copy(dst, B); - } -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_sqr_comba_generic.c */ - -/* Start: fp_sqrmod.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* c = a * a (mod b) */ -int fp_sqrmod(fp_int *a, fp_int *b, fp_int *c) -{ - fp_int tmp; - fp_zero(&tmp); - fp_sqr(a, &tmp); - return fp_mod(&tmp, b, c); -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_sqrmod.c */ - -/* Start: fp_sub.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* c = a - b */ -void fp_sub(fp_int *a, fp_int *b, fp_int *c) -{ - int sa, sb; - - sa = a->sign; - sb = b->sign; - - if (sa != sb) { - /* subtract a negative from a positive, OR */ - /* subtract a positive from a negative. */ - /* In either case, ADD their magnitudes, */ - /* and use the sign of the first number. */ - c->sign = sa; - s_fp_add (a, b, c); - } else { - /* subtract a positive from a positive, OR */ - /* subtract a negative from a negative. */ - /* First, take the difference between their */ - /* magnitudes, then... */ - if (fp_cmp_mag (a, b) != FP_LT) { - /* Copy the sign from the first */ - c->sign = sa; - /* The first has a larger or equal magnitude */ - s_fp_sub (a, b, c); - } else { - /* The result has the *opposite* sign from */ - /* the first number. */ - c->sign = (sa == FP_ZPOS) ? FP_NEG : FP_ZPOS; - /* The second has a larger magnitude */ - s_fp_sub (b, a, c); - } - } -} - - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_sub.c */ - -/* Start: fp_sub_d.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* c = a - b */ -void fp_sub_d(fp_int *a, fp_digit b, fp_int *c) -{ - fp_int tmp; - fp_set(&tmp, b); - fp_sub(a, &tmp, c); -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_sub_d.c */ - -/* Start: fp_submod.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* d = a - b (mod c) */ -int fp_submod(fp_int *a, fp_int *b, fp_int *c, fp_int *d) -{ - fp_int tmp; - fp_zero(&tmp); - fp_sub(a, b, &tmp); - return fp_mod(&tmp, c, d); -} - - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_submod.c */ - -/* Start: fp_to_signed_bin.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -void fp_to_signed_bin(fp_int *a, unsigned char *b) -{ - fp_to_unsigned_bin (a, b + 1); - b[0] = (unsigned char) ((a->sign == FP_ZPOS) ? 0 : 1); -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_to_signed_bin.c */ - -/* Start: fp_to_unsigned_bin.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -void fp_to_unsigned_bin(fp_int *a, unsigned char *b) -{ - int x; - fp_int t; - - fp_init_copy(&t, a); - - x = 0; - while (fp_iszero (&t) == FP_NO) { - b[x++] = (unsigned char) (t.dp[0] & 255); - fp_div_2d (&t, 8, &t, NULL); - } - bn_reverse (b, x); -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_to_unsigned_bin.c */ - -/* Start: fp_toradix.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -int fp_toradix(fp_int *a, char *str, int radix) -{ - int digs; - fp_int t; - fp_digit d; - char *_s = str; - - /* check range of the radix */ - if (radix < 2 || radix > 64) { - return FP_VAL; - } - - /* quick out if its zero */ - if (fp_iszero(a) == 1) { - *str++ = '0'; - *str = '\0'; - return FP_OKAY; - } - - fp_init_copy(&t, a); - - /* if it is negative output a - */ - if (t.sign == FP_NEG) { - ++_s; - *str++ = '-'; - t.sign = FP_ZPOS; - } - - digs = 0; - while (fp_iszero (&t) == FP_NO) { - fp_div_d (&t, (fp_digit) radix, &t, &d); - *str++ = fp_s_rmap[d]; - ++digs; - } - - /* reverse the digits of the string. In this case _s points - * to the first digit [exluding the sign] of the number] - */ - bn_reverse ((unsigned char *)_s, digs); - - /* append a NULL so the string is properly terminated */ - *str = '\0'; - return FP_OKAY; -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_toradix.c */ - -/* Start: fp_unsigned_bin_size.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -int fp_unsigned_bin_size(fp_int *a) -{ - int size = fp_count_bits (a); - return (size / 8 + ((size & 7) != 0 ? 1 : 0)); -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: fp_unsigned_bin_size.c */ - -/* Start: s_fp_add.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* unsigned addition */ -void s_fp_add(fp_int *a, fp_int *b, fp_int *c) -{ - int x, y, oldused; - register fp_word t; - - y = MAX(a->used, b->used); - oldused = c->used; - c->used = y; - - t = 0; - for (x = 0; x < y; x++) { - t += ((fp_word)a->dp[x]) + ((fp_word)b->dp[x]); - c->dp[x] = (fp_digit)t; - t >>= DIGIT_BIT; - } - if (t != 0 && x < FP_SIZE) { - c->dp[c->used++] = (fp_digit)t; - ++x; - } - - c->used = x; - for (; x < oldused; x++) { - c->dp[x] = 0; - } - fp_clamp(c); -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: s_fp_add.c */ - -/* Start: s_fp_sub.c */ -/* TomsFastMath, a fast ISO C bignum library. - * - * This project is meant to fill in where LibTomMath - * falls short. That is speed ;-) - * - * This project is public domain and free for all purposes. - * - * Tom St Denis, tomstdenis@gmail.com - */ -#include - -/* unsigned subtraction ||a|| >= ||b|| ALWAYS! */ -void s_fp_sub(fp_int *a, fp_int *b, fp_int *c) -{ - int x, oldbused, oldused; - fp_word t; - - oldused = c->used; - oldbused = b->used; - c->used = a->used; - t = 0; - for (x = 0; x < oldbused; x++) { - t = ((fp_word)a->dp[x]) - (((fp_word)b->dp[x]) + t); - c->dp[x] = (fp_digit)t; - t = (t >> DIGIT_BIT)&1; - } - for (; x < a->used; x++) { - t = ((fp_word)a->dp[x]) - t; - c->dp[x] = (fp_digit)t; - t = (t >> DIGIT_BIT); - } - for (; x < oldused; x++) { - c->dp[x] = 0; - } - fp_clamp(c); -} - -/* $Source$ */ -/* $Revision$ */ -/* $Date$ */ - -/* End: s_fp_sub.c */ - /* EOF */ diff --git a/fp_add.c b/src/addsub/fp_add.c similarity index 100% rename from fp_add.c rename to src/addsub/fp_add.c diff --git a/fp_add_d.c b/src/addsub/fp_add_d.c similarity index 100% rename from fp_add_d.c rename to src/addsub/fp_add_d.c diff --git a/fp_addmod.c b/src/addsub/fp_addmod.c similarity index 100% rename from fp_addmod.c rename to src/addsub/fp_addmod.c diff --git a/fp_cmp.c b/src/addsub/fp_cmp.c similarity index 100% rename from fp_cmp.c rename to src/addsub/fp_cmp.c diff --git a/fp_cmp_d.c b/src/addsub/fp_cmp_d.c similarity index 100% rename from fp_cmp_d.c rename to src/addsub/fp_cmp_d.c diff --git a/fp_cmp_mag.c b/src/addsub/fp_cmp_mag.c similarity index 100% rename from fp_cmp_mag.c rename to src/addsub/fp_cmp_mag.c diff --git a/fp_sub.c b/src/addsub/fp_sub.c similarity index 100% rename from fp_sub.c rename to src/addsub/fp_sub.c diff --git a/fp_sub_d.c b/src/addsub/fp_sub_d.c similarity index 100% rename from fp_sub_d.c rename to src/addsub/fp_sub_d.c diff --git a/fp_submod.c b/src/addsub/fp_submod.c similarity index 100% rename from fp_submod.c rename to src/addsub/fp_submod.c diff --git a/s_fp_add.c b/src/addsub/s_fp_add.c similarity index 100% rename from s_fp_add.c rename to src/addsub/s_fp_add.c diff --git a/s_fp_sub.c b/src/addsub/s_fp_sub.c similarity index 100% rename from s_fp_sub.c rename to src/addsub/s_fp_sub.c diff --git a/fp_radix_size.c b/src/bin/fp_radix_size.c similarity index 100% rename from fp_radix_size.c rename to src/bin/fp_radix_size.c diff --git a/fp_read_radix.c b/src/bin/fp_read_radix.c similarity index 100% rename from fp_read_radix.c rename to src/bin/fp_read_radix.c diff --git a/fp_read_signed_bin.c b/src/bin/fp_read_signed_bin.c similarity index 100% rename from fp_read_signed_bin.c rename to src/bin/fp_read_signed_bin.c diff --git a/src/bin/fp_read_unsigned_bin.c b/src/bin/fp_read_unsigned_bin.c new file mode 100644 index 0000000..bca7057 --- /dev/null +++ b/src/bin/fp_read_unsigned_bin.c @@ -0,0 +1,66 @@ +/* TomsFastMath, a fast ISO C bignum library. + * + * This project is meant to fill in where LibTomMath + * falls short. That is speed ;-) + * + * This project is public domain and free for all purposes. + * + * Tom St Denis, tomstdenis@gmail.com + */ +#include + +void fp_read_unsigned_bin(fp_int *a, unsigned char *b, int c) +{ + /* zero the int */ + fp_zero (a); + + /* If we know the endianness of this architecture, and we're using + 32-bit fp_digits, we can optimize this */ +#if (defined(ENDIAN_LITTLE) || defined(ENDIAN_BIG)) && !defined(FP_64BIT) + /* But not for both simultaneously */ +#if defined(ENDIAN_LITTLE) && defined(ENDIAN_BIG) +#error Both ENDIAN_LITTLE and ENDIAN_BIG defined. +#endif + { + unsigned char *pd = (unsigned char *)a->dp; + + if ((unsigned)c > (FP_SIZE * sizeof(fp_digit))) { + int excess = c - (FP_SIZE * sizeof(fp_digit)); + c -= excess; + b += excess; + } + a->used = (c + sizeof(fp_digit) - 1)/sizeof(fp_digit); + /* read the bytes in */ +#ifdef ENDIAN_BIG + { + /* Use Duff's device to unroll the loop. */ + int idx = (c - 1) & ~3; + switch (c % 4) { + case 0: do { pd[idx+0] = *b++; + case 3: pd[idx+1] = *b++; + case 2: pd[idx+2] = *b++; + case 1: pd[idx+3] = *b++; + idx -= 4; + } while ((c -= 4) > 0); + } + } +#else + for (c -= 1; c >= 0; c -= 1) { + pd[c] = *b++; + } +#endif + } +#else + /* read the bytes in */ + for (; c > 0; c--) { + fp_mul_2d (a, 8, a); + a->dp[0] |= *b++; + a->used += 1; + } +#endif + fp_clamp (a); +} + +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/fp_reverse.c b/src/bin/fp_reverse.c similarity index 92% rename from fp_reverse.c rename to src/bin/fp_reverse.c index f393579..821da6c 100644 --- a/fp_reverse.c +++ b/src/bin/fp_reverse.c @@ -10,7 +10,7 @@ #include /* reverse an array, used for radix code */ -void bn_reverse (unsigned char *s, int len) +void fp_reverse (unsigned char *s, int len) { int ix, iy; unsigned char t; diff --git a/fp_s_rmap.c b/src/bin/fp_s_rmap.c similarity index 100% rename from fp_s_rmap.c rename to src/bin/fp_s_rmap.c diff --git a/fp_signed_bin_size.c b/src/bin/fp_signed_bin_size.c similarity index 100% rename from fp_signed_bin_size.c rename to src/bin/fp_signed_bin_size.c diff --git a/fp_to_signed_bin.c b/src/bin/fp_to_signed_bin.c similarity index 100% rename from fp_to_signed_bin.c rename to src/bin/fp_to_signed_bin.c diff --git a/fp_to_unsigned_bin.c b/src/bin/fp_to_unsigned_bin.c similarity index 96% rename from fp_to_unsigned_bin.c rename to src/bin/fp_to_unsigned_bin.c index 700e564..f1db63f 100644 --- a/fp_to_unsigned_bin.c +++ b/src/bin/fp_to_unsigned_bin.c @@ -21,7 +21,7 @@ void fp_to_unsigned_bin(fp_int *a, unsigned char *b) b[x++] = (unsigned char) (t.dp[0] & 255); fp_div_2d (&t, 8, &t, NULL); } - bn_reverse (b, x); + fp_reverse (b, x); } /* $Source$ */ diff --git a/fp_toradix.c b/src/bin/fp_toradix.c similarity index 96% rename from fp_toradix.c rename to src/bin/fp_toradix.c index 64113e0..6ca2e0d 100644 --- a/fp_toradix.c +++ b/src/bin/fp_toradix.c @@ -47,7 +47,7 @@ int fp_toradix(fp_int *a, char *str, int radix) /* reverse the digits of the string. In this case _s points * to the first digit [exluding the sign] of the number] */ - bn_reverse ((unsigned char *)_s, digs); + fp_reverse ((unsigned char *)_s, digs); /* append a NULL so the string is properly terminated */ *str = '\0'; diff --git a/fp_unsigned_bin_size.c b/src/bin/fp_unsigned_bin_size.c similarity index 100% rename from fp_unsigned_bin_size.c rename to src/bin/fp_unsigned_bin_size.c diff --git a/fp_cnt_lsb.c b/src/bit/fp_cnt_lsb.c similarity index 100% rename from fp_cnt_lsb.c rename to src/bit/fp_cnt_lsb.c diff --git a/fp_count_bits.c b/src/bit/fp_count_bits.c similarity index 100% rename from fp_count_bits.c rename to src/bit/fp_count_bits.c diff --git a/fp_div_2.c b/src/bit/fp_div_2.c similarity index 100% rename from fp_div_2.c rename to src/bit/fp_div_2.c diff --git a/fp_div_2d.c b/src/bit/fp_div_2d.c similarity index 100% rename from fp_div_2d.c rename to src/bit/fp_div_2d.c diff --git a/fp_lshd.c b/src/bit/fp_lshd.c similarity index 100% rename from fp_lshd.c rename to src/bit/fp_lshd.c diff --git a/fp_mod_2d.c b/src/bit/fp_mod_2d.c similarity index 100% rename from fp_mod_2d.c rename to src/bit/fp_mod_2d.c diff --git a/fp_rshd.c b/src/bit/fp_rshd.c similarity index 100% rename from fp_rshd.c rename to src/bit/fp_rshd.c diff --git a/fp_div.c b/src/divide/fp_div.c similarity index 100% rename from fp_div.c rename to src/divide/fp_div.c diff --git a/fp_div_d.c b/src/divide/fp_div_d.c similarity index 92% rename from fp_div_d.c rename to src/divide/fp_div_d.c index 3dfb714..b86ae66 100644 --- a/fp_div_d.c +++ b/src/divide/fp_div_d.c @@ -13,7 +13,12 @@ static int s_is_power_of_two(fp_digit b, int *p) { int x; - for (x = 1; x < DIGIT_BIT; x++) { + /* fast return if no power of two */ + if ((b==0) || (b & (b-1))) { + return 0; + } + + for (x = 0; x < DIGIT_BIT; x++) { if (b == (((fp_digit)1)<sign ^= 1; } -#define fp_abs(a, b) { fp_copy(a, b); (b)->sign = 0; } - /* clamp digits */ #define fp_clamp(a) { while ((a)->used && (a)->dp[(a)->used-1] == 0) --((a)->used); (a)->sign = (a)->used ? (a)->sign : FP_ZPOS; } +/* negate and absolute */ +#define fp_neg(a, b) { fp_copy(a, b); (b)->sign ^= 1; fp_clamp(b); } +#define fp_abs(a, b) { fp_copy(a, b); (b)->sign = 0; } + /* right shift x digits */ void fp_rshd(fp_int *a, int x); @@ -457,7 +457,7 @@ int fp_toradix_n(fp_int * a, char *str, int radix, int maxlen); /* VARIOUS LOW LEVEL STUFFS */ void s_fp_add(fp_int *a, fp_int *b, fp_int *c); void s_fp_sub(fp_int *a, fp_int *b, fp_int *c); -void bn_reverse(unsigned char *s, int len); +void fp_reverse(unsigned char *s, int len); void fp_mul_comba(fp_int *A, fp_int *B, fp_int *C); diff --git a/fp_ident.c b/src/misc/fp_ident.c similarity index 100% rename from fp_ident.c rename to src/misc/fp_ident.c diff --git a/fp_set.c b/src/misc/fp_set.c similarity index 100% rename from fp_set.c rename to src/misc/fp_set.c diff --git a/fp_mont_small.c b/src/mont/fp_mont_small.i similarity index 100% rename from fp_mont_small.c rename to src/mont/fp_mont_small.i diff --git a/fp_montgomery_calc_normalization.c b/src/mont/fp_montgomery_calc_normalization.c similarity index 100% rename from fp_montgomery_calc_normalization.c rename to src/mont/fp_montgomery_calc_normalization.c diff --git a/fp_montgomery_reduce.c b/src/mont/fp_montgomery_reduce.c similarity index 88% rename from fp_montgomery_reduce.c rename to src/mont/fp_montgomery_reduce.c index 3f677dc..822ace9 100644 --- a/fp_montgomery_reduce.c +++ b/src/mont/fp_montgomery_reduce.c @@ -311,6 +311,7 @@ asm( \ " MOVCC %0,#0 \n\t" \ :"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"r0","%cc"); +/******************************************************************/ #elif defined(TFM_PPC32) /* PPC32 */ @@ -341,6 +342,7 @@ asm( \ " addze %0,%0 \n\t" \ :"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"16","%cc"); +/******************************************************************/ #elif defined(TFM_PPC64) /* PPC64 */ @@ -352,27 +354,26 @@ asm( \ #define INNERMUL \ asm( \ - " mulld 16,%3,%4 \n\t" \ - " mulhdu 17,%3,%4 \n\t" \ - " addc 16,16,%0 \n\t" \ - " addze 17,17 \n\t" \ - " ldx 18,0,%1 \n\t" \ - " addc 16,16,18 \n\t" \ - " addze %0,17 \n\t" \ - " sdx 16,0,%1 \n\t" \ -:"=r"(cy),"=m"(_c[0]):"0"(cy),"r"(mu),"r"(tmpm[0]),"1"(_c[0]):"16", "17", "18","%cc"); ++tmpm; + " mulld r16,%3,%4 \n\t" \ + " mulhdu r17,%3,%4 \n\t" \ + " addc r16,16,%0 \n\t" \ + " addze r17,r17 \n\t" \ + " ldx r18,0,%1 \n\t" \ + " addc r16,r16,r18 \n\t" \ + " addze %0,r17 \n\t" \ + " sdx r16,0,%1 \n\t" \ +:"=r"(cy),"=m"(_c[0]):"0"(cy),"r"(mu),"r"(tmpm[0]),"1"(_c[0]):"r16", "r17", "r18","%cc"); ++tmpm; #define PROPCARRY \ asm( \ - " ldx 16,0,%1 \n\t" \ - " addc 16,16,%0 \n\t" \ - " sdx 16,0,%1 \n\t" \ + " ldx r16,0,%1 \n\t" \ + " addc r16,r16,%0 \n\t" \ + " sdx r16,0,%1 \n\t" \ " xor %0,%0,%0 \n\t" \ " addze %0,%0 \n\t" \ -:"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"16","%cc"); +:"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"r16","%cc"); /******************************************************************/ - #elif defined(TFM_AVR32) /* AVR32 */ @@ -402,6 +403,40 @@ asm( \ " acr %0 \n\t" \ :"=r"(cy),"=r"(&_c[0]):"0"(cy),"1"(&_c[0]):"r2","%cc"); +/******************************************************************/ +#elif defined(TFM_MIPS) + +/* MIPS */ +#define MONT_START +#define MONT_FINI +#define LOOP_END +#define LOOP_START \ + mu = c[x] * mp + +#define INNERMUL \ +asm( \ + " multu %3,%4 \n\t" \ + " mflo $12 \n\t" \ + " mfhi $13 \n\t" \ + " addu $12,$12,%0 \n\t" \ + " sltu $10,$12,%0 \n\t" \ + " addu $13,$13,$10 \n\t" \ + " lw $10,%1 \n\t" \ + " addu $12,$12,$10 \n\t" \ + " sltu $10,$12,$10 \n\t" \ + " addu %0,$13,$10 \n\t" \ + " sw $12,%1 \n\t" \ +:"=r"(cy),"=m"(_c[0]):"0"(cy),"r"(mu),"r"(tmpm[0]),"1"(_c[0]):"$10","$12","$13"); ++tmpm; + +#define PROPCARRY \ +asm( \ + " lw $10,%1 \n\t" \ + " addu $10,$10,%0 \n\t" \ + " sw $10,%1 \n\t" \ + " sltu %0,$10,%0 \n\t" \ +:"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"$10"); + +/******************************************************************/ #else /* ISO C code */ @@ -428,7 +463,7 @@ asm( \ #define LO 0 #ifdef TFM_SMALL_MONT_SET -#include "fp_mont_small.c" +#include "fp_mont_small.i" #endif /* computes x/R == x (mod N) via Montgomery Reduction */ diff --git a/fp_montgomery_setup.c b/src/mont/fp_montgomery_setup.c similarity index 100% rename from fp_montgomery_setup.c rename to src/mont/fp_montgomery_setup.c diff --git a/fp_mul.c b/src/mul/fp_mul.c similarity index 100% rename from fp_mul.c rename to src/mul/fp_mul.c diff --git a/fp_mul_2.c b/src/mul/fp_mul_2.c similarity index 100% rename from fp_mul_2.c rename to src/mul/fp_mul_2.c diff --git a/fp_mul_2d.c b/src/mul/fp_mul_2d.c similarity index 100% rename from fp_mul_2d.c rename to src/mul/fp_mul_2d.c diff --git a/fp_mul_comba.c b/src/mul/fp_mul_comba.c similarity index 89% rename from fp_mul_comba.c rename to src/mul/fp_mul_comba.c index efb0fbf..bb0cf07 100644 --- a/fp_mul_comba.c +++ b/src/mul/fp_mul_comba.c @@ -205,15 +205,15 @@ asm( \ #define COMBA_FINI -/* untested: will mulhwu change the flags? Docs say no */ +/* untested: will mulhdu change the flags? Docs say no */ #define MULADD(i, j) \ asm( \ - " mulld 16,%6,%7 \n\t" \ + " mulld r16,%6,%7 \n\t" \ " addc %0,%0,16 \n\t" \ - " mulhdu 16,%6,%7 \n\t" \ + " mulhdu r16,%6,%7 \n\t" \ " adde %1,%1,16 \n\t" \ " addze %2,%2 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"16"); +:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"r16"); #elif defined(TFM_AVR32) @@ -243,6 +243,39 @@ asm( \ " acr %2 \n\t"\ :"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"r2","r3"); +#elif defined(TFM_MIPS) + +#define COMBA_START + +#define COMBA_CLEAR \ + c0 = c1 = c2 = 0; + +#define COMBA_FORWARD \ + do { c0 = c1; c1 = c2; c2 = 0; } while (0); + +#define COMBA_STORE(x) \ + x = c0; + +#define COMBA_STORE2(x) \ + x = c1; + +#define COMBA_FINI + +#define MULADD(i, j) \ +asm( \ + " multu %6,%7 \n\t" \ + " mflo $12 \n\t" \ + " mfhi $13 \n\t" \ + " addu %0,%0,$12 \n\t" \ + " sltu $12,%0,$12 \n\t" \ + " addu %1,%1,$13 \n\t" \ + " sltu $13,%1,$13 \n\t" \ + " addu %1,%1,$12 \n\t" \ + " sltu $12,%1,$12 \n\t" \ + " addu %2,%2,$13 \n\t" \ + " addu %2,%2,$12 \n\t" \ +:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"$12","$13"); + #else /* ISO C code */ @@ -270,6 +303,7 @@ asm( \ #endif +#ifndef TFM_DEFINES /* generic PxQ multiplier */ void fp_mul_comba(fp_int *A, fp_int *B, fp_int *C) @@ -326,21 +360,7 @@ void fp_mul_comba(fp_int *A, fp_int *B, fp_int *C) fp_copy(dst, C); } -#include "fp_mul_comba_small_set.i" -#include "fp_mul_comba_3.i" -#include "fp_mul_comba_4.i" -#include "fp_mul_comba_6.i" -#include "fp_mul_comba_7.i" -#include "fp_mul_comba_8.i" -#include "fp_mul_comba_9.i" -#include "fp_mul_comba_12.i" -#include "fp_mul_comba_17.i" -#include "fp_mul_comba_20.i" -#include "fp_mul_comba_24.i" -#include "fp_mul_comba_28.i" -#include "fp_mul_comba_32.i" -#include "fp_mul_comba_48.i" -#include "fp_mul_comba_64.i" +#endif /* $Source$ */ /* $Revision$ */ diff --git a/fp_mul_comba_12.i b/src/mul/fp_mul_comba_12.c similarity index 99% rename from fp_mul_comba_12.i rename to src/mul/fp_mul_comba_12.c index 5ec50b8..aae9986 100644 --- a/fp_mul_comba_12.i +++ b/src/mul/fp_mul_comba_12.c @@ -1,3 +1,6 @@ +#define TFM_DEFINES +#include "fp_mul_comba.c" + #ifdef TFM_MUL12 void fp_mul_comba12(fp_int *A, fp_int *B, fp_int *C) { diff --git a/fp_mul_comba_17.i b/src/mul/fp_mul_comba_17.c similarity index 99% rename from fp_mul_comba_17.i rename to src/mul/fp_mul_comba_17.c index d324513..6f3e5f7 100644 --- a/fp_mul_comba_17.i +++ b/src/mul/fp_mul_comba_17.c @@ -1,3 +1,6 @@ +#define TFM_DEFINES +#include "fp_mul_comba.c" + #ifdef TFM_MUL17 void fp_mul_comba17(fp_int *A, fp_int *B, fp_int *C) { diff --git a/fp_mul_comba_20.i b/src/mul/fp_mul_comba_20.c similarity index 99% rename from fp_mul_comba_20.i rename to src/mul/fp_mul_comba_20.c index 9af6d2c..d4221c7 100644 --- a/fp_mul_comba_20.i +++ b/src/mul/fp_mul_comba_20.c @@ -1,3 +1,6 @@ +#define TFM_DEFINES +#include "fp_mul_comba.c" + #ifdef TFM_MUL20 void fp_mul_comba20(fp_int *A, fp_int *B, fp_int *C) { diff --git a/fp_mul_comba_24.i b/src/mul/fp_mul_comba_24.c similarity index 99% rename from fp_mul_comba_24.i rename to src/mul/fp_mul_comba_24.c index bb518c0..bf32644 100644 --- a/fp_mul_comba_24.i +++ b/src/mul/fp_mul_comba_24.c @@ -1,3 +1,6 @@ +#define TFM_DEFINES +#include "fp_mul_comba.c" + #ifdef TFM_MUL24 void fp_mul_comba24(fp_int *A, fp_int *B, fp_int *C) { diff --git a/fp_mul_comba_28.i b/src/mul/fp_mul_comba_28.c similarity index 99% rename from fp_mul_comba_28.i rename to src/mul/fp_mul_comba_28.c index be7d776..686dbd4 100644 --- a/fp_mul_comba_28.i +++ b/src/mul/fp_mul_comba_28.c @@ -1,3 +1,6 @@ +#define TFM_DEFINES +#include "fp_mul_comba.c" + #ifdef TFM_MUL28 void fp_mul_comba28(fp_int *A, fp_int *B, fp_int *C) { diff --git a/fp_mul_comba_3.i b/src/mul/fp_mul_comba_3.c similarity index 94% rename from fp_mul_comba_3.i rename to src/mul/fp_mul_comba_3.c index 7b1675d..c0a286f 100644 --- a/fp_mul_comba_3.i +++ b/src/mul/fp_mul_comba_3.c @@ -1,3 +1,6 @@ +#define TFM_DEFINES +#include "fp_mul_comba.c" + #ifdef TFM_MUL3 void fp_mul_comba3(fp_int *A, fp_int *B, fp_int *C) { diff --git a/fp_mul_comba_32.i b/src/mul/fp_mul_comba_32.c similarity index 99% rename from fp_mul_comba_32.i rename to src/mul/fp_mul_comba_32.c index f7e722e..850b828 100644 --- a/fp_mul_comba_32.i +++ b/src/mul/fp_mul_comba_32.c @@ -1,3 +1,6 @@ +#define TFM_DEFINES +#include "fp_mul_comba.c" + #ifdef TFM_MUL32 void fp_mul_comba32(fp_int *A, fp_int *B, fp_int *C) { diff --git a/fp_mul_comba_4.i b/src/mul/fp_mul_comba_4.c similarity index 95% rename from fp_mul_comba_4.i rename to src/mul/fp_mul_comba_4.c index f84c15d..fb363ea 100644 --- a/fp_mul_comba_4.i +++ b/src/mul/fp_mul_comba_4.c @@ -1,3 +1,6 @@ +#define TFM_DEFINES +#include "fp_mul_comba.c" + #ifdef TFM_MUL4 void fp_mul_comba4(fp_int *A, fp_int *B, fp_int *C) { diff --git a/fp_mul_comba_48.i b/src/mul/fp_mul_comba_48.c similarity index 99% rename from fp_mul_comba_48.i rename to src/mul/fp_mul_comba_48.c index ce64bf5..ea966ba 100644 --- a/fp_mul_comba_48.i +++ b/src/mul/fp_mul_comba_48.c @@ -1,3 +1,6 @@ +#define TFM_DEFINES +#include "fp_mul_comba.c" + #ifdef TFM_MUL48 void fp_mul_comba48(fp_int *A, fp_int *B, fp_int *C) { diff --git a/fp_mul_comba_6.i b/src/mul/fp_mul_comba_6.c similarity index 97% rename from fp_mul_comba_6.i rename to src/mul/fp_mul_comba_6.c index 2be49a8..8f09b02 100644 --- a/fp_mul_comba_6.i +++ b/src/mul/fp_mul_comba_6.c @@ -1,3 +1,6 @@ +#define TFM_DEFINES +#include "fp_mul_comba.c" + #ifdef TFM_MUL6 void fp_mul_comba6(fp_int *A, fp_int *B, fp_int *C) { diff --git a/fp_mul_comba_64.i b/src/mul/fp_mul_comba_64.c similarity index 99% rename from fp_mul_comba_64.i rename to src/mul/fp_mul_comba_64.c index 4eb0b92..7f37a5e 100644 --- a/fp_mul_comba_64.i +++ b/src/mul/fp_mul_comba_64.c @@ -1,3 +1,6 @@ +#define TFM_DEFINES +#include "fp_mul_comba.c" + #ifdef TFM_MUL64 void fp_mul_comba64(fp_int *A, fp_int *B, fp_int *C) { diff --git a/fp_mul_comba_7.i b/src/mul/fp_mul_comba_7.c similarity index 98% rename from fp_mul_comba_7.i rename to src/mul/fp_mul_comba_7.c index 15486c5..7a97e95 100644 --- a/fp_mul_comba_7.i +++ b/src/mul/fp_mul_comba_7.c @@ -1,3 +1,6 @@ +#define TFM_DEFINES +#include "fp_mul_comba.c" + #ifdef TFM_MUL7 void fp_mul_comba7(fp_int *A, fp_int *B, fp_int *C) { diff --git a/fp_mul_comba_8.i b/src/mul/fp_mul_comba_8.c similarity index 98% rename from fp_mul_comba_8.i rename to src/mul/fp_mul_comba_8.c index acd0c6a..a630cbb 100644 --- a/fp_mul_comba_8.i +++ b/src/mul/fp_mul_comba_8.c @@ -1,3 +1,6 @@ +#define TFM_DEFINES +#include "fp_mul_comba.c" + #ifdef TFM_MUL8 void fp_mul_comba8(fp_int *A, fp_int *B, fp_int *C) { diff --git a/fp_mul_comba_9.i b/src/mul/fp_mul_comba_9.c similarity index 98% rename from fp_mul_comba_9.i rename to src/mul/fp_mul_comba_9.c index 902276d..63ca5cf 100644 --- a/fp_mul_comba_9.i +++ b/src/mul/fp_mul_comba_9.c @@ -1,3 +1,6 @@ +#define TFM_DEFINES +#include "fp_mul_comba.c" + #ifdef TFM_MUL9 void fp_mul_comba9(fp_int *A, fp_int *B, fp_int *C) { diff --git a/fp_mul_comba_small_set.i b/src/mul/fp_mul_comba_small_set.c similarity index 99% rename from fp_mul_comba_small_set.i rename to src/mul/fp_mul_comba_small_set.c index 75c07a6..1a9cdd3 100644 --- a/fp_mul_comba_small_set.i +++ b/src/mul/fp_mul_comba_small_set.c @@ -1,3 +1,6 @@ +#define TFM_DEFINES +#include "fp_mul_comba.c" + #if defined(TFM_SMALL_SET) void fp_mul_comba_small(fp_int *A, fp_int *B, fp_int *C) { diff --git a/fp_mul_d.c b/src/mul/fp_mul_d.c similarity index 100% rename from fp_mul_d.c rename to src/mul/fp_mul_d.c diff --git a/fp_mulmod.c b/src/mul/fp_mulmod.c similarity index 100% rename from fp_mulmod.c rename to src/mul/fp_mulmod.c diff --git a/fp_gcd.c b/src/numtheory/fp_gcd.c similarity index 100% rename from fp_gcd.c rename to src/numtheory/fp_gcd.c diff --git a/fp_invmod.c b/src/numtheory/fp_invmod.c similarity index 100% rename from fp_invmod.c rename to src/numtheory/fp_invmod.c diff --git a/fp_isprime.c b/src/numtheory/fp_isprime.c similarity index 99% rename from fp_isprime.c rename to src/numtheory/fp_isprime.c index 7642e93..b135184 100644 --- a/fp_isprime.c +++ b/src/numtheory/fp_isprime.c @@ -63,6 +63,7 @@ int fp_isprime(fp_int *a) } /* now do 8 miller rabins */ + fp_init(&b); for (r = 0; r < 8; r++) { fp_set(&b, primes[r]); fp_prime_miller_rabin(a, &b, &res); diff --git a/fp_lcm.c b/src/numtheory/fp_lcm.c similarity index 100% rename from fp_lcm.c rename to src/numtheory/fp_lcm.c diff --git a/fp_prime_miller_rabin.c b/src/numtheory/fp_prime_miller_rabin.c similarity index 100% rename from fp_prime_miller_rabin.c rename to src/numtheory/fp_prime_miller_rabin.c diff --git a/fp_prime_random_ex.c b/src/numtheory/fp_prime_random_ex.c similarity index 100% rename from fp_prime_random_ex.c rename to src/numtheory/fp_prime_random_ex.c diff --git a/fp_sqr.c b/src/sqr/fp_sqr.c similarity index 100% rename from fp_sqr.c rename to src/sqr/fp_sqr.c diff --git a/fp_sqr_comba.c b/src/sqr/fp_sqr_comba.c similarity index 83% rename from fp_sqr_comba.c rename to src/sqr/fp_sqr_comba.c index cb6a296..c75f773 100644 --- a/fp_sqr_comba.c +++ b/src/sqr/fp_sqr_comba.c @@ -14,7 +14,6 @@ #define TFM_X86 #endif - #if defined(TFM_X86) /* x86-32 optimized */ @@ -390,25 +389,25 @@ asm( \ /* multiplies point i and j, updates carry "c1" and digit c2 */ #define SQRADD(i, j) \ asm( \ - " mulld 16,%6,%6 \n\t" \ - " addc %0,%0,16 \n\t" \ - " mulhdu 16,%6,%6 \n\t" \ - " adde %1,%1,16 \n\t" \ + " mulld r16,%6,%6 \n\t" \ + " addc %0,%0,r16 \n\t" \ + " mulhdu r16,%6,%6 \n\t" \ + " adde %1,%1,r16 \n\t" \ " addze %2,%2 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i):"16","%cc"); +:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i):"r16","%cc"); /* for squaring some of the terms are doubled... */ #define SQRADD2(i, j) \ asm( \ - " mulld 16,%6,%7 \n\t" \ - " mulhdu 17,%6,%7 \n\t" \ - " addc %0,%0,16 \n\t" \ - " adde %1,%1,17 \n\t" \ + " mulld r16,%6,%7 \n\t" \ + " mulhdu r17,%6,%7 \n\t" \ + " addc %0,%0,r16 \n\t" \ + " adde %1,%1,r17 \n\t" \ " addze %2,%2 \n\t" \ - " addc %0,%0,16 \n\t" \ - " adde %1,%1,17 \n\t" \ + " addc %0,%0,r16 \n\t" \ + " adde %1,%1,r17 \n\t" \ " addze %2,%2 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"16", "17","%cc"); +:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"r16", "r17","%cc"); #define SQRADDSC(i, j) \ asm( \ @@ -419,12 +418,12 @@ asm( \ #define SQRADDAC(i, j) \ asm( \ - " mulld 16,%6,%7 \n\t" \ - " addc %0,%0,16 \n\t" \ - " mulhdu 16,%6,%7 \n\t" \ - " adde %1,%1,16 \n\t" \ + " mulld r16,%6,%7 \n\t" \ + " addc %0,%0,r16 \n\t" \ + " mulhdu r16,%6,%7 \n\t" \ + " adde %1,%1,r16 \n\t" \ " addze %2,%2 \n\t" \ -:"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j):"16", "%cc"); +:"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j):"r16", "%cc"); #define SQRADDDB \ asm( \ @@ -504,6 +503,113 @@ asm( \ " adc %2,%2,%5 \n\t" \ :"=r"(c0), "=r"(c1), "=r"(c2) : "r"(sc0), "r"(sc1), "r"(sc2), "0"(c0), "1"(c1), "2"(c2) : "%cc"); +#elif defined(TFM_MIPS) + +/* MIPS */ + +#define COMBA_START + +#define CLEAR_CARRY \ + c0 = c1 = c2 = 0; + +#define COMBA_STORE(x) \ + x = c0; + +#define COMBA_STORE2(x) \ + x = c1; + +#define CARRY_FORWARD \ + do { c0 = c1; c1 = c2; c2 = 0; } while (0); + +#define COMBA_FINI + +/* multiplies point i and j, updates carry "c1" and digit c2 */ +#define SQRADD(i, j) \ +asm( \ + " multu %6,%6 \n\t" \ + " mflo $12 \n\t" \ + " mfhi $13 \n\t" \ + " addu %0,%0,$12 \n\t" \ + " sltu $12,%0,$12 \n\t" \ + " addu %1,%1,$13 \n\t" \ + " sltu $13,%1,$13 \n\t" \ + " addu %1,%1,$12 \n\t" \ + " sltu $12,%1,$12 \n\t" \ + " addu %2,%2,$13 \n\t" \ + " addu %2,%2,$12 \n\t" \ +:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i):"$12","$13"); + +/* for squaring some of the terms are doubled... */ +#define SQRADD2(i, j) \ +asm( \ + " multu %6,%7 \n\t" \ + " mflo $12 \n\t" \ + " mfhi $13 \n\t" \ + \ + " addu %0,%0,$12 \n\t" \ + " sltu $14,%0,$12 \n\t" \ + " addu %1,%1,$13 \n\t" \ + " sltu $15,%1,$13 \n\t" \ + " addu %1,%1,$14 \n\t" \ + " sltu $14,%1,$14 \n\t" \ + " addu %2,%2,$15 \n\t" \ + " addu %2,%2,$14 \n\t" \ + \ + " addu %0,%0,$12 \n\t" \ + " sltu $14,%0,$12 \n\t" \ + " addu %1,%1,$13 \n\t" \ + " sltu $15,%1,$13 \n\t" \ + " addu %1,%1,$14 \n\t" \ + " sltu $14,%1,$14 \n\t" \ + " addu %2,%2,$15 \n\t" \ + " addu %2,%2,$14 \n\t" \ +:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"$12", "$13", "$14", "$15"); + +#define SQRADDSC(i, j) \ +asm( \ + " multu %6,%7 \n\t" \ + " mflo %0 \n\t" \ + " mfhi %1 \n\t" \ + " xor %2,%2,%2 \n\t" \ +:"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i),"r"(j) : "%cc"); + +#define SQRADDAC(i, j) \ +asm( \ + " multu %6,%7 \n\t" \ + " mflo $12 \n\t" \ + " mfhi $13 \n\t" \ + " addu %0,%0,$12 \n\t" \ + " sltu $12,%0,$12 \n\t" \ + " addu %1,%1,$13 \n\t" \ + " sltu $13,%1,$13 \n\t" \ + " addu %1,%1,$12 \n\t" \ + " sltu $12,%1,$12 \n\t" \ + " addu %2,%2,$13 \n\t" \ + " addu %2,%2,$12 \n\t" \ +:"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j):"$12", "$13", "$14"); + +#define SQRADDDB \ +asm( \ + " addu %0,%0,%3 \n\t" \ + " sltu $10,%0,%3 \n\t" \ + " addu %1,%1,$10 \n\t" \ + " sltu $10,%1,$10 \n\t" \ + " addu %1,%1,%4 \n\t" \ + " sltu $11,%1,%4 \n\t" \ + " addu %2,%2,$10 \n\t" \ + " addu %2,%2,$11 \n\t" \ + " addu %2,%2,%5 \n\t" \ + \ + " addu %0,%0,%3 \n\t" \ + " sltu $10,%0,%3 \n\t" \ + " addu %1,%1,$10 \n\t" \ + " sltu $10,%1,$10 \n\t" \ + " addu %1,%1,%4 \n\t" \ + " sltu $11,%1,%4 \n\t" \ + " addu %2,%2,$10 \n\t" \ + " addu %2,%2,$11 \n\t" \ + " addu %2,%2,%5 \n\t" \ +:"=r"(c0), "=r"(c1), "=r"(c2) : "r"(sc0), "r"(sc1), "r"(sc2), "0"(c0), "1"(c1), "2"(c2) : "$10", "$11"); #else @@ -566,19 +672,6 @@ asm( \ #endif -#include "fp_sqr_comba_generic.c" -#include "fp_sqr_comba_small_set.i" -#include "fp_sqr_comba_3.i" -#include "fp_sqr_comba_4.i" -#include "fp_sqr_comba_6.i" -#include "fp_sqr_comba_7.i" -#include "fp_sqr_comba_8.i" -#include "fp_sqr_comba_9.i" -#include "fp_sqr_comba_12.i" -#include "fp_sqr_comba_17.i" -#include "fp_sqr_comba_20.i" -#include "fp_sqr_comba_24.i" -#include "fp_sqr_comba_28.i" -#include "fp_sqr_comba_32.i" -#include "fp_sqr_comba_48.i" -#include "fp_sqr_comba_64.i" +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/fp_sqr_comba_12.i b/src/sqr/fp_sqr_comba_12.c similarity index 96% rename from fp_sqr_comba_12.i rename to src/sqr/fp_sqr_comba_12.c index 95e82d7..a1ed092 100644 --- a/fp_sqr_comba_12.i +++ b/src/sqr/fp_sqr_comba_12.c @@ -1,7 +1,13 @@ +#define TFM_DEFINES +#include "fp_sqr_comba.c" + #ifdef TFM_SQR12 void fp_sqr_comba12(fp_int *A, fp_int *B) { fp_digit *a, b[24], c0, c1, c2, sc0, sc1, sc2; +#ifdef TFM_ISO + fp_word tt; +#endif a = A->dp; COMBA_START; @@ -133,3 +139,6 @@ void fp_sqr_comba12(fp_int *A, fp_int *B) #endif +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/fp_sqr_comba_17.i b/src/sqr/fp_sqr_comba_17.c similarity index 97% rename from fp_sqr_comba_17.i rename to src/sqr/fp_sqr_comba_17.c index 0084d6c..798c190 100644 --- a/fp_sqr_comba_17.i +++ b/src/sqr/fp_sqr_comba_17.c @@ -1,7 +1,13 @@ +#define TFM_DEFINES +#include "fp_sqr_comba.c" + #ifdef TFM_SQR17 void fp_sqr_comba17(fp_int *A, fp_int *B) { fp_digit *a, b[34], c0, c1, c2, sc0, sc1, sc2; +#ifdef TFM_ISO + fp_word tt; +#endif a = A->dp; COMBA_START; @@ -183,3 +189,6 @@ void fp_sqr_comba17(fp_int *A, fp_int *B) #endif +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/fp_sqr_comba_20.i b/src/sqr/fp_sqr_comba_20.c similarity index 98% rename from fp_sqr_comba_20.i rename to src/sqr/fp_sqr_comba_20.c index 429ffd4..35b80e5 100644 --- a/fp_sqr_comba_20.i +++ b/src/sqr/fp_sqr_comba_20.c @@ -1,7 +1,13 @@ +#define TFM_DEFINES +#include "fp_sqr_comba.c" + #ifdef TFM_SQR20 void fp_sqr_comba20(fp_int *A, fp_int *B) { fp_digit *a, b[40], c0, c1, c2, sc0, sc1, sc2; +#ifdef TFM_ISO + fp_word tt; +#endif a = A->dp; COMBA_START; @@ -213,3 +219,6 @@ void fp_sqr_comba20(fp_int *A, fp_int *B) #endif +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/fp_sqr_comba_24.i b/src/sqr/fp_sqr_comba_24.c similarity index 98% rename from fp_sqr_comba_24.i rename to src/sqr/fp_sqr_comba_24.c index ab75509..7628c32 100644 --- a/fp_sqr_comba_24.i +++ b/src/sqr/fp_sqr_comba_24.c @@ -1,7 +1,13 @@ +#define TFM_DEFINES +#include "fp_sqr_comba.c" + #ifdef TFM_SQR24 void fp_sqr_comba24(fp_int *A, fp_int *B) { fp_digit *a, b[48], c0, c1, c2, sc0, sc1, sc2; +#ifdef TFM_ISO + fp_word tt; +#endif a = A->dp; COMBA_START; @@ -253,3 +259,6 @@ void fp_sqr_comba24(fp_int *A, fp_int *B) #endif +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/fp_sqr_comba_28.i b/src/sqr/fp_sqr_comba_28.c similarity index 99% rename from fp_sqr_comba_28.i rename to src/sqr/fp_sqr_comba_28.c index 03e4575..043574d 100644 --- a/fp_sqr_comba_28.i +++ b/src/sqr/fp_sqr_comba_28.c @@ -1,7 +1,13 @@ +#define TFM_DEFINES +#include "fp_sqr_comba.c" + #ifdef TFM_SQR28 void fp_sqr_comba28(fp_int *A, fp_int *B) { fp_digit *a, b[56], c0, c1, c2, sc0, sc1, sc2; +#ifdef TFM_ISO + fp_word tt; +#endif a = A->dp; COMBA_START; @@ -293,3 +299,6 @@ void fp_sqr_comba28(fp_int *A, fp_int *B) #endif +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/fp_sqr_comba_3.i b/src/sqr/fp_sqr_comba_3.c similarity index 85% rename from fp_sqr_comba_3.i rename to src/sqr/fp_sqr_comba_3.c index c776702..7aefa4f 100644 --- a/fp_sqr_comba_3.i +++ b/src/sqr/fp_sqr_comba_3.c @@ -1,7 +1,13 @@ +#define TFM_DEFINES +#include "fp_sqr_comba.c" + #ifdef TFM_SQR3 void fp_sqr_comba3(fp_int *A, fp_int *B) { fp_digit *a, b[6], c0, c1, c2, sc0, sc1, sc2; +#ifdef TFM_ISO + fp_word tt; +#endif a = A->dp; COMBA_START; @@ -43,3 +49,6 @@ void fp_sqr_comba3(fp_int *A, fp_int *B) #endif +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/fp_sqr_comba_32.i b/src/sqr/fp_sqr_comba_32.c similarity index 99% rename from fp_sqr_comba_32.i rename to src/sqr/fp_sqr_comba_32.c index 097530e..2e8ca55 100644 --- a/fp_sqr_comba_32.i +++ b/src/sqr/fp_sqr_comba_32.c @@ -1,7 +1,13 @@ +#define TFM_DEFINES +#include "fp_sqr_comba.c" + #ifdef TFM_SQR32 void fp_sqr_comba32(fp_int *A, fp_int *B) { fp_digit *a, b[64], c0, c1, c2, sc0, sc1, sc2; +#ifdef TFM_ISO + fp_word tt; +#endif a = A->dp; COMBA_START; @@ -333,3 +339,6 @@ void fp_sqr_comba32(fp_int *A, fp_int *B) #endif +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/fp_sqr_comba_4.i b/src/sqr/fp_sqr_comba_4.c similarity index 88% rename from fp_sqr_comba_4.i rename to src/sqr/fp_sqr_comba_4.c index dcf1b70..cd8de7e 100644 --- a/fp_sqr_comba_4.i +++ b/src/sqr/fp_sqr_comba_4.c @@ -1,7 +1,13 @@ +#define TFM_DEFINES +#include "fp_sqr_comba.c" + #ifdef TFM_SQR4 void fp_sqr_comba4(fp_int *A, fp_int *B) { fp_digit *a, b[8], c0, c1, c2, sc0, sc1, sc2; +#ifdef TFM_ISO + fp_word tt; +#endif a = A->dp; COMBA_START; @@ -53,3 +59,6 @@ void fp_sqr_comba4(fp_int *A, fp_int *B) #endif +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/fp_sqr_comba_48.i b/src/sqr/fp_sqr_comba_48.c similarity index 99% rename from fp_sqr_comba_48.i rename to src/sqr/fp_sqr_comba_48.c index 44d7dfb..256f7b9 100644 --- a/fp_sqr_comba_48.i +++ b/src/sqr/fp_sqr_comba_48.c @@ -1,7 +1,13 @@ +#define TFM_DEFINES +#include "fp_sqr_comba.c" + #ifdef TFM_SQR48 void fp_sqr_comba48(fp_int *A, fp_int *B) { fp_digit *a, b[96], c0, c1, c2, sc0, sc1, sc2; +#ifdef TFM_ISO + fp_word tt; +#endif a = A->dp; COMBA_START; @@ -493,3 +499,6 @@ void fp_sqr_comba48(fp_int *A, fp_int *B) #endif +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/fp_sqr_comba_6.i b/src/sqr/fp_sqr_comba_6.c similarity index 91% rename from fp_sqr_comba_6.i rename to src/sqr/fp_sqr_comba_6.c index 0116780..2537621 100644 --- a/fp_sqr_comba_6.i +++ b/src/sqr/fp_sqr_comba_6.c @@ -1,7 +1,13 @@ +#define TFM_DEFINES +#include "fp_sqr_comba.c" + #ifdef TFM_SQR6 void fp_sqr_comba6(fp_int *A, fp_int *B) { fp_digit *a, b[12], c0, c1, c2, sc0, sc1, sc2; +#ifdef TFM_ISO + fp_word tt; +#endif a = A->dp; COMBA_START; @@ -73,3 +79,6 @@ void fp_sqr_comba6(fp_int *A, fp_int *B) #endif +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/fp_sqr_comba_64.i b/src/sqr/fp_sqr_comba_64.c similarity index 99% rename from fp_sqr_comba_64.i rename to src/sqr/fp_sqr_comba_64.c index 743f9f9..88871ac 100644 --- a/fp_sqr_comba_64.i +++ b/src/sqr/fp_sqr_comba_64.c @@ -1,7 +1,13 @@ +#define TFM_DEFINES +#include "fp_sqr_comba.c" + #ifdef TFM_SQR64 void fp_sqr_comba64(fp_int *A, fp_int *B) { fp_digit *a, b[128], c0, c1, c2, sc0, sc1, sc2; +#ifdef TFM_ISO + fp_word tt; +#endif a = A->dp; COMBA_START; @@ -653,3 +659,6 @@ void fp_sqr_comba64(fp_int *A, fp_int *B) #endif +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/fp_sqr_comba_7.i b/src/sqr/fp_sqr_comba_7.c similarity index 93% rename from fp_sqr_comba_7.i rename to src/sqr/fp_sqr_comba_7.c index 9774991..08c520f 100644 --- a/fp_sqr_comba_7.i +++ b/src/sqr/fp_sqr_comba_7.c @@ -1,7 +1,13 @@ +#define TFM_DEFINES +#include "fp_sqr_comba.c" + #ifdef TFM_SQR7 void fp_sqr_comba7(fp_int *A, fp_int *B) { fp_digit *a, b[14], c0, c1, c2, sc0, sc1, sc2; +#ifdef TFM_ISO + fp_word tt; +#endif a = A->dp; COMBA_START; @@ -83,3 +89,6 @@ void fp_sqr_comba7(fp_int *A, fp_int *B) #endif +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/fp_sqr_comba_8.i b/src/sqr/fp_sqr_comba_8.c similarity index 94% rename from fp_sqr_comba_8.i rename to src/sqr/fp_sqr_comba_8.c index e9d003b..9300b17 100644 --- a/fp_sqr_comba_8.i +++ b/src/sqr/fp_sqr_comba_8.c @@ -1,7 +1,13 @@ +#define TFM_DEFINES +#include "fp_sqr_comba.c" + #ifdef TFM_SQR8 void fp_sqr_comba8(fp_int *A, fp_int *B) { fp_digit *a, b[16], c0, c1, c2, sc0, sc1, sc2; +#ifdef TFM_ISO + fp_word tt; +#endif a = A->dp; COMBA_START; @@ -93,3 +99,6 @@ void fp_sqr_comba8(fp_int *A, fp_int *B) #endif +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/fp_sqr_comba_9.i b/src/sqr/fp_sqr_comba_9.c similarity index 94% rename from fp_sqr_comba_9.i rename to src/sqr/fp_sqr_comba_9.c index 531a325..880e29e 100644 --- a/fp_sqr_comba_9.i +++ b/src/sqr/fp_sqr_comba_9.c @@ -1,7 +1,13 @@ +#define TFM_DEFINES +#include "fp_sqr_comba.c" + #ifdef TFM_SQR9 void fp_sqr_comba9(fp_int *A, fp_int *B) { fp_digit *a, b[18], c0, c1, c2, sc0, sc1, sc2; +#ifdef TFM_ISO + fp_word tt; +#endif a = A->dp; COMBA_START; @@ -103,3 +109,6 @@ void fp_sqr_comba9(fp_int *A, fp_int *B) #endif +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/fp_sqr_comba_generic.c b/src/sqr/fp_sqr_comba_generic.c similarity index 97% rename from fp_sqr_comba_generic.c rename to src/sqr/fp_sqr_comba_generic.c index 2df4a7a..c5d1618 100644 --- a/fp_sqr_comba_generic.c +++ b/src/sqr/fp_sqr_comba_generic.c @@ -8,6 +8,9 @@ * Tom St Denis, tomstdenis@gmail.com */ +#define TFM_DEFINES +#include "fp_sqr_comba.c" + /* generic comba squarer */ void fp_sqr_comba(fp_int *A, fp_int *B) { diff --git a/fp_sqr_comba_small_set.i b/src/sqr/fp_sqr_comba_small_set.c similarity index 99% rename from fp_sqr_comba_small_set.i rename to src/sqr/fp_sqr_comba_small_set.c index 29c3d1d..1d505ea 100644 --- a/fp_sqr_comba_small_set.i +++ b/src/sqr/fp_sqr_comba_small_set.c @@ -1,3 +1,6 @@ +#define TFM_DEFINES +#include "fp_sqr_comba.c" + #if defined(TFM_SMALL_SET) void fp_sqr_comba_small(fp_int *A, fp_int *B) { @@ -1513,3 +1516,7 @@ void fp_sqr_comba_small(fp_int *A, fp_int *B) } #endif /* TFM_SMALL_SET */ + +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */ diff --git a/fp_sqrmod.c b/src/sqr/fp_sqrmod.c similarity index 100% rename from fp_sqrmod.c rename to src/sqr/fp_sqrmod.c diff --git a/tfm.dvi b/tfm.dvi index 37e6cf5ce63fb066f9652c45279bf7d39aebd6ba..472a069ccaf3c1f9849d026e3b8b00c32fe49021 100644 GIT binary patch delta 393 zcmX@HocYLd<_U6w=6VLkdWI%ehL)xl-3$y2jFTPpRW=6mFftlVPGC%uoW#(|l}$UEPo~o1cLdK=QD9^ zzN|5sjnM+A#AiHlH%u%fT267OZ6A+kC;gfrBx0 zbD+yU9!9y%0)ebtjCaB60-`nf86QJ6^KCwqwS$q-9W1jor-YT!10=IKrO1wr@jF=b zZpD07#sZ+I+T?YsL^toK`@+TO1(bnsUv%1WF;>B4lct z&o~&3LDHMot;%6%428>tZJNiy_yVrcVE1J%#zSyf`(wR~j2Gdu94Dl?7-wx(xipWF KLz3w}7ytkt;*i1s delta 375 zcmX@IocY9Z<_U50N$iTpCvS6LuGp8C+b@*PG(hRVr81FI7Mx; zL7>v+wHlk*80|JE>gO;qT7gA37>P_?m&G@Et%k&8J)>yGKjTZd`gK{y7#V%R>euI#urm6=W#WqL z*cktUWv*AuXJsq{%2;pSRQH98F#ss4w)t#lFc)LPX2mJ2tc<_FBEB;PIhbZLfECVO z_>6 tmplist + +perl filter.pl makefile tmplist +mv -f tmp.delme makefile + +perl filter.pl makefile.shared tmplist +mv -f tmp.delme makefile.shared + +rm -f tmplist +rm -f tmp.delme