【发布时间】: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