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

📄 decoder.c

📁 skyeye for pxa270
💻 C
📖 第 1 页 / 共 3 页
字号:
				case TNE:				{				    	// Trap If Not Equal					if( mstate->gpr[rs(instr)] != mstate->gpr[rt(instr)])						fprintf(stderr,"trap happened in %s at 0x%x.\n", __FUNCTION__, mstate->pc);					//process_reserved_instruction(mstate);					//skyeye_exit(-1);										return nothing_special;				}				case DSLL:				{				    	// Doubleword Shift Left Logical					process_reserved_instruction(mstate);					return nothing_special;				}				case DSRL:				{				    	// Doubleword Shift Right Logical					process_reserved_instruction(mstate);					return nothing_special;				}				case DSRA:				{			    		// Doubleword Shift Right Arithmetic					process_reserved_instruction(mstate);					return nothing_special;				}				case DSLL32:				{			    		// Doubleword Shift Left Logical + 32					process_reserved_instruction(mstate);					return nothing_special;				}				case DSRL32:				{				    	// Doubleword Shift Right Logical + 32 					process_reserved_instruction(mstate);					return nothing_special;				}				case DSRA32:				{			    		// Doubleword Shift Right Arithmetic + 32					process_reserved_instruction(mstate);					return nothing_special;				}				default:			    		// Reserved instruction					process_reserved_instruction(mstate);				    	return nothing_special;			}// switch (function(instr)) {		}//case SPECIAL:    			case REGIMM:    		{			switch (rt(instr)) {				case BLTZ:				{	   			 	// Branch On Less Than Zero				    	Int32 x = mstate->gpr[rs(instr)];	    				if (x < 0) {						VA off = sign_extend_UInt32(offset(instr), 16);						mstate->branch_target = mstate->pc + 4 + (off << 2);	    				} else {						mstate->branch_target = mstate->pc + 8;	    				}			    		if (mstate->pipeline == branch_delay) {						printf("Can't handle branch in branch delay slot\n");					}				    	return branch_delay;				}				case BGEZ:				{				    	// Branch On greater Than Zero				    	Int32 x = mstate->gpr[rs(instr)];				    	if (x >= 0) {						VA off = sign_extend_UInt32(offset(instr), 16);						mstate->branch_target = mstate->pc + 4 + (off << 2);	    				} else {						mstate->branch_target = mstate->pc + 8;	    				}			    		if (mstate->pipeline == branch_delay) {						printf("Can't handle branch in branch delay slot\n");					}				    	return branch_delay;				}				case BLTZL:				{			    		// Branch On Less Than Zero Likely					return nothing_special;				}				case BGEZL:				{				    	// Branch On Greater Than Or Equal To Zero Likely					return nothing_special;				}				case TGEI:				{				    	// Trap If Greater Than Or Equal Immediate					return nothing_special;				}				case TGEIU:				{			    		// Trap If Greater Than Or Equal Immediate Unsigned				    	return nothing_special;				}				case TLTI:				{			    		// Trap If Less Than Immediate				    	return nothing_special;				}				case TLTIU:				{			    		// Trap If Less Than Immediate Unsigned				    	return nothing_special;				}				case TEQI:				{			    		// Trap If Equal Immediate				    	return nothing_special;				}				case TNEI:				{			    		// Trap If Not Equal Immediate				    	return nothing_special;				}				case BLTZAL:				{				    	// Branch On Less Than Zero And Link				    	Int32 x = mstate->gpr[rs(instr)];				    	mstate->gpr[31] = mstate->pc + 8;				    	if (x < 0) {						VA off = sign_extend_UInt32(offset(instr), 16);						mstate->branch_target = mstate->pc + 4 + (off << 2);	    				} else {				    		mstate->branch_target = mstate->pc + 8;	    				}	    				if (mstate->pipeline == branch_delay) {						printf("Can't handle branch in branch delay slot\n");					}				    	return branch_delay;				}				case BGEZAL:				{				    	// Branch On Greater Than Or Equal To Zero And Link				    	Int32 x = mstate->gpr[rs(instr)];				    	mstate->gpr[31] = mstate->pc + 8;				    	if (x >= 0) {						VA off = sign_extend_UInt32(offset(instr), 16);						mstate->branch_target = mstate->pc + 4 + (off << 2);					} else {						mstate->branch_target = mstate->pc + 8;	    				}						    	if (mstate->pipeline == branch_delay) {						printf("Can't handle branch in branch delay slot\n");					}				    	return branch_delay;				}				case BLTZALL:				{			    		// Branch On Less Than Zero And Link Likely					return nothing_special;				}				case BGEZALL:				{			    		// Branch On Greater Than Or Equal To Zero And Link Likely					return nothing_special;				}				default:				    	process_reserved_instruction(mstate);				    	return nothing_special; //Fix me. Shi yang 2006-08-09			}    		}//case REGIMM:    		case J:    		{			// Jump			VA msb = clear_bits(mstate->pc + 4, 27, 0);			mstate->branch_target = msb | (target(instr) << 2);			if (mstate->pipeline == branch_delay) {				printf("Can't handle branch in branch delay slot");			}			return branch_delay;    		}		case JAL:    		{			// Jump And Link			mstate->gpr[31] = mstate->pc + 8;			VA msb = clear_bits(mstate->pc + 4, 27, 0);			mstate->branch_target = msb | (target(instr) << 2);			if (mstate->pipeline == branch_delay) {				printf("Can't handle branch in branch delay slot");			}			return branch_delay;    		}    		case BEQ:    		{			// Branch On Equal			if (mstate->gpr[rs(instr)] == mstate->gpr[rt(instr)]) {				VA off = sign_extend_UInt32(offset(instr), 16);			    	mstate->branch_target = mstate->pc + 4 + (off << 2);			} else {			    	mstate->branch_target = mstate->pc + 8;			}			if (mstate->pipeline == branch_delay) {				printf("Can't handle branch in branch delay slot");			}			return branch_delay;    		}    		case BNE:    		{			// Branch On Not Equal			if (mstate->gpr[rs(instr)] != mstate->gpr[rt(instr)]) {				VA off = sign_extend_UInt32(offset(instr), 16);	   			 mstate->branch_target = mstate->pc + 4 + (off << 2);			} else {			    	mstate->branch_target = mstate->pc + 8;			}			if (mstate->pipeline == branch_delay) {				printf("Can't handle branch in branch delay slot");			}				return branch_delay;    		}    		case BLEZ:    		{			// Branch On Less Than Or Equal To Zero			Int32 x = mstate->gpr[rs(instr)];			if (x <= 0) {			    	VA off = sign_extend_UInt32(offset(instr), 16);			    	mstate->branch_target = mstate->pc + 4 + (off << 2);			} else {				mstate->branch_target = mstate->pc + 8;			}			if (mstate->pipeline == branch_delay) {				printf("Can't handle branch in branch delay slot");			}			return branch_delay;    		}		case BGTZ:    		{			// Branch On Greater Than Zero			Int32 x = mstate->gpr[rs(instr)];			if (x > 0) {			    	VA off = sign_extend_UInt32(offset(instr), 16);			    	mstate->branch_target = mstate->pc + 4 + (off << 2);			} else {			    	mstate->branch_target = mstate->pc + 8;			}			if (mstate->pipeline == branch_delay) {				printf("Can't handle branch in branch delay slot");			}			return branch_delay;    		}    		case ADDI:    		{			// Add Immediate			UInt32 x = mstate->gpr[rs(instr)];			UInt32 y = sign_extend_UInt32(immediate(instr), 16);			UInt32 z = x + y;			// Overflow occurs is sign(x) == sign(y) != sign(z).			if (bit(x ^ y, 31) == 0 && bit(x ^ z, 31) != 0)			    	process_integer_overflow(mstate);			mstate->gpr[rt(instr)] = z;			return nothing_special;    		}		case ADDIU:    		{			/* confused, signed or unsigned ?? */			// Add Immediate Unsigned			UInt32 x = mstate->gpr[rs(instr)];			Int32 y = sign_extend_UInt32(immediate(instr), 16);			UInt32 z = x + y;			//fprintf(skyeye_logfd, "0x%d,0x%d,0x%d, in 0x%x\n", x ,y, z, mstate->pc);			mstate->gpr[rt(instr)] = z;					return nothing_special;    		}		case SLTI:    		{			// Set On Less Than Immediate			Int32 x = mstate->gpr[rs(instr)];			Int32 y = sign_extend_UInt32(immediate(instr), 16);			mstate->gpr[rt(instr)] = (x < y);				return nothing_special;    		}	    	case SLTIU:    		{			// Set On Less Than Immediate Unsigned			UInt32 x = mstate->gpr[rs(instr)];			UInt32 y = sign_extend_UInt32(immediate(instr), 16);			mstate->gpr[rt(instr)] = (x < y);			return nothing_special;    		}	    	case ANDI:    		{			// And Immediate			UInt16 x = mstate->gpr[rs(instr)];			UInt16 imm = zero_extend(immediate(instr), 16);			mstate->gpr[rt(instr)] = x & imm; //Shi yang 2006-08-31			return nothing_special;    		}	    	case ORI:    		{			// Or Immediate			UInt32 x = mstate->gpr[rs(instr)]; //Shi yang 2006-08-09			UInt16 imm = immediate(instr);			mstate->gpr[rt(instr)] = x | imm;			return nothing_special;    		}	    	case XORI:    		{			// Exclusive Or Immediate			UInt32 x = mstate->gpr[rs(instr)];			UInt32 imm = immediate(instr);			mstate->gpr[rt(instr)] = x ^ imm;			return nothing_special;    		}    		case LUI:    		{			// Load Upper Immediate			UInt32 imm = immediate(instr);			imm <<= 16;			mstate->gpr[rt(instr)] = imm;			return nothing_special;    		}	    	case COP0:    		{			// Coprocessor 0 Operation			return decode_cop0(mstate, instr);    		}	    	case COP1:    		{			return decode_cop1(mstate, instr);			// Coprocessor 1 Operation			//process_reserved_instruction(mstate);    		}		case COP2:    		{			// Coprocessor 2 Operation			process_reserved_instruction(mstate);			return nothing_special;    		}		case PREF:		{			//fprintf(stderr, "PREF instruction,pc=0x%x\n",mstate->pc);			return nothing_special;		}	    	case BEQL:    		{			// Branch On Equal Likely			process_reserved_instruction(mstate);			return nothing_special;    		}    		case BNEL:    		{			// Branch On Not Equal Likely			process_reserved_instruction(mstate);			return nothing_special;    		}    		case BLEZL:    		{			process_reserved_instruction(mstate);			return nothing_special;    		}    		case BGTZL:    		{			// Branch On Greater Than Zero Likely			process_reserved_instruction(mstate);			return nothing_special;    		}    		case DADDI:    		{			// Doubleword Add Immediate			process_reserved_instruction(mstate);			return nothing_special;    		}	    	case DADDIU:    		{			// Doubleword Add Immediate Unsigned			process_reserved_instruction(mstate);			return nothing_special;    		}    		case LDL:    		{			// Load Doubleword Left			process_reserved_instruction(mstate);			return nothing_special;    		}    		case LDR:    		{			// Load Doubleword Right			process_reserved_instruction(mstate);			return nothing_special;    		}		case SPECIAL2:		{			                        switch (function(instr)) {

⌨️ 快捷键说明

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