C编译器学习笔记(六)寄存器的分配

初始化

reg.c中定义了一个数组,是用于存储所有寄存器的:

Symbol X86Regs[R12];

他会在系统已开始的时候被初始化:

void SetupRegisters(void)
{
	X86Regs[R3] = CreateReg("r3", "[r3]", R3);
	X86Regs[R4] = CreateReg("r4", "[r4]", R4);
	X86Regs[R5] = CreateReg("r5", "[r5]", R5);
	X86Regs[R6] = CreateReg("r6", "[r6]", R6);
	X86Regs[R8] = CreateReg("r8", "[r8]", R8);
	X86Regs[R9] = CreateReg("r9", "[r9]", R9);
	X86Regs[R10] = CreateReg("r10", "[r10]", R10);
	X86Regs[R11] = CreateReg("r11", "[r11]", R11);
	X86Regs[R12] = CreateReg("r12", "[r12]", R12);
}

查找空寄存器

static int FindEmptyReg(int endr)
{
	int i;
	
	for (i = 0; i <= endr; ++i)
	{
		if (X86Regs[i] != NULL && X86Regs[i]->link == NULL && ! (1 << i & UsedRegs))
			return i;
	}

	return NO_REG;
}

根据查找空寄存器的条件,我们可以得出空寄存器为:

  1. 在X86Regs中(被初始化)
  2. link为空(没有关联的变量)
  3. UsedRegs对应位为0

ucc用UsedRegs对应位来标记寄存器是否正在被使用,但是通过上面空寄存器的条件我们猜测:

回收寄存器的策略

选择寄存器对应临时变量的引用次数少的寄存器写回。
引用次数在哪里更改的???

变量与寄存器关联问题

代码中AllocateReg只为临时变量分配寄存器,ARM指令必须把局部变量加载到寄存器才行。所以我们去掉AllocateReg只为临时变量分配寄存器的限制,生成指令后立即收回非临时变量的寄存器。

posted @ 2022-05-16 20:43:05
评论加载中...

发表评论

😃😄😁😆😅🤣😂🙂😉😊🥰😍😘😜🤪😝🤑🤔🤨😏😒🙄😮‍💨🤮😵‍💫🥳😎😳🥺😭😡(这里的表情可以复制)