【发布时间】:2016-11-03 21:01:21
【问题描述】:
我想在 armv8 NEON 内联汇编代码中实现 if 条件。 在 armv7 中,这可以通过像这样检查溢出位来实现:
VMRS r4, FPSCR
BIC r4, r4, #(1<<27)
VMSR FPSCR, r4
vtst.16 d30, d30, d30
vqadd.u16 d30, d30, d30
vmrs r4, FPSCR
tst r4, #(1<<27)
bne label1
但我无法在 armv8 等效代码中实现这一点。似乎 SQADD 不会影响 FPSR 中的溢出位,或者我无法像这样检查它。是否有可能或有更好的方法来跳过长部分代码?
谢谢
【问题讨论】:
-
“FPCR 中的溢出位”是什么意思? FPCR是控制寄存器;状态位在 FPSR 中。你的 A64 代码目前在做什么?
-
我的意思是 FPSR。我的代码正在执行类似的操作:将图像中的像素加载到 NEON 寄存器中,在此寄存器上进行一些计算,然后检查是否至少有一个像素不为 0。如果此条件为真,则在此 NEON 寄存器上执行大量指令。否则继续新的加载...
-
嗯,
sqadd的 ARM ARM 中的伪代码肯定说如果发生饱和,它会设置 FPSR.QC。当然,再次查看 A32 代码,如果您期望 -1 + -1 溢出 signed 类型,那是另一回事... -
这就像您寻找
UQADD而不是SQADD一样简单吗?您的 AArch32 代码使用vqadd.u16,即寻找无符号饱和度而不是有符号饱和度。 -
向我们展示您对 ARMv8 代码的尝试
标签: if-statement arm overflow conditional-statements neon