Optimal for loop on the 68020.
Jim Adcock
jima at hplsla.HP.COM
Tue Jun 6 05:18:17 AEST 1989
Unfortunately, the "favorite loop constuct" is going to be very dependent on
the particular compiler used, and exactly *what* you do inside the loop.
Below is your examples, redone with a null loop body, plus *my* favorite
loop construct: for(i=COUNT; i--;). I used gcc and hp's cc 6.5 compiler
with -O -S and in gnu -O -S -fstrength-reduce -fcombine-regs -fforce-mem
-fforce-addr. The point is that these things are very unpredictable,
and optimizing compilers work well on linear code segments, not over
branch points in programs [including loops]. The "optimizing" compilers
I've seen do about 20% better than non-optimizing compilers, but are still
far from "optimal" by our human standards.
#define COUNT 100
main()
{
int i;
for ( i = 0; i < COUNT; i++ );
xxxxxxxxxxxxxxxxxxx();
for ( i = 0; i < COUNT; ++i );
xxxxxxxxxxxxxxxxxxx();
for ( i = 0; ++i <= COUNT; );
xxxxxxxxxxxxxxxxxxx();
for ( i = 0; i++ < COUNT; );
xxxxxxxxxxxxxxxxxxx();
for ( i = COUNT; i > 0; i-- );
xxxxxxxxxxxxxxxxxxx();
for ( i = COUNT; i > 0; --i );
xxxxxxxxxxxxxxxxxxx();
for ( i = COUNT; --i >= 0; );
xxxxxxxxxxxxxxxxxxx();
for ( i = COUNT; i-- > 0; );
xxxxxxxxxxxxxxxxxxx();
for ( i = COUNT; i--; );
xxxxxxxxxxxxxxxxxxx();
}
#NO_APP
gcc_compiled.:
.text
.even
.globl _main
_main:
link a6,#0
moveq #99,d0
L4:
dbra d0,L4
clrw d0
subql #1,d0
jcc L4
jbsr _xxxxxxxxxxxxxxxxxxx
moveq #99,d0
L8:
dbra d0,L8
clrw d0
subql #1,d0
jcc L8
jbsr _xxxxxxxxxxxxxxxxxxx
moveq #100,d0
L10:
dbra d0,L10
clrw d0
subql #1,d0
jcc L10
jbsr _xxxxxxxxxxxxxxxxxxx
moveq #100,d0
L14:
dbra d0,L14
clrw d0
subql #1,d0
jcc L14
jbsr _xxxxxxxxxxxxxxxxxxx
moveq #100,d0
L20:
subql #1,d0
tstl d0
jgt L20
jbsr _xxxxxxxxxxxxxxxxxxx
moveq #100,d0
L24:
subql #1,d0
tstl d0
jgt L24
jbsr _xxxxxxxxxxxxxxxxxxx
moveq #100,d0
L26:
dbra d0,L26
clrw d0
subql #1,d0
jcc L26
jbsr _xxxxxxxxxxxxxxxxxxx
moveq #100,d0
L30:
subql #1,d0
moveq #-1,d1
cmpl d0,d1
jlt L30
jbsr _xxxxxxxxxxxxxxxxxxx
moveq #100,d0
L34:
dbra d0,L34
clrw d0
subql #1,d0
jcc L34
jbsr _xxxxxxxxxxxxxxxxxxx
unlk a6
rts
[hp cc 6.5:] ==============================================
global _main
_main:
link.w %a6,&-8
mov.l %d7,-(%sp)
movq &99,%d7
L12:
dbf %d7,L12
jsr _xxxxxxxxxxxxxxxxxxx
movq &99,%d7
L16:
dbf %d7,L16
jsr _xxxxxxxxxxxxxxxxxxx
movq &0,%d7
L21:
addq.l &1,%d7
movq &100,%d0
cmp.l %d7,%d0
ble.b L21
jsr _xxxxxxxxxxxxxxxxxxx
movq &0,%d7
L24:
mov.l %d7,%d0
addq.l &1,%d7
movq &100,%d1
cmp.l %d0,%d1
blt.b L24
jsr _xxxxxxxxxxxxxxxxxxx
movq &100,%d7
L20001:
subq.l &1,%d7
tst.l %d7
bgt.b L20001
jsr _xxxxxxxxxxxxxxxxxxx
movq &100,%d7
L20003:
subq.l &1,%d7
tst.l %d7
bgt.b L20003
jsr _xxxxxxxxxxxxxxxxxxx
movq &100,%d7
L33:
subq.l &1,%d7
bge.b L33
jsr _xxxxxxxxxxxxxxxxxxx
movq &100,%d7
L36:
mov.l %d7,%d0
subq.l &1,%d7
tst.l %d0
bgt.b L36
jsr _xxxxxxxxxxxxxxxxxxx
movq &100,%d7
L39:
mov.l %d7,%d0
subq.l &1,%d7
tst.l %d0
bne.b L39
jsr _xxxxxxxxxxxxxxxxxxx
mov.l (%sp)+,%d7
unlk %a6
rts
More information about the Comp.lang.c
mailing list