Skip to content
This repository was archived by the owner on Apr 10, 2021. It is now read-only.

Commit 37e366e

Browse files
pretty hilarious optimization
1 parent 8ff4536 commit 37e366e

File tree

2 files changed

+135
-138
lines changed

2 files changed

+135
-138
lines changed

byond-extools/src/dmdism/callbacks.h

Lines changed: 132 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -15,137 +15,136 @@
1515
#include "instr_matrix.h"
1616
#include "instr_debug.h"
1717

18-
#define ADD_CALLBACK(op) { op, []() -> Instruction* { return new Instr_##op(op); } },
18+
#define ADD_CALLBACK(op) case op: return new Instr_##op(op);
1919

20-
const std::map<Bytecode, std::type_index> type_callbacks = {
21-
22-
};
23-
24-
const std::map<Bytecode, std::function<Instruction*()>> callbacks = {
25-
ADD_CALLBACK(END)
26-
ADD_CALLBACK(NEW)
27-
ADD_CALLBACK(FORMAT)
28-
ADD_CALLBACK(OUTPUT)
29-
ADD_CALLBACK(OUTPUT_FORMAT)
30-
ADD_CALLBACK(TEST)
31-
ADD_CALLBACK(NOT)
32-
ADD_CALLBACK(JMP)
33-
ADD_CALLBACK(JZ)
34-
ADD_CALLBACK(RET)
35-
ADD_CALLBACK(NEWLIST)
36-
ADD_CALLBACK(SLEEP)
37-
ADD_CALLBACK(SPAWN)
38-
ADD_CALLBACK(CALL)
39-
ADD_CALLBACK(CALLNR)
40-
ADD_CALLBACK(CALLPATH)
41-
ADD_CALLBACK(CALLPARENT)
42-
ADD_CALLBACK(CALLGLOB)
43-
ADD_CALLBACK(GETVAR)
44-
ADD_CALLBACK(SETVAR)
45-
ADD_CALLBACK(GETFLAG)
46-
ADD_CALLBACK(TEQ)
47-
ADD_CALLBACK(TNE)
48-
ADD_CALLBACK(TL)
49-
ADD_CALLBACK(TG)
50-
ADD_CALLBACK(TLE)
51-
ADD_CALLBACK(TGE)
52-
ADD_CALLBACK(ANEG)
53-
ADD_CALLBACK(ADD)
54-
ADD_CALLBACK(SUB)
55-
ADD_CALLBACK(MUL)
56-
ADD_CALLBACK(DIV)
57-
ADD_CALLBACK(MOD)
58-
ADD_CALLBACK(ROUND)
59-
ADD_CALLBACK(ROUNDN)
60-
ADD_CALLBACK(AUGADD)
61-
ADD_CALLBACK(AUGSUB)
62-
ADD_CALLBACK(AUGMUL)
63-
ADD_CALLBACK(AUGDIV)
64-
ADD_CALLBACK(AUGMOD)
65-
ADD_CALLBACK(AUGAND)
66-
ADD_CALLBACK(AUGOR)
67-
ADD_CALLBACK(AUGXOR)
68-
ADD_CALLBACK(AUGLSHIFT)
69-
ADD_CALLBACK(AUGRSHIFT)
70-
ADD_CALLBACK(PUSHI)
71-
ADD_CALLBACK(POP)
72-
ADD_CALLBACK(ITERLOAD)
73-
ADD_CALLBACK(ITERNEXT)
74-
ADD_CALLBACK(LOCATE_POS)
75-
ADD_CALLBACK(LOCATE_REF)
76-
ADD_CALLBACK(PUSHVAL)
77-
ADD_CALLBACK(INC)
78-
ADD_CALLBACK(DEC)
79-
ADD_CALLBACK(SQRT)
80-
ADD_CALLBACK(POW)
81-
ADD_CALLBACK(FINDTEXT)
82-
ADD_CALLBACK(LISTGET)
83-
ADD_CALLBACK(LISTSET)
84-
ADD_CALLBACK(ISTYPE)
85-
ADD_CALLBACK(DBG_FILE)
86-
ADD_CALLBACK(DBG_LINENO)
87-
ADD_CALLBACK(ISNULL)
88-
ADD_CALLBACK(ISINLIST)
89-
ADD_CALLBACK(CALLNAME)
90-
ADD_CALLBACK(PROMPTCHECK)
91-
ADD_CALLBACK(INPUT_)
92-
ADD_CALLBACK(CALL_GLOBAL_ARGLIST)
93-
ADD_CALLBACK(ICON_NEW)
94-
ADD_CALLBACK(JMP2)
95-
ADD_CALLBACK(JNZ)
96-
ADD_CALLBACK(JNZ2)
97-
ADD_CALLBACK(JZ2)
98-
ADD_CALLBACK(POPN)
99-
ADD_CALLBACK(CHECKNUM)
100-
ADD_CALLBACK(FOR_RANGE)
101-
ADD_CALLBACK(MD5)
102-
ADD_CALLBACK(CALL_LIB)
103-
ADD_CALLBACK(CALL_LIB_ARGLIST)
104-
ADD_CALLBACK(ICON_BLEND)
105-
ADD_CALLBACK(MATRIX_NEW)
106-
ADD_CALLBACK(REPLACETEXT)
107-
ADD_CALLBACK(REGEX_NEW)
108-
ADD_CALLBACK(FEXISTS)
109-
ADD_CALLBACK(COPYTEXT)
110-
ADD_CALLBACK(ABS)
111-
ADD_CALLBACK(POST_INC)
112-
ADD_CALLBACK(FCOPY_RSC)
113-
ADD_CALLBACK(ICON_STATES_MODE)
114-
ADD_CALLBACK(CRASH)
115-
ADD_CALLBACK(ISNUM)
116-
ADD_CALLBACK(JMP_OR)
117-
ADD_CALLBACK(JMP_AND)
118-
ADD_CALLBACK(PROB)
119-
ADD_CALLBACK(RAND)
120-
ADD_CALLBACK(RAND_RANGE)
121-
ADD_CALLBACK(BLOCK)
122-
ADD_CALLBACK(STAT)
123-
ADD_CALLBACK(LOG)
124-
ADD_CALLBACK(LOG10)
125-
ADD_CALLBACK(SIN)
126-
ADD_CALLBACK(COS)
127-
ADD_CALLBACK(MIN)
128-
ADD_CALLBACK(MAX)
129-
ADD_CALLBACK(MIN_LIST)
130-
ADD_CALLBACK(MAX_LIST)
131-
ADD_CALLBACK(LOCATE_TYPE)
132-
ADD_CALLBACK(BINARY_AND)
133-
ADD_CALLBACK(BINARY_OR)
134-
ADD_CALLBACK(BINARY_XOR)
135-
ADD_CALLBACK(BITWISE_NOT)
136-
ADD_CALLBACK(LSHIFT)
137-
ADD_CALLBACK(RSHIFT)
138-
ADD_CALLBACK(LENGTH)
139-
ADD_CALLBACK(PICK)
140-
ADD_CALLBACK(ISPATH)
141-
ADD_CALLBACK(ISSUBPATH)
142-
ADD_CALLBACK(TYPESOF)
143-
ADD_CALLBACK(NEW_IMAGE)
144-
ADD_CALLBACK(PRE_INC)
145-
ADD_CALLBACK(POST_INC)
146-
ADD_CALLBACK(PRE_DEC)
147-
ADD_CALLBACK(POST_DEC)
148-
ADD_CALLBACK(LPUSH_CACHE)
149-
ADD_CALLBACK(SET_CACHE)
150-
ADD_CALLBACK(SWITCH)
151-
};
20+
__forceinline Instruction* get_instr(std::uint32_t op) {
21+
switch (op)
22+
{
23+
ADD_CALLBACK(END)
24+
ADD_CALLBACK(NEW)
25+
ADD_CALLBACK(FORMAT)
26+
ADD_CALLBACK(OUTPUT)
27+
ADD_CALLBACK(OUTPUT_FORMAT)
28+
ADD_CALLBACK(TEST)
29+
ADD_CALLBACK(NOT)
30+
ADD_CALLBACK(JMP)
31+
ADD_CALLBACK(JZ)
32+
ADD_CALLBACK(RET)
33+
ADD_CALLBACK(NEWLIST)
34+
ADD_CALLBACK(SLEEP)
35+
ADD_CALLBACK(SPAWN)
36+
ADD_CALLBACK(CALL)
37+
ADD_CALLBACK(CALLNR)
38+
ADD_CALLBACK(CALLPATH)
39+
ADD_CALLBACK(CALLPARENT)
40+
ADD_CALLBACK(CALLGLOB)
41+
ADD_CALLBACK(GETVAR)
42+
ADD_CALLBACK(SETVAR)
43+
ADD_CALLBACK(GETFLAG)
44+
ADD_CALLBACK(TEQ)
45+
ADD_CALLBACK(TNE)
46+
ADD_CALLBACK(TL)
47+
ADD_CALLBACK(TG)
48+
ADD_CALLBACK(TLE)
49+
ADD_CALLBACK(TGE)
50+
ADD_CALLBACK(ANEG)
51+
ADD_CALLBACK(ADD)
52+
ADD_CALLBACK(SUB)
53+
ADD_CALLBACK(MUL)
54+
ADD_CALLBACK(DIV)
55+
ADD_CALLBACK(MOD)
56+
ADD_CALLBACK(ROUND)
57+
ADD_CALLBACK(ROUNDN)
58+
ADD_CALLBACK(AUGADD)
59+
ADD_CALLBACK(AUGSUB)
60+
ADD_CALLBACK(AUGMUL)
61+
ADD_CALLBACK(AUGDIV)
62+
ADD_CALLBACK(AUGMOD)
63+
ADD_CALLBACK(AUGAND)
64+
ADD_CALLBACK(AUGOR)
65+
ADD_CALLBACK(AUGXOR)
66+
ADD_CALLBACK(AUGLSHIFT)
67+
ADD_CALLBACK(AUGRSHIFT)
68+
ADD_CALLBACK(PUSHI)
69+
ADD_CALLBACK(POP)
70+
ADD_CALLBACK(ITERLOAD)
71+
ADD_CALLBACK(ITERNEXT)
72+
ADD_CALLBACK(LOCATE_POS)
73+
ADD_CALLBACK(LOCATE_REF)
74+
ADD_CALLBACK(PUSHVAL)
75+
ADD_CALLBACK(INC)
76+
ADD_CALLBACK(DEC)
77+
ADD_CALLBACK(SQRT)
78+
ADD_CALLBACK(POW)
79+
ADD_CALLBACK(FINDTEXT)
80+
ADD_CALLBACK(LISTGET)
81+
ADD_CALLBACK(LISTSET)
82+
ADD_CALLBACK(ISTYPE)
83+
ADD_CALLBACK(DBG_FILE)
84+
ADD_CALLBACK(DBG_LINENO)
85+
ADD_CALLBACK(ISNULL)
86+
ADD_CALLBACK(ISINLIST)
87+
ADD_CALLBACK(CALLNAME)
88+
ADD_CALLBACK(PROMPTCHECK)
89+
ADD_CALLBACK(INPUT_)
90+
ADD_CALLBACK(CALL_GLOBAL_ARGLIST)
91+
ADD_CALLBACK(ICON_NEW)
92+
ADD_CALLBACK(JMP2)
93+
ADD_CALLBACK(JNZ)
94+
ADD_CALLBACK(JNZ2)
95+
ADD_CALLBACK(JZ2)
96+
ADD_CALLBACK(POPN)
97+
ADD_CALLBACK(CHECKNUM)
98+
ADD_CALLBACK(FOR_RANGE)
99+
ADD_CALLBACK(MD5)
100+
ADD_CALLBACK(CALL_LIB)
101+
ADD_CALLBACK(CALL_LIB_ARGLIST)
102+
ADD_CALLBACK(ICON_BLEND)
103+
ADD_CALLBACK(MATRIX_NEW)
104+
ADD_CALLBACK(REPLACETEXT)
105+
ADD_CALLBACK(REGEX_NEW)
106+
ADD_CALLBACK(FEXISTS)
107+
ADD_CALLBACK(COPYTEXT)
108+
ADD_CALLBACK(ABS)
109+
ADD_CALLBACK(FCOPY_RSC)
110+
ADD_CALLBACK(ICON_STATES_MODE)
111+
ADD_CALLBACK(CRASH)
112+
ADD_CALLBACK(ISNUM)
113+
ADD_CALLBACK(JMP_OR)
114+
ADD_CALLBACK(JMP_AND)
115+
ADD_CALLBACK(PROB)
116+
ADD_CALLBACK(RAND)
117+
ADD_CALLBACK(RAND_RANGE)
118+
ADD_CALLBACK(BLOCK)
119+
ADD_CALLBACK(STAT)
120+
ADD_CALLBACK(LOG)
121+
ADD_CALLBACK(LOG10)
122+
ADD_CALLBACK(SIN)
123+
ADD_CALLBACK(COS)
124+
ADD_CALLBACK(MIN)
125+
ADD_CALLBACK(MAX)
126+
ADD_CALLBACK(MIN_LIST)
127+
ADD_CALLBACK(MAX_LIST)
128+
ADD_CALLBACK(LOCATE_TYPE)
129+
ADD_CALLBACK(BINARY_AND)
130+
ADD_CALLBACK(BINARY_OR)
131+
ADD_CALLBACK(BINARY_XOR)
132+
ADD_CALLBACK(BITWISE_NOT)
133+
ADD_CALLBACK(LSHIFT)
134+
ADD_CALLBACK(RSHIFT)
135+
ADD_CALLBACK(LENGTH)
136+
ADD_CALLBACK(PICK)
137+
ADD_CALLBACK(ISPATH)
138+
ADD_CALLBACK(ISSUBPATH)
139+
ADD_CALLBACK(TYPESOF)
140+
ADD_CALLBACK(NEW_IMAGE)
141+
ADD_CALLBACK(PRE_INC)
142+
ADD_CALLBACK(POST_INC)
143+
ADD_CALLBACK(PRE_DEC)
144+
ADD_CALLBACK(POST_DEC)
145+
ADD_CALLBACK(LPUSH_CACHE)
146+
ADD_CALLBACK(SET_CACHE)
147+
ADD_CALLBACK(SWITCH)
148+
}
149+
return new Instr_UNK;
150+
}

byond-extools/src/dmdism/disassembler.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,19 +34,17 @@ Disassembly Disassembler::disassemble()
3434

3535
Instruction Disassembler::disassemble_next()
3636
{
37-
Instruction* instr = nullptr;
38-
3937
auto root = context_->eat();
40-
41-
auto cb = callbacks.find(static_cast<Bytecode>(root));
38+
Instruction* instr = get_instr(root);
39+
/*auto cb = callbacks.find(static_cast<Bytecode>(root));
4240
if (cb != callbacks.end())
4341
{
4442
instr = cb->second();
4543
}
4644
else
4745
{
4846
instr = new Instr_UNK;
49-
}
47+
}*/
5048

5149
context_->set_instr(instr);
5250
instr->add_byte(root);

0 commit comments

Comments
 (0)