2012-01-30 15 views
5

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?

risposta

2

Credo che sia possibile ridurlo con una sola istruzione. Utilizzando lo spostamento a sinistra e l'inserimento (VLSI), è possibile combinare i 4 valori a 32 bit di Q15 in 4 valori a 16 bit in D31. È quindi possibile confrontare con 0 e ottenere i flag in virgola mobile.

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

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

+0

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

+0

La prima istruzione (ad esempio vceq.i32) non "combina" nulla. Inoltre, il secondo non utilizza D31 come input ... – Mircea

Problemi correlati