Может кто-нибудь объяснить это сравнение SSE BigNum?

Если вы посмотрите на этот ответ, автору удается создать компактный алгоритм сравнения для 2 целых двоичных знаков, хранящихся в двух регистрах SSE. Я не слишком хорошо слежу за ним:)

Что я сделал до сих пор:

если l = a < b = {a[i] < b[i] ? ~0 : 0} и

e = a == b = {a[i] == b[i] ? ~0 : 0}

то a < b == l[3] v e[3]l[2] v e[3]e[2]l[1] v e[3]e[2]e[1]l[0]

Но это не похоже на то, что делает автор. Что мне не хватает? Что нужно для сравнения больше?

Ответы

Ответ 1

Я упустил из виду, чем ответ не был общим, но ограничен 64-битными бинумами, состоящими из 32-битных элементов. Если у вас есть 2 64-битных вектора a = {a0, a1}, b = {b0, b1}, то программа вычисляет:

a < b = ((a1 < b1) | (a0 < b0)) & ~(a1 > b1)

В моем вопросе я стремился к произвольно длинным BigNums, реализованным с регистрами SSE/AVX.