The following code transposes the elements of an
The following code transposes the elements of an M ×M array, where M is a constant defined by #define:
1 void transpose(long A[M][M]) {
2 long i, j;
3 for (i = 0; i < M; i++)
4 for (j = 0; j < i; j++) {
5 long t = A[i][j];
6 A[i][j] = A[j][i];
7 A[j][i] = t;
8 }
9 }
When compiled with optimization level -O1, gcc generates the following code for the inner loop of the function:
1 .L6:
2 movq (%rdx), %rcx
3 movq (%rax), %rsi
4 movq %rsi, (%rdx)
5 movq %rcx, (%rax)
6 addq $8, %rdx
7 addq $120, %rax
8 cmpq %rdi, %rax
9 jne .L6
We can see that gcc has converted the array indexing to pointer code.
(a) Which register holds a pointer to array element A[i][j]?
(b) Which register holds a pointer to array element A[j][i]?
(c) What is the value of M?