私は自分の質問に対する答えを見つけたと思います。NEON/VFP レジスタでスカラー計算を行うトリックを実行できる VFP 用の「fmacs」命令があります。
私はNEONまたはARMプログラミングに非常に慣れていません...
上三角行列を NEON レジスタにロードし、単精度を使用してベクトルの外積を積分 (累積) したいと考えています。基本的な考え方は、A += x'*x です。ここで、A は上三角行列です。一部の操作は、quad または double レジスターで NEON 命令 "vmla.f32" を使用して操作をベクトル化することで実行できます。ただし、一度に 1 つの精度レジスタを操作するだけでよい場合もあります。つまり、2 つまたは 4 つの単精度レジスタを操作する必要はありません。以下の例では(動作しません)、次の行に興味があります
// A[8-14] += A[1]*x[1-7]
"mla s16, s16, d0[1]\n\t"
NEON レジスタを使用して 1 つの単精度演算を実行したいと考えています。
コードスニペット:
__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"
);