nvir/gm107: implement OP_PERMT
PFETCH lowering will be changed to use this as it's more SM70-friendly, and this will also allow us to implement extract_byte/word opcodes. Signed-off-by: Ben Skeggs <bskeggs@redhat.com> Reviewed-by: Karol Herbst <kherbst@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5377>
This commit is contained in:
@@ -170,6 +170,7 @@ private:
|
|||||||
void emitBFI();
|
void emitBFI();
|
||||||
void emitBFE();
|
void emitBFE();
|
||||||
void emitFLO();
|
void emitFLO();
|
||||||
|
void emitPRMT();
|
||||||
|
|
||||||
void emitLDSTs(int, DataType);
|
void emitLDSTs(int, DataType);
|
||||||
void emitLDSTc(int);
|
void emitLDSTc(int);
|
||||||
@@ -2371,6 +2372,33 @@ CodeEmitterGM107::emitFLO()
|
|||||||
emitGPR (0x00, insn->def(0));
|
emitGPR (0x00, insn->def(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CodeEmitterGM107::emitPRMT()
|
||||||
|
{
|
||||||
|
switch (insn->src(1).getFile()) {
|
||||||
|
case FILE_GPR:
|
||||||
|
emitInsn(0x5bc00000);
|
||||||
|
emitGPR (0x14, insn->src(1));
|
||||||
|
break;
|
||||||
|
case FILE_MEMORY_CONST:
|
||||||
|
emitInsn(0x4bc00000);
|
||||||
|
emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
|
||||||
|
break;
|
||||||
|
case FILE_IMMEDIATE:
|
||||||
|
emitInsn(0x36c00000);
|
||||||
|
emitIMMD(0x14, 19, insn->src(1));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(!"bad src1 file");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
emitField(0x30, 3, insn->subOp);
|
||||||
|
emitGPR (0x27, insn->src(2));
|
||||||
|
emitGPR (0x08, insn->src(0));
|
||||||
|
emitGPR (0x00, insn->def(0));
|
||||||
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* memory
|
* memory
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
@@ -3537,6 +3565,9 @@ CodeEmitterGM107::emitInstruction(Instruction *i)
|
|||||||
case OP_BFIND:
|
case OP_BFIND:
|
||||||
emitFLO();
|
emitFLO();
|
||||||
break;
|
break;
|
||||||
|
case OP_PERMT:
|
||||||
|
emitPRMT();
|
||||||
|
break;
|
||||||
case OP_SLCT:
|
case OP_SLCT:
|
||||||
if (isFloatType(insn->dType))
|
if (isFloatType(insn->dType))
|
||||||
emitFCMP();
|
emitFCMP();
|
||||||
|
Reference in New Issue
Block a user