gpt4 book ai didi

GCC 扩展 Asm - 了解 clobbers 和临时寄存器用法

转载 作者:行者123 更新时间:2023-12-01 01:46:14 29 4
gpt4 key购买 nike

来自关于 Extended ASM - Clobbers and Scratch Registers 的 GCC 文档我发现很难理解以下解释和示例:

Here is a fictitious sum of squares instruction, that takes two pointers to floating point values in memory and produces a floating point register output. Notice that x, and y both appear twice in the asm parameters, once to specify memory accessed, and once to specify a base register used by the asm.



好的,第一部分明白了,现在句子继续:

You won’t normally be wasting a register by doing this as GCC can use the same register for both purposes. However, it would be foolish to use both %1 and %3 for x in this asm and expect them to be the same. In fact, %3 may well not be a register. It might be a symbolic memory reference to the object pointed to by x.



失去了我。

这个例子:
asm ("sumsq %0, %1, %2"
: "+f" (result)
: "r" (x), "r" (y), "m" (*x), "m" (*y));

这个例子和句子的第二部分告诉我们什么?与另一个代码相比,此代码的附加值(value)是什么?这段代码是否会导致更有效的内存刷新(如本章前面所述)?

最佳答案

Whats is the added value of this code in compare to another?



哪个“另一个”?在我看来,如果您有这种指令,您几乎必须使用此代码(唯一的替代方法是通用 memory clobber)。

情况是,您需要将寄存器传递给指令,但实际操作数在内存中。因此,您需要确保两件独立的事情,即:
  • 您的指令获取寄存器中的操作数。这是什么r约束做。
  • 编译器知道你的 asm块读取内存,所以 *x 的值和 *y必须在块之前冲洗。这是什么m约束用于。

  • 您不能使用 %3而不是 %1 ,因为 m约束使用内存引用语法。例如。而 %1可能类似于 %r0%eax , %3可能是 (%r0) , (%eax)甚至只是 some_symbol .不幸的是,您的假设指令不接受这些类型的操作数。

    关于GCC 扩展 Asm - 了解 clobbers 和临时寄存器用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49067312/

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