## 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*.