Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Various compiler questions

Author: Robert Hyatt

Date: 18:16:26 01/14/02

Go up one level in this thread


On January 14, 2002 at 17:30:36, James Robertson wrote:

>On January 14, 2002 at 14:57:29, Robert Hyatt wrote:
>
>>On January 14, 2002 at 12:11:52, James Robertson wrote:
>>
>>>Here are several questions I've been wondering about:
>>>
>>>1) How does one insert inline assembler statements into your code such that it
>>>can be compiled by gcc (obviously __asm doesn't work)?
>>>
>>>2) How is switch() code generated? For instance, if the compiler encounters:
>>>switch (var) {
>>>case 0: do_stuff0(); break;
>>>case 1: do_stuff1(); break;
>>>case 2: do_stuff2(); break;
>>>}
>>>will more efficient code be generated than if I write:
>>>switch (var) {
>>>case 297: do_stuff287; break;
>>>case 0: do_stuff0; break;
>>>case 9000: do_stuff9000; break;
>>>}
>>
>>
>>Note that in the latter case, you have oddball numbers.  That makes the jump
>>table idea not so good and it will generally try to turn that switch into a
>>series of if-then-elses instead.  Which will be slower.
>>
>>>If so, what does the compiler do to take advantage of the fact that 0, 1, and 2
>>>are consecutive numbers?
>>>
>>
>>It generates something like this (I will use a pseudo-asm for simplicity):
>>
>>        load       var,R1
>>        cmp        R1,0
>>        blt        skip                  ;  if var < 0, exit
>>        cmp        R1,2
>>        bgt        skip                  ;  ditto for var > 2
>>        load       R2,#table             ;  address of branch table
>>        mult       R1,4                  ;  scale to word index
>>        add        R1,R2                 ;  R2 = table, table+4 or table+8
>>        branch     R2
>>table:  branch     case0
>>        branch     case1
>>        branch     case2
>>case0:  do stuff
>>        branch skip
>>case1:  do stuff
>>        branch skip
>>case2:  do stuff
>>
>>skip:
>
>Ok, this is helpful. Here is another question that might help me. If I write a
>piece of C code, is there any way (under Linux) to see what the compiler
>generates for that code?
>
>James

Eugene is Mr. MSVC of course.  I don't know the options for that
compiler.  For gcc use -S and you will get a filename.s.  Don't forget
to enable optimizations as well or you will see some pretty "raw" code
without it...


>
>
>>
>>The above is the best way to handle a switch (C) or case (pascal)
>>type structure.  The problem is that if the case variable values are
>>scattered around, the branch table becomes huge.  The first pascal compiler
>>I used didn't understand this and a case 0:  case 88000: would cause it to
>>blow up as it produced an _enormous_ jump table that was too large to fit in
>>the machine it ran on (a xerox sigma-9 with 128KW of memory total).
>>
>>The alternative is to use a series of if-then-else clauses but as you add
>>cases, you add branches and slow things down.  Most common case _must_ appear
>>first for performance.  While with the jump table, the order of the cases
>>is totally irrelevant.
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>>3) How much overhead is added to a function call from a function pointer? Maybe
>>>none? How about if you index an array of function pointers?
>>
>>A memory reference at most...
>>
>>>
>>>4) What are the syntax differences between console code written for Linux versus
>>>Unix (I don't have easy access to a Unix machine)?
>>
>>
>>
>>absolutely nothing.  Linux _is_ UNIX....
>>
>>
>>
>>>
>>>5) Just out of curiousity, when is VC7 being released?
>>>
>>>Ok, If anyone could help me with these I'd be grateful.
>>>Thanks!
>>>James



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.