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?
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
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
La primera instrucción (es decir, vceq.i32) no "combina" nada. Además, el segundo no usa D31 como entrada ... – Mircea