int128: Add test override for testing __(u)mulh on MSVC X64

Also add a corresponding CI job
This commit is contained in:
Tim Ruffing 2022-11-14 17:24:12 -05:00 committed by Pieter Wuille
parent f2b7e88768
commit 63ff064d2f
2 changed files with 15 additions and 6 deletions

View File

@ -288,6 +288,10 @@ task:
- name: "x86_64 (MSVC): Windows (Debian stable, Wine, int128_struct)" - name: "x86_64 (MSVC): Windows (Debian stable, Wine, int128_struct)"
env: env:
WIDEMUL: int128_struct WIDEMUL: int128_struct
- name: "x86_64 (MSVC): Windows (Debian stable, Wine, int128_struct with __(u)mulh)"
env:
WIDEMUL: int128_struct
CPPFLAGS: -DSECP256K1_MSVC_MULH_TEST_OVERRIDE
- name: "i686 (MSVC): Windows (Debian stable, Wine)" - name: "i686 (MSVC): Windows (Debian stable, Wine)"
env: env:
HOST: i686-w64-mingw32 HOST: i686-w64-mingw32

View File

@ -5,12 +5,13 @@
#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64)) /* MSVC */ #if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64)) /* MSVC */
# include <intrin.h> # include <intrin.h>
# if defined(_M_X64) # if defined(_M_ARM64) || defined(SECP256K1_MSVC_MULH_TEST_OVERRIDE)
/* On x84_64 MSVC, use native _(u)mul128 for 64x64->128 multiplications. */ /* On ARM64 MSVC, use __(u)mulh for the upper half of 64x64 multiplications.
# define secp256k1_umul128 _umul128 (Define SECP256K1_MSVC_MULH_TEST_OVERRIDE to test this code path on X64,
# define secp256k1_mul128 _mul128 which supports both __(u)mulh and _umul128.) */
# else # if defined(SECP256K1_MSVC_MULH_TEST_OVERRIDE)
/* On ARM64 MSVC, use __(u)mulh for the upper half of 64x64 multiplications. */ # pragma message(__FILE__ ": SECP256K1_MSVC_MULH_TEST_OVERRIDE is defined, forcing use of __(u)mulh.")
# endif
static SECP256K1_INLINE uint64_t secp256k1_umul128(uint64_t a, uint64_t b, uint64_t* hi) { static SECP256K1_INLINE uint64_t secp256k1_umul128(uint64_t a, uint64_t b, uint64_t* hi) {
*hi = __umulh(a, b); *hi = __umulh(a, b);
return a * b; return a * b;
@ -20,6 +21,10 @@ static SECP256K1_INLINE int64_t secp256k1_mul128(int64_t a, int64_t b, int64_t*
*hi = __mulh(a, b); *hi = __mulh(a, b);
return a * b; return a * b;
} }
# else
/* On x84_64 MSVC, use native _(u)mul128 for 64x64->128 multiplications. */
# define secp256k1_umul128 _umul128
# define secp256k1_mul128 _mul128
# endif # endif
#else #else
/* On other systems, emulate 64x64->128 multiplications using 32x32->64 multiplications. */ /* On other systems, emulate 64x64->128 multiplications using 32x32->64 multiplications. */