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

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

?? optim.c

?? 非常好的源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
				else if (c == '%') {
					int r;

					r = GetRegNumber(bp);
					if (regcount == 0) ins->SrcReg = r;
					else ins->SrcReg |= (r << 8);
					regcount++;
				}
			}
			if (*bp == ')') ins->src[i++] = *bp++;
		}
		else if (c == '%') {
			int r;

			r = GetRegNumber(bp);
			if (regcount == 0) ins->SrcReg = r;
			else ins->SrcReg |= (r << 8);
			regcount++;
		}
		else if (c == '_') {
			while (*bp && ((*bp >= 'a' && *bp <= 'z') || (*bp >= 'A' && *bp <= 'Z'))) {
				if (*bp == ',') break;
				if (i < MAXIDSIZE) {
					ins->src[i++] = *bp++;
				}
				else {
					ins->Flags |= TRUNCATED;
					bp++;
				}
			}
		}
	}
	if (*bp == ',' || (*bp == ' ' || *bp == '\t')) bp++;
	else if (*bp == '\n'){
		if (firstCodeChar == 'c' && op[1] == 'a') {
			ins->Flags |= ISCALL;
			bb->Flags |= ISCALL;
			if (bb->FirstCall == 0)
				bb->FirstCall = (unsigned char)(InstructionIndex-1);
			bb->LastCall = (unsigned char)(InstructionIndex-1);
		}
		bp++;
		ins->End = bp;
		return(bp);
	}
	while (*bp == ' ' || *bp == '\t') bp++;
	if (*bp == '%') ins->Flags |= ISREGDST;
	i = regcount = 0;
	while (*bp && *bp != ' ' && *bp != '\n') {
		int c = *bp++;
		if (i < MAXIDSIZE)
			ins->dst[i++] = (unsigned char)c;
		else
			ins->Flags |= TRUNCATED;
		if (c == '(') {
			ins->Flags |= DSTOFFSET;
			while (*bp && *bp != ')') {
				c = *bp++;
				if (i < MAXIDSIZE)
					ins->dst[i++] = (unsigned char)c;
				else ins->Flags |= TRUNCATED;
				if (c == ',') {
					ins->Flags |= DSTDEREFERENCE;
				}
				else if (c == '%') {
					int r;

					r = GetRegNumber(bp);
					if (regcount == 0) ins->DstReg = (unsigned char)r;
					else ins->DstReg |= (r << 8);
					regcount++;
				}
			}
			if (*bp == ')' && i < MAXIDSIZE) ins->dst[i++] = *bp++;
			else if (i >= MAXIDSIZE) ins->Flags |= TRUNCATED;
		}
		else if (c == '%') {
			int r;

			r = GetRegNumber(bp);
			if (regcount == 0) ins->DstReg = r;
			else ins->DstReg |= (r << 8);
			regcount++;
		}
		else if (c == '_') {
			while (*bp && ((*bp >= 'a' && *bp <= 'z') || (*bp >= 'A' && *bp <= 'Z'))) {
				if (*bp == ',') break;
				if (i < MAXIDSIZE) {
					ins->dst[i++] = *bp++;
				}
				else {
					ins->Flags |= TRUNCATED;
					bp++;
				}
			}
		}
	}
	while (*bp && *bp != '\n') bp++;
	if (*bp == 0) {
		ins->End = bp;
		*pp = NULL;
		return(NULL);
	}
	if (*bp == '\n') bp++;
	ins->End = bp;
	return(bp);
}

