diff --git a/compiler/nmat.pas b/compiler/nmat.pas index e7becb20dd..dce92dd60d 100644 --- a/compiler/nmat.pas +++ b/compiler/nmat.pas @@ -111,6 +111,7 @@ implementation function tmoddivnode.simplify(forinline : boolean):tnode; var rv,lv : tconstexprint; + hp: tnode; begin result:=nil; @@ -162,8 +163,22 @@ implementation left:=nil; exit; end; + if (nodetype=divn) and (left.nodetype=divn) and is_constintnode(tmoddivnode(left).right) and + { we need a type and the types must be consistent } + assigned(resultdef) and + (compare_defs(resultdef,left.resultdef,nothingn)=te_exact) then + begin + { re-use the current node so we get the result type right } + right:=caddnode.create_internal(muln,right,tmoddivnode(left).right.getcopy); + hp:=tmoddivnode(left).left.getcopy; + left.Free; + left:=hp; + Result:=getcopy; + Result.resultdef:=nil; + Result:=ctypeconvnode.create_internal(Result,resultdef); + exit; + end; end; - if is_constintnode(right) and is_constintnode(left) then begin rv:=tordconstnode(right).value; @@ -380,6 +395,10 @@ implementation resultdef:=right.resultdef; end; + result:=simplify(false); + if assigned(result) then + exit; + { when the result is currency we need some extra code for division. this should not be done when the divn node is created internally }