访问AArch64高级SIMD中的一半寄存器

问题描述 投票:0回答:2

我是AArch64 Advanced SIMD(NEON)的新手,我想将AArch32代码移植到AArch64。在AArch32中如果我想访问寄存器的较低或较高的一半,我只使用Dn而不是Qn。例如,如果我想访问较低的64位Q12,我只是提到D24。但是,我无法弄清楚如何在AArch64中访问Vn寄存器的一半。我想访问Vn寄存器的上半部分。所以,如果我写Vn.2S,我认为它给了我寄存器的下半部分。那是对的吗?如果是的话,我怎样才能访问更高的一半呢?

arm neon arm64
2个回答
0
投票

即便我尝试访问。根据手册,我想没有办法访问插槽虎钳。 V0 - > d0 - > s0具有相同的数据。

而在ARM32中,Q0具有d0和d1,并且d0具有s0和s1。


0
投票

我已成功使用指针选择Arm霓虹灯矢量的上半部分或下半部分。

uint32x4_t vector = { 1, 2, 3, 4 };
uint32x2_t *upperhalf = (uint32x2_t *) &vector[2];
uint32x2_t *lowerhalf = (uint32x2_t *) &vector[0];

*lowerhalf = *upperhalf;
printf("%u", vector[0]);

打印3。这本质上告诉编译器要定位构成四重寄存器的双寄存器对中的任何一个。这并不一定意味着在执行此操作时它将读取或写入内存。相反,它看到你想直接瞄准双重寄存器。

这适用于GCC 8,也许是旧版本。 Clang 7给出了“目标向量...”错误消息。我无法使用指针来指向双重寄存器中的索引,但是使用它作为它所转换的数据类型的常规向量,无论是源还是目标始终有效。下面是另一个例子,使用指针将字母交换为半字节。

*lowerhalf = vreinterpret_u32_u8(vrev32_u8(vreinterpret_u8_u32(*lowerhalf)));

将不均匀的索引作为这些重叠寄存器是不好的做法。我没有试图看到它做了什么,但它可能会将数据随机移动到临时寄存器通道以完成操作。当向量是结构的成员时,以这种方式使用指针也有效。

© www.soinside.com 2019 - 2024. All rights reserved.