also generell geht es mir nicht um die Compiler Optimierung, die steht ja dann eh im makefile und ist bereits auf -O2 -fomit.
Das ist schon klar, nur solltest du dann nach Möglichkeit auch für den compiler-explorer einen link posten wo das gesetzt ist (und ein entsprechender compiler benutzt wird), ansonsten kann man schlecht beurteilen ob eine Änderung wirklich besseren code bring. Ganz ohne Optimierung ist der erzeugte code ziemlich grottig.
Zum Code, eins habe ich schon rausgefunden, ich muss die beiden Zähler ints zu short int machen (reicht ja aus)
ich muss die beiden Zähler ints zu short int machen (reicht ja aus) dann feuert er auch dbra aus
Nicht zwangsläufig. Insbesondere wenn int nicht = short, ist der erzeugte code dann meistens schlechter als vorher. Ausserdem scheint er es zu bevorzugen, schon vor der Schleife das erwartete Ende für eine der Adressen zu berechnen, und dann in der Schleife die Adresse zu vergleichen.
Tests (alle mit -O2 -fomit-frame-pointer -mshort):
void test(char *dst, char *src, unsigned short n)
{
short i;
for (i = n - 1; i >= 0; i--)
*dst++ = *src++;
}
Erzeugt mit gcc 4.6.4:
_test:
move.l 4(%sp),%a0
move.w 12(%sp),%d0
subq.w #1,%d0
jmi .L1
move.l 8(%sp),%a1
.L3:
move.b (%a1)+,(%a0)+
subq.w #1,%d0
jpl .L3
.L1:
rts
Mit gcc 7.3.1:
_test:
move.l 8(%sp),%a0
move.w 12(%sp),%d0
subq.w #1,%d0
jmi .L1
move.l 4(%sp),%a1
.L3:
move.b (%a0)+,(%a1)+
dbra %d0,.L3
.L1:
rts
(sieht ganz gut aus). Aber mit gcc 8.3.0:
_test:
move.l %d2,-(%sp)
move.l 12(%sp),%d2
move.w 16(%sp),%d1
move.w %d1,%d0
subq.w #1,%d0
jmi .L1
move.l 8(%sp),%a1
move.l %d2,%a0
.L3:
move.b (%a0)+,(%a1)+
move.w %a0,%d0
not.w %d0
add.w %d2,%d0
add.w %d1,%d0
jpl .L3
.L1:
move.l (%sp)+,%d2
rts
Die letzte Version versteh ich irgendwie nicht, da bezieht er irgendwie die Addresse selber mit ein. Da scheint noch was falsch zu laufen, oder zumindest suboptimal.
schau mal hier
Ja, kenn ich, hab ich auch schon lokal laufen. Mir ist nur nicht ganz klar wie man den auf 'nem öffentlichen Web-Server zum laufen kriegt, ohne daß er sich mit dem normalen HTTP-Server beisst. Funktioniert möglicherweise nur mit Aber schauen wir mal.