mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-19 09:19:05 +02:00
Quick implementation of LV.Q and SV.Q in x86/x64 JIT
This commit is contained in:
1 parent
0930b5b587
commit
aabc0aa9ef
8 files changed
+190
-48
No files matched your search
@@ -56,6 +56,32 @@
|
||||
|
||||
namespace MIPSComp
|
||||
{
|
||||
|
||||
void Jit::SetR0ToEffectiveAddress(int rs, s16 offset) {
|
||||
Operand2 op2;
|
||||
if (offset) {
|
||||
bool negated;
|
||||
if (TryMakeOperand2_AllowNegation(offset, op2, &negated)) {
|
||||
if (!negated)
|
||||
ADD(R0, gpr.R(rs), op2);
|
||||
else
|
||||
SUB(R0, gpr.R(rs), op2);
|
||||
} else {
|
||||
// Try to avoid using MOVT
|
||||
if (offset < 0) {
|
||||
ARMABI_MOVI2R(R0, (u32)(-offset));
|
||||
SUB(R0, gpr.R(rs), R0);
|
||||
} else {
|
||||
ARMABI_MOVI2R(R0, (u32)offset);
|
||||
ADD(R0, gpr.R(rs), R0);
|
||||
}
|
||||
}
|
||||
BIC(R0, R0, Operand2(0xC0, 4)); // &= 0x3FFFFFFF
|
||||
} else {
|
||||
BIC(R0, gpr.R(rs), Operand2(0xC0, 4)); // &= 0x3FFFFFFF
|
||||
}
|
||||
}
|
||||
|
||||
void Jit::Comp_ITypeMem(u32 op)
|
||||
{
|
||||
int offset = (signed short)(op&0xFFFF);
|
||||
@@ -82,28 +108,7 @@ namespace MIPSComp
|
||||
ARMABI_MOVI2R(R0, addr);
|
||||
} else {
|
||||
gpr.MapDirtyIn(rt, rs);
|
||||
Operand2 op2;
|
||||
if (offset) {
|
||||
bool negated;
|
||||
if (TryMakeOperand2_AllowNegation(offset, op2, &negated)) {
|
||||
if (!negated)
|
||||
ADD(R0, gpr.R(rs), op2);
|
||||
else
|
||||
SUB(R0, gpr.R(rs), op2);
|
||||
} else {
|
||||
// Try to avoid using MOVT
|
||||
if (offset < 0) {
|
||||
ARMABI_MOVI2R(R0, (u32)(-offset));
|
||||
SUB(R0, gpr.R(rs), R0);
|
||||
} else {
|
||||
ARMABI_MOVI2R(R0, (u32)offset);
|
||||
ADD(R0, gpr.R(rs), R0);
|
||||
}
|
||||
}
|
||||
BIC(R0, R0, Operand2(0xC0, 4)); // &= 0x3FFFFFFF
|
||||
} else {
|
||||
BIC(R0, gpr.R(rs), Operand2(0xC0, 4)); // &= 0x3FFFFFFF
|
||||
}
|
||||
SetR0ToEffectiveAddress(rs, offset);
|
||||
}
|
||||
if (o == 35) {
|
||||
LDR(gpr.R(rt), R11, R0, true, true);
|
||||
@@ -131,28 +136,7 @@ namespace MIPSComp
|
||||
ARMABI_MOVI2R(R0, addr);
|
||||
} else {
|
||||
gpr.MapInIn(rt, rs);
|
||||
Operand2 op2;
|
||||
if (offset) {
|
||||
bool negated;
|
||||
if (TryMakeOperand2_AllowNegation(offset, op2, &negated)) {
|
||||
if (!negated)
|
||||
ADD(R0, gpr.R(rs), op2);
|
||||
else
|
||||
SUB(R0, gpr.R(rs), op2);
|
||||
} else {
|
||||
// Try to avoid using MOVT
|
||||
if (offset < 0) {
|
||||
ARMABI_MOVI2R(R0, (u32)(-offset));
|
||||
SUB(R0, gpr.R(rs), R0);
|
||||
} else {
|
||||
ARMABI_MOVI2R(R0, (u32)offset);
|
||||
ADD(R0, gpr.R(rs), R0);
|
||||
}
|
||||
}
|
||||
BIC(R0, R0, Operand2(0xC0, 4)); // &= 0x3FFFFFFF
|
||||
} else {
|
||||
BIC(R0, gpr.R(rs), Operand2(0xC0, 4)); // &= 0x3FFFFFFF
|
||||
}
|
||||
SetR0ToEffectiveAddress(rs, offset);
|
||||
}
|
||||
if (o == 43) {
|
||||
STR(R0, gpr.R(rt), R11, true, true);
|
||||
|
||||
Reference in new issue
Block a user