3

我使用 arm 组件和 NEON SIMD 指令。我想获得两个 Q 寄存器中的最大 16 位无符号值,并将它们与阈值进行比较。如果所有 16 位值都小于阈值,我调用一个函数。如果一个或多个值大于阈值,我调用另一个函数。

以下 SIMD 指令获得最大值。

// 阈值是一个 r 寄存器

vdup.16       q15, threshold  
vmax.u16      q12, q14, q13  
vcgt.u16      q11, q12, q15

vcgt 会影响 FPSCR 标志吗?我想不是。然后我必须检查 q11 是否为零。如果是zeor,调用function1,否则调用function2。这就像

if (q11 == 0)
//call function1
else
//call function2 

在不将 q11 移动到 4 r 寄存器的情况下如何做到这一点?

谢谢

4

1 回答 1

2

没有——至少在用户模式下没有。这些 cmp 指令创建掩码向量,您可以根据这些向量在两个结果之间选择值。

  1. 使用适当的 vcmp 创建掩码
  2. 计算两种情况的结果
  3. 使用 1 中的掩码将上述两个结果中的相应元素放入每个车道。

目前我不能准确地告诉你这些指令是什么,因为我是在火车上用 iPhone 写的。但是在参考手册中找到它们不会有问题。

于 2013-06-13T14:28:05.110 回答