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

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

?? optim.c

?? 非常好的源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
		}
		if (ins->Flags & (ISCALL|CHANGED)) return(0);
		if (ins->DstReg == ECX || ins->DstReg == EDX)
			return(0);
		if (ins->SrcReg == ECX || ins->SrcReg == EDX)
			return(0);
		if (ins->Name[2] == 'q' && ins->Name[1] == 'd')
			return(0);
		if (ins->Name[0] == 'r' && ins->Name[1] == 'e' && ins->Name[2] == 'p')
			return(0);
		if (ins->Name[0] == 's' && ins->Name[1] == 'h' && ins->Name[3] == 'l')
			return(0);
		if (ins->src[0] == '%' && ins->src[1] == 'c')
			return(0);
		if (ins->dst[0] == '%' && (ins->Flags & ISGENERICMOVE) && ins->DstReg == aReg) {
			if (ins->SrcReg != aReg)
				break;
		}
		ins++;
		idxInstruction++;
	}
	return(result);
}

static int TestIfReturnFalse(Instruction *nextIns,int regNum)
{
	nextIns++;
	if (*(unsigned long *)(nextIns->Name) == JNE_CODE) {
		nextIns++;
		if (nextIns->Flags & ISMOVL) {
			if (nextIns->src[0] == '$' && nextIns->src[1] == '0'
				&& nextIns->src[2] == 0) {
				if (nextIns->dst[0] == '%' && nextIns->DstReg == regNum) {
					nextIns->Flags |= DELETED;
					Printf1("Optimization 12\n");
					return(1);
				}
			}
		}
	}
	return(0);
}

static void ChangeRedundantLoad(Instruction *ins,int regNum,BasicBlock *bb,int idxInstruction)
{
	unsigned char *regname,tbuf[60];
	Instruction *insDst,*nextIns;

	nextIns = &InstructionTable[idxInstruction+1];
	regname = RegisterNames[regNum];
	if (strlen(ins->src) <4) return;
	if (ins->DstReg > EBP) return;
	if (*(unsigned long *)(ins->Name) != MOVL_CODE) {
		/*
			We can use this byte widening instructions only with memory
			references. I assume that the compiler widens the arguments always
			before loading a register with a 16 or 8 bit value, a safe
			assumption I suppose.
		*/
//		strcpy(insDst->Name,"movl"); /*++++++++++++++++++*/
		return;
	}
	insDst = GetNextChangedInstruction(ins,bb);
	strcpy(insDst->Name,ins->Name);
	/* Print the regname into the source of the changed instruction */
	sprintf(tbuf,"%%%s",regname);
	strcpy(insDst->src,tbuf);
	/* The destination doesn't change */
	strcpy(insDst->dst,ins->dst);
	/* Update flags etc */
	ins->SrcReg = regNum;
	Printf1("Optimization 5\n");
}

static int ReadValue(unsigned char *src)
{
	int result,r;

	if (src[0] == '0' && (src[1] == 'x' || src[1] == 'X')) {
		r = sscanf(src+2,"%x",&result);
	}
	else {
		r = sscanf(src,"%d",&result);
	}
	if (r) return(result);
	return(0);
}

static Instruction *GetLastInstruction(int idxInstruction)
{
	int li = idxInstruction;
	Instruction *lastIns = NULL;

	do {
		li--;
		lastIns = &InstructionTable[li];
	} while (li >= 0 && (lastIns->Flags & DELETED));
	if (li >= 0) return(lastIns);
	return(NULL);
}

static int CheckValueAlreadyLoaded(unsigned char *p)
{
	if (State[EAX] && !strcmp(State[EAX],p)) {
		return(EAX);
	}
	if (State[EBX] && !strcmp(State[EBX],p)) {
		return(EBX);
	}
	if (State[ECX] && !strcmp(State[ECX],p)) {
		return(ECX);
	}
	if (State[EDX] && !strcmp(State[EDX],p)) {
		return(EDX);
	}
	if (State[ESI] && !strcmp(State[ESI],p)) {
		return(ESI);
	}
	if (State[EDI] && !strcmp(State[EDI],p)) {
		return(EDI);
	}
	return(0);
}

