vm::var improved, cleanup

Mostly vm::var initialization introduced.
Added vm::make_var function.
This commit is contained in:
Nekotekina 2015-09-26 23:46:04 +03:00
parent cc02a147d3
commit a974ee009e
116 changed files with 2763 additions and 3019 deletions

View file

@ -1968,7 +1968,7 @@ void ppu_interpreter::LBZX(PPUThread& CPU, ppu_opcode_t op)
void ppu_interpreter::LVX(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = (op.ra ? CPU.GPR[op.ra] + CPU.GPR[op.rb] : CPU.GPR[op.rb]) & ~0xfull;
CPU.VPR[op.vd] = vm::read128(VM_CAST(addr));
CPU.VPR[op.vd] = vm::_ref<v128>(VM_CAST(addr));
}
void ppu_interpreter::NEG(PPUThread& CPU, ppu_opcode_t op)
@ -2152,7 +2152,7 @@ void ppu_interpreter::STBX(PPUThread& CPU, ppu_opcode_t op)
void ppu_interpreter::STVX(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = (op.ra ? CPU.GPR[op.ra] + CPU.GPR[op.rb] : CPU.GPR[op.rb]) & ~0xfull;
vm::write128(VM_CAST(addr), CPU.VPR[op.vs]);
vm::_ref<v128>(VM_CAST(addr)) = CPU.VPR[op.vs];
}
void ppu_interpreter::MULLD(PPUThread& CPU, ppu_opcode_t op)
@ -2295,7 +2295,7 @@ void ppu_interpreter::LHAX(PPUThread& CPU, ppu_opcode_t op)
void ppu_interpreter::LVXL(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = (op.ra ? CPU.GPR[op.ra] + CPU.GPR[op.rb] : CPU.GPR[op.rb]) & ~0xfull;
CPU.VPR[op.vd] = vm::read128(VM_CAST(addr));
CPU.VPR[op.vd] = vm::_ref<v128>(VM_CAST(addr));
}
void ppu_interpreter::MFTB(PPUThread& CPU, ppu_opcode_t op)
@ -2435,7 +2435,7 @@ void ppu_interpreter::NAND(PPUThread& CPU, ppu_opcode_t op)
void ppu_interpreter::STVXL(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = (op.ra ? CPU.GPR[op.ra] + CPU.GPR[op.rb] : CPU.GPR[op.rb]) & ~0xfull;
vm::write128(VM_CAST(addr), CPU.VPR[op.vs]);
vm::_ref<v128>(VM_CAST(addr)) = CPU.VPR[op.vs];
}
void ppu_interpreter::DIVD(PPUThread& CPU, ppu_opcode_t op)
@ -2488,7 +2488,7 @@ void ppu_interpreter::LVLX(PPUThread& CPU, ppu_opcode_t op)
void ppu_interpreter::LDBRX(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = op.ra ? CPU.GPR[op.ra] + CPU.GPR[op.rb] : CPU.GPR[op.rb];
CPU.GPR[op.rd] = vm::get_ref<le_t<u64>>(VM_CAST(addr));
CPU.GPR[op.rd] = vm::_ref<le_t<u64>>(VM_CAST(addr));
}
void ppu_interpreter::LSWX(PPUThread& CPU, ppu_opcode_t op)
@ -2497,14 +2497,14 @@ void ppu_interpreter::LSWX(PPUThread& CPU, ppu_opcode_t op)
u32 count = CPU.XER.XER & 0x7F;
for (; count >= 4; count -= 4, addr += 4, op.rd = (op.rd + 1) & 31)
{
CPU.GPR[op.rd] = vm::get_ref<be_t<u32>>(VM_CAST(addr));
CPU.GPR[op.rd] = vm::_ref<u32>(VM_CAST(addr));
}
if (count)
{
u32 value = 0;
for (u32 byte = 0; byte < count; byte++)
{
u32 byte_value = vm::get_ref<u8>(VM_CAST(addr + byte));
u32 byte_value = vm::_ref<u8>(VM_CAST(addr + byte));
value |= byte_value << ((3 ^ byte) * 8);
}
CPU.GPR[op.rd] = value;
@ -2514,13 +2514,13 @@ void ppu_interpreter::LSWX(PPUThread& CPU, ppu_opcode_t op)
void ppu_interpreter::LWBRX(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = op.ra ? CPU.GPR[op.ra] + CPU.GPR[op.rb] : CPU.GPR[op.rb];
CPU.GPR[op.rd] = vm::get_ref<le_t<u32>>(VM_CAST(addr));
CPU.GPR[op.rd] = vm::_ref<le_t<u32>>(VM_CAST(addr));
}
void ppu_interpreter::LFSX(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = op.ra ? CPU.GPR[op.ra] + CPU.GPR[op.rb] : CPU.GPR[op.rb];
CPU.FPR[op.frd]._double = vm::get_ref<be_t<float>>(VM_CAST(addr)).value();
CPU.FPR[op.frd]._double = vm::_ref<f32>(VM_CAST(addr));
}
void ppu_interpreter::SRW(PPUThread& CPU, ppu_opcode_t op)
@ -2586,7 +2586,7 @@ void ppu_interpreter::LSWI(PPUThread& CPU, ppu_opcode_t op)
void ppu_interpreter::LFSUX(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = CPU.GPR[op.ra] + CPU.GPR[op.rb];
CPU.FPR[op.frd]._double = vm::get_ref<be_t<float>>(VM_CAST(addr)).value();
CPU.FPR[op.frd]._double = vm::_ref<f32>(VM_CAST(addr));
CPU.GPR[op.ra] = addr;
}
@ -2598,13 +2598,13 @@ void ppu_interpreter::SYNC(PPUThread& CPU, ppu_opcode_t op)
void ppu_interpreter::LFDX(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = op.ra ? CPU.GPR[op.ra] + CPU.GPR[op.rb] : CPU.GPR[op.rb];
CPU.FPR[op.frd]._double = vm::get_ref<be_t<double>>(VM_CAST(addr)).value();
CPU.FPR[op.frd]._double = vm::_ref<f64>(VM_CAST(addr));
}
void ppu_interpreter::LFDUX(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = CPU.GPR[op.ra] + CPU.GPR[op.rb];
CPU.FPR[op.frd]._double = vm::get_ref<be_t<double>>(VM_CAST(addr)).value();
CPU.FPR[op.frd]._double = vm::_ref<f64>(VM_CAST(addr));
CPU.GPR[op.ra] = addr;
}
@ -2619,7 +2619,7 @@ void ppu_interpreter::STVLX(PPUThread& CPU, ppu_opcode_t op)
void ppu_interpreter::STDBRX(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = op.ra ? CPU.GPR[op.ra] + CPU.GPR[op.rb] : CPU.GPR[op.rb];
vm::get_ref<le_t<u64>>(VM_CAST(addr)) = CPU.GPR[op.rs];
vm::_ref<le_t<u64>>(VM_CAST(addr)) = CPU.GPR[op.rs];
}
void ppu_interpreter::STSWX(PPUThread& CPU, ppu_opcode_t op)
@ -2644,13 +2644,13 @@ void ppu_interpreter::STSWX(PPUThread& CPU, ppu_opcode_t op)
void ppu_interpreter::STWBRX(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = op.ra ? CPU.GPR[op.ra] + CPU.GPR[op.rb] : CPU.GPR[op.rb];
vm::get_ref<le_t<u32>>(VM_CAST(addr)) = (u32)CPU.GPR[op.rs];
vm::_ref<le_t<u32>>(VM_CAST(addr)) = (u32)CPU.GPR[op.rs];
}
void ppu_interpreter::STFSX(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = op.ra ? CPU.GPR[op.ra] + CPU.GPR[op.rb] : CPU.GPR[op.rb];
vm::get_ref<be_t<float>>(VM_CAST(addr)) = static_cast<float>(CPU.FPR[op.frs]);
vm::_ref<f32>(VM_CAST(addr)) = static_cast<float>(CPU.FPR[op.frs]);
}
void ppu_interpreter::STVRX(PPUThread& CPU, ppu_opcode_t op)
@ -2664,7 +2664,7 @@ void ppu_interpreter::STVRX(PPUThread& CPU, ppu_opcode_t op)
void ppu_interpreter::STFSUX(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = CPU.GPR[op.ra] + CPU.GPR[op.rb];
vm::get_ref<be_t<float>>(VM_CAST(addr)) = static_cast<float>(CPU.FPR[op.frs]);
vm::_ref<f32>(VM_CAST(addr)) = static_cast<float>(CPU.FPR[op.frs]);
CPU.GPR[op.ra] = addr;
}
@ -2700,13 +2700,13 @@ void ppu_interpreter::STSWI(PPUThread& CPU, ppu_opcode_t op)
void ppu_interpreter::STFDX(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = op.ra ? CPU.GPR[op.ra] + CPU.GPR[op.rb] : CPU.GPR[op.rb];
vm::get_ref<be_t<double>>(VM_CAST(addr)) = CPU.FPR[op.frs];
vm::_ref<f64>(VM_CAST(addr)) = CPU.FPR[op.frs];
}
void ppu_interpreter::STFDUX(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = CPU.GPR[op.ra] + CPU.GPR[op.rb];
vm::get_ref<be_t<double>>(VM_CAST(addr)) = CPU.FPR[op.frs];
vm::_ref<f64>(VM_CAST(addr)) = CPU.FPR[op.frs];
CPU.GPR[op.ra] = addr;
}
@ -2722,7 +2722,7 @@ void ppu_interpreter::LVLXL(PPUThread& CPU, ppu_opcode_t op)
void ppu_interpreter::LHBRX(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = op.ra ? CPU.GPR[op.ra] + CPU.GPR[op.rb] : CPU.GPR[op.rb];
CPU.GPR[op.rd] = vm::get_ref<le_t<u16>>(VM_CAST(addr));
CPU.GPR[op.rd] = vm::_ref<le_t<u16>>(VM_CAST(addr));
}
void ppu_interpreter::SRAW(PPUThread& CPU, ppu_opcode_t op)
@ -2809,7 +2809,7 @@ void ppu_interpreter::STVLXL(PPUThread& CPU, ppu_opcode_t op)
void ppu_interpreter::STHBRX(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = op.ra ? CPU.GPR[op.ra] + CPU.GPR[op.rb] : CPU.GPR[op.rb];
vm::get_ref<le_t<u16>>(VM_CAST(addr)) = (u16)CPU.GPR[op.rs];
vm::_ref<le_t<u16>>(VM_CAST(addr)) = (u16)CPU.GPR[op.rs];
}
void ppu_interpreter::EXTSH(PPUThread& CPU, ppu_opcode_t op)
@ -2852,7 +2852,7 @@ void ppu_interpreter::DCBZ(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = op.ra ? CPU.GPR[op.ra] + CPU.GPR[op.rb] : CPU.GPR[op.rb];
memset(vm::get_ptr<u8>(VM_CAST(addr) & ~127), 0, 128);
std::memset(vm::base(VM_CAST(addr) & ~127), 0, 128);
}
void ppu_interpreter::LWZ(PPUThread& CPU, ppu_opcode_t op)
@ -2967,52 +2967,52 @@ void ppu_interpreter::STMW(PPUThread& CPU, ppu_opcode_t op)
void ppu_interpreter::LFS(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = op.ra ? CPU.GPR[op.ra] + op.simm16 : op.simm16;
CPU.FPR[op.frd]._double = vm::get_ref<be_t<float>>(VM_CAST(addr)).value();
CPU.FPR[op.frd]._double = vm::_ref<f32>(VM_CAST(addr));
}
void ppu_interpreter::LFSU(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = CPU.GPR[op.ra] + op.simm16;
CPU.FPR[op.frd]._double = vm::get_ref<be_t<float>>(VM_CAST(addr)).value();
CPU.FPR[op.frd]._double = vm::_ref<f32>(VM_CAST(addr));
CPU.GPR[op.ra] = addr;
}
void ppu_interpreter::LFD(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = op.ra ? CPU.GPR[op.ra] + op.simm16 : op.simm16;
CPU.FPR[op.frd]._double = vm::get_ref<be_t<double>>(VM_CAST(addr)).value();
CPU.FPR[op.frd]._double = vm::_ref<f64>(VM_CAST(addr));
}
void ppu_interpreter::LFDU(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = CPU.GPR[op.ra] + op.simm16;
CPU.FPR[op.frd]._double = vm::get_ref<be_t<double>>(VM_CAST(addr)).value();
CPU.FPR[op.frd]._double = vm::_ref<f64>(VM_CAST(addr));
CPU.GPR[op.ra] = addr;
}
void ppu_interpreter::STFS(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = op.ra ? CPU.GPR[op.ra] + op.simm16 : op.simm16;
vm::get_ref<be_t<float>>(VM_CAST(addr)) = static_cast<float>(CPU.FPR[op.frs]);
vm::_ref<f32>(VM_CAST(addr)) = static_cast<float>(CPU.FPR[op.frs]);
}
void ppu_interpreter::STFSU(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = CPU.GPR[op.ra] + op.simm16;
vm::get_ref<be_t<float>>(VM_CAST(addr)) = static_cast<float>(CPU.FPR[op.frs]);
vm::_ref<f32>(VM_CAST(addr)) = static_cast<float>(CPU.FPR[op.frs]);
CPU.GPR[op.ra] = addr;
}
void ppu_interpreter::STFD(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = op.ra ? CPU.GPR[op.ra] + op.simm16 : op.simm16;
vm::get_ref<be_t<double>>(VM_CAST(addr)) = CPU.FPR[op.frs];
vm::_ref<f64>(VM_CAST(addr)) = CPU.FPR[op.frs];
}
void ppu_interpreter::STFDU(PPUThread& CPU, ppu_opcode_t op)
{
const u64 addr = CPU.GPR[op.ra] + op.simm16;
vm::get_ref<be_t<double>>(VM_CAST(addr)) = CPU.FPR[op.frs];
vm::_ref<f64>(VM_CAST(addr)) = CPU.FPR[op.frs];
CPU.GPR[op.ra] = addr;
}