mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
jit-ir: Correct vx2i with partial overlap.
This commit is contained in:
parent
b5b94f4a4d
commit
b1c7f3dd3f
1 changed files with 24 additions and 5 deletions
|
@ -85,10 +85,28 @@ namespace MIPSComp {
|
|||
return true;
|
||||
}
|
||||
|
||||
static bool IsOverlapSafe(int dreg, int sn, u8 sregs[], int tn = 0, u8 tregs[] = NULL) {
|
||||
static bool IsOverlapSafeAllowS(int dn, u8 dregs[], int sn, u8 sregs[], int tn = 0, u8 tregs[] = nullptr) {
|
||||
for (int i = 0; i < dn; ++i) {
|
||||
if (!IsOverlapSafeAllowS(dregs[i], i, sn, sregs, tn, tregs)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool IsOverlapSafe(int dreg, int sn, u8 sregs[], int tn = 0, u8 tregs[] = nullptr) {
|
||||
return IsOverlapSafeAllowS(dreg, -1, sn, sregs, tn, tregs);
|
||||
}
|
||||
|
||||
static bool IsOverlapSafe(int dn, u8 dregs[], int sn, u8 sregs[], int tn = 0, u8 tregs[] = nullptr) {
|
||||
for (int i = 0; i < dn; ++i) {
|
||||
if (!IsOverlapSafe(dregs[i], sn, sregs, tn, tregs)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void IRFrontend::Comp_VPFX(MIPSOpcode op) {
|
||||
CONDITIONAL_DISABLE;
|
||||
int data = op & 0xFFFFF;
|
||||
|
@ -1495,15 +1513,16 @@ namespace MIPSComp {
|
|||
// Remap dest regs. PFX_T is unused.
|
||||
if (outsize == V_Pair) {
|
||||
bool consecutive = IsConsecutive2(dregs);
|
||||
for (int i = 0; i < 2; i++) {
|
||||
if (!consecutive || !IsOverlapSafe(dregs[i], nIn, srcregs)) {
|
||||
// We must have them consecutive, so all temps, or none.
|
||||
if (!consecutive || !IsOverlapSafe(nOut, dregs, nIn, srcregs)) {
|
||||
for (int i = 0; i < nOut; i++) {
|
||||
tempregs[i] = IRVTEMP_PFX_T + i;
|
||||
}
|
||||
}
|
||||
} else if (outsize == V_Quad) {
|
||||
bool consecutive = IsConsecutive4(dregs);
|
||||
for (int i = 0; i < 4; i++) {
|
||||
if (!consecutive || !IsOverlapSafe(dregs[i], nIn, srcregs)) {
|
||||
if (!consecutive || !IsOverlapSafe(nOut, dregs, nIn, srcregs)) {
|
||||
for (int i = 0; i < nOut; i++) {
|
||||
tempregs[i] = IRVTEMP_PFX_T + i;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue