summaryrefslogtreecommitdiff
path: root/deps
diff options
context:
space:
mode:
Diffstat (limited to 'deps')
-rw-r--r--deps/histogram/src/hdr_histogram.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/deps/histogram/src/hdr_histogram.c b/deps/histogram/src/hdr_histogram.c
index 1d7343442d..d9565b802e 100644
--- a/deps/histogram/src/hdr_histogram.c
+++ b/deps/histogram/src/hdr_histogram.c
@@ -91,14 +91,29 @@ static int64_t power(int64_t base, int64_t exp)
}
#if defined(_MSC_VER)
-#pragma intrinsic(_BitScanReverse64)
+# if defined(_WIN64)
+# pragma intrinsic(_BitScanReverse64)
+# else
+# pragma intrinsic(_BitScanReverse)
+# endif
#endif
static int32_t get_bucket_index(const struct hdr_histogram* h, int64_t value)
{
#if defined(_MSC_VER)
uint32_t leading_zero = 0;
- _BitScanReverse64(&leading_zero, value | h->sub_bucket_mask);
+ int64_t masked_value = value | h->sub_bucket_mask;
+# if defined(_WIN64)
+ _BitScanReverse64(&leading_zero, masked_value);
+# else
+ uint32_t high = masked_value >> 32;
+ if (_BitScanReverse(&leading_zero, high)) {
+ leading_zero += 32;
+ } else {
+ uint32_t low = masked_value & 0x00000000FFFFFFFF;
+ _BitScanReverse(&leading_zero, low);
+ }
+# endif
int32_t pow2ceiling = 64 - (63 - leading_zero); /* smallest power of 2 containing value */
#else
int32_t pow2ceiling = 64 - __builtin_clzll(value | h->sub_bucket_mask); /* smallest power of 2 containing value */