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ć?
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
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
Pierwsza instrukcja (tzn. Vceq.i32) nie "niczego" łączy. Co więcej, drugi nie używa D31 jako wejścia ... – Mircea