相关疑难解决方法(0)

注册分配和溢出,简单方法?

我正在寻找一种方法来将局部变量分配给寄存器.我知道有几种严肃的方法(即维基百科上提到的方法),但我仍然坚持如何"溢出"完成.此外,相关文献相当令人生畏.我希望有一些更简单的东西可以满足我的优先事项:

  1. 正确性 - 一种算法,无论有多少局部变量,都会生成正确的代码.
  2. 简单 - 我无需阅读太多文献即可理解.
  3. 效率 - 它需要比现有方法更好,即:

将操作转换x = y # z为:

movl y, %eax
movl z, %ebx
op %ebx, %eax
movl %eax, x
Run Code Online (Sandbox Code Playgroud)

由于我的目标是英特尔386,因此一些相关的限制是:

  • 二进制操作有两个参数,其中一个是源和目标.一元操作只需一个参数.
  • 操作只能访问一个内存位置; 因此,二进制运算需要寄存器中至少有一个参数.
  • 最多有六个寄存器:%eax %ebx %ecx %edx %esi %edi.(%ebp也可作为最后手段.)
  • 有一些特殊情况,例如整数除法和返回寄存器,但我现在可以忽略它们.

编译器目前有三个步骤:

  • i386ification:所有操作都转换为表单a = a # b(或a = #a用于一元操作).
  • 活力分析:确定每个操作之前和之后的活变量集.
  • 寄存器分配:构建干扰图并着色.

然后编译器抛出它的蜡笔,不知道接下来该做什么.

public int mf(int cr, int ci) {
    int i = 0;
    int zr = 0;
    int zi = …
Run Code Online (Sandbox Code Playgroud)

compiler-theory graph-theory register-allocation i386

26
推荐指数
2
解决办法
7692
查看次数

寄存器分配算法

我正在尝试为 Trees 实现一种代码生成/寄存器分配算法,以支持我的旧算法,我将所有内容都放在堆栈中。现在我正在尝试实现Sethi-Ullman 算法,但仅从我在维基百科和一些网页上找到的内容来看,算法的某些部分对我来说仍然不清楚。

我正在寻找对一些伪代码/C/C++ 工作代码缺少的部分的解释。

1)我应该使用哪种方法来选择免费注册?即,正在使用的寄存器堆栈。我正在使用我认为非常糟糕的东西:交替返回寄存器:如果以前使用的寄存器是 R0,则返回 R1。如果是 R1,则返回 R0,依此类推。它不适用于小表达式。

2) 我应该在label(left) >= K and label(right) >= K什么时候做什么?

这是labelsethi-ullman功能

REG reg()
{
    static REG r = REG_NONE;

    switch(r) {
        case REG_NONE:
            r = REG_r0;
            break;
        case REG_r0:
            r = REG_r1;
            break;
        case REG_r1:
            r = REG_r0;
            break;
        default:
            assert(0);
            break;
    }
    return r;
}

void SethiUllman(AST *node)
{
    static const int K = 2;

    if(node->left != NULL && node->right != NULL) …
Run Code Online (Sandbox Code Playgroud)

c c++ compiler-construction algorithm register-allocation

5
推荐指数
1
解决办法
956
查看次数