diff options
author | Giacomo Gabrielli <giacomo.gabrielli@arm.com> | 2018-02-26 13:41:08 +0000 |
---|---|---|
committer | Giacomo Gabrielli <giacomo.gabrielli@arm.com> | 2019-05-30 15:55:59 +0000 |
commit | fc61172dbe4e3a93f941227a1f36b7f07e97ab68 (patch) | |
tree | 264b957011c381cdda74d08642c5404ece247b45 /src/cpu/base_dyn_inst.hh | |
parent | 5365c18f2e309b54d3e37dc98d8cca20ec9d4219 (diff) | |
download | gem5-fc61172dbe4e3a93f941227a1f36b7f07e97ab68.tar.xz |
cpu-o3: Add support for pinned writes
This patch adds support for pinning registers for a certain number of
consecutive writes. This is only relevant for timing CPU models
(functional-only models are unaffected), and it is primarily needed to
provide a realistic execution model for micro-coded operations whose
microops can write to non-overlapping portions of a destination
register, e.g. vector gather loads. In those cases, this mechanism
can disable renaming for a sequence of consecutive writes, thus making
the resulting execution more efficient: allocating a new physical
register for each microop would introduce a read-modify-write chain of
dependencies, while with these modifications the microops can write
back in parallel.
Please note that this new feature is only leveraged by O3CPU for the
time being.
Additional authors:
- Gabor Dozsa <gabor.dozsa@arm.com>
Change-Id: I07eb5fdbd1fa0b748c9bdc1174d9f330fda34f81
Signed-off-by: Giacomo Gabrielli <giacomo.gabrielli@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/13520
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
Diffstat (limited to 'src/cpu/base_dyn_inst.hh')
-rw-r--r-- | src/cpu/base_dyn_inst.hh | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/src/cpu/base_dyn_inst.hh b/src/cpu/base_dyn_inst.hh index 22a32ec10..6f9555a38 100644 --- a/src/cpu/base_dyn_inst.hh +++ b/src/cpu/base_dyn_inst.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2013, 2016-2018 ARM Limited + * Copyright (c) 2011, 2013, 2016-2019 ARM Limited * Copyright (c) 2013 Advanced Micro Devices, Inc. * All rights reserved. * @@ -116,6 +116,9 @@ class BaseDynInst : public ExecContext, public RefCounted SquashedInIQ, /// Instruction is squashed in the IQ SquashedInLSQ, /// Instruction is squashed in the LSQ SquashedInROB, /// Instruction is squashed in the ROB + PinnedRegsRenamed, /// Pinned registers are renamed + PinnedRegsWritten, /// Pinned registers are written back + PinnedRegsSquashDone, /// Regs pinning status updated after squash RecoverInst, /// Is a recover instruction BlockingInst, /// Is a blocking instruction ThreadsyncWait, /// Is a thread synchronization instruction @@ -173,12 +176,14 @@ class BaseDynInst : public ExecContext, public RefCounted /** PC state for this instruction. */ TheISA::PCState pc; + private: /* An amalgamation of a lot of boolean values into one */ std::bitset<MaxFlags> instFlags; /** The status of this BaseDynInst. Several bits can be set. */ std::bitset<NumStatus> status; + protected: /** Whether or not the source register is ready. * @todo: Not sure this should be here vs the derived class. */ @@ -385,6 +390,8 @@ class BaseDynInst : public ExecContext, public RefCounted { _destRegIdx[idx] = renamed_dest; _prevDestRegIdx[idx] = previous_rename; + if (renamed_dest->isPinned()) + setPinnedRegsRenamed(); } /** Renames a source logical register to the physical register which @@ -767,7 +774,7 @@ class BaseDynInst : public ExecContext, public RefCounted bool isCommitted() const { return status[Committed]; } /** Sets this instruction as squashed. */ - void setSquashed() { status.set(Squashed); } + void setSquashed(); /** Returns whether or not this instruction is squashed. */ bool isSquashed() const { return status[Squashed]; } @@ -802,7 +809,7 @@ class BaseDynInst : public ExecContext, public RefCounted bool isInLSQ() const { return status[LsqEntry]; } /** Sets this instruction as squashed in the LSQ. */ - void setSquashedInLSQ() { status.set(SquashedInLSQ);} + void setSquashedInLSQ() { status.set(SquashedInLSQ); status.set(Squashed);} /** Returns whether or not this instruction is squashed in the LSQ. */ bool isSquashedInLSQ() const { return status[SquashedInLSQ]; } @@ -825,6 +832,41 @@ class BaseDynInst : public ExecContext, public RefCounted /** Returns whether or not this instruction is squashed in the ROB. */ bool isSquashedInROB() const { return status[SquashedInROB]; } + /** Returns whether pinned registers are renamed */ + bool isPinnedRegsRenamed() const { return status[PinnedRegsRenamed]; } + + /** Sets the destination registers as renamed */ + void + setPinnedRegsRenamed() + { + assert(!status[PinnedRegsSquashDone]); + assert(!status[PinnedRegsWritten]); + status.set(PinnedRegsRenamed); + } + + /** Returns whether destination registers are written */ + bool isPinnedRegsWritten() const { return status[PinnedRegsWritten]; } + + /** Sets destination registers as written */ + void + setPinnedRegsWritten() + { + assert(!status[PinnedRegsSquashDone]); + assert(status[PinnedRegsRenamed]); + status.set(PinnedRegsWritten); + } + + /** Return whether dest registers' pinning status updated after squash */ + bool + isPinnedRegsSquashDone() const { return status[PinnedRegsSquashDone]; } + + /** Sets dest registers' status updated after squash */ + void + setPinnedRegsSquashDone() { + assert(!status[PinnedRegsSquashDone]); + status.set(PinnedRegsSquashDone); + } + /** Read the PC state of this instruction. */ TheISA::PCState pcState() const { return pc; } |