X Tutup
Skip to content

Commit cecd0bc

Browse files
committed
Minor optimize for if else, opJumpXxx now take relative address instead
1 parent 2437e37 commit cecd0bc

File tree

1 file changed

+70
-97
lines changed

1 file changed

+70
-97
lines changed

ScriptEngine.pas

Lines changed: 70 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -92,14 +92,11 @@ interface
9292
opAssignGlobalArray,
9393
opAssignLocalVar,
9494
opAssignLocalArray,
95-
opJumpEqual,
96-
opJumpEqual1,
97-
opJumpUnconditional,
98-
opJumpEqualOrGreater2,
99-
opJumpEqualOrLesser2,
100-
95+
opJumpEqualRel,
10196
opJumpEqual1Rel,
10297
opJumpUnconditionalRel,
98+
opJumpEqualOrGreater2Rel,
99+
opJumpEqualOrLesser2Rel,
103100

104101
opOperatorInc,
105102

@@ -713,14 +710,11 @@ TSECacheMap = class(TSECacheMapAncestor)
713710
3, // opAssignGlobalArray,
714711
3, // opAssignLocalVar,
715712
4, // opAssignLocalArray,
716-
2, // opJumpEqual,
717-
3, // opJumpEqual1,
718-
2, // opJumpUnconditional,
719-
6, // opJumpEqualOrGreater2,
720-
6, // opJumpEqualOrLesser2,
721-
713+
2, // opJumpEqualRel,
722714
3, // opJumpEqual1Rel,
723715
2, // opJumpUnconditionalRel,
716+
6, // opJumpEqualOrGreater2Rel,
717+
6, // opJumpEqualOrLesser2Rel,
724718

725719
4, // opOperatorInc,
726720

@@ -5541,14 +5535,11 @@ procedure TSEVM.Exec;
55415535
labelAssignGlobalArray,
55425536
labelAssignLocalVar,
55435537
labelAssignLocalArray,
5544-
labelJumpEqual,
5545-
labelJumpEqual1,
5546-
labelJumpUnconditional,
5547-
labelJumpEqualOrGreater2,
5548-
labelJumpEqualOrLesser2,
5549-
5538+
labelJumpEqualRel,
55505539
labelJumpEqual1Rel,
55515540
labelJumpUnconditionalRel,
5541+
labelJumpEqualOrGreater2Rel,
5542+
labelJumpEqualOrLesser2Rel,
55525543

55535544
labelOperatorInc,
55545545

@@ -5609,14 +5600,11 @@ procedure TSEVM.Exec;
56095600
@labelAssignGlobalArray,
56105601
@labelAssignLocalVar,
56115602
@labelAssignLocalArray,
5612-
@labelJumpEqual,
5613-
@labelJumpEqual1,
5614-
@labelJumpUnconditional,
5615-
@labelJumpEqualOrGreater2,
5616-
@labelJumpEqualOrLesser2,
5617-
5603+
@labelJumpEqualRel,
56185604
@labelJumpEqual1Rel,
56195605
@labelJumpUnconditionalRel,
5606+
@labelJumpEqualOrGreater2Rel,
5607+
@labelJumpEqualOrLesser2Rel,
56205608

56215609
@labelOperatorInc,
56225610

@@ -6024,71 +6012,55 @@ procedure TSEVM.Exec;
60246012
Inc(CodePtrLocal);
60256013
DispatchGoto;
60266014
end;
6027-
{$ifndef SE_COMPUTED_GOTO}opJumpEqual:{$endif}
6015+
{$ifndef SE_COMPUTED_GOTO}opJumpEqualRel:{$endif}
60286016
begin
6029-
labelJumpEqual:
6017+
labelJumpEqualRel:
60306018
B := Pop;
60316019
A := Pop;
60326020
if SEValueEqual(A^, B^) then
6033-
CodePtrLocal := Integer(BinaryLocal[CodePtrLocal + 1].VarPointer)
6021+
CodePtrLocal := CodePtrLocal + Integer(BinaryLocal[CodePtrLocal + 1].VarPointer)
60346022
else
60356023
Inc(CodePtrLocal, 2);
60366024
DispatchGoto;
60376025
end;
6038-
{$ifndef SE_COMPUTED_GOTO}opJumpEqual1:{$endif}
6026+
{$ifndef SE_COMPUTED_GOTO}opJumpEqual1Rel:{$endif}
60396027
begin
6040-
labelJumpEqual1:
6028+
labelJumpEqual1Rel:
60416029
A := Pop;
60426030
if SEValueEqual(A^, BinaryLocal[CodePtrLocal + 1]) then
6043-
CodePtrLocal := Integer(BinaryLocal[CodePtrLocal + 2].VarPointer)
6031+
CodePtrLocal := CodePtrLocal + Integer(BinaryLocal[CodePtrLocal + 2].VarPointer)
60446032
else
60456033
Inc(CodePtrLocal, 3);
60466034
DispatchGoto;
60476035
end;
6048-
{$ifndef SE_COMPUTED_GOTO}opJumpUnconditional:{$endif}
6036+
{$ifndef SE_COMPUTED_GOTO}opJumpUnconditionalRel:{$endif}
60496037
begin
6050-
labelJumpUnconditional:
6051-
CodePtrLocal := Integer(BinaryLocal[CodePtrLocal + 1].VarPointer);
6038+
labelJumpUnconditionalRel:
6039+
CodePtrLocal := CodePtrLocal + Integer(BinaryLocal[CodePtrLocal + 1].VarPointer);
60526040
DispatchGoto;
60536041
end;
6054-
{$ifndef SE_COMPUTED_GOTO}opJumpEqualOrGreater2:{$endif}
6042+
{$ifndef SE_COMPUTED_GOTO}opJumpEqualOrGreater2Rel:{$endif}
60556043
begin
6056-
labelJumpEqualOrGreater2:
6044+
labelJumpEqualOrGreater2Rel:
60576045
B := GetVariable(BinaryLocal[CodePtrLocal + 3].VarPointer, BinaryLocal[CodePtrLocal + 4].VarPointer);
60586046
A := GetVariable(BinaryLocal[CodePtrLocal + 1].VarPointer, BinaryLocal[CodePtrLocal + 2].VarPointer);
60596047
if SEValueGreaterOrEqual(A^, B^) then
6060-
CodePtrLocal := Integer(BinaryLocal[CodePtrLocal + 5].VarPointer)
6048+
CodePtrLocal := CodePtrLocal + Integer(BinaryLocal[CodePtrLocal + 5].VarPointer)
60616049
else
60626050
Inc(CodePtrLocal, 6);
60636051
DispatchGoto;
60646052
end;
6065-
{$ifndef SE_COMPUTED_GOTO}opJumpEqualOrLesser2:{$endif}
6053+
{$ifndef SE_COMPUTED_GOTO}opJumpEqualOrLesser2Rel:{$endif}
60666054
begin
6067-
labelJumpEqualOrLesser2:
6055+
labelJumpEqualOrLesser2Rel:
60686056
B := GetVariable(BinaryLocal[CodePtrLocal + 3].VarPointer, BinaryLocal[CodePtrLocal + 4].VarPointer);
60696057
A := GetVariable(BinaryLocal[CodePtrLocal + 1].VarPointer, BinaryLocal[CodePtrLocal + 2].VarPointer);
60706058
if SEValueLesserOrEqual(A^, B^) then
6071-
CodePtrLocal := Integer(BinaryLocal[CodePtrLocal + 5].VarPointer)
6059+
CodePtrLocal := CodePtrLocal + Integer(BinaryLocal[CodePtrLocal + 5].VarPointer)
60726060
else
60736061
Inc(CodePtrLocal, 6);
60746062
DispatchGoto;
60756063
end;
6076-
{$ifndef SE_COMPUTED_GOTO}opJumpEqual1Rel:{$endif}
6077-
begin
6078-
labelJumpEqual1Rel:
6079-
A := Pop;
6080-
if SEValueEqual(A^, BinaryLocal[CodePtrLocal + 1]) then
6081-
CodePtrLocal := CodePtrLocal + Integer(BinaryLocal[CodePtrLocal + 2].VarPointer)
6082-
else
6083-
Inc(CodePtrLocal, 3);
6084-
DispatchGoto;
6085-
end;
6086-
{$ifndef SE_COMPUTED_GOTO}opJumpUnconditionalRel:{$endif}
6087-
begin
6088-
labelJumpUnconditionalRel:
6089-
CodePtrLocal := CodePtrLocal + Integer(BinaryLocal[CodePtrLocal + 1].VarPointer);
6090-
DispatchGoto;
6091-
end;
60926064
{$ifndef SE_COMPUTED_GOTO}opCallRef:{$endif}
60936065
begin
60946066
labelCallRef:
@@ -9076,7 +9048,7 @@ procedure TEvilC.Parse;
90769048

90779049
ReturnList := ReturnStack.Pop;
90789050
for I := 0 to ReturnList.Count - 1 do
9079-
Patch(Integer(ReturnList[I]), Pointer(Self.Binary.Count));
9051+
Patch(Integer(ReturnList[I]), Pointer(Self.Binary.Count) - (Integer(ReturnList[I]) - 2));
90809052
Emit([Pointer(opPopFrame)]);
90819053

90829054
// The pointer may be changed due to reallocation, need to query for it again
@@ -9310,21 +9282,21 @@ procedure TEvilC.Parse;
93109282
IsComparison := False;
93119283
end else
93129284
begin
9313-
JumpEnd := Emit([Pointer(opJumpEqual1), False, Pointer(0)]);
9285+
JumpEnd := Emit([Pointer(opJumpEqual1Rel), False, Pointer(0)]);
93149286
end;
93159287
end;
93169288
ParseBlock;
9317-
JumpBlock := Emit([Pointer(opJumpUnconditional), Pointer(0)]);
9289+
JumpBlock := Emit([Pointer(opJumpUnconditionalRel), Pointer(0)]);
93189290
EndBlock := Self.Binary.Count;
93199291
ContinueList := ContinueStack.Pop;
93209292
BreakList := BreakStack.Pop;
93219293
for I := 0 to ContinueList.Count - 1 do
9322-
Patch(Integer(ContinueList[I]), Pointer(StartBlock));
9294+
Patch(Integer(ContinueList[I]), Pointer(StartBlock) - (Integer(ContinueList[I]) - 1));
93239295
for I := 0 to BreakList.Count - 1 do
9324-
Patch(Integer(BreakList[I]), Pointer(EndBlock));
9325-
Patch(JumpBlock - 1, Pointer(StartBlock));
9296+
Patch(Integer(BreakList[I]), Pointer(EndBlock) - (Integer(BreakList[I]) - 1));
9297+
Patch(JumpBlock - 1, Pointer(StartBlock) - (JumpBlock - 2));
93269298
if IsComparison then
9327-
Patch(JumpEnd - 1, Pointer(EndBlock));
9299+
Patch(JumpEnd - 1, Pointer(EndBlock) - (JumpEnd - 3));
93289300
finally
93299301
ContinueList.Free;
93309302
BreakList.Free;
@@ -9367,20 +9339,20 @@ procedure TEvilC.Parse;
93679339
IsComparison := False;
93689340
end else
93699341
begin
9370-
JumpEnd := Emit([Pointer(opJumpEqual1), False, Pointer(0)]);
9342+
JumpEnd := Emit([Pointer(opJumpEqual1Rel), False, Pointer(0)]);
93719343
end;
93729344
end;
9373-
JumpBlock := Emit([Pointer(opJumpUnconditional), Pointer(0)]);
9345+
JumpBlock := Emit([Pointer(opJumpUnconditionalRel), Pointer(0)]);
93749346
EndBlock := Self.Binary.Count;
93759347
ContinueList := ContinueStack.Pop;
93769348
BreakList := BreakStack.Pop;
93779349
for I := 0 to ContinueList.Count - 1 do
9378-
Patch(Integer(ContinueList[I]), Pointer(ContinueBlock));
9350+
Patch(Integer(ContinueList[I]), Pointer(ContinueBlock) - (Integer(ContinueList[I]) - 1));
93799351
for I := 0 to BreakList.Count - 1 do
9380-
Patch(Integer(BreakList[I]), Pointer(EndBlock));
9381-
Patch(JumpBlock - 1, Pointer(StartBlock));
9352+
Patch(Integer(BreakList[I]), Pointer(EndBlock) - (Integer(BreakList[I]) - 1));
9353+
Patch(JumpBlock - 1, Pointer(StartBlock) - (JumpBlock - 2));
93829354
if IsComparison then
9383-
Patch(JumpEnd - 1, Pointer(EndBlock));
9355+
Patch(JumpEnd - 1, Pointer(EndBlock) - (JumpEnd - 3));
93849356
finally
93859357
ContinueList.Free;
93869358
BreakList.Free;
@@ -9457,18 +9429,18 @@ procedure TEvilC.Parse;
94579429
//EmitPushVar(VarHiddenTargetIdent);
94589430
if Token.Kind = tkTo then
94599431
begin
9460-
JumpEnd := Emit([Pointer(opJumpEqualOrGreater2), Pointer(VarIdent.Addr), GetIdentLocalValue(VarIdent), Pointer(VarHiddenTargetIdent.Addr), GetIdentLocalValue(VarHiddenTargetIdent), Pointer(0)]);
9432+
JumpEnd := Emit([Pointer(opJumpEqualOrGreater2Rel), Pointer(VarIdent.Addr), GetIdentLocalValue(VarIdent), Pointer(VarHiddenTargetIdent.Addr), GetIdentLocalValue(VarHiddenTargetIdent), Pointer(0)]);
94619433
end else
94629434
if Token.Kind = tkDownto then
94639435
begin
9464-
JumpEnd := Emit([Pointer(opJumpEqualOrLesser2), Pointer(VarIdent.Addr), GetIdentLocalValue(VarIdent), Pointer(VarHiddenTargetIdent.Addr), GetIdentLocalValue(VarHiddenTargetIdent), Pointer(0)]);
9436+
JumpEnd := Emit([Pointer(opJumpEqualOrLesser2Rel), Pointer(VarIdent.Addr), GetIdentLocalValue(VarIdent), Pointer(VarHiddenTargetIdent.Addr), GetIdentLocalValue(VarHiddenTargetIdent), Pointer(0)]);
94659437
end;
94669438

94679439
ParseBlock;
94689440

94699441
ContinueBlock := Self.Binary.Count;
94709442
Emit([Pointer(opOperatorInc), Pointer(VarIdent.Addr), GetVarFrame(VarIdent), Step]);
9471-
JumpBlock := Emit([Pointer(opJumpUnconditional), Pointer(0)]);
9443+
JumpBlock := Emit([Pointer(opJumpUnconditionalRel), Pointer(0)]);
94729444
EndBLock := JumpBlock;
94739445
end else
94749446
begin
@@ -9499,7 +9471,7 @@ procedure TEvilC.Parse;
94999471
StartBlock := Self.Binary.Count;
95009472
//EmitPushVar(VarHiddenTargetIdent);
95019473
//EmitPushVar(VarHiddenCountIdent);
9502-
JumpEnd := Emit([Pointer(opJumpEqualOrLesser2), Pointer(VarHiddenTargetIdent.Addr), GetIdentLocalValue(VarHiddenTargetIdent), Pointer(VarHiddenCountIdent.Addr), GetIdentLocalValue(VarHiddenCountIdent), Pointer(0)]);
9474+
JumpEnd := Emit([Pointer(opJumpEqualOrLesser2Rel), Pointer(VarHiddenTargetIdent.Addr), GetIdentLocalValue(VarHiddenTargetIdent), Pointer(VarHiddenCountIdent.Addr), GetIdentLocalValue(VarHiddenCountIdent), Pointer(0)]);
95039475

95049476
EmitPushVar(VarHiddenArrayIdent);
95059477
EmitPushVar(VarHiddenCountIdent);
@@ -9511,18 +9483,18 @@ procedure TEvilC.Parse;
95119483

95129484
ContinueBlock := Self.Binary.Count;
95139485
Emit([Pointer(opOperatorInc), Pointer(VarHiddenCountIdent.Addr), GetVarFrame(VarHiddenCountIdent), 1]);
9514-
JumpBlock := Emit([Pointer(opJumpUnconditional), Pointer(0)]);
9486+
JumpBlock := Emit([Pointer(opJumpUnconditionalRel), Pointer(0)]);
95159487
EndBLock := JumpBlock;
95169488
end;
95179489

95189490
ContinueList := ContinueStack.Pop;
95199491
BreakList := BreakStack.Pop;
95209492
for I := 0 to ContinueList.Count - 1 do
9521-
Patch(Integer(ContinueList[I]), Pointer(ContinueBlock));
9493+
Patch(Integer(ContinueList[I]), Pointer(ContinueBlock) - (Integer(ContinueList[I]) - 1));
95229494
for I := 0 to BreakList.Count - 1 do
9523-
Patch(Integer(BreakList[I]), Pointer(EndBlock));
9524-
Patch(JumpBlock - 1, Pointer(StartBlock));
9525-
Patch(JumpEnd - 1, Pointer(EndBlock));
9495+
Patch(Integer(BreakList[I]), Pointer(EndBlock) - (Integer(BreakList[I]) - 1));
9496+
Patch(JumpBlock - 1, Pointer(StartBlock) - (JumpBlock - 2));
9497+
Patch(JumpEnd - 1, Pointer(EndBlock) - (JumpEnd - 6));
95269498
finally
95279499
ContinueList.Free;
95289500
BreakList.Free;
@@ -9539,21 +9511,23 @@ procedure TEvilC.Parse;
95399511
JumpEnd: Integer;
95409512
begin
95419513
ParseExpr(False);
9542-
JumpBlock1 := Emit([Pointer(opJumpEqual1), True, Pointer(0)]);
9543-
JumpBlock2 := Emit([Pointer(opJumpUnconditional), Pointer(0)]);
9514+
JumpBlock1 := Emit([Pointer(opJumpEqual1Rel), True, Pointer(0)]);
9515+
JumpBlock2 := Emit([Pointer(opJumpUnconditionalRel), Pointer(0)]);
95449516
StartBlock1 := Self.Binary.Count;
95459517
ParseBlock;
9546-
JumpEnd := Emit([Pointer(opJumpUnconditional), Pointer(0)]);
95479518
StartBlock2 := Self.Binary.Count;
9519+
JumpEnd := -1;
95489520
if PeekAtNextToken.Kind = tkElse then
95499521
begin
9522+
JumpEnd := Emit([Pointer(opJumpUnconditionalRel), Pointer(0)]);
95509523
NextToken;
95519524
ParseBlock;
95529525
end;
95539526
EndBlock2 := Self.Binary.Count;
9554-
Patch(JumpBlock1 - 1, Pointer(StartBlock1));
9555-
Patch(JumpBlock2 - 1, Pointer(StartBlock2));
9556-
Patch(JumpEnd - 1, Pointer(EndBlock2));
9527+
Patch(JumpBlock1 - 1, Pointer(StartBlock1) - (JumpBlock1 - 3));
9528+
Patch(JumpBlock2 - 1, Pointer(StartBlock2) - (JumpBlock2 - 2));
9529+
if JumpEnd >= 0 then
9530+
Patch(JumpEnd - 1, Pointer(EndBlock2) - (JumpEnd - 2));
95579531
end;
95589532

95599533
procedure ParseSwitch;
@@ -9589,23 +9563,23 @@ procedure TEvilC.Parse;
95899563
begin
95909564
ParseExpr(False);
95919565
EmitPushVar(VarHiddenIdent);
9592-
JumpBlock1 := Emit([Pointer(opJumpEqual), Pointer(0)]);
9593-
JumpBlock2 := Emit([Pointer(opJumpUnconditional), Pointer(0)]);
9566+
JumpBlock1 := Emit([Pointer(opJumpEqualRel), Pointer(0)]);
9567+
JumpBlock2 := Emit([Pointer(opJumpUnconditionalRel), Pointer(0)]);
95949568
end;
95959569
StartCaseBlock := Self.Binary.Count;
95969570
if JumpNextBlock <> -1 then
95979571
begin
9598-
Patch(JumpNextBlock - 1, Pointer(StartCaseBlock));
9572+
Patch(JumpNextBlock - 1, Pointer(StartCaseBlock) - (JumpNextBlock - 2));
95999573
JumpNextBlock := -1;
96009574
end;
96019575
PeekAtNextTokenExpected([tkColon]);
96029576
ParseBlock(True);
96039577
if Token.Kind = tkCase then
96049578
begin
9605-
JumpNextBlock := Emit([Pointer(opJumpUnconditional), Pointer(0)]);
9579+
JumpNextBlock := Emit([Pointer(opJumpUnconditionalRel), Pointer(0)]);
96069580
EndCaseBlock := Self.Binary.Count;
9607-
Patch(JumpBlock1 - 1, Pointer(StartCaseBlock));
9608-
Patch(JumpBlock2 - 1, Pointer(EndCaseBlock));
9581+
Patch(JumpBlock1 - 1, Pointer(StartCaseBlock) - (JumpBlock1 - 2));
9582+
Patch(JumpBlock2 - 1, Pointer(EndCaseBlock) - (JumpBlock2 - 2));
96099583
end else
96109584
Break;
96119585
end;
@@ -9615,7 +9589,7 @@ procedure TEvilC.Parse;
96159589
BreakList := BreakStack.Pop;
96169590

96179591
for I := 0 to BreakList.Count - 1 do
9618-
Patch(Integer(BreakList[I]), Pointer(EndBlock));
9592+
Patch(Integer(BreakList[I]), Pointer(EndBlock) - (Integer(BreakList[I]) - 1));
96199593
finally
96209594
BreakList.Free;
96219595
end;
@@ -9836,7 +9810,7 @@ procedure TEvilC.Parse;
98369810
JumpCatchBlock := Emit([Pointer(opPushTrap), Pointer(0)]);
98379811
ParseBlock;
98389812
Emit([Pointer(opPopTrap)]);
9839-
JumpFinallyBlock := Emit([Pointer(opJumpUnconditional), Pointer(0)]);
9813+
JumpFinallyBlock := Emit([Pointer(opJumpUnconditionalRel), Pointer(0)]);
98409814

98419815
Self.ScopeStack.Push(Self.VarList.Count);
98429816
CatchBlock := Self.Binary.Count;
@@ -9854,7 +9828,7 @@ procedure TEvilC.Parse;
98549828
ParseBlock;
98559829

98569830
Patch(JumpCatchBlock - 1, Pointer(CatchBlock));
9857-
Patch(JumpFinallyBlock - 1, Pointer(Self.Binary.Count));
9831+
Patch(JumpFinallyBlock - 1, Pointer(Self.Binary.Count) - (JumpFinallyBlock - 2));
98589832
I := Self.ScopeStack.Pop;
98599833
Self.VarList.DeleteRange(I, Self.VarList.Count - I);
98609834
end;
@@ -10018,15 +9992,15 @@ procedure TEvilC.Parse;
100189992
if BreakStack.Count = 0 then
100199993
Error('Not in loop but "break" found', Token);
100209994
List := BreakStack.Peek;
10021-
List.Add(Pointer(Emit([Pointer(opJumpUnconditional), Pointer(0)]) - 1));
9995+
List.Add(Pointer(Emit([Pointer(opJumpUnconditionalRel), Pointer(0)]) - 1));
100229996
end;
100239997
tkContinue:
100249998
begin
100259999
NextToken;
1002610000
if ContinueStack.Count = 0 then
1002710001
Error('Not in loop but "continue" found', Token);
1002810002
List := ContinueStack.Peek;
10029-
List.Add(Pointer(Emit([Pointer(opJumpUnconditional), Pointer(0)]) - 1));
10003+
List.Add(Pointer(Emit([Pointer(opJumpUnconditionalRel), Pointer(0)]) - 1));
1003010004
end;
1003110005
tkReturn:
1003210006
begin
@@ -10597,11 +10571,10 @@ initialization
1059710571
Pointer(opPushLocalVar), Pointer(0), Pointer(0),
1059810572
Pointer(opPushConst), false,
1059910573
Pointer(opOperatorEqual),
10600-
Pointer(opJumpEqual1), true, Pointer(11),
10601-
Pointer(opJumpUnconditional), Pointer(17),
10574+
Pointer(opJumpEqual1Rel), true, Pointer(5),
10575+
Pointer(opJumpUnconditionalRel), Pointer(8),
1060210576
Pointer(opPushLocalVar), Pointer(1), Pointer(0),
1060310577
Pointer(opThrow),
10604-
Pointer(opJumpUnconditional), Pointer(17),
1060510578
Pointer(opPopFrame)
1060610579
];
1060710580
FunctionThrow := [

0 commit comments

Comments
 (0)
X Tutup