types.hh revision 8229
17720Sgblack@eecs.umich.edu/*
27720Sgblack@eecs.umich.edu * Copyright (c) 2010 Gabe Black
37720Sgblack@eecs.umich.edu * All rights reserved.
47720Sgblack@eecs.umich.edu *
57720Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
67720Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
77720Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
87720Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
97720Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
107720Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
117720Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
127720Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
137720Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
147720Sgblack@eecs.umich.edu * this software without specific prior written permission.
157720Sgblack@eecs.umich.edu *
167720Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
177720Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
187720Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
197720Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
207720Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
217720Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
227720Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
237720Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
247720Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
257720Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
267720Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
277720Sgblack@eecs.umich.edu *
287720Sgblack@eecs.umich.edu * Authors: Gabe Black
297720Sgblack@eecs.umich.edu */
307720Sgblack@eecs.umich.edu
317720Sgblack@eecs.umich.edu#ifndef __ARCH_GENERIC_TYPES_HH__
327720Sgblack@eecs.umich.edu#define __ARCH_GENERIC_TYPES_HH__
337720Sgblack@eecs.umich.edu
347720Sgblack@eecs.umich.edu#include <iostream>
357720Sgblack@eecs.umich.edu
368229Snate@binkert.org#include "base/trace.hh"
377720Sgblack@eecs.umich.edu#include "base/types.hh"
387720Sgblack@eecs.umich.edu#include "sim/serialize.hh"
397720Sgblack@eecs.umich.edu
407720Sgblack@eecs.umich.edunamespace GenericISA
417720Sgblack@eecs.umich.edu{
427720Sgblack@eecs.umich.edu
437720Sgblack@eecs.umich.edu// The guaranteed interface.
447720Sgblack@eecs.umich.educlass PCStateBase
457720Sgblack@eecs.umich.edu{
467720Sgblack@eecs.umich.edu  protected:
477720Sgblack@eecs.umich.edu    Addr _pc;
487720Sgblack@eecs.umich.edu    Addr _npc;
497720Sgblack@eecs.umich.edu
507720Sgblack@eecs.umich.edu    PCStateBase() {}
517720Sgblack@eecs.umich.edu    PCStateBase(Addr val) { set(val); }
527720Sgblack@eecs.umich.edu
537720Sgblack@eecs.umich.edu  public:
547720Sgblack@eecs.umich.edu    /**
557720Sgblack@eecs.umich.edu     * Returns the memory address the bytes of this instruction came from.
567720Sgblack@eecs.umich.edu     *
577720Sgblack@eecs.umich.edu     * @return Memory address of the current instruction's encoding.
587720Sgblack@eecs.umich.edu     */
597720Sgblack@eecs.umich.edu    Addr
607720Sgblack@eecs.umich.edu    instAddr() const
617720Sgblack@eecs.umich.edu    {
627720Sgblack@eecs.umich.edu        return _pc;
637720Sgblack@eecs.umich.edu    }
647720Sgblack@eecs.umich.edu
657720Sgblack@eecs.umich.edu    /**
667720Sgblack@eecs.umich.edu     * Returns the memory address the bytes of the next instruction came from.
677720Sgblack@eecs.umich.edu     *
687720Sgblack@eecs.umich.edu     * @return Memory address of the next instruction's encoding.
697720Sgblack@eecs.umich.edu     */
707720Sgblack@eecs.umich.edu    Addr
717720Sgblack@eecs.umich.edu    nextInstAddr() const
727720Sgblack@eecs.umich.edu    {
737720Sgblack@eecs.umich.edu        return _npc;
747720Sgblack@eecs.umich.edu    }
757720Sgblack@eecs.umich.edu
767720Sgblack@eecs.umich.edu    /**
777720Sgblack@eecs.umich.edu     * Returns the current micropc.
787720Sgblack@eecs.umich.edu     *
797720Sgblack@eecs.umich.edu     * @return The current micropc.
807720Sgblack@eecs.umich.edu     */
817720Sgblack@eecs.umich.edu    MicroPC
827720Sgblack@eecs.umich.edu    microPC() const
837720Sgblack@eecs.umich.edu    {
847720Sgblack@eecs.umich.edu        return 0;
857720Sgblack@eecs.umich.edu    }
867720Sgblack@eecs.umich.edu
877720Sgblack@eecs.umich.edu    /**
887720Sgblack@eecs.umich.edu     * Force this PC to reflect a particular value, resetting all its other
897720Sgblack@eecs.umich.edu     * fields around it. This is useful for in place (re)initialization.
907720Sgblack@eecs.umich.edu     *
917720Sgblack@eecs.umich.edu     * @param val The value to set the PC to.
927720Sgblack@eecs.umich.edu     */
937720Sgblack@eecs.umich.edu    void set(Addr val);
947720Sgblack@eecs.umich.edu
957720Sgblack@eecs.umich.edu    bool
967720Sgblack@eecs.umich.edu    operator == (const PCStateBase &opc) const
977720Sgblack@eecs.umich.edu    {
987720Sgblack@eecs.umich.edu        return _pc == opc._pc && _npc == opc._npc;
997720Sgblack@eecs.umich.edu    }
1007720Sgblack@eecs.umich.edu
1017720Sgblack@eecs.umich.edu    void
1027720Sgblack@eecs.umich.edu    serialize(std::ostream &os)
1037720Sgblack@eecs.umich.edu    {
1047720Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(_pc);
1057720Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(_npc);
1067720Sgblack@eecs.umich.edu    }
1077720Sgblack@eecs.umich.edu
1087720Sgblack@eecs.umich.edu    void
1097720Sgblack@eecs.umich.edu    unserialize(Checkpoint *cp, const std::string &section)
1107720Sgblack@eecs.umich.edu    {
1117720Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(_pc);
1127720Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(_npc);
1137720Sgblack@eecs.umich.edu    }
1147720Sgblack@eecs.umich.edu};
1157720Sgblack@eecs.umich.edu
1167720Sgblack@eecs.umich.edu
1177720Sgblack@eecs.umich.edu/*
1187720Sgblack@eecs.umich.edu * Different flavors of PC state. Only ISA specific code should rely on
1197720Sgblack@eecs.umich.edu * any particular type of PC state being available. All other code should
1207720Sgblack@eecs.umich.edu * use the interface above.
1217720Sgblack@eecs.umich.edu */
1227720Sgblack@eecs.umich.edu
1237720Sgblack@eecs.umich.edu// The most basic type of PC.
1247720Sgblack@eecs.umich.edutemplate <class MachInst>
1257720Sgblack@eecs.umich.educlass SimplePCState : public PCStateBase
1267720Sgblack@eecs.umich.edu{
1277720Sgblack@eecs.umich.edu  protected:
1287720Sgblack@eecs.umich.edu    typedef PCStateBase Base;
1297720Sgblack@eecs.umich.edu
1307720Sgblack@eecs.umich.edu  public:
1317720Sgblack@eecs.umich.edu
1327720Sgblack@eecs.umich.edu    Addr pc() const { return _pc; }
1337720Sgblack@eecs.umich.edu    void pc(Addr val) { _pc = val; }
1347720Sgblack@eecs.umich.edu
1357720Sgblack@eecs.umich.edu    Addr npc() const { return _npc; }
1367720Sgblack@eecs.umich.edu    void npc(Addr val) { _npc = val; }
1377720Sgblack@eecs.umich.edu
1387720Sgblack@eecs.umich.edu    void
1397720Sgblack@eecs.umich.edu    set(Addr val)
1407720Sgblack@eecs.umich.edu    {
1417720Sgblack@eecs.umich.edu        pc(val);
1427720Sgblack@eecs.umich.edu        npc(val + sizeof(MachInst));
1437720Sgblack@eecs.umich.edu    };
1447720Sgblack@eecs.umich.edu
1457720Sgblack@eecs.umich.edu    SimplePCState() {}
1467720Sgblack@eecs.umich.edu    SimplePCState(Addr val) { set(val); }
1477720Sgblack@eecs.umich.edu
1487720Sgblack@eecs.umich.edu    bool
1497720Sgblack@eecs.umich.edu    branching() const
1507720Sgblack@eecs.umich.edu    {
1517720Sgblack@eecs.umich.edu        return this->npc() != this->pc() + sizeof(MachInst);
1527720Sgblack@eecs.umich.edu    }
1537720Sgblack@eecs.umich.edu
1547720Sgblack@eecs.umich.edu    // Advance the PC.
1557720Sgblack@eecs.umich.edu    void
1567720Sgblack@eecs.umich.edu    advance()
1577720Sgblack@eecs.umich.edu    {
1587720Sgblack@eecs.umich.edu        _pc = _npc;
1597720Sgblack@eecs.umich.edu        _npc += sizeof(MachInst);
1607720Sgblack@eecs.umich.edu    }
1617720Sgblack@eecs.umich.edu};
1627720Sgblack@eecs.umich.edu
1637720Sgblack@eecs.umich.edutemplate <class MachInst>
1647720Sgblack@eecs.umich.edustd::ostream &
1657720Sgblack@eecs.umich.eduoperator<<(std::ostream & os, const SimplePCState<MachInst> &pc)
1667720Sgblack@eecs.umich.edu{
1677720Sgblack@eecs.umich.edu    ccprintf(os, "(%#x=>%#x)", pc.pc(), pc.npc());
1687720Sgblack@eecs.umich.edu    return os;
1697720Sgblack@eecs.umich.edu}
1707720Sgblack@eecs.umich.edu
1717720Sgblack@eecs.umich.edu// A PC and microcode PC.
1727720Sgblack@eecs.umich.edutemplate <class MachInst>
1737720Sgblack@eecs.umich.educlass UPCState : public SimplePCState<MachInst>
1747720Sgblack@eecs.umich.edu{
1757720Sgblack@eecs.umich.edu  protected:
1767720Sgblack@eecs.umich.edu    typedef SimplePCState<MachInst> Base;
1777720Sgblack@eecs.umich.edu
1787720Sgblack@eecs.umich.edu    MicroPC _upc;
1797720Sgblack@eecs.umich.edu    MicroPC _nupc;
1807720Sgblack@eecs.umich.edu
1817720Sgblack@eecs.umich.edu  public:
1827720Sgblack@eecs.umich.edu
1837720Sgblack@eecs.umich.edu    MicroPC upc() const { return _upc; }
1847720Sgblack@eecs.umich.edu    void upc(MicroPC val) { _upc = val; }
1857720Sgblack@eecs.umich.edu
1867720Sgblack@eecs.umich.edu    MicroPC nupc() const { return _nupc; }
1877720Sgblack@eecs.umich.edu    void nupc(MicroPC val) { _nupc = val; }
1887720Sgblack@eecs.umich.edu
1897720Sgblack@eecs.umich.edu    MicroPC
1907720Sgblack@eecs.umich.edu    microPC() const
1917720Sgblack@eecs.umich.edu    {
1927720Sgblack@eecs.umich.edu        return _upc;
1937720Sgblack@eecs.umich.edu    }
1947720Sgblack@eecs.umich.edu
1957720Sgblack@eecs.umich.edu    void
1967720Sgblack@eecs.umich.edu    set(Addr val)
1977720Sgblack@eecs.umich.edu    {
1987720Sgblack@eecs.umich.edu        Base::set(val);
1997720Sgblack@eecs.umich.edu        upc(0);
2007720Sgblack@eecs.umich.edu        nupc(1);
2017720Sgblack@eecs.umich.edu    }
2027720Sgblack@eecs.umich.edu
2037720Sgblack@eecs.umich.edu    UPCState() {}
2047720Sgblack@eecs.umich.edu    UPCState(Addr val) { set(val); }
2057720Sgblack@eecs.umich.edu
2067720Sgblack@eecs.umich.edu    bool
2077720Sgblack@eecs.umich.edu    branching() const
2087720Sgblack@eecs.umich.edu    {
2097720Sgblack@eecs.umich.edu        return this->npc() != this->pc() + sizeof(MachInst) ||
2107720Sgblack@eecs.umich.edu               this->nupc() != this->upc() + 1;
2117720Sgblack@eecs.umich.edu    }
2127720Sgblack@eecs.umich.edu
2137720Sgblack@eecs.umich.edu    // Advance the upc within the instruction.
2147720Sgblack@eecs.umich.edu    void
2157720Sgblack@eecs.umich.edu    uAdvance()
2167720Sgblack@eecs.umich.edu    {
2177720Sgblack@eecs.umich.edu        _upc = _nupc;
2187720Sgblack@eecs.umich.edu        _nupc++;
2197720Sgblack@eecs.umich.edu    }
2207720Sgblack@eecs.umich.edu
2217720Sgblack@eecs.umich.edu    // End the macroop by resetting the upc and advancing the regular pc.
2227720Sgblack@eecs.umich.edu    void
2237720Sgblack@eecs.umich.edu    uEnd()
2247720Sgblack@eecs.umich.edu    {
2257720Sgblack@eecs.umich.edu        this->advance();
2267720Sgblack@eecs.umich.edu        _upc = 0;
2277720Sgblack@eecs.umich.edu        _nupc = 1;
2287720Sgblack@eecs.umich.edu    }
2297720Sgblack@eecs.umich.edu
2307720Sgblack@eecs.umich.edu    bool
2317720Sgblack@eecs.umich.edu    operator == (const UPCState<MachInst> &opc) const
2327720Sgblack@eecs.umich.edu    {
2337720Sgblack@eecs.umich.edu        return Base::_pc == opc._pc &&
2347720Sgblack@eecs.umich.edu               Base::_npc == opc._npc &&
2357720Sgblack@eecs.umich.edu               _upc == opc._upc && _nupc == opc._nupc;
2367720Sgblack@eecs.umich.edu    }
2377720Sgblack@eecs.umich.edu
2387720Sgblack@eecs.umich.edu    void
2397720Sgblack@eecs.umich.edu    serialize(std::ostream &os)
2407720Sgblack@eecs.umich.edu    {
2417720Sgblack@eecs.umich.edu        Base::serialize(os);
2427720Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(_upc);
2437720Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(_nupc);
2447720Sgblack@eecs.umich.edu    }
2457720Sgblack@eecs.umich.edu
2467720Sgblack@eecs.umich.edu    void
2477720Sgblack@eecs.umich.edu    unserialize(Checkpoint *cp, const std::string &section)
2487720Sgblack@eecs.umich.edu    {
2497720Sgblack@eecs.umich.edu        Base::unserialize(cp, section);
2507720Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(_upc);
2517720Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(_nupc);
2527720Sgblack@eecs.umich.edu    }
2537720Sgblack@eecs.umich.edu};
2547720Sgblack@eecs.umich.edu
2557720Sgblack@eecs.umich.edutemplate <class MachInst>
2567720Sgblack@eecs.umich.edustd::ostream &
2577720Sgblack@eecs.umich.eduoperator<<(std::ostream & os, const UPCState<MachInst> &pc)
2587720Sgblack@eecs.umich.edu{
2597720Sgblack@eecs.umich.edu    ccprintf(os, "(%#x=>%#x).(%d=>%d)",
2607720Sgblack@eecs.umich.edu            pc.pc(), pc.npc(), pc.upc(), pc.npc());
2617720Sgblack@eecs.umich.edu    return os;
2627720Sgblack@eecs.umich.edu}
2637720Sgblack@eecs.umich.edu
2647720Sgblack@eecs.umich.edu// A PC with a delay slot.
2657720Sgblack@eecs.umich.edutemplate <class MachInst>
2667720Sgblack@eecs.umich.educlass DelaySlotPCState : public SimplePCState<MachInst>
2677720Sgblack@eecs.umich.edu{
2687720Sgblack@eecs.umich.edu  protected:
2697720Sgblack@eecs.umich.edu    typedef SimplePCState<MachInst> Base;
2707720Sgblack@eecs.umich.edu
2717720Sgblack@eecs.umich.edu    Addr _nnpc;
2727720Sgblack@eecs.umich.edu
2737720Sgblack@eecs.umich.edu  public:
2747720Sgblack@eecs.umich.edu
2757720Sgblack@eecs.umich.edu    Addr nnpc() const { return _nnpc; }
2767720Sgblack@eecs.umich.edu    void nnpc(Addr val) { _nnpc = val; }
2777720Sgblack@eecs.umich.edu
2787720Sgblack@eecs.umich.edu    void
2797720Sgblack@eecs.umich.edu    set(Addr val)
2807720Sgblack@eecs.umich.edu    {
2817720Sgblack@eecs.umich.edu        Base::set(val);
2827720Sgblack@eecs.umich.edu        nnpc(val + 2 * sizeof(MachInst));
2837720Sgblack@eecs.umich.edu    }
2847720Sgblack@eecs.umich.edu
2857720Sgblack@eecs.umich.edu    DelaySlotPCState() {}
2867720Sgblack@eecs.umich.edu    DelaySlotPCState(Addr val) { set(val); }
2877720Sgblack@eecs.umich.edu
2887720Sgblack@eecs.umich.edu    bool
2897720Sgblack@eecs.umich.edu    branching() const
2907720Sgblack@eecs.umich.edu    {
2917720Sgblack@eecs.umich.edu        return !(this->nnpc() == this->npc() + sizeof(MachInst) &&
2927720Sgblack@eecs.umich.edu                 (this->npc() == this->pc() + sizeof(MachInst) ||
2937720Sgblack@eecs.umich.edu                  this->npc() == this->pc() + 2 * sizeof(MachInst)));
2947720Sgblack@eecs.umich.edu    }
2957720Sgblack@eecs.umich.edu
2967720Sgblack@eecs.umich.edu    // Advance the PC.
2977720Sgblack@eecs.umich.edu    void
2987720Sgblack@eecs.umich.edu    advance()
2997720Sgblack@eecs.umich.edu    {
3007720Sgblack@eecs.umich.edu        Base::_pc = Base::_npc;
3017720Sgblack@eecs.umich.edu        Base::_npc = _nnpc;
3027720Sgblack@eecs.umich.edu        _nnpc += sizeof(MachInst);
3037720Sgblack@eecs.umich.edu    }
3047720Sgblack@eecs.umich.edu
3057720Sgblack@eecs.umich.edu    bool
3067720Sgblack@eecs.umich.edu    operator == (const DelaySlotPCState<MachInst> &opc) const
3077720Sgblack@eecs.umich.edu    {
3087720Sgblack@eecs.umich.edu        return Base::_pc == opc._pc &&
3097720Sgblack@eecs.umich.edu               Base::_npc == opc._npc &&
3107720Sgblack@eecs.umich.edu               _nnpc == opc._nnpc;
3117720Sgblack@eecs.umich.edu    }
3127720Sgblack@eecs.umich.edu
3137720Sgblack@eecs.umich.edu    void
3147720Sgblack@eecs.umich.edu    serialize(std::ostream &os)
3157720Sgblack@eecs.umich.edu    {
3167720Sgblack@eecs.umich.edu        Base::serialize(os);
3177720Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(_nnpc);
3187720Sgblack@eecs.umich.edu    }
3197720Sgblack@eecs.umich.edu
3207720Sgblack@eecs.umich.edu    void
3217720Sgblack@eecs.umich.edu    unserialize(Checkpoint *cp, const std::string &section)
3227720Sgblack@eecs.umich.edu    {
3237720Sgblack@eecs.umich.edu        Base::unserialize(cp, section);
3247720Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(_nnpc);
3257720Sgblack@eecs.umich.edu    }
3267720Sgblack@eecs.umich.edu};
3277720Sgblack@eecs.umich.edu
3287720Sgblack@eecs.umich.edutemplate <class MachInst>
3297720Sgblack@eecs.umich.edustd::ostream &
3307720Sgblack@eecs.umich.eduoperator<<(std::ostream & os, const DelaySlotPCState<MachInst> &pc)
3317720Sgblack@eecs.umich.edu{
3327720Sgblack@eecs.umich.edu    ccprintf(os, "(%#x=>%#x=>%#x)",
3337720Sgblack@eecs.umich.edu            pc.pc(), pc.npc(), pc.nnpc());
3347720Sgblack@eecs.umich.edu    return os;
3357720Sgblack@eecs.umich.edu}
3367720Sgblack@eecs.umich.edu
3377720Sgblack@eecs.umich.edu// A PC with a delay slot and a microcode PC.
3387720Sgblack@eecs.umich.edutemplate <class MachInst>
3397720Sgblack@eecs.umich.educlass DelaySlotUPCState : public DelaySlotPCState<MachInst>
3407720Sgblack@eecs.umich.edu{
3417720Sgblack@eecs.umich.edu  protected:
3427720Sgblack@eecs.umich.edu    typedef DelaySlotPCState<MachInst> Base;
3437720Sgblack@eecs.umich.edu
3447720Sgblack@eecs.umich.edu    MicroPC _upc;
3457720Sgblack@eecs.umich.edu    MicroPC _nupc;
3467720Sgblack@eecs.umich.edu
3477720Sgblack@eecs.umich.edu  public:
3487720Sgblack@eecs.umich.edu
3497720Sgblack@eecs.umich.edu    MicroPC upc() const { return _upc; }
3507720Sgblack@eecs.umich.edu    void upc(MicroPC val) { _upc = val; }
3517720Sgblack@eecs.umich.edu
3527720Sgblack@eecs.umich.edu    MicroPC nupc() const { return _nupc; }
3537720Sgblack@eecs.umich.edu    void nupc(MicroPC val) { _nupc = val; }
3547720Sgblack@eecs.umich.edu
3557720Sgblack@eecs.umich.edu    MicroPC
3567720Sgblack@eecs.umich.edu    microPC() const
3577720Sgblack@eecs.umich.edu    {
3587720Sgblack@eecs.umich.edu        return _upc;
3597720Sgblack@eecs.umich.edu    }
3607720Sgblack@eecs.umich.edu
3617720Sgblack@eecs.umich.edu    void
3627720Sgblack@eecs.umich.edu    set(Addr val)
3637720Sgblack@eecs.umich.edu    {
3647720Sgblack@eecs.umich.edu        Base::set(val);
3657720Sgblack@eecs.umich.edu        upc(0);
3667720Sgblack@eecs.umich.edu        nupc(1);
3677720Sgblack@eecs.umich.edu    }
3687720Sgblack@eecs.umich.edu
3697720Sgblack@eecs.umich.edu    DelaySlotUPCState() {}
3707720Sgblack@eecs.umich.edu    DelaySlotUPCState(Addr val) { set(val); }
3717720Sgblack@eecs.umich.edu
3727720Sgblack@eecs.umich.edu    bool
3737720Sgblack@eecs.umich.edu    branching() const
3747720Sgblack@eecs.umich.edu    {
3757720Sgblack@eecs.umich.edu        return Base::branching() || this->nupc() != this->upc() + 1;
3767720Sgblack@eecs.umich.edu    }
3777720Sgblack@eecs.umich.edu
3787720Sgblack@eecs.umich.edu    // Advance the upc within the instruction.
3797720Sgblack@eecs.umich.edu    void
3807720Sgblack@eecs.umich.edu    uAdvance()
3817720Sgblack@eecs.umich.edu    {
3827720Sgblack@eecs.umich.edu        _upc = _nupc;
3837720Sgblack@eecs.umich.edu        _nupc++;
3847720Sgblack@eecs.umich.edu    }
3857720Sgblack@eecs.umich.edu
3867720Sgblack@eecs.umich.edu    // End the macroop by resetting the upc and advancing the regular pc.
3877720Sgblack@eecs.umich.edu    void
3887720Sgblack@eecs.umich.edu    uEnd()
3897720Sgblack@eecs.umich.edu    {
3907720Sgblack@eecs.umich.edu        this->advance();
3917720Sgblack@eecs.umich.edu        _upc = 0;
3927720Sgblack@eecs.umich.edu        _nupc = 1;
3937720Sgblack@eecs.umich.edu    }
3947720Sgblack@eecs.umich.edu
3957720Sgblack@eecs.umich.edu    bool
3967720Sgblack@eecs.umich.edu    operator == (const DelaySlotUPCState<MachInst> &opc) const
3977720Sgblack@eecs.umich.edu    {
3987720Sgblack@eecs.umich.edu        return Base::_pc == opc._pc &&
3997720Sgblack@eecs.umich.edu               Base::_npc == opc._npc &&
4007720Sgblack@eecs.umich.edu               Base::_nnpc == opc._nnpc &&
4017720Sgblack@eecs.umich.edu               _upc == opc._upc && _nupc == opc._nupc;
4027720Sgblack@eecs.umich.edu    }
4037720Sgblack@eecs.umich.edu
4047720Sgblack@eecs.umich.edu    void
4057720Sgblack@eecs.umich.edu    serialize(std::ostream &os)
4067720Sgblack@eecs.umich.edu    {
4077720Sgblack@eecs.umich.edu        Base::serialize(os);
4087720Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(_upc);
4097720Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(_nupc);
4107720Sgblack@eecs.umich.edu    }
4117720Sgblack@eecs.umich.edu
4127720Sgblack@eecs.umich.edu    void
4137720Sgblack@eecs.umich.edu    unserialize(Checkpoint *cp, const std::string &section)
4147720Sgblack@eecs.umich.edu    {
4157720Sgblack@eecs.umich.edu        Base::unserialize(cp, section);
4167720Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(_upc);
4177720Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(_nupc);
4187720Sgblack@eecs.umich.edu    }
4197720Sgblack@eecs.umich.edu};
4207720Sgblack@eecs.umich.edu
4217720Sgblack@eecs.umich.edutemplate <class MachInst>
4227720Sgblack@eecs.umich.edustd::ostream &
4237720Sgblack@eecs.umich.eduoperator<<(std::ostream & os, const DelaySlotUPCState<MachInst> &pc)
4247720Sgblack@eecs.umich.edu{
4257720Sgblack@eecs.umich.edu    ccprintf(os, "(%#x=>%#x=>%#x).(%d=>%d)",
4267720Sgblack@eecs.umich.edu            pc.pc(), pc.npc(), pc.nnpc(), pc.upc(), pc.nupc());
4277720Sgblack@eecs.umich.edu    return os;
4287720Sgblack@eecs.umich.edu}
4297720Sgblack@eecs.umich.edu
4307720Sgblack@eecs.umich.edu}
4317720Sgblack@eecs.umich.edu
4327720Sgblack@eecs.umich.edu#endif
433