手臂;或开关;汇编;

arm; OR switch; asm;

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

我将 4x8 位值打包在一个 32 位字中,因此 [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

有没有更有效的方法? 谢谢

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

   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