Fix mad opdesc allocation errors by swapping out lower opdescs
This commit is contained in:
parent
caf06d4896
commit
346f761609
@ -16,6 +16,7 @@ int g_stackPos;
|
|||||||
int g_opdescTable[MAX_OPDESC];
|
int g_opdescTable[MAX_OPDESC];
|
||||||
int g_opdescCount;
|
int g_opdescCount;
|
||||||
int g_opdescMasks[MAX_OPDESC];
|
int g_opdescMasks[MAX_OPDESC];
|
||||||
|
u32 g_opdescIsMad;
|
||||||
|
|
||||||
Uniform g_uniformTable[MAX_UNIFORM];
|
Uniform g_uniformTable[MAX_UNIFORM];
|
||||||
int g_uniformCount;
|
int g_uniformCount;
|
||||||
@ -630,6 +631,26 @@ static int findOrAddOpdesc(int opcode, int& out, int opdesc, int mask)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void swapOpdesc(u32 from, u32 to)
|
||||||
|
{
|
||||||
|
std::swap(g_opdescTable[from], g_opdescTable[to]);
|
||||||
|
std::swap(g_opdescMasks[from], g_opdescMasks[to]);
|
||||||
|
for (size_t i = 0; i < BUF.size(); i ++)
|
||||||
|
{
|
||||||
|
u32& opword = BUF[i];
|
||||||
|
u32 opcode = opword>>26;
|
||||||
|
if (opcode < 0x20 || (opcode&~1)==MAESTRO_CMP)
|
||||||
|
{
|
||||||
|
u32 cur_opdesc = opword & 0x7F;
|
||||||
|
if (cur_opdesc==from)
|
||||||
|
cur_opdesc=to;
|
||||||
|
else if (cur_opdesc==to)
|
||||||
|
cur_opdesc=from;
|
||||||
|
opword = (opword &~ 0x7F) | cur_opdesc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool isregp(int x)
|
static inline bool isregp(int x)
|
||||||
{
|
{
|
||||||
x = tolower(x);
|
x = tolower(x);
|
||||||
@ -962,7 +983,18 @@ DEF_COMMAND(format5)
|
|||||||
safe_call(findOrAddOpdesc(opcode, opdesc, OPDESC_MAKE(maskFromSwizzling(rDestSw), rSrc1Sw, rSrc2Sw, rSrc3Sw), OPDESC_MASK_D123));
|
safe_call(findOrAddOpdesc(opcode, opdesc, OPDESC_MAKE(maskFromSwizzling(rDestSw), rSrc1Sw, rSrc2Sw, rSrc3Sw), OPDESC_MASK_D123));
|
||||||
|
|
||||||
if (opdesc >= 32)
|
if (opdesc >= 32)
|
||||||
return throwError("opdesc allocation error\n");
|
{
|
||||||
|
int which;
|
||||||
|
for (which; which < 32; which ++)
|
||||||
|
if (!(g_opdescIsMad & BIT(which)))
|
||||||
|
break;
|
||||||
|
if (which == 32)
|
||||||
|
return throwError("opdesc allocation error\n");
|
||||||
|
swapOpdesc(which, opdesc);
|
||||||
|
opdesc = which;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_opdescIsMad |= BIT(opdesc);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("%s:%02X d%02X, d%02X, d%02X, d%02X (0x%X)\n", cmdName, opcode, rDest, rSrc1, rSrc2, rSrc3, opdesc);
|
printf("%s:%02X d%02X, d%02X, d%02X, d%02X (0x%X)\n", cmdName, opcode, rDest, rSrc1, rSrc2, rSrc3, opdesc);
|
||||||
|
Loading…
Reference in New Issue
Block a user