@@ -162,13 +162,26 @@ AC_ARG_WITH([ecmult-window], [AS_HELP_STRING([--with-ecmult-window=SIZE|auto],
162162) ] ,
163163[ req_ecmult_window=$withval] , [ req_ecmult_window=auto] )
164164
165- AC_ARG_WITH ( [ ecmult-gen-precision ] , [ AS_HELP_STRING ( [ --with-ecmult-gen-precision=2|4|8 |auto] ,
166- [ Precision bits to tune the precomputed table size for signing .]
167- [ The size of the table is 32kB for 2 bits, 64kB for 4 bits, 512kB for 8 bits of precision .]
168- [ A larger table size usually results in possible faster signing .]
165+ AC_ARG_WITH ( [ ecmult-gen-blocks ] , [ AS_HELP_STRING ( [ --with-ecmult-gen-blocks=BLOCKS |auto] ,
166+ [ The number of blocks to use in the multi-comb multiplication algorithm, in the range [ 1..256 ] .]
167+ [ Larger values result in possibly better performance at the cost of a linearly larger precomputed table .]
168+ [ There must exist a multiple of BLOCKS*TEETH that is between 256 and 288, inclusive .]
169169[ "auto" is a reasonable setting for desktop machines (currently 4). [ default=auto] ]
170170) ] ,
171- [ req_ecmult_gen_precision=$withval] , [ req_ecmult_gen_precision=auto] )
171+ [ req_ecmult_gen_blocks=$withval] , [ req_ecmult_gen_blocks=auto] )
172+
173+ AC_ARG_WITH ( [ ecmult-gen-teeth] , [ AS_HELP_STRING ( [ --with-ecmult-gen-teeth=TEETH|auto] ,
174+ [ The number of teeth to use in the multi-comb multiplication algorithm, in the range [ 1..8] .]
175+ [ Larger values result in possibly better performance at the cost of an exponentially larger precomputed table.]
176+ [ There must exist a multiple of BLOCKS*TEETH that is between 256 and 288, inclusive.]
177+ [ "auto" is a reasonable setting for desktop machines (currently 5). [ default=auto] ]
178+ ) ] ,
179+ [ req_ecmult_gen_teeth=$withval] , [ req_ecmult_gen_teeth=auto] )
180+
181+ AC_ARG_WITH ( [ ecmult-gen-neg] , [ AS_HELP_STRING ( [ --with-ecmult-gen-neg=0|1] ,
182+ [ Whether to use negation to halve the size of the multi-comb table. [ default=1] ]
183+ ) ] ,
184+ [ set_ecmult_gen_neg=$withval] , [ set_ecmult_gen_neg=1] )
172185
173186AC_CHECK_TYPES ( [ __int128] )
174187
@@ -431,22 +444,50 @@ case $set_ecmult_window in
431444 ;;
432445esac
433446
434- # set ecmult gen precision
435- if test x"$req_ecmult_gen_precision " = x"auto"; then
436- set_ecmult_gen_precision =4
447+ # set ecmult gen blocks
448+ if test x"$req_ecmult_gen_blocks " = x"auto"; then
449+ set_ecmult_gen_blocks =4
437450else
438- set_ecmult_gen_precision=$req_ecmult_gen_precision
451+ set_ecmult_gen_blocks=$req_ecmult_gen_blocks
439452fi
453+ error_gen_blocks=[ 'option to --with-ecmult-gen-blocks not an integer in range [ 1..256] or "auto"']
454+ case $set_ecmult_gen_blocks in
455+ ''|*[ [ !0-9] ] *)
456+ # no valid integer
457+ AC_MSG_ERROR ( $error_gen_blocks )
458+ ;;
459+ *)
460+ if test "$set_ecmult_gen_blocks" -lt 1 -o "$set_ecmult_gen_blocks" -gt 256 ; then
461+ # not in range
462+ AC_MSG_ERROR ( $error_gen_blocks )
463+ fi
464+ AC_DEFINE_UNQUOTED ( COMB_BLOCKS , $set_ecmult_gen_blocks , [ Set number of blocks in ecmult_gen precomputation] )
465+ ;;
466+ esac
440467
441- case $set_ecmult_gen_precision in
442- 2|4|8)
443- AC_DEFINE_UNQUOTED ( ECMULT_GEN_PREC_BITS , $set_ecmult_gen_precision , [ Set ecmult gen precision bits] )
468+ # set ecmult gen teeth
469+ if test x"$req_ecmult_gen_teeth" = x"auto"; then
470+ set_ecmult_gen_teeth=5
471+ else
472+ set_ecmult_gen_teeth=$req_ecmult_gen_teeth
473+ fi
474+ error_gen_teeth=[ 'option to --with-ecmult-gen-teeth not an integer in range [ 1..8] or "auto"']
475+ case $set_ecmult_gen_teeth in
476+ ''|*[ [ !0-9] ] *)
477+ # no valid integer
478+ AC_MSG_ERROR ( $error_gen_teeth )
444479 ;;
445480*)
446- AC_MSG_ERROR ( [ 'ecmult gen precision not 2, 4, 8 or "auto"'] )
481+ if test "$set_ecmult_gen_teeth" -lt 1 -o "$set_ecmult_gen_teeth" -gt 8 ; then
482+ # not in range
483+ AC_MSG_ERROR ( $error_gen_teeth )
484+ fi
485+ AC_DEFINE_UNQUOTED ( COMB_TEETH , $set_ecmult_gen_teeth , [ Set number of teeth in ecmult_gen precomputation] )
447486 ;;
448487esac
449488
489+ AC_DEFINE_UNQUOTED ( COMB_NEGATION , $set_ecmult_gen_neg , [ Set whether to use negation in ecmult_gen] )
490+
450491if test x"$use_tests" = x"yes"; then
451492 SECP_OPENSSL_CHECK
452493 if test x"$has_openssl_ec" = x"yes"; then
@@ -556,7 +597,9 @@ echo " bignum = $set_bignum"
556597echo " field = $set_field"
557598echo " scalar = $set_scalar"
558599echo " ecmult window size = $set_ecmult_window"
559- echo " ecmult gen prec. bits = $set_ecmult_gen_precision"
600+ echo " ecmult gen blocks = $set_ecmult_gen_blocks"
601+ echo " ecmult gen teeth = $set_ecmult_gen_teeth"
602+ echo " ecmult gen negation = $set_ecmult_gen_neg"
560603echo
561604echo " valgrind = $enable_valgrind"
562605echo " CC = $CC"
0 commit comments