[fpc-pascal] CASE

Eduardo nec556 at retena.com
Tue Nov 8 19:03:48 CET 2005

At 18:07 08/11/2005, you wrote:

>>Jump by offset label number? I don't understand it.
>>fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
>Sorry Eduardo, am not knowledgeable of compiler internals.
>There is (?) an optimization in FPC that uses a jump table(?) 
>instead of scanning each label value of a case statement.  Hoping 
>that this is the case, as it seems to be with i386.  This would mean 
>faster execution of the case.  Yes?

Don't know how fpc ppc works internally. Surely this optimization is 
not done, it's uncommon, i think.

For now, the only optimization to the compiler output maybe use other 
crs for comparations and separate the branch from the comparation to 
prevent stalls. Here an example.

Original code

# [735] case l3o3.FormType of
  // Select 3o3 processor
         lwz     r2,160(r1)
         cmplwi  cr0,r2,0
         beq     cr0,L1051
         cmplwi  cr0,r2,1
         beq     cr0,L1052
         cmplwi  cr0,r2,2
         beq     cr0,L1053
         cmplwi  cr0,r2,3
         beq     cr0,L1054

Modified code

# [735] case l3o3.FormType of
  // Select 3o3 processor
         lwz     r3,160(r1)     // r3, has the value to check
         cmplwi  cr0,r3,0
         cmplwi  cr2,r3,1        // cr1 is used for fpu condition and 
cannot be used for integer
         cmplwi  cr3,r3,2
         cmplwi  cr4,r3,3
         beq     cr0,L1051    // separate branch from comp (4 lines 
up) can make the branch be pre-calculated and executed in zero cycles
         cmplwi  cr5,r3,4
         beq     cr2,L1052
         cmplwi  cr0,r3,5
         beq     cr3,L1053
         cmplwi  cr2,r3,6
         beq     cr4,L1054

and so on...

More information about the fpc-pascal mailing list