gpt4 book ai didi

gcc - 宏汇编内联错误

转载 作者:行者123 更新时间:2023-12-04 06:16:13 26 4
gpt4 key购买 nike

我正在尝试使用以下宏:

#define M_MA(out, L_v, var1, var2)({ \
asm volatile( \
"movswl %2, %%edi\n\t" \
"movswl %3, %%ebx\n\t" \
"imull %%edi, %%ebx\n\t" \
"sall $1,%%ebx\n\t" \
"cmpl %4,%%ebx\n\t" \
"cmove %5,%%ebx\n\t" \
"addl %1, %%ebx\n\t" \
"jno out%=\n\t" \
"cmovg %5, %%ebx\n\t" \
"cmovl %4, %%ebx\n\t" \
"out%=: nop\n\t" \
"movl %%ebx, %0\n\t" : "=r"(out) : "r"(L_v), "m"(var1), "m"(var2), "r"(-2147483648), "r"(+2147483647) : "%ebx","%edi"); })

当它在使用优化编译的文件中使用时,我得到:
error: ‘asm’ operand has impossible constraints

var1 var2 是 16 位字。 L_v 是 32 位字。

经过一些阅读,我认为问题在于编译器需要的寄存器多于可用寄存器,但我不确定。如果这是问题,我不知道如何使用比现在更少的寄存器或如何修复错误。

我在 32 位平台上通过 Linux 使用 gcc。

任何人都可以澄清一些事情吗?

问候

最佳答案

“我不知道如何使用比现在更少的寄存器”——对于两个 maxint/minint 常量,如何使用立即数而不是寄存器? (啊,cmov 不需要立即数。但是您可以自己将常量存储在 %edi 中,而不需要编译器提前将其设置在不同的寄存器中)。

另外,为什么要在 %ebx 中构建所有内容?然后在最后将其复制到不同的寄存器?没有一个操作是 %ebx 的操作。有特殊意义,所以简单替换%%ebx%0全程并声明 "&=r"而不是 "=r"要么赢,要么至少不输。

关于gcc - 宏汇编内联错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7208271/

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