summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp')
-rw-r--r--src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp29
1 files changed, 16 insertions, 13 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 a43d7b1296a..ef02dbb4c63 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
@@ -2788,23 +2788,26 @@ CodeEmitterGM107::emitMEMBAR()
void
CodeEmitterGM107::emitVOTE()
{
- int subOp;
+ assert(insn->src(0).getFile() == FILE_PREDICATE);
- assert(insn->src(0).getFile() == FILE_PREDICATE &&
- insn->def(1).getFile() == FILE_PREDICATE);
-
- switch (insn->subOp) {
- case NV50_IR_SUBOP_VOTE_ANY: subOp = 1; break;
- default:
- assert(insn->subOp == NV50_IR_SUBOP_VOTE_ALL);
- subOp = 0;
- break;
+ int r = -1, p = -1;
+ for (int i = 0; insn->defExists(i); i++) {
+ if (insn->def(i).getFile() == FILE_GPR)
+ r = i;
+ else if (insn->def(i).getFile() == FILE_PREDICATE)
+ p = i;
}
emitInsn (0x50d80000);
- emitField(0x30, 2, subOp);
- emitGPR (0x00, insn->def(0));
- emitPRED (0x2d, insn->def(1));
+ emitField(0x30, 2, insn->subOp);
+ if (r >= 0)
+ emitGPR (0x00, insn->def(r));
+ else
+ emitGPR (0x00);
+ if (p >= 0)
+ emitPRED (0x2d, insn->def(p));
+ else
+ emitPRED (0x2d);
emitField(0x2a, 1, insn->src(0).mod == Modifier(NV50_IR_MOD_NOT));
emitPRED (0x27, insn->src(0));
}