Skip to content

Commit c63e971

Browse files
committed
Fix for 32-bit Windows
1 parent 9be4ac7 commit c63e971

File tree

1 file changed

+20
-2
lines changed

1 file changed

+20
-2
lines changed

src/hdr_histogram.c

+20-2
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,32 @@ static int64_t power(int64_t base, int64_t exp)
9090
}
9191

9292
#if defined(_MSC_VER)
93-
#pragma intrinsic(_BitScanReverse64)
93+
# if defined(_WIN64)
94+
# pragma intrinsic(_BitScanReverse64)
95+
# else
96+
# pragma intrinsic(_BitScanReverse)
97+
# endif
9498
#endif
9599

96100
static int32_t get_bucket_index(const struct hdr_histogram* h, int64_t value)
97101
{
98102
#if defined(_MSC_VER)
99103
uint32_t leading_zero = 0;
100-
_BitScanReverse64(&leading_zero, value | h->sub_bucket_mask);
104+
int64_t masked_value = value | h->sub_bucket_mask;
105+
# if defined(_WIN64)
106+
_BitScanReverse64(&leading_zero, masked_value);
107+
# else
108+
uint32_t high = masked_value >> 32;
109+
if (_BitScanReverse(&leading_zero, high))
110+
{
111+
leading_zero += 32;
112+
}
113+
else
114+
{
115+
uint32_t low = masked_value & 0x00000000FFFFFFFF;
116+
_BitScanReverse(&leading_zero, low);
117+
}
118+
# endif
101119
int32_t pow2ceiling = 64 - (63 - leading_zero); // smallest power of 2 containing value
102120
#else
103121
int32_t pow2ceiling = 64 - __builtin_clzll(value | h->sub_bucket_mask); // smallest power of 2 containing value

0 commit comments

Comments
 (0)