comparison tomsfastmath/src/generators/comba_sqr_smallgen.c @ 643:a362b62d38b2 dropbear-tfm

Add tomsfastmath from git rev bfa4582842bc3bab42e4be4aed5703437049502a with Makefile.in renamed
author Matt Johnston <matt@ucc.asn.au>
date Wed, 23 Nov 2011 18:10:20 +0700
parents
children
comparison
equal deleted inserted replaced
642:33fd2f3499d2 643:a362b62d38b2
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, [email protected]
9 */
10
11 /* Generates squaring comba code... it learns it knows our secrets! */
12 #include <stdio.h>
13
14 int main(int argc, char **argv)
15 {
16 int x, y, z, N, f;
17
18 printf(
19 "#define TFM_DEFINES\n"
20 "#include \"fp_sqr_comba.c\"\n"
21 "\n"
22 "#if defined(TFM_SMALL_SET)\n"
23 "void fp_sqr_comba_small(fp_int *A, fp_int *B)\n"
24 "{\n"
25 " fp_digit *a, b[32], c0, c1, c2, sc0, sc1, sc2;\n"
26 "#ifdef TFM_ISO\n"
27 " fp_word tt;\n"
28 "#endif\n"
29 );
30
31 printf(" switch (A->used) { \n");
32
33 for (N = 1; N <= 16; N++) {
34 printf(
35 " case %d:\n"
36 " a = A->dp;\n"
37 " COMBA_START; \n"
38 "\n"
39 " /* clear carries */\n"
40 " CLEAR_CARRY;\n"
41 "\n"
42 " /* output 0 */\n"
43 " SQRADD(a[0],a[0]);\n"
44 " COMBA_STORE(b[0]);\n", N);
45
46 for (x = 1; x < N+N-1; x++) {
47 printf(
48 "\n /* output %d */\n"
49 " CARRY_FORWARD;\n ", x);
50
51 for (f = y = 0; y < N; y++) {
52 for (z = 0; z < N; z++) {
53 if (z != y && z + y == x && y <= z) {
54 ++f;
55 }
56 }
57 }
58
59 if (f <= 2) {
60 for (y = 0; y < N; y++) {
61 for (z = 0; z < N; z++) {
62 if (y<=z && (y+z)==x) {
63 if (y == z) {
64 printf(" SQRADD(a[%d], a[%d]); ", y, y);
65 } else {
66 printf(" SQRADD2(a[%d], a[%d]); ", y, z);
67 }
68 }
69 }
70 }
71 } else {
72 // new method
73 /* do evens first */
74 f = 0;
75 for (y = 0; y < N; y++) {
76 for (z = 0; z < N; z++) {
77 if (z != y && z + y == x && y <= z) {
78 if (f == 0) {
79 // first double
80 printf("SQRADDSC(a[%d], a[%d]); ", y, z);
81 f = 1;
82 } else {
83 printf("SQRADDAC(a[%d], a[%d]); ", y, z);
84 }
85 }
86 }
87 }
88 // forward the carry
89 printf("SQRADDDB; ");
90 if ((x&1) == 0) {
91 // add the square
92 printf("SQRADD(a[%d], a[%d]); ", x/2, x/2);
93 }
94 }
95 printf("\n COMBA_STORE(b[%d]);\n", x);
96 }
97 printf(" COMBA_STORE2(b[%d]);\n", N+N-1);
98
99 printf(
100 " COMBA_FINI;\n"
101 "\n"
102 " B->used = %d;\n"
103 " B->sign = FP_ZPOS;\n"
104 " memcpy(B->dp, b, %d * sizeof(fp_digit));\n"
105 " memset(B->dp + %d, 0, (FP_SIZE - %d) * sizeof(fp_digit));\n"
106 " fp_clamp(B);\n"
107 " break;\n\n", N+N, N+N, N+N, N+N);
108 }
109
110 printf("}\n}\n\n#endif /* TFM_SMALL_SET */\n");
111
112 return 0;
113 }
114
115 /* $Source$ */
116 /* $Revision$ */
117 /* $Date$ */