|
|
|
|
@@ -33,48 +33,48 @@ void Registers::SetPC32(s32 val) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) u64 Registers::Read<u64>(size_t idx) {
|
|
|
|
|
u64 Registers::Read<u64>(size_t idx) {
|
|
|
|
|
return gpr[idx];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) s64 Registers::Read<s64>(const size_t idx) {
|
|
|
|
|
s64 Registers::Read<s64>(const size_t idx) {
|
|
|
|
|
return static_cast<s64>(Read<u64>(idx));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) u32 Registers::Read<u32>(size_t idx) {
|
|
|
|
|
u32 Registers::Read<u32>(size_t idx) {
|
|
|
|
|
return gpr[idx];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) s32 Registers::Read<s32>(size_t idx) {
|
|
|
|
|
s32 Registers::Read<s32>(size_t idx) {
|
|
|
|
|
return static_cast<s32>(Read<u32>(idx));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) u16 Registers::Read<u16>(size_t idx) {
|
|
|
|
|
u16 Registers::Read<u16>(size_t idx) {
|
|
|
|
|
return gpr[idx];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) s16 Registers::Read<s16>(size_t idx) {
|
|
|
|
|
s16 Registers::Read<s16>(size_t idx) {
|
|
|
|
|
return static_cast<s16>(Read<u16>(idx));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) u8 Registers::Read<u8>(size_t idx) {
|
|
|
|
|
u8 Registers::Read<u8>(size_t idx) {
|
|
|
|
|
return gpr[idx];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) s8 Registers::Read<s8>(size_t idx) {
|
|
|
|
|
s8 Registers::Read<s8>(size_t idx) {
|
|
|
|
|
return static_cast<s8>(Read<u8>(idx));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifndef __aarch64__
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Read<u64>(size_t idx, Xbyak::Reg reg) {
|
|
|
|
|
void Registers::Read<u64>(size_t idx, Xbyak::Reg reg) {
|
|
|
|
|
if(IsRegConstant(idx)) {
|
|
|
|
|
jit->code.mov(reg.cvt64(), Read<u64>(idx));
|
|
|
|
|
return;
|
|
|
|
|
@@ -84,7 +84,7 @@ __attribute__((always_inline)) void Registers::Read<u64>(size_t idx, Xbyak::Reg
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Read<s64>(size_t idx, Xbyak::Reg reg) {
|
|
|
|
|
void Registers::Read<s64>(size_t idx, Xbyak::Reg reg) {
|
|
|
|
|
if(IsRegConstant(idx)) {
|
|
|
|
|
jit->code.mov(reg.cvt64(), Read<s64>(idx));
|
|
|
|
|
return;
|
|
|
|
|
@@ -94,7 +94,7 @@ __attribute__((always_inline)) void Registers::Read<s64>(size_t idx, Xbyak::Reg
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Read<u32>(size_t idx, Xbyak::Reg reg) {
|
|
|
|
|
void Registers::Read<u32>(size_t idx, Xbyak::Reg reg) {
|
|
|
|
|
if(IsRegConstant(idx)) {
|
|
|
|
|
jit->code.mov(reg.cvt32(), Read<u32>(idx));
|
|
|
|
|
return;
|
|
|
|
|
@@ -104,7 +104,7 @@ __attribute__((always_inline)) void Registers::Read<u32>(size_t idx, Xbyak::Reg
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Read<s32>(size_t idx, Xbyak::Reg reg) {
|
|
|
|
|
void Registers::Read<s32>(size_t idx, Xbyak::Reg reg) {
|
|
|
|
|
if(IsRegConstant(idx)) {
|
|
|
|
|
jit->code.mov(reg.cvt32(), Read<s32>(idx));
|
|
|
|
|
return;
|
|
|
|
|
@@ -114,7 +114,7 @@ __attribute__((always_inline)) void Registers::Read<s32>(size_t idx, Xbyak::Reg
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Read<u16>(size_t idx, Xbyak::Reg reg) {
|
|
|
|
|
void Registers::Read<u16>(size_t idx, Xbyak::Reg reg) {
|
|
|
|
|
if(IsRegConstant(idx)) {
|
|
|
|
|
jit->code.mov(reg.cvt16(), Read<u16>(idx));
|
|
|
|
|
return;
|
|
|
|
|
@@ -124,7 +124,7 @@ __attribute__((always_inline)) void Registers::Read<u16>(size_t idx, Xbyak::Reg
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Read<s16>(size_t idx, Xbyak::Reg reg) {
|
|
|
|
|
void Registers::Read<s16>(size_t idx, Xbyak::Reg reg) {
|
|
|
|
|
if(IsRegConstant(idx)) {
|
|
|
|
|
jit->code.mov(reg.cvt16(), Read<s16>(idx));
|
|
|
|
|
return;
|
|
|
|
|
@@ -134,7 +134,7 @@ __attribute__((always_inline)) void Registers::Read<s16>(size_t idx, Xbyak::Reg
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Read<u8>(size_t idx, Xbyak::Reg reg) {
|
|
|
|
|
void Registers::Read<u8>(size_t idx, Xbyak::Reg reg) {
|
|
|
|
|
if(IsRegConstant(idx)) {
|
|
|
|
|
jit->code.mov(reg.cvt8(), Read<u8>(idx));
|
|
|
|
|
return;
|
|
|
|
|
@@ -144,7 +144,7 @@ __attribute__((always_inline)) void Registers::Read<u8>(size_t idx, Xbyak::Reg r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Read<s8>(size_t idx, Xbyak::Reg reg) {
|
|
|
|
|
void Registers::Read<s8>(size_t idx, Xbyak::Reg reg) {
|
|
|
|
|
if(IsRegConstant(idx)) {
|
|
|
|
|
jit->code.mov(reg.cvt8(), Read<s8>(idx));
|
|
|
|
|
return;
|
|
|
|
|
@@ -155,7 +155,7 @@ __attribute__((always_inline)) void Registers::Read<s8>(size_t idx, Xbyak::Reg r
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Write<bool>(size_t idx, bool v) {
|
|
|
|
|
void Registers::Write<bool>(size_t idx, bool v) {
|
|
|
|
|
if (idx == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
@@ -166,7 +166,7 @@ __attribute__((always_inline)) void Registers::Write<bool>(size_t idx, bool v) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Write<u64>(size_t idx, u64 v) {
|
|
|
|
|
void Registers::Write<u64>(size_t idx, u64 v) {
|
|
|
|
|
if (idx == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
@@ -176,12 +176,12 @@ __attribute__((always_inline)) void Registers::Write<u64>(size_t idx, u64 v) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Write<s64>(size_t idx, s64 v) {
|
|
|
|
|
void Registers::Write<s64>(size_t idx, s64 v) {
|
|
|
|
|
Write<u64>(idx, v);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Write<u32>(size_t idx, u32 v) {
|
|
|
|
|
void Registers::Write<u32>(size_t idx, u32 v) {
|
|
|
|
|
if (idx == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
@@ -192,7 +192,7 @@ __attribute__((always_inline)) void Registers::Write<u32>(size_t idx, u32 v) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Write<s32>(size_t idx, s32 v) {
|
|
|
|
|
void Registers::Write<s32>(size_t idx, s32 v) {
|
|
|
|
|
if (idx == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
@@ -202,7 +202,7 @@ __attribute__((always_inline)) void Registers::Write<s32>(size_t idx, s32 v) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Write<u16>(size_t idx, u16 v) {
|
|
|
|
|
void Registers::Write<u16>(size_t idx, u16 v) {
|
|
|
|
|
if (idx == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
@@ -213,7 +213,7 @@ __attribute__((always_inline)) void Registers::Write<u16>(size_t idx, u16 v) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Write<s16>(size_t idx, s16 v) {
|
|
|
|
|
void Registers::Write<s16>(size_t idx, s16 v) {
|
|
|
|
|
if (idx == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
@@ -223,7 +223,7 @@ __attribute__((always_inline)) void Registers::Write<s16>(size_t idx, s16 v) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Write<u8>(size_t idx, u8 v) {
|
|
|
|
|
void Registers::Write<u8>(size_t idx, u8 v) {
|
|
|
|
|
if (idx == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
@@ -234,7 +234,7 @@ __attribute__((always_inline)) void Registers::Write<u8>(size_t idx, u8 v) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Write<s8>(size_t idx, s8 v) {
|
|
|
|
|
void Registers::Write<s8>(size_t idx, s8 v) {
|
|
|
|
|
if (idx == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
@@ -245,7 +245,7 @@ __attribute__((always_inline)) void Registers::Write<s8>(size_t idx, s8 v) {
|
|
|
|
|
|
|
|
|
|
#ifndef __aarch64__
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Write<bool>(size_t idx, Xbyak::Reg v) {
|
|
|
|
|
void Registers::Write<bool>(size_t idx, Xbyak::Reg v) {
|
|
|
|
|
if (idx == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
@@ -259,7 +259,7 @@ __attribute__((always_inline)) void Registers::Write<bool>(size_t idx, Xbyak::Re
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Write<s8>(size_t idx, Xbyak::Reg v) {
|
|
|
|
|
void Registers::Write<s8>(size_t idx, Xbyak::Reg v) {
|
|
|
|
|
if (idx == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
@@ -273,7 +273,7 @@ __attribute__((always_inline)) void Registers::Write<s8>(size_t idx, Xbyak::Reg
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Write<u8>(size_t idx, Xbyak::Reg v) {
|
|
|
|
|
void Registers::Write<u8>(size_t idx, Xbyak::Reg v) {
|
|
|
|
|
if (idx == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
@@ -287,7 +287,7 @@ __attribute__((always_inline)) void Registers::Write<u8>(size_t idx, Xbyak::Reg
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Write<s16>(size_t idx, Xbyak::Reg v) {
|
|
|
|
|
void Registers::Write<s16>(size_t idx, Xbyak::Reg v) {
|
|
|
|
|
if (idx == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
@@ -301,7 +301,7 @@ __attribute__((always_inline)) void Registers::Write<s16>(size_t idx, Xbyak::Reg
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Write<u16>(size_t idx, Xbyak::Reg v) {
|
|
|
|
|
void Registers::Write<u16>(size_t idx, Xbyak::Reg v) {
|
|
|
|
|
if (idx == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
@@ -315,7 +315,7 @@ __attribute__((always_inline)) void Registers::Write<u16>(size_t idx, Xbyak::Reg
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Write<s32>(size_t idx, Xbyak::Reg v) {
|
|
|
|
|
void Registers::Write<s32>(size_t idx, Xbyak::Reg v) {
|
|
|
|
|
if (idx == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
@@ -329,7 +329,7 @@ __attribute__((always_inline)) void Registers::Write<s32>(size_t idx, Xbyak::Reg
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Write<u32>(size_t idx, Xbyak::Reg v) {
|
|
|
|
|
void Registers::Write<u32>(size_t idx, Xbyak::Reg v) {
|
|
|
|
|
if (idx == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
@@ -343,7 +343,7 @@ __attribute__((always_inline)) void Registers::Write<u32>(size_t idx, Xbyak::Reg
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Write<u64>(size_t idx, Xbyak::Reg v) {
|
|
|
|
|
void Registers::Write<u64>(size_t idx, Xbyak::Reg v) {
|
|
|
|
|
if (idx == 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
@@ -356,7 +356,7 @@ __attribute__((always_inline)) void Registers::Write<u64>(size_t idx, Xbyak::Reg
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <>
|
|
|
|
|
__attribute__((always_inline)) void Registers::Write<s64>(size_t idx, Xbyak::Reg v) {
|
|
|
|
|
void Registers::Write<s64>(size_t idx, Xbyak::Reg v) {
|
|
|
|
|
Write<u64>(idx, v);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|