Ver código fonte

* fixed sign extension for unaligned loads (mantis #29891, although that
code shouldn't use unaligned loads in the first place)

git-svn-id: trunk@33382 -

Jonas Maebe 9 anos atrás
pai
commit
a5dba44fd3
3 arquivos alterados com 36 adições e 3 exclusões
  1. 1 0
      .gitattributes
  2. 3 3
      compiler/cgobj.pas
  3. 32 0
      tests/webtbs/tw29923.pp

+ 1 - 0
.gitattributes

@@ -14994,6 +14994,7 @@ tests/webtbs/tw2983.pp svneol=native#text/plain
 tests/webtbs/tw2984.pp svneol=native#text/plain
 tests/webtbs/tw29893.pp svneol=native#text/pascal
 tests/webtbs/tw29912.pp svneol=native#text/plain
+tests/webtbs/tw29923.pp svneol=native#text/plain
 tests/webtbs/tw2998.pp svneol=native#text/plain
 tests/webtbs/tw2999.pp svneol=native#text/plain
 tests/webtbs/tw3004.pp svneol=native#text/plain

+ 3 - 3
compiler/cgobj.pas

@@ -1323,7 +1323,7 @@ implementation
                     tmpreg2:=makeregsize(list,register,OS_16);
                     a_load_ref_reg(list,OS_8,OS_16,tmpref,tmpreg2);
                     a_op_reg_reg(list,OP_OR,OS_16,tmpreg,tmpreg2);
-                    a_load_reg_reg(list,OS_16,tosize,tmpreg2,register);
+                    a_load_reg_reg(list,fromsize,tosize,tmpreg2,register);
                   end;
               OS_32,OS_S32:
                 if ref.alignment=2 then
@@ -1340,7 +1340,7 @@ implementation
                     tmpreg2:=makeregsize(list,register,OS_32);
                     a_load_ref_reg(list,OS_16,OS_32,tmpref,tmpreg2);
                     a_op_reg_reg(list,OP_OR,OS_32,tmpreg,tmpreg2);
-                    a_load_reg_reg(list,OS_32,tosize,tmpreg2,register);
+                    a_load_reg_reg(list,fromsize,tosize,tmpreg2,register);
                   end
                 else
                   begin
@@ -1359,7 +1359,7 @@ implementation
                         a_load_ref_reg(list,OS_8,OS_32,tmpref,tmpreg2);
                         a_op_reg_reg(list,OP_OR,OS_32,tmpreg2,tmpreg);
                       end;
-                    a_load_reg_reg(list,OS_32,tosize,tmpreg,register);
+                    a_load_reg_reg(list,fromsize,tosize,tmpreg,register);
                   end
               else
                 a_load_ref_reg(list,fromsize,tosize,tmpref,register);

+ 32 - 0
tests/webtbs/tw29923.pp

@@ -0,0 +1,32 @@
+{$mode objfpc}
+
+{$r+}
+
+type
+  tc = class
+    f: longint;
+    procedure test;
+  end;
+
+procedure tc.test;
+
+procedure nest;
+var
+  l1: longint;
+begin
+  f:=-1;
+  l1:=-1;
+  dec(f,l1*120);
+end;
+
+begin
+  nest;
+end;
+
+var
+  c: tc;
+begin
+  c:=tc.create;
+  c.test;
+  c.free;
+end.