diff options
author | Andreas Sandberg <Andreas.Sandberg@ARM.com> | 2013-01-07 13:05:46 -0500 |
---|---|---|
committer | Andreas Sandberg <Andreas.Sandberg@ARM.com> | 2013-01-07 13:05:46 -0500 |
commit | 1814a85a055732baf98fd030441bb4c5c5db9bdc (patch) | |
tree | 33dd6adc62342a55ac3b0f4dbe9fdb9d82faa323 /src/cpu/o3/dep_graph.hh | |
parent | 9e8003148f78811e600e51a900f96b71cb525b60 (diff) | |
download | gem5-1814a85a055732baf98fd030441bb4c5c5db9bdc.tar.xz |
cpu: Rewrite O3 draining to avoid stopping in microcode
Previously, the O3 CPU could stop in the middle of a microcode
sequence. This patch makes sure that the pipeline stops when it has
committed a normal instruction or exited from a microcode
sequence. Additionally, it makes sure that the pipeline has no
instructions in flight when it is drained, which should make draining
more robust.
Draining is controlled in the commit stage, which checks if the next
PC after a committed instruction is in microcode. If this isn't the
case, it requests a squash of all instructions after that the
instruction that just committed and immediately signals a drain stall
to the fetch stage. The CPU then continues to execute until the
pipeline and all associated buffers are empty.
Diffstat (limited to 'src/cpu/o3/dep_graph.hh')
-rw-r--r-- | src/cpu/o3/dep_graph.hh | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/src/cpu/o3/dep_graph.hh b/src/cpu/o3/dep_graph.hh index 804b3f9cd..41ab6e94f 100644 --- a/src/cpu/o3/dep_graph.hh +++ b/src/cpu/o3/dep_graph.hh @@ -1,4 +1,16 @@ /* + * Copyright (c) 2012 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * * Copyright (c) 2006 The Regents of The University of Michigan * All rights reserved. * @@ -93,8 +105,11 @@ class DependencyGraph /** Removes and returns the newest dependent of a specific register. */ DynInstPtr pop(PhysRegIndex idx); + /** Checks if the entire dependency graph is empty. */ + bool empty() const; + /** Checks if there are any dependents on a specific register. */ - bool empty(PhysRegIndex idx) { return !dependGraph[idx].next; } + bool empty(PhysRegIndex idx) const { return !dependGraph[idx].next; } /** Debugging function to dump out the dependency graph. */ @@ -241,6 +256,17 @@ DependencyGraph<DynInstPtr>::pop(PhysRegIndex idx) } template <class DynInstPtr> +bool +DependencyGraph<DynInstPtr>::empty() const +{ + for (int i = 0; i < numEntries; ++i) { + if (!empty(i)) + return false; + } + return true; +} + +template <class DynInstPtr> void DependencyGraph<DynInstPtr>::dump() { |