⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 regmgmt.c

📁 用C++编写的一个编译器
💻 C
字号:
#include "stdio.h"
#include "genasm.h"

//Here we give up any effient algorithm 
//for my ignorance and lack of time 

//I have no support float number calculation,
//and there is no float register management here

#define FREEREG 6
bool regs[8] ;
char regstack[32], regmark[32];
int nextdata, rmdepth, rsdepth; 

void initstack(void)
/*
 *      this routine should be called before each expression is
 *      evaluated to make sure the register stack is balanced and all of
 *      the registers are marked free.
 */
{
	nextdata=0;
	rsdepth = rmdepth = 0;
    regs[0]=regs[1]=regs[2]=regs[3]=regs[4]=regs[5]=0;
	regs[6]=regs[7]=1;
}

void mark(void)
{
	regmark[rmdepth++] = rsdepth;
}

void release(void)
{
	int regno;
	if (!rmdepth)
		return;
	rmdepth--;
	while (rsdepth > regmark[rmdepth]) 
	{
		regno = regstack[--rsdepth];
		if(regs[regno])
			debug("[release] rewrite a used a register\n");
		pop_reg(regno);
		regs[regno] = true;
	}
}
AddrMode *temp_data(void)
{
	AddrMode *ap;
	ap = newDreg(nextdata++ % FREEREG);
	if(regs[ap->base_reg])
	{
		push_reg(ap->base_reg);
		regstack[rsdepth++] = ap->base_reg;
	}
	else 
		regs[ap->base_reg]= true;
	return ap;
}
void freedata(int regno)
{
	if(regno<FREEREG && nextdata>0)
	{
		nextdata--;
		regs[regno] = false;
	}
}
void freeregs(AddrMode *ap)
{
	if( ap->mode == am_dreg)
		freedata(ap->base_reg);
	else if (ap->mode == am_relative)		
		freedata(ap->base_reg);
	else if (ap->mode == am_scale) {
		freedata(ap->base_reg);
		freedata(ap->index_reg);
	}
	else return;/* no registers used */
}
void reserve()
{
	int i;
	nextdata++;
	for(i=0;i<2;i++)
		if(regs[i])
		{
			push_reg(i);
			regstack[rsdepth++] = i;
			regs[i] = false;
		}
	regs[i]=true; //will be set false in next freeregs
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -