2012-01-30 18 views
5

Estoy interesado en encontrar la forma más rápida (recuento de ciclos más bajo) de comparar los valores almacenados en registros NEON (digamos Q0 y Q3) en un núcleo Cortex-A9 (se permiten instrucciones VFP).ARM NEON: comparando valores de 128 bit

Hasta ahora tengo el siguiente:

(1) El uso de la comparación de punto flotante VFP:

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

Si el 64bit "flota" son equivalentes a NaN, esta versión no funcionará.

(2) Utilizando el estrechamiento de neón y la comparación VFP (esta vez sólo una vez y de una manera NaN-safe):

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

El registro D29 está precargado previamente con el patrón de 16 bits a la derecha:

vmov.i16  d29, #65280  ; 0xff00 

Mi pregunta es: ¿hay algo mejor que esto? ¿Estoy supervisando alguna forma obvia de hacerlo?

Respuesta

2

Creo que puede reducirlo en una instrucción. Al usar el desplazamiento hacia la izquierda y la inserción (VLSI), puede combinar los 4 valores de 32 bits de Q15 en 4 valores de 16 bits en D31. A continuación, puede comparar con 0 y obtener los indicadores de coma flotante.

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

La primera Intruction "sobrescribe" toda la Q15 (es decir, D30 y D31), mientras que el segundo sólo se tiene D31 como un _destination_, por lo tanto, se pierde alguna información y la comparación no siempre producirá el resultado correcto. – Mircea

+0

Cuando usa vceq.i32, coloca todos los 1 o todos los 0 en cada uno de los 4 carriles de 32 bits. La primera instrucción combina la información útil de D30 y D31 en D31 (los 16 bits más bajos de las 4 comparaciones). La segunda instrucción compara los 64 bits inferiores que TIENE toda la información útil. – BitBank

+0

La primera instrucción (es decir, vceq.i32) no "combina" nada. Además, el segundo no usa D31 como entrada ... – Mircea

Cuestiones relacionadas