Signed-off-by: Karol Herbst <karolher...@gmail.com> --- .../drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp | 32 ++++++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-)
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp index 3fedafd..d084e07 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp @@ -1306,7 +1306,7 @@ CodeEmitterGM107::emitFMUL() void CodeEmitterGM107::emitFFMA() { - /*XXX: ffma32i exists, but not using it as third src overlaps dst */ + bool isLongIMMD = false; switch(insn->src(2).getFile()) { case FILE_GPR: switch (insn->src(1).getFile()) { @@ -1319,14 +1319,21 @@ CodeEmitterGM107::emitFFMA() emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); break; case FILE_IMMEDIATE: - emitInsn(0x32800000); - emitIMMD(0x14, 19, insn->src(1)); + if (longIMMD(insn->getSrc(1))) { + isLongIMMD = true; + emitInsn(0x0c000000); + emitIMMD(0x14, 32, insn->src(1)); + } else { + emitInsn(0x32800000); + emitIMMD(0x14, 19, insn->src(1)); + } break; default: assert(!"bad src1 file"); break; } - emitGPR (0x27, insn->src(2)); + if (!isLongIMMD) + emitGPR (0x27, insn->src(2)); break; case FILE_MEMORY_CONST: emitInsn(0x51800000); @@ -1337,12 +1344,19 @@ CodeEmitterGM107::emitFFMA() assert(!"bad src2 file"); break; } - emitRND (0x33); - emitSAT (0x32); - emitNEG (0x31, insn->src(2)); - emitNEG2(0x30, insn->src(0), insn->src(1)); - emitCC (0x2f); + if (isLongIMMD) { + emitCC (0x34); + emitSAT (0x37); + emitNEG2(0x38, insn->src(0), insn->src(1)); + emitNEG (0x39, insn->src(2)); + } else { + emitCC (0x2f); + emitNEG2(0x30, insn->src(0), insn->src(1)); + emitNEG (0x31, insn->src(2)); + emitSAT (0x32); + } + emitRND(0x33); emitFMZ(0x35, 2); emitGPR(0x08, insn->src(0)); emitGPR(0x00, insn->def(0)); -- 2.10.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev