我希望基本上能够在没有开销的情况下将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值。
有办法这样做吗?
发布于 2017-10-24 13:41:27
在aarch32上,您完全听任编译器的摆布。(这就是为什么我在组装中编写霓虹灯例程的原因)
另一方面,在aarch64上,它几乎是自动的,因为上面的64位无论如何都不是直接访问的。
不过,编译器将在trn1上执行vcombine指令。
总之,在aarch64上总是存在开销,而在aarch32上则是不可预测的。如果您的aarch32例程简单而简短,因此不需要多个寄存器,那么编译器很有可能巧妙地分配寄存器,但不太可能分配寄存器。
顺便说一句,在aarch64上,如果初始化较低的64位,CPU会自动将上64位设置为零。不过,我不知道是否需要额外的时间。这确实花了我好几天的时间,直到我发现了一直以来出了什么问题。真烦人!
https://stackoverflow.com/questions/46910799
复制相似问题