At 12:30 PM 10/18/2001 +0100, Simon Cozens wrote: >On Mon, Oct 08, 2001 at 06:36:32PM -0400, Dan Sugalski wrote: > > P1->vtable_funcs[VTABLE_ADD + P2->num_type](P1, P2, P0); > >Uhm, since num_type and vtable_funcs are part of the vtable >structure, that would be more like > P1->vtable->vtable_funcs[VTABLE_ADD + P2->vtable->num_type](P1, P2, P0); > >After preprocessing, this looks like the wonderful: > > >interpreter->pmc_reg->registers[cur_opcode[2]]->vtable->vtable_funcs[VTABLE_ADD >+ >interpreter->pmc_reg->registers[cur_opcode[3]]->vtable->num_type](interpreter->pmc_reg->registers[cur_opcode[2]],interpreter->pmc_reg->registers[cur_opcode[3]],interpreter->pmc_reg->registers[cur_opcode[1]]); > >That's quite a shitload of dereferences in order to call a function >(call a function, mark you, not actually do anything!) to add two >things together.
Gack, that is nasty. Okay, let's see how this runs. (Or limps, as the case may be) A lot of that (like the interpreter->pmc_reg->registers bit) will get optimized to a single temporary by the compiler so it might not hurt much at all. There are a few tricks possible, like moving the register file into the interpreter structure or the num/int/string types into the main PMC struct, that we can pull to get rid of some of those dereferences. Which ones are worth it compared to the costs they incur will depend on whether shifting the costs are worth it. Dan --------------------------------------"it's like this"------------------- Dan Sugalski even samurai [EMAIL PROTECTED] have teddy bears and even teddy bears get drunk