📄 regmgmt.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 + -