[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