Skip to content

Commit d92fb02

Browse files
committed
Use computed-goto opcodes with clang and gcc
1 parent b478f73 commit d92fb02

File tree

4 files changed

+126
-1
lines changed

4 files changed

+126
-1
lines changed

platforms/windows/Geargrafx.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@
183183
<ClInclude Include="..\..\src\huc6270_inline.h" />
184184
<ClInclude Include="..\..\src\huc6270.h" />
185185
<ClInclude Include="..\..\src\huc6280_inline.h" />
186+
<ClInclude Include="..\..\src\huc6280_dispatch.h" />
186187
<ClInclude Include="..\..\src\huc6280_opcodes_inline.h" />
187188
<ClInclude Include="..\..\src\huc6280_psg_inline.h" />
188189
<ClInclude Include="..\..\src\huc6280_psg.h" />

platforms/windows/Geargrafx.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,9 @@
426426
<ClInclude Include="..\..\src\huc6280_inline.h">
427427
<Filter>src</Filter>
428428
</ClInclude>
429+
<ClInclude Include="..\..\src\huc6280_dispatch.h">
430+
<Filter>src</Filter>
431+
</ClInclude>
429432
<ClInclude Include="..\..\src\huc6280_opcodes_inline.h">
430433
<Filter>src</Filter>
431434
</ClInclude>

