瀏覽代碼

* fixed register and operation sizes of a_load_ref_reg_unaligned()
and a_load_reg_ref_unaligned()

git-svn-id: trunk@7120 -

Jonas Maebe 18 年之前
父節點
當前提交
4e44015b8e
共有 1 個文件被更改,包括 18 次插入6 次删除
  1. 18 6
      compiler/cgobj.pas

+ 18 - 6
compiler/cgobj.pas

@@ -1801,27 +1801,35 @@ implementation
                 begin
                   if target_info.endian=endian_big then
                     inc(tmpref.offset);
+                  register:=makeregsize(list,register,OS_8);
                   a_load_reg_ref(list,OS_8,OS_8,register,tmpref);
-                  a_op_const_reg(list,OP_SHR,OS_8,8,register);
+                  register:=makeregsize(list,register,OS_16);
+                  a_op_const_reg(list,OP_SHR,OS_16,8,register);
                   if target_info.endian=endian_big then
                     dec(tmpref.offset)
                   else
                     inc(tmpref.offset);
+                  register:=makeregsize(list,register,OS_8);
                   a_load_reg_ref(list,OS_8,OS_8,register,tmpref);
+                  register:=makeregsize(list,register,OS_16);
                 end;
               OS_32,OS_S32:
                 begin
                   if target_info.endian=endian_big then
                     inc(tmpref.offset,3);
+                  register:=makeregsize(list,register,OS_8);
                   a_load_reg_ref(list,OS_8,OS_8,register,tmpref);
+                  register:=makeregsize(list,register,OS_32);
                   for i:=1 to 3 do
                     begin
-                      a_op_const_reg(list,OP_SHR,OS_8,8,register);
+                      a_op_const_reg(list,OP_SHR,OS_32,8,register);
                       if target_info.endian=endian_big then
                         dec(tmpref.offset)
                       else
                         inc(tmpref.offset);
+                      register:=makeregsize(list,register,OS_8);
                       a_load_reg_ref(list,OS_8,OS_8,register,tmpref);
+                      register:=makeregsize(list,register,OS_32);
                     end;
                 end
               else
@@ -1849,13 +1857,15 @@ implementation
                 begin
                   if target_info.endian=endian_little then
                     inc(tmpref.offset);
+                  register:=makeregsize(list,register,OS_8);
                   a_load_ref_reg(list,OS_8,OS_8,tmpref,register);
-                  a_op_const_reg(list,OP_SHL,OS_8,8,register);
+                  register:=makeregsize(list,register,OS_16);
+                  a_op_const_reg(list,OP_SHL,OS_16,8,register);
                   if target_info.endian=endian_little then
                     dec(tmpref.offset)
                   else
                     inc(tmpref.offset);
-                  tmpreg:=getintregister(list,OS_INT);
+                  tmpreg:=getintregister(list,OS_16);
                   a_load_ref_reg(list,OS_8,OS_16,tmpref,tmpreg);
                   a_op_reg_reg(list,OP_OR,OS_16,tmpreg,register);
                 end;
@@ -1863,15 +1873,17 @@ implementation
                 begin
                   if target_info.endian=endian_little then
                     inc(tmpref.offset,3);
+                  register:=makeregsize(list,register,OS_8);
                   a_load_ref_reg(list,OS_8,OS_8,tmpref,register);
+                  register:=makeregsize(list,register,OS_32);
                   for i:=1 to 3 do
                     begin
-                      a_op_const_reg(list,OP_SHL,OS_8,8,register);
+                      a_op_const_reg(list,OP_SHL,OS_32,8,register);
                       if target_info.endian=endian_little then
                         dec(tmpref.offset)
                       else
                         inc(tmpref.offset);
-                      tmpreg:=getintregister(list,OS_INT);
+                      tmpreg:=getintregister(list,OS_32);
                       a_load_ref_reg(list,OS_8,OS_32,tmpref,tmpreg);
                       a_op_reg_reg(list,OP_OR,OS_32,tmpreg,register);
                     end;