summaryrefslogtreecommitdiff
path: root/compiler/optimizing/intrinsic_objects.h
diff options
context:
space:
mode:
author Vladimir Marko <vmarko@google.com> 2018-06-26 11:02:04 +0100
committer Vladimir Marko <vmarko@google.com> 2018-06-29 14:39:00 +0100
commit6fd1606a3f3fc2dd53ab4f8b371e420b3e33c74f (patch)
tree9f944d267ce3616eb969c027665e4a451c2b3879 /compiler/optimizing/intrinsic_objects.h
parentbb089b6bf850c87e0e42917a383cc7298dcb09c5 (diff)
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
Diffstat (limited to 'compiler/optimizing/intrinsic_objects.h')
-rw-r--r--compiler/optimizing/intrinsic_objects.h29
1 files changed, 29 insertions, 0 deletions
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 T> 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<uint32_t>(patch_type)) | IndexField::Encode(index);
+ }
+
+ static PatchType DecodePatchType(uint32_t intrinsic_data) {
+ return static_cast<PatchType>(PatchTypeField::Decode(intrinsic_data));
+ }
+
+ static uint32_t DecodePatchIndex(uint32_t intrinsic_data) {
+ return IndexField::Decode(intrinsic_data);
+ }
+
static ObjPtr<mirror::ObjectArray<mirror::Object>> AllocateBootImageLiveObjects(
Thread* self,
ClassLinker* class_linker) REQUIRES_SHARED(Locks::mutator_lock_);
@@ -47,6 +69,13 @@ class IntrinsicObjects {
static MemberOffset GetIntegerValueOfArrayDataOffset(
ObjPtr<mirror::ObjectArray<mirror::Object>> boot_image_live_objects)
REQUIRES_SHARED(Locks::mutator_lock_);
+
+ private:
+ static constexpr size_t kPatchTypeBits =
+ MinimumBitsToStore(static_cast<uint32_t>(PatchType::kLast));
+ static constexpr size_t kIndexBits = BitSizeOf<uint32_t>() - kPatchTypeBits;
+ using PatchTypeField = BitField<uint32_t, 0u, kPatchTypeBits>;
+ using IndexField = BitField<uint32_t, kPatchTypeBits, kIndexBits>;
};
} // namespace art