问题标签 [register-allocation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
5083 浏览

c - GCC:禁止使用某些寄存器

这是一个奇怪的要求,但我觉得这是可能的。我想要的是在我的代码区域(用 C 语言编写)中插入一些编译指示或指令,以便 GCC 的寄存器分配器不会使用它们。

我知道我可以做这样的事情,这可能会为这个变量留出这个寄存器

问题是我直接插入新指令(用于硬件模拟器),而 GCC 和 GAS 还不能识别这些指令。我的新指令可以使用现有的通用寄存器,我想确保保留其中的一些(即 r12->r15)。

现在,我在一个模型环境中工作,我想快速做我的实验。将来我将附加 GAS 并将内在函数添加到 GCC 中,但现在我正在寻找一个快速修复。

谢谢!

0 投票
4 回答
1897 浏览

c++ - 在变量定义之前转到 - 它的值会发生什么?

这是我想知道的一些问题。给定以下代码,我们可以确定它的输出吗?

这是否保证finished: 10根据 C++ 标准输出?或者编译器可以占用a存储到的寄存器,什么时候goto到一个位置之前a

0 投票
2 回答
2324 浏览

c - GCC 不保存/恢复函数调用的保留寄存器

我在 GCC 中有一个场景导致我出现问题。我得到的行为不是我期望的行为。总结一下情况,我提出了几个在硬件模拟器中实现的 x86-64 新指令。为了测试这些指令,我使用现有的 C 源代码并使用十六进制对新指令进行手工编码。因为这些指令与现有的 x86-64 寄存器交互,所以我使用输入/输出/clobber 列表来声明 GCC 的依赖项。

发生的情况是,如果我调用一个函数,例如 printf,则不会保存和恢复相关寄存器。

例如

101 被分配给 r9 并且内联汇编(在这个例子中是假的)依赖于 r9。这在没有 printf 的情况下正确运行,但是当它存在时,GCC 不会保存和恢复 r9,并且在调用我的自定义指令时存在另一个值。

我想也许 GCC 可能已经秘密地改变了对变量r9 的赋值,但是当我这样做时

看看汇编输出,它确实在使用 %r9。

我正在使用 gcc 4.4.5。你认为可能会发生什么?我认为 GCC 将始终保存和恢复函数调用的寄存器。有什么办法可以强制执行吗?

谢谢!

编辑:顺便说一句,我正在编译这样的程序

0 投票
2 回答
110 浏览

embedded - 使用寄存器输入设置

我有一个用于打印 n 斐波那契数的简单 c 程序,我想将其编译为 ELF 目标文件。我不想直接在我的 c 代码中设置斐波那契数 (n) 的数量,而是想在寄存器中设置它们,因为我正在为 ARM 处理器模拟它。我该怎么做?

这是代码片段

我想在我的寄存器而不是代码中设置迭代计数器。

提前致谢

0 投票
1 回答
1580 浏览

gcc - 在 GCC 中使用内联 ARM 程序集时优化使用的寄存器

我想在我的 C 代码中编写一些内联 ARM 程序集。对于此代码,我需要使用一个或两个以上的寄存器,而不仅仅是声明为函数的输入和输出的寄存器。我知道如何使用 clobber 列表告诉 GCC 我将使用一些额外的寄存器来进行计算。

但是,我确信 GCC 在优化时可以自由地调整哪些寄存器用于什么。也就是说,我觉得在计算中使用固定寄存器是个坏主意。

在不使用固定寄存器的情况下,使用既不是我的内联程序集的输入也不是输出的额外寄存器的最佳方法是什么?

PS我在想使用虚拟输出变量可能会奏效,但我不确定会产生什么样的奇怪的其他效果......

0 投票
1 回答
179 浏览

if-statement - if 的额外注册使用

我正在研究一个大型 cuda 内核,我注意到内核每个线程使用 43 个寄存器。为了了解发生了什么,我编写了一个较小的程序来计算寄存器的使用情况。我注意到每当我使用 时if,寄存器的使用率都会上升。小代码如下:

当我编译这段代码时,每个线程使用 5 个寄存器

但是,如果我取消注释if,每个线程使用 8 个寄存器。谁能向我解释发生了什么事?

0 投票
1 回答
289 浏览

compiler-construction - 图形着色寄存器分配器

对于我的编译器课程,我正在为 MIPS 架构构建一个基于图形着色的寄存器分配器。对于我的实施,我正在遵循 Muchnick 的处理方法。

Muchnick 对如何处理这些分配器中的函数参数有点模糊。

我做了一些假设,并认为我会澄清相同的。

  1. 有这个步骤可以从中级 IR 转换为低级 IR。尚未处理嵌套函数调用。我的想法是从右到左扫描函数调用,并为最里面的向外调用设置 IR。通过这种方式,我可以使用 MIPS 调用约定,将前几个参数分配给参数寄存器,其余的以最少的溢出量(只有 1 个)堆栈。
  2. 书中的寄存器合并处理对我来说并不直观,因为它没有解决如何处理将函数参数移动到固定参数寄存器的 LIR 代码。经过深思熟虑,我得出的结论是,我不应该为参数传递动作进行寄存器合并。

非常感谢对这些假设的反馈/想法。

0 投票
1 回答
239 浏览

java - 寄存器分配中的预着色节点-每种颜色最多一种?

我正在研究有关编译器中寄存器分配的主题。一种广泛使用的寄存器分配算法是通过简化的迭代图着色。在Andrew W. Appel所著的Modern Compiler Implementation in Java一书中,关于寄存器分配的第 11 章指出:

干扰图中的每个节点代表一个临时值。

[...]

一些临时对象是预着色的——它们代表机器寄存器。例如,当跨模块边界与标准调用约定接口时,前端会生成这些。对于用于某些特定目的的每个实际寄存器,例如帧指针、标准参数 1 寄存器、标准参数 2 寄存器等,CodegenFrame模块应使用永久绑定的特定临时寄存器到那个寄存器。对于任何给定的颜色(即,对于任何给定的机器寄存器),应该只有一个该颜色的预着色节点。

我不完全理解上面引用中的指示行。我可以想象有多个临时对象将使用相同的寄存器预着色的情况。例如,x86mul指令将结果存储在EDX:EAX寄存器对中,但函数也在EAX寄存器中返回值。所以我有不同的临时工有相同的颜色。我认为那些不同的用途EAX必须是不同的节点,还是我错了?

有人可以解释突出显示的句子,或者举一些例子吗?

0 投票
1 回答
846 浏览

cpu-registers - 基于寄存器+堆栈的虚拟机如何工作?

我知道基于寄存器以及基于堆栈的虚拟机如何独立工作。我知道两者的优点和缺点。我想知道的是有没有人尝试过将两者合并?

我试图在网上搜索是否存在这样的虚拟机,但无济于事。我得到的最好结果是一篇关于混合虚拟机 ( HyVM ) 的文章。如果确实为编程语言创建了这样的虚拟机,我将有兴趣查看它的源代码以了解它的工作原理。

也许有人可以指出我找到这样一个虚拟机的正确方向,或者将我链接到详细阐述该主题的文章或博客文章。

0 投票
3 回答
1035 浏览

assembly - 使用 FPU 和 MMX 寄存器作为“通用寄存器”

大多数汇编程序都使用 4 个通用寄存器eax ebx ecx edx,但我发现很多时候我需要使用超过 4 个寄存器来轻松完成我的任务,而不必过多pushpop进出堆栈。由于我的程序无意使用 FPU 或 MMX 寄存器进行浮点计算或其“预期用途”,因此在您的程序中使用这些额外的寄存器是否可以接受?

例如。使用xmm0循环增量计数器释放ecx寄存器来做其他事情。