store_set.cc revision 2329
14120Sgblack@eecs.umich.edu/* 24120Sgblack@eecs.umich.edu * Copyright (c) 2004-2006 The Regents of The University of Michigan 34120Sgblack@eecs.umich.edu * All rights reserved. 44120Sgblack@eecs.umich.edu * 57087Snate@binkert.org * Redistribution and use in source and binary forms, with or without 67087Snate@binkert.org * modification, are permitted provided that the following conditions are 77087Snate@binkert.org * met: redistributions of source code must retain the above copyright 87087Snate@binkert.org * notice, this list of conditions and the following disclaimer; 97087Snate@binkert.org * redistributions in binary form must reproduce the above copyright 107087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 117087Snate@binkert.org * documentation and/or other materials provided with the distribution; 127087Snate@binkert.org * neither the name of the copyright holders nor the names of its 134120Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 147087Snate@binkert.org * this software without specific prior written permission. 157087Snate@binkert.org * 167087Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 177087Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187087Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 197087Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 207087Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 217087Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 224120Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 237087Snate@binkert.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 244120Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 254120Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 264120Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274120Sgblack@eecs.umich.edu */ 284120Sgblack@eecs.umich.edu 294120Sgblack@eecs.umich.edu#include "base/trace.hh" 304120Sgblack@eecs.umich.edu#include "cpu/o3/store_set.hh" 314120Sgblack@eecs.umich.edu 324120Sgblack@eecs.umich.eduStoreSet::StoreSet(int _SSIT_size, int _LFST_size) 334120Sgblack@eecs.umich.edu : SSITSize(_SSIT_size), LFSTSize(_LFST_size) 344120Sgblack@eecs.umich.edu{ 354120Sgblack@eecs.umich.edu DPRINTF(StoreSet, "StoreSet: Creating store set object.\n"); 364120Sgblack@eecs.umich.edu DPRINTF(StoreSet, "StoreSet: SSIT size: %i, LFST size: %i.\n", 374120Sgblack@eecs.umich.edu SSITSize, LFSTSize); 384120Sgblack@eecs.umich.edu 394120Sgblack@eecs.umich.edu SSIT.resize(SSITSize); 404120Sgblack@eecs.umich.edu 414120Sgblack@eecs.umich.edu validSSIT.resize(SSITSize); 424120Sgblack@eecs.umich.edu 435647Sgblack@eecs.umich.edu for (int i = 0; i < SSITSize; ++i) 445086Sgblack@eecs.umich.edu validSSIT[i] = false; 455655Sgblack@eecs.umich.edu 465654Sgblack@eecs.umich.edu LFST.resize(LFSTSize); 475086Sgblack@eecs.umich.edu 485648Sgblack@eecs.umich.edu validLFST.resize(LFSTSize); 495651Sgblack@eecs.umich.edu 505647Sgblack@eecs.umich.edu for (int i = 0; i < LFSTSize; ++i) { 515647Sgblack@eecs.umich.edu validLFST[i] = false; 525647Sgblack@eecs.umich.edu LFST[i] = 0; 535647Sgblack@eecs.umich.edu } 545810Sgblack@eecs.umich.edu 554120Sgblack@eecs.umich.edu indexMask = SSITSize - 1; 565704Snate@binkert.org 575086Sgblack@eecs.umich.edu offsetBits = 2; 585651Sgblack@eecs.umich.edu} 595086Sgblack@eecs.umich.edu 605647Sgblack@eecs.umich.eduStoreSet::~StoreSet() 615654Sgblack@eecs.umich.edu{ 625647Sgblack@eecs.umich.edu} 635654Sgblack@eecs.umich.edu 645691Sgblack@eecs.umich.eduvoid 655691Sgblack@eecs.umich.eduStoreSet::init(int _SSIT_size, int _LFST_size) 665691Sgblack@eecs.umich.edu{ 675691Sgblack@eecs.umich.edu SSITSize = _SSIT_size; 685691Sgblack@eecs.umich.edu LFSTSize = _LFST_size; 695691Sgblack@eecs.umich.edu 705691Sgblack@eecs.umich.edu DPRINTF(StoreSet, "StoreSet: Creating store set object.\n"); 715691Sgblack@eecs.umich.edu DPRINTF(StoreSet, "StoreSet: SSIT size: %i, LFST size: %i.\n", 725691Sgblack@eecs.umich.edu SSITSize, LFSTSize); 735691Sgblack@eecs.umich.edu 745691Sgblack@eecs.umich.edu SSIT.resize(SSITSize); 755654Sgblack@eecs.umich.edu 765654Sgblack@eecs.umich.edu validSSIT.resize(SSITSize); 775654Sgblack@eecs.umich.edu 785648Sgblack@eecs.umich.edu for (int i = 0; i < SSITSize; ++i) 795648Sgblack@eecs.umich.edu validSSIT[i] = false; 805647Sgblack@eecs.umich.edu 815647Sgblack@eecs.umich.edu LFST.resize(LFSTSize); 825647Sgblack@eecs.umich.edu 835691Sgblack@eecs.umich.edu validLFST.resize(LFSTSize); 845691Sgblack@eecs.umich.edu 855647Sgblack@eecs.umich.edu for (int i = 0; i < LFSTSize; ++i) { 865691Sgblack@eecs.umich.edu validLFST[i] = false; 875691Sgblack@eecs.umich.edu LFST[i] = 0; 885647Sgblack@eecs.umich.edu } 895647Sgblack@eecs.umich.edu 905647Sgblack@eecs.umich.edu indexMask = SSITSize - 1; 915647Sgblack@eecs.umich.edu 925691Sgblack@eecs.umich.edu offsetBits = 2; 935691Sgblack@eecs.umich.edu} 945691Sgblack@eecs.umich.edu 955691Sgblack@eecs.umich.edu 965691Sgblack@eecs.umich.eduvoid 975647Sgblack@eecs.umich.eduStoreSet::violation(Addr store_PC, Addr load_PC) 985647Sgblack@eecs.umich.edu{ 995647Sgblack@eecs.umich.edu int load_index = calcIndex(load_PC); 1005647Sgblack@eecs.umich.edu int store_index = calcIndex(store_PC); 1015647Sgblack@eecs.umich.edu 1025654Sgblack@eecs.umich.edu assert(load_index < SSITSize && store_index < SSITSize); 1035655Sgblack@eecs.umich.edu 1045655Sgblack@eecs.umich.edu bool valid_load_SSID = validSSIT[load_index]; 1055655Sgblack@eecs.umich.edu bool valid_store_SSID = validSSIT[store_index]; 1065655Sgblack@eecs.umich.edu 1075691Sgblack@eecs.umich.edu if (!valid_load_SSID && !valid_store_SSID) { 1085655Sgblack@eecs.umich.edu // Calculate a new SSID here. 1095691Sgblack@eecs.umich.edu SSID new_set = calcSSID(load_PC); 1105655Sgblack@eecs.umich.edu 1115691Sgblack@eecs.umich.edu validSSIT[load_index] = true; 1125655Sgblack@eecs.umich.edu 1135691Sgblack@eecs.umich.edu SSIT[load_index] = new_set; 1146050Sgblack@eecs.umich.edu 1156050Sgblack@eecs.umich.edu validSSIT[store_index] = true; 1166066Sgblack@eecs.umich.edu 1175655Sgblack@eecs.umich.edu SSIT[store_index] = new_set; 1185655Sgblack@eecs.umich.edu 1195655Sgblack@eecs.umich.edu assert(new_set < LFSTSize); 1205655Sgblack@eecs.umich.edu 1216069Sgblack@eecs.umich.edu DPRINTF(StoreSet, "StoreSet: Neither load nor store had a valid " 1226069Sgblack@eecs.umich.edu "storeset, creating a new one: %i for load %#x, store %#x\n", 1236069Sgblack@eecs.umich.edu new_set, load_PC, store_PC); 1245655Sgblack@eecs.umich.edu } else if (valid_load_SSID && !valid_store_SSID) { 1255654Sgblack@eecs.umich.edu SSID load_SSID = SSIT[load_index]; 1265654Sgblack@eecs.umich.edu 1275654Sgblack@eecs.umich.edu validSSIT[store_index] = true; 1285654Sgblack@eecs.umich.edu 1295654Sgblack@eecs.umich.edu SSIT[store_index] = load_SSID; 1305654Sgblack@eecs.umich.edu 1315654Sgblack@eecs.umich.edu assert(load_SSID < LFSTSize); 1325654Sgblack@eecs.umich.edu 1335654Sgblack@eecs.umich.edu DPRINTF(StoreSet, "StoreSet: Load had a valid store set. Adding " 1345654Sgblack@eecs.umich.edu "store to that set: %i for load %#x, store %#x\n", 1355654Sgblack@eecs.umich.edu load_SSID, load_PC, store_PC); 1365654Sgblack@eecs.umich.edu } else if (!valid_load_SSID && valid_store_SSID) { 1375654Sgblack@eecs.umich.edu SSID store_SSID = SSIT[store_index]; 1385654Sgblack@eecs.umich.edu 1395654Sgblack@eecs.umich.edu validSSIT[load_index] = true; 1405654Sgblack@eecs.umich.edu 1415654Sgblack@eecs.umich.edu SSIT[load_index] = store_SSID; 1425654Sgblack@eecs.umich.edu 1435654Sgblack@eecs.umich.edu DPRINTF(StoreSet, "StoreSet: Store had a valid store set: %i for " 1445654Sgblack@eecs.umich.edu "load %#x, store %#x\n", 1455654Sgblack@eecs.umich.edu store_SSID, load_PC, store_PC); 1465654Sgblack@eecs.umich.edu } else { 1475654Sgblack@eecs.umich.edu SSID load_SSID = SSIT[load_index]; 1485654Sgblack@eecs.umich.edu SSID store_SSID = SSIT[store_index]; 1495654Sgblack@eecs.umich.edu 1505654Sgblack@eecs.umich.edu assert(load_SSID < LFSTSize && store_SSID < LFSTSize); 1515654Sgblack@eecs.umich.edu 1525654Sgblack@eecs.umich.edu // The store set with the lower number wins 1535654Sgblack@eecs.umich.edu if (store_SSID > load_SSID) { 1545654Sgblack@eecs.umich.edu SSIT[store_index] = load_SSID; 1555654Sgblack@eecs.umich.edu 1565654Sgblack@eecs.umich.edu DPRINTF(StoreSet, "StoreSet: Load had smaller store set: %i; " 1576101Sgblack@eecs.umich.edu "for load %#x, store %#x\n", 1585654Sgblack@eecs.umich.edu load_SSID, load_PC, store_PC); 1595654Sgblack@eecs.umich.edu } else { 1605654Sgblack@eecs.umich.edu SSIT[load_index] = store_SSID; 1615654Sgblack@eecs.umich.edu 1625654Sgblack@eecs.umich.edu DPRINTF(StoreSet, "StoreSet: Store had smaller store set: %i; " 1636101Sgblack@eecs.umich.edu "for load %#x, store %#x\n", 1645654Sgblack@eecs.umich.edu store_SSID, load_PC, store_PC); 1655654Sgblack@eecs.umich.edu } 1665654Sgblack@eecs.umich.edu } 1675654Sgblack@eecs.umich.edu} 1685654Sgblack@eecs.umich.edu 1696101Sgblack@eecs.umich.eduvoid 1705654Sgblack@eecs.umich.eduStoreSet::insertLoad(Addr load_PC, InstSeqNum load_seq_num) 1715654Sgblack@eecs.umich.edu{ 1725691Sgblack@eecs.umich.edu // Does nothing. 1735691Sgblack@eecs.umich.edu return; 1745810Sgblack@eecs.umich.edu} 1755810Sgblack@eecs.umich.edu 1766136Sgblack@eecs.umich.eduvoid 1776136Sgblack@eecs.umich.eduStoreSet::insertStore(Addr store_PC, InstSeqNum store_seq_num, 1785086Sgblack@eecs.umich.edu unsigned tid) 1795654Sgblack@eecs.umich.edu{ 1805654Sgblack@eecs.umich.edu int index = calcIndex(store_PC); 1815654Sgblack@eecs.umich.edu 1825647Sgblack@eecs.umich.edu int store_SSID; 1835647Sgblack@eecs.umich.edu 1846041Sgblack@eecs.umich.edu assert(index < SSITSize); 1855810Sgblack@eecs.umich.edu 1865810Sgblack@eecs.umich.edu if (!validSSIT[index]) { 1875704Snate@binkert.org // Do nothing if there's no valid entry. 1885648Sgblack@eecs.umich.edu return; 1895648Sgblack@eecs.umich.edu } else { 1905648Sgblack@eecs.umich.edu store_SSID = SSIT[index]; 1915648Sgblack@eecs.umich.edu 1925647Sgblack@eecs.umich.edu assert(store_SSID < LFSTSize); 1935647Sgblack@eecs.umich.edu 1945086Sgblack@eecs.umich.edu // Update the last store that was fetched with the current one. 1955647Sgblack@eecs.umich.edu LFST[store_SSID] = store_seq_num; 1965647Sgblack@eecs.umich.edu 1975647Sgblack@eecs.umich.edu validLFST[store_SSID] = 1; 1985654Sgblack@eecs.umich.edu 1996137Sgblack@eecs.umich.edu storeList[store_seq_num] = store_SSID; 2006137Sgblack@eecs.umich.edu 2016137Sgblack@eecs.umich.edu DPRINTF(StoreSet, "Store %#x updated the LFST, SSID: %i\n", 2026137Sgblack@eecs.umich.edu store_PC, store_SSID); 2036137Sgblack@eecs.umich.edu } 2045654Sgblack@eecs.umich.edu} 2055654Sgblack@eecs.umich.edu 2065648Sgblack@eecs.umich.eduInstSeqNum 2075648Sgblack@eecs.umich.eduStoreSet::checkInst(Addr PC) 2085651Sgblack@eecs.umich.edu{ 2096064Sgblack@eecs.umich.edu int index = calcIndex(PC); 2105647Sgblack@eecs.umich.edu 2115691Sgblack@eecs.umich.edu int inst_SSID; 2125691Sgblack@eecs.umich.edu 2135691Sgblack@eecs.umich.edu assert(index < SSITSize); 2145691Sgblack@eecs.umich.edu 2155691Sgblack@eecs.umich.edu if (!validSSIT[index]) { 2165691Sgblack@eecs.umich.edu DPRINTF(StoreSet, "Inst %#x with index %i had no SSID\n", 2175691Sgblack@eecs.umich.edu PC, index); 2185691Sgblack@eecs.umich.edu 2195691Sgblack@eecs.umich.edu // Return 0 if there's no valid entry. 2206041Sgblack@eecs.umich.edu return 0; 2216041Sgblack@eecs.umich.edu } else { 2225651Sgblack@eecs.umich.edu inst_SSID = SSIT[index]; 2235654Sgblack@eecs.umich.edu 2245654Sgblack@eecs.umich.edu assert(inst_SSID < LFSTSize); 2255654Sgblack@eecs.umich.edu 2265654Sgblack@eecs.umich.edu if (!validLFST[inst_SSID]) { 2275654Sgblack@eecs.umich.edu 2285654Sgblack@eecs.umich.edu DPRINTF(StoreSet, "Inst %#x with index %i and SSID %i had no " 2295654Sgblack@eecs.umich.edu "dependency\n", PC, index, inst_SSID); 2305654Sgblack@eecs.umich.edu 2315654Sgblack@eecs.umich.edu return 0; 2325654Sgblack@eecs.umich.edu } else { 2335654Sgblack@eecs.umich.edu DPRINTF(StoreSet, "Inst %#x with index %i and SSID %i had LFST " 2345648Sgblack@eecs.umich.edu "inum of %i\n", PC, index, inst_SSID, LFST[inst_SSID]); 2355648Sgblack@eecs.umich.edu 2365704Snate@binkert.org return LFST[inst_SSID]; 2375704Snate@binkert.org } 2385647Sgblack@eecs.umich.edu } 2395648Sgblack@eecs.umich.edu} 2405648Sgblack@eecs.umich.edu 2415648Sgblack@eecs.umich.eduvoid 2425654Sgblack@eecs.umich.eduStoreSet::issued(Addr issued_PC, InstSeqNum issued_seq_num, bool is_store) 2435654Sgblack@eecs.umich.edu{ 2445654Sgblack@eecs.umich.edu // This only is updated upon a store being issued. 2455654Sgblack@eecs.umich.edu if (!is_store) { 2466041Sgblack@eecs.umich.edu return; 2475086Sgblack@eecs.umich.edu } 2485654Sgblack@eecs.umich.edu 2495654Sgblack@eecs.umich.edu int index = calcIndex(issued_PC); 2505654Sgblack@eecs.umich.edu 2515651Sgblack@eecs.umich.edu int store_SSID; 2525704Snate@binkert.org 2535704Snate@binkert.org assert(index < SSITSize); 2545704Snate@binkert.org 2555086Sgblack@eecs.umich.edu SeqNumMapIt store_list_it = storeList.find(issued_seq_num); 2565654Sgblack@eecs.umich.edu 2575654Sgblack@eecs.umich.edu if (store_list_it != storeList.end()) { 2585654Sgblack@eecs.umich.edu storeList.erase(store_list_it); 2595086Sgblack@eecs.umich.edu } 2605704Snate@binkert.org 2615704Snate@binkert.org // Make sure the SSIT still has a valid entry for the issued store. 2625086Sgblack@eecs.umich.edu if (!validSSIT[index]) { 2635133Sgblack@eecs.umich.edu return; 2645086Sgblack@eecs.umich.edu } 2655086Sgblack@eecs.umich.edu 2665704Snate@binkert.org store_SSID = SSIT[index]; 2675704Snate@binkert.org 2685086Sgblack@eecs.umich.edu assert(store_SSID < LFSTSize); 2695133Sgblack@eecs.umich.edu 2705086Sgblack@eecs.umich.edu // If the last fetched store in the store set refers to the store that 2715654Sgblack@eecs.umich.edu // was just issued, then invalidate the entry. 2725654Sgblack@eecs.umich.edu if (validLFST[store_SSID] && LFST[store_SSID] == issued_seq_num) { 2735654Sgblack@eecs.umich.edu DPRINTF(StoreSet, "StoreSet: store invalidated itself in LFST.\n"); 2745654Sgblack@eecs.umich.edu validLFST[store_SSID] = false; 2755654Sgblack@eecs.umich.edu } 2765704Snate@binkert.org} 2775704Snate@binkert.org 2785654Sgblack@eecs.umich.eduvoid 2795654Sgblack@eecs.umich.eduStoreSet::squash(InstSeqNum squashed_num, unsigned tid) 2805654Sgblack@eecs.umich.edu{ 2815654Sgblack@eecs.umich.edu DPRINTF(StoreSet, "StoreSet: Squashing until inum %i\n", 2825704Snate@binkert.org squashed_num); 2835704Snate@binkert.org 2845654Sgblack@eecs.umich.edu int idx; 2855654Sgblack@eecs.umich.edu SeqNumMapIt store_list_it = storeList.begin(); 2865654Sgblack@eecs.umich.edu 2875654Sgblack@eecs.umich.edu //@todo:Fix to only delete from correct thread 2885704Snate@binkert.org while (!storeList.empty()) { 2895704Snate@binkert.org idx = (*store_list_it).second; 2905654Sgblack@eecs.umich.edu 2915704Snate@binkert.org if ((*store_list_it).first <= squashed_num) { 2925654Sgblack@eecs.umich.edu break; 2935086Sgblack@eecs.umich.edu } 2945086Sgblack@eecs.umich.edu 2955704Snate@binkert.org bool younger = LFST[idx] > squashed_num; 2964120Sgblack@eecs.umich.edu 2974120Sgblack@eecs.umich.edu if (validLFST[idx] && younger) { 298 DPRINTF(StoreSet, "Squashed [sn:%lli]\n", LFST[idx]); 299 validLFST[idx] = false; 300 301 storeList.erase(store_list_it++); 302 } else if (!validLFST[idx] && younger) { 303 storeList.erase(store_list_it++); 304 } 305 } 306} 307 308void 309StoreSet::clear() 310{ 311 for (int i = 0; i < SSITSize; ++i) { 312 validSSIT[i] = false; 313 } 314 315 for (int i = 0; i < LFSTSize; ++i) { 316 validLFST[i] = false; 317 } 318 319 storeList.clear(); 320} 321