【问题标题】:arm; OR switch; asm;手臂;或开关;汇编;
【发布时间】:2015-12-29 02:42:27
【问题描述】:

我正在考虑一种在 ARM asm 上实现以下代码的有效方法。

我在一个 32 位字中包含 4x8 位值,因此 [x:y:z:w]。它们中的每一个都在 [0-7] 范围内。

条件是 if( (x==0) || (y==0) || (z==0) || (w==0) ) goto _jump0; // skip part of initialization

目前我使用直接的解决方案,例如

    tst         val         , #(255)
    beq         .L.jump0
    tst         val         , #(255<<16)
    beq         .L.jump0
    tst         val         , #(255<<32)                                   
    beq         .L.jump0
    tst         val         , #(255<<48)
    beq         .L.jump0

有没有办法更有效地做到这一点? 谢谢。

【问题讨论】:

  • 有趣的解决方案。但它也需要从内存中读取 2 个常量(0x01010101UL;0x80808080UL)。内存访问是相当繁重的指令,它们会消除好处。
  • 这些常量可以在一条指令中编码,因为mov 允许0xXYXYXYXY 形式的立即数,不需要内存访问
  • @BitBank,时间在本文档中描述Cortex-A57 Software Optimisation Guide
  • 也许我们在谈论 2 个不同的问题。您还没有描述围绕这一小区域的其余软件。如果它只是一个被比较的 4 字节值,那么 NEON 没有意义,并且您拥有的原始代码很好。如果您与很多这样的小组合作,那么 SIMD 解决方案会更有效。

标签: assembly switch-statement arm arm64


【解决方案1】:

如果你有一个空闲的寄存器,你可以预加载一个常量掩码值:

   mov w1,#0x01010101    @ mov allows loading a repeated byte

那么您的问题适合 5 条指令(在某些情况下较慢,在其他情况下较快)

   orr w0,w0,w0,LSR #1   @ since values are 0-7, combine the 3 bits
   orr w0,w0,w0,LSR #2
   and w0,w0,w1          @ mask off the bits we care about
   cmp w0,w1             @ any zeros present?
   bne there_is_a_zero

【讨论】:

    猜你喜欢
    • 2015-12-02
    • 1970-01-01
    • 2021-08-15
    • 2014-09-07
    • 2021-12-17
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多