Appply fix from Gareth Moreton in bug report 38247

git-svn-id: trunk@47838 -
This commit is contained in:
pierre 2020-12-23 10:19:44 +00:00
parent ed3741f06e
commit 2bcd2a4a93

View File

@ -3002,6 +3002,23 @@ unit aoptx86;
check opsize to avoid overflow when left shifting the 1 }
if (taicpu(p).oper[0]^.typ=top_const) and (topsize2memsize[taicpu(hp2).opsize]<=63) then
taicpu(p).oper[0]^.val:=taicpu(p).oper[0]^.val and ((qword(1) shl topsize2memsize[taicpu(hp2).opsize])-1);
{$ifdef x86_64}
{ Be careful of, for example:
movl %reg1,%reg2
addl %reg3,%reg2
movq %reg2,%reg4
This will cause problems if the upper 32-bits of %reg3 or %reg4 are non-zero
}
if (taicpu(hp1).opsize = S_L) and (taicpu(hp2).opsize = S_Q) then
begin
taicpu(hp2).changeopsize(S_L);
setsubreg(taicpu(hp2).oper[0]^.reg, R_SUBD);
setsubreg(taicpu(hp2).oper[1]^.reg, R_SUBD);
end;
{$endif x86_64}
taicpu(hp1).changeopsize(taicpu(hp2).opsize);
taicpu(p).changeopsize(taicpu(hp2).opsize);
if taicpu(p).oper[0]^.typ=top_reg then
@ -6218,9 +6235,6 @@ unit aoptx86;
end;
end;
(* { Disabled this block because it causes IE201810201 in the m68k cross-compiler
on x86-64 at least. Feel free to re-enable after this issue is fixed. (KB) }
{ Backward check to determine necessity of and %reg,%reg }
if (taicpu(p).oper[0]^.typ = top_reg) and
(taicpu(p).oper[0]^.reg = taicpu(p).oper[1]^.reg) and
@ -6243,7 +6257,6 @@ unit aoptx86;
Result := True;
Exit;
end;
*)
end;