Yet another merge with the main repository.
--HG-- rename : tests/long/10.linux-boot/ref/x86/linux/pc-o3-timing/config.ini => tests/long/fs/10.linux-boot/ref/x86/linux/pc-o3-timing/config.ini rename : tests/long/10.linux-boot/ref/x86/linux/pc-o3-timing/simout => tests/long/fs/10.linux-boot/ref/x86/linux/pc-o3-timing/simout rename : tests/long/10.linux-boot/ref/x86/linux/pc-o3-timing/stats.txt => tests/long/fs/10.linux-boot/ref/x86/linux/pc-o3-timing/stats.txt rename : tests/long/10.linux-boot/ref/x86/linux/pc-o3-timing/system.pc.com_1.terminal => tests/long/fs/10.linux-boot/ref/x86/linux/pc-o3-timing/system.pc.com_1.terminal rename : tests/long/00.gzip/ref/x86/linux/o3-timing/config.ini => tests/long/se/00.gzip/ref/x86/linux/o3-timing/config.ini rename : tests/long/00.gzip/ref/x86/linux/o3-timing/simout => tests/long/se/00.gzip/ref/x86/linux/o3-timing/simout rename : tests/long/00.gzip/ref/x86/linux/o3-timing/stats.txt => tests/long/se/00.gzip/ref/x86/linux/o3-timing/stats.txt rename : tests/long/10.mcf/ref/x86/linux/o3-timing/config.ini => tests/long/se/10.mcf/ref/x86/linux/o3-timing/config.ini rename : tests/long/10.mcf/ref/x86/linux/o3-timing/simout => tests/long/se/10.mcf/ref/x86/linux/o3-timing/simout rename : tests/long/10.mcf/ref/x86/linux/o3-timing/stats.txt => tests/long/se/10.mcf/ref/x86/linux/o3-timing/stats.txt rename : tests/long/20.parser/ref/x86/linux/o3-timing/config.ini => tests/long/se/20.parser/ref/x86/linux/o3-timing/config.ini rename : tests/long/20.parser/ref/x86/linux/o3-timing/simout => tests/long/se/20.parser/ref/x86/linux/o3-timing/simout rename : tests/long/20.parser/ref/x86/linux/o3-timing/stats.txt => tests/long/se/20.parser/ref/x86/linux/o3-timing/stats.txt rename : tests/long/70.twolf/ref/x86/linux/o3-timing/config.ini => tests/long/se/70.twolf/ref/x86/linux/o3-timing/config.ini rename : tests/long/70.twolf/ref/x86/linux/o3-timing/simout => tests/long/se/70.twolf/ref/x86/linux/o3-timing/simout rename : tests/long/70.twolf/ref/x86/linux/o3-timing/stats.txt => tests/long/se/70.twolf/ref/x86/linux/o3-timing/stats.txt rename : tests/quick/00.hello/ref/x86/linux/o3-timing/config.ini => tests/quick/se/00.hello/ref/x86/linux/o3-timing/config.ini rename : tests/quick/00.hello/ref/x86/linux/o3-timing/simout => tests/quick/se/00.hello/ref/x86/linux/o3-timing/simout rename : tests/quick/00.hello/ref/x86/linux/o3-timing/stats.txt => tests/quick/se/00.hello/ref/x86/linux/o3-timing/stats.txt
This commit is contained in:
@@ -139,3 +139,5 @@ class DerivO3CPU(BaseCPU):
|
||||
smtROBThreshold = Param.Int(100, "SMT ROB Threshold Sharing Parameter")
|
||||
smtCommitPolicy = Param.String('RoundRobin', "SMT Commit Policy")
|
||||
|
||||
needsTSO = Param.Bool(buildEnv['TARGET_ISA'] == 'x86',
|
||||
"Enable TSO Memory model")
|
||||
|
||||
@@ -452,6 +452,9 @@ class LSQUnit {
|
||||
/** Has the blocked load been handled. */
|
||||
bool loadBlockedHandled;
|
||||
|
||||
/** Whether or not a store is in flight. */
|
||||
bool storeInFlight;
|
||||
|
||||
/** The sequence number of the blocked load. */
|
||||
InstSeqNum blockedLoadSeqNum;
|
||||
|
||||
@@ -465,6 +468,9 @@ class LSQUnit {
|
||||
/** The packet that is pending free cache ports. */
|
||||
PacketPtr pendingPkt;
|
||||
|
||||
/** Flag for memory model. */
|
||||
bool needsTSO;
|
||||
|
||||
// Will also need how many read/write ports the Dcache has. Or keep track
|
||||
// of that in stage that is one level up, and only call executeLoad/Store
|
||||
// the appropriate number of times.
|
||||
|
||||
@@ -138,7 +138,7 @@ template <class Impl>
|
||||
LSQUnit<Impl>::LSQUnit()
|
||||
: loads(0), stores(0), storesToWB(0), cacheBlockMask(0), stalled(false),
|
||||
isStoreBlocked(false), isLoadBlocked(false),
|
||||
loadBlockedHandled(false), hasPendingPkt(false)
|
||||
loadBlockedHandled(false), storeInFlight(false), hasPendingPkt(false)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -182,6 +182,7 @@ LSQUnit<Impl>::init(O3CPU *cpu_ptr, IEW *iew_ptr, DerivO3CPUParams *params,
|
||||
memDepViolator = NULL;
|
||||
|
||||
blockedLoadSeqNum = 0;
|
||||
needsTSO = params->needsTSO;
|
||||
}
|
||||
|
||||
template<class Impl>
|
||||
@@ -770,6 +771,7 @@ LSQUnit<Impl>::writebackStores()
|
||||
storeWBIdx != storeTail &&
|
||||
storeQueue[storeWBIdx].inst &&
|
||||
storeQueue[storeWBIdx].canWB &&
|
||||
((!needsTSO) || (!storeInFlight)) &&
|
||||
usedPorts < cachePorts) {
|
||||
|
||||
if (isStoreBlocked || lsq->cacheBlocked()) {
|
||||
@@ -1090,6 +1092,10 @@ LSQUnit<Impl>::storePostSend(PacketPtr pkt)
|
||||
#endif
|
||||
}
|
||||
|
||||
if (needsTSO) {
|
||||
storeInFlight = true;
|
||||
}
|
||||
|
||||
incrStIdx(storeWBIdx);
|
||||
}
|
||||
|
||||
@@ -1163,6 +1169,10 @@ LSQUnit<Impl>::completeStore(int store_idx)
|
||||
|
||||
storeQueue[store_idx].inst->setCompleted();
|
||||
|
||||
if (needsTSO) {
|
||||
storeInFlight = false;
|
||||
}
|
||||
|
||||
// Tell the checker we've completed this instruction. Some stores
|
||||
// may get reported twice to the checker, but the checker can
|
||||
// handle that case.
|
||||
|
||||
Reference in New Issue
Block a user