|
@@ -32,12 +32,21 @@ interface
|
|
node,symtype;
|
|
node,symtype;
|
|
|
|
|
|
type
|
|
type
|
|
|
|
+ TAddNodeFlag = (
|
|
|
|
+ anf_has_pointerdiv,
|
|
|
|
+ { the node shall be short boolean evaluated, this flag has priority over localswitches }
|
|
|
|
+ anf_short_bool
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ TAddNodeFlags = set of TAddNodeFlag;
|
|
|
|
+
|
|
taddnode = class(tbinopnode)
|
|
taddnode = class(tbinopnode)
|
|
private
|
|
private
|
|
resultrealdefderef: tderef;
|
|
resultrealdefderef: tderef;
|
|
function pass_typecheck_internal:tnode;
|
|
function pass_typecheck_internal:tnode;
|
|
public
|
|
public
|
|
resultrealdef : tdef;
|
|
resultrealdef : tdef;
|
|
|
|
+ addnodeflags: TAddNodeFlags;
|
|
constructor create(tt : tnodetype;l,r : tnode);override;
|
|
constructor create(tt : tnodetype;l,r : tnode);override;
|
|
constructor create_internal(tt:tnodetype;l,r:tnode);
|
|
constructor create_internal(tt:tnodetype;l,r:tnode);
|
|
constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override;
|
|
constructor ppuload(t:tnodetype;ppufile:tcompilerppufile);override;
|
|
@@ -52,6 +61,9 @@ interface
|
|
{$ifdef state_tracking}
|
|
{$ifdef state_tracking}
|
|
function track_state_pass(exec_known:boolean):boolean;override;
|
|
function track_state_pass(exec_known:boolean):boolean;override;
|
|
{$endif}
|
|
{$endif}
|
|
|
|
+ {$ifdef DEBUG_NODE_XML}
|
|
|
|
+ procedure XMLPrintNodeInfo(var T: Text); override;
|
|
|
|
+ {$endif DEBUG_NODE_XML}
|
|
protected
|
|
protected
|
|
{ override the following if you want to implement }
|
|
{ override the following if you want to implement }
|
|
{ parts explicitely in the code generator (JM) }
|
|
{ parts explicitely in the code generator (JM) }
|
|
@@ -140,7 +152,8 @@ implementation
|
|
{$ifdef state_tracking}
|
|
{$ifdef state_tracking}
|
|
nstate,
|
|
nstate,
|
|
{$endif}
|
|
{$endif}
|
|
- cpuinfo;
|
|
|
|
|
|
+ cpuinfo,
|
|
|
|
+ ppu;
|
|
|
|
|
|
|
|
|
|
{*****************************************************************************
|
|
{*****************************************************************************
|
|
@@ -179,6 +192,7 @@ implementation
|
|
constructor taddnode.create(tt : tnodetype;l,r : tnode);
|
|
constructor taddnode.create(tt : tnodetype;l,r : tnode);
|
|
begin
|
|
begin
|
|
inherited create(tt,l,r);
|
|
inherited create(tt,l,r);
|
|
|
|
+ addnodeflags := [];
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
@@ -192,6 +206,7 @@ implementation
|
|
constructor taddnode.ppuload(t: tnodetype; ppufile: tcompilerppufile);
|
|
constructor taddnode.ppuload(t: tnodetype; ppufile: tcompilerppufile);
|
|
begin
|
|
begin
|
|
inherited ppuload(t, ppufile);
|
|
inherited ppuload(t, ppufile);
|
|
|
|
+ ppufile.getset(tppuset1(addnodeflags));
|
|
ppufile.getderef(resultrealdefderef);
|
|
ppufile.getderef(resultrealdefderef);
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -199,7 +214,8 @@ implementation
|
|
procedure taddnode.ppuwrite(ppufile: tcompilerppufile);
|
|
procedure taddnode.ppuwrite(ppufile: tcompilerppufile);
|
|
begin
|
|
begin
|
|
inherited ppuwrite(ppufile);
|
|
inherited ppuwrite(ppufile);
|
|
- ppufile.putderef(resultrealdefderef);
|
|
|
|
|
|
+ ppufile.putset(tppuset1(addnodeflags));
|
|
|
|
+ ppufile.putderef(resultrealdefderef);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
@@ -736,7 +752,7 @@ implementation
|
|
{ pointer-pointer results in an integer }
|
|
{ pointer-pointer results in an integer }
|
|
if (rt=pointerconstn) then
|
|
if (rt=pointerconstn) then
|
|
begin
|
|
begin
|
|
- if not(nf_has_pointerdiv in flags) then
|
|
|
|
|
|
+ if not(anf_has_pointerdiv in addnodeflags) then
|
|
internalerror(2008030101);
|
|
internalerror(2008030101);
|
|
t := cpointerconstnode.create(qword(v),resultdef)
|
|
t := cpointerconstnode.create(qword(v),resultdef)
|
|
end
|
|
end
|
|
@@ -1657,7 +1673,7 @@ implementation
|
|
begin
|
|
begin
|
|
{ we need to copy the whole tree to force another pass_1 }
|
|
{ we need to copy the whole tree to force another pass_1 }
|
|
include(localswitches,cs_full_boolean_eval);
|
|
include(localswitches,cs_full_boolean_eval);
|
|
- exclude(flags,nf_short_bool);
|
|
|
|
|
|
+ exclude(addnodeflags,anf_short_bool);
|
|
result:=getcopy;
|
|
result:=getcopy;
|
|
exit;
|
|
exit;
|
|
end;
|
|
end;
|
|
@@ -1874,6 +1890,7 @@ implementation
|
|
n: taddnode;
|
|
n: taddnode;
|
|
begin
|
|
begin
|
|
n:=taddnode(inherited dogetcopy);
|
|
n:=taddnode(inherited dogetcopy);
|
|
|
|
+ n.addnodeflags := addnodeflags;
|
|
n.resultrealdef:=resultrealdef;
|
|
n.resultrealdef:=resultrealdef;
|
|
result:=n;
|
|
result:=n;
|
|
end;
|
|
end;
|
|
@@ -2237,7 +2254,7 @@ implementation
|
|
begin
|
|
begin
|
|
{ set for & and | operations in macpas mode: they only work on }
|
|
{ set for & and | operations in macpas mode: they only work on }
|
|
{ booleans, and always short circuit evaluation }
|
|
{ booleans, and always short circuit evaluation }
|
|
- if (nf_short_bool in flags) then
|
|
|
|
|
|
+ if (anf_short_bool in addnodeflags) then
|
|
begin
|
|
begin
|
|
if not is_boolean(ld) then
|
|
if not is_boolean(ld) then
|
|
begin
|
|
begin
|
|
@@ -2759,11 +2776,11 @@ implementation
|
|
else
|
|
else
|
|
CGMessage3(type_e_operator_not_supported_for_types,node2opstr(nodetype),ld.typename,rd.typename);
|
|
CGMessage3(type_e_operator_not_supported_for_types,node2opstr(nodetype),ld.typename,rd.typename);
|
|
|
|
|
|
- if not(nf_has_pointerdiv in flags) and
|
|
|
|
|
|
+ if not(anf_has_pointerdiv in addnodeflags) and
|
|
(tpointerdef(rd).pointeddef.size>1) then
|
|
(tpointerdef(rd).pointeddef.size>1) then
|
|
begin
|
|
begin
|
|
hp:=getcopy;
|
|
hp:=getcopy;
|
|
- include(hp.flags,nf_has_pointerdiv);
|
|
|
|
|
|
+ include(taddnode(hp).addnodeflags, anf_has_pointerdiv);
|
|
result:=cmoddivnode.create(divn,hp,
|
|
result:=cmoddivnode.create(divn,hp,
|
|
cordconstnode.create(tpointerdef(rd).pointeddef.size,tpointerdef(rd).pointer_subtraction_result_type,false));
|
|
cordconstnode.create(tpointerdef(rd).pointeddef.size,tpointerdef(rd).pointer_subtraction_result_type,false));
|
|
end;
|
|
end;
|
|
@@ -4755,5 +4772,27 @@ implementation
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
{$endif}
|
|
{$endif}
|
|
|
|
+{$ifdef DEBUG_NODE_XML}
|
|
|
|
+ procedure TAddNode.XMLPrintNodeInfo(var T: Text);
|
|
|
|
+ var
|
|
|
|
+ i: TAddNodeFlag;
|
|
|
|
+ First: Boolean;
|
|
|
|
+ begin
|
|
|
|
+ inherited XMLPrintNodeInfo(T);
|
|
|
|
+ First := True;
|
|
|
|
+ for i in addnodeflags do
|
|
|
|
+ begin
|
|
|
|
+ if First then
|
|
|
|
+ begin
|
|
|
|
+ Write(T, ' addnodeflags="', i);
|
|
|
|
+ First := False;
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ Write(T, ',', i)
|
|
|
|
+ end;
|
|
|
|
+ if not First then
|
|
|
|
+ Write(T, '"');
|
|
|
|
+ end;
|
|
|
|
+{$endif DEBUG_NODE_XML}
|
|
|
|
|
|
end.
|
|
end.
|