rename_map.cc revision 12105:742d80361989
11689SN/A/* 210329Smitch.hayenga@arm.com * Copyright (c) 2004-2005 The Regents of The University of Michigan 37849SAli.Saidi@ARM.com * Copyright (c) 2013 Advanced Micro Devices, Inc. 47849SAli.Saidi@ARM.com * All rights reserved. 57849SAli.Saidi@ARM.com * 67849SAli.Saidi@ARM.com * Redistribution and use in source and binary forms, with or without 77849SAli.Saidi@ARM.com * modification, are permitted provided that the following conditions are 87849SAli.Saidi@ARM.com * met: redistributions of source code must retain the above copyright 97849SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer; 107849SAli.Saidi@ARM.com * redistributions in binary form must reproduce the above copyright 117849SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer in the 127849SAli.Saidi@ARM.com * documentation and/or other materials provided with the distribution; 137849SAli.Saidi@ARM.com * neither the name of the copyright holders nor the names of its 142329SN/A * contributors may be used to endorse or promote products derived from 151689SN/A * this software without specific prior written permission. 161689SN/A * 171689SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 181689SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 191689SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 201689SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 211689SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 221689SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 231689SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 241689SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 251689SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 261689SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 271689SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 281689SN/A * 291689SN/A * Authors: Kevin Lim 301689SN/A */ 311689SN/A 321689SN/A#include "cpu/o3/rename_map.hh" 331689SN/A 341689SN/A#include <vector> 351689SN/A 361689SN/A#include "debug/Rename.hh" 371689SN/A 381689SN/Ausing namespace std; 392665Ssaidi@eecs.umich.edu 402665Ssaidi@eecs.umich.edu/**** SimpleRenameMap methods ****/ 412756Sksewell@umich.edu 421689SN/ASimpleRenameMap::SimpleRenameMap() 431689SN/A : freeList(NULL), zeroReg(0) 442292SN/A{ 452292SN/A} 461060SN/A 479020Sgblack@eecs.umich.edu 482669Sktlim@umich.eduvoid 491461SN/ASimpleRenameMap::init(unsigned size, SimpleFreeList *_freeList, 506658Snate@binkert.org RegIndex _zeroReg) 511060SN/A{ 529480Snilay@cs.wisc.edu assert(freeList == NULL); 538229Snate@binkert.org assert(map.empty()); 547849SAli.Saidi@ARM.com 5513559Snikos.nikoleris@arm.com map.resize(size); 563348Sbinkertn@umich.edu freeList = _freeList; 572669Sktlim@umich.edu zeroReg = _zeroReg; 581461SN/A} 5910023Smatt.horsnell@ARM.com 601060SN/ASimpleRenameMap::RenameInfo 618737Skoansin.tan@gmail.comSimpleRenameMap::rename(RegIndex arch_reg) 625529Snate@binkert.org{ 631060SN/A PhysRegIdPtr renamed_reg; 642329SN/A 652329SN/A // Record the current physical register that is renamed to the 662329SN/A // requested architected register. 672329SN/A PhysRegIdPtr prev_reg = map[arch_reg]; 682348SN/A 692329SN/A // If it's not referencing the zero register, then rename the 701060SN/A // register. 711060SN/A if (arch_reg != zeroReg) { 722292SN/A renamed_reg = freeList->getReg(); 731060SN/A 741060SN/A map[arch_reg] = renamed_reg; 751060SN/A } else { 761061SN/A // Otherwise return the zero register so nothing bad happens. 771060SN/A assert(prev_reg->isZeroReg()); 781061SN/A renamed_reg = prev_reg; 792733Sktlim@umich.edu } 801060SN/A 812292SN/A DPRINTF(Rename, "Renamed reg %d to physical reg %d (%d) old mapping was" 821061SN/A " %d (%d)\n", 831061SN/A arch_reg, renamed_reg->regIdx, renamed_reg->flatIdx, 841060SN/A prev_reg->regIdx, prev_reg->flatIdx); 851060SN/A 862107SN/A return RenameInfo(renamed_reg, prev_reg); 872632Sstever@eecs.umich.edu} 887849SAli.Saidi@ARM.com 897849SAli.Saidi@ARM.com 907849SAli.Saidi@ARM.com/**** UnifiedRenameMap methods ****/ 917849SAli.Saidi@ARM.com 927849SAli.Saidi@ARM.comvoid 937849SAli.Saidi@ARM.comUnifiedRenameMap::init(PhysRegFile *_regFile, 947849SAli.Saidi@ARM.com RegIndex _intZeroReg, 957849SAli.Saidi@ARM.com RegIndex _floatZeroReg, 967849SAli.Saidi@ARM.com UnifiedFreeList *freeList) 977849SAli.Saidi@ARM.com{ 987849SAli.Saidi@ARM.com regFile = _regFile; 997944SGiacomo.Gabrielli@arm.com 1007944SGiacomo.Gabrielli@arm.com intMap.init(TheISA::NumIntRegs, &(freeList->intList), _intZeroReg); 1017944SGiacomo.Gabrielli@arm.com 1027944SGiacomo.Gabrielli@arm.com floatMap.init(TheISA::NumFloatRegs, &(freeList->floatList), _floatZeroReg); 10312749Sgiacomo.travaglini@arm.com 1047849SAli.Saidi@ARM.com ccMap.init(TheISA::NumCCRegs, &(freeList->ccList), (RegIndex)-1); 1057849SAli.Saidi@ARM.com 1067849SAli.Saidi@ARM.com} 1077849SAli.Saidi@ARM.com 1087849SAli.Saidi@ARM.com 1097849SAli.Saidi@ARM.comUnifiedRenameMap::RenameInfo 1107849SAli.Saidi@ARM.comUnifiedRenameMap::rename(RegId arch_reg) 1112935Sksewell@umich.edu{ 1128462Sgeoffrey.blake@arm.com switch (arch_reg.regClass) { 1138462Sgeoffrey.blake@arm.com case IntRegClass: 1148462Sgeoffrey.blake@arm.com return renameInt(arch_reg.regIdx); 1158462Sgeoffrey.blake@arm.com 1168462Sgeoffrey.blake@arm.com case FloatRegClass: 1178462Sgeoffrey.blake@arm.com return renameFloat(arch_reg.regIdx); 1188462Sgeoffrey.blake@arm.com 1198462Sgeoffrey.blake@arm.com case CCRegClass: 1208462Sgeoffrey.blake@arm.com return renameCC(arch_reg.regIdx); 1218462Sgeoffrey.blake@arm.com 1228462Sgeoffrey.blake@arm.com case MiscRegClass: 1238462Sgeoffrey.blake@arm.com return renameMisc(arch_reg.regIdx); 1248462Sgeoffrey.blake@arm.com 12513453Srekai.gonzalezalberquilla@arm.com default: 1268462Sgeoffrey.blake@arm.com panic("rename rename(): unknown reg class %s\n", 1278462Sgeoffrey.blake@arm.com RegClassStrings[arch_reg.regClass]); 1288462Sgeoffrey.blake@arm.com } 1298462Sgeoffrey.blake@arm.com} 1308462Sgeoffrey.blake@arm.com 1318462Sgeoffrey.blake@arm.com 1328462Sgeoffrey.blake@arm.comPhysRegIdPtr 13312749Sgiacomo.travaglini@arm.comUnifiedRenameMap::lookup(RegId arch_reg) const 1348462Sgeoffrey.blake@arm.com{ 1358462Sgeoffrey.blake@arm.com switch (arch_reg.regClass) { 1368462Sgeoffrey.blake@arm.com case IntRegClass: 1378462Sgeoffrey.blake@arm.com return lookupInt(arch_reg.regIdx); 1388462Sgeoffrey.blake@arm.com 1398462Sgeoffrey.blake@arm.com case FloatRegClass: 1408462Sgeoffrey.blake@arm.com return lookupFloat(arch_reg.regIdx); 1418462Sgeoffrey.blake@arm.com 1428462Sgeoffrey.blake@arm.com case CCRegClass: 1438462Sgeoffrey.blake@arm.com return lookupCC(arch_reg.regIdx); 1448462Sgeoffrey.blake@arm.com 1458462Sgeoffrey.blake@arm.com case MiscRegClass: 1468462Sgeoffrey.blake@arm.com return lookupMisc(arch_reg.regIdx); 1478462Sgeoffrey.blake@arm.com 1488462Sgeoffrey.blake@arm.com default: 1498462Sgeoffrey.blake@arm.com panic("rename lookup(): unknown reg class %s\n", 1508462Sgeoffrey.blake@arm.com RegClassStrings[arch_reg.regClass]); 1511060SN/A } 1522329SN/A} 1532329SN/A 1542292SN/Avoid 1552292SN/AUnifiedRenameMap::setEntry(RegId arch_reg, PhysRegIdPtr phys_reg) 1562292SN/A{ 1572292SN/A switch (arch_reg.regClass) { 1582292SN/A case IntRegClass: 1592292SN/A return setIntEntry(arch_reg.regIdx, phys_reg); 1602292SN/A 1612292SN/A case FloatRegClass: 1621060SN/A return setFloatEntry(arch_reg.regIdx, phys_reg); 1631060SN/A 1641060SN/A case CCRegClass: 1651060SN/A return setCCEntry(arch_reg.regIdx, phys_reg); 1662292SN/A 1672292SN/A case MiscRegClass: 1682292SN/A // Misc registers do not actually rename, so don't change 1697849SAli.Saidi@ARM.com // their mappings. We end up here when a commit or squash 1702669Sktlim@umich.edu // tries to update or undo a hardwired misc reg nmapping, 1712696Sktlim@umich.edu // which should always be setting it to what it already is. 1728460SAli.Saidi@ARM.com assert(phys_reg == lookupMisc(arch_reg.regIdx)); 1738460SAli.Saidi@ARM.com return; 1741060SN/A 1751060SN/A default: 1762292SN/A panic("rename setEntry(): unknown reg class %s\n", 1772292SN/A RegClassStrings[arch_reg.regClass]); 1782292SN/A } 1792292SN/A} 1802292SN/A