[Beignet] [V2 PATCH 2/6] Add Gen75Context and Gen75Encoder class for hsw
junyan.he at inbox.com
junyan.he at inbox.com
Wed May 7 03:02:50 PDT 2014
From: Junyan He <junyan.he at linux.intel.com>
We will create the Gen75Context and Gen75Encoder
dynamically based on the vendor ID, which is same
with the PCI ID.
Signed-off-by: Junyan He <junyan.he at linux.intel.com>
---
backend/src/CMakeLists.txt | 9 +++++--
backend/src/backend/gen75_context.cpp | 29 ++++++++++++++++++++++
backend/src/backend/gen75_context.hpp | 46 +++++++++++++++++++++++++++++++++++
backend/src/backend/gen75_encoder.cpp | 33 +++++++++++++++++++++++++
backend/src/backend/gen75_encoder.hpp | 38 +++++++++++++++++++++++++++++
backend/src/backend/gen_context.cpp | 8 +++---
backend/src/backend/gen_context.hpp | 10 +++++++-
backend/src/backend/gen_encoder.cpp | 4 +--
backend/src/backend/gen_encoder.hpp | 5 ++--
backend/src/backend/gen_program.cpp | 10 +++++++-
backend/src/gbe_bin_generater.cpp | 2 +-
11 files changed, 180 insertions(+), 14 deletions(-)
create mode 100644 backend/src/backend/gen75_context.cpp
create mode 100644 backend/src/backend/gen75_context.hpp
create mode 100644 backend/src/backend/gen75_encoder.cpp
create mode 100644 backend/src/backend/gen75_encoder.hpp
diff --git a/backend/src/CMakeLists.txt b/backend/src/CMakeLists.txt
index 2d59644..04ee2bc 100644
--- a/backend/src/CMakeLists.txt
+++ b/backend/src/CMakeLists.txt
@@ -157,14 +157,19 @@ else (GBE_USE_BLOB)
backend/gen_reg_allocation.cpp
backend/gen_reg_allocation.hpp
backend/gen_context.cpp
- backend/gen_context.hpp
+ backend/gen_context.cpp
+ backend/gen75_context.hpp
+ backend/gen75_context.cpp
backend/gen_program.cpp
backend/gen_program.hpp
backend/gen_program.h
backend/gen_defs.hpp
backend/gen_insn_compact.cpp
backend/gen_encoder.hpp
- backend/gen_encoder.cpp)
+ backend/gen_encoder.cpp
+ backend/gen75_encoder.hpp
+ backend/gen75_encoder.cpp
+ )
endif (GBE_USE_BLOB)
diff --git a/backend/src/backend/gen75_context.cpp b/backend/src/backend/gen75_context.cpp
new file mode 100644
index 0000000..2e35324
--- /dev/null
+++ b/backend/src/backend/gen75_context.cpp
@@ -0,0 +1,29 @@
+/*
+ * 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 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 gen75_context.cpp
+ */
+
+#include "backend/gen75_context.hpp"
+#include "backend/gen75_encoder.hpp"
+
+namespace gbe
+{
+
+}
diff --git a/backend/src/backend/gen75_context.hpp b/backend/src/backend/gen75_context.hpp
new file mode 100644
index 0000000..2bb6e17
--- /dev/null
+++ b/backend/src/backend/gen75_context.hpp
@@ -0,0 +1,46 @@
+/*
+ * 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 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 gen75_context.hpp
+ */
+#ifndef __GBE_GEN75_CONTEXT_HPP__
+#define __GBE_GEN75_CONTEXT_HPP__
+
+#include "backend/gen_context.hpp"
+#include "backend/gen75_encoder.hpp"
+
+namespace gbe
+{
+ /* This class is used to implement the HSW
+ specific logic for context. */
+ class Gen75Context : public GenContext
+ {
+ public:
+ Gen75Context(const ir::Unit &unit, const std::string &name, uint32_t deviceID, bool relaxMath = false)
+ : GenContext(unit, name, deviceID, relaxMath) {
+ };
+
+ protected:
+ virtual GenEncoder* generateEncoder(void) {
+ return GBE_NEW(Gen75Encoder, this->simdWidth, 75, deviceID);
+ }
+
+ };
+}
+#endif /* __GBE_GEN75_CONTEXT_HPP__ */
diff --git a/backend/src/backend/gen75_encoder.cpp b/backend/src/backend/gen75_encoder.cpp
new file mode 100644
index 0000000..909b301
--- /dev/null
+++ b/backend/src/backend/gen75_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/gen75_encoder.hpp"
+
+namespace gbe
+{
+
+} /* End of the name space. */
diff --git a/backend/src/backend/gen75_encoder.hpp b/backend/src/backend/gen75_encoder.hpp
new file mode 100644
index 0000000..9541c26
--- /dev/null
+++ b/backend/src/backend/gen75_encoder.hpp
@@ -0,0 +1,38 @@
+/*
+ * 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 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 gen75_context.hpp
+ */
+#ifndef __GBE_GEN75_ENCODER_HPP__
+#define __GBE_GEN75_ENCODER_HPP__
+
+#include "backend/gen_encoder.hpp"
+
+namespace gbe
+{
+ /* This class is used to implement the HSW
+ specific logic for encoder. */
+ class Gen75Encoder : public GenEncoder
+ {
+ public:
+ Gen75Encoder(uint32_t simdWidth, uint32_t gen, uint32_t deviceID)
+ : GenEncoder(simdWidth, gen, deviceID, 8) { };
+ };
+}
+#endif /* __GBE_GEN75_ENCODER_HPP__ */
diff --git a/backend/src/backend/gen_context.cpp b/backend/src/backend/gen_context.cpp
index 00cbf1d..689136f 100644
--- a/backend/src/backend/gen_context.cpp
+++ b/backend/src/backend/gen_context.cpp
@@ -43,10 +43,8 @@ namespace gbe
///////////////////////////////////////////////////////////////////////////
// GenContext implementation
///////////////////////////////////////////////////////////////////////////
- GenContext::GenContext(const ir::Unit &unit,
- const std::string &name,
- uint32_t deviceID,
- bool relaxMath) :
+ GenContext::GenContext(const ir::Unit &unit, const std::string &name, uint32_t deviceID,
+ bool relaxMath) :
Context(unit, name), deviceID(deviceID), relaxMath(relaxMath)
{
this->p = NULL;
@@ -68,7 +66,7 @@ namespace gbe
GBE_SAFE_DELETE(ra);
GBE_SAFE_DELETE(sel);
GBE_SAFE_DELETE(p);
- this->p = GBE_NEW(GenEncoder, this->simdWidth, 7, deviceID); // XXX handle more than Gen7
+ this->p = generateEncoder();
this->sel = GBE_NEW(Selection, *this);
this->ra = GBE_NEW(GenRegAllocator, *this);
this->branchPos2.clear();
diff --git a/backend/src/backend/gen_context.hpp b/backend/src/backend/gen_context.hpp
index 3eda148..21ee28d 100644
--- a/backend/src/backend/gen_context.hpp
+++ b/backend/src/backend/gen_context.hpp
@@ -26,6 +26,7 @@
#define __GBE_GEN_CONTEXT_HPP__
#include "backend/context.hpp"
+#include "backend/gen_encoder.hpp"
#include "backend/program.h"
#include "backend/gen_register.hpp"
#include "ir/function.hpp"
@@ -59,7 +60,8 @@ namespace gbe
/*! Create a new context. name is the name of the function we want to
* compile
*/
- GenContext(const ir::Unit &unit, const std::string &name, uint32_t deviceID, bool relaxMath = false);
+ GenContext(const ir::Unit &unit, const std::string &name, uint32_t deviceID,
+ bool relaxMath = false);
/*! Release everything needed */
~GenContext(void);
/*! Start new code generation with specific parameters */
@@ -187,6 +189,12 @@ namespace gbe
const bool getIFENDIFFix(void) const { return ifEndifFix; }
void setIFENDIFFix(bool fix) { ifEndifFix = fix; }
const CompileErrorCode getErrCode() { return errCode; }
+
+ protected:
+ virtual GenEncoder* generateEncoder(void) {
+ return GBE_NEW(GenEncoder, this->simdWidth, 7, deviceID);
+ }
+
private:
CompileErrorCode errCode;
bool ifEndifFix;
diff --git a/backend/src/backend/gen_encoder.cpp b/backend/src/backend/gen_encoder.cpp
index e850eeb..1f8ecc6 100644
--- a/backend/src/backend/gen_encoder.cpp
+++ b/backend/src/backend/gen_encoder.cpp
@@ -223,8 +223,8 @@ namespace gbe
//////////////////////////////////////////////////////////////////////////
// Gen Emitter encoding class
//////////////////////////////////////////////////////////////////////////
- GenEncoder::GenEncoder(uint32_t simdWidth, uint32_t gen, uint32_t deviceID) :
- stateNum(0), gen(gen), deviceID(deviceID)
+ GenEncoder::GenEncoder(uint32_t simdWidth, uint32_t gen, uint32_t deviceID, int jump_width) :
+ stateNum(0), gen(gen), deviceID(deviceID), jump_width(jump_width)
{
this->curr.execWidth = simdWidth;
this->curr.quarterControl = GEN_COMPRESSION_Q1;
diff --git a/backend/src/backend/gen_encoder.hpp b/backend/src/backend/gen_encoder.hpp
index 8d5ef37..024d9c6 100644
--- a/backend/src/backend/gen_encoder.hpp
+++ b/backend/src/backend/gen_encoder.hpp
@@ -65,7 +65,7 @@ namespace gbe
{
public:
/*! simdWidth is the default width for the instructions */
- GenEncoder(uint32_t simdWidth, uint32_t gen, uint32_t deviceID);
+ GenEncoder(uint32_t simdWidth, uint32_t gen, uint32_t deviceID, int jump_width = 1);
/*! Size of the stack (should be large enough) */
enum { MAX_STATE_NUM = 16 };
/*! Push the current instruction state */
@@ -84,7 +84,8 @@ namespace gbe
uint32_t gen;
/*! Device ID */
uint32_t deviceID;
-
+ /*! The constant for jump. */
+ const int jump_width;
////////////////////////////////////////////////////////////////////////
// Encoding functions
////////////////////////////////////////////////////////////////////////
diff --git a/backend/src/backend/gen_program.cpp b/backend/src/backend/gen_program.cpp
index dd03153..52db904 100644
--- a/backend/src/backend/gen_program.cpp
+++ b/backend/src/backend/gen_program.cpp
@@ -26,6 +26,7 @@
#include "backend/gen_program.h"
#include "backend/gen_program.hpp"
#include "backend/gen_context.hpp"
+#include "backend/gen75_context.hpp"
#include "backend/gen_defs.hpp"
#include "backend/gen/gen_mesa_disasm.h"
#include "backend/gen_reg_allocation.hpp"
@@ -94,6 +95,7 @@ namespace gbe {
const ir::Function *fn = unit.getFunction(name);
uint32_t codeGenNum = sizeof(codeGenStrategy) / sizeof(codeGenStrategy[0]);
uint32_t codeGen = 0;
+ GenContext *ctx = NULL;
if (fn->getSimdWidth() == 8) {
codeGen = 2;
} else if (fn->getSimdWidth() == 16) {
@@ -105,7 +107,13 @@ namespace gbe {
Kernel *kernel = NULL;
// Stop when compilation is successful
- GenContext *ctx = GBE_NEW(GenContext, unit, name, deviceID, relaxMath);
+ if (IS_IVYBRIDGE(deviceID)) {
+ ctx = GBE_NEW(GenContext, unit, name, deviceID, relaxMath);
+ } else if (IS_HASWELL(deviceID)) {
+ ctx = GBE_NEW(Gen75Context, unit, name, deviceID, relaxMath);
+ }
+ GBE_ASSERTM(ctx != NULL, "Fail to create the gen context\n");
+
for (; codeGen < codeGenNum; ++codeGen) {
const uint32_t simdWidth = codeGenStrategy[codeGen].simdWidth;
const bool limitRegisterPressure = codeGenStrategy[codeGen].limitRegisterPressure;
diff --git a/backend/src/gbe_bin_generater.cpp b/backend/src/gbe_bin_generater.cpp
index 1d97f01..15bdbd1 100644
--- a/backend/src/gbe_bin_generater.cpp
+++ b/backend/src/gbe_bin_generater.cpp
@@ -194,7 +194,7 @@ void program_build_instance::build_program(void) throw(int)
{
// FIXME, we need to find a graceful way to generate internal binaries for difference
// devices.
- gbe_program opaque = gbe_program_new_from_source(0, code, 0, build_opt.c_str(), NULL, NULL);
+ gbe_program opaque = gbe_program_new_from_source(0x0152, code, 0, build_opt.c_str(), NULL, NULL);
if (!opaque)
throw FILE_BUILD_FAILED;
--
1.8.3.2
More information about the Beignet
mailing list