summaryrefslogtreecommitdiff
path: root/compiler/optimizing/intrinsics_utils.h
diff options
context:
space:
mode:
author Vladimir Marko <vmarko@google.com> 2020-09-07 15:24:36 +0000
committer Vladimir Marko <vmarko@google.com> 2020-09-11 10:33:12 +0000
commita41ea2708d143b5982f1969864513b62706d11d4 (patch)
treedfe5d58ffb7dd6d9220e87430416b8ea2deef617 /compiler/optimizing/intrinsics_utils.h
parent1e2d5679e56364b090c989427f43ad6273359904 (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.h21
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_