src/huc6280_dispatch.h

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
/*
2+
* Geargrafx - PC Engine / TurboGrafx Emulator
3+
* Copyright (C) 2024 Ignacio Sanchez
4+
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU General Public License as published by
7+
* the Free Software Foundation, either version 3 of the License, or
8+
* any later version.
9+
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU General Public License for more details.
14+
15+
* You should have received a copy of the GNU General Public License
16+
* along with this program. If not, see http://www.gnu.org/licenses/
17+
*
18+
*/
19+
20+
#ifndef HUC6280_DISPATCH_H
21+
#define HUC6280_DISPATCH_H
22+
23+
#if defined(__GNUC__) || defined(__clang__)
24+
25+
#define HUC6280_DISPATCH(opcode) \
26+
do { \
27+
static const void* JUMPTABLE[256] = { \
28+
&&op00, &&op01, &&op02, &&op03, &&op04, &&op05, &&op06, &&op07, &&op08, &&op09, &&op0A, &&op0B, &&op0C, &&op0D, &&op0E, &&op0F, \
29+
&&op10, &&op11, &&op12, &&op13, &&op14, &&op15, &&op16, &&op17, &&op18, &&op19, &&op1A, &&op1B, &&op1C, &&op1D, &&op1E, &&op1F, \
30+
&&op20, &&op21, &&op22, &&op23, &&op24, &&op25, &&op26, &&op27, &&op28, &&op29, &&op2A, &&op2B, &&op2C, &&op2D, &&op2E, &&op2F, \
31+
&&op30, &&op31, &&op32, &&op33, &&op34, &&op35, &&op36, &&op37, &&op38, &&op39, &&op3A, &&op3B, &&op3C, &&op3D, &&op3E, &&op3F, \
32+
&&op40, &&op41, &&op42, &&op43, &&op44, &&op45, &&op46, &&op47, &&op48, &&op49, &&op4A, &&op4B, &&op4C, &&op4D, &&op4E, &&op4F, \
33+
&&op50, &&op51, &&op52, &&op53, &&op54, &&op55, &&op56, &&op57, &&op58, &&op59, &&op5A, &&op5B, &&op5C, &&op5D, &&op5E, &&op5F, \
34+
&&op60, &&op61, &&op62, &&op63, &&op64, &&op65, &&op66, &&op67, &&op68, &&op69, &&op6A, &&op6B, &&op6C, &&op6D, &&op6E, &&op6F, \
35+
&&op70, &&op71, &&op72, &&op73, &&op74, &&op75, &&op76, &&op77, &&op78, &&op79, &&op7A, &&op7B, &&op7C, &&op7D, &&op7E, &&op7F, \
36+
&&op80, &&op81, &&op82, &&op83, &&op84, &&op85, &&op86, &&op87, &&op88, &&op89, &&op8A, &&op8B, &&op8C, &&op8D, &&op8E, &&op8F, \
37+
&&op90, &&op91, &&op92, &&op93, &&op94, &&op95, &&op96, &&op97, &&op98, &&op99, &&op9A, &&op9B, &&op9C, &&op9D, &&op9E, &&op9F, \
38+
&&opA0, &&opA1, &&opA2, &&opA3, &&opA4, &&opA5, &&opA6, &&opA7, &&opA8, &&opA9, &&opAA, &&opAB, &&opAC, &&opAD, &&opAE, &&opAF, \
39+
&&opB0, &&opB1, &&opB2, &&opB3, &&opB4, &&opB5, &&opB6, &&opB7, &&opB8, &&opB9, &&opBA, &&opBB, &&opBC, &&opBD, &&opBE, &&opBF, \
40+
&&opC0, &&opC1, &&opC2, &&opC3, &&opC4, &&opC5, &&opC6, &&opC7, &&opC8, &&opC9, &&opCA, &&opCB, &&opCC, &&opCD, &&opCE, &&opCF, \
41+
&&opD0, &&opD1, &&opD2, &&opD3, &&opD4, &&opD5, &&opD6, &&opD7, &&opD8, &&opD9, &&opDA, &&opDB, &&opDC, &&opDD, &&opDE, &&opDF, \
42+
&&opE0, &&opE1, &&opE2, &&opE3, &&opE4, &&opE5, &&opE6, &&opE7, &&opE8, &&opE9, &&opEA, &&opEB, &&opEC, &&opED, &&opEE, &&opEF, \
43+
&&opF0, &&opF1, &&opF2, &&opF3, &&opF4, &&opF5, &&opF6, &&opF7, &&opF8, &&opF9, &&opFA, &&opFB, &&opFC, &&opFD, &&opFE, &&opFF \
44+
}; \
45+
goto *JUMPTABLE[opcode]; \
46+
op00: OPCode0x00(); goto done; op01: OPCode0x01(); goto done; op02: OPCode0x02(); goto done; op03: OPCode0x03(); goto done; \
47+
op04: OPCode0x04(); goto done; op05: OPCode0x05(); goto done; op06: OPCode0x06(); goto done; op07: OPCode0x07(); goto done; \
48+
op08: OPCode0x08(); goto done; op09: OPCode0x09(); goto done; op0A: OPCode0x0A(); goto done; op0B: OPCode0x0B(); goto done; \
49+
op0C: OPCode0x0C(); goto done; op0D: OPCode0x0D(); goto done; op0E: OPCode0x0E(); goto done; op0F: OPCode0x0F(); goto done; \
50+
op10: OPCode0x10(); goto done; op11: OPCode0x11(); goto done; op12: OPCode0x12(); goto done; op13: OPCode0x13(); goto done; \
51+
op14: OPCode0x14(); goto done; op15: OPCode0x15(); goto done; op16: OPCode0x16(); goto done; op17: OPCode0x17(); goto done; \
52+
op18: OPCode0x18(); goto done; op19: OPCode0x19(); goto done; op1A: OPCode0x1A(); goto done; op1B: OPCode0x1B(); goto done; \
53+
op1C: OPCode0x1C(); goto done; op1D: OPCode0x1D(); goto done; op1E: OPCode0x1E(); goto done; op1F: OPCode0x1F(); goto done; \
54+
op20: OPCode0x20(); goto done; op21: OPCode0x21(); goto done; op22: OPCode0x22(); goto done; op23: OPCode0x23(); goto done; \
55+
op24: OPCode0x24(); goto done; op25: OPCode0x25(); goto done; op26: OPCode0x26(); goto done; op27: OPCode0x27(); goto done; \
56+
op28: OPCode0x28(); goto done; op29: OPCode0x29(); goto done; op2A: OPCode0x2A(); goto done; op2B: OPCode0x2B(); goto done; \
57+
op2C: OPCode0x2C(); goto done; op2D: OPCode0x2D(); goto done; op2E: OPCode0x2E(); goto done; op2F: OPCode0x2F(); goto done; \
58+
op30: OPCode0x30(); goto done; op31: OPCode0x31(); goto done; op32: OPCode0x32(); goto done; op33: OPCode0x33(); goto done; \
59+
op34: OPCode0x34(); goto done; op35: OPCode0x35(); goto done; op36: OPCode0x36(); goto done; op37: OPCode0x37(); goto done; \
60+
op38: OPCode0x38(); goto done; op39: OPCode0x39(); goto done; op3A: OPCode0x3A(); goto done; op3B: OPCode0x3B(); goto done; \
61+
op3C: OPCode0x3C(); goto done; op3D: OPCode0x3D(); goto done; op3E: OPCode0x3E(); goto done; op3F: OPCode0x3F(); goto done; \
62+
op40: OPCode0x40(); goto done; op41: OPCode0x41(); goto done; op42: OPCode0x42(); goto done; op43: OPCode0x43(); goto done; \
63+
op44: OPCode0x44(); goto done; op45: OPCode0x45(); goto done; op46: OPCode0x46(); goto done; op47: OPCode0x47(); goto done; \
64+
op48: OPCode0x48(); goto done; op49: OPCode0x49(); goto done; op4A: OPCode0x4A(); goto done; op4B: OPCode0x4B(); goto done; \
65+
op4C: OPCode0x4C(); goto done; op4D: OPCode0x4D(); goto done; op4E: OPCode0x4E(); goto done; op4F: OPCode0x4F(); goto done; \
66+
op50: OPCode0x50(); goto done; op51: OPCode0x51(); goto done; op52: OPCode0x52(); goto done; op53: OPCode0x53(); goto done; \
67+
op54: OPCode0x54(); goto done; op55: OPCode0x55(); goto done; op56: OPCode0x56(); goto done; op57: OPCode0x57(); goto done; \
68+
op58: OPCode0x58(); goto done; op59: OPCode0x59(); goto done; op5A: OPCode0x5A(); goto done; op5B: OPCode0x5B(); goto done; \
69+
op5C: OPCode0x5C(); goto done; op5D: OPCode0x5D(); goto done; op5E: OPCode0x5E(); goto done; op5F: OPCode0x5F(); goto done; \
70+
op60: OPCode0x60(); goto done; op61: OPCode0x61(); goto done; op62: OPCode0x62(); goto done; op63: OPCode0x63(); goto done; \
71+
op64: OPCode0x64(); goto done; op65: OPCode0x65(); goto done; op66: OPCode0x66(); goto done; op67: OPCode0x67(); goto done; \
72+
op68: OPCode0x68(); goto done; op69: OPCode0x69(); goto done; op6A: OPCode0x6A(); goto done; op6B: OPCode0x6B(); goto done; \
73+
op6C: OPCode0x6C(); goto done; op6D: OPCode0x6D(); goto done; op6E: OPCode0x6E(); goto done; op6F: OPCode0x6F(); goto done; \
74+
op70: OPCode0x70(); goto done; op71: OPCode0x71(); goto done; op72: OPCode0x72(); goto done; op73: OPCode0x73(); goto done; \
75+
op74: OPCode0x74(); goto done; op75: OPCode0x75(); goto done; op76: OPCode0x76(); goto done; op77: OPCode0x77(); goto done; \
76+
op78: OPCode0x78(); goto done; op79: OPCode0x79(); goto done; op7A: OPCode0x7A(); goto done; op7B: OPCode0x7B(); goto done; \
77+
op7C: OPCode0x7C(); goto done; op7D: OPCode0x7D(); goto done; op7E: OPCode0x7E(); goto done; op7F: OPCode0x7F(); goto done; \
78+
op80: OPCode0x80(); goto done; op81: OPCode0x81(); goto done; op82: OPCode0x82(); goto done; op83: OPCode0x83(); goto done; \
79+
op84: OPCode0x84(); goto done; op85: OPCode0x85(); goto done; op86: OPCode0x86(); goto done; op87: OPCode0x87(); goto done; \
80+
op88: OPCode0x88(); goto done; op89: OPCode0x89(); goto done; op8A: OPCode0x8A(); goto done; op8B: OPCode0x8B(); goto done; \
81+
op8C: OPCode0x8C(); goto done; op8D: OPCode0x8D(); goto done; op8E: OPCode0x8E(); goto done; op8F: OPCode0x8F(); goto done; \
82+
op90: OPCode0x90(); goto done; op91: OPCode0x91(); goto done; op92: OPCode0x92(); goto done; op93: OPCode0x93(); goto done; \
83+
op94: OPCode0x94(); goto done; op95: OPCode0x95(); goto done; op96: OPCode0x96(); goto done; op97: OPCode0x97(); goto done; \
84+
op98: OPCode0x98(); goto done; op99: OPCode0x99(); goto done; op9A: OPCode0x9A(); goto done; op9B: OPCode0x9B(); goto done; \
85+
op9C: OPCode0x9C(); goto done; op9D: OPCode0x9D(); goto done; op9E: OPCode0x9E(); goto done; op9F: OPCode0x9F(); goto done; \
86+
opA0: OPCode0xA0(); goto done; opA1: OPCode0xA1(); goto done; opA2: OPCode0xA2(); goto done; opA3: OPCode0xA3(); goto done; \
87+
opA4: OPCode0xA4(); goto done; opA5: OPCode0xA5(); goto done; opA6: OPCode0xA6(); goto done; opA7: OPCode0xA7(); goto done; \
88+
opA8: OPCode0xA8(); goto done; opA9: OPCode0xA9(); goto done; opAA: OPCode0xAA(); goto done; opAB: OPCode0xAB(); goto done; \
89+
opAC: OPCode0xAC(); goto done; opAD: OPCode0xAD(); goto done; opAE: OPCode0xAE(); goto done; opAF: OPCode0xAF(); goto done; \
90+
opB0: OPCode0xB0(); goto done; opB1: OPCode0xB1(); goto done; opB2: OPCode0xB2(); goto done; opB3: OPCode0xB3(); goto done; \
91+
opB4: OPCode0xB4(); goto done; opB5: OPCode0xB5(); goto done; opB6: OPCode0xB6(); goto done; opB7: OPCode0xB7(); goto done; \
92+
opB8: OPCode0xB8(); goto done; opB9: OPCode0xB9(); goto done; opBA: OPCode0xBA(); goto done; opBB: OPCode0xBB(); goto done; \
93+
opBC: OPCode0xBC(); goto done; opBD: OPCode0xBD(); goto done; opBE: OPCode0xBE(); goto done; opBF: OPCode0xBF(); goto done; \
94+
opC0: OPCode0xC0(); goto done; opC1: OPCode0xC1(); goto done; opC2: OPCode0xC2(); goto done; opC3: OPCode0xC3(); goto done; \
95+
opC4: OPCode0xC4(); goto done; opC5: OPCode0xC5(); goto done; opC6: OPCode0xC6(); goto done; opC7: OPCode0xC7(); goto done; \
96+
opC8: OPCode0xC8(); goto done; opC9: OPCode0xC9(); goto done; opCA: OPCode0xCA(); goto done; opCB: OPCode0xCB(); goto done; \
97+
opCC: OPCode0xCC(); goto done; opCD: OPCode0xCD(); goto done; opCE: OPCode0xCE(); goto done; opCF: OPCode0xCF(); goto done; \
98+
opD0: OPCode0xD0(); goto done; opD1: OPCode0xD1(); goto done; opD2: OPCode0xD2(); goto done; opD3: OPCode0xD3(); goto done; \
99+
opD4: OPCode0xD4(); goto done; opD5: OPCode0xD5(); goto done; opD6: OPCode0xD6(); goto done; opD7: OPCode0xD7(); goto done; \
100+
opD8: OPCode0xD8(); goto done; opD9: OPCode0xD9(); goto done; opDA: OPCode0xDA(); goto done; opDB: OPCode0xDB(); goto done; \
101+
opDC: OPCode0xDC(); goto done; opDD: OPCode0xDD(); goto done; opDE: OPCode0xDE(); goto done; opDF: OPCode0xDF(); goto done; \
102+
opE0: OPCode0xE0(); goto done; opE1: OPCode0xE1(); goto done; opE2: OPCode0xE2(); goto done; opE3: OPCode0xE3(); goto done; \
103+
opE4: OPCode0xE4(); goto done; opE5: OPCode0xE5(); goto done; opE6: OPCode0xE6(); goto done; opE7: OPCode0xE7(); goto done; \
104+
opE8: OPCode0xE8(); goto done; opE9: OPCode0xE9(); goto done; opEA: OPCode0xEA(); goto done; opEB: OPCode0xEB(); goto done; \
105+
opEC: OPCode0xEC(); goto done; opED: OPCode0xED(); goto done; opEE: OPCode0xEE(); goto done; opEF: OPCode0xEF(); goto done; \
106+
opF0: OPCode0xF0(); goto done; opF1: OPCode0xF1(); goto done; opF2: OPCode0xF2(); goto done; opF3: OPCode0xF3(); goto done; \
107+
opF4: OPCode0xF4(); goto done; opF5: OPCode0xF5(); goto done; opF6: OPCode0xF6(); goto done; opF7: OPCode0xF7(); goto done; \
108+
opF8: OPCode0xF8(); goto done; opF9: OPCode0xF9(); goto done; opFA: OPCode0xFA(); goto done; opFB: OPCode0xFB(); goto done; \
109+
opFC: OPCode0xFC(); goto done; opFD: OPCode0xFD(); goto done; opFE: OPCode0xFE(); goto done; opFF: OPCode0xFF(); goto done; \
110+
done:; \
111+
} while (0)
112+
113+
#else
114+
115+
#define HUC6280_DISPATCH(opcode) (this->*m_opcodes[opcode])()
116+
117+
#endif
118+
119+
#endif /* HUC6280_DISPATCH_H */

src/huc6280_inline.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "huc6280.h"
2525
#include "huc6280_timing.h"
2626
#include "huc6280_names.h"
27+
#include "huc6280_dispatch.h"
2728
#include "huc6270.h"
2829
#include "memory.h"
2930

@@ -42,7 +43,8 @@ INLINE u32 HuC6280::RunInstruction(bool* instruction_completed)
4243

4344
u8 opcode = Fetch8();
4445
CheckIRQs();
45-
(this->*m_opcodes[opcode])();
46+
47+
HUC6280_DISPATCH(opcode);
4648

4749
#if !defined(GG_DISABLE_DISASSEMBLER)
4850
if (IsValidPointer(instruction_completed))

0 commit comments

Comments
 (0)