Я пытаюсь векторизовать CBRNG, который использует 64-битное умножение с расширением.
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?
Нет. Здесь нет 64 х 64 -> 128-битной арифметики в виде векторной инструкции. Также нет вектора mulhi
инструкция типа (высокий результат результата умножения).
Лучшее, на что вы, вероятно, можете надеяться сейчас, — это инструкция Haswell MULX, которая имеет более гибкое использование регистров и не влияет на регистр флагов — устраняя некоторые задержки.