[Beignet] [Patch V3 2/3] KBL: add kabylake backend support.

Yang Rong rong.r.yang at intel.com
Fri Aug 12 09:56:53 UTC 2016


Kabylake is almost same as skylake, derived it from GEN9.

v3: correct KBL disasm and bin generate.
Signed-off-by: Yang Rong <rong.r.yang at intel.com>
---
 backend/src/CMakeLists.txt                 |  4 +++
 backend/src/backend/gen/gen_mesa_disasm.c  |  2 ++
 backend/src/backend/gen10_context.cpp      | 31 +++++++++++++++++++
 backend/src/backend/gen10_context.hpp      | 49 ++++++++++++++++++++++++++++++
 backend/src/backend/gen10_encoder.cpp      | 33 ++++++++++++++++++++
 backend/src/backend/gen10_encoder.hpp      | 40 ++++++++++++++++++++++++
 backend/src/backend/gen_context.cpp        |  2 +-
 backend/src/backend/gen_insn_selection.cpp | 10 ++++++
 backend/src/backend/gen_insn_selection.hpp |  7 +++++
 backend/src/backend/gen_program.cpp        | 16 ++++++++--
 10 files changed, 190 insertions(+), 4 deletions(-)
 create mode 100644 backend/src/backend/gen10_context.cpp
 create mode 100644 backend/src/backend/gen10_context.hpp
 create mode 100644 backend/src/backend/gen10_encoder.cpp
 create mode 100644 backend/src/backend/gen10_encoder.hpp

diff --git a/backend/src/CMakeLists.txt b/backend/src/CMakeLists.txt
index 41eb5ec..f368ae1 100644
--- a/backend/src/CMakeLists.txt
+++ b/backend/src/CMakeLists.txt
@@ -116,6 +116,8 @@ set (GBE_SRC
     backend/gen8_context.cpp
     backend/gen9_context.hpp
     backend/gen9_context.cpp
+    backend/gen10_context.hpp
+    backend/gen10_context.cpp
     backend/gen_program.cpp
     backend/gen_program.hpp
     backend/gen_program.h
@@ -133,6 +135,8 @@ set (GBE_SRC
     backend/gen8_encoder.cpp
     backend/gen9_encoder.hpp
     backend/gen9_encoder.cpp
+    backend/gen10_encoder.hpp
+    backend/gen10_encoder.cpp
     )
 
 set (GBE_LINK_LIBRARIES
diff --git a/backend/src/backend/gen/gen_mesa_disasm.c b/backend/src/backend/gen/gen_mesa_disasm.c
index 5653275..b76605c 100644
--- a/backend/src/backend/gen/gen_mesa_disasm.c
+++ b/backend/src/backend/gen/gen_mesa_disasm.c
@@ -1359,6 +1359,8 @@ int gen_disasm (FILE *file, const void *inst, uint32_t deviceID, uint32_t compac
     gen_version = 80;
   } else if (IS_GEN9(deviceID)) {
     gen_version = 90;
+  } else if (IS_GEN10(deviceID)) {
+    gen_version = 100;
   }
 
   if (PRED_CTRL(inst)) {
diff --git a/backend/src/backend/gen10_context.cpp b/backend/src/backend/gen10_context.cpp
new file mode 100644
index 0000000..a8dc316
--- /dev/null
+++ b/backend/src/backend/gen10_context.cpp
@@ -0,0 +1,31 @@
+/*
+ * Copyright © 2012 Intel Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * \file gen9_context.cpp
+ */
+
+#include "backend/gen10_context.hpp"
+#include "backend/gen_insn_selection.hpp"
+
+namespace gbe
+{
+  void Gen10Context::newSelection(void) {
+    this->sel = GBE_NEW(Selection10, *this);
+  }
+}
diff --git a/backend/src/backend/gen10_context.hpp b/backend/src/backend/gen10_context.hpp
new file mode 100644
index 0000000..87dbffc
--- /dev/null
+++ b/backend/src/backend/gen10_context.hpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright © 2012 Intel Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * \file gen10_context.hpp
+ */
+#ifndef __GBE_gen10_CONTEXT_HPP__
+#define __GBE_gen10_CONTEXT_HPP__
+
+#include "backend/gen9_context.hpp"
+#include "backend/gen10_encoder.hpp"
+
+namespace gbe
+{
+  /* This class is used to implement the HSW
+     specific logic for context. */
+  class Gen10Context : public Gen9Context
+  {
+  public:
+    virtual ~Gen10Context(void) { };
+    Gen10Context(const ir::Unit &unit, const std::string &name, uint32_t deviceID, bool relaxMath = false)
+            : Gen9Context(unit, name, deviceID, relaxMath) {
+    };
+
+  protected:
+    virtual GenEncoder* generateEncoder(void) {
+      return GBE_NEW(Gen10Encoder, this->simdWidth, 10, deviceID);
+    }
+
+  private:
+    virtual void newSelection(void);
+  };
+}
+#endif /* __GBE_GEN10_CONTEXT_HPP__ */
diff --git a/backend/src/backend/gen10_encoder.cpp b/backend/src/backend/gen10_encoder.cpp
new file mode 100644
index 0000000..0550e9f
--- /dev/null
+++ b/backend/src/backend/gen10_encoder.cpp
@@ -0,0 +1,33 @@
+/*
+ Copyright (C) Intel Corp.  2006.  All Rights Reserved.
+ Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
+ develop this 3D driver.
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice (including the
+ next paragraph) shall be included in all copies or substantial
+ portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ **********************************************************************/
+
+#include "backend/gen10_encoder.hpp"
+
+namespace gbe
+{
+
+} /* End of the name space. */
diff --git a/backend/src/backend/gen10_encoder.hpp b/backend/src/backend/gen10_encoder.hpp
new file mode 100644
index 0000000..5e1265e
--- /dev/null
+++ b/backend/src/backend/gen10_encoder.hpp
@@ -0,0 +1,40 @@
+/*
+ * Copyright © 2012 Intel Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * \file gen10_context.hpp
+ */
+#ifndef __GBE_GEN10_ENCODER_HPP__
+#define __GBE_GEN10_ENCODER_HPP__
+
+#include "backend/gen9_encoder.hpp"
+
+namespace gbe
+{
+  /* This class is used to implement the SKL
+     specific logic for encoder. */
+  class Gen10Encoder : public Gen9Encoder
+  {
+  public:
+    virtual ~Gen10Encoder(void) { }
+
+    Gen10Encoder(uint32_t simdWidth, uint32_t gen, uint32_t deviceID)
+         : Gen9Encoder(simdWidth, gen, deviceID) { }
+  };
+}
+#endif /* __GBE_GEN10_ENCODER_HPP__ */
diff --git a/backend/src/backend/gen_context.cpp b/backend/src/backend/gen_context.cpp
index b429ec3..2db5ff9 100644
--- a/backend/src/backend/gen_context.cpp
+++ b/backend/src/backend/gen_context.cpp
@@ -3892,7 +3892,7 @@ namespace gbe
     uint32_t insn_version = 0;
     if (IS_GEN7(deviceID) || IS_GEN75(deviceID))
       insn_version = 7;
-    else if (IS_GEN8(deviceID) || IS_GEN9(deviceID))
+    else if (IS_GEN8(deviceID) || IS_GEN9(deviceID) || IS_GEN10(deviceID))
       insn_version = 8;
     fprintf(file, "%s's disassemble begin:\n", genKernel->getName());
     ir::LabelIndex curLabel = (ir::LabelIndex)0;
diff --git a/backend/src/backend/gen_insn_selection.cpp b/backend/src/backend/gen_insn_selection.cpp
index e342161..69959e9 100644
--- a/backend/src/backend/gen_insn_selection.cpp
+++ b/backend/src/backend/gen_insn_selection.cpp
@@ -2523,6 +2523,16 @@ extern bool OCL_DEBUGINFO; // first defined by calling BVAR in program.cpp
     opt_features = SIOF_LOGICAL_SRCMOD | SIOF_OP_MOV_LONG_REG_RESTRICT;
   }
 
+  Selection10::Selection10(GenContext &ctx) : Selection(ctx) {
+    this->opaque->setHas32X32Mul(true);
+    this->opaque->setHasLongType(true);
+    this->opaque->setHasDoubleType(true);
+    this->opaque->setLdMsgOrder(LD_MSG_ORDER_SKL);
+    this->opaque->setSlowByteGather(false);
+    this->opaque->setHasHalfType(true);
+    opt_features = SIOF_LOGICAL_SRCMOD;
+  }
+
   void Selection::Opaque::TYPED_WRITE(GenRegister *msgs, uint32_t msgNum,
                                       uint32_t bti, bool is3D) {
     uint32_t elemID = 0;
diff --git a/backend/src/backend/gen_insn_selection.hpp b/backend/src/backend/gen_insn_selection.hpp
index b481de8..4a43eb6 100644
--- a/backend/src/backend/gen_insn_selection.hpp
+++ b/backend/src/backend/gen_insn_selection.hpp
@@ -355,6 +355,13 @@ namespace gbe
       SelectionBxt(GenContext &ctx);
   };
 
+  class Selection10 : public Selection
+  {
+    public:
+      /*! Initialize internal structures used for the selection */
+      Selection10(GenContext &ctx);
+  };
+
 } /* namespace gbe */
 
 #endif /*  __GEN_INSN_SELECTION_HPP__ */
diff --git a/backend/src/backend/gen_program.cpp b/backend/src/backend/gen_program.cpp
index ade0157..7233eb0 100644
--- a/backend/src/backend/gen_program.cpp
+++ b/backend/src/backend/gen_program.cpp
@@ -50,6 +50,7 @@
 #include "backend/gen75_context.hpp"
 #include "backend/gen8_context.hpp"
 #include "backend/gen9_context.hpp"
+#include "backend/gen10_context.hpp"
 #include "backend/gen_defs.hpp"
 #include "backend/gen/gen_mesa_disasm.h"
 #include "backend/gen_reg_allocation.hpp"
@@ -100,7 +101,7 @@ namespace gbe {
     uint32_t insn_version = 0;
     if (IS_GEN7(deviceID) || IS_GEN75(deviceID))
       insn_version = 7;
-    else if (IS_GEN8(deviceID) || IS_GEN9(deviceID))
+    else if (IS_GEN8(deviceID) || IS_GEN9(deviceID) || IS_GEN10(deviceID))
       insn_version = 8;
 
     for (uint32_t i = 0; i < insnNum;) {
@@ -186,6 +187,8 @@ namespace gbe {
       ctx = GBE_NEW(Gen9Context, unit, name, deviceID, relaxMath);
     } else if (IS_BROXTON(deviceID)) {
       ctx = GBE_NEW(BxtContext, unit, name, deviceID, relaxMath);
+    } else if (IS_KABYLAKE(deviceID)) {
+      ctx = GBE_NEW(Gen10Context, unit, name, deviceID, relaxMath);
     }
     GBE_ASSERTM(ctx != NULL, "Fail to create the gen context\n");
 
@@ -239,6 +242,7 @@ namespace gbe {
     GBHI_BDW = 4,
     GBHI_SKL = 5,
     GBHI_BXT = 6,
+    GBHI_KBL = 7,
     GBHI_MAX,
   };
 #define GEN_BINARY_VERSION  1
@@ -249,7 +253,8 @@ namespace gbe {
                                               {GEN_BINARY_VERSION, 'G','E', 'N', 'C', 'C', 'H', 'V'},
                                               {GEN_BINARY_VERSION, 'G','E', 'N', 'C', 'B', 'D', 'W'},
                                               {GEN_BINARY_VERSION, 'G','E', 'N', 'C', 'S', 'K', 'L'},
-                                              {GEN_BINARY_VERSION, 'G','E', 'N', 'C', 'B', 'X', 'T'}
+                                              {GEN_BINARY_VERSION, 'G','E', 'N', 'C', 'B', 'X', 'T'},
+                                              {GEN_BINARY_VERSION, 'G','E', 'N', 'C', 'K', 'B', 'T'}
                                               };
 
 #define FILL_GEN_HEADER(binary, index)  do {int i = 0; do {*(binary+i) = gen_binary_header[index][i]; i++; }while(i < GEN_BINARY_HEADER_LENGTH);}while(0)
@@ -260,6 +265,7 @@ namespace gbe {
 #define FILL_BDW_HEADER(binary) FILL_GEN_HEADER(binary, GBHI_BDW)
 #define FILL_SKL_HEADER(binary) FILL_GEN_HEADER(binary, GBHI_SKL)
 #define FILL_BXT_HEADER(binary) FILL_GEN_HEADER(binary, GBHI_BXT)
+#define FILL_KBL_HEADER(binary) FILL_GEN_HEADER(binary, GBHI_KBL)
 
   static bool genHeaderCompare(const unsigned char *BufPtr, GEN_BINARY_HEADER_INDEX index)
   {
@@ -284,6 +290,7 @@ namespace gbe {
 #define MATCH_BDW_HEADER(binary) genHeaderCompare(binary, GBHI_BDW)
 #define MATCH_SKL_HEADER(binary) genHeaderCompare(binary, GBHI_SKL)
 #define MATCH_BXT_HEADER(binary) genHeaderCompare(binary, GBHI_BXT)
+#define MATCH_KBL_HEADER(binary) genHeaderCompare(binary, GBHI_KBL)
 
 #define MATCH_DEVICE(deviceID, binary) ((IS_IVYBRIDGE(deviceID) && MATCH_IVB_HEADER(binary)) ||  \
                                       (IS_IVYBRIDGE(deviceID) && MATCH_IVB_HEADER(binary)) ||  \
@@ -292,7 +299,8 @@ namespace gbe {
                                       (IS_BROADWELL(deviceID) && MATCH_BDW_HEADER(binary)) ||  \
                                       (IS_CHERRYVIEW(deviceID) && MATCH_CHV_HEADER(binary)) ||  \
                                       (IS_SKYLAKE(deviceID) && MATCH_SKL_HEADER(binary)) || \
-                                      (IS_BROXTON(deviceID) && MATCH_BXT_HEADER(binary)) \
+                                      (IS_BROXTON(deviceID) && MATCH_BXT_HEADER(binary)) || \
+                                      (IS_KABYLAKE(deviceID) && MATCH_KBL_HEADER(binary)) \
                                       )
 
   static gbe_program genProgramNewFromBinary(uint32_t deviceID, const char *binary, size_t size) {
@@ -392,6 +400,8 @@ namespace gbe {
         FILL_SKL_HEADER(*binary);
       }else if(IS_BROXTON(prog->deviceID)){
         FILL_BXT_HEADER(*binary);
+      }else if(IS_KABYLAKE(prog->deviceID)){
+        FILL_KBL_HEADER(*binary);
       }else {
         free(*binary);
         *binary = NULL;
-- 
2.1.4



More information about the Beignet mailing list