From 1dbca4c403d2ce46a3441219d159a06a3ec6af1f Mon Sep 17 00:00:00 2001 From: nickysn Date: Sat, 16 Mar 2013 22:50:09 +0000 Subject: [PATCH] * 16-bit ALU fixes in tmoddivnode.pass_typecheck git-svn-id: branches/i8086@23878 - --- compiler/nmat.pas | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/compiler/nmat.pas b/compiler/nmat.pas index 6f3ab9555a..ee779d2722 100644 --- a/compiler/nmat.pas +++ b/compiler/nmat.pas @@ -242,7 +242,7 @@ implementation { 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 } { (webtbs/tw8870) } - if (rd.ordtype in [u32bit,u64bit]) and + if (rd.ordtype in [u16bit,u32bit,u64bit]) and ((is_constintnode(left) and (tordconstnode(left).value >= 0)) or (not is_signed(ld) and @@ -251,7 +251,7 @@ implementation inserttypeconv(left,right.resultdef); ld:=torddef(left.resultdef); end; - if (ld.ordtype in [u32bit,u64bit]) and + if (ld.ordtype in [u16bit,u32bit,u64bit]) and ((is_constintnode(right) and (tordconstnode(right).value >= 0)) or (not is_signed(rd) and @@ -311,6 +311,45 @@ implementation end else {$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 { Make everything always default singed int } if not(rd.ordtype in [torddef(sinttype).ordtype,torddef(uinttype).ordtype]) then