diff options
author | Junyan He <junyan.he@linux.intel.com> | 2015-01-27 10:53:22 +0800 |
---|---|---|
committer | Zhigang Gong <zhigang.gong@intel.com> | 2015-01-28 12:45:51 +0800 |
commit | 4340b304132ce36cb62069794135016a9135db5d (patch) | |
tree | 6dc184facd5899b403fd13b5384bb35f7ba9a9b9 | |
parent | 2757e2eeb6ca68bf2c725ed66cedb55c82ee6e90 (diff) |
Add the logic for pack/unpack long for scalar.
Sometimes, such as printf the kernel's long type
parameter, the scalar register will also need to be
pack/unpack.
Signed-off-by: Junyan He <junyan.he@linux.intel.com>
Reviewed-by: "Yang, Rong R" <rong.r.yang@intel.com>
-rw-r--r-- | backend/src/backend/gen8_context.cpp | 94 |
1 files changed, 59 insertions, 35 deletions
diff --git a/backend/src/backend/gen8_context.cpp b/backend/src/backend/gen8_context.cpp index 07f8c479..cde87de6 100644 --- a/backend/src/backend/gen8_context.cpp +++ b/backend/src/backend/gen8_context.cpp @@ -618,60 +618,84 @@ namespace gbe void Gen8Context::packLongVec(GenRegister unpacked, GenRegister packed, uint32_t simd) { + bool isScalar = false; + if (unpacked.hstride == GEN_HORIZONTAL_STRIDE_0) + isScalar = true; + GBE_ASSERT(packed.subnr == 0); - GBE_ASSERT(unpacked.subnr == 0); + GBE_ASSERT(packed.hstride != GEN_HORIZONTAL_STRIDE_0); + GBE_ASSERT(unpacked.subnr == 0 || isScalar); unpacked = GenRegister::retype(unpacked, GEN_TYPE_UD); packed = GenRegister::retype(packed, GEN_TYPE_UD); - if (simd == 16) { - p->push(); - p->curr.execWidth = 8; - p->MOV(GenRegister::h2(packed), unpacked); - p->MOV(GenRegister::h2(GenRegister::offset(packed, 0, typeSize(GEN_TYPE_UD))), - GenRegister::offset(unpacked, 2)); - p->curr.quarterControl = 1; - p->MOV(GenRegister::h2(GenRegister::offset(packed, 2, 0)), GenRegister::offset(unpacked, 1)); - p->MOV(GenRegister::h2(GenRegister::offset(packed, 2, typeSize(GEN_TYPE_UD))), - GenRegister::offset(unpacked, 3)); - p->pop(); + if (isScalar) { + p->MOV(packed, unpacked); } else { - GBE_ASSERT(simd == 8); - p->MOV(GenRegister::h2(packed), unpacked); - p->MOV(GenRegister::h2(GenRegister::offset(packed, 0, typeSize(GEN_TYPE_UD))), - GenRegister::offset(unpacked, 1)); + if (simd == 16) { + p->push(); + p->curr.execWidth = 8; + p->MOV(GenRegister::h2(packed), unpacked); + p->MOV(GenRegister::h2(GenRegister::offset(packed, 0, typeSize(GEN_TYPE_UD))), + GenRegister::offset(unpacked, 2)); + p->curr.quarterControl = 1; + p->MOV(GenRegister::h2(GenRegister::offset(packed, 2, 0)), GenRegister::offset(unpacked, 1)); + p->MOV(GenRegister::h2(GenRegister::offset(packed, 2, typeSize(GEN_TYPE_UD))), + GenRegister::offset(unpacked, 3)); + p->pop(); + } else { + GBE_ASSERT(simd == 8); + p->MOV(GenRegister::h2(packed), unpacked); + p->MOV(GenRegister::h2(GenRegister::offset(packed, 0, typeSize(GEN_TYPE_UD))), + GenRegister::offset(unpacked, 1)); + } } } void Gen8Context::unpackLongVec(GenRegister packed, GenRegister unpacked, uint32_t simd) { - GBE_ASSERT(packed.subnr == 0); + bool isScalar = false; + if (packed.hstride == GEN_HORIZONTAL_STRIDE_0) + isScalar = true; + + GBE_ASSERT(packed.subnr == 0 || isScalar); + GBE_ASSERT(unpacked.hstride != GEN_HORIZONTAL_STRIDE_0); GBE_ASSERT(unpacked.subnr == 0); unpacked = GenRegister::retype(unpacked, GEN_TYPE_UD); packed = GenRegister::retype(packed, GEN_TYPE_UD); - packed.vstride = GEN_VERTICAL_STRIDE_8; - packed.width = GEN_WIDTH_4; - - p->push(); - p->curr.execWidth = 8; - if (simd == 16) { - p->MOV(unpacked, GenRegister::h2(packed)); - p->MOV(GenRegister::offset(unpacked, 2), - GenRegister::h2(GenRegister::offset(packed, 0, typeSize(GEN_TYPE_UD)))); + if (isScalar) { + p->MOV(unpacked, packed); - p->curr.quarterControl = 1; - p->MOV(GenRegister::offset(unpacked, 1), GenRegister::h2(GenRegister::offset(packed, 2))); - p->MOV(GenRegister::offset(unpacked, 3), - GenRegister::h2(GenRegister::offset(packed, 2, typeSize(GEN_TYPE_UD)))); + if (simd == 16) { + p->MOV(GenRegister::offset(unpacked, 2), GenRegister::offset(packed, 0, typeSize(GEN_TYPE_UD))); + } else { + p->MOV(GenRegister::offset(unpacked, 1), GenRegister::offset(packed, 0, typeSize(GEN_TYPE_UD))); + } } else { - GBE_ASSERT(simd == 8); - p->MOV(unpacked, GenRegister::h2(packed)); - p->MOV(GenRegister::offset(unpacked, 1), - GenRegister::h2(GenRegister::offset(packed, 0, typeSize(GEN_TYPE_UD)))); + packed.vstride = GEN_VERTICAL_STRIDE_8; + packed.width = GEN_WIDTH_4; + + p->push(); + p->curr.execWidth = 8; + if (simd == 16) { + p->MOV(unpacked, GenRegister::h2(packed)); + p->MOV(GenRegister::offset(unpacked, 2), + GenRegister::h2(GenRegister::offset(packed, 0, typeSize(GEN_TYPE_UD)))); + + p->curr.quarterControl = 1; + p->MOV(GenRegister::offset(unpacked, 1), GenRegister::h2(GenRegister::offset(packed, 2))); + p->MOV(GenRegister::offset(unpacked, 3), + GenRegister::h2(GenRegister::offset(packed, 2, typeSize(GEN_TYPE_UD)))); + } else { + GBE_ASSERT(simd == 8); + p->MOV(unpacked, GenRegister::h2(packed)); + p->MOV(GenRegister::offset(unpacked, 1), + GenRegister::h2(GenRegister::offset(packed, 0, typeSize(GEN_TYPE_UD)))); + } + p->pop(); } - p->pop(); } void Gen8Context::emitRead64Instruction(const SelectionInstruction &insn) |