cpu.cc (12106:7784fac1b159) | cpu.cc (12109:f29e9c5418aa) |
---|---|
1/* | 1/* |
2 * Copyright (c) 2011-2012, 2014 ARM Limited | 2 * Copyright (c) 2011-2012, 2014, 2016 ARM Limited |
3 * Copyright (c) 2013 Advanced Micro Devices, Inc. 4 * All rights reserved 5 * 6 * The license below extends only to copyright in the software and shall 7 * not be construed as granting a license to any other intellectual 8 * property including but not limited to intellectual property relating 9 * to a hardware implementation of the functionality of the software 10 * licensed hereunder. You may use the software subject to the license --- 30 unchanged lines hidden (view full) --- 41 * 42 * Authors: Kevin Lim 43 * Korey Sewell 44 * Rick Strong 45 */ 46 47#include "cpu/o3/cpu.hh" 48 | 3 * Copyright (c) 2013 Advanced Micro Devices, Inc. 4 * All rights reserved 5 * 6 * The license below extends only to copyright in the software and shall 7 * not be construed as granting a license to any other intellectual 8 * property including but not limited to intellectual property relating 9 * to a hardware implementation of the functionality of the software 10 * licensed hereunder. You may use the software subject to the license --- 30 unchanged lines hidden (view full) --- 41 * 42 * Authors: Kevin Lim 43 * Korey Sewell 44 * Rick Strong 45 */ 46 47#include "cpu/o3/cpu.hh" 48 |
49#include "arch/generic/traits.hh" |
|
49#include "arch/kernel_stats.hh" 50#include "config/the_isa.hh" 51#include "cpu/activity.hh" 52#include "cpu/checker/cpu.hh" 53#include "cpu/checker/thread_context.hh" 54#include "cpu/o3/isa_specific.hh" 55#include "cpu/o3/thread_context.hh" 56#include "cpu/quiesce_event.hh" --- 109 unchanged lines hidden (view full) --- 166#endif 167 removeInstsThisCycle(false), 168 fetch(this, params), 169 decode(this, params), 170 rename(this, params), 171 iew(this, params), 172 commit(this, params), 173 | 50#include "arch/kernel_stats.hh" 51#include "config/the_isa.hh" 52#include "cpu/activity.hh" 53#include "cpu/checker/cpu.hh" 54#include "cpu/checker/thread_context.hh" 55#include "cpu/o3/isa_specific.hh" 56#include "cpu/o3/thread_context.hh" 57#include "cpu/quiesce_event.hh" --- 109 unchanged lines hidden (view full) --- 167#endif 168 removeInstsThisCycle(false), 169 fetch(this, params), 170 decode(this, params), 171 rename(this, params), 172 iew(this, params), 173 commit(this, params), 174 |
175 /* It is mandatory that all SMT threads use the same renaming mode as 176 * they are sharing registers and rename */ 177 vecMode(initRenameMode<TheISA::ISA>::mode(params->isa[0])), |
|
174 regFile(params->numPhysIntRegs, 175 params->numPhysFloatRegs, | 178 regFile(params->numPhysIntRegs, 179 params->numPhysFloatRegs, |
176 params->numPhysCCRegs), | 180 params->numPhysVecRegs, 181 params->numPhysCCRegs, 182 vecMode), |
177 178 freeList(name() + ".freelist", ®File), 179 180 rob(this, params), 181 182 scoreboard(name() + ".scoreboard", 183 regFile.totalNumPhysRegs()), 184 --- 80 unchanged lines hidden (view full) --- 265 "constant in your O3CPU impl. file (e.g. o3/alpha/impl.hh) " 266 "or edit your workload size."); 267 } 268 } 269 270 //Make Sure That this a Valid Architeture 271 assert(params->numPhysIntRegs >= numThreads * TheISA::NumIntRegs); 272 assert(params->numPhysFloatRegs >= numThreads * TheISA::NumFloatRegs); | 183 184 freeList(name() + ".freelist", ®File), 185 186 rob(this, params), 187 188 scoreboard(name() + ".scoreboard", 189 regFile.totalNumPhysRegs()), 190 --- 80 unchanged lines hidden (view full) --- 271 "constant in your O3CPU impl. file (e.g. o3/alpha/impl.hh) " 272 "or edit your workload size."); 273 } 274 } 275 276 //Make Sure That this a Valid Architeture 277 assert(params->numPhysIntRegs >= numThreads * TheISA::NumIntRegs); 278 assert(params->numPhysFloatRegs >= numThreads * TheISA::NumFloatRegs); |
279 assert(params->numPhysVecRegs >= numThreads * TheISA::NumVecRegs); |
|
273 assert(params->numPhysCCRegs >= numThreads * TheISA::NumCCRegs); 274 275 rename.setScoreboard(&scoreboard); 276 iew.setScoreboard(&scoreboard); 277 278 // Setup the rename map for whichever stages need it. 279 for (ThreadID tid = 0; tid < numThreads; tid++) { 280 isa[tid] = params->isa[tid]; | 280 assert(params->numPhysCCRegs >= numThreads * TheISA::NumCCRegs); 281 282 rename.setScoreboard(&scoreboard); 283 iew.setScoreboard(&scoreboard); 284 285 // Setup the rename map for whichever stages need it. 286 for (ThreadID tid = 0; tid < numThreads; tid++) { 287 isa[tid] = params->isa[tid]; |
288 assert(initRenameMode<TheISA::ISA>::equals(isa[tid], isa[0])); |
|
281 282 // Only Alpha has an FP zero register, so for other ISAs we 283 // use an invalid FP register index to avoid special treatment 284 // of any valid FP reg. 285 RegIndex invalidFPReg = TheISA::NumFloatRegs + 1; 286 RegIndex fpZeroReg = 287 (THE_ISA == ALPHA_ISA) ? TheISA::ZeroReg : invalidFPReg; 288 289 commitRenameMap[tid].init(®File, TheISA::ZeroReg, fpZeroReg, | 289 290 // Only Alpha has an FP zero register, so for other ISAs we 291 // use an invalid FP register index to avoid special treatment 292 // of any valid FP reg. 293 RegIndex invalidFPReg = TheISA::NumFloatRegs + 1; 294 RegIndex fpZeroReg = 295 (THE_ISA == ALPHA_ISA) ? TheISA::ZeroReg : invalidFPReg; 296 297 commitRenameMap[tid].init(®File, TheISA::ZeroReg, fpZeroReg, |
290 &freeList); | 298 &freeList, 299 vecMode); |
291 292 renameMap[tid].init(®File, TheISA::ZeroReg, fpZeroReg, | 300 301 renameMap[tid].init(®File, TheISA::ZeroReg, fpZeroReg, |
293 &freeList); | 302 &freeList, vecMode); |
294 } 295 296 // Initialize rename map to assign physical registers to the 297 // architectural registers for active threads only. 298 for (ThreadID tid = 0; tid < active_threads; tid++) { 299 for (RegIndex ridx = 0; ridx < TheISA::NumIntRegs; ++ridx) { 300 // Note that we can't use the rename() method because we don't 301 // want special treatment for the zero register at this point --- 4 unchanged lines hidden (view full) --- 306 307 for (RegIndex ridx = 0; ridx < TheISA::NumFloatRegs; ++ridx) { 308 PhysRegIdPtr phys_reg = freeList.getFloatReg(); 309 renameMap[tid].setEntry(RegId(FloatRegClass, ridx), phys_reg); 310 commitRenameMap[tid].setEntry( 311 RegId(FloatRegClass, ridx), phys_reg); 312 } 313 | 303 } 304 305 // Initialize rename map to assign physical registers to the 306 // architectural registers for active threads only. 307 for (ThreadID tid = 0; tid < active_threads; tid++) { 308 for (RegIndex ridx = 0; ridx < TheISA::NumIntRegs; ++ridx) { 309 // Note that we can't use the rename() method because we don't 310 // want special treatment for the zero register at this point --- 4 unchanged lines hidden (view full) --- 315 316 for (RegIndex ridx = 0; ridx < TheISA::NumFloatRegs; ++ridx) { 317 PhysRegIdPtr phys_reg = freeList.getFloatReg(); 318 renameMap[tid].setEntry(RegId(FloatRegClass, ridx), phys_reg); 319 commitRenameMap[tid].setEntry( 320 RegId(FloatRegClass, ridx), phys_reg); 321 } 322 |
323 /* Here we need two 'interfaces' the 'whole register' and the 324 * 'register element'. At any point only one of them will be 325 * active. */ 326 if (vecMode == Enums::Full) { 327 /* Initialize the full-vector interface */ 328 for (RegIndex ridx = 0; ridx < TheISA::NumVecRegs; ++ridx) { 329 RegId rid = RegId(VecRegClass, ridx); 330 PhysRegIdPtr phys_reg = freeList.getVecReg(); 331 renameMap[tid].setEntry(rid, phys_reg); 332 commitRenameMap[tid].setEntry(rid, phys_reg); 333 } 334 } else { 335 /* Initialize the vector-element interface */ 336 for (RegIndex ridx = 0; ridx < TheISA::NumVecRegs; ++ridx) { 337 for (ElemIndex ldx = 0; ldx < TheISA::NumVecElemPerVecReg; 338 ++ldx) { 339 RegId lrid = RegId(VecElemClass, ridx, ldx); 340 PhysRegIdPtr phys_elem = freeList.getVecElem(); 341 renameMap[tid].setEntry(lrid, phys_elem); 342 commitRenameMap[tid].setEntry(lrid, phys_elem); 343 } 344 } 345 } 346 |
|
314 for (RegIndex ridx = 0; ridx < TheISA::NumCCRegs; ++ridx) { 315 PhysRegIdPtr phys_reg = freeList.getCCReg(); 316 renameMap[tid].setEntry(RegId(CCRegClass, ridx), phys_reg); 317 commitRenameMap[tid].setEntry(RegId(CCRegClass, ridx), phys_reg); 318 } 319 } 320 321 rename.setRenameMap(renameMap); --- 187 unchanged lines hidden (view full) --- 509 .desc("number of floating regfile reads") 510 .prereq(fpRegfileReads); 511 512 fpRegfileWrites 513 .name(name() + ".fp_regfile_writes") 514 .desc("number of floating regfile writes") 515 .prereq(fpRegfileWrites); 516 | 347 for (RegIndex ridx = 0; ridx < TheISA::NumCCRegs; ++ridx) { 348 PhysRegIdPtr phys_reg = freeList.getCCReg(); 349 renameMap[tid].setEntry(RegId(CCRegClass, ridx), phys_reg); 350 commitRenameMap[tid].setEntry(RegId(CCRegClass, ridx), phys_reg); 351 } 352 } 353 354 rename.setRenameMap(renameMap); --- 187 unchanged lines hidden (view full) --- 542 .desc("number of floating regfile reads") 543 .prereq(fpRegfileReads); 544 545 fpRegfileWrites 546 .name(name() + ".fp_regfile_writes") 547 .desc("number of floating regfile writes") 548 .prereq(fpRegfileWrites); 549 |
550 vecRegfileReads 551 .name(name() + ".vec_regfile_reads") 552 .desc("number of vector regfile reads") 553 .prereq(vecRegfileReads); 554 555 vecRegfileWrites 556 .name(name() + ".vec_regfile_writes") 557 .desc("number of vector regfile writes") 558 .prereq(vecRegfileWrites); 559 |
|
517 ccRegfileReads 518 .name(name() + ".cc_regfile_reads") 519 .desc("number of cc regfile reads") 520 .prereq(ccRegfileReads); 521 522 ccRegfileWrites 523 .name(name() + ".cc_regfile_writes") 524 .desc("number of cc regfile writes") --- 727 unchanged lines hidden (view full) --- 1252FloatRegBits 1253FullO3CPU<Impl>::readFloatRegBits(PhysRegIdPtr phys_reg) 1254{ 1255 fpRegfileReads++; 1256 return regFile.readFloatRegBits(phys_reg); 1257} 1258 1259template <class Impl> | 560 ccRegfileReads 561 .name(name() + ".cc_regfile_reads") 562 .desc("number of cc regfile reads") 563 .prereq(ccRegfileReads); 564 565 ccRegfileWrites 566 .name(name() + ".cc_regfile_writes") 567 .desc("number of cc regfile writes") --- 727 unchanged lines hidden (view full) --- 1295FloatRegBits 1296FullO3CPU<Impl>::readFloatRegBits(PhysRegIdPtr phys_reg) 1297{ 1298 fpRegfileReads++; 1299 return regFile.readFloatRegBits(phys_reg); 1300} 1301 1302template <class Impl> |
1303auto 1304FullO3CPU<Impl>::readVecReg(PhysRegIdPtr phys_reg) const 1305 -> const VecRegContainer& 1306{ 1307 vecRegfileReads++; 1308 return regFile.readVecReg(phys_reg); 1309} 1310 1311template <class Impl> 1312auto 1313FullO3CPU<Impl>::getWritableVecReg(PhysRegIdPtr phys_reg) 1314 -> VecRegContainer& 1315{ 1316 vecRegfileWrites++; 1317 return regFile.getWritableVecReg(phys_reg); 1318} 1319 1320template <class Impl> 1321auto 1322FullO3CPU<Impl>::readVecElem(PhysRegIdPtr phys_reg) const -> const VecElem& 1323{ 1324 vecRegfileReads++; 1325 return regFile.readVecElem(phys_reg); 1326} 1327 1328template <class Impl> |
|
1260CCReg 1261FullO3CPU<Impl>::readCCReg(PhysRegIdPtr phys_reg) 1262{ 1263 ccRegfileReads++; 1264 return regFile.readCCReg(phys_reg); 1265} 1266 1267template <class Impl> --- 17 unchanged lines hidden (view full) --- 1285FullO3CPU<Impl>::setFloatRegBits(PhysRegIdPtr phys_reg, FloatRegBits val) 1286{ 1287 fpRegfileWrites++; 1288 regFile.setFloatRegBits(phys_reg, val); 1289} 1290 1291template <class Impl> 1292void | 1329CCReg 1330FullO3CPU<Impl>::readCCReg(PhysRegIdPtr phys_reg) 1331{ 1332 ccRegfileReads++; 1333 return regFile.readCCReg(phys_reg); 1334} 1335 1336template <class Impl> --- 17 unchanged lines hidden (view full) --- 1354FullO3CPU<Impl>::setFloatRegBits(PhysRegIdPtr phys_reg, FloatRegBits val) 1355{ 1356 fpRegfileWrites++; 1357 regFile.setFloatRegBits(phys_reg, val); 1358} 1359 1360template <class Impl> 1361void |
1362FullO3CPU<Impl>::setVecReg(PhysRegIdPtr phys_reg, const VecRegContainer& val) 1363{ 1364 vecRegfileWrites++; 1365 regFile.setVecReg(phys_reg, val); 1366} 1367 1368template <class Impl> 1369void 1370FullO3CPU<Impl>::setVecElem(PhysRegIdPtr phys_reg, const VecElem& val) 1371{ 1372 vecRegfileWrites++; 1373 regFile.setVecElem(phys_reg, val); 1374} 1375 1376template <class Impl> 1377void |
|
1293FullO3CPU<Impl>::setCCReg(PhysRegIdPtr phys_reg, CCReg val) 1294{ 1295 ccRegfileWrites++; 1296 regFile.setCCReg(phys_reg, val); 1297} 1298 1299template <class Impl> 1300uint64_t --- 24 unchanged lines hidden (view full) --- 1325 fpRegfileReads++; 1326 PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup( 1327 RegId(FloatRegClass, reg_idx)); 1328 1329 return regFile.readFloatRegBits(phys_reg); 1330} 1331 1332template <class Impl> | 1378FullO3CPU<Impl>::setCCReg(PhysRegIdPtr phys_reg, CCReg val) 1379{ 1380 ccRegfileWrites++; 1381 regFile.setCCReg(phys_reg, val); 1382} 1383 1384template <class Impl> 1385uint64_t --- 24 unchanged lines hidden (view full) --- 1410 fpRegfileReads++; 1411 PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup( 1412 RegId(FloatRegClass, reg_idx)); 1413 1414 return regFile.readFloatRegBits(phys_reg); 1415} 1416 1417template <class Impl> |
1418auto 1419FullO3CPU<Impl>::readArchVecReg(int reg_idx, ThreadID tid) const 1420 -> const VecRegContainer& 1421{ 1422 PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup( 1423 RegId(VecRegClass, reg_idx)); 1424 return readVecReg(phys_reg); 1425} 1426 1427template <class Impl> 1428auto 1429FullO3CPU<Impl>::getWritableArchVecReg(int reg_idx, ThreadID tid) 1430 -> VecRegContainer& 1431{ 1432 PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup( 1433 RegId(VecRegClass, reg_idx)); 1434 return getWritableVecReg(phys_reg); 1435} 1436 1437template <class Impl> 1438auto 1439FullO3CPU<Impl>::readArchVecElem(const RegIndex& reg_idx, const ElemIndex& ldx, 1440 ThreadID tid) const -> const VecElem& 1441{ 1442 PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup( 1443 RegId(VecRegClass, reg_idx, ldx)); 1444 return readVecElem(phys_reg); 1445} 1446 1447template <class Impl> |
|
1333CCReg 1334FullO3CPU<Impl>::readArchCCReg(int reg_idx, ThreadID tid) 1335{ 1336 ccRegfileReads++; 1337 PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup( 1338 RegId(CCRegClass, reg_idx)); 1339 1340 return regFile.readCCReg(phys_reg); --- 29 unchanged lines hidden (view full) --- 1370 PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup( 1371 RegId(FloatRegClass, reg_idx)); 1372 1373 regFile.setFloatRegBits(phys_reg, val); 1374} 1375 1376template <class Impl> 1377void | 1448CCReg 1449FullO3CPU<Impl>::readArchCCReg(int reg_idx, ThreadID tid) 1450{ 1451 ccRegfileReads++; 1452 PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup( 1453 RegId(CCRegClass, reg_idx)); 1454 1455 return regFile.readCCReg(phys_reg); --- 29 unchanged lines hidden (view full) --- 1485 PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup( 1486 RegId(FloatRegClass, reg_idx)); 1487 1488 regFile.setFloatRegBits(phys_reg, val); 1489} 1490 1491template <class Impl> 1492void |
1493FullO3CPU<Impl>::setArchVecReg(int reg_idx, const VecRegContainer& val, 1494 ThreadID tid) 1495{ 1496 PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup( 1497 RegId(VecRegClass, reg_idx)); 1498 setVecReg(phys_reg, val); 1499} 1500 1501template <class Impl> 1502void 1503FullO3CPU<Impl>::setArchVecElem(const RegIndex& reg_idx, const ElemIndex& ldx, 1504 const VecElem& val, ThreadID tid) 1505{ 1506 PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup( 1507 RegId(VecRegClass, reg_idx, ldx)); 1508 setVecElem(phys_reg, val); 1509} 1510 1511template <class Impl> 1512void |
|
1378FullO3CPU<Impl>::setArchCCReg(int reg_idx, CCReg val, ThreadID tid) 1379{ 1380 ccRegfileWrites++; 1381 PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup( 1382 RegId(CCRegClass, reg_idx)); 1383 1384 regFile.setCCReg(phys_reg, val); 1385} --- 307 unchanged lines hidden --- | 1513FullO3CPU<Impl>::setArchCCReg(int reg_idx, CCReg val, ThreadID tid) 1514{ 1515 ccRegfileWrites++; 1516 PhysRegIdPtr phys_reg = commitRenameMap[tid].lookup( 1517 RegId(CCRegClass, reg_idx)); 1518 1519 regFile.setCCReg(phys_reg, val); 1520} --- 307 unchanged lines hidden --- |