[Mesa-dev] [PATCH] nv50/ir: restore OP_SELP to be a regular instruction
Ilia Mirkin
imirkin at alum.mit.edu
Sun Feb 21 22:21:48 UTC 2016
Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>
Thanks for taking care of it!
On Sun, Feb 21, 2016 at 1:40 PM, Samuel Pitoiset
<samuel.pitoiset at gmail.com> wrote:
> Actually OP_SELP doesn't need to be a compare instruction. Instead we
> just need to set the NOT modifier when building the instruction.
> While we are at it, fix the dst register type and use a GPR.
>
> Suggested by Ilia Mirkin.
>
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
> src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp | 8 ++++----
> src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp | 8 ++++----
> src/gallium/drivers/nouveau/codegen/nv50_ir_inlines.h | 4 ++--
> src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp | 8 ++++----
> 4 files changed, 14 insertions(+), 14 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 8268e08..a78b3f9 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp
> @@ -112,7 +112,7 @@ private:
>
> void emitSET(const CmpInstruction *);
> void emitSLCT(const CmpInstruction *);
> - void emitSELP(const CmpInstruction *);
> + void emitSELP(const Instruction *);
>
> void emitTEXBAR(const Instruction *);
> void emitTEX(const TexInstruction *);
> @@ -1045,11 +1045,11 @@ CodeEmitterGK110::emitSLCT(const CmpInstruction *i)
> }
> }
>
> -void CodeEmitterGK110::emitSELP(const CmpInstruction *i)
> +void CodeEmitterGK110::emitSELP(const Instruction *i)
> {
> emitForm_21(i, 0x250, 0x050);
>
> - if ((i->setCond == CC_NOT_P) ^ (bool)(i->src(2).mod & Modifier(NV50_IR_MOD_NOT)))
> + if (i->src(2).mod & Modifier(NV50_IR_MOD_NOT))
> code[1] |= 1 << 13;
> }
>
> @@ -1937,7 +1937,7 @@ CodeEmitterGK110::emitInstruction(Instruction *insn)
> emitSET(insn->asCmp());
> break;
> case OP_SELP:
> - emitSELP(insn->asCmp());
> + emitSELP(insn);
> break;
> case OP_SLCT:
> emitSLCT(insn->asCmp());
> 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 d588d7e..65fcd64 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp
> @@ -120,7 +120,7 @@ private:
>
> void emitSET(const CmpInstruction *);
> void emitSLCT(const CmpInstruction *);
> - void emitSELP(const CmpInstruction *);
> + void emitSELP(const Instruction *);
>
> void emitTEXBAR(const Instruction *);
> void emitTEX(const TexInstruction *);
> @@ -1175,11 +1175,11 @@ CodeEmitterNVC0::emitSLCT(const CmpInstruction *i)
> code[0] |= 1 << 5;
> }
>
> -void CodeEmitterNVC0::emitSELP(const CmpInstruction *i)
> +void CodeEmitterNVC0::emitSELP(const Instruction *i)
> {
> emitForm_A(i, HEX64(20000000, 00000004));
>
> - if (i->setCond == CC_NOT_P || i->src(2).mod & Modifier(NV50_IR_MOD_NOT))
> + if (i->src(2).mod & Modifier(NV50_IR_MOD_NOT))
> code[1] |= 1 << 20;
> }
>
> @@ -2438,7 +2438,7 @@ CodeEmitterNVC0::emitInstruction(Instruction *insn)
> emitSET(insn->asCmp());
> break;
> case OP_SELP:
> - emitSELP(insn->asCmp());
> + emitSELP(insn);
> break;
> case OP_SLCT:
> emitSLCT(insn->asCmp());
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_inlines.h b/src/gallium/drivers/nouveau/codegen/nv50_ir_inlines.h
> index 02e6157..e465f24 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_inlines.h
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_inlines.h
> @@ -281,14 +281,14 @@ Value *TexInstruction::getIndirectS() const
>
> CmpInstruction *Instruction::asCmp()
> {
> - if (op >= OP_SET_AND && op <= OP_SLCT)
> + if (op >= OP_SET_AND && op <= OP_SLCT && op != OP_SELP)
> return static_cast<CmpInstruction *>(this);
> return NULL;
> }
>
> const CmpInstruction *Instruction::asCmp() const
> {
> - if (op >= OP_SET_AND && op <= OP_SLCT)
> + if (op >= OP_SET_AND && op <= OP_SLCT && op != OP_SELP)
> return static_cast<const CmpInstruction *>(this);
> return NULL;
> }
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
> index 21a6f1e..d181f15 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
> @@ -1067,10 +1067,10 @@ NVC0LoweringPass::handleSharedATOM(Instruction *atom)
> TYPE_U32, ld->getDef(0), atom->getSrc(1));
> set->setPredicate(CC_P, ld->getDef(1));
>
> - CmpInstruction *selp =
> - bld.mkCmp(OP_SELP, CC_NOT_P, TYPE_U32, bld.getSSA(4, FILE_ADDRESS),
> - TYPE_U32, ld->getDef(0), atom->getSrc(2),
> - set->getDef(0));
> + Instruction *selp =
> + bld.mkOp3(OP_SELP, TYPE_U32, bld.getSSA(), ld->getDef(0),
> + atom->getSrc(2), set->getDef(0));
> + selp->src(2).mod = Modifier(NV50_IR_MOD_NOT);
> selp->setPredicate(CC_P, ld->getDef(1));
>
> stVal = selp->getDef(0);
> --
> 2.6.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list