2012-01-30 19 views
5

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?

cevap

2

Bir talimatla azaltabileceğinizi düşünüyorum. Sola kaydırma ve ekleme (VLSI) kullanarak, D15'in 4 32 bitlik değerlerini D31'de 4 16 bitlik değerlere birleştirebilirsiniz. Daha sonra 0 ile karşılaştırabilir ve kayan nokta bayraklarını alabilirsiniz.

vceq.i32 q15, q0, q3 
vlsi.32 d31, d30, #16 
vcmp.f64 d31, #0 
vmrs  APSR_nzcv, fpscr 
+0

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

+0

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

+0

İlk talimat (örn. Vceq.i32) hiçbir şeyi "birleştirmez". Ayrıca, ikincisi D31'i giriş olarak kullanmaz ... – Mircea