aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarat Dukhan <maratek@gmail.com>2020-04-12 15:33:30 -0700
committerMarat Dukhan <maratek@gmail.com>2020-04-12 15:33:30 -0700
commit8e02fe647cec1015e26435759c86f3309af38ade (patch)
treec7fdc3c1340a5e3623dd39498476689267db90ec
parent8480d4e85d3703219e24603e3d5d00deebf6223d (diff)
downloadFXdiv-8e02fe647cec1015e26435759c86f3309af38ade.tar.gz
Indicate cloberred condition flags in inline assembly
-rw-r--r--include/fxdiv.h12
1 files changed, 8 insertions, 4 deletions
diff --git a/include/fxdiv.h b/include/fxdiv.h
index aa97340..0fcc029 100644
--- a/include/fxdiv.h
+++ b/include/fxdiv.h
@@ -131,7 +131,8 @@ static inline struct fxdiv_divisor_uint32_t fxdiv_init_uint32_t(uint32_t d) {
uint32_t l_minus_1;
__asm__("BSRL %[d_minus_1], %[l_minus_1]"
: [l_minus_1] "=r" (l_minus_1)
- : [d_minus_1] "r" (d - 1));
+ : [d_minus_1] "r" (d - 1)
+ : "cc");
#elif defined(__GNUC__)
const uint32_t l_minus_1 = 31 - __builtin_clz(d - 1);
#else
@@ -170,7 +171,8 @@ static inline struct fxdiv_divisor_uint32_t fxdiv_init_uint32_t(uint32_t d) {
uint32_t q;
__asm__("DIVL %[d]"
: "=a" (q), "+d" (u_hi)
- : [d] "r" (d), "a" (0));
+ : [d] "r" (d), "a" (0)
+ : "cc");
#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);
@@ -219,7 +221,8 @@ static inline struct fxdiv_divisor_uint64_t fxdiv_init_uint64_t(uint64_t d) {
uint64_t l_minus_1;
__asm__("BSRQ %[d_minus_1], %[l_minus_1]"
: [l_minus_1] "=r" (l_minus_1)
- : [d_minus_1] "r" (d - 1));
+ : [d_minus_1] "r" (d - 1)
+ : "cc");
#elif defined(__GNUC__)
const uint32_t l_minus_1 = 63 - __builtin_clzll(d - 1);
const uint32_t nlz_d = __builtin_clzll(d);
@@ -266,7 +269,8 @@ static inline struct fxdiv_divisor_uint64_t fxdiv_init_uint64_t(uint64_t d) {
uint64_t q;
__asm__("DIVQ %[d]"
: "=a" (q), "+d" (u_hi)
- : [d] "r" (d), "a" (UINT64_C(0)));
+ : [d] "r" (d), "a" (UINT64_C(0))
+ : "cc");
#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));