What is hard?
Multiplication and division take a long time.
What about array index: x[i]
? Usually, it does involve
some sort of multiplication.
What is the value of x[i]
or
*&x[i]
or
&x+i
or
*(int *)(void *)(x+i*sizeof(*x))
?
Intel x86_64
Assume register %r10
contains address of x,
register %r11
contains i,
and result should be stored in register %r12
.
movl (%r10,%r11,4), %r12
The Intel processer is a CISC, complex instruction set computer. However, just because it is one instruction, does not mean that it is fast!
MIPS 32
Assume register $t5
contains address of x,
register %t6
contains i,
and result should be stored in register $t7
.
sll $t7,$t6,2 add $t7,$t5,$t7 ld $t7,0($t7)
The MIPS processer is a RISC, reduced instruction set computer.
IBM S/360
Assume register R10
contains address of x,
register R11
contains i,
and result should stored in register R12
.
LR R12,R11 ADD R12,R12 ADD R12,R12 LR RR12,0(R11,R12)
The IBM S/360 processer is an ancient computer.
Reduction of strength
How could a smart compiler reduce the cost of these instruction sequences?
int sum = 0 ; for (int i=0; i<n; ++i) { sum = sum + V[i] ; } // Use an integer pointer
for (int i=0; i<n; ++i) { V[i] = 17*i ; } // Replace multiplication with addition
for (int i=0; i<n; ++i) { V[i] = i*i ; } // Well, (n+1)^2 = n*2 + 2*n + 1 -- but it would require a programmer
for (int i=0; i<n; ++i) { for (int j=0; j<n; ++j) { if (i!=j) { V[i][j] = 0 ; } else { V[i][j] = 1 ; } } } // Replace with two loops -- but this would probably require a programmer
CMU 15-215 Video to view
This will not be easy because you haven’t seen Chapter 4. However, you will in Computer Systems II.