ARM: насыщать подписанный int в неподписанный байт - PullRequest
0 голосов
/ 23 марта 2012

Насыщающие инструкции насыщают без знака без знака или с подписью до подписи int.

Как лучше всего перевести 16-битные целые числа со знаком в беззнаковый байт?

Короче, вот логика

uint8_t usat8(uint8_t u8, int16_t s16)
{
    s16 += u8;
    if(s16 <= 0) {
        return 0;
    } else if(s16 >=255){
        return 255;
    }else{
        return (uint8_t)s16;
    }
}

void add_row(uint8_t * dst, uint8_t * u8, int16_t * s16)
{
    for(int i=0; i<XXX; ++i)
    {
        dst[i] = usat8(u8[i] + s16[i]);
    }
}

значения s16 обычно не сильно отличаются от диапазона [0, 255], например можно предположить, что abs (s16 [x]) <1000. </p>

РЕДАКТИРОВАТЬ: Я только что понял, что USAT16 на самом деле насыщает 16-битное целое число со знаком до целого без знака. Простой USAT16 является решением проблемы.

1 Ответ

0 голосов
/ 23 марта 2012

После 5 минут размышлений у меня появилась эта идея (псевдо-арм-асм):

sadd16  sum, s16, u8                  @ do two additions in parallel

orr     signs, 0x1001, sum, lsr #15   @ extract signs of the two 16 bit results
usat16  sum, sum, #8                  @ saturate both of the 16-bit sums to unsigned 8-byte range
uadd16  sum, sum, signs

таким образом, если для какой-либо из сумм был установлен знаковый бит, полученная сумма станет 256 или 0x100. При записи данных смещенный 0x1 будет отброшен.

Любые комментарии, кажется ли это оптимальным подходом, есть ли лучшая альтернатива?

PS. Я делаю это для устройства armv6, не NEON или armv6t2

...