private static int assignBytecodeIndices(int bcIndex, int[] bcIndices, int low, int high) { int middle = (high + low)/2; bcIndices[middle] = bcIndex++; if (low == middle && middle == high) { return bcIndex; } else {  if (low < middle) { bcIndex = assignBytecodeIndices(bcIndex, bcIndices, low, middle-1); } if (middle < high) { bcIndex = assignBytecodeIndices(bcIndex, bcIndices, middle+1, high); } return bcIndex; } }
  static INSTRUCTION[] createStub(int[] sigIds, VM_Method[] targets) {    // (1) Create an assembler.    int numEntries = sigIds.length;    VM_Assembler asm = new VM_Assembler(numEntries); // pretend each entry is a bytecode    // (2) signatures must be in ascending order (to build binary search tree).    if (VM.VerifyAssertions) {      for (int i=1; i<sigIds.length; i++) {	VM.assert(sigIds[i-1] < sigIds[i]);      }    }    // (3) Assign synthetic bytecode numbers to each switch such that we'll generate them    // in ascending order.  This lets us use the general forward branching mechanisms    // of the VM_Assembler.    int[] bcIndices = new int[numEntries];    assignBytecodeIndices(0, bcIndices, 0, numEntries -1);        // (4) Generate the stub.    insertStubPrologue(asm);    insertStubCase(asm, sigIds, targets, bcIndices, 0, numEntries-1);        INSTRUCTION[] stub = asm.makeMachineCode().getInstructions();    // (5) synchronize icache with generated machine code that was written through dcache    if (VM.runningVM)          VM_Memory.sync(VM_Magic.objectAsAddress(stub), stub.length << LG_INSTRUCTION_WIDTH);     return stub;  }  // Assign ascending bytecode indices to each case (in the order they will be generated)  private static int assignBytecodeIndices(int bcIndex, int[] bcIndices, int low, int high) {    int middle = (high + low)/2;    bcIndices[middle] = bcIndex++;    if (low == middle && middle == high) {      return bcIndex;    } else {      // Recurse.      if (low < middle) {	bcIndex = assignBytecodeIndices(bcIndex, bcIndices, low, middle-1);      }       if (middle < high) {	bcIndex = assignBytecodeIndices(bcIndex, bcIndices, middle+1, high);      }      return bcIndex;    }  }