void FixCalls(Instruction *ins,BasicBlock *bb,int idxInstruction)
{
	int last,i,first;

	ins->Flags &= ~ISCALL;
	if (idxInstruction == bb->LastCall) {
		if (bb->FirstCall == idxInstruction) {
			bb->FirstCall = bb->LastCall = 0;
			return;
		}
		last = bb->FirstCall;
		for (i=bb->FirstCall+1;i<idxInstruction-1;i++) {
			if (InstructionTable[i].Flags & ISCALL)
				last = i;
		}
		if (last == bb->FirstCall) {
			bb->FirstCall = bb->LastCall = 0;
			return;
		}
		bb->LastCall = last;
		return;
	}
	if (idxInstruction == bb->FirstCall) {
		if (bb->LastCall == idxInstruction) {
			bb->FirstCall = bb->LastCall = 0;
			return;
		}
		first = 0;
		for (i=bb->FirstCall+1;i<bb->LastCall;i++) {
			if (InstructionTable[i].Flags & ISCALL) {
				first = i;
				break;
			}
		}
		bb->FirstCall = first;
		if (first == 0) bb->LastCall = 0;
		return;
	}
}
static char tbuf[70];
static unsigned char *src;
static unsigned char *dst;
static unsigned char *opcode;
static unsigned char *old,*savesrc;
static int regdst,regsrc,isImmediate;
static int aReg,isMovl,isRedundant;
static Instruction *insDst,*lastIns,*changedInstruction,*nextIns;
static Instruction *ins;
static BasicBlock *bb;
static int idxInstruction;

