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