diff options
author | 2020-09-07 15:24:36 +0000 | |
---|---|---|
committer | 2020-09-11 10:33:12 +0000 | |
commit | a41ea2708d143b5982f1969864513b62706d11d4 (patch) | |
tree | dfe5d58ffb7dd6d9220e87430416b8ea2deef617 /compiler/optimizing/intrinsics_utils.h | |
parent | 1e2d5679e56364b090c989427f43ad6273359904 (diff) |
arm64: VarHandle.get/set intrinsic for fields.
Test: testrunner.py --target --64 --optimizing -t 712-varhandle-invocation
Test: Repeat with ART_USE_READ_BARRIER=false ART_HEAP_POISONING=true.
Test: Repeat with ART_READ_BARRIER_TYPE=TABLELOOKUP.
Bug: 65872996
Change-Id: Ic0ec2eba7b493ef3b1d15291b67e0214e6e2de0e
Diffstat (limited to 'compiler/optimizing/intrinsics_utils.h')
-rw-r--r-- | compiler/optimizing/intrinsics_utils.h | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/compiler/optimizing/intrinsics_utils.h b/compiler/optimizing/intrinsics_utils.h index 4b8a8e743d..d900b21073 100644 --- a/compiler/optimizing/intrinsics_utils.h +++ b/compiler/optimizing/intrinsics_utils.h @@ -20,7 +20,10 @@ #include "base/casts.h" #include "base/macros.h" #include "code_generator.h" +#include "data_type-inl.h" +#include "dex/dex_file-inl.h" #include "locations.h" +#include "mirror/var_handle.h" #include "nodes.h" #include "utils/assembler.h" #include "utils/label.h" @@ -93,6 +96,24 @@ class IntrinsicSlowPath : public TSlowPathCode { DISALLOW_COPY_AND_ASSIGN(IntrinsicSlowPath); }; +static inline size_t GetExpectedVarHandleCoordinatesCount(HInvoke *invoke) { + mirror::VarHandle::AccessModeTemplate access_mode_template = + mirror::VarHandle::GetAccessModeTemplateByIntrinsic(invoke->GetIntrinsic()); + size_t var_type_count = mirror::VarHandle::GetNumberOfVarTypeParameters(access_mode_template); + size_t accessor_argument_count = invoke->GetNumberOfArguments() - 1; + + return accessor_argument_count - var_type_count; +} + +static inline DataType::Type GetDataTypeFromShorty(HInvoke* invoke, uint32_t index) { + DCHECK(invoke->IsInvokePolymorphic()); + const DexFile& dex_file = invoke->GetBlock()->GetGraph()->GetDexFile(); + const char* shorty = dex_file.GetShorty(invoke->AsInvokePolymorphic()->GetProtoIndex()); + DCHECK_LT(index, strlen(shorty)); + + return DataType::FromShorty(shorty[index]); +} + } // namespace art #endif // ART_COMPILER_OPTIMIZING_INTRINSICS_UTILS_H_ |