if (VM.VerifyAssertions) VM.assert(ptr.getOpcode() == IR_PROLOGUE_opcode);
if (VM.VerifyAssertions) VM._assert(ptr.getOpcode() == IR_PROLOGUE_opcode);
  final void insertExceptionalPrologue () {    if (frameSize >= 0x7ff0) {      throw new OPT_OptimizingCompilerException("Stackframe size exceeded!");    }    OPT_PhysicalRegisterSet phys = ir.regpool.getPhysicalRegisterSet();    OPT_Register FP = phys.getFP();    OPT_Register PR = phys.getPR();    OPT_Register TSR= phys.getTSR();    OPT_Register R0 = phys.getTemp();    OPT_Register S1 = phys.getGPR(LAST_SCRATCH_GPR);    boolean interruptible = ir.method.isInterruptible();    boolean stackOverflow = interruptible;    boolean yp = !VM.BuildForThreadSwitchUsingControlRegisterBit &&       ir.stackManager.hasPrologueYieldpoint();    OPT_Instruction ptr = ir.firstInstructionInCodeOrder().getNext();    if (VM.VerifyAssertions) VM.assert(ptr.getOpcode() == IR_PROLOGUE_opcode);    // Stack overflow check    if (stackOverflow) {      // R0 is fairly useless (can't be operand 1 of an addi or the base ptr      // of a load) so, free up S1 for use by briefly saving its contents in the      // return address slot of my caller's frame      ptr.insertBefore(nonPEIGC(MIR_Store.create(PPC_STW, R(S1), R(FP), 			I(STACKFRAME_NEXT_INSTRUCTION_OFFSET))));      ptr.insertBefore(nonPEIGC(MIR_Load.create(PPC_LWZ, R(S1),                                                R(phys.getPR()), 			I(VM_Entrypoints.activeThreadStackLimitField.getOffset()))));      ptr.insertBefore(MIR_Binary.create(PPC_ADDI, R(R0), R(S1), 			I(frameSize)));      ptr.insertBefore(nonPEIGC(MIR_Load.create(PPC_LWZ, R(S1), R(FP), 			I(STACKFRAME_NEXT_INSTRUCTION_OFFSET))));      // Mutate the Prologue holder instruction into the trap      MIR_Trap.mutate(ptr, PPC_TW, OPT_PowerPCTrapOperand.LESS(), R(FP), R(R0),		      OPT_TrapCodeOperand.StackOverflow());       // advance ptr because we want the remaining instructions to come after      // the trap      ptr = ptr.getNext();    } else {