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]; }
Symbol Reg::GetRegInternal() { int i; // 尝试找到一个还没有使用的寄存器,若返回不等于-1,代表存在 i = FindEmptyReg(); // 若没有空余的寄存器 if (i == NO_REG) { i = SelectSpillReg(); SpillReg(Regs[i]); } UsedRegs |= 1 << i; //设置标志位 return Regs[i]; }