亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? optim.c

?? 非常好的源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*
	A peephole optimizer for lcc
	----------------------------

Section 1:
---------
Overall design.
The optimizer receives its input from the compiler as !n a!cii instruction
stream. When the function 'genasm' sees a label, it will send the contents of
the buffer to the optimizer with a call to the function 'SendToOptimizer'.
The entry point in this file is the function 'ChangeBlock', that performs the
following actions:
	1. Parses the instructions, setting flags for certain characteristics,
	setting register numbers, etc.
	2. Calls the 'Optimize block' function the scan the block for instruction
	to be changed/deleted.

The strategy of this peephole optimizer is to build a machine state, and
try to keep it coherent with the operations performed in a block. It will
try to eliminate redundant loads of registers, replace certains registers
with other free ones, replace certain sequences of instruction lcc generates
with other more efficient ones, etc. It is certainly limited to lcc, since
many of the (implicit) assumptions about the code would preclude its use
as a more general peephole optimizer.

*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <setjmp.h>
#define ANALYZER
#ifdef STANDALONE
#define DEBUGOPTIM
#include <time.h>
int vmask[] = { 1, 0 };
#endif
static int SwappedRegs;
extern int HasSwappedRegs(void);
extern int genlabel(int);
#include <assert.h>
#define MAXIDSIZE 50
/*
The 'Instruction' data structure. This is built now by the parser of
instructions, but it would naturally much more efficient to have the
characteristics of those instructions built in to the tables of the
compiler
*/
typedef struct tagInstruction {
	unsigned long Flags;
	unsigned char Name[12]; /* opcode */
	unsigned char src[MAXIDSIZE];  /* source of the data */
	unsigned char dst[MAXIDSIZE];  /* destination of the data */
	unsigned char *Start;   /* Pointer to the beginning of the instruction */
				/* in the assembler buffer */
	unsigned char *End;	/* pointer to the end of the instruction */
	unsigned short ChangedIdx; /* Index of the replace instruction in the */
				/* instruction table */
	unsigned short SrcReg;  /* Source register number */
	unsigned short DstReg;  /* destination reg number */
}Instruction;
/* instruction Flags field */
#define DELETED			0x1
#define CHANGED			0x2
#define ISCALL			0x4
#define CLOBBERS		0x8
#define ISLOCAL			0x10
#define ISARGUMENT		0x20
#define SRCDEREFERENCE	0x40
#define DSTDEREFERENCE	0x80
#define SRCOFFSET		0x100
#define DSTOFFSET		0x200
#define ISJUMP			0x400
#define ISFLOAT			0x800
#define TRUNCATED		0x1000
#define ISMOVL			0x2000
#define ISMOVSB			0x4000
#define	ISGENERICMOVE	0x8000
#define ISMOVSWL		0x10000
#define ISMOVSBL		0x20000
#define ISLEAL			0x40000
#define ISCOMPARE		0x80000
#define ISREGSRC		0x100000
#define ISREGDST		0x200000
#define ADDED			0x400000
#define STACKADJUST		0x800000

/*
The instruction table contains two parts:
1. The instructions that belong to the block being analyzed now.
2. The changed instructions.

Each changed instruction contains the index of the position of the changed
instruction contents in its ChangedIndex field, set by the function
'GetNextChangedInstruction'
*/
/* Number of instructions in the instruction table */
#define MAXINSTRUCTION 1600
/* Register numbers */
#define EAX		1
#define EBX		2
#define ECX		3
#define	EDX		4
#define ESI		5
#define EDI		6
#define EBP		7
#define	ESP		8
#define	AX		9
#define	BX		10
#define CX		11
#define DX		12
#define SI		13
#define DI		14
#define BP		15
#define SP		16
#define MM0		17
#define MM1		18
#define	MM2		19
#define MM3		20
#define	MM4		21
#define	MM5		22
#define	MM6		23
#define	MM7		24

static unsigned char *RegisterNames[] = {
	"NULL",
	"eax",
	"ebx",
	"ecx",
	"edx",
	"esi",
	"edi",
	"ebp",
	"esp"
	"mm0",
	"mm1",
	"mm2",
	"mm3",
	"mm4",
	"mm5",
	"mm6",
	"mm7"
};
int ediIsSaved=1,esiIsSaved=1;
static Instruction InstructionTable[MAXINSTRUCTION];
static int InstructionIndex = 0;
static int recursion = 0;
static jmp_buf bailout;
static int isByteValue(char *);
typedef struct tagbasicBlock {
	char Label[25];
	int calls;
	int NrOfInstructions;
	char Registers[SP+1];
	int Flags;
	unsigned short FirstCall; /* Index of the first 'call' instruction */
	unsigned short LastCall;  /* Index of the last 'call' instruction */
	unsigned short ChangedCounter;
	unsigned short deleted;
}BasicBlock;
extern int GetLastFunctionLabel(void);
static unsigned char *Nullst = "NULL";
#define MOVL_CODE	1819701101
#define JMP_CODE	7368042
#define JNE_CODE	6647402
#define ADDL_CODE	1818518625
#define PUSH_CODE	1752397168
#define CMPL_CODE	1819307363
#define REP_CODE	7366002
#define XORL_CODE	1819438968
#define XOR_CODE	7499640
#define ADD_CODE	6579297
#define ADDL_CODE	1818518625
#define SUB_CODE	6452595
#define SUBL_CODE	1818391923
#define MOVB_CODE	1651928941
#define MOVW_CODE	2004250477
#define INCL_CODE	1818455657
#define SARL_CODE	1819435379
#define ANDL_CODE	1818521185
#define ORL_CODE	7107183
#define RET_CODE	7628146
#define MOVS_CODE	1937141613
#define SHLL_CODE	1819043955
#define SHRL_CODE	1819437171
#define PUSH_CODE	1752397168
/*
We keep the state of the machine in this character vector.
Each position points towards a character string that
indicates the contents of the register.
*/
static unsigned char *State[25];
static int deleted = 0,redundant = 0;
static int lastLabel = 0;
static int hasRegisterVariables;
/*
The peephole optimizer can be compiled as a standalone module. It
will emit very verbose output...
*/
#ifdef DEBUGOPTIM
static unsigned char *buffer;
#define Printf printf
#define Printf1(a) printf(a)
#define Printf2(a,b) printf(a,b)
#define Printf3(a,b,c) printf(a,b,c)
extern int hasAllocA;
#else
#define Printf1(a)
#define Printf2(a,b)
#define Printf3(a,b,c)
extern int hasAllocA;
#endif
extern unsigned char *FindStringConstant(unsigned char *name);
extern int RegisterVariablesMask;
extern int ispow2(int);
#ifdef STANDALONE
int hasAllocA = 0;
main(int argc,char *argv[])
{
	FILE *f;
	int l,nl;
	unsigned char *newb;

	f = fopen(argv[1],"r");
	if (f == NULL) {
		fprintf(stderr,"Impossible to open %s\n",argv[1]);
		return(1);
	}
	fseek(f,0,SEEK_END);
	l = ftell(f);
	fseek(f,0,SEEK_SET);
	buffer = malloc(l+10);
	memset(buffer,0,l+10);
	l = fread(buffer,1,l,f);
	fclose(f);
	Printf("Optimizing %s\n",argv[1]);
	nl = ScanAsm(buffer,l,&newb);
	Printf("%d instructions deleted,redundant %d\n",deleted,redundant);
	f = fopen("output.out","w");
	fwrite(newb,1,nl,f);
	fclose(f);
}
static int genlabel(int n)
{
	static int label = 99999;

	label += n;
	return label - n;
}

#endif

/*
This routine searches the InstructionTable for an index where
it will put the next changed instruction. Those instructions
start at the end of the basic block.
*/
static Instruction *GetNextChangedInstruction(Instruction *Ins,BasicBlock *bb)
{
	Instruction *insDst;

	if (bb->ChangedCounter  >= MAXINSTRUCTION) {
		warning("Function too big for the optimizer\n");
		longjmp(bailout,1);
	}
	Ins->Flags |= CHANGED;
	Ins->ChangedIdx = bb->ChangedCounter;
	insDst = &InstructionTable[bb->ChangedCounter];
	bb->ChangedCounter++;
	memset(insDst,0,sizeof(Instruction));
	return(insDst);
}
static Instruction *ChangeInstruction(Instruction *ins,BasicBlock *bb,unsigned char *name,unsigned char *src,unsigned char *dst)
{
	Instruction *result;

	result = GetNextChangedInstruction(ins,bb);
	strcpy(result->Name,name);
	strcpy(result->src,src);
	strcpy(result->dst,dst);
	return(result);
}

#ifdef STANDALONE
/*
This routine searches the start of the basic block. It looks
for a label, that should start with the '_$' prefix. Change
this if the prefix is different.
*/
static unsigned char *FindBeginBlock(unsigned char *bp,BasicBlock *bb)
{
	if (*bp == '_' && bp[1] == '$') {
		unsigned char *p;
		p = bp+2;
		while (*p && *p != '\n' && *p != ':') p++;
		if (*p == ':') goto retgood;
		if (*p == 0) return(NULL);
	}
	while (*bp) {
		if (bp[0] == '\n' && bp[1] == '_') {
			bp++;
			if (bp[1] == '$') {
				int i;
retgood:
				i = 0;
				while (*bp && *bp != '\n') bb->Label[i++] = *bp++;
				if (*bp == '\n') bp++;
				return(bp);
			}
			else {
				unsigned char *p = bp;

				while (*p && *p != '\n') {
					if (*p == ':') {
						goto retgood;
					}
					else if (*p == ',') {
						bp = p;
						break;
					}
					p++;
				}
			}
		}
		else if (*bp == '.' && bp[1] == 'd' && bp[2] == 'a' && bp[3] == 't') {
scanfortext:
			bp++;
			for (;;) {
				while (*bp && *bp != '.')
					bp++;
				if (*bp == '.' && !strncmp(bp,".text",5))
					break;
				else if (*bp == 0) break;
				else if (*bp == '.') bp++;
			}
			if (bp == NULL) return(NULL);
			if (*bp == 0) return(NULL);
		}
		else if (*bp == '.' && bp[1] == 'b' && bp[2] == 's' && bp[3] == 's')
			goto scanfortext;
		else bp++;
	}
	return(NULL);
}
#endif
/* Converts a register name into a register number */
static int GetRegNumber(unsigned char *name)
{
	register unsigned char *n = name;
	if (*n == 'e') {
		n++;
		switch (*n++) {
			case 'a': return(EAX);
			case 'b': return (*n == 'x')? EBX : EBP;
			case 'c': return(ECX);
			case 'd': return( *n == 'x')? EDX : EDI;
			case 's': return (*n == 'i') ? ESI : ESP;
		}
		fprintf(stderr,"bad register name %c%c%c\n",name[0],name[1],name[2]);
		exit(1);
	}
	else if (*n == 'm' && n[1] == 'm') {
		return MM0 + n[2] - '0';
	}
	else {
		char tmp[3];
		tmp[0] = 'e';
		tmp[1] = *n++;
		tmp[2] = (*n == 'l') ? 'x' : *n;
		return(ESP+GetRegNumber(tmp));
	}
	return(0);
}

/*
Parser for one instruction. It separates the instruction into
opcode (Name field), source and destination.
*/
static unsigned char *AddNextInstruction(unsigned char *bp,BasicBlock *bb,unsigned char **pp)
{
	unsigned char *p,*start,*op;
	int i,regcount,firstCodeChar;
	Instruction *ins;

	start = p = bp;
	if (*p == '_' && p[1] == '$') {
		*pp = bp;
		return(NULL);
	}
	if (*bp == 1) {
		while (*bp == 1) bp++;
	}
	if (*bp == '\t') bp++;
	if (*bp == ';')
		goto skipline;
	if (*bp == '.') {
		if (!strncmp(bp,".data",5) || !strncmp(bp,".bss",4)) {
			bp = strstr(bp,".text");
			*pp = bp;
			return(bp);
		}
skipline:
		while (*bp && *bp != '\n') bp++;
		if (*bp == '\n') bp++;
		*pp = bp;
		if (*bp == 0) return(NULL);
		return(bp);
	}
	if (InstructionIndex < MAXINSTRUCTION-50) {
		ins = &InstructionTable[InstructionIndex];
		InstructionIndex++;
		memset(ins,0,sizeof(Instruction));
	}
	else {
		warning("Function too big for the optimizer\n");
		longjmp(bailout,1);
	}
	i = 0;
	firstCodeChar = *bp;
	if (firstCodeChar == 'j')
		ins->Flags |= ISJUMP;
	else if (firstCodeChar == 'f')
		ins->Flags |= ISFLOAT;
	op = ins->Name;
	while (*bp >= 'a' && *bp <= 'z') {
			op[i++] = *bp++;
	}
	if (i > 8) {
		op[i] = 0;
		fprintf(stderr,"overflow in instruction name %s ",ins->Name);
		while (*bp && *bp != '\n') fprintf(stderr,"%c",*bp++);
		fprintf(stderr,"\n");
		exit(1);
	}
	ins->Start = start;
	bb->NrOfInstructions++;
	op[i] = 0;
	if (i > 3 && firstCodeChar == 'm' && op[1] == 'o' &&
		op[2] == 'v') {
		if (op[3] == 'l') ins->Flags |= ISMOVL;
		else if (op[3] == 's' && op[4] == 'b' && op[5] == 0) {
			ins->Flags |= ISMOVSB;
		}
		else if (op[3] == 's' && (op[4] == 'w' || op[4] == 'b')
			&& op[5] == 'l') {
			if (op[4] == 'w') ins->Flags |= ISMOVSWL;
			else ins->Flags |= ISMOVSBL;
		}
		ins->Flags |= ISGENERICMOVE;
	}
	else if (*(unsigned long *)op == RET_CODE) {
		while (*bp && *bp != '\n') bp++;
		if (*bp == '\n') bp++;
		*pp = bp;
		ins->End = bp;
		return(NULL);
	}
	if (i == 4 && firstCodeChar == 'l' && op[1] == 'e' &&
		op[3] == 'l')
		ins->Flags |= ISLEAL;
	if (i == 4 && *(unsigned long *)op == CMPL_CODE) {
		ins->Flags |= ISCOMPARE;
	}
	while (*bp == ' ' || *bp == '\t') bp++;
	if (*bp == '\n') {
		bp++;
		ins->End = bp;
		*pp = bp;
		return(bp);
	}
	i = regcount = 0;
	if (*bp == '%') ins->Flags |= ISREGSRC;
	while (*bp && *bp != ',') {
		int c = *bp;
		if (c == '\n') break;
		if (i < MAXIDSIZE)
			ins->src[i++] = c;
		else ins->Flags |= TRUNCATED;
		bp++;
		if (c == '(') {
			ins->Flags |= SRCOFFSET;
			while (*bp && *bp != ')') {
				c = *bp++;
				if (i < 40)
					ins->src[i++] = c;
				if (c == ',') {
					ins->Flags |= SRCDEREFERENCE;
				}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产拍欧美日韩视频二区| 国产精品丝袜黑色高跟| 国产精品1区2区3区在线观看| 国产亚洲一区二区三区| 欧美日韩一区二区三区四区 | 国产精品入口麻豆九色| 欧美日韩高清一区二区三区| 国产suv精品一区二区三区| 日韩av一级电影| 久久草av在线| 亚洲va欧美va人人爽| 日本一区二区不卡视频| 日韩欧美在线综合网| 欧美怡红院视频| 91小视频免费观看| 国产91丝袜在线播放九色| 奇米四色…亚洲| 亚洲国产精品欧美一二99| 国产精品国产三级国产a| 2024国产精品视频| 69av一区二区三区| 欧美日韩一区三区| 91福利国产精品| 91在线你懂得| 成人高清免费在线播放| 久久国产免费看| 婷婷国产v国产偷v亚洲高清| 亚洲人成亚洲人成在线观看图片| 国产网红主播福利一区二区| 精品蜜桃在线看| 日韩写真欧美这视频| 欧美日韩另类一区| 欧美性色黄大片| 日本高清无吗v一区| 92精品国产成人观看免费 | 免费xxxx性欧美18vr| 五月婷婷综合激情| 一卡二卡三卡日韩欧美| 亚洲人精品午夜| 最新欧美精品一区二区三区| 国产精品久线观看视频| 国产精品毛片久久久久久久| 日本一区二区三区免费乱视频| 久久精品无码一区二区三区| 久久亚洲私人国产精品va媚药| 91精品国产乱码久久蜜臀| 91精品国产综合久久久蜜臀粉嫩 | 国产日韩欧美不卡在线| 国产欧美日韩三级| 欧美国产一区在线| 国产精品人人做人人爽人人添| 欧美高清在线一区| 中文字幕一区二区三区四区 | 亚洲精品中文字幕在线观看| 一区二区在线观看视频 | 床上的激情91.| 风间由美性色一区二区三区| 成人自拍视频在线观看| 99国产精品国产精品久久| 91精品福利视频| 欧美日韩成人综合| 欧美大片在线观看一区二区| 精品国产一区二区三区不卡| 国产欧美一区二区三区网站| 亚洲欧洲日韩av| 亚洲一区二区三区四区在线观看 | 欧美高清hd18日本| 日韩欧美一区二区在线视频| 久久一日本道色综合| 国产精品嫩草99a| 一区二区三区在线免费视频| 日韩影视精彩在线| 国产美女在线精品| 99久久久免费精品国产一区二区 | 欧美一区二区精品| 国产视频911| 亚洲男人的天堂av| 久久成人免费网| jizz一区二区| 欧美肥妇bbw| 国产欧美在线观看一区| 一区二区三区在线观看网站| 日本vs亚洲vs韩国一区三区二区| 国产一区二区免费视频| 99精品视频一区二区| 制服丝袜中文字幕亚洲| 久久九九久精品国产免费直播| 亚洲精品欧美二区三区中文字幕| 日韩精品视频网站| 成人精品国产福利| 91精品欧美一区二区三区综合在| 久久精品夜色噜噜亚洲a∨| 亚洲一区二区三区激情| 国产盗摄女厕一区二区三区| 在线国产电影不卡| 久久久久久免费毛片精品| 亚洲一区二区在线免费观看视频| 久久机这里只有精品| 日韩电影在线一区二区| 91影院在线免费观看| 日韩精品中文字幕一区二区三区| 韩国欧美一区二区| 色嗨嗨av一区二区三区| 精品卡一卡二卡三卡四在线| 一区二区三区欧美在线观看| 美女在线一区二区| 一本一本久久a久久精品综合麻豆| 欧美一区二区三区免费观看视频| 国产精品久久久久一区二区三区| 麻豆91精品视频| 欧美精品久久久久久久多人混战| 国产精品538一区二区在线| 欧美日韩国产美| 亚洲色欲色欲www| 国产91丝袜在线观看| 日韩欧美激情四射| 日韩精品午夜视频| 欧美色综合网站| 亚洲色大成网站www久久九九| 国产在线视视频有精品| 欧美日韩国产综合视频在线观看| 亚洲同性同志一二三专区| 国产精品一区三区| 欧美va亚洲va| 美日韩一区二区三区| 91精品国产综合久久久久| 亚洲一线二线三线视频| 一本大道久久a久久综合婷婷| 欧美激情一区二区| 国产麻豆欧美日韩一区| 精品国一区二区三区| 日韩成人一级大片| 欧美日韩国产高清一区| 亚欧色一区w666天堂| 色婷婷综合视频在线观看| 亚洲欧美激情插| 91麻豆6部合集magnet| 国产精品国产精品国产专区不片| 国产成人免费视频| 欧美激情一区在线观看| 欧美高清视频一二三区 | 国产精品成人午夜| 波多野结衣在线一区| 中文字幕欧美三区| 成人av一区二区三区| 日韩美女视频19| 色综合中文字幕| 亚洲精品国产成人久久av盗摄 | 国产不卡视频在线播放| 国产日韩欧美电影| 99久久免费精品高清特色大片| 最新久久zyz资源站| 欧美在线高清视频| 亚洲福中文字幕伊人影院| 91麻豆精品91久久久久久清纯| 日日嗨av一区二区三区四区| 日韩欧美一二区| 亚洲五码中文字幕| 亚洲欧洲成人精品av97| 久久久国产精华| 精彩视频一区二区三区| 亚洲中国最大av网站| 国产日本亚洲高清| 久久久久久久久免费| 欧美日韩中文字幕一区二区| 国产福利视频一区二区三区| 青青草原综合久久大伊人精品 | 亚洲精品一卡二卡| 青青草91视频| 久久久噜噜噜久噜久久综合| 欧美电影影音先锋| 久88久久88久久久| 国产精品久久一级| 欧美日韩dvd在线观看| 久久国产视频网| 中文字幕亚洲一区二区av在线| 欧美性videosxxxxx| 久久国产精品免费| 亚洲欧洲日产国码二区| 欧美一激情一区二区三区| 国产成人无遮挡在线视频| 亚洲理论在线观看| 精品日韩在线一区| 91免费国产在线| 久久99蜜桃精品| 一区二区国产视频| 久久久久国产精品麻豆| 欧洲一区二区av| 精品一二三四在线| 一区二区三区在线看| 久久婷婷成人综合色| 欧美视频一区二区三区四区| 国产一区二区三区四区五区美女| 亚洲男人电影天堂| 精品国产成人系列| 欧美日韩国产美女| 91麻豆国产自产在线观看| 久久精品99国产精品日本| 一区二区在线电影| 中文字幕欧美激情一区|