From: Junyan He <junyan...@linux.intel.com> This function is used to handle the common cases for ALU1 and ALU2 operations. If native long is not supported, this function will split the src and dst into top half and bottom half, else it just return false. So far, just ALU1 function will use it.
Signed-off-by: Junyan He <junyan...@linux.intel.com> --- backend/src/backend/gen8_encoder.cpp | 5 +++++ backend/src/backend/gen8_encoder.hpp | 2 ++ backend/src/backend/gen_encoder.cpp | 14 +++++++++++--- backend/src/backend/gen_encoder.hpp | 4 +++- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/backend/src/backend/gen8_encoder.cpp b/backend/src/backend/gen8_encoder.cpp index d68dd4e..92aad64 100644 --- a/backend/src/backend/gen8_encoder.cpp +++ b/backend/src/backend/gen8_encoder.cpp @@ -417,6 +417,11 @@ namespace gbe } } + bool Gen8Encoder::canHandleLong(uint32_t opcode, GenRegister dst, GenRegister src0, GenRegister src1) + { + return false; + } + #define NO_SWIZZLE ((0<<0) | (1<<2) | (2<<4) | (3<<6)) void Gen8Encoder::alu3(uint32_t opcode, diff --git a/backend/src/backend/gen8_encoder.hpp b/backend/src/backend/gen8_encoder.hpp index 869eb37..4c5e556 100644 --- a/backend/src/backend/gen8_encoder.hpp +++ b/backend/src/backend/gen8_encoder.hpp @@ -64,6 +64,8 @@ namespace gbe virtual bool disableCompact() { return true; } virtual void alu3(uint32_t opcode, GenRegister dst, GenRegister src0, GenRegister src1, GenRegister src2); + virtual bool canHandleLong(uint32_t opcode, GenRegister dst, GenRegister src0, + GenRegister src1 = GenRegister::null()); }; } #endif /* __GBE_GEN8_ENCODER_HPP__ */ diff --git a/backend/src/backend/gen_encoder.cpp b/backend/src/backend/gen_encoder.cpp index d21bece..9058e2e 100644 --- a/backend/src/backend/gen_encoder.cpp +++ b/backend/src/backend/gen_encoder.cpp @@ -488,6 +488,14 @@ namespace gbe return (GenNativeInstruction *)(&this->store.back()-1); } + bool GenEncoder::canHandleLong(uint32_t opcode, GenRegister dst, GenRegister src0, GenRegister src1) + { + /* By now, just alu1 insn will come to here. So just MOV */ + this->MOV(dst.bottom_half(), src0.bottom_half()); + this->MOV(dst.top_half(this->simdWidth), src0.top_half(this->simdWidth)); + return true; + } + INLINE void _handleDouble(GenEncoder *p, uint32_t opcode, GenRegister dst, GenRegister src0, GenRegister src1 = GenRegister::null()) { int w = p->curr.execWidth; @@ -537,9 +545,9 @@ namespace gbe GenRegister src, uint32_t condition) { if (dst.isdf() && src.isdf()) { handleDouble(p, opcode, dst, src); - } else if (dst.isint64() && src.isint64()) { // handle int64 - p->MOV(dst.bottom_half(), src.bottom_half()); - p->MOV(dst.top_half(p->simdWidth), src.top_half(p->simdWidth)); + } else if (dst.isint64() && src.isint64() + && p->canHandleLong(opcode, dst, src)) { // handle int64 + return; } else if (needToSplitAlu1(p, dst, src) == false) { if(compactAlu1(p, opcode, dst, src, condition, false)) return; diff --git a/backend/src/backend/gen_encoder.hpp b/backend/src/backend/gen_encoder.hpp index 97d6258..1a6f75c 100644 --- a/backend/src/backend/gen_encoder.hpp +++ b/backend/src/backend/gen_encoder.hpp @@ -229,8 +229,10 @@ namespace gbe virtual bool disableCompact() { return false; } GenNativeInstruction *next(uint32_t opcode); uint32_t n_instruction(void) const { return store.size(); } - GBE_CLASS(GenEncoder); //!< Use custom allocators + virtual bool canHandleLong(uint32_t opcode, GenRegister dst, GenRegister src0, + GenRegister src1 = GenRegister::null()); + GBE_CLASS(GenEncoder); //!< Use custom allocators virtual void alu3(uint32_t opcode, GenRegister dst, GenRegister src0, GenRegister src1, GenRegister src2) = 0; }; -- 1.7.9.5 _______________________________________________ Beignet mailing list Beignet@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/beignet