_mm_srli_si128 等效于 altivec
Posted
技术标签:
【中文标题】_mm_srli_si128 等效于 altivec【英文标题】:_mm_srli_si128 equivalent on altivec 【发布时间】:2013-07-18 09:40:32 【问题描述】:我正在将一个用 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;
【讨论】:
buf1的值应该是多少? 嗨,Paul,有什么文件可以帮助我更深入地了解 altivec 的内在成分。 @sunmoon:是的,你想要Motorola "AltiVec Programming Interface Manual" ALTIVECPIM/D。 嗨,Paul,您有示例程序的教程吗? @sunmoon:您可以从 IBM 开发人员页面开始,例如ibm.com/developerworks/power/library/pa-unrollav2以上是关于_mm_srli_si128 等效于 altivec的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 等效于 ' __asm int 3 / DebugBreak() / Halt?
等效于 Visual C++ 中 gcc 的 __attribute__ 格式