假设我有一个8 int64_t
的短数组v
,我有一个算法需要访问该数组的不同元素,这些元素不是编译时常量,例如v[(i + j)/2] += ...
,其中i
和j
是不受任何常量传播影响的变量。
通常我会将数组保存在内存中,计算数组索引,从内存中加载数组到该位置,然后存储结果。
但是假设,出于我不会深入讨论的合理原因,我想在寄存器中保留完整的数组--数组大小有限,适合寄存器组。
如果我只是从数组中阅读而不是写入数组,我可以使用(在ARMv 8 neon 中)TBL指令来执行表查找。
我所能想到的就是自修改代码,将数组索引直接编码到指令中并执行它。我知道这在第一次运行时会带来性能损失,但如果反复执行相同的代码,它甚至可能会起作用。
除此之外,还有什么想法吗?这可能吗?我回顾了ARMv 8架构参考手册中与指令集和编码相关的部分,到目前为止,我倾向于说不可能,但也许有人知道一个晦涩的指令或寻址模式,在这里会有所帮助。
1条答案
按热度按时间yi0zb3m41#
如果你想访问
x8
,那么除了用一条指令将x8
编码为源寄存器之外,没有其他方法,所以除了在运行时发出指令之外,我能想到的唯一基于索引的解决方案是为每个寄存器提供一个存根,并像switch case一样基于索引进行分支。写操作也是一样的,当然这也有可能打乱分支预测,我能想到的另一个根本不使用分支的“技巧”是将
csel
与直接移动到nzcv
系统寄存器结合起来:这可以扩展到最多16个寄存器。我不太确定
msr
的性能限制,也不确定它在某些架构上是否需要isb
--至少在Apple M1上不需要。而且编写的情况也不会那么紧凑,因为您需要至少8条指令来定位每个寄存器。:/