diff --git a/src/superscalar.cpp b/src/superscalar.cpp index b3c52c0..4e9fd78 100644 --- a/src/superscalar.cpp +++ b/src/superscalar.cpp @@ -637,7 +637,7 @@ namespace randomx { int cycle1 = scheduleUop(mop.getUop1(), portBusy, cycle); int cycle2 = scheduleUop(mop.getUop2(), portBusy, cycle); - if (cycle1 == cycle2) { + if (cycle1 >= 0 && cycle1 == cycle2) { if (commit) { scheduleUop(mop.getUop1(), portBusy, cycle1); scheduleUop(mop.getUop2(), portBusy, cycle2); @@ -761,6 +761,12 @@ namespace randomx { //recalculate when the instruction can be scheduled for execution based on operand availability scheduleCycle = scheduleMop(mop, portBusy, scheduleCycle, scheduleCycle); + if (scheduleCycle < 0) { + if (trace) std::cout << "Unable to map operation '" << mop.getName() << "' to execution port (cycle " << scheduleCycle << ")" << std::endl; + portsSaturated = true; + break; + } + //calculate when the result will be ready depCycle = scheduleCycle + mop.getLatency();