// c := a + b
void add (matrix c, matrix a, matrix b) {
int i; int j;
for (i=0; i<N; i++) {
for (j=0; j<N; j++) {
c [i][j] = a[i][j] + b[i][j];
}
}
}
Kompilieren mit gcc -S -O
add:
!#PROLOGUE# 0
save %sp, -112, %sp
!#PROLOGUE# 1
mov %i0, %o7 -- &c
mov 0, %g4 -- i
mov 0, %i3 -- j
.LL14: -- for (i ..)
sll %g4, 1, %g2 -- 2*i
add %g2, %g4, %g2 -- 3*i
sll %g2, 3, %g2 -- 24*i
add %g2, %g4, %g2 -- 25*i
sll %g2, 4, %g2 -- 16*25*i = 4*N*i
add %g2, %o7, %g1 -- &c + 4*N*i = c[i][]
add %g2, %i1, %i5 -- &a + 4*N*i = a[i][]
add %g2, %i2, %i4 -- &b + 4*N*i = b[i][]
Hier wurde die Index-rechnung vor die (innere) Schleife geschoben.
.LL11: -- for (j ..)
sll %i3, 2, %g2 -- 4*j
ld [%i5+%g2], %g3 -- a[i][j]
ld [%i4+%g2], %i0 -- b[i][j]
add %g3, %i0, %g3 -- a[i][j] + b[i][j]
add %i3, 1, %i3 -- j ++
cmp %i3, 99 -- < N ?
ble .LL11
st %g3, [%g1+%g2] -- c[i][j] = ..
Ende der äußeren schleife:
add %g4, 1, %g4 -- i++
cmp %g4, 99 -- < N ?
ble .LL14
mov 0, %i3
ret
restore