base/asm-common.h (x86), and knock-on: Add macros for full-size regs.
[catacomb] / math / Makefile.am
CommitLineData
0f00dc4c
MW
1### -*-makefile-*-
2###
3### Build script for mathematical infrastructure
4###
5### (c) 2013 Straylight/Edgeware
6###
7
8###----- Licensing notice ---------------------------------------------------
9###
10### This file is part of Catacomb.
11###
12### Catacomb is free software; you can redistribute it and/or modify
13### it under the terms of the GNU Library General Public License as
14### published by the Free Software Foundation; either version 2 of the
15### License, or (at your option) any later version.
16###
17### Catacomb is distributed in the hope that it will be useful,
18### but WITHOUT ANY WARRANTY; without even the implied warranty of
19### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20### GNU Library General Public License for more details.
21###
22### You should have received a copy of the GNU Library General Public
23### License along with Catacomb; if not, write to the Free
24### Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
25### MA 02111-1307, USA.
26
27include $(top_srcdir)/vars.am
28
29noinst_LTLIBRARIES = libmath.la
30libmath_la_SOURCES =
31nodist_libmath_la_SOURCES =
32libmath_la_LIBADD =
33
34TEST_LIBS = libmath.la
35
36###--------------------------------------------------------------------------
1c3d4cf5
MW
37### Representation of multiprecision integers.
38
39## The `mpgen' tool for dealing with these things.
40mpgen = $(srcdir)/mpgen
41EXTRA_DIST += mpgen
3eda76a3
MW
42AM_V_MPGEN = $(AM_V_MPGEN_@AM_V@)
43AM_V_MPGEN_ = $(AM_V_MPGEN_@AM_DEFAULT_V@)
44AM_V_MPGEN_0 = @echo " MPGEN $@";
1c3d4cf5
MW
45MPGEN = $(AM_V_MPGEN)$(PYTHON) $(mpgen)
46
47## The type information collected by `configure'.
48CLEANFILES += typeinfo.py
49EXTRA_DIST += typeinfo.py.in
50typeinfo.py: $(srcdir)/typeinfo.py.in Makefile
51 $(SUBST) $(srcdir)/typeinfo.py.in >typeinfo.py.new \
52 type_bits="@type_bits@" \
53 limits="@limits@" && \
54 mv typeinfo.py.new typeinfo.py
55
56## The header file containing our representation choices.
57BUILT_SOURCES += mptypes.h
58CLEANFILES += mptypes.h
59nodist_archinclude_HEADERS += mptypes.h
60mptypes.h: $(mpgen) typeinfo.py
61 $(MPGEN) mptypes >mptypes.h.in && mv mptypes.h.in mptypes.h
62
63## Limits of C types as multiprecision integers.
64BUILT_SOURCES += mplimits.h mplimits.c
65CLEANFILES += mplimits.h mplimits.c
66nodist_archinclude_HEADERS += mplimits.h
67nodist_libmath_la_SOURCES += mplimits.c
68mplimits.h: $(mpgen) typeinfo.py
69 $(MPGEN) mplimits_h >mplimits.h.in && mv mplimits.h.in mplimits.h
70mplimits.c: $(mpgen) typeinfo.py
71 $(MPGEN) mplimits_c >mplimits.c.in && mv mplimits.c.in mplimits.c
0f00dc4c 72
1c3d4cf5
MW
73###--------------------------------------------------------------------------
74### Main multiprecision integer library.
0f00dc4c
MW
75
76## Additional buffer I/O functions for mathematical objects.
77pkginclude_HEADERS += buf.h
78libmath_la_SOURCES += buf.c
79
80## Infrastructure for fast exponentiation.
81pkginclude_HEADERS += exp.h
82libmath_la_SOURCES += exp.c
83
84## Main user-visible multiprecision arithmetic.
85pkginclude_HEADERS += mp.h
1c3d4cf5 86libmath_la_SOURCES += mp-arith.c
ba57d652 87TESTS += mp-arith.t$(EXEEXT)
1c3d4cf5 88libmath_la_SOURCES += mp-const.c
0f00dc4c
MW
89libmath_la_SOURCES += mp-exp.c mp-exp.h
90libmath_la_SOURCES += mp-gcd.c
ba57d652 91TESTS += mp-gcd.t$(EXEEXT)
1c3d4cf5 92libmath_la_SOURCES += mp-io.c
0f00dc4c 93libmath_la_SOURCES += mp-jacobi.c
ba57d652 94TESTS += mp-jacobi.t$(EXEEXT)
1c3d4cf5
MW
95libmath_la_SOURCES += mp-mem.c
96libmath_la_SOURCES += mp-misc.c
0f00dc4c 97libmath_la_SOURCES += mp-modexp.c
ba57d652 98TESTS += mp-modexp.t$(EXEEXT)
0f00dc4c 99libmath_la_SOURCES += mp-modsqrt.c
ba57d652 100TESTS += mp-modsqrt.t$(EXEEXT)
0f00dc4c 101libmath_la_SOURCES += mp-sqrt.c
ba57d652 102TESTS += mp-sqrt.t$(EXEEXT)
0f00dc4c
MW
103libmath_la_SOURCES += mp-test.c
104EXTRA_DIST += t/mp
105
106## Computing Fibonacci numbers.
107pkginclude_HEADERS += mp-fibonacci.h
108libmath_la_SOURCES += mp-fibonacci.c
ba57d652 109TESTS += mp-fibonacci.t$(EXEEXT)
0f00dc4c
MW
110
111## Special memory allocation for multiprecision integers.
112pkginclude_HEADERS += mparena.h
1c3d4cf5 113libmath_la_SOURCES += mparena.c
0f00dc4c
MW
114
115## Barrett reduction, an efficient method for modular reduction.
116pkginclude_HEADERS += mpbarrett.h
117libmath_la_SOURCES += mpbarrett.c
ba57d652 118TESTS += mpbarrett.t$(EXEEXT)
0f00dc4c 119libmath_la_SOURCES += mpbarrett-exp.c mpbarrett-mexp.c mpbarrett-exp.h
ba57d652
MW
120TESTS += mpbarrett-exp.t$(EXEEXT) mpbarrett-mexp.t$(EXEEXT)
121TESTS += mpbarrett.t$(EXEEXT)
0f00dc4c
MW
122EXTRA_DIST += t/mpbarrett
123
124## Solving congruences using the Chinese Remainder Theorem.
125pkginclude_HEADERS += mpcrt.h
126libmath_la_SOURCES += mpcrt.c
ba57d652 127TESTS += mpcrt.t$(EXEEXT)
0f00dc4c
MW
128EXTRA_DIST += t/mpcrt
129
130## Conversions between machine-native and multiprecision integers.
131pkginclude_HEADERS += mpint.h
132libmath_la_SOURCES += mpint.c
ba57d652 133TESTS += mpint.t$(EXEEXT)
0f00dc4c
MW
134EXTRA_DIST += t/mpint
135
0f00dc4c
MW
136## Montgomery reduction, a clever method for modular arithmetic.
137pkginclude_HEADERS += mpmont.h
138libmath_la_SOURCES += mpmont.c
ba57d652 139TESTS += mpmont.t$(EXEEXT)
0f00dc4c 140libmath_la_SOURCES += mpmont-exp.c mpmont-mexp.c mpmont-exp.h
ba57d652 141TESTS += mpmont-exp.t$(EXEEXT) mpmont-mexp.t$(EXEEXT)
0f00dc4c
MW
142EXTRA_DIST += t/mpmont
143
144## Efficient multiplication of many small numbers.
145pkginclude_HEADERS += mpmul.h
146libmath_la_SOURCES += mpmul.c
ba57d652 147TESTS += mpmul.t$(EXEEXT)
0f00dc4c
MW
148
149## Generating random numbers.
150pkginclude_HEADERS += mprand.h
151libmath_la_SOURCES += mprand.c
152
153## Efficient reduction modulo numbers with conveninent binary
154## representations.
155pkginclude_HEADERS += mpreduce.h
156libmath_la_SOURCES += mpreduce.c mpreduce-exp.h
ba57d652 157TESTS += mpreduce.t$(EXEEXT)
0f00dc4c
MW
158EXTRA_DIST += t/mpreduce
159
160## Iteratiion over the bianry representation of multiprecision integers.
161pkginclude_HEADERS += mpscan.h
1c3d4cf5 162libmath_la_SOURCES += mpscan.c
0f00dc4c
MW
163
164## Conversion between multiprecision integers and their textual
165## representations.
166pkginclude_HEADERS += mptext.h
1c3d4cf5 167libmath_la_SOURCES += mptext.c
ba57d652 168TESTS += mptext.t$(EXEEXT)
0f00dc4c
MW
169libmath_la_SOURCES += mptext-dstr.c
170libmath_la_SOURCES += mptext-file.c
171libmath_la_SOURCES += mptext-len.c
1c3d4cf5 172libmath_la_SOURCES += mptext-string.c
0f00dc4c
MW
173EXTRA_DIST += t/mptext
174
0f00dc4c
MW
175## Low-level multiprecision arithmetic.
176pkginclude_HEADERS += mpx.h bitops.h mpw.h
1c3d4cf5 177libmath_la_SOURCES += mpx.c
ba57d652 178TESTS += mpx.t$(EXEEXT)
1c3d4cf5 179libmath_la_SOURCES += karatsuba.h mpx-kmul.c mpx-ksqr.c
ba57d652 180TESTS += mpx-kmul.t$(EXEEXT) mpx-ksqr.t$(EXEEXT)
0f00dc4c
MW
181noinst_PROGRAMS += bittest
182TESTS += bittest
183EXTRA_DIST += t/mpx
1e8abdf5 184
444083ae 185if CPUFAM_X86
7ba379a6
MW
186MPX_MUL4_SOURCES = mpx-mul4-x86-sse2.S
187check_PROGRAMS += mpx-mul4.t
188TESTS += mpx-mul4.t$(EXEEXT)
444083ae 189endif
3119b3ae 190if CPUFAM_AMD64
7ba379a6
MW
191MPX_MUL4_SOURCES = mpx-mul4-amd64-sse2.S
192check_PROGRAMS += mpx-mul4.t
193TESTS += mpx-mul4.t$(EXEEXT)
3119b3ae 194endif
7ba379a6 195libmath_la_SOURCES += $(MPX_MUL4_SOURCES)
7ba379a6
MW
196mpx_mul4_t_SOURCES = mpx-mul4-test.c $(MPX_MUL4_SOURCES)
197mpx_mul4_t_CPPFLAGS = \
198 $(AM_CPPFLAGS) \
199 -DTEST_MUL4 -DSRCDIR="\"$(srcdir)\""
6a024d24 200mpx_mul4_t_LDFLAGS = $(TEST_LDFLAGS)
7ba379a6 201mpx_mul4_t_LDADD = $(top_builddir)/libcatacomb.la $(mLib_LIBS)
1e8abdf5 202EXTRA_DIST += t/mpx-mul4
0f00dc4c
MW
203
204## A quick-and-dirty parser, used for parsing descriptions of groups, fields,
205## etc.
206pkginclude_HEADERS += qdparse.h
207libmath_la_SOURCES += qdparse.c
208
209## Pollard's `rho' algorithm for determining discrete logarithms.
210pkginclude_HEADERS += rho.h
211libmath_la_SOURCES += rho.c
ba57d652 212TESTS += rho.t$(EXEEXT)
0f00dc4c
MW
213
214###--------------------------------------------------------------------------
215### Prime number checking, searching, and related jobs.
216
217## Generating Lim--Lee groups, i.e., unit groups of finite fields without
218## small subgroups (except for the obvious ones).
219pkginclude_HEADERS += limlee.h
220libmath_la_SOURCES += limlee.c
221
222## A table of small prime numbers.
c9cfa678
MW
223pkginclude_HEADERS += $(precomp)/math/primetab.h
224nodist_libmath_la_SOURCES += ../precomp/math/primetab.c
225PRECOMPS += $(precomp)/math/primetab.h \
226 $(precomp)/math/primetab.c
e5b61a8d 227PRECOMP_PROGS += genprimes
0f00dc4c 228genprimes_LDADD = $(mLib_LIBS)
e5b61a8d 229if !CROSS_COMPILING
c9cfa678
MW
230$(precomp)/math/primetab.h: $(precomp)/math/primetab.c
231$(precomp)/math/primetab.c:
232 $(AM_V_at)$(MKDIR_P) $(precomp)/math
ba57d652 233 $(AM_V_at)$(MAKE) genprimes$(EXEEXT)
e5b61a8d 234 $(AM_V_GEN)./genprimes -sCATACOMB_PRIMETAB_H \
c9cfa678 235 -h$(precomp)/math/primetab.h -c$(precomp)/math/primetab.c \
0f00dc4c 236 -n256 -t"unsigned short" -iprimetab
e5b61a8d 237endif
0f00dc4c
MW
238
239## Filtering candidate prime numbers by checking for small factors
240## efficiently.
241pkginclude_HEADERS += pfilt.h
242libmath_la_SOURCES += pfilt.c
243
244## Generating prime numbers (and other kinds of numbers which need searching
245## for).
246pkginclude_HEADERS += pgen.h
247libmath_la_SOURCES += pgen.c
248libmath_la_SOURCES += pgen-gcd.c
6001a9ff 249libmath_la_SOURCES += pgen-granfrob.c
0f00dc4c
MW
250libmath_la_SOURCES += pgen-simul.c
251libmath_la_SOURCES += pgen-stdev.c
6001a9ff 252TESTS += pgen.t$(EXEEXT) pgen-granfrob.t$(EXEEXT)
0f00dc4c
MW
253EXTRA_DIST += t/pgen
254
255## Finding primitive elements in finite fields.
256pkginclude_HEADERS += prim.h
257libmath_la_SOURCES += prim.c
258
259## Iterating over all prime numbers from a given starting point.
260pkginclude_HEADERS += primeiter.h
261libmath_la_SOURCES += primeiter.c
ba57d652 262TESTS += primeiter.t$(EXEEXT)
c9cfa678 263primeiter.lo: $(precomp)/math/wheel.h
0f00dc4c
MW
264
265## The Miller--Rabin primality test.
266pkginclude_HEADERS += rabin.h
267libmath_la_SOURCES += rabin.c
268
269## Finding `strong' primes, using Gordon's algorithm. Once upon a time,
270## products of these kinds of numbers were harder to factor.
271pkginclude_HEADERS += strongprime.h
272libmath_la_SOURCES += strongprime.c
273
274## A `wheel', used by the prime iteration machinery.
c9cfa678
MW
275pkginclude_HEADERS += $(precomp)/math/wheel.h
276nodist_libmath_la_SOURCES += ../precomp/math/wheel.c
277PRECOMPS += $(precomp)/math/wheel.h $(precomp)/math/wheel.c
e5b61a8d 278PRECOMP_PROGS += genwheel
0f00dc4c 279genwheel_LDADD = $(mLib_LIBS)
e5b61a8d 280if !CROSS_COMPILING
c9cfa678
MW
281$(precomp)/math/wheel.h: $(precomp)/math/wheel.c
282$(precomp)/math/wheel.c:
283 $(AM_V_at)$(MKDIR_P) $(precomp)/math
ba57d652 284 $(AM_V_at)$(MAKE) genwheel$(EXEEXT)
e5b61a8d 285 $(AM_V_GEN)./genwheel -sCATACOMB_WHEEL_H \
c9cfa678 286 -h$(precomp)/math/wheel.h -c$(precomp)/math/wheel.c \
0f00dc4c 287 -n5 -t"unsigned char" -iwheel
e5b61a8d 288endif
0f00dc4c
MW
289
290###--------------------------------------------------------------------------
291### Binary polynomial arithmetic.
292
293## User-visible binary polynomial arithmetic.
294pkginclude_HEADERS += gf.h
295libmath_la_SOURCES += gf-arith.c
ba57d652 296TESTS += gf-arith.t$(EXEEXT)
0f00dc4c
MW
297libmath_la_SOURCES += gf-exp.c gf-exp.h
298libmath_la_SOURCES += gf-gcd.c
ba57d652 299TESTS += gf-gcd.t$(EXEEXT)
0f00dc4c
MW
300EXTRA_DIST += t/gf
301
302## Low-level binary polynomial arithmetic.
303pkginclude_HEADERS += gfx.h
304libmath_la_SOURCES += gfx.c
ba57d652 305TESTS += gfx.t$(EXEEXT)
0f00dc4c 306libmath_la_SOURCES += gfx-kmul.c
ba57d652 307TESTS += gfx-kmul.t$(EXEEXT)
c9cfa678
MW
308libmath_la_SOURCES += gfx-sqr.c
309nodist_libmath_la_SOURCES += ../precomp/math/gfx-sqrtab.c
310PRECOMPS += $(precomp)/math/gfx-sqrtab.c
e5b61a8d
MW
311PRECOMP_PROGS += gfx-sqr-mktab
312if !CROSS_COMPILING
c9cfa678
MW
313$(precomp)/math/gfx-sqrtab.c:
314 $(AM_V_at)$(MKDIR_P) $(precomp)/math
ba57d652 315 $(AM_V_at)$(MAKE) gfx-sqr-mktab$(EXEEXT)
c9cfa678
MW
316 $(AM_V_GEN)./gfx-sqr-mktab >$(precomp)/math/gfx-sqrtab.c.new && \
317 mv $(precomp)/math/gfx-sqrtab.c.new \
318 $(precomp)/math/gfx-sqrtab.c
e5b61a8d 319endif
ba57d652 320TESTS += gfx-sqr.t$(EXEEXT)
0f00dc4c
MW
321EXTRA_DIST += t/gfx
322
323## Conversions between normal and polynomial basis representations for binary
324## fields.
325pkginclude_HEADERS += gfn.h
326libmath_la_SOURCES += gfn.c
ba57d652 327TESTS += gfn.t$(EXEEXT)
0f00dc4c
MW
328EXTRA_DIST += t/gfn
329
330## Efficient reduction modulo sparse polynomials.
331pkginclude_HEADERS += gfreduce.h
332libmath_la_SOURCES += gfreduce.c gfreduce-exp.h
ba57d652 333TESTS += gfreduce.t$(EXEEXT)
0f00dc4c
MW
334EXTRA_DIST += t/gfreduce
335
336###--------------------------------------------------------------------------
337### Abstractions for various kinds of algebraic objects.
338
339## Abstract cyclic groups.
340pkginclude_HEADERS += group.h group-guts.h
341libmath_la_SOURCES += group-dstr.c
342libmath_la_SOURCES += group-exp.c group-exp.h
343libmath_la_SOURCES += group-file.c
344libmath_la_SOURCES += group-parse.c
345libmath_la_SOURCES += group-stdops.c
346libmath_la_SOURCES += group-string.c
347libmath_la_SOURCES += g-bin.c
348libmath_la_SOURCES += g-prime.c
349libmath_la_SOURCES += g-ec.c
350EXTRA_DIST += group-test.c
ba57d652 351TESTS += group-test.t$(EXEEXT)
0f00dc4c
MW
352EXTRA_DIST += t/group
353
354## Abstract finite fields.
355pkginclude_HEADERS += field.h field-guts.h
356libmath_la_SOURCES += field.c
357libmath_la_SOURCES += field-exp.c field-exp.h
358libmath_la_SOURCES += field-parse.c
359libmath_la_SOURCES += f-binpoly.c
360libmath_la_SOURCES += f-niceprime.c
361libmath_la_SOURCES += f-prime.c
362
363## Table of built-in binary fields.
364pkginclude_HEADERS += bintab.h
1c3d4cf5 365nodist_libmath_la_SOURCES += bintab.c
0f00dc4c 366CLEANFILES += bintab.c
1c3d4cf5
MW
367EXTRA_DIST += bintab.in
368bintab.c: $(mpgen) typeinfo.py bintab.in
369 $(MPGEN) bintab $(srcdir)/bintab.in >bintab.c.new && \
370 mv bintab.c.new bintab.c
0f00dc4c
MW
371
372## Table of built-in prime fields.
373pkginclude_HEADERS += ptab.h
1c3d4cf5 374nodist_libmath_la_SOURCES += ptab.c
0f00dc4c 375CLEANFILES += ptab.c
1c3d4cf5
MW
376EXTRA_DIST += ptab.in
377ptab.c: $(mpgen) typeinfo.py ptab.in
378 $(MPGEN) ptab $(srcdir)/ptab.in >ptab.c.new && \
379 mv ptab.c.new ptab.c
0f00dc4c
MW
380
381###--------------------------------------------------------------------------
382### Elliptic curve arithmetic.
383
384## Basic elliptic curve arithmetic.
385pkginclude_HEADERS += ec.h ec-guts.h
386libmath_la_SOURCES += ec.c
387libmath_la_SOURCES += ec-exp.c ec-exp.h
388libmath_la_SOURCES += ec-info.c
ba57d652 389TESTS += ec-info.t$(EXEEXT)
0f00dc4c 390libmath_la_SOURCES += ec-bin.c
ba57d652 391TESTS += ec-bin.t$(EXEEXT)
0f00dc4c 392libmath_la_SOURCES += ec-prime.c
ba57d652 393TESTS += ec-prime.t$(EXEEXT)
0f00dc4c
MW
394EXTRA_DIST += t/ec
395
396## The standard `raw' encoding (`EC2OSP') of elliptic curve points.
397pkginclude_HEADERS += ec-raw.h
398libmath_la_SOURCES += ec-raw.c
399
400## Assistance for elliptic-curve keys.
401pkginclude_HEADERS += ec-keys.h
402libmath_la_SOURCES += ec-fetch.c
403
404## Test infrastructure for elliptic curves.
405pkginclude_HEADERS += ec-test.h
406libmath_la_SOURCES += ec-test.c
ba57d652 407TESTS += ec-test.t$(EXEEXT)
0f00dc4c 408
1c3d4cf5 409## Table of built-in elliptic-curve groups.
0f00dc4c 410pkginclude_HEADERS += ectab.h
1c3d4cf5 411nodist_libmath_la_SOURCES += ectab.c
0f00dc4c 412CLEANFILES += ectab.c
1c3d4cf5
MW
413EXTRA_DIST += ectab.in
414ectab.c: $(mpgen) typeinfo.py ectab.in
415 $(MPGEN) ectab $(srcdir)/ectab.in >ectab.c.new && \
416 mv ectab.c.new ectab.c
0f00dc4c 417
ee39a683
MW
418###--------------------------------------------------------------------------
419### Other strange things.
420
421pkginclude_HEADERS += qfarith.h
422
423pkginclude_HEADERS += f25519.h
424libmath_la_SOURCES += f25519.c
425TESTS += f25519.t$(EXEEXT)
426TESTS += f25519-p10.t$(EXEEXT)
427EXTRA_DIST += t/f25519
428
429check_PROGRAMS += f25519-p10.t
430f25519_p10_t_SOURCES = f25519.c
431f25519_p10_t_CPPFLAGS = $(AM_CPPFLAGS) -DTEST_RIG -DSRCDIR="\"$(srcdir)\""
432f25519_p10_t_CPPFLAGS += -DF25519_IMPL=10
6a024d24 433f25519_p10_t_LDFLAGS = $(TEST_LDFLAGS)
ee39a683
MW
434f25519_p10_t_LDADD = $(TEST_LIBS) $(top_builddir)/libcatacomb.la
435f25519_p10_t_LDADD += $(mLib_LIBS) $(CATACOMB_LIBS) $(LIBS)
436
266efb73
MW
437pkginclude_HEADERS += fgoldi.h
438libmath_la_SOURCES += fgoldi.c
439TESTS += fgoldi.t$(EXEEXT)
440TESTS += fgoldi-p12.t$(EXEEXT)
441EXTRA_DIST += t/fgoldi
442
443check_PROGRAMS += fgoldi-p12.t
444fgoldi_p12_t_SOURCES = fgoldi.c
445fgoldi_p12_t_CPPFLAGS = $(AM_CPPFLAGS) -DTEST_RIG -DSRCDIR="\"$(srcdir)\""
446fgoldi_p12_t_CPPFLAGS += -DFGOLDI_IMPL=12
6a024d24 447fgoldi_p12_t_LDFLAGS = $(TEST_LDFLAGS)
266efb73
MW
448fgoldi_p12_t_LDADD = $(TEST_LIBS) $(top_builddir)/libcatacomb.la
449fgoldi_p12_t_LDADD += $(mLib_LIBS) $(CATACOMB_LIBS) $(LIBS)
450
d56fd9d1
MW
451pkginclude_HEADERS += scaf.h
452libmath_la_SOURCES += scaf.c
453
fc2d44af 454pkginclude_HEADERS += montladder.h
581ac808 455pkginclude_HEADERS += scmul.h
fc2d44af 456
0f00dc4c 457###----- That's all, folks --------------------------------------------------