Два 32-разрядных целых числа со знаком и умножение с использованием SSE2
Как я могу умножить два 32-разрядных целых числа со знаком, используя набор инструкций SSE2?
1 ответ
pmuldq
это, к сожалению, инструкция SSE4.1, но SSE2 имеет pmuludq
и с помощью алгоритма "конвертировать беззнаковый продукт высшего порядка в подписанный" (см. главу 8.3 "Хакерского восторга") верхнее слово можно исправить. Низкое слово, конечно, уже правильно.
Вот моя попытка сделать это в asm, я не проверял это вообще.
movdqa xmm2, xmm0
psrad xmm0, 31
movdqa xmm3, xmm1
psrad xmm1, 31
pand xmm2, xmm0
pand xmm3, xmm1
paddd xmm2, xmm3
pmuludq xmm0, xmm1
pshufd xmm2, xmm2, 0xB1
psubd xmm0, xmm2
Мечи, отличные от умножаемых, в начале должны быть равны нулю. Это выглядит немного иначе, чем в Хакере Delight, потому что я переставил последний бит алгоритма в p = p - (t1 + t2)
(сохраняет в случайном порядке).