Microprocessor Architecture: From Simple Pipelines to Chip Multiprocessors