Signed-off-by: rander <rander.w...@intel.com> --- backend/src/backend/gen8_encoder.cpp | 10 ++++++++++ backend/src/backend/gen8_encoder.hpp | 1 + backend/src/backend/gen9_encoder.cpp | 5 +++++ backend/src/backend/gen9_encoder.hpp | 1 + backend/src/backend/gen_encoder.cpp | 7 ++++++- backend/src/backend/gen_encoder.hpp | 1 + 6 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/backend/src/backend/gen8_encoder.cpp b/backend/src/backend/gen8_encoder.cpp index a33fbac..bb4fdb0 100644 --- a/backend/src/backend/gen8_encoder.cpp +++ b/backend/src/backend/gen8_encoder.cpp @@ -38,6 +38,7 @@ static const uint32_t untypedRWMask[] = { namespace gbe { extern bool compactAlu3(GenEncoder *p, uint32_t opcode, GenRegister dst, GenRegister src0, GenRegister src1, GenRegister src2); + void Gen8Encoder::setHeader(GenNativeInstruction *insn) { Gen8NativeInstruction *gen8_insn = &insn->gen8_insn; if (this->curr.execWidth == 8) @@ -883,4 +884,13 @@ namespace gbe msg_length, response_length); } + + /* for BDW and after, no need to split CMP when src is DW*/ + bool Gen8Encoder::needToSplitCmpBySrcType(GenEncoder *p, GenRegister src0, GenRegister src1) { + if (src0.type == GEN_TYPE_F) + return true; + if (src1.type == GEN_TYPE_F) + return true; + return false; + } } /* End of the name space. */ diff --git a/backend/src/backend/gen8_encoder.hpp b/backend/src/backend/gen8_encoder.hpp index fa62a8d..51c079c 100644 --- a/backend/src/backend/gen8_encoder.hpp +++ b/backend/src/backend/gen8_encoder.hpp @@ -83,6 +83,7 @@ namespace gbe virtual void OBREADA64(GenRegister dst, GenRegister header, uint32_t bti, uint32_t elemSize); /*! A64 OBlock write */ virtual void OBWRITEA64(GenRegister header, uint32_t bti, uint32_t elemSize); + virtual bool needToSplitCmpBySrcType(GenEncoder *p, GenRegister src0, GenRegister src1); }; } #endif /* __GBE_GEN8_ENCODER_HPP__ */ diff --git a/backend/src/backend/gen9_encoder.cpp b/backend/src/backend/gen9_encoder.cpp index b37fd98..f2b9274 100644 --- a/backend/src/backend/gen9_encoder.cpp +++ b/backend/src/backend/gen9_encoder.cpp @@ -301,4 +301,9 @@ namespace gbe response_length); } } + + bool Gen9Encoder::needToSplitCmpBySrcType(GenEncoder *p, GenRegister src0, GenRegister src1) + { + return false; + } } /* End of the name space. */ diff --git a/backend/src/backend/gen9_encoder.hpp b/backend/src/backend/gen9_encoder.hpp index 2eaa538..69b7490 100644 --- a/backend/src/backend/gen9_encoder.hpp +++ b/backend/src/backend/gen9_encoder.hpp @@ -56,6 +56,7 @@ namespace gbe virtual void ATOMIC(GenRegister dst, uint32_t function, GenRegister addr, GenRegister data, GenRegister bti, uint32_t srcNum, bool useSends); virtual void OBWRITE(GenRegister header, GenRegister data, uint32_t bti, uint32_t ow_size, bool useSends); virtual void MBWRITE(GenRegister header, GenRegister data, uint32_t bti, uint32_t data_size, bool useSends); + virtual bool needToSplitCmpBySrcType(GenEncoder *p, GenRegister src0, GenRegister src1); }; } #endif /* __GBE_GEN9_ENCODER_HPP__ */ diff --git a/backend/src/backend/gen_encoder.cpp b/backend/src/backend/gen_encoder.cpp index 03ce0e2..296a0c5 100644 --- a/backend/src/backend/gen_encoder.cpp +++ b/backend/src/backend/gen_encoder.cpp @@ -192,6 +192,10 @@ namespace gbe if (isSrcDstDiffSpan(dst, src0) == true) return true; if (isSrcDstDiffSpan(dst, src1) == true) return true; + return false; + } + + bool GenEncoder::needToSplitCmpBySrcType(GenEncoder *p, GenRegister src0, GenRegister src1) { if (src0.type == GEN_TYPE_D || src0.type == GEN_TYPE_UD || src0.type == GEN_TYPE_F) return true; if (src1.type == GEN_TYPE_D || src1.type == GEN_TYPE_UD || src1.type == GEN_TYPE_F) @@ -199,6 +203,7 @@ namespace gbe return false; } + void GenEncoder::setMessageDescriptor(GenNativeInstruction *inst, enum GenMessageTarget sfid, unsigned msg_length, unsigned response_length, bool header_present, bool end_of_thread) @@ -1041,7 +1046,7 @@ namespace gbe } void GenEncoder::CMP(uint32_t conditional, GenRegister src0, GenRegister src1, GenRegister dst) { - if (needToSplitCmp(this, src0, src1, dst) == false) { + if ((needToSplitCmp(this, src0, src1, dst) | needToSplitCmpBySrcType(this, src0, src1))== false) { if(!GenRegister::isNull(dst) && compactAlu2(this, GEN_OPCODE_CMP, dst, src0, src1, conditional, false)) { return; } diff --git a/backend/src/backend/gen_encoder.hpp b/backend/src/backend/gen_encoder.hpp index 3e45c81..040b94a 100644 --- a/backend/src/backend/gen_encoder.hpp +++ b/backend/src/backend/gen_encoder.hpp @@ -162,6 +162,7 @@ namespace gbe void BRD(GenRegister src); /*! Compare instructions */ void CMP(uint32_t conditional, GenRegister src0, GenRegister src1, GenRegister dst = GenRegister::null()); + virtual bool needToSplitCmpBySrcType(GenEncoder *p, GenRegister src0, GenRegister src1); /*! Select with embedded compare (like sel.le ...) */ void SEL_CMP(uint32_t conditional, GenRegister dst, GenRegister src0, GenRegister src1); /*! EOT is used to finish GPGPU threads */ -- 2.7.4 _______________________________________________ Beignet mailing list Beignet@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/beignet