Beispiel #1
0
static Symbol GetRegInternal(int width)
{
	int i, endr;
	Symbol *regs;

	switch (width)
	{
	case 1:
		endr = EDX;
		regs = X86ByteRegs;
		break;

	case 2:
		endr = EDI;
		regs = X86WordRegs;
		break;

	case 4:
		endr = EDI;
		regs = X86Regs;
		break;
	}

	i = FindEmptyReg(endr);
	if (i == NO_REG)
	{
		i = SelectSpillReg(endr);
		SpillReg(X86Regs[i]);
	}
	UsedRegs |= 1 << i;

	return regs[i];
}
Beispiel #2
0
Symbol Reg::GetRegInternal()
{
	int i;

	// 尝试找到一个还没有使用的寄存器,若返回不等于-1,代表存在
	i = FindEmptyReg();
	// 若没有空余的寄存器
	if (i == NO_REG)
	{
		i = SelectSpillReg();
		SpillReg(Regs[i]);
	}

	UsedRegs |= 1 << i;	//设置标志位

	return Regs[i];
}