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

📄 integer_load_instruction.cpp

📁 浙江大学的悟空嵌入式系统模拟器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            PPC_TRACE_RETURN("mmu access fault\n");

		Core::Wukong_Get_System().convert_from_bytecode(buffer, val);

		REG(A).convert_from_int(REG_TO_INT(REG(A)) + REG_TO_INT(REG(B)));
		REG(D).convert_from_int(val);
	}

	PPC_INSTRUCTION_IMPL(op_lhzx)
	{
		PPC_s32 D, A, B;

		X_Form_Parser::parse_x(instr, D, A, B);

		PPC_Address_T start = (A? REG_TO_INT(REG(A)) : 0) + REG_TO_INT(REG(B));
		Core::Bytecode_Type buffer;
		Core::u16 val;

        PPC_TRACE_1("lhzx", (Core::u32*)start);
        
		if (MMU::ACCESS_FAULT == GET_MMU().access(Core::Memory_32Bit::MEMORY_READ, start, 2, buffer))
            PPC_TRACE_RETURN("mmu access fault\n");

		Core::Wukong_Get_System().convert_from_bytecode(buffer, val);
		
		REG(D).convert_from_int(val);
	}

	PPC_INSTRUCTION_IMPL(op_lwz)
	{
		PPC_s32 D, A;
		PPC_u32 imm;

		D_Form_Parser::parse_simm (instr, D, A, imm);

		PPC_Address_T start = (A? REG_TO_INT(REG(A)) : 0) + imm;
		Core::Bytecode_Type buffer;
		Core::u32 val;

        PPC_TRACE_1("lwz", (Core::u32*)start);
        
		if (MMU::ACCESS_FAULT == GET_MMU().access(Core::Memory_32Bit::MEMORY_READ, start, 4, buffer))
            PPC_TRACE_RETURN("mmu access fault\n");

		Core::Wukong_Get_System().convert_from_bytecode(buffer, val);

		REG(D).convert_from_int(val);
	}

	PPC_INSTRUCTION_IMPL(op_lwzu)
	{
		PPC_s32 D, A;
		PPC_u32 imm;

		D_Form_Parser::parse_simm (instr, D, A, imm);

		PPC_TRACE_3("lwzu", D, A, (Core::s32)imm);

		PPC_ASSERT((A != 0) && (A != D));

		PPC_Address_T start = REG_TO_INT(REG(A)) + imm;
		Core::Bytecode_Type buffer;
		Core::u32 val;

        PPC_TRACE_1("lwzu", (Core::u32*)start);
        
		if (MMU::ACCESS_FAULT == GET_MMU().access(Core::Memory_32Bit::MEMORY_READ, start, 4, buffer))
            PPC_TRACE_RETURN("mmu access fault\n");

		Core::Wukong_Get_System().convert_from_bytecode(buffer, val);

		REG(A).convert_from_int(REG_TO_INT(REG(A)) + imm);
		REG(D).convert_from_int(val);
	}

	PPC_INSTRUCTION_IMPL(op_lwzux)
	{
		PPC_s32 D, A, B;

		X_Form_Parser::parse_x(instr, D, A, B);

		PPC_ASSERT((A != 0) && (A != D));

		PPC_Address_T start = REG_TO_INT(REG(A)) + REG_TO_INT(REG(B));
		Core::Bytecode_Type buffer;
		Core::u32 val;

        PPC_TRACE_1("lwzux", (Core::u32*)start);
        
		if (MMU::ACCESS_FAULT == GET_MMU().access(Core::Memory_32Bit::MEMORY_READ, start, 4, buffer))
            PPC_TRACE_RETURN("mmu access fault\n");

		Core::Wukong_Get_System().convert_from_bytecode(buffer, val);

		REG(A).convert_from_int(REG_TO_INT(REG(A)) + REG_TO_INT(REG(B)));
		REG(D).convert_from_int(val);
	}

	PPC_INSTRUCTION_IMPL(op_lwzx)
	{
		PPC_s32 D, A, B;

		X_Form_Parser::parse_x(instr, D, A, B);

		PPC_Address_T start = (A? REG_TO_INT(REG(A)) : 0) + REG_TO_INT(REG(B));
		Core::Bytecode_Type buffer;
		Core::u32 val;

        PPC_TRACE_1("lwzx", (Core::u32*)start);
        
		if (MMU::ACCESS_FAULT == GET_MMU().access(Core::Memory_32Bit::MEMORY_READ, start, 4, buffer))
            PPC_TRACE_RETURN("mmu access fault\n");

		Core::Wukong_Get_System().convert_from_bytecode(buffer, val);

		REG(D).convert_from_int(val);
	}

	PPC_INSTRUCTION_IMPL(op_lhbrx)
	{
		PPC_s32 D, A, B;

		X_Form_Parser::parse_x(instr, D, A, B);

		PPC_Address_T start = (A? REG_TO_INT(REG(A)) : 0) + REG_TO_INT(REG(B));
		Core::Bytecode_Type buffer;
		Core::u16 val;

        PPC_TRACE_1("lhbrx", (Core::u32*)start);
        
		if (MMU::ACCESS_FAULT == GET_MMU().access(Core::Memory_32Bit::MEMORY_READ, start, 2, buffer))
            PPC_TRACE_RETURN("mmu access fault\n");

		Core::Wukong_Get_System().convert_from_bytecode(buffer, val);

		//? Maybe we don't need to do reversing work?
		REG(D).convert_from_int(val);
	}

	PPC_INSTRUCTION_IMPL(op_lwbrx)
	{
		PPC_s32 D, A, B;

		X_Form_Parser::parse_x(instr, D, A, B);

		PPC_Address_T start = (A? REG_TO_INT(REG(A)) : 0) + REG_TO_INT(REG(B));
		Core::Bytecode_Type buffer;
		Core::u32 val;

        PPC_TRACE_1("lwbrx", (Core::u32*)start);
        
		if (MMU::ACCESS_FAULT == GET_MMU().access(Core::Memory_32Bit::MEMORY_READ, start, 4, buffer))
            PPC_TRACE_RETURN("mmu access fault\n");

		Core::Wukong_Get_System().convert_from_bytecode(buffer, val);

		//? Maybe we don't need to do reversing work?
		REG(D).convert_from_int(val);
	}

	PPC_INSTRUCTION_IMPL(op_lmw)
	{
		PPC_TRACE("lmw\n");
		PPC_s32 D, A;
		PPC_u32 imm;
		D_Form_Parser::parse_simm (instr, D, A, imm);

		PPC_Address_T ea = (A? REG_TO_INT(REG(A)) : 0) + imm;
		Core::Bytecode_Type buffer;
		Core::u32 val;

		if (ea % 4 != 0) {
			PPC_ERROR(("lmw: address's not multiple of 4. DSI exception may be caused.\n" 
				"But only warning here. Register value undefined\n"));
		}

		while (D <= 31) {
			if (MMU::ACCESS_FAULT == GET_MMU().access(Core::Memory_32Bit::MEMORY_READ, ea, 4, buffer))
				PPC_TRACE_RETURN("mmu access fault\n");

			Core::Wukong_Get_System().convert_from_bytecode(buffer, val);
			REG(D).convert_from_int(val);

			D++;
			ea += 4;
		}
	}

	PPC_INSTRUCTION_IMPL(op_lswi)
	{
		PPC_TRACE("lswi\n");
		PPC_s32 D, A, NB;
		X_Form_Parser::parse_x(instr, D, A, NB);

		if ( 0 == NB )
			NB = 32;

		PPC_Address_T ea = (A? REG_TO_INT(REG(A)) : 0);

		// Temp register value (32bits)
		PPC_u32 r = 0;

		// Bytes per word
		size_t bpw = 4;

		// Temp byte value (8bits)
		Core::u8 b;
        Core::Bytecode_Type buffer;
        
		while (NB > 0) {
            // A word complete
            if (bpw == 0) {
                bpw = 4;
                REG (D).convert_from_int (r);
                D = (D + 1) % 32;
                r = 0;
            }

            if (GET_MMU().access(Core::Memory_32Bit::MEMORY_READ, ea, 1, buffer) == MMU::ACCESS_FAULT)
                PPC_TRACE_RETURN("mmu access fault\n");
                
            Core::Wukong_Get_System().convert_from_bytecode(buffer, b);

            // Fill `r' from left to right
            r <<= 8;
            r |= b;
            ea++;
            bpw--;
            NB--;
		}

        // fill the rest; may be less than 4 bytes long;
        while (bpw--)
            r <<= 8;

        REG (D).convert_from_int (r);
	}

	PPC_INSTRUCTION_IMPL(op_lswx)
	{
		PPC_TRACE("lswx\n");
		PPC_s32 D, A, B;
		X_Form_Parser::parse_x(instr, D, A, B);

		int NB = Reg_Flag::XER_N(REG_TO_INT(REG(XER)));

		PPC_Address_T ea = (A? REG_TO_INT(REG(A)) : 0) + REG_TO_INT(REG(B));

		// Temp register value (32bits)
		PPC_u32 r = 0;

		// Bytes per word
		size_t bpw = 4;

		// Temp byte value (8bits)
		Core::u8 b;
		Core::Bytecode_Type buffer;

		while (NB > 0) {
			// A word complete
			if (bpw == 0) {
				bpw = 4;
				REG (D).convert_from_int (r);
				D = (D + 1) % 32;
				r = 0;
			}

			if (GET_MMU().access(Core::Memory_32Bit::MEMORY_READ, ea, 1, buffer) == MMU::ACCESS_FAULT)
                PPC_TRACE_RETURN("mmu access fault\n");
            
			Core::Wukong_Get_System().convert_from_bytecode(buffer, b);

			// Fill `r' from left to right
			r <<= 8;
			r |= b;
			ea++;
			bpw--;
			NB--;
		}

		// fill the rest; may be less than 4 bytes long;
		while (bpw--)
			r <<= 8;

		REG (D).convert_from_int (r);
	}

} //namespace PPC

⌨️ 快捷键说明

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