aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarat Dukhan <maratek@gmail.com>2020-04-12 15:30:45 -0700
committerMarat Dukhan <maratek@gmail.com>2020-04-12 15:30:45 -0700
commit8480d4e85d3703219e24603e3d5d00deebf6223d (patch)
treef50d0756e7e3353a810df76c11ef0cffce14edc3
parentdd41a288bc6ffa5afa54bd425b75fa7562f575ab (diff)
downloadFXdiv-8480d4e85d3703219e24603e3d5d00deebf6223d.tar.gz
Add disabled 128 / 64 -> 64 division implementation using __int128
-rw-r--r--include/fxdiv.h3
1 files changed, 3 insertions, 0 deletions
diff --git a/include/fxdiv.h b/include/fxdiv.h
index 918ad9e..aa97340 100644
--- a/include/fxdiv.h
+++ b/include/fxdiv.h
@@ -267,6 +267,9 @@ static inline struct fxdiv_divisor_uint64_t fxdiv_init_uint64_t(uint64_t d) {
__asm__("DIVQ %[d]"
: "=a" (q), "+d" (u_hi)
: [d] "r" (d), "a" (UINT64_C(0)));
+ #elif 0 && defined(__GNUC__) && defined(__SIZEOF_INT128__)
+ /* GCC, Clang, and Intel Compiler fail to inline optimized implementation and call into support library for 128-bit division */
+ const uint64_t q = (uint64_t) (((unsigned __int128) u_hi << 64) / ((unsigned __int128) d));
#elif (defined(_MSC_VER) && _MSC_VER >= 1920) && defined(_M_X64)
unsigned __int64 remainder;
const uint64_t q = (uint64_t) _udiv128((unsigned __int64) u_hi, 0, (unsigned __int64) d, &remainder);