Noticed this when looking at a trace that caused flags to spill to/from registers. The flags source/destination wasn't encoded correctly according to both envydis and nvdisasm.
Signed-off-by: Ilia Mirkin <[email protected]> --- Untested. Will try a few things before pushing this... hopefully it fixes some stubborn traces, but I'm not too hopeful. The TGSI program I happened to be looking at was from https://github.com/iXit/Mesa-3D/issues/160 (fallout new vegas). The bug in question is totally unrelated though, it was about spilling on fermi/kepler1. src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nv50.cpp | 5 +++-- src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nv50.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nv50.cpp index 0b52882..216e119 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nv50.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nv50.cpp @@ -756,10 +756,10 @@ CodeEmitterNV50::emitMOV(const Instruction *i) assert(sf == FILE_GPR || df == FILE_GPR); if (sf == FILE_FLAGS) { + assert(i->flagsSrc >= 0); code[0] = 0x00000001; code[1] = 0x20000000; defId(i->def(0), 2); - srcId(i->src(0), 12); emitFlagsRd(i); } else if (sf == FILE_ADDRESS) { @@ -770,11 +770,12 @@ CodeEmitterNV50::emitMOV(const Instruction *i) emitFlagsRd(i); } else if (df == FILE_FLAGS) { + assert(i->flagsDef >= 0); code[0] = 0x00000001; code[1] = 0xa0000000; - defId(i->def(0), 4); srcId(i->src(0), 9); emitFlagsRd(i); + emitFlagsWr(i); } else if (sf == FILE_IMMEDIATE) { code[0] = 0x10008001; diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp index 41d2cc9..d176f31 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_ra.cpp @@ -1599,6 +1599,8 @@ SpillCodeInserter::spill(Instruction *defi, Value *slot, LValue *lval) st = new_Instruction(func, OP_CVT, ty); st->setDef(0, slot); st->setSrc(0, lval); + if (lval->reg.file == FILE_FLAGS) + st->flagsSrc = 0; } defi->bb->insertAfter(defi, st); } @@ -1640,6 +1642,8 @@ SpillCodeInserter::unspill(Instruction *usei, LValue *lval, Value *slot) } ld->setDef(0, lval); ld->setSrc(0, slot); + if (lval->reg.file == FILE_FLAGS) + ld->flagsDef = 0; usei->bb->insertBefore(usei, ld); return lval; -- 2.4.10 _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
