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