Add support for the MAD opcode
This commit is contained in:
parent
e47de22f60
commit
f5e312392b
@ -28,4 +28,6 @@ enum
|
|||||||
|
|
||||||
MAESTRO_CMP = 0x2E,
|
MAESTRO_CMP = 0x2E,
|
||||||
MAESTRO_CMP2, // ???
|
MAESTRO_CMP2, // ???
|
||||||
|
|
||||||
|
MAESTRO_MAD = 0x38, // only the upper 3 bits are used for the opcode
|
||||||
};
|
};
|
||||||
|
@ -29,16 +29,17 @@ enum
|
|||||||
|
|
||||||
#define SWIZZLE_COMP(n,v) ((v) << (6-(n)*2))
|
#define SWIZZLE_COMP(n,v) ((v) << (6-(n)*2))
|
||||||
#define OPSRC_MAKE(neg, sw) ((neg) | ((sw) << 1))
|
#define OPSRC_MAKE(neg, sw) ((neg) | ((sw) << 1))
|
||||||
#define OPDESC_MAKE(out, src1, src2) ((out) | ((src1) << 4) | ((src2) << (4+9)))
|
#define OPDESC_MAKE(out, src1, src2, src3) ((out) | ((src1) << 4) | ((src2) << (4+9)) | ((src3) << (4+9*2)))
|
||||||
#define FMT_OPCODE(n) ((n)<<26)
|
#define FMT_OPCODE(n) ((n)<<26)
|
||||||
#define OUTPUT_MAKE(i, reg, mask) ((i) | ((reg)<<16) | ((u64)(mask)<<32))
|
#define OUTPUT_MAKE(i, reg, mask) ((i) | ((reg)<<16) | ((u64)(mask)<<32))
|
||||||
|
|
||||||
#define DEFAULT_SWIZZLE (SWIZZLE_COMP(0,COMP_X) | SWIZZLE_COMP(1,COMP_Y) | SWIZZLE_COMP(2,COMP_Z) | SWIZZLE_COMP(3,COMP_W))
|
#define DEFAULT_SWIZZLE (SWIZZLE_COMP(0,COMP_X) | SWIZZLE_COMP(1,COMP_Y) | SWIZZLE_COMP(2,COMP_Z) | SWIZZLE_COMP(3,COMP_W))
|
||||||
#define DEFAULT_OPSRC OPSRC_MAKE(0, DEFAULT_SWIZZLE)
|
#define DEFAULT_OPSRC OPSRC_MAKE(0, DEFAULT_SWIZZLE)
|
||||||
|
|
||||||
#define OPDESC_MASK_ALL OPDESC_MAKE(0xF, 0x1FF, 0x1FF)
|
#define OPDESC_MASK_D123 OPDESC_MAKE(0xF, 0x1FF, 0x1FF, 0x1FF)
|
||||||
#define OPDESC_MASK_NOSRC2 OPDESC_MAKE(0xF, 0x1FF, 0)
|
#define OPDESC_MASK_D12 OPDESC_MAKE(0xF, 0x1FF, 0x1FF, 0)
|
||||||
#define OPDESC_MASK_ONLYSRC1 OPDESC_MAKE(0, 0x1FF, 0)
|
#define OPDESC_MASK_D1 OPDESC_MAKE(0xF, 0x1FF, 0, 0)
|
||||||
|
#define OPDESC_MASK_1 OPDESC_MAKE(0, 0x1FF, 0, 0)
|
||||||
|
|
||||||
extern std::vector<u32> g_outputBuf;
|
extern std::vector<u32> g_outputBuf;
|
||||||
|
|
||||||
|
@ -352,7 +352,7 @@ static int maskFromSwizzling(int sw)
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int findOrAddOpdesc(int& out, int opdesc, int mask = OPDESC_MASK_ALL)
|
static int findOrAddOpdesc(int& out, int opdesc, int mask)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < g_opdescCount; i ++)
|
for (int i = 0; i < g_opdescCount; i ++)
|
||||||
{
|
{
|
||||||
@ -478,7 +478,7 @@ DEF_COMMAND(format1)
|
|||||||
ARG_TO_SRC2_REG(rSrc2, src2Name);
|
ARG_TO_SRC2_REG(rSrc2, src2Name);
|
||||||
|
|
||||||
int opdesc = 0;
|
int opdesc = 0;
|
||||||
safe_call(findOrAddOpdesc(opdesc, OPDESC_MAKE(maskFromSwizzling(rDestSw), rSrc1Sw, rSrc2Sw)));
|
safe_call(findOrAddOpdesc(opdesc, OPDESC_MAKE(maskFromSwizzling(rDestSw), rSrc1Sw, rSrc2Sw, 0), OPDESC_MASK_D12));
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("%s:%02X d%02X, d%02X, d%02X (0x%X)\n", cmdName, opcode, rDest, rSrc1, rSrc2, opdesc);
|
printf("%s:%02X d%02X, d%02X, d%02X (0x%X)\n", cmdName, opcode, rDest, rSrc1, rSrc2, opdesc);
|
||||||
@ -498,7 +498,7 @@ DEF_COMMAND(format2)
|
|||||||
ARG_TO_SRC1_REG(rSrc1, src1Name);
|
ARG_TO_SRC1_REG(rSrc1, src1Name);
|
||||||
|
|
||||||
int opdesc = 0;
|
int opdesc = 0;
|
||||||
safe_call(findOrAddOpdesc(opdesc, OPDESC_MAKE(maskFromSwizzling(rDestSw), rSrc1Sw, 0), OPDESC_MASK_NOSRC2));
|
safe_call(findOrAddOpdesc(opdesc, OPDESC_MAKE(maskFromSwizzling(rDestSw), rSrc1Sw, 0, 0), OPDESC_MASK_D1));
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("%s:%02X d%02X, d%02X (0x%X)\n", cmdName, opcode, rDest, rSrc1, opdesc);
|
printf("%s:%02X d%02X, d%02X (0x%X)\n", cmdName, opcode, rDest, rSrc1, opdesc);
|
||||||
@ -508,6 +508,30 @@ DEF_COMMAND(format2)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEF_COMMAND(format3)
|
||||||
|
{
|
||||||
|
NEXT_ARG(destName);
|
||||||
|
NEXT_ARG(src1Name);
|
||||||
|
NEXT_ARG(src2Name);
|
||||||
|
NEXT_ARG(src3Name);
|
||||||
|
ENSURE_NO_MORE_ARGS();
|
||||||
|
|
||||||
|
ARG_TO_DEST_REG(rDest, destName);
|
||||||
|
ARG_TO_SRC1_REG(rSrc1, src1Name);
|
||||||
|
ARG_TO_SRC2_REG(rSrc2, src2Name);
|
||||||
|
ARG_TO_SRC1_REG(rSrc3, src3Name);
|
||||||
|
|
||||||
|
int opdesc = 0;
|
||||||
|
safe_call(findOrAddOpdesc(opdesc, OPDESC_MAKE(maskFromSwizzling(rDestSw), rSrc1Sw, rSrc2Sw, rSrc3Sw), OPDESC_MASK_D123));
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("%s:%02X d%02X, d%02X, d%02X, d%02X (0x%X)\n", cmdName, opcode, rDest, rSrc1, rSrc2, rSrc3, opdesc);
|
||||||
|
#endif
|
||||||
|
BUF.push_back(FMT_OPCODE(opcode) | opdesc | (rSrc2<<5) | (rSrc1<<10) | (rSrc3<<17) | (rDest<<24));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static const cmdTableType cmdTable[] =
|
static const cmdTableType cmdTable[] =
|
||||||
{
|
{
|
||||||
DEC_COMMAND(NOP, format0),
|
DEC_COMMAND(NOP, format0),
|
||||||
@ -524,6 +548,8 @@ static const cmdTableType cmdTable[] =
|
|||||||
DEC_COMMAND(RSQ, format2),
|
DEC_COMMAND(RSQ, format2),
|
||||||
DEC_COMMAND(MOV, format2),
|
DEC_COMMAND(MOV, format2),
|
||||||
|
|
||||||
|
DEC_COMMAND(MAD, format3),
|
||||||
|
|
||||||
{ nullptr, nullptr },
|
{ nullptr, nullptr },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user