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 §ion) 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 §ion) 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 §ion) 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 §ion) 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