On 24 Sep 2010, at 11:48, Adrian Veith wrote:

Changing to pointers reduces the amount of multiplications for accessing
the nth element in an array - if you compare the delphi code to th fpc
code on assembler base, this is the main difference in both generated
codes.

Did you actually try replacing only the multiplications with lea's in the assembler code generated by FPC (one lea to multiply by 5 and then the times 4 during the load/store)? I did before posting my initial reply because it also seemed to be the most logical explanation to me. It turned out to be a red herring:

With imull $20:
# iterations:     26662054
no solution found
runtime:    10.75s

With "lea (%reg,%reg,4),%reg" followed by "movl (%xxx,%reg,4), %yyy" (not just for mov, but for every single memory expression that depends on an "imull $20"):
# iterations:     26662054
no solution found
runtime:    10.06s

Kylix 3 (~ Delphi 6.5):
# iterations:     26662054
no solution found
runtime:     6.65s

Register allocation is on a comparable level for both versions.

Delphi keeps the "Bar" pointer in a register, while FPC spills it to the stack. Because Bar is used in most of the most-executed statements, this has a huge impact.


Jonas
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to