[Beignet] [PATCH 1/5] Backend: Delete the useless MOV_DF instruction.

junyan.he at inbox.com junyan.he at inbox.com
Tue Oct 27 03:36:14 PDT 2015


From: Junyan He <junyan.he at linux.intel.com>

Because just platform after BDW will support double,
the special instruction for double MOV is not needed
anymore.

Signed-off-by: Junyan He <junyan.he at linux.intel.com>
---
 backend/src/backend/gen75_encoder.cpp      | 36 -------------------------
 backend/src/backend/gen75_encoder.hpp      |  1 -
 backend/src/backend/gen8_encoder.cpp       | 36 -------------------------
 backend/src/backend/gen8_encoder.hpp       |  1 -
 backend/src/backend/gen_context.cpp        |  3 ---
 backend/src/backend/gen_encoder.cpp        | 43 ------------------------------
 backend/src/backend/gen_encoder.hpp        |  2 --
 backend/src/backend/gen_insn_selection.cpp | 23 +---------------
 backend/src/backend/gen_insn_selection.hxx |  1 -
 9 files changed, 1 insertion(+), 145 deletions(-)

diff --git a/backend/src/backend/gen75_encoder.cpp b/backend/src/backend/gen75_encoder.cpp
index 135be02..5d1a964 100644
--- a/backend/src/backend/gen75_encoder.cpp
+++ b/backend/src/backend/gen75_encoder.cpp
@@ -251,42 +251,6 @@ namespace gbe
     pop();
   }
 
-  void Gen75Encoder::MOV_DF(GenRegister dest, GenRegister src0, GenRegister tmp) {
-    GBE_ASSERT((src0.type == GEN_TYPE_F && dest.isdf()) || (src0.isdf() && dest.type == GEN_TYPE_F));
-    GenRegister r = GenRegister::retype(tmp, GEN_TYPE_F);
-    int w = curr.execWidth;
-    GenRegister r0;
-    r0 = GenRegister::h2(r);
-    push();
-    curr.execWidth = 4;
-    curr.predicate = GEN_PREDICATE_NONE;
-    curr.noMask = 1;
-    MOV(r0, src0);
-    MOV(GenRegister::suboffset(r0, 4), GenRegister::suboffset(src0, 4));
-    curr.noMask = 0;
-    curr.quarterControl = 0;
-    curr.nibControl = 0;
-    MOV(dest, r0);
-    curr.nibControl = 1;
-    MOV(GenRegister::suboffset(dest, 4), GenRegister::suboffset(r0, 4));
-    pop();
-    if (w == 16) {
-      push();
-      curr.execWidth = 4;
-      curr.predicate = GEN_PREDICATE_NONE;
-      curr.noMask = 1;
-      MOV(r0, GenRegister::suboffset(src0, 8));
-      MOV(GenRegister::suboffset(r0, 4), GenRegister::suboffset(src0, 12));
-      curr.noMask = 0;
-      curr.quarterControl = 1;
-      curr.nibControl = 0;
-      MOV(GenRegister::suboffset(dest, 8), r0);
-      curr.nibControl = 1;
-      MOV(GenRegister::suboffset(dest, 12), GenRegister::suboffset(r0, 4));
-      pop();
-    }
-  }
-
   void Gen75Encoder::JMPI(GenRegister src, bool longjmp) {
     alu2(this, GEN_OPCODE_JMPI, GenRegister::ip(), GenRegister::ip(), src);
   }
diff --git a/backend/src/backend/gen75_encoder.hpp b/backend/src/backend/gen75_encoder.hpp
index e494f29..f5044c0 100644
--- a/backend/src/backend/gen75_encoder.hpp
+++ b/backend/src/backend/gen75_encoder.hpp
@@ -42,7 +42,6 @@ namespace gbe
     virtual void JMPI(GenRegister src, bool longjmp = false);
     /*! Patch JMPI/BRC/BRD (located at index insnID) with the given jump distance */
     virtual void patchJMPI(uint32_t insnID, int32_t jip, int32_t uip);
-    virtual void MOV_DF(GenRegister dest, GenRegister src0, GenRegister tmp = GenRegister::null());
     virtual void LOAD_DF_IMM(GenRegister dest, GenRegister tmp, double value);
     virtual void ATOMIC(GenRegister dst, uint32_t function, GenRegister src, GenRegister bti, uint32_t srcNum);
     virtual void UNTYPED_READ(GenRegister dst, GenRegister src, GenRegister bti, uint32_t elemNum);
diff --git a/backend/src/backend/gen8_encoder.cpp b/backend/src/backend/gen8_encoder.cpp
index 55fc3fb..98c3917 100644
--- a/backend/src/backend/gen8_encoder.cpp
+++ b/backend/src/backend/gen8_encoder.cpp
@@ -260,42 +260,6 @@ namespace gbe
     MOV(dest, value);
   }
 
-  void Gen8Encoder::MOV_DF(GenRegister dest, GenRegister src0, GenRegister tmp) {
-    GBE_ASSERT((src0.type == GEN_TYPE_F && dest.isdf()) || (src0.isdf() && dest.type == GEN_TYPE_F));
-    GenRegister r = GenRegister::retype(tmp, GEN_TYPE_F);
-    int w = curr.execWidth;
-    GenRegister r0;
-    r0 = GenRegister::h2(r);
-    push();
-    curr.execWidth = 4;
-    curr.predicate = GEN_PREDICATE_NONE;
-    curr.noMask = 1;
-    MOV(r0, src0);
-    MOV(GenRegister::suboffset(r0, 4), GenRegister::suboffset(src0, 4));
-    curr.noMask = 0;
-    curr.quarterControl = 0;
-    curr.nibControl = 0;
-    MOV(dest, r0);
-    curr.nibControl = 1;
-    MOV(GenRegister::suboffset(dest, 4), GenRegister::suboffset(r0, 4));
-    pop();
-    if (w == 16) {
-      push();
-      curr.execWidth = 4;
-      curr.predicate = GEN_PREDICATE_NONE;
-      curr.noMask = 1;
-      MOV(r0, GenRegister::suboffset(src0, 8));
-      MOV(GenRegister::suboffset(r0, 4), GenRegister::suboffset(src0, 12));
-      curr.noMask = 0;
-      curr.quarterControl = 1;
-      curr.nibControl = 0;
-      MOV(GenRegister::suboffset(dest, 8), r0);
-      curr.nibControl = 1;
-      MOV(GenRegister::suboffset(dest, 12), GenRegister::suboffset(r0, 4));
-      pop();
-    }
-  }
-
   void Gen8Encoder::JMPI(GenRegister src, bool longjmp) {
     alu2(this, GEN_OPCODE_JMPI, GenRegister::ip(), GenRegister::ip(), src);
   }
diff --git a/backend/src/backend/gen8_encoder.hpp b/backend/src/backend/gen8_encoder.hpp
index 4cd3664..2aa074f 100644
--- a/backend/src/backend/gen8_encoder.hpp
+++ b/backend/src/backend/gen8_encoder.hpp
@@ -42,7 +42,6 @@ namespace gbe
     virtual void patchJMPI(uint32_t insnID, int32_t jip, int32_t uip);
     virtual void F16TO32(GenRegister dest, GenRegister src0);
     virtual void F32TO16(GenRegister dest, GenRegister src0);
-    virtual void MOV_DF(GenRegister dest, GenRegister src0, GenRegister tmp = GenRegister::null());
     virtual void LOAD_DF_IMM(GenRegister dest, GenRegister tmp, double value);
     virtual void LOAD_INT64_IMM(GenRegister dest, GenRegister value);
     virtual void ATOMIC(GenRegister dst, uint32_t function, GenRegister src, GenRegister bti, uint32_t srcNum);
diff --git a/backend/src/backend/gen_context.cpp b/backend/src/backend/gen_context.cpp
index 4e2ebfb..cad7802 100644
--- a/backend/src/backend/gen_context.cpp
+++ b/backend/src/backend/gen_context.cpp
@@ -332,9 +332,6 @@ namespace gbe
       case SEL_OP_LOAD_DF_IMM:
         p->LOAD_DF_IMM(dst, tmp, src.value.df);
         break;
-      case SEL_OP_MOV_DF:
-        p->MOV_DF(dst, src, tmp);
-        break;
       case SEL_OP_CONVI_TO_I64: {
         GenRegister middle = src;
         if(src.type == GEN_TYPE_B || src.type == GEN_TYPE_W) {
diff --git a/backend/src/backend/gen_encoder.cpp b/backend/src/backend/gen_encoder.cpp
index 2cc51cc..a6daa0d 100644
--- a/backend/src/backend/gen_encoder.cpp
+++ b/backend/src/backend/gen_encoder.cpp
@@ -763,49 +763,6 @@ namespace gbe
     MOV(dest.top_half(this->simdWidth), u1);
   }
 
-  void GenEncoder::MOV_DF(GenRegister dest, GenRegister src0, GenRegister tmp) {
-    GBE_ASSERT((src0.type == GEN_TYPE_F && dest.isdf()) || (src0.isdf() && dest.type == GEN_TYPE_F));
-    GenRegister r = GenRegister::retype(tmp, GEN_TYPE_F);
-    int w = curr.execWidth;
-    GenRegister r0;
-    int factor = 1;
-    if (dest.type == GEN_TYPE_F) {
-      r0 = r;
-      r = GenRegister::h2(r);
-      factor = 2;
-    } else {
-      r0 = GenRegister::h2(r);
-    }
-    push();
-    curr.execWidth = 8;
-    curr.predicate = GEN_PREDICATE_NONE;
-    curr.noMask = 1;
-    MOV(r0, src0);
-    MOV(GenRegister::suboffset(r0, 4 * factor), GenRegister::suboffset(src0, 4));
-    curr.noMask = 0;
-    curr.quarterControl = 0;
-    curr.nibControl = 0;
-    MOV(dest, r);
-    curr.nibControl = 1;
-    MOV(GenRegister::suboffset(dest, 4), GenRegister::suboffset(r, 8 / factor));
-    pop();
-    if (w == 16) {
-      push();
-      curr.execWidth = 8;
-      curr.predicate = GEN_PREDICATE_NONE;
-      curr.noMask = 1;
-      MOV(r0, GenRegister::suboffset(src0, 8));
-      MOV(GenRegister::suboffset(r0, 4 * factor), GenRegister::suboffset(src0, 12));
-      curr.noMask = 0;
-      curr.quarterControl = 1;
-      curr.nibControl = 0;
-      MOV(GenRegister::suboffset(dest, 8), r);
-      curr.nibControl = 1;
-      MOV(GenRegister::suboffset(dest, 12), GenRegister::suboffset(r, 8 / factor));
-      pop();
-    }
-  }
-
   void GenEncoder::F16TO32(GenRegister dest, GenRegister src0) {
     alu1(this, GEN_OPCODE_F16TO32, dest, src0);
   }
diff --git a/backend/src/backend/gen_encoder.hpp b/backend/src/backend/gen_encoder.hpp
index f2bb5ab..3e9866c 100644
--- a/backend/src/backend/gen_encoder.hpp
+++ b/backend/src/backend/gen_encoder.hpp
@@ -125,7 +125,6 @@ namespace gbe
     ALU2(LINE)
     ALU2(PLN)
     ALU3(MAD)
-    //ALU2(MOV_DF);
     ALU2(BRC)
     ALU1(BRD)
 #undef ALU1
@@ -135,7 +134,6 @@ namespace gbe
 
     virtual void F16TO32(GenRegister dest, GenRegister src0);
     virtual void F32TO16(GenRegister dest, GenRegister src0);
-    virtual void MOV_DF(GenRegister dest, GenRegister src0, GenRegister tmp = GenRegister::null());
     virtual void LOAD_DF_IMM(GenRegister dest, GenRegister tmp, double value);
     virtual void LOAD_INT64_IMM(GenRegister dest, GenRegister value);
     /*! Barrier message (to synchronize threads of a workgroup) */
diff --git a/backend/src/backend/gen_insn_selection.cpp b/backend/src/backend/gen_insn_selection.cpp
index fafd927..869f13b 100644
--- a/backend/src/backend/gen_insn_selection.cpp
+++ b/backend/src/backend/gen_insn_selection.cpp
@@ -516,7 +516,6 @@ namespace gbe
   INLINE void OP(Reg dst, Reg src0, Reg src1, GenRegister tmp[6]) { I64Shift(SEL_OP_##OP, dst, src0, src1, tmp); }
     ALU1(MOV)
     ALU1(READ_ARF)
-    ALU1WithTemp(MOV_DF)
     ALU1WithTemp(LOAD_DF_IMM)
     ALU1(LOAD_INT64_IMM)
     ALU1(RNDZ)
@@ -2452,10 +2451,7 @@ namespace gbe
             }
             break;
           case ir::OP_MOV:
-            if (dst.isdf()) {
-              ir::Register r = sel.reg(ir::RegisterFamily::FAMILY_QWORD);
-              sel.MOV_DF(dst, src, sel.selReg(r, ir::TYPE_U64));
-            } else {
+            {
               sel.push();
                 auto dag = sel.regDAG[insn.getDst(0)];
                 if (sel.getRegisterFamily(insn.getDst(0)) == ir::FAMILY_BOOL &&
@@ -4635,28 +4631,11 @@ namespace gbe
     INLINE void convertBetweenFloatDouble(Selection::Opaque &sel, const ir::ConvertInstruction &insn, bool &markChildren) const
     {
       using namespace ir;
-      const Type dstType = insn.getDstType();
-      const Type srcType = insn.getSrcType();
-      const GenRegister dst = sel.selReg(insn.getDst(0), dstType);
-      const GenRegister src = sel.selReg(insn.getSrc(0), srcType);
-
-
-      //TODO:
-      ir::Register r = sel.reg(ir::RegisterFamily::FAMILY_QWORD);
-      sel.MOV_DF(dst, src, sel.selReg(r, TYPE_U64));
     }
 
     INLINE void convertBetweenHalfDouble(Selection::Opaque &sel, const ir::ConvertInstruction &insn, bool &markChildren) const
     {
       using namespace ir;
-      const Type dstType = insn.getDstType();
-      const Type srcType = insn.getSrcType();
-      const GenRegister dst = sel.selReg(insn.getDst(0), dstType);
-      const GenRegister src = sel.selReg(insn.getSrc(0), srcType);
-
-      //TODO:
-      ir::Register r = sel.reg(ir::RegisterFamily::FAMILY_QWORD);
-      sel.MOV_DF(dst, src, sel.selReg(r, TYPE_U64));
     }
 
     INLINE void convertHalfToSmallInts(Selection::Opaque &sel, const ir::ConvertInstruction &insn, bool &markChildren) const
diff --git a/backend/src/backend/gen_insn_selection.hxx b/backend/src/backend/gen_insn_selection.hxx
index 479398b..1f248be 100644
--- a/backend/src/backend/gen_insn_selection.hxx
+++ b/backend/src/backend/gen_insn_selection.hxx
@@ -1,7 +1,6 @@
 DECL_SELECTION_IR(LABEL, LabelInstruction)
 DECL_SELECTION_IR(MOV, UnaryInstruction)
 DECL_SELECTION_IR(BSWAP, UnaryWithTempInstruction)
-DECL_SELECTION_IR(MOV_DF, UnaryWithTempInstruction)
 DECL_SELECTION_IR(LOAD_DF_IMM, UnaryWithTempInstruction)
 DECL_SELECTION_IR(LOAD_INT64_IMM, UnaryInstruction)
 DECL_SELECTION_IR(NOT, UnaryInstruction)
-- 
1.9.1





More information about the Beignet mailing list