diff options
author | Ian Rogers <irogers@google.com> | 2013-10-04 11:17:26 -0700 |
---|---|---|
committer | Ian Rogers <irogers@google.com> | 2013-10-08 15:54:54 -0700 |
commit | a9a8254c920ce8e22210abfc16c9842ce0aea28f (patch) | |
tree | 56614ee997940e8e3b88fef43b890e8a33e78112 /runtime/entrypoints/quick | |
parent | 34633b22f74393344987a50b8aaee548a9dadc18 (diff) | |
download | art-a9a8254c920ce8e22210abfc16c9842ce0aea28f.zip art-a9a8254c920ce8e22210abfc16c9842ce0aea28f.tar.gz art-a9a8254c920ce8e22210abfc16c9842ce0aea28f.tar.bz2 |
Improve quick codegen for aput-object.
1) don't type check known null.
2) if we know types in verify don't check at runtime.
3) if we're runtime checking then move all the code out-of-line.
Also, don't set up a callee-save frame for check-cast, do an instance-of test
then throw an exception if that fails.
Tidy quick entry point of Ldivmod to Lmod which it is on x86 and mips.
Fix monitor-enter/exit NPE for MIPS.
Fix benign bug in mirror::Class::CannotBeAssignedFromOtherTypes, a byte[]
cannot be assigned to from other types.
Change-Id: I9cb3859ec70cca71ed79331ec8df5bec969d6745
Diffstat (limited to 'runtime/entrypoints/quick')
4 files changed, 27 insertions, 44 deletions
diff --git a/runtime/entrypoints/quick/quick_cast_entrypoints.cc b/runtime/entrypoints/quick/quick_cast_entrypoints.cc index 9ffa736..ae53d6c 100644 --- a/runtime/entrypoints/quick/quick_cast_entrypoints.cc +++ b/runtime/entrypoints/quick/quick_cast_entrypoints.cc @@ -14,11 +14,8 @@ * limitations under the License. */ -#include "callee_save_frame.h" -#include "entrypoints/entrypoint_utils.h" #include "mirror/class-inl.h" #include "mirror/object-inl.h" -#include "mirror/object_array-inl.h" namespace art { @@ -31,38 +28,4 @@ extern "C" uint32_t artIsAssignableFromCode(const mirror::Class* klass, return klass->IsAssignableFrom(ref_class) ? 1 : 0; } -// Check whether it is safe to cast one class to the other, throw exception and return -1 on failure -extern "C" int artCheckCastFromCode(mirror::Class* src_type, mirror::Class* dest_type, - Thread* self, mirror::ArtMethod** sp) - SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { - DCHECK(src_type->IsClass()) << PrettyClass(src_type); - DCHECK(dest_type->IsClass()) << PrettyClass(dest_type); - if (LIKELY(dest_type->IsAssignableFrom(src_type))) { - return 0; // Success - } else { - FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly); - ThrowClassCastException(dest_type, src_type); - return -1; // Failure - } -} - -// Tests whether 'element' can be assigned into an array of type 'array_class'. -// Returns 0 on success and -1 if an exception is pending. -extern "C" int artCanPutArrayElementFromCode(const mirror::Object* element, - const mirror::Class* array_class, - Thread* self, mirror::ArtMethod** sp) - SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { - DCHECK(array_class != NULL); - // element can't be NULL as we catch this is screened in runtime_support - mirror::Class* element_class = element->GetClass(); - mirror::Class* component_type = array_class->GetComponentType(); - if (LIKELY(component_type->IsAssignableFrom(element_class))) { - return 0; // Success - } else { - FinishCalleeSaveFrameSetup(self, sp, Runtime::kRefsOnly); - ThrowArrayStoreException(element_class, array_class); - return -1; // Failure - } -} - } // namespace art diff --git a/runtime/entrypoints/quick/quick_entrypoints.h b/runtime/entrypoints/quick/quick_entrypoints.h index 9d3b8ef..e9964ad 100644 --- a/runtime/entrypoints/quick/quick_entrypoints.h +++ b/runtime/entrypoints/quick/quick_entrypoints.h @@ -48,7 +48,6 @@ struct PACKED(4) QuickEntryPoints { // Cast uint32_t (*pInstanceofNonTrivial)(const mirror::Class*, const mirror::Class*); - void (*pCanPutArrayElement)(void*, void*); void (*pCheckCast)(void*, void*); // DexCache @@ -71,7 +70,10 @@ struct PACKED(4) QuickEntryPoints { void* (*pGetObjInstance)(uint32_t, void*); void* (*pGetObjStatic)(uint32_t); - // FillArray + // Array + void (*pAputObjectWithNullAndBoundCheck)(void*, uint32_t, void*); // array, index, src + void (*pAputObjectWithBoundCheck)(void*, uint32_t, void*); // array, index, src + void (*pAputObject)(void*, uint32_t, void*); // array, index, src void (*pHandleFillArrayData)(void*, void*); // JNI @@ -103,7 +105,7 @@ struct PACKED(4) QuickEntryPoints { int64_t (*pD2l)(double); int64_t (*pF2l)(float); int64_t (*pLdiv)(int64_t, int64_t); - int64_t (*pLdivmod)(int64_t, int64_t); + int64_t (*pLmod)(int64_t, int64_t); int64_t (*pLmul)(int64_t, int64_t); uint64_t (*pShlLong)(uint64_t, uint32_t); uint64_t (*pShrLong)(uint64_t, uint32_t); diff --git a/runtime/entrypoints/quick/quick_math_entrypoints.cc b/runtime/entrypoints/quick/quick_math_entrypoints.cc index 0bfe59d..014aad3 100644 --- a/runtime/entrypoints/quick/quick_math_entrypoints.cc +++ b/runtime/entrypoints/quick/quick_math_entrypoints.cc @@ -62,15 +62,15 @@ int CmplDouble(double a, double b) { return -1; } -extern "C" int64_t artLmulFromCode(int64_t a, int64_t b) { +extern "C" int64_t artLmul(int64_t a, int64_t b) { return a * b; } -extern "C" int64_t artLdivFromCode(int64_t a, int64_t b) { +extern "C" int64_t artLdiv(int64_t a, int64_t b) { return a / b; } -extern "C" int64_t artLdivmodFromCode(int64_t a, int64_t b) { +extern "C" int64_t artLmod(int64_t a, int64_t b) { return a % b; } diff --git a/runtime/entrypoints/quick/quick_throw_entrypoints.cc b/runtime/entrypoints/quick/quick_throw_entrypoints.cc index f67b2fc..31eacac 100644 --- a/runtime/entrypoints/quick/quick_throw_entrypoints.cc +++ b/runtime/entrypoints/quick/quick_throw_entrypoints.cc @@ -15,8 +15,9 @@ */ #include "callee_save_frame.h" +#include "common_throws.h" #include "entrypoints/entrypoint_utils.h" -#include "mirror/object.h" +#include "mirror/object-inl.h" #include "object_utils.h" #include "thread.h" #include "well_known_classes.h" @@ -95,4 +96,21 @@ extern "C" void artThrowNoSuchMethodFromCode(int32_t method_idx, Thread* self, self->QuickDeliverException(); } +extern "C" void artThrowClassCastException(mirror::Class* dest_type, mirror::Class* src_type, + Thread* self, mirror::ArtMethod** sp) + SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + FinishCalleeSaveFrameSetup(self, sp, Runtime::kSaveAll); + CHECK(!dest_type->IsAssignableFrom(src_type)); + ThrowClassCastException(dest_type, src_type); + self->QuickDeliverException(); +} + +extern "C" void artThrowArrayStoreException(mirror::Object* array, mirror::Object* value, + Thread* self, mirror::ArtMethod** sp) + SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + FinishCalleeSaveFrameSetup(self, sp, Runtime::kSaveAll); + ThrowArrayStoreException(value->GetClass(), array->GetClass()); + self->QuickDeliverException(); +} + } // namespace art |