Creo que encontré la respuesta a mi pregunta. Hay una instrucción "fmacs" para VFP que puede hacer el truco que hace el cálculo escalar en los registros NEON/VFP.Mezcla de ensamblaje NEON con funciones no vectoriales
que soy muy nuevo en la programación de neón o ARM ...
quiero cargar una matriz triangular superior en registros NEON e integrar (acumular) el producto exterior de un vector usando precisión simple . Las ideas básicas son A + = x '* x donde A es una matriz triangular superior. Algunas de las operaciones se pueden hacer mediante la vectorización de las operaciones utilizando la instrucción NEON "vmla.f32" en registros cuádruples o dobles. Sin embargo, a veces solo necesito operar en un solo registro de precisión 1 a la vez, es decir, no en 2 o 4 registros de precisión simple. En el siguiente ejemplo (no funciona), estoy interesado en la línea
// A[8-14] += A[1]*x[1-7]
"mla s16, s16, d0[1]\n\t"
Quiero usar los registros de neón para realizar una operación de precisión simple.
Fragmento de código:
__asm__ volatile (
//load x into registers
"vldmia %0, {d0-d3}\n\t"
// load A into registers
"vldmia %1, {d4-d12}\n\t"
"vldmia %1, {d13-d21}\n\t"
// A[0-7] += x[0]*x[0-7]
"vmla.f32 q2, q2, d0[0]\n\t"
"vmla.f32 q3, q3, d0[0]\n\t"
// A[8-14] += A[1]*x[1-7]
"mla s16, s16, d0[1]\n\t"
// output
:
// input
: "r"(A), "r"(x)
// registers
: "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10"
);
usted no está realmente va a querer cambiar de NEON con las instrucciones VFP por el estilo. Tanto el Cortex-A8 como el Cortex-A9 utilizados en las generaciones más recientes de iPhone (sobre lo que has publicado antes) sufren un largo tropiezo entre tales operaciones. También puede ser mejor hacer una operación de vector para la última parte de su cálculo. – ohmantics