1

我正在将一个用 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.
4

1 回答 1

1

的第二个参数vec_slo需要是vector signed charor 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;
}
于 2013-07-18T09:50:56.907 回答