为什么这两个 high(64bx64b) 函数给出不同的结果?
Why do those two high(64bx64b) functions give different results?
static __inline__ uint64_t mulhilo64(uint64_t a, uint64_t b, uint64_t* hip) {
__uint128_t product = ((__uint128_t)a)*((__uint128_t)b);
*hip = product>>64;
return (uint64_t)product;
}
我正在尝试使用 AVX2 上的 MULX 内在函数编写以下内容(更具体地说 BMI2)。但他们没有给出相同的结果。
static __inline__ uint64_t mulhilo64(uint64_t a, uint64_t b, uint64_t *c){
return _mulx_u64(a, b, &c);
}
看起来这个函数可能是错误的:
static __inline__ uint64_t mulhilo64(uint64_t a, uint64_t b, uint64_t *c){
return _mulx_u64(a, b, &c);
}
大概应该是:
static __inline__ uint64_t mulhilo64(uint64_t a, uint64_t b, uint64_t *c){
return _mulx_u64(a, b, c);
} // ^
请注意,在启用警告的情况下进行编译(例如 gcc -Wall ...
)有助于发现像这样的简单错误。
static __inline__ uint64_t mulhilo64(uint64_t a, uint64_t b, uint64_t* hip) {
__uint128_t product = ((__uint128_t)a)*((__uint128_t)b);
*hip = product>>64;
return (uint64_t)product;
}
我正在尝试使用 AVX2 上的 MULX 内在函数编写以下内容(更具体地说 BMI2)。但他们没有给出相同的结果。
static __inline__ uint64_t mulhilo64(uint64_t a, uint64_t b, uint64_t *c){
return _mulx_u64(a, b, &c);
}
看起来这个函数可能是错误的:
static __inline__ uint64_t mulhilo64(uint64_t a, uint64_t b, uint64_t *c){
return _mulx_u64(a, b, &c);
}
大概应该是:
static __inline__ uint64_t mulhilo64(uint64_t a, uint64_t b, uint64_t *c){
return _mulx_u64(a, b, c);
} // ^
请注意,在启用警告的情况下进行编译(例如 gcc -Wall ...
)有助于发现像这样的简单错误。