comparison tomsfastmath/src/generators/comba_mont_gen.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 #include <stdio.h>
2
3 int main(void)
4 {
5 int x, y, z;
6
7 printf(
8 #if 1
9 "#ifdef TFM_SMALL_SET\n"
10 "/* computes x/R == x (mod N) via Montgomery Reduction */\n"
11 "void fp_montgomery_reduce_small(fp_int *a, fp_int *m, fp_digit mp)\n"
12 "{\n"
13 " fp_digit c[FP_SIZE], *_c, *tmpm, mu, cy;\n"
14 " int oldused, x, y, pa;\n"
15 "\n"
16 "#if defined(USE_MEMSET)\n"
17 " /* now zero the buff */\n"
18 " memset(c, 0, sizeof c);\n"
19 "#endif\n"
20 " pa = m->used;\n"
21 "\n"
22 " /* copy the input */\n"
23 " oldused = a->used;\n"
24 " for (x = 0; x < oldused; x++) {\n"
25 " c[x] = a->dp[x];\n"
26 " }\n"
27 "#if !defined(USE_MEMSET)\n"
28 " for (; x < 2*pa+3; x++) {\n"
29 " c[x] = 0;\n"
30 " }\n"
31 "#endif\n"
32 " MONT_START;\n"
33 #endif
34 "\n"
35 " switch (pa) {\n");
36
37 for (x = 1; x <= 16; x++) {
38 if (x > 16 && (x != 32 && x != 48 && x != 64)) continue;
39 if (x > 16) printf("#ifdef TFM_HUGE\n");
40
41
42
43 printf(" case %d:\n", x);
44
45 for (y = 0; y < x; y++) {
46
47 printf(" x = %d; cy = 0;\n"
48 " LOOP_START;\n"
49 " _c = c + %d;\n"
50 " tmpm = m->dp;\n", y, y);
51
52 printf("#ifdef INNERMUL8\n");
53 for (z = 0; z+8 <= x; z += 8) {
54 printf(" INNERMUL8; _c += 8; tmpm += 8;\n");
55 }
56 for (; z < x; z++) {
57 printf(" INNERMUL; ++_c;\n");
58 }
59 printf("#else\n");
60 for (z = 0; z < x; z++) {
61 printf(" INNERMUL; ++_c;\n");
62 }
63 printf("#endif\n");
64 printf(" LOOP_END;\n"
65 " while (cy) {\n"
66 " PROPCARRY;\n"
67 " ++_c;\n"
68 " }\n");
69 }
70 //printf(" }\n");
71 printf(" break;\n");
72
73
74
75 #define LOOP_MACRO(stride) \
76 for (x = 0; x < stride; x++) { \
77 fp_digit cy = 0; \
78 /* get Mu for this round */ \
79 LOOP_START; \
80 _c = c + x; \
81 tmpm = m->dp; \
82 for (y = 0; y < stride; y++) { \
83 INNERMUL; \
84 ++_c; \
85 } \
86 LOOP_END; \
87 while (cy) { \
88 PROPCARRY; \
89 ++_c; \
90 } \
91 }
92
93
94
95
96
97 if (x > 16) printf("#endif /* TFM_HUGE */\n");
98
99
100 }
101
102 #if 1
103
104 printf(
105 " }\n"
106 " /* now copy out */\n"
107 " _c = c + pa;\n"
108 " tmpm = a->dp;\n"
109 " for (x = 0; x < pa+1; x++) {\n"
110 " *tmpm++ = *_c++;\n"
111 " }\n"
112 "\n"
113 " for (; x < oldused; x++) {\n"
114 " *tmpm++ = 0;\n"
115 " }\n"
116 "\n"
117 " MONT_FINI;\n"
118 "\n"
119 " a->used = pa+1;\n"
120 " fp_clamp(a);\n"
121 "\n"
122 " /* if A >= m then A = A - m */\n"
123 " if (fp_cmp_mag (a, m) != FP_LT) {\n"
124 " s_fp_sub (a, m, a);\n"
125 " }\n"
126 "}\n\n#endif\n");
127
128 #endif
129
130
131 return 0;
132 }