2015-02-10 125 views
0

我正在使用AltiVec编程接口进行项目工作。AltiVec中mm_storel_epi64的等价物?

在一个地方,我想从一个向量寄存器8个字节存储到缓冲器中。

在SSE,我们有一个固有_mm_storel_epi64到低8个字节SIMD寄存器的存储到缓冲器中。

上的AltiVec执行8字节存储任何想法?

+0

我的输出指针未对齐。 – sunmoon 2015-02-10 09:28:26

回答

1

我认为,配备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。

+0

我想做未对齐的商店。 – sunmoon 2015-02-10 09:28:08

+0

您在问题中没有提到这一点,但只要目标8字节位于对齐的16字节范围内,那么上述方法仍然有效。如果8字节的目的地位于16字节的边界上,那么你将不得不做更多的工作。 – 2015-02-10 09:29:39

+0

vec_st对齐传入的指针并存储向量寄存器。我可能会过度使用我不打算这样做的数据。与vec_st。 – sunmoon 2015-02-10 09:32:01

0

我发现存放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); 

} 
+1

谢谢Paul的格式化。 – sunmoon 2015-02-12 06:52:09