gpt4 book ai didi

c - 带有 aapcs 的 GCC 内联汇编

转载 作者:太空宇宙 更新时间:2023-11-04 01:25:26 24 4
gpt4 key购买 nike

我正在尝试使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com