[Mesa-dev] [PATCH 5/9] nvc0/ir: Allow 0/1 immediate value as source of OP_VOTE
Samuel Pitoiset
samuel.pitoiset at gmail.com
Sat Apr 8 12:27:57 UTC 2017
On 04/08/2017 11:51 AM, Boyan Ding wrote:
> Implementation of readFirstInvocationARB() on nvidia hardware needs a
> ballotARB(true) used to decide the first active thread. This expressed
> in gm107 asm as (supposing output is $r0):
> vote any $r0 0x1 0x1
>
> To model the always true input, which corresponds to the second 0x1
> above, we make OP_VOTE accept immediate value 0/1 and emit "0x1" and
> "not 0x1" in the src field respectively.
> ---
> .../drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp | 21 +++++++++++++++++----
> .../drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp | 19 ++++++++++++++++---
> .../drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp | 21 +++++++++++++++++----
> 3 files changed, 50 insertions(+), 11 deletions(-)
>
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp
> index e82e3684b0..31af6dcc17 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp
> @@ -1615,7 +1615,7 @@ CodeEmitterGK110::emitSHFL(const Instruction *i)
> void
> CodeEmitterGK110::emitVOTE(const Instruction *i)
> {
> - assert(i->src(0).getFile() == FILE_PREDICATE);
> + uint32_t imm;
>
> code[0] = 0x00000002;
> code[1] = 0x86c00000 | (i->subOp << 19);
> @@ -1640,9 +1640,22 @@ CodeEmitterGK110::emitVOTE(const Instruction *i)
> code[0] |= 255 << 2;
> if (!(rp & 2))
> code[1] |= 7 << 16;
> - if (i->src(0).mod == Modifier(NV50_IR_MOD_NOT))
> - code[1] |= 1 << 13;
> - srcId(i->src(0), 42);
> +
> + switch (i->src(0).getFile()) {
> + case FILE_PREDICATE:
> + if (i->src(0).mod == Modifier(NV50_IR_MOD_NOT))
> + code[0] |= 1 << 13;
> + srcId(i->src(0), 42);
> + break;
> + case FILE_IMMEDIATE:
> + imm = i->src(0).get()->asImm()->reg.data.u32;
Usually we check that asImm() is not NULL, like
imm = i->src(0).get->asImm();
assert(imm);
Same in other emitters.
> + assert(imm == 0 || imm == 1);
> + code[1] |= (imm == 1 ? 0x7 : 0xf) << 10;
> + break;
> + default:
> + assert(!"Unhandled src");
> + break;
> + }
> }
>
> void
> 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 4a741bf45b..ee1046fea0 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
> @@ -2930,7 +2930,7 @@ CodeEmitterGM107::emitMEMBAR()
> void
> CodeEmitterGM107::emitVOTE()
> {
> - assert(insn->src(0).getFile() == FILE_PREDICATE);
> + uint32_t imm;
>
> int r = -1, p = -1;
> for (int i = 0; insn->defExists(i); i++) {
> @@ -2950,8 +2950,21 @@ CodeEmitterGM107::emitVOTE()
> 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));
> +
> + switch (insn->src(0).getFile()) {
> + case FILE_PREDICATE:
> + emitField(0x2a, 1, insn->src(0).mod == Modifier(NV50_IR_MOD_NOT));
> + emitPRED (0x27, insn->src(0));
> + break;
> + case FILE_IMMEDIATE:
> + imm = insn->src(0).get()->asImm()->reg.data.u32;
> + assert(imm == 0 || imm == 1);
> + emitField(0x27, 4, imm == 1 ? 0x7 : 0xf);
> + break;
> + default:
> + assert(!"Unhandled src");
> + break;
> + }
> }
>
> void
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp
> index 8dd73bd77d..fafb65743e 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp
> @@ -2579,7 +2579,7 @@ CodeEmitterNVC0::emitSHFL(const Instruction *i)
> void
> CodeEmitterNVC0::emitVOTE(const Instruction *i)
> {
> - assert(i->src(0).getFile() == FILE_PREDICATE);
> + uint32_t imm;
>
> code[0] = 0x00000004 | (i->subOp << 5);
> code[1] = 0x48000000;
> @@ -2604,9 +2604,22 @@ CodeEmitterNVC0::emitVOTE(const Instruction *i)
> code[0] |= 63 << 14;
> if (!(rp & 2))
> code[1] |= 7 << 22;
> - if (i->src(0).mod == Modifier(NV50_IR_MOD_NOT))
> - code[0] |= 1 << 23;
> - srcId(i->src(0), 20);
> +
> + switch (i->src(0).getFile()) {
> + case FILE_PREDICATE:
> + if (i->src(0).mod == Modifier(NV50_IR_MOD_NOT))
> + code[0] |= 1 << 23;
> + srcId(i->src(0), 20);
> + break;
> + case FILE_IMMEDIATE:
> + imm = i->src(0).get()->asImm()->reg.data.u32;
> + assert(imm == 0 || imm == 1);
> + code[0] |= (imm == 1 ? 0x7 : 0xf) << 20;
> + break;
> + default:
> + assert(!"Unhandled src");
> + break;
> + }
> }
>
> bool
>
More information about the mesa-dev
mailing list