On Oct 07, "Bryan C. Warnock" <[EMAIL PROTECTED]> took up a keyboard and banged out > On Sunday 07 October 2001 10:51 pm, Michael Fischer wrote: > > > > Questions, comments, criticisms? > > It looks like you're implementing this as a full, solitary switch. > > while (*pc) { > switch (*pc) { > } > }
Right, as per Simon and Dan's original suggestions to me. > > I don't see (on simple inspection) a default case, which implies that all > functions would be in the switch. There's two problems with that. First, > you can't then swap out (or add) opcode functions, which compilation units > need to do. They're all fixed, unless you handle opcode differentiation > within each case. (And there some other problems associated with that, too, > but they're secondary.) Um, yeah, I left out the issue of default, as I had no idea what to do with it ( fprintf(stderr, "Hey, non-opcode!"); exit( EXIT_FAILURE ); )??? Anyway, suggestions from the list welcome on that point. It is generated as a pass over basic_opcodes.ops, just as the function definitions in basic_opcodes.c are done. I figured the philosophy was "Don't hack the output, hack the template" if you want to change the generated file. What swapping of opcodes do you imagine? I wouldn't have thought that user code gets to muck with the asm offerings available. > Second, the switch will undoubtedly grow too large > to be efficient. A full switch with as few as 512 branches already shows > signs of performance degradation. [1] Thirdly, any function calls that you > then *do* have to make, come at the expense of the switching branch, on top > of normal function call overhead. How many asm opcodes do you imagine we'll have? I'm hardly expert here, but I have a hard time believing we're going to have anything like 512. Much of the remaining flexibility would be done in the vtable code. Unless of course, _every_ new vtable function has to be re-written as a single opcode... oh dear ... but now I'm getting confused. As I understand it, all the function calls get inlined into the loop, so what ones are going to be called inside it? Sorry if I'm being dim and missing issues, I just wanted to get this thing done, and I followed instructions. Perhaps needs/designs have changed since instructions were given. > > [1] Pre-Parrot testing at > http://members.home.net/bcwarno/Perl6/spool/opcode_test_results.txt > > [2] The code for my last set of benchmarks at > http://members.home.net/bcwarno/Perl6/spool/interpreter.c Um, the latter's include file looks an awful lot like the switch my patch generates. How does it work better? Not trying to be antagonistic, I just don't see how it is any different/faster. Clues welcomed. Cheers. Michael -- Michael Fischer 7.5 million years to run [EMAIL PROTECTED] printf "%d", 0x2a; -- deep thought