2012-01-30 19 views
5

Jestem zainteresowany znalezieniem najszybszego sposobu (najniższej liczby cykli) porównywania wartości zapisanych w rejestrach NEON (powiedzmy Q0 i Q3) w rdzeniu Cortex-A9 (dozwolone instrukcje VFP).ARM NEON: porównanie wartości 128-bitowych

tej pory mam następujące:

(1) Używając porównania zmiennoprzecinkową VFP:

vcmp.f64  d0, d6 
vmrs   APSR_nzcv, fpscr 
vcmpeq.f64  d1, d7 
vmrseq   APSR_nzcv, fpscr 

Jeśli 64bit "pływa" są równoważne NaN, ta wersja nie będzie działać.

(2) Korzystanie z zwężenie neon i porównanie VFP (tym razem tylko raz w NaN-bezpieczny sposób):

vceq.i32  q15, q0, q3 
vmovn.i32  d31, q15 
vshl.s16  d31, d31, #8 
vcmp.f64  d31, d29 
vmrs   APSR_nzcv, fpscr 

Rejestr D29 jest wcześniej z preinstalowanym prawej 16bit wzoru:

vmov.i16  d29, #65280  ; 0xff00 

Moje pytanie brzmi: czy jest coś lepszego niż to? Czy nadzoruję jakiś oczywisty sposób, żeby to zrobić?

Odpowiedz

2

Uważam, że można zmniejszyć to o jedną instrukcję. Za pomocą przesunięcia w lewo i wstawienia (VLSI) można połączyć 4 32-bitowe wartości Q15 z 4 16-bitowymi wartościami w D31. Następnie można porównać z 0 i uzyskać flagi zmiennoprzecinkowe.

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

Pierwszy intruction „nadpisuje” cały Q15 (tj D30 i D31), podczas gdy drugi ma jedynie D31 jako _destination_, dlatego niektóre informacje zostaną utracone, a porównanie nie zawsze przyniesie właściwego rezultatu. – Mircea

+0

Kiedy używasz vceq.i32, umieszcza wszystkie 1 lub wszystkie 0 na każdym z 4 32-bitowych pasów. Pierwsza instrukcja łączy przydatne informacje od D30 i D31 do D31 (dolne 16 bitów wszystkich 4 porównań). Druga instrukcja porównuje niższe 64-bitowe, które zawiera wszystkie przydatne informacje. – BitBank

+0

Pierwsza instrukcja (tzn. Vceq.i32) nie "niczego" łączy. Co więcej, drugi nie używa D31 jako wejścia ... – Mircea

Powiązane problemy