7

NEON組み込み関数を使用して、128NEONレジスタにすべてゼロが含まれているかどうかをテストする最速の方法を探しています。現在、3つのOR操作と2つのMOVを使用しています。

uint32x4_t vr = vorrq_u32(vcmp0, vcmp1);

uint64x2_t v0 = vreinterpretq_u64_u32(vr);
uint64x1_t v0or = vorr_u64(vget_high_u64(v0), vget_low_u64(v0));

uint32x2_t v1 = vreinterpret_u32_u64 (v0or);
uint32_t r = vget_lane_u32(v1, 0) | vget_lane_u32(v1, 1);

if (r == 0) { // do stuff }

これは、gccによって次のアセンブリコードに変換されます。

VORR     q9, q9, q10
VORR     d16, d18, d19
VMOV.32  r3, d16[0]
VMOV.32  r2, d16[1]
VORRS    r2, r2, r3
BEQ      ...

誰かがより速い方法のアイデアを持っていますか?

4

5 に答える 5

7

この答えは少し遅れているかもしれませんが、3 つの命令だけで余分なレジスタを使わずにテストを行う簡単な方法があります。

inline uint32_t is_not_zero(uint32x4_t v)
{
    uint32x2_t tmp = vorr_u32(vget_low_u32(v), vget_high_u32(v));
    return vget_lane_u32(vpmax_u32(tmp, tmp), 0);
}

128 ビット NEON レジスタのいずれかのビットが設定されている場合、戻り値はゼロ以外になります。

于 2016-02-12T16:39:44.413 に答える