]> pd.if.org Git - zpackage/blob - tomsfastmath/src/generators/comba_sqr_gen.c
commit files needed for zpm-fetchurl
[zpackage] / tomsfastmath / src / generators / comba_sqr_gen.c
1 /* TomsFastMath, a fast ISO C bignum library.
2  *
3  * This project is meant to fill in where LibTomMath
4  * falls short.  That is speed ;-)
5  *
6  * This project is public domain and free for all purposes.
7  *
8  * Tom St Denis, tomstdenis@gmail.com
9  */
10
11 #include <stdio.h>
12 #include <stdlib.h>
13
14 int main(int argc, char **argv)
15 {
16    int x, y, z, N, f;
17    N = atoi(argv[1]);
18
19 printf(
20 "#define TFM_DEFINES\n"
21 "#include \"fp_sqr_comba.c\"\n"
22 "\n"
23 "#if defined(TFM_SQR%d) && FP_SIZE >= %d\n"
24 "void fp_sqr_comba%d(fp_int *A, fp_int *B)\n"
25 "{\n"
26 "   fp_digit *a, b[%d], c0, c1, c2, sc0, sc1, sc2;\n"
27 "#ifdef TFM_ISO\n"
28 "   fp_word tt;\n"
29 "#endif\n"
30 "\n"
31 "   a = A->dp;\n"
32 "   COMBA_START;\n"
33 "\n"
34 "   /* clear carries */\n"
35 "   CLEAR_CARRY;\n"
36 "\n"
37 "   /* output 0 */\n"
38 "   SQRADD(a[0],a[0]);\n"
39 "   COMBA_STORE(b[0]);\n", N, N+N, N, N+N);
40
41    for (x = 1; x < N+N-1; x++) {
42 printf(
43 "\n   /* output %d */\n"
44 "   CARRY_FORWARD;\n   ", x);
45
46        for (f = y = 0; y < N; y++) {
47            for (z = 0; z < N; z++) {
48                if (z != y && z + y == x && y <= z) {
49                   ++f;
50                }
51            }
52        }
53
54    if (f <= 2) {
55        for (y = 0; y < N; y++) {
56            for (z = 0; z < N; z++) {
57                if (y<=z && (y+z)==x) {
58                   if (y == z) {
59                      printf("SQRADD(a[%d], a[%d]); ", y, y);
60                   } else {
61                      printf("SQRADD2(a[%d], a[%d]); ", y, z);
62                   }
63                }
64            }
65        }
66    } else {
67       // new method
68       /* do evens first */
69        f = 0;
70        for (y = 0; y < N; y++) {
71            for (z = 0; z < N; z++) {
72                if (z != y && z + y == x && y <= z) {
73                   if (f == 0) {
74                      // first double
75                      printf("SQRADDSC(a[%d], a[%d]); ", y, z);
76                      f = 1;
77                   } else {
78                      printf("SQRADDAC(a[%d], a[%d]); ", y, z);
79                   }
80                }
81            }
82        }
83        // forward the carry
84        printf("SQRADDDB; ");
85        if ((x&1) == 0) {
86           // add the square
87           printf("SQRADD(a[%d], a[%d]); ", x/2, x/2);
88        }
89     }
90 printf("\n   COMBA_STORE(b[%d]);\n", x);
91    }
92 printf("   COMBA_STORE2(b[%d]);\n", N+N-1);
93
94 printf(
95 "   COMBA_FINI;\n"
96 "\n"
97 "   B->used = %d;\n"
98 "   B->sign = FP_ZPOS;\n"
99 "   memcpy(B->dp, b, %d * sizeof(fp_digit));\n"
100 "   fp_clamp(B);\n"
101 "}\n#endif\n\n\n"
102 "/* $Source$ */\n"
103 "/* $Revision$ */\n"
104 "/* $Date$ */\n"
105 , N+N, N+N);
106
107   return 0;
108 }
109
110 /* $Source$ */
111 /* $Revision$ */
112 /* $Date$ */