AltiVec vec_ld()仅适用于16字节对齐变量吗?

 侯贵聪_680 发布于 2023-02-13 19:48

在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)));

这是设计使然吗?

1 个回答
  • 是的,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));
    

    2023-02-13 19:51 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有