tomsfastmath/src/mul/fp_mul.c

129 lines
3.0 KiB
C
Raw Normal View History

2004-08-25 04:43:43 +02:00
/* 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.
*
2005-07-23 12:43:03 +02:00
* Tom St Denis, tomstdenis@gmail.com
2004-08-25 04:43:43 +02:00
*/
#include <tfm.h>
/* c = a * b */
void fp_mul(fp_int *A, fp_int *B, fp_int *C)
{
2006-04-06 21:49:03 +02:00
int y, yy;
2004-08-25 04:43:43 +02:00
2005-10-31 16:32:05 +01:00
/* call generic if we're out of range */
if (A->used + B->used > FP_SIZE) {
fp_mul_comba(A, B, C);
return ;
}
2004-08-25 04:43:43 +02:00
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
*/
2005-07-23 12:43:03 +02:00
2011-09-20 12:00:07 +02:00
#ifdef TFM_MUL3 && FP_SIZE >= 6
2006-11-01 08:42:37 +01:00
if (y <= 3) {
fp_mul_comba3(A,B,C);
return;
}
#endif
2011-09-20 12:00:07 +02:00
#ifdef TFM_MUL4 && FP_SIZE >= 8
2006-11-01 08:42:37 +01:00
if (y == 4) {
fp_mul_comba4(A,B,C);
return;
}
#endif
2011-09-20 12:00:07 +02:00
#ifdef TFM_MUL6 && FP_SIZE >= 12
2006-11-01 08:42:37 +01:00
if (y <= 6) {
fp_mul_comba6(A,B,C);
return;
}
#endif
2011-09-20 12:00:07 +02:00
#ifdef TFM_MUL7 && FP_SIZE >= 14
2006-11-01 08:42:37 +01:00
if (y == 7) {
fp_mul_comba7(A,B,C);
return;
}
#endif
2011-09-20 12:00:07 +02:00
#ifdef TFM_MUL8 && FP_SIZE >= 16
2006-11-01 08:42:37 +01:00
if (y == 8) {
fp_mul_comba8(A,B,C);
return;
}
#endif
2011-09-20 12:00:07 +02:00
#ifdef TFM_MUL9 && FP_SIZE >= 18
2006-11-01 08:42:37 +01:00
if (y == 9) {
fp_mul_comba9(A,B,C);
return;
}
#endif
2011-09-20 12:00:07 +02:00
#ifdef TFM_MUL12 && FP_SIZE >= 24
2006-11-01 08:42:37 +01:00
if (y <= 12) {
fp_mul_comba12(A,B,C);
return;
}
#endif
2011-09-20 12:00:07 +02:00
#ifdef TFM_MUL17 && FP_SIZE >= 34
2006-11-01 08:42:37 +01:00
if (y <= 17) {
fp_mul_comba17(A,B,C);
return;
}
#endif
2011-09-20 12:00:07 +02:00
#ifdef TFM_SMALL_SET && FP_SIZE >= 32
2005-07-23 12:43:03 +02:00
if (y <= 16) {
fp_mul_comba_small(A,B,C);
2005-11-18 06:16:25 +01:00
return;
}
#endif
2011-09-20 12:00:07 +02:00
#if defined(TFM_MUL20) && FP_SIZE >= 40
2006-04-06 21:49:03 +02:00
if (y <= 20) {
fp_mul_comba20(A,B,C);
return;
}
#endif
2011-09-20 12:00:07 +02:00
#if defined(TFM_MUL24) && FP_SIZE >= 48
2006-04-06 21:49:03 +02:00
if (yy >= 16 && y <= 24) {
fp_mul_comba24(A,B,C);
return;
}
#endif
2011-09-20 12:00:07 +02:00
#if defined(TFM_MUL28) && FP_SIZE >= 56
2006-04-06 21:49:03 +02:00
if (yy >= 20 && y <= 28) {
fp_mul_comba28(A,B,C);
return;
}
#endif
2011-09-20 12:00:07 +02:00
#if defined(TFM_MUL32) && FP_SIZE >= 64
2005-11-18 06:16:25 +01:00
if (yy >= 24 && y <= 32) {
2004-08-25 04:43:43 +02:00
fp_mul_comba32(A,B,C);
2005-11-18 06:16:25 +01:00
return;
}
2005-10-31 16:32:05 +01:00
#endif
2011-09-20 12:00:07 +02:00
#if defined(TFM_MUL48) && FP_SIZE >= 96
2005-11-18 06:16:25 +01:00
if (yy >= 40 && y <= 48) {
2005-07-23 12:43:03 +02:00
fp_mul_comba48(A,B,C);
2005-11-18 06:16:25 +01:00
return;
}
#endif
2011-09-20 12:00:07 +02:00
#if defined(TFM_MUL64) && FP_SIZE >= 128
2005-11-18 06:16:25 +01:00
if (yy >= 56 && y <= 64) {
2005-07-23 12:43:03 +02:00
fp_mul_comba64(A,B,C);
2005-11-18 06:16:25 +01:00
return;
2004-08-25 04:43:43 +02:00
}
2005-11-18 06:16:25 +01:00
#endif
fp_mul_comba(A,B,C);
2004-08-25 04:43:43 +02:00
}
2005-07-23 12:43:03 +02:00
2011-09-20 12:00:07 +02:00
/* $Source: /cvs/libtom/tomsfastmath/src/mul/fp_mul.c,v $ */
/* $Revision: 1.1 $ */
/* $Date: 2006/12/31 21:25:53 $ */