我正在寻找一种方法来将局部变量分配给寄存器.我知道有几种严肃的方法(即维基百科上提到的方法),但我仍然坚持如何"溢出"完成.此外,相关文献相当令人生畏.我希望有一些更简单的东西可以满足我的优先事项:
将操作转换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也可作为最后手段.)编译器目前有三个步骤:
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) 我正在尝试为 Trees 实现一种代码生成/寄存器分配算法,以支持我的旧算法,我将所有内容都放在堆栈中。现在我正在尝试实现Sethi-Ullman 算法,但仅从我在维基百科和一些网页上找到的内容来看,算法的某些部分对我来说仍然不清楚。
我正在寻找对一些伪代码/C/C++ 工作代码缺少的部分的解释。
1)我应该使用哪种方法来选择免费注册?即,正在使用的寄存器堆栈。我正在使用我认为非常糟糕的东西:交替返回寄存器:如果以前使用的寄存器是 R0,则返回 R1。如果是 R1,则返回 R0,依此类推。它不适用于小表达式。
2) 我应该在label(left) >= K and label(right) >= K什么时候做什么?
这是label和sethi-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)