From 6fd1606a3f3fc2dd53ab4f8b371e420b3e33c74f Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Tue, 26 Jun 2018 11:02:04 +0100 Subject: Implement Integer.valueOf() intrinsic for boot image. And generate only one "boot image live objects" array rather than one per boot*.art file. Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Test: Pixel 2 XL boots. Test: testrunner.py --target --optimizing Bug: 71526895 Change-Id: I23af7f47fea5150805f801cd2512f2d152ee5b73 --- compiler/optimizing/intrinsic_objects.h | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'compiler/optimizing/intrinsic_objects.h') diff --git a/compiler/optimizing/intrinsic_objects.h b/compiler/optimizing/intrinsic_objects.h index ffadd03428..863017be38 100644 --- a/compiler/optimizing/intrinsic_objects.h +++ b/compiler/optimizing/intrinsic_objects.h @@ -17,6 +17,8 @@ #ifndef ART_COMPILER_OPTIMIZING_INTRINSIC_OBJECTS_H_ #define ART_COMPILER_OPTIMIZING_INTRINSIC_OBJECTS_H_ +#include "base/bit_field.h" +#include "base/bit_utils.h" #include "base/mutex.h" namespace art { @@ -33,6 +35,26 @@ template class ObjectArray; class IntrinsicObjects { public: + enum class PatchType { + kIntegerValueOfObject, + kIntegerValueOfArray, + + kLast = kIntegerValueOfArray + }; + + static uint32_t EncodePatch(PatchType patch_type, uint32_t index = 0u) { + DCHECK(patch_type == PatchType::kIntegerValueOfObject || index == 0u); + return PatchTypeField::Encode(static_cast(patch_type)) | IndexField::Encode(index); + } + + static PatchType DecodePatchType(uint32_t intrinsic_data) { + return static_cast(PatchTypeField::Decode(intrinsic_data)); + } + + static uint32_t DecodePatchIndex(uint32_t intrinsic_data) { + return IndexField::Decode(intrinsic_data); + } + static ObjPtr> AllocateBootImageLiveObjects( Thread* self, ClassLinker* class_linker) REQUIRES_SHARED(Locks::mutator_lock_); @@ -47,6 +69,13 @@ class IntrinsicObjects { static MemberOffset GetIntegerValueOfArrayDataOffset( ObjPtr> boot_image_live_objects) REQUIRES_SHARED(Locks::mutator_lock_); + + private: + static constexpr size_t kPatchTypeBits = + MinimumBitsToStore(static_cast(PatchType::kLast)); + static constexpr size_t kIndexBits = BitSizeOf() - kPatchTypeBits; + using PatchTypeField = BitField; + using IndexField = BitField; }; } // namespace art -- cgit v1.2.3-59-g8ed1b