Function pointers for opcode execution

This is for people involved in the developement of Snes9x, or SNES emulators in general.
BUG REPORTS BELONG IN TECH SUPPORT/BUG TRACKING!
Post Reply
bl0ckeduser
Snes9x White Belt
Posts: 27
Joined: Tue Nov 15, 2011 12:12 am

Function pointers for opcode execution

Post by bl0ckeduser »

I'm not a very experienced programmer, so the following question/suggestion may come as silly.

Looking at the Snes9X source code, I came across an interesting and important line:

Code: Select all

(*Opcodes[Op].S9xOpcode)();
It seems function pointers are used for executing opcodes. I am tempted to ask, wouldn't a switch statement be (at least somewhat) faster ? I base this statement on a quote I read some time ago:
[to optimize a VM] use a large switch-case instead of a table of function pointers (the compiler will optimize to a jump table, and you remove the overhead of actually calling the function)
(source: http://stackoverflow.com/questions/4708 ... erformance)
bl0ckeduser
Snes9x White Belt
Posts: 27
Joined: Tue Nov 15, 2011 12:12 am

Post by bl0ckeduser »

Nevermind. It seems optimizing compilers do a very good job of reducing this overhead. For example with MSVC 2010 the generated assembly for opcode calling is:

Code: Select all

		(*Opcodes[Op].S9xOpcode)();
004339F5 8B 0C B7             mov         ecx,dword ptr [edi+esi*4]  
004339F8 FF D1                call        ecx  
and the only overhead in opcode implementation functions is a "ret" instruction at the end of their code.
Post Reply