Hi,

I'm compiling the following c code with -O2 on ia64-linux, xtensa-linux,
bfin targets, gcc-4.2.0:

int loop(int a[], int b[],int sum)
  {
    unsigned int i;
    for (i = 0; i < 100; i++)
      sum+=a[i]*b[i];
    return sum;
  }

I don't see any auto increment of the pointers inside the loop in any
one of them.
(You can see below the assembly code outputted by each one).

I'm writing new DSP port and naturally auto increment inside such a loop
is extremely important.
Am I missing something here?

Thanks,
Tal.

xtensa-linux output:

        .file   "loop_pointers.c"
        .global __mulsi3
        .text
        .literal_position
        .literal .LC2, [EMAIL PROTECTED]
        .align  4
        .global loop
        .type   loop, @function
loop:
        .frame  sp, 32
        entry   sp, 32
        l32i.n  a11, a2, 0
        l32r    a5, .LC2
        l32i.n  a10, a3, 0
        mov.n   a6, a2
        callx8  a5
        add.n   a2, a4, a10
        movi.n  a7, 4
        movi    a4, 0x190
.L2:
        add.n   a8, a7, a3
        add.n   a9, a7, a6
        l32i.n  a10, a8, 0
        l32i.n  a11, a9, 0
        addi.n  a7, a7, 4
        callx8  a5
        add.n   a2, a2, a10
        bne     a7, a4, .L2
        retw.n
        .size   loop, .- loop
        .ident  "GCC: (GNU) 4.2.0"

Ia64-linux output:

        .file   "loop_pointers.c"
        .pred.safe_across_calls p1-p5,p16-p63
        .text
        .align 16
        .global loop#
        .proc loop#
loop:
        .prologue
        .mmb
        ld4 r15 = [r33]
        ld4 r14 = [r32]
        nop 0
        .mmi
        setf.sig f9 = r34
        addl r17 = 4, r0
        .save ar.lc, r2
        mov r2 = ar.lc
        .body
        ;;
        .mmi
        setf.sig f7 = r15
        setf.sig f8 = r14
        mov ar.lc = 98
        ;;
        .mmf
        nop 0
        nop 0
        xma.l f6 = f7, f8, f9
.L2:
        .mmi
        add r14 = r17, r33
        add r16 = r17, r32
        adds r17 = 4, r17
        ;;
        .mmi
        ld4 r15 = [r14]
        ld4 r14 = [r16]
        nop 0
        ;;
        .mmi
        setf.sig f7 = r15
        setf.sig f8 = r14
        nop 0
        ;;
        .mfb
        nop 0
        xma.l f6 = f7, f8, f6
        br.cloop.sptk.few .L2
        ;;
        .mib
        getf.sig r8 = f6
        mov ar.lc = r2
        br.ret.sptk.many b0
        .endp loop#
        .ident  "GCC: (GNU) 4.2.0"


bfin output:

.file "loop_pointers.c";
.text;
        .align 4
.global _loop;
.type _loop, STT_FUNC;
_loop:
        [--sp] = ( p5:3 );

        P3 = R0;
        P4 = R1;
        LINK 0;
        P0 = 4 (X);
        P5 = 99 (X);
        R1 = [P3];
        R0 = [P4];
        R0 *= R1;
        R2 = R2 + R0;
        LSETUP (L$L$2, L$L$8) LC1 = P5;
L$L$2:
        P2 = P0 + P4;
        P1 = P0 + P3;
        R0 = [P2];
        R1 = [P1];
        R0 *= R1;
        P0 += 4;
L$L$8:
        R2 = R2 + R0;
        UNLINK;
        R0 = R2;
        ( p5:3 ) = [sp++];

        rts;
        .size   _loop, .-_loop
        .ident  "GCC: (GNU) 4.2.0"




Reply via email to