Почему эти две высокие (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;
}

Я пытаюсь написать следующее выше с использованием встроенных MULX на AVX2 (более конкретно BMI2). Но они не дают одинаковых результатов.

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

2

Решение

Похоже, эта функция может быть неправильной:

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 ...) помогает поймать простые ошибки, подобные этой.

3

Другие решения