gm107/ir: use CS2R for SV_CLOCK
authorRhys Perry <pendingchaos02@gmail.com>
Thu, 19 Jul 2018 15:58:46 +0000 (16:58 +0100)
committerKarol Herbst <kherbst@redhat.com>
Thu, 19 Jul 2018 21:34:58 +0000 (23:34 +0200)
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 <pendingchaos02@gmail.com>
Reviewed-by: Karol Herbst <kherbst@redhat.com>
src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
src/gallium/drivers/nouveau/codegen/nv50_ir_target_gm107.cpp
src/gallium/drivers/nouveau/codegen/nv50_ir_target_gm107.h

index 694d1b1..1d31f18 100644 (file)
@@ -124,6 +124,7 @@ private:
 
    void emitMOV();
    void emitS2R();
+   void emitCS2R();
    void emitF2F();
    void emitF2I();
    void emitI2F();
@@ -750,6 +751,14 @@ CodeEmitterGM107::emitS2R()
 }
 
 void
+CodeEmitterGM107::emitCS2R()
+{
+   emitInsn(0x50c80000);
+   emitSYS (0x14, insn->src(0));
+   emitGPR (0x00, insn->def(0));
+}
+
+void
 CodeEmitterGM107::emitF2F()
 {
    RoundMode rnd = insn->rnd;
@@ -3192,7 +3201,10 @@ CodeEmitterGM107::emitInstruction(Instruction *i)
       emitMOV();
       break;
    case OP_RDSV:
-      emitS2R();
+      if (targGM107->isCS2RSV(insn->getSrc(0)->reg.data.sv.sv))
+         emitCS2R();
+      else
+         emitS2R();
       break;
    case OP_ABS:
    case OP_NEG:
index 04cbd40..adbfcc3 100644 (file)
@@ -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 !isCS2RSV(insn->getSrc(0)->reg.data.sv.sv);
       default:
          break;
       }
@@ -232,6 +233,8 @@ TargetGM107::getLatency(const Instruction *insn) const
       if (insn->dType != TYPE_F64)
          return 6;
       break;
+   case OP_RDSV:
+      return isCS2RSV(insn->getSrc(0)->reg.data.sv.sv) ? 6 : 15;
    case OP_ABS:
    case OP_CEIL:
    case OP_CVT:
@@ -322,6 +325,12 @@ TargetGM107::getReadLatency(const Instruction *insn) const
 }
 
 bool
+TargetGM107::isCS2RSV(SVSemantic sv) const
+{
+   return sv == SV_CLOCK;
+}
+
+bool
 TargetGM107::runLegalizePass(Program *prog, CGStage stage) const
 {
    if (stage == CG_STAGE_PRE_SSA) {
index dd4aa6a..10f06d2 100644 (file)
@@ -23,6 +23,8 @@ public:
    virtual bool canDualIssue(const Instruction *, const Instruction *) const;
    virtual int getLatency(const Instruction *) const;
    virtual int getReadLatency(const Instruction *) const;
+
+   virtual bool isCS2RSV(SVSemantic) const;
 };
 
 } // namespace nv50_ir