/* Adds instructions to the basic block until it finds a label
*/
static unsigned char *FindEndBlock(unsigned char *bp,BasicBlock *bb,unsigned char *stop)
{
	unsigned char *r=bp,*result;
	bb->NrOfInstructions = 0;
	while ((r=AddNextInstruction(r,bb,&result))!=NULL) {
		if (InstructionIndex > 0
			&& InstructionTable[InstructionIndex-1].Flags & TRUNCATED) {
			result = NULL;
			bb->NrOfInstructions = 0;
			fprintf(stderr,"Maximum identifier length exceeded.\n");
			fprintf(stderr,"Quitting optimization\n");
			return NULL;
		}
		if (r && r >= stop) break;
	}
	return(result);
}
#ifdef STANDALONE
static unsigned char *FindBasicBlock(unsigned char *bp,BasicBlock *block,unsigned char *stop)
{
	unsigned char *bb,*be;


	bb = FindBeginBlock(bp,block);
	if (bb == NULL) return(NULL);
	be = FindEndBlock(bb,block,stop);
	return(be);
}
#endif
/* Invalidates the contents of the given register ('which') if
   they are equal to the given character string.
*/
static void doclobber(unsigned char *p,int which)
{
	if (p == Nullst) return;
	if (p == NULL) return;
	if (which != EAX && State[EAX] && !strcmp(State[EAX],p)) {
		Printf1("eax = NULL\n");
		State[EAX] = Nullst;
	}
	if (which != EBX && State[EBX] && !strcmp(State[EBX],p)) {
		Printf1("ebx = NULL\n");
		State[EBX] = Nullst;
	}
	if (which != ECX && State[ECX] && !strcmp(State[ECX],p)) {
		Printf1("ecx = NULL\n");
		State[ECX] = Nullst;
	}
	if (which != EDX && State[EDX] && !strcmp(State[EDX],p)) {
		Printf1("edx = NULL\n");
		State[EDX] = Nullst;
	}
	if (which != ESI && State[ESI] && !strcmp(State[ESI],p)) {
		Printf1("esi = NULL\n");
		State[ESI] = Nullst;
	}
	if (which != EDI && State[EDI] && !strcmp(State[EDI],p)) {
		Printf1("edi = NULL\n");
		State[EDI] = Nullst;
	}
}

/* Replaces in the given buffer (str) the register named
   'src' with the register named 'dst' and writes the
   modified output into the 'out' buffer
*/
static int doreplace(unsigned char *str,unsigned char *src,unsigned char *dst,unsigned char *out)
{
	unsigned char *p = str;
	unsigned char *d = out;
	int result = 0;

	while (*p) {
		if (*p == '%') {
			*d++ = *p++;
			if (p[0] == src[0] && p[1] == src[1] && p[2] == src[2]) {
				*d++ = dst[0];
				*d++ = dst[1];
				*d++ = dst[2];
				p += 3;
				result++;
			}
			else if (p[0] != 'e') {
				if (p[0] == src[1] && p[1] == src[2]) {
					*d++ = dst[1];
					*d++ = dst[2];
					p += 2;
					result++;
				}
				else if (p[0] == src[1] && p[1] == 'l' && src[2] == 'x') {
					*d++ = dst[1];
					*d++ = 'l';
					p += 2;
				}
			}
		}
		else *d++ = *p++;
	}
	*d = 0;
	return(result);
}

static int fixRegNr(int SrcReg,int reg,int oldreg)
{
	int r1,r2;

	if (SrcReg < ESP) return reg;
	else if (SrcReg < SP) {
		return reg + ESP;
	}
	else if (SrcReg & 0xFF00) {
		r1 = SrcReg & 0xFF;
		r2 = SrcReg >> 8;
		if (oldreg == r1) {
			return (reg | (r2 << 8));
		}
		else if (oldreg == r2) {
			return ((reg << 8) | r1);
		}
		else
			printf("internal compiler error 123 in optimizer\n");
	}
	return 0;
}

static int ReplaceRegister(unsigned char *regsrc,unsigned char *regdst,BasicBlock *bb,int first,int last,int reg)
{
	Instruction *ins,*insDst;
	unsigned char *src,*dst;
	int dochanged,oldreg;

	ins = &InstructionTable[first];
	if (ins->Flags & CHANGED) {
		insDst = &InstructionTable[ins->ChangedIdx];
		dst = insDst->dst;
		src = insDst->src;
	}
	else {
		dst = ins->dst;
		src = ins->src;
	}
	ins->Flags |= CHANGED;
	ins->ChangedIdx = bb->ChangedCounter;
	insDst = &InstructionTable[bb->ChangedCounter];
	bb->ChangedCounter++;
	oldreg = GetRegNumber(regsrc);
	memset(insDst,0,sizeof(Instruction));
	if (!doreplace(dst,regsrc,regdst,insDst->dst)) {
		bb->ChangedCounter--;
		return(0);
	}
	ins->DstReg = reg;
	strcpy(insDst->src,src);
	strcpy(insDst->Name,ins->Name);
	first++;
	ins++;
	while (first <= last) {
		dochanged = 0;
		if (ins->Flags & CHANGED) {
			insDst = &InstructionTable[ins->ChangedIdx];
			src = insDst->src;
			dst = insDst->dst;
		}
		else {
			src = ins->src;
			dst = ins->dst;
		}
		insDst = GetNextChangedInstruction(ins,bb);
		strcpy(insDst->Name,ins->Name);
		if (doreplace(src,regsrc,regdst,insDst->src)) {
			ins->SrcReg = fixRegNr(ins->SrcReg,reg,oldreg);
			dochanged++;
		}
		if (first != last) {
			if (doreplace(dst,regsrc,regdst,insDst->dst)) {
				ins->DstReg = fixRegNr(ins->DstReg,reg,oldreg);
				dochanged++;
			}
		}
		else strcpy(insDst->dst,dst);
		if (dochanged) {
			ins->Flags |= CHANGED;
		}
		else {
			bb->ChangedCounter--;
			ins->Flags &= ~ CHANGED;
		}
		first++;
		ins++;
	}
	bb->Registers[reg] = 1;
	return(1);
}

int testSafeReplacement(unsigned char *s)
{
	if (*s++ != '(') return 0;
	if (*s++ != '%') return 0;
	if (*s++ != 'e') return 0;
	s += 2;
	if (*s++ != ',') return 0;
	if (*s++ != '%') return 0;
	if (*s++ != 'e') return 0;
	s += 2;
	if (*s != ')') return 0;
	return 1;
}

static int AvoidClobber(unsigned char *reg,int idxInstruction,BasicBlock *bb)
{
	int i,n,lastidx;
	Instruction *ins;

	if (SwappedRegs)
		return 0;
	if (State[ECX] != NULL && State[ECX] != Nullst) {
		if (State[EDX] != NULL && State[EDX] != Nullst) {
			return(0);
		}
	}
	i = idxInstruction+1;
	n = bb->NrOfInstructions;
	if (i >= n) return(0);
	ins = &InstructionTable[i];
	lastidx = -1;
	/* Find the first instruction that stores into that register */
	while (i < n) {
		if (ins->Flags & (CHANGED|ISCALL|TRUNCATED)) return(0);
		if (ins->SrcReg > EBP || ins->DstReg > EBP) {
			if (ins->SrcReg > EBP) {
				if (!testSafeReplacement(ins->src)) return 0;
			}
			if (ins->DstReg > EBP) {
				if (!testSafeReplacement(ins->dst)) return 0;
			}
		}
		if (ins->Name[0] == 'f') return(0);
		if (ins->Name[0] == 'i') {
			if (!strncmp(ins->Name,"idiv",4)) return(0);
			if (!strncmp(ins->Name,"imul",4)) return(0);
		}
		else if (!strncmp(ins->Name,"div",3)) return(0);
		else if (!strncmp(ins->Name,"mul",3)) return(0);
		if (ins->DstReg == ECX || ins->DstReg == EDX) return(0);
		if (ins->SrcReg == EDX || ins->DstReg == ECX) return(0);
		if (ins->dst[0] == '%') { /* if is a register store operation */
			if (ins->Flags & ISGENERICMOVE)
			if (ins->dst[1] == *reg && ins->dst[2] == reg[1] && ins->dst[3] == reg[2]) {
				if (ins->SrcReg > EBP) return(0);
				if (ins->dst[1] == ins->src[1] && ins->dst[2] == ins->src[2] &&
					ins->dst[3] == ins->src[3] && ins->src[0] == ins->dst[0]) {
					goto goon;
				}
				lastidx = i;
				break;
			}
		}
goon:
		i++;
		ins++;
	}
	if (lastidx < 0) return(0);
	if (State[ECX] == NULL || State[ECX] == Nullst) {
		int r = ReplaceRegister(reg,"ecx",bb,idxInstruction,lastidx,ECX);
		return (r)? ECX : 0;
	}
	if (State[EDX] == NULL || State[EDX] == Nullst) {
		int r = ReplaceRegister(reg,"edx",bb,idxInstruction,lastidx,EDX);
		return (r)? EDX : 0;
	}
	return(0);
}

static int TranslateWordRegister(int DstReg)
{
	if (DstReg >= AX && DstReg <= DI) {
		switch(DstReg) {
		case AX:
			return EAX;
		case BX:
			return EBX;
		case CX:
			return ECX;
		case DX:
			return EDX;
		case SI:
			return ESI;
		case DI:
			return EDI;
		}
	}
	return DstReg;
}

int IsRegisterVariable(int regNum)
{
	if (hasRegisterVariables) {
		if (regNum == ESI && (hasRegisterVariables & (1 << 6))) return 1;
		if (regNum == EBX && (hasRegisterVariables & (1 << 3))) return 1;
		if (regNum == EDI && (hasRegisterVariables & (1 << 7))) return 1;
	}
	if (SwappedRegs) {
		if (regNum == ECX || regNum == EDX)
			return 1;
	}
	return 0;
}


static int IsAliveValue(BasicBlock *bb,int idx,int regNum)
{
	int i = idx,flags,SrcReg,DstReg;
	Instruction *ins = &InstructionTable[idx];

	regNum = TranslateWordRegister(regNum);
	if (IsRegisterVariable(regNum))
		return 1;
	while (i < bb->NrOfInstructions) {
		SrcReg = TranslateWordRegister(ins->SrcReg);
		DstReg = TranslateWordRegister(ins->DstReg);
		if (SrcReg > ESP || DstReg >ESP) return 1;
		if (SrcReg == regNum) {
			if (ins->Name[0] == 'p' && ins->Name[1] == 'o' &&
				ins->Name[2] == 'p' && ins->src[0] == '%')
				return 0;
			return(1);
		}
		flags = ins->Flags;
		if ((flags & ISGENERICMOVE) == 0) {
			if (DstReg == regNum) {
				if (flags & ISLEAL) return(0);
				return(1);
			}
			if (regNum == EAX || regNum == ECX) {
				if (ins->Name[0] == 'i') {
					if (!strncmp(ins->Name,"idiv",4)) return(1);
					if (!strncmp(ins->Name,"imul",4)) return(1);
				}
				else if (!strncmp(ins->Name,"div",3)) return(1);
				else if (!strncmp(ins->Name,"mul",3)) return(1);
			}
			if (flags & ISCALL) {
				if (regNum == EAX || regNum == ECX || regNum == EDX)
					return(0);
			}
			if (*(unsigned long *)(ins->Name) == REP_CODE) {
				if (regNum == ECX || regNum == ESI || regNum == EDI)
					return(1);
			}
		}
		else  {
			if (ins->dst[0] == '%' && DstReg == regNum)
				return(0);
			else if (DstReg == regNum) return(1);
		}
		ins++;
		i++;
	}
	return(0);
}


static int isUsedInBlock(int idxInstruction,unsigned char *old,BasicBlock *bb,int aReg)
{
	int c = *old;
	Instruction *ins;
	int result = 0;

	ins = &InstructionTable[idxInstruction];
	while (idxInstruction < bb->NrOfInstructions) {
		if (c == ins->src[0] && !strcmp(ins->src,old)) {
			result++;
		}
		if (c == ins->dst[0] && !strcmp(ins->dst,old)) {
			if (*(unsigned long *)(ins->Name) != CMPL_CODE)
				return(result);
			else result++;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧洲综合另类| 欧美精品乱码久久久久久按摩| 欧美不卡123| 中文字幕五月欧美| 成人小视频免费观看| 久久久久久亚洲综合| 亚洲激情男女视频| 欧美福利视频导航| 日日噜噜夜夜狠狠视频欧美人| 欧美网站一区二区| 日韩1区2区3区| 精品少妇一区二区三区免费观看| 人人超碰91尤物精品国产| 精品粉嫩超白一线天av| 青草国产精品久久久久久| 在线91免费看| 亚洲国产一二三| 日韩一级片在线观看| 精品综合久久久久久8888| 欧美岛国在线观看| 国产大陆a不卡| 26uuu国产日韩综合| 成人av先锋影音| 亚洲免费视频中文字幕| 欧美午夜精品一区二区三区| 亚洲成年人影院| 日韩精品在线网站| 色综合久久综合网| 午夜伦欧美伦电影理论片| 日韩一卡二卡三卡国产欧美| 久久精品国产亚洲a| 久久精品视频在线看| 波多野结衣欧美| 悠悠色在线精品| 欧美电视剧免费全集观看| 国产高清久久久久| 亚洲精品久久嫩草网站秘色| 97超碰欧美中文字幕| 亚洲国产精品久久久久婷婷884| 制服丝袜av成人在线看| 国产黄色精品网站| 五月天亚洲婷婷| 日韩色视频在线观看| 盗摄精品av一区二区三区| 亚洲午夜精品一区二区三区他趣| 欧美电影一区二区| 久久se这里有精品| 国产免费成人在线视频| 91黄视频在线| 国产精品1024久久| 性久久久久久久久久久久| 国产视频一区二区在线| 欧美日韩黄色一区二区| 国产一区二区三区四| 亚洲一区二区3| 日韩免费高清视频| 色老综合老女人久久久| 国产美女av一区二区三区| 日韩美女视频19| 日韩欧美一区二区久久婷婷| 91免费在线视频观看| 国内一区二区视频| 亚洲国产精品一区二区久久 | 香蕉久久夜色精品国产使用方法 | 久久免费看少妇高潮| 色中色一区二区| 狠狠色丁香久久婷婷综| 亚洲成人午夜电影| 国产精品成人午夜| 欧美欧美午夜aⅴ在线观看| 99综合影院在线| 夜夜嗨av一区二区三区四季av| 久久女同性恋中文字幕| 91精品国产欧美一区二区| 91麻豆福利精品推荐| 激情亚洲综合在线| 奇米亚洲午夜久久精品| 成人免费高清在线观看| 欧美激情综合五月色丁香| 91精品国产综合久久久蜜臀图片| 色悠悠亚洲一区二区| 成人一区二区三区在线观看| 亚洲电影一区二区三区| 亚洲小说春色综合另类电影| 99久久夜色精品国产网站| 国产情人综合久久777777| 国内精品伊人久久久久av影院| 国产精品久久久久久久久晋中| 国产原创一区二区三区| 成人av资源在线观看| 韩国精品一区二区| 国产精品一区二区在线观看不卡| 亚洲欧美成aⅴ人在线观看| 亚洲欧洲av另类| 日韩电影一区二区三区| 美腿丝袜亚洲三区| 欧美在线影院一区二区| 久久色成人在线| 日韩精品亚洲专区| 欧美一区二区三区免费| 亚洲少妇中出一区| 丁香天五香天堂综合| 日韩欧美一级片| 另类成人小视频在线| 欧美亚洲高清一区二区三区不卡| 国产色婷婷亚洲99精品小说| 国产精品一区二区三区乱码| 午夜婷婷国产麻豆精品| 国产中文字幕精品| 欧美一激情一区二区三区| 青青草国产精品亚洲专区无| 欧洲av在线精品| 亚瑟在线精品视频| 日韩免费性生活视频播放| 国产伦精品一区二区三区免费| 久久蜜桃av一区二区天堂| 国产成人在线看| 亚洲电影一级黄| 日韩欧美久久久| 极品少妇xxxx偷拍精品少妇| 久久女同互慰一区二区三区| 蜜臀va亚洲va欧美va天堂| 精品久久久久久无| 色综合视频一区二区三区高清| 亚洲影视在线播放| 国产精品久久久久三级| 欧美系列一区二区| 天天影视网天天综合色在线播放| 欧美激情综合五月色丁香小说| 日韩免费一区二区| 宅男噜噜噜66一区二区66| 国产高清精品在线| 欧美日韩视频在线一区二区| 欧美色成人综合| 国产性做久久久久久| 欧美片网站yy| 国产精品一区二区果冻传媒| 久久99精品久久久| 国产麻豆日韩欧美久久| 91啪亚洲精品| 国产伦精品一区二区三区免费迷 | 精品国产网站在线观看| 日日夜夜精品视频免费| 国产亚洲精品aa| 亚洲丝袜制服诱惑| 精品视频在线免费| 成人黄色软件下载| 肉肉av福利一精品导航| 日韩片之四级片| 日本韩国欧美三级| 久草精品在线观看| 中文字幕一区二区在线播放| 日本高清不卡aⅴ免费网站| 日韩av电影免费观看高清完整版在线观看| 日韩三级在线免费观看| 91丨九色丨黑人外教| 国产一区二区精品在线观看| 亚洲一区二区精品视频| 国产精品久久久久久久午夜片| 2023国产一二三区日本精品2022| 欧美中文字幕一二三区视频| 国产乱码精品一区二区三区av | 国产主播一区二区| 美腿丝袜在线亚洲一区| 久久成人18免费观看| 一区二区三区精品久久久| 国产精品国模大尺度视频| 欧美国产日韩一二三区| 国产精品乱人伦一区二区| 欧美三级中文字幕| 欧美大片在线观看| 久久你懂得1024| 国产欧美日韩综合| 亚洲欧洲av在线| 亚洲成精国产精品女| 午夜精品久久久久久久蜜桃app| 亚洲成av人片在线| 高清不卡在线观看av| 在线观看亚洲成人| 91行情网站电视在线观看高清版| 欧美日韩精品福利| 精品sm捆绑视频| 69久久99精品久久久久婷婷| www日韩大片| 毛片基地黄久久久久久天堂| 成人午夜免费av| 欧美一区二区大片| 一区二区免费视频| 成人福利在线看| 欧美va在线播放| 亚洲v中文字幕| 色综合久久88色综合天天免费| 欧美在线看片a免费观看| 中文成人av在线| 免费久久99精品国产| 欧美日本乱大交xxxxx| 国产欧美中文在线| 国产精品一区二区久久不卡| 精品国产一区二区三区久久影院| 亚洲va在线va天堂|