我想在ASIMD汇编指令中实现按位提取向量指令。让我这样说,在ARMv7 NEON指令中,假设我在q15
和q11
中有一些值,我有:
"vext.8 d30, d30, d22, #4 \n\t"
"vext.8 d31, d31, d23, #4 \n\t"
正如您在此处所看到的,我正在从d22
的底端提取4字节元素,从d30
的顶端提取4字节元素。然后我将它们组合成一个64位寄存器d30
(上面的第一条指令)。对q
向量的后半部分(d31
和d23
)执行相同的操作。现在,我想在ARMv8 ASIMD指令中实现完全相同的逻辑。 ASIMD中vext
的替换指令为ext
,其定义为:
EXT Vd。(T),Vn。(T),Vm。(T),#index
按位提取(向量)。其中(T)是8B或16B。索引是0到nelem((T)) - 1范围内的立即值。
我的问题是,我如何使用该指令在我的两个SIMD向量寄存器v15
和v11
中构造相同的逻辑。
答案 0 :(得分:2)
首先应注意,在Aarch64中,寄存器的组织方式不同。在Aarch32中,Q15是{D31,D30}。在Aarch64中,D31是Q31的底部,在谈到元素时可以描述为V31。
在这种情况下,Aarch64中没有直接的等价物,因为你不能直接访问Quad寄存器的前64位,但我认为你应该可以用以下代码替换它:
INS V15.S[0], V11.S[0]
INS V15.S[2], V11.S[2]
参考:http://infocenter.arm.com/help/topic/com.arm.doc.dui0802b/INS_advsimd_elt_vector.html
答案 1 :(得分:0)
不确定您是否找到了答案,或者这是否是您的预期目标:
正如@ Dric512所示,我认为您可以使用SIMD数据移动指令INS。
在下面的示例中,我们将数字3和2分别插入到32位通道内的向量10和11中。
然后,我们将相应的元素插入到向量15的32位通道中;从而导致所有位进入矢量15的64位通道。 mov w1, 3
mov w2, 2
ins v10.s[0], w1
ins v11.s[1], w2
ins v15.s[1], v11.s[1]
ins v15.s[0], v10.s[0]
下面是gdb结果使用p / t ...在base 2中显示$ v10.ss,$ v11.ss,$ v15.ss然后最后一个p / t $ v15.ds显示64位位模式。我不确定这是否有帮助,但也许它会使泵启动。
67 mov w1, 3
(gdb) si
$82 = {0, 0, 0, 0}
$83 = {0, 0, 0, 0}
$84 = {0, 0, 0, 0}
68 mov w2, 2
(gdb)
$85 = {0, 0, 0, 0}
$86 = {0, 0, 0, 0}
$87 = {0, 0, 0, 0}
70 ins v10.s[0], w1
(gdb)
$88 = {11, 0, 0, 0}
$89 = {0, 0, 0, 0}
$90 = {0, 0, 0, 0}
71 ins v11.s[1], w2
(gdb)
$91 = {11, 0, 0, 0}
$92 = {0, 10, 0, 0}
$93 = {0, 0, 0, 0}
73 ins v15.s[1], v11.s[1]
(gdb)
$94 = {11, 0, 0, 0}
$95 = {0, 10, 0, 0}
$96 = {0, 10, 0, 0}
74 ins v15.s[0], v10.s[0]
(gdb)
$97 = {11, 0, 0, 0}
$98 = {0, 10, 0, 0}
$99 = {11, 10, 0, 0}
.exit0 () at stuff.s:78
78 _exit
(gdb) p/t $v15.d.s
$100 = {1000000000000000000000000000000011, 0}