Author: Anthony Cozzie
Date: 07:33:00 01/30/03
Go up one level in this thread
On January 30, 2003 at 08:36:55, Russell Reagan wrote: >On January 30, 2003 at 07:02:39, Ed Schröder wrote: > >>On January 29, 2003 at 23:29:36, Russell Reagan wrote: >> >>>http://members.home.nl/matador/chess840.htm#INTRO >>> >>>From Ed's page... >>> >>>switch (piece_type) { case 0 : goto empty; >>> case 1 : goto white_pawn; // evaluate white pawn >>> case 2 : goto white_knight; // evaluate white knight >>> case 3 : goto white_bishop; >>> case 4 : goto white_rook; >>> case 5 : goto white_queen; >>> case 6 : goto white_king; >>> case 7 : goto black_pawn; // evaluate black pawn >>> case 8 : goto black_knight; >>> case 9 : goto black_bishop; >>> case 10 : goto black_rook; >>> case 11 : goto black_queen; >>> case 12 : goto black_king; } >> >>Any reasonable compiler will translate the above into 2 assembler statements, >>someling like: >> >> mov EAX, dword ptr piece_type >> JMP TABLE [EAX] >> >>Nothing can beat that. Just generate an ASM file to see it work. >> >>Explanation: the trick is that the compiler will generate an internal table (not >>visible for the programmer) where it calculates all the effective addresses of >>the labels mentioned in the switch/case statement. >> >>Then using the "piece_type" in register EAX it does an "indirect jump", only a >>few cycles. >> >>Of course, the sequence must be in reasonable order otherwise the compiler will >>not recognize the possibility. >> >>Ed > > >Hi Ed, > >Let me see if I understand. It is an indirect jump, which will be at least as >slow as a mispredicted conditional. The reason this is faster is because since >you have 13 possible values for piece_type, you do ONE indirect jump as opposed >to (potentially) 12 mispredicted conditionals. Is this your reasoning? > >Thanks, >Russell > > > >> >>>On one portion of Ed's discussion of Rebel (see above), he talks about using >>>"indirect addressing". I get the impression from Ed's words that this method is >>>supposed to fast. I understand his discussion to mean that if you create a >>>switch statement like he does, you create a jump table and avoid a bunch of >>>conditionals. >>> >>>However, in past discussions, I recall hearing that using a function pointer is >>>going to be at least as slow as conditional, so I asked someone, and was told >>>that Ed's example should be no different than using a function pointer or >>>virtual functions. >>> >>>Ed talks about this method as if it is a good thing to use. So what is the >>>advantage of it? Either someone is mistaken, or Ed and the guy I talked to are >>>talking about different things. well also note that you are saving yourself 13 compares as well :) BTW, you don't need to gotos or function pointers. If you do a standard switch statement switch(ptype) { case WPAWN: blah blah blah (your code here) case BPAWN: etc } that will work just as well. anthony
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.