mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-17 17:49:13 +02:00
* 16-bit ALU fixes in tmoddivnode.pass_typecheck
git-svn-id: branches/i8086@23878 -
This commit is contained in:
parent
0af13920c1
commit
1dbca4c403
@ -242,7 +242,7 @@ implementation
|
|||||||
{ Additionally, do the same for cardinal/qwords and other positive types, but }
|
{ Additionally, do the same for cardinal/qwords and other positive types, but }
|
||||||
{ always in a way that a smaller type is converted to a bigger type }
|
{ always in a way that a smaller type is converted to a bigger type }
|
||||||
{ (webtbs/tw8870) }
|
{ (webtbs/tw8870) }
|
||||||
if (rd.ordtype in [u32bit,u64bit]) and
|
if (rd.ordtype in [u16bit,u32bit,u64bit]) and
|
||||||
((is_constintnode(left) and
|
((is_constintnode(left) and
|
||||||
(tordconstnode(left).value >= 0)) or
|
(tordconstnode(left).value >= 0)) or
|
||||||
(not is_signed(ld) and
|
(not is_signed(ld) and
|
||||||
@ -251,7 +251,7 @@ implementation
|
|||||||
inserttypeconv(left,right.resultdef);
|
inserttypeconv(left,right.resultdef);
|
||||||
ld:=torddef(left.resultdef);
|
ld:=torddef(left.resultdef);
|
||||||
end;
|
end;
|
||||||
if (ld.ordtype in [u32bit,u64bit]) and
|
if (ld.ordtype in [u16bit,u32bit,u64bit]) and
|
||||||
((is_constintnode(right) and
|
((is_constintnode(right) and
|
||||||
(tordconstnode(right).value >= 0)) or
|
(tordconstnode(right).value >= 0)) or
|
||||||
(not is_signed(rd) and
|
(not is_signed(rd) and
|
||||||
@ -311,6 +311,45 @@ implementation
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
{$endif not cpu64bitaddr}
|
{$endif not cpu64bitaddr}
|
||||||
|
{$if defined(cpu16bitalu) or defined(cpu8bitalu)}
|
||||||
|
{ when there is one 32bit value, everything is done
|
||||||
|
in 32bit }
|
||||||
|
if (is_32bitint(left.resultdef) or
|
||||||
|
is_32bitint(right.resultdef)) then
|
||||||
|
begin
|
||||||
|
if is_signed(rd) or is_signed(ld) then
|
||||||
|
begin
|
||||||
|
if (ld.ordtype<>s32bit) then
|
||||||
|
inserttypeconv(left,s32inttype);
|
||||||
|
if (rd.ordtype<>s32bit) then
|
||||||
|
inserttypeconv(right,s32inttype);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if (ld.ordtype<>u32bit) then
|
||||||
|
inserttypeconv(left,u32inttype);
|
||||||
|
if (rd.ordtype<>u32bit) then
|
||||||
|
inserttypeconv(right,u32inttype);
|
||||||
|
end;
|
||||||
|
resultdef:=left.resultdef;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
{ when mixing cardinals and signed numbers, convert everythign to 64bit (JM) }
|
||||||
|
if ((rd.ordtype = u16bit) and
|
||||||
|
is_signed(ld)) or
|
||||||
|
((ld.ordtype = u16bit) and
|
||||||
|
is_signed(rd)) then
|
||||||
|
begin
|
||||||
|
// TODO: 16->32 bit version of this message
|
||||||
|
// CGMessage(type_h_mixed_signed_unsigned);
|
||||||
|
if (ld.ordtype<>s32bit) then
|
||||||
|
inserttypeconv(left,s32inttype);
|
||||||
|
if (rd.ordtype<>s32bit) then
|
||||||
|
inserttypeconv(right,s32inttype);
|
||||||
|
resultdef:=left.resultdef;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
{$endif cpu16bitalu or cpu8bitalu}
|
||||||
begin
|
begin
|
||||||
{ Make everything always default singed int }
|
{ Make everything always default singed int }
|
||||||
if not(rd.ordtype in [torddef(sinttype).ordtype,torddef(uinttype).ordtype]) then
|
if not(rd.ordtype in [torddef(sinttype).ordtype,torddef(uinttype).ordtype]) then
|
||||||
|
Loading…
Reference in New Issue
Block a user