From: drh <> Date: Fri, 27 Mar 2026 16:09:10 +0000 (+0000) Subject: Enable the use of intrinsic high-precision multiplies on Windows ARM. X-Git-Tag: major-release~36 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=00c6eca32cb39c7182925db49d3c345246edbaf1;p=thirdparty%2Fsqlite.git Enable the use of intrinsic high-precision multiplies on Windows ARM. Make the SQLITE_DISABLE_INTRINSIC option effective on high-precision multiple subroutines, for testing purposes. FossilOrigin-Name: efb6212de4ca998546329b06b43122f0fffa3759e4615ca3357ef9fa13606d44 --- diff --git a/manifest b/manifest index 93363568af..d9bc5da010 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sthe\sprint\sresolution\sthe\sfp-speed-1.c\stest\sto\s17\sdigits. -D 2026-03-27T14:54:01.631 +C Enable\sthe\suse\sof\sintrinsic\shigh-precision\smultiplies\son\sWindows\sARM.\nMake\sthe\sSQLITE_DISABLE_INTRINSIC\soption\seffective\son\shigh-precision\nmultiple\ssubroutines,\sfor\stesting\spurposes. +D 2026-03-27T16:09:10.848 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -798,7 +798,7 @@ F src/trigger.c 4bf3bfb3851d165e4404a9f9e69357345f3f7103378c07e07139fdd8aeb7bd20 F src/update.c 3e5e7ff66fa19ebe4d1b113d480639a24cc1175adbefabbd1a948a07f28e37cf F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1 F src/utf.c 7267c3fb9e2467020507601af3354c2446c61f444387e094c779dccd5ca62165 -F src/util.c c24ed5647e81eea3abe3d9878b709425a3e843cbf4580ac442ed46b93824138c +F src/util.c 3e6ae9bde9a108d92bbb9ce5c6139efef5a1d5949d79912b7aabf67bfa3000a5 F src/vacuum.c d3d35d8ae893d419ade5fa196d761a83bddcbb62137a1a157ae751ef38b26e82 F src/vdbe.c 6c57525d7db0232d52687d30da1093db0c152f14206c2ef1adf0c19a09d863e3 F src/vdbe.h 70e862ac8a11b590f8c1eaac17a0078429d42bc4ea3f757a9af0f451dd966a71 @@ -2196,8 +2196,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 9b083070de2d782fe1db62652af8f3cd48abe16b55b974f3927b738e3d914887 -R bc862639f71414fdaa2bc2f25b71c606 +P c687b32a956315ddf4336df42deb4037c37d51b536b8a24c5cef4c5a0bc4c79b +R 217cc40eefb63df69bf27558fb090280 U drh -Z ef7f1d31ce60e52e9bbaf991b4bd1e93 +Z e23febd3b8e71bad9713a72ada23a3d4 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a5277d0a32..d66bd101bc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c687b32a956315ddf4336df42deb4037c37d51b536b8a24c5cef4c5a0bc4c79b +efb6212de4ca998546329b06b43122f0fffa3759e4615ca3357ef9fa13606d44 diff --git a/src/util.c b/src/util.c index 18c2e127b3..82b5b7c3d9 100644 --- a/src/util.c +++ b/src/util.c @@ -465,11 +465,12 @@ u8 sqlite3StrIHash(const char *z){ */ static u64 sqlite3Multiply128(u64 a, u64 b, u64 *pLo){ #if (defined(__GNUC__) || defined(__clang__)) \ - && (defined(__x86_64__) || defined(__aarch64__) || defined(__riscv)) + && (defined(__x86_64__) || defined(__aarch64__) || defined(__riscv)) \ + && !defined(SQLITE_DISABLE_INTRINSIC) __uint128_t r = (__uint128_t)a * b; *pLo = (u64)r; return (u64)(r>>64); -#elif defined(_MSC_VER) && defined(_M_X64) +#elif defined(_MSC_VER) && !defined(SQLITE_DISABLE_INTRINSIC) *pLo = a*b; return __umulh(a, b); #else @@ -500,17 +501,19 @@ static u64 sqlite3Multiply128(u64 a, u64 b, u64 *pLo){ */ static u64 sqlite3Multiply160(u64 a, u32 aLo, u64 b, u32 *pLo){ #if (defined(__GNUC__) || defined(__clang__)) \ - && (defined(__x86_64__) || defined(__aarch64__) || defined(__riscv)) + && (defined(__x86_64__) || defined(__aarch64__) || defined(__riscv)) \ + && !defined(SQLITE_DISABLE_INTRINSIC) __uint128_t r = (__uint128_t)a * b; r += ((__uint128_t)aLo * b) >> 32; *pLo = (r>>32)&0xffffffff; return r>>64; -#elif defined(_MSC_VER) && defined(_M_X64) +#elif defined(_MSC_VER) && !defined(SQLITE_DISABLE_INTRINSIC) u64 r1_hi = __umulh(a,b); u64 r1_lo = a*b; u64 r2 = (__umulh((u64)aLo,b)<<32) + ((aLo*b)>>32); - r1_hi += _addcarry_u64(0, r1_lo, r2, &r1_lo); - *pLo = r1_lo>>32; + u64 t = r1_lo + r2; + if( t>32; return r1_hi; #else u64 x2 = a>>32; @@ -722,7 +725,8 @@ static int pwr2to10(int p){ return (p*78913) >> 18; } ** Count leading zeros for a 64-bit unsigned integer. */ static int countLeadingZeros(u64 m){ -#if defined(__GNUC__) || defined(__clang__) +#if (defined(__GNUC__) || defined(__clang__)) \ + && !defined(SQLITE_DISABLE_INTRINSIC) return __builtin_clzll(m); #else int n = 0;