ARM NEON:如何对整个64位d寄存器进行位移?

时间:2018-02-03 18:41:13

标签: assembly arm neon

我希望逻辑上将vshl寄存器(64位)向左或向右移位任意数量的位,并将计数放在另一个寄存器中。 (不是组装时间常数。)

它包含整数值,我需要做的是将它们“移动”到寄存器内的正确位置。只应将零移入“末尾”的寄存器,因此这是一个逻辑移位,而不是算术。

我想移动整个寄存器而没有任何元素边界。

我考虑过使用vshr@RestController public class ChatController { private static final Logger LOG = LoggerFactory.getLogger(ChatController.class); @RequestMapping(value="/webhook", method=RequestMethod.POST, consumes="application/json") public String onWebhookEvent(String event) { LOG.info("Received event {}",event); return "test"; } } ,但是它们将寄存器作为单独的SIMD元素而不是整个寄存器作为一个“值”。

1 个答案:

答案 0 :(得分:2)

在准确查找how vshl works时,我发现有一个使用64位元素大小的版本。

如果您想对整个128位q寄存器进行位移,则会出现问题,但vshl / vshr可以执行您想要的d / u64 {1}}注册,如果您使用vshl.u64 d1, d0, d7 @ d1 = d1<<d7 - 数据类型版本。

q

还可以使用MainActivity个操作数,以并行处理两个压缩的64位值。

  

VSHL(由带符号的变量向左移动)获取向量中的每个元素,将它们从第二个向量的相应元素的最低有效字节移位一个值,并将结果放在目标向量中。 如果移位值为正,则操作为左移。否则,这是一个正确的转变。

对于即时转换,左右各有单独的助记符。 (例如vshr.u64 Dd, Dm, #immvshl.u64 Dd, Dm, #imm)。不过,这可能只是针对同一操作码的正或负立即数的不同汇编语法。