我正在使用AltiVec编程接口进行项目工作。AltiVec中mm_storel_epi64的等价物?
在一个地方,我想从一个向量寄存器8个字节存储到缓冲器中。
在SSE,我们有一个固有_mm_storel_epi64
到低8个字节SIMD寄存器的存储到缓冲器中。
上的AltiVec执行8字节存储任何想法?
我正在使用AltiVec编程接口进行项目工作。AltiVec中mm_storel_epi64的等价物?
在一个地方,我想从一个向量寄存器8个字节存储到缓冲器中。
在SSE,我们有一个固有_mm_storel_epi64
到低8个字节SIMD寄存器的存储到缓冲器中。
上的AltiVec执行8字节存储任何想法?
我认为,配备AltiVec做到这一点的唯一方法是:
- load 16 bytes containing 8 byte destination buffer (`vec_ld`)
- mask in the 8 bytes you want to write (`vec_sel`)
- store the modified 16 byte vector (`vec_st`)
这个假设需要8字节的目的当然落在一个16字节对齐矢量内。例如,假设目标地址是0x1004,那么您将从地址0x1000加载,修改字节4..11,然后将该向量写回0x1000。
我发现存放8个字节来存储未对齐的地址的一种方式。
以下是节目。
下面的程序存储到buf中的前8个字节的载体。 k - 我用作变量来改变buf中的位置以存储数据
int main(int argc, char *argv[])
{
unsigned char buf[40];
vector unsigned char res;
vector unsigned char on = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
memset(buf, 0, 40);
int k = atoi(argv[1]);
unsigned char *outp = &(buf[k]);
res = vec_perm(on, on, vec_lvsr(0, (unsigned char *)outp);
vec_ste((vector unsigned char)res, 0, (unsigned char *)outp);
vec_ste((vector unsigned short)res, 1, (unsigned short *)outp);
vec_ste((vector unsigned short)res, 2, (unsigned short *)outp);
vec_ste((vector unsigned short)res, 4, (unsigned short *)outp);
vec_ste((vector unsigned short)res, 6, (unsigned short *)outp);
vec_ste((vector unsigned char)res, 7, (unsigned char *)outp);
print(buf);
}
谢谢Paul的格式化。 – sunmoon 2015-02-12 06:52:09
我的输出指针未对齐。 – sunmoon 2015-02-10 09:28:26