base.cc (3160:4d7fc8d7ef23) | base.cc (3276:dc3cd126b479) |
---|---|
1/* 2 * Copyright (c) 2002-2005 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; --- 382 unchanged lines hidden (view full) --- 391 392 thread->funcExeInst++; 393 394 // check for instruction-count-based events 395 comInstEventQueue[0]->serviceEvents(numInst); 396 397 // decode the instruction 398 inst = gtoh(inst); | 1/* 2 * Copyright (c) 2002-2005 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; --- 382 unchanged lines hidden (view full) --- 391 392 thread->funcExeInst++; 393 394 // check for instruction-count-based events 395 comInstEventQueue[0]->serviceEvents(numInst); 396 397 // decode the instruction 398 inst = gtoh(inst); |
399 curStaticInst = StaticInst::decode(makeExtMI(inst, thread->getTC())); | 399 //If we're not in the middle of a macro instruction 400 if (!curMacroStaticInst) { 401 StaticInstPtr instPtr = StaticInst::decode(makeExtMI(inst, thread->getTC())); 402 if (instPtr->isMacroOp()) { 403 curMacroStaticInst = instPtr; 404 curStaticInst = curMacroStaticInst->fetchMicroOp(0); 405 } 406 } else { 407 //Read the next micro op from the macro op 408 curStaticInst = curMacroStaticInst->fetchMicroOp(thread->readMicroPc()); 409 } |
400 | 410 |
411 |
|
401 traceData = Trace::getInstRecord(curTick, tc, curStaticInst, 402 thread->readPC()); 403 404 DPRINTF(Decode,"Decode: Decoded %s instruction (opcode: 0x%x): 0x%x\n", 405 curStaticInst->getName(), curStaticInst->getOpcode(), 406 curStaticInst->machInst); 407 408#if FULL_SYSTEM --- 32 unchanged lines hidden (view full) --- 441} 442 443 444void 445BaseSimpleCPU::advancePC(Fault fault) 446{ 447 if (fault != NoFault) { 448 fault->invoke(tc); | 412 traceData = Trace::getInstRecord(curTick, tc, curStaticInst, 413 thread->readPC()); 414 415 DPRINTF(Decode,"Decode: Decoded %s instruction (opcode: 0x%x): 0x%x\n", 416 curStaticInst->getName(), curStaticInst->getOpcode(), 417 curStaticInst->machInst); 418 419#if FULL_SYSTEM --- 32 unchanged lines hidden (view full) --- 452} 453 454 455void 456BaseSimpleCPU::advancePC(Fault fault) 457{ 458 if (fault != NoFault) { 459 fault->invoke(tc); |
449 } 450 else { 451 // go to the next instruction 452 thread->setPC(thread->readNextPC()); | 460 } else { 461 //If we're at the last micro op for this instruction 462 if (curStaticInst->isLastMicroOp()) { 463 //We should be working with a macro op 464 assert(curMacroStaticInst); 465 //Close out this macro op, and clean up the 466 //microcode state 467 curMacroStaticInst = nullStaticInst; 468 thread->setMicroPC(0); 469 thread->setNextMicroPC(0); 470 } 471 //If we're still in a macro op 472 if (curMacroStaticInst) { 473 //Advance the micro pc 474 thread->setMicroPC(thread->getNextMicroPC()); 475 //Advance the "next" micro pc. Note that there are no delay 476 //slots, and micro ops are "word" addressed. 477 thread->setNextMicroPC(thread->getNextMicroPC() + 1); 478 } else { 479 // go to the next instruction 480 thread->setPC(thread->readNextPC()); |
453#if ISA_HAS_DELAY_SLOT | 481#if ISA_HAS_DELAY_SLOT |
454 thread->setNextPC(thread->readNextNPC()); 455 thread->setNextNPC(thread->readNextNPC() + sizeof(MachInst)); 456 assert(thread->readNextPC() != thread->readNextNPC()); | 482 thread->setNextPC(thread->readNextNPC()); 483 thread->setNextNPC(thread->readNextNPC() + sizeof(MachInst)); 484 assert(thread->readNextPC() != thread->readNextNPC()); |
457#else | 485#else |
458 thread->setNextPC(thread->readNextPC() + sizeof(MachInst)); | 486 thread->setNextPC(thread->readNextPC() + sizeof(MachInst)); |
459#endif | 487#endif |
460 | 488 } |
461 } 462 463#if FULL_SYSTEM 464 Addr oldpc; 465 do { 466 oldpc = thread->readPC(); 467 system->pcEventQueue.service(tc); 468 } while (oldpc != thread->readPC()); 469#endif 470} 471 | 489 } 490 491#if FULL_SYSTEM 492 Addr oldpc; 493 do { 494 oldpc = thread->readPC(); 495 system->pcEventQueue.service(tc); 496 } while (oldpc != thread->readPC()); 497#endif 498} 499 |