Rong, could you review this patch and verify it on your BDW machine. Thanks.
On Tue, Jan 27, 2015 at 10:53:22AM +0800, [email protected] wrote: > From: Junyan He <[email protected]> > > 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 <[email protected]> > --- > backend/src/backend/gen8_context.cpp | 94 > ++++++++++++++++++++++-------------- > 1 file changed, 59 insertions(+), 35 deletions(-) > > diff --git a/backend/src/backend/gen8_context.cpp > b/backend/src/backend/gen8_context.cpp > index 07f8c47..cde87de 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) > -- > 1.9.1 > > _______________________________________________ > Beignet mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/beignet _______________________________________________ Beignet mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/beignet
