lsq_unit_impl.hh (10031:79d034cd6ba3) lsq_unit_impl.hh (10149:45a67d84fd4a)
1
2/*
3 * Copyright (c) 2010-2013 ARM Limited
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

--- 450 unchanged lines hidden (view full) ---

459 }
460
461 // If this is the only load in the LSQ we don't care
462 if (load_idx == loadTail)
463 return;
464
465 incrLdIdx(load_idx);
466
1
2/*
3 * Copyright (c) 2010-2013 ARM Limited
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

--- 450 unchanged lines hidden (view full) ---

459 }
460
461 // If this is the only load in the LSQ we don't care
462 if (load_idx == loadTail)
463 return;
464
465 incrLdIdx(load_idx);
466
467 bool force_squash = false;
468
467 while (load_idx != loadTail) {
468 DynInstPtr ld_inst = loadQueue[load_idx];
469
470 if (!ld_inst->effAddrValid() || ld_inst->uncacheable()) {
471 incrLdIdx(load_idx);
472 continue;
473 }
474
475 Addr load_addr = ld_inst->physEffAddr & cacheBlockMask;
476 DPRINTF(LSQUnit, "-- inst [sn:%lli] load_addr: %#x to pktAddr:%#x\n",
477 ld_inst->seqNum, load_addr, invalidate_addr);
478
469 while (load_idx != loadTail) {
470 DynInstPtr ld_inst = loadQueue[load_idx];
471
472 if (!ld_inst->effAddrValid() || ld_inst->uncacheable()) {
473 incrLdIdx(load_idx);
474 continue;
475 }
476
477 Addr load_addr = ld_inst->physEffAddr & cacheBlockMask;
478 DPRINTF(LSQUnit, "-- inst [sn:%lli] load_addr: %#x to pktAddr:%#x\n",
479 ld_inst->seqNum, load_addr, invalidate_addr);
480
479 if (load_addr == invalidate_addr) {
480 if (ld_inst->possibleLoadViolation()) {
481 if (load_addr == invalidate_addr || force_squash) {
482 if (needsTSO) {
483 // If we have a TSO system, as all loads must be ordered with
484 // all other loads, this load as well as *all* subsequent loads
485 // need to be squashed to prevent possible load reordering.
486 force_squash = true;
487 }
488 if (ld_inst->possibleLoadViolation() || force_squash) {
481 DPRINTF(LSQUnit, "Conflicting load at addr %#x [sn:%lli]\n",
482 pkt->getAddr(), ld_inst->seqNum);
483
484 // Mark the load for re-execution
485 ld_inst->fault = new ReExec;
486 } else {
487 DPRINTF(LSQUnit, "HitExternal Snoop for addr %#x [sn:%lli]\n",
488 pkt->getAddr(), ld_inst->seqNum);

--- 835 unchanged lines hidden ---
489 DPRINTF(LSQUnit, "Conflicting load at addr %#x [sn:%lli]\n",
490 pkt->getAddr(), ld_inst->seqNum);
491
492 // Mark the load for re-execution
493 ld_inst->fault = new ReExec;
494 } else {
495 DPRINTF(LSQUnit, "HitExternal Snoop for addr %#x [sn:%lli]\n",
496 pkt->getAddr(), ld_inst->seqNum);

--- 835 unchanged lines hidden ---