如何在 ARM64 内联汇编中使用多向量类型?

How to use multi-vector types in ARM64 inline assembly?

在带有类似 GCC 的 ARM64 编译器中 __asm__,我如何使用像 uint8x16x4_t 这样的多向量 NEON 类型?

uint8x16x4_t Meow()
{
    uint8x16x4_t result;
    __asm__(
        "meow %0"
    :   "=w"(result));
    return result;
}

这导致以下汇编输出:

    meow v0

有没有办法让它变成这样的?:

    meow { v0.16b - v3.16b }

或者更好的是,以某种方式引用各个部分。

您必须手动执行此操作,但您可以使用 TUV 修饰符来执行此操作。后缀只能按字面指定。以下代码:

uint8x16x4_t Meow()
{
    uint8x16x4_t result;
    __asm__(
        "meow { %0.16b, %T0.16b, %U0.16b, %V0.16b }"
    :   "=w"(result));
    return result;
}

给我:

Meow:
    meow { v4.16b, v5.16b, v6.16b, v7.16b }
    mov     v1.16b, v5.16b
    mov     v2.16b, v6.16b
    mov     v3.16b, v7.16b
    mov     v0.16b, v4.16b
    ret