Bir Cortex-A9 çekirdeğinde (VFP talimatlarına izin verilir) NEON kayıtlarında (Q0 ve Q3) saklanan değerleri karşılaştırmanın en hızlı yolunu (en düşük döngü sayısı) bulmakla ilgileniyorum.ARM NEON: 128 bit değerlerini karşılaştırarak
(1) VFP kayan nokta karşılaştırma kullanarak:
Şimdiye kadar aşağıdakilere sahip
vcmp.f64 d0, d6
vmrs APSR_nzcv, fpscr
vcmpeq.f64 d1, d7
vmrseq APSR_nzcv, fpscr
64bit "yüzen" Eğer
NaN eşdeğerdir, bu versiyon çalışmaz.(2) (yalnızca bir kez ve bir NaN açısından güvenli bir şekilde bu kez) NEON daralma ve VFP karşılaştırılması kullanarak:
vceq.i32 q15, q0, q3
vmovn.i32 d31, q15
vshl.s16 d31, d31, #8
vcmp.f64 d31, d29
vmrs APSR_nzcv, fpscr
D29 kayıt önce sağ 16bit desenle önceden yüklenir:
vmov.i16 d29, #65280 ; 0xff00
Soruma şudur: bundan daha iyi mi? Bunu yapmak için bariz bir yolu mu görüyorum?
birinci intruction "yazar" bütün S15 (yani D30 ve D31) belirlerken, ikincisi sadece bir _destination_ olarak D31 sahipken, bu nedenle bazı bilgiler kaybolur ve karşılaştırma her zaman doğru bir sonuç vermez. – Mircea
vceq.i32 kullandığınızda, tüm 1'lerin veya tüm 0'ların 4 32 bit şeridinin her birine yerleştirir. İlk komut, D30 ve D31'den gelen yararlı bilgileri D31'e (4 karşılaştırmanın 16-bit daha düşük) birleştirir. İkinci komut, tüm yararlı bilgileri taşıyan 64 bitleri karşılaştırır. – BitBank
İlk talimat (örn. Vceq.i32) hiçbir şeyi "birleştirmez". Ayrıca, ikincisi D31'i giriş olarak kullanmaz ... – Mircea