I get about 25k instructions per second (in the gu/cube sample + printing some GU stuff to the console which probably slows down a bit), I m sure that can be optimized a lot too but for now this works fine. I m sure the PSP is A LOT faster than this (atleast the CPU), but it still works fine for the samples because Vertical-Sync is not working yet in the emulator
I planned to add a profiler to the cube sample anyway (mainly for the GE code, but CPU too ofcourse) so thats what I will do as soon as the other problems are gone.
Yesterday, I had a look at sprintf() with psp-gdb but some registers seem to be wrong before that already - but that might be a problem with different stack pointers on real hardware.
I don't want to discourage you since I know you know what you're doing and you're on a good track to completion with this emulator. I'm just concerned about others who might not know very well getting the wrong idea.
When you say that this particular demo is running faster than it does on a PSP people may consider this to be an indication that commercial games won't pose a speed challenge. What they have to understand is that right now you're virtually not emulating a CPU at all, and that the CPU (especially VFPU) emulation is probably going to be the most demanding part of the emulator, by a huge margin. 25K instructions per second is not even a drop in the bucket. NES games tend to execute way more than that.
It's hard to say just how many "typical" CPU instructions a PSP game can execute, and it's even harder to say how many it will execute (unless you profile it on a real PSP, which possibly can be done since the PSP does have profiling hardware). I guess one good thing is that you can artificially underclock the CPU and a lot of the games will be designed to cope with it, so framerate suffers but event timing, audio and controls don't. In fact you might end up trying to make vsync happen at real 60Hz instead of emulated 60Hz, which would even make some games run
better if the emulating maching was powerful enough. Would save you from having to count cycles (maybe), but you'd end up having to do guarded exit points so you don't interrupt in the middle of an instruction.