mirror of
https://github.com/azahar-emu/dynarmic
synced 2025-11-08 08:00:01 +01:00
emit_x64: EmitSet{Register,ExtendedRegister32,ExtendedRegister64}: Store from current source
This commit is contained in:
parent
984ce22431
commit
9ac1c87a51
@ -174,6 +174,9 @@ void EmitX64::EmitSetRegister(RegAlloc& reg_alloc, IR::Block&, IR::Inst* inst) {
|
|||||||
Arm::Reg reg = inst->GetArg(0).GetRegRef();
|
Arm::Reg reg = inst->GetArg(0).GetRegRef();
|
||||||
if (args[1].IsImmediate()) {
|
if (args[1].IsImmediate()) {
|
||||||
code->mov(MJitStateReg(reg), args[1].GetImmediateU32());
|
code->mov(MJitStateReg(reg), args[1].GetImmediateU32());
|
||||||
|
} else if (args[1].IsInXmm()) {
|
||||||
|
Xbyak::Xmm to_store = reg_alloc.UseXmm(args[1]);
|
||||||
|
code->movd(MJitStateReg(reg), to_store);
|
||||||
} else {
|
} else {
|
||||||
Xbyak::Reg32 to_store = reg_alloc.UseGpr(args[1]).cvt32();
|
Xbyak::Reg32 to_store = reg_alloc.UseGpr(args[1]).cvt32();
|
||||||
code->mov(MJitStateReg(reg), to_store);
|
code->mov(MJitStateReg(reg), to_store);
|
||||||
@ -184,16 +187,26 @@ void EmitX64::EmitSetExtendedRegister32(RegAlloc& reg_alloc, IR::Block&, IR::Ins
|
|||||||
auto args = reg_alloc.GetArgumentInfo(inst);
|
auto args = reg_alloc.GetArgumentInfo(inst);
|
||||||
Arm::ExtReg reg = inst->GetArg(0).GetExtRegRef();
|
Arm::ExtReg reg = inst->GetArg(0).GetExtRegRef();
|
||||||
ASSERT(Arm::IsSingleExtReg(reg));
|
ASSERT(Arm::IsSingleExtReg(reg));
|
||||||
Xbyak::Xmm source = reg_alloc.UseXmm(args[1]);
|
if (args[1].IsInXmm()) {
|
||||||
code->movss(MJitStateExtReg(reg), source);
|
Xbyak::Xmm to_store = reg_alloc.UseXmm(args[1]);
|
||||||
|
code->movss(MJitStateExtReg(reg), to_store);
|
||||||
|
} else {
|
||||||
|
Xbyak::Reg32 to_store = reg_alloc.UseGpr(args[1]).cvt32();
|
||||||
|
code->mov(MJitStateExtReg(reg), to_store);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitX64::EmitSetExtendedRegister64(RegAlloc& reg_alloc, IR::Block&, IR::Inst* inst) {
|
void EmitX64::EmitSetExtendedRegister64(RegAlloc& reg_alloc, IR::Block&, IR::Inst* inst) {
|
||||||
auto args = reg_alloc.GetArgumentInfo(inst);
|
auto args = reg_alloc.GetArgumentInfo(inst);
|
||||||
Arm::ExtReg reg = inst->GetArg(0).GetExtRegRef();
|
Arm::ExtReg reg = inst->GetArg(0).GetExtRegRef();
|
||||||
ASSERT(Arm::IsDoubleExtReg(reg));
|
ASSERT(Arm::IsDoubleExtReg(reg));
|
||||||
Xbyak::Xmm source = reg_alloc.UseXmm(args[1]);
|
if (args[1].IsInXmm()) {
|
||||||
code->movsd(MJitStateExtReg(reg), source);
|
Xbyak::Xmm to_store = reg_alloc.UseXmm(args[1]);
|
||||||
|
code->movsd(MJitStateExtReg(reg), to_store);
|
||||||
|
} else {
|
||||||
|
Xbyak::Reg64 to_store = reg_alloc.UseGpr(args[1]);
|
||||||
|
code->mov(MJitStateExtReg(reg), to_store);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmitX64::EmitGetCpsr(RegAlloc& reg_alloc, IR::Block&, IR::Inst* inst) {
|
void EmitX64::EmitGetCpsr(RegAlloc& reg_alloc, IR::Block&, IR::Inst* inst) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user