Efficiently Scaling Out-of-Order Cores for Simultaneous Multithreading