0

我正在使用 AltiVec 编程接口开发一个项目。

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

在 SSE 中,我们具有将_mm_storel_epi64SIMD 寄存器的低 8 字节存储到缓冲区的内在特性。

关于在 AltiVec 中实现 8 字节存储的任何想法?

4

2 回答 2

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。

于 2015-02-10T09:15:00.510 回答
0

我找到了一种方法来存储 8 个字节以存储到未对齐的地址。

以下是程序。

以下程序将向量的前 8 个字节存储到 buf。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);

}
于 2015-02-10T10:37:22.547 回答