store_set.cc revision 2348
13536Sgblack@eecs.umich.edu/*
23536Sgblack@eecs.umich.edu * Copyright (c) 2004-2006 The Regents of The University of Michigan
33536Sgblack@eecs.umich.edu * All rights reserved.
43536Sgblack@eecs.umich.edu *
53536Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
63536Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
73536Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
83536Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
93536Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
103536Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
113536Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
123536Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
133536Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
143536Sgblack@eecs.umich.edu * this software without specific prior written permission.
153536Sgblack@eecs.umich.edu *
163536Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173536Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183536Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193536Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203536Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213536Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223536Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233536Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243536Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253536Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263536Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273536Sgblack@eecs.umich.edu */
283536Sgblack@eecs.umich.edu
293536Sgblack@eecs.umich.edu#include "base/intmath.hh"
303536Sgblack@eecs.umich.edu#include "base/trace.hh"
313536Sgblack@eecs.umich.edu#include "cpu/o3/store_set.hh"
323536Sgblack@eecs.umich.edu
333536Sgblack@eecs.umich.eduStoreSet::StoreSet(int _SSIT_size, int _LFST_size)
343536Sgblack@eecs.umich.edu    : SSITSize(_SSIT_size), LFSTSize(_LFST_size)
353536Sgblack@eecs.umich.edu{
363536Sgblack@eecs.umich.edu    DPRINTF(StoreSet, "StoreSet: Creating store set object.\n");
373536Sgblack@eecs.umich.edu    DPRINTF(StoreSet, "StoreSet: SSIT size: %i, LFST size: %i.\n",
383536Sgblack@eecs.umich.edu            SSITSize, LFSTSize);
393536Sgblack@eecs.umich.edu
403536Sgblack@eecs.umich.edu    if (!isPowerOf2(SSITSize)) {
413536Sgblack@eecs.umich.edu        fatal("Invalid SSIT size!\n");
423536Sgblack@eecs.umich.edu    }
433536Sgblack@eecs.umich.edu
443536Sgblack@eecs.umich.edu    SSIT.resize(SSITSize);
453536Sgblack@eecs.umich.edu
463536Sgblack@eecs.umich.edu    validSSIT.resize(SSITSize);
473536Sgblack@eecs.umich.edu
483536Sgblack@eecs.umich.edu    for (int i = 0; i < SSITSize; ++i)
493536Sgblack@eecs.umich.edu        validSSIT[i] = false;
503536Sgblack@eecs.umich.edu
513536Sgblack@eecs.umich.edu    if (!isPowerOf2(LFSTSize)) {
523536Sgblack@eecs.umich.edu        fatal("Invalid LFST size!\n");
533536Sgblack@eecs.umich.edu    }
543536Sgblack@eecs.umich.edu
553536Sgblack@eecs.umich.edu    LFST.resize(LFSTSize);
563536Sgblack@eecs.umich.edu
573536Sgblack@eecs.umich.edu    validLFST.resize(LFSTSize);
583536Sgblack@eecs.umich.edu
593536Sgblack@eecs.umich.edu    for (int i = 0; i < LFSTSize; ++i) {
603536Sgblack@eecs.umich.edu        validLFST[i] = false;
613536Sgblack@eecs.umich.edu        LFST[i] = 0;
623536Sgblack@eecs.umich.edu    }
633536Sgblack@eecs.umich.edu
643536Sgblack@eecs.umich.edu    indexMask = SSITSize - 1;
653536Sgblack@eecs.umich.edu
663536Sgblack@eecs.umich.edu    offsetBits = 2;
673536Sgblack@eecs.umich.edu}
683536Sgblack@eecs.umich.edu
693536Sgblack@eecs.umich.eduStoreSet::~StoreSet()
703536Sgblack@eecs.umich.edu{
713536Sgblack@eecs.umich.edu}
723536Sgblack@eecs.umich.edu
733536Sgblack@eecs.umich.eduvoid
743536Sgblack@eecs.umich.eduStoreSet::init(int _SSIT_size, int _LFST_size)
753536Sgblack@eecs.umich.edu{
763536Sgblack@eecs.umich.edu    SSITSize = _SSIT_size;
773536Sgblack@eecs.umich.edu    LFSTSize = _LFST_size;
783536Sgblack@eecs.umich.edu
793536Sgblack@eecs.umich.edu    DPRINTF(StoreSet, "StoreSet: Creating store set object.\n");
803536Sgblack@eecs.umich.edu    DPRINTF(StoreSet, "StoreSet: SSIT size: %i, LFST size: %i.\n",
813536Sgblack@eecs.umich.edu            SSITSize, LFSTSize);
823536Sgblack@eecs.umich.edu
833536Sgblack@eecs.umich.edu    SSIT.resize(SSITSize);
843536Sgblack@eecs.umich.edu
853536Sgblack@eecs.umich.edu    validSSIT.resize(SSITSize);
863536Sgblack@eecs.umich.edu
873536Sgblack@eecs.umich.edu    for (int i = 0; i < SSITSize; ++i)
883536Sgblack@eecs.umich.edu        validSSIT[i] = false;
893536Sgblack@eecs.umich.edu
903536Sgblack@eecs.umich.edu    LFST.resize(LFSTSize);
913536Sgblack@eecs.umich.edu
923536Sgblack@eecs.umich.edu    validLFST.resize(LFSTSize);
933536Sgblack@eecs.umich.edu
943536Sgblack@eecs.umich.edu    for (int i = 0; i < LFSTSize; ++i) {
953536Sgblack@eecs.umich.edu        validLFST[i] = false;
963536Sgblack@eecs.umich.edu        LFST[i] = 0;
973536Sgblack@eecs.umich.edu    }
983536Sgblack@eecs.umich.edu
993536Sgblack@eecs.umich.edu    indexMask = SSITSize - 1;
1003536Sgblack@eecs.umich.edu
1013536Sgblack@eecs.umich.edu    offsetBits = 2;
1023536Sgblack@eecs.umich.edu}
1033536Sgblack@eecs.umich.edu
1043536Sgblack@eecs.umich.edu
1053536Sgblack@eecs.umich.eduvoid
1063536Sgblack@eecs.umich.eduStoreSet::violation(Addr store_PC, Addr load_PC)
1073536Sgblack@eecs.umich.edu{
1083536Sgblack@eecs.umich.edu    int load_index = calcIndex(load_PC);
1093536Sgblack@eecs.umich.edu    int store_index = calcIndex(store_PC);
1103536Sgblack@eecs.umich.edu
1113536Sgblack@eecs.umich.edu    assert(load_index < SSITSize && store_index < SSITSize);
1123536Sgblack@eecs.umich.edu
1133536Sgblack@eecs.umich.edu    bool valid_load_SSID = validSSIT[load_index];
1143536Sgblack@eecs.umich.edu    bool valid_store_SSID = validSSIT[store_index];
1153536Sgblack@eecs.umich.edu
1163536Sgblack@eecs.umich.edu    if (!valid_load_SSID && !valid_store_SSID) {
1173536Sgblack@eecs.umich.edu        // Calculate a new SSID here.
1183536Sgblack@eecs.umich.edu        SSID new_set = calcSSID(load_PC);
1193536Sgblack@eecs.umich.edu
1203536Sgblack@eecs.umich.edu        validSSIT[load_index] = true;
1213536Sgblack@eecs.umich.edu
1223536Sgblack@eecs.umich.edu        SSIT[load_index] = new_set;
1233536Sgblack@eecs.umich.edu
1243961Sgblack@eecs.umich.edu        validSSIT[store_index] = true;
1253961Sgblack@eecs.umich.edu
1263961Sgblack@eecs.umich.edu        SSIT[store_index] = new_set;
1273961Sgblack@eecs.umich.edu
1283961Sgblack@eecs.umich.edu        assert(new_set < LFSTSize);
1293550Sgblack@eecs.umich.edu
1303961Sgblack@eecs.umich.edu        DPRINTF(StoreSet, "StoreSet: Neither load nor store had a valid "
1313550Sgblack@eecs.umich.edu                "storeset, creating a new one: %i for load %#x, store %#x\n",
1323536Sgblack@eecs.umich.edu                new_set, load_PC, store_PC);
1333536Sgblack@eecs.umich.edu    } else if (valid_load_SSID && !valid_store_SSID) {
1343536Sgblack@eecs.umich.edu        SSID load_SSID = SSIT[load_index];
1353536Sgblack@eecs.umich.edu
1363536Sgblack@eecs.umich.edu        validSSIT[store_index] = true;
1373536Sgblack@eecs.umich.edu
1383536Sgblack@eecs.umich.edu        SSIT[store_index] = load_SSID;
1393536Sgblack@eecs.umich.edu
1403536Sgblack@eecs.umich.edu        assert(load_SSID < LFSTSize);
1413536Sgblack@eecs.umich.edu
1423536Sgblack@eecs.umich.edu        DPRINTF(StoreSet, "StoreSet: Load had a valid store set.  Adding "
1433550Sgblack@eecs.umich.edu                "store to that set: %i for load %#x, store %#x\n",
1443536Sgblack@eecs.umich.edu                load_SSID, load_PC, store_PC);
1453536Sgblack@eecs.umich.edu    } else if (!valid_load_SSID && valid_store_SSID) {
1463550Sgblack@eecs.umich.edu        SSID store_SSID = SSIT[store_index];
1473536Sgblack@eecs.umich.edu
1483579Sgblack@eecs.umich.edu        validSSIT[load_index] = true;
1493536Sgblack@eecs.umich.edu
1503536Sgblack@eecs.umich.edu        SSIT[load_index] = store_SSID;
1513536Sgblack@eecs.umich.edu
1523536Sgblack@eecs.umich.edu        DPRINTF(StoreSet, "StoreSet: Store had a valid store set: %i for "
1533536Sgblack@eecs.umich.edu                "load %#x, store %#x\n",
1543536Sgblack@eecs.umich.edu                store_SSID, load_PC, store_PC);
1553536Sgblack@eecs.umich.edu    } else {
1563536Sgblack@eecs.umich.edu        SSID load_SSID = SSIT[load_index];
1573536Sgblack@eecs.umich.edu        SSID store_SSID = SSIT[store_index];
1583536Sgblack@eecs.umich.edu
1593961Sgblack@eecs.umich.edu        assert(load_SSID < LFSTSize && store_SSID < LFSTSize);
1603961Sgblack@eecs.umich.edu
1613961Sgblack@eecs.umich.edu        // The store set with the lower number wins
1623536Sgblack@eecs.umich.edu        if (store_SSID > load_SSID) {
1633536Sgblack@eecs.umich.edu            SSIT[store_index] = load_SSID;
1643536Sgblack@eecs.umich.edu
1653536Sgblack@eecs.umich.edu            DPRINTF(StoreSet, "StoreSet: Load had smaller store set: %i; "
1663536Sgblack@eecs.umich.edu                    "for load %#x, store %#x\n",
1673536Sgblack@eecs.umich.edu                    load_SSID, load_PC, store_PC);
1683536Sgblack@eecs.umich.edu        } else {
1693536Sgblack@eecs.umich.edu            SSIT[load_index] = store_SSID;
1703536Sgblack@eecs.umich.edu
1713536Sgblack@eecs.umich.edu            DPRINTF(StoreSet, "StoreSet: Store had smaller store set: %i; "
1723536Sgblack@eecs.umich.edu                    "for load %#x, store %#x\n",
1733536Sgblack@eecs.umich.edu                    store_SSID, load_PC, store_PC);
1743536Sgblack@eecs.umich.edu        }
1753536Sgblack@eecs.umich.edu    }
1763536Sgblack@eecs.umich.edu}
1773536Sgblack@eecs.umich.edu
1783536Sgblack@eecs.umich.eduvoid
1793536Sgblack@eecs.umich.eduStoreSet::insertLoad(Addr load_PC, InstSeqNum load_seq_num)
1803536Sgblack@eecs.umich.edu{
1813536Sgblack@eecs.umich.edu    // Does nothing.
1823536Sgblack@eecs.umich.edu    return;
1833536Sgblack@eecs.umich.edu}
1843536Sgblack@eecs.umich.edu
1853536Sgblack@eecs.umich.eduvoid
1863536Sgblack@eecs.umich.eduStoreSet::insertStore(Addr store_PC, InstSeqNum store_seq_num,
1873536Sgblack@eecs.umich.edu                      unsigned tid)
1883536Sgblack@eecs.umich.edu{
1893536Sgblack@eecs.umich.edu    int index = calcIndex(store_PC);
1904172Ssaidi@eecs.umich.edu
1913536Sgblack@eecs.umich.edu    int store_SSID;
1923536Sgblack@eecs.umich.edu
1933536Sgblack@eecs.umich.edu    assert(index < SSITSize);
1943536Sgblack@eecs.umich.edu
1953536Sgblack@eecs.umich.edu    if (!validSSIT[index]) {
1963536Sgblack@eecs.umich.edu        // Do nothing if there's no valid entry.
1973536Sgblack@eecs.umich.edu        return;
1983536Sgblack@eecs.umich.edu    } else {
1993536Sgblack@eecs.umich.edu        store_SSID = SSIT[index];
2003536Sgblack@eecs.umich.edu
2013961Sgblack@eecs.umich.edu        assert(store_SSID < LFSTSize);
2023536Sgblack@eecs.umich.edu
2033536Sgblack@eecs.umich.edu        // Update the last store that was fetched with the current one.
2043536Sgblack@eecs.umich.edu        LFST[store_SSID] = store_seq_num;
2053536Sgblack@eecs.umich.edu
2063536Sgblack@eecs.umich.edu        validLFST[store_SSID] = 1;
2073536Sgblack@eecs.umich.edu
2083536Sgblack@eecs.umich.edu        storeList[store_seq_num] = store_SSID;
2093536Sgblack@eecs.umich.edu
2103536Sgblack@eecs.umich.edu        DPRINTF(StoreSet, "Store %#x updated the LFST, SSID: %i\n",
2113536Sgblack@eecs.umich.edu                store_PC, store_SSID);
2123579Sgblack@eecs.umich.edu    }
2133536Sgblack@eecs.umich.edu}
2143536Sgblack@eecs.umich.edu
2153536Sgblack@eecs.umich.eduInstSeqNum
2163536Sgblack@eecs.umich.eduStoreSet::checkInst(Addr PC)
2173536Sgblack@eecs.umich.edu{
2183536Sgblack@eecs.umich.edu    int index = calcIndex(PC);
2193536Sgblack@eecs.umich.edu
2203536Sgblack@eecs.umich.edu    int inst_SSID;
2213536Sgblack@eecs.umich.edu
2223536Sgblack@eecs.umich.edu    assert(index < SSITSize);
2233536Sgblack@eecs.umich.edu
2243536Sgblack@eecs.umich.edu    if (!validSSIT[index]) {
2253536Sgblack@eecs.umich.edu        DPRINTF(StoreSet, "Inst %#x with index %i had no SSID\n",
2263536Sgblack@eecs.umich.edu                PC, index);
2273536Sgblack@eecs.umich.edu
2283536Sgblack@eecs.umich.edu        // Return 0 if there's no valid entry.
2293536Sgblack@eecs.umich.edu        return 0;
2303536Sgblack@eecs.umich.edu    } else {
2313536Sgblack@eecs.umich.edu        inst_SSID = SSIT[index];
2323536Sgblack@eecs.umich.edu
2333536Sgblack@eecs.umich.edu        assert(inst_SSID < LFSTSize);
2343536Sgblack@eecs.umich.edu
2353536Sgblack@eecs.umich.edu        if (!validLFST[inst_SSID]) {
2363536Sgblack@eecs.umich.edu
2373536Sgblack@eecs.umich.edu            DPRINTF(StoreSet, "Inst %#x with index %i and SSID %i had no "
2383536Sgblack@eecs.umich.edu                    "dependency\n", PC, index, inst_SSID);
2393536Sgblack@eecs.umich.edu
2403536Sgblack@eecs.umich.edu            return 0;
2413536Sgblack@eecs.umich.edu        } else {
2423536Sgblack@eecs.umich.edu            DPRINTF(StoreSet, "Inst %#x with index %i and SSID %i had LFST "
2433536Sgblack@eecs.umich.edu                    "inum of %i\n", PC, index, inst_SSID, LFST[inst_SSID]);
2443536Sgblack@eecs.umich.edu
2453536Sgblack@eecs.umich.edu            return LFST[inst_SSID];
2463536Sgblack@eecs.umich.edu        }
2473536Sgblack@eecs.umich.edu    }
2483536Sgblack@eecs.umich.edu}
2493536Sgblack@eecs.umich.edu
2503536Sgblack@eecs.umich.eduvoid
2513536Sgblack@eecs.umich.eduStoreSet::issued(Addr issued_PC, InstSeqNum issued_seq_num, bool is_store)
2523536Sgblack@eecs.umich.edu{
2533536Sgblack@eecs.umich.edu    // This only is updated upon a store being issued.
2543536Sgblack@eecs.umich.edu    if (!is_store) {
2553536Sgblack@eecs.umich.edu        return;
2563536Sgblack@eecs.umich.edu    }
2573536Sgblack@eecs.umich.edu
2583536Sgblack@eecs.umich.edu    int index = calcIndex(issued_PC);
2593536Sgblack@eecs.umich.edu
2603536Sgblack@eecs.umich.edu    int store_SSID;
2613536Sgblack@eecs.umich.edu
2623536Sgblack@eecs.umich.edu    assert(index < SSITSize);
2633536Sgblack@eecs.umich.edu
2643536Sgblack@eecs.umich.edu    SeqNumMapIt store_list_it = storeList.find(issued_seq_num);
2653536Sgblack@eecs.umich.edu
2663550Sgblack@eecs.umich.edu    if (store_list_it != storeList.end()) {
2673536Sgblack@eecs.umich.edu        storeList.erase(store_list_it);
2683550Sgblack@eecs.umich.edu    }
2693536Sgblack@eecs.umich.edu
2703536Sgblack@eecs.umich.edu    // Make sure the SSIT still has a valid entry for the issued store.
2713550Sgblack@eecs.umich.edu    if (!validSSIT[index]) {
2723536Sgblack@eecs.umich.edu        return;
2733536Sgblack@eecs.umich.edu    }
2743536Sgblack@eecs.umich.edu
2753536Sgblack@eecs.umich.edu    store_SSID = SSIT[index];
2763536Sgblack@eecs.umich.edu
2773536Sgblack@eecs.umich.edu    assert(store_SSID < LFSTSize);
2783536Sgblack@eecs.umich.edu
2793536Sgblack@eecs.umich.edu    // If the last fetched store in the store set refers to the store that
2803536Sgblack@eecs.umich.edu    // was just issued, then invalidate the entry.
2813536Sgblack@eecs.umich.edu    if (validLFST[store_SSID] && LFST[store_SSID] == issued_seq_num) {
2823536Sgblack@eecs.umich.edu        DPRINTF(StoreSet, "StoreSet: store invalidated itself in LFST.\n");
2833536Sgblack@eecs.umich.edu        validLFST[store_SSID] = false;
2843536Sgblack@eecs.umich.edu    }
2853536Sgblack@eecs.umich.edu}
2863536Sgblack@eecs.umich.edu
2874572Sacolyte@umich.eduvoid
2883536Sgblack@eecs.umich.eduStoreSet::squash(InstSeqNum squashed_num, unsigned tid)
2893536Sgblack@eecs.umich.edu{
2903536Sgblack@eecs.umich.edu    DPRINTF(StoreSet, "StoreSet: Squashing until inum %i\n",
2913536Sgblack@eecs.umich.edu            squashed_num);
2923536Sgblack@eecs.umich.edu
2933536Sgblack@eecs.umich.edu    int idx;
2943536Sgblack@eecs.umich.edu    SeqNumMapIt store_list_it = storeList.begin();
2953536Sgblack@eecs.umich.edu
2963550Sgblack@eecs.umich.edu    //@todo:Fix to only delete from correct thread
2973536Sgblack@eecs.umich.edu    while (!storeList.empty()) {
2983550Sgblack@eecs.umich.edu        idx = (*store_list_it).second;
2993536Sgblack@eecs.umich.edu
3003536Sgblack@eecs.umich.edu        if ((*store_list_it).first <= squashed_num) {
3013550Sgblack@eecs.umich.edu            break;
3023536Sgblack@eecs.umich.edu        }
3033536Sgblack@eecs.umich.edu
3043536Sgblack@eecs.umich.edu        bool younger = LFST[idx] > squashed_num;
3053536Sgblack@eecs.umich.edu
3063536Sgblack@eecs.umich.edu        if (validLFST[idx] && younger) {
3073536Sgblack@eecs.umich.edu            DPRINTF(StoreSet, "Squashed [sn:%lli]\n", LFST[idx]);
3083536Sgblack@eecs.umich.edu            validLFST[idx] = false;
3093536Sgblack@eecs.umich.edu
3103536Sgblack@eecs.umich.edu            storeList.erase(store_list_it++);
3113536Sgblack@eecs.umich.edu        } else if (!validLFST[idx] && younger) {
3123536Sgblack@eecs.umich.edu            storeList.erase(store_list_it++);
3133536Sgblack@eecs.umich.edu        }
3143536Sgblack@eecs.umich.edu    }
3153536Sgblack@eecs.umich.edu}
3163536Sgblack@eecs.umich.edu
3173536Sgblack@eecs.umich.eduvoid
318StoreSet::clear()
319{
320    for (int i = 0; i < SSITSize; ++i) {
321        validSSIT[i] = false;
322    }
323
324    for (int i = 0; i < LFSTSize; ++i) {
325        validLFST[i] = false;
326    }
327
328    storeList.clear();
329}
330
331void
332StoreSet::dump()
333{
334    cprintf("storeList.size(): %i\n", storeList.size());
335    SeqNumMapIt store_list_it = storeList.begin();
336
337    int num = 0;
338
339    while (store_list_it != storeList.end()) {
340        cprintf("%i: [sn:%lli] SSID:%i\n",
341                num, (*store_list_it).first, (*store_list_it).second);
342        num++;
343        store_list_it++;
344    }
345}
346