W dniu 2010-10-23 23:04, Florian Klämpfl pisze:
Second: when I review assembler list I've notice some strange lines (all
optimizations are enabled):
Which compiler version? 2.4.x? I think r15502 in trunk should fix this.
2.5.1 but older. Now I test from current. Its better (faster) but I
found other strange:
first: dec(i) is translate to three lines
movl %esi,%eax
decl %eax
movl %eax,%esi
why not simple decl %esi ?
Yes. I saw this too and I didn't find the cause, especially because I
were not able to reproduce it in a small example.
attached before uhlm.pas is too long? its form fpHash
When variable is in %ebx things are the same.
second if I have:
while ii>0 do begin
....;
dec(ii);
assembler look:
# [121] while ii>0 do begin
jmp .Lj16 //< here add first test of ii
.balign 4,0x90
.Lj15:
.Ll8:
# [122] result:=LongWord(result *8010817 ) xor (Pw^);
.Ll10:
# [124] dec(ii);
movl %esi,%eax
decl %eax
movl %eax,%esi
.Lj16:
testl %esi,%esi //<-- this can be avoid, because test from DECL
jg .Lj15
Is this possible to achieve this optimizations,
If yes, can somebody help, from which file I should start
Replacing the jmp by a test and jz is two-fold: it increases code size
(thus higher code cache pollution) and it pollutes the branch prediction
unit while an uncoditional jump is very cheap on modern processers.
You don't understand me
My proposition is moving one instruction, outside loop
# [121] while ii>0 do begin
testl %esi,%esi //<-- this should be added, because after .Lj16 test
is absent
jmp .Lj16 // jmp not change ZF
.balign 4,0x90
.Lj15:
.Ll8:
# [122] result:=LongWord(result *8010817 ) xor (Pw^);
.Ll10:
# [124] dec(ii);
decl %esi
.Lj16:
jg .Lj15 // ZF is setting by decl (first timie by testl)
--
Darek
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel