From d25336a3bb2e3125368d061ce10ae934e70f6d63 Mon Sep 17 00:00:00 2001 From: Marat Dukhan Date: Sun, 12 Apr 2020 14:57:43 -0700 Subject: Use _udiv64 and _udiv128 intrinsics on MSVC --- include/fxdiv.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/include/fxdiv.h b/include/fxdiv.h index 2c275e1..918ad9e 100644 --- a/include/fxdiv.h +++ b/include/fxdiv.h @@ -14,6 +14,9 @@ #if defined(_MSC_VER) #include + #if defined(_M_IX86) || defined(_M_X64) + #include + #endif #endif #ifndef FXDIV_USE_INLINE_ASSEMBLY @@ -168,6 +171,9 @@ static inline struct fxdiv_divisor_uint32_t fxdiv_init_uint32_t(uint32_t d) { __asm__("DIVL %[d]" : "=a" (q), "+d" (u_hi) : [d] "r" (d), "a" (0)); + #elif (defined(_MSC_VER) && _MSC_VER >= 1920) && (defined(_M_IX86) || defined(_M_X64)) + unsigned int remainder; + const uint32_t q = (uint32_t) _udiv64((unsigned __int64) ((uint64_t) u_hi << 32), (unsigned int) d, &remainder); #else const uint32_t q = ((uint64_t) u_hi << 32) / d; #endif @@ -261,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 (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); #else /* Implementation based on code from Hacker's delight */ -- cgit v1.2.3