Добавить 32-битные слова с насыщением - PullRequest
2 голосов
/ 20 августа 2011

Знаете ли вы, как добавить с насыщением 32-битные слова со знаком, используя инструкции ассемблера MMX / SSE? Я могу найти 8/16 битные версии, но нет 32-битных.

Ответы [ 2 ]

1 голос
/ 23 ноября 2016

Насыщенное беззнаковое вычитание легко, потому что для `a - = b 'мы можем сделать

    asm (
        "pmaxud %1, %0\n\t" // a = max (a,b)
        "psubd %1, %0" // a -= b
        : "+x" (a)
        : "xm" (b)
    );

с SSE.

Я искал дополнение без знака, но, возможно, единственный способ - преобразовать в насыщенное вычитание без знака, выполнить его и преобразовать обратно.То же самое для подписанных вариантов.

РЕДАКТИРОВАТЬ: с добавлением без знака, вы получите min (a, ~b) + b, что, конечно, работает.С подписанным сложением и вычитанием у вас есть две границы насыщения, что усложняет ситуацию.

1 голос
/ 22 августа 2011

Вы можете эмулировать насыщенные подписанные добавления, выполнив следующие шаги:

int saturated_add(int a, int b)
{
    int sum = a + b;
    if (a >= 0 && b >= 0)
        return sum > 0 ? sum : INT32_MAX;     // catch positive wraparound
    else if (a < 0 && b < 0)
        return sum > 0 ? INT32_MIN : sum;     // catch negative wraparound
    else
        return sum;                           // sum of pos + neg always fits
}

Без знака, это еще проще, см. это сообщение о переполнении стека

В SSE2Приведенное выше сопоставление с последовательностью параллельных сравнений и операций AND / ANDN.К сожалению, нет ни одной операции.

...