The Pursuit of Speed: Pipelining and Speculative Execution in the CPU