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, ECDH: yes, SCHNORRSIG: yes}
|
||||
- env: {WIDEMUL: int128}
|
||||
- env: {WIDEMUL: int128_struct}
|
||||
- env: {WIDEMUL: int128, RECOVERY: yes, SCHNORRSIG: yes}
|
||||
- env: {WIDEMUL: int128, ECDH: yes, SCHNORRSIG: yes}
|
||||
- env: {WIDEMUL: int128, ASM: x86_64}
|
||||
|
@ -272,20 +273,22 @@ task:
|
|||
EXPERIMENTAL: yes
|
||||
SCHNORRSIG: yes
|
||||
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.
|
||||
# This will detect some MinGW-w64 tools but then make will need only
|
||||
# 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
|
||||
CC: /opt/msvc/bin/x64/cl
|
||||
AR: /opt/msvc/bin/x64/lib
|
||||
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)"
|
||||
env:
|
||||
HOST: i686-w64-mingw32
|
||||
|
|
45
src/tests.c
45
src/tests.c
|
@ -26,6 +26,7 @@
|
|||
#include "modinv32_impl.h"
|
||||
#ifdef SECP256K1_WIDEMUL_INT128
|
||||
#include "modinv64_impl.h"
|
||||
#include "int128_impl.h"
|
||||
#endif
|
||||
|
||||
#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);
|
||||
}
|
||||
|
||||
|
||||
#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) {
|
||||
static const uint32_t b32[] = {1, 0xffffffff, 0x5e56968f, 0xe0d63129};
|
||||
static const uint64_t b64[] = {1, 0xffffffffffffffff, 0xbcd02462139b3fc3, 0x98b5f80c769693ef};
|
||||
|
@ -7100,6 +7142,9 @@ int main(int argc, char **argv) {
|
|||
run_rand_bits();
|
||||
run_rand_int();
|
||||
|
||||
#ifdef SECP256K1_WIDEMUL_INT128
|
||||
run_int128_tests();
|
||||
#endif
|
||||
run_ctz_tests();
|
||||
run_modinv_tests();
|
||||
run_inverse_tests();
|
||||
|
|
Loading…
Reference in New Issue