summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunyan He <junyan.he@linux.intel.com>2015-01-27 10:53:22 +0800
committerZhigang Gong <zhigang.gong@intel.com>2015-01-28 12:45:51 +0800
commit4340b304132ce36cb62069794135016a9135db5d (patch)
tree6dc184facd5899b403fd13b5384bb35f7ba9a9b9
parent2757e2eeb6ca68bf2c725ed66cedb55c82ee6e90 (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.cpp94
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)