Цель: мой код должен войти в релиз gcc
Чтобы хоть как-то въехать и подружиться с этим зверем решил разобрать пример (:
#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) все должно было быть не совсем так. и данная простая програмулька может быть еще оптимизировна на стадии ее исполнения.
разобраться с тем что написано в ассемблере, чтобы не сильно пугаться всевозможных команд.