Sto cercando il modo più veloce per verificare se un registro di 128 NEON contiene tutti gli zeri, usando gli intrinseci NEON. Attualmente sto usando 3 O operazioni, e 2 MOV:Il modo più veloce per testare un registro NEON a 128 bit per un valore pari a 0 utilizzando intrinseche?
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 }
Questo si traduce da gcc al seguente codice assembly:
VORR q9, q9, q10
VORR d16, d18, d19
VMOV.32 r3, d16[0]
VMOV.32 r2, d16[1]
VORRS r2, r2, r3
BEQ ...
Qualcuno ha un'idea di un modo più veloce?
Questo sembra vulnerabile a trabocchi, però. – wolfv