我正在将用SSE 4.2编写的程序移植到Altivec。我在找到内在_mm_srli_si128
的等价物时遇到了问题。
当我用Google搜索时,我发现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.
答案 0 :(得分: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;
}