📄 integer_load_instruction.cpp
字号:
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 + -