Skip to content

Commit 079af85

Browse files
authored
(decomp): Optimize the statement insertor (#198)
* rewrite the expensive part of the statement insertor * cleanup * final cleanup and documentation.
1 parent ceebabd commit 079af85

File tree

1 file changed

+26
-38
lines changed

1 file changed

+26
-38
lines changed

logic/statement_insertor.dl

Lines changed: 26 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#pragma once
22

33
#include "global_components.dl"
4-
#define MAX_INSERTS 5
54

65

76
#define COPY_OUTPUT(to, from)\
@@ -34,6 +33,14 @@ INITIALIZE_STATEMENT_INSERTOR(_insertor, to)
3433
.decl Out_Statement_Next(stmt: Statement, next: Statement)
3534
.decl Out_Statement_Opcode(stmt: Statement, op: Opcode)
3635
.decl Out_PushValue(stmt: Statement, value: Value)
36+
37+
// The last `statement` in the original bytecode, start adding cloned code after it.
38+
.decl MaxOriginalStatement(statement: Statement)
39+
40+
MaxOriginalStatement(as(maxStmt, Statement)):-
41+
maxStmtNumber = max stmtNumber : { Statement_Opcode(stmt, _), stmtNumber = @hex_to_number(stmt)},
42+
maxStmt = @number_to_hex(2*maxStmtNumber).
43+
3744
}
3845

3946
.comp StatementInsertor : CodeTransformer {
@@ -67,42 +74,29 @@ INITIALIZE_STATEMENT_INSERTOR(_insertor, to)
6774
insertOpsN(stmt, rest, n+1) :-
6875
insertOpsN(stmt, [[op, value], rest], n).
6976

70-
71-
.decl PreInsertedOpNewStatementNum(stmt: Statement, order: number, newStmt: number)
72-
73-
PreInsertedOpNewStatementNum(stmt, order, @hex_to_number(stmt) * MAX_INSERTS + order) :-
74-
insertOp(stmt, _, _, order).
75-
76-
.decl PreInsertedOpMissingStmt(n : number)
77-
78-
PreInsertedOpMissingStmt(newStmt - 1) :-
79-
PreInsertedOpNewStatementNum(_, _, newStmt), newStmt > 0,
80-
!PreInsertedOpNewStatementNum(_, _, newStmt - 1).
81-
82-
PreInsertedOpMissingStmt(newStmt - 1) :-
83-
PreInsertedOpMissingStmt(newStmt), newStmt > 0,
84-
!PreInsertedOpNewStatementNum(_, _, newStmt - 1).
85-
86-
.decl MaxStmt(n: number)
87-
MaxStmt(n) :- n = max @hex_to_number(stmt) : Statement_Opcode(stmt, _).
77+
// Random order of the insertions using the choice-domain
78+
.decl Insertion_Next(ins: Statement, next: Statement) choice-domain ins, next
79+
Insertion_Next("nil", "head").
80+
Insertion_Next(prev, next):-
81+
Insertion_Next(_, prev),
82+
insertOp(next, _, _, _).
8883

8984
.decl InsertedOpNewStatement(stmt: Statement, order: number, newStmt: Statement)
9085

91-
.decl WastedSlots(newStmt: number, n: number)
86+
InsertedOpNewStatement(stmt, 0, as(@add_256(maxStmt, "0x20"), Statement)):-
87+
insertOp(stmt, _, _, 0),
88+
Insertion_Next("head", stmt),
89+
MaxOriginalStatement(maxStmt).
9290

93-
.decl TempPreInsertedOpNewAndMissingStatementNum(smallerThanNewStmt: number, newStmt: number)
94-
TempPreInsertedOpNewAndMissingStatementNum(smallerThanNewStmt, newStmt) :-
95-
PreInsertedOpNewStatementNum(_, _, newStmt),
96-
PreInsertedOpMissingStmt(smallerThanNewStmt), smallerThanNewStmt < newStmt.
97-
98-
WastedSlots(newStmt, n) :-
99-
PreInsertedOpNewStatementNum(_, _, newStmt),
100-
n = count : { TempPreInsertedOpNewAndMissingStatementNum(_, newStmt) }.
91+
InsertedOpNewStatement(stmt, order + 1, as(@add_256(newPrevStmt, "0x20"), Statement)):-
92+
InsertedOpNewStatement(stmt, order, newPrevStmt),
93+
insertOp(stmt, _, _, order),
94+
insertOp(stmt, _, _, order + 1).
10195

102-
InsertedOpNewStatement(stmt, order, as(@number_to_hex(newStmt - n + maxStmt + 1), Statement)) :-
103-
PreInsertedOpNewStatementNum(stmt, order, newStmt),
104-
MaxStmt(maxStmt),
105-
WastedSlots(newStmt, n).
96+
// Note: Insertions are placed 80 slots from each other, can make more precise
97+
InsertedOpNewStatement(stmt, 0, as(@add_256(newPrevStmt, "0xa00"), Statement)):-
98+
InsertedOpNewStatement(prevStmt, 0, newPrevStmt),
99+
Insertion_Next(prevStmt, stmt).
106100

107101
Out_Statement_Opcode(stmt, op) :-
108102
Statement_Opcode(stmt, op),
@@ -250,9 +244,6 @@ INITIALIZE_STATEMENT_INSERTOR(_insertor, to)
250244
.decl Prev_Block_OriginalBlock(block: Block, originalBlock: Block)
251245
.decl In_Block_OriginalBlock(block: Block, originalBlock: Block)
252246

253-
// The last `statement` in the original bytecode, start adding cloned code after it.
254-
.decl MaxOriginalStatement(statement: Statement)
255-
256247
// compute the block size to use on the cloned blocks
257248
.decl BlockSize(block: Block, size: number)
258249

@@ -313,9 +304,6 @@ INITIALIZE_STATEMENT_INSERTOR(_insertor, to)
313304
DEBUG_OUTPUT(Block_OriginalBlock)
314305
DEBUG_OUTPUT(BlockToClone)
315306

316-
MaxOriginalStatement(as(maxStmt, Statement)):-
317-
maxStmtNumber = max stmtNumber : { Statement_Opcode(stmt, _), stmtNumber = @hex_to_number(stmt)},
318-
maxStmt = @number_to_hex(2*maxStmtNumber).
319307

320308
// New definition, makes it pre cloning insertion safe
321309
BlockSize(block, maxStmt - @hex_to_number(block)):-

0 commit comments

Comments
 (0)