Merge bitcoin-core/secp256k1#1158: Add a secp256k1_i128_to_u64 function.
d216475205test secp256k1_i128_to_i64 (Russell O'Connor)4bc429019dAdd a secp256k1_i128_to_u64 function. (Russell O'Connor) Pull request description: I wanted to experiment with what would be required to split up `secp256k1_i128_to_i64` between those cases when a signed 64 bit value is being demoted, versus an unsigned 64 bit value is being extracted from the lower bits, and this is the result. I'm not sure this is a useful PR, so feel free to close it. However, since it is already written, I figured it is worth at least discussing. ACKs for top commit: sipa: utACKd216475205real-or-random: ACKd216475205Tree-SHA512: 41dbb1d33b3078bee8e71a838cfad6f1859c0bba602ae061259add8e9e8ea5aa482daa41de79dbd7433ddbef4a0bc52757f3c45d63acc9c0eb05aa3ca891b922
This commit is contained in:
18
src/tests.c
18
src/tests.c
@@ -1781,7 +1781,7 @@ void load256i128(uint16_t* out, const secp256k1_int128* v) {
|
||||
uint64_t lo;
|
||||
int64_t hi;
|
||||
secp256k1_int128 c = *v;
|
||||
lo = secp256k1_i128_to_i64(&c);
|
||||
lo = secp256k1_i128_to_u64(&c);
|
||||
secp256k1_i128_rshift(&c, 64);
|
||||
hi = secp256k1_i128_to_i64(&c);
|
||||
load256two64(out, hi, lo, 1);
|
||||
@@ -1898,12 +1898,14 @@ void run_int128_test_case(void) {
|
||||
secp256k1_i128_rshift(&swz, uc % 127);
|
||||
load256i128(rswz, &swz);
|
||||
CHECK(secp256k1_memcmp_var(rswr, rswz, 16) == 0);
|
||||
/* test secp256k1_i128_to_i64 */
|
||||
CHECK((uint64_t)secp256k1_i128_to_i64(&swa) == v[0]);
|
||||
/* test secp256k1_i128_to_u64 */
|
||||
CHECK(secp256k1_i128_to_u64(&swa) == v[0]);
|
||||
/* test secp256k1_i128_from_i64 */
|
||||
secp256k1_i128_from_i64(&swz, sb);
|
||||
load256i128(rswz, &swz);
|
||||
CHECK(secp256k1_memcmp_var(rsb, rswz, 16) == 0);
|
||||
/* test secp256k1_i128_to_i64 */
|
||||
CHECK(secp256k1_i128_to_i64(&swz) == sb);
|
||||
/* test secp256k1_i128_eq_var */
|
||||
{
|
||||
int expect = (uc & 1);
|
||||
@@ -1963,20 +1965,20 @@ void run_int128_tests(void) {
|
||||
/* Compute INT128_MAX = 2^127 - 1 with secp256k1_i128_accum_mul */
|
||||
secp256k1_i128_mul(&res, INT64_MAX, INT64_MAX);
|
||||
secp256k1_i128_accum_mul(&res, INT64_MAX, INT64_MAX);
|
||||
CHECK(secp256k1_i128_to_i64(&res) == 2);
|
||||
CHECK(secp256k1_i128_to_u64(&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);
|
||||
CHECK(secp256k1_i128_to_u64(&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_mul(&res, INT64_MAX, INT64_MIN);
|
||||
CHECK(secp256k1_i128_to_i64(&res) == INT64_MIN);
|
||||
CHECK(secp256k1_i128_to_u64(&res) == (uint64_t)INT64_MIN);
|
||||
secp256k1_i128_accum_mul(&res, INT64_MAX, INT64_MIN);
|
||||
CHECK(secp256k1_i128_to_i64(&res) == 0);
|
||||
CHECK(secp256k1_i128_to_u64(&res) == 0);
|
||||
secp256k1_i128_accum_mul(&res, 2, INT64_MIN);
|
||||
CHECK(secp256k1_i128_to_i64(&res) == 0);
|
||||
CHECK(secp256k1_i128_to_u64(&res) == 0);
|
||||
secp256k1_i128_rshift(&res, 64);
|
||||
CHECK(secp256k1_i128_to_i64(&res) == INT64_MIN);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user