- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 GCC 和 ARM Cortex-A7 优化编写内联汇编的数学函数。我的代码是这样的:
__inline int __attribute__((pcs("aapcs"))) optAbsVal(int x)
{
asm("CMP R0, #0\n"
"IT LT\n"
"RSBLT R0, R0, #0");
return(x);
}
我没有指定任何输入/输出参数,也没有指定内联 asm block 内的 clobbers,因为根据调用约定,x 应该在 R0 中,返回值也是如此。问题是这个函数返回 x 的值而不修改它,这让我觉得要么 x 不在 R0 中,要么编译器以某种方式修改了函数。我通过添加参数 "=r"(x) : "0"(x) 解决了这个问题,但我仍然对这段代码不满意,因为我似乎在做不必要的操作。我做 pcs("aapcs") 的原因是为了避免加载/存储操作以获得更好的性能,但这反而变得更糟。
最佳答案
因为 x
不是返回值,所以它不需要在 R0 中。返回值是对 return
语句中给出的表达式求值的结果。所以对于 return x
,返回值不是 x
,返回值是 x
的值。这是一个重要的区别,因为这意味着 x
不需要存在于 R0 中,只是 x
中的值需要在函数返回之前复制到 R0 中。
因此,由于函数中要执行的最后一条语句是 return (x);
那么这意味着函数所做的最后一件事是将 x
复制到 R0,这破坏您在内联汇编语句中存储在 R0 中的值。
这就是为什么您必须始终完整地描述您的内联汇编语句对机器状态的影响。编译器不知道您要保留 R0 中的值。它不知道您希望 x
参数中传递的值在进入 asm 语句时位于 R0 中。由于调用约定,这可能是正确的,但调用约定的规则仅适用于函数的入口和导出,而不适用于 asm 语句所在的函数中间。如果您的函数内联到另一个函数中,则调用约定根本不适用,因为没有实际的函数调用。
所以你想要的是这样的:
__inline int optAbsVal(int x)
{
asm("CMP %0, #0\n"
"IT LT\n"
"RSBLT %0, %0, #0"
: "+r" (x) : : "cc");
return(x);
}
关于c - 带有 aapcs 的 GCC 内联汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32232350/
我目前正在将为 ARM 编写的编译器移植到另一个目标体系结构。我发现 ARM 存在两种不同的 ABI:APCS_ABI 和 AAPCS_ABI。 我用Google搜索并引用了ARM手册,但没有发现它们
我正在尝试使用 GCC 和 ARM Cortex-A7 优化编写内联汇编的数学函数。我的代码是这样的: __inline int __attribute__((pcs("aapcs"))) optAb
问题 C99 standard告诉我们: There may be unnamed padding within a structure object, but not at its beginnin
首先安装跨工具,然后构建工具链,然后构建内核,但是在为RAM编译内核2.6.34时,反复出现错误 root@kali:~/felabs/sysdev/tinysystem/linux-2.6.
由于这是一个反复出现的主题,因此我提出了一个相关问题。 根据AAPCS : 5.2.1.1 Universal stack constraints SP mod 4 = 0. The stack mu
我是一名优秀的程序员,十分优秀!