GBE: support load/store of char/short vector.
authorZhigang Gong <zhigang.gong@linux.intel.com>
Fri, 24 May 2013 09:40:54 +0000 (17:40 +0800)
committerZhigang Gong <zhigang.gong@linux.intel.com>
Wed, 29 May 2013 05:58:17 +0000 (13:58 +0800)
We just load/store those vector elements one by one.

Signed-off-by: Zhigang Gong <zhigang.gong@linux.intel.com>
Tested-by: Lv, Meng <meng.lv@intel.com>
Reviewed-by: Yang Rong <rong.r.yang@intel.com>
backend/src/llvm/llvm_gen_backend.cpp

index 3fe0cbf..0037af2 100644 (file)
@@ -2224,8 +2224,27 @@ namespace gbe
               ctx.STORE(type, tuple, addr, addrSpace, 4, true);
           }
         }
-      } else
-        GBE_ASSERTM(false, "loads / stores of vectors of short / chars is not supported yet");
+      } else {
+        for (uint32_t elemID = 0; elemID < elemNum; elemID++) {
+          const ir::Register reg = this->getRegister(llvmValues, elemID);
+          ir::Register addr;
+          if (elemID == 0)
+            addr = ptr;
+          else {
+              const ir::Register offset = ctx.reg(pointerFamily);
+              ir::ImmediateIndex immIndex;
+              int elemSize = getTypeByteSize(unit, elemType);
+              immIndex = ctx.newImmediate(int32_t(elemID * elemSize));
+              addr = ctx.reg(pointerFamily);
+              ctx.LOADI(ir::TYPE_S32, offset, immIndex);
+              ctx.ADD(ir::TYPE_S32, addr, ptr, offset);
+          }
+          if (isLoad)
+           ctx.LOAD(type, addr, addrSpace, dwAligned, reg);
+          else
+           ctx.STORE(type, addr, addrSpace, dwAligned, reg);
+        }
+      }
     }
   }