Mercurial > hg > release > icedtea6-1.8
changeset 1839:b227a81ef16c
Added Thumb2 JIT + general tidying up
author | Edward Nevill <ed@camswl.com> |
---|---|
date | Thu, 21 Jan 2010 17:56:18 +0000 |
parents | 8aa81a796b0b |
children | d9e0d17a294a |
files | ChangeLog ports/hotspot/make/linux/makefiles/zeroshark.make ports/hotspot/src/cpu/zero/vm/asm_helper.cpp ports/hotspot/src/cpu/zero/vm/bytecodes_arm.def ports/hotspot/src/cpu/zero/vm/cppInterpreter_arm.S |
diffstat | 5 files changed, 3066 insertions(+), 5634 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Thu Jan 21 16:20:47 2010 +0100 +++ b/ChangeLog Thu Jan 21 17:56:18 2010 +0000 @@ -1,3 +1,12 @@ +2010-01-21 Edward Nevill <ed@camswl.com> + + * zeroshark.make, asm_helper.cpp, bytecodes_arm.def, + cppInterpreter_arm.S, thumb2.cpp (new file) + Added Thumb2 JIT (not build as default - yet) + Removal of, more, hard coded constants + Move 'complex' bytecodes from cppInterpreter_arm.S to asm_helper.cpp + General tidying up of cppInterpreter_arm.S + 2010-01-21 Matthias Klose <doko@ubuntu.com> * Makefile.am: Don't hide errors in statement sequences building
--- a/ports/hotspot/make/linux/makefiles/zeroshark.make Thu Jan 21 16:20:47 2010 +0100 +++ b/ports/hotspot/make/linux/makefiles/zeroshark.make Thu Jan 21 17:56:18 2010 +0000 @@ -29,6 +29,7 @@ Obj_Files += asm_helper.o Obj_Files += cppInterpreter_arm.o +Obj_Files += thumb2.o CFLAGS += -DHOTSPOT_ASM @@ -38,6 +39,7 @@ $(COMPILE.CC) -o $@ $< $(COMPILE_DONE) cppInterpreter_arm.o: offsets_arm.s bytecodes_arm.s +thumb2.o: offsets_arm.s offsets_arm.s: mkoffsets @echo Generating assembler offsets
--- a/ports/hotspot/src/cpu/zero/vm/asm_helper.cpp Thu Jan 21 16:20:47 2010 +0100 +++ b/ports/hotspot/src/cpu/zero/vm/asm_helper.cpp Thu Jan 21 17:56:18 2010 +0000 @@ -16,10 +16,60 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "incls/_precompiled.incl" +#define ARCH_THUMBEE (1<<16) +#define ARCH_VFP (1<<17) +#define ARCH_CLZ (1<<18) #ifndef STATIC_OFFSETS +#include "incls/_bytecodeInterpreter.cpp.incl" + +#include <linux/auxvec.h> +#include <asm/hwcap.h> + +#define VECBUFF_SIZE 64 + +extern "C" unsigned hwcap(void) +{ + int fd; + unsigned vecs[VECBUFF_SIZE]; + unsigned *p; + int i, n; + unsigned rc = 0; + unsigned arch = 4; + + fd = open("/proc/self/auxv", O_RDONLY); + if (fd < 0) return 0; + do { + n = read(fd, vecs, VECBUFF_SIZE * sizeof(unsigned)); + p = vecs; + i = n/8; + while (--i >= 0) { + unsigned tag = *p++; + unsigned value = *p++; + if (tag == 0) goto fini; + if (tag == AT_HWCAP) { + if (value & HWCAP_THUMBEE) rc |= ARCH_THUMBEE; + if (value & HWCAP_VFP) rc |= ARCH_VFP; + } else if (tag == AT_PLATFORM) { + const char *s = (const char *)value; + int c; + + if (*s++ == 'v') { + arch = 0; + while ((isdigit)(c = *s++)) arch = arch * 10 + c - '0'; + } + } + } + } while (n == VECBUFF_SIZE * sizeof(unsigned)); +fini: + close(fd); +// printf("arch = %d, rc = 0x%08x\n", arch, rc); + if (arch >= 5) rc |= ARCH_CLZ; + if (arch >= 7) rc |= ARCH_THUMBEE; + return rc | (1<<arch); +} + /* Thease functions allow the ASM interpreter to call CPP virtual functions. * Otherwise the ASM interpreter has to grup around in the VTABLE which is * not very portable. @@ -44,10 +94,262 @@ return SharedRuntime::generate_class_cast_message(name, klass); } +#define HELPER_THROW(thread, name, msg) Exceptions::_throw_msg(thread, __FILE__, __LINE__, name, msg) + +class VMStructs { +public: + static inline klassOop klass_at_addr(constantPoolOop constants, u2 index) { + return (klassOop) *constants->obj_at_addr(index); + } +}; + +extern "C" oop Helper_new(interpreterState istate, unsigned index) +{ + JavaThread *thread = istate->thread(); + + constantPoolOop constants = istate->method()->constants(); + oop result = NULL; + if (!constants->tag_at(index).is_unresolved_klass()) { + // Make sure klass is initialized and doesn't have a finalizer + oop entry = VMStructs::klass_at_addr(constants, index); + klassOop k_entry = (klassOop) entry; + instanceKlass* ik = (instanceKlass*) k_entry->klass_part(); + if ( ik->is_initialized() && ik->can_be_fastpath_allocated() ) { + size_t obj_size = ik->size_helper(); + // If the TLAB isn't pre-zeroed then we'll have to do it + bool need_zero = !ZeroTLAB; + if (UseTLAB) { + result = (oop) thread->tlab().allocate(obj_size); + } + if (result == NULL) { + need_zero = true; + // Try allocate in shared eden + retry: + HeapWord* compare_to = *Universe::heap()->top_addr(); + HeapWord* new_top = compare_to + obj_size; + if (new_top <= *Universe::heap()->end_addr()) { + if (Atomic::cmpxchg_ptr(new_top, Universe::heap()->top_addr(), compare_to) != compare_to) { + goto retry; + } + result = (oop) compare_to; + } + } + if (result != NULL) { + // Initialize object (if nonzero size and need) and then the header + if (need_zero ) { + HeapWord* to_zero = (HeapWord*) result + sizeof(oopDesc) / oopSize; + obj_size -= sizeof(oopDesc) / oopSize; + if (obj_size > 0 ) { + memset(to_zero, 0, obj_size * HeapWordSize); + } + } + if (UseBiasedLocking) { + result->set_mark(ik->prototype_header()); + } else { + result->set_mark(markOopDesc::prototype()); + } + result->set_klass_gap(0); + result->set_klass(k_entry); + return result; + } + } + } + // Slow case allocation + InterpreterRuntime::_new(thread, istate->method()->constants(), index); + result = thread->vm_result(); + thread->set_vm_result(NULL); + return result; +} + +extern "C" int Helper_instanceof(interpreterState istate, unsigned index, oop tos) +{ + if (tos == NULL) return 0; + + // Constant pool may have actual klass or unresolved klass. If it is + // unresolved we must resolve it + if (istate->method()->constants()->tag_at(index).is_unresolved_klass()) { + InterpreterRuntime::quicken_io_cc(istate->thread()); + if (istate->thread()->has_pending_exception()) return 0; + } + klassOop klassOf = VMStructs::klass_at_addr(istate->method()->constants(), index); + klassOop objKlassOop = tos->klass(); + // + // Check for compatibilty. This check must not GC!! + // Seems way more expensive now that we must dispatch + // + return objKlassOop == klassOf || objKlassOop->klass_part()->is_subtype_of(klassOf); +} + +extern "C" oop Helper_checkcast(interpreterState istate, unsigned index, oop tos) +{ + if (tos == NULL) return NULL; + + // Constant pool may have actual klass or unresolved klass. If it is + // unresolved we must resolve it + if (istate->method()->constants()->tag_at(index).is_unresolved_klass()) { + oop except_oop; + InterpreterRuntime::quicken_io_cc(istate->thread()); + if (except_oop = istate->thread()->pending_exception()) return except_oop; + } + klassOop klassOf = VMStructs::klass_at_addr(istate->method()->constants(), index); + klassOop objKlassOop = tos->klass(); //ebx + // + // Check for compatibilty. This check must not GC!! + // Seems way more expensive now that we must dispatch + // + if (objKlassOop != klassOf && !objKlassOop->klass_part()->is_subtype_of(klassOf)) { + ResourceMark rm(istate->thread()); + const char* objName = Klass::cast(objKlassOop)->external_name(); + const char* klassName = Klass::cast(klassOf)->external_name(); + char* message = SharedRuntime::generate_class_cast_message(objName, klassName); + ThreadInVMfromJava trans(istate->thread()); + HELPER_THROW(istate->thread(), vmSymbols::java_lang_ClassCastException(), message); + } + return istate->thread()->pending_exception(); +} + +extern "C" oop Helper_aastore(interpreterState istate, oop value, int index, arrayOop arrayref) +{ + if (arrayref == NULL) { + ThreadInVMfromJava trans(istate->thread()); + HELPER_THROW(istate->thread(), vmSymbols::java_lang_NullPointerException(), ""); + } else if ((uint32_t)index >= (uint32_t)arrayref->length()) { + char message[jintAsStringSize]; + sprintf(message, "%d", index); + HELPER_THROW(istate->thread(), vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), message); + } else { + if (value != NULL) { + /* Check assignability of value into arrayref */ + klassOop rhsKlassOop = value->klass(); // EBX (subclass) + klassOop elemKlassOop = ((objArrayKlass*) arrayref->klass()->klass_part())->element_klass(); + // + // Check for compatibilty. This check must not GC!! + // Seems way more expensive now that we must dispatch + // + if (rhsKlassOop != elemKlassOop && !rhsKlassOop->klass_part()->is_subtype_of(elemKlassOop)) { + HELPER_THROW(istate->thread(), vmSymbols::java_lang_ArrayStoreException(), ""); + goto handle_exception; + } + } + oop* elem_loc = (oop*)(((address) arrayref->base(T_OBJECT)) + index * sizeof(oop)); + // *(oop*)(((address) arrayref->base(T_OBJECT)) + index * sizeof(oop)) = value; + *elem_loc = value; + // Mark the card + BarrierSet* bs = Universe::heap()->barrier_set(); + static volatile jbyte* _byte_map_base = (volatile jbyte*)(((CardTableModRefBS*)bs)->byte_map_base); + OrderAccess::release_store(&_byte_map_base[(uintptr_t)elem_loc >> CardTableModRefBS::card_shift], 0); + } +handle_exception: + return istate->thread()->pending_exception(); +} + +extern "C" void Helper_aputfield(oop obj) +{ + BarrierSet* bs = Universe::heap()->barrier_set(); + static volatile jbyte* _byte_map_base = (volatile jbyte*)(((CardTableModRefBS*)bs)->byte_map_base); + OrderAccess::release_store(&_byte_map_base[(uintptr_t)obj >> CardTableModRefBS::card_shift], 0); +} + +extern "C" oop Helper_synchronized_enter(JavaThread *thread, BasicObjectLock *mon) +{ + BasicLock *lock = mon->lock(); + markOop displaced = lock->displaced_header(); + + if (thread->is_lock_owned((address)displaced->clear_lock_bits())) + lock->set_displaced_header(NULL); + else + InterpreterRuntime::monitorenter(thread, mon); + return thread->pending_exception(); +} + +extern "C" oop Helper_synchronized_exit(JavaThread *thread, BasicObjectLock *mon) +{ + { + HandleMark __hm(thread); + if (mon->obj() == NULL) + InterpreterRuntime::throw_illegal_monitor_state_exception(thread); + else + InterpreterRuntime::monitorexit(thread, mon); + } + return thread->pending_exception(); +} + +extern "C" oop Helper_SafePoint(JavaThread *thread) +{ + { + HandleMarkCleaner __hmc(thread); + } + SafepointSynchronize::block(thread); + return thread->pending_exception(); +} + +extern "C" void Helper_RaiseArrayBoundException(JavaThread *thread, int index) +{ + char message[jintAsStringSize]; + sprintf(message, "%d", index); + { + ThreadInVMfromJava trans(thread); + Exceptions::_throw_msg(thread, "[Bytecoce Interpreter]", 99, + vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), message); + } +} + +extern "C" void Helper_Raise(JavaThread *thread, symbolOopDesc *name, char const *msg) +{ + ThreadInVMfromJava trans(thread); + Exceptions::_throw_msg(thread, "[Bytecoce Interpreter]", 99, name, msg); +} + +extern "C" void Helper_RaiseIllegalMonitorException(JavaThread *thread) +{ + HandleMark __hm(thread); + InterpreterRuntime::throw_illegal_monitor_state_exception(thread); +} + +extern "C" address Helper_HandleException(interpreterState istate, JavaThread *thread) +{ + HandleMarkCleaner __hmc(thread); + Handle except_oop(thread, thread->pending_exception()); + HandleMark __hm(thread); + intptr_t continuation_bci; + intptr_t *topOfStack; + address pc; + + thread->clear_pending_exception(); + continuation_bci = (intptr_t)InterpreterRuntime::exception_handler_for_exception(thread, except_oop()); + except_oop = (oop) thread->vm_result(); + thread->set_vm_result(NULL); + if (continuation_bci >= 0) { + topOfStack = (intptr_t *)istate->stack(); + *topOfStack-- = (intptr_t)except_oop(); + istate->set_stack(topOfStack); + pc = istate->method()->code_base() + continuation_bci; +#if 0 + tty->print_cr("Exception <%s> (" INTPTR_FORMAT ")", Klass::cast(except_oop->klass())->external_name(), except_oop()); + tty->print_cr(" thrown in interpreter method <%s>", istate->method()->name_and_sig_as_C_string()); + tty->print_cr(" at bci %d, continuing at %d for thread " INTPTR_FORMAT, + pc - (intptr_t)istate->method()->code_base(), + continuation_bci, thread); +#endif + return pc; + } +#if 0 + tty->print_cr("Exception <%s> (" INTPTR_FORMAT ")", Klass::cast(except_oop->klass())->external_name(), except_oop()); + tty->print_cr(" thrown in interpreter method <%s>", istate->method()->name_and_sig_as_C_string()); + tty->print_cr(" at bci %d, unwinding for thread " INTPTR_FORMAT, + pc - (intptr_t) istate->method()->code_base(), + thread); +#endif + thread->set_pending_exception(except_oop(), NULL, 0); + return 0; +} + #endif // STATIC_OFFSETS #ifdef STATIC_OFFSETS +#include "incls/_precompiled.incl" + class VMStructs { public: static void print_vm_offsets(void); @@ -57,6 +359,7 @@ void print_def(const char *s, int v) { + fprintf(outfile, "#undef %-40s\n", s); fprintf(outfile, "#define %-40s 0x%02x\n", s, v); } @@ -65,80 +368,115 @@ fputc('\n', outfile); } +// ZeroFrame is not friends with VMStructs, but it is with ZeroStackPrinter +class ZeroStackPrinter { +public: + static void print_vm_offsets(void); +}; + +void ZeroStackPrinter::print_vm_offsets(void) +{ + print_def("INTERPRETER_FRAME", ZeroFrame::INTERPRETER_FRAME); +} + void VMStructs::print_vm_offsets(void) { - print_def("THREAD_PENDING_EXC", offset_of(JavaThread, _pending_exception)); - print_def("THREAD_SUSPEND_FLAGS", offset_of(JavaThread, _suspend_flags)); - print_def("THREAD_ACTIVE_HANDLES", offset_of(JavaThread, _active_handles)); - print_def("THREAD_LAST_HANDLE_MARK", offset_of(JavaThread, _last_handle_mark)); - print_def("THREAD_TLAB_TOP", offset_of(JavaThread, _tlab) + offset_of(ThreadLocalAllocBuffer, _top)); - print_def("THREAD_TLAB_END", offset_of(JavaThread, _tlab) + offset_of(ThreadLocalAllocBuffer, _end)); - print_def("THREAD_RESOURCEAREA", offset_of(JavaThread, _resource_area)); - print_def("THREAD_HANDLE_AREA", offset_of(JavaThread, _handle_area)); - print_def("THREAD_STACK_BASE", offset_of(JavaThread, _stack_base)); - print_def("THREAD_STACK_SIZE", offset_of(JavaThread, _stack_size)); - print_def("THREAD_LAST_JAVA_SP", offset_of(JavaThread, _anchor) + offset_of(JavaFrameAnchor, _last_Java_sp)); - print_def("THREAD_JNI_ENVIRONMENT", offset_of(JavaThread, _jni_environment)); - print_def("THREAD_VM_RESULT", offset_of(JavaThread, _vm_result)); - print_def("THREAD_STATE", offset_of(JavaThread, _thread_state)); - print_def("THREAD_DO_NOT_UNLOCK", offset_of(JavaThread, _do_not_unlock_if_synchronized)); + print_def("ISTATE_THREAD", offset_of(BytecodeInterpreter, _thread)); + print_def("ISTATE_BCP", offset_of(BytecodeInterpreter, _bcp)); + print_def("ISTATE_LOCALS", offset_of(BytecodeInterpreter, _locals)); + print_def("ISTATE_CONSTANTS", offset_of(BytecodeInterpreter, _constants)); + print_def("ISTATE_METHOD", offset_of(BytecodeInterpreter, _method)); + print_def("ISTATE_STACK", offset_of(BytecodeInterpreter, _stack)); + print_def("ISTATE_MSG", offset_of(BytecodeInterpreter, _msg)); + print_def("ISTATE_OOP_TEMP", offset_of(BytecodeInterpreter, _oop_temp)); + print_def("ISTATE_STACK_BASE",offset_of(BytecodeInterpreter, _stack_base)); + print_def("ISTATE_STACK_LIMIT",offset_of(BytecodeInterpreter, _stack_limit)); + print_def("ISTATE_MONITOR_BASE",offset_of(BytecodeInterpreter, _monitor_base)); + print_def("ISTATE_SELF_LINK", offset_of(BytecodeInterpreter, _self_link)); + print_def("ISTATE_FRAME_TYPE", sizeof(BytecodeInterpreter) + 0); + print_def("ISTATE_NEXT_FRAME", sizeof(BytecodeInterpreter) + 4); + print_def("FRAME_SIZE", sizeof(BytecodeInterpreter) + 8); + nl(); + ZeroStackPrinter::print_vm_offsets(); + nl(); + print_def("THREAD_PENDING_EXC", offset_of(JavaThread, _pending_exception)); + print_def("THREAD_SUSPEND_FLAGS", offset_of(JavaThread, _suspend_flags)); + print_def("THREAD_ACTIVE_HANDLES", offset_of(JavaThread, _active_handles)); + print_def("THREAD_LAST_HANDLE_MARK", offset_of(JavaThread, _last_handle_mark)); + print_def("THREAD_TLAB_TOP", offset_of(JavaThread, _tlab) + offset_of(ThreadLocalAllocBuffer, _top)); + print_def("THREAD_TLAB_END", offset_of(JavaThread, _tlab) + offset_of(ThreadLocalAllocBuffer, _end)); + print_def("THREAD_RESOURCEAREA", offset_of(JavaThread, _resource_area)); + print_def("THREAD_HANDLE_AREA", offset_of(JavaThread, _handle_area)); + print_def("THREAD_STACK_BASE", offset_of(JavaThread, _stack_base)); + print_def("THREAD_STACK_SIZE", offset_of(JavaThread, _stack_size)); + print_def("THREAD_LAST_JAVA_SP", offset_of(JavaThread, _anchor) + offset_of(JavaFrameAnchor, _last_Java_sp)); + print_def("THREAD_JNI_ENVIRONMENT", offset_of(JavaThread, _jni_environment)); + print_def("THREAD_VM_RESULT", offset_of(JavaThread, _vm_result)); + print_def("THREAD_STATE", offset_of(JavaThread, _thread_state)); + print_def("THREAD_DO_NOT_UNLOCK", offset_of(JavaThread, _do_not_unlock_if_synchronized)); - print_def("THREAD_JAVA_STACK_BASE", offset_of(JavaThread, _zero_stack) + in_bytes(ZeroStack::base_offset())); - print_def("THREAD_JAVA_SP", offset_of(JavaThread, _zero_stack) + in_bytes(ZeroStack::sp_offset())); - print_def("THREAD_TOP_ZERO_FRAME", offset_of(JavaThread, _top_zero_frame)); - print_def("THREAD_SPECIALRUNTIMEEXITCONDITION", offset_of(JavaThread, _special_runtime_exit_condition)); - nl(); - print_def("_thread_external_suspend", Thread::_external_suspend); - print_def("_thread_ext_suspended", Thread::_ext_suspended); - print_def("_thread_deopt_suspend", Thread::_deopt_suspend); - nl(); - print_def("METHOD_CONSTMETHOD", offset_of(methodOopDesc, _constMethod)); - print_def("METHOD_CONSTANTS", offset_of(methodOopDesc, _constants)); - print_def("METHOD_METHODDATA", offset_of(methodOopDesc, _method_data)); - print_def("METHOD_INVOKECOUNT", offset_of(methodOopDesc, _interpreter_invocation_count)); - print_def("METHOD_ACCESSFLAGS", offset_of(methodOopDesc, _access_flags)); - print_def("METHOD_VTABLEINDEX", offset_of(methodOopDesc, _vtable_index)); - print_def("METHOD_RESULTINDEX", offset_of(methodOopDesc, _result_index)); - print_def("METHOD_METHODSIZE", offset_of(methodOopDesc, _method_size)); - print_def("METHOD_MAXSTACK", offset_of(methodOopDesc, _max_stack)); - print_def("METHOD_MAXLOCALS", offset_of(methodOopDesc, _max_locals)); - print_def("METHOD_SIZEOFPARAMETERS", offset_of(methodOopDesc, _size_of_parameters)); - print_def("METHOD_INVOCATIONCOUNTER", offset_of(methodOopDesc, _invocation_counter)); - print_def("METHOD_BACKEDGECOUNTER", offset_of(methodOopDesc, _backedge_counter)); - print_def("METHOD_FROM_INTERPRETED", offset_of(methodOopDesc, _from_interpreted_entry)); - // ECN: These two appear to be just tagged onto the end of the class - print_def("METHOD_NATIVEHANDLER", sizeof(methodOopDesc)); - print_def("METHOD_SIGNATUREHANDLER", sizeof(methodOopDesc)+4); - nl(); - print_def("CONSTMETHOD_CODESIZE", offset_of(constMethodOopDesc, _code_size)); - print_def("CONSTMETHOD_CODEOFFSET", sizeof(constMethodOopDesc)); - nl(); - print_def("JNIHANDLEBLOCK_TOP", offset_of(JNIHandleBlock, _top)); - nl(); - print_def("KLASS_PART", klassOopDesc::klass_part_offset_in_bytes()); - print_def("KLASS_ACCESSFLAGS", offset_of(Klass, _access_flags)); - print_def("INSTANCEKLASS_INITSTATE", offset_of(instanceKlass, _init_state)); - print_def("INSTANCEKLASS_VTABLE_LEN", offset_of(instanceKlass, _vtable_len)); - print_def("INSTANCEKLASS_ITABLE_LEN", offset_of(instanceKlass, _itable_len)); - print_def("INSTANCEKLASS_VTABLE_OFFSET", instanceKlass::vtable_start_offset() * sizeof(int *)); - print_def("OBJARRAYKLASS_ELEMENTKLASS", offset_of(objArrayKlass, _element_klass)); - nl(); - print_def("CONSTANTPOOL_TAGS", offset_of(constantPoolOopDesc, _tags)); - print_def("CONSTANTPOOL_CACHE", offset_of(constantPoolOopDesc, _cache)); - print_def("CONSTANTPOOL_BASE", sizeof(constantPoolOopDesc)); - nl(); - print_def("CP_OFFSET", in_bytes(constantPoolCacheOopDesc::base_offset())); - nl(); - print_def("BASE_OFFSET_BYTE", arrayOopDesc::base_offset_in_bytes(T_BYTE)); - print_def("BASE_OFFSET_SHORT", arrayOopDesc::base_offset_in_bytes(T_SHORT)); - print_def("BASE_OFFSET_WORD", arrayOopDesc::base_offset_in_bytes(T_INT)); - print_def("BASE_OFFSET_LONG", arrayOopDesc::base_offset_in_bytes(T_LONG)); - nl(); - print_def("SIZEOF_HANDLEMARK", sizeof(HandleMark)); + print_def("THREAD_JAVA_STACK_BASE", offset_of(JavaThread, _zero_stack) + in_bytes(ZeroStack::base_offset())); + print_def("THREAD_JAVA_SP", offset_of(JavaThread, _zero_stack) + in_bytes(ZeroStack::sp_offset())); + print_def("THREAD_TOP_ZERO_FRAME", offset_of(JavaThread, _top_zero_frame)); + print_def("THREAD_SPECIALRUNTIMEEXITCONDITION", offset_of(JavaThread, _special_runtime_exit_condition)); + nl(); + print_def("_thread_external_suspend", Thread::_external_suspend); + print_def("_thread_ext_suspended", Thread::_ext_suspended); + print_def("_thread_deopt_suspend", Thread::_deopt_suspend); + nl(); + print_def("METHOD_CONSTMETHOD", offset_of(methodOopDesc, _constMethod)); + print_def("METHOD_CONSTANTS", offset_of(methodOopDesc, _constants)); + print_def("METHOD_METHODDATA", offset_of(methodOopDesc, _method_data)); + print_def("METHOD_INVOKECOUNT", offset_of(methodOopDesc, _interpreter_invocation_count)); + print_def("METHOD_ACCESSFLAGS", offset_of(methodOopDesc, _access_flags)); + print_def("METHOD_VTABLEINDEX", offset_of(methodOopDesc, _vtable_index)); + print_def("METHOD_RESULTINDEX", offset_of(methodOopDesc, _result_index)); + print_def("METHOD_METHODSIZE", offset_of(methodOopDesc, _method_size)); + print_def("METHOD_MAXSTACK", offset_of(methodOopDesc, _max_stack)); + print_def("METHOD_MAXLOCALS", offset_of(methodOopDesc, _max_locals)); + print_def("METHOD_SIZEOFPARAMETERS", offset_of(methodOopDesc, _size_of_parameters)); + print_def("METHOD_INVOCATIONCOUNTER", offset_of(methodOopDesc, _invocation_counter)); + print_def("METHOD_BACKEDGECOUNTER", offset_of(methodOopDesc, _backedge_counter)); + print_def("METHOD_FROM_INTERPRETED", offset_of(methodOopDesc, _from_interpreted_entry)); + // ECN: These two appear to be just tagged onto the end of the class + print_def("METHOD_NATIVEHANDLER", sizeof(methodOopDesc)); + print_def("METHOD_SIGNATUREHANDLER", sizeof(methodOopDesc)+4); + nl(); + print_def("CONSTMETHOD_CODESIZE", offset_of(constMethodOopDesc, _code_size)); + print_def("CONSTMETHOD_CODEOFFSET", sizeof(constMethodOopDesc)); + nl(); + print_def("JNIHANDLEBLOCK_TOP", offset_of(JNIHandleBlock, _top)); + nl(); + print_def("KLASS_PART", klassOopDesc::klass_part_offset_in_bytes()); + print_def("KLASS_ACCESSFLAGS", offset_of(Klass, _access_flags)); + print_def("KLASS_JAVA_MIRROR", offset_of(Klass, _java_mirror)); + print_def("INSTANCEKLASS_INITSTATE", offset_of(instanceKlass, _init_state)); + print_def("INSTANCEKLASS_VTABLE_LEN", offset_of(instanceKlass, _vtable_len)); + print_def("INSTANCEKLASS_ITABLE_LEN", offset_of(instanceKlass, _itable_len)); + print_def("INSTANCEKLASS_VTABLE_OFFSET", instanceKlass::vtable_start_offset() * sizeof(int *)); + print_def("OBJARRAYKLASS_ELEMENTKLASS", offset_of(objArrayKlass, _element_klass)); + nl(); + print_def("CONSTANTPOOL_TAGS", offset_of(constantPoolOopDesc, _tags)); + print_def("CONSTANTPOOL_CACHE", offset_of(constantPoolOopDesc, _cache)); + print_def("CONSTANTPOOL_POOL_HOLDER", offset_of(constantPoolOopDesc, _pool_holder)); + print_def("CONSTANTPOOL_BASE", sizeof(constantPoolOopDesc)); + nl(); + print_def("CP_OFFSET", in_bytes(constantPoolCacheOopDesc::base_offset())); + nl(); + print_def("BASE_OFFSET_BYTE", arrayOopDesc::base_offset_in_bytes(T_BYTE)); + print_def("BASE_OFFSET_SHORT", arrayOopDesc::base_offset_in_bytes(T_SHORT)); + print_def("BASE_OFFSET_WORD", arrayOopDesc::base_offset_in_bytes(T_INT)); + print_def("BASE_OFFSET_LONG", arrayOopDesc::base_offset_in_bytes(T_LONG)); + nl(); + print_def("SIZEOF_HANDLEMARK", sizeof(HandleMark)); } int main(void) { + print_def("ARCH_VFP", ARCH_VFP); + print_def("ARCH_THUMBEE", ARCH_THUMBEE); + print_def("ARCH_CLZ", ARCH_CLZ); + nl(); print_def("JVM_CONSTANT_Utf8", JVM_CONSTANT_Utf8); print_def("JVM_CONSTANT_Unicode", JVM_CONSTANT_Unicode); print_def("JVM_CONSTANT_Integer", JVM_CONSTANT_Integer); @@ -190,6 +528,15 @@ print_def("T_ARRAY", T_ARRAY); print_def("T_VOID", T_VOID); nl(); + print_def("tos_btos", btos); + print_def("tos_ctos", ctos); + print_def("tos_stos", stos); + print_def("tos_itos", itos); + print_def("tos_ltos", ltos); + print_def("tos_ftos", ftos); + print_def("tos_dtos", dtos); + print_def("tos_atos", atos); + nl(); print_def("_thread_uninitialized", _thread_uninitialized); print_def("_thread_new", _thread_new); print_def("_thread_new_trans", _thread_new_trans);
--- a/ports/hotspot/src/cpu/zero/vm/bytecodes_arm.def Thu Jan 21 16:20:47 2010 +0100 +++ b/ports/hotspot/src/cpu/zero/vm/bytecodes_arm.def Thu Jan 21 17:56:18 2010 +0000 @@ -267,8 +267,6 @@ @return_register_finalizer = 0xe5, 1 -dmac = 0xe6, 2 - iload_0_iconst_N = 0xe7, 2 iload_1_iconst_N = 0xe8, 2 iload_2_iconst_N = 0xe9, 2 @@ -967,7 +965,7 @@ } (frem) frem { -@ ECN: It must be possible to do better than this +@ It must be possible to do better than this POP r0 bl __aeabi_f2d PUSH r0, r1 @@ -1336,166 +1334,138 @@ @ r2 = [jpc, #1] @ r1 = [jpc, #2] (ifeq,ifnull) ifeq_unsafe { + POP r3 ldrb r1, [jpc, #2] - POP r3 - mov r2, r2, lsl #24 cmp r3, #0 + beq 1f + DISPATCH 3 +1: + mov r2, r2, lsl #24 orr ip, r1, r2, asr #16 - beq 1f - mov ip, #3 -1: ldrb r0, [jpc, ip]! DISPATCH_BYTECODE } (ifne,ifnonnull) ifne_unsafe { + POP r3 ldrb r1, [jpc, #2] - POP r3 - mov r2, r2, lsl #24 cmp r3, #0 + bne 1f + DISPATCH 3 +1: + mov r2, r2, lsl #24 orr ip, r1, r2, asr #16 - bne 1f - mov ip, #3 -1: ldrb r0, [jpc, ip]! DISPATCH_BYTECODE } (iflt) iflt_unsafe { + POP r3 ldrb r1, [jpc, #2] - POP r3 - mov r2, r2, lsl #24 cmp r3, #0 + blt 1f + DISPATCH 3 +1: + mov r2, r2, lsl #24 orr ip, r1, r2, asr #16 - blt 1f - mov ip, #3 -1: ldrb r0, [jpc, ip]! DISPATCH_BYTECODE } (ifge) ifge_unsafe { + POP r3 ldrb r1, [jpc, #2] - POP r3 - mov r2, r2, lsl #24 cmp r3, #0 + bge 1f + DISPATCH 3 +1: + mov r2, r2, lsl #24 orr ip, r1, r2, asr #16 - bge 1f - mov ip, #3 -1: ldrb r0, [jpc, ip]! DISPATCH_BYTECODE } (ifgt) ifgt_unsafe { + POP r3 ldrb r1, [jpc, #2] - POP r3 - mov r2, r2, lsl #24 cmp r3, #0 + bgt 1f + DISPATCH 3 +1: + mov r2, r2, lsl #24 orr ip, r1, r2, asr #16 - bgt 1f - mov ip, #3 -1: ldrb r0, [jpc, ip]! DISPATCH_BYTECODE } (ifle) ifle_unsafe { + POP r3 ldrb r1, [jpc, #2] - POP r3 - mov r2, r2, lsl #24 cmp r3, #0 + ble 1f + DISPATCH 3 +1: + mov r2, r2, lsl #24 orr ip, r1, r2, asr #16 - ble 1f - mov ip, #3 -1: ldrb r0, [jpc, ip]! DISPATCH_BYTECODE } (if_icmpeq,if_acmpeq) if_icmpeq_unsafe { + POP r3, tmp1 ldrb r1, [jpc, #2] - POP r3, tmp1 - mov r2, r2, lsl #24 cmp tmp1, r3 - orr ip, r1, r2, asr #16 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + beq branch_taken_unsafe + DISPATCH 3 } (if_icmpne,if_acmpne) if_icmpne_unsafe { + POP r3, tmp1 ldrb r1, [jpc, #2] - POP r3, tmp1 - mov r2, r2, lsl #24 cmp tmp1, r3 - orr ip, r1, r2, asr #16 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bne branch_taken_unsafe + DISPATCH 3 } (if_icmplt) if_icmplt_unsafe { + POP r3, tmp1 ldrb r1, [jpc, #2] - POP r3, tmp1 - mov r2, r2, lsl #24 cmp tmp1, r3 - orr ip, r1, r2, asr #16 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + blt branch_taken_unsafe + DISPATCH 3 } (if_icmpge) if_icmpge_unsafe { + POP r3, tmp1 ldrb r1, [jpc, #2] - POP r3, tmp1 - mov r2, r2, lsl #24 cmp tmp1, r3 - orr ip, r1, r2, asr #16 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bge branch_taken_unsafe + DISPATCH 3 } (if_icmpgt) if_icmpgt_unsafe { + POP r3, tmp1 ldrb r1, [jpc, #2] - POP r3, tmp1 - mov r2, r2, lsl #24 cmp tmp1, r3 - orr ip, r1, r2, asr #16 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bgt branch_taken_unsafe + DISPATCH 3 } (if_icmple) if_icmple_unsafe { + POP r3, tmp1 ldrb r1, [jpc, #2] - POP r3, tmp1 - mov r2, r2, lsl #24 cmp tmp1, r3 - orr ip, r1, r2, asr #16 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + ble branch_taken_unsafe + DISPATCH 3 } (goto) goto_unsafe { ldrb r1, [jpc, #2] mov r2, r2, lsl #24 - orr ip, r1, r2, asr #16 - DISPATCH_START_REG ip + orr tmp1, r1, r2, asr #16 + DISPATCH_START_REG tmp1 + USEC cmp tmp1, #0 + USEC ble do_backedge DISPATCH_BYTECODE } @@ -1520,7 +1490,7 @@ DISPATCH 48 } -@ ECN: We dont do safe and unsafe versions of tableswitch and lookupswitch +@ We dont do safe and unsafe versions of tableswitch and lookupswitch (tableswitch) tableswitch { POP a2 bic a1, jpc, #3 @@ -1752,28 +1722,17 @@ (aputfield) aputfield { ldrb r1, [jpc, #2] - GET_STACK 1, r0 @ r0 = object - POP oop_value_tmp @ r1 = value - add r3, constpool, r1, lsl #12 - add r3, r3, r2, lsl #4 - ldr r3, [r3, #CP_OFFSET+8] - SW_NPC cmp r0, #0 - add oop_address_tmp, r0, r3 - SW_NPC beq null_ptr_exception + POP r3, tmp1 @ r3 = value, tmp1 = object + add tmp2, constpool, r1, lsl #12 + add tmp2, tmp2, r2, lsl #4 + SW_NPC cmp tmp1, #0 + SW_NPC beq null_ptr_exception_jpc_3 + ldr tmp2, [tmp2, #CP_OFFSET+8] .abortentry113: - HW_NPC ldr ip, [r0] @ Only to provoke an abort - bl oop_store - ldr r3, [dispatch, #Universe_collectedHeap_Address-XXX] - DISPATCH_START 3 - POP r2 - ldr r3, [r3, #0] - DISPATCH_NEXT - ldr r3, [r3, #12] - DISPATCH_NEXT - ldr r3, [r3, #76] - mov tmp2, #0 - strb tmp2, [r3, r2, lsr #9] - DISPATCH_FINISH + str r3, [tmp1, tmp2] + mov r0, tmp1 + bl Helper_aputfield + DISPATCH 3 } (lputfield) lputfield { @@ -1862,29 +1821,11 @@ add r1, r2, #4 str r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - ldr ip, [istate, #ISTATE_ADVANCE_PC] - ldr istate, [istate, #ISTATE_NEXT_FRAME] add stack, r1, r0, lsl #2 - cmp ip, #0 - beq normal_return - - sub istate, istate, #ISTATE_NEXT_FRAME - - CACHE_JPC - ldr r2, [istate, #ISTATE_STACK_LIMIT] - DISPATCH_START_REG ip - sub stack, stack, #4 - ldr r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - DISPATCH_NEXT - add r2, r2, #4 - DISPATCH_NEXT - str r2, [tmp_xxx, #THREAD_JAVA_SP] - DISPATCH_NEXT - str r3, [tmp_xxx, #THREAD_LAST_JAVA_SP] - CACHE_CP - CACHE_LOCALS - DISPATCH_NEXT - DISPATCH_FINISH + + str stack, [tmp_xxx, #THREAD_JAVA_SP] + + ldmfd arm_sp!, {fast_regset, pc} 1: bl return_check_monitors b 2b @@ -1909,30 +1850,12 @@ ldr r3, [stack, #0] ldrh r0, [r0, #40] - ldr ip, [istate, #ISTATE_ADVANCE_PC] - ldr istate, [istate, #ISTATE_NEXT_FRAME] str r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] str r1, [stack, r0, lsl #2]! - cmp ip, #0 - beq normal_return - - sub istate, istate, #ISTATE_NEXT_FRAME - - CACHE_JPC - ldr r2, [istate, #ISTATE_STACK_LIMIT] - DISPATCH_START_REG ip - sub stack, stack, #4 - ldr r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - DISPATCH_NEXT @ ldrb r1, [jpc, #2] - add r2, r2, #4 - DISPATCH_NEXT @ ldr ip, [dispatch, r0, lsl #2] - str r2, [tmp_xxx, #THREAD_JAVA_SP] - DISPATCH_NEXT @ ldrb r2, [jpc, #1] - str r3, [tmp_xxx, #THREAD_LAST_JAVA_SP] - CACHE_CP - CACHE_LOCALS - DISPATCH_NEXT @ ands lr, ip, lr - DISPATCH_FINISH + + str stack, [tmp_xxx, #THREAD_JAVA_SP] + + ldmfd arm_sp!, {fast_regset, pc} 1: bl return_check_monitors b 2b @@ -1956,33 +1879,14 @@ add r1, r2, #4 str r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - ldr ip, [istate, #ISTATE_ADVANCE_PC] - ldr istate, [istate, #ISTATE_NEXT_FRAME] - POP r2, r3 add stack, r1, r0, lsl #2 stmdb stack!, {r2, r3} - cmp ip, #0 - beq normal_return - - sub istate, istate, #ISTATE_NEXT_FRAME - - CACHE_JPC - ldr r2, [istate, #ISTATE_STACK_LIMIT] - DISPATCH_START_REG ip - sub stack, stack, #4 - ldr r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - DISPATCH_NEXT - add r2, r2, #4 - DISPATCH_NEXT - str r2, [tmp_xxx, #THREAD_JAVA_SP] - DISPATCH_NEXT - str r3, [tmp_xxx, #THREAD_LAST_JAVA_SP] - CACHE_CP - CACHE_LOCALS - DISPATCH_NEXT - DISPATCH_FINISH + + str stack, [tmp_xxx, #THREAD_JAVA_SP] + + ldmfd arm_sp!, {fast_regset, pc} 1: bl return_check_monitors b 2b @@ -2032,12 +1936,10 @@ mov r1, #0 bl _ZN18InterpreterRuntime3ldcEP10JavaThreadb ldr r0, [istate, #ISTATE_THREAD] @ thread - ASSERT_STACK_CACHED CACHE_CP ldr r1, [r0, #THREAD_PENDING_EXC] CACHE_JPC cmp r1, #0 - ASSERT_LOCALS_CACHED bne handle_exception ldr r3, [r0, #THREAD_VM_RESULT] mov r2, #0 @@ -2089,8 +1991,6 @@ DECACHE_STACK mov r1, #1 bl _ZN18InterpreterRuntime3ldcEP10JavaThreadb - ASSERT_STACK_CACHED - ASSERT_LOCALS_CACHED ldr r0, [istate, #ISTATE_THREAD] @ thread CACHE_CP ldr r1, [r0, #THREAD_PENDING_EXC] @@ -2455,10 +2355,7 @@ } (dmul) dmul_vfp { - FBC cmp r2, #opc_dadd DISPATCH_START_R2 - FBC beq 1f -2: vldr d7, [stack, #12] vldr d6, [stack, #4] DISPATCH_NEXT @@ -2469,30 +2366,7 @@ vstr d0, [stack, #12] add stack, stack, #8 DISPATCH_FINISH -1: - FBC mov r2, #opc_dmac - FBC strb r2, [jpc, #-1] - FBC b 2b -} - -#ifdef FAST_BYTECODES - -(dmac) dmac_vfp { - DISPATCH_START \seq_len - vldr d2, [stack, #20] - vldr d1, [stack, #12] - vldr d0, [stack, #4] - DISPATCH_NEXT - DISPATCH_NEXT - fmacd d2, d1, d0 - DISPATCH_NEXT - DISPATCH_NEXT - vstr d2, [stack, #20] - add stack, stack, #16 - DISPATCH_FINISH -} - -#endif // FAST_BYTECODES +} (fdiv) fdiv_vfp { DISPATCH_START_R2 @@ -2623,10 +2497,10 @@ #ifdef FAST_BYTECODES @############################################################################## -@ ECN: Optimised bytecode pairs +@ Optimised bytecode pairs @############################################################################## -@ --- ECN: load; iaccess ------------------------------------------------------ +@ --- load; iaccess ------------------------------------------------------ (iload_0,iload_1,iload_2,iload_3) (iaccess_0,iaccess_1,iaccess_2,iaccess_3) @@ -2680,7 +2554,7 @@ DISPATCH_FINISH } -@ --- ECN: load; load --------------------------------------------------------- +@ --- load; load --------------------------------------------------------- (aload_0,aload_1,aload_2,aload_3) (aload_0,aload_1,aload_2,aload_3) @@ -2875,7 +2749,7 @@ DISPATCH_FINISH } -@ --- ECN: load; store -------------------------------------------------------- +@ --- load; store -------------------------------------------------------- (aload_0,aload_1,aload_2,aload_3) (astore_0,astore_1,astore_2,astore_3) @@ -2986,7 +2860,7 @@ DISPATCH_FINISH } -@ --- ECN: load; const ------------------------------------------------------- +@ --- load; const ------------------------------------------------------- (aload_0,aload_1,aload_2,aload_3) (iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5) @@ -3109,7 +2983,7 @@ DISPATCH_FINISH } -@ --- ECN: load; Xaload ------------------------------------------------------- +@ --- load; Xaload ------------------------------------------------------- (iload_0,iload_1,iload_2,iload_3) (iaload,aaload,faload) @@ -3271,7 +3145,7 @@ DISPATCH_FINISH } -@ --- ECN: load; Xastore ------------------------------------------------------- +@ --- load; Xastore ------------------------------------------------------- (iload_0,iload_1,iload_2,iload_3) (iastore,fastore) @@ -3384,7 +3258,7 @@ DISPATCH_FINISH } -@ --- ECN: load; dataop ------------------------------------------------------- +@ --- load; dataop ------------------------------------------------------- (iload_0,iload_1,iload_2,iload_3) (iadd) @@ -3472,40 +3346,6 @@ } (iload_0,iload_1,iload_2,iload_3) -(idiv) -{ - rsb tmp2, r0, #opc_iload_0 - DISPATCH_START 2 - ldr tmp2, [locals, tmp2, lsl #2] - POP tmp1 - b int_div -} - -(iload,aload,fload)(idiv) { - DISPATCH_START 3 - POP tmp1 - ldr tmp2, [locals, -r2, lsl #2] - b int_div -} - -(iload_0,iload_1,iload_2,iload_3) -(irem) -{ - rsb tmp2, r0, #opc_iload_0 - DISPATCH_START 2 - ldr tmp2, [locals, tmp2, lsl #2] - POP tmp1 - b int_rem -} - -(iload,aload,fload)(irem) { - DISPATCH_START 3 - POP tmp1 - ldr tmp2, [locals, -r2, lsl #2] - b int_rem -} - -(iload_0,iload_1,iload_2,iload_3) (ineg) { rsb lr, r0, #opc_iload_0 @@ -3717,192 +3557,138 @@ #ifdef NOTICE_SAFEPOINTS -@ --- ECN: load; branch ------------------------------------------------------- +@ --- load; branch ------------------------------------------------------- (iload_0,iload_1,iload_2,iload_3) (ifeq,ifnull) { + rsb r3, r0, #opc_iload_0 ldrsb r1, [jpc, #2] + ldr r3, [locals, r3, lsl #2] ldrb ip, [jpc, #3] - rsb r3, r0, #opc_iload_0 - add jpc, jpc, #1 - ldr r3, [locals, r3, lsl #2] cmp r3, #0 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + beq branch_taken_unsafe_1 + DISPATCH 4 } (iload,aload,fload)(ifeq,ifnull) { + rsb r2, r2, #0 ldrsb r1, [jpc, #3] + ldr r3, [locals, r2, lsl #2] ldrb ip, [jpc, #4] - add jpc, jpc, #2 - ldr r3, [locals, -r2, lsl #2] cmp r3, #0 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + beq branch_taken_unsafe_2 + DISPATCH 5 } (iload_0,iload_1,iload_2,iload_3) (ifne,ifnonnull) { + rsb r3, r0, #opc_iload_0 ldrsb r1, [jpc, #2] + ldr r3, [locals, r3, lsl #2] ldrb ip, [jpc, #3] - rsb r3, r0, #opc_iload_0 - add jpc, jpc, #1 - ldr r3, [locals, r3, lsl #2] cmp r3, #0 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bne branch_taken_unsafe_1 + DISPATCH 4 } (iload,aload,fload)(ifne,ifnonnull) { + rsb r2, r2, #0 ldrsb r1, [jpc, #3] + ldr r3, [locals, r2, lsl #2] ldrb ip, [jpc, #4] - add jpc, jpc, #2 - ldr r3, [locals, -r2, lsl #2] cmp r3, #0 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bne branch_taken_unsafe_2 + DISPATCH 5 } (iload_0,iload_1,iload_2,iload_3) (iflt) { + rsb r3, r0, #opc_iload_0 ldrsb r1, [jpc, #2] + ldr r3, [locals, r3, lsl #2] ldrb ip, [jpc, #3] - rsb r3, r0, #opc_iload_0 - add jpc, jpc, #1 - ldr r3, [locals, r3, lsl #2] cmp r3, #0 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + blt branch_taken_unsafe_1 + DISPATCH 4 } (iload,aload,fload)(iflt) { + rsb r2, r2, #0 ldrsb r1, [jpc, #3] + ldr r3, [locals, r2, lsl #2] ldrb ip, [jpc, #4] - add jpc, jpc, #2 - ldr r3, [locals, -r2, lsl #2] cmp r3, #0 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + blt branch_taken_unsafe_2 + DISPATCH 5 } (iload_0,iload_1,iload_2,iload_3) (ifge) { + rsb r3, r0, #opc_iload_0 ldrsb r1, [jpc, #2] + ldr r3, [locals, r3, lsl #2] ldrb ip, [jpc, #3] - rsb r3, r0, #opc_iload_0 - add jpc, jpc, #1 - ldr r3, [locals, r3, lsl #2] cmp r3, #0 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bge branch_taken_unsafe_1 + DISPATCH 4 } (iload,aload,fload)(ifge) { + rsb r2, r2, #0 ldrsb r1, [jpc, #3] + ldr r3, [locals, r2, lsl #2] ldrb ip, [jpc, #4] - add jpc, jpc, #2 - ldr r3, [locals, -r2, lsl #2] cmp r3, #0 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bge branch_taken_unsafe_2 + DISPATCH 5 } (iload_0,iload_1,iload_2,iload_3) (ifgt) { + rsb r3, r0, #opc_iload_0 ldrsb r1, [jpc, #2] + ldr r3, [locals, r3, lsl #2] ldrb ip, [jpc, #3] - rsb r3, r0, #opc_iload_0 - add jpc, jpc, #1 - ldr r3, [locals, r3, lsl #2] cmp r3, #0 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bgt branch_taken_unsafe_1 + DISPATCH 4 } (iload,aload,fload)(ifgt) { + rsb r2, r2, #0 ldrsb r1, [jpc, #3] + ldr r3, [locals, r2, lsl #2] ldrb ip, [jpc, #4] - add jpc, jpc, #2 - ldr r3, [locals, -r2, lsl #2] cmp r3, #0 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bgt branch_taken_unsafe_2 + DISPATCH 5 } (iload_0,iload_1,iload_2,iload_3) (ifle) { + rsb r3, r0, #opc_iload_0 ldrsb r1, [jpc, #2] + ldr r3, [locals, r3, lsl #2] ldrb ip, [jpc, #3] - rsb r3, r0, #opc_iload_0 - add jpc, jpc, #1 - ldr r3, [locals, r3, lsl #2] cmp r3, #0 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + ble branch_taken_unsafe_1 + DISPATCH 4 } (iload,aload,fload)(ifle) { + rsb r2, r2, #0 ldrsb r1, [jpc, #3] + ldr r3, [locals, r2, lsl #2] ldrb ip, [jpc, #4] - add jpc, jpc, #2 - ldr r3, [locals, -r2, lsl #2] cmp r3, #0 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + ble branch_taken_unsafe_2 + DISPATCH 5 } (iload_0,iload_1,iload_2,iload_3) @@ -3911,31 +3697,22 @@ POP r3 rsb r2, r0, #opc_iload_0 ldrsb r1, [jpc, #2] + ldr r2, [locals, r2, lsl #2] ldrb ip, [jpc, #3] - ldr r2, [locals, r2, lsl #2] - add jpc, jpc, #1 cmp r3, r2 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + beq branch_taken_unsafe_1 + DISPATCH 4 } (iload,aload,fload)(if_icmpeq,if_acmpeq) { POP r3 + rsb r2, r2, #0 ldrsb r1, [jpc, #3] + ldr r2, [locals, r2, lsl #2] ldrb ip, [jpc, #4] - ldr r2, [locals, -r2, lsl #2] - add jpc, jpc, #2 cmp r3, r2 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + beq branch_taken_unsafe_2 + DISPATCH 5 } (iload_0,iload_1,iload_2,iload_3) @@ -3944,31 +3721,22 @@ POP r3 rsb r2, r0, #opc_iload_0 ldrsb r1, [jpc, #2] + ldr r2, [locals, r2, lsl #2] ldrb ip, [jpc, #3] - ldr r2, [locals, r2, lsl #2] - add jpc, jpc, #1 cmp r3, r2 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bne branch_taken_unsafe_1 + DISPATCH 4 } (iload,aload,fload)(if_icmpne,if_acmpne) { POP r3 + rsb r2, r2, #0 ldrsb r1, [jpc, #3] + ldr r2, [locals, r2, lsl #2] ldrb ip, [jpc, #4] - ldr r2, [locals, -r2, lsl #2] - add jpc, jpc, #2 cmp r3, r2 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bne branch_taken_unsafe_2 + DISPATCH 5 } (iload_0,iload_1,iload_2,iload_3) @@ -3977,31 +3745,22 @@ POP r3 rsb r2, r0, #opc_iload_0 ldrsb r1, [jpc, #2] + ldr r2, [locals, r2, lsl #2] ldrb ip, [jpc, #3] - ldr r2, [locals, r2, lsl #2] - add jpc, jpc, #1 cmp r3, r2 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + blt branch_taken_unsafe_1 + DISPATCH 4 } (iload,aload,fload)(if_icmplt) { POP r3 + rsb r2, r2, #0 ldrsb r1, [jpc, #3] + ldr r2, [locals, r2, lsl #2] ldrb ip, [jpc, #4] - ldr r2, [locals, -r2, lsl #2] - add jpc, jpc, #2 cmp r3, r2 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + blt branch_taken_unsafe_2 + DISPATCH 5 } (iload_0,iload_1,iload_2,iload_3) @@ -4010,31 +3769,22 @@ POP r3 rsb r2, r0, #opc_iload_0 ldrsb r1, [jpc, #2] + ldr r2, [locals, r2, lsl #2] ldrb ip, [jpc, #3] - ldr r2, [locals, r2, lsl #2] - add jpc, jpc, #1 cmp r3, r2 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bge branch_taken_unsafe_1 + DISPATCH 4 } (iload,aload,fload)(if_icmpge) { POP r3 + rsb r2, r2, #0 ldrsb r1, [jpc, #3] + ldr r2, [locals, r2, lsl #2] ldrb ip, [jpc, #4] - ldr r2, [locals, -r2, lsl #2] - add jpc, jpc, #2 cmp r3, r2 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bge branch_taken_unsafe_2 + DISPATCH 5 } (iload_0,iload_1,iload_2,iload_3) @@ -4043,31 +3793,22 @@ POP r3 rsb r2, r0, #opc_iload_0 ldrsb r1, [jpc, #2] + ldr r2, [locals, r2, lsl #2] ldrb ip, [jpc, #3] - ldr r2, [locals, r2, lsl #2] - add jpc, jpc, #1 cmp r3, r2 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bgt branch_taken_unsafe_1 + DISPATCH 4 } (iload,aload,fload)(if_icmpgt) { POP r3 + rsb r2, r2, #0 ldrsb r1, [jpc, #3] + ldr r2, [locals, r2, lsl #2] ldrb ip, [jpc, #4] - ldr r2, [locals, -r2, lsl #2] - add jpc, jpc, #2 cmp r3, r2 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bgt branch_taken_unsafe_2 + DISPATCH 5 } (iload_0,iload_1,iload_2,iload_3) @@ -4076,34 +3817,25 @@ POP r3 rsb r2, r0, #opc_iload_0 ldrsb r1, [jpc, #2] + ldr r2, [locals, r2, lsl #2] ldrb ip, [jpc, #3] - ldr r2, [locals, r2, lsl #2] - add jpc, jpc, #1 cmp r3, r2 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + ble branch_taken_unsafe_1 + DISPATCH 4 } (iload,aload,fload)(if_icmple) { POP r3 + rsb r2, r2, #0 ldrsb r1, [jpc, #3] + ldr r2, [locals, r2, lsl #2] ldrb ip, [jpc, #4] - ldr r2, [locals, -r2, lsl #2] - add jpc, jpc, #2 cmp r3, r2 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -@ --- ECN: load; return/invoke ------------------------------------------------- + ble branch_taken_unsafe_2 + DISPATCH 5 +} + +@ --- load; return/invoke ------------------------------------------------- (iload_0,iload_1,iload_2,iload_3) (ireturn,areturn,freturn) @@ -4122,30 +3854,12 @@ ldr r0, [istate, #ISTATE_METHOD] ldr r3, [stack, #0] ldrh r0, [r0, #40] - ldr ip, [istate, #ISTATE_ADVANCE_PC] - ldr istate, [istate, #ISTATE_NEXT_FRAME] str r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] str r1, [stack, r0, lsl #2]! - cmp ip, #0 - beq normal_return - - sub istate, istate, #ISTATE_NEXT_FRAME - - CACHE_JPC - ldr r2, [istate, #ISTATE_STACK_LIMIT] - DISPATCH_START_REG ip - sub stack, stack, #4 - ldr r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - DISPATCH_NEXT @ ldrb r1, [jpc, #2] - add r2, r2, #4 - DISPATCH_NEXT @ ldr ip, [dispatch, r0, lsl #2] - str r2, [tmp_xxx, #THREAD_JAVA_SP] - DISPATCH_NEXT @ ldrb r2, [jpc, #1] - str r3, [tmp_xxx, #THREAD_LAST_JAVA_SP] - CACHE_CP - CACHE_LOCALS - DISPATCH_NEXT @ ands lr, ip, lr - DISPATCH_FINISH + + str stack, [tmp_xxx, #THREAD_JAVA_SP] + + ldmfd arm_sp!, {fast_regset, pc} 1: PUSH r1 add jpc, jpc, #1 @@ -4169,30 +3883,12 @@ ldr r0, [istate, #ISTATE_METHOD] ldr r3, [stack, #0] ldrh r0, [r0, #40] - ldr ip, [istate, #ISTATE_ADVANCE_PC] - ldr istate, [istate, #ISTATE_NEXT_FRAME] str r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] str r1, [stack, r0, lsl #2]! - cmp ip, #0 - beq normal_return - - sub istate, istate, #ISTATE_NEXT_FRAME - - CACHE_JPC - ldr r2, [istate, #ISTATE_STACK_LIMIT] - DISPATCH_START_REG ip - sub stack, stack, #4 - ldr r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - DISPATCH_NEXT @ ldrb r1, [jpc, #2] - add r2, r2, #4 - DISPATCH_NEXT @ ldr ip, [dispatch, r0, lsl #2] - str r2, [tmp_xxx, #THREAD_JAVA_SP] - DISPATCH_NEXT @ ldrb r2, [jpc, #1] - str r3, [tmp_xxx, #THREAD_LAST_JAVA_SP] - CACHE_CP - CACHE_LOCALS - DISPATCH_NEXT @ ands lr, ip, lr - DISPATCH_FINISH + + str stack, [tmp_xxx, #THREAD_JAVA_SP] + + ldmfd arm_sp!, {fast_regset, pc} 1: PUSH r1 add jpc, jpc, #2 @@ -4399,7 +4095,7 @@ DISPATCH_FINISH } -@ --- ECN: iconst; store ------------------------------------------------- +@ --- iconst; store ------------------------------------------------- (iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5) (istore_0,istore_1,istore_2,istore_3) @@ -4419,7 +4115,7 @@ DISPATCH_BYTECODE } -@ --- ECN: iconst; dataop ------------------------------------------------- +@ --- iconst; dataop ------------------------------------------------- (iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5)(iadd) { sub tmp1, r0, #opc_iconst_0 @@ -4505,7 +4201,7 @@ DISPATCH_FINISH } -@ --- ECN: iconst; branch ------------------------------------------------- +@ --- iconst; branch ------------------------------------------------- #ifdef NOTICE_SAFEPOINTS @@ -4513,90 +4209,60 @@ POP r3 sub r2, r0, #opc_iconst_0 ldrsb r1, [jpc, #2] + cmp r3, r2 ldrb ip, [jpc, #3] - add jpc, jpc, #1 - cmp r3, r2 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + beq branch_taken_unsafe_1 + DISPATCH 4 } (iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5)(if_icmpne) { POP r3 sub r2, r0, #opc_iconst_0 ldrsb r1, [jpc, #2] + cmp r3, r2 ldrb ip, [jpc, #3] - add jpc, jpc, #1 - cmp r3, r2 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bne branch_taken_unsafe_1 + DISPATCH 4 } (iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5)(if_icmplt) { POP r3 sub r2, r0, #opc_iconst_0 ldrsb r1, [jpc, #2] + cmp r3, r2 ldrb ip, [jpc, #3] - add jpc, jpc, #1 - cmp r3, r2 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + blt branch_taken_unsafe_1 + DISPATCH 4 } (iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5)(if_icmpge) { POP r3 sub r2, r0, #opc_iconst_0 ldrsb r1, [jpc, #2] + cmp r3, r2 ldrb ip, [jpc, #3] - add jpc, jpc, #1 - cmp r3, r2 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bge branch_taken_unsafe_1 + DISPATCH 4 } (iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5)(if_icmpgt) { POP r3 sub r2, r0, #opc_iconst_0 ldrsb r1, [jpc, #2] + cmp r3, r2 ldrb ip, [jpc, #3] - add jpc, jpc, #1 - cmp r3, r2 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bgt branch_taken_unsafe_1 + DISPATCH 4 } (iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5)(if_icmple) { POP r3 sub r2, r0, #opc_iconst_0 ldrsb r1, [jpc, #2] + cmp r3, r2 ldrb ip, [jpc, #3] - add jpc, jpc, #1 - cmp r3, r2 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + ble branch_taken_unsafe_1 + DISPATCH 4 } (iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5)(ireturn) { @@ -4613,30 +4279,12 @@ ldr r0, [istate, #ISTATE_METHOD] ldr r3, [stack, #0] ldrh r0, [r0, #40] - ldr ip, [istate, #ISTATE_ADVANCE_PC] - ldr istate, [istate, #ISTATE_NEXT_FRAME] str r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] str r1, [stack, r0, lsl #2]! - cmp ip, #0 - beq normal_return - - sub istate, istate, #ISTATE_NEXT_FRAME - - CACHE_JPC - ldr r2, [istate, #ISTATE_STACK_LIMIT] - DISPATCH_START_REG ip - sub stack, stack, #4 - ldr r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - DISPATCH_NEXT @ ldrb r1, [jpc, #2] - add r2, r2, #4 - DISPATCH_NEXT @ ldr ip, [dispatch, r0, lsl #2] - str r2, [tmp_xxx, #THREAD_JAVA_SP] - DISPATCH_NEXT @ ldrb r2, [jpc, #1] - str r3, [tmp_xxx, #THREAD_LAST_JAVA_SP] - CACHE_CP - CACHE_LOCALS - DISPATCH_NEXT @ ands lr, ip, lr - DISPATCH_FINISH + + str stack, [tmp_xxx, #THREAD_JAVA_SP] + + ldmfd arm_sp!, {fast_regset, pc} 1: PUSH r1 add jpc, jpc, #1 @@ -5001,292 +4649,6 @@ DISPATCH_FINISH } -#ifdef NOTICE_SAFEPOINTS - -(iaload,faload,aaload)(ifeq,ifnull) { - POP r2, r3 @ r2 = index, r3 = arrayref - SW_NPC cmp r3, #0 - SW_NPC beq null_ptr_exception_jpc_0 -.abortentry61: - ldr r1, [r3, #8] @ r1 = length - cmp r2, r1 - bcs array_bound_exception_jpc_0 - add r3, r3, r2, lsl #2 - ldr r3, [r3, #BASE_OFFSET_WORD] @ r1 = tos - - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaload,faload,aaload)(ifne,ifnonnull) { - POP r2, r3 @ r2 = index, r3 = arrayref - SW_NPC cmp r3, #0 - SW_NPC beq null_ptr_exception_jpc_0 -.abortentry62: - ldr r1, [r3, #8] @ r1 = length - cmp r2, r1 - bcs array_bound_exception_jpc_0 - add r3, r3, r2, lsl #2 - ldr r3, [r3, #BASE_OFFSET_WORD] @ r1 = tos - - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaload,faload,aaload)(iflt) { - POP r2, r3 @ r2 = index, r3 = arrayref - SW_NPC cmp r3, #0 - SW_NPC beq null_ptr_exception_jpc_0 -.abortentry63: - ldr r1, [r3, #8] @ r1 = length - cmp r2, r1 - bcs array_bound_exception_jpc_0 - add r3, r3, r2, lsl #2 - ldr r3, [r3, #BASE_OFFSET_WORD] @ r1 = tos - - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaload,faload,aaload)(ifge) { - POP r2, r3 @ r2 = index, r3 = arrayref - SW_NPC cmp r3, #0 - SW_NPC beq null_ptr_exception_jpc_0 -.abortentry64: - ldr r1, [r3, #8] @ r1 = length - cmp r2, r1 - bcs array_bound_exception_jpc_0 - add r3, r3, r2, lsl #2 - ldr r3, [r3, #BASE_OFFSET_WORD] @ r1 = tos - - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaload,faload,aaload)(ifgt) { - POP r2, r3 @ r2 = index, r3 = arrayref - SW_NPC cmp r3, #0 - SW_NPC beq null_ptr_exception_jpc_0 -.abortentry65: - ldr r1, [r3, #8] @ r1 = length - cmp r2, r1 - bcs array_bound_exception_jpc_0 - add r3, r3, r2, lsl #2 - ldr r3, [r3, #BASE_OFFSET_WORD] @ r1 = tos - - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaload,faload,aaload)(ifle) { - POP r2, r3 @ r2 = index, r3 = arrayref - SW_NPC cmp r3, #0 - SW_NPC beq null_ptr_exception_jpc_0 -.abortentry66: - ldr r1, [r3, #8] @ r1 = length - cmp r2, r1 - bcs array_bound_exception_jpc_0 - add r3, r3, r2, lsl #2 - ldr r3, [r3, #BASE_OFFSET_WORD] @ r1 = tos - - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaload,faload,aaload)(if_icmpeq,if_acmpeq) { - POP r2, r3 @ r2 = index, r3 = arrayref - SW_NPC cmp r3, #0 - SW_NPC beq null_ptr_exception_jpc_0 -.abortentry67: - ldr r1, [r3, #8] @ r1 = length - cmp r2, r1 - bcs array_bound_exception_jpc_0 - add r3, r3, r2, lsl #2 - ldr r2, [r3, #BASE_OFFSET_WORD] @ r1 = tos - - POP r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add jpc, jpc, #1 - cmp r3, r2 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaload,faload,aaload)(if_icmpne,if_acmpne) { - POP r2, r3 @ r2 = index, r3 = arrayref - SW_NPC cmp r3, #0 - SW_NPC beq null_ptr_exception_jpc_0 -.abortentry68: - ldr r1, [r3, #8] @ r1 = length - cmp r2, r1 - bcs array_bound_exception_jpc_0 - add r3, r3, r2, lsl #2 - ldr r2, [r3, #BASE_OFFSET_WORD] @ r1 = tos - - POP r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add jpc, jpc, #1 - cmp r3, r2 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaload,faload,aaload)(if_icmplt) { - POP r2, r3 @ r2 = index, r3 = arrayref - SW_NPC cmp r3, #0 - SW_NPC beq null_ptr_exception_jpc_0 -.abortentry69: - ldr r1, [r3, #8] @ r1 = length - cmp r2, r1 - bcs array_bound_exception_jpc_0 - add r3, r3, r2, lsl #2 - ldr r2, [r3, #BASE_OFFSET_WORD] @ r1 = tos - - POP r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add jpc, jpc, #1 - cmp r3, r2 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaload,faload,aaload)(if_icmpge) { - POP r2, r3 @ r2 = index, r3 = arrayref - SW_NPC cmp r3, #0 - SW_NPC beq null_ptr_exception_jpc_0 -.abortentry70: - ldr r1, [r3, #8] @ r1 = length - cmp r2, r1 - bcs array_bound_exception_jpc_0 - add r3, r3, r2, lsl #2 - ldr r2, [r3, #BASE_OFFSET_WORD] @ r1 = tos - - POP r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add jpc, jpc, #1 - cmp r3, r2 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaload,faload,aaload)(if_icmpgt) { - POP r2, r3 @ r2 = index, r3 = arrayref - SW_NPC cmp r3, #0 - SW_NPC beq null_ptr_exception_jpc_0 -.abortentry71: - ldr r1, [r3, #8] @ r1 = length - cmp r2, r1 - bcs array_bound_exception_jpc_0 - add r3, r3, r2, lsl #2 - ldr r2, [r3, #BASE_OFFSET_WORD] @ r1 = tos - - POP r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add jpc, jpc, #1 - cmp r3, r2 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaload,faload,aaload)(if_icmple) { - POP r2, r3 @ r2 = index, r3 = arrayref - SW_NPC cmp r3, #0 - SW_NPC beq null_ptr_exception_jpc_0 -.abortentry72: - ldr r1, [r3, #8] @ r1 = length - cmp r2, r1 - bcs array_bound_exception_jpc_0 - add r3, r3, r2, lsl #2 - ldr r2, [r3, #BASE_OFFSET_WORD] @ r1 = tos - - POP r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add jpc, jpc, #1 - cmp r3, r2 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -#endif // NOTICE_SAFEPOINTS - @ ---- iadd; xxx ------------------------------------------------------------ (iadd)(iload,fload,aload) { @@ -5395,255 +4757,11 @@ DISPATCH_FINISH } -#ifdef NOTICE_SAFEPOINTS - -(iadd)(ifeq,ifnull) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iadd)(ifne,ifnonnull) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iadd)(iflt) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iadd)(ifge) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iadd)(ifgt) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iadd)(ifle) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iadd)(if_icmpeq,if_acmpeq) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iadd)(if_icmpne,if_acmpne) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iadd)(if_icmplt) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iadd)(if_icmpge) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iadd)(if_icmpgt) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iadd)(if_icmple) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iadd)(goto) { - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add jpc, jpc, #1 - orr ip, ip, r1, lsl #8 - DISPATCH_START_REG ip - POP r2, r3 - add r2, r3, r2 - DISPATCH_NEXT - PUSH r2 - DISPATCH_FINISH -} - -(iadd)(ireturn) { - POP r2, r3 - ldr tmp2, [istate, #ISTATE_MONITOR_BASE] @ tmp2 = base - ldr tmp1, [istate, #ISTATE_STACK_BASE] @ tmp1 = end - add r1, r3, r2 - ldr tmp_xxx, [istate, #ISTATE_THREAD] - cmp tmp1, tmp2 - bcc 1f -2: - mov r3, #0 - ldr stack, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - str r3, [tmp_xxx, #THREAD_LAST_JAVA_SP] - ldr r0, [istate, #ISTATE_METHOD] - ldr r3, [stack, #0] - ldrh r0, [r0, #40] - ldr ip, [istate, #ISTATE_ADVANCE_PC] - ldr istate, [istate, #ISTATE_NEXT_FRAME] - str r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - str r1, [stack, r0, lsl #2]! - cmp ip, #0 - beq normal_return - - sub istate, istate, #ISTATE_NEXT_FRAME - - CACHE_JPC - ldr r2, [istate, #ISTATE_STACK_LIMIT] - DISPATCH_START_REG ip - sub stack, stack, #4 - ldr r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - DISPATCH_NEXT @ ldrb r1, [jpc, #2] - add r2, r2, #4 - DISPATCH_NEXT @ ldr ip, [dispatch, r0, lsl #2] - str r2, [tmp_xxx, #THREAD_JAVA_SP] - DISPATCH_NEXT @ ldrb r2, [jpc, #1] - str r3, [tmp_xxx, #THREAD_LAST_JAVA_SP] - CACHE_CP - CACHE_LOCALS - DISPATCH_NEXT @ ands lr, ip, lr - DISPATCH_FINISH -1: - PUSH r1 - add jpc, jpc, #1 - bl return_check_monitors - POP r1 - b 2b -} - -#endif // NOTICE_SAFEPOINTS - (iadd)(iinc) { POP tmp1, lr DISPATCH_START \seq_len add tmp1, lr, tmp1 - ldrb r3, [jpc, #-2] @ ECN: jpc now points to next bc + ldrb r3, [jpc, #-2] @ jpc now points to next bc ldrsb r2, [jpc, #-1] DISPATCH_NEXT PUSH tmp1 @@ -5761,255 +4879,11 @@ DISPATCH_FINISH } -#ifdef NOTICE_SAFEPOINTS - -(isub)(ifeq,ifnull) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - sub r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(isub)(ifne,ifnonnull) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - sub r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(isub)(iflt) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - sub r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(isub)(ifge) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - sub r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(isub)(ifgt) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - sub r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(isub)(ifle) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - sub r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(isub)(if_icmpeq,if_acmpeq) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - sub r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(isub)(if_icmpne,if_acmpne) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - sub r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(isub)(if_icmplt) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - sub r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(isub)(if_icmpge) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - sub r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(isub)(if_icmpgt) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - sub r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(isub)(if_icmple) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - sub r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(isub)(goto) { - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add jpc, jpc, #1 - orr ip, ip, r1, lsl #8 - DISPATCH_START_REG ip - POP r2, r3 - sub r2, r3, r2 - DISPATCH_NEXT - PUSH r2 - DISPATCH_FINISH -} - -(isub)(ireturn) { - POP r2, r3 - ldr tmp2, [istate, #ISTATE_MONITOR_BASE] @ tmp2 = base - ldr tmp1, [istate, #ISTATE_STACK_BASE] @ tmp1 = end - sub r1, r3, r2 - ldr tmp_xxx, [istate, #ISTATE_THREAD] - cmp tmp1, tmp2 - bcc 1f -2: - mov r3, #0 - ldr stack, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - str r3, [tmp_xxx, #THREAD_LAST_JAVA_SP] - ldr r0, [istate, #ISTATE_METHOD] - ldr r3, [stack, #0] - ldrh r0, [r0, #40] - ldr ip, [istate, #ISTATE_ADVANCE_PC] - ldr istate, [istate, #ISTATE_NEXT_FRAME] - str r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - str r1, [stack, r0, lsl #2]! - cmp ip, #0 - beq normal_return - - sub istate, istate, #ISTATE_NEXT_FRAME - - CACHE_JPC - ldr r2, [istate, #ISTATE_STACK_LIMIT] - DISPATCH_START_REG ip - sub stack, stack, #4 - ldr r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - DISPATCH_NEXT @ ldrb r1, [jpc, #2] - add r2, r2, #4 - DISPATCH_NEXT @ ldr ip, [dispatch, r0, lsl #2] - str r2, [tmp_xxx, #THREAD_JAVA_SP] - DISPATCH_NEXT @ ldrb r2, [jpc, #1] - str r3, [tmp_xxx, #THREAD_LAST_JAVA_SP] - CACHE_CP - CACHE_LOCALS - DISPATCH_NEXT @ ands lr, ip, lr - DISPATCH_FINISH -1: - PUSH r1 - add jpc, jpc, #1 - bl return_check_monitors - POP r1 - b 2b -} - -#endif // NOTICE_SAFEPOINTS - (isub)(iinc) { POP tmp1, lr DISPATCH_START \seq_len sub tmp1, lr, tmp1 - ldrb r3, [jpc, #-2] @ ECN: jpc now points to next bc + ldrb r3, [jpc, #-2] @ jpc now points to next bc ldrsb r2, [jpc, #-1] DISPATCH_NEXT PUSH tmp1 @@ -6127,255 +5001,11 @@ DISPATCH_FINISH } -#ifdef NOTICE_SAFEPOINTS - -(iand)(ifeq,ifnull) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - and r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iand)(ifne,ifnonnull) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - and r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iand)(iflt) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - and r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iand)(ifge) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - and r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iand)(ifgt) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - and r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iand)(ifle) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - and r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iand)(if_icmpeq,if_acmpeq) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - and r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iand)(if_icmpne,if_acmpne) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - and r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iand)(if_icmplt) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - and r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iand)(if_icmpge) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - and r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iand)(if_icmpgt) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - and r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iand)(if_icmple) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - and r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iand)(goto) { - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add jpc, jpc, #1 - orr ip, ip, r1, lsl #8 - DISPATCH_START_REG ip - POP r2, r3 - and r2, r3, r2 - DISPATCH_NEXT - PUSH r2 - DISPATCH_FINISH -} - -(iand)(ireturn) { - POP r2, r3 - ldr tmp2, [istate, #ISTATE_MONITOR_BASE] @ tmp2 = base - ldr tmp1, [istate, #ISTATE_STACK_BASE] @ tmp1 = end - and r1, r3, r2 - ldr tmp_xxx, [istate, #ISTATE_THREAD] - cmp tmp1, tmp2 - bcc 1f -2: - mov r3, #0 - ldr stack, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - str r3, [tmp_xxx, #THREAD_LAST_JAVA_SP] - ldr r0, [istate, #ISTATE_METHOD] - ldr r3, [stack, #0] - ldrh r0, [r0, #40] - ldr ip, [istate, #ISTATE_ADVANCE_PC] - ldr istate, [istate, #ISTATE_NEXT_FRAME] - str r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - str r1, [stack, r0, lsl #2]! - cmp ip, #0 - beq normal_return - - sub istate, istate, #ISTATE_NEXT_FRAME - - CACHE_JPC - ldr r2, [istate, #ISTATE_STACK_LIMIT] - DISPATCH_START_REG ip - sub stack, stack, #4 - ldr r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - DISPATCH_NEXT @ ldrb r1, [jpc, #2] - add r2, r2, #4 - DISPATCH_NEXT @ ldr ip, [dispatch, r0, lsl #2] - str r2, [tmp_xxx, #THREAD_JAVA_SP] - DISPATCH_NEXT @ ldrb r2, [jpc, #1] - str r3, [tmp_xxx, #THREAD_LAST_JAVA_SP] - CACHE_CP - CACHE_LOCALS - DISPATCH_NEXT @ ands lr, ip, lr - DISPATCH_FINISH -1: - PUSH r1 - add jpc, jpc, #1 - bl return_check_monitors - POP r1 - b 2b -} - -#endif // NOTICE_SAFEPOINTS - (iand)(iinc) { POP tmp1, lr DISPATCH_START \seq_len and tmp1, lr, tmp1 - ldrb r3, [jpc, #-2] @ ECN: jpc now points to next bc + ldrb r3, [jpc, #-2] @ jpc now points to next bc ldrsb r2, [jpc, #-1] DISPATCH_NEXT PUSH tmp1 @@ -6493,255 +5123,11 @@ DISPATCH_FINISH } -#ifdef NOTICE_SAFEPOINTS - -(ior)(ifeq,ifnull) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - orr r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ior)(ifne,ifnonnull) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - orr r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ior)(iflt) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - orr r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ior)(ifge) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - orr r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ior)(ifgt) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - orr r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ior)(ifle) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - orr r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ior)(if_icmpeq,if_acmpeq) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - orr r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ior)(if_icmpne,if_acmpne) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - orr r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ior)(if_icmplt) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - orr r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ior)(if_icmpge) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - orr r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ior)(if_icmpgt) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - orr r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ior)(if_icmple) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - orr r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ior)(goto) { - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add jpc, jpc, #1 - orr ip, ip, r1, lsl #8 - DISPATCH_START_REG ip - POP r2, r3 - orr r2, r3, r2 - DISPATCH_NEXT - PUSH r2 - DISPATCH_FINISH -} - -(ior)(ireturn) { - POP r2, r3 - ldr tmp2, [istate, #ISTATE_MONITOR_BASE] @ tmp2 = base - ldr tmp1, [istate, #ISTATE_STACK_BASE] @ tmp1 = end - orr r1, r3, r2 - ldr tmp_xxx, [istate, #ISTATE_THREAD] - cmp tmp1, tmp2 - bcc 1f -2: - mov r3, #0 - ldr stack, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - str r3, [tmp_xxx, #THREAD_LAST_JAVA_SP] - ldr r0, [istate, #ISTATE_METHOD] - ldr r3, [stack, #0] - ldrh r0, [r0, #40] - ldr ip, [istate, #ISTATE_ADVANCE_PC] - ldr istate, [istate, #ISTATE_NEXT_FRAME] - str r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - str r1, [stack, r0, lsl #2]! - cmp ip, #0 - beq normal_return - - sub istate, istate, #ISTATE_NEXT_FRAME - - CACHE_JPC - ldr r2, [istate, #ISTATE_STACK_LIMIT] - DISPATCH_START_REG ip - sub stack, stack, #4 - ldr r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - DISPATCH_NEXT @ ldrb r1, [jpc, #2] - add r2, r2, #4 - DISPATCH_NEXT @ ldr ip, [dispatch, r0, lsl #2] - str r2, [tmp_xxx, #THREAD_JAVA_SP] - DISPATCH_NEXT @ ldrb r2, [jpc, #1] - str r3, [tmp_xxx, #THREAD_LAST_JAVA_SP] - CACHE_CP - CACHE_LOCALS - DISPATCH_NEXT @ ands lr, ip, lr - DISPATCH_FINISH -1: - PUSH r1 - add jpc, jpc, #1 - bl return_check_monitors - POP r1 - b 2b -} - -#endif // NOTICE_SAFEPOINTS - (ior)(iinc) { POP tmp1, lr DISPATCH_START \seq_len orr tmp1, lr, tmp1 - ldrb r3, [jpc, #-2] @ ECN: jpc now points to next bc + ldrb r3, [jpc, #-2] @ jpc now points to next bc ldrsb r2, [jpc, #-1] DISPATCH_NEXT PUSH tmp1 @@ -6844,7 +5230,7 @@ DISPATCH_NEXT DISPATCH_NEXT PUSH tmp2 - DISPATCH_FINISH + DISPATCH_FINISH } (ixor)(isub) { @@ -6860,255 +5246,11 @@ DISPATCH_FINISH } -#ifdef NOTICE_SAFEPOINTS - -(ixor)(ifeq,ifnull) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - eor r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ixor)(ifne,ifnonnull) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - eor r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ixor)(iflt) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - eor r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ixor)(ifge) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - eor r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ixor)(ifgt) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - eor r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ixor)(ifle) { - POP r2, r3 - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - eor r3, r3, r2 - add jpc, jpc, #1 - cmp r3, #0 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ixor)(if_icmpeq,if_acmpeq) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - eor r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ixor)(if_icmpne,if_acmpne) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - eor r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ixor)(if_icmplt) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - eor r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ixor)(if_icmpge) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - eor r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ixor)(if_icmpgt) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - eor r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ixor)(if_icmple) { - POP r2, r3, lr - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - eor r2, r3, r2 - add jpc, jpc, #1 - cmp lr, r2 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(ixor)(goto) { - ldrsb r1, [jpc, #2] - ldrb ip, [jpc, #3] - add jpc, jpc, #1 - orr ip, ip, r1, lsl #8 - DISPATCH_START_REG ip - POP r2, r3 - eor r2, r3, r2 - DISPATCH_NEXT - PUSH r2 - DISPATCH_FINISH -} - -(ixor)(ireturn) { - POP r2, r3 - ldr tmp2, [istate, #ISTATE_MONITOR_BASE] @ tmp2 = base - ldr tmp1, [istate, #ISTATE_STACK_BASE] @ tmp1 = end - eor r1, r3, r2 - ldr tmp_xxx, [istate, #ISTATE_THREAD] - cmp tmp1, tmp2 - bcc 1f -2: - mov r3, #0 - ldr stack, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - str r3, [tmp_xxx, #THREAD_LAST_JAVA_SP] - ldr r0, [istate, #ISTATE_METHOD] - ldr r3, [stack, #0] - ldrh r0, [r0, #40] - ldr ip, [istate, #ISTATE_ADVANCE_PC] - ldr istate, [istate, #ISTATE_NEXT_FRAME] - str r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - str r1, [stack, r0, lsl #2]! - cmp ip, #0 - beq normal_return - - sub istate, istate, #ISTATE_NEXT_FRAME - - CACHE_JPC - ldr r2, [istate, #ISTATE_STACK_LIMIT] - DISPATCH_START_REG ip - sub stack, stack, #4 - ldr r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - DISPATCH_NEXT @ ldrb r1, [jpc, #2] - add r2, r2, #4 - DISPATCH_NEXT @ ldr ip, [dispatch, r0, lsl #2] - str r2, [tmp_xxx, #THREAD_JAVA_SP] - DISPATCH_NEXT @ ldrb r2, [jpc, #1] - str r3, [tmp_xxx, #THREAD_LAST_JAVA_SP] - CACHE_CP - CACHE_LOCALS - DISPATCH_NEXT @ ands lr, ip, lr - DISPATCH_FINISH -1: - PUSH r1 - add jpc, jpc, #1 - bl return_check_monitors - POP r1 - b 2b -} - -#endif // NOTICE_SAFEPOINTS - (ixor)(iinc) { POP tmp1, lr DISPATCH_START \seq_len eor tmp1, lr, tmp1 - ldrb r3, [jpc, #-2] @ ECN: jpc now points to next bc + ldrb r3, [jpc, #-2] @ jpc now points to next bc ldrsb r2, [jpc, #-1] DISPATCH_NEXT PUSH tmp1 @@ -7175,7 +5317,7 @@ } @############################################################################### -@# ECN: Optimised bytecode triples +@# Optimised bytecode triples @############################################################################### (iaccess_0,iaccess_1,iaccess_2,iaccess_3) @@ -7251,316 +5393,6 @@ DISPATCH_FINISH } -#ifdef NOTICE_SAFEPOINTS - -(iaccess_0,iaccess_1,iaccess_2,iaccess_3) -(ifeq,ifnull) { - ldrb r2, [jpc, #3] - rsb tmp1, r0, #opc_iaccess_0 - ldrb ip, [jpc, #2] - add jpc, jpc, #4 - ldrsb r0, [jpc, #1] - add tmp2, constpool, r2, lsl #12 - ldr tmp1, [locals, tmp1, lsl #2] - add tmp2, ip, lsl #4 - ldrb ip, [jpc, #2] - SW_NPC cmp tmp1, #0 - SW_NPC beq null_ptr_exception_jpc_3 - ldr tmp2, [tmp2, #CP_OFFSET+8] - orr ip, ip, r0, lsl #8 -.abortentry92: - ldr tmp2, [tmp1, tmp2] - cmp tmp2, #0 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaccess_0,iaccess_1,iaccess_2,iaccess_3) -(ifne,ifnonnull) { - ldrb r2, [jpc, #3] - rsb tmp1, r0, #opc_iaccess_0 - ldrb ip, [jpc, #2] - add jpc, jpc, #4 - ldrsb r0, [jpc, #1] - add tmp2, constpool, r2, lsl #12 - ldr tmp1, [locals, tmp1, lsl #2] - add tmp2, ip, lsl #4 - ldrb ip, [jpc, #2] - SW_NPC cmp tmp1, #0 - SW_NPC beq null_ptr_exception_jpc_3 - ldr tmp2, [tmp2, #CP_OFFSET+8] - orr ip, ip, r0, lsl #8 -.abortentry93: - ldr tmp2, [tmp1, tmp2] - cmp tmp2, #0 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaccess_0,iaccess_1,iaccess_2,iaccess_3) -(iflt) { - ldrb r2, [jpc, #3] - rsb tmp1, r0, #opc_iaccess_0 - ldrb ip, [jpc, #2] - add jpc, jpc, #4 - ldrsb r0, [jpc, #1] - add tmp2, constpool, r2, lsl #12 - ldr tmp1, [locals, tmp1, lsl #2] - add tmp2, ip, lsl #4 - ldrb ip, [jpc, #2] - SW_NPC cmp tmp1, #0 - SW_NPC beq null_ptr_exception_jpc_3 - ldr tmp2, [tmp2, #CP_OFFSET+8] - orr ip, ip, r0, lsl #8 -.abortentry94: - ldr tmp2, [tmp1, tmp2] - cmp tmp2, #0 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaccess_0,iaccess_1,iaccess_2,iaccess_3) -(ifge) { - ldrb r2, [jpc, #3] - rsb tmp1, r0, #opc_iaccess_0 - ldrb ip, [jpc, #2] - add jpc, jpc, #4 - ldrsb r0, [jpc, #1] - add tmp2, constpool, r2, lsl #12 - ldr tmp1, [locals, tmp1, lsl #2] - add tmp2, ip, lsl #4 - ldrb ip, [jpc, #2] - SW_NPC cmp tmp1, #0 - SW_NPC beq null_ptr_exception_jpc_3 - ldr tmp2, [tmp2, #CP_OFFSET+8] - orr ip, ip, r0, lsl #8 -.abortentry95: - ldr tmp2, [tmp1, tmp2] - cmp tmp2, #0 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaccess_0,iaccess_1,iaccess_2,iaccess_3) -(ifgt) { - ldrb r2, [jpc, #3] - rsb tmp1, r0, #opc_iaccess_0 - ldrb ip, [jpc, #2] - add jpc, jpc, #4 - ldrsb r0, [jpc, #1] - add tmp2, constpool, r2, lsl #12 - ldr tmp1, [locals, tmp1, lsl #2] - add tmp2, ip, lsl #4 - ldrb ip, [jpc, #2] - SW_NPC cmp tmp1, #0 - SW_NPC beq null_ptr_exception_jpc_3 - ldr tmp2, [tmp2, #CP_OFFSET+8] - orr ip, ip, r0, lsl #8 -.abortentry96: - ldr tmp2, [tmp1, tmp2] - cmp tmp2, #0 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaccess_0,iaccess_1,iaccess_2,iaccess_3) -(ifle) { - ldrb r2, [jpc, #3] - rsb tmp1, r0, #opc_iaccess_0 - ldrb ip, [jpc, #2] - add jpc, jpc, #4 - ldrsb r0, [jpc, #1] - add tmp2, constpool, r2, lsl #12 - ldr tmp1, [locals, tmp1, lsl #2] - add tmp2, ip, lsl #4 - ldrb ip, [jpc, #2] - SW_NPC cmp tmp1, #0 - SW_NPC beq null_ptr_exception_jpc_3 - ldr tmp2, [tmp2, #CP_OFFSET+8] - orr ip, ip, r0, lsl #8 -.abortentry97: - ldr tmp2, [tmp1, tmp2] - cmp tmp2, #0 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaccess_0,iaccess_1,iaccess_2,iaccess_3) -(if_icmpeq,if_acmpeq) { - ldrb r2, [jpc, #3] - rsb tmp1, r0, #opc_iaccess_0 - ldrb ip, [jpc, #2] - add jpc, jpc, #4 - ldrsb r0, [jpc, #1] - add tmp2, constpool, r2, lsl #12 - ldr tmp1, [locals, tmp1, lsl #2] - add tmp2, ip, lsl #4 - ldrb ip, [jpc, #2] - SW_NPC cmp tmp1, #0 - SW_NPC beq null_ptr_exception_jpc_3 - ldr tmp2, [tmp2, #CP_OFFSET+8] - POP r3 - orr ip, ip, r0, lsl #8 -.abortentry98: - ldr tmp2, [tmp1, tmp2] - cmp r3, tmp2 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaccess_0,iaccess_1,iaccess_2,iaccess_3) -(if_icmpne,if_acmpne) { - ldrb r2, [jpc, #3] - rsb tmp1, r0, #opc_iaccess_0 - ldrb ip, [jpc, #2] - add jpc, jpc, #4 - ldrsb r0, [jpc, #1] - add tmp2, constpool, r2, lsl #12 - ldr tmp1, [locals, tmp1, lsl #2] - add tmp2, ip, lsl #4 - ldrb ip, [jpc, #2] - SW_NPC cmp tmp1, #0 - SW_NPC beq null_ptr_exception_jpc_3 - ldr tmp2, [tmp2, #CP_OFFSET+8] - POP r3 - orr ip, ip, r0, lsl #8 -.abortentry99: - ldr tmp2, [tmp1, tmp2] - cmp r3, tmp2 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaccess_0,iaccess_1,iaccess_2,iaccess_3) -(if_icmplt) { - ldrb r2, [jpc, #3] - rsb tmp1, r0, #opc_iaccess_0 - ldrb ip, [jpc, #2] - add jpc, jpc, #4 - ldrsb r0, [jpc, #1] - add tmp2, constpool, r2, lsl #12 - ldr tmp1, [locals, tmp1, lsl #2] - add tmp2, ip, lsl #4 - ldrb ip, [jpc, #2] - SW_NPC cmp tmp1, #0 - SW_NPC beq null_ptr_exception_jpc_3 - ldr tmp2, [tmp2, #CP_OFFSET+8] - POP r3 - orr ip, ip, r0, lsl #8 -.abortentry100: - ldr tmp2, [tmp1, tmp2] - cmp r3, tmp2 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaccess_0,iaccess_1,iaccess_2,iaccess_3) -(if_icmpge) { - ldrb r2, [jpc, #3] - rsb tmp1, r0, #opc_iaccess_0 - ldrb ip, [jpc, #2] - add jpc, jpc, #4 - ldrsb r0, [jpc, #1] - add tmp2, constpool, r2, lsl #12 - ldr tmp1, [locals, tmp1, lsl #2] - add tmp2, ip, lsl #4 - ldrb ip, [jpc, #2] - SW_NPC cmp tmp1, #0 - SW_NPC beq null_ptr_exception_jpc_3 - ldr tmp2, [tmp2, #CP_OFFSET+8] - POP r3 - orr ip, ip, r0, lsl #8 -.abortentry101: - ldr tmp2, [tmp1, tmp2] - cmp r3, tmp2 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaccess_0,iaccess_1,iaccess_2,iaccess_3) -(if_icmpgt) { - ldrb r2, [jpc, #3] - rsb tmp1, r0, #opc_iaccess_0 - ldrb ip, [jpc, #2] - add jpc, jpc, #4 - ldrsb r0, [jpc, #1] - add tmp2, constpool, r2, lsl #12 - ldr tmp1, [locals, tmp1, lsl #2] - add tmp2, ip, lsl #4 - ldrb ip, [jpc, #2] - SW_NPC cmp tmp1, #0 - SW_NPC beq null_ptr_exception_jpc_3 - ldr tmp2, [tmp2, #CP_OFFSET+8] - POP r3 - orr ip, ip, r0, lsl #8 -.abortentry102: - ldr tmp2, [tmp1, tmp2] - cmp r3, tmp2 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -(iaccess_0,iaccess_1,iaccess_2,iaccess_3) -(if_icmple) { - ldrb r2, [jpc, #3] - rsb tmp1, r0, #opc_iaccess_0 - ldrb ip, [jpc, #2] - add jpc, jpc, #4 - ldrsb r0, [jpc, #1] - add tmp2, constpool, r2, lsl #12 - ldr tmp1, [locals, tmp1, lsl #2] - add tmp2, ip, lsl #4 - ldrb ip, [jpc, #2] - SW_NPC cmp tmp1, #0 - SW_NPC beq null_ptr_exception_jpc_3 - ldr tmp2, [tmp2, #CP_OFFSET+8] - POP r3 - orr ip, ip, r0, lsl #8 -.abortentry103: - ldr tmp2, [tmp1, tmp2] - cmp r3, tmp2 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -#endif // NOTICE_SAFEPOINTS - (iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N) (iadd) { @@ -8564,23 +6396,20 @@ DISPATCH_FINISH } +#ifdef NOTICE_SAFEPOINTS + (iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N) (if_icmpeq,if_acmpeq) { ldrb r3, [jpc, #1] rsb r2, r0, #opc_iload_0_iconst_N ldrsb r1, [jpc, #3] + ldr r2, [locals, r2, lsl #2] sub r3, r3, #opc_iconst_0 ldrb ip, [jpc, #4] - ldr r2, [locals, r2, lsl #2] - add jpc, jpc, #2 cmp r2, r3 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + beq branch_taken_unsafe_2 + DISPATCH 5 } (iload_iconst_N) @@ -8589,17 +6418,12 @@ ldrb r3, [jpc, #2] rsb r2, r2, #0 ldrsb r1, [jpc, #4] + ldr r2, [locals, r2, lsl #2] sub r3, r3, #opc_iconst_0 ldrb ip, [jpc, #5] - ldr r2, [locals, r2, lsl #2] - add jpc, jpc, #3 cmp r2, r3 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + beq branch_taken_unsafe_3 + DISPATCH 6 } (iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N) @@ -8608,17 +6432,12 @@ ldrb r3, [jpc, #1] rsb r2, r0, #opc_iload_0_iconst_N ldrsb r1, [jpc, #3] + ldr r2, [locals, r2, lsl #2] sub r3, r3, #opc_iconst_0 ldrb ip, [jpc, #4] - ldr r2, [locals, r2, lsl #2] - add jpc, jpc, #2 cmp r2, r3 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bne branch_taken_unsafe_2 + DISPATCH 5 } (iload_iconst_N) @@ -8627,17 +6446,12 @@ ldrb r3, [jpc, #2] rsb r2, r2, #0 ldrsb r1, [jpc, #4] + ldr r2, [locals, r2, lsl #2] sub r3, r3, #opc_iconst_0 ldrb ip, [jpc, #5] - ldr r2, [locals, r2, lsl #2] - add jpc, jpc, #3 cmp r2, r3 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bne branch_taken_unsafe_3 + DISPATCH 6 } (iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N) @@ -8646,17 +6460,12 @@ ldrb r3, [jpc, #1] rsb r2, r0, #opc_iload_0_iconst_N ldrsb r1, [jpc, #3] + ldr r2, [locals, r2, lsl #2] sub r3, r3, #opc_iconst_0 ldrb ip, [jpc, #4] - ldr r2, [locals, r2, lsl #2] - add jpc, jpc, #2 cmp r2, r3 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + blt branch_taken_unsafe_2 + DISPATCH 5 } (iload_iconst_N) @@ -8665,17 +6474,12 @@ ldrb r3, [jpc, #2] rsb r2, r2, #0 ldrsb r1, [jpc, #4] + ldr r2, [locals, r2, lsl #2] sub r3, r3, #opc_iconst_0 ldrb ip, [jpc, #5] - ldr r2, [locals, r2, lsl #2] - add jpc, jpc, #3 cmp r2, r3 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + blt branch_taken_unsafe_3 + DISPATCH 6 } (iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N) @@ -8684,17 +6488,12 @@ ldrb r3, [jpc, #1] rsb r2, r0, #opc_iload_0_iconst_N ldrsb r1, [jpc, #3] + ldr r2, [locals, r2, lsl #2] sub r3, r3, #opc_iconst_0 ldrb ip, [jpc, #4] - ldr r2, [locals, r2, lsl #2] - add jpc, jpc, #2 cmp r2, r3 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bge branch_taken_unsafe_2 + DISPATCH 5 } (iload_iconst_N) @@ -8703,17 +6502,12 @@ ldrb r3, [jpc, #2] rsb r2, r2, #0 ldrsb r1, [jpc, #4] + ldr r2, [locals, r2, lsl #2] sub r3, r3, #opc_iconst_0 ldrb ip, [jpc, #5] - ldr r2, [locals, r2, lsl #2] - add jpc, jpc, #3 cmp r2, r3 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bge branch_taken_unsafe_3 + DISPATCH 6 } (iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N) @@ -8722,17 +6516,12 @@ ldrb r3, [jpc, #1] rsb r2, r0, #opc_iload_0_iconst_N ldrsb r1, [jpc, #3] + ldr r2, [locals, r2, lsl #2] sub r3, r3, #opc_iconst_0 ldrb ip, [jpc, #4] - ldr r2, [locals, r2, lsl #2] - add jpc, jpc, #2 cmp r2, r3 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bgt branch_taken_unsafe_2 + DISPATCH 5 } (iload_iconst_N) @@ -8741,17 +6530,12 @@ ldrb r3, [jpc, #2] rsb r2, r2, #0 ldrsb r1, [jpc, #4] + ldr r2, [locals, r2, lsl #2] sub r3, r3, #opc_iconst_0 ldrb ip, [jpc, #5] - ldr r2, [locals, r2, lsl #2] - add jpc, jpc, #3 cmp r2, r3 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bgt branch_taken_unsafe_3 + DISPATCH 6 } (iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N) @@ -8760,17 +6544,12 @@ ldrb r3, [jpc, #1] rsb r2, r0, #opc_iload_0_iconst_N ldrsb r1, [jpc, #3] + ldr r2, [locals, r2, lsl #2] sub r3, r3, #opc_iconst_0 ldrb ip, [jpc, #4] - ldr r2, [locals, r2, lsl #2] - add jpc, jpc, #2 cmp r2, r3 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + ble branch_taken_unsafe_2 + DISPATCH 5 } (iload_iconst_N) @@ -8779,18 +6558,15 @@ ldrb r3, [jpc, #2] rsb r2, r2, #0 ldrsb r1, [jpc, #4] + ldr r2, [locals, r2, lsl #2] sub r3, r3, #opc_iconst_0 ldrb ip, [jpc, #5] - ldr r2, [locals, r2, lsl #2] - add jpc, jpc, #3 cmp r2, r3 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} + ble branch_taken_unsafe_3 + DISPATCH 6 +} + +#endif // NOTICE_SAFEPOINTS (iload_iload) (iadd_istore_N) @@ -9582,23 +7358,20 @@ DISPATCH_FINISH } +#ifdef NOTICE_SAFEPOINTS + (iload_iload) (if_icmpeq,if_acmpeq) { ldrb r3, [jpc, #3] rsb r2, r2, #0 ldrsb r1, [jpc, #5] rsb r3, r3, #0 - ldrb ip, [jpc, #6] ldr r2, [locals, r2, lsl #2] ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #4 + ldrb ip, [jpc, #6] cmp r2, r3 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + beq branch_taken_unsafe_4 + DISPATCH 7 } (iload_iload_N) @@ -9607,17 +7380,12 @@ rsb r2, r2, #0 ldrsb r1, [jpc, #4] rsb r3, r3, #opc_iload_0 - ldrb ip, [jpc, #5] ldr r2, [locals, r2, lsl #2] ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #3 + ldrb ip, [jpc, #5] cmp r2, r3 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + beq branch_taken_unsafe_3 + DISPATCH 6 } (iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload) @@ -9626,35 +7394,39 @@ rsb r2, r0, #opc_iload_0_iload ldrsb r1, [jpc, #4] rsb r3, r3, #0 - ldrb ip, [jpc, #5] ldr r2, [locals, r2, lsl #2] ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #3 + ldrb ip, [jpc, #5] cmp r2, r3 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + beq branch_taken_unsafe_3 + DISPATCH 6 } (iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N) (if_icmpeq,if_acmpeq) { rsb r3, r2, #opc_iload_0 + ldrsb r1, [jpc, #3] rsb r2, r0, #opc_iload_0_iload_N - ldrsb r1, [jpc, #3] + ldr r3, [locals, r3, lsl #2] + ldr r2, [locals, r2, lsl #2] ldrb ip, [jpc, #4] + cmp r2, r3 + beq branch_taken_unsafe_2 + DISPATCH 5 +} + +(iload_iload) +(if_icmpne,if_acmpne) { + ldrb r3, [jpc, #3] + rsb r2, r2, #0 + ldrsb r1, [jpc, #5] + rsb r3, r3, #0 ldr r2, [locals, r2, lsl #2] ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #2 + ldrb ip, [jpc, #6] cmp r2, r3 - orr ip, ip, r1, lsl #8 - beq 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bne branch_taken_unsafe_4 + DISPATCH 7 } (iload_iload_N) @@ -9663,17 +7435,12 @@ rsb r2, r2, #0 ldrsb r1, [jpc, #4] rsb r3, r3, #opc_iload_0 - ldrb ip, [jpc, #5] ldr r2, [locals, r2, lsl #2] ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #3 + ldrb ip, [jpc, #5] cmp r2, r3 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bne branch_taken_unsafe_3 + DISPATCH 6 } (iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload) @@ -9682,35 +7449,25 @@ rsb r2, r0, #opc_iload_0_iload ldrsb r1, [jpc, #4] rsb r3, r3, #0 - ldrb ip, [jpc, #5] ldr r2, [locals, r2, lsl #2] ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #3 + ldrb ip, [jpc, #5] cmp r2, r3 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bne branch_taken_unsafe_3 + DISPATCH 6 } (iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N) (if_icmpne,if_acmpne) { rsb r3, r2, #opc_iload_0 + ldrsb r1, [jpc, #3] rsb r2, r0, #opc_iload_0_iload_N - ldrsb r1, [jpc, #3] + ldr r3, [locals, r3, lsl #2] + ldr r2, [locals, r2, lsl #2] ldrb ip, [jpc, #4] - ldr r2, [locals, r2, lsl #2] - ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #2 cmp r2, r3 - orr ip, ip, r1, lsl #8 - bne 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bne branch_taken_unsafe_2 + DISPATCH 5 } (iload_iload) @@ -9719,17 +7476,12 @@ rsb r2, r2, #0 ldrsb r1, [jpc, #5] rsb r3, r3, #0 - ldrb ip, [jpc, #6] ldr r2, [locals, r2, lsl #2] ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #4 + ldrb ip, [jpc, #6] cmp r2, r3 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + blt branch_taken_unsafe_4 + DISPATCH 7 } (iload_iload_N) @@ -9738,17 +7490,12 @@ rsb r2, r2, #0 ldrsb r1, [jpc, #4] rsb r3, r3, #opc_iload_0 - ldrb ip, [jpc, #5] ldr r2, [locals, r2, lsl #2] ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #3 + ldrb ip, [jpc, #5] cmp r2, r3 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + blt branch_taken_unsafe_3 + DISPATCH 6 } (iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload) @@ -9757,35 +7504,25 @@ rsb r2, r0, #opc_iload_0_iload ldrsb r1, [jpc, #4] rsb r3, r3, #0 - ldrb ip, [jpc, #5] ldr r2, [locals, r2, lsl #2] ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #3 + ldrb ip, [jpc, #5] cmp r2, r3 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + blt branch_taken_unsafe_3 + DISPATCH 6 } (iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N) (if_icmplt) { rsb r3, r2, #opc_iload_0 + ldrsb r1, [jpc, #3] rsb r2, r0, #opc_iload_0_iload_N - ldrsb r1, [jpc, #3] + ldr r3, [locals, r3, lsl #2] + ldr r2, [locals, r2, lsl #2] ldrb ip, [jpc, #4] - ldr r2, [locals, r2, lsl #2] - ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #2 cmp r2, r3 - orr ip, ip, r1, lsl #8 - blt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + blt branch_taken_unsafe_2 + DISPATCH 5 } (iload_iload) @@ -9794,17 +7531,12 @@ rsb r2, r2, #0 ldrsb r1, [jpc, #5] rsb r3, r3, #0 - ldrb ip, [jpc, #6] ldr r2, [locals, r2, lsl #2] ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #4 + ldrb ip, [jpc, #6] cmp r2, r3 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bge branch_taken_unsafe_4 + DISPATCH 7 } (iload_iload_N) @@ -9813,17 +7545,12 @@ rsb r2, r2, #0 ldrsb r1, [jpc, #4] rsb r3, r3, #opc_iload_0 - ldrb ip, [jpc, #5] ldr r2, [locals, r2, lsl #2] ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #3 + ldrb ip, [jpc, #5] cmp r2, r3 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bge branch_taken_unsafe_3 + DISPATCH 6 } (iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload) @@ -9832,35 +7559,25 @@ rsb r2, r0, #opc_iload_0_iload ldrsb r1, [jpc, #4] rsb r3, r3, #0 - ldrb ip, [jpc, #5] ldr r2, [locals, r2, lsl #2] ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #3 + ldrb ip, [jpc, #5] cmp r2, r3 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bge branch_taken_unsafe_3 + DISPATCH 6 } (iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N) (if_icmpge) { rsb r3, r2, #opc_iload_0 + ldrsb r1, [jpc, #3] rsb r2, r0, #opc_iload_0_iload_N - ldrsb r1, [jpc, #3] + ldr r3, [locals, r3, lsl #2] + ldr r2, [locals, r2, lsl #2] ldrb ip, [jpc, #4] - ldr r2, [locals, r2, lsl #2] - ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #2 cmp r2, r3 - orr ip, ip, r1, lsl #8 - bge 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bge branch_taken_unsafe_2 + DISPATCH 5 } (iload_iload) @@ -9869,17 +7586,12 @@ rsb r2, r2, #0 ldrsb r1, [jpc, #5] rsb r3, r3, #0 - ldrb ip, [jpc, #6] ldr r2, [locals, r2, lsl #2] ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #4 + ldrb ip, [jpc, #6] cmp r2, r3 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bgt branch_taken_unsafe_4 + DISPATCH 7 } (iload_iload_N) @@ -9888,17 +7600,12 @@ rsb r2, r2, #0 ldrsb r1, [jpc, #4] rsb r3, r3, #opc_iload_0 - ldrb ip, [jpc, #5] ldr r2, [locals, r2, lsl #2] ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #3 + ldrb ip, [jpc, #5] cmp r2, r3 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bgt branch_taken_unsafe_3 + DISPATCH 6 } (iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload) @@ -9907,35 +7614,25 @@ rsb r2, r0, #opc_iload_0_iload ldrsb r1, [jpc, #4] rsb r3, r3, #0 - ldrb ip, [jpc, #5] ldr r2, [locals, r2, lsl #2] ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #3 + ldrb ip, [jpc, #5] cmp r2, r3 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bgt branch_taken_unsafe_3 + DISPATCH 6 } (iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N) (if_icmpgt) { rsb r3, r2, #opc_iload_0 + ldrsb r1, [jpc, #3] rsb r2, r0, #opc_iload_0_iload_N - ldrsb r1, [jpc, #3] + ldr r3, [locals, r3, lsl #2] + ldr r2, [locals, r2, lsl #2] ldrb ip, [jpc, #4] - ldr r2, [locals, r2, lsl #2] - ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #2 cmp r2, r3 - orr ip, ip, r1, lsl #8 - bgt 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + bgt branch_taken_unsafe_2 + DISPATCH 5 } (iload_iload) @@ -9944,17 +7641,12 @@ rsb r2, r2, #0 ldrsb r1, [jpc, #5] rsb r3, r3, #0 - ldrb ip, [jpc, #6] ldr r2, [locals, r2, lsl #2] ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #4 + ldrb ip, [jpc, #6] cmp r2, r3 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + ble branch_taken_unsafe_4 + DISPATCH 7 } (iload_iload_N) @@ -9963,17 +7655,12 @@ rsb r2, r2, #0 ldrsb r1, [jpc, #4] rsb r3, r3, #opc_iload_0 - ldrb ip, [jpc, #5] ldr r2, [locals, r2, lsl #2] ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #3 + ldrb ip, [jpc, #5] cmp r2, r3 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + ble branch_taken_unsafe_3 + DISPATCH 6 } (iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload) @@ -9982,63 +7669,27 @@ rsb r2, r0, #opc_iload_0_iload ldrsb r1, [jpc, #4] rsb r3, r3, #0 - ldrb ip, [jpc, #5] ldr r2, [locals, r2, lsl #2] ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #3 + ldrb ip, [jpc, #5] cmp r2, r3 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE + ble branch_taken_unsafe_3 + DISPATCH 6 } (iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N) (if_icmple) { rsb r3, r2, #opc_iload_0 + ldrsb r1, [jpc, #3] rsb r2, r0, #opc_iload_0_iload_N - ldrsb r1, [jpc, #3] + ldr r3, [locals, r3, lsl #2] + ldr r2, [locals, r2, lsl #2] ldrb ip, [jpc, #4] - ldr r2, [locals, r2, lsl #2] - ldr r3, [locals, r3, lsl #2] - add jpc, jpc, #2 cmp r2, r3 - orr ip, ip, r1, lsl #8 - ble 1f - mov ip, #3 -1: - ldrb r0, [jpc, ip]! - DISPATCH_BYTECODE -} - -#ifdef HW_FP - -(dmac)(dastore) { - ldr tmp2, [stack, #28] - ldr tmp1, [stack, #32] - vldr d2, [stack, #20] - vldr d1, [stack, #12] - vldr d0, [stack, #4] - DISPATCH_START \seq_len - SW_NPC cmp tmp1, #0 - SW_NPC beq null_ptr_exception -.abortentry120: - ldr ip, [tmp1, #8] - cmp tmp2, ip - DISPATCH_NEXT - bcs array_bound_exception_jpc_1_tmp2 - DISPATCH_NEXT - add tmp2, tmp1, tmp2, lsl #3 - fmacd d2, d1, d0 - vstr d2, [tmp2, #BASE_OFFSET_LONG] - DISPATCH_NEXT - DISPATCH_NEXT - add stack, stack, #32 - DISPATCH_FINISH -} - -#endif //HW_FP + ble branch_taken_unsafe_2 + DISPATCH 5 +} + +#endif #endif // FAST_BYTECODES
--- a/ports/hotspot/src/cpu/zero/vm/cppInterpreter_arm.S Thu Jan 21 16:20:47 2010 +0100 +++ b/ports/hotspot/src/cpu/zero/vm/cppInterpreter_arm.S Thu Jan 21 17:56:18 2010 +0000 @@ -19,15 +19,21 @@ #define ARMv4 -#ifdef SHARK +#if defined(SHARK) || defined(THUMB2EE) + #define USE_COMPILER -#define DISABLE_NOTICE_SAFEPOINTS + #endif #ifdef USE_COMPILER +#ifdef SHARK #define MP_COMPILE_THRESHOLD 0x10000 // 65536 - must be a single MOV constant #define UP_COMPILE_THRESHOLD 0x30000 // 196608 - must be a single MOV constant +#else +#define MP_COMPILE_THRESHOLD 0x2700 // 10000 - must be a single MOV constant +#define UP_COMPILE_THRESHOLD 0x2700 // 10000 - must be a single MOV constant +#endif #define MAX_FG_METHOD_SIZE 500 @@ -38,6 +44,12 @@ #define DISABLE_BG_COMP_ON_NON_MP #endif +#ifdef THUMB2EE +#define FREQ_COUNT_OVERFLOW Thumb2_Compile +#else +#define FREQ_COUNT_OVERFLOW _ZN18InterpreterRuntime26frequency_counter_overflowEP10JavaThreadPh +#endif + #endif // USE_COMPILER #ifndef DISABLE_NOTICE_SAFEPOINTS @@ -46,12 +58,6 @@ #ifndef DISABLE_HW_NULL_PTR_CHECK #define HW_NULL_PTR_CHECK #endif -#ifndef DISABLE_FASTPATH_ENTRY -#define FASTPATH_ENTRY -#endif -#ifndef DISABLE_NATIVE_ENTRY -#define NATIVE_ENTRY -#endif #ifndef DISABLE_FAST_BYTECODES #define FAST_BYTECODES #endif @@ -74,67 +80,25 @@ #define tmp1 r11 #define tmp2 r10 -#define tmp_invoke_len lr - -#define regset r3-r11 - -// XXX hardwired constants! -#define tos_btos 0 -#define tos_ctos 1 -#define tos_stos 2 -#define tos_itos 3 -#define tos_ltos 4 -#define tos_ftos 5 -#define tos_dtos 6 -#define tos_atos 7 +#define regset r4,r5,r6,r7,r9,r10,r11 +#define fast_regset r8 #include "offsets_arm.s" -// XXX hardwired constants! -#define RESOURCEAREA_AREA 0 -#define RESOURCEAREA_CHUNK 4 -#define RESOURCEAREA_HWM 8 -#define RESOURCEAREA_MAX 12 - -// XXX hardwired constants! -#define ISTATE_THREAD 0 -#define ISTATE_BCP 4 -#define ISTATE_LOCALS 8 -#define ISTATE_CONSTANTS 12 -#define ISTATE_METHOD 16 -#define ISTATE_MDX 20 -#define ISTATE_STACK 24 -#define ISTATE_ADVANCE_PC 28 -#define ISTATE_MSG 28 -#define ISTATE_CALLEE 32 // union frame_manager_message -#define ISTATE_PREV_LINK 44 -#define ISTATE_OOP_TEMP 48 -#define ISTATE_STACK_BASE 52 -#define ISTATE_STACK_LIMIT 56 -#define ISTATE_MONITOR_BASE 60 -#define ISTATE_SELF_LINK 64 -#define ISTATE_FRAME_TYPE 68 -#define ISTATE_NEXT_FRAME 72 -#define FRAME_SIZE 76 - -// XXX hardwired constants! -#define ENTRY_FRAME 1 -#define INTERPRETER_FRAME 2 -#define SHARK_FRAME 3 -#define FAKE_STUB_FRAME 4 - #define last_implemented_bytecode 201 +#define CODE_ALIGN_SIZE 64 + .macro ALIGN_CODE - .align 3 + .align 6 .endm .macro ALIGN_DATA - .align 3 + .align 6 .endm .macro ALIGN_OPCODE - .align 3 + .align 6 .endm .macro ALIGN_WORD @@ -276,6 +240,24 @@ .endif #endif .endm +@------------------------------------------------ +@ THUMB2 specific code macro +@ Usage: +@ T2 <thumb2 specific code> +@------------------------------------------------ + .macro T2 p1, p2, p3, p4 +#ifdef THUMB2EE + .ifnes "\p4", "" + \p1 \p2, \p3, \p4 + .else + .ifnes "\p3", "" + \p1 \p2, \p3 + .else + \p1 \p2 + .endif + .endif +#endif + .endm .macro Opcode label ALIGN_OPCODE @@ -290,6 +272,7 @@ str \reg, [stack, #(\offset+1) * 4] .endm +#define PUSH java_push .macro PUSH reg1, reg2, reg3, reg4 .ifnes "\reg4", "" stmda stack!, {\reg1, \reg2, \reg3, \reg4} @@ -306,6 +289,7 @@ .endif .endm +#define POP java_pop .macro POP reg1, reg2, reg3, reg4 .ifnes "\reg4", "" ldmib stack!, {\reg1, \reg2, \reg3, \reg4} @@ -346,227 +330,6 @@ str jpc, [istate, #ISTATE_BCP] .endm -@ ECN: I assert that istate->locals and istate->stack cannot move on a GC. -@ The reasoning is that istate itself is stored on the Java stack -@ and locals and stack are relative to istate. Therefore if locals or -@ stack were to move, istate itself would have to move and we would -@ lose our entire interpreter state. -@ To prove this I have changed the code which recaches locals and stack -@ to assert that locals == istate->locals and stack == istate->stack. -@ This saves a lot of needles recaching of interpreter state. - .macro ASSERT_LOCALS_CACHED -#if 0 - str ip, [arm_sp, #-4]! - mrs ip, cpsr - str ip, [arm_sp, #-4]! - mov ip, locals - ldr locals, [istate, #ISTATE_LOCALS] - cmp ip, locals - strne r0, [r0, -r0] - ldr ip, [arm_sp], #4 - msr cpsr, ip - ldr ip, [arm_sp], #4 -#endif - .endm - - .macro ASSERT_STACK_CACHED -#if 0 - str ip, [arm_sp, #-4]! - mrs ip, cpsr - str ip, [arm_sp, #-4]! - mov ip, stack - ldr stack, [istate, #ISTATE_STACK] - cmp ip, stack - strne r0, [r0, -r0] - ldr ip, [arm_sp], #4 - msr cpsr, ip - ldr ip, [arm_sp], #4 -#endif - .endm - -@ DISPATCH_LOOP causes the dispatch code to branch every time to a label 'dispatch_loop' -@ This is primarily for debugging so we can stick assertions at the dispatch_loop label -@ which will then be checked after every bytcode. -@ #define DISPATCH_LOOP - -@ CODETRACE tarces bytecodes in a code buffer which can be examined under gdb -@ Note: DISPATCH_LOOP must be enabled for CODETRACE to work -@ #define CODETRACE - -@ DISPATCH_ASSERTS enables various assertions in the dispatch loop, such as checking -@ stack, frame, locals and constpool are all consistent and not corrupted -@#define DISPATCH_ASSERTS - - .macro ABORTNE - strne r0, [r0, -r0] - .endm - - .macro ABORTCS - strcs r0, [r0, -r0] - .endm - - .macro ABORTCC - strcc r0, [r0, -r0] - .endm - - .macro CHECK_CONSTPOOL -#ifdef DISPATCH_ASSERTS - @ First check istate->constpool == method->constpool - ldr r1, [istate, #ISTATE_CONSTANTS] - ldr r2, [istate, #ISTATE_METHOD] - ldr r2, [r2, #METHOD_CONSTANTS] - ldr r2, [r2, #CONSTANTPOOL_CACHE] - cmp r1, r2 - ABORTNE -@ cmp r1, constpool -@ ABORTNE -#endif - .endm - - .macro CHECK_LOCALS -#ifdef DISPATCH_ASSERTS - @ Check cached locals var is the same as that in istate - ldr r1, [istate, #ISTATE_LOCALS] - cmp r1, locals - ABORTNE -#endif - .endm - - .macro CHECK_FRAME -#ifdef DISPATCH_ASSERTS - @ Check #INTERPRETER_FRAME hasn't been overwritten - ldr r1, [istate, #ISTATE_FRAME_TYPE] - cmp r1, #INTERPRETER_FRAME - ABORTNE - @ Check we are still the topmost frame - ldr r1, [istate, #ISTATE_THREAD] - ldr r1, [r1, #THREAD_TOP_ZERO_FRAME] - add r2, istate, #ISTATE_NEXT_FRAME - cmp r1, r2 - ABORTNE - @ And check the NEXT_FRAME pointer points to a valid frame - ldr r1, [istate, #ISTATE_NEXT_FRAME] - ldr r2, [r1, #-ISTATE_NEXT_FRAME + ISTATE_FRAME_TYPE] - bic r2, r2, #7 @ ECN: Allow for differing frames - cmp r2, #0 - ABORTNE -#endif - .endm - - .macro CHECK_BACKTRACE -#ifdef DISPATCH_ASSERTS - add r3, istate, #ISTATE_NEXT_FRAME -@ ECN: Only check a limited no of frames back. topmost frame already checked -@ Check 2nd frame up - ldr r3, [r3] - ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_FRAME_TYPE] - cmp r2, #ENTRY_FRAME - beq 2f - cmp ip, #INTERPRETER_FRAME - ABORTNE @ Must be ENTRY_FRAME, or INTERPRETER_FRAME - ldr r1, [r3, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS] - ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_METHOD] - ldr r2, [r2, #12] - ldr r2, [r2, #12] - cmp r1, r2 - ABORTNE -@ Check 3rd frame up - ldr r3, [r3] - ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_FRAME_TYPE] - cmp r2, #ENTRY_FRAME - beq 2f - cmp r2, #INTERPRETER_FRAME - ABORTNE @ Must be ENTRY_FRAME, or INTERPRETER_FRAME - ldr r1, [r3, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS] - ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_METHOD] - ldr r2, [r2, #12] - ldr r2, [r2, #12] - cmp r1, r2 - ABORTNE -@ Check 4th frame up - ldr r3, [r3] - ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_FRAME_TYPE] - cmp r2, #ENTRY_FRAME - beq 2f - cmp r2, #INTERPRETER_FRAME - ABORTNE @ Must be ENTRY_FRAME, or INTERPRETER_FRAME - ldr r1, [r3, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS] - ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_METHOD] - ldr r2, [r2, #12] - ldr r2, [r2, #12] - cmp r1, r2 - ABORTNE -@ Check 5th frame up - ldr r3, [r3] - ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_FRAME_TYPE] - cmp r2, #ENTRY_FRAME - beq 2f - cmp r2, #INTERPRETER_FRAME - ABORTNE @ Must be ENTRY_FRAME, or INTERPRETER_FRAME - ldr r1, [r3, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS] - ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_METHOD] - ldr r2, [r2, #12] - ldr r2, [r2, #12] - cmp r1, r2 - ABORTNE -@ Check 7th frame up - ldr r3, [r3] - ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_FRAME_TYPE] - cmp r2, #ENTRY_FRAME - beq 2f - cmp r2, #INTERPRETER_FRAME - ABORTNE @ Must be ENTRY_FRAME, or INTERPRETER_FRAME - ldr r1, [r3, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS] - ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_METHOD] - ldr r2, [r2, #12] - ldr r2, [r2, #12] - cmp r1, r2 - ABORTNE -@ Check 8th frame up - ldr r3, [r3] - ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_FRAME_TYPE] - cmp r2, #ENTRY_FRAME - beq 2f - cmp r2, #INTERPRETER_FRAME - ABORTNE @ Must be ENTRY_FRAME, or INTERPRETER_FRAME - ldr r1, [r3, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS] - ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_METHOD] - ldr r2, [r2, #12] - ldr r2, [r2, #12] - cmp r1, r2 - ABORTNE -2: -#endif - .endm - - .macro CHECK_STACK -#ifdef DISPATCH_ASSERTS - ldr r1, [istate, #ISTATE_STACK_BASE] - cmp stack, r1 - ABORTCS - ldr r1, [istate, #ISTATE_STACK_LIMIT] - @ ECN: The stack can point below the stack limit in the - @ case that we have a full stack. As long as we dont actually - @ try writing to it. - add r2, stack, #4 - cmp r2, r1 - ABORTCC -#endif - .endm - -#define CODETRACE_BUFFER_SIZE (1 * 1024) - .macro TRACE_CODE -#ifdef CODETRACE - ldr r1, [dispatch, #CodeTrace_Idx-XXX] - cmp r1, #CODETRACE_BUFFER_SIZE - moveq r1, #0 - sub r2, dispatch, #XXX-CodeTrace_Buffer_Base - str jpc, [r2, r1] - add r1, r1, #4 - str r1, [dispatch, #CodeTrace_Idx-XXX] -#endif - .endm - .macro BREAK_DISPATCH ldr r1, [dispatch, #DispatchBreakPoint-XXX] cmp r1, jpc @@ -605,23 +368,6 @@ mov r0, r2 .endm -#ifdef DISPATCH_LOOP - .macro DISPATCH_NEXT - .endm - - .macro DISPATCH_FINISH - b dispatch_loop - .endm - - .macro DISPATCH_BYTECODE - b dispatch_loop - .endm - - .macro DISPATCH step=0 - ldrb r0, [jpc, #\step]! - b dispatch_loop - .endm -#else .macro DISPATCH_1 @ ldrb r1, [jpc, #2] .endm @@ -702,7 +448,6 @@ bic ip, ip, #7 ldr pc, [ip, r1, lsl #2] .endm -#endif // DISPATCH_LOOP #define FFI_TYPE_VOID 0 #define FFI_TYPE_FLOAT 2 @@ -759,105 +504,6 @@ .text -do_dispatch_break: - mov pc, lr - -#ifdef DISPATCH_LOOP -@ r0 = bytecode -@ jpc has been updated -dispatch_loop: - TRACE_CODE -dispatch_check_constpool: - CHECK_CONSTPOOL -dispatch_check_locals: - CHECK_LOCALS -dispatch_check_stack: - CHECK_STACK -dispatch_check_frame: - CHECK_FRAME -dispatch_check_backtrace: - CHECK_BACKTRACE -dispatch_break: - BREAK_DISPATCH - ldrb r1, [jpc, #2] - ldr ip, [dispatch, r0, lsl #2] - ldrb r2, [jpc, #1] - ands lr, ip, #7 - moveq pc, ip - ldrb r1, [jpc, lr] - bic ip, ip, #7 - ldr ip, [ip, r1, lsl #2] - mov pc, ip -#endif - -is_subtype_of: - ldr r2, [r1, #16] - add ip, r0, r2 - ldr ip, [ip, #-8] - cmp ip, r1 - moveq r0, #1 - bxeq lr - cmp r2, #20 - movne r0, #0 - bxne lr - b _ZNK5Klass23search_secondary_supersEP12klassOopDesc - -HandleC: - stmfd sp!, {r4, r5, r6, lr} - ldr r3, HandleC_adcons - subs r5, r1, #0 - mov r4, r0 -.HandleC_pic: - add r3, pc, r3 - streq r5, [r0, #0] - beq 2f - ldr r2, HandleC_adcons+4 - ldr r3, [r3, r2] - ldr r0, [r3, #0] - bl pthread_getspecific - ldr r3, [r0, #THREAD_HANDLE_AREA] - ldr r0, [r3, #8] - ldr r1, [r3, #12] - add r2, r0, #4 - cmp r2, r1 - strls r2, [r3, #8] - bhi 3f -1: - str r5, [r0, #0] - str r0, [r4, #0] -2: - mov r0, r4 - ldmfd sp!, {r4, r5, r6, pc} -3: - mov r0, r3 - mov r1, #4 - bl _ZN5Arena4growEj - b 1b -HandleC_adcons: - .word _GLOBAL_OFFSET_TABLE_-(.HandleC_pic+8) - .word _ZN18ThreadLocalStorage13_thread_indexE(GOT) - -HandleMarkCleanerD: - stmfd sp!, {r4, r5, r6, lr} - ldr r3, [r0, #0] - mov r6, r0 - ldr r4, [r3, #40] - ldr r0, [r4, #8] - ldr r5, [r4, #4] - ldr r3, [r0, #0] - cmp r3, #0 - beq 1f - bl _ZN5Chunk9next_chopEv - ldr r0, [r4, #8] -1: - str r0, [r5, #4] - mov r0, r6 - ldr r3, [r4, #12] - str r3, [r5, #8] - ldr r3, [r4, #16] - str r3, [r5, #12] - ldmfd sp!, {r4, r5, r6, pc} - cmpxchg_ptr: stmfd sp!, {r4, r5, r6, r7, r8, lr} mov r6, #0xffffffc0 @@ -883,126 +529,6 @@ mov r0, r8 ldmfd sp!, {r4, r5, r6, r7, r8, pc} -ThreadInVMfromJavaD: - stmfd sp!, {r4, r5, r6, lr} - ldr r5, ThreadInVMfromJavaD_adcons - ldr r3, ThreadInVMfromJavaD_adcons+4 - mov r2, #_thread_in_vm_trans -.ThreadInVMfromJavaD_pic: - add r5, pc, r5 - ldr r6, [r0, #0] - mov r4, r0 - ldr r3, [r5, r3] - str r2, [r6, #THREAD_STATE] - ldr r3, [r3, #0] - cmp r3, #1 - ble 1f - ldr r3, ThreadInVMfromJavaD_adcons+8 - ldr r3, [r5, r3] - ldrb r3, [r3, #0] @ zero_extendqisi2 - cmp r3, #0 - bne 6f - ldr r3, ThreadInVMfromJavaD_adcons+12 - mov r1, #1 - ldr r2, ThreadInVMfromJavaD_adcons+16 - ldr r3, [r5, r3] - ldr r2, [r5, r2] - ldr r3, [r3, #0] - ldr r2, [r2, #0] - and r3, r3, r6, lsr #3 - str r1, [r2, r3] -1: - ldr r3, ThreadInVMfromJavaD_adcons+20 - ldr r3, [r5, r3] - ldr r3, [r3, #0] - cmp r3, #0 - bne 5f -2: - mov r3, #8 - str r3, [r6, #THREAD_STATE] - ldr r0, [r4, #0] - ldr r3, [r0, #THREAD_SPECIALRUNTIMEEXITCONDITION] - cmp r3, #0 - bne 3f - ldr r3, [r0, #THREAD_SUSPEND_FLAGS] - tst r3, #_thread_external_suspend - beq 4f -3: - mov r1, #1 - bl _ZN10JavaThread37handle_special_runtime_exit_conditionEb - mov r0, r4 - ldmfd sp!, {r4, r5, r6, pc} -4: - ldr r3, [r0, #THREAD_SUSPEND_FLAGS] - tst r3, #_thread_deopt_suspend - bne 3b - mov r0, r4 - ldmfd sp!, {r4, r5, r6, pc} -5: - mov r0, r6 - bl _ZN20SafepointSynchronize5blockEP10JavaThread - b 2b -6: - mov r3, #0xffffffa0 - bic r3, r3, #0xf000 - blx r3 - b 1b -ThreadInVMfromJavaD_adcons: - .word _GLOBAL_OFFSET_TABLE_-(.ThreadInVMfromJavaD_pic+8) - .word _ZN2os16_processor_countE(GOT) - .word UseMembar(GOT) - .word _ZN2os20_serialize_page_maskE(GOT) - .word _ZN2os19_mem_serialize_pageE(GOT) - .word _ZN20SafepointSynchronize6_stateE(GOT) - -#define oop_address_tmp tmp1 -#define oop_value_tmp tmp2 -#define oop_lr locals - - ALIGN_CODE -oop_store: - mov oop_lr, lr -@ mov oop_address_tmp, r0 -@ mov oop_value_tmp, r1 - ldr r3, [dispatch, #oopDesc_Address-XXX] - ldr r3, [r3, #0] - ldr r2, [r3, #8] - cmp r2, #1 - beq 1f - mov r0, r3 - mov r1, oop_address_tmp - ldr r3, [r3, #0] - mov r2, oop_value_tmp - mov lr, pc - ldr pc, [r3, #48] -1: - ldr r3, [dispatch, #always_do_update_barrier_Address-XXX] - ldrb r3, [r3] - cmp r3, #0 - beq 2f - mov r3, #0xffffffa0 - bic r3, r3, #0xf000 - blx r3 -2: - mov lr, oop_lr - CACHE_LOCALS - ldr r3, [dispatch, #oopDesc_Address-XXX] - str oop_value_tmp, [oop_address_tmp, #0] - ldr r3, [r3, #0] - ldr r2, [r3, #8] - cmp r2, #1 - beq 3f - mov r0, r3 - mov r1, oop_address_tmp - mov r2, oop_value_tmp - ldr r3, [r3, #0] - ldr pc, [r3, #52] -3: - ldr r3, [r3, #76] - mov r2, #0 - strb r2, [r3, oop_address_tmp, lsr #9] - mov pc, lr - build_frame: mov r3, r0 ldr r0, [r1, #METHOD_ACCESSFLAGS] @@ -1093,13 +619,6 @@ add r1, r1, ip add r1, r1, r2 @ r1->dispatch -#ifndef USE_COMPILER - ldr r2, [r1, #UseCompiler_Address-XXX] - ldrb r2, [r2] - cmp r2, #0 - bne 1f -#endif - ldr r2, [r1, #can_post_interpreter_events-XXX] ldrb r2, [r2] cmp r2, #0 @@ -1119,26 +638,33 @@ asm_method_table: .word normal_entry .word normal_entry_synchronized -#ifdef NATIVE_ENTRY .word native_entry -#else - .word 0 -#endif - .word 0 @ cppInterpreter can handle native_entry_synchronized + .word native_entry_synchronized .word empty_entry .word accessor_entry - .word normal_entry - .word normal_entry - .word normal_entry - .word normal_entry - .word normal_entry - .word normal_entry - .word normal_entry - .word normal_entry + .word normal_entry @ abstract entry + .word normal_entry @ java_lang_math_sin + .word normal_entry @ java_lang_math_cos + .word normal_entry @ java_lang_math_tan + .word normal_entry @ java_lang_math_abs + .word normal_entry @ java_lang_math_sqrt + .word normal_entry @ java_lang_math_log + .word normal_entry @ java_lang_math_log10 ALIGN_CODE - .global empty_entry +native_entry_synchronized: + b fast_native_entry_synchronized + + ALIGN_CODE +fast_native_entry_synchronized: + b _ZN14CppInterpreter12native_entryEP13methodOopDesciP6Thread + + ALIGN_CODE empty_entry: + b fast_empty_entry + + ALIGN_CODE +fast_empty_entry: ldr r3, .L1359 ldr r1, .L1359+4 .LPIC19: @@ -1160,22 +686,22 @@ @ ---- START execute.s --------------------------------------------------------------------- + .global asm_check_null_ptr +asm_check_null_ptr: + #ifdef HW_NULL_PTR_CHECK #define uc_mcontext 20 #define arm_registers_offset 12 #define arm_cpsr_offset 16*4 - .global asm_check_null_ptr -asm_check_null_ptr: add r0, r0, #uc_mcontext + arm_registers_offset ldr r1, [r0, #15*4] adr ip, abort_table abort_loop: ldr r2, [ip], #8 cmp r2, #0 - moveq r0, #0 - bxeq lr + beq 2f cmp r2, r1 bne abort_loop @@ -1193,6 +719,16 @@ do_setcontext: mov r0, #1 bx lr +#endif // HW_NULL_PTR_CHECK +2: +#ifdef THUMB2EE + b Thumb2_Check_Null +#else + mov r0, #0 + bx lr +#endif + +#ifdef HW_NULL_PTR_CHECK abort_table: .word .abortentry5, 1 .word .abortentry6, 1 @@ -1240,19 +776,6 @@ FBC .word .abortentry59, 2 FBC .word .abortentry60, 2 - NSP FBC .word .abortentry61, 0 - NSP FBC .word .abortentry62, 0 - NSP FBC .word .abortentry63, 0 - NSP FBC .word .abortentry64, 0 - NSP FBC .word .abortentry65, 0 - NSP FBC .word .abortentry66, 0 - NSP FBC .word .abortentry67, 0 - NSP FBC .word .abortentry68, 0 - NSP FBC .word .abortentry69, 0 - NSP FBC .word .abortentry70, 0 - NSP FBC .word .abortentry71, 0 - NSP FBC .word .abortentry72, 0 - FBC .word .abortentry73, 1 FBC .word .abortentry74, 1 FBC .word .abortentry75, 1 @@ -1274,18 +797,6 @@ FBC .word .abortentry89, 5 FBC .word .abortentry90, 4 FBC .word .abortentry91, 4 - NSP FBC .word .abortentry92, 3 - NSP FBC .word .abortentry93, 3 - NSP FBC .word .abortentry94, 3 - NSP FBC .word .abortentry95, 3 - NSP FBC .word .abortentry96, 3 - NSP FBC .word .abortentry97, 3 - NSP FBC .word .abortentry98, 3 - NSP FBC .word .abortentry99, 3 - NSP FBC .word .abortentry100, 3 - NSP FBC .word .abortentry101, 3 - NSP FBC .word .abortentry102, 3 - NSP FBC .word .abortentry103, 3 FBC .word .abortentry104, 0 FBC .word .abortentry105, 1 FBC .word .abortentry106, 1 @@ -1299,28 +810,27 @@ FBC .word .abortentry113, 0 .word .abortentry114, 1 - .word .abortentry115, 0 - .word .abortentry116, abstractmethod_exception FBC .word .abortentry117, 0 .word .abortentry118, 0 - .word .abortentry119, return_throw_illegal_monitor_state - FBC .word .abortentry120, 0 .word 0 -#else - .global asm_check_null_ptr -asm_check_null_ptr: - mov r0, #0 - bx lr - #endif -#ifdef NATIVE_ENTRY + + ALIGN_CODE +native_entry: + stmfd arm_sp!, {regset, lr} + bl fast_native_entry + ldmia sp!, {regset, pc} + ALIGN_CODE fast_native_entry: - mov r2, tmp1 - mov r11, tmp2 -fast_native_entry_with_args: + adrl ip, dispatch_init_adcon + mov r11, r0 + ldm ip, {dispatch, r7} + stmdb sp!, {fast_regset, lr} + add dispatch, dispatch, ip + add dispatch, dispatch, r7 ldrh r1, [r11, #METHOD_SIZEOFPARAMETERS] ldr r4, [r2, #THREAD_JAVA_SP] ldr r3, [r2, #THREAD_TOP_ZERO_FRAME] @@ -1477,24 +987,6 @@ ldr ip, [r11, #METHOD_NATIVEHANDLER] ldrh r11, [r11, #METHOD_SIZEOFPARAMETERS] -#ifdef CODETRACE - ldr r1, [dispatch, #CodeTrace_Idx-XXX] - cmp r1, #CODETRACE_BUFFER_SIZE - moveq r1, #0 - sub r2, dispatch, #XXX-CodeTrace_Buffer_Base - mov r3, #0x4e << 24 @ 'NATV' -> r3 - orr r3, r3, #0x4a << 16 - orr r3, r3, #0x54 << 8 - orr r3, r3, #0x56 - str r3, [r2, r1] - add r1, r1, #4 - cmp r1, #CODETRACE_BUFFER_SIZE - moveq r1, #0 - str ip, [r2, r1] - add r1, r1, #4 - str r1, [dispatch, #CodeTrace_Idx-XXX] -#endif - ldmia arm_sp!, {r0, r1, r2, r3} blx ip @@ -1557,50 +1049,40 @@ str lr, [r9, #THREAD_TOP_ZERO_FRAME] str tmp1, [ip, #JNIHANDLEBLOCK_TOP] str r1, [r5, #4] - cmp istate, #0 str r5, [r9, #THREAD_JAVA_SP] - bne .fast_native_return - ldmfd arm_sp!, {r3, r4, r5, r6, r7, r8, r9, r10, r11, pc} + ldmfd arm_sp!, {fast_regset, pc} .fast_native_return_byte: mov r0, r0, lsl #24 str lr, [r9, #THREAD_TOP_ZERO_FRAME] mov r0, r0, asr #24 str tmp1, [ip, #JNIHANDLEBLOCK_TOP] str r0, [r5, #-4]! - cmp istate, #0 str r5, [r9, #THREAD_JAVA_SP] - bne .fast_native_return - ldmfd arm_sp!, {r3, r4, r5, r6, r7, r8, r9, r10, r11, pc} + ldmfd arm_sp!, {fast_regset, pc} .fast_native_return_char: mov r0, r0, lsl #16 str lr, [r9, #THREAD_TOP_ZERO_FRAME] mov r0, r0, lsr #16 str tmp1, [ip, #JNIHANDLEBLOCK_TOP] str r0, [r5, #-4]! - cmp istate, #0 str r5, [r9, #THREAD_JAVA_SP] - bne .fast_native_return - ldmfd arm_sp!, {r3, r4, r5, r6, r7, r8, r9, r10, r11, pc} + ldmfd arm_sp!, {fast_regset, pc} .fast_native_return_bool: ands r0, r0, #255 str lr, [r9, #THREAD_TOP_ZERO_FRAME] movne r0, #1 str tmp1, [ip, #JNIHANDLEBLOCK_TOP] str r0, [r5, #-4]! - cmp istate, #0 str r5, [r9, #THREAD_JAVA_SP] - bne .fast_native_return - ldmfd arm_sp!, {r3, r4, r5, r6, r7, r8, r9, r10, r11, pc} + ldmfd arm_sp!, {fast_regset, pc} .fast_native_return_obj: cmp r0, #0 ldrne r0, [r0] str r0, [r5, #-4]! str lr, [r9, #THREAD_TOP_ZERO_FRAME] str tmp1, [ip, #JNIHANDLEBLOCK_TOP] - cmp istate, #0 str r5, [r9, #THREAD_JAVA_SP] - bne .fast_native_return - ldmfd arm_sp!, {r3, r4, r5, r6, r7, r8, r9, r10, r11, pc} + ldmfd arm_sp!, {fast_regset, pc} .fast_native_return_short: mov r0, r0, lsl #16 mov r0, r0, asr #16 @@ -1610,32 +1092,8 @@ str lr, [r9, #THREAD_TOP_ZERO_FRAME] str tmp1, [ip, #JNIHANDLEBLOCK_TOP] .fast_native_exit: - cmp istate, #0 str r5, [r9, #THREAD_JAVA_SP] - ldmeqfd arm_sp!, {r3, r4, r5, r6, r7, r8, r9, r10, r11, pc} -.fast_native_return: - ldr r2, [istate, #ISTATE_STACK_LIMIT] - sub r5, r5, #4 - str r5, [istate, #ISTATE_STACK] - - ldr r1, [r9, #THREAD_TOP_ZERO_FRAME] - add r2, r2, #4 - str r2, [r9, #THREAD_JAVA_SP] - str r1, [r9, #THREAD_LAST_JAVA_SP] - ldr r0, [istate, #ISTATE_THREAD] - CACHE_STACK - CACHE_JPC - ldr r3, [r0, #THREAD_PENDING_EXC] - DISPATCH_START 3 - DISPATCH_NEXT - CACHE_CP - DISPATCH_NEXT - cmp r3, #0 - DISPATCH_NEXT - bne invokenative_exception - DISPATCH_NEXT - CACHE_LOCALS - DISPATCH_FINISH + ldmfd arm_sp!, {fast_regset, pc} .fast_native_entry_throw_stack_overflow: str r0, [r9, #THREAD_LAST_JAVA_SP] @@ -1659,958 +1117,46 @@ bl _ZN10JavaThread40check_special_condition_for_native_transEPS_ ldmia arm_sp!, {r0, r1} b .fast_native_entry_do_return -#endif // NATIVE_ENTRY #include "bytecodes_arm.s" Opcode idiv - POP tmp2, tmp1 - DISPATCH_START 1 -int_div: - cmp tmp2, #0x20 - DISPATCH_NEXT - adr r3, .div_table - DISPATCH_NEXT - ldrcc pc, [r3, tmp2, lsl #2] - - ands a4, tmp2, #0x80000000 - rsbmi tmp2, tmp2, #0 - eors lr, a4, tmp1, ASR #32 - rsbcs tmp1, tmp1, #0 - movs a3, tmp2 -.s_loop: - cmp a3, tmp1, LSR #8 - movls a3, a3, LSL #8 - blo .s_loop - cmp a3, tmp1, LSR #1 - bhi .s_jump7 - cmp a3, tmp1, LSR #2 - bhi .s_jump6 - cmp a3, tmp1, LSR #3 - bhi .s_jump5 - cmp a3, tmp1, LSR #4 - bhi .s_jump4 - cmp a3, tmp1, LSR #5 - bhi .s_jump3 - cmp a3, tmp1, LSR #6 - bhi .s_jump2 - cmp a3, tmp1, LSR #7 - bhi .s_jump1 -.s_loop2: -@ not executed when falling into .s_loop2 - movhi a3, a3, LSR #8 - cmp tmp1, a3, LSL #7 - adc a4, a4, a4 - subcs tmp1, tmp1, a3, LSL #7 - cmp tmp1, a3, LSL #6 -.s_jump1: - adc a4, a4, a4 - subcs tmp1, tmp1, a3, LSL #6 - cmp tmp1, a3, LSL #5 -.s_jump2: - adc a4, a4, a4 - subcs tmp1, tmp1, a3, LSL #5 - cmp tmp1, a3, LSL #4 -.s_jump3: - adc a4, a4, a4 - subcs tmp1, tmp1, a3, LSL #4 - cmp tmp1, a3, LSL #3 -.s_jump4: - adc a4, a4, a4 - subcs tmp1, tmp1, a3, LSL #3 - cmp tmp1, a3, LSL #2 -.s_jump5: - adc a4, a4, a4 - subcs tmp1, tmp1, a3, LSL #2 - cmp tmp1, a3, LSL #1 -.s_jump6: - adc a4, a4, a4 - subcs tmp1, tmp1, a3, LSL #1 -.s_jump7: - cmp tmp1, a3 - adc a4, a4, a4 - subcs tmp1, tmp1, a3 - cmp a3, tmp2 - bne .s_loop2 - movs lr, lr, lsl #1 - rsbcs a4, a4, #0 - DISPATCH_NEXT - DISPATCH_NEXT - PUSH a4 - DISPATCH_FINISH - -.div_table: - .word div_zero_jpc_1 - .word .divc_1 - .word .divc_2 - .word .divc_3 - .word .divc_4 - .word .divc_5 - .word .divc_6 - .word .divc_7 - .word .divc_8 - .word .divc_9 - .word .divc_10 - .word .divc_11 - .word .divc_12 - .word .divc_13 - .word .divc_14 - .word .divc_15 - .word .divc_16 - .word .divc_17 - .word .divc_18 - .word .divc_19 - .word .divc_20 - .word .divc_21 - .word .divc_22 - .word .divc_23 - .word .divc_24 - .word .divc_25 - .word .divc_26 - .word .divc_27 - .word .divc_28 - .word .divc_29 - .word .divc_30 - .word .divc_31 - -.divc_1: - DISPATCH_STATE 3 - DISPATCH_NEXT - DISPATCH_NEXT - PUSH tmp1 - DISPATCH_FINISH -.divc_2: - DISPATCH_STATE 3 - DISPATCH_NEXT - add tmp1, tmp1, tmp1, lsr #31 - mov tmp2, tmp1, asr #1 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_3: - DISPATCH_STATE 3 - ldr tmp2, .dc_3 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - sub tmp2, a4, tmp1, asr #31 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_4: - DISPATCH_STATE 3 - movs a4, tmp1 - DISPATCH_NEXT - addmi a4, a4, #3 - mov tmp2, a4, asr #2 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_5: - DISPATCH_STATE 3 - ldr tmp2, .dc_5 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #1 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_6: - DISPATCH_STATE 3 - ldr tmp2, .dc_6 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - sub tmp2, a4, tmp1, asr #31 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_7: - DISPATCH_STATE 3 - ldr tmp2, .dc_7 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov tmp2, tmp1, asr #31 - add lr, tmp1, a4 - rsb tmp2, tmp2, lr, asr #2 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_8: - DISPATCH_STATE 3 - movs lr, tmp1 - DISPATCH_NEXT - addmi lr, lr, #7 - mov tmp2, lr, asr #3 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_9: - DISPATCH_STATE 3 - ldr tmp2, .dc_9 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #1 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_10: - DISPATCH_STATE 3 - ldr tmp2, .dc_10 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #2 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_11: - DISPATCH_STATE 3 - ldr tmp2, .dc_11 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #1 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_12: - DISPATCH_STATE 3 - ldr tmp2, .dc_12 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #1 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_13: - DISPATCH_STATE 3 - ldr tmp2, .dc_13 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #2 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_14: - DISPATCH_STATE 3 - ldr tmp2, .dc_14 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov tmp2, tmp1, asr #31 - add lr, tmp1, a4 - rsb tmp2, tmp2, lr, asr #3 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_15: - DISPATCH_STATE 3 - ldr tmp2, .dc_15 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov tmp2, tmp1, asr #31 - add lr, tmp1, a4 - rsb tmp2, tmp2, lr, asr #3 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_16: - DISPATCH_STATE 3 - movs lr, tmp1 - DISPATCH_NEXT - addmi lr, lr, #15 - mov tmp2, lr, asr #4 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_17: - DISPATCH_STATE 3 - ldr tmp2, .dc_17 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #3 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_18: - DISPATCH_STATE 3 - ldr tmp2, .dc_18 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #2 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_19: - DISPATCH_STATE 3 - ldr tmp2, .dc_19 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #3 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_20: - DISPATCH_STATE 3 - ldr tmp2, .dc_20 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #3 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_21: - DISPATCH_STATE 3 - ldr tmp2, .dc_21 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #2 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_22: - DISPATCH_STATE 3 - ldr tmp2, .dc_22 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #2 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_23: - DISPATCH_STATE 3 - ldr tmp2, .dc_23 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov tmp2, tmp1, asr #31 - add lr, tmp1, a4 - rsb tmp2, tmp2, lr, asr #4 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_24: - DISPATCH_STATE 3 - ldr tmp2, .dc_24 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #2 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_25: - DISPATCH_STATE 3 - ldr tmp2, .dc_25 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #3 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_26: - DISPATCH_STATE 3 - ldr tmp2, .dc_26 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #3 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_27: - DISPATCH_STATE 3 - ldr tmp2, .dc_27 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #3 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_28: - DISPATCH_STATE 3 - ldr tmp2, .dc_28 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov tmp2, tmp1, asr #31 - add lr, tmp1, a4 - rsb tmp2, tmp2, lr, asr #4 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_29: - DISPATCH_STATE 3 - ldr tmp2, .dc_29 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov tmp2, tmp1, asr #31 - add lr, tmp1, a4 - rsb tmp2, tmp2, lr, asr #4 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_30: - DISPATCH_STATE 3 - ldr tmp2, .dc_30 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov tmp2, tmp1, asr #31 - add lr, tmp1, a4 - rsb tmp2, tmp2, lr, asr #4 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.divc_31: - DISPATCH_STATE 3 - ldr tmp2, .dc_31 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov tmp2, tmp1, asr #31 - add lr, tmp1, a4 - rsb tmp2, tmp2, lr, asr #4 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.dc_7: -.dc_14: - .word 0x92492493 -.dc_15: -.dc_30: - .word 0x88888889 -.dc_23: - .word 0xb21642c9 -.dc_28: - .word 0x92492493 -.dc_29: - .word 0x8d3dcb09 -.dc_31: - .word 0x84210843 -.dc_6: -.dc_12: -.dc_24: - .word 0x2aaaaaab -.dc_19: - .word 0x6bca1af3 -.dc_5: -.dc_10: -.dc_20: - .word 0x66666667 -.dc_21: - .word 0x30c30c31 -.dc_11: -.dc_22: - .word 0x2e8ba2e9 -.dc_26: -.dc_13: - .word 0x4ec4ec4f -.dc_25: - .word 0x51eb851f -.dc_27: - .word 0x4bda12f7 -.dc_3: - .word 0x55555556 -.dc_17: - .word 0x78787879 -.dc_9: -.dc_18: - .word 0x38e38e39 - + POP r1 + POP r0 + cmp r1, #0 + beq divide_by_zero_exception + bl __aeabi_idiv + PUSH r0 + DISPATCH 1 + + Opcode idiv_clz + + POP r1 + POP r0 + bl int_div +idiv_clz_ret: + PUSH r0 + DISPATCH 1 Opcode irem - POP tmp2, tmp1 - DISPATCH_START 1 -int_rem: - cmp tmp2, #0x20 - DISPATCH_NEXT - adr r3, .rem_table - DISPATCH_NEXT - ldrcc pc, [r3, tmp2, lsl #2] - - ands a4, tmp2, #0x80000000 - rsbmi tmp2, tmp2, #0 - eors lr, a4, tmp1, ASR #32 - rsbcs tmp1, tmp1, #0 - movs a3, tmp2 -.r_loop: - cmp a3, tmp1, LSR #8 - movls a3, a3, LSL #8 - blo .r_loop - cmp a3, tmp1, LSR #1 - bhi .r_jump7 - cmp a3, tmp1, LSR #2 - bhi .r_jump6 - cmp a3, tmp1, LSR #3 - bhi .r_jump5 - cmp a3, tmp1, LSR #4 - bhi .r_jump4 - cmp a3, tmp1, LSR #5 - bhi .r_jump3 - cmp a3, tmp1, LSR #6 - bhi .r_jump2 - cmp a3, tmp1, LSR #7 - bhi .r_jump1 -.r_loop2: -@ not executed when falling into .r_loop2 - movhi a3, a3, LSR #8 - cmp tmp1, a3, LSL #7 - adc a4, a4, a4 - subcs tmp1, tmp1, a3, LSL #7 - cmp tmp1, a3, LSL #6 -.r_jump1: - adc a4, a4, a4 - subcs tmp1, tmp1, a3, LSL #6 - cmp tmp1, a3, LSL #5 -.r_jump2: - adc a4, a4, a4 - subcs tmp1, tmp1, a3, LSL #5 - cmp tmp1, a3, LSL #4 -.r_jump3: - adc a4, a4, a4 - subcs tmp1, tmp1, a3, LSL #4 - cmp tmp1, a3, LSL #3 -.r_jump4: - adc a4, a4, a4 - subcs tmp1, tmp1, a3, LSL #3 - cmp tmp1, a3, LSL #2 -.r_jump5: - adc a4, a4, a4 - subcs tmp1, tmp1, a3, LSL #2 - cmp tmp1, a3, LSL #1 -.r_jump6: - adc a4, a4, a4 - subcs tmp1, tmp1, a3, LSL #1 -.r_jump7: - cmp tmp1, a3 - adc a4, a4, a4 - subcs tmp1, tmp1, a3 - cmp a3, tmp2 - bne .r_loop2 - movs lr, lr, lsl #1 - DISPATCH_NEXT - rsbmi tmp1, tmp1, #0 - DISPATCH_NEXT - PUSH tmp1 - DISPATCH_FINISH - -.rem_table: - .word div_zero_jpc_1 - .word .remc_1 - .word .remc_2 - .word .remc_3 - .word .remc_4 - .word .remc_5 - .word .remc_6 - .word .remc_7 - .word .remc_8 - .word .remc_9 - .word .remc_10 - .word .remc_11 - .word .remc_12 - .word .remc_13 - .word .remc_14 - .word .remc_15 - .word .remc_16 - .word .remc_17 - .word .remc_18 - .word .remc_19 - .word .remc_20 - .word .remc_21 - .word .remc_22 - .word .remc_23 - .word .remc_24 - .word .remc_25 - .word .remc_26 - .word .remc_27 - .word .remc_28 - .word .remc_29 - .word .remc_30 - .word .remc_31 - -.remc_1: - DISPATCH_STATE 3 - DISPATCH_NEXT - mov tmp2, #0 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_2: - DISPATCH_STATE 3 - add lr, tmp1, tmp1, lsr #31 - mov tmp2, lr, asr #1 - DISPATCH_NEXT - sub tmp2, tmp1, tmp2, lsl #1 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_3: - DISPATCH_STATE 3 - ldr tmp2, .dc_3 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - sub tmp2, a4, tmp1, asr #31 - add lr, tmp2, tmp2, lsl #1 - sub tmp2, tmp1, lr - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_4: - DISPATCH_STATE 3 - movs lr, tmp1 - DISPATCH_NEXT - addmi lr, lr, #3 - mov tmp2, lr, asr #2 - sub tmp2, tmp1, tmp2, lsl #2 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_5: - DISPATCH_STATE 3 - ldr tmp2, .dc_5 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #1 - add lr, tmp2, tmp2, lsl #2 - sub tmp2, tmp1, lr - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_6: - DISPATCH_STATE 3 - ldr tmp2, .dc_6 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - sub tmp2, a4, tmp1, asr #31 - add lr, tmp2, tmp2, lsl #1 - sub tmp2, tmp1, lr, lsl #1 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_7: - DISPATCH_STATE 3 - ldr tmp2, .dc_7 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov tmp2, tmp1, asr #31 - add lr, tmp1, a4 - rsb tmp2, tmp2, lr, asr #2 - rsb lr, tmp2, tmp2, lsl #3 - sub tmp2, tmp1, lr - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_8: - DISPATCH_STATE 3 - movs lr, tmp1 - DISPATCH_NEXT - addmi lr, lr, #7 - mov tmp2, lr, asr #3 - sub tmp2, tmp1, tmp2, lsl #3 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_9: - DISPATCH_STATE 3 - ldr tmp2, .dc_9 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #1 - add lr, tmp2, tmp2, lsl #3 - sub tmp2, tmp1, lr - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_10: - DISPATCH_STATE 3 - ldr tmp2, .dc_10 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #2 - add lr, tmp2, tmp2, lsl #2 - sub tmp2, tmp1, lr, lsl #1 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_11: - DISPATCH_STATE 3 - ldr tmp2, .dc_11 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #1 - add lr, tmp2, tmp2, lsl #2 - add lr, tmp2, lr, lsl #1 - sub tmp2, tmp1, lr - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_12: - DISPATCH_STATE 3 - ldr tmp2, .dc_12 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #1 - add lr, tmp2, tmp2, lsl #1 - sub tmp2, tmp1, lr, lsl #2 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_13: - DISPATCH_STATE 3 - ldr tmp2, .dc_13 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #2 - add lr, tmp2, tmp2, lsl #1 - add lr, tmp2, lr, lsl #2 - sub tmp2, tmp1, lr - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_14: - DISPATCH_STATE 3 - ldr tmp2, .dc_14 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov tmp2, tmp1, asr #31 - add lr, tmp1, a4 - rsb tmp2, tmp2, lr, asr #3 - rsb lr, tmp2, tmp2, lsl #3 - sub tmp2, tmp1, lr, lsl #1 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_15: - DISPATCH_STATE 3 - ldr tmp2, .dc_15 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov tmp2, tmp1, asr #31 - add lr, tmp1, a4 - rsb tmp2, tmp2, lr, asr #3 - rsb lr, tmp2, tmp2, lsl #4 - sub tmp2, tmp1, lr - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_16: - DISPATCH_STATE 3 - movs lr, tmp1 - DISPATCH_NEXT - addmi lr, lr, #15 - mov tmp2, lr, asr #4 - sub tmp2, tmp1, tmp2, lsl #4 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_17: - DISPATCH_STATE 3 - ldr tmp2, .dc_17 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #3 - add lr, tmp2, tmp2, lsl #4 - sub tmp2, tmp1, lr - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_18: - DISPATCH_STATE 3 - ldr tmp2, .dc_18 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #2 - add lr, tmp2, tmp2, lsl #3 - sub tmp2, tmp1, lr, lsl #1 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_19: - DISPATCH_STATE 3 - ldr tmp2, .dc_19 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #3 - add lr, tmp2, tmp2, lsl #3 - add lr, tmp2, lr, lsl #1 - sub tmp2, tmp1, lr - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_20: - DISPATCH_STATE 3 - ldr tmp2, .dc_20 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #3 - add lr, tmp2, tmp2, lsl #2 - sub tmp2, tmp1, lr, lsl #2 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_21: - DISPATCH_STATE 3 - ldr tmp2, .dc_21 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #2 - add lr, tmp2, tmp2, lsl #1 - rsb lr, lr, lr, lsl #3 - sub tmp2, tmp1, lr - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_22: - DISPATCH_STATE 3 - ldr tmp2, .dc_22 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #2 - add lr, tmp2, tmp2, lsl #2 - add lr, tmp2, lr, lsl #1 - sub tmp2, tmp1, lr, lsl #1 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_23: - DISPATCH_STATE 3 - ldr tmp2, .dc_23 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov tmp2, tmp1, asr #31 - add lr, tmp1, a4 - rsb tmp2, tmp2, lr, asr #4 - add lr, tmp2, tmp2, lsl #1 - rsb lr, tmp2, lr, lsl #3 - sub tmp2, tmp1, lr - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_24: - DISPATCH_STATE 3 - ldr tmp2, .dc_24 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #2 - add lr, tmp2, tmp2, lsl #1 - sub tmp2, tmp1, lr, lsl #3 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_25: - DISPATCH_STATE 3 - ldr tmp2, .dc_25 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #3 - add lr, tmp2, tmp2, lsl #2 - add lr, lr, lr, lsl #2 - sub tmp2, tmp1, lr - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_26: - DISPATCH_STATE 3 - ldr tmp2, .dc_26 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #3 - add lr, tmp2, tmp2, lsl #1 - add lr, tmp2, lr, lsl #2 - sub tmp2, tmp1, lr, lsl #1 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_27: - DISPATCH_STATE 3 - ldr tmp2, .dc_27 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov lr, tmp1, asr #31 - rsb tmp2, lr, a4, asr #3 - add lr, tmp2, tmp2, lsl #1 - add lr, lr, lr, lsl #3 - sub tmp2, tmp1, lr - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_28: - DISPATCH_STATE 3 - ldr tmp2, .dc_28 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov tmp2, tmp1, asr #31 - add lr, tmp1, a4 - rsb tmp2, tmp2, lr, asr #4 - rsb lr, tmp2, tmp2, lsl #3 - sub tmp2, tmp1, lr, lsl #2 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_29: - DISPATCH_STATE 3 - ldr tmp2, .dc_29 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov tmp2, tmp1, asr #31 - add lr, tmp1, a4 - rsb tmp2, tmp2, lr, asr #4 - rsb lr, tmp2, tmp2, lsl #3 - add lr, tmp2, lr, lsl #2 - sub tmp2, tmp1, lr - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_30: - DISPATCH_STATE 3 - ldr tmp2, .dc_30 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov tmp2, tmp1, asr #31 - add lr, tmp1, a4 - rsb tmp2, tmp2, lr, asr #4 - rsb lr, tmp2, tmp2, lsl #4 - sub tmp2, tmp1, lr, lsl #1 - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH -.remc_31: - DISPATCH_STATE 3 - ldr tmp2, .dc_31 - DISPATCH_NEXT - smull lr, a4, tmp1, tmp2 - mov tmp2, tmp1, asr #31 - add lr, tmp1, a4 - rsb tmp2, tmp2, lr, asr #4 - rsb lr, tmp2, tmp2, lsl #5 - sub tmp2, tmp1, lr - DISPATCH_NEXT - PUSH tmp2 - DISPATCH_FINISH + POP r1 + POP r0 + cmp r1, #0 + beq divide_by_zero_exception + bl __aeabi_idivmod + PUSH r1 + DISPATCH 1 + + Opcode irem_clz + + POP r1 + POP r0 + bl int_rem +irem_clz_ret: + PUSH r0 + DISPATCH 1 Opcode goto ldrsb r1, [jpc, #1] @@ -2622,6 +1168,46 @@ ble do_backedge DISPATCH_FINISH +branch_taken_unsafe: + mov r2, r2, lsl #24 + orr tmp1, r1, r2, asr #16 + DISPATCH_START_REG tmp1 + USEC cmp tmp1, #0 + USEC ble do_backedge + DISPATCH_FINISH + +branch_taken_unsafe_1: + add jpc, jpc, #1 + orr tmp1, ip, r1, lsl #8 + DISPATCH_START_REG tmp1 + USEC cmp tmp1, #0 + USEC ble do_backedge + DISPATCH_FINISH + +branch_taken_unsafe_2: + add jpc, jpc, #2 + orr tmp1, ip, r1, lsl #8 + DISPATCH_START_REG tmp1 + USEC cmp tmp1, #0 + USEC ble do_backedge + DISPATCH_FINISH + +branch_taken_unsafe_3: + add jpc, jpc, #3 + orr tmp1, ip, r1, lsl #8 + DISPATCH_START_REG tmp1 + USEC cmp tmp1, #0 + USEC ble do_backedge + DISPATCH_FINISH + +branch_taken_unsafe_4: + add jpc, jpc, #4 + orr tmp1, ip, r1, lsl #8 + DISPATCH_START_REG tmp1 + USEC cmp tmp1, #0 + USEC ble do_backedge + DISPATCH_FINISH + do_backedge: USEC ldr tmp2, [istate, #ISTATE_METHOD] OSR ldr lr, [dispatch, #InterpreterInvocationLimit_Address-XXX] @@ -2631,7 +1217,11 @@ OSR ldr lr, [lr] USEC add ip, ip, #INVOCATIONCOUNTER_COUNTINCREMENT USEC str r1, [tmp2, #METHOD_BACKEDGECOUNTER] +#ifdef THUMB2EE + OSR cmp r1, lr +#else OSR cmp r1, lr, lsl #2 +#endif USEC str ip, [tmp2, #METHOD_INVOCATIONCOUNTER] OSR bcs do_osr @@ -2645,23 +1235,37 @@ do_synchronize: - add r0, istate, #ISTATE_THREAD - bl HandleMarkCleanerD - ldr r0, [istate, #ISTATE_THREAD] DECACHE_JPC DECACHE_STACK - bl _ZN20SafepointSynchronize5blockEP10JavaThread - ASSERT_STACK_CACHED - ASSERT_LOCALS_CACHED ldr r0, [istate, #ISTATE_THREAD] + bl Helper_SafePoint CACHE_CP - ldr r3, [r0, #THREAD_PENDING_EXC] CACHE_JPC - cmp r3, #0 + cmp r0, #0 bne handle_exception DISPATCH 0 #ifdef ON_STACK_REPLACEMENT + +#ifdef THUMB2EE +do_osr: + ldr r3, [tmp2, #METHOD_CONSTMETHOD] + DECACHE_JPC + DECACHE_STACK + ldr r0, [istate, #ISTATE_THREAD] + sub r1, jpc, r3 + sub r1, r1, #CONSTMETHOD_CODEOFFSET + bl FREQ_COUNT_OVERFLOW +1: + cmp r0, #0 + bne call_thumb2 + CACHE_CP + CACHE_JPC + DISPATCH_START 0 + b osr_continue + +#else + do_osr: ldr ip, [dispatch, #UseOnStackReplacement_Address-XXX] ldrb ip, [ip] @@ -2680,15 +1284,13 @@ mov r3, #1 ldr r5, [tmp2] str r3, [tmp2] - bl _ZN18InterpreterRuntime26frequency_counter_overflowEP10JavaThreadPh + bl FREQ_COUNT_OVERFLOW str r5, [tmp2] b 2f 1: - bl _ZN18InterpreterRuntime26frequency_counter_overflowEP10JavaThreadPh + bl FREQ_COUNT_OVERFLOW 2: ldr r3, [istate, #ISTATE_THREAD] - ASSERT_LOCALS_CACHED - ASSERT_STACK_CACHED CACHE_CP ldr r1, [r3, #THREAD_PENDING_EXC] CACHE_JPC @@ -2702,13 +1304,9 @@ 1: DISPATCH_START 0 b osr_continue -#endif - -#ifdef ON_STACK_REPLACEMENT + osr_migrate: ldr tmp1, [r0, #128] @ osr_method->osr_entry() - ldr tmp2, [istate, #ISTATE_ADVANCE_PC] -@ ldr istate, [istate, #ISTATE_NEXT_FRAME] mov r0, r3 bl _ZN13SharedRuntime19OSR_migration_beginEP10JavaThread mov r1, r0 @@ -2730,32 +1328,11 @@ mov lr, pc ldr pc, [tmp1] - cmp tmp2, #0 - ldmeqfd arm_sp!, {regset, pc} - - ldr istate, [istate, #ISTATE_NEXT_FRAME] - ldr lr, [istate, #-ISTATE_NEXT_FRAME+ISTATE_THREAD]! - CACHE_JPC - ldr stack, [lr, #THREAD_JAVA_SP] - ldr r2, [istate, #ISTATE_STACK_LIMIT] - sub stack, stack, #4 - - ldr r1, [lr, #THREAD_TOP_ZERO_FRAME] - add r2, r2, #4 - str r2, [lr, #THREAD_JAVA_SP] - str r1, [lr, #THREAD_LAST_JAVA_SP] - ldr r3, [lr, #THREAD_PENDING_EXC] - DISPATCH_START_REG tmp2 - CACHE_LOCALS - DISPATCH_NEXT - DISPATCH_NEXT - cmp r3, #0 - DISPATCH_NEXT - bne return_exception - DISPATCH_NEXT - CACHE_CP - DISPATCH_FINISH -#endif + ldmfd arm_sp!, {fast_regset, pc} + +#endif // THUMB2EE + +#endif // ON_STACK_REPLACEMENT Opcode ifeq Opcode ifnull @@ -2867,18 +1444,12 @@ ldr r1, [r3] cmp r1, #1 bne handle_return - add r0, istate, #ISTATE_THREAD - bl HandleMarkCleanerD - ldr r0, [istate, #ISTATE_THREAD] DECACHE_JPC DECACHE_STACK - bl _ZN20SafepointSynchronize5blockEP10JavaThread ldr r0, [istate, #ISTATE_THREAD] - ASSERT_STACK_CACHED - ldr r3, [r0, #THREAD_PENDING_EXC] + bl Helper_SafePoint CACHE_JPC -@ CACHE_LOCALS & CACHE_CP not require for handle_retuen / handle_exception - cmp r3, #0 + cmp r0, #0 beq handle_return b handle_exception @@ -2889,8 +1460,6 @@ DECACHE_JPC DECACHE_STACK bl _ZN18InterpreterRuntime15resolve_get_putEP10JavaThreadN9Bytecodes4CodeE - ASSERT_STACK_CACHED - ASSERT_LOCALS_CACHED ldr r0, [istate, #ISTATE_THREAD] CACHE_JPC ldr r3, [r0, #THREAD_PENDING_EXC] @@ -3057,19 +1626,12 @@ stm tmp2, {r2, r3} DISPATCH 3 putfield_a: - GET_STACK 1, r0 - add oop_address_tmp, r0, tmp2 - POP oop_value_tmp - cmp r0, #0 + POP r2, r3 + cmp r3, #0 beq null_ptr_exception - bl oop_store - ldr r3, [dispatch, #Universe_collectedHeap_Address-XXX] - POP r2 - ldr r3, [r3, #0] - ldr r3, [r3, #12] - ldr r3, [r3, #76] - mov tmp2, #0 - strb tmp2, [r3, r2, lsr #9] + str r2, [r3, tmp2] + mov r0, r3 + bl Helper_aputfield DISPATCH 3 #endif @@ -3134,21 +1696,11 @@ stm r2, {r3, tmp2} DISPATCH_FINISH putstatic_a: - POP oop_value_tmp - add oop_address_tmp, r3, r2 - PUSH r3 - bl oop_store - ldr r3, [dispatch, #Universe_collectedHeap_Address-XXX] - DISPATCH_START 3 - POP r2 - ldr r3, [r3] - DISPATCH_NEXT - ldr r3, [r3, #12] - DISPATCH_NEXT - mov tmp2, #0 - ldr r3, [r3, #76] - strb tmp2, [r3, r2, lsr #9] - DISPATCH_FINISH + POP tmp2 + str tmp2, [r3, r2] + mov r0, r3 + bl Helper_aputfield + DISPATCH 3 resolve_invokeinterface: mov r1, #opc_invokeinterface @@ -3167,8 +1719,6 @@ DECACHE_JPC DECACHE_STACK bl _ZN18InterpreterRuntime14resolve_invokeEP10JavaThreadN9Bytecodes4CodeE - ASSERT_STACK_CACHED - ASSERT_LOCALS_CACHED ldr r0, [istate, #ISTATE_THREAD] CACHE_JPC ldr r3, [r0, #4] @@ -3185,109 +1735,17 @@ # r1 = [jpc, #2] Opcode new ldrb r1, [jpc, #2] -#define k_entry tmp2 -#define new_result r7 -#define top_addr r7 -#define uch r7 -#define obj_size tmp1 - ldr r3, [istate, #ISTATE_METHOD] - orr r2, r1, r2, lsl #8 - ldr lr, [r3, #METHOD_CONSTANTS] - ldr r1, [lr, #CONSTANTPOOL_TAGS] - add r1, r1, #12 - ldrb r3, [r1, r2] - cmp r3, #JVM_CONSTANT_UnresolvedClassInError - cmpne r3, #JVM_CONSTANT_UnresolvedClass - beq .new_slow_case - - add r3, lr, #CONSTANTPOOL_BASE - ldr k_entry, [r3, r2, lsl #2] - - add r1, k_entry, #KLASS_PART - ldr r3, [r1, #INSTANCEKLASS_INITSTATE] - cmp r3, #class_fully_initialized - bne .new_slow_case - ldr r3, [r1, #4] - tst r3, #1 - bne .new_slow_case - - mov obj_size, r3, asr #2 -.new_retry: - ldr r0, [dispatch, #Universe_collectedHeap_Address-XXX] - ldr r0, [r0] - bl CollectedHeap_top_addr - mov top_addr, r0 - ldr r0, [dispatch, #Universe_collectedHeap_Address-XXX] - ldr r0, [r0] - bl CollectedHeap_end_addr - mov r1, top_addr - ldr new_result, [top_addr, #0] - add ip, new_result, obj_size, lsl #2 - ldr r3, [r0, #0] - cmp ip, r3 - bhi .new_slow_case - mov r2, new_result - add r0, new_result, obj_size, lsl #2 - bl cmpxchg_ptr - cmp r0, new_result - bne .new_retry - subs r2, obj_size, #2 -@ ECN: sub optimimal memset - tst r2, #1 - add r0, new_result, #8 - mov r1, #0 - mov ip, #0 - strne r1, [r0], #4 - tst r2, #2 - mov r3, #0 - mov lr, #0 - stmneia r0!, {r1, r3} - bics r2, r2, #3 - beq .new_zero_done -1: - subs r2, r2, #4 - stmia r0!, {r1, r3, ip, lr} - bne 1b -.new_zero_done: - ldr r3, [dispatch, #always_do_update_barrier_Address-XXX] - mov r2, #1 - ldrb r1, [r3] @ zero_extendqisi2 - str r2, [new_result, #0] - cmp r1, #0 - bne .new_do_update_barrier - str k_entry, [new_result, #4] -.new_exit: - str new_result, [stack], #-4 - CACHE_LOCALS - DISPATCH 3 -.new_do_update_barrier: - add oop_address_tmp, new_result, #4 -@ mov oop_value_tmp, k_entry @ oop_value_tmp == k_entry - adr lr, .new_exit - b oop_store -.new_slow_case: - ldrb r2, [jpc, #1] - ldrb r1, [jpc, #2] - ldr r3, [istate, #ISTATE_METHOD] DECACHE_JPC DECACHE_STACK - orr r2, r1, r2, lsl #8 - ldr r0, [istate, #ISTATE_THREAD] - ldr r1, [r3, #METHOD_CONSTANTS] - bl _ZN18InterpreterRuntime4_newEP10JavaThreadP19constantPoolOopDesci - ldr r0, [istate, #ISTATE_THREAD] - ASSERT_STACK_CACHED - ldr ip, [r0, #THREAD_PENDING_EXC] + orr r1, r1, r2, lsl #8 + mov r0, r8 + bl Helper_new CACHE_JPC CACHE_CP - cmp ip, #0 - CACHE_LOCALS - bne handle_exception - ldr r2, [r0, #THREAD_VM_RESULT] - str r2, [stack], #-4 - ldr r3, [istate, #ISTATE_THREAD] - str ip, [r3, #THREAD_VM_RESULT] - DISPATCH 3 + cmp r0, #0 + beq handle_exception + PUSH r0 + DISPATCH 3 bytecode_interpreter_str: .ascii "[Bytecode Interpreter]\000" @@ -3300,8 +1758,6 @@ DECACHE_JPC DECACHE_STACK bl _ZN18InterpreterRuntime8newarrayEP10JavaThread9BasicTypei - ASSERT_LOCALS_CACHED - ASSERT_STACK_CACHED ldr r0, [istate, #ISTATE_THREAD] CACHE_JPC ldr ip, [r0, #THREAD_PENDING_EXC] @@ -3324,8 +1780,6 @@ ldr r1, [lr, #METHOD_CONSTANTS] ldr r0, [istate, #ISTATE_THREAD] bl _ZN18InterpreterRuntime9anewarrayEP10JavaThreadP19constantPoolOopDescii - ASSERT_STACK_CACHED - ASSERT_LOCALS_CACHED ldr r0, [istate, #ISTATE_THREAD] CACHE_JPC ldr ip, [r0, #THREAD_PENDING_EXC] @@ -3370,174 +1824,34 @@ # r1 = [jpc, #2] Opcode checkcast ldrb r1, [jpc, #2] - ldr r3, [istate, #ISTATE_METHOD] - ldr r0, [stack, #4] - ldr r3, [r3, #METHOD_CONSTANTS] @ R3 = METHOD->constants() - cmp r0, #0 - ldr ip, [r3, #CONSTANTPOOL_TAGS] - beq .checkcast_exit - add ip, ip, #12 - orr tmp2, r1, r2, lsl #8 - ldrb r2, [ip, tmp2] @ zero_extendqisi2 - cmp r2, #JVM_CONSTANT_UnresolvedClassInError - cmpne r2, #JVM_CONSTANT_UnresolvedClass - beq 3f - -4: - ldr r0, [r0, #4] - add r3, r3, tmp2, lsl #2 - ldr tmp1, [r3, #CONSTANTPOOL_BASE] - cmp tmp1, r0 - beq .checkcast_exit - - ldr r2, [tmp1, #16] - add tmp2, r0, #8 - add ip, tmp2, r2 - ldr ip, [ip, #-8] - cmp ip, tmp1 - beq .checkcast_exit - - cmp r2, #secondary_super_cache_offset_in_bytes - bne 2f - - mov r0, tmp2 - mov r1, tmp1 - - bl _ZNK5Klass23search_secondary_supersEP12klassOopDesc - cmp r0, #0 - beq 2f -.checkcast_exit: - DISPATCH 3 - -3: - ldr r0, [istate, #ISTATE_THREAD] DECACHE_JPC DECACHE_STACK - bl _ZN18InterpreterRuntime13quicken_io_ccEP10JavaThread - ASSERT_STACK_CACHED - ASSERT_LOCALS_CACHED - ldr r0, [istate, #ISTATE_THREAD] + orr r1, r1, r2, lsl #8 + mov r0, r8 + GET_STACK 0, r2 + bl Helper_checkcast CACHE_JPC - ldr r3, [r0, #THREAD_PENDING_EXC] CACHE_CP - cmp r3, #0 - ldr r3, [istate, #ISTATE_METHOD] + cmp r0, #0 bne handle_exception - ldr r0, [stack, #4] - ldr r3, [r3, #METHOD_CONSTANTS] @ METHOD->constanst() might have moved - b 4b - -2: - DECACHE_JPC - DECACHE_STACK - mov r0, tmp2 - ldr r3, [istate, #ISTATE_THREAD] - ldr tmp2, [r3, #THREAD_RESOURCEAREA] - - ldr tmp_chunk, [tmp2, #RESOURCEAREA_CHUNK] - ldr tmp_hwm, [tmp2, #RESOURCEAREA_HWM] - ldr tmp_max, [tmp2, #RESOURCEAREA_MAX] - - bl _ZNK5Klass13external_nameEv - mov ip, r0 - add r0, tmp1, #8 - mov tmp1, ip - bl _ZNK5Klass13external_nameEv - mov r1, r0 - mov r0, tmp1 - bl SharedRuntime_generate_class_cast_message - str r0, [arm_sp, #0] - ldr r0, [istate, #ISTATE_THREAD] - adrl r1, bytecode_interpreter_str - mov r2, #99 - mov r3, #_thread_in_vm - str r3, [r0, #THREAD_STATE] - ldr r3, [dispatch, #VmSymbols_symbols_Address-XXX] - ldr r3, [r3, #VMSYMBOLS_ClassCastException * 4] - bl _ZN10Exceptions10_throw_msgEP6ThreadPKciP13symbolOopDescS3_ - add r0, istate, #ISTATE_THREAD - bl ThreadInVMfromJavaD - mov r0, tmp_chunk - ldr r3, [r0, #0] - CACHE_JPC - cmp r3, #0 - beq 1f - bl _ZN5Chunk9next_chopEv -1: - str tmp_hwm, [tmp2, #RESOURCEAREA_HWM] - str tmp_max, [tmp2, #RESOURCEAREA_MAX] - str tmp_chunk, [tmp2, #RESOURCEAREA_CHUNK] - b handle_exception + DISPATCH 3 # r2 = [jpc, #1] # r1 = [jpc, #2] Opcode instanceof ldrb r1, [jpc, #2] - ldr r3, [istate, #ISTATE_METHOD] - ldr r0, [stack, #4] - ldr r3, [r3, #METHOD_CONSTANTS] - cmp r0, #0 - ldr ip, [r3, #CONSTANTPOOL_TAGS] - beq .instanceof_not_instance - add ip, ip, #BASE_OFFSET_BYTE - orr tmp2, r1, r2, lsl #8 - ldrb r2, [ip, tmp2] - cmp r2, #JVM_CONSTANT_UnresolvedClassInError - cmpne r2, #JVM_CONSTANT_UnresolvedClass - beq 2f - -1: - ldr r0, [r0, #4] - add r3, r3, tmp2, lsl #2 - ldr tmp1, [r3, #CONSTANTPOOL_BASE] - cmp tmp1, r0 - beq .instanceof_is_instance - - ldr r2, [tmp1, #16] - add tmp2, r0, #8 - add ip, tmp2, r2 - ldr ip, [ip, #-8] - cmp ip, tmp1 - beq .instanceof_is_instance - - mov r0, #0 - cmp r2, #secondary_super_cache_offset_in_bytes - bne .instanceof_not_instance - - mov r0, tmp2 - mov r1, tmp1 - - bl _ZNK5Klass23search_secondary_supersEP12klassOopDesc - cmp r0, #0 - beq .instanceof_not_instance - -.instanceof_is_instance: - mov r0, #1 - str r0, [stack, #4] - DISPATCH 3 -.instanceof_not_instance: - mov r0, #0 - str r0, [stack, #4] - DISPATCH 3 - -2: - ldr r0, [istate, #ISTATE_THREAD] DECACHE_JPC DECACHE_STACK - bl _ZN18InterpreterRuntime13quicken_io_ccEP10JavaThread - ASSERT_STACK_CACHED - ASSERT_LOCALS_CACHED - ldr r0, [istate, #ISTATE_THREAD] + orr r1, r1, r2, lsl #8 + mov r0, r8 + POP r2 + bl Helper_instanceof CACHE_JPC - ldr r3, [r0, #THREAD_PENDING_EXC] CACHE_CP - cmp r3, #0 - bne handle_exception - - ldr r3, [istate, #ISTATE_METHOD] - ldr r0, [stack, #4] - ldr r3, [r3, #METHOD_CONSTANTS] @ METHOD->constanst() might have moved - b 1b + cmp r0, #-1 + beq handle_exception + PUSH r0 + DISPATCH 3 Opcode monitorenter ldr r1, [stack, #4] @@ -3583,8 +1897,6 @@ DECACHE_STACK ldr r0, [istate, #ISTATE_THREAD] bl _ZN18InterpreterRuntime12monitorenterEP10JavaThreadP15BasicObjectLock - ASSERT_STACK_CACHED - ASSERT_LOCALS_CACHED ldr r0, [istate, #ISTATE_THREAD] CACHE_JPC ldr r3, [r0, #THREAD_PENDING_EXC] @@ -3640,7 +1952,6 @@ ldr sl, [istate, #ISTATE_STACK_BASE] ldr r3, [stack, #4] CACHE_JPC - ASSERT_LOCALS_CACHED mov r1, r3 str r3, [sl, #4] ldr r2, [r3, #0] @@ -3663,8 +1974,6 @@ DECACHE_JPC DECACHE_STACK bl _ZN18InterpreterRuntime12monitorenterEP10JavaThreadP15BasicObjectLock - ASSERT_STACK_CACHED - ASSERT_LOCALS_CACHED ldr r0, [istate, #ISTATE_THREAD] CACHE_JPC ldr r3, [r0, #THREAD_PENDING_EXC] @@ -3710,8 +2019,6 @@ ldr r0, [istate, #ISTATE_THREAD] bl _ZN18InterpreterRuntime11monitorexitEP10JavaThreadP15BasicObjectLock ldr r0, [istate, #ISTATE_THREAD] - ASSERT_STACK_CACHED - ASSERT_LOCALS_CACHED ldr r3, [r0, #THREAD_PENDING_EXC] CACHE_JPC cmp r3, #0 @@ -3740,39 +2047,16 @@ ALIGN_WORD Opcode aastore - ldr tmp1, [stack, #12] @ arrObj - ldr tmp_vvv, [stack, #8] - SW_NPC cmp tmp1, #0 - ldr sl, [stack, #4] - SW_NPC beq null_ptr_exception -.abortentry115: - ldr r3, [tmp1, #8] - cmp tmp_vvv, r3 - bcs array_bounds_exception - cmp sl, #0 - beq .aastore_exit - ldr r3, [tmp1, #4] @ arrObj->klass() - ldr r0, [sl, #4] - ldr r1, [r3, #KLASS_PART+OBJARRAYKLASS_ELEMENTKLASS] - cmp r0, r1 - beq .aastore_exit - add r0, r0, #8 - bl is_subtype_of + DECACHE_JPC + DECACHE_STACK + mov r0, r8 + POP r1, r2, r3 + bl Helper_aastore + CACHE_JPC + CACHE_CP cmp r0, #0 - moveq r0, #VMSYMBOLS_ArrayStoreException - beq raise_exception -.aastore_exit: - ldr r2, [dispatch, #Universe_collectedHeap_Address-XXX] - add r1, tmp1, #BASE_OFFSET_WORD - str sl, [r1, tmp_vvv, asl #2]! - ldr r3, [r2] - mov lr, #0 - ldr r3, [r3, #12] - add stack, stack, #12 - ldr r3, [r3, #76] - strb lr, [r3, r1, lsr #9] - CACHE_CP - DISPATCH 1 + bne handle_exception + DISPATCH 1 Opcode wide ldrb r2, [jpc, #1] @@ -3862,8 +2146,6 @@ DECACHE_JPC DECACHE_STACK bl _ZN18InterpreterRuntime14multianewarrayEP10JavaThreadPi - ASSERT_STACK_CACHED - ASSERT_LOCALS_CACHED ldr r0, [istate, #ISTATE_THREAD] CACHE_JPC ldr r1, [r0, #THREAD_PENDING_EXC] @@ -3901,19 +2183,13 @@ ldr r1, [r3] cmp r1, #1 bne 1f - add r0, istate, #ISTATE_THREAD - bl HandleMarkCleanerD - ldr r0, [istate, #ISTATE_THREAD] DECACHE_JPC DECACHE_STACK - bl _ZN20SafepointSynchronize5blockEP10JavaThread - ASSERT_STACK_CACHED - ASSERT_LOCALS_CACHED ldr r0, [istate, #ISTATE_THREAD] + bl Helper_SafePoint CACHE_JPC - ldr r3, [r0, #THREAD_PENDING_EXC] CACHE_CP - cmp r3, #0 + cmp r0, #0 bne handle_exception 1: DISPATCH 0 @@ -3933,8 +2209,6 @@ ldr r2, [istate, #ISTATE_BCP] ldr r1, [istate, #ISTATE_METHOD] bl _ZN18InterpreterRuntime11_breakpointEP10JavaThreadP13methodOopDescPh - ASSERT_STACK_CACHED - ASSERT_LOCALS_CACHED ldr r0, [istate, #ISTATE_THREAD] CACHE_JPC ldr r3, [r0, #THREAD_PENDING_EXC] @@ -3986,7 +2260,7 @@ ldrcc ip, [r2, r3, asl #2] adr r2, unimplemented_opcode_msg mov r1, #99 - str ip, [arm_sp, #0] + str ip, [arm_sp, #-8]! bl _Z19report_fatal_varargPKciS0_z b breakpoint unimplemented_opcode_msg: @@ -4005,7 +2279,6 @@ DECACHE_STACK ldr r0, [istate, #ISTATE_THREAD] bl _ZN18InterpreterRuntime18register_finalizerEP10JavaThreadP7oopDesc - ASSERT_STACK_CACHED ldr r0, [istate, #ISTATE_THREAD] CACHE_JPC ldr r3, [r0, #THREAD_PENDING_EXC] @@ -4014,11 +2287,16 @@ beq handle_return b handle_exception -@ ECN: normal_entry_synchronized doesn't really mean synchronized. It means -@ may or may not be synchronized. So we still have to check the synchronized -@ flag in the synchronized path, otherwise we may get an IllegalMonitor. + ALIGN_CODE normal_entry_synchronized: stmfd arm_sp!, {regset, lr} + bl fast_normal_entry_synchronized + ldmfd arm_sp!, {regset, pc} + + ALIGN_CODE +fast_normal_entry_synchronized: + stmfd arm_sp!, {fast_regset, lr} + mov sl, r0 mov tmp1, r2 @@ -4027,7 +2305,7 @@ rsb r3, r0, r3 rsb r3, r3, arm_sp cmp r3, #32768 - blt stack_overflow_no_frame + blt stack_overflow_before_frame ldrh r2, [sl, #METHOD_MAXLOCALS] ldrh r3, [sl, #METHOD_SIZEOFPARAMETERS] @@ -4041,7 +2319,7 @@ sub r5, r5, #FRAME_SIZE+4 sub r5, r5, r0, lsl #2 cmp r3, r5 - bcs stack_overflow_no_frame + bcs stack_overflow_before_frame cmp r8, #0 ble .normal_entry_synchronized_no_locals @@ -4067,61 +2345,17 @@ ldm ip, {r0, r1} add r0, r0, ip str tmp_vvv, [tmp1, #THREAD_TOP_ZERO_FRAME] - CACHE_JPC +@ CACHE_JPC str tmp_vvv, [tmp1, #THREAD_LAST_JAVA_SP] add dispatch, r1, r0 ldr r0, [istate, #ISTATE_METHOD] - CACHE_STACK - USEC ldr r2, [r0, #METHOD_INVOCATIONCOUNTER] - USEC ldr lr, [dispatch, #InterpreterInvocationLimit_Address-XXX] - USEC add r2, r2, #INVOCATIONCOUNTER_COUNTINCREMENT - USEC ldr lr, [lr] - USEC str r2, [r0, #METHOD_INVOCATIONCOUNTER] - USEC cmp r2, lr ldr r3, [r0, #METHOD_ACCESSFLAGS] - USEC bcs sync_method_entry_freq_count_overflow - CACHE_LOCALS tst r3, #JVM_ACC_SYNCHRONIZED - CACHE_CP - bne normal_do_synchronization - DISPATCH 0 - -#ifdef USE_COMPILER -sync_method_entry_freq_count_overflow: - ldr r3, [r0, #METHOD_CONSTMETHOD] - ldrh r3, [r3, #CONSTMETHOD_CODESIZE] - mov r1, #0 - mov r0, tmp1 - cmp r3, #MAX_FG_METHOD_SIZE - bcc 1f - ldr tmp2, [dispatch, #BackgroundCompilation_Address-XXX] - mov r3, #1 - ldr r5, [tmp2] - str r3, [tmp2] - bl _ZN18InterpreterRuntime26frequency_counter_overflowEP10JavaThreadPh - str r5, [tmp2] - b 2f -1: - bl _ZN18InterpreterRuntime26frequency_counter_overflowEP10JavaThreadPh -2: - ldr r0, [istate, #ISTATE_METHOD] - CACHE_JPC - ldr r3, [r0, #METHOD_ACCESSFLAGS] + beq 1f + +@ Do Synchronisation + CACHE_STACK CACHE_LOCALS - tst r3, #JVM_ACC_SYNCHRONIZED - CACHE_CP - bne normal_do_synchronization - DISPATCH 0 -#endif - -do_execute_java_bytecodes_restore_locals_and_jpc: - CACHE_JPC -do_execute_java_bytecodes_restore_locals: - CACHE_LOCALS - CACHE_CP - DISPATCH 0 - -normal_do_synchronization: tst r3, #JVM_ACC_STATIC ldrne r3, [r0, #METHOD_CONSTANTS] ldreq sl, [locals, #0] @@ -4143,9 +2377,8 @@ blx r3 cmp r0, #0 bne .normal_do_synchronisation_2 + b 1f .normal_do_synchronisation_3: - cmp tmp_xxx, tmp_vvv - beq do_execute_java_bytecodes_restore_locals ldr r0, [istate, #ISTATE_THREAD] bic r1, tmp_xxx, #3 bl JavaThread_is_lock_owned @@ -4153,19 +2386,56 @@ beq .normal_do_synchronisation_4 mov r3, #0 str r3, [tmp1] - b do_execute_java_bytecodes_restore_locals + b 1f .normal_do_synchronisation_4: mov r1, tmp1 DECACHE_STACK ldr r0, [istate, #ISTATE_THREAD] bl _ZN18InterpreterRuntime12monitorenterEP10JavaThreadP15BasicObjectLock ldr r0, [istate, #ISTATE_THREAD] - ASSERT_STACK_CACHED ldr r3, [r0, #THREAD_PENDING_EXC] cmp r3, #0 mov r2, r0 - beq do_execute_java_bytecodes_restore_locals_and_jpc - b handle_exception_do_not_unlock + bne handle_exception_do_not_unlock +1: + USEC ldr r0, [istate, #ISTATE_METHOD] + USEC ldr r2, [r0, #METHOD_INVOCATIONCOUNTER] + USEC ldr lr, [dispatch, #InterpreterInvocationLimit_Address-XXX] + USEC add r2, r2, #INVOCATIONCOUNTER_COUNTINCREMENT + USEC ldr lr, [lr] + USEC str r2, [r0, #METHOD_INVOCATIONCOUNTER] + USEC cmp r2, lr + USEC bcs sync_method_entry_freq_count_overflow + CACHE_JPC + CACHE_LOCALS + CACHE_CP + DISPATCH 0 + +#ifdef USE_COMPILER +sync_method_entry_freq_count_overflow: + ldr r3, [r0, #METHOD_CONSTMETHOD] + ldrh r3, [r3, #CONSTMETHOD_CODESIZE] + mov r1, #0 + ldr r0, [istate, #ISTATE_THREAD] + cmp r3, #MAX_FG_METHOD_SIZE + bcc 1f + ldr tmp2, [dispatch, #BackgroundCompilation_Address-XXX] + mov r3, #1 + ldr r5, [tmp2] + str r3, [tmp2] + bl FREQ_COUNT_OVERFLOW + str r5, [tmp2] + b 2f +1: + bl FREQ_COUNT_OVERFLOW +2: + T2 cmp r0, #0 + CACHE_LOCALS + T2 bne call_thumb2 + CACHE_JPC + CACHE_CP + DISPATCH 0 +#endif # r2 = [jpc, #1] # r1 = [jpc, #2] @@ -4213,12 +2483,11 @@ ldr r2, [r1, #-4] add r3, tmp2, r3, lsl #2 ldr tmp2, [r3, r2] - SW_NPC cmp tmp2, #0 - SW_NPC beq abstractmethod_exception + cmp tmp2, #0 + beq abstractmethod_exception .invokeinterface_invoke: ldr tmp1, [istate, #ISTATE_THREAD] @ str tmp2, [istate, #ISTATE_CALLEE] -.abortentry116: ldr ip, [tmp2, #METHOD_FROM_INTERPRETED] mov r1, #0 str ip, [istate, #36] @@ -4229,20 +2498,20 @@ ldr r3, [ip] - mov tmp_invoke_len, #5 - -#ifdef FASTPATH_ENTRY - adr r0, normal_entry - cmp r3, r0 - beq fast_normal_entry_with_len -#endif - mov r0, tmp2 mov r1, ip +#ifndef SHARK + add r3, r3, #CODE_ALIGN_SIZE +#endif mov r2, tmp1 blx r3 - ASSERT_LOCALS_CACHED + adrl ip, dispatch_init_adcon + ldm ip, {r0, r1} + add r0, r0, ip + add dispatch, r1, r0 + + CACHE_LOCALS ldr ip, [istate, #ISTATE_THREAD] CACHE_JPC @@ -4304,19 +2573,6 @@ str stack, [tmp1, #THREAD_JAVA_SP] ldr r3, [ip, #0] -#ifdef FASTPATH_ENTRY - adr r0, normal_entry - cmp r3, r0 - beq fast_normal_entry -#ifdef NATIVE_ENTRY - adrl r0, native_entry - cmp r3, r0 - beq fast_native_entry -#endif - adr r0, accessor_entry - cmp r3, r0 - beq fast_accessor_entry -#endif b normal_dispatch_and_return #endif // FAST_BYTECODES @@ -4389,28 +2645,22 @@ str stack, [tmp1, #THREAD_JAVA_SP] ldr r3, [ip, #0] -#ifdef FASTPATH_ENTRY - adr r0, normal_entry - cmp r3, r0 - beq fast_normal_entry -#ifdef NATIVE_ENTRY - adr r0, native_entry - cmp r3, r0 - beq fast_native_entry -#endif - adr r0, accessor_entry - cmp r3, r0 - beq fast_accessor_entry -#endif normal_dispatch_and_return: mov r0, tmp2 mov r1, ip +#ifndef SHARK + add r3, r3, #CODE_ALIGN_SIZE +#endif mov r2, tmp1 - ldr r2, [istate, #ISTATE_THREAD] blx r3 - ASSERT_LOCALS_CACHED + adrl ip, dispatch_init_adcon + ldm ip, {r0, r1} + add r0, r0, ip + add dispatch, r1, r0 + + CACHE_LOCALS ldr ip, [istate, #ISTATE_THREAD] CACHE_JPC @@ -4464,48 +2714,8 @@ ldr ip, [istate, #36] ldr r3, [ip, #0] -#ifdef FASTPATH_ENTRY - adr r0, normal_entry - cmp r3, r0 - beq fast_normal_entry -#ifdef NATIVE_ENTRY - adr r0, native_entry - cmp r3, r0 - beq fast_native_entry -#endif - adr r0, accessor_entry - cmp r3, r0 - beq fast_accessor_entry -#endif b normal_dispatch_and_return - ALIGN_CODE -normal_entry: - adrl ip, dispatch_init_adcon - stmfd arm_sp!, {regset, lr} - mov tmp2, r0 - ldm ip, {r0, r1} - - mov tmp_invoke_len, #0 - mov tmp1, r2 - - add r0, r0, ip - add dispatch, r1, r0 - - USEC ldr r2, [r10, #METHOD_INVOCATIONCOUNTER] - - ldr stack, [tmp1, #THREAD_JAVA_SP] - - ldr r0, [tmp1, #THREAD_STACK_SIZE] - USEC add r2, r2, #INVOCATIONCOUNTER_COUNTINCREMENT * 4 - ldr r3, [tmp1, #THREAD_STACK_BASE] - rsb r3, r0, r3 - rsb r3, r3, arm_sp - USEC str r2, [tmp2, #METHOD_INVOCATIONCOUNTER] - cmp r3, #32768 - bge fast_normal_entry_with_len - - b stack_overflow_before_frame Opcode invokespecial ldrb r1, [jpc, #2] @@ -4546,81 +2756,35 @@ str stack, [tmp1, #THREAD_JAVA_SP] ldr r3, [ip, #0] -#ifdef FASTPATH_ENTRY - adr r0, normal_entry - cmp r3, r0 - beq fast_normal_entry -#ifdef NATIVE_ENTRY - adr r0, native_entry - cmp r3, r0 - beq fast_native_entry -#endif - adr r0, accessor_entry - cmp r3, r0 - beq fast_accessor_entry -#endif b normal_dispatch_and_return ALIGN_CODE -accessor_entry: - adrl ip, dispatch_init_adcon - ldr r3, [ip] - add r3, r3, ip - ldr ip, [ip, #12] - ldr ip, [r3, ip] - ldr r1, [r0, #8] - ldr ip, [ip, #0] - ldrb r3, [r1, #50] - ldrb r1, [r1, #51] - cmp ip, #0 - ldr ip, [r0, #12] - bne normal_entry - ldr ip, [ip, #12] - orr r3, r3, r1, lsl #8 @ r3 = index - - add r1, ip, #16 - ldr r3, [r1, r3, lsl #4]! @ r1 = cache, r3 = flags - ldr ip, [r2, #THREAD_JAVA_SP] @ ip == stack - and r3, r3, #0x00ff0000 - cmp r3, #opc_getfield << 16 - ldr r3, [ip, #0] - bne normal_entry - - cmp r3, #0 - beq normal_entry - - ldr r0, [r1, #12] - ldr r1, [r1, #8] - movs r0, r0, lsr #29 - bls accessor_non_w - - ldr r0, [r3, r1] - str r0, [ip, #0] - bx lr - -#ifdef NATIVE_ENTRY - ALIGN_CODE -native_entry: - adrl ip, dispatch_init_adcon - stmfd arm_sp!, {r3, r4, r5, r6, r7, r8, r9, r10, r11, lr} - - ldm ip, {dispatch, r7} - mov r11, r0 - add dispatch, dispatch, ip - add dispatch, dispatch, r7 - - mov istate, #0 - - b fast_native_entry_with_args -#endif - -@ tmp1 = thread -@ tmp2 == method -@ stack == THREAD_JAVA_SP (=> FULL stack) +normal_entry: + stmfd arm_sp!, {regset, lr} + + ldr r7, [r2, #THREAD_STACK_SIZE] + ldr r3, [r2, #THREAD_STACK_BASE] + rsb r3, r7, r3 + rsb r3, r3, arm_sp + cmp r3, #32768 + blt stack_overflow_no_frame + + bl fast_normal_entry + + ldmfd arm_sp!, {regset, pc} + ALIGN_CODE fast_normal_entry: - mov tmp_invoke_len, #3 -fast_normal_entry_with_len: + adrl ip, dispatch_init_adcon + mov tmp2, r0 + ldm ip, {r0, r1} + mov tmp1, r2 + add r0, r0, ip + ldr stack, [tmp1, #THREAD_JAVA_SP] + add dispatch, r1, r0 + + stmdb arm_sp!, {fast_regset, lr} + ldrh r0, [tmp2, #METHOD_MAXLOCALS] mov r1, #0 ldrh r3, [tmp2, #METHOD_SIZEOFPARAMETERS] @@ -4646,9 +2810,10 @@ bcs 1b 3: ldr r3, [tmp1, #THREAD_TOP_ZERO_FRAME] + mov lr, #0 sub istate, stack, #FRAME_SIZE sub r2, istate, r2, lsl #2 - str tmp_invoke_len, [istate, #ISTATE_ADVANCE_PC] + str lr, [istate, #ISTATE_MSG] str r2, [tmp1, #THREAD_JAVA_SP] sub r5, r2, #4 @ stack limit = istate - stackwords - 4 str r3, [istate, #ISTATE_NEXT_FRAME] @@ -4664,7 +2829,7 @@ ldr jpc, [tmp2, #METHOD_CONSTMETHOD] ldr constpool, [tmp2, #METHOD_CONSTANTS] add ip, istate, #ISTATE_NEXT_FRAME - DISPATCH_START 48 + DISPATCH_START CONSTMETHOD_CODEOFFSET ldr constpool, [constpool, #CONSTANTPOOL_CACHE] str ip, [tmp1, #THREAD_TOP_ZERO_FRAME] USEC ldr r3, [r10, #METHOD_INVOCATIONCOUNTER] @@ -4701,22 +2866,35 @@ mov r3, #1 ldr r5, [tmp2] str r3, [tmp2] - bl _ZN18InterpreterRuntime26frequency_counter_overflowEP10JavaThreadPh + bl FREQ_COUNT_OVERFLOW str r5, [tmp2] b 2f 1: - bl _ZN18InterpreterRuntime26frequency_counter_overflowEP10JavaThreadPh + bl FREQ_COUNT_OVERFLOW 2: + T2 cmp r0, #0 + T2 bne call_thumb2 CACHE_JPC CACHE_CP DISPATCH 0 -#endif - + +#ifdef THUMB2EE +call_thumb2: + mov ip, r1 + mov r1, locals + ldr r2, [istate, #ISTATE_THREAD] + add stack, stack, #4 + bx ip +#endif // THUMB2EE + +#endif // USE_COMPILER + .global Thumb2_Install +Thumb2_Install: +@ ldr r0, [r0] + str r1, [r0, #METHOD_FROM_INTERPRETED] + bx lr handle_return: -@ CHECK_CONSTPOOL -@ CHECK_BACKTRACE - ldr tmp2, [istate, #ISTATE_MONITOR_BASE] @ tmp2 = base ldr tmp1, [istate, #ISTATE_STACK_BASE] @ tmp1 = end @@ -4725,9 +2903,6 @@ cmp tmp1, tmp2 blcc return_check_monitors -@ CHECK_CONSTPOOL -@ CHECK_BACKTRACE - mov r3, #0 ldrb lr, [jpc, #0] @@ -4739,9 +2914,6 @@ add r1, r2, #4 str r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] - ldr ip, [istate, #ISTATE_ADVANCE_PC] - ldr istate, [istate, #ISTATE_NEXT_FRAME] - add r1, r1, r0, lsl #2 cmp lr, #opc_lreturn @@ -4756,152 +2928,27 @@ str r1, [tmp_xxx, #THREAD_JAVA_SP] - cmp ip, #0 - - ldmeqfd arm_sp!, {regset, pc} - - ldr lr, [istate, #-ISTATE_NEXT_FRAME+ISTATE_THREAD]! - CACHE_JPC - ldr stack, [lr, #THREAD_JAVA_SP] - ldr r2, [istate, #ISTATE_STACK_LIMIT] - sub stack, stack, #4 - - ldr r1, [lr, #THREAD_TOP_ZERO_FRAME] - add r2, r2, #4 - str r2, [lr, #THREAD_JAVA_SP] - str r1, [lr, #THREAD_LAST_JAVA_SP] - ldr r3, [lr, #THREAD_PENDING_EXC] - DISPATCH_START_REG ip - CACHE_LOCALS - DISPATCH_NEXT - DISPATCH_NEXT - cmp r3, #0 - DISPATCH_NEXT - bne return_exception - DISPATCH_NEXT - CACHE_CP - DISPATCH_FINISH - -@ ip = PC ADVANCE -fast_handle_return: - ldr lr, [istate, #-ISTATE_NEXT_FRAME+ISTATE_THREAD]! - CACHE_JPC - ldr stack, [lr, #THREAD_JAVA_SP] - ldr r2, [istate, #ISTATE_STACK_LIMIT] - sub stack, stack, #4 - - ldr r1, [lr, #THREAD_TOP_ZERO_FRAME] - add r2, r2, #4 - str r2, [lr, #THREAD_JAVA_SP] - str r1, [lr, #THREAD_LAST_JAVA_SP] - ldr r3, [lr, #THREAD_PENDING_EXC] - DISPATCH_START_REG ip - CACHE_LOCALS - DISPATCH_NEXT - DISPATCH_NEXT - cmp r3, #0 - DISPATCH_NEXT - bne return_exception - DISPATCH_NEXT - CACHE_CP - DISPATCH_FINISH - -normal_return: - str stack, [tmp_xxx, #THREAD_JAVA_SP] - ldmfd arm_sp!, {regset, pc} - -return_check_monitors: - ldr r2, [istate, #ISTATE_METHOD] - ldr r0, [r2, #24] - tst r0, #1<<5 - subne tmp2, tmp2, #8 - cmp tmp1, tmp2 - bcs .return_unlock -1: - ldr r3, [tmp1, #4] - cmp r3, #0 - bne return_throw_illegal_monitor_state - add tmp1, tmp1, #8 - cmp tmp1, tmp2 - bcc 1b - -#define RETURN_STACKSIZE SIZEOF_HANDLEMARK - -.return_unlock: - tst r0, #1<<5 - bxeq lr - - ldr tmp1, [tmp2, #4] @ base->obj == NULL - SW_NPC cmp tmp1, #0 - SW_NPC beq return_throw_illegal_monitor_state -.abortentry119: - HW_NPC ldr ip, [tmp1] @ Only to provoke abort - - ldr r0, [tmp2, #0] @ r0 = header - mov r3, #0 - cmp r0, #0 - str r3, [tmp2, #4] @ base->obj = NULL - bxeq lr - - mov tmp_vvv, lr - mov r1, tmp1 - mov r2, tmp2 - bl cmpxchg_ptr - cmp tmp2, r0 - bxeq tmp_vvv - - str tmp1, [tmp2, #4] - sub arm_sp, arm_sp, #RETURN_STACKSIZE - mov r0, arm_sp - mov r1, tmp_xxx - bl _ZN10HandleMark10initializeEP6Thread - mov r1, tmp2 - mov r0, tmp_xxx - DECACHE_JPC - DECACHE_STACK - bl _ZN18InterpreterRuntime11monitorexitEP10JavaThreadP15BasicObjectLock - ASSERT_STACK_CACHED - CACHE_JPC - mov r0, arm_sp - bl _ZN10HandleMarkD1Ev - add arm_sp, arm_sp, #RETURN_STACKSIZE - ldr r3, [tmp_xxx, #THREAD_PENDING_EXC] - cmp r3, #0 - bne handle_exception - mov lr, tmp_vvv - bx lr - -return_throw_illegal_monitor_state: - sub arm_sp, arm_sp, #RETURN_STACKSIZE - mov r0, arm_sp - mov r1, tmp_xxx - bl _ZN10HandleMark10initializeEP6Thread - DECACHE_JPC - DECACHE_STACK - mov r0, tmp_xxx - bl _ZN18InterpreterRuntime37throw_illegal_monitor_state_exceptionEP10JavaThread - mov r0, arm_sp - bl _ZN10HandleMarkD1Ev - add arm_sp, arm_sp, #RETURN_STACKSIZE - b handle_exception_with_bcp + ldmfd arm_sp!, {fast_regset, pc} @ ---------------------------------------------------------------------------------------- stack_overflow_no_frame: - mov tmp_invoke_len, #0 + mov r0, tmp1 + ldr ip, [r0, #THREAD_TOP_ZERO_FRAME] + str ip, [r0, #THREAD_LAST_JAVA_SP] + bl _ZN18InterpreterRuntime24throw_StackOverflowErrorEP10JavaThread + ldmfd arm_sp!, {regset, pc} + stack_overflow_before_frame: mov r0, tmp1 ldr ip, [r0, #THREAD_TOP_ZERO_FRAME] str ip, [r0, #THREAD_LAST_JAVA_SP] - mov tmp1, tmp_invoke_len bl _ZN18InterpreterRuntime24throw_StackOverflowErrorEP10JavaThread - cmp tmp1, #0 - bne handle_exception_with_bcp - ldmfd arm_sp!, {regset, pc} + ldmfd arm_sp!, {fast_regset, pc} handle_exception_do_not_unlock: mov r3, #1 strb r3, [r2, #THREAD_DO_NOT_UNLOCK] - b handle_exception + b handle_exception_with_bcp abstractmethod_exception: mov r0, #VMSYMBOLS_AbstractMethodError @@ -4911,39 +2958,21 @@ raise_exception: adr r1, null_str raise_exception_with_msg: - str r1, [arm_sp] - ldr r3, [dispatch, #VmSymbols_symbols_Address-XXX] - ldr r3, [r3, r0, lsl #2] - ldr r0, [istate, #ISTATE_THREAD] + stmdb sp!, {r0, r1} + bl load_dispatch + ldmia sp!, {r0, r1} DECACHE_JPC DECACHE_STACK - mov ip, #_thread_in_vm - str ip, [r0, #THREAD_STATE] - mov r2, #99 - adrl r1, bytecode_interpreter_str - bl _ZN10Exceptions10_throw_msgEP6ThreadPKciP13symbolOopDescS3_ - add r0, istate, #ISTATE_THREAD - bl ThreadInVMfromJavaD + mov r2, r1 + ldr r1, [dispatch, #VmSymbols_symbols_Address-XXX] + ldr r1, [r1, r0, lsl #2] + ldr r0, [istate, #ISTATE_THREAD] + bl Helper_Raise b handle_exception_with_bcp null_str: .byte 0 ALIGN_WORD -#define EXCEPTION_HANDLEMARK 0 -#define EXCEPTION_THREAD EXCEPTION_HANDLEMARK + SIZEOF_HANDLEMARK -#define EXCEPTION_EXCEPTION EXCEPTION_THREAD + 4 -#define EXCEPTION_EXCEPTION2 EXCEPTION_EXCEPTION + 4 -#define EXCEPTION_MONITORBASE EXCEPTION_EXCEPTION2 + 4 -#define EXCEPTION_TMP1 EXCEPTION_MONITORBASE + 4 -#define EXCEPTION_HANDLEMARK2 EXCEPTION_TMP1 + 4 -#define EXCEPTION_HANDLE EXCEPTION_HANDLEMARK2 + SIZEOF_HANDLEMARK -#define EXCEPTION_HANDLE2 EXCEPTION_HANDLE + 4 -#define EXCEPTION_HANDLE3 EXCEPTION_HANDLE2 + 4 - -#define EXCEPTION_STACKSIZE EXCEPTION_HANDLE3 + 4 - -#define except_sp r13 - invokeinterface_exception_fix: sub jpc, jpc, #2 invoke_exception_fix: @@ -4960,432 +2989,157 @@ @ constpool = garbage DECACHE_JPC handle_exception_with_bcp: - sub except_sp, except_sp, #EXCEPTION_STACKSIZE + bl load_dispatch ldr stack, [istate, #ISTATE_STACK_BASE] sub stack, stack, #4 DECACHE_STACK - ldr r0, [istate, #ISTATE_THREAD] -handle_exception_1: - ldr sl, [r0, #4] - str r0, [except_sp, #EXCEPTION_THREAD] - cmp sl, #0 - moveq tmp_yyy, sl - beq .handle_exception_3 - ldr r0, [r0, #THREAD_HANDLE_AREA] - ldr r1, [r0, #8] - ldr r3, [r0, #12] - add r2, r1, #4 - cmp r2, r3 - movls r3, r1 - strls r2, [r0, #8] - bls .handle_exception_2 - mov r1, #4 - bl _ZN5Arena4growEj - mov r3, r0 -.handle_exception_2: - str sl, [r3, #0] - mov tmp_yyy, r3 - ldr r0, [istate, #ISTATE_THREAD] -.handle_exception_3: - mov r1, r0 - add r0, except_sp, #EXCEPTION_HANDLEMARK - bl _ZN10HandleMark10initializeEP6Thread - ldr r0, [istate, #ISTATE_THREAD] - bl _ZN12ThreadShadow23clear_pending_exceptionEv - ldr r1, [istate, #ISTATE_STACK_BASE] - ldr r0, [istate, #ISTATE_THREAD] - cmp tmp_yyy, #0 - sub stack, r1, #4 - moveq r1, tmp_yyy - DECACHE_STACK - ldrne r1, [tmp_yyy, #0] - bl _ZN18InterpreterRuntime31exception_handler_for_exceptionEP10JavaThreadP7oopDesc - ASSERT_STACK_CACHED - mov sl, r0 - ldr r0, [istate, #ISTATE_THREAD] - ldr r3, [r0, #THREAD_PENDING_EXC] - cmp r3, #0 - beq .handle_exception_5 - add r0, except_sp, #EXCEPTION_HANDLEMARK - bl _ZN10HandleMarkD1Ev - ldr r1, [except_sp, #EXCEPTION_THREAD] - ldr tmp_yyy, [r1, #THREAD_LAST_HANDLE_MARK] - ldr r0, [tmp_yyy, #8] - ldr sl, [tmp_yyy, #4] - ldr r3, [r0, #0] - cmp r3, #0 - beq .handle_exception_4 - bl _ZN5Chunk9next_chopEv - ldr r0, [tmp_yyy, #8] -.handle_exception_4: - str r0, [sl, #4] - ldr r3, [tmp_yyy, #12] - str r3, [sl, #8] - ldr r2, [tmp_yyy, #16] - str r2, [sl, #12] - ldr r0, [istate, #ISTATE_THREAD] - b handle_exception_1 -.handle_exception_5: - ldr tmp_yyy, [r0, #THREAD_VM_RESULT] - cmp tmp_yyy, #0 - moveq r1, tmp_yyy - beq .handle_exception_7 - ldr r3, [dispatch, #ThreadLocalStorage_thread_index-XXX] - ldr r0, [r3] - bl pthread_getspecific - ldr r0, [r0, #THREAD_HANDLE_AREA] - ldr r1, [r0, #8] - ldr r3, [r0, #12] - add r2, r1, #4 - cmp r2, r3 - movls r3, r1 - strls r2, [r0, #8] - bls .handle_exception_6 - mov r1, #4 - bl _ZN5Arena4growEj - mov r3, r0 -.handle_exception_6: - str tmp_yyy, [r3, #0] - mov r1, r3 - ldr r0, [istate, #ISTATE_THREAD] -.handle_exception_7: - cmp sl, #0 + + mov r0, istate + ldr r1, [istate, #ISTATE_THREAD] + bl Helper_HandleException + cmp r0, #0 + beq 1f + + mov jpc, r0 + CACHE_STACK + CACHE_LOCALS + CACHE_CP + DISPATCH 0 +1: + ldr tmp2, [istate, #ISTATE_MONITOR_BASE] @ tmp2 = base + + ldr tmp1, [istate, #ISTATE_STACK_BASE] @ tmp1 = end + ldr tmp_xxx, [istate, #ISTATE_THREAD] + mov r3, #0 - str r3, [r0, #THREAD_VM_RESULT] - blt .handle_exception_9 - cmp r1, r3 - moveq r0, r1 - ldrne r0, [r1, #0] - str r0, [stack, #0] - sub stack, stack, #4 - ldr r3, [istate, #ISTATE_METHOD] - add r0, except_sp, #EXCEPTION_HANDLEMARK - ldr r2, [r3, #8] - add r2, r2, #48 - add ip, r2, sl - str ip, [istate, #ISTATE_BCP] - bl _ZN10HandleMarkD1Ev - ldr r1, [except_sp, #EXCEPTION_THREAD] - ldr tmp_yyy, [r1, #THREAD_LAST_HANDLE_MARK] - ldr r0, [tmp_yyy, #8] - ldr sl, [tmp_yyy, #4] - ldr r3, [r0, #0] + ldrb r0, [tmp_xxx, #THREAD_DO_NOT_UNLOCK] + strb r3, [tmp_xxx, #THREAD_DO_NOT_UNLOCK] + cmp r0, #0 + bne 2f + + cmp tmp1, tmp2 + blcc return_check_monitors + +2: + mov r3, #0 + + ldr r2, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] + str r3, [tmp_xxx, #THREAD_LAST_JAVA_SP] + ldr r0, [istate, #ISTATE_METHOD] + ldr r3, [r2, #0] + ldrh r0, [r0, #40] + add r1, r2, #4 + str r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] + + add r1, r1, r0, lsl #2 + + str r1, [tmp_xxx, #THREAD_JAVA_SP] + + ldmfd arm_sp!, {fast_regset, pc} + +return_check_monitors: + stmdb arm_sp!, {r4, lr} + + ldr r2, [istate, #ISTATE_METHOD] + ldr r4, [r2, #METHOD_ACCESSFLAGS] + tst r4, #1<<5 + subne tmp2, tmp2, #8 + cmp tmp1, tmp2 + bcs 2f +1: + ldr r3, [tmp1, #4] cmp r3, #0 - beq .handle_exception_8 - bl _ZN5Chunk9next_chopEv - ldr r0, [tmp_yyy, #8] -.handle_exception_8: - str r0, [sl, #4] - ldr r3, [tmp_yyy, #12] - str r3, [sl, #8] - ldr r2, [tmp_yyy, #16] - str r2, [sl, #12] - add except_sp, except_sp, #EXCEPTION_STACKSIZE - b do_execute_java_bytecodes_restore_locals_and_jpc -.handle_exception_9: - cmp r1, #0 - ldr r0, [istate, #ISTATE_THREAD] - mov r2, #0 - ldrne r1, [r1, #0] - mov r3, r2 - bl _ZN12ThreadShadow21set_pending_exceptionEP7oopDescPKci - ldr r0, [istate, #ISTATE_THREAD] - ldr tmp_yyy, [r0, #4] - cmp tmp_yyy, #0 - streq tmp_yyy, [except_sp, #EXCEPTION_EXCEPTION] - beq .handle_exception_11 - ldr r0, [r0, #THREAD_HANDLE_AREA] - ldr r1, [r0, #8] - ldr r3, [r0, #12] - add r2, r1, #4 - cmp r2, r3 - movls r3, r1 - strls r2, [r0, #8] - bls .handle_exception_10 - mov r1, #4 - bl _ZN5Arena4growEj - mov r3, r0 -.handle_exception_10: - str tmp_yyy, [r3, #0] - ldr r0, [istate, #ISTATE_THREAD] - str r3, [except_sp, #EXCEPTION_EXCEPTION] -.handle_exception_11: - bl _ZN12ThreadShadow23clear_pending_exceptionEv - mov r1, #0 - ldr r0, [istate, #ISTATE_THREAD] - str r1, [except_sp, #EXCEPTION_EXCEPTION2] - ldrb r3, [r0, #THREAD_DO_NOT_UNLOCK] @ zero_extendqisi2 - cmp r3, r1 - beq .handle_exception_15 - strb r1, [r0, #THREAD_DO_NOT_UNLOCK] - ldr r0, [istate, #ISTATE_THREAD] -.handle_exception_12: - ldr r1, [except_sp, #EXCEPTION_EXCEPTION] - cmp r1, #0 - movne r2, r1 - ldrne r1, [r2, #0] -.handle_exception_13: - mov r2, #0 - mov r3, r2 - bl _ZN12ThreadShadow21set_pending_exceptionEP7oopDescPKci - mov r3, #0 - ldr r2, [istate, #ISTATE_BCP] - ldrb r2, [r2, #0] @ zero_extendqisi2 - DECACHE_STACK - str r2, [istate, #ISTATE_CALLEE] - ldr lr, [istate, #ISTATE_THREAD] - ldr r1, [lr, #THREAD_TOP_ZERO_FRAME] - str r3, [lr, #THREAD_LAST_JAVA_SP] - add r2, r1, #4 - str r2, [lr, #THREAD_JAVA_SP] - ldr r3, [r1, #0] - str r3, [lr, #THREAD_TOP_ZERO_FRAME] - ldr r1, [istate, #ISTATE_METHOD] - ldrh r3, [r1, #40] - add r0, except_sp, #EXCEPTION_HANDLEMARK - mov r3, r3, asl #2 - add r2, r2, r3 - str r2, [lr, #THREAD_JAVA_SP] - bl _ZN10HandleMarkD1Ev - ldr r0, [except_sp, #EXCEPTION_THREAD] - ldr tmp_yyy, [r0, #THREAD_LAST_HANDLE_MARK] - ldr r0, [tmp_yyy, #8] - ldr sl, [tmp_yyy, #4] - ldr r3, [r0, #0] - cmp r3, #0 - beq .handle_exception_14 - bl _ZN5Chunk9next_chopEv - ldr r0, [tmp_yyy, #8] -.handle_exception_14: - str r0, [sl, #4] - ldr r3, [tmp_yyy, #12] - str r3, [sl, #8] - ldr r2, [tmp_yyy, #16] - str r2, [sl, #12] - add except_sp, except_sp, #EXCEPTION_STACKSIZE - ldr ip, [istate, #ISTATE_ADVANCE_PC] - ldr istate, [istate, #ISTATE_NEXT_FRAME] - cmp ip, #0 - bne fast_handle_return - ldmfd arm_sp!, {regset, pc} -.handle_exception_15: - ldr ip, [istate, #ISTATE_MONITOR_BASE] - ldr r2, [istate, #ISTATE_METHOD] - str ip, [except_sp, #EXCEPTION_MONITORBASE] - ldr tmp_vvv, [istate, #ISTATE_STACK_BASE] - ldr r3, [r2, #24] - mov r3, r3, lsr #5 - ands r3, r3, #1 - subne ip, ip, #8 - strne ip, [except_sp, #EXCEPTION_MONITORBASE] - ldr lr, [except_sp, #EXCEPTION_MONITORBASE] - str r3, [except_sp, #EXCEPTION_TMP1] - cmp tmp_vvv, lr - bcs .handle_exception_21 - - .p2align 3 -.handle_exception_16: - ldr tmp_yyy, [tmp_vvv, #4] - cmp tmp_yyy, #0 - beq .handle_exception_20 - ldr fp, [tmp_vvv, #0] - mov r2, #0 - cmp fp, r2 - str r2, [tmp_vvv, #4] - beq .handle_exception_19 - .p2align 3 -.handle_exception_17: - ldr sl, [tmp_yyy, #0] - cmp tmp_vvv, sl - bne .handle_exception_18 - mov r0, tmp_vvv - mov r1, fp - mov r2, tmp_yyy - mov r3, #0xffffffc0 - bic r3, r3, #0xf000 - blx r3 - cmp r0, #0 - bne .handle_exception_17 -.handle_exception_18: - cmp tmp_vvv, sl - beq .handle_exception_19 - str tmp_yyy, [tmp_vvv, #4] - add r0, except_sp, #EXCEPTION_HANDLEMARK2 - ldr r1, [istate, #ISTATE_THREAD] - bl _ZN10HandleMark10initializeEP6Thread - mov r1, tmp_vvv - ldr r0, [istate, #ISTATE_THREAD] - DECACHE_STACK - bl _ZN18InterpreterRuntime11monitorexitEP10JavaThreadP15BasicObjectLock - ASSERT_STACK_CACHED - add r0, except_sp, #EXCEPTION_HANDLEMARK2 - bl _ZN10HandleMarkD1Ev -.handle_exception_19: - ldr r1, [except_sp, #EXCEPTION_EXCEPTION2] - cmp r1, #0 - beq .handle_exception_27 - ldr r3, [r1, #0] - cmp r3, #0 - beq .handle_exception_27 -.handle_exception_20: - ldr r3, [except_sp, #EXCEPTION_MONITORBASE] - add tmp_vvv, tmp_vvv, #8 - cmp tmp_vvv, r3 - bcc .handle_exception_16 -.handle_exception_21: - ldr ip, [except_sp, #EXCEPTION_TMP1] - cmp ip, #0 - beq .handle_exception_23 - ldr r0, [except_sp, #EXCEPTION_MONITORBASE] - ldr sl, [r0, #4] - cmp sl, #0 - beq .handle_exception_26 - mov ip, r0 - ldr r0, [r0, #0] + bne 3f + add tmp1, tmp1, #8 + cmp tmp1, tmp2 + bcc 1b + +2: + tst r4, #1<<5 + + ldmeqia arm_sp!, {r4, pc} + + ldr tmp1, [tmp2, #4] @ base->obj == NULL + cmp tmp1, #0 + beq 4f + + ldr r0, [tmp2, #0] @ r0 = header mov r3, #0 cmp r0, #0 - str r3, [ip, #4] - beq .handle_exception_23 - mov r1, sl - ldr r2, [except_sp, #EXCEPTION_MONITORBASE] + str r3, [tmp2, #4] @ base->obj = NULL + + ldmeqia arm_sp!, {r4, pc} + + mov r1, tmp1 + mov r2, tmp2 bl cmpxchg_ptr - ldr r1, [except_sp, #EXCEPTION_MONITORBASE] - cmp r1, r0 - beq .handle_exception_22 - ldr r3, [except_sp, #EXCEPTION_MONITORBASE] - add tmp_yyy, except_sp, #EXCEPTION_HANDLEMARK2 - mov r0, tmp_yyy - str sl, [r3, #4] - ldr r1, [istate, #ISTATE_THREAD] - bl _ZN10HandleMark10initializeEP6Thread - ldr r1, [except_sp, #EXCEPTION_MONITORBASE] - ldr r0, [istate, #ISTATE_THREAD] - DECACHE_STACK - bl _ZN18InterpreterRuntime11monitorexitEP10JavaThreadP15BasicObjectLock - mov r0, tmp_yyy - ASSERT_STACK_CACHED - bl _ZN10HandleMarkD1Ev - ldr r0, [istate, #ISTATE_THREAD] - ldr r1, [r0, #4] - cmp r1, #0 - beq .handle_exception_24 - add r0, except_sp, #EXCEPTION_HANDLE2 - bl HandleC - ldr r1, [except_sp, #EXCEPTION_HANDLE2] - ldr r0, [istate, #ISTATE_THREAD] - str r1, [except_sp, #EXCEPTION_EXCEPTION2] - bl _ZN12ThreadShadow23clear_pending_exceptionEv -.handle_exception_22: - ldr r0, [istate, #ISTATE_THREAD] - b .handle_exception_24 -.handle_exception_23: + cmp tmp2, r0 + + ldmeqia arm_sp!, {r4, pc} + + str tmp1, [tmp2, #4] + + mov r1, tmp2 ldr r0, [istate, #ISTATE_THREAD] -.handle_exception_24: - ldr r3, [except_sp, #EXCEPTION_EXCEPTION2] - cmp r3, #0 - beq .handle_exception_12 -.handle_exception_25: - ldr lr, [except_sp, #EXCEPTION_EXCEPTION2] - ldr r1, [lr, #0] - cmp r1, #0 - bne .handle_exception_13 - b .handle_exception_12 -.handle_exception_26: - ldr r1, [except_sp, #EXCEPTION_EXCEPTION2] - cmp r1, #0 - beq .handle_exception_29 - ldr r3, [r1, #0] - cmp r3, #0 - beq .handle_exception_29 - ldr r0, [istate, #ISTATE_THREAD] - b .handle_exception_25 - -.handle_exception_27: - add r0, except_sp, #EXCEPTION_HANDLEMARK2 - ldr r1, [istate, #ISTATE_THREAD] - bl _ZN10HandleMark10initializeEP6Thread + bl Helper_synchronized_exit + + ldmeqia arm_sp!, {r4, pc} + +3: ldr r0, [istate, #ISTATE_THREAD] - DECACHE_STACK - bl _ZN18InterpreterRuntime37throw_illegal_monitor_state_exceptionEP10JavaThread - add r0, except_sp, #EXCEPTION_HANDLEMARK2 - ASSERT_STACK_CACHED - bl _ZN10HandleMarkD1Ev - add r0, except_sp, #EXCEPTION_HANDLE - ldr r3, [istate, #ISTATE_THREAD] - ldr r1, [r3, #4] - bl HandleC - ldr r2, [except_sp, #EXCEPTION_HANDLE] + bl Helper_RaiseIllegalMonitorException + b 2b + +4: ldr r0, [istate, #ISTATE_THREAD] - str r2, [except_sp, #EXCEPTION_EXCEPTION2] - bl _ZN12ThreadShadow23clear_pending_exceptionEv - b .handle_exception_20 -.handle_exception_29: - add tmp_yyy, except_sp, #EXCEPTION_HANDLEMARK2 - mov r0, tmp_yyy - ldr r1, [istate, #ISTATE_THREAD] - bl _ZN10HandleMark10initializeEP6Thread - ldr r0, [istate, #ISTATE_THREAD] - DECACHE_STACK - bl _ZN18InterpreterRuntime37throw_illegal_monitor_state_exceptionEP10JavaThread - mov r0, tmp_yyy - ASSERT_STACK_CACHED - bl _ZN10HandleMarkD1Ev - ldr r3, [istate, #ISTATE_THREAD] - add r0, except_sp, #EXCEPTION_HANDLE3 - ldr r1, [r3, #4] - bl HandleC - ldr r2, [except_sp, #EXCEPTION_HANDLE3] - ldr r0, [istate, #ISTATE_THREAD] - str r2, [except_sp, #EXCEPTION_EXCEPTION2] - bl _ZN12ThreadShadow23clear_pending_exceptionEv - ldr r0, [istate, #ISTATE_THREAD] - b .handle_exception_24 - -#ifdef FASTPATH_ENTRY + bl Helper_RaiseIllegalMonitorException + ldmia arm_sp!, {r4, pc} + + ALIGN_CODE +accessor_entry: + b slow_accessor_entry ALIGN_CODE -fast_accessor_entry: - ldr ip, [dispatch, #SafePointSynchronize_state_Address-XXX] - ldr r3, [tmp2, #8] - ldr ip, [ip, #0] - ldrb r2, [r3, #50] - ldrb r3, [r3, #51] - cmp ip, #0 - ldr ip, [tmp2, #12] - bne fast_normal_entry - ldr ip, [ip, #12] - - DISPATCH_START 3 - - orr r2, r2, r3, lsl #8 @ r2 = index - add r3, ip, #16 - ldr r2, [r3, r2, lsl #4]! @ r3 = cache, r2 = flags - - DISPATCH_NEXT - - cmp r2, #opc_getfield << 16 - GET_STACK 0, r2 - bne fast_normal_entry - - cmp r2, #0 - beq fast_normal_entry - - - ldr lr, [r3, #12] - ldr r3, [r3, #8] - movs lr, lr, lsr #29 - bls .fast_accessor_non_w - - DISPATCH_NEXT - - ldr tmp1, [r2, r3] - - DISPATCH_NEXT - DISPATCH_NEXT - - PUT_STACK 0, tmp1 - - DISPATCH_FINISH +slow_accessor_entry: + USEC adrl ip, dispatch_init_adcon + USEC ldr r3, [ip] + USEC add r3, r3, ip + USEC ldr ip, [ip, #invocationlimit_adcon-dispatch_init_adcon] + USEC ldr ip, [r3, ip] + + USEC ldr r3, [r0, #METHOD_INVOCATIONCOUNTER] + USEC ldr ip, [ip, #0] + USEC add r3, r3, #INVOCATIONCOUNTER_COUNTINCREMENT + USEC str r3, [r0, #METHOD_INVOCATIONCOUNTER] + USEC cmp r3, ip + USEC bcs normal_entry + + ldr r1, [r0, #METHOD_CONSTMETHOD] + ldrb r3, [r1, #CONSTMETHOD_CODEOFFSET+2] + ldrb r1, [r1, #CONSTMETHOD_CODEOFFSET+3] + ldr ip, [r0, #METHOD_CONSTANTS] + ldr ip, [ip, #CONSTANTPOOL_CACHE] + orr r3, r3, r1, lsl #8 @ r3 = index + + add r1, ip, #CP_OFFSET + ldr r3, [r1, r3, lsl #4]! @ r1 = cache, r3 = flags + ldr ip, [r2, #THREAD_JAVA_SP] @ ip == stack + and r3, r3, #0x00ff0000 + cmp r3, #opc_getfield << 16 + ldr r3, [ip, #0] + bne normal_entry + + cmp r3, #0 + beq normal_entry + + ldr r0, [r1, #12] + ldr r1, [r1, #8] + movs r0, r0, lsr #29 + bls accessor_non_w + + ldr r0, [r3, r1] + str r0, [ip, #0] + bx lr .fast_accessor_non_w: bcs .fast_accessor_h @@ -5427,10 +3181,8 @@ PUSH tmp2 DISPATCH_FINISH -#endif // FASTPATH_ENTRY - div_zero_jpc_1: - sub jpc, jpc, #1 @ Point to idiv + sub jpc, jpc, #1 .lrem_0: .ldiv_0: divide_by_zero_exception: @@ -5465,30 +3217,12 @@ sub jpc, jpc, #1 array_bound_exception_jpc_0: array_bounds_exception: - adr r1, percent_d_str - sub arm_sp, arm_sp, #16 - add r0, arm_sp, #4 - bl sprintf - add r1, arm_sp, #4 - mov r0, #VMSYMBOLS_ArrayIndexOutOfBounds - str r1, [arm_sp] - ldr r3, [dispatch, #VmSymbols_symbols_Address-XXX] - ldr r3, [r3, r0, lsl #2] - ldr r0, [istate, #ISTATE_THREAD] DECACHE_JPC DECACHE_STACK - mov ip, #_thread_in_vm - str ip, [r0, #THREAD_STATE] - mov r2, #99 - adrl r1, bytecode_interpreter_str - bl _ZN10Exceptions10_throw_msgEP6ThreadPKciP13symbolOopDescS3_ - add r0, istate, #ISTATE_THREAD - bl ThreadInVMfromJavaD - add arm_sp, arm_sp, #16 + mov r1, r2 + ldr r0, [istate, #ISTATE_THREAD] + bl Helper_RaiseArrayBoundException b handle_exception_with_bcp -percent_d_str: - .ascii "%d\000" - ALIGN_WORD #ifndef HW_NULL_PTR_CHECK null_ptr_exception_jpc_5: @@ -5780,8 +3514,6 @@ bpl .dadd_exit b .return_double_NaN -@ ECN: load 1st arg off stack and do a reverse subtract -@ ECN: We want TOSM1 - TOS, but args end up in wrong order so do rsb @ --- do_dsub_itos ------------------------------------------------- Opcode dsub POP al, ah, bl, bh @@ -6189,7 +3921,6 @@ orr ah, ah, al, LSR ul @ put in high end of low word mov al, tl -@ ECN: Reload tmp mov tmp, #0x7f00000 orr tmp, tmp, #0x00f0000 @@ -6228,7 +3959,6 @@ orr bh, bh, bl, LSR ul @ put in high end of low word mov bl, tl -@ ECN: Reload tmp mov tmp, #0x7f00000 orr tmp, tmp, #0x00f0000 @@ -6293,9 +4023,9 @@ strb r3, [r2, #0] adrl r3, main_dispatch_table #ifdef HW_FP - ldr r0, [ip, #VFP_Flag-XXX] - cmp r0, #0 - bne 2f + ldr r0, [ip, #CPUInfo-XXX] + tst r0, #ARCH_VFP + beq 2f #endif mov r2, #256 1: @@ -6303,7 +4033,8 @@ str r1, [ip], #4 subs r2, r2, #1 bne 1b - bx lr + sub ip, ip, #4 * 256 + b 4f @ No HW FP - must update the table from a combination main_dispatch_table and @ vfp_table. Previously this updated from main_dispatch_table first, and then @@ -6327,9 +4058,23 @@ add r2, r2, #1 cmp r2, #256 bcc 3b + sub ip, ip, #4 * 256 ldmia arm_sp!, {r4, lr} #endif // HW_FP + +4: + ldr r0, [ip, #CPUInfo-XXX] + tst r0, #ARCH_CLZ + beq 5f + + adrl r0, do_idiv_clz + str r0, [ip, #opc_idiv * 4] + adrl r0, do_irem_clz + str r0, [ip, #opc_irem * 4] + +5: #endif // NOTICE_SAFEPOINTS + bx lr @ --- notice_safepoints --------------------------------------------------------------------------- @@ -6384,6 +4129,9 @@ subs r1, r1, #1 bne 2b + bl hwcap + str r0, [r4, #CPUInfo-XXX] + #ifdef USE_COMPILER #define NPROCESSORS_CONF 83 @@ -6403,51 +4151,18 @@ ldr r1, [r4, #CompileThreshold_Address-XXX] str r0, [r1] - #endif // USE_COMPILER - ldmfd sp!, {r4, lr} +#ifdef THUMB2EE + ldr r1, [r4, #CPUInfo-XXX] + tst r1, #ARCH_THUMBEE + blne Thumb2_Initialize +#endif #ifdef HW_FP -vfp_init: - stmfd sp!, {r4, r5, lr} - sub sp, sp, #132 - mov r4, #0 - adr r0, proc_self_auxv - mov r1, #0 - bl open - subs r5, r0, #0 - blt .exit_vfp_init -.vfp_init_read_loop: - mov r2, #128 - mov r0, r5 - mov r1, sp - bl read - mov r2, sp - mov r3, r0, lsr #3 - b .vfp_init_1 -.vfp_init_vec_loop: - ldmia r2!, {r1, ip} - cmp r1, #0 - beq .fini_vfp_init - cmp r1, #16 - bne .vfp_init_1 - tst ip, #64 - movne r4, #1 - bne .fini_vfp_init -.vfp_init_1: - subs r3, r3, #1 - bpl .vfp_init_vec_loop - cmp r0, #128 - beq .vfp_init_read_loop -.fini_vfp_init: - mov r0, r5 - bl close -.exit_vfp_init: - movs r0, r4 - add sp, sp, #132 - ldmfd sp!, {r4, r5, lr} - bxne lr @ We have HW FP - just exit + ldr r0, [r4, #CPUInfo-XXX] + tst r0, #ARCH_VFP + bne 4f @ No HW FP - replace the HW FP entries with SW entries update_vfp_table: @@ -6456,17 +4171,26 @@ ldm ip, {r2, r3} add r2, r2, ip add ip, r3, r2 - mov r1, #1 - str r1, [ip, #VFP_Flag-XXX] .update_vfp_loop: ldr r1, [r0], #4 cmp r1, #0 ldrne r2, [r0], #4 strne r2, [ip, r1, lsl #2] bne .update_vfp_loop +4: #endif // HW_FP - bx lr + ldr r0, [r4, #CPUInfo-XXX] + tst r0, #ARCH_CLZ + beq 5f + + adrl r0, do_idiv_clz + str r0, [r4, #opc_idiv * 4] + adrl r0, do_irem_clz + str r0, [r4, #opc_irem * 4] + +5: + ldmia sp!, {r4, pc} #ifdef HW_FP vfp_table: @@ -6483,13 +4207,15 @@ .word opc_dcmpl, do_dcmpl .word opc_dcmpg, do_dcmpg .word 0 - -proc_self_auxv: - .ascii "/proc/self/auxv\000" - .align 2 - #endif // HW_FP +load_dispatch: + adrl ip, dispatch_init_adcon + ldm ip, {r0, r1} + add r0, r0, ip + add dispatch, r1, r0 + mov pc, lr + ALIGN_DATA dispatch_init_adcon: .word _GLOBAL_OFFSET_TABLE_-dispatch_init_adcon, opclabels_data(GOTOFF) @@ -6506,6 +4232,7 @@ .word PrintCommandLineFlags(GOT) .word _ZN11JvmtiExport28_can_post_interpreter_eventsE(GOT) .word UseCompiler(GOT) +invocationlimit_adcon: .word _ZN17InvocationCounter26InterpreterInvocationLimitE(GOT) .word CompileThreshold(GOT) .word BackgroundCompilation(GOT) @@ -6516,8 +4243,6 @@ main_dispatch_table: MAIN_DISPATCH_TABLE -@ ECN: Strange logic here! We don't need the safe_dispatch_table if NOTICE_SAFEPOINTS is -@ disabled because in this case the main_dispatch_table must be safepoint safe. #ifdef NOTICE_SAFEPOINTS safe_dispatch_table: .word do_nop @@ -6780,19 +4505,1717 @@ SUB_DISPATCH_TABLES + .arch armv7-a + + ALIGN_CODE + .global Thumb2_stubs +Thumb2_stubs: + .global Thumb2_idiv_stub +Thumb2_idiv_stub: +int_div: + cmp r1, #0x21 + adr r3, 1f + eor r12, r0, r1 + ldrcc pc, [r3, r1, lsl #2] + rsblt r1, r1, #0 + subs r2, r1, #1 + beq 2f + movs r3, r0 + rsbmi r3, r0, #0 + cmp r3, r1 + bls 3f + tst r1, r2 + beq 4f + clz r2, r3 + clz r0, r1 + sub r2, r0, r2 + rsbs r2, r2, #31 + add r2, r2, r2, lsl #1 + mov r0, #0 + add pc, pc, r2, lsl #2 + mov r0, #0 + cmp r3, r1, lsl #31 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #31 + cmp r3, r1, lsl #30 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #30 + cmp r3, r1, lsl #29 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #29 + cmp r3, r1, lsl #28 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #28 + cmp r3, r1, lsl #27 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #27 + cmp r3, r1, lsl #26 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #26 + cmp r3, r1, lsl #25 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #25 + cmp r3, r1, lsl #24 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #24 + cmp r3, r1, lsl #23 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #23 + cmp r3, r1, lsl #22 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #22 + cmp r3, r1, lsl #21 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #21 + cmp r3, r1, lsl #20 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #20 + cmp r3, r1, lsl #19 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #19 + cmp r3, r1, lsl #18 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #18 + cmp r3, r1, lsl #17 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #17 + cmp r3, r1, lsl #16 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #16 + cmp r3, r1, lsl #15 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #15 + cmp r3, r1, lsl #14 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #14 + cmp r3, r1, lsl #13 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #13 + cmp r3, r1, lsl #12 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #12 + cmp r3, r1, lsl #11 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #11 + cmp r3, r1, lsl #10 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #10 + cmp r3, r1, lsl #9 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #9 + cmp r3, r1, lsl #8 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #8 + cmp r3, r1, lsl #7 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #7 + cmp r3, r1, lsl #6 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #6 + cmp r3, r1, lsl #5 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #5 + cmp r3, r1, lsl #4 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #4 + cmp r3, r1, lsl #3 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #3 + cmp r3, r1, lsl #2 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #2 + cmp r3, r1, lsl #1 + adc r0, r0, r0 + subcs r3, r3, r1, lsl #1 + cmp r3, r1 + adc r0, r0, r0 + subcs r3, r3, r1 + cmp r12, #0 + rsbmi r0, r0, #0 + bx lr +2: + teq r12, r0 + rsbmi r0, r0, #0 + bx lr +3: + movcc r0, #0 + asreq r0, r12, #31 + orreq r0, r0, #1 + bx lr +4: + clz r2, r1 + rsb r2, r2, #31 + cmp r12, #0 + lsr r0, r3, r2 + rsbmi r0, r0, #0 + bx lr +1: + .word Thumb2_DivZero_Handler + .word jdiv_1 + .word jdiv_2 + .word jdiv_3 + .word jdiv_4 + .word jdiv_5 + .word jdiv_6 + .word jdiv_7 + .word jdiv_8 + .word jdiv_9 + .word jdiv_10 + .word jdiv_11 + .word jdiv_12 + .word jdiv_13 + .word jdiv_14 + .word jdiv_15 + .word jdiv_16 + .word jdiv_17 + .word jdiv_18 + .word jdiv_19 + .word jdiv_20 + .word jdiv_21 + .word jdiv_22 + .word jdiv_23 + .word jdiv_24 + .word jdiv_25 + .word jdiv_26 + .word jdiv_27 + .word jdiv_28 + .word jdiv_29 + .word jdiv_30 + .word jdiv_31 + .word jdiv_32 + ALIGN_CODE + .global Thumb2_irem_stub +Thumb2_irem_stub: +int_rem: + cmp r1, #0x21 + adr r3, 1f + ldrcc pc, [r3, r1, lsl #2] + rsblt r1, r1, #0 + subs r2, r1, #1 + beq 2f + movs r12, r0 + rsbmi r0, r0, #0 + cmp r0, r1 + bls 3f + tst r1, r2 + beq 4f + clz r2, r0 + clz r3, r1 + sub r2, r3, r2 + rsbs r2, r2, #31 + add pc, pc, r2, lsl #3 + mov r3, #0 + cmp r0, r1, lsl #31 + subcs r0, r0, r1, lsl #31 + cmp r0, r1, lsl #30 + subcs r0, r0, r1, lsl #30 + cmp r0, r1, lsl #29 + subcs r0, r0, r1, lsl #29 + cmp r0, r1, lsl #28 + subcs r0, r0, r1, lsl #28 + cmp r0, r1, lsl #27 + subcs r0, r0, r1, lsl #27 + cmp r0, r1, lsl #26 + subcs r0, r0, r1, lsl #26 + cmp r0, r1, lsl #25 + subcs r0, r0, r1, lsl #25 + cmp r0, r1, lsl #24 + subcs r0, r0, r1, lsl #24 + cmp r0, r1, lsl #23 + subcs r0, r0, r1, lsl #23 + cmp r0, r1, lsl #22 + subcs r0, r0, r1, lsl #22 + cmp r0, r1, lsl #21 + subcs r0, r0, r1, lsl #21 + cmp r0, r1, lsl #20 + subcs r0, r0, r1, lsl #20 + cmp r0, r1, lsl #19 + subcs r0, r0, r1, lsl #19 + cmp r0, r1, lsl #18 + subcs r0, r0, r1, lsl #18 + cmp r0, r1, lsl #17 + subcs r0, r0, r1, lsl #17 + cmp r0, r1, lsl #16 + subcs r0, r0, r1, lsl #16 + cmp r0, r1, lsl #15 + subcs r0, r0, r1, lsl #15 + cmp r0, r1, lsl #14 + subcs r0, r0, r1, lsl #14 + cmp r0, r1, lsl #13 + subcs r0, r0, r1, lsl #13 + cmp r0, r1, lsl #12 + subcs r0, r0, r1, lsl #12 + cmp r0, r1, lsl #11 + subcs r0, r0, r1, lsl #11 + cmp r0, r1, lsl #10 + subcs r0, r0, r1, lsl #10 + cmp r0, r1, lsl #9 + subcs r0, r0, r1, lsl #9 + cmp r0, r1, lsl #8 + subcs r0, r0, r1, lsl #8 + cmp r0, r1, lsl #7 + subcs r0, r0, r1, lsl #7 + cmp r0, r1, lsl #6 + subcs r0, r0, r1, lsl #6 + cmp r0, r1, lsl #5 + subcs r0, r0, r1, lsl #5 + cmp r0, r1, lsl #4 + subcs r0, r0, r1, lsl #4 + cmp r0, r1, lsl #3 + subcs r0, r0, r1, lsl #3 + cmp r0, r1, lsl #2 + subcs r0, r0, r1, lsl #2 + cmp r0, r1, lsl #1 + subcs r0, r0, r1, lsl #1 + cmp r0, r1 + subcs r0, r0, r1 + cmp r12, #0 + rsbmi r0, r0, #0 + bx lr +2: + mov r0, #0 + bx lr +3: + moveq r0, #0 + cmp r12, #0 + rsbmi r0, r0, #0 + bx lr +4: + and r0, r0, r2 + cmp r12, #0 + rsbmi r0, r0, #0 + bx lr +1: + .word Thumb2_DivZero_Handler + .word jrem_1 + .word jrem_2 + .word jrem_3 + .word jrem_4 + .word jrem_5 + .word jrem_6 + .word jrem_7 + .word jrem_8 + .word jrem_9 + .word jrem_10 + .word jrem_11 + .word jrem_12 + .word jrem_13 + .word jrem_14 + .word jrem_15 + .word jrem_16 + .word jrem_17 + .word jrem_18 + .word jrem_19 + .word jrem_20 + .word jrem_21 + .word jrem_22 + .word jrem_23 + .word jrem_24 + .word jrem_25 + .word jrem_26 + .word jrem_27 + .word jrem_28 + .word jrem_29 + .word jrem_30 + .word jrem_31 + .word jrem_32 + +#ifdef THUMB2EE +@ R0 = BCI +@ R1 = index +#define Rthread r9 + .global Thumb2_invokeinterface_stub +Thumb2_invokeinterface_stub: + stmdb sp!, {ip, lr} + ldr ip, [istate, #ISTATE_METHOD] + sub stack, stack, #4 + ldr r2, [istate, #ISTATE_CONSTANTS] + ldr ip, [ip, #METHOD_CONSTMETHOD] + DECACHE_STACK + add jpc, ip, r0 + + add r0, r2, r1, lsl #4 + DECACHE_JPC + + ldr r2, [r0, #CP_OFFSET] + and r2, r2, #0x00ff0000 + cmp r2, #opc_invokeinterface << 16 + bne istub_resolve +2: + ldr r3, [r0, #CP_OFFSET+12] + and r2, r3, #255 + ldr r2, [stack, r2, lsl #2] + cmp r2, #0 + beq istub_null_ptr_exception + ldr tmp2, [r2, #4] @ rcvr->klass() + tst r3, #flag_methodInterface + bne istub_methodInterface + + ldr lr, [r0, #CP_OFFSET+4] @ lr = iclass + + add r1, tmp2, #INSTANCEKLASS_VTABLE_OFFSET + ldr r2, [tmp2, #KLASS_PART+INSTANCEKLASS_VTABLE_LEN] + ldr ip, [tmp2, #KLASS_PART+INSTANCEKLASS_ITABLE_LEN] + add r2, r2, #1 + bic r2, r2, #1 + + add r1, r1, r2, lsl #2 + + mov r2, #0 +1: + cmp r2, ip + beq istub_incompatibleclass_exception + ldr r3, [r1], #8 + add r2, r2, #1 + cmp lr, r3 + bne 1b + + ldr r3, [r0, #CP_OFFSET+8] + ldr r2, [r1, #-4] + add r3, tmp2, r3, lsl #2 + ldr tmp2, [r3, r2] + cmp tmp2, #0 + beq istub_abstractmethod_exception +istub_invoke: + ldr ip, [tmp2, #METHOD_FROM_INTERPRETED] + mov r1, #0 + str ip, [istate, #36] + str r1, [Rthread, #THREAD_LAST_JAVA_SP] + + add stack, stack, #4 + str stack, [Rthread, #THREAD_JAVA_SP] + + ldr r3, [ip] + + mov r0, tmp2 + mov r1, ip +#ifndef SHARK + add r3, r3, #CODE_ALIGN_SIZE +#endif + mov r2, Rthread + blx r3 + + ldr Rthread, [istate, #ISTATE_THREAD] + + ldr stack, [Rthread, #THREAD_JAVA_SP] + ldr r2, [istate, #ISTATE_STACK_LIMIT] + + ldr r1, [Rthread, #THREAD_TOP_ZERO_FRAME] + add r2, r2, #4 + str r2, [Rthread, #THREAD_JAVA_SP] + str r1, [Rthread, #THREAD_LAST_JAVA_SP] + ldr r3, [Rthread, #4] + cmp r3, #0 + bne istub_exception + ldmia sp!, {ip, pc} + +istub_methodInterface: + tst r3, #flag_vfinalMethod + ldrne tmp2, [r0, #CP_OFFSET+8] + bne istub_invoke + ldr r1, [r0, #CP_OFFSET+8] + add r3, tmp2, r1, lsl #2 + ldr tmp2, [r3, #INSTANCEKLASS_VTABLE_OFFSET] + b istub_invoke + +istub_resolve: + mov tmp2, r1 + mov r1, #opc_invokeinterface + ldr r0, [istate, #ISTATE_THREAD] + ldr ip, resolve_invoke_adcon + blx ip + ldr r3, [Rthread, #4] + ldr r2, [istate, #ISTATE_CONSTANTS] + cmp r3, #0 + bne istub_exception + add r0, r2, tmp2, lsl #4 @ r1 = cache + b 2b + +istub_exception: + ldmia sp!, {ip, lr} + ldr ip, handle_exception_adcon + bx ip + +istub_null_ptr_exception: + mov r0, #VMSYMBOLS_NullPointerException + b 3f +istub_abstractmethod_exception: + mov r0, #VMSYMBOLS_AbstractMethodError + b 3f +istub_incompatibleclass_exception: + mov r0, #VMSYMBOLS_IncompatibleClassChangeError +3: + CACHE_JPC + ldmia sp!, {ip, lr} + ldr ip, raise_exception_adcon + bx ip + +resolve_invoke_adcon: + .word _ZN18InterpreterRuntime14resolve_invokeEP10JavaThreadN9Bytecodes4CodeE +resolve_get_put_adcon: + .word _ZN18InterpreterRuntime15resolve_get_putEP10JavaThreadN9Bytecodes4CodeE +handle_exception_adcon: + .word handle_exception_with_bcp +raise_exception_adcon: + .word raise_exception +helper_aputfield_adcon: + .word Helper_aputfield + +@ R0 = BCI +@ R1 = index + .global Thumb2_invokevirtual_stub +Thumb2_invokevirtual_stub: + stmdb sp!, {ip, lr} + ldr ip, [istate, #ISTATE_METHOD] + sub stack, stack, #4 + ldr r2, [istate, #ISTATE_CONSTANTS] + ldr ip, [ip, #METHOD_CONSTMETHOD] + DECACHE_STACK + add jpc, ip, r0 + + add r0, r2, r1, lsl #4 + DECACHE_JPC + + ldr r2, [r0, #CP_OFFSET] + and r2, r2, #0xff000000 + cmp r2, #opc_invokevirtual << 24 + bne ivstub_resolve +2: + + ldr r3, [r0, #CP_OFFSET+12] + and r2, r3, #255 + ldr r2, [stack, r2, asl #2] + cmp r2, #0 + beq istub_null_ptr_exception + + ldr tmp2, [r0, #CP_OFFSET+8] + tst r3, #flag_vfinalMethod + bne 1f + + ldr r3, [r2, #4] + add r3, r3, tmp2, lsl #2 + ldr tmp2, [r3, #INSTANCEKLASS_VTABLE_OFFSET] +1: + mov r1, #0 + ldr ip, [tmp2, #METHOD_FROM_INTERPRETED] + str r1, [Rthread, #THREAD_LAST_JAVA_SP] + str ip, [istate, #36] + + add stack, stack, #4 + str stack, [Rthread, #THREAD_JAVA_SP] + + ldr r3, [ip, #0] + + mov r0, tmp2 + mov r1, ip +#ifndef SHARK + add r3, r3, #CODE_ALIGN_SIZE +#endif + mov r2, Rthread + blx r3 + + ldr Rthread, [istate, #ISTATE_THREAD] + + ldr stack, [Rthread, #THREAD_JAVA_SP] + ldr r2, [istate, #ISTATE_STACK_LIMIT] + + ldr r1, [Rthread, #THREAD_TOP_ZERO_FRAME] + add r2, r2, #4 + str r2, [Rthread, #THREAD_JAVA_SP] + str r1, [Rthread, #THREAD_LAST_JAVA_SP] + ldr r3, [Rthread, #4] + cmp r3, #0 + bne istub_exception + ldmia sp!, {ip, pc} + +ivstub_resolve: + mov tmp2, r1 + mov r1, #opc_invokevirtual + ldr r0, [istate, #ISTATE_THREAD] + ldr ip, resolve_invoke_adcon + blx ip + ldr r3, [Rthread, #4] + ldr r2, [istate, #ISTATE_CONSTANTS] + cmp r3, #0 + bne istub_exception + add r0, r2, tmp2, lsl #4 @ r1 = cache + b 2b + +@ R0 = BCI +@ R1 = index + .global Thumb2_invokestatic_stub +Thumb2_invokestatic_stub: + stmdb sp!, {ip, lr} + ldr ip, [istate, #ISTATE_METHOD] + sub stack, stack, #4 + ldr r2, [istate, #ISTATE_CONSTANTS] + ldr ip, [ip, #METHOD_CONSTMETHOD] + DECACHE_STACK + add jpc, ip, r0 + + add r0, r2, r1, lsl #4 + DECACHE_JPC + + ldr r2, [r0, #CP_OFFSET] + and r2, r2, #0x00ff0000 + cmp r2, #opc_invokestatic << 16 + bne isstub_resolve +2: + ldr tmp2, [r0, #CP_OFFSET+4] + mov r1, #0 + ldr ip, [tmp2, #METHOD_FROM_INTERPRETED] + str r1, [Rthread, #THREAD_LAST_JAVA_SP] + str ip, [istate, #36] + + add stack, stack, #4 + str stack, [Rthread, #THREAD_JAVA_SP] + + ldr r3, [ip, #0] + + mov r0, tmp2 + mov r1, ip +#ifndef SHARK + add r3, r3, #CODE_ALIGN_SIZE +#endif + mov r2, Rthread + blx r3 + + ldr Rthread, [istate, #ISTATE_THREAD] + + ldr stack, [Rthread, #THREAD_JAVA_SP] + ldr r2, [istate, #ISTATE_STACK_LIMIT] + + ldr r1, [Rthread, #THREAD_TOP_ZERO_FRAME] + add r2, r2, #4 + str r2, [Rthread, #THREAD_JAVA_SP] + str r1, [Rthread, #THREAD_LAST_JAVA_SP] + ldr r3, [Rthread, #4] + cmp r3, #0 + bne istub_exception + ldmia sp!, {ip, pc} + +isstub_resolve: + mov tmp2, r1 + mov r1, #opc_invokestatic + ldr r0, [istate, #ISTATE_THREAD] + ldr ip, resolve_invoke_adcon + blx ip + ldr r3, [Rthread, #4] + ldr r2, [istate, #ISTATE_CONSTANTS] + cmp r3, #0 + bne istub_exception + add r0, r2, tmp2, lsl #4 @ r1 = cache + b 2b + +@ R0 = BCI +@ R1 = index + .global Thumb2_invokespecial_stub +Thumb2_invokespecial_stub: + stmdb sp!, {ip, lr} + ldr ip, [istate, #ISTATE_METHOD] + sub stack, stack, #4 + ldr r2, [istate, #ISTATE_CONSTANTS] + ldr ip, [ip, #METHOD_CONSTMETHOD] + DECACHE_STACK + add jpc, ip, r0 + + add r0, r2, r1, lsl #4 + DECACHE_JPC + + ldr r2, [r0, #CP_OFFSET] + and r2, r2, #0x00ff0000 + cmp r2, #opc_invokespecial << 16 + bne ispstub_resolve +2: + ldr r3, [r0, #CP_OFFSET+12] + and r3, r3, #255 + ldr r2, [stack, r3, asl #2] + cmp r2, #0 + beq istub_null_ptr_exception + + ldr tmp2, [r0, #CP_OFFSET+4] + mov r1, #0 + ldr ip, [tmp2, #METHOD_FROM_INTERPRETED] + str r1, [Rthread, #THREAD_LAST_JAVA_SP] + str ip, [istate, #36] + + add stack, stack, #4 + str stack, [Rthread, #THREAD_JAVA_SP] + + ldr r3, [ip, #0] + + mov r0, tmp2 + mov r1, ip +#ifndef SHARK + add r3, r3, #CODE_ALIGN_SIZE +#endif + mov r2, Rthread + blx r3 + + ldr Rthread, [istate, #ISTATE_THREAD] + + ldr stack, [Rthread, #THREAD_JAVA_SP] + ldr r2, [istate, #ISTATE_STACK_LIMIT] + + ldr r1, [Rthread, #THREAD_TOP_ZERO_FRAME] + add r2, r2, #4 + str r2, [Rthread, #THREAD_JAVA_SP] + str r1, [Rthread, #THREAD_LAST_JAVA_SP] + ldr r3, [Rthread, #4] + cmp r3, #0 + bne istub_exception + ldmia sp!, {ip, pc} + +ispstub_resolve: + mov tmp2, r1 + mov r1, #opc_invokespecial + ldr r0, [istate, #ISTATE_THREAD] + ldr ip, resolve_invoke_adcon + blx ip + ldr r3, [Rthread, #4] + ldr r2, [istate, #ISTATE_CONSTANTS] + cmp r3, #0 + bne istub_exception + add r0, r2, tmp2, lsl #4 @ r1 = cache + b 2b + +@ R0 = BCI +@ R1 = index + .global Thumb2_getfield_word_stub +Thumb2_getfield_word_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0x00ff0000 + cmp r3, #opc_getfield << 16 + bne 1f +2: + ldr r3, [stack], #4 @ POP r3 + ldr ip, [r2, #CP_OFFSET+8] + cmp r3, #0 + beq field_null_ptr_exception + + ldr r3, [r3, ip] + str r3, [stack, #-4]! @ PUSH r3 + bx lr +1: + mov ip, lr + bl getfield_stub_unresolved + mov lr, ip + b 2b + +@ R0 = BCI +@ R1 = index + .global Thumb2_getfield_sh_stub +Thumb2_getfield_sh_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0x00ff0000 + cmp r3, #opc_getfield << 16 + bne 1f +2: + ldr r3, [stack], #4 @ POP r3 + ldr ip, [r2, #CP_OFFSET+8] + cmp r3, #0 + beq field_null_ptr_exception + + ldrsh r3, [r3, ip] + str r3, [stack, #-4]! @ PUSH r3 + bx lr +1: + mov ip, lr + bl getfield_stub_unresolved + mov lr, ip + b 2b + +@ R0 = BCI +@ R1 = index + .global Thumb2_getfield_h_stub +Thumb2_getfield_h_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0x00ff0000 + cmp r3, #opc_getfield << 16 + bne 1f +2: + ldr r3, [stack], #4 @ POP r3 + ldr ip, [r2, #CP_OFFSET+8] + cmp r3, #0 + beq field_null_ptr_exception + + ldrh r3, [r3, ip] + str r3, [stack, #-4]! @ PUSH r3 + bx lr +1: + mov ip, lr + bl getfield_stub_unresolved + mov lr, ip + b 2b + +@ R0 = BCI +@ R1 = index + .global Thumb2_getfield_sb_stub +Thumb2_getfield_sb_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0x00ff0000 + cmp r3, #opc_getfield << 16 + bne 1f +2: + ldr r3, [stack], #4 @ POP r3 + ldr ip, [r2, #CP_OFFSET+8] + cmp r3, #0 + beq field_null_ptr_exception + + ldrsb r3, [r3, ip] + str r3, [stack, #-4]! @ PUSH r3 + bx lr +1: + mov ip, lr + bl getfield_stub_unresolved + mov lr, ip + b 2b + +@ R0 = BCI +@ R1 = index + .global Thumb2_getfield_dw_stub +Thumb2_getfield_dw_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0x00ff0000 + cmp r3, #opc_getfield << 16 + bne 1f +2: + ldr r3, [stack], #4 @ POP r3 + ldr ip, [r2, #CP_OFFSET+8] + cmp r3, #0 + beq field_null_ptr_exception + + ldrd r2, r3, [r3, ip] + stmdb stack!, {r2, r3} @ PUSH r2, r3 + bx lr +1: + mov ip, lr + bl getfield_stub_unresolved + mov lr, ip + b 2b + +@ R0 = BCI +@ R1 = index +putstatic_stub_unresolved: + mov r2, #opc_putstatic + b field_stub_unresolved +getstatic_stub_unresolved: + mov r2, #opc_getstatic + b field_stub_unresolved +putfield_stub_unresolved: + mov r2, #opc_putfield + b field_stub_unresolved +getfield_stub_unresolved: + mov r2, #opc_getfield +field_stub_unresolved: + stmdb sp!, {r0, r1, ip, lr} + ldr ip, [istate, #ISTATE_METHOD] + sub r3, stack, #4 + ldr ip, [ip, #METHOD_CONSTMETHOD] + str r3, [istate, #ISTATE_STACK] @ DECACHE_STACK + add r3, ip, r0 + str r3, [istate, #ISTATE_BCP] @ DECACHE_JPC + ldr ip, resolve_get_put_adcon + mov r1, r2 + ldr r0, [istate, #ISTATE_THREAD] + blx ip + ldmia sp!, {r0, r1, ip, lr} + ldr r3, [Rthread, #4] + ldr r2, [istate, #ISTATE_CONSTANTS] + cmp r3, #0 + bne field_exception + add r2, r2, r1, lsl #4 + bx lr + +field_null_ptr_exception: + ldr ip, [istate, #ISTATE_METHOD] + ldr ip, [ip, #METHOD_CONSTMETHOD] + add jpc, ip, r0 + mov r0, #VMSYMBOLS_NullPointerException + ldr ip, raise_exception_adcon + bx ip + +field_exception: + ldr ip, handle_exception_adcon + bx ip + +@ R0 = BCI +@ R1 = index + .global Thumb2_putfield_word_stub +Thumb2_putfield_word_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0xff000000 + cmp r3, #opc_putfield << 24 + bne 1f +2: + ldr ip, [r2, #CP_OFFSET+8] + ldmia stack!, {r2, r3} @ r2 = value, r3 = obj + cmp r3, #0 + beq field_null_ptr_exception + + str r2, [r3, ip] + bx lr +1: + mov ip, lr + bl putfield_stub_unresolved + mov lr, ip + b 2b + + .global Thumb2_putfield_h_stub +Thumb2_putfield_h_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0xff000000 + cmp r3, #opc_putfield << 24 + bne 1f +2: + ldr ip, [r2, #CP_OFFSET+8] + ldmia stack!, {r2, r3} @ r2 = value, r3 = obj + cmp r3, #0 + beq field_null_ptr_exception + + strh r2, [r3, ip] + bx lr +1: + mov ip, lr + bl putfield_stub_unresolved + mov lr, ip + b 2b + + .global Thumb2_putfield_b_stub +Thumb2_putfield_b_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0xff000000 + cmp r3, #opc_putfield << 24 + bne 1f +2: + ldr ip, [r2, #CP_OFFSET+8] + ldmia stack!, {r2, r3} @ r2 = value, r3 = obj + cmp r3, #0 + beq field_null_ptr_exception + + strb r2, [r3, ip] + bx lr +1: + mov ip, lr + bl putfield_stub_unresolved + mov lr, ip + b 2b + + .global Thumb2_putfield_a_stub +Thumb2_putfield_a_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0xff000000 + cmp r3, #opc_putfield << 24 + bne 1f +2: + ldr ip, [r2, #CP_OFFSET+8] + ldmia stack!, {r2, r3} @ r2 = value, r3 = obj + cmp r3, #0 + beq field_null_ptr_exception + + str r2, [r3, ip] + ldr ip, helper_aputfield_adcon + mov r0, r3 + bx ip +1: + mov ip, lr + bl putfield_stub_unresolved + mov lr, ip + b 2b + + .global Thumb2_putfield_dw_stub +Thumb2_putfield_dw_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0xff000000 + cmp r3, #opc_putfield << 24 + bne 1f +2: + ldr r1, [r2, #CP_OFFSET+8] + ldmia stack!, {r2, r3, ip} @ r2,r3 = value, ip = obj + cmp ip, #0 + beq field_null_ptr_exception + + strd r2,r3, [ip, r1] + bx lr +1: + mov ip, lr + bl putfield_stub_unresolved + mov lr, ip + b 2b + +@ R0 = BCI +@ R1 = index + .global Thumb2_getstatic_word_stub +Thumb2_getstatic_word_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0x00ff0000 + cmp r3, #opc_getstatic << 16 + bne 1f +2: + ldr r3, [r2, #CP_OFFSET+4] + ldr ip, [r2, #CP_OFFSET+8] + + ldr r3, [r3, ip] + str r3, [stack, #-4]! @ PUSH r3 + bx lr +1: + mov ip, lr + bl getstatic_stub_unresolved + mov lr, ip + b 2b + + .global Thumb2_getstatic_h_stub +Thumb2_getstatic_h_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0x00ff0000 + cmp r3, #opc_getstatic << 16 + bne 1f +2: + ldr r3, [r2, #CP_OFFSET+4] + ldr ip, [r2, #CP_OFFSET+8] + + ldrh r3, [r3, ip] + str r3, [stack, #-4]! @ PUSH r3 + bx lr +1: + mov ip, lr + bl getstatic_stub_unresolved + mov lr, ip + b 2b + + .global Thumb2_getstatic_sh_stub +Thumb2_getstatic_sh_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0x00ff0000 + cmp r3, #opc_getstatic << 16 + bne 1f +2: + ldr r3, [r2, #CP_OFFSET+4] + ldr ip, [r2, #CP_OFFSET+8] + + ldrsh r3, [r3, ip] + str r3, [stack, #-4]! @ PUSH r3 + bx lr +1: + mov ip, lr + bl getstatic_stub_unresolved + mov lr, ip + b 2b + + .global Thumb2_getstatic_sb_stub +Thumb2_getstatic_sb_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0x00ff0000 + cmp r3, #opc_getstatic << 16 + bne 1f +2: + ldr r3, [r2, #CP_OFFSET+4] + ldr ip, [r2, #CP_OFFSET+8] + + ldrsb r3, [r3, ip] + str r3, [stack, #-4]! @ PUSH r3 + bx lr +1: + mov ip, lr + bl getstatic_stub_unresolved + mov lr, ip + b 2b + + .global Thumb2_getstatic_dw_stub +Thumb2_getstatic_dw_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0x00ff0000 + cmp r3, #opc_getstatic << 16 + bne 1f +2: + ldr r3, [r2, #CP_OFFSET+4] + ldr ip, [r2, #CP_OFFSET+8] + + ldrd r2, r3, [r3, ip] + stmdb stack!, {r2, r3} @ PUSH r2, r3 + bx lr +1: + mov ip, lr + bl getstatic_stub_unresolved + mov lr, ip + b 2b + +@ R0 = BCI +@ R1 = index + .global Thumb2_putstatic_word_stub +Thumb2_putstatic_word_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0xff000000 + cmp r3, #opc_putstatic << 24 + bne 1f +2: + ldr r3, [r2, #CP_OFFSET+4] + ldr ip, [r2, #CP_OFFSET+8] + ldr r2, [stack], #4 @ POP r2 + + str r2, [r3, ip] + bx lr +1: + mov ip, lr + bl putstatic_stub_unresolved + mov lr, ip + b 2b + +@ R0 = BCI +@ R1 = index + .global Thumb2_putstatic_h_stub +Thumb2_putstatic_h_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0xff000000 + cmp r3, #opc_putstatic << 24 + bne 1f +2: + ldr r3, [r2, #CP_OFFSET+4] + ldr ip, [r2, #CP_OFFSET+8] + ldr r2, [stack], #4 @ POP r2 + + strh r2, [r3, ip] + bx lr +1: + mov ip, lr + bl putstatic_stub_unresolved + mov lr, ip + b 2b + +@ R0 = BCI +@ R1 = index + .global Thumb2_putstatic_b_stub +Thumb2_putstatic_b_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0xff000000 + cmp r3, #opc_putstatic << 24 + bne 1f +2: + ldr r3, [r2, #CP_OFFSET+4] + ldr ip, [r2, #CP_OFFSET+8] + ldr r2, [stack], #4 @ POP r2 + + strb r2, [r3, ip] + bx lr +1: + mov ip, lr + bl putstatic_stub_unresolved + mov lr, ip + b 2b + +@ R0 = BCI +@ R1 = index + .global Thumb2_putstatic_dw_stub +Thumb2_putstatic_dw_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0xff000000 + cmp r3, #opc_putstatic << 24 + bne 1f +2: + ldr r1, [r2, #CP_OFFSET+4] + ldr ip, [r2, #CP_OFFSET+8] + ldmia stack!, {r2, r3} + + strd r2,r3, [r1, ip] + bx lr +1: + mov ip, lr + bl putstatic_stub_unresolved + mov lr, ip + b 2b + +@ R0 = BCI +@ R1 = index + .global Thumb2_putstatic_a_stub +Thumb2_putstatic_a_stub: + ldr r2, [istate, #ISTATE_CONSTANTS] + add r2, r2, r1, lsl #4 + ldr r3, [r2, #CP_OFFSET] + and r3, r3, #0xff000000 + cmp r3, #opc_putstatic << 24 + bne 1f +2: + ldr r3, [r2, #CP_OFFSET+4] + ldr ip, [r2, #CP_OFFSET+8] + ldr r2, [stack], #4 @ POP r2 + + str r2, [r3, ip] + ldr ip, helper_aputfield_adcon + mov r0, r3 + bx ip +1: + mov ip, lr + bl putstatic_stub_unresolved + mov lr, ip + b 2b + +#endif // THUMB2EE + + .global Thumb2_stubs_end +Thumb2_stubs_end: + + ALIGN_CODE +jdiv_1: + bx lr +jdiv_2: + add r0, r0, r0, lsr #31 + mov r0, r0, asr #1 + bx lr +jdiv_24: + add r0, r0, r0, lsr #31 + mov r0, r0, asr #1 +jdiv_12: + add r0, r0, r0, lsr #31 + mov r0, r0, asr #1 +jdiv_6: + add r0, r0, r0, lsr #31 + mov r0, r0, asr #1 +jdiv_3: + ldr r1, dc_3 + smull r3, r2, r0, r1 + sub r0, r2, r0, asr #31 + bx lr +jdiv_4: + mov r1, r0, asr #31 + add r0, r0, r1, lsr #30 + mov r0, r0, asr #2 + bx lr +jdiv_20: + add r0, r0, r0, lsr #31 + mov r0, r0, asr #1 +jdiv_10: + add r0, r0, r0, lsr #31 + mov r0, r0, asr #1 +jdiv_5: + ldr r1, dc_5 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r0, r3, r2, asr #1 + bx lr +jdiv_28: + add r0, r0, r0, lsr #31 + mov r0, r0, asr #1 +jdiv_14: + add r0, r0, r0, lsr #31 + mov r0, r0, asr #1 +jdiv_7: + ldr r1, dc_7 + smull r3, r2, r0, r1 + mov r1, r0, asr #31 + add r3, r0, r2 + rsb r0, r1, r3, asr #2 + bx lr +jdiv_8: + mov r1, r0, asr #31 + add r0, r0, r1, lsr #29 + mov r0, r0, asr #3 + bx lr +jdiv_18: + add r0, r0, r0, lsr #31 + mov r0, r0, asr #1 +jdiv_9: + ldr r1, dc_9 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r0, r3, r2, asr #1 + bx lr +jdiv_22: + add r0, r0, r0, lsr #31 + mov r0, r0, asr #1 +jdiv_11: + ldr r1, dc_11 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r0, r3, r2, asr #1 + bx lr +jdiv_26: + add r0, r0, r0, lsr #31 + mov r0, r0, asr #1 +jdiv_13: + ldr r1, dc_13 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r0, r3, r2, asr #2 + bx lr +jdiv_30: + add r0, r0, r0, lsr #31 + mov r0, r0, asr #1 +jdiv_15: + ldr r1, dc_15 + smull r3, r2, r0, r1 + mov r1, r0, asr #31 + add r3, r0, r2 + rsb r0, r1, r3, asr #3 + bx lr +jdiv_16: + mov r1, r0, asr #31 + add r0, r0, r1, lsr #28 + mov r0, r0, asr #4 + bx lr +jdiv_17: + ldr r1, dc_17 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r0, r3, r2, asr #3 + bx lr +jdiv_19: + ldr r1, dc_19 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r0, r3, r2, asr #3 + bx lr +jdiv_21: + ldr r1, dc_21 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r0, r3, r2, asr #2 + bx lr +jdiv_23: + ldr r1, dc_23 + smull r3, r2, r0, r1 + mov r1, r0, asr #31 + add r3, r0, r2 + rsb r0, r1, r3, asr #4 + bx lr +jdiv_25: + ldr r1, dc_25 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r0, r3, r2, asr #3 + bx lr +jdiv_27: + ldr r1, dc_27 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r0, r3, r2, asr #3 + bx lr +jdiv_29: + ldr r1, dc_29 + smull r3, r2, r0, r1 + mov r1, r0, asr #31 + add r3, r0, r2 + rsb r0, r1, r3, asr #4 + bx lr +jdiv_31: + ldr r1, dc_31 + smull r3, r2, r0, r1 + mov r1, r0, asr #31 + add r3, r0, r2 + rsb r0, r1, r3, asr #4 + bx lr +jdiv_32: + mov r1, r0, asr #31 + add r0, r0, r1, lsr #27 + mov r0, r0, asr #5 + bx lr +jrem_1: + mov r0, #0 + bx lr +jrem_2: + add r3, r0, r0, lsr #31 + mov r1, r3, asr #1 + sub r0, r0, r1, lsl #1 + bx lr +jrem_3: + ldr r1, dc_3 + smull r3, r2, r0, r1 + sub r1, r2, r0, asr #31 + add r3, r1, r1, lsl #1 + sub r0, r0, r3 + bx lr +jrem_4: + movs r3, r0 + addmi r3, r3, #3 + mov r1, r3, asr #2 + sub r0, r0, r1, lsl #2 + bx lr +jrem_5: + ldr r1, dc_5 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r1, r3, r2, asr #1 + add r3, r1, r1, lsl #2 + sub r0, r0, r3 + bx lr +jrem_6: + ldr r1, dc_6 + smull r3, r2, r0, r1 + sub r1, r2, r0, asr #31 + add r3, r1, r1, lsl #1 + sub r0, r0, r3, lsl #1 + bx lr +jrem_7: + ldr r1, dc_7 + smull r3, r2, r0, r1 + mov r1, r0, asr #31 + add r3, r0, r2 + rsb r1, r1, r3, asr #2 + rsb r3, r1, r1, lsl #3 + sub r0, r0, r3 + bx lr +jrem_8: + movs r3, r0 + addmi r3, r3, #7 + mov r1, r3, asr #3 + sub r0, r0, r1, lsl #3 + bx lr +jrem_9: + ldr r1, dc_9 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r1, r3, r2, asr #1 + add r3, r1, r1, lsl #3 + sub r0, r0, r3 + bx lr +jrem_10: + ldr r1, dc_10 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r1, r3, r2, asr #2 + add r3, r1, r1, lsl #2 + sub r0, r0, r3, lsl #1 + bx lr +jrem_11: + ldr r1, dc_11 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r1, r3, r2, asr #1 + add r3, r1, r1, lsl #2 + add r3, r1, r3, lsl #1 + sub r0, r0, r3 + bx lr +jrem_12: + ldr r1, dc_12 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r1, r3, r2, asr #1 + add r3, r1, r1, lsl #1 + sub r0, r0, r3, lsl #2 + bx lr +jrem_13: + ldr r1, dc_13 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r1, r3, r2, asr #2 + add r3, r1, r1, lsl #1 + add r3, r1, r3, lsl #2 + sub r0, r0, r3 + bx lr +jrem_14: + ldr r1, dc_14 + smull r3, r2, r0, r1 + mov r1, r0, asr #31 + add r3, r0, r2 + rsb r1, r1, r3, asr #3 + rsb r3, r1, r1, lsl #3 + sub r0, r0, r3, lsl #1 + bx lr +jrem_15: + ldr r1, dc_15 + smull r3, r2, r0, r1 + mov r1, r0, asr #31 + add r3, r0, r2 + rsb r1, r1, r3, asr #3 + rsb r3, r1, r1, lsl #4 + sub r0, r0, r3 + bx lr +jrem_16: + movs r3, r0 + addmi r3, r3, #15 + mov r1, r3, asr #4 + sub r0, r0, r1, lsl #4 + bx lr +jrem_17: + ldr r1, dc_17 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r1, r3, r2, asr #3 + add r3, r1, r1, lsl #4 + sub r0, r0, r3 + bx lr +jrem_18: + ldr r1, dc_18 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r1, r3, r2, asr #2 + add r3, r1, r1, lsl #3 + sub r0, r0, r3, lsl #1 + bx lr +jrem_19: + ldr r1, dc_19 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r1, r3, r2, asr #3 + add r3, r1, r1, lsl #3 + add r3, r1, r3, lsl #1 + sub r0, r0, r3 + bx lr +jrem_20: + ldr r1, dc_20 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r1, r3, r2, asr #3 + add r3, r1, r1, lsl #2 + sub r0, r0, r3, lsl #2 + bx lr +jrem_21: + ldr r1, dc_21 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r1, r3, r2, asr #2 + add r3, r1, r1, lsl #1 + rsb r3, r3, r3, lsl #3 + sub r0, r0, r3 + bx lr +jrem_22: + ldr r1, dc_22 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r1, r3, r2, asr #2 + add r3, r1, r1, lsl #2 + add r3, r1, r3, lsl #1 + sub r0, r0, r3, lsl #1 + bx lr +jrem_23: + ldr r1, dc_23 + smull r3, r2, r0, r1 + mov r1, r0, asr #31 + add r3, r0, r2 + rsb r1, r1, r3, asr #4 + add r3, r1, r1, lsl #1 + rsb r3, r1, r3, lsl #3 + sub r0, r0, r3 + bx lr +jrem_24: + ldr r1, dc_24 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r1, r3, r2, asr #2 + add r3, r1, r1, lsl #1 + sub r0, r0, r3, lsl #3 + bx lr +jrem_25: + ldr r1, dc_25 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r1, r3, r2, asr #3 + add r3, r1, r1, lsl #2 + add r3, r3, r3, lsl #2 + sub r0, r0, r3 + bx lr +jrem_26: + ldr r1, dc_26 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r1, r3, r2, asr #3 + add r3, r1, r1, lsl #1 + add r3, r1, r3, lsl #2 + sub r0, r0, r3, lsl #1 + bx lr +jrem_27: + ldr r1, dc_27 + smull r3, r2, r0, r1 + mov r3, r0, asr #31 + rsb r1, r3, r2, asr #3 + add r3, r1, r1, lsl #1 + add r3, r3, r3, lsl #3 + sub r0, r0, r3 + bx lr +jrem_28: + ldr r1, dc_28 + smull r3, r2, r0, r1 + mov r1, r0, asr #31 + add r3, r0, r2 + rsb r1, r1, r3, asr #4 + rsb r3, r1, r1, lsl #3 + sub r0, r0, r3, lsl #2 + bx lr +jrem_29: + ldr r1, dc_29 + smull r3, r2, r0, r1 + mov r1, r0, asr #31 + add r3, r0, r2 + rsb r1, r1, r3, asr #4 + rsb r3, r1, r1, lsl #3 + add r3, r1, r3, lsl #2 + sub r0, r0, r3 + bx lr +jrem_30: + ldr r1, dc_30 + smull r3, r2, r0, r1 + mov r1, r0, asr #31 + add r3, r0, r2 + rsb r1, r1, r3, asr #4 + rsb r3, r1, r1, lsl #4 + sub r0, r0, r3, lsl #1 + bx lr +jrem_31: + ldr r1, dc_31 + smull r3, r2, r0, r1 + mov r1, r0, asr #31 + add r3, r0, r2 + rsb r1, r1, r3, asr #4 + rsb r3, r1, r1, lsl #5 + sub r0, r0, r3 + bx lr +jrem_32: + movs r3, r0 + addmi r3, r3, #31 + mov r1, r3, asr #5 + sub r0, r0, r1, lsl #5 + bx lr + ALIGN_DATA +dc_7: +dc_14: + .word 0x92492493 +dc_15: +dc_30: + .word 0x88888889 +dc_23: + .word 0xb21642c9 +dc_28: + .word 0x92492493 +dc_29: + .word 0x8d3dcb09 +dc_31: + .word 0x84210843 +dc_6: +dc_12: +dc_24: + .word 0x2aaaaaab +dc_19: + .word 0x6bca1af3 +dc_5: +dc_10: +dc_20: + .word 0x66666667 +dc_21: + .word 0x30c30c31 +dc_11: +dc_22: + .word 0x2e8ba2e9 +dc_26: +dc_13: + .word 0x4ec4ec4f +dc_25: + .word 0x51eb851f +dc_27: + .word 0x4bda12f7 +dc_3: + .word 0x55555556 +dc_17: + .word 0x78787879 +dc_9: +dc_18: + .word 0x38e38e39 + + .global Thumb2_DivZero_Handler +Thumb2_DivZero_Handler: + adrl r0, idiv_clz_ret + cmp r0, lr + addne r0, r0, #irem_clz_ret - idiv_clz_ret + cmpne r0, lr + beq divide_by_zero_exception + ldr r0, [istate, #ISTATE_METHOD] + ldr jpc, [r0, #METHOD_CONSTMETHOD] + add jpc, jpc, #CONSTMETHOD_CODEOFFSET + bl load_dispatch + b divide_by_zero_exception + +#ifdef THUMB2EE + + .global Thumb2_Handle_Exception + .global Thumb2_ArrayBounds_Handler + .global Thumb2_NullPtr_Handler +Thumb2_ArrayBounds_Handler: + ldr r0, [istate, #ISTATE_METHOD] + ldr jpc, [r0, #METHOD_CONSTMETHOD] + add jpc, jpc, #CONSTMETHOD_CODEOFFSET + bl load_dispatch + mov r0, #VMSYMBOLS_ArrayIndexOutOfBounds + b raise_exception +Thumb2_Handle_Exception: + ldr r0, [istate, #ISTATE_METHOD] + ldr jpc, [r0, #METHOD_CONSTMETHOD] + add jpc, jpc, #CONSTMETHOD_CODEOFFSET + bl load_dispatch + b handle_exception + + .global Thumb2_Exit_To_Interpreter +Thumb2_Exit_To_Interpreter: + bl load_dispatch + sub stack, stack, #4 + CACHE_CP + CACHE_LOCALS + DISPATCH 0 + +Thumb2_NullPtr_Handler: + ldr r0, [istate, #ISTATE_METHOD] + ldr jpc, [r0, #METHOD_CONSTMETHOD] + add jpc, jpc, #CONSTMETHOD_CODEOFFSET + bl load_dispatch + b null_ptr_exception + + .global Thumb2_Clear_Cache +Thumb2_Clear_Cache: + stmdb sp!, {r7} + mov r2, #0 + mov r7, #2 + orr r7, r7, #0xf0000 + svc 0 + ldmia sp!, {r7} + bx lr + +#endif // THUMB2EE + .section .init_array,"aw",%init_array .word bci_init(target1) .data + .global CPUInfo ALIGN_DATA -#ifdef CODETRACE -CodeTrace_Buffer_Base: - .space CODETRACE_BUFFER_SIZE -#endif .word 0, 0, 0, 0, 0, 0, 0, 0 .word 0, 0, 0, 0, 0 DispatchBreakPoint: .word 0 -VFP_Flag: .word 0 +CPUInfo: .word 0 CodeTrace_Idx: .word 0 UseOnStackReplacement_Address: .word 0 BackgroundCompilation_Address: .word 0