由NEON内在函数生成的程序集[LLVM

我想了解更多关于ARM汇编的知识,并了解NEON内部函数背后发生了什么。 我正在使用最新的Xcode LLVM编译器。 我发现通常情况下,由内在函数生成的程序集实际上比简单朴素的C代码慢。

例如这个代码:

void ArmTest::runTest()
{

    const float vector[4] = {1,2,3,4};
    float result[4];
    float32x4_t vA = vld1q_f32(vector);

    asm("#Begin Test");

    vA = vmulq_f32(vA, vA);

    asm("#End Test");

    vst1q_f32(result, vA);
}

产生这个输出:

#Begin Test

ldr q0, [sp, #16]
stp q0, q0, [fp, #-48]
ldur    q1, [fp, #-32]
fmul.4s v0, v1, v0
str q0, [sp, #16]

#End Test

我不明白的是为什么所有的加载/存储都在这里触及内存? 我必须错过一些明显的东西,对吧? 另外,如何在内联程序集中编写这些代码以使其达到最优? 我希望只有一条指令,但输出方式不同。

请帮助我理解。

谢谢!


你需要更好的测试。 您的测试不会将计算结果用于任何事情,因此编译器只是通过动作来让您快乐。 看起来你正在编译-O0,这会产生一堆不必要的加载和存储以用于调试目的。 如果你使用-O3编译,你的所有代码都将被删除。 我重写了测试以保留结果并使用-O3进行编译,结果如下:

$ cat neon.c 
#include <arm_neon.h>

void runTest(const float vector[], float result[])
{
    float32x4_t vA = vld1q_f32(vector);
     vA = vmulq_f32(vA, vA);
     vst1q_f32(result, vA);
}

$ xcrun -sdk iphoneos clang -arch arm64 -S neon.c -O3
$ cat neon.s 
    .section    __TEXT,__text,regular,pure_instructions
    .globl  _runTest
    .align  2
_runTest:                               ; @runTest
; BB#0:
    ldr q0, [x0]
    fmul.4s v0, v0, v0
    str q0, [x1]
    ret lr

此代码看起来最佳

链接地址: http://www.djcxy.com/p/59751.html

上一篇: Assembly generated from NEON intrinsics [LLVM

下一篇: Inline assembly language