为什么这两个高(64bx64b)函数会给出不同的结果?

问题描述:

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(更具体地说是BMI2)上面使用MULX intrinsics编写如下的代码。但他们没有给出相同的结果。为什么这两个高(64bx64b)函数会给出不同的结果?

static __inline__ uint64_t mulhilo64(uint64_t a, uint64_t b, uint64_t *c){ 
    return _mulx_u64(a, b, &c); 
} 
+0

你能提供一个简单的测试用例和每个实现的结果吗? –

+0

第一个函数是很长代码的一部分。我只是用第二个功能替换它,没有别的。你认为他们也应该一样吗? –

+0

我在第二个函数中看到了一个可能的错误(请参阅下面的答案) - 我只是试图将一个简单的测试用例放在一起,以查看是否可以复制该问题。 –

它看起来像这样的功能可能是错误的:

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 ...)警告编译有助于赶上简单的错误喜欢这个。