ci: add int128_struct tests
This commit is contained in:
parent
dceaa1f579
commit
a340d9500a
17
.cirrus.yml
17
.cirrus.yml
|
@ -69,6 +69,7 @@ task:
|
||||||
- env: {WIDEMUL: int64, RECOVERY: yes}
|
- env: {WIDEMUL: int64, RECOVERY: yes}
|
||||||
- env: {WIDEMUL: int64, ECDH: yes, SCHNORRSIG: yes}
|
- env: {WIDEMUL: int64, ECDH: yes, SCHNORRSIG: yes}
|
||||||
- env: {WIDEMUL: int128}
|
- env: {WIDEMUL: int128}
|
||||||
|
- env: {WIDEMUL: int128_struct}
|
||||||
- env: {WIDEMUL: int128, RECOVERY: yes, SCHNORRSIG: yes}
|
- env: {WIDEMUL: int128, RECOVERY: yes, SCHNORRSIG: yes}
|
||||||
- env: {WIDEMUL: int128, ECDH: yes, SCHNORRSIG: yes}
|
- env: {WIDEMUL: int128, ECDH: yes, SCHNORRSIG: yes}
|
||||||
- env: {WIDEMUL: int128, ASM: x86_64}
|
- env: {WIDEMUL: int128, ASM: x86_64}
|
||||||
|
@ -272,20 +273,22 @@ task:
|
||||||
EXPERIMENTAL: yes
|
EXPERIMENTAL: yes
|
||||||
SCHNORRSIG: yes
|
SCHNORRSIG: yes
|
||||||
CTIMETEST: no
|
CTIMETEST: no
|
||||||
# Set non-essential options that affect the CLI messages here.
|
|
||||||
# (They depend on the user's taste, so we don't want to set them automatically in configure.ac.)
|
|
||||||
CFLAGS: -nologo -diagnostics:caret
|
|
||||||
LDFLAGS: -XCClinker -nologo -XCClinker -diagnostics:caret
|
|
||||||
# Use a MinGW-w64 host to tell ./configure we're building for Windows.
|
# Use a MinGW-w64 host to tell ./configure we're building for Windows.
|
||||||
# This will detect some MinGW-w64 tools but then make will need only
|
# This will detect some MinGW-w64 tools but then make will need only
|
||||||
# the MSVC tools CC, AR and NM as specified below.
|
# the MSVC tools CC, AR and NM as specified below.
|
||||||
matrix:
|
|
||||||
- name: "x86_64 (MSVC): Windows (Debian stable, Wine)"
|
|
||||||
env:
|
|
||||||
HOST: x86_64-w64-mingw32
|
HOST: x86_64-w64-mingw32
|
||||||
CC: /opt/msvc/bin/x64/cl
|
CC: /opt/msvc/bin/x64/cl
|
||||||
AR: /opt/msvc/bin/x64/lib
|
AR: /opt/msvc/bin/x64/lib
|
||||||
NM: /opt/msvc/bin/x64/dumpbin -symbols -headers
|
NM: /opt/msvc/bin/x64/dumpbin -symbols -headers
|
||||||
|
# Set non-essential options that affect the CLI messages here.
|
||||||
|
# (They depend on the user's taste, so we don't want to set them automatically in configure.ac.)
|
||||||
|
CFLAGS: -nologo -diagnostics:caret
|
||||||
|
LDFLAGS: -XCClinker -nologo -XCClinker -diagnostics:caret
|
||||||
|
matrix:
|
||||||
|
- name: "x86_64 (MSVC): Windows (Debian stable, Wine)"
|
||||||
|
- name: "x86_64 (MSVC): Windows (Debian stable, Wine, int128_struct)"
|
||||||
|
env:
|
||||||
|
WIDEMUL: int128_struct
|
||||||
- name: "i686 (MSVC): Windows (Debian stable, Wine)"
|
- name: "i686 (MSVC): Windows (Debian stable, Wine)"
|
||||||
env:
|
env:
|
||||||
HOST: i686-w64-mingw32
|
HOST: i686-w64-mingw32
|
||||||
|
|
45
src/tests.c
45
src/tests.c
|
@ -26,6 +26,7 @@
|
||||||
#include "modinv32_impl.h"
|
#include "modinv32_impl.h"
|
||||||
#ifdef SECP256K1_WIDEMUL_INT128
|
#ifdef SECP256K1_WIDEMUL_INT128
|
||||||
#include "modinv64_impl.h"
|
#include "modinv64_impl.h"
|
||||||
|
#include "int128_impl.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define CONDITIONAL_TEST(cnt, nam) if (count < (cnt)) { printf("Skipping %s (iteration count too low)\n", nam); } else
|
#define CONDITIONAL_TEST(cnt, nam) if (count < (cnt)) { printf("Skipping %s (iteration count too low)\n", nam); } else
|
||||||
|
@ -430,6 +431,47 @@ void run_scratch_tests(void) {
|
||||||
secp256k1_context_destroy(none);
|
secp256k1_context_destroy(none);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef SECP256K1_WIDEMUL_INT128
|
||||||
|
void run_int128_tests(void) {
|
||||||
|
{ /* secp256k1_u128_accum_mul */
|
||||||
|
secp256k1_uint128 res;
|
||||||
|
|
||||||
|
/* Check secp256k1_u128_accum_mul overflow */
|
||||||
|
secp256k1_u128_from_u64(&res, 0);
|
||||||
|
secp256k1_u128_accum_mul(&res, UINT64_MAX, UINT64_MAX);
|
||||||
|
secp256k1_u128_accum_mul(&res, UINT64_MAX, UINT64_MAX);
|
||||||
|
CHECK(secp256k1_u128_to_u64(&res) == 2);
|
||||||
|
CHECK(secp256k1_u128_hi_u64(&res) == 18446744073709551612U);
|
||||||
|
}
|
||||||
|
{ /* secp256k1_u128_accum_mul */
|
||||||
|
secp256k1_int128 res;
|
||||||
|
|
||||||
|
/* Compute INT128_MAX = 2^127 - 1 with secp256k1_i128_accum_mul */
|
||||||
|
secp256k1_i128_from_i64(&res, 0);
|
||||||
|
secp256k1_i128_accum_mul(&res, INT64_MAX, INT64_MAX);
|
||||||
|
secp256k1_i128_accum_mul(&res, INT64_MAX, INT64_MAX);
|
||||||
|
CHECK(secp256k1_i128_to_i64(&res) == 2);
|
||||||
|
secp256k1_i128_accum_mul(&res, 4, 9223372036854775807);
|
||||||
|
secp256k1_i128_accum_mul(&res, 1, 1);
|
||||||
|
CHECK((uint64_t)secp256k1_i128_to_i64(&res) == UINT64_MAX);
|
||||||
|
secp256k1_i128_rshift(&res, 64);
|
||||||
|
CHECK(secp256k1_i128_to_i64(&res) == INT64_MAX);
|
||||||
|
|
||||||
|
/* Compute INT128_MIN = - 2^127 with secp256k1_i128_accum_mul */
|
||||||
|
secp256k1_i128_from_i64(&res, 0);
|
||||||
|
secp256k1_i128_accum_mul(&res, INT64_MAX, INT64_MIN);
|
||||||
|
CHECK(secp256k1_i128_to_i64(&res) == INT64_MIN);
|
||||||
|
secp256k1_i128_accum_mul(&res, INT64_MAX, INT64_MIN);
|
||||||
|
CHECK(secp256k1_i128_to_i64(&res) == 0);
|
||||||
|
secp256k1_i128_accum_mul(&res, 2, INT64_MIN);
|
||||||
|
CHECK(secp256k1_i128_to_i64(&res) == 0);
|
||||||
|
secp256k1_i128_rshift(&res, 64);
|
||||||
|
CHECK(secp256k1_i128_to_i64(&res) == INT64_MIN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void run_ctz_tests(void) {
|
void run_ctz_tests(void) {
|
||||||
static const uint32_t b32[] = {1, 0xffffffff, 0x5e56968f, 0xe0d63129};
|
static const uint32_t b32[] = {1, 0xffffffff, 0x5e56968f, 0xe0d63129};
|
||||||
static const uint64_t b64[] = {1, 0xffffffffffffffff, 0xbcd02462139b3fc3, 0x98b5f80c769693ef};
|
static const uint64_t b64[] = {1, 0xffffffffffffffff, 0xbcd02462139b3fc3, 0x98b5f80c769693ef};
|
||||||
|
@ -7100,6 +7142,9 @@ int main(int argc, char **argv) {
|
||||||
run_rand_bits();
|
run_rand_bits();
|
||||||
run_rand_int();
|
run_rand_int();
|
||||||
|
|
||||||
|
#ifdef SECP256K1_WIDEMUL_INT128
|
||||||
|
run_int128_tests();
|
||||||
|
#endif
|
||||||
run_ctz_tests();
|
run_ctz_tests();
|
||||||
run_modinv_tests();
|
run_modinv_tests();
|
||||||
run_inverse_tests();
|
run_inverse_tests();
|
||||||
|
|
Loading…
Reference in New Issue