手臂;或开关;汇编;
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
我正在考虑一种在 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