在 ARM Neon 程序集中使用 C 变量

Posted

技术标签:

【中文标题】在 ARM Neon 程序集中使用 C 变量【英文标题】:Use C variables in ARM Neon assembly 【发布时间】:2013-07-18 10:52:22 【问题描述】:

我在 ARM NEON 汇编代码中使用 C/C++ 变量时遇到问题:

__asm__ __volatile()

我已经阅读了以下可能性,它们应该将值从 ARM 移动到 NEON 寄存器。以下每种可能性都会在我的 android 应用程序中导致致命信号:

VDUP.32 d0, %[variable]
VMOV.32 d0[0], %[variable]

输入参数列表包括:

[variable] "r" (variable)

我成功的唯一方法是使用负载:

int variable = 0;
int *address = &variable;
....
VLD1.32 d0[0], [%[address]]
: [address] "+r" (address)

但我认为,如果我不需要修改变量,负载对于性能来说并不是最好的,而且我还需要了解如何将数据从 ARM 移动到 NEON 寄存器以用于其他目的。

编辑:根据要求添加示例,可能性 1 和 2 都会导致“致命信号”。我知道在这个例子中 NEON 程序集只需要修改“array[4]”的前 2 个元素。

int c = 10;
int *array4;
array4 = new int[64];
for(int i = 0; i < 64; i++)
    array4[i] = 100*i;

__asm__ __volatile ("VLD1.32 d0, [%[array4]] \n\t"
    "VMOV.32 d1[0], %[c] \n\t" //this is possibility 1
    "VDUP.32 d2, %[c] \n\t" //this is possibility 2
    "VMUL.S32 d0, d0, d2 \n\t"
    "VST1.32 d0, [%[output_array1]] \n\t"
    : [output_array1] "=r" (output_array1)
    : [c] "r" (c), [array4] "r" (array4)
    : "d0", "d1", "d2");

【问题讨论】:

你确实记得要破坏 d0,对吧? 您可能应该发布一些真实的代码,否则我们无法确定。 我想知道它是否与编译器如何解释 %[variable] 有关。毕竟,VLD1 指令需要在 address 引用周围加上方括号。 根据需要提供示例。 【参考方案1】:

问题是由输出列表引起的。在输入寄存器中移动输出数组地址可以解决崩溃问题。

int c = 10;
int *array4;
array4 = new int[64];
for(int i = 0; i < 64; i++)
    array4[i] = 100*i;

__asm__ __volatile ("VLD1.32 d0, [%[array4]] \n\t"
    "VMOV.32 d1[0], %[c] \n\t" //this is possibility 1
    "VDUP.32 d2, %[c] \n\t" //this is possibility 2
    "VMUL.S32 d0, d0, d2 \n\t"
    "VST1.32 d0, [%[output_array1]] \n\t"
    :
    : [c] "r" (c), [array4] "r" (array4), [output_array1] "r" (output_array1)
    : "d0", "d1", "d2");

【讨论】:

以上是关于在 ARM Neon 程序集中使用 C 变量的主要内容,如果未能解决你的问题,请参考以下文章

ARM Neon 汇编器 + C 如何传递和使用指针数组

我可以在 x86 C 程序中模拟 ARM NEON 吗?

ARM NEON指令集总结

在 NEON armv8 程序集中存储指令

Qualcomm Scorpion 双核 ARM NEON 代码有问题?

Windows phone 8 neon 内联程序集 ffmpeg [重复]