浏览代码

* mips: Added support for unaligned load/store. It greatly improves performance and prevents bus errors on systems which do not emulate unaligned memory access.

git-svn-id: trunk@45871 -
yury 5 年之前
父节点
当前提交
cc936710a0
共有 1 个文件被更改,包括 12 次插入0 次删除
  1. 12 0
      compiler/mips/cgcpu.pas

+ 12 - 0
compiler/mips/cgcpu.pas

@@ -465,6 +465,12 @@ var
 begin
 begin
   if (TCGSize2Size[fromsize] < TCGSize2Size[tosize]) then
   if (TCGSize2Size[fromsize] < TCGSize2Size[tosize]) then
     a_load_reg_reg(list,fromsize,tosize,reg,reg);
     a_load_reg_reg(list,fromsize,tosize,reg,reg);
+  if (ref.alignment<>0) and
+     (ref.alignment<tcgsize2size[tosize]) then
+    begin
+      a_load_reg_ref_unaligned(list,FromSize,ToSize,reg,ref);
+      exit;
+    end;
   case tosize of
   case tosize of
     OS_8,
     OS_8,
     OS_S8:
     OS_S8:
@@ -491,6 +497,12 @@ var
 begin
 begin
   if (TCGSize2Size[fromsize] >= TCGSize2Size[tosize]) then
   if (TCGSize2Size[fromsize] >= TCGSize2Size[tosize]) then
     fromsize := tosize;
     fromsize := tosize;
+  if (ref.alignment<>0) and
+     (ref.alignment<tcgsize2size[fromsize]) then
+     begin
+       a_load_ref_reg_unaligned(list,FromSize,ToSize,ref,reg);
+       exit;
+     end;
   case fromsize of
   case fromsize of
     OS_S8:
     OS_S8:
       Op := A_LB;{Load Signed Byte}
       Op := A_LB;{Load Signed Byte}