summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
diff options
context:
space:
mode:
authorIlia Mirkin <imirkin@alum.mit.edu>2016-05-29 12:42:49 -0400
committerIlia Mirkin <imirkin@alum.mit.edu>2016-06-06 20:49:29 -0400
commit704bc0f0e98f3bbdef33cad12646d4e1bf01e8aa (patch)
treeecac8a3b25184756337e8409eeedcc8a160c1eb7 /src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
parentf64c36e2d7cdf14a43cde7963729a926e613dc4c (diff)
nvc0: add support for VOTE tgsi opcodes
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
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));
}