【问题标题】:armv8 NEON if conditionarmv8 NEON 如果条件
【发布时间】: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


【解决方案1】:

Aarch64 中提供了相同的信息。你只需要更换:

VMSR r4, FPSCR VMRS FPSCR, r4

作者:

MRS w4, FPSR MSR FPSR, w4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多