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

📄 peep.c

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

/*
This file is about to manage the intruction stream and do peep-hole optimizing

Any optimization haven't be ready yet in this version
*/
List code_queue;

long newlabelno=1; //every label no should be > 0
long breaklabel=UNKNOWN;
long continuelabel=UNKNOWN;
long returnlabel=UNKNOWN;

void flush_queue()
{
	OutCode *one;
	while(one = popfront_List(&code_queue))
		put_outcode(one);
}
AddrMode *AddrMode_cpy(AddrMode *am)
{
	AddrMode *one;
	if(am == NULL)
		return NULL;
	one = dmalloc(sizeof(AddrMode), true);
	memcpy(one, am, sizeof(AddrMode));
	return one;
}
void gen_code(int opc, int size, AddrMode *opd1, AddrMode *opd2)
{
	OutCode *one = dmalloc(sizeof(OutCode), true);
	one->opcode = opc;
	if(opd1)
	{
		one->opd1 = AddrMode_cpy(opd1);
		one->opd1->size = size;
	}
	if(opd2)
	{
		one->opd2 = AddrMode_cpy(opd2);
		one->opd2->size = size;
	}
	push_List(&code_queue, one);
}
void gen_code2(int opc, int size1, AddrMode *opd1, int size2, AddrMode *opd2)
{
	OutCode *one = dmalloc(sizeof(OutCode), true);
	one->opcode = opc;
	if(opd1)
	{
		one->opd1 = AddrMode_cpy(opd1);
		one->opd1->size = size1;
	}
	if(opd2)
	{
		one->opd2 = AddrMode_cpy(opd2);
		one->opd2->size = size2;
	}
	push_List(&code_queue, one);
}
void push_reg(int regno)
{
	OutCode *one = dmalloc(sizeof(OutCode), true);
	one->opcode = op_push;
	one->opd1 = newDreg(regno);
	push_List(&code_queue, one);
}
void pop_reg(int regno)
{
	OutCode *one = dmalloc(sizeof(OutCode), true);
	one->opcode = op_pop;
	one->opd1 = newDreg(regno);
	push_List(&code_queue, one);
}

AddrMode *newLabel(int labelno)
{
	AddrMode *one = dmalloc(sizeof(AddrMode), true);
	one->mode = am_label;
	one->entry = NULL;
	one->offset = labelno;
	one->base_reg = one->index_reg =UNKNOWN;
	one->size =4;
	return one;
}
AddrMode *newImme(char *addr, int data)
{
	AddrMode *one = dmalloc(sizeof(AddrMode), true);
	one->mode = am_imme;
	one->base_reg = one->index_reg =UNKNOWN;
	one->entry = addr;
	one->offset = data;
	one->size =4;
	return one;
}
AddrMode *newDreg(int regno)
{
	AddrMode *one = dmalloc(sizeof(AddrMode), true);
	one->mode = am_dreg;
	one->base_reg = regno;
	one->index_reg =UNKNOWN;
	one->size = 4;
	return one;
}
//AddrMode *newFregAddrMode(int regno);

AddrMode *newDirect(char *entry, long offset)
{
	AddrMode *one = dmalloc(sizeof(AddrMode), true);
	one->mode = am_direct;
	one->entry = entry;
	one->base_reg = one->index_reg =UNKNOWN;
	one->offset = offset;
	one->size = 4;
	return one;
}
AddrMode *newRelative(int base_reg, long offset)
{
	AddrMode *one = dmalloc(sizeof(AddrMode), true);
	one->mode = am_relative;
	one->base_reg = base_reg;
	one->offset = offset;
	one->index_reg =UNKNOWN;
	one->size =4;
	return one;
}
AddrMode *newScale(int base_reg, int index_reg, long offset)
{
	AddrMode *one = dmalloc(sizeof(AddrMode), true);
	one->mode = am_scale;
	one->base_reg = base_reg;
	one->index_reg = index_reg;
	one->scale =1;
	one->offset = offset;
	one->size =4;
	return one;
}

void gen_label(long labelno)
{
	OutCode *one = dmalloc(sizeof(OutCode), true);
	one->opcode = op_label;
	one->opd1 = (AddrMode*)labelno;
	push_List(&code_queue, one);
}



⌨️ 快捷键说明

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