在gcc 4.1.2中,vec_ld()
在CPU MPC74XX板上不能正常工作。
float temp[4]; __vector float Src; Src = (__vector float)vec_ld(0, temp);
但是,如果float变量对齐到16个字节,则它可以正常工作:
float temp[4] __attribute__((aligned(16)));
这是设计使然吗?
是的,AltiVec加载和存储需要16字节对齐。这在AltiVec手册中有很好的记录。
但是,与其他SIMD架构(例如SSE)不同,请注意,AltiVec会默默地将未对齐的地址截断到下一个最低的16个字节边界,而不是生成异常,因此您的代码不会崩溃,但是如果您尝试加载或存储,它将无法正确运行地址未对齐。
在无法避免未对齐载荷的情况下,可以加载两个相邻的对齐向量,然后使用vec_lvsl
+ vec_perm
创建所需的向量:
float temp[4]; __vector float sr1, src2, src; src1 = vec_ld(0, temp); src2 = vec_ld(16, temp); src = vec_perm(src1, src2, vec_lvsl(0, temp));