return VM_Magic.getIntAtOffset(o, HASHCODE_OFFSET);
return (VM_Magic.getIntAtOffset(o, HASHCODE_OFFSET) >>> 1);
  public static int getObjectHashCode(Object o) {     if (ADDRESS_BASED_HASHING) {      if (MM_Interface.MOVES_OBJECTS) {        Word hashState = VM_Magic.getWordAtOffset(o, STATUS_OFFSET).and(HASH_STATE_MASK);        if (hashState.EQ(HASH_STATE_HASHED)) {          // HASHED, NOT MOVED          return VM_Magic.objectAsAddress(o).toWord().rshl(LOG_BYTES_IN_ADDRESS).toInt();          } else if (hashState.EQ(HASH_STATE_HASHED_AND_MOVED)) {          // HASHED AND MOVED          if (DYNAMIC_HASH_OFFSET) {            // Read the size of this object.          VM_Type t = VM_Magic.getObjectType(o);            int offset = t.isArrayType()              ? t.asArray().getInstanceSize(VM_Magic.getArrayLength(o)) - OBJECT_REF_OFFSET              : t.asClass().getInstanceSize() - OBJECT_REF_OFFSET;            return VM_Magic.getIntAtOffset(o, Offset.fromIntSignExtend(offset));          } else {            return VM_Magic.getIntAtOffset(o, HASHCODE_OFFSET);          }        } else {          // UNHASHED          Word tmp;          do {            tmp = VM_Magic.prepareWord(o, STATUS_OFFSET);          } while (!VM_Magic.attemptWord(o, STATUS_OFFSET, tmp, tmp.or(HASH_STATE_HASHED)));          if (VM_ObjectModel.HASH_STATS) VM_ObjectModel.hashTransition1++;          return getObjectHashCode(o);        }      } else {        return VM_Magic.objectAsAddress(o).toWord().rshl(LOG_BYTES_IN_ADDRESS).toInt();        }    } else { // 10 bit hash code in status word      int hashCode = VM_Magic.getWordAtOffset(o, STATUS_OFFSET).and(HASH_CODE_MASK).rshl(HASH_CODE_SHIFT).toInt();      if (hashCode != 0)         return hashCode;       return installHashCode(o);    }  }