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