rename.hh revision 1689
111308Santhony.gutierrez@amd.com/*
212697Santhony.gutierrez@amd.com * Copyright (c) 2004-2005 The Regents of The University of Michigan
311308Santhony.gutierrez@amd.com * All rights reserved.
411308Santhony.gutierrez@amd.com *
511308Santhony.gutierrez@amd.com * Redistribution and use in source and binary forms, with or without
611308Santhony.gutierrez@amd.com * modification, are permitted provided that the following conditions are
711308Santhony.gutierrez@amd.com * met: redistributions of source code must retain the above copyright
811308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer;
911308Santhony.gutierrez@amd.com * redistributions in binary form must reproduce the above copyright
1011308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer in the
1111308Santhony.gutierrez@amd.com * documentation and/or other materials provided with the distribution;
1211308Santhony.gutierrez@amd.com * neither the name of the copyright holders nor the names of its
1311308Santhony.gutierrez@amd.com * contributors may be used to endorse or promote products derived from
1411308Santhony.gutierrez@amd.com * this software without specific prior written permission.
1511308Santhony.gutierrez@amd.com *
1611308Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1712697Santhony.gutierrez@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1812697Santhony.gutierrez@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1912697Santhony.gutierrez@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2011308Santhony.gutierrez@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2111308Santhony.gutierrez@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2211308Santhony.gutierrez@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2311308Santhony.gutierrez@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2411308Santhony.gutierrez@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2511308Santhony.gutierrez@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2611308Santhony.gutierrez@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2711308Santhony.gutierrez@amd.com */
2811308Santhony.gutierrez@amd.com
2911308Santhony.gutierrez@amd.com// Todo:
3011308Santhony.gutierrez@amd.com// Fix up trap and barrier handling.
3111308Santhony.gutierrez@amd.com// May want to have different statuses to differentiate the different stall
3211308Santhony.gutierrez@amd.com// conditions.
3312697Santhony.gutierrez@amd.com
3412697Santhony.gutierrez@amd.com#ifndef __CPU_BETA_CPU_SIMPLE_RENAME_HH__
3511308Santhony.gutierrez@amd.com#define __CPU_BETA_CPU_SIMPLE_RENAME_HH__
3611308Santhony.gutierrez@amd.com
3711308Santhony.gutierrez@amd.com#include <list>
3811308Santhony.gutierrez@amd.com
3911308Santhony.gutierrez@amd.com#include "base/statistics.hh"
4011308Santhony.gutierrez@amd.com#include "base/timebuf.hh"
4112334Sgabeblack@google.com
4211308Santhony.gutierrez@amd.com// Will need rename maps for both the int reg file and fp reg file.
4311308Santhony.gutierrez@amd.com// Or change rename map class to handle both. (RegFile handles both.)
4411308Santhony.gutierrez@amd.comtemplate<class Impl>
4511308Santhony.gutierrez@amd.comclass SimpleRename
4611308Santhony.gutierrez@amd.com{
4711308Santhony.gutierrez@amd.com  public:
4811308Santhony.gutierrez@amd.com    // Typedefs from the Impl.
4911308Santhony.gutierrez@amd.com    typedef typename Impl::ISA ISA;
5011308Santhony.gutierrez@amd.com    typedef typename Impl::CPUPol CPUPol;
5111308Santhony.gutierrez@amd.com    typedef typename Impl::DynInstPtr DynInstPtr;
5211308Santhony.gutierrez@amd.com    typedef typename Impl::FullCPU FullCPU;
5311308Santhony.gutierrez@amd.com    typedef typename Impl::Params Params;
5411308Santhony.gutierrez@amd.com
5511308Santhony.gutierrez@amd.com    typedef typename CPUPol::FetchStruct FetchStruct;
5611308Santhony.gutierrez@amd.com    typedef typename CPUPol::DecodeStruct DecodeStruct;
5711308Santhony.gutierrez@amd.com    typedef typename CPUPol::RenameStruct RenameStruct;
5811308Santhony.gutierrez@amd.com    typedef typename CPUPol::TimeStruct TimeStruct;
5911308Santhony.gutierrez@amd.com
6011308Santhony.gutierrez@amd.com    // Typedefs from the CPUPol
6111308Santhony.gutierrez@amd.com    typedef typename CPUPol::FreeList FreeList;
6211308Santhony.gutierrez@amd.com    typedef typename CPUPol::RenameMap RenameMap;
6311308Santhony.gutierrez@amd.com
6411308Santhony.gutierrez@amd.com    // Typedefs from the ISA.
6511308Santhony.gutierrez@amd.com    typedef typename ISA::Addr Addr;
6611534Sjohn.kalamatianos@amd.com
6711308Santhony.gutierrez@amd.com  public:
6811308Santhony.gutierrez@amd.com    // Rename will block if ROB becomes full or issue queue becomes full,
6911308Santhony.gutierrez@amd.com    // or there are no free registers to rename to.
7011308Santhony.gutierrez@amd.com    // Only case where rename squashes is if IEW squashes.
7111308Santhony.gutierrez@amd.com    enum Status {
7211308Santhony.gutierrez@amd.com        Running,
7311308Santhony.gutierrez@amd.com        Idle,
7411308Santhony.gutierrez@amd.com        Squashing,
7511308Santhony.gutierrez@amd.com        Blocked,
7611308Santhony.gutierrez@amd.com        Unblocking,
7711308Santhony.gutierrez@amd.com        BarrierStall
7811308Santhony.gutierrez@amd.com    };
7911308Santhony.gutierrez@amd.com
8011308Santhony.gutierrez@amd.com  private:
8111308Santhony.gutierrez@amd.com    Status _status;
8211308Santhony.gutierrez@amd.com
8311308Santhony.gutierrez@amd.com  public:
8411308Santhony.gutierrez@amd.com    SimpleRename(Params &params);
8511308Santhony.gutierrez@amd.com
8611308Santhony.gutierrez@amd.com    void regStats();
8711308Santhony.gutierrez@amd.com
8811308Santhony.gutierrez@amd.com    void setCPU(FullCPU *cpu_ptr);
8911308Santhony.gutierrez@amd.com
9011308Santhony.gutierrez@amd.com    void setTimeBuffer(TimeBuffer<TimeStruct> *tb_ptr);
9111308Santhony.gutierrez@amd.com
9211308Santhony.gutierrez@amd.com    void setRenameQueue(TimeBuffer<RenameStruct> *rq_ptr);
9311308Santhony.gutierrez@amd.com
9411308Santhony.gutierrez@amd.com    void setDecodeQueue(TimeBuffer<DecodeStruct> *dq_ptr);
9511308Santhony.gutierrez@amd.com
9611308Santhony.gutierrez@amd.com    void setRenameMap(RenameMap *rm_ptr);
9711308Santhony.gutierrez@amd.com
9811308Santhony.gutierrez@amd.com    void setFreeList(FreeList *fl_ptr);
9911308Santhony.gutierrez@amd.com
10011308Santhony.gutierrez@amd.com    void dumpHistory();
10111308Santhony.gutierrez@amd.com
10211308Santhony.gutierrez@amd.com    void tick();
10311308Santhony.gutierrez@amd.com
10411308Santhony.gutierrez@amd.com    void rename();
10511308Santhony.gutierrez@amd.com
10611308Santhony.gutierrez@amd.com    void squash();
10711308Santhony.gutierrez@amd.com
10811308Santhony.gutierrez@amd.com  private:
10911308Santhony.gutierrez@amd.com    void block();
11011308Santhony.gutierrez@amd.com
11111308Santhony.gutierrez@amd.com    inline void unblock();
11211308Santhony.gutierrez@amd.com
11311308Santhony.gutierrez@amd.com    void doSquash();
11411308Santhony.gutierrez@amd.com
11511308Santhony.gutierrez@amd.com    void removeFromHistory(InstSeqNum inst_seq_num);
11611308Santhony.gutierrez@amd.com
11711308Santhony.gutierrez@amd.com    inline void renameSrcRegs(DynInstPtr &inst);
11811308Santhony.gutierrez@amd.com
11911308Santhony.gutierrez@amd.com    inline void renameDestRegs(DynInstPtr &inst);
12011308Santhony.gutierrez@amd.com
12111308Santhony.gutierrez@amd.com    inline int calcFreeROBEntries();
12211308Santhony.gutierrez@amd.com
12311308Santhony.gutierrez@amd.com    inline int calcFreeIQEntries();
12411308Santhony.gutierrez@amd.com
12511699Santhony.gutierrez@amd.com    /** Holds the previous information for each rename.
12611308Santhony.gutierrez@amd.com     *  Note that often times the inst may have been deleted, so only access
12711308Santhony.gutierrez@amd.com     *  the pointer for the address and do not dereference it.
12811308Santhony.gutierrez@amd.com     */
12911308Santhony.gutierrez@amd.com    struct RenameHistory {
13011308Santhony.gutierrez@amd.com        RenameHistory(InstSeqNum _instSeqNum, RegIndex _archReg,
13111308Santhony.gutierrez@amd.com                      PhysRegIndex _newPhysReg, PhysRegIndex _prevPhysReg)
13211308Santhony.gutierrez@amd.com            : instSeqNum(_instSeqNum), archReg(_archReg),
13311308Santhony.gutierrez@amd.com              newPhysReg(_newPhysReg), prevPhysReg(_prevPhysReg),
13411308Santhony.gutierrez@amd.com              placeHolder(false)
13511308Santhony.gutierrez@amd.com        {
13611308Santhony.gutierrez@amd.com        }
13711308Santhony.gutierrez@amd.com
13811308Santhony.gutierrez@amd.com        /** Constructor used specifically for cases where a place holder
13911308Santhony.gutierrez@amd.com         *  rename history entry is being made.
14011308Santhony.gutierrez@amd.com         */
14111308Santhony.gutierrez@amd.com        RenameHistory(InstSeqNum _instSeqNum)
14211308Santhony.gutierrez@amd.com            : instSeqNum(_instSeqNum), archReg(0), newPhysReg(0),
14311308Santhony.gutierrez@amd.com              prevPhysReg(0), placeHolder(true)
14411308Santhony.gutierrez@amd.com        {
14511308Santhony.gutierrez@amd.com        }
14611308Santhony.gutierrez@amd.com
14711308Santhony.gutierrez@amd.com        InstSeqNum instSeqNum;
14811308Santhony.gutierrez@amd.com        RegIndex archReg;
14911308Santhony.gutierrez@amd.com        PhysRegIndex newPhysReg;
15011308Santhony.gutierrez@amd.com        PhysRegIndex prevPhysReg;
15111308Santhony.gutierrez@amd.com        bool placeHolder;
15211308Santhony.gutierrez@amd.com    };
15311308Santhony.gutierrez@amd.com
15411308Santhony.gutierrez@amd.com    std::list<RenameHistory> historyBuffer;
15511308Santhony.gutierrez@amd.com
15611692Santhony.gutierrez@amd.com    /** CPU interface. */
15711692Santhony.gutierrez@amd.com    FullCPU *cpu;
15811308Santhony.gutierrez@amd.com
15911308Santhony.gutierrez@amd.com    // Interfaces to objects outside of rename.
16011308Santhony.gutierrez@amd.com    /** Time buffer interface. */
16111308Santhony.gutierrez@amd.com    TimeBuffer<TimeStruct> *timeBuffer;
16211308Santhony.gutierrez@amd.com
16311308Santhony.gutierrez@amd.com    /** Wire to get IEW's output from backwards time buffer. */
16411699Santhony.gutierrez@amd.com    typename TimeBuffer<TimeStruct>::wire fromIEW;
16511308Santhony.gutierrez@amd.com
16611308Santhony.gutierrez@amd.com    /** Wire to get commit's output from backwards time buffer. */
16711308Santhony.gutierrez@amd.com    typename TimeBuffer<TimeStruct>::wire fromCommit;
16811308Santhony.gutierrez@amd.com
16911308Santhony.gutierrez@amd.com    /** Wire to write infromation heading to previous stages. */
17011308Santhony.gutierrez@amd.com    // Might not be the best name as not only decode will read it.
17111308Santhony.gutierrez@amd.com    typename TimeBuffer<TimeStruct>::wire toDecode;
17211308Santhony.gutierrez@amd.com
17311308Santhony.gutierrez@amd.com    /** Rename instruction queue. */
17411308Santhony.gutierrez@amd.com    TimeBuffer<RenameStruct> *renameQueue;
17511308Santhony.gutierrez@amd.com
17611308Santhony.gutierrez@amd.com    /** Wire to write any information heading to IEW. */
17711308Santhony.gutierrez@amd.com    typename TimeBuffer<RenameStruct>::wire toIEW;
17811308Santhony.gutierrez@amd.com
17911308Santhony.gutierrez@amd.com    /** Decode instruction queue interface. */
18011308Santhony.gutierrez@amd.com    TimeBuffer<DecodeStruct> *decodeQueue;
18111308Santhony.gutierrez@amd.com
18211308Santhony.gutierrez@amd.com    /** Wire to get decode's output from decode queue. */
18311308Santhony.gutierrez@amd.com    typename TimeBuffer<DecodeStruct>::wire fromDecode;
18411308Santhony.gutierrez@amd.com
18511308Santhony.gutierrez@amd.com    /** Skid buffer between rename and decode. */
18611308Santhony.gutierrez@amd.com    std::queue<DecodeStruct> skidBuffer;
18711308Santhony.gutierrez@amd.com
18811308Santhony.gutierrez@amd.com    /** Rename map interface. */
18911308Santhony.gutierrez@amd.com    SimpleRenameMap *renameMap;
19011308Santhony.gutierrez@amd.com
19111308Santhony.gutierrez@amd.com    /** Free list interface. */
19211308Santhony.gutierrez@amd.com    FreeList *freeList;
19311308Santhony.gutierrez@amd.com
19411308Santhony.gutierrez@amd.com    /** Delay between iew and rename, in ticks. */
19511308Santhony.gutierrez@amd.com    int iewToRenameDelay;
19611308Santhony.gutierrez@amd.com
19711308Santhony.gutierrez@amd.com    /** Delay between decode and rename, in ticks. */
19811308Santhony.gutierrez@amd.com    int decodeToRenameDelay;
19911308Santhony.gutierrez@amd.com
20011308Santhony.gutierrez@amd.com    /** Delay between commit and rename, in ticks. */
20111308Santhony.gutierrez@amd.com    unsigned commitToRenameDelay;
20211308Santhony.gutierrez@amd.com
20311308Santhony.gutierrez@amd.com    /** Rename width, in instructions. */
20411308Santhony.gutierrez@amd.com    unsigned renameWidth;
20511308Santhony.gutierrez@amd.com
20611308Santhony.gutierrez@amd.com    /** Commit width, in instructions.  Used so rename knows how many
20711308Santhony.gutierrez@amd.com     *  instructions might have freed registers in the previous cycle.
20811308Santhony.gutierrez@amd.com     */
20911308Santhony.gutierrez@amd.com    unsigned commitWidth;
21011308Santhony.gutierrez@amd.com
21111308Santhony.gutierrez@amd.com    /** The instruction that rename is currently on.  It needs to have
21211308Santhony.gutierrez@amd.com     *  persistent state so that when a stall occurs in the middle of a
21311308Santhony.gutierrez@amd.com     *  group of instructions, it can restart at the proper instruction.
21411308Santhony.gutierrez@amd.com     */
21511308Santhony.gutierrez@amd.com    unsigned numInst;
21611308Santhony.gutierrez@amd.com
21711308Santhony.gutierrez@amd.com    Stats::Scalar<> renameSquashCycles;
21811308Santhony.gutierrez@amd.com    Stats::Scalar<> renameIdleCycles;
21911308Santhony.gutierrez@amd.com    Stats::Scalar<> renameBlockCycles;
22011699Santhony.gutierrez@amd.com    Stats::Scalar<> renameUnblockCycles;
22111308Santhony.gutierrez@amd.com    Stats::Scalar<> renameRenamedInsts;
22211308Santhony.gutierrez@amd.com    Stats::Scalar<> renameSquashedInsts;
22311308Santhony.gutierrez@amd.com    Stats::Scalar<> renameROBFullEvents;
22411308Santhony.gutierrez@amd.com    Stats::Scalar<> renameIQFullEvents;
22511308Santhony.gutierrez@amd.com    Stats::Scalar<> renameFullRegistersEvents;
22611308Santhony.gutierrez@amd.com    Stats::Scalar<> renameRenamedOperands;
22711308Santhony.gutierrez@amd.com    Stats::Scalar<> renameRenameLookups;
22811308Santhony.gutierrez@amd.com    Stats::Scalar<> renameHBPlaceHolders;
22911308Santhony.gutierrez@amd.com    Stats::Scalar<> renameCommittedMaps;
23011308Santhony.gutierrez@amd.com    Stats::Scalar<> renameUndoneMaps;
23111308Santhony.gutierrez@amd.com    Stats::Scalar<> renameValidUndoneMaps;
23211308Santhony.gutierrez@amd.com};
23311308Santhony.gutierrez@amd.com
23411308Santhony.gutierrez@amd.com#endif // __CPU_BETA_CPU_SIMPLE_RENAME_HH__
23511308Santhony.gutierrez@amd.com