]> pd.if.org Git - zpackage/blob - comba_mult_smallgen.c
db9fddb284fae3bc0e7c1db7878b7156c5171328
[zpackage] / comba_mult_smallgen.c
1 /* program emits a NxN comba multiplier for 1x1 to 16x16 */
2 #include <stdio.h>
3
4 int main(int argc, char **argv)
5 {
6    int N, x, y, z;
7
8    /* print out preamble */
9 printf(
10 "#define TFM_DEFINES\n"
11 "#include \"fp_mul_comba.c\"\n"
12 "\n"
13 "#if defined(TFM_SMALL_SET)\n"
14 "void fp_mul_comba_small(fp_int *A, fp_int *B, fp_int *C)\n"
15 "{\n"
16 "   fp_digit c0, c1, c2, at[32];\n"
17 "   switch (MAX(A->used, B->used)) { \n"
18 );
19
20 for (N = 1; N <= 16; N++) {
21
22 printf(
23 "\n"
24 "   case %d:\n"
25 "      memcpy(at, A->dp, %d * sizeof(fp_digit));\n"
26 "      memcpy(at+%d, B->dp, %d * sizeof(fp_digit));\n"
27 "      COMBA_START;\n"
28 "\n"
29 "      COMBA_CLEAR;\n", N, N, N, N);
30
31    /* now do the rows */
32    for (x = 0; x < (N+N-1); x++) {
33 printf(
34 "      /* %d */\n", x);
35 if (x > 0) {
36 printf(
37 "      COMBA_FORWARD;\n");
38 }
39       for (y = 0; y < N; y++) {
40       for (z = 0; z < N; z++) {
41           if ((y+z)==x) {
42              printf("      MULADD(at[%d], at[%d]); ", y, z+N);
43           }
44       }
45       }
46 printf(
47 "\n"
48 "      COMBA_STORE(C->dp[%d]);\n", x);
49    }
50 printf(
51 "      COMBA_STORE2(C->dp[%d]);\n"
52 "      C->used = %d;\n"
53 "      C->sign = A->sign ^ B->sign;\n"
54 "      fp_clamp(C);\n"
55 "      COMBA_FINI;\n"
56 "      break;\n", N+N-1, N+N);
57 }
58 printf("   }\n}\n\n#endif\n\n\n"
59 "/* $Source$ */\n"
60 "/* $Revision$ */\n"
61 "/* $Date$ */\n");
62
63   return 0;
64 }
65
66 /* $Source$ */
67 /* $Revision$ */
68 /* $Date$ */