that seems like a good enough improvement. I think looking onto other sysvals would be worthwhile as SV_CLOCK isn't used that often. The invocation ID and related ones would be interesting to look into as they are much more common.
On Tue, Jul 17, 2018 at 1:59 PM, Rhys Perry <pendingchao...@gmail.com> wrote: > I'm getting ~28 cycles for the S2R and ~6 cycles (unsurprisingly) for the > CS2R. > > nvcc with SM30 seems to use the same instruction as the nvc0 emission code. > > The SV_LANE* system values don't work with CS2R and I haven't looked > too deeply into the others. > > On Tue, Jul 17, 2018 at 12:13 PM, Karol Herbst <kher...@redhat.com> wrote: >> interesting, do you have some numbers on that? Wondering if we could >> switch more sysvals over to it and what about older gens? >> >> On Tue, Jul 17, 2018 at 12:46 PM, Rhys Perry <pendingchao...@gmail.com> >> wrote: >>> This instruction seems to be faster than S2R and requires no barrier, >>> though the range of special registers it can read from is limited. >>> >>> Signed-off-by: Rhys Perry <pendingchao...@gmail.com> >>> --- >>> src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp | 14 >>> +++++++++++++- >>> .../drivers/nouveau/codegen/nv50_ir_target_gm107.cpp | 4 +++- >>> 2 files changed, 16 insertions(+), 2 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 694d1b10a3..c306a4680b 100644 >>> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp >>> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp >>> @@ -124,6 +124,7 @@ private: >>> >>> void emitMOV(); >>> void emitS2R(); >>> + void emitCS2R(); >>> void emitF2F(); >>> void emitF2I(); >>> void emitI2F(); >>> @@ -749,6 +750,14 @@ CodeEmitterGM107::emitS2R() >>> emitGPR (0x00, insn->def(0)); >>> } >>> >>> +void >>> +CodeEmitterGM107::emitCS2R() >>> +{ >>> + emitInsn(0x50c80000); >>> + emitSYS (0x14, insn->src(0)); >>> + emitGPR (0x00, insn->def(0)); >>> +} >>> + >>> void >>> CodeEmitterGM107::emitF2F() >>> { >>> @@ -3192,7 +3201,10 @@ CodeEmitterGM107::emitInstruction(Instruction *i) >>> emitMOV(); >>> break; >>> case OP_RDSV: >>> - emitS2R(); >>> + if (insn->getSrc(0)->reg.data.id == SV_CLOCK) >>> + emitCS2R(); >>> + else >>> + emitS2R(); >>> break; >>> case OP_ABS: >>> case OP_NEG: >>> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_gm107.cpp >>> b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_gm107.cpp >>> index 04cbd402a1..009470fb93 100644 >>> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_target_gm107.cpp >>> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_target_gm107.cpp >>> @@ -153,9 +153,10 @@ TargetGM107::isBarrierRequired(const Instruction >>> *insn) const >>> case OP_AFETCH: >>> case OP_PFETCH: >>> case OP_PIXLD: >>> - case OP_RDSV: >>> case OP_SHFL: >>> return true; >>> + case OP_RDSV: >>> + return insn->getSrc(0)->reg.data.id != SV_CLOCK; >>> default: >>> break; >>> } >>> @@ -229,6 +230,7 @@ TargetGM107::getLatency(const Instruction *insn) const >>> case OP_SUB: >>> case OP_VOTE: >>> case OP_XOR: >>> + case OP_RDSV: >>> if (insn->dType != TYPE_F64) >>> return 6; >>> break; >>> -- >>> 2.14.4 >>> _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev