[Beignet] [PATCH] Add the logic for pack/unpack long for scalar.
junyan.he at inbox.com
junyan.he at inbox.com
Mon Jan 26 18:53:22 PST 2015
From: Junyan He <junyan.he at linux.intel.com>
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 at linux.intel.com>
---
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
More information about the Beignet
mailing list