_mm_srli_si128 эквивалент на altivec

Я портирую программу, написанную в SSE 4.2, на Altivec. У меня есть проблема в поиске эквивалента для внутренней _mm_srli_si128,

Когда я гуглил, я нашел vec_slo как эквивалент.

Вот мой пример программы для сдвига содержимого на 1 байт влево:

void test(void *buf, void *buf1)
{
    vector unsigned int x;
    vector unsigned int a;

    x = vec_ld(0, (vector unsigned int *)buf);
    a = vec_ld(0, (vector unsigned int *)buf1);

    vec_slo(x, a);
}

int main()
{
    char buf[17]="1111111111111111";
    char buf1[17]="0000000000000001";

    test(buf, buf1);
}

Когда я компилирую, я получаю следующую ошибку:

line 20.1: 1506-930 (S) The function "vec_slo" is not a type-generic macro.

1 ответ

Решение

Второй аргумент в пользу vec_slo должно быть vector signed char или же vector unsigned char, Так что поменяйте:

vector unsigned int a;

чтобы:

vector unsigned char a;

и изменить:

a = vec_ld(0, (vector unsigned int *)buf1);

чтобы:

a = vec_ld(0, (vector unsigned char *)buf1);

Есть несколько других проблем с вашим кодом, которые вы увидите, когда его компилируют и запускают:

  • buf а также buf1 должен быть выровнен по 16 байтам
  • значение для сдвига в buf1 должно быть 4-битным буквенным целым числом, сдвинутым влево на 3 бита, а не символом

Вот упрощенная / исправленная версия вашего примера кода - она ​​написана для gcc, поэтому могут потребоваться незначительные изменения для любого компилятора, который вы используете (xlc?):

int main(void)
{
    vector unsigned char v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
    vector unsigned char vshift = vec_splat_u8(1 << 3);   // shift left by 1 byte
    vector unsigned char vshifted = vec_slo(v, vshift);

    printf("v        = %vu\n", v);
    printf("vshift   = %vu\n", vshift);
    printf("vshifted = %vu\n", vshifted);

    return 0;
}
Другие вопросы по тегам