Fix compressible string check for ctors with `hibyte`.

Only the low 8 bits of the `hibyte` are relevant but we
were checking the whole `hibyte`, erroneously creating
an uncompressed string when the low bits are zero but
high bits are non-zero. String.equals() depends on all
compressible Strings being actually compressed.

Test: Added regression test to 021-string2.
Test: m test-art-host-gtest
Test: testrunner.py --host
Bug: 31040547
Bug: 63661357
Change-Id: I31690b544de928ce9c6f39f3d144d3e2029f38f6
diff --git a/runtime/mirror/string-inl.h b/runtime/mirror/string-inl.h
index 7560639..84587c8 100644
--- a/runtime/mirror/string-inl.h
+++ b/runtime/mirror/string-inl.h
@@ -251,6 +251,7 @@
                                           Handle<ByteArray> array, int32_t offset,
                                           int32_t high_byte, gc::AllocatorType allocator_type) {
   const uint8_t* const src = reinterpret_cast<uint8_t*>(array->GetData()) + offset;
+  high_byte &= 0xff;  // Extract the relevant bits before determining `compressible`.
   const bool compressible =
       kUseStringCompression && String::AllASCII<uint8_t>(src, byte_length) && (high_byte == 0);
   const int32_t length_with_flag = String::GetFlaggedCount(byte_length, compressible);