gcc内联汇编函数,它破坏了所有浮点寄存器

时间:2013-04-23 11:38:46

标签: gcc inline-assembly gas

我正在尝试编写一个asm语句( GCC中的内联汇编),它只调用一些函数,它在浮点寄存器中返回一个值并且没有操作数,但可能会破坏所有浮点寄存器。

asm("call *%1"
    : "=t"(result_)
    : "d"(code_.data())
    : "memory", "cc", "ax", "%st(1)", "%st(2)", "%st(3)", "%st(4)", "%st(5)", "%st(6)", "%st(7)"
    );

我的问题是我无法告诉汇编程序,这也破坏了顶部浮点寄存器%st(0),因为我无法在clobber列表中指定"%st(0)"(或"%st")(它导致编译错误。)

1 个答案:

答案 0 :(得分:1)

您将在%st(0)中返回结果;这就是t约束的含义。因此,编译器知道它已被修改。

我不确定为什么你的GCC没有将%st(0)%st识别为clobber列表中的名称,但这不应该在这种情况下引起问题。

Apple clang 4.0版(标签/ Apple / clang-418.0.60)在clobber列表中接受%st,即使=t作为输出约束。