首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARM霓虹灯内部将D(64位)寄存器转换为q(128位)寄存器的下半部分,而上半部分未定义。

ARM霓虹灯内部将D(64位)寄存器转换为q(128位)寄存器的下半部分,而上半部分未定义。
EN

Stack Overflow用户
提问于 2017-10-24 12:36:32
回答 1查看 1.1K关注 0票数 2

我希望基本上能够在没有开销的情况下将uint8x8_t类型为uint8x16_t,而不需要定义上64位。如果您只关心下面的64位,但希望使用128位的指令,这是有用的,例如:

uint8x16_t data = (uint8x16_t)vld1_u8(src); // if you can somehow do this uint8x16_t shifted = vextq_u8(oldData, data, 2);

根据我对ARM组装的理解,这应该是可能的,因为负载可以被分配到D寄存器,然后解释为Q寄存器。

我能想到的一些方法是:

  • data = vcombine_u8(vld1_u8(src), vdup_n_u8(0)); -编译器似乎致力于将上半部分设置为0,尽管这是不必要的。
  • data = vld1q_u8(src); -做128位负载工作(在我的例子中也很好),但是在64位霓虹灯处理器上可能会慢一些吗?

我认为CPU中可能存在部分依赖项的恶劣情况,只设置半个寄存器,但我宁愿编译器在这里找到最好的方法,而不是强迫它使用0值。

有办法这样做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-24 13:41:27

aarch32上,您完全听任编译器的摆布。(这就是为什么我在组装中编写霓虹灯例程的原因)

另一方面,在aarch64上,它几乎是自动的,因为上面的64位无论如何都不是直接访问的。

不过,编译器将在trn1上执行vcombine指令。

总之,在aarch64上总是存在开销,而在aarch32上则是不可预测的。如果您的aarch32例程简单而简短,因此不需要多个寄存器,那么编译器很有可能巧妙地分配寄存器,但不太可能分配寄存器。

顺便说一句,在aarch64上,如果初始化较低的64位,CPU会自动将上64位设置为零。不过,我不知道是否需要额外的时间。这确实花了我好几天的时间,直到我发现了一直以来出了什么问题。真烦人!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46910799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档