static int RegToRegCopy(void)
{
	/* Replace
	movl %eax,%edi
	movl %edi,-24(%ebp)

	with
	movl %eax,-24(%ebp)

	*/
	if (nextIns->Flags & CHANGED) return 0;
	if (nextIns->SrcReg == ins->DstReg) {
		if (ins->DstReg != EAX &&
		*(unsigned long *)(ins->Name) == MOVL_CODE &&
		*(unsigned long *)(nextIns->Name) == MOVL_CODE && 
		nextIns->SrcReg != nextIns->DstReg &&
		nextIns->src[0] == '%') {
		if (!IsAliveValue(bb,idxInstruction+2,ins->DstReg)) {
			insDst = ChangeInstruction(nextIns,bb,nextIns->Name,ins->src,nextIns->dst);
			nextIns->SrcReg = ins->SrcReg;
			ins->Flags |= DELETED;
			deleted++;
			Printf1("Optimization 18\n");
//		  printf("1:\t%s\t%s\t%s\n2:\t%s\t%s\t%s\n3:\t%s\t%s\t%s\n",ins->Name,ins->src,ins->dst,
//			nextIns->Name,nextIns->src,nextIns->dst,insDst->Name,insDst->src,insDst->dst);
			State[ins->SrcReg] = nextIns->dst;
			return 2;
		}
		}
		if (!strcmp(ins->dst,nextIns->src) &&
			*(unsigned long *)(nextIns->Name) == PUSH_CODE &&
			!IsAliveValue(bb,idxInstruction+2,ins->DstReg)) {
				ChangeInstruction(nextIns,bb,nextIns->Name,ins->src,"");
				ins->Flags |= DELETED;
				deleted++;
				return 2;
		}
	}
   /* Try to catch sequences like
		movl %eax,%edi
		cmpl $45, %edi
		and replace them with
		cmpl $45,%eax
   */
   if ((nextIns->Flags & ISCOMPARE) &&
		nextIns->src[0] == '$' && nextIns->dst[0] == '%' &&
		nextIns->DstReg != EAX &&
		!strcmp(nextIns->dst,ins->dst) &&
		!IsAliveValue(bb,idxInstruction+2,ins->DstReg)) {
		insDst = ChangeInstruction(nextIns,bb,nextIns->Name,nextIns->src,ins->src);
		ins->Flags |= DELETED;
		nextIns->DstReg = ins->SrcReg;
		Printf1("Optimization 17\n");
		deleted++;
		return 2;
	}
	return 0;
}
static int ImproveSetEqual(int islong)
{
	int wasxchg=0,condition;
	Instruction *next = nextIns;

//	if (recursion) return 0;
	if (!strcmp(nextIns->Name,"xchgl")) {
		wasxchg = 1;
		next++;
	}
	if (next->Name[0] == 's' && next->Name[1] == 'e') {
		int idx = idxInstruction+2;
		Instruction *i1 = &InstructionTable[idx+wasxchg*2];
		char *pdst = i1->dst;


		if (i1->src[0] == '$' && i1->src[1] == '1' &&
			(*(unsigned long *)(i1->Name) == ANDL_CODE)) {
			if (islong)
				condition = (!strstr(ins->src,pdst)) && (!strstr(ins->dst,pdst));
			else {
				char tmpregname[5];

				tmpregname[0] = '%';
				tmpregname[1] = pdst[2];
				tmpregname[2] = pdst[3];
				tmpregname[3] = 0;
				condition = (!strstr(tmpregname,ins->src) && !strstr(tmpregname,ins->dst));
				if (condition && tmpregname[2] != 'i') {
					tmpregname[2] = 'l';
					condition = (condition &&
						(!strstr(tmpregname,ins->src) && !strstr(tmpregname,ins->dst)));
				}
			}
			if (condition) {
				Instruction *changedIns = GetNextChangedInstruction(ins,bb);
				Instruction *i2 = GetNextChangedInstruction(changedIns,bb);

				sprintf(i2->Name,"\t%s\t",ins->Name);				
				strcpy(i2->src,ins->src);
				sprintf(i2->dst,",%s\n",ins->dst);
				changedIns->Flags &= ~ CHANGED;
				changedIns->Flags |= ADDED;
				strcpy(changedIns->Name,"xorl");
				strcpy(changedIns->src,pdst);
				strcpy(changedIns->dst,pdst);
				i1->Flags |= DELETED;
				deleted++;
				State[i1->DstReg] = Nullst;
//				printf("cmpl %s %s -> %s\n",ins->src,ins->dst,pdst);
				i1++;
				if (!strcmp(i1->Name,"cmpl") && !strcmp(i1->src,"$0") &&
					!strcmp(i1->dst,pdst)) {
					i1->Flags |= DELETED;
					deleted++;
					return 4;
				}
				return 3;
			}
		}
	}
	return 0;
}
int TestIfFlagsAlreadySet(Instruction *tmpins)
{
      int idx = idxInstruction;
	  unsigned long opcodeCode = *(unsigned long *)(tmpins->Name);
      if (tmpins) {
              while (idx > 0 && 
				  (opcodeCode == MOVL_CODE || opcodeCode == MOVW_CODE) &&
                      strcmp(tmpins->dst,ins->dst)) {
                      idx--;
                      tmpins--;
					opcodeCode = *(unsigned long *)(tmpins->Name);
              }
              if ((opcodeCode == SUBL_CODE
                      || opcodeCode == ADDL_CODE
                      || opcodeCode == SARL_CODE
                      || opcodeCode == ANDL_CODE) &&
                      !strcmp(tmpins->dst,ins->dst))  {
                      ins->Flags |= DELETED;
                      deleted++;
//                      printf("redundant compare deleted: last ins:%s\n",tmpins->Name);
                      return 1;
              }
      }
      return 0;
}
#if 0
static int OptimizeImul(void)
{
	char *p = strchr(ins->dst,',');
	int reg1,reg2,val,val3,val5,val9,n;
	char tregname[10],tbuf0[50],tbuf1[50];
	Instruction *ChangedIns,*addedIns;

	if (p == NULL)
		return 0;
	if (ins->dst[0] != '%')
		return 0;
	*p = 0;
	strcpy(tregname,ins->dst);
	*p++ = ',';
	if (*p != '%')
		return 0;
	reg1 = GetRegNumber(tregname+1);
	reg2 = GetRegNumber(p+1);
	if (reg1 > EBP || reg2 > EBP)
		return 0;
	val = ReadValue(ins->src+1);
	if (val < 0)
		return 0;
	if ((val % 5) != 0 && (val % 9) != 0 && (val % 3) != 0)
		return 0;
	if ((val % 5) == 0) {
		val5 = val/5;
		n = ispow2(val5);
		if (n || val == 5) {
			sprintf(tbuf0,"(%s,%s,4)",tregname,tregname);
			ChangedIns = ChangeInstruction(ins,bb,"leal",tbuf0,p);
			State[reg2] = Nullst;
			if (val == 5)
				return 1;
commonTail:
			addedIns = GetNextChangedInstruction(ChangedIns,bb);
			ChangedIns->Flags &= ~CHANGED;
			ChangedIns->Flags |= ADDED;
			strcpy(addedIns->Name,"\tshll\t");
			sprintf(tbuf1,"$%d,",n);
			strcpy(addedIns->src,tbuf1);
			sprintf(addedIns->dst,"%s\n",p);
			return 1;
		}

	}
	if ((val % 9) == 0) {
		val9 = val/9;
		n = ispow2(val9);
		if (n || val == 9) {
			sprintf(tbuf0,"(%s,%s,8)",tregname,tregname);
			ChangedIns = ChangeInstruction(ins,bb,"leal",tbuf0,p);
			State[reg2] = Nullst;
			if (val == 9)
				return 1;
			goto commonTail;
		}
	}
	if ((val % 3) == 0) {
		val3 = val/3;
		n = ispow2(val3);
		if (n || val == 3) {
			sprintf(tbuf0,"(%s,%s,2)",tregname,tregname);
			ChangedIns = ChangeInstruction(ins,bb,"leal",tbuf0,p);
			State[reg2] = Nullst;
			if (val == 3)
				return 1;
			goto commonTail;
		}
	}
	return 0;
}
#endif
static int compare(void)
{
	int reg;

	if (ins->Flags & (CHANGED|DELETED))
		return 1;
	reg = ImproveSetEqual(1);
	if (reg) return reg;
	/*
		replace
		cmpl $0,reg
		by
		or reg,reg
	*/
	if (regdst && !regsrc && isImmediate && src[1] == '0' && src[2] == 0) {
		if (TestIfFlagsAlreadySet(lastIns))
			  return 1;
		sprintf(tbuf,"%%%s",dst);
		ChangeInstruction(ins,bb,"or",tbuf,tbuf);
		Printf1("compl->or\n");
		TestIfReturnFalse(ins,ins->DstReg);
		return(1);
	}
	lastIns = GetLastInstruction(idxInstruction);
	if (!regdst /*&& isImmediate*/ && ins->Name[3] == 'l') {
		reg = CheckValueAlreadyLoaded(ins->dst);
		if (reg) {
			sprintf(tbuf,"%%%s",RegisterNames[reg]);
			if (isImmediate && ins->src[1] == '0' && ins->src[2] == 0) {
				ChangeInstruction(ins,bb,"orl",tbuf,tbuf);
			}
			else ChangeInstruction(ins,bb,ins->Name,ins->src,tbuf);
			Printf1("Optimization 44\n");
			return 1;
		}
	}
	/*
	Try to change a sequence of dword compares into a sequence of byte compares
	*/
	if (idxInstruction > 1 &&
		regdst && isImmediate && ins->Name[3] == 'l' &&
		(lastIns->Flags & (CHANGED|DELETED)) == 0) {
		if (!strcmp(lastIns->Name,"movsbl") ||
			!strcmp(lastIns->Name,"movzbl")) {
			if (!strcmp(lastIns->dst,ins->dst) &&
				isByteValue(ins->src)) {
				Instruction *i1,*i2;
				int idx,alive,changeAll,toChange,i,val;
				char dstByteReg[10];

				val = ReadValue(&ins->src[1]);
				if (val > 127 || val < 0) return 1;
				if (nextIns->Name[0] != 'j') {
					ChangeInstruction(ins,bb,"cmpb",ins->src,ins->dst);
					return 1;
				}
				if (ins->DstReg != EAX && ins->DstReg != EDX && ins->DstReg != EBX
					&& ins->DstReg != ECX) return 1;
				idx = idxInstruction+2;
				i1 = &InstructionTable[idx];
				changeAll = 1;
				while (idx < bb->NrOfInstructions && (i1->Flags & ISCOMPARE)) {
					if (i1->src[0] != '$') break;
					if (strcmp(ins->dst,i1->dst)) break;
					val = ReadValue(&i1->src[1]);
					if (val > 127 || val < 0)
						break;
					idx++;
					i1++;
					if (i1->Name[0] != 'j') { changeAll = 0; break; }
					idx++;
					i1++;
				}
				alive = IsAliveValue(bb,idx,ins->DstReg);
				toChange = idx - idxInstruction;
				dstByteReg[0] = '%';
				dstByteReg[1] = ins->dst[2];
				dstByteReg[2] = 'l';
				dstByteReg[3] = 0;
				if (changeAll) {
					if (!alive)
					ChangeInstruction(lastIns,bb,"movb",lastIns->src,dstByteReg);
					i2 = &InstructionTable[idxInstruction];
					for (i=idxInstruction;i < idx;i+=2,i2 += 2) {
						ChangeInstruction(i2,bb,"cmpb",i2->src,dstByteReg);
					}
					return toChange;
				}
				return 1;
			}
		}
	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线看日本不卡| 国产麻豆精品theporn| 91亚洲精品乱码久久久久久蜜桃| 中文字幕日本乱码精品影院| 狠狠色丁香婷婷综合久久片| 精品国产91九色蝌蚪| 国产美女视频91| 国产精品入口麻豆九色| 一本大道久久a久久综合| 国产精品视频在线看| www.欧美亚洲| 一区二区免费看| 日韩欧美国产电影| 国产999精品久久久久久| 亚洲免费观看在线视频| 欧美日韩国产首页在线观看| 日本欧美久久久久免费播放网| 成人的网站免费观看| 亚洲国产精品高清| 91福利社在线观看| 久久激情五月激情| 1024亚洲合集| 91精品国产入口| 成人动漫一区二区| 免费不卡在线观看| 中文字幕一区二区不卡| 欧美一区二区三区在线观看视频| 国产精品视频免费看| 在线中文字幕不卡| 国产呦精品一区二区三区网站| 欧美亚洲动漫制服丝袜| 狠狠色综合日日| 综合分类小说区另类春色亚洲小说欧美 | 亚洲国产中文字幕在线视频综合| 国产老妇另类xxxxx| 一区二区三区高清不卡| 日韩你懂的在线播放| av在线不卡观看免费观看| 日韩成人免费电影| 亚洲精品国产第一综合99久久| 成人97人人超碰人人99| 蜜臀久久99精品久久久久宅男| 欧美中文字幕久久| 国产福利精品一区二区| 午夜精品久久久久久久99水蜜桃 | 午夜成人免费电影| 中文字幕不卡在线| 欧美白人最猛性xxxxx69交| 99久久精品久久久久久清纯| 裸体一区二区三区| 亚洲成人激情综合网| 国产亲近乱来精品视频| 91精品国产综合久久久久久| 97久久精品人人做人人爽50路| 亚洲日本va在线观看| 精品免费视频一区二区| 欧美日韩国产另类一区| 99re免费视频精品全部| 懂色中文一区二区在线播放| 久久精品99国产精品| 天堂蜜桃一区二区三区| 亚洲激情一二三区| 亚洲欧美欧美一区二区三区| 中文字幕成人av| 国产片一区二区| 国产欧美1区2区3区| 久久综合999| 久久先锋影音av鲁色资源| 日韩精品一区二区三区老鸭窝| 成人午夜看片网址| 国产福利一区二区三区视频 | 国产精品乱码妇女bbbb| 精品福利一区二区三区| 欧美一区二区精品在线| 久久精品一二三| 精品少妇一区二区三区| 精品对白一区国产伦| 日韩免费高清av| 91精品国产综合久久国产大片| 国产在线视视频有精品| 激情深爱一区二区| 国产伦精品一区二区三区免费| 亚洲欧洲日产国产综合网| 国产精品久线观看视频| 国产精品久久久久天堂| 日本一区二区三区电影| 国产精品福利电影一区二区三区四区| 欧美日韩中文精品| 7777精品伊人久久久大香线蕉超级流畅 | 91麻豆精品国产91久久久资源速度| 免费精品99久久国产综合精品| 国产日韩欧美不卡在线| 国产精品黄色在线观看| 国产精品久久福利| 亚洲乱码中文字幕| 亚洲高清视频在线| 青青青爽久久午夜综合久久午夜 | 91麻豆精品国产无毒不卡在线观看| 国产伦理精品不卡| 成人av在线资源网| 欧美影院精品一区| 欧美日韩激情在线| 久久亚洲精品小早川怜子| 国产精品成人在线观看| 亚洲一区二区欧美日韩| 老司机午夜精品| 成人av小说网| 欧美日韩不卡在线| 国产免费观看久久| 亚洲一级片在线观看| 九九精品一区二区| 99久久99久久精品免费看蜜桃| 国产精品18久久久| 精品视频免费在线| 久久久九九九九| 亚洲成人自拍网| 国产精品系列在线观看| 欧美性高清videossexo| 欧美精品日韩一区| 国产欧美日韩视频在线观看| 亚洲影视在线播放| 国产美女精品人人做人人爽| 色一情一伦一子一伦一区| 精品国产一二三| 一区二区三区免费网站| 国产精品18久久久久久vr| 欧美日韩国产一级| 综合色天天鬼久久鬼色| 久久国产精品99精品国产| 色狠狠av一区二区三区| 国产亚洲人成网站| 日韩在线观看一区二区| 日本福利一区二区| 国产欧美日韩在线观看| 久久99久久精品| 欧美精品在线视频| 一区二区欧美国产| 色老头久久综合| 日本一区二区动态图| 美女视频第一区二区三区免费观看网站| 亚洲一区在线播放| 成人免费视频国产在线观看| 欧美一区二区三区影视| 亚洲视频一二三区| 成人黄色在线看| 久久精品欧美一区二区三区麻豆| 欧美国产日韩a欧美在线观看| 国产午夜亚洲精品午夜鲁丝片| 久久精品一区二区三区av| 蜜桃av一区二区在线观看| 91免费观看视频| 国产精品丝袜久久久久久app| 亚洲欧美激情小说另类| av在线一区二区三区| 国产日韩欧美综合一区| 国产综合久久久久久久久久久久| 国产风韵犹存在线视精品| 日韩你懂的电影在线观看| 喷白浆一区二区| 欧美久久一区二区| 午夜成人免费电影| 欧美高清性hdvideosex| 亚洲国产成人91porn| 欧美蜜桃一区二区三区| 亚洲成人免费在线观看| 欧美精选午夜久久久乱码6080| 久久日韩精品一区二区五区| 日本在线不卡视频一二三区| 欧美一区在线视频| 免费成人av在线| 欧美sm极限捆绑bd| 国产乱码精品一品二品| 亚洲精品一区二区三区精华液| 亚洲免费观看高清| 欧美日韩专区在线| 日本中文在线一区| 久久品道一品道久久精品| 国产suv精品一区二区三区| 国产精品进线69影院| 在线欧美小视频| 亚洲bt欧美bt精品| 欧美一个色资源| 国产精品888| 国产精品第13页| 欧美亚洲禁片免费| 麻豆国产一区二区| 国产人久久人人人人爽| 色综合久久综合| 日韩精品三区四区| 精品国产一区二区亚洲人成毛片 | 亚洲精品视频自拍| 欧美高清性hdvideosex| 国产一区二区三区蝌蚪| 国产精品日日摸夜夜摸av| 欧美视频在线一区| 激情文学综合丁香| 一区二区三区在线不卡| 欧美一区二区精品| 91麻豆自制传媒国产之光| 日本vs亚洲vs韩国一区三区|