无论如何在NEON中使用寄存器名称中的变量?

时间:2013-02-07 18:42:07

标签: assembly arm neon

NEON扩展寄存器可以被视为16个四字或32个双字。在大多数编程中,要使用的特定寄存器是固定的。例如,

vmov.i8 d0, 0xff
vmov.i8 d1, 0xee
vmov.i8 d2, 0xdd

在我的问题中,所需的双字寄存器的数量取决于函数调用中的参数。例如,如果参数是2,我需要做

vmov.i8 d0, 0xff
vmov.i8 d1, 0xee

如果参数是4,我需要做

vmov.i8 d0, 0xff
vmov.i8 d1, 0xee
vmov.i8 d2, 0xdd
vmov.i8 d3, 0xcc

无论如何选择一个名称基于变量的寄存器?即沿此行的某些内容(以下是无效的ARM汇编代码):

mov r0, #1
vmov.i8 d{r0}, 0xff

2 个答案:

答案 0 :(得分:3)

不可能在指令级选择目标寄存器,因为指令将目标寄存器硬编码到自身中,并且用现代CPU创建自修改代码是不可行的。有关任何指令编码,请参阅ARM ARM

当然,你可以在很高的层次上使用来构建/条件执行

答案 1 :(得分:0)

您可以执行最后两条指令

vmov.i8 d2, 0xdd
vmov.i8 d3, 0xcc

条件是参数为4.

您还可以为参数的所有可能值编写或生成代码。

如果参数始终是常量而不是计算出来的话,你也可以使用宏。