mirror of
https://gitlab.com/freepascal.org/fpc/pas2js.git
synced 2025-08-26 21:50:35 +02:00
fcl-passrc: resolve multi add without stack
This commit is contained in:
parent
c5a6cca33d
commit
0b2b27559f
@ -10522,6 +10522,9 @@ end;
|
|||||||
|
|
||||||
procedure TPasResolver.ResolveBinaryExpr(El: TBinaryExpr;
|
procedure TPasResolver.ResolveBinaryExpr(El: TBinaryExpr;
|
||||||
Access: TResolvedRefAccess);
|
Access: TResolvedRefAccess);
|
||||||
|
var
|
||||||
|
Left, Next: TPasExpr;
|
||||||
|
Bin: TBinaryExpr;
|
||||||
begin
|
begin
|
||||||
{$IFDEF VerbosePasResolver}
|
{$IFDEF VerbosePasResolver}
|
||||||
//writeln('TPasResolver.ResolveBinaryExpr left=',GetObjName(El.left),' right=',GetObjName(El.right),' opcode=',OpcodeStrings[El.OpCode]);
|
//writeln('TPasResolver.ResolveBinaryExpr left=',GetObjName(El.left),' right=',GetObjName(El.right),' opcode=',OpcodeStrings[El.OpCode]);
|
||||||
@ -10548,7 +10551,27 @@ begin
|
|||||||
RaiseNotYetImplemented(20160922163456,El);
|
RaiseNotYetImplemented(20160922163456,El);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
eopAdd,
|
eopAdd:
|
||||||
|
begin
|
||||||
|
// handle multi add
|
||||||
|
Left:=El.left;
|
||||||
|
while (Left.ClassType=TBinaryExpr) do
|
||||||
|
begin
|
||||||
|
Bin:=TBinaryExpr(Left);
|
||||||
|
if Bin.OpCode<>eopAdd then break;
|
||||||
|
Next:=TBinaryExpr(Left).left;
|
||||||
|
if Next.Parent<>Left then
|
||||||
|
RaiseNotYetImplemented(20210321201257,Left);
|
||||||
|
Left:=Next;
|
||||||
|
end;
|
||||||
|
ResolveExpr(Left,rraRead);
|
||||||
|
repeat
|
||||||
|
Bin:=TBinaryExpr(Left.Parent);
|
||||||
|
if Bin.right<>nil then
|
||||||
|
ResolveExpr(Bin.right,rraRead);
|
||||||
|
Left:=Bin;
|
||||||
|
until Left=El;
|
||||||
|
end;
|
||||||
eopSubtract,
|
eopSubtract,
|
||||||
eopMultiply,
|
eopMultiply,
|
||||||
eopDivide,
|
eopDivide,
|
||||||
@ -12867,6 +12890,8 @@ procedure TPasResolver.ComputeBinaryExpr(Bin: TBinaryExpr; out
|
|||||||
StartEl: TPasElement);
|
StartEl: TPasElement);
|
||||||
var
|
var
|
||||||
LeftResolved, RightResolved: TPasResolverResult;
|
LeftResolved, RightResolved: TPasResolverResult;
|
||||||
|
Left: TPasExpr;
|
||||||
|
SubBin: TBinaryExpr;
|
||||||
begin
|
begin
|
||||||
if (Bin.OpCode=eopSubIdent)
|
if (Bin.OpCode=eopSubIdent)
|
||||||
or ((Bin.OpCode=eopNone) and (Bin.left is TInheritedExpr)) then
|
or ((Bin.OpCode=eopNone) and (Bin.left is TInheritedExpr)) then
|
||||||
@ -12886,11 +12911,37 @@ begin
|
|||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
ComputeElement(Bin.left,LeftResolved,Flags-[rcNoImplicitProc],StartEl);
|
Flags:=Flags-[rcNoImplicitProc,rcNoImplicitProcType];
|
||||||
ComputeElement(Bin.right,RightResolved,Flags-[rcNoImplicitProc],StartEl);
|
if Bin.OpCode=eopAdd then
|
||||||
// ToDo: check operator overloading
|
begin
|
||||||
|
// handle multi-adds without stack
|
||||||
|
Left:=Bin.left;
|
||||||
|
while Left.ClassType=TBinaryExpr do
|
||||||
|
begin
|
||||||
|
SubBin:=TBinaryExpr(Left);
|
||||||
|
if SubBin.OpCode<>eopAdd then break;
|
||||||
|
Left:=SubBin.left;
|
||||||
|
end;
|
||||||
|
// Left is now left-most of multi add
|
||||||
|
ComputeElement(Left,LeftResolved,Flags,StartEl);
|
||||||
|
repeat
|
||||||
|
SubBin:=TBinaryExpr(Left.Parent);
|
||||||
|
ComputeElement(SubBin.right,RightResolved,Flags,StartEl);
|
||||||
|
|
||||||
ComputeBinaryExprRes(Bin,ResolvedEl,Flags,LeftResolved,RightResolved);
|
// ToDo: check operator overloading
|
||||||
|
ComputeBinaryExprRes(SubBin,ResolvedEl,Flags,LeftResolved,RightResolved);
|
||||||
|
LeftResolved:=ResolvedEl;
|
||||||
|
Left:=SubBin;
|
||||||
|
until Left=Bin;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
ComputeElement(Bin.left,LeftResolved,Flags,StartEl);
|
||||||
|
ComputeElement(Bin.right,RightResolved,Flags,StartEl);
|
||||||
|
|
||||||
|
// ToDo: check operator overloading
|
||||||
|
ComputeBinaryExprRes(Bin,ResolvedEl,Flags,LeftResolved,RightResolved);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TPasResolver.ComputeBinaryExprRes(Bin: TBinaryExpr; out
|
procedure TPasResolver.ComputeBinaryExprRes(Bin: TBinaryExpr; out
|
||||||
|
Loading…
Reference in New Issue
Block a user