Page 1 of 1

Function pointers for opcode execution

Posted: Wed Nov 16, 2011 11:31 pm
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)

Posted: Thu Nov 17, 2011 7:43 pm
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.