1/* 2 * Copyright (c) 2005-2006 The Regents of The University of Michigan
|
3 * Copyright (c) 2013 Advanced Micro Devices, Inc. |
4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer; 10 * redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution; 13 * neither the name of the copyright holders nor the names of its 14 * contributors may be used to endorse or promote products derived from 15 * this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * 29 * Authors: Korey Sewell 30 * Kevin Lim 31 */ 32 33#include "config/the_isa.hh" 34#include "cpu/o3/scoreboard.hh" 35#include "debug/Scoreboard.hh" 36
|
36Scoreboard::Scoreboard(unsigned activeThreads,
37 unsigned _numLogicalIntRegs,
38 unsigned _numPhysicalIntRegs,
39 unsigned _numLogicalFloatRegs,
40 unsigned _numPhysicalFloatRegs,
41 unsigned _numMiscRegs,
42 unsigned _zeroRegIdx)
43 : numLogicalIntRegs(_numLogicalIntRegs),
44 numPhysicalIntRegs(_numPhysicalIntRegs),
45 numLogicalFloatRegs(_numLogicalFloatRegs),
46 numPhysicalFloatRegs(_numPhysicalFloatRegs),
47 numMiscRegs(_numMiscRegs),
48 zeroRegIdx(_zeroRegIdx)
|
37Scoreboard::Scoreboard(const std::string &_my_name, 38 unsigned _numPhysicalRegs, unsigned _numMiscRegs, 39 PhysRegIndex _zeroRegIdx, PhysRegIndex _fpZeroRegIdx) 40 : _name(_my_name), 41 regScoreBoard(_numPhysicalRegs, true), 42 numPhysRegs(_numPhysicalRegs), 43 numTotalRegs(_numPhysicalRegs + _numMiscRegs), 44 zeroRegIdx(_zeroRegIdx), fpZeroRegIdx(_fpZeroRegIdx) |
45{
|
50 //Get Register Sizes
51 numLogicalRegs = numLogicalIntRegs + numLogicalFloatRegs;
52 numPhysicalRegs = numPhysicalIntRegs + numPhysicalFloatRegs;
53
54 //Resize scoreboard appropriately
55 resize(numPhysicalRegs + (numMiscRegs * activeThreads));
56
57 //Initialize values
58 for (int i=0; i < numLogicalIntRegs * activeThreads; i++) {
59 assert(indexInBounds(i));
60 regScoreBoard[i] = 1;
61 }
62
63 for (int i= numPhysicalIntRegs;
64 i < numPhysicalIntRegs + (numLogicalFloatRegs * activeThreads);
65 i++) {
66 assert(indexInBounds(i));
67 regScoreBoard[i] = 1;
68 }
69
70 for (int i = numPhysicalRegs;
71 i < numPhysicalRegs + (numMiscRegs * activeThreads);
72 i++) {
73 assert(indexInBounds(i));
74 regScoreBoard[i] = 1;
75 }
|
46}
|
77
78std::string
79Scoreboard::name() const
80{
81 return "cpu.scoreboard";
82}
83
84bool
85Scoreboard::getReg(PhysRegIndex phys_reg)
86{
87#if THE_ISA == ALPHA_ISA
88 // Always ready if int or fp zero reg.
89 if (phys_reg == zeroRegIdx ||
90 phys_reg == (zeroRegIdx + numPhysicalIntRegs)) {
91 return 1;
92 }
93#else
94 // Always ready if int zero reg.
95 if (phys_reg == zeroRegIdx) {
96 return 1;
97 }
98#endif
99
100 assert(indexInBounds(phys_reg));
101 return regScoreBoard[phys_reg];
102}
103
104void
105Scoreboard::setReg(PhysRegIndex phys_reg)
106{
107 DPRINTF(Scoreboard, "Setting reg %i as ready\n", phys_reg);
108
109 assert(indexInBounds(phys_reg));
110 regScoreBoard[phys_reg] = 1;
111}
112
113void
114Scoreboard::unsetReg(PhysRegIndex ready_reg)
115{
116#if THE_ISA == ALPHA_ISA
117 if (ready_reg == zeroRegIdx ||
118 ready_reg == (zeroRegIdx + numPhysicalIntRegs)) {
119 // Don't do anything if int or fp zero reg.
120 return;
121 }
122#else
123 if (ready_reg == zeroRegIdx) {
124 // Don't do anything if int zero reg.
125 return;
126 }
127#endif
128
129 assert(indexInBounds(ready_reg));
130 regScoreBoard[ready_reg] = 0;
131}
|
|