Problem definition  Programs are composed of instructions which
operate on values. The instructions must name these values in
order to distinguish them from one another. A typical
instruction might say, add X and Y and put the result in Z. In
this instruction, X, Y, and Z are the names of storage
locations. In order to have a compact instruction encoding, most
processor instruction sets have a small set of special locations
which can be directly named. For example, the x86 instruction
set architecture has 8 integer registers, x86-64 has 16, many
RISCs have 32, and IA-64 has 128. In smaller processors, the
names of these locations correspond directly to elements of a
register file. Different instructions may take different amounts
of time (e.g., CISC architecture). For instance, a processor may
be able to execute hundreds of instructions while a single load
from main memory is in progress. Shorter instructions executed
while the load is outstanding will finish first, thus the
instructions are finishing out of