Sono interessato a trovare il modo più veloce (conteggio del ciclo più basso) di confrontare i valori memorizzati nei registri NEON (ad esempio Q0 e Q3) su un nucleo Cortex-A9 (istruzioni VFP consentite).ARM NEON: confronto dei valori a 128 bit
Finora ho il seguente:
(1) Utilizzando il confronto in virgola mobile VFP:
vcmp.f64 d0, d6
vmrs APSR_nzcv, fpscr
vcmpeq.f64 d1, d7
vmrseq APSR_nzcv, fpscr
Se il 64bit "galleggia" sono equivalenti a NaN, questa versione non funzionerà.
(2) Usando il restringimento neon e il confronto VFP (questa volta solo una volta e in modo NaN-safe):
vceq.i32 q15, q0, q3
vmovn.i32 d31, q15
vshl.s16 d31, d31, #8
vcmp.f64 d31, d29
vmrs APSR_nzcv, fpscr
Il registro D29 viene preventivamente precaricato con il modello 16bit destra:
vmov.i16 d29, #65280 ; 0xff00
La mia domanda è: c'è qualcosa di meglio di questo? Sto supervisionando un modo ovvio per farlo?
Il primo intruction "sovrascrive" tutta Q15 (cioè D30 e D31), mentre il secondo ha solo D31 come _destination_, pertanto alcune informazioni vengono perse e il confronto non sempre produce il risultato di destra. – Mircea
Quando si utilizza vceq.i32, inserisce tutti gli 1 o tutti gli 0 in ognuna delle 4 corsie a 32 bit. La prima istruzione combina le informazioni utili da D30 e D31 a D31 (i 16 bit inferiori di tutti e 4 i confronti). La seconda istruzione confronta i 64 bit inferiori che HA TUTTE le informazioni utili. – BitBank
La prima istruzione (ad esempio vceq.i32) non "combina" nulla. Inoltre, il secondo non utilizza D31 come input ... – Mircea