3
3
#include <intrin.h>
4
4
5
5
long long jsoniter_scala_multiply_high (long long x , long long y ) {
6
- long long high_product ;
7
- (void ) _mul128 (x , y , & high_product );
8
- return high_product ;
6
+ return __mulh (x , y );
9
7
}
10
8
11
9
unsigned long long jsoniter_scala_unsigned_multiply_high (unsigned long long x , unsigned long long y ) {
@@ -24,22 +22,24 @@ unsigned long long jsoniter_scala_unsigned_multiply_high(unsigned long long x, u
24
22
25
23
#else
26
24
25
+ // Based on `int mulhs(int u, int v)` function from Hacker’s Delight 2nd Ed. by Henry S. Warren, Jr.
27
26
long long jsoniter_scala_multiply_high (long long x , long long y ) {
28
- long long x0 = x & 0xffffffffL ;
27
+ long long x0 = x & 0xFFFFFFFFL ;
29
28
long long x1 = x >> 32 ;
30
- long long y0 = y & 0xffffffffL ;
29
+ long long y0 = y & 0xFFFFFFFFL ;
31
30
long long y1 = y >> 32 ;
32
31
long long t = x1 * y0 + ((unsigned long long ) (x0 * y0 ) >> 32 );
33
- return x1 * y1 + (t >> 32 ) + (((t & 0xffffffffL ) + x0 * y1 ) >> 32 );
32
+ return x1 * y1 + (t >> 32 ) + (((t & 0xFFFFFFFFL ) + x0 * y1 ) >> 32 );
34
33
}
35
34
35
+ // Based on `unsigned mulhu(unsigned u, unsigned v)` function from Hacker’s Delight 2nd Ed. by Henry S. Warren, Jr.
36
36
unsigned long long jsoniter_scala_unsigned_multiply_high (unsigned long long x , unsigned long long y ) {
37
- unsigned long long x0 = x & 0xffffffffL ;
37
+ unsigned long long x0 = x & 0xFFFFFFFFL ;
38
38
unsigned long long x1 = x >> 32 ;
39
- unsigned long long y0 = y & 0xffffffffL ;
39
+ unsigned long long y0 = y & 0xFFFFFFFFL ;
40
40
unsigned long long y1 = y >> 32 ;
41
41
unsigned long long t = x1 * y0 + ((x0 * y0 ) >> 32 );
42
- return x1 * y1 + (t >> 32 ) + (((t & 0xffffffffL ) + x0 * y1 ) >> 32 );
42
+ return x1 * y1 + (t >> 32 ) + (((t & 0xFFFFFFFFL ) + x0 * y1 ) >> 32 );
43
43
}
44
44
45
45
#endif
0 commit comments