带有空输入操作数约束的gcc asm

问题描述 投票:0回答:1

在 gcc 中使用扩展 asm 时,它的作用是清楚并记录的:

__asm__ ("some instructions" : /* No outputs */ : "r" (var));

它要求 gcc 将 var 放入寄存器中并将其作为 %0 传递给我。它还创建了对 var 的依赖关系,这样该指令在最后一点 var 更改之前不会被移动,也不会相对于其他易失性被移动(这是另一个文档的微妙之处)。

不清楚的是它的作用:

__asm__ ("" : : "" (var));

我的第一个初步想法是空约束可能与“X”相同 - 即:将它放在任何地方。但事实并非如此。对于我(使用 Arm 皮质)来说,“X”或“r”将 var 放在 r4 中。 “”则不然。

它创建了相同的排序依赖项,但似乎没有执行任何其他操作。这可能是意图,但这是否记录在任何地方?

assembly gcc inline-assembly
1个回答
0
投票

这可能是意图,但这是否记录在任何地方?

GCC 的内联 asm 约束的工作方式与 insn 约束几乎相同。

recog.cc::preprocess_constraints()
处理像
X
这样的空约束,即“一切都可以”,这就是我们在如下测试用例中看到的;但请参阅此答案末尾的注释。

void func (int a, int b)
{
  __asm ("" :: "" (a*a + b*b + 1));
}

最终 RTL 有此 RTX(为了易读性而进行了编辑):

(asm_operands/v ("")
  ("") 0 [(plus:SI (plus:SI (mult:SI (reg:SI 0 r0)
                                     (reg:SI 0 r0))
                            (mult:SI (reg:SI 1 r1)
                                     (reg:SI 1 r1)))
                   (const_int 1))])

请注意,您无法通过 asm 模板中的

%0
打印此内容,因为后端不知道如何打印如此复杂的表达式。 根据目标,出现的表达式的复杂性可能会降低,例如子表达式可能会在编译时(如果可能)或运行时被分解和预先计算。

对于

g
约束,至少需要一个通用操作数,在本例中是一个寄存器,或者一个内存位置(例如,当结果位于帧中时),或者一个常量(当操作数已知时)编译时)。

我们无法进一步深入兔子洞,因为你没有提供测试用例(没有有效的源代码,没有编译器选项(不知道“cortex”需要什么选项,我不是 Arm 人员),...你说出它的名字。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.