【问题标题】:Why does VMOV.F64 not allow me to load zero?为什么 VMOV.F64 不允许我加载零?
【发布时间】:2012-06-26 10:45:30
【问题描述】:

以下 ARM 汇编:

vmov.f64 d16, #0

失败并出现以下错误:

/tmp/ccZD4Iex.s:121: Error: immediate out of range -- `vmov.f64 d16,#0'

使用 arm-none-linux-gnueabi-g++ (Sourcery CodeBench Lite 2012.03-57) 4.6.3 编译

如何将 d16 register-double 归零,以便将其用于双精度 VFP 指令?

【问题讨论】:

    标签: assembly arm


    【解决方案1】:

    VMOV 只能接受 limited set 的浮点立即数,而且令人惊讶的是,0 不是其中之一:

    任何可以表示为 +/-n * 2-r 的数,其中 n 和 r 是 整数,16

    您可以按照 BitBank 的建议进行操作,或者使用整数移动,这也会将寄存器归零。

    vmov.i64 d16, #0
    

    【讨论】:

      【解决方案2】:

      NEON 指令不允许您将 64 位或 128 位立即数加载到寄存器中。浮点值 0.0 恰好也是 0x0000000000000000,所以另一种实现方法是使用整数运算:

         veor.i64 d16,d16,d16
      

      或者你可以从内存中加载值(慢得多)

       double zero[] = {0.0};
      
         vld1.64 d16,[zero]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-18
        • 2019-01-23
        • 2013-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-23
        相关资源
        最近更新 更多