将NEON组件与非向量函数混合使用

pau*_*aul 6 assembly arm neon

我想我找到了问题的答案.VFP有一个"fmacs"指令可以执行在NEON/VFP寄存器上进行标量计算的技巧.


我对NEON或ARM编程很新...

我想将一个上三角矩阵加载到NEON寄存器中,并使用单精度积分(累加)矢量的外积.基本思想是A + = x'*x,其中A是上三角矩阵.一些操作可以通过在四重或双重寄存器上使用NEON指令"vmla.f32"来矢量化操作来完成.但是,有时我只需要在一个精度寄存器1上操作,即不在2或4个单精度寄存器上操作.在下面的例子中(不起作用),我对该行很感兴趣

// A[8-14] += A[1]*x[1-7] 
"mla  s16, s16, d0[1]\n\t"
Run Code Online (Sandbox Code Playgroud)

我想使用NEON寄存器执行一次单精度操作.

代码段:

    __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"
    );
Run Code Online (Sandbox Code Playgroud)

Guy*_*ton 1

所以我认为您是在问将向量与标量相乘

我将使用“vdup”将标量加载到 NEON 寄存器的所有通道中,然后相乘。

如果你可以发布你想要做的事情的纯C版本,我可以尝试帮助更多......