etc:teach:diplomants:projects:2009:gccvec

Векторизация в GCC

Цель: мой код должен войти в релиз gcc 

уже сделали

Ассемблер IA-64

Чтобы хоть как-то въехать и подружиться с этим зверем решил разобрать пример (:

#define N 16
 
float S[2*N];
float M[N];
 
void decoder()
{
  int i;
  for(i=0; i<N; i++)
    M[i]=S[i]/2 + S[i]*2;
}
        .file   "cc.c"
        .pred.safe_across_calls p1-p5,p16-p63
        .sdata
        .align 8
.LC0:
        data4   1056964608
        data4   1056964608
        .align 8
.LC1:
        data4   1073741824
        data4   1073741824
        .text
        .align 16
        .global decoder#
        .type   decoder#, @function
        .proc decoder#
decoder:
        .regstk 0, 0, 0, 0
        .prologue
        .body
        .mmi
        addl r14 = @ltoffx(S#), r1
        addl r15 = @gprel(.LC1), gp
        addl r16 = @gprel(.LC0), gp
        ;;
        .mmi
        ld8.mov r14 = [r14], S#
        ldf8 f10 = [r15]
        nop 0
        .mii
        ldf8 f11 = [r16]
        addl r15 = @ltoffx(M#), r1
        ;;
        nop 0
        .mmi
        ldf8 f8 = [r14], 8
        ld8.mov r15 = [r15], M#
        nop 0
        ;;
        .mmf
        ldf8 f7 = [r14], 8
        nop 0
        fpmpy f6 = f8, f10
        ;;
        .mfi
        nop 0
        fpma f8 = f8, f11, f6
        nop 0
        .mmf
        ldf8 f9 = [r14], 8
        nop 0
        fpmpy f6 = f7, f10
        ;;
        .mfi
        nop 0
        fpma f7 = f7, f11, f6
        nop 0
        .mmf
        stf8 [r15] = f8, 8
        ldf8 f8 = [r14], 8
        fpmpy f6 = f9, f10
        ;;
        .mfi
        nop 0
        fpma f9 = f9, f11, f6
        nop 0
        .mmf
        stf8 [r15] = f7, 8
        ldf8 f7 = [r14], 8
        fpmpy f6 = f8, f10
        ;;
        .mfi
        nop 0
        fpma f8 = f8, f11, f6
        nop 0
        .mmf
        stf8 [r15] = f9, 8
        ldf8 f9 = [r14], 8
        fpmpy f6 = f7, f10
        ;;
        .mfi
        nop 0
        fpma f7 = f7, f11, f6
        nop 0
        .mmf
        stf8 [r15] = f8, 8
        ldf8 f8 = [r14], 8
        fpmpy f6 = f9, f10
        ;;
        .mfi
        nop 0
        fpma f9 = f9, f11, f6
        nop 0
        .mmf
        stf8 [r15] = f7, 8
        ldf8 f7 = [r14]
        fpmpy f6 = f8, f10
        ;;
        .mfi
        nop 0
        fpma f8 = f8, f11, f6
        nop 0
        .mfi
        stf8 [r15] = f9, 8
        fpmpy f10 = f7, f10
        nop 0
        ;;
        .mfi
        nop 0
        fpma f7 = f7, f11, f10
        nop 0
        .mmi
        nop 0
        stf8 [r15] = f8, 8
        nop 0
        ;;
        .mib
        stf8 [r15] = f7
        nop 0
        br.ret.sptk.many b0
        .endp decoder#
        .common S#,128,8
        .common M#,64,8
        .ident  "GCC: (GNU) 4.3.0 20080202 (experimental)"

Цикл был развернут компилятором и превращен в нечто выше. Однако, судя по туториалу1) все должно было быть не совсем так. и данная простая програмулька может быть еще оптимизировна на стадии ее исполнения.

FIXME разобраться с тем что написано в ассемблере, чтобы не сильно пугаться всевозможных команд.

1)
можно посмотреть на ftp://kkv.spb.su/pub/projects/gccvect/
etc/teach/diplomants/projects/2009/gccvec.txt · Last modified: 2008/02/24 03:07 by zps