From a5dba44fd3ebb1a11dcdd31c9460a146e3e5bf2f Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Tue, 29 Mar 2016 14:52:27 +0000 Subject: [PATCH] * 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 - --- .gitattributes | 1 + compiler/cgobj.pas | 6 +++--- tests/webtbs/tw29923.pp | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 tests/webtbs/tw29923.pp diff --git a/.gitattributes b/.gitattributes index 7538527401..cf1193a6e1 100644 --- a/.gitattributes +++ b/.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 diff --git a/compiler/cgobj.pas b/compiler/cgobj.pas index 43f9c20a97..af0804ecd1 100644 --- a/compiler/cgobj.pas +++ b/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); diff --git a/tests/webtbs/tw29923.pp b/tests/webtbs/tw29923.pp new file mode 100644 index 0000000000..3d1bf4c95a --- /dev/null +++ b/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.