if (bufferOffset(tail).sGE(VM_Offset.fromInt(arity<<LOG_BYTES_IN_ADDRESS))) {
if (bufferOffset(tail).sGE(VM_Word.fromIntZeroExtend(arity).lsh(LOG_BYTES_IN_ADDRESS).toOffset())) {
  private final boolean consumerStarved(int arity) {    if (VM_Interface.VerifyAssertions) VM_Interface._assert(arity == queue.getArity());    VM_Address sentinelAsAddress = VM_Address.zero().add(headSentinel(arity));     if (bufferOffset(tail).sGE(VM_Offset.fromInt(arity<<LOG_BYTES_IN_ADDRESS))) {      // entries in tail, so consume tail      if (isReset()) {        head = queue.alloc(); // no head, so alloc a new one        Plan.checkForAsyncCollection(); // possible side-effect of alloc()      }      VM_Address tmp = head;      head = normalizeTail(arity).add(BYTES_IN_ADDRESS);// account for pre-decrement      if (VM_Interface.VerifyAssertions)        VM_Interface._assert(tmp.EQ(bufferStart(tmp)));      tail = tmp.add(bufferLastOffset(arity)).add(BYTES_IN_ADDRESS);    } else {      VM_Address tmp = queue.dequeueAndWait(arity);      head = (tmp.isZero() ? sentinelAsAddress : tmp);    }    // return true if a) there is a head buffer, and b) it is non-empty    return ((!isReset()) && (!(bufferOffset(head).isZero())));  }