fetch_impl.hh (2906:3d65b80fdb11) | fetch_impl.hh (2935:d1223a6c9156) |
---|---|
1/* 2 * Copyright (c) 2004-2006 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 151 unchanged lines hidden (view full) --- 160 161 memReq[tid] = NULL; 162 163 // Create space to store a cache line. 164 cacheData[tid] = new uint8_t[cacheBlkSize]; 165 cacheDataPC[tid] = 0; 166 cacheDataValid[tid] = false; 167 | 1/* 2 * Copyright (c) 2004-2006 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 151 unchanged lines hidden (view full) --- 160 161 memReq[tid] = NULL; 162 163 // Create space to store a cache line. 164 cacheData[tid] = new uint8_t[cacheBlkSize]; 165 cacheDataPC[tid] = 0; 166 cacheDataValid[tid] = false; 167 |
168 stalls[tid].decode = 0; 169 stalls[tid].rename = 0; 170 stalls[tid].iew = 0; 171 stalls[tid].commit = 0; | 168 delaySlotInfo[tid].branchSeqNum = -1; 169 delaySlotInfo[tid].numInsts = 0; 170 delaySlotInfo[tid].targetAddr = 0; 171 delaySlotInfo[tid].targetReady = false; 172 173 stalls[tid].decode = false; 174 stalls[tid].rename = false; 175 stalls[tid].iew = false; 176 stalls[tid].commit = false; |
172 } 173 174 // Get the size of an instruction. 175 instSize = sizeof(MachInst); 176} 177 178template <class Impl> 179std::string --- 103 unchanged lines hidden (view full) --- 283 icachePort = new IcachePort(this); 284 285#if USE_CHECKER 286 if (cpu->checker) { 287 cpu->checker->setIcachePort(icachePort); 288 } 289#endif 290 | 177 } 178 179 // Get the size of an instruction. 180 instSize = sizeof(MachInst); 181} 182 183template <class Impl> 184std::string --- 103 unchanged lines hidden (view full) --- 288 icachePort = new IcachePort(this); 289 290#if USE_CHECKER 291 if (cpu->checker) { 292 cpu->checker->setIcachePort(icachePort); 293 } 294#endif 295 |
296 // Schedule fetch to get the correct PC from the CPU 297 // scheduleFetchStartupEvent(1); 298 |
|
291 // Fetch needs to start fetching instructions at the very beginning, 292 // so it must start up in active state. 293 switchToActive(); 294} 295 296template<class Impl> 297void 298DefaultFetch<Impl>::setTimeBuffer(TimeBuffer<TimeStruct> *time_buffer) --- 122 unchanged lines hidden (view full) --- 421 stalls[i].decode = 0; 422 stalls[i].rename = 0; 423 stalls[i].iew = 0; 424 stalls[i].commit = 0; 425 PC[i] = cpu->readPC(i); 426 nextPC[i] = cpu->readNextPC(i); 427#if THE_ISA != ALPHA_ISA 428 nextNPC[i] = cpu->readNextNPC(i); | 299 // Fetch needs to start fetching instructions at the very beginning, 300 // so it must start up in active state. 301 switchToActive(); 302} 303 304template<class Impl> 305void 306DefaultFetch<Impl>::setTimeBuffer(TimeBuffer<TimeStruct> *time_buffer) --- 122 unchanged lines hidden (view full) --- 429 stalls[i].decode = 0; 430 stalls[i].rename = 0; 431 stalls[i].iew = 0; 432 stalls[i].commit = 0; 433 PC[i] = cpu->readPC(i); 434 nextPC[i] = cpu->readNextPC(i); 435#if THE_ISA != ALPHA_ISA 436 nextNPC[i] = cpu->readNextNPC(i); |
437 delaySlotInfo[i].branchSeqNum = -1; 438 delaySlotInfo[i].numInsts = 0; 439 delaySlotInfo[i].targetAddr = 0; 440 delaySlotInfo[i].targetReady = false; |
|
429#endif 430 fetchStatus[i] = Running; 431 } 432 numInst = 0; 433 wroteToTimeBuffer = false; 434 _status = Inactive; 435 switchedOut = false; 436 branchPred.takeOverFrom(); --- 32 unchanged lines hidden (view full) --- 469 cpu->deactivateStage(O3CPU::FetchIdx); 470 471 _status = Inactive; 472 } 473} 474 475template <class Impl> 476bool | 441#endif 442 fetchStatus[i] = Running; 443 } 444 numInst = 0; 445 wroteToTimeBuffer = false; 446 _status = Inactive; 447 switchedOut = false; 448 branchPred.takeOverFrom(); --- 32 unchanged lines hidden (view full) --- 481 cpu->deactivateStage(O3CPU::FetchIdx); 482 483 _status = Inactive; 484 } 485} 486 487template <class Impl> 488bool |
477DefaultFetch<Impl>::lookupAndUpdateNextPC(DynInstPtr &inst, Addr &next_PC) | 489DefaultFetch<Impl>::lookupAndUpdateNextPC(DynInstPtr &inst, Addr &next_PC, 490 Addr &next_NPC) |
478{ 479 // Do branch prediction check here. 480 // A bit of a misnomer...next_PC is actually the current PC until 481 // this function updates it. 482 bool predict_taken; 483 484 if (!inst->isControl()) { | 491{ 492 // Do branch prediction check here. 493 // A bit of a misnomer...next_PC is actually the current PC until 494 // this function updates it. 495 bool predict_taken; 496 497 if (!inst->isControl()) { |
498#if THE_ISA == ALPHA_ISA |
|
485 next_PC = next_PC + instSize; 486 inst->setPredTarg(next_PC); | 499 next_PC = next_PC + instSize; 500 inst->setPredTarg(next_PC); |
501#else 502 Addr cur_PC = next_PC; 503 next_PC = cur_PC + instSize; //next_NPC; 504 next_NPC = cur_PC + (2 * instSize);//next_NPC + instSize; 505 inst->setPredTarg(next_NPC); 506#endif |
|
487 return false; 488 } 489 | 507 return false; 508 } 509 |
490 predict_taken = branchPred.predict(inst, next_PC, inst->threadNumber); | 510 int tid = inst->threadNumber; 511#if THE_ISA == ALPHA_ISA 512 predict_taken = branchPred.predict(inst, next_PC, tid); 513#else 514 Addr pred_PC = next_PC; 515 predict_taken = branchPred.predict(inst, pred_PC, tid); |
491 | 516 |
517 if (predict_taken) { 518 DPRINTF(Fetch, "[tid:%i]: Branch predicted to be true.\n", tid); 519 } else { 520 DPRINTF(Fetch, "[tid:%i]: Branch predicted to be false.\n", tid); 521 } 522 523 if (predict_taken) { 524 next_PC = next_NPC; 525 next_NPC = pred_PC; 526 527 // Update delay slot info 528 ++delaySlotInfo[tid].numInsts; 529 delaySlotInfo[tid].targetAddr = pred_PC; 530 DPRINTF(Fetch, "[tid:%i]: %i delay slot inst(s) to process.\n", tid, 531 delaySlotInfo[tid].numInsts); 532 } else { // !predict_taken 533 if (inst->isCondDelaySlot()) { 534 next_PC = pred_PC; 535 // The delay slot is skipped here if there is on 536 // prediction 537 } else { 538 next_PC = next_NPC; 539 // No need to declare a delay slot here since 540 // there is no for the pred. target to jump 541 } 542 543 next_NPC = next_NPC + instSize; 544 } 545#endif 546 |
|
492 ++fetchedBranches; 493 494 if (predict_taken) { 495 ++predictedBranches; 496 } 497 498 return predict_taken; 499} --- 101 unchanged lines hidden (view full) --- 601inline void 602DefaultFetch<Impl>::doSquash(const Addr &new_PC, unsigned tid) 603{ 604 DPRINTF(Fetch, "[tid:%i]: Squashing, setting PC to: %#x.\n", 605 tid, new_PC); 606 607 PC[tid] = new_PC; 608 nextPC[tid] = new_PC + instSize; | 547 ++fetchedBranches; 548 549 if (predict_taken) { 550 ++predictedBranches; 551 } 552 553 return predict_taken; 554} --- 101 unchanged lines hidden (view full) --- 656inline void 657DefaultFetch<Impl>::doSquash(const Addr &new_PC, unsigned tid) 658{ 659 DPRINTF(Fetch, "[tid:%i]: Squashing, setting PC to: %#x.\n", 660 tid, new_PC); 661 662 PC[tid] = new_PC; 663 nextPC[tid] = new_PC + instSize; |
664 nextNPC[tid] = new_PC + (2 * instSize); |
|
609 610 // Clear the icache miss if it's outstanding. 611 if (fetchStatus[tid] == IcacheWaitResponse) { 612 DPRINTF(Fetch, "[tid:%i]: Squashing outstanding Icache miss.\n", 613 tid); 614 memReq[tid] = NULL; 615 } 616 --- 17 unchanged lines hidden (view full) --- 634DefaultFetch<Impl>::squashFromDecode(const Addr &new_PC, 635 const InstSeqNum &seq_num, 636 unsigned tid) 637{ 638 DPRINTF(Fetch, "[tid:%i]: Squashing from decode.\n",tid); 639 640 doSquash(new_PC, tid); 641 | 665 666 // Clear the icache miss if it's outstanding. 667 if (fetchStatus[tid] == IcacheWaitResponse) { 668 DPRINTF(Fetch, "[tid:%i]: Squashing outstanding Icache miss.\n", 669 tid); 670 memReq[tid] = NULL; 671 } 672 --- 17 unchanged lines hidden (view full) --- 690DefaultFetch<Impl>::squashFromDecode(const Addr &new_PC, 691 const InstSeqNum &seq_num, 692 unsigned tid) 693{ 694 DPRINTF(Fetch, "[tid:%i]: Squashing from decode.\n",tid); 695 696 doSquash(new_PC, tid); 697 |
698#if THE_ISA != ALPHA_ISA 699 if (seq_num <= delaySlotInfo[tid].branchSeqNum) { 700 delaySlotInfo[tid].numInsts = 0; 701 delaySlotInfo[tid].targetAddr = 0; 702 delaySlotInfo[tid].targetReady = false; 703 } 704#endif 705 |
|
642 // Tell the CPU to remove any instructions that are in flight between 643 // fetch and decode. 644 cpu->removeInstsUntil(seq_num, tid); 645} 646 647template<class Impl> 648bool 649DefaultFetch<Impl>::checkStall(unsigned tid) const --- 57 unchanged lines hidden (view full) --- 707 cpu->deactivateStage(O3CPU::FetchIdx); 708 } 709 710 return Inactive; 711} 712 713template <class Impl> 714void | 706 // Tell the CPU to remove any instructions that are in flight between 707 // fetch and decode. 708 cpu->removeInstsUntil(seq_num, tid); 709} 710 711template<class Impl> 712bool 713DefaultFetch<Impl>::checkStall(unsigned tid) const --- 57 unchanged lines hidden (view full) --- 771 cpu->deactivateStage(O3CPU::FetchIdx); 772 } 773 774 return Inactive; 775} 776 777template <class Impl> 778void |
715DefaultFetch<Impl>::squash(const Addr &new_PC, unsigned tid) | 779DefaultFetch<Impl>::squash(const Addr &new_PC, const InstSeqNum &seq_num, 780 bool squash_delay_slot, unsigned tid) |
716{ 717 DPRINTF(Fetch, "[tid:%u]: Squash from commit.\n",tid); 718 719 doSquash(new_PC, tid); 720 | 781{ 782 DPRINTF(Fetch, "[tid:%u]: Squash from commit.\n",tid); 783 784 doSquash(new_PC, tid); 785 |
786#if THE_ISA == ALPHA_ISA |
|
721 // Tell the CPU to remove any instructions that are not in the ROB. | 787 // Tell the CPU to remove any instructions that are not in the ROB. |
722 cpu->removeInstsNotInROB(tid); | 788 cpu->removeInstsNotInROB(tid, true, 0); 789#else 790 if (seq_num <= delaySlotInfo[tid].branchSeqNum) { 791 delaySlotInfo[tid].numInsts = 0; 792 delaySlotInfo[tid].targetAddr = 0; 793 delaySlotInfo[tid].targetReady = false; 794 } 795 796 // Tell the CPU to remove any instructions that are not in the ROB. 797 cpu->removeInstsNotInROB(tid, squash_delay_slot, seq_num); 798#endif |
723} 724 725template <class Impl> 726void 727DefaultFetch<Impl>::tick() 728{ 729 list<unsigned>::iterator threads = (*activeThreads).begin(); 730 bool status_change = false; --- 92 unchanged lines hidden (view full) --- 823 } 824 825 // Check squash signals from commit. 826 if (fromCommit->commitInfo[tid].squash) { 827 828 DPRINTF(Fetch, "[tid:%u]: Squashing instructions due to squash " 829 "from commit.\n",tid); 830 | 799} 800 801template <class Impl> 802void 803DefaultFetch<Impl>::tick() 804{ 805 list<unsigned>::iterator threads = (*activeThreads).begin(); 806 bool status_change = false; --- 92 unchanged lines hidden (view full) --- 899 } 900 901 // Check squash signals from commit. 902 if (fromCommit->commitInfo[tid].squash) { 903 904 DPRINTF(Fetch, "[tid:%u]: Squashing instructions due to squash " 905 "from commit.\n",tid); 906 |
907#if THE_ISA == ALPHA_ISA 908 InstSeqNum doneSeqNum = fromCommit->commitInfo[tid].doneSeqNum; 909#else 910 InstSeqNum doneSeqNum = fromCommit->commitInfo[tid].bdelayDoneSeqNum; 911#endif |
|
831 // In any case, squash. | 912 // In any case, squash. |
832 squash(fromCommit->commitInfo[tid].nextPC,tid); | 913 squash(fromCommit->commitInfo[tid].nextPC, 914 doneSeqNum, 915 fromCommit->commitInfo[tid].squashDelaySlot, 916 tid); |
833 834 // Also check if there's a mispredict that happened. 835 if (fromCommit->commitInfo[tid].branchMispredict) { 836 branchPred.squash(fromCommit->commitInfo[tid].doneSeqNum, 837 fromCommit->commitInfo[tid].nextPC, 838 fromCommit->commitInfo[tid].branchTaken, 839 tid); 840 } else { --- 30 unchanged lines hidden (view full) --- 871 fromDecode->decodeInfo[tid].branchTaken, 872 tid); 873 } else { 874 branchPred.squash(fromDecode->decodeInfo[tid].doneSeqNum, 875 tid); 876 } 877 878 if (fetchStatus[tid] != Squashing) { | 917 918 // Also check if there's a mispredict that happened. 919 if (fromCommit->commitInfo[tid].branchMispredict) { 920 branchPred.squash(fromCommit->commitInfo[tid].doneSeqNum, 921 fromCommit->commitInfo[tid].nextPC, 922 fromCommit->commitInfo[tid].branchTaken, 923 tid); 924 } else { --- 30 unchanged lines hidden (view full) --- 955 fromDecode->decodeInfo[tid].branchTaken, 956 tid); 957 } else { 958 branchPred.squash(fromDecode->decodeInfo[tid].doneSeqNum, 959 tid); 960 } 961 962 if (fetchStatus[tid] != Squashing) { |
963 964#if THE_ISA == ALPHA_ISA 965 InstSeqNum doneSeqNum = fromDecode->decodeInfo[tid].doneSeqNum; 966#else 967 InstSeqNum doneSeqNum = fromDecode->decodeInfo[tid].bdelayDoneSeqNum; 968#endif |
|
879 // Squash unless we're already squashing 880 squashFromDecode(fromDecode->decodeInfo[tid].nextPC, | 969 // Squash unless we're already squashing 970 squashFromDecode(fromDecode->decodeInfo[tid].nextPC, |
881 fromDecode->decodeInfo[tid].doneSeqNum, | 971 doneSeqNum, |
882 tid); 883 884 return true; 885 } 886 } 887 888 if (checkStall(tid) && fetchStatus[tid] != IcacheWaitResponse) { 889 DPRINTF(Fetch, "[tid:%i]: Setting to blocked\n",tid); --- 89 unchanged lines hidden (view full) --- 979 // If we had a stall due to an icache miss, then return. 980 if (fetchStatus[tid] == IcacheWaitResponse) { 981 ++icacheStallCycles; 982 status_change = true; 983 return; 984 } 985 986 Addr next_PC = fetch_PC; | 972 tid); 973 974 return true; 975 } 976 } 977 978 if (checkStall(tid) && fetchStatus[tid] != IcacheWaitResponse) { 979 DPRINTF(Fetch, "[tid:%i]: Setting to blocked\n",tid); --- 89 unchanged lines hidden (view full) --- 1069 // If we had a stall due to an icache miss, then return. 1070 if (fetchStatus[tid] == IcacheWaitResponse) { 1071 ++icacheStallCycles; 1072 status_change = true; 1073 return; 1074 } 1075 1076 Addr next_PC = fetch_PC; |
1077 Addr next_NPC = next_PC + instSize; |
|
987 InstSeqNum inst_seq; 988 MachInst inst; 989 ExtMachInst ext_inst; 990 // @todo: Fix this hack. 991 unsigned offset = (fetch_PC & cacheBlkMask) & ~3; 992 993 if (fault == NoFault) { 994 // If the read of the first instruction was successful, then grab the 995 // instructions from the rest of the cache line and put them into the 996 // queue heading to decode. 997 998 DPRINTF(Fetch, "[tid:%i]: Adding instructions to queue to " 999 "decode.\n",tid); 1000 1001 // Need to keep track of whether or not a predicted branch 1002 // ended this fetch block. 1003 bool predicted_branch = false; 1004 | 1078 InstSeqNum inst_seq; 1079 MachInst inst; 1080 ExtMachInst ext_inst; 1081 // @todo: Fix this hack. 1082 unsigned offset = (fetch_PC & cacheBlkMask) & ~3; 1083 1084 if (fault == NoFault) { 1085 // If the read of the first instruction was successful, then grab the 1086 // instructions from the rest of the cache line and put them into the 1087 // queue heading to decode. 1088 1089 DPRINTF(Fetch, "[tid:%i]: Adding instructions to queue to " 1090 "decode.\n",tid); 1091 1092 // Need to keep track of whether or not a predicted branch 1093 // ended this fetch block. 1094 bool predicted_branch = false; 1095 |
1096 // Need to keep track of whether or not a delay slot 1097 // instruction has been fetched 1098 |
|
1005 for (; 1006 offset < cacheBlkSize && 1007 numInst < fetchWidth && | 1099 for (; 1100 offset < cacheBlkSize && 1101 numInst < fetchWidth && |
1008 !predicted_branch; | 1102 (!predicted_branch || delaySlotInfo[tid].numInsts > 0); |
1009 ++numInst) { 1010 1011 // Get a sequence number. 1012 inst_seq = cpu->getAndIncrementInstSeq(); 1013 1014 // Make sure this is a valid index. 1015 assert(offset <= cacheBlkSize - instSize); 1016 --- 20 unchanged lines hidden (view full) --- 1037 DPRINTF(Fetch, "[tid:%i]: Instruction is: %s\n", 1038 tid, instruction->staticInst->disassemble(fetch_PC)); 1039 1040 instruction->traceData = 1041 Trace::getInstRecord(curTick, cpu->tcBase(tid), cpu, 1042 instruction->staticInst, 1043 instruction->readPC(),tid); 1044 | 1103 ++numInst) { 1104 1105 // Get a sequence number. 1106 inst_seq = cpu->getAndIncrementInstSeq(); 1107 1108 // Make sure this is a valid index. 1109 assert(offset <= cacheBlkSize - instSize); 1110 --- 20 unchanged lines hidden (view full) --- 1131 DPRINTF(Fetch, "[tid:%i]: Instruction is: %s\n", 1132 tid, instruction->staticInst->disassemble(fetch_PC)); 1133 1134 instruction->traceData = 1135 Trace::getInstRecord(curTick, cpu->tcBase(tid), cpu, 1136 instruction->staticInst, 1137 instruction->readPC(),tid); 1138 |
1045 predicted_branch = lookupAndUpdateNextPC(instruction, next_PC); | 1139 predicted_branch = lookupAndUpdateNextPC(instruction, next_PC, 1140 next_NPC); |
1046 1047 // Add instruction to the CPU's list of instructions. 1048 instruction->setInstListIt(cpu->addInst(instruction)); 1049 1050 // Write the instruction to the first slot in the queue 1051 // that heads to decode. 1052 toDecode->insts[numInst] = instruction; 1053 --- 9 unchanged lines hidden (view full) --- 1063 warn("cycle %lli: Quiesce instruction encountered, halting fetch!", 1064 curTick); 1065 fetchStatus[tid] = QuiescePending; 1066 ++numInst; 1067 status_change = true; 1068 break; 1069 } 1070 | 1141 1142 // Add instruction to the CPU's list of instructions. 1143 instruction->setInstListIt(cpu->addInst(instruction)); 1144 1145 // Write the instruction to the first slot in the queue 1146 // that heads to decode. 1147 toDecode->insts[numInst] = instruction; 1148 --- 9 unchanged lines hidden (view full) --- 1158 warn("cycle %lli: Quiesce instruction encountered, halting fetch!", 1159 curTick); 1160 fetchStatus[tid] = QuiescePending; 1161 ++numInst; 1162 status_change = true; 1163 break; 1164 } 1165 |
1071 offset+= instSize; | 1166 offset += instSize; 1167 1168#if THE_ISA != ALPHA_ISA 1169 if (predicted_branch) { 1170 delaySlotInfo[tid].branchSeqNum = inst_seq; 1171 1172 DPRINTF(Fetch, "[tid:%i]: Delay slot branch set to [sn:%i]\n", 1173 tid, inst_seq); 1174 continue; 1175 } else if (delaySlotInfo[tid].numInsts > 0) { 1176 --delaySlotInfo[tid].numInsts; 1177 1178 // It's OK to set PC to target of branch 1179 if (delaySlotInfo[tid].numInsts == 0) { 1180 delaySlotInfo[tid].targetReady = true; 1181 1182 // Break the looping condition 1183 predicted_branch = true; 1184 } 1185 1186 DPRINTF(Fetch, "[tid:%i]: %i delay slot inst(s) left to" 1187 " process.\n", tid, delaySlotInfo[tid].numInsts); 1188 } 1189#endif |
1072 } | 1190 } |
1191 1192 if (offset >= cacheBlkSize) { 1193 DPRINTF(Fetch, "[tid:%i]: Done fetching, reached the end of cache " 1194 "block.\n", tid); 1195 } else if (numInst >= fetchWidth) { 1196 DPRINTF(Fetch, "[tid:%i]: Done fetching, reached fetch bandwidth " 1197 "for this cycle.\n", tid); 1198 } else if (predicted_branch && delaySlotInfo[tid].numInsts <= 0) { 1199 DPRINTF(Fetch, "[tid:%i]: Done fetching, predicted branch " 1200 "instruction encountered.\n", tid); 1201 } |
|
1073 } 1074 1075 if (numInst > 0) { 1076 wroteToTimeBuffer = true; 1077 } 1078 1079 // Now that fetching is completed, update the PC to signify what the next 1080 // cycle will be. 1081 if (fault == NoFault) { 1082 DPRINTF(Fetch, "[tid:%i]: Setting PC to %08p.\n",tid, next_PC); 1083 1084#if THE_ISA == ALPHA_ISA 1085 PC[tid] = next_PC; 1086 nextPC[tid] = next_PC + instSize; 1087#else | 1202 } 1203 1204 if (numInst > 0) { 1205 wroteToTimeBuffer = true; 1206 } 1207 1208 // Now that fetching is completed, update the PC to signify what the next 1209 // cycle will be. 1210 if (fault == NoFault) { 1211 DPRINTF(Fetch, "[tid:%i]: Setting PC to %08p.\n",tid, next_PC); 1212 1213#if THE_ISA == ALPHA_ISA 1214 PC[tid] = next_PC; 1215 nextPC[tid] = next_PC + instSize; 1216#else |
1088 PC[tid] = next_PC; 1089 nextPC[tid] = next_PC + instSize; 1090 nextPC[tid] = next_PC + instSize; | 1217 if (delaySlotInfo[tid].targetReady && 1218 delaySlotInfo[tid].numInsts == 0) { 1219 // Set PC to target 1220 PC[tid] = delaySlotInfo[tid].targetAddr; //next_PC 1221 nextPC[tid] = next_PC + instSize; //next_NPC 1222 nextNPC[tid] = next_PC + (2 * instSize); |
1091 | 1223 |
1092 thread->setNextPC(thread->readNextNPC()); 1093 thread->setNextNPC(thread->readNextNPC() + sizeof(MachInst)); | 1224 delaySlotInfo[tid].targetReady = false; 1225 } else { 1226 PC[tid] = next_PC; 1227 nextPC[tid] = next_NPC; 1228 nextNPC[tid] = next_NPC + instSize; 1229 } |
1094#endif 1095 } else { 1096 // We shouldn't be in an icache miss and also have a fault (an ITB 1097 // miss) 1098 if (fetchStatus[tid] == IcacheWaitResponse) { 1099 panic("Fetch should have exited prior to this!"); 1100 } 1101 --- 209 unchanged lines hidden --- | 1230#endif 1231 } else { 1232 // We shouldn't be in an icache miss and also have a fault (an ITB 1233 // miss) 1234 if (fetchStatus[tid] == IcacheWaitResponse) { 1235 panic("Fetch should have exited prior to this!"); 1236 } 1237 --- 209 unchanged lines hidden --- |