如何在 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 }
或者更好的是,以某种方式引用各个部分。
您必须手动执行此操作,但您可以使用 T
、U
和 V
修饰符来执行此操作。后缀只能按字面指定。以下代码:
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
在带有类似 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 }
或者更好的是,以某种方式引用各个部分。
您必须手动执行此操作,但您可以使用 T
、U
和 V
修饰符来执行此操作。后缀只能按字面指定。以下代码:
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