瀏覽代碼

Fix handling of parameters with size below the size of a full register

git-svn-id: trunk@44380 -
pierre 5 年之前
父節點
當前提交
41e554067a
共有 1 個文件被更改,包括 6 次插入2 次删除
  1. 6 2
      compiler/cgobj.pas

+ 6 - 2
compiler/cgobj.pas

@@ -1229,8 +1229,12 @@ implementation
                 shifted to the top of the to 4 resp. 8 byte register on the
                 shifted to the top of the to 4 resp. 8 byte register on the
                 caller side and needs to be stored with those bytes at the
                 caller side and needs to be stored with those bytes at the
                 start of the reference -> don't shift right }
                 start of the reference -> don't shift right }
-              else if (paraloc.shiftval<0) and
-                      ((-paraloc.shiftval) in [8,16,32]) then
+              else if (paraloc.shiftval<0)
+{$ifdef CPU64BITALU}
+                      and ((-paraloc.shiftval) in [56{for byte},48{for two bytes},32{for four bytes}])
+{$else}
+                      and ((-paraloc.shiftval) in [24{for byte},16{for two bytes}])
+{$endif} then
                 begin
                 begin
                   a_op_const_reg_reg(list,OP_SHR,OS_INT,-paraloc.shiftval,paraloc.register,paraloc.register);
                   a_op_const_reg_reg(list,OP_SHR,OS_INT,-paraloc.shiftval,paraloc.register,paraloc.register);
                   { convert to a register of 1/2/4 bytes in size, since the
                   { convert to a register of 1/2/4 bytes in size, since the