ARM asm improvements - part 3

Edward Nevill ed at camswl.com
Thu Sep 10 11:28:09 PDT 2009


And here is part 3, cppInterpreter_asm.S. See part 2 for comments.

Regards,
Ed.

--- CUT HERE ------------------------------------------------------------
diff -ruNE old/icedtea6/ports/hotspot/src/cpu/zero/vm/cppInterpreter_arm.S new/icedtea6/ports/hotspot/src/cpu/zero/vm/cppInterpreter_arm.S
--- old/icedtea6/ports/hotspot/src/cpu/zero/vm/cppInterpreter_arm.S	2009-09-08 14:30:25.000000000 +0100
+++ new/icedtea6/ports/hotspot/src/cpu/zero/vm/cppInterpreter_arm.S	2009-09-10 14:18:07.000000000 +0100
@@ -1,17 +1,24 @@
-#if defined(PRODUCT) && defined(HOTSPOT_ASM)
-//#define HW_NULL_PTR_CHECK
-//#define UNALIGNED_ACCESS
-//#define B14
+#ifdef HOTSPOT_ASM
 
 #define ARMv4
 
-#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
-
-// ECN: DOH!!! gcc 4.4 has changed the name mangling scheme!!!
-#if GCC_VERSION >= 40400
-#define oop_store		_Z9oop_storeIP7oopDescEvPT_S1_
-#else
-#define oop_store		_Z9oop_storeIP7oopDescEvPVT_S1_
+#ifndef DISABLE_NOTICE_SAFEPOINTS
+#define NOTICE_SAFEPOINTS
+#endif
+#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
+#ifndef DISABLE_HW_FP
+#define HW_FP
 #endif
 
 #define stack		r4
@@ -22,7 +29,7 @@
 #define constpool	r9
 #define arm_sp		r13
 
-#define CONST_POOL_OFFSET	16
+#define CP_OFFSET	16
 
 #define tmp_xxx		r7
 #define tmp_yyy		r5
@@ -32,7 +39,9 @@
 #define tmp1		r11
 #define tmp2		r10
 
-#define regset r4-r11
+#define tmp_invoke_len	lr
+
+#define regset r3-r11
 
 #define tos_btos        0
 #define tos_ctos        1
@@ -43,114 +52,12 @@
 #define tos_dtos        6
 #define tos_atos        7
 
-#define JVM_CONSTANT_Utf8		1
-#define JVM_CONSTANT_Unicode		2
-#define JVM_CONSTANT_Integer		3
-#define JVM_CONSTANT_Float		4
-#define JVM_CONSTANT_Long		5
-#define JVM_CONSTANT_Double		6
-#define JVM_CONSTANT_Class		7
-#define JVM_CONSTANT_String		8
-#define JVM_CONSTANT_Fieldref		9
-#define JVM_CONSTANT_Methodref		10
-#define JVM_CONSTANT_InterfaceMethodref	11
-#define JVM_CONSTANT_NameAndType	12
-
-#define JVM_CONSTANT_UnresolvedClass	100
-#define JVM_CONSTANT_ClassIndex		101
-#define JVM_CONSTANT_UnresolvedString	102
-#define JVM_CONSTANT_StringIndex	103
-#define JVM_CONSTANT_UnresolvedClassInError	104
-
-#define T_BOOLEAN	4
-#define T_CHAR		5
-#define T_FLOAT		6
-#define T_DOUBLE	7
-#define T_BYTE		8
-#define T_SHORT		9
-#define T_INT		10
-#define T_LONG		11
-#define T_OBJECT	12
-#define T_ARRAY		13
-#define T_VOID		14
-
-#define _thread_uninitialized	0
-#define _thread_new		2
-#define _thread_new_trans	3
-#define _thread_in_native	4
-#define _thread_in_native_trans	5
-#define _thread_in_vm		6
-#define _thread_in_vm_trans	7
-#define _thread_in_Java		8
-#define	_thread_in_Java_trans	9
-#define _thread_blocked		10
-#define _thread_blocked_trans	11
-#define _thread_max_state	12
-
-
-#define THREAD_VTABLE		  0
-#define THREAD_PENDING_EXC	  4
-#define THREAD_SUSPEND_FLAGS	 24
-#define THREAD_ACTIVE_HANDLES	 32
-#define THREAD_LAST_HANDLE_MARK	 40
-
-#ifdef B14
-#define THREAD_TLAB_TOP		 56
-#define THREAD_TLAB_END		 64
-#define THREAD_HANDLE_AREA	152
-#define THREAD_STACK_BASE	156
-#define THREAD_STACK_SIZE	160
-#define THREAD_LAST_JAVA_SP	260
-#define THREAD_JNI_ENVIRONMENT	272
-#define THREAD_VM_RESULT	300
-#define THREAD_STATE		320
-#define THREAD_DO_NOT_UNLOCK	345
-#define THREAD_JAVA_STACK_BASE	476
-#define THREAD_JAVA_SP		484
-#define	THREAD_TOP_ZERO_FRAME	488
+#include "offsets_arm.s"
 
-#define THREAD_VTABLE_IS_LOCK_OWNED	56
-#else
-#define THREAD_TLAB_TOP		 56-4
-#define THREAD_TLAB_END		 64-4
-#define THREAD_HANDLE_AREA	152-4
-#define THREAD_STACK_BASE	156-4
-#define THREAD_STACK_SIZE	160-4
-#define THREAD_LAST_JAVA_SP	260-4
-#define THREAD_JNI_ENVIRONMENT	272-4
-#define THREAD_VM_RESULT	300-4
-#define THREAD_STATE		320-4
-#define THREAD_DO_NOT_UNLOCK	345-4
-#define THREAD_JAVA_STACK_BASE	476-4
-#define THREAD_JAVA_SP		484-4
-#define	THREAD_TOP_ZERO_FRAME	488-4
-
-#define THREAD_VTABLE_IS_LOCK_OWNED	52
-#endif
-
-#define UNIVERSE_VTABLE			  0
-#define UNIVERSE_VTABLE_TOP_ADDR	 96
-#define UNIVERSE_VTABLE_END_ADDR	100
-
-#ifdef B14
-#define VMSYMBOLS_ArithmeticException		77
-#define VMSYMBOLS_ArrayIndexOutOfBounds		78
-#define VMSYMBOLS_ArrayStoreException		79
-#define VMSYMBOLS_ClassCastException		80
-#define VMSYMBOLS_NullPointerException		95
-#define VMSYMBOLS_AbstractMethodError		103
-#define VMSYMBOLS_IncompatibleClassChangeError	110
-#define VMSYMBOLS_InternalError 		111
-#else
-#define VMSYMBOLS_ArithmeticException		78
-#define VMSYMBOLS_ArrayIndexOutOfBounds		79
-#define VMSYMBOLS_ArrayStoreException		80
-#define VMSYMBOLS_ClassCastException		81
-#define VMSYMBOLS_NullPointerException		96
-#define VMSYMBOLS_AbstractMethodError		104
-#define VMSYMBOLS_IncompatibleClassChangeError	111
-#define VMSYMBOLS_InternalError 		112
-#endif
+#define RESOURCEAREA_AREA	0
+#define RESOURCEAREA_CHUNK	4
+#define RESOURCEAREA_HWM	8
+#define RESOURCEAREA_MAX	12
 
 #define ISTATE_THREAD		0
 #define ISTATE_BCP		4
@@ -159,7 +66,7 @@
 #define ISTATE_METHOD		16
 #define ISTATE_MDX		20
 #define ISTATE_STACK		24
-#define ISTATE_SAVED_ISTATE	28
+#define ISTATE_ADVANCE_PC	28
 #define ISTATE_MSG		28
 #define ISTATE_CALLEE		32	// union frame_manager_message
 
@@ -171,24 +78,145 @@
 #define ISTATE_SELF_LINK	64
 #define ISTATE_CAFEBABF		68
 
-#define last_implemented_bytecode 248
+#define ISTATE_NEXT_FRAME	72
+
+#define FRAME_SIZE		76
+
+#define last_implemented_bytecode 201
 
 	.macro	ALIGN_CODE
-	.align	6
+	.align	3
 	.endm
 
 	.macro	ALIGN_DATA
-	.align	6
+	.align	3
 	.endm
 
 	.macro	ALIGN_OPCODE
-	.align	6
+	.align	3
 	.endm
 
 	.macro	ALIGN_WORD
 	.align	2
 	.endm
 
+ at ------------------------------------------------
+@ Software NULL Pointer check macro.
+@ Usage:
+@	SW_NPC	cmp	obj, #0
+@	SW_NPC	beq	null_ptr_exception
+ at ------------------------------------------------
+	.macro	SW_NPC	p1, p2, p3, p4
+#ifndef HW_NULL_PTR_CHECK
+  .ifnes "\p4", ""
+	\p1 \p2, \p3, \p4
+  .else
+    .ifnes "\p3", ""
+	\p1 \p2, \p3
+    .else
+	\p1 \p2
+    .endif
+  .endif
+#endif // HW_NULL_PTR_CHECK
+	.endm
+
+	.macro	HW_NPC	p1, p2, p3, p4
+#ifdef HW_NULL_PTR_CHECK
+  .ifnes "\p4", ""
+	\p1 \p2, \p3, \p4
+  .else
+    .ifnes "\p3", ""
+	\p1 \p2, \p3
+    .else
+	\p1 \p2
+    .endif
+  .endif
+#endif // HW_NULL_PTR_CHECK
+	.endm
+
+ at ------------------------------------------------
+@ Fast Bytecode Macros FBC and NFBC
+@ Use to conditionalise code using fast bytecodes
+@ EG:
+@	FBC	mov	r0, #opc_invokeresolved
+@	FBC	b	rewrite_bytecode
+@	NFBC	code to handle slow case
+@	NFBC	...
+ at ------------------------------------------------
+	.macro	FBC	p1, p2, p3, p4, p5
+#ifdef FAST_BYTECODES
+  .ifnes "\p5", ""
+	  \p1 \p2, \p3, \p4, \p5
+  .else
+    .ifnes "\p4", ""
+	  \p1 \p2, \p3, \p4
+    .else
+      .ifnes "\p3", ""
+	  \p1 \p2, \p3
+      .else
+	  \p1 \p2
+      .endif
+    .endif
+  .endif
+#endif
+	.endm
+
+	.macro	NFBC	p1, p2, p3, p4
+#ifndef FAST_BYTECODES
+  .ifnes "\p4", ""
+	\p1 \p2, \p3, \p4
+  .else
+    .ifnes "\p3", ""
+	\p1 \p2, \p3
+    .else
+	\p1 \p2
+    .endif
+  .endif
+#endif
+	.endm
+
+ at ------------------------------------------------
+@ Notice Safepoints macro
+@ Usage:
+@	NSP	<notice safepoint specific code>
+ at ------------------------------------------------
+	.macro	NSP	p1, p2, p3, p4, p5
+#ifdef NOTICE_SAFEPOINTS
+  .ifnes "\p5", ""
+	  \p1 \p2, \p3, \p4, \p5
+  .else
+    .ifnes "\p4", ""
+	  \p1 \p2, \p3, \p4
+    .else
+      .ifnes "\p3", ""
+	  \p1 \p2, \p3
+      .else
+	  \p1 \p2
+      .endif
+    .endif
+  .endif
+#endif
+	.endm
+
+ at ------------------------------------------------
+@ Use Compiler macro
+@ Usage:
+@	USEC	<compiler specific code>
+ at ------------------------------------------------
+	.macro	USEC	p1, p2, p3, p4
+#ifdef USE_COMPILER
+  .ifnes "\p4", ""
+	\p1 \p2, \p3, \p4
+  .else
+    .ifnes "\p3", ""
+	\p1 \p2, \p3
+    .else
+	\p1 \p2
+    .endif
+  .endif
+#endif
+	.endm
+
 	.macro	Opcode	label
 	ALIGN_OPCODE
 do_\label:
@@ -202,40 +230,308 @@
 	str	\reg, [stack, #(\offset+1) * 4]
 	.endm
 
-	.macro	PUSH4	reg1, reg2, reg3, reg4
+	.macro	PUSH	reg1, reg2, reg3, reg4
+  .ifnes "\reg4", ""
 	stmda	stack!, {\reg1, \reg2, \reg3, \reg4}
+  .else
+    .ifnes "\reg3", ""
+	stmda	stack!, {\reg1, \reg2, \reg3}
+    .else
+      .ifnes "\reg2", ""
+	stmda	stack!, {\reg1, \reg2}
+      .else
+	str	\reg1, [stack], #-4
+      .endif
+    .endif
+  .endif
 	.endm
 
-	.macro	POP4	reg1, reg2, reg3, reg4
+	.macro	POP	reg1, reg2, reg3, reg4
+  .ifnes "\reg4", ""
 	ldmib	stack!, {\reg1, \reg2, \reg3, \reg4}
+  .else
+    .ifnes "\reg3", ""
+	ldmib	stack!, {\reg1, \reg2, \reg3}
+    .else
+      .ifnes "\reg2", ""
+	ldmib	stack!, {\reg1, \reg2}
+      .else
+	ldr	\reg1, [stack, #4]!
+      .endif
+    .endif
+  .endif
 	.endm
 
-	.macro	PUSH3	reg1, reg2, reg3
-	stmda	stack!, {\reg1, \reg2, \reg3}
+	.macro	CACHE_JPC
+	ldr	jpc, [istate, #ISTATE_BCP]
 	.endm
 
-	.macro	POP3	reg1, reg2, reg3
-	ldmib	stack!, {\reg1, \reg2, \reg3}
+	.macro	CACHE_LOCALS
+	ldr	locals, [istate, #ISTATE_LOCALS]
 	.endm
 
-	.macro	PUSH2	reg1, reg2
-	stmda	stack!, {\reg1, \reg2}
+	.macro	CACHE_STACK
+	ldr	stack, [istate, #ISTATE_STACK]
 	.endm
 
-	.macro	PUSH	reg
-	str	\reg, [stack], #-4
+	.macro	CACHE_CP
+	ldr	constpool, [istate, #ISTATE_CONSTANTS]
 	.endm
 
-	.macro	POP2	reg1, reg2
-	ldmib	stack!, {\reg1, \reg2}
+	.macro	DECACHE_STACK
+	str	stack, [istate, #ISTATE_STACK]
+	.endm
+
+	.macro	DECACHE_JPC
+	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 0xCAFEBABF hasn't been overwritten
+	ldr	r1, [istate, #ISTATE_CAFEBABF]
+	mvn	ip, #0x540		@ form 0xCAFEBABF
+	bic	ip, ip, #0x14000
+	bic	ip, ip, #0x35000000
+	cmp	r1, ip
+	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 (CAFEBABF intact)
+	ldr	r1, [istate, #ISTATE_NEXT_FRAME]
+	ldr	r2, [r1, #-ISTATE_NEXT_FRAME + ISTATE_CAFEBABF]
+	bic	r2, r2, #0xff	@ ECN: Allow for differing frames
+	bic	ip, ip, #0xff	@ Eg. ENTRY_FRAME/INTERPRETER_FRAME/SHARK_FRAME
+	cmp	r2, ip
+	ABORTNE
+#endif
+	.endm
+
+	.macro	CHECK_BACKTRACE
+#ifdef DISPATCH_ASSERTS
+	add	r3, istate, #ISTATE_NEXT_FRAME
+	mvn	ip, #0x540		@ form 0xCAFEBABF
+	bic	ip, ip, #0x14000
+	bic	ip, ip, #0x35000000
+@ 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_CAFEBABF]
+	bic	r1, ip, #1
+	cmp	r1, r2
+	beq	2f
+	cmp	ip, r2
+	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_CAFEBABF]
+	bic	r1, ip, #1
+	cmp	r1, r2
+	beq	2f
+	cmp	ip, r2
+	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_CAFEBABF]
+	bic	r1, ip, #1
+	cmp	r1, r2
+	beq	2f
+	cmp	ip, r2
+	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_CAFEBABF]
+	bic	r1, ip, #1
+	cmp	r1, r2
+	beq	2f
+	cmp	ip, r2
+	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_CAFEBABF]
+	bic	r1, ip, #1
+	cmp	r1, r2
+	beq	2f
+	cmp	ip, r2
+	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_CAFEBABF]
+	bic	r1, ip, #1
+	cmp	r1, r2
+	beq	2f
+	cmp	ip, r2
+	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	POP	reg
-	ldr	\reg, [stack, #4]!
+	.macro	BREAK_DISPATCH
+	ldr	r1, [dispatch, #DispatchBreakPoint-XXX]
+	cmp	r1, jpc
+	bleq	do_dispatch_break
 	.endm
 
 	.set	dispatch_state, 0
 
+	.macro	DISPATCH_STATE	state
+	.set	dispatch_state, \state
+	.endm
+
 	.macro	DISPATCH_START	step=0
 	.set	dispatch_state, 1
 	ldrb	r0, [jpc, #\step]!
@@ -246,10 +542,23 @@
 	ldrb	r0, [jpc, \reg]!
 	.endm
 
-	.macro	DISPATCH_STATE	state
-	.set	dispatch_state, \state
+#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
@@ -333,6 +642,7 @@
         ldr     ip, [ip, r1, lsl #2]
         mov     pc, ip
 	.endm
+#endif // DISPATCH_LOOP
 
 #define FFI_TYPE_VOID		0
 #define FFI_TYPE_FLOAT		2
@@ -346,48 +656,38 @@
 #define FFI_TYPE_POINTER	14
 
 	.macro	_BLX	reg
-#ifdef ARMv4
 	mov	lr, pc
 	mov	pc, \reg
-#else
-	blx	\reg
-#endif
 	.endm
-#define blx _BLX
 
 	.macro	_BX	reg
-#ifdef ARMv4
 	mov	pc, \reg
-#else
-	bx	\reg
-#endif
 	.endm
-#define bx _BX
 
 	.macro	_BXEQ	reg
-#ifdef ARMv4
 	moveq	pc, \reg
-#else
-	bxeq	\reg
-#endif
 	.endm
-#define bxeq _BXEQ
 
 	.macro	_BXNE	reg
-#ifdef ARMv4
 	movne	pc, \reg
-#else
-	bxne	\reg
-#endif
 	.endm
-#define bxne _BXNE
 
 #ifdef ARMv4
+
+#define blx _BLX
+#define bx _BX
+#define bxeq _BXEQ
+#define bxne _BXNE
 	.arch armv4
+
 #else
 	.arch armv7-a
 #endif
+#ifdef HW_FP
+	.fpu vfp
+#else
 	.fpu softvfp
+#endif
 	.eabi_attribute 20, 1
 	.eabi_attribute 21, 1
 	.eabi_attribute 23, 3
@@ -399,703 +699,506 @@
 
 	.text
 
-	ALIGN_CODE
-build_normal:
-	ldr	ip, [r1, #24]
-	tst	ip, #32
-	bne	build_normal_synchronized
-build_normal_unsynchronized:
-	stmfd	sp!, {r4, r5, r6, r7, r8}
-	ldr	r4, [r0, #8]
-	ldrh	r8, [r1, #38]
-	ldrh	ip, [r1, #40]
-	mov	r5, #0
-	sub	r3, r4, #4
-	str	r3, [r0, #8]
-	str	r5, [r4, #-4]
-	ldr	r7, [r0, #8]
-	mov	r6, r0
-	sub	r3, r7, #4
-	str	r3, [r0, #8]
-	mvn	r0, #0x540		@ form 0xCAFEBABF in r0
-	bic	r0, r0, #0x14000
-	bic	r0, r0, #0x35000000
-	mov	ip, ip, asl #2
-	sub	ip, ip, #4
-	str	r0, [r7, #-4]
-	ldr	r3, [r6, #8]
-	add	r4, r4, ip
-	sub	r0, r3, #68
-	str	r0, [r6, #8]
-	str	r4, [r0, #8]
-	str	r5, [r0, #44]
-	str	r1, [r0, #16]
-	str	r0, [r0, #64]
-	str	r2, [r3, #-68]
-	ldr	r3, [r1, #8]
-	cmp	r8, r5
-	add	r3, r3, #48
-	str	r3, [r0, #4]
-	ldr	r2, [r1, #12]
-	mov	r3, #0
-	ldr	r1, [r2, #12]
-	str	r5, [r0, #32]
-	str	r5, [r0, #48]
-	str	r1, [r0, #12]
-	str	r5, [r0, #20]
-	str	r3, [r0, #28]
-	ldr	r3, [r6, #8]
-	str	r3, [r0, #60]
-	ldr	r2, [r6, #8]
-	str	r2, [r0, #52]
-	ldr	r3, [r6, #8]
-	sub	r3, r3, #4
-	str	r3, [r0, #24]
-	ldrne	r3, [r6, #8]
-	ldreq	r3, [r6, #8]
-	subne	r3, r3, r8, asl #2
-	strne	r3, [r6, #8]
-	sub	r3, r3, #4
-	str	r3, [r0, #56]
-	mov	r0, r7
-	ldmfd	sp!, {r4, r5, r6, r7, r8}
-	bx	lr
+do_dispatch_break:
+	mov	pc, lr
 
-	ALIGN_CODE
-build_normal_synchronized:
-	stmfd	sp!, {r4, r5, r6, r7, r8, sl}
-	ldr	r6, [r0, #8]
+	.global	sanity_check_backtrace
+sanity_check_backtrace:
+	cmp	r0, #0
+	moveq	pc, lr
+	stmdb	sp!, {r4, r5, r6, r7, r8, r9, r10, r11}
+@ Check top frame
 	mov	r4, r0
-	ldrh	sl, [r1, #38]
-	ldrh	r0, [r1, #40]
-	mov	r5, r1
-	mov	ip, #0
-	sub	r3, r6, #4
-	mvn	r1, #0x540		@ form 0xCAFEBABF in r1
-	bic	r1, r1, #0x14000
-	bic	r1, r1, #0x35000000
-	str	r3, [r4, #8]
-	str	ip, [r6, #-4]
-	ldr	r7, [r4, #8]
-	mov	r0, r0, asl #2
-	sub	r3, r7, #4
-	str	r3, [r4, #8]
-	str	r1, [r7, #-4]
-	ldr	r3, [r4, #8]
-	sub	r8, r0, #4
-	sub	r0, r3, #68
-	str	r0, [r4, #8]
-	str	r5, [r0, #16]
-	str	ip, [r0, #44]
-	str	r0, [r0, #64]
-	str	r2, [r3, #-68]
-	add	r2, r6, r8
-	str	r2, [r0, #8]
-	ldr	r3, [r5, #8]
-	add	r3, r3, #48
-	str	r3, [r0, #4]
-	ldr	r2, [r5, #12]
-	mov	r3, #0
-	ldr	r1, [r2, #12]
-	str	ip, [r0, #32]
-	str	ip, [r0, #48]
-	str	r1, [r0, #12]
-	str	ip, [r0, #20]
-	str	r3, [r0, #28]
-	ldr	r3, [r4, #8]
-	str	r3, [r0, #60]
-	ldr	r2, [r4, #8]
-	sub	ip, r2, #8
-	str	ip, [r4, #8]
-	ldr	r3, [r5, #24]
-	tst	r3, #8
-	ldrne	r3, [r5, #12]
-	ldreq	r1, [r6, r8]
-	ldrne	r2, [r3, #16]
-	ldrne	r1, [r2, #60]
-	cmp	sl, #0
-	str	r1, [ip, #4]
-	ldr	r2, [r4, #8]
-	str	r2, [r0, #52]
-	ldr	r3, [r4, #8]
-	sub	r3, r3, #4
-	str	r3, [r0, #24]
-	ldrne	r3, [r4, #8]
-	ldreq	r3, [r4, #8]
-	subne	r3, r3, sl, asl #2
-	strne	r3, [r4, #8]
-	sub	r3, r3, #4
-	str	r3, [r0, #56]
-	mov	r0, r7
-	ldmfd	sp!, {r4, r5, r6, r7, r8, sl}
-	bx	lr
-
-	ALIGN_CODE
-build_native:
-	ldr	ip, [r1, #24]
-	tst	ip, #32
-	bne	build_native_synchronized
-build_native_unsynchronized:
-	stmfd	sp!, {r4, r5, r6, r7}
-	ldr	r6, [r0, #8]
-	ldrh	r4, [r1, #42]
-	mov	r5, r0
-	mov	r7, #0
-	sub	r3, r6, #4
-	mvn	ip, #0x540		@ form 0xCAFEBABF in ip
+	mvn	ip, #0x540		@ form 0xCAFEBABF
 	bic	ip, ip, #0x14000
 	bic	ip, ip, #0x35000000
-	str	r3, [r0, #8]
-	str	r7, [r6, #-4]
-	ldr	r0, [r0, #8]
-	mov	r4, r4, asl #2
-	sub	r3, r0, #4
-	str	r3, [r5, #8]
-	str	ip, [r0, #-4]
-	ldr	r3, [r5, #8]
-	sub	r4, r4, #4
-	sub	ip, r3, #68
-	add	r6, r6, r4
-	str	ip, [r5, #8]
-	str	r2, [r3, #-68]
-	str	r6, [ip, #8]
-	str	r1, [ip, #16]
-	str	ip, [ip, #64]
-	str	r7, [ip, #44]
-	str	r7, [ip, #4]
-	ldr	r2, [r1, #12]
-	mov	r3, #2
-	ldr	r1, [r2, #12]
-	str	r3, [ip, #28]
-	str	r7, [ip, #32]
-	str	r1, [ip, #12]
-	str	r7, [ip, #48]
-	str	r7, [ip, #20]
-	ldr	r3, [r5, #8]
-	str	r3, [ip, #60]
-	ldr	r2, [r5, #8]
-	str	r2, [ip, #52]
-	ldr	r3, [r5, #8]
-	sub	r3, r3, #4
-	str	r3, [ip, #24]
-	ldr	r2, [r5, #8]
-	sub	r2, r2, #4
-	str	r2, [ip, #56]
-	ldmfd	sp!, {r4, r5, r6, r7}
-	bx	lr
-
-	ALIGN_CODE
-build_native_synchronized:
-	stmfd	sp!, {r4, r5, r6, r7, r8}
-	ldr	r7, [r0, #8]
+	ldr	r2, [r0, #-ISTATE_NEXT_FRAME + ISTATE_CAFEBABF]
+	bic	r3, ip, #1
+	cmp	r2, r3
+	beq	1f
+	cmp	r2, ip
+	ABORTNE
+	ldr	r2, [r0, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS]
+	ldr	r3, [r0, #-ISTATE_NEXT_FRAME + ISTATE_METHOD]
+	ldr	r3, [r3, #12]
+	ldr	r3, [r3, #12]
+	cmp	r2, r3
+	ABORTNE
+	ldr	r0, [r0]
+@ Check 2nd frame
 	mov	r5, r0
-	mov	ip, #0
-	ldrh	r0, [r1, #42]
-	mov	r6, r1
-	sub	r3, r7, #4
-	mvn	r1, #0x540		@ form 0xCAFEBABF in r1
-	bic	r1, r1, #0x14000
-	bic	r1, r1, #0x35000000
-	str	r3, [r5, #8]
-	str	ip, [r7, #-4]
-	ldr	r8, [r5, #8]
-	mov	r0, r0, asl #2
-	sub	r3, r8, #4
-	str	r3, [r5, #8]
-	str	r1, [r8, #-4]
-	ldr	r3, [r5, #8]
-	sub	r0, r0, #4
-	sub	r4, r3, #68
-	str	r4, [r5, #8]
-	str	r6, [r4, #16]
-	str	r4, [r4, #64]
-	str	ip, [r4, #44]
-	str	ip, [r4, #4]
-	str	r2, [r3, #-68]
-	add	r3, r7, r0
-	str	r3, [r4, #8]
-	ldr	r2, [r6, #12]
-	mov	r3, #2
-	ldr	r1, [r2, #12]
-	str	r3, [r4, #28]
-	str	ip, [r4, #32]
-	str	r1, [r4, #12]
-	str	ip, [r4, #48]
-	str	ip, [r4, #20]
-	ldr	r3, [r5, #8]
-	str	r3, [r4, #60]
-	ldr	r2, [r5, #8]
-	sub	r1, r2, #8
-	str	r1, [r5, #8]
-	ldr	r3, [r6, #24]
-	tst	r3, #8
-	ldrne	r3, [r6, #12]
-	ldreq	r0, [r7, r0]
-	ldrne	r2, [r3, #16]
-	ldrne	r0, [r2, #60]
-	str	r0, [r1, #4]
-	ldr	r3, [r5, #8]
-	mov	r0, r8
-	str	r3, [r4, #52]
-	ldr	r2, [r5, #8]
-	sub	r2, r2, #4
-	str	r2, [r4, #24]
-	ldr	r3, [r5, #8]
-	sub	r3, r3, #4
-	str	r3, [r4, #56]
-	ldmfd	sp!, {r4, r5, r6, r7, r8}
-	bx	lr
-
-	ALIGN_CODE
-	.global	asm_generate_method_entry
-asm_generate_method_entry:
-	cmp	r0, #6
-	movcs	r0, #0
-	adrcc	ip, asm_method_table
-	ldrcc	r0, [ip, r0, lsl #2]
-	bx	lr
-asm_method_table:
-	.word	normal_entry
-	.word	normal_entry_synchronized
-	.word	native_entry
-	.word	native_entry_synchronized
-	.word	empty_entry
-	.word	accessor_entry
+	ldr	r2, [r0, #-ISTATE_NEXT_FRAME + ISTATE_CAFEBABF]
+	bic	r3, ip, #1
+	cmp	r2, r3
+	beq	1f
+	cmp	r2, ip
+	ABORTNE
+	ldr	r2, [r0, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS]
+	ldr	r3, [r0, #-ISTATE_NEXT_FRAME + ISTATE_METHOD]
+	ldr	r3, [r3, #12]
+	ldr	r3, [r3, #12]
+	cmp	r2, r3
+	ABORTNE
+	ldr	r0, [r0]
+@ Check 3rd frame
+	mov	r6, r0
+	ldr	r2, [r0, #-ISTATE_NEXT_FRAME + ISTATE_CAFEBABF]
+	bic	r3, ip, #1
+	cmp	r2, r3
+	beq	1f
+	cmp	r2, ip
+	ABORTNE
+	ldr	r2, [r0, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS]
+	ldr	r3, [r0, #-ISTATE_NEXT_FRAME + ISTATE_METHOD]
+	ldr	r3, [r3, #12]
+	ldr	r3, [r3, #12]
+	cmp	r2, r3
+	ABORTNE
+	ldr	r0, [r0]
+@ Check 4th frame
+	mov	r7, r0
+	ldr	r2, [r0, #-ISTATE_NEXT_FRAME + ISTATE_CAFEBABF]
+	bic	r3, ip, #1
+	cmp	r2, r3
+	beq	1f
+	cmp	r2, ip
+	ABORTNE
+	ldr	r2, [r0, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS]
+	ldr	r3, [r0, #-ISTATE_NEXT_FRAME + ISTATE_METHOD]
+	ldr	r3, [r3, #12]
+	ldr	r3, [r3, #12]
+	cmp	r2, r3
+	ABORTNE
+	ldr	r0, [r0]
+@ Check 5th frame
+	mov	r8, r0
+	ldr	r2, [r0, #-ISTATE_NEXT_FRAME + ISTATE_CAFEBABF]
+	bic	r3, ip, #1
+	cmp	r2, r3
+	beq	1f
+	cmp	r2, ip
+	ABORTNE
+	ldr	r2, [r0, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS]
+	ldr	r3, [r0, #-ISTATE_NEXT_FRAME + ISTATE_METHOD]
+	ldr	r3, [r3, #12]
+	ldr	r3, [r3, #12]
+	cmp	r2, r3
+	ABORTNE
+	ldr	r0, [r0]
+@ Check 6th frame
+	mov	r9, r0
+	ldr	r2, [r0, #-ISTATE_NEXT_FRAME + ISTATE_CAFEBABF]
+	bic	r3, ip, #1
+	cmp	r2, r3
+	beq	1f
+	cmp	r2, ip
+	ABORTNE
+	ldr	r2, [r0, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS]
+	ldr	r3, [r0, #-ISTATE_NEXT_FRAME + ISTATE_METHOD]
+	ldr	r3, [r3, #12]
+	ldr	r3, [r3, #12]
+	cmp	r2, r3
+	ABORTNE
+	ldr	r0, [r0]
+@ Check 7th frame
+	mov	r10, r0
+	ldr	r2, [r0, #-ISTATE_NEXT_FRAME + ISTATE_CAFEBABF]
+	bic	r3, ip, #1
+	cmp	r2, r3
+	beq	1f
+	cmp	r2, ip
+	ABORTNE
+	ldr	r2, [r0, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS]
+	ldr	r3, [r0, #-ISTATE_NEXT_FRAME + ISTATE_METHOD]
+	ldr	r3, [r3, #12]
+	ldr	r3, [r3, #12]
+	cmp	r2, r3
+	ABORTNE
+	ldr	r0, [r0]
+@ Check 8th frame
+	mov	r11, r0
+	ldr	r2, [r0, #-ISTATE_NEXT_FRAME + ISTATE_CAFEBABF]
+	bic	r3, ip, #1
+	cmp	r2, r3
+	beq	1f
+	cmp	r2, ip
+	ABORTNE
+	ldr	r2, [r0, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS]
+	ldr	r3, [r0, #-ISTATE_NEXT_FRAME + ISTATE_METHOD]
+	ldr	r3, [r3, #12]
+	ldr	r3, [r3, #12]
+	cmp	r2, r3
+	ABORTNE
+1:
+	ldmia	sp!, {r4, r5, r6, r7, r8, r9, r10, r11}
+	mov	pc, lr
 
-	ALIGN_CODE
-	.global	native_entry_synchronized
-native_entry_synchronized:
-	stmfd	sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
-	mov	r1, r0
-	sub	sp, sp, #60
-	add	r0, r2, #THREAD_JAVA_STACK_BASE
-	mov	r7, r2
-	bl	build_native
-	ldr	r3, [r7, #THREAD_TOP_ZERO_FRAME]
-	add	r1, sp, #52
-	str	r1, [sp, #0]
-	ldr	sl, .L306native_entry_synchronized
-.LPIC19native_entry_synchronized:
-	add	sl, pc, sl
-	str	r3, [r0, #0]
-	ldr	r2, [r7, #THREAD_STACK_SIZE]
-	ldr	r3, [r7, #THREAD_STACK_BASE]
-	sub	r9, r0, #72
-	rsb	r3, r2, r3
-	str	r0, [r7, #THREAD_TOP_ZERO_FRAME]
-	rsb	r3, r3, r1
-	ldr	r2, [r9, #8]
-	cmp	r3, #3072
-	str	r2, [sp, #4]
-	blt	.L294native_entry_synchronized
-	ldr	ip, [r9, #16]
-	ldr	r3, [ip, #24]
-	ands	r0, r3, #32
-	moveq	r8, r0
-	bne	.L295native_entry_synchronized
-.L243native_entry_synchronized:
-	ldr	r4, [ip, #84]
-	cmp	r4, #0
-	beq	.L296native_entry_synchronized
-.L248native_entry_synchronized:
-	ldr	r3, .L306native_entry_synchronized+4
-	ldr	r2, [sl, r3]
-	cmp	r4, r2
-	beq	.L297native_entry_synchronized
-.L249native_entry_synchronized:
-	ldr	r2, [r4, #4]
-	ldr	ip, [ip, #80]
-	ldr	r1, [r7, #THREAD_JAVA_SP]
-	mov	r2, r2, asl #2
-	rsb	r2, r2, #0
-	str	ip, [sp, #8]
-	add	r5, r1, r2
-	str	r5, [r7, #THREAD_JAVA_SP]
-	add	r3, r7, #THREAD_JNI_ENVIRONMENT
-	str	r3, [sp, #52]
-	ldr	r3, [sp, #0]
-	add	lr, r5, #4
-	str	r3, [r1, r2]
-	mov	r3, #0
-	str	r3, [sp, #48]
-	ldr	r2, [r9, #16]
-	ldr	r3, [r2, #24]
-	tst	r3, #8
-	bne	.L298native_entry_synchronized
-.L250native_entry_synchronized:
-	rsb	r3, r5, lr
-	ldr	r2, [r4, #4]
-	mov	ip, r3, asr #2
-	cmp	ip, r2
-	bge	.L299native_entry_synchronized
-	ldr	fp, .L306native_entry_synchronized+8
-	add	r3, ip, #6
-	add	r1, r4, #24
-	mov	r3, r3, asl #2
-	str	r1, [sp, #12]
-	ldr	r6, [sl, fp]
-	add	r1, r4, r3
-	ldr	r0, [sp, #4]
-	b	.L258native_entry_synchronized
-.L257native_entry_synchronized:
-	cmp	r3, #8
-	subeq	r3, r0, #4
-	streq	r3, [lr], #4
-	ldreq	r2, [r4, #4]
-	add	ip, ip, #1
-	subeq	r0, r3, #4
-	cmp	ip, r2
-	add	r1, r1, #4
-	bge	.L252native_entry_synchronized
-.L258native_entry_synchronized:
-	ldr	r3, [r1, #0]
-	cmp	r3, r6
-	beq	.L300native_entry_synchronized
-	ldr	r3, [r3, #0]
-	cmp	r3, #4
-	bne	.L257native_entry_synchronized
-.L293native_entry_synchronized:
-	str	r0, [lr], #4
-.L291native_entry_synchronized:
-	ldr	r2, [r4, #4]
-	add	ip, ip, #1
-	cmp	ip, r2
-	sub	r0, r0, #4
-	add	r1, r1, #4
-	blt	.L258native_entry_synchronized
-.L252native_entry_synchronized:
-	ldr	r0, [r7, #THREAD_TOP_ZERO_FRAME]
-	ldr	r1, [sp, #8]
-	mov	r3, r5
-	str	r0, [r7, #THREAD_LAST_JAVA_SP]
-	mov	r2, #_thread_in_native
+#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
-	str	r2, [r7, #THREAD_STATE]
-	add	r2, sp, #40
-	bl	ffi_call
-	ldr	r2, .L306native_entry_synchronized+12
-	mov	r3, #_thread_in_native_trans
-	str	r3, [r7, #THREAD_STATE]
-	ldr	r3, [sl, r2]
-	ldr	r1, [r3, #0]
-	cmp	r1, #1
-	ble	.L259native_entry_synchronized
-	ldr	r3, .L306native_entry_synchronized+16
-	ldr	r2, [sl, r3]
-	ldrb	r1, [r2, #0]	@ zero_extendqisi2
-	cmp	r1, #0
-	bne	.L301native_entry_synchronized
-	ldr	r3, .L306native_entry_synchronized+20
-	ldr	r2, .L306native_entry_synchronized+24
-	ldr	r0, [sl, r3]
-	ldr	r1, [sl, r2]
-	mov	r2, #1
+	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]
-	ldr	ip, [r1, #0]
-	and	r3, r3, r7, lsr #3
-	str	r2, [ip, r3]
-.L259native_entry_synchronized:
-	ldr	r3, .L306native_entry_synchronized+28
-	ldr	r2, [sl, r3]
-	ldr	r1, [r2, #0]
-	cmp	r1, #0
-	beq	.L302native_entry_synchronized
-.L261native_entry_synchronized:
-	mov	r0, r7
-	bl	_ZN10JavaThread40check_special_condition_for_native_transEPS_
-	.p2align 3
-.L262native_entry_synchronized:
-	mov	r3, #_thread_in_Java
-	mov	r2, #0
-	str	r3, [r7, #THREAD_STATE]
-	str	r2, [r7, #THREAD_LAST_JAVA_SP]
-	ldr	r0, [sp, #12]
-	ldr	r1, [r4, #4]
-	ldr	r2, [sl, fp]
-	ldr	r3, [r0, r1, asl #2]
-	cmp	r3, r2
-	beq	.L303native_entry_synchronized
-.L263native_entry_synchronized:
-	ldr	r2, [r7, #THREAD_ACTIVE_HANDLES]
-	cmp	r8, #0
-	mov	r3, #0
-	str	r3, [r2, #128]
-	beq	.L292native_entry_synchronized
-	ldr	r1, [r7, #THREAD_PENDING_EXC]
-	cmp	r1, #0
-	beq	.L304native_entry_synchronized
-.L241native_entry_synchronized:
-	ldr	r2, [r7, #THREAD_TOP_ZERO_FRAME]
-	cmp	r1, #0
-	add	r1, r2, #4
-	str	r1, [r7, #THREAD_JAVA_SP]
-	ldr	r3, [r2, #0]
-	str	r3, [r7, #THREAD_TOP_ZERO_FRAME]
-	ldr	r2, [r9, #16]
-	ldrh	r3, [r2, #42]
-	mov	r3, r3, asl #2
-	add	r4, r1, r3
-	str	r4, [r7, #THREAD_JAVA_SP]
-	beq	.L305native_entry_synchronized
-.L279native_entry_synchronized:
-	add	sp, sp, #60
-	ldmfd	sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc}
-.L300native_entry_synchronized:
+	mov	r6, r0
+	ldr	r4, [r3, #40]
+	ldr	r0, [r4, #8]
+	ldr	r5, [r4, #4]
 	ldr	r3, [r0, #0]
 	cmp	r3, #0
-	beq	.L293native_entry_synchronized
-	ldr	r3, [r7, #THREAD_JAVA_SP]
-	sub	r2, r3, #4
-	str	r2, [r7, #THREAD_JAVA_SP]
-	str	r0, [r3, #-4]
-	ldr	r2, [r7, #THREAD_JAVA_SP]
-	str	r2, [lr], #4
-	b	.L291native_entry_synchronized
-.L302native_entry_synchronized:
-	ldr	r3, [r7, #THREAD_SUSPEND_FLAGS]
-	cmp	r3, #0
-	beq	.L262native_entry_synchronized
-	mov	r0, r7
-	bl	_ZN10JavaThread40check_special_condition_for_native_transEPS_
-	b	.L262native_entry_synchronized
-.L298native_entry_synchronized:
-	ldr	r1, [r2, #12]
-	add	r3, sp, #56
-	mov	r2, r9
-	ldr	r0, [r1, #16]
-	add	lr, lr, #4
-	ldr	r1, [r0, #60]
-	str	r1, [r2, #48]!
-	str	r2, [r3, #-8]!
-	str	r3, [r5, #4]
-	b	.L250native_entry_synchronized
-.L295native_entry_synchronized:
-	ldr	r8, [r9, #52]
-	ldr	fp, .L306native_entry_synchronized+32
-	ldr	r5, [r8, #4]
+	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
+	mov	r4, r2
+	mov	r7, r0
+	mov	r5, r1
+	bic	r6, r6, #0xf000
+	mov	r8, r2
+1:
 	ldr	r3, [r5, #0]
-	orr	r4, r3, #1
-	str	r4, [r8, #0]
-	.p2align 3
-.L245native_entry_synchronized:
-	ldr	r6, [r5, #0]
 	mov	r0, r4
-	cmp	r4, r6
-	mov	r1, r8
+	mov	r1, r7
 	mov	r2, r5
-	bne	.L244native_entry_synchronized
-	blx	fp
+	cmp	r4, r3
+	bne	2f
+	blx	r6
 	cmp	r0, #0
-	bne	.L245native_entry_synchronized
-.L244native_entry_synchronized:
-	cmp	r4, r6
-	beq	.L290native_entry_synchronized
-	bic	r1, r4, #3
-	ldr	r3, [r7, #0]
-	mov	r0, r7
-	ldr	ip, [r3, #THREAD_VTABLE_IS_LOCK_OWNED]
-	blx	ip
-	subs	r4, r0, #0
-	beq	.L247native_entry_synchronized
-	mov	r3, #0
-	str	r3, [r8, #0]
-	ldr	ip, [r9, #16]
-	b	.L243native_entry_synchronized
-.L304native_entry_synchronized:
-	ldr	r6, [r8, #0]
-	ldr	r5, [r8, #4]
-	cmp	r6, #0
-	str	r1, [r8, #4]
-	ldrne	fp, .L306native_entry_synchronized+32
-	beq	.L292native_entry_synchronized
-	.p2align 3
-.L283native_entry_synchronized:
-	ldr	r4, [r5, #0]
+	bne	1b
 	mov	r0, r8
-	cmp	r8, r4
-	mov	r1, r6
-	mov	r2, r5
-	bne	.L265native_entry_synchronized
-	blx	fp
-	cmp	r0, #0
-	bne	.L283native_entry_synchronized
-.L265native_entry_synchronized:
-	cmp	r8, r4
-	beq	.L292native_entry_synchronized
-	add	r4, sp, #16
+	ldmfd	sp!, {r4, r5, r6, r7, r8, pc}
+2:
+	mov	r8, r3
+	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
-	mov	r1, r7
-	str	r5, [r8, #4]
-	bl	_ZN10HandleMark10initializeEP6Thread
-	ldr	r3, [r7, #THREAD_TOP_ZERO_FRAME]
-	mov	r0, r7
-	mov	r1, r8
-	str	r3, [r7, #THREAD_LAST_JAVA_SP]
-	bl	_ZN18InterpreterRuntime11monitorexitEP10JavaThreadP15BasicObjectLock
-	mov	r3, #0
+	ldmfd	sp!, {r4, r5, r6, pc}
+4:
+	ldr	r3, [r0, #THREAD_SUSPEND_FLAGS]
+	tst	r3, #_thread_deopt_suspend
+	bne	3b
 	mov	r0, r4
-	str	r3, [r7, #THREAD_LAST_JAVA_SP]
-	bl	_ZN10HandleMarkD1Ev
-.L292native_entry_synchronized:
-	ldr	r1, [r7, #4]
-	b	.L241native_entry_synchronized
-.L294native_entry_synchronized:
-	str	r0, [r7, #THREAD_LAST_JAVA_SP]
-	mov	r0, r7
-	bl	_ZN18InterpreterRuntime24throw_StackOverflowErrorEP10JavaThread
-	mov	r3, #0
-	ldr	r1, [r7, #THREAD_PENDING_EXC]
-	str	r3, [r7, #THREAD_LAST_JAVA_SP]
-	b	.L241native_entry_synchronized
-.L247native_entry_synchronized:
-	ldr	r3, [r7, #THREAD_TOP_ZERO_FRAME]
-	mov	r1, r8
-	mov	r0, r7
-	str	r3, [r7, #THREAD_LAST_JAVA_SP]
-	bl	_ZN18InterpreterRuntime12monitorenterEP10JavaThreadP15BasicObjectLock
-	ldr	r1, [r7, #THREAD_PENDING_EXC]
-	str	r4, [r7, #THREAD_LAST_JAVA_SP]
-	cmp	r1, #0
-	bne	.L241native_entry_synchronized
-	.p2align 3
-.L290native_entry_synchronized:
-	ldr	ip, [r9, #16]
-	b	.L243native_entry_synchronized
-.L301native_entry_synchronized:
-	ldr	r3, .L306native_entry_synchronized+28
-	ldr	r2, [sl, r3]
-	ldr	r1, [r2, #0]
-	cmp	r1, #0
-	bne	.L261native_entry_synchronized
-	b	.L302native_entry_synchronized
-.L303native_entry_synchronized:
-	ldr	r3, [sp, #40]
-	cmp	r3, #0
-	streq	r3, [r9, #48]
-	ldrne	r3, [r3, #0]
-	strne	r3, [r9, #48]
-	b	.L263native_entry_synchronized
-.L305native_entry_synchronized:
-	ldr	r0, [r9, #16]
-	bl	_ZNK13methodOopDesc11result_typeEv
-	ldr	r2, .L306native_entry_synchronized+36
-	ldr	r1, [sl, r2]
-	ldr	r3, [r1, r0, asl #2]
-	sub	r3, r4, r3, asl #2
-	str	r3, [r7, #THREAD_JAVA_SP]
-	ldr	r0, [r9, #16]
-	bl	_ZNK13methodOopDesc11result_typeEv
-	sub	r0, r0, #4
-	cmp	r0, #9
-	addls	pc, pc, r0, asl #2
-	b	.L279native_entry_synchronized
-.L278native_entry_synchronized:
-	b	.L269native_entry_synchronized
-	b	.L270native_entry_synchronized
-	b	.L271native_entry_synchronized
-	b	.L272native_entry_synchronized
-	b	.L273native_entry_synchronized
-	b	.L274native_entry_synchronized
-	b	.L275native_entry_synchronized
-	b	.L276native_entry_synchronized
-	b	.L277native_entry_synchronized
-	b	.L277native_entry_synchronized
-.L299native_entry_synchronized:
-	add	r0, r4, #24
-	ldr	fp, .L306native_entry_synchronized+8
-	str	r0, [sp, #12]
-	b	.L252native_entry_synchronized
-.L277native_entry_synchronized:
-	ldr	r3, [r9, #48]
-	ldr	r0, [sp, #4]
-	str	r3, [r0, #0]
-	b	.L279native_entry_synchronized
-.L276native_entry_synchronized:
-	add	r3, sp, #40
-	ldmia	r3, {r3-r4}
-	ldr	r0, [sp, #4]
-	stmda	r0, {r3-r4}
-	b	.L279native_entry_synchronized
-.L275native_entry_synchronized:
-	ldr	r3, [sp, #40]
-	ldr	r2, [sp, #4]
-	str	r3, [r2, #0]
-	b	.L279native_entry_synchronized
-.L274native_entry_synchronized:
-	ldrsh	r3, [sp, #40]
-	ldr	r1, [sp, #4]
-	str	r3, [r1, #0]
-	b	.L279native_entry_synchronized
-.L273native_entry_synchronized:
-	ldrsb	r3, [sp, #40]
-	ldr	r0, [sp, #4]
-	str	r3, [r0, #0]
-	b	.L279native_entry_synchronized
-.L272native_entry_synchronized:
-	add	r3, sp, #40
-	ldmia	r3, {r3-r4}
-	ldr	r2, [sp, #4]
-	stmda	r2, {r3-r4}
-	b	.L279native_entry_synchronized
-.L271native_entry_synchronized:
-	ldr	r3, [sp, #40]	@ float
-	ldr	r1, [sp, #4]
-	str	r3, [r1, #0]	@ float
-	b	.L279native_entry_synchronized
-.L270native_entry_synchronized:
-	ldrh	r3, [sp, #40]
-	ldr	r2, [sp, #4]
-	str	r3, [r2, #0]
-	b	.L279native_entry_synchronized
-.L269native_entry_synchronized:
-	ldr	r1, [sp, #4]
-	ldrb	r3, [sp, #40]	@ zero_extendqisi2
-	subs	r3, r3, #0
-	movne	r3, #1
-	str	r3, [r1, #0]
-	b	.L279native_entry_synchronized
-.L296native_entry_synchronized:
-	ldr	r3, [r7, #THREAD_TOP_ZERO_FRAME]
-	mov	r0, r7
-	str	r3, [r7, #THREAD_LAST_JAVA_SP]
-	ldr	r1, [r9, #16]
-	bl	_ZN18InterpreterRuntime19prepare_native_callEP10JavaThreadP13methodOopDesc
-	ldr	r1, [r7, #THREAD_PENDING_EXC]
-	str	r4, [r7, #THREAD_LAST_JAVA_SP]
-	cmp	r1, #0
-	bne	.L241native_entry_synchronized
-	ldr	ip, [r9, #16]
-	ldr	r4, [ip, #84]
-	b	.L248native_entry_synchronized
-.L297native_entry_synchronized:
-	ldr	r3, [r7, #THREAD_TOP_ZERO_FRAME]
-	mov	r2, #0
-	mov	r0, r7
-	str	r3, [r7, #THREAD_LAST_JAVA_SP]
-	mov	r3, r2
-	ldr	r1, [r9, #16]
-	bl	_ZN18InterpreterRuntime22slow_signature_handlerEP10JavaThreadP13methodOopDescPiS4_
-	ldr	r1, [r7, #THREAD_PENDING_EXC]
-	mov	r3, #0
-	cmp	r1, #0
-	str	r3, [r7, #THREAD_LAST_JAVA_SP]
-	mov	r4, r0
-	bne	.L241native_entry_synchronized
-	ldr	ip, [r9, #16]
-	b	.L249native_entry_synchronized
-.L307native_entry_synchronized:
-	ALIGN_DATA
-.L306native_entry_synchronized:
-	.word	_GLOBAL_OFFSET_TABLE_-(.LPIC19native_entry_synchronized+8)
-	.word	_ZN18InterpreterRuntime22slow_signature_handlerEP10JavaThreadP13methodOopDescPiS4_(GOT)
-	.word	ffi_type_pointer(GOT)
+	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)
-	.word	-61504
-	.word	type2size(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]
+	stmfd	arm_sp!, {r4, r5, r6, r7, r8}
+	ands	r7, r0, #JVM_ACC_SYNCHRONIZED
+	movne	r7, #2
+	tst	r0, #JVM_ACC_NATIVE
+	mov	r4, #0
+	movne	r5, #0
+	ldreqh	r6, [r1, #METHOD_MAXLOCALS]
+	ldrneh	r6, [r1, #METHOD_SIZEOFPARAMETERS]
+	ldreq	r0, [r3, #8]
+	subeq	r6, r6, #1
+	ldrne	r0, [r3, #8]
+	subne	r6, r6, #1
+	ldreqh	r5, [r1, #METHOD_MAXSTACK]
+	addeq	r6, r0, r6, asl #2
+	addne	r6, r0, r6, asl #2
+	sub	ip, r0, #4
+	str	ip, [r3, #8]
+	mvn	ip, #0x540		@ form 0xCAFEBABF
+	bic	ip, ip, #0x14000
+	bic	ip, ip, #0x35000000
+	str	r4, [r0, #-4]
+	ldr	r0, [r3, #8]
+	sub	r8, r0, #4
+	str	r8, [r3, #8]
+	str	ip, [r0, #-4]
+	ldr	r8, [r3, #8]
+	sub	ip, r8, #68
+	str	ip, [r3, #8]
+	str	r2, [r8, #-68]
+	mov	r8, #0
+	str	r4, [ip, #44]
+	str	r6, [ip, #8]
+	str	r1, [ip, #16]
+	str	ip, [ip, #64]
+	ldr	r2, [r1, #METHOD_ACCESSFLAGS]
+	tst	r2, #JVM_ACC_NATIVE
+	mov	r2, #0
+	ldreq	r4, [r1, #METHOD_CONSTMETHOD]
+	addeq	r4, r4, #CONSTMETHOD_CODEOFFSET
+	str	r4, [ip, #4]
+	ldr	r4, [r1, #METHOD_CONSTANTS]
+	ldr	r4, [r4, #CONSTANTPOOL_CACHE]
+	str	r8, [ip, #28]
+	str	r2, [ip, #32]
+	str	r4, [ip, #12]
+	str	r2, [ip, #48]
+	str	r2, [ip, #20]
+	ldr	r2, [r3, #8]
+	str	r2, [ip, #60]
+	ldr	r2, [r1, #METHOD_ACCESSFLAGS]
+	tst	r2, #JVM_ACC_SYNCHRONIZED
+	beq	.L10
+	ldr	r2, [r3, #8]
+	sub	r7, r2, r7, asl #2
+	str	r7, [r3, #8]
+	ldr	r2, [r1, #METHOD_ACCESSFLAGS]
+	tst	r2, #JVM_ACC_STATIC
+	ldrne	r2, [r1, #METHOD_CONSTANTS]
+	ldreq	r2, [r6, #0]
+	ldrne	r2, [r2, #16]
+	ldrne	r2, [r2, #60]
+	str	r2, [r7, #4]
+.L10:
+	ldr	r2, [r3, #8]
+	cmp	r5, #0
+	str	r2, [ip, #52]
+	ldr	r2, [r3, #8]
+	sub	r2, r2, #4
+	str	r2, [ip, #24]
+	ldrne	r2, [r3, #8]
+	ldreq	r5, [r3, #8]
+	subne	r5, r2, r5, asl #2
+	strne	r5, [r3, #8]
+	sub	r5, r5, #4
+	str	r5, [ip, #56]
+	ldmfd	arm_sp!, {r4, r5, r6, r7, r8}
+	bx	lr
+
+	ALIGN_CODE
+	.global	asm_generate_method_entry
+asm_generate_method_entry:
+	mov	r3, r0
+	mov	r0, #0
+
+	adrl	ip, dispatch_init_adcon
+	ldm	ip, {r1, r2}
+	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
+	bne	1f
+
+	ldr	r2, [r1, #PrintCommandLineFlags_Address-XXX]
+	ldrb	r2, [r2]
+	cmp	r2, #0
+	bne	1f
+
+	cmp	r3, #6
+	adrcc	ip, asm_method_table
+	ldrcc	r0, [ip, r3, lsl #2]
+1:
+	bx	lr
+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	empty_entry
+	.word	accessor_entry
 
 	ALIGN_CODE
 	.global	empty_entry
@@ -1133,138 +1236,140 @@
 	ldr	r1, [r0, #15*4]
 	adr	ip, abort_table
 abort_loop:
-	ldr	r2, [ip], #4
+	ldr	r2, [ip], #8
 	cmp	r2, #0
 	moveq	r0, #0
 	bxeq	lr
 	cmp	r2, r1
 	bne	abort_loop
 
-	adr	r3, abort_table+4
-	sub	r3, ip, r3
-
-	adr	ip, jpc_correction_table
-	ldrb	r3, [ip, r3, lsr #2]
+	ldr	r3, [ip, #-4]
+	cmp	r3, #8
+	bcs	1f
 
 	ldr	ip, [r0, #5*4]
 	sub	ip, ip, r3
 	str	ip, [r0, #5*4]
 
 	adrl	r3, null_ptr_exception
+1:
 	str	r3, [r0, #15*4]
 do_setcontext:
 	mov	r0, #1
 	bx	lr
 abort_table:
-	.word	.abortentry5
-	.word	.abortentry6
-	.word	.abortentry7
-	.word	.abortentry8
-	.word	.abortentry9
-	.word	.abortentry10
-	.word	.abortentry11
-	.word	.abortentry12
-	.word	.abortentry13
-
-	.word	.abortentry19
-	.word	.abortentry20
-	.word	.abortentry21
-	.word	.abortentry22
-	.word	.abortentry23
-	.word	.abortentry24
-	.word	.abortentry25
-	.word	.abortentry26
-	.word	.abortentry27
-	.word	.abortentry28
-	.word	.abortentry29
-	.word	.abortentry30
-	.word	.abortentry31
-	.word	.abortentry32
-
-	.word	.abortentry38
-	.word	.abortentry39
-	.word	.abortentry40
-	.word	.abortentry41
-	.word	.abortentry42
-	.word	.abortentry42_1
-	.word	.abortentry43
-	.word	.abortentry44
-	.word	.abortentry45
-	.word	.abortentry46
-	.word	.abortentry47
-	.word	.abortentry48
-	.word	.abortentry49
-	.word	.abortentry50
-	.word	.abortentry51
-	.word	.abortentry52
-
-	.word	.abortentry58
-	.word	.abortentry59
-	.word	.abortentry60
-
-	.word	.abortentry61
-	.word	.abortentry62
-	.word	.abortentry63
-	.word	.abortentry64
-	.word	.abortentry65
-	.word	.abortentry66
-	.word	.abortentry67
-	.word	.abortentry68
-	.word	.abortentry69
-	.word	.abortentry70
-	.word	.abortentry71
-	.word	.abortentry72
-
-	.word	.abortentry73
-	.word	.abortentry74
-	.word	.abortentry75
-	.word	.abortentry76
-	.word	.abortentry77
-
-	.word	.abortentry78
-	.word	.abortentry79
-	.word	.abortentry80
-	.word	.abortentry81
-	.word	.abortentry82
-	.word	.abortentry83
-	.word	.abortentry84
-	.word	.abortentry85
-	.word	.abortentry86
-	.word	.abortentry87
-
-	.word	.abortentry88
-	.word	.abortentry89
-	.word	.abortentry90
-	.word	.abortentry91
-	.word	.abortentry92
-	.word	.abortentry93
-	.word	.abortentry94
-	.word	.abortentry95
-	.word	.abortentry96
-	.word	.abortentry97
-	.word	.abortentry98
-	.word	.abortentry99
-	.word	.abortentry100
-	.word	.abortentry101
-	.word	.abortentry102
-	.word	.abortentry103
-	.word	.abortentry104
-	.word	.abortentry105
-	.word	.abortentry106
-	.word	.abortentry107
-	.word	.abortentry108
-	.word	.abortentry109
+			.word	.abortentry5, 1
+			.word	.abortentry6, 1
+			.word	.abortentry7, 1
+			.word	.abortentry8, 1
+			.word	.abortentry9, 1
+			.word	.abortentry10, 1
+			.word	.abortentry11, 1
+			.word	.abortentry12, 1
+			.word	.abortentry13, 1
+
+		FBC	.word	.abortentry19, 1
+		FBC	.word	.abortentry20, 1
+		FBC	.word	.abortentry21, 1
+		FBC	.word	.abortentry22, 1
+		FBC	.word	.abortentry23, 1
+		FBC	.word	.abortentry24, 1
+		FBC	.word	.abortentry25, 1
+		FBC	.word	.abortentry26, 1
+		FBC	.word	.abortentry27, 1
+		FBC	.word	.abortentry28, 1
+		FBC	.word	.abortentry29, 1
+		FBC	.word	.abortentry30, 1
+		FBC	.word	.abortentry31, 1
+		FBC	.word	.abortentry32, 1
+
+		FBC	.word	.abortentry38, 2
+		FBC	.word	.abortentry39, 3
+		FBC	.word	.abortentry40, 4
+		FBC	.word	.abortentry41, 3
+		FBC	.word	.abortentry42, 2
+		FBC	.word	.abortentry42_1, 2
+		FBC	.word	.abortentry43, 0
+		FBC	.word	.abortentry44, 1
+		FBC	.word	.abortentry45, 3
+		FBC	.word	.abortentry46, 2
+		FBC	.word	.abortentry47, 0
+		FBC	.word	.abortentry48, 1
+		FBC	.word	.abortentry49, 0
+		FBC	.word	.abortentry50, 1
+		FBC	.word	.abortentry51, 0
+		FBC	.word	.abortentry52, 1
+
+		FBC	.word	.abortentry58, 2
+		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
+		FBC	.word	.abortentry76, 1
+		FBC	.word	.abortentry77, 1
+
+	    FBC		.word	.abortentry78, 3
+	    FBC		.word	.abortentry79, 3
+	    FBC		.word	.abortentry80, 3
+	    FBC		.word	.abortentry81, 3
+	    FBC		.word	.abortentry82, 3
+	    FBC		.word	.abortentry83, 3
+	    FBC		.word	.abortentry84, 3
+	    FBC		.word	.abortentry85, 3
+	    FBC		.word	.abortentry86, 3
+	    FBC		.word	.abortentry87, 3
+
+	    FBC    	.word	.abortentry88, 3
+	    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
+		FBC	.word	.abortentry107, 1
+		FBC	.word	.abortentry108, 1
+		FBC	.word	.abortentry109, 1
+			.word	.abortentry110, 0
+
+		FBC	.word	.abortentry111, 3
+		FBC	.word	.abortentry112, 3
+
+		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
-jpc_correction_table:
-	.byte	1, 1, 1, 1, 1, 1, 1, 1, 1
-	.byte	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
-	.byte	2, 3, 4, 3, 2, 2, 0, 1, 3, 2, 0, 1, 0, 1, 0, 1
-	.byte	2, 2, 2
-	.byte	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-	.byte	1, 1, 1, 1, 1
-	.byte	3, 3, 3, 3, 3, 3, 3, 3, 3, 3
-	.byte	3, 5, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 1, 1, 1, 1, 1
-	ALIGN_WORD
 
 #else
 	.global	asm_check_null_ptr
@@ -1274,44 +1379,58 @@
 
 #endif
 
+#ifdef NATIVE_ENTRY
 	ALIGN_CODE
 fast_native_entry:
-	ldr	r2, [istate, #ISTATE_THREAD]
+	mov	r2, tmp1
 	mov	r11, tmp2
-	ldrh	r1, [r11, #42]
+fast_native_entry_with_args:
+	ldrh	r1, [r11, #METHOD_SIZEOFPARAMETERS]
 	ldr	r4, [r2, #THREAD_JAVA_SP]
-	ldr	ip, [r2, #THREAD_TOP_ZERO_FRAME]
+	ldr	r3, [r2, #THREAD_TOP_ZERO_FRAME]
 	mov	r0, #0
-	mvn	r10, #0x540		@ form 0xCAFEBABF in r10
-	bic	r10, r10, #0x14000
-	bic	r10, r10, #0x35000000
-	sub	r9, r4, #76
-	mov	r7, r9
+	mvn	ip, #0x540		@ form 0xCAFEBABF in ip
+	sub	r9, r4, #FRAME_SIZE
+	bic	ip, ip, #0x14000
 	str	r9, [r2, #THREAD_JAVA_SP]	@ drop stack
 	sub	r5, r9, #4		@ stack limit = r9 - 4
-	mov	r3, r9
-	stmdb	r4, {r0, r3, r5, r7, r9, r10, ip}
-	str	r0, [r9, #ISTATE_CALLEE]
-	str	r0, [r9, #ISTATE_PREV_LINK]
+	bic	ip, ip, #0x35000000
+	str	r3, [r9, #ISTATE_NEXT_FRAME]
+	str	ip, [r9, #ISTATE_CAFEBABF]
+	str	r9, [r9, #ISTATE_MONITOR_BASE]
+	str	r5, [r9, #ISTATE_STACK_LIMIT]
+	str	r9, [r9, #ISTATE_STACK_BASE]
+	str	r0, [r9, #ISTATE_OOP_TEMP]
+
+@	str	r0, [r9, #ISTATE_CALLEE]
+@	str	r0, [r9, #ISTATE_PREV_LINK]
 	str	r0, [r9, #ISTATE_MSG]
-	str	r0, [r9, #ISTATE_MDX]
+@	str	r0, [r9, #ISTATE_MDX]
+
+	ldr	r10, [r11, #METHOD_CONSTANTS]
 	sub	r7, r4, #4
-	add	r7, r7, r1, lsl #2
 	mov	r5, #0
-	ldr	r10, [r11, #12]
-	ldr	r10, [r10, #12]
-	stmia	r9, {r2, r5, r7, r10, r11}
+	add	r7, r7, r1, lsl #2
+
+	ldr	r10, [r10, #CONSTANTPOOL_CACHE]
+
+	str	r2, [r9, #ISTATE_THREAD]
+	str	r5, [r9, #ISTATE_BCP]
+	str	r7, [r9, #ISTATE_LOCALS]
+	str	r10, [r9, #ISTATE_CONSTANTS]
+	str	r11, [r9, #ISTATE_METHOD]
+
+@	stmia	r9, {r2, r5, r7, r10, r11}
+	ldr	r1, [r2, #THREAD_STACK_SIZE]
+	ldr	r3, [r2, #THREAD_STACK_BASE]
 	add	r0, r9, #72
 	mov	r9, r2
-.LPIC18_fast_native_entry:
-	ldr	r2, [r9, #THREAD_STACK_SIZE]
-	ldr	r3, [r9, #THREAD_STACK_BASE]
-	rsb	r3, r2, r3
-	rsb	r3, r3, sp
+	rsb	r3, r1, r3
+	rsb	r3, r3, arm_sp
 	cmp	r3, #4096
 	str	r0, [r9, #THREAD_TOP_ZERO_FRAME]
+	ldr	r5, [r11, #METHOD_SIGNATUREHANDLER]
 	blt	.fast_native_entry_throw_stack_overflow
-	ldr	r5, [r11, #84]
 	cmp	r5, #0
 	bne	.fast_native_entry_got_handleraddr
 	str	r0, [r9, #THREAD_LAST_JAVA_SP]
@@ -1324,7 +1443,7 @@
 	ldr	r11, [r11, #-72 + ISTATE_METHOD]
 	cmp	r1, #0
 	bne	.fast_native_entry_exception
-	ldr	r5, [r11, #84]
+	ldr	r5, [r11, #METHOD_SIGNATUREHANDLER]
 .fast_native_entry_got_handleraddr:
 	ldr	r2, [dispatch, #InterpreterRuntime_slow_signature_handler_Address-XXX]
 	cmp	r5, r2
@@ -1347,34 +1466,35 @@
 .fast_native_entry_get_handler:
 
 	sub	ip, r7, r4
-	mov	ip, ip, asr #2
-	add	lr, ip, #4
-	bic	lr, lr, #1
-
 	add	r3, r4, #ISTATE_OOP_TEMP-76
 
+	mov	ip, ip, asr #2
 	mov	r4, arm_sp
+
+	add	lr, ip, #4
 	sub	arm_sp, arm_sp, #16
-	sub	arm_sp, arm_sp, lr, lsl #2
-	mov	lr, arm_sp
 
+	bic	lr, lr, #1
 	add	r1, r5, #24
 
+	sub	arm_sp, arm_sp, lr, lsl #2
 	add	r2, r9, #THREAD_JNI_ENVIRONMENT
+
+	mov	lr, arm_sp
 	str	r2, [lr], #4
-	add	r1, r1, #4
 
-	ldr	r2, [r11, #24]
-	tst	r2, #8
+	ldr	r2, [r11, #METHOD_ACCESSFLAGS]
+	add	r1, r1, #4
+	tst	r2, #JVM_ACC_STATIC
 	beq	.do_fast_copy_args
 
-	ldr	r2, [r11, #12]
+	ldr	r2, [r11, #METHOD_CONSTANTS]
 	ldr	r2, [r2, #16]
+	str	r3, [lr], #4
 	ldr	r2, [r2, #60]
+	add	r1, r1, #4
 	str	r2, [r3]
 
-	str	r3, [lr], #4
-	add	r1, r1, #4
 
 .do_fast_copy_args:
 	cmp	ip, #0
@@ -1383,6 +1503,7 @@
 .fast_copy_args:
 	ldr	r0, [r1], #4
 	ldrh	r3, [r0, #6]
+	ldr	r2, [r7], #-4
 	cmp	r3, #FFI_TYPE_DOUBLE
 	cmpne	r3, #FFI_TYPE_SINT64
 	beq	.fast_copy_long
@@ -1390,47 +1511,64 @@
 	cmp	r3, #FFI_TYPE_POINTER
 	beq	.fast_copy_ptr
 
-	ldr	r2, [r7], #-4
-	str	r2, [lr], #4
 	subs	ip, ip, #1
+	str	r2, [lr], #4
 	bge	.fast_copy_args
 	b	.fast_no_args
 
 .fast_copy_long:
 	tst	lr, #4
+	ldr	r3, [r7], #-4
 	addne	lr, lr, #4
-	ldmda	r7!, {r2, r3}
-	stmia	lr!, {r2, r3}
+	str	r2, [lr, #4]
 	subs	ip, ip, #2
+	str	r3, [lr], #8
 	bge	.fast_copy_args
 	b	.fast_no_args
 
 .fast_copy_ptr:
-	ldr	r2, [r7], #-4
 	cmp	r2, #0
 	addne	r2, r7, #4
-	str	r2, [lr], #4
 	subs	ip, ip, #1
+	str	r2, [lr], #4
 	bge	.fast_copy_args
 
 .fast_no_args:
 	ldr	r0, [r9, #THREAD_TOP_ZERO_FRAME]
-	str	r0, [r9, #THREAD_LAST_JAVA_SP]
-
 	mov	r2, #_thread_in_native
+
+	str	r0, [r9, #THREAD_LAST_JAVA_SP]
 	str	r2, [r9, #THREAD_STATE]
 
-	ldr	ip, [r11, #80]
-	ldrh	r11, [r11, #42]
+	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
 
+	mov	ip, #_thread_in_native_trans
 	mov	arm_sp, r4
 
-	mov	r3, #_thread_in_native_trans
-	str	r3, [r9, #THREAD_STATE]
-
 	ldr	r3, [dispatch, #SafePointSynchronize_state_Address-XXX]
+	str	ip, [r9, #THREAD_STATE]
 
 	ldr	r3, [r3, #0]
 	cmp	r3, #0
@@ -1441,6 +1579,7 @@
 .fast_native_entry_do_return:
 	mov	r3, #_thread_in_Java
 	mov	r2, #0
+
 	str	r3, [r9, #THREAD_STATE]
 	str	r2, [r9, #THREAD_LAST_JAVA_SP]
 
@@ -1448,113 +1587,99 @@
 	ldr	r3, [r5, #4]
 
 	ldr	r5, [r9, #THREAD_TOP_ZERO_FRAME]
-@	ldr	r11, [r5, #-72 + ISTATE_METHOD]
 
 	ldr	lr, [r5], #4
 
 	add	r5, r5, r11, lsl #2
 
 	ldr	ip, [r2, r3, asl #2]
-	ldrh	r2, [ip, #6]
-
-	cmp	r2, #FFI_TYPE_POINTER
-	beq	.fast_native_return_obj
-
-	str	lr, [r9, #THREAD_TOP_ZERO_FRAME]		@ Defer dropping frame until after we have dealt with
-					@ objects
+	adr	r3, .return_type_table
 
+	ldrh	r2, [ip, #6]
 	ldr	ip, [r9, #THREAD_ACTIVE_HANDLES]
-	mov	r3, #0			@ ECN: OK, not an obj, save to clear handles
-	str	r3, [ip, #128]
 
-	cmp	r2, #FFI_TYPE_VOID
-	beq	.fast_native_return_void
-	cmp	r2, #FFI_TYPE_FLOAT
-	cmpne	r2, #FFI_TYPE_SINT32
-	beq	.fast_native_return_w
-	cmp	r2, #FFI_TYPE_DOUBLE
-	cmpne	r2, #FFI_TYPE_SINT64
-	beq	.fast_native_return_dw
-
-	cmp	r2, #FFI_TYPE_UINT16
-	beq	.fast_native_return_char
-	cmp	r2, #FFI_TYPE_SINT16
-	beq	.fast_native_return_short
-	cmp	r2, #FFI_TYPE_BOOL
-	beq	.fast_native_return_bool
-	cmp	r2, #FFI_TYPE_SINT8
-	beq	.fast_native_return_byte
+	mov	tmp1, #0
+	ldr	pc, [r3, r2, lsl #2]
 
-	str	r0, [r0, -r0]
+.return_type_table:
+	.word	.fast_native_return_void	@ FFI_TYPE_VOID	== 0
+	.word	0
+	.word	.fast_native_return_w		@ FFI_TYPE_FLOAT == 2
+	.word	.fast_native_return_dw		@ FFI_TYPE_DOUBLE == 3
+	.word	0
+	.word	.fast_native_return_bool	@ FFI_TYPE_BOOL == 5
+	.word	.fast_native_return_byte	@ FFI_TYPE_SINT8 == 6
+	.word	.fast_native_return_char	@ FFI_TYPE_UINT16 == 7
+	.word	.fast_native_return_short	@ FFI_TYPE_SINT16 == 8
+	.word	0
+	.word	.fast_native_return_w		@ FFI_TYPE_SINT32 == 10
+	.word	0
+	.word	.fast_native_return_dw		@ FFI_TYPE_SINT64 == 12
+	.word	0
+	.word	.fast_native_return_obj		@ FFI_TYPE_POINTER == 14
 
 .fast_native_return_dw:
-	stmdb	r5!, {r0, r1}
+	str	r0, [r5, #-8]!
+	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]
-	b	.fast_native_exit
+	bne	.fast_native_return
+	ldmfd	arm_sp!, {r3, r4, r5, r6, r7, r8, r9, r10, r11, 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]
-	b	.fast_native_exit
+	bne	.fast_native_return
+	ldmfd	arm_sp!, {r3, r4, r5, r6, r7, r8, r9, r10, r11, 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]
-	b	.fast_native_exit
+	bne	.fast_native_return
+	ldmfd	arm_sp!, {r3, r4, r5, r6, r7, r8, r9, r10, r11, 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]
-	b	.fast_native_exit
-
-.fast_native_entry_throw_stack_overflow:
-	str	r0, [r9, #THREAD_LAST_JAVA_SP]
-	mov	r0, r9
-	bl	_ZN18InterpreterRuntime24throw_StackOverflowErrorEP10JavaThread
-	mov	r3, #0
-	ldr	r1, [r9, #THREAD_PENDING_EXC]
-	str	r3, [r9, #THREAD_LAST_JAVA_SP]
-.fast_native_entry_exception:
-	ldr	r5, [r9, #THREAD_TOP_ZERO_FRAME]
-	ldr	r3, [r5], #4
-	str	r3, [r9, #THREAD_TOP_ZERO_FRAME]
-
-	ldrh	r3, [r11, #42]
-	add	r5, r5, r3, lsl #2
-	str	r5, [r9, #THREAD_JAVA_SP]
-	b	.fast_native_exit
-
-.fast_native_entry_do_special:
-	stmdb	sp!, {r0, r1}
-	mov	r0, r9
-	bl	_ZN10JavaThread40check_special_condition_for_native_transEPS_
-	ldmia	sp!, {r0, r1}
-	b	.fast_native_entry_do_return
-
+	bne	.fast_native_return
+	ldmfd	arm_sp!, {r3, r4, r5, r6, r7, r8, r9, r10, r11, pc}
 .fast_native_return_obj:
 	cmp	r0, #0
 	ldrne	r0, [r0]
 	str	r0, [r5, #-4]!
-
-	str	lr, [r9, #THREAD_TOP_ZERO_FRAME]		@ Defer dropping frame until after we have dealt with
-					@ objects
-
+	str	lr, [r9, #THREAD_TOP_ZERO_FRAME]
+	str	tmp1, [ip, #JNIHANDLEBLOCK_TOP]
+	cmp	istate, #0
 	str	r5, [r9, #THREAD_JAVA_SP]
-	ldr	r2, [r9, #THREAD_ACTIVE_HANDLES]
-	mov	r3, #0			@ ECN: Now that the object is safe on the Java stack
-	str	r3, [r2, #128]		@ stack, with the Thread SP updated, clear the active_handles.
-	b	.fast_native_exit
+	bne	.fast_native_return
+	ldmfd	arm_sp!, {r3, r4, r5, r6, r7, r8, r9, r10, r11, pc}
 .fast_native_return_short:
 	mov	r0, r0, lsl #16
 	mov	r0, r0, asr #16
 .fast_native_return_w:
 	str	r0, [r5, #-4]!
 .fast_native_return_void:
-	str	r5, [r9, #THREAD_JAVA_SP]
+	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]
@@ -1564,460 +1689,1239 @@
 	str	r2, [r9, #THREAD_JAVA_SP]
 	str	r1, [r9, #THREAD_LAST_JAVA_SP]
 	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
-	ldr	jpc, [istate, #ISTATE_BCP]
+	CACHE_STACK
+	CACHE_JPC
 	ldr	r3, [r0, #THREAD_PENDING_EXC]
 	DISPATCH_START	3
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	ldr	locals, [istate, #ISTATE_LOCALS]
 	DISPATCH_NEXT
-	add	constpool, constpool, #CONST_POOL_OFFSET
+	CACHE_CP
 	DISPATCH_NEXT
 	cmp	r3, #0
 	DISPATCH_NEXT
-	bne	invokespecial_exception_fix
+	bne	invokenative_exception
+	DISPATCH_NEXT
+	CACHE_LOCALS
 	DISPATCH_FINISH
 
+.fast_native_entry_throw_stack_overflow:
+	str	r0, [r9, #THREAD_LAST_JAVA_SP]
+	mov	r0, r9
+	bl	_ZN18InterpreterRuntime24throw_StackOverflowErrorEP10JavaThread
+	mov	r3, #0
+	ldr	r1, [r9, #THREAD_PENDING_EXC]
+	str	r3, [r9, #THREAD_LAST_JAVA_SP]
+.fast_native_entry_exception:
+	ldr	r5, [r9, #THREAD_TOP_ZERO_FRAME]
+	ldr	r3, [r5], #4
+	str	r3, [r9, #THREAD_TOP_ZERO_FRAME]
+
+	ldrh	r3, [r11, #METHOD_SIZEOFPARAMETERS]
+	add	r5, r5, r3, lsl #2
+	b	.fast_native_exit
+
+.fast_native_entry_do_special:
+	stmdb	arm_sp!, {r0, r1}
+	mov	r0, r9
+	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
 
-	POP2	r0, r1
+	POP	tmp2, tmp1
+	DISPATCH_START	1
 int_div:
-	cmp	r0, #0
-	beq	.divc_0
+	cmp	tmp2, #0x20
+	DISPATCH_NEXT
+	adr	r3, .div_table
+	DISPATCH_NEXT
+	ldrcc	pc, [r3, tmp2, lsl #2]
 
-        ands    a4, a1, #0x80000000
-        rsbmi   a1, a1, #0
-        eors    ip, a4, a2, ASR #32
-        rsbcs   a2, a2, #0
-	movs	a3, a1
+        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, a2, LSR #8
+        cmp     a3, tmp1, LSR #8
         movls   a3, a3, LSL #8
         blo     .s_loop
-        cmp     a3, a2, LSR #1
+        cmp     a3, tmp1, LSR #1
         bhi     .s_jump7
-        cmp     a3, a2, LSR #2
+        cmp     a3, tmp1, LSR #2
         bhi     .s_jump6
-        cmp     a3, a2, LSR #3
+        cmp     a3, tmp1, LSR #3
         bhi     .s_jump5
-        cmp     a3, a2, LSR #4
+        cmp     a3, tmp1, LSR #4
         bhi     .s_jump4
-        cmp     a3, a2, LSR #5
+        cmp     a3, tmp1, LSR #5
         bhi     .s_jump3
-        cmp     a3, a2, LSR #6
+        cmp     a3, tmp1, LSR #6
         bhi     .s_jump2
-        cmp     a3, a2, LSR #7
+        cmp     a3, tmp1, LSR #7
         bhi     .s_jump1
 .s_loop2:
 @ not executed when falling into .s_loop2
         movhi   a3, a3, LSR #8
-        cmp     a2, a3, LSL #7
+        cmp     tmp1, a3, LSL #7
         adc     a4, a4, a4
-        subcs   a2, a2, a3, LSL #7
-        cmp     a2, a3, LSL #6
+        subcs   tmp1, tmp1, a3, LSL #7
+        cmp     tmp1, a3, LSL #6
 .s_jump1:
         adc     a4, a4, a4
-        subcs   a2, a2, a3, LSL #6
-        cmp     a2, a3, LSL #5
+        subcs   tmp1, tmp1, a3, LSL #6
+        cmp     tmp1, a3, LSL #5
 .s_jump2:
         adc     a4, a4, a4
-        subcs   a2, a2, a3, LSL #5
-        cmp     a2, a3, LSL #4
+        subcs   tmp1, tmp1, a3, LSL #5
+        cmp     tmp1, a3, LSL #4
 .s_jump3:
         adc     a4, a4, a4
-        subcs   a2, a2, a3, LSL #4
-        cmp     a2, a3, LSL #3
+        subcs   tmp1, tmp1, a3, LSL #4
+        cmp     tmp1, a3, LSL #3
 .s_jump4:
         adc     a4, a4, a4
-        subcs   a2, a2, a3, LSL #3
-        cmp     a2, a3, LSL #2
+        subcs   tmp1, tmp1, a3, LSL #3
+        cmp     tmp1, a3, LSL #2
 .s_jump5:
         adc     a4, a4, a4
-        subcs   a2, a2, a3, LSL #2
-        cmp     a2, a3, LSL #1
+        subcs   tmp1, tmp1, a3, LSL #2
+        cmp     tmp1, a3, LSL #1
 .s_jump6:
         adc     a4, a4, a4
-        subcs   a2, a2, a3, LSL #1
+        subcs   tmp1, tmp1, a3, LSL #1
 .s_jump7:
-        cmp     a2, a3
+        cmp     tmp1, a3
         adc     a4, a4, a4
-        subcs   a2, a2, a3
-        cmp     a3, a1
+        subcs   tmp1, tmp1, a3
+        cmp     a3, tmp2
         bne     .s_loop2
-	DISPATCH_START	1
-        movs    ip, ip, lsl #1
-	DISPATCH_NEXT
+        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
+
+
 	Opcode	irem
 
-	POP2	r0, r1
+	POP	tmp2, tmp1
+	DISPATCH_START	1
 int_rem:
-	cmp	r0, #0
-	beq	.remc_0
+	cmp	tmp2, #0x20
+	DISPATCH_NEXT
+	adr	r3, .rem_table
+	DISPATCH_NEXT
+	ldrcc	pc, [r3, tmp2, lsl #2]
 
-        ands    a4, a1, #0x80000000
-        rsbmi   a1, a1, #0
-        eors    ip, a4, a2, ASR #32
-        rsbcs   a2, a2, #0
-	movs	a3, a1
+        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, a2, LSR #8
+        cmp     a3, tmp1, LSR #8
         movls   a3, a3, LSL #8
         blo     .r_loop
-        cmp     a3, a2, LSR #1
+        cmp     a3, tmp1, LSR #1
         bhi     .r_jump7
-        cmp     a3, a2, LSR #2
+        cmp     a3, tmp1, LSR #2
         bhi     .r_jump6
-        cmp     a3, a2, LSR #3
+        cmp     a3, tmp1, LSR #3
         bhi     .r_jump5
-        cmp     a3, a2, LSR #4
+        cmp     a3, tmp1, LSR #4
         bhi     .r_jump4
-        cmp     a3, a2, LSR #5
+        cmp     a3, tmp1, LSR #5
         bhi     .r_jump3
-        cmp     a3, a2, LSR #6
+        cmp     a3, tmp1, LSR #6
         bhi     .r_jump2
-        cmp     a3, a2, LSR #7
+        cmp     a3, tmp1, LSR #7
         bhi     .r_jump1
 .r_loop2:
 @ not executed when falling into .r_loop2
         movhi   a3, a3, LSR #8
-        cmp     a2, a3, LSL #7
+        cmp     tmp1, a3, LSL #7
         adc     a4, a4, a4
-        subcs   a2, a2, a3, LSL #7
-        cmp     a2, a3, LSL #6
+        subcs   tmp1, tmp1, a3, LSL #7
+        cmp     tmp1, a3, LSL #6
 .r_jump1:
         adc     a4, a4, a4
-        subcs   a2, a2, a3, LSL #6
-        cmp     a2, a3, LSL #5
+        subcs   tmp1, tmp1, a3, LSL #6
+        cmp     tmp1, a3, LSL #5
 .r_jump2:
         adc     a4, a4, a4
-        subcs   a2, a2, a3, LSL #5
-        cmp     a2, a3, LSL #4
+        subcs   tmp1, tmp1, a3, LSL #5
+        cmp     tmp1, a3, LSL #4
 .r_jump3:
         adc     a4, a4, a4
-        subcs   a2, a2, a3, LSL #4
-        cmp     a2, a3, LSL #3
+        subcs   tmp1, tmp1, a3, LSL #4
+        cmp     tmp1, a3, LSL #3
 .r_jump4:
         adc     a4, a4, a4
-        subcs   a2, a2, a3, LSL #3
-        cmp     a2, a3, LSL #2
+        subcs   tmp1, tmp1, a3, LSL #3
+        cmp     tmp1, a3, LSL #2
 .r_jump5:
         adc     a4, a4, a4
-        subcs   a2, a2, a3, LSL #2
-        cmp     a2, a3, LSL #1
+        subcs   tmp1, tmp1, a3, LSL #2
+        cmp     tmp1, a3, LSL #1
 .r_jump6:
         adc     a4, a4, a4
-        subcs   a2, a2, a3, LSL #1
+        subcs   tmp1, tmp1, a3, LSL #1
 .r_jump7:
-        cmp     a2, a3
+        cmp     tmp1, a3
         adc     a4, a4, a4
-        subcs   a2, a2, a3
-        cmp     a3, a1
+        subcs   tmp1, tmp1, a3
+        cmp     a3, tmp2
         bne     .r_loop2
-	DISPATCH_START	1
-        movs    ip, ip, lsl #1
-	rsbmi	a2, a2, #0
-	PUSH	a2
+        movs    lr, lr, lsl #1
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	rsbmi	tmp1, tmp1, #0
+	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
 
 @ ip = branch offset
 @ r0 = 1st bytecode
 @ jpc has been updated
-	Opcode	goto_safe
+	Opcode	goto
         ldrsb   r1, [jpc, #1]
-        ldrb    ip, [jpc, #2]
-        orr     ip, ip, r1, lsl #8
-        DISPATCH_START_REG	ip
+        ldrb    tmp1, [jpc, #2]
+        orr     tmp1, tmp1, r1, lsl #8
+        DISPATCH_START_REG	tmp1
 branch_taken:
-	cmp	ip, #0
+	ldr	r2, [dispatch, #SafePointSynchronize_state_Address-XXX]
+	cmp	tmp1, #0
+  USEC	ldr	tmp2, [istate, #ISTATE_METHOD]
+	ldr	r1, [r2]
 	bgt	branch_no_check
 
-	ldr	r3, [dispatch, #SafePointSynchronize_state_Address-XXX]
-	ldr	r1, [r3]
+@ ECN: The C code does...
+@	if (UseCompiler && UseLoopCounter) {
+@		BACKEDGE_COUNT->increment();
+@		...
+@	}
+@ However, I just increment the counter because the check is actually
+@ more expensive than the increment. I don't believe this matters
+@ semantically, since is UseCompiler or UseLoopCounter is false then
+@ we shouldn't even be looking at the backedge counter.
+@
+@ ECN:	Concerns about counter overflowing
+@
+  USEC	ldr	r3, [tmp2, #METHOD_BACKEDGECOUNTER]
 	cmp	r1, #1
+  USEC	add	r3, r3, #INVOCATIONCOUNTER_COUNTINCREMENT
+  USEC	str	r3, [tmp2, #METHOD_BACKEDGECOUNTER]
+
 	bne	branch_no_check
 
-	ldr	r3, [istate, #ISTATE_THREAD]
-	mov	r0, sp
-	str	r3, [sp]
-	bl	_ZN17HandleMarkCleanerD1Ev
+	sub	jpc, jpc, tmp1		@ Point jpc back at the branch!!!
+
+	add	r0, istate, #ISTATE_THREAD
+	bl	HandleMarkCleanerD
 	ldr	r0, [istate, #ISTATE_THREAD]
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_JPC
+	DECACHE_STACK
 	bl	_ZN20SafepointSynchronize5blockEP10JavaThread
+	ASSERT_STACK_CACHED
+	ASSERT_LOCALS_CACHED
 	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
+	CACHE_CP
 	ldr	r3, [r0, #THREAD_PENDING_EXC]
-	ldr	jpc, [istate, #ISTATE_BCP]
+	CACHE_JPC
 	cmp	r3, #0
-	ldr	locals, [istate, #ISTATE_LOCALS]
 	bne	handle_exception
-	DISPATCH_START	0
+
+	DISPATCH_START_REG	tmp1	@ Refetch opcode and update jpc again
 branch_no_check:
-	DISPATCH_BYTECODE
+@ ECN: There is no protection against INVOCATIONCOUNTER overflowing!!!
+  USEC	ldr	r3, [tmp2, #METHOD_INVOCATIONCOUNTER]
+	DISPATCH_NEXT
+  USEC	add	r3, r3, #INVOCATIONCOUNTER_COUNTINCREMENT
+	DISPATCH_NEXT
+  USEC	str	r3, [tmp2, #METHOD_INVOCATIONCOUNTER]
+	DISPATCH_FINISH
 
-	Opcode	ifeq_safe
-	Opcode	ifnull_safe
+	Opcode	ifeq
+	Opcode	ifnull
         POP     r3
         ldrsb   r1, [jpc, #1]
-        ldrb    ip, [jpc, #2]
+        ldrb    tmp1, [jpc, #2]
         cmp     r3, #0
-        orreq   ip, ip, r1, lsl #8
-        ldreqb  r0, [jpc, ip]!
+        orreq   tmp1, tmp1, r1, lsl #8
+        ldreqb  r0, [jpc, tmp1]!
         ldrneb  r0, [jpc, #3]!
 	beq	branch_taken
 	DISPATCH_BYTECODE
 
-	Opcode	ifne_safe
-	Opcode	ifnonnull_safe
+	Opcode	ifne
+	Opcode	ifnonnull
         POP     r3
         ldrsb   r1, [jpc, #1]
-        ldrb    ip, [jpc, #2]
+        ldrb    tmp1, [jpc, #2]
         cmp     r3, #0
-        orrne   ip, ip, r1, lsl #8
-        ldrneb  r0, [jpc, ip]!
+        orrne   tmp1, tmp1, r1, lsl #8
+        ldrneb  r0, [jpc, tmp1]!
         ldreqb  r0, [jpc, #3]!
 	bne	branch_taken
 	DISPATCH_BYTECODE
 
-	Opcode	iflt_safe
+	Opcode	iflt
         POP     r3
         ldrsb   r1, [jpc, #1]
-        ldrb    ip, [jpc, #2]
+        ldrb    tmp1, [jpc, #2]
         cmp     r3, #0
-        orrlt   ip, ip, r1, lsl #8
-        ldrltb  r0, [jpc, ip]!
+        orrlt   tmp1, tmp1, r1, lsl #8
+        ldrltb  r0, [jpc, tmp1]!
         ldrgeb  r0, [jpc, #3]!
 	blt	branch_taken
 	DISPATCH_BYTECODE
 
-	Opcode	ifge_safe
+	Opcode	ifge
         POP     r3
         ldrsb   r1, [jpc, #1]
-        ldrb    ip, [jpc, #2]
+        ldrb    tmp1, [jpc, #2]
         cmp     r3, #0
-        orrge   ip, ip, r1, lsl #8
-        ldrgeb  r0, [jpc, ip]!
+        orrge   tmp1, tmp1, r1, lsl #8
+        ldrgeb  r0, [jpc, tmp1]!
         ldrltb  r0, [jpc, #3]!
 	bge	branch_taken
 	DISPATCH_BYTECODE
 
-	Opcode	ifgt_safe
+	Opcode	ifgt
         POP     r3
         ldrsb   r1, [jpc, #1]
-        ldrb    ip, [jpc, #2]
+        ldrb    tmp1, [jpc, #2]
         cmp     r3, #0
-        orrgt   ip, ip, r1, lsl #8
-        ldrgtb  r0, [jpc, ip]!
+        orrgt   tmp1, tmp1, r1, lsl #8
+        ldrgtb  r0, [jpc, tmp1]!
         ldrleb  r0, [jpc, #3]!
 	bgt	branch_taken
 	DISPATCH_BYTECODE
 
-	Opcode	ifle_safe
+	Opcode	ifle
         POP     r3
         ldrsb   r1, [jpc, #1]
-        ldrb    ip, [jpc, #2]
+        ldrb    tmp1, [jpc, #2]
         cmp     r3, #0
-        orrle   ip, ip, r1, lsl #8
-        ldrleb  r0, [jpc, ip]!
+        orrle   tmp1, tmp1, r1, lsl #8
+        ldrleb  r0, [jpc, tmp1]!
         ldrgtb  r0, [jpc, #3]!
 	ble	branch_taken
 	DISPATCH_BYTECODE
 
-	Opcode	if_icmpeq_safe
-	Opcode	if_acmpeq_safe
-        POP2    r2, r3
+	Opcode	if_icmpeq
+	Opcode	if_acmpeq
+        POP    r2, r3
         ldrsb   r1, [jpc, #1]
-        ldrb    ip, [jpc, #2]
+        ldrb    tmp1, [jpc, #2]
         cmp     r3, r2
-        orreq   ip, ip, r1, lsl #8
-        ldreqb  r0, [jpc, ip]!
+        orreq   tmp1, tmp1, r1, lsl #8
+        ldreqb  r0, [jpc, tmp1]!
         ldrneb  r0, [jpc, #3]!
 	beq	branch_taken
 	DISPATCH_BYTECODE
 
-	Opcode	if_icmpne_safe
-	Opcode	if_acmpne_safe
-        POP2    r2, r3
+	Opcode	if_icmpne
+	Opcode	if_acmpne
+        POP    r2, r3
         ldrsb   r1, [jpc, #1]
-        ldrb    ip, [jpc, #2]
+        ldrb    tmp1, [jpc, #2]
         cmp     r3, r2
-        orrne   ip, ip, r1, lsl #8
-        ldrneb  r0, [jpc, ip]!
+        orrne   tmp1, tmp1, r1, lsl #8
+        ldrneb  r0, [jpc, tmp1]!
         ldreqb  r0, [jpc, #3]!
 	bne	branch_taken
 	DISPATCH_BYTECODE
 
-	Opcode	if_icmplt_safe
-        POP2    r2, r3
+	Opcode	if_icmplt
+        POP    r2, r3
         ldrsb   r1, [jpc, #1]
-        ldrb    ip, [jpc, #2]
+        ldrb    tmp1, [jpc, #2]
         cmp     r3, r2
-        orrlt   ip, ip, r1, lsl #8
-        ldrltb  r0, [jpc, ip]!
+        orrlt   tmp1, tmp1, r1, lsl #8
+        ldrltb  r0, [jpc, tmp1]!
         ldrgeb  r0, [jpc, #3]!
 	blt	branch_taken
 	DISPATCH_BYTECODE
 
-	Opcode	if_icmpge_safe
-        POP2    r2, r3
+	Opcode	if_icmpge
+        POP    r2, r3
         ldrsb   r1, [jpc, #1]
-        ldrb    ip, [jpc, #2]
+        ldrb    tmp1, [jpc, #2]
         cmp     r3, r2
-        orrge   ip, ip, r1, lsl #8
-        ldrgeb  r0, [jpc, ip]!
+        orrge   tmp1, tmp1, r1, lsl #8
+        ldrgeb  r0, [jpc, tmp1]!
         ldrltb  r0, [jpc, #3]!
 	bge	branch_taken
 	DISPATCH_BYTECODE
 
-	Opcode	if_icmpgt_safe
-        POP2    r2, r3
+	Opcode	if_icmpgt
+        POP    r2, r3
         ldrsb   r1, [jpc, #1]
-        ldrb    ip, [jpc, #2]
+        ldrb    tmp1, [jpc, #2]
         cmp     r3, r2
-        orrgt   ip, ip, r1, lsl #8
-        ldrgtb  r0, [jpc, ip]!
+        orrgt   tmp1, tmp1, r1, lsl #8
+        ldrgtb  r0, [jpc, tmp1]!
         ldrleb  r0, [jpc, #3]!
 	bgt	branch_taken
 	DISPATCH_BYTECODE
 
-	Opcode	if_icmple_safe
-        POP2    r2, r3
+	Opcode	if_icmple
+        POP    r2, r3
         ldrsb   r1, [jpc, #1]
-        ldrb    ip, [jpc, #2]
+        ldrb    tmp1, [jpc, #2]
         cmp     r3, r2
-        orrle   ip, ip, r1, lsl #8
-        ldrleb  r0, [jpc, ip]!
+        orrle   tmp1, tmp1, r1, lsl #8
+        ldrleb  r0, [jpc, tmp1]!
         ldrgtb  r0, [jpc, #3]!
 	ble	branch_taken
 	DISPATCH_BYTECODE
 
-	Opcode	ireturn_safe
-	Opcode	freturn_safe
-	Opcode	lreturn_safe
-	Opcode	dreturn_safe
-	Opcode	areturn_safe
-	Opcode	return_safe
+	Opcode	ireturn
+	Opcode	freturn
+	Opcode	lreturn
+	Opcode	dreturn
+	Opcode	areturn
+	Opcode	return
 	ldr	r3, [dispatch, #SafePointSynchronize_state_Address-XXX]
 	ldr	r1, [r3]
 	cmp	r1, #1
 	bne	handle_return
-	ldr	r3, [istate, #ISTATE_THREAD]
-	mov	r0, sp
-	str	r3, [sp]
-	bl	_ZN17HandleMarkCleanerD1Ev
+	add	r0, istate, #ISTATE_THREAD
+	bl	HandleMarkCleanerD
 	ldr	r0, [istate, #ISTATE_THREAD]
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_JPC
+	DECACHE_STACK
 	bl	_ZN20SafepointSynchronize5blockEP10JavaThread
 	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
-	ldr	jpc, [istate, #ISTATE_BCP]
+	ASSERT_STACK_CACHED
 	ldr	r3, [r0, #THREAD_PENDING_EXC]
-	ldr	locals, [istate, #ISTATE_LOCALS]
+	CACHE_JPC
+@ CACHE_LOCALS & CACHE_CP not require for handle_retuen / handle_exception
 	cmp	r3, #0
 	beq	handle_return
 	b	handle_exception
 
-resolve_putstatic:
-	mov	r1, #179
-	sub	jpc, jpc, #3
-        ldr     r0, [istate, #ISTATE_THREAD]
-        str     jpc, [istate, #ISTATE_BCP]
-        str     stack, [istate, #ISTATE_STACK]
-       	bl      _ZN18InterpreterRuntime15resolve_get_putEP10JavaThreadN9Bytecodes4CodeE
-        ldr     r0, [istate, #ISTATE_THREAD]
-        ldr     stack, [istate, #ISTATE_STACK]
-        ldr     r3, [r0, #THREAD_PENDING_EXC]
-        ldr     jpc, [istate, #ISTATE_BCP]
-        cmp     r3, #0
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
-        ldr     locals, [istate, #ISTATE_LOCALS]
-        bne     getfield_exception
-        ldrb    r3, [jpc, #1]
-        ldrb    r2, [jpc, #2]
-        DISPATCH_START	3
-        orr     r3, r3, r2, lsl #8      @ r3 = index
-	add	tmp2, constpool, r3, lsl #4	@ tmp2 = cache
-	DISPATCH_NEXT
-        ldr     r3, [tmp2, #4]            @ r3 = object
-        ldr     lr, [tmp2, #12]           @ lr = tos_type
-        ldr     r2, [tmp2, #8]            @ r2 = offset
-        movs    lr, lr, lsr #29
-        bhi     putstatic_w             @ C = 1, Z = 0 => R2 == 3, 5, 7
-        bcs     putstatic_h             @ C = 1 => R2 = 1
-        beq     putstatic_sb            @ Z = 1 => R2 = 0
-        tst     lr, #2
-        bne     putstatic_dw
-        b       putstatic_sh
-
-resolve_getstatic:
-	mov	r1, #178
-	sub	jpc, jpc, #3
-        ldr     r0, [istate, #ISTATE_THREAD]
-        str     jpc, [istate, #ISTATE_BCP]
-        str     stack, [istate, #ISTATE_STACK]
-       	bl      _ZN18InterpreterRuntime15resolve_get_putEP10JavaThreadN9Bytecodes4CodeE
-        ldr     r0, [istate, #ISTATE_THREAD]
-        ldr     stack, [istate, #ISTATE_STACK]
-        ldr     r3, [r0, #THREAD_PENDING_EXC]
-        ldr     jpc, [istate, #ISTATE_BCP]
-        cmp     r3, #0
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
-        ldr     locals, [istate, #ISTATE_LOCALS]
-        bne     getfield_exception
-        ldrb    r3, [jpc, #1]
-        ldrb    r2, [jpc, #2]
-        DISPATCH_START	3
-        orr     r3, r3, r2, lsl #8      @ r3 = index
-	add	tmp2, constpool, r3, lsl #4	@ tmp2 = cache
-	DISPATCH_NEXT
-        ldr     r3, [tmp2, #4]
-        ldr     r2, [tmp2, #12]
-        ldr     lr, [tmp2, #8]
-        movs    r2, r2, lsr #29
-        bhi     getstatic_w             @ C = 1, Z = 0 => R2 == 3, 5, 7
-        bcs     getstatic_h             @ C = 1 => R2 = 1
-        beq     getstatic_sb            @ Z = 1 => R2 = 0
-        tst     r2, #2
-        bne     getstatic_dw
-        b       getstatic_sh
-
-resolve_putfield:
-	mov	r1, #181
-	b	resolve_get_put
-resolve_getfield:
-	mov	r1, #180
 resolve_get_put:
+	mov	r1, r0
 	mov	tmp1, lr
         ldr     r0, [istate, #ISTATE_THREAD]
-        str     jpc, [istate, #ISTATE_BCP]
-        str     stack, [istate, #ISTATE_STACK]
+	DECACHE_JPC
+        DECACHE_STACK
        	bl      _ZN18InterpreterRuntime15resolve_get_putEP10JavaThreadN9Bytecodes4CodeE
+        ASSERT_STACK_CACHED
+        ASSERT_LOCALS_CACHED
         ldr     r0, [istate, #ISTATE_THREAD]
-        ldr     stack, [istate, #ISTATE_STACK]
+	CACHE_JPC
         ldr     r3, [r0, #THREAD_PENDING_EXC]
-        ldr     jpc, [istate, #ISTATE_BCP]
+	CACHE_CP
         cmp     r3, #0
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
-        ldr     locals, [istate, #ISTATE_LOCALS]
+	mov	lr, tmp1
         bne     getfield_exception
 @ Now restart the getfield
         ldrb    r3, [jpc, #1]
         ldrb    r2, [jpc, #2]
         orr     r3, r3, r2, lsl #8      @ r3 = index
 	add	tmp2, constpool, r3, lsl #4	@ tmp2 = cache
-	bx	tmp1
+	bx	lr
 
 accessor_non_w:
 	bcs	accessor_h
@@ -2046,24 +2950,36 @@
 
 	Opcode	getfield
         add     tmp2, constpool, r1, lsl #12
-        ldr     r3, [tmp2, r2, lsl #4]! @ tmp2 = cache, r3 = flags
+	add	tmp2, tmp2, r2, lsl #4
+	ldr	r3, [tmp2, #CP_OFFSET]
         and     r3, r3, #0x00ff0000
-        cmp     r3, #180 << 16
-        blne     resolve_getfield
-
-        ldr     r2, [tmp2, #12]
+        cmp     r3, #opc_getfield << 16
+        blne    resolve_get_put
+  NFBC	POP	tmp1
+        ldr     r2, [tmp2, #CP_OFFSET+12]
+  NFBC	cmp	tmp1, #0
+  NFBC	beq	null_ptr_exception
+  NFBC	ldr	tmp2, [tmp2, #CP_OFFSET+8]
         movs    r2, r2, lsr #29
-	movhi	r0, #opc_igetfield
+  FBC	movhi	r0, #opc_igetfield
         bls     getfield_non_w
+  NFBC	ldr	tmp2, [tmp1, tmp2]
+  NFBC	PUSH	tmp2
+  NFBC	DISPATCH 3
+
+#ifdef FAST_BYTECODES
 rewrite_bytecode:
 	strb	r0, [jpc]
 	DISPATCH_BYTECODE
+#endif
 
 getfield_non_w:
         bcs     getfield_h              @ C = 1 => R2 = 1
         beq     getfield_sb             @ Z = 1 => R2 = 0
         tst     r2, #2
         bne     getfield_dw
+
+#ifdef FAST_BYTECODES
 getfield_sh:
 	mov	r0, #opc_sgetfield
 	b	rewrite_bytecode
@@ -2076,27 +2992,55 @@
 getfield_dw:
 	mov	r0, #opc_lgetfield
 	b	rewrite_bytecode
+#else
+getfield_sh:
+	ldrsh	tmp2, [tmp1, tmp2]
+	PUSH	tmp2
+	DISPATCH 3
+getfield_h:
+	ldrh	tmp2, [tmp1, tmp2]
+	PUSH	tmp2
+	DISPATCH 3
+getfield_sb:
+	ldrsb	tmp2, [tmp1, tmp2]
+	PUSH	tmp2
+	DISPATCH 3
+getfield_dw:
+	add	tmp1, tmp1, tmp2
+	ldm	tmp1, {r2, tmp2}
+	PUSH	r2, tmp2
+	DISPATCH 3
+#endif
 
 	Opcode	putfield
         add     tmp2, constpool, r1, lsl #12
-        ldr     r3, [tmp2, r2, lsl #4]! @ tmp2 = cache, r3 = flags
+	add	tmp2, tmp2, r2, lsl #4
+	ldr	r3, [tmp2, #CP_OFFSET]
         and     r3, r3, #0xff000000
-        cmp     r3, #181 << 24
-        blne     resolve_putfield
-
-        ldr     r2, [tmp2, #12]
+        cmp     r3, #opc_putfield << 24
+        blne    resolve_get_put
+        ldr     r2, [tmp2, #CP_OFFSET+12]
+  NFBC	ldr	tmp2, [tmp2, #CP_OFFSET+8]
         movs    r2, r2, lsr #29
 	bls	putfield_non_w
-	mov	r0, #opc_iputfield
+  FBC   mov	r0, #opc_iputfield
 	cmp	r2, #tos_atos >> 1
-	moveq	r0, #opc_aputfield
-	b	rewrite_bytecode
+  FBC	moveq	r0, #opc_aputfield
+  FBC	b	rewrite_bytecode
+  NFBC	beq	putfield_a
+  NFBC	POP	r2, r3
+  NFBC	cmp	r3, #0
+  NFBC	beq	null_ptr_exception
+  NFBC	str	r2, [r3, tmp2]
+  NFBC	DISPATCH 3
 
 putfield_non_w:
 	bcs	putfield_h
 	beq	putfield_sb
 	tst	r2, #2
 	bne	putfield_dw
+
+#ifdef FAST_BYTECODES
 putfield_sh:
 putfield_h:
 	mov	r0, #opc_cputfield
@@ -2107,37 +3051,71 @@
 putfield_dw:
 	mov	r0, #opc_lputfield
 	b	rewrite_bytecode
+#else
+putfield_sh:
+putfield_h:
+	POP	r2, r3
+	cmp	r3, #0
+	beq	null_ptr_exception
+	strh	r2, [r3, tmp2]
+	DISPATCH 3
+putfield_sb:
+	POP	r2, r3
+	cmp	r3, #0
+	beq	null_ptr_exception
+	strb	r2, [r3, tmp2]
+	DISPATCH 3
+putfield_dw:
+	POP	r2, r3, lr
+	cmp	lr, #0
+	beq	null_ptr_exception
+	add	tmp2, lr, tmp2
+	stm	tmp2, {r2, r3}
+	DISPATCH 3
 putfield_a:
-	mov	r0, #opc_aputfield
-	b	rewrite_bytecode
+	GET_STACK	1, r0
+	add	oop_address_tmp, r0, tmp2
+	POP	oop_value_tmp
+	cmp	r0, #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]
+	DISPATCH 3
+#endif
 
 getstatic_sh:
-	DISPATCH_STATE	2
+	DISPATCH_START	3
 	ldrsh	tmp2, [r3, lr]
 	DISPATCH_NEXT
 	PUSH	tmp2
 	DISPATCH_FINISH
 getstatic_h:
-	DISPATCH_STATE	2
+	DISPATCH_START	3
 	ldrh	tmp2, [r3, lr]
 	DISPATCH_NEXT
 	PUSH	tmp2
 	DISPATCH_FINISH
 getstatic_sb:
-	DISPATCH_STATE	2
+	DISPATCH_START	3
 	ldrsb	tmp2, [r3, lr]
 	DISPATCH_NEXT
 	PUSH	tmp2
 	DISPATCH_FINISH
 getstatic_dw:
-	DISPATCH_STATE	2
+	DISPATCH_START	3
 	add	r3, r3, lr
 	ldm	r3, {r2, tmp2}
 	DISPATCH_NEXT
-	PUSH2	r2, tmp2
+	PUSH	r2, tmp2
 	DISPATCH_FINISH
 getstatic_w:
-	DISPATCH_STATE	2
+	DISPATCH_START	3
 	ldr	tmp2, [r3, lr]
 	DISPATCH_NEXT
 	PUSH	tmp2
@@ -2145,39 +3123,39 @@
 
 putstatic_sh:
 putstatic_h:
-	DISPATCH_STATE	2
+	DISPATCH_START	3
 	POP	tmp2
 	DISPATCH_NEXT
 	strh	tmp2, [r3, r2]
 	DISPATCH_FINISH
 putstatic_w:
-	DISPATCH_STATE	2
 	cmp	lr, #tos_atos >> 1	@ >> 1 due to lsr #29 above
 	beq	putstatic_a
+	DISPATCH_START	3
 	POP	tmp2
 	DISPATCH_NEXT
 	str	tmp2, [r3, r2]
 	DISPATCH_FINISH
 putstatic_sb:
-	DISPATCH_STATE	2
+	DISPATCH_START	3
 	POP	tmp2
 	DISPATCH_NEXT
 	strb	tmp2, [r3, r2]
 	DISPATCH_FINISH
 putstatic_dw:
-	DISPATCH_STATE	2
+	DISPATCH_START	3
 	add	r2, r2, r3
-	POP2	r3, tmp2
+	POP	r3, tmp2
 	DISPATCH_NEXT
 	stm	r2, {r3, tmp2}
 	DISPATCH_FINISH
 putstatic_a:
-	POP	r1			@ r1 = value
-	add	r0, r3, r2
+	POP	oop_value_tmp
+	add	oop_address_tmp, r3, r2
 	PUSH	r3
        	bl      oop_store
     ldr	r3, [dispatch, #Universe_collectedHeap_Address-XXX]
-	DISPATCH_START	0
+	DISPATCH_START	3
 	POP	r2
     ldr	r3, [r3]
 	DISPATCH_NEXT
@@ -2188,387 +3166,167 @@
         strb    tmp2, [r3, r2, lsr #9]
 	DISPATCH_FINISH
 
-
+resolve_invokeinterface:
+	mov	r1, #opc_invokeinterface
+	b	resolve_invoke
 resolve_invokevirtual:
-	mov	tmp1, lr
-	mov	r1, #182
-	ldr	r0, [istate, #ISTATE_THREAD]
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
-	bl	_ZN18InterpreterRuntime14resolve_invokeEP10JavaThreadN9Bytecodes4CodeE
-	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
-	ldr	r3, [r0, #THREAD_PENDING_EXC]
-	ldr	jpc, [istate, #ISTATE_BCP]
-	cmp	r3, #0
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
-	ldr	locals, [istate, #ISTATE_LOCALS]
-	bne	invokevirtual_exception
-
-        ldrb    r3, [jpc, #1]
-        ldrb    r2, [jpc, #2]
-        orr     r3, r3, r2, lsl #8      @ r3 = index
-	add	r0, constpool, r3, lsl #4	@ r1 = cache
-	bx	tmp1
-
+	mov	r1, #opc_invokevirtual
+	b	resolve_invoke
+resolve_invokespecial:
+	mov	r1, #opc_invokespecial
+	b	resolve_invoke
 resolve_invokestatic:
+	mov	r1, #opc_invokestatic
+resolve_invoke:
 	mov	tmp1, lr
-	mov	r1, #184
 	ldr	r0, [istate, #ISTATE_THREAD]
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_JPC
+	DECACHE_STACK
 	bl	_ZN18InterpreterRuntime14resolve_invokeEP10JavaThreadN9Bytecodes4CodeE
+	ASSERT_STACK_CACHED
+	ASSERT_LOCALS_CACHED
 	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
+	CACHE_JPC
 	ldr	r3, [r0, #4]
-	ldr	jpc, [istate, #ISTATE_BCP]
+	CACHE_CP
 	cmp	r3, #0
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
-	ldr	locals, [istate, #ISTATE_LOCALS]
-	bne	invokestatic_exception
-
         ldrb    r3, [jpc, #1]
         ldrb    r2, [jpc, #2]
+	bne	resolve_exception
         orr     r3, r3, r2, lsl #8      @ r3 = index
 	add	r0, constpool, r3, lsl #4	@ r1 = cache
 	bx	tmp1
 
-resolve_invokespecial:
-	mov	tmp1, lr
-	mov	r1, #183
+# r2 = [jpc, #1]
+# r1 = [jpc, #2]
+	Opcode	new
+#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, #32
+	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]
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
-	bl	_ZN18InterpreterRuntime14resolve_invokeEP10JavaThreadN9Bytecodes4CodeE
+	ldr	r1, [r3, #METHOD_CONSTANTS]
+	bl	_ZN18InterpreterRuntime4_newEP10JavaThreadP19constantPoolOopDesci
 	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
-	ldr	r3, [r0, #THREAD_PENDING_EXC]
-	ldr	jpc, [istate, #ISTATE_BCP]
-	cmp	r3, #0
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
-	ldr	locals, [istate, #ISTATE_LOCALS]
-	bne	invokespecial_exception
+	ASSERT_STACK_CACHED
+	ldr	ip, [r0, #THREAD_PENDING_EXC]
+	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
 
-        ldrb    r3, [jpc, #1]
-        ldrb    r2, [jpc, #2]
-        orr     r3, r3, r2, lsl #8      @ r3 = index
-	add	r0, constpool, r3, lsl #4	@ r1 = cache
-	bx	tmp1
+bytecode_interpreter_str:
+	.ascii  "[Bytecode Interpreter]\000"
+	ALIGN_WORD
 
-	Opcode	invokeinterface
-	ldrb	r1, [jpc, #2]	@ zero_extendqisi2
-	ldrb	r3, [jpc, #1]	@ zero_extendqisi2
-	mov	r0, constpool
-	orr	r3, r3, r1, asl #8
-	ldr	r2, [r0, r3, asl #4]
-	mov	tmp1, r3, asl #4
-	add	r0, r0, tmp1
-	mov	r2, r2, asr #16
-	and	r2, r2, #255
-	cmp	r2, #185
-	beq	.invokeinterface_1
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
+	Opcode	newarray
+	ldrb	r1, [jpc, #1]	@ zero_extendqisi2
+	ldr	r2, [stack, #4]
 	ldr	r0, [istate, #ISTATE_THREAD]
-	mov	r1, #185
-	bl	_ZN18InterpreterRuntime14resolve_invokeEP10JavaThreadN9Bytecodes4CodeE
+	DECACHE_JPC
+	DECACHE_STACK
+	bl	_ZN18InterpreterRuntime8newarrayEP10JavaThread9BasicTypei
+	ASSERT_LOCALS_CACHED
+	ASSERT_STACK_CACHED
 	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
-	ldr	stack, [istate, #ISTATE_STACK]
-	ldr	r3, [r0, #THREAD_PENDING_EXC]
-	ldr	jpc, [istate, #ISTATE_BCP]
-	cmp	r3, #0
-	ldr	locals, [istate, #ISTATE_LOCALS]
-	bne	handle_exception
-	mov	r3, constpool
-	add	r0, r3, tmp1
-.invokeinterface_1:
-	ldr	r3, [r0, #12]
-	ands	tmp_vvv, r3, #16777216
-	bne	.invokeinterface_6
-	ldr	lr, [r0, #4]
-	ldr	r3, [r0, #12]
-	and	r3, r3, #255
-	ldr	r3, [stack, r3, asl #2]
-	cmp	r3, #0
-	beq	null_ptr_exception
-	ldr	sl, [r3, #4]
-	add	r3, sl, #8
-	add	tmp1, sl, #304
-	ldr	r2, [r3, #224]
-	ldr	ip, [r3, #228]
-	add	r2, r2, #1
-	bic	r2, r2, #1
+	CACHE_JPC
+	ldr	ip, [r0, #THREAD_PENDING_EXC]
+	CACHE_CP
 	cmp	ip, #0
-	mov	r3, r2, asl #2
-	add	r1, tmp1, r3
-	movle	r2, tmp_vvv
-	ble	.invokeinterface_4
-	ldr	r3, [tmp1, r2, asl #2]
-	cmp	lr, r3
-	movne	r2, tmp_vvv
-	bne	.invokeinterface_3
-	b	.invokeinterface_5
-.invokeinterface_2:
-	ldr	r3, [r1, #0]
-	cmp	lr, r3
-	beq	.invokeinterface_5
-.invokeinterface_3:
-	add	r2, r2, #1
-	cmp	r2, ip
-	add	r1, r1, #8
-	blt	.invokeinterface_2
-.invokeinterface_4:
-	cmp	r2, ip
-	beq	incompatibleclass_exception
-.invokeinterface_5:
-	ldr	r3, [r0, #8]
-	ldr	r2, [r1, #4]
-	mov	r3, r3, asl #2
-	add	r3, sl, r3
-	ldr	r0, [r3, r2]
-	cmp	r0, #0
-	bne	.invokeinterface_7
-abstractmethod_exception:
-	mov	r0, #VMSYMBOLS_AbstractMethodError
-	b	raise_exception
-incompatibleclass_exception:
-	mov	r0, #VMSYMBOLS_IncompatibleClassChangeError
-	b	raise_exception
-
-.invokeinterface_6:
-	ldr	r3, [r0, #12]
-	mov	r1, stack
-	and	r3, r3, #255
-	ldr	r2, [stack, r3, asl #2]
-	cmp	r2, #0
-	beq	null_ptr_exception
-	ldr	r3, [r0, #12]
-	tst	r3, #67108864
-	ldreq	r3, [r0, #12]
-	ldreq	r2, [r0, #8]
-	andeq	r3, r3, #255
-	ldrne	r0, [r0, #8]
-	ldreq	r1, [stack, r3, asl #2]
-	moveq	r2, r2, asl #2
-	ldreq	r3, [r1, #4]
-	addeq	r3, r3, r2
-	ldreq	r0, [r3, #304]
-.invokeinterface_7:
-	str	r0, [istate, #ISTATE_CALLEE]
-	ldr	r3, [r0, #76]
-	mov	r1, #0
-	str	r3, [istate, #36]
-	str	stack, [istate, #ISTATE_STACK]
-	str	jpc, [istate, #ISTATE_BCP]
-	ldr	lr, [istate, #ISTATE_THREAD]
-	str	r1, [lr, #THREAD_LAST_JAVA_SP]
-	ldr	r3, [istate, #ISTATE_STACK]
-	add	r3, r3, #4
-	str	r3, [lr, #THREAD_JAVA_SP]
-	ldr	ip, [istate, #36]
-	ldr	r2, [istate, #ISTATE_THREAD]
-	mov	r1, ip
-	ldr	ip, [ip]
-	blx	ip
-	ldr	ip, [istate, #ISTATE_THREAD]
-	ldr	r3, [ip, #THREAD_JAVA_SP]
-	ldr	r2, [istate, #ISTATE_STACK_LIMIT]
-	sub	r3, r3, #4
-	str	r3, [istate, #ISTATE_STACK]
-	ldr	r1, [ip, #THREAD_TOP_ZERO_FRAME]
-	add	r2, r2, #4
-	str	r2, [ip, #THREAD_JAVA_SP]
-	str	r1, [ip, #THREAD_LAST_JAVA_SP]
-	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
-	ldr	jpc, [istate, #ISTATE_BCP]
-	ldr	r3, [r0, #THREAD_PENDING_EXC]
-	ldr	locals, [istate, #ISTATE_LOCALS]
-	cmp	r3, #0
-	bne	handle_exception
-invokeinterface_exit:
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
-	DISPATCH	5
-
-	Opcode	new
-	ldrb	ip, [jpc, #1]	@ zero_extendqisi2
-	ldrb	r2, [jpc, #2]	@ zero_extendqisi2
-	ldr	r3, [istate, #ISTATE_METHOD]
-	orr	r2, r2, ip, asl #8
-	ldr	lr, [r3, #12]
-	mov	r2, r2, asl #16
-	ldr	r1, [lr, #8]
-	add	r1, r1, #12
-	ldrb	r3, [r1, r2, lsr #16]	@ zero_extendqisi2
-	mov	r2, r2, lsr #16
-	and	r3, r3, #255
-	str	r2, [sp, #52]
-	cmp	r3, #104
-	cmpne	r3, #100
-	beq	.new_1
-	mov	r3, r2, asl #2
-	add	r3, lr, r3
-	ldr	r3, [r3, #32]
-	add	r1, r3, #8
-	str	r3, [sp, #84]
-	str	r1, [sp, #88]
-	ldr	r3, [r1, #216]
-	cmp	r3, #5
-	beq	.new_2
-.new_1:
-	ldr	r3, [istate, #ISTATE_METHOD]
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
-	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	r1, [r3, #12]
-	ldr	r2, [sp, #52]
-	bl	_ZN18InterpreterRuntime4_newEP10JavaThreadP19constantPoolOopDesci
-	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
-	ldr	ip, [r0, #THREAD_PENDING_EXC]
-	ldr	jpc, [istate, #ISTATE_BCP]
-	cmp	ip, #0
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
-	ldr	locals, [istate, #ISTATE_LOCALS]
-	beq	new_exit
-	b	handle_exception
-.new_2:
-	ldr	r3, [r1, #4]
-	tst	r3, #1
-	bne	.new_1
-	mov	fp, r3, asr #2
-	ldr	r3, [dispatch, #UseTLAB_Address-XXX]
-	ldr	r2, [dispatch, #ZeroTLAB_Address-XXX]
-	ldrb	r1, [r3]
-	cmp	r1, #0
-	ldrb	r0, [r2]
-	bne	.new_9
-.new_3:
-	mov	tmp_vvv, fp, asl #2
-.new_4:
-	ldr	r2, [dispatch, #Universe_collectedHeap_Address-XXX]
-	str	r2, [sp, #20]
-.new_5:
-	ldr	r1, [sp, #20]
-	ldr	r2, [r1, #0]
-	mov	r0, r2
-	ldr	r3, [r2, #UNIVERSE_VTABLE]
-	ldr	ip, [r3, #UNIVERSE_VTABLE_TOP_ADDR]
-	blx	ip
-	ldr	r3, [sp, #20]
-	ldr	r2, [r3, #0]
-	ldr	r3, [r2, #UNIVERSE_VTABLE]
-	ldr	tmp_xxx, [r0, #0]
-	mov	r0, r2
-	ldr	ip, [r3, #UNIVERSE_VTABLE_END_ADDR]
-	blx	ip
-	add	sl, tmp_xxx, tmp_vvv
-	ldr	r3, [r0, #0]
-	cmp	sl, r3
-	bhi	.new_1
-	ldr	ip, [sp, #20]
-	ldr	r3, [ip, #0]
-	mov	r0, r3
-	ldr	r2, [r3, #UNIVERSE_VTABLE]
-	ldr	ip, [r2, #UNIVERSE_VTABLE_TOP_ADDR]
-	blx	ip
-	mov	r2, tmp_xxx
-	mov	r1, r0
-	mov	r0, sl
-	bl	_ZN6Atomic11cmpxchg_ptrEPvPVvS0_
-	cmp	r0, tmp_xxx
-	bne	.new_5
-	subs	tmp_xxx, r0, #0
-	beq	.new_1
-.new_6:
-	subs	r2, fp, #2
-	bne	.new_10
-.new_7:
-	ldr	r3, [dispatch, #UseBiasedLocking_Address-XXX]
-	ldrb	r1, [r3]
-	cmp	r1, #0
-	moveq	r3, #1
-	ldrne	r0, [sp, #88]
-	streq	r3, [tmp_xxx, #0]
-	ldrne	r3, [r0, #96]
-	add	r0, tmp_xxx, #4
-	strne	r3, [tmp_xxx, #0]
-	ldr	r3, [dispatch, #always_do_update_barrier_Address-XXX]
-	ldrb	r1, [r3]	@ zero_extendqisi2
-	cmp	r1, #0
-	ldreq	r2, [sp, #84]
-	streq	r2, [tmp_xxx, #4]
-	beq	.new_8
-	ldr	r1, [sp, #84]
-	bl	oop_store
-.new_8:
-	str	tmp_xxx, [stack], #-4
-	b	new_exit_1
-.new_9:
-	ldr	r1, [istate, #ISTATE_THREAD]
-	ldr	r2, [r1, #THREAD_TLAB_TOP]
-	ldr	r3, [r1, #THREAD_TLAB_END]
-	rsb	r3, r2, r3
-	cmp	fp, r3, lsr #2
-	bhi	.new_3
-	cmp	r2, #0
-	mov	tmp_vvv, fp, asl #2
-	add	r3, r2, tmp_vvv
-	mov	tmp_xxx, r2
-	str	r3, [r1, #THREAD_TLAB_TOP]
-	beq	.new_4
-	cmp	r0, #0
-	bne	.new_7
-	b	.new_6
-.new_10:
-	mov	r2, r2, asl #2
-	add	r0, tmp_xxx, #8
-	mov	r1, #0
-	bl	memset
-	b	.new_7
-new_exit:
-	ldr	r2, [r0, #THREAD_VM_RESULT]
-	str	r2, [stack], #-4
-	ldr	r3, [istate, #ISTATE_THREAD]
-	str	ip, [r3, #THREAD_VM_RESULT]
-new_exit_1:
-	ldr	locals, [istate, #ISTATE_LOCALS]
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
-	DISPATCH	3
-
-bytecode_interpreter_str:
-	.ascii  "[Bytecode Interpreter]\000"
-	ALIGN_WORD
-
-	Opcode	newarray
-	ldrb	r1, [jpc, #1]	@ zero_extendqisi2
-	ldr	r2, [stack, #4]
-	ldr	r0, [istate, #ISTATE_THREAD]
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
-	bl	_ZN18InterpreterRuntime8newarrayEP10JavaThread9BasicTypei
-	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
-	ldr	ip, [r0, #THREAD_PENDING_EXC]
-	ldr	jpc, [istate, #ISTATE_BCP]
-	cmp	ip, #0
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
-	ldr	locals, [istate, #ISTATE_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	2
+	ldr	r2, [r0, #THREAD_VM_RESULT]
+	bne	handle_exception
+	str	r2, [stack, #4]
+	str	ip, [r0, #THREAD_VM_RESULT]
+	DISPATCH	2
 
 	Opcode	anewarray
 	ldrb	r0, [jpc, #1]	@ zero_extendqisi2
@@ -2576,33 +3334,37 @@
 	ldr	lr, [istate, #ISTATE_METHOD]
 	ldrb	r2, [jpc, #2]	@ zero_extendqisi2
 	orr	r2, r2, r0, asl #8
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
-	ldr	r1, [lr, #12]
+	DECACHE_JPC
+	DECACHE_STACK
+	ldr	r1, [lr, #METHOD_CONSTANTS]
 	ldr	r0, [istate, #ISTATE_THREAD]
 	bl	_ZN18InterpreterRuntime9anewarrayEP10JavaThreadP19constantPoolOopDescii
+	ASSERT_STACK_CACHED
+	ASSERT_LOCALS_CACHED
 	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
+	CACHE_JPC
 	ldr	ip, [r0, #THREAD_PENDING_EXC]
-	ldr	jpc, [istate, #ISTATE_BCP]
+	CACHE_CP
 	cmp	ip, #0
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
-	ldr	locals, [istate, #ISTATE_LOCALS]
-	bne	handle_exception
 	ldr	r2, [r0, #THREAD_VM_RESULT]
+	bne	handle_exception
 	str	r2, [stack, #4]
-	ldr	r3, [istate, #ISTATE_THREAD]
-	str	ip, [r3, #THREAD_VM_RESULT]
+	str	ip, [r0, #THREAD_VM_RESULT]
 	DISPATCH	3
 
 	Opcode	arraylength
+	DISPATCH_START	1
 	ldr	r3, [stack, #4]
-	cmp	r3, #0
-	beq	null_ptr_exception
-	ldr	r1, [r3, #8]
-	str	r1, [stack, #4]
-	DISPATCH	1
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
+.abortentry114:
+	ldr	r3, [r3, #8]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	str	r3, [stack, #4]
+	DISPATCH_FINISH
 
 	Opcode	athrow
 	ldr	r1, [stack, #4]
@@ -2614,159 +3376,181 @@
 	bl	_ZN12ThreadShadow21set_pending_exceptionEP7oopDescPKci
 	b	handle_exception
 
+#define secondary_super_cache_offset_in_bytes	20
+#define tmp_chunk	locals
+#define tmp_hwm		stack
+#define	tmp_max		constpool
+
+# r2 = [jpc, #1]
+# r1 = [jpc, #2]
 	Opcode	checkcast
-	ldr	r3, [stack, #4]
-	cmp	r3, #0
-	beq	.checkcast_exit
-	ldrb	sl, [jpc, #2]	@ zero_extendqisi2
-	ldrb	tmp_xxx, [jpc, #1]	@ zero_extendqisi2
-	orr	r1, sl, tmp_xxx, asl #8
 	ldr	r3, [istate, #ISTATE_METHOD]
-	mov	r1, r1, asl #16
-	ldr	r0, [r3, #12]
-	mov	tmp_xxx, r1, lsr #16
-	ldr	r2, [r0, #8]
-	add	r2, r2, #12
-	ldrb	r3, [r2, r1, lsr #16]	@ zero_extendqisi2
-	and	r3, r3, #255
-	cmp	r3, #104
-	cmpne	r3, #100
-	beq	.checkcast_2
-.checkcast_1:
-	mov	r1, tmp_xxx, asl #2
 	ldr	r0, [stack, #4]
-	ldr	r2, [istate, #ISTATE_METHOD]
+	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]
-	ldr	r3, [r2, #12]
-	add	r3, r3, r1
-	ldr	tmp_vvv, [r3, #32]
-	cmp	tmp_vvv, r0
+	add	r3, r3, tmp2, lsl #2
+	ldr	tmp1, [r3, #32]
+	cmp	tmp1, r0
 	beq	.checkcast_exit
-	add	tmp_xxx, r0, #8
-	mov	r0, tmp_xxx
-	mov	r1, tmp_vvv
-	bl	_ZNK5Klass13is_subtype_ofEP12klassOopDesc
+
+	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
-	bne	.checkcast_exit
-	mov	r0, tmp_xxx
-	add	sl, sp, #216
+	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]
+	CACHE_JPC
+	ldr	r3, [r0, #THREAD_PENDING_EXC]
+	CACHE_CP
+	cmp	r3, #0
+	ldr	r3, [istate, #ISTATE_METHOD]
+	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	fp, [r3, #144]		@ THREAD_RESOURCE_AREA
-	ldr	r1, [fp, #4]
-	str	r1, [sp, #112]
-	ldr	r2, [fp, #8]
-	str	r2, [sp, #116]
-	ldr	r3, [fp, #12]
-	str	r3, [sp, #120]
+	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	tmp_xxx, r0
-	add	r0, tmp_vvv, #8
+	mov	ip, r0
+	add	r0, tmp1, #8
+	mov	tmp1, ip
 	bl	_ZNK5Klass13external_nameEv
 	mov	r1, r0
-	mov	r0, tmp_xxx
+	mov	r0, tmp1
 	bl	_ZN13SharedRuntime27generate_class_cast_messageEPKcS1_
-	ldr	tmp_xxx, [dispatch, #VmSymbols_symbols_Address-XXX]
-	ldr	ip, [istate, #ISTATE_THREAD]
+	str	r0, [arm_sp, #0]
+	ldr	r0, [istate, #ISTATE_THREAD]
 	adrl	r1, bytecode_interpreter_str
 	mov	r2, #99
 	mov	r3, #_thread_in_vm
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
-	str	ip, [sl, #-72]!
-	str	r3, [ip, #THREAD_STATE]
-	ldr	r3, [tmp_xxx, #VMSYMBOLS_ClassCastException * 4]
-	ldr	ip, [istate, #ISTATE_THREAD]
-	str	r0, [sp, #0]
-	mov	r0, ip
+	str	r3, [r0, #THREAD_STATE]
+	ldr	r3, [dispatch, #VmSymbols_symbols_Address-XXX]
+	ldr	r3, [r3, #VMSYMBOLS_ClassCastException * 4]
 	bl	_ZN10Exceptions10_throw_msgEP6ThreadPKciP13symbolOopDescS3_
-	mov	r0, sl
-	bl	_ZN18ThreadInVMfromJavaD1Ev
-	ldr	r0, [sp, #112]
+	add	r0, istate, #ISTATE_THREAD
+	bl	ThreadInVMfromJavaD
+	mov	r0, tmp_chunk
 	ldr	r3, [r0, #0]
-	ldr	stack, [istate, #ISTATE_STACK]
+	CACHE_JPC
 	cmp	r3, #0
-	ldr	jpc, [istate, #ISTATE_BCP]
 	beq	1f
 	bl	_ZN5Chunk9next_chopEv
 1:
-	ldr	r2, [sp, #120]
-	str	r2, [fp, #12]
-	ldr	r3, [sp, #112]
-	str	r3, [fp, #4]
-	ldr	ip, [sp, #116]
-	str	ip, [fp, #8]
-	b	handle_exception
-.checkcast_2:
-	ldr	r0, [istate, #ISTATE_THREAD]
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
-	bl	_ZN18InterpreterRuntime13quicken_io_ccEP10JavaThread
-	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
-	ldr	r3, [r0, #THREAD_PENDING_EXC]
-	ldr	jpc, [istate, #ISTATE_BCP]
-	cmp	r3, #0
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
-	beq	.checkcast_1
+	str	tmp_hwm, [tmp2, #RESOURCEAREA_HWM]
+	str	tmp_max, [tmp2, #RESOURCEAREA_MAX]
+	str	tmp_chunk, [tmp2, #RESOURCEAREA_CHUNK]
 	b	handle_exception
-.checkcast_exit:
-	ldr	locals, [istate, #ISTATE_LOCALS]
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
-	DISPATCH	3
 
+# r2 = [jpc, #1]
+# r1 = [jpc, #2]
 	Opcode	instanceof
-	ldr	r3, [stack, #4]
-	cmp	r3, #0
-	beq	.instanceof_exit
-	ldrb	tmp1, [jpc, #1]	@ zero_extendqisi2
 	ldr	r3, [istate, #ISTATE_METHOD]
-	ldrb	r2, [jpc, #2]	@ zero_extendqisi2
-	ldr	ip, [r3, #12]
-	orr	r2, r2, tmp1, asl #8
-	ldr	r1, [ip, #8]
-	mov	r2, r2, asl #16
-	add	r1, r1, #12
-	mov	tmp1, r2, lsr #16
-	ldrb	r3, [r1, r2, lsr #16]	@ zero_extendqisi2
-	and	r3, r3, #255
-	cmp	r3, #104
-	cmpne	r3, #100
-	bne	.instanceof_1
+	ldr	r0, [stack, #4]
+	ldr	r3, [r3, #METHOD_CONSTANTS]
+	cmp	r0, #0
+	ldr	ip, [r3, #CONSTANTPOOL_TAGS]
+	beq	.instanceof_not_instance
+	add	ip, ip, #12
+	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, #32]
+	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]
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_JPC
+	DECACHE_STACK
 	bl	_ZN18InterpreterRuntime13quicken_io_ccEP10JavaThread
+	ASSERT_STACK_CACHED
+	ASSERT_LOCALS_CACHED
 	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
+	CACHE_JPC
 	ldr	r3, [r0, #THREAD_PENDING_EXC]
-	ldr	jpc, [istate, #ISTATE_BCP]
+	CACHE_CP
 	cmp	r3, #0
-	ldr	locals, [istate, #ISTATE_LOCALS]
 	bne	handle_exception
-.instanceof_1:
-	mov	r1, tmp1, asl #2
+
+	ldr	r3, [istate, #ISTATE_METHOD]
 	ldr	r0, [stack, #4]
-	ldr	r2, [istate, #ISTATE_METHOD]
-	ldr	r0, [r0, #4]
-	ldr	r3, [r2, #12]
-	add	r3, r3, r1
-	ldr	r1, [r3, #32]
-	cmp	r1, r0
-	beq	.instanceof_2
-	add	r0, r0, #8
-	bl	_ZNK5Klass13is_subtype_ofEP12klassOopDesc
-	cmp	r0, #0
-	streq	r0, [stack, #4]
-	beq	.instanceof_exit
-.instanceof_2:
-	mov	r3, #1
-	str	r3, [stack, #4]
-.instanceof_exit:
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
-	DISPATCH	3
+	ldr	r3, [r3, #METHOD_CONSTANTS]		@ METHOD->constanst() might have moved
+	b	1b
 
 	Opcode	monitorenter
 	ldr	r1, [stack, #4]
@@ -2797,38 +3581,35 @@
 	orr	tmp1, r3, #1
 	mov	r2, tmp1
 	str	tmp1, [sl, #0]
-	bl	_ZN6Atomic11cmpxchg_ptrEPvPVvS0_
+	bl	cmpxchg_ptr
 	cmp	r0, tmp1
 	beq	.monitorenter_exit
+	ldr	r0, [istate, #ISTATE_THREAD]
 	bic	r1, tmp1, #3
-	ldr	r2, [istate, #ISTATE_THREAD]
-	mov	r0, r2
-	ldr	r3, [r2, #0]
-	ldr	ip, [r3, #THREAD_VTABLE_IS_LOCK_OWNED]
-	blx	ip
+	bl	JavaThread_is_lock_owned
 	cmp	r0, #0
 	movne	lr, #0
 	strne	lr, [sl, #0]
 	bne	.monitorenter_exit
 	mov	r1, sl
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_JPC
+	DECACHE_STACK
 	ldr	r0, [istate, #ISTATE_THREAD]
 	bl	_ZN18InterpreterRuntime12monitorenterEP10JavaThreadP15BasicObjectLock
+	ASSERT_STACK_CACHED
+	ASSERT_LOCALS_CACHED
 	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
-	ldr	jpc, [istate, #ISTATE_BCP]
+	CACHE_JPC
 	ldr	r3, [r0, #THREAD_PENDING_EXC]
 	cmp	r3, #0
-	ldr	locals, [istate, #ISTATE_LOCALS]
 	beq	.monitorenter_exit
 	b	handle_exception
 .monitorenter_4:
 	b	null_ptr_exception
 .monitorenter_5:
 	mov	lr, #0
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_JPC
+	DECACHE_STACK
 	ldr	r3, [istate, #ISTATE_THREAD]
 	ldr	ip, [istate, #ISTATE_THREAD]
 	ldr	r1, [r3, #THREAD_JAVA_SP]
@@ -2868,11 +3649,11 @@
 	ldr	r1, [istate, #ISTATE_THREAD]
 	ldr	r3, [r1, #THREAD_TOP_ZERO_FRAME]
 	str	r3, [r1, #THREAD_LAST_JAVA_SP]
-	ldr	stack, [istate, #ISTATE_STACK]
+	CACHE_STACK
 	ldr	sl, [istate, #ISTATE_STACK_BASE]
-	ldr	jpc, [istate, #ISTATE_BCP]
 	ldr	r3, [stack, #4]
-	ldr	locals, [istate, #ISTATE_LOCALS]
+	CACHE_JPC
+	ASSERT_LOCALS_CACHED
 	mov	r1, r3
 	str	r3, [sl, #4]
 	ldr	r2, [r3, #0]
@@ -2880,35 +3661,31 @@
 	orr	tmp1, r2, #1
 	mov	r2, tmp1
 	str	tmp1, [sl, #0]
-	bl	_ZN6Atomic11cmpxchg_ptrEPvPVvS0_
+	bl	cmpxchg_ptr
 	cmp	r0, tmp1
 	beq	.monitorenter_exit
+	ldr	r0, [istate, #ISTATE_THREAD]
 	bic	r1, tmp1, #3
-	ldr	r2, [istate, #ISTATE_THREAD]
-	mov	r0, r2
-	ldr	r3, [r2, #0]
-	ldr	ip, [r3, #THREAD_VTABLE_IS_LOCK_OWNED]
-	blx	ip
+	bl	JavaThread_is_lock_owned
 	cmp	r0, #0
 	movne	ip, #0
 	strne	ip, [sl, #0]
 	bne	.monitorenter_exit
 	mov	r1, sl
 	ldr	r0, [istate, #ISTATE_THREAD]
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_JPC
+	DECACHE_STACK
 	bl	_ZN18InterpreterRuntime12monitorenterEP10JavaThreadP15BasicObjectLock
+	ASSERT_STACK_CACHED
+	ASSERT_LOCALS_CACHED
 	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
+	CACHE_JPC
 	ldr	r3, [r0, #THREAD_PENDING_EXC]
-	ldr	jpc, [istate, #ISTATE_BCP]
 	cmp	r3, #0
-	ldr	locals, [istate, #ISTATE_LOCALS]
 	beq	.monitorenter_exit
 	b	handle_exception
 .monitorenter_exit:
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
+	CACHE_CP
 	add	stack, stack, #4
 	DISPATCH	1
 
@@ -2936,35 +3713,34 @@
 	beq	.monitorexit_exit
 	mov	r1, sl
 	mov	r2, tmp1
-	bl	_ZN6Atomic11cmpxchg_ptrEPvPVvS0_
+	bl	cmpxchg_ptr
 	cmp	tmp1, r0
 	beq	.monitorexit_exit
 	str	sl, [tmp1, #4]
 	mov	r1, tmp1
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_JPC
+	DECACHE_STACK
 	ldr	r0, [istate, #ISTATE_THREAD]
 	bl	_ZN18InterpreterRuntime11monitorexitEP10JavaThreadP15BasicObjectLock
 	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
-	ldr	jpc, [istate, #ISTATE_BCP]
+	ASSERT_STACK_CACHED
+	ASSERT_LOCALS_CACHED
 	ldr	r3, [r0, #THREAD_PENDING_EXC]
+	CACHE_JPC
 	cmp	r3, #0
-	ldr	locals, [istate, #ISTATE_LOCALS]
 	beq	.monitorexit_exit
 	b	handle_exception
 .monitorexit_3:
 	b	null_ptr_exception
 .monitorexit_4:
 	ldr	r0, [istate, #ISTATE_THREAD]
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_JPC
+	DECACHE_STACK
 	bl	_ZN18InterpreterRuntime37throw_illegal_monitor_state_exceptionEP10JavaThread
 	b	handle_exception_with_bcp
 .monitorexit_exit:
 	add	stack, stack, #4
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
+	CACHE_CP
 	DISPATCH	1
 
 vm_fatal_error:
@@ -2977,23 +3753,24 @@
 	ALIGN_WORD
 
 	Opcode	aastore
-	ldr	tmp1, [stack, #12]
+	ldr	tmp1, [stack, #12]	@ arrObj
 	ldr	tmp_vvv, [stack, #8]
-	cmp	tmp1, #0
+	SW_NPC	cmp	tmp1, #0
 	ldr	sl, [stack, #4]
-	beq	null_ptr_exception
+	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]
+	ldr	r3, [tmp1, #4]		@ arrObj->klass()
 	ldr	r0, [sl, #4]
-	ldr	r1, [r3, #136]
+	ldr	r1, [r3, #KLASS_PART+OBJARRAYKLASS_ELEMENTKLASS]
 	cmp	r0, r1
 	beq	.aastore_exit
 	add	r0, r0, #8
-	bl	_ZNK5Klass13is_subtype_ofEP12klassOopDesc
+	bl	is_subtype_of
 	cmp	r0, #0
 	moveq	r0, #VMSYMBOLS_ArrayStoreException
 	beq	raise_exception
@@ -3007,8 +3784,7 @@
 	add	stack, stack, #12
     ldr	r3, [r3, #76]
 	strb	lr, [r3, r1, lsr #9]
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
+	CACHE_CP
 	DISPATCH	1
 
 	Opcode	wide
@@ -3061,6 +3837,7 @@
 	DISPATCH	4
 case_wide_istore:
 case_wide_fstore:
+case_wide_astore:
 	POP	r2
 	str	r2, [locals, -r1, lsl #2]
 	DISPATCH	4
@@ -3068,21 +3845,14 @@
 case_wide_lload:
 	sub	r1, locals, r1, lsl #2
 	ldmda	r1, {r1, r2}
-	PUSH2	r1, r2
+	PUSH	r1, r2
 	DISPATCH	4
 case_wide_dstore:
 case_wide_lstore:
-	POP2	r2, r3
+	POP	r2, r3
 	sub	r1, locals, r1, lsl #2
 	stmda	r1, {r2, r3}
 	DISPATCH	4
-case_wide_astore:
-	mov	r3, r1
-	mov	r0, stack
-	mvn	r1, #0
-	mov	r2, locals
-	bl	_ZN19BytecodeInterpreter6astoreEPiiS0_i
-	DISPATCH	4
 do_wide_ret:
 	ldr	r2, [istate, #ISTATE_METHOD]
 	ldr	r2, [r2, #8]
@@ -3102,25 +3872,21 @@
 	ldrb	tmp1, [jpc, #3]	@ zero_extendqisi2
 	ldr	r0, [istate, #ISTATE_THREAD]
 	add	r1, stack, tmp1, lsl #2
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_JPC
+	DECACHE_STACK
 	bl	_ZN18InterpreterRuntime14multianewarrayEP10JavaThreadPi
+	ASSERT_STACK_CACHED
+	ASSERT_LOCALS_CACHED
 	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
+	CACHE_JPC
 	ldr	r1, [r0, #THREAD_PENDING_EXC]
-	ldr	jpc, [istate, #ISTATE_BCP]
+	CACHE_CP
 	cmp	r1, #0
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
-	ldr	locals, [istate, #ISTATE_LOCALS]
-	bne	handle_exception
 	ldr	r3, [r0, #THREAD_VM_RESULT]
-	str	r3, [stack, tmp1, asl #2]
-	ldr	r2, [istate, #ISTATE_THREAD]
-	mov	r3, tmp1, asl #2
-	sub	r3, r3, #4
-	str	r1, [r2, #THREAD_VM_RESULT]
-	add	stack, stack, r3
+	bne	handle_exception
+	str	r3, [stack, tmp1, asl #2]!
+	str	r1, [r0, #THREAD_VM_RESULT]
+	sub	stack, stack, #4
 	DISPATCH	4
 
 	Opcode	jsr_w
@@ -3148,57 +3914,82 @@
 	ldr	r1, [r3]
 	cmp	r1, #1
 	bne	1f
-	ldr	r3, [istate, #ISTATE_THREAD]
-	mov	r0, sp
-	str	r3, [sp]
-	bl	_ZN17HandleMarkCleanerD1Ev
+	add	r0, istate, #ISTATE_THREAD
+	bl	HandleMarkCleanerD
 	ldr	r0, [istate, #ISTATE_THREAD]
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_JPC
+	DECACHE_STACK
 	bl	_ZN20SafepointSynchronize5blockEP10JavaThread
+	ASSERT_STACK_CACHED
+	ASSERT_LOCALS_CACHED
 	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
+	CACHE_JPC
 	ldr	r3, [r0, #THREAD_PENDING_EXC]
-	ldr	jpc, [istate, #ISTATE_BCP]
+	CACHE_CP
 	cmp	r3, #0
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
-	ldr	locals, [istate, #ISTATE_LOCALS]
 	bne	handle_exception
 1:
 	DISPATCH	0
 
 	Opcode	breakpoint
 	mov	r2, jpc
-	str	stack, [istate, #ISTATE_STACK]
-	str	jpc, [istate, #ISTATE_BCP]
+	DECACHE_STACK
+	DECACHE_JPC
 	ldr	r0, [istate, #ISTATE_THREAD]
 	ldr	r1, [istate, #ISTATE_METHOD]
 	bl	_ZN18InterpreterRuntime24get_original_bytecode_atEP10JavaThreadP13methodOopDescPh
-	ldr	stack, [istate, #ISTATE_STACK]
-	ldmib	istate, {jpc, locals}	@ phole ldm
 	mov	tmp1, r0
 	ldr	r0, [istate, #ISTATE_THREAD]
 	ldr	r3, [r0, #THREAD_PENDING_EXC]
 	cmp	r3, #0
 	bne	handle_exception
-	str	stack, [istate, #ISTATE_STACK]
-	str	jpc, [istate, #ISTATE_BCP]
-	mov	r2, jpc
+	ldr	r2, [istate, #ISTATE_BCP]
 	ldr	r1, [istate, #ISTATE_METHOD]
 	bl	_ZN18InterpreterRuntime11_breakpointEP10JavaThreadP13methodOopDescPh
+	ASSERT_STACK_CACHED
+	ASSERT_LOCALS_CACHED
 	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
+	CACHE_JPC
 	ldr	r3, [r0, #THREAD_PENDING_EXC]
-	ldr	jpc, [istate, #ISTATE_BCP]
+	CACHE_CP
 	cmp	r3, #0
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
-	ldr	locals, [istate, #ISTATE_LOCALS]
-	bne	handle_exception
 	and	r0, tmp1, #255
+	bne	handle_exception
 	DISPATCH_BYTECODE
 
+#ifndef FAST_BYTECODES
+	Opcode	bgetfield
+	Opcode	cgetfield
+	Opcode	igetfield
+	Opcode	lgetfield
+	Opcode	sgetfield
+	Opcode	aputfield
+	Opcode	bputfield
+	Opcode	cputfield
+	Opcode	iputfield
+	Opcode	lputfield
+	Opcode	invokevfinal
+	Opcode	invokeresolved
+	Opcode	invokespecialresolved
+	Opcode	invokestaticresolved
+	Opcode	iaccess_0
+	Opcode	iload_0_iconst_N
+	Opcode	iload_iconst_N
+	Opcode	iadd_istore_N
+	Opcode	isub_istore_N
+	Opcode	iand_istore_N
+	Opcode	ior_istore_N
+	Opcode	ixor_istore_N
+	Opcode	iadd_u4store
+	Opcode	isub_u4store
+	Opcode	iand_u4store
+	Opcode	ior_u4store
+	Opcode	ixor_u4store
+	Opcode	fast_iload_iload
+	Opcode	fast_iload_iload_N
+	Opcode	fast_iload_N_iload
+	Opcode	fast_iload_N_iload_N
+#endif
 	Opcode	undefined
 	ldr	r2, [dispatch, #Bytecodes_name_Address-XXX]
 	ldrb	r3, [jpc, #0]	@ zero_extendqisi2
@@ -3208,7 +3999,7 @@
 	ldrcc	ip, [r2, r3, asl #2]
 	adr	r2, unimplemented_opcode_msg
 	mov	r1, #99
-	str	ip, [sp, #0]
+	str	ip, [arm_sp, #0]
 	bl	_Z19report_fatal_varargPKciS0_z
 	b	breakpoint
 unimplemented_opcode_msg:
@@ -3220,18 +4011,18 @@
 	Opcode	return_register_finalizer
 	ldr	r1, [locals, #0]
 	ldr	r3, [r1, #4]
-	ldr	r2, [r3, #84]
-	tst	r2, #1073741824
+	ldr	r2, [r3, #KLASS_PART+KLASS_ACCESSFLAGS]
+	tst	r2, #JVM_ACC_HAS_FINALIZER
 	beq	handle_return
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_JPC
+	DECACHE_STACK
 	ldr	r0, [istate, #ISTATE_THREAD]
 	bl	_ZN18InterpreterRuntime18register_finalizerEP10JavaThreadP7oopDesc
+	ASSERT_STACK_CACHED
 	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
-	ldr	jpc, [istate, #ISTATE_BCP]
+	CACHE_JPC
 	ldr	r3, [r0, #THREAD_PENDING_EXC]
-	ldr	locals, [istate, #ISTATE_LOCALS]
+@ CACHE_LOCALS & CACHE_CP not require for handle_retuen / handle_exception
 	cmp	r3, #0
 	beq	handle_return
 	b	handle_exception
@@ -3240,12 +4031,11 @@
 @ 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.
 normal_entry_synchronized:
-	stmfd	sp!, {regset, lr}
-	sub	sp, sp, #220
+	stmfd	arm_sp!, {regset, lr}
 	mov	sl, r0
 	mov	tmp1, r2
-	ldrh	r2, [sl, #40]
-	ldrh	r3, [sl, #42]
+	ldrh	r2, [sl, #METHOD_MAXLOCALS]
+	ldrh	r3, [sl, #METHOD_SIZEOFPARAMETERS]
 	rsb	tmp_zzz, r3, r2
 	cmp	tmp_zzz, #0
 	ble	.normal_entry_synchronized_no_locals
@@ -3262,15 +4052,11 @@
 	mov	r2, tmp1
 	mov	r1, sl
 	add	r0, tmp1, #THREAD_JAVA_STACK_BASE
-	bl	build_normal
-@	add	lr, sp, #192
-@	str	r0, [sp, #56]
+	bl	build_frame
 	mov	tmp_vvv, r0
 	ldr	r3, [tmp1, #THREAD_TOP_ZERO_FRAME]
 	sub	r0, r0, #72
-@	str	lr, [sp, #32]
 	mov	istate, r0
-@	str	r0, [sp, #60]
 	str	r3, [tmp_vvv, #0]
 	ldr	r0, [tmp1, #THREAD_STACK_SIZE]
 	ldr	r3, [tmp1, #THREAD_STACK_BASE]
@@ -3279,61 +4065,48 @@
 	adrl	ip, dispatch_init_adcon
 	rsb	r3, r0, r3
 	rsb	r2, r1, r2
-	ldmia	ip, {r0, r1}
-	rsb	r3, r3, sp
+	ldm	ip, {r0, r1}
+	rsb	r3, r3, arm_sp
 	cmp	r2, #4096
 	cmpge	r3, #32768
 	add	r0, r0, ip
 	str	tmp_vvv, [tmp1, #THREAD_TOP_ZERO_FRAME]
+	CACHE_JPC
 	str	tmp_vvv, [tmp1, #THREAD_LAST_JAVA_SP]
 	add	dispatch, r1, r0
 	blt	.throw_stack_overflow
-	ldr	stack, [istate, #ISTATE_STACK]
-	ldmib	istate, {jpc, locals}	@ phole ldm
 	ldr	r0, [istate, #ISTATE_METHOD]
-	ldr	r3, [r0, #24]
-	tst	r3, #32
+	CACHE_STACK
+	ldr	r3, [r0, #METHOD_ACCESSFLAGS]
+	CACHE_LOCALS
+	tst	r3, #JVM_ACC_SYNCHRONIZED
+	CACHE_CP
 	bne	normal_do_synchronization
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
 	DISPATCH	0
 
 do_execute_java_bytecodes_restore_locals_and_jpc:
-	ldr	jpc, [istate, #ISTATE_BCP]
+	CACHE_JPC
 do_execute_java_bytecodes_restore_locals:
-	ldr	locals, [istate, #ISTATE_LOCALS]
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
-	add	constpool, constpool, #CONST_POOL_OFFSET
+	CACHE_LOCALS
+	CACHE_CP
 	DISPATCH	0
 
 normal_do_synchronization:
-	tst	r3, #8
-	ldrne	r3, [r0, #12]
+	tst	r3, #JVM_ACC_STATIC
+	ldrne	r3, [r0, #METHOD_CONSTANTS]
 	ldreq	sl, [locals, #0]
 	ldrne	r2, [r3, #16]
-	ldr	r3, [dispatch, #UseBiasedLocking_Address-XXX]
-	ldr	ip, [istate, #ISTATE_MONITOR_BASE]
+	ldr	tmp1, [istate, #ISTATE_MONITOR_BASE]
 	ldrne	sl, [r2, #60]
-	str	ip, [sp, #100]
-	ldrb	r1, [r3]
-	cmp	r1, #0
-	beq	.normal_do_synchronisation_1
-	ldr	tmp_xxx, [sl, #0]
-	and	r3, tmp_xxx, #7
-	cmp	r3, #5
-	beq	.normal_do_synchronisation_4
-.normal_do_synchronisation_1:
-	ldr	r0, [sp, #100]
 	ldr	r3, [sl, #0]
-	sub	fp, r0, #8
 	orr	tmp_xxx, r3, #1
-	str	tmp_xxx, [r0, #-8]
+	str	tmp_xxx, [tmp1, #-8]!
 .normal_do_synchronisation_2:
 	ldr	tmp_vvv, [sl, #0]
 	cmp	tmp_xxx, tmp_vvv
 	bne	.normal_do_synchronisation_3
 	mov	r0, tmp_xxx
-	mov	r1, fp
+	mov	r1, tmp1
 	mov	r2, sl
 	mov	r3, #0xffffffc0
 	bic	r3, r3, #0xf000
@@ -3343,85 +4116,153 @@
 .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
-	ldr	r2, [istate, #ISTATE_THREAD]
-	mov	r0, r2
-	ldr	r3, [r2, #0]
-	ldr	ip, [r3, #THREAD_VTABLE_IS_LOCK_OWNED]
-	blx	ip
+	bl	JavaThread_is_lock_owned
 	cmp	r0, #0
-	beq	.handle_exception_28
-	ldr	r0, [sp, #100]
+	beq	.normal_do_synchronisation_4
 	mov	r3, #0
-	str	r3, [r0, #-8]
+	str	r3, [tmp1]
 	b	do_execute_java_bytecodes_restore_locals
 .normal_do_synchronisation_4:
-	ldr	r2, [sl, #4]
-	ldr	r2, [r2, #104]
+	mov	r1, tmp1
+	DECACHE_STACK
 	ldr	r0, [istate, #ISTATE_THREAD]
-	eor	r3, r2, r0
-	eor	r3, r3, tmp_xxx
-	bics	ip, r3, #120
-	beq	do_execute_java_bytecodes_restore_locals
-	mov	r0, r2
-	mov	r1, sl
-	mov	r2, tmp_xxx
-	bl	_ZN6Atomic11cmpxchg_ptrEPvPVvS0_
-	cmp	tmp_xxx, r0
-	beq	.normal_do_synchronisation_1
-	b	do_execute_java_bytecodes_restore_locals
+	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
 
 # r2 = [jpc, #1]
 # r1 = [jpc, #2]
-        Opcode  invokevirtual
-        add     r0, constpool, r1, lsl #12
-        ldr     r2, [r0, r2, asl #4]!           @ r0 = cache
-        and     r2, r2, #0xff000000
-        cmp     r2, #182 << 24
-        blne    resolve_invokevirtual
-        ldr     r3, [r0, #12]
-        mov     r0, #opc_invokeresolved
-        tst     r3, #67108864
-        movne   r0, #opc_invokevfinal
-        b       rewrite_bytecode
-
-	Opcode	invokespecial
+	Opcode	invokeinterface
+	DECACHE_STACK
         add     r0, constpool, r1, lsl #12
-        ldr     r2, [r0, r2, asl #4]!           @ r0 = cache
+	add	r0, r0, r2, asl #4
+	DECACHE_JPC
+        ldr     r2, [r0, #CP_OFFSET]
         and     r2, r2, #0x00ff0000
-        cmp     r2, #183 << 16
-        blne     resolve_invokespecial
-	mov	r0, #opc_invokespecialresolved
-	b	rewrite_bytecode
+        cmp     r2, #opc_invokeinterface << 16
+        blne    resolve_invokeinterface
 
-	Opcode	invokestatic
-        add     r0, constpool, r1, lsl #12
-        ldr     r2, [r0, r2, asl #4]!           @ r0 = cache
-	and	r2, r2, #0x00ff0000
-	cmp	r2, #184 << 16
-	blne	resolve_invokestatic
-	mov	r0, #opc_invokestaticresolved
-	b	rewrite_bytecode
+	ldr	r3, [r0, #CP_OFFSET+12]
+	and	r2, r3, #255
+	ldr	r2, [stack, r2, lsl #2]
+	SW_NPC	cmp	r2, #0
+	SW_NPC	beq	null_ptr_exception
+.abortentry110:
+	ldr	tmp2, [r2, #4]				@ rcvr->klass()
+	tst	r3, #flag_methodInterface
+	bne	.invokeinterface_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	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]
+	SW_NPC	cmp	tmp2, #0
+	SW_NPC	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]
+	str	r1, [tmp1, #THREAD_LAST_JAVA_SP]
+
+	add	stack, stack, #4
+	str	stack, [tmp1, #THREAD_JAVA_SP]
+
+	ldr	r3, [ip]
+
+	mov	tmp_invoke_len, #5
+
+	adr	r0, normal_entry
+	cmp	r3, r0
+	beq	fast_normal_entry_with_len
+
+	mov	r0, tmp2
+	mov	r1, ip
+	mov	r2, tmp1
+	blx	r3
+
+	ASSERT_LOCALS_CACHED
+
+	ldr	ip, [istate, #ISTATE_THREAD]
+	CACHE_JPC
+	ldr	stack, [ip, #THREAD_JAVA_SP]
+	ldr	r2, [istate, #ISTATE_STACK_LIMIT]
+	sub	stack, stack, #4
+
+	ldr	r1, [ip, #THREAD_TOP_ZERO_FRAME]
+	add	r2, r2, #4
+	str	r2, [ip, #THREAD_JAVA_SP]
+	str	r1, [ip, #THREAD_LAST_JAVA_SP]
+	DISPATCH_START	5
+	ldr	r3, [ip, #4]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	cmp	r3, #0
+	DISPATCH_NEXT
+	bne	invokeinterface_exception_fix
+	DISPATCH_NEXT
+	CACHE_CP
+	DISPATCH_FINISH
+
+.invokeinterface_methodInterface:
+	tst	r3, #flag_vfinalMethod
+	ldrne	tmp2, [r0, #CP_OFFSET+8]
+	bne	.invokeinterface_invoke
+	ldr	r1, [r0, #CP_OFFSET+8]
+	add	r3, tmp2, r1, lsl #2
+	ldr	tmp2, [r3, #INSTANCEKLASS_VTABLE_OFFSET]
+	b	.invokeinterface_invoke
+
+#ifdef FAST_BYTECODES
 # r2 = [jpc, #1]
 # r1 = [jpc, #2]
 	Opcode	invokevfinal
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_STACK
 	add	r0, constpool, r1, lsl #12
-	str	jpc, [istate, #ISTATE_BCP]
+	DECACHE_JPC
 	add	r0, r2, asl #4
-	ldr	r3, [r0, #12]
+	ldr	r3, [r0, #CP_OFFSET+12]
 	ldr	tmp1, [istate, #ISTATE_THREAD]
 	and	r1, r3, #255
 	ldr	r2, [stack, r1, asl #2]
 	mov	r1, #0
-	cmp	r2, #0
-	beq	null_ptr_exception
+	SW_NPC	cmp	r2, #0
+	SW_NPC	beq	null_ptr_exception
+.abortentry117:
+	HW_NPC	ldr	r3, [r2]		@ Only to provoke abort
 
-	ldr	tmp2, [r0, #8]
+	ldr	tmp2, [r0, #CP_OFFSET+8]
 
-	str	tmp2, [istate, #ISTATE_CALLEE]
-	ldr	ip, [tmp2, #76]
+@	str	tmp2, [istate, #ISTATE_CALLEE]
+	ldr	ip, [tmp2, #METHOD_FROM_INTERPRETED]
 	str	r1, [tmp1, #THREAD_LAST_JAVA_SP]
 	str	ip, [istate, #36]
 
@@ -3429,42 +4270,82 @@
 	str	stack, [tmp1, #THREAD_JAVA_SP]
 
 	ldr	r3, [ip, #0]
-	adr	lr, normal_entry
-	cmp	r3, lr
+#ifdef FASTPATH_ENTRY
+	adr	r0, normal_entry
+	cmp	r3, r0
 	beq	fast_normal_entry
-	adr	lr, native_entry
-	cmp	r3, lr
+#ifdef NATIVE_ENTRY
+	adrl	r0, native_entry
+	cmp	r3, r0
 	beq	fast_native_entry
-	adr	lr, accessor_entry
-	cmp	r3, lr
+#endif
+	adr	r0, accessor_entry
+	cmp	r3, r0
 	beq	fast_accessor_entry
+#endif
 	b	normal_dispatch_and_return
+#endif // FAST_BYTECODES
 
 # r2 = [jpc, #1]
 # r1 = [jpc, #2]
-        Opcode  invokeresolved
-        str     stack, [istate, #ISTATE_STACK]
+        Opcode  invokevirtual
         add     r0, constpool, r1, lsl #12
-        str     jpc, [istate, #ISTATE_BCP]
         add     r0, r0, r2, asl #4
-        ldr     r3, [r0, #12]
+        ldr     r2, [r0, #CP_OFFSET]
+        and     r2, r2, #0xff000000
+        cmp     r2, #opc_invokevirtual << 24
+        blne    resolve_invokevirtual
+        ldr     r3, [r0, #CP_OFFSET+12]
+#ifdef FAST_BYTECODES
+        mov     r0, #opc_invokeresolved
+        tst     r3, #flag_vfinalMethod
+        movne   r0, #opc_invokevfinal
+        b       rewrite_bytecode
+#else
+        DECACHE_STACK
+	DECACHE_JPC
         ldr     tmp1, [istate, #ISTATE_THREAD]
         and     r1, r3, #255
         ldr     r2, [stack, r1, asl #2]
         mov     r1, #0
-#ifndef HW_NULL_PTR_CHECK
         cmp     r2, #0
-        beq     null_ptr_exception_jpc_0
-#endif
+        beq     null_ptr_exception
 
-        ldr     tmp2, [r0, #8]
+        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:
+#endif // FAST_BYTECODES
+
+#ifdef FAST_BYTECODES
+# r2 = [jpc, #1]
+# r1 = [jpc, #2]
+        Opcode  invokeresolved
+        DECACHE_STACK
+        add     r0, constpool, r1, lsl #12
+	DECACHE_JPC
+        add     r0, r0, r2, asl #4
+        ldr     r3, [r0, #CP_OFFSET+12]
+        ldr     tmp1, [istate, #ISTATE_THREAD]
+        and     r1, r3, #255
+        ldr     r2, [stack, r1, asl #2]
+        mov     r1, #0
+        SW_NPC	cmp     r2, #0
+        SW_NPC	beq     null_ptr_exception_jpc_0
+
+        ldr     tmp2, [r0, #CP_OFFSET+8]
 .abortentry104:
         ldr     r3, [r2, #4]
         add     r3, r3, tmp2, lsl #2
-        ldr     tmp2, [r3, #304]
+        ldr     tmp2, [r3, #INSTANCEKLASS_VTABLE_OFFSET]
+#endif // FAST_BYTECODES
 
-        str     tmp2, [istate, #ISTATE_CALLEE]
-        ldr     ip, [tmp2, #76]
+@        str     tmp2, [istate, #ISTATE_CALLEE]
+        ldr     ip, [tmp2, #METHOD_FROM_INTERPRETED]
         str     r1, [tmp1, #THREAD_LAST_JAVA_SP]
         str     ip, [istate, #36]
 
@@ -3472,57 +4353,70 @@
         str     stack, [tmp1, #THREAD_JAVA_SP]
 
         ldr     r3, [ip, #0]
-        adr     lr, normal_entry
-        cmp     r3, lr
+#ifdef FASTPATH_ENTRY
+        adr     r0, normal_entry
+        cmp     r3, r0
         beq     fast_normal_entry
-        adr     lr, native_entry
-        cmp     r3, lr
+#ifdef NATIVE_ENTRY
+        adr     r0, native_entry
+        cmp     r3, r0
         beq     fast_native_entry
-        adr     lr, accessor_entry
-        cmp     r3, lr
+#endif
+        adr     r0, accessor_entry
+        cmp     r3, r0
         beq     fast_accessor_entry
+#endif
 
 normal_dispatch_and_return:
 	mov	r0, tmp2
 	mov	r1, ip
+	mov	r2, tmp1
 	ldr	r2, [istate, #ISTATE_THREAD]
 	blx	r3
 
+	ASSERT_LOCALS_CACHED
+
 	ldr	ip, [istate, #ISTATE_THREAD]
-	ldr	r3, [ip, #THREAD_JAVA_SP]
+	CACHE_JPC
+	ldr	stack, [ip, #THREAD_JAVA_SP]
 	ldr	r2, [istate, #ISTATE_STACK_LIMIT]
-	sub	r3, r3, #4
-	str	r3, [istate, #ISTATE_STACK]
+	sub	stack, stack, #4
 
 	ldr	r1, [ip, #THREAD_TOP_ZERO_FRAME]
 	add	r2, r2, #4
 	str	r2, [ip, #THREAD_JAVA_SP]
 	str	r1, [ip, #THREAD_LAST_JAVA_SP]
-	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
-	ldr	jpc, [istate, #ISTATE_BCP]
-	ldr	r3, [r0, #4]
 	DISPATCH_START	3
-	ldr	locals, [istate, #ISTATE_LOCALS]
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
+	ldr	r3, [ip, #4]
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	add	constpool, constpool, #CONST_POOL_OFFSET
 	cmp	r3, #0
 	DISPATCH_NEXT
-	bne	invokespecial_exception_fix
+	bne	invoke_exception_fix
+	DISPATCH_NEXT
+	CACHE_CP
 	DISPATCH_FINISH
 
-	Opcode	invokestaticresolved
-        str     stack, [istate, #ISTATE_STACK]
+	Opcode	invokestatic
         add     r0, constpool, r1, lsl #12
-	str	jpc, [istate, #ISTATE_BCP]
-	add	r0, r2, asl #4
+	add	r0, r0, r2, asl #4
+        ldr     r2, [r0, #CP_OFFSET]
+	and	r2, r2, #0x00ff0000
+	cmp	r2, #opc_invokestatic << 16
+	blne	resolve_invokestatic
+  FBC	mov	r0, #opc_invokestaticresolved
+  FBC	b	rewrite_bytecode
+
+  FBC	Opcode	invokestaticresolved
+        DECACHE_STACK
+  FBC   add     r0, constpool, r1, lsl #12
+	DECACHE_JPC
+  FBC	add	r0, r2, asl #4
 
-	ldr	tmp2, [r0, #4]
+	ldr	tmp2, [r0, #CP_OFFSET+4]
 	mov	r1, #0
-	str	tmp2, [istate, #ISTATE_CALLEE]
-	ldr	r3, [tmp2, #76]
+@	str	tmp2, [istate, #ISTATE_CALLEE]
+	ldr	r3, [tmp2, #METHOD_FROM_INTERPRETED]
 	ldr	tmp1, [istate, #ISTATE_THREAD]
 	str	r3, [istate, #36]
 	str	r1, [tmp1, #THREAD_LAST_JAVA_SP]
@@ -3532,35 +4426,78 @@
 
 	ldr	ip, [istate, #36]
 	ldr	r3, [ip, #0]
-	adr	lr, normal_entry
-	cmp	r3, lr
+#ifdef FASTPATH_ENTRY
+	adr	r0, normal_entry
+	cmp	r3, r0
 	beq	fast_normal_entry
-	adr	lr, native_entry
-	cmp	r3, lr
+#ifdef NATIVE_ENTRY
+	adr	r0, native_entry
+	cmp	r3, r0
 	beq	fast_native_entry
-	adr	lr, accessor_entry
-	cmp	r3, lr
+#endif
+	adr	r0, accessor_entry
+	cmp	r3, r0
 	beq	fast_accessor_entry
+#endif
 	b	normal_dispatch_and_return
 
-	Opcode	invokespecialresolved
-        str     stack, [istate, #ISTATE_STACK]
+	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
+
+	ldr	stack, [tmp1, #THREAD_JAVA_SP]
+
+	ldr	r0, [tmp1, #THREAD_STACK_SIZE]
+	ldr	r3, [tmp1, #THREAD_STACK_BASE]
+	rsb	r3, r0, r3
+	rsb	r3, r3, arm_sp
+	cmp	r3, #32768
+	bge	fast_normal_entry_with_len
+
+	mov	r0, tmp1
+        bl      _ZN18InterpreterRuntime24throw_StackOverflowErrorEP10JavaThread
+
+	ldmfd	arm_sp!, {regset, pc}
+
+	Opcode	invokespecial
         add     r0, constpool, r1, lsl #12
-	str	jpc, [istate, #ISTATE_BCP]
-	add	r0, r2, asl #4
+	add	r0, r0, r2, asl #4
+        ldr     r2, [r0, #CP_OFFSET]
+        and     r2, r2, #0x00ff0000
+        cmp     r2, #opc_invokespecial << 16
+        blne     resolve_invokespecial
+  FBC	mov	r0, #opc_invokespecialresolved
+  FBC	b	rewrite_bytecode
 
-	ldr	r3, [r0, #12]
+  FBC	Opcode	invokespecialresolved
+        DECACHE_STACK
+  FBC   add     r0, constpool, r1, lsl #12
+	DECACHE_JPC
+  FBC	add	r0, r2, asl #4
+
+	ldr	r3, [r0, #CP_OFFSET+12]
 	ldr	tmp1, [istate, #ISTATE_THREAD]
 	and	r3, r3, #255
 	ldr	r2, [stack, r3, asl #2]
 	mov	r1, #0
-	cmp	r2, #0
-	beq	null_ptr_exception
+	SW_NPC	cmp	r2, #0
+	SW_NPC	beq	null_ptr_exception
+.abortentry118:
+	HW_NPC	ldr	r3, [r2]		@ Only to provoke abort
 
-	ldr	tmp2, [r0, #4]
+	ldr	tmp2, [r0, #CP_OFFSET+4]
 
-	str	tmp2, [istate, #ISTATE_CALLEE]
-	ldr	ip, [tmp2, #76]
+@	str	tmp2, [istate, #ISTATE_CALLEE]
+	ldr	ip, [tmp2, #METHOD_FROM_INTERPRETED]
 	str	r1, [tmp1, #THREAD_LAST_JAVA_SP]
 	str	ip, [istate, #36]
 
@@ -3568,15 +4505,19 @@
 	str	stack, [tmp1, #THREAD_JAVA_SP]
 
 	ldr	r3, [ip, #0]
-	adr	lr, normal_entry
-	cmp	r3, lr
+#ifdef FASTPATH_ENTRY
+	adr	r0, normal_entry
+	cmp	r3, r0
 	beq	fast_normal_entry
-	adr	lr, native_entry
-	cmp	r3, lr
+#ifdef NATIVE_ENTRY
+	adr	r0, native_entry
+	cmp	r3, r0
 	beq	fast_native_entry
-	adr	lr, accessor_entry
-	cmp	r3, lr
+#endif
+	adr	r0, accessor_entry
+	cmp	r3, r0
 	beq	fast_accessor_entry
+#endif
 	b	normal_dispatch_and_return
 
 	ALIGN_CODE
@@ -3591,403 +4532,59 @@
 	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, #180 << 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
-
-	ALIGN_CODE
-normal_entry:
-	adrl	ip, dispatch_init_adcon
-	stmfd	sp!, {regset, lr}
-	mov	tmp2, r0
-	ldmia	ip, {r0, r1}
-	sub	sp, sp, #220
-
-	mov	istate, #ISTATE_THREAD
-	add	dispatch, ip, r3
-
-	add	r0, r0, ip
-	add	dispatch, r1, r0
-
-	ldrh	r1, [tmp2, #40]
-	ldrh	r3, [tmp2, #42]
-	mov	tmp1, r2
-
-	rsb	tmp_xxx, r3, r1
-	ldr	stack, [tmp1, #THREAD_JAVA_SP]
-	movs	tmp_xxx, tmp_xxx, asr #1
-	mov	r0, #0
-	mov	ip, #0
-	strcs	r0, [stack, #-4]!
-.zero_locals:
-	subs	tmp_xxx, tmp_xxx, #1
-	stmgedb	stack!, {r0, ip}
-	bgt	.zero_locals
-
-@ r11 = thread
-@ r10 = method
-	ldrh	r2, [r10, #38]
-        mvn     tmp_vvv, #0x540              	@ form 0xCAFEBABF
-        bic     tmp_vvv, tmp_vvv, #0x14000
-        bic     tmp_vvv, tmp_vvv, #0x35000000
-	str	istate, [stack, #-76 + ISTATE_SAVED_ISTATE]
-	sub	istate, stack, #76			@ istate == istate
-	mov	r7, istate				@ monitor_base == istate
-	sub	r5, istate, r2, lsl #2
-	str	r5, [tmp1, #THREAD_JAVA_SP]		@ drop stack now
-	sub	r5, r5, #4			@ stack limit = istate - stackwords - 4
-	mov	r3, istate
-	stmdb	stack, {r0, r3, r5, r7, istate, tmp_vvv, ip} @
-
-	str	ip, [istate, #ISTATE_CALLEE]
-	str	ip, [istate, #ISTATE_MDX]
-	str	ip, [istate, #ISTATE_PREV_LINK]
-
-	sub	locals, stack, #4
-	add	locals, locals, r1, lsl #2	@ locals == r7
-
-	ldr	jpc, [r10, #8]			@ jpc == r5
-	ldr	constpool, [r10, #12]			@ 
-
-	sub	stack, istate, #ISTATE_BCP			@ stack == r4
-	str	stack, [istate, #ISTATE_STACK]
-
-	add	jpc, jpc, #48
-
-	ldr	constpool, [constpool, #12]
-
-	str	tmp1, [istate, #ISTATE_THREAD]
-	stmib	istate, {jpc, locals, constpool, r10}
-
-	add	constpool, constpool, #CONST_POOL_OFFSET
-
-	str	stack, [istate, #ISTATE_STACK]
-
-	add	tmp2, istate, #72
-
-	ldr	r3, [tmp1, #THREAD_TOP_ZERO_FRAME]
-	str	r3, [istate, #72]		@ Fill in prev_link
-	ldr	r0, [tmp1, #THREAD_STACK_SIZE]
-	ldr	r3, [tmp1, #THREAD_STACK_BASE]
-	ldr	r2, [tmp1, #THREAD_JAVA_SP]
-	ldr	r1, [tmp1, #THREAD_JAVA_STACK_BASE]
-	rsb	r3, r0, r3
-	DISPATCH_START	0
-	rsb	r2, r1, r2
-	rsb	r3, r3, sp
-	DISPATCH_NEXT
-	cmp	r2, #4096
-	cmpge	r3, #32768
-	DISPATCH_NEXT
-	str	tmp2, [tmp1, #THREAD_TOP_ZERO_FRAME]
-	str	tmp2, [tmp1, #THREAD_LAST_JAVA_SP]
-	DISPATCH_NEXT
-	blt	.throw_stack_overflow
-	DISPATCH_FINISH
-
-	ALIGN_CODE
-native_entry:
-	adrl	ip, dispatch_init_adcon
-	stmfd	sp!, {r3, r4, r5, r7, r9, r10, r11, lr}
- at ---
-	ldmia	ip, {dispatch, r7}
-	mov	r11, r0
-	ldrh	r1, [r11, #42]
-	add	dispatch, dispatch, ip
-	ldr	r4, [r2, #THREAD_JAVA_SP]
-	add	dispatch, dispatch, r7
-	ldr	ip, [r2, #THREAD_TOP_ZERO_FRAME]
-	mov	r0, #0
-	mvn	r10, #0x540		@ form 0xCAFEBABF in r10
-	bic	r10, r10, #0x14000
-	bic	r10, r10, #0x35000000
-	sub	r9, r4, #76
-	mov	r7, r9
-	str	r9, [r2, #THREAD_JAVA_SP]	@ drop stack
-	sub	r5, r9, #4		@ stack limit = r9 - 4
-	mov	r3, r9
-	stmdb	r4, {r0, r3, r5, r7, r9, r10, ip}
-	str	r0, [r9, #ISTATE_CALLEE]
-	str	r0, [r9, #ISTATE_PREV_LINK]
-	str	r0, [r9, #ISTATE_MSG]
-	str	r0, [r9, #ISTATE_MDX]
-	sub	r7, r4, #4
-	add	r7, r7, r1, lsl #2
-	mov	r5, #0
-	ldr	r10, [r11, #12]
-	ldr	r10, [r10, #12]
-	stmia	r9, {r2, r5, r7, r10, r11}
-	add	r0, r9, #72
-	mov	r9, r2
- at ---
-.LPIC18_native_entry:
-	ldr	r2, [r9, #THREAD_STACK_SIZE]
-	ldr	r3, [r9, #THREAD_STACK_BASE]
-	rsb	r3, r2, r3
-	rsb	r3, r3, sp
-	cmp	r3, #4096
-	str	r0, [r9, #THREAD_TOP_ZERO_FRAME]
-	blt	.native_entry_throw_stack_overflow
-	ldr	r5, [r11, #84]
-	cmp	r5, #0
-	bne	.native_entry_got_handleraddr
-	str	r0, [r9, #THREAD_LAST_JAVA_SP]
-	mov	r0, r9
-	mov	r1, r11
-	bl	_ZN18InterpreterRuntime19prepare_native_callEP10JavaThreadP13methodOopDesc
-	ldr	r1, [r9, #THREAD_PENDING_EXC]
-	str	r5, [r9, #THREAD_LAST_JAVA_SP]
-	cmp	r1, #0
-	bne	.native_entry_exception
-	ldr	r5, [r11, #84]
-.native_entry_got_handleraddr:
-	ldr	r2, [dispatch, #InterpreterRuntime_slow_signature_handler_Address-XXX]
-	cmp	r5, r2
-	bne	.native_entry_get_handler
-	ldr	r3, [r9, #THREAD_TOP_ZERO_FRAME]
-	mov	r2, #0
-	mov	r0, r9
-	str	r3, [r9, #THREAD_LAST_JAVA_SP]
-	mov	r3, r2
-	mov	r1, r11
-	bl	_ZN18InterpreterRuntime22slow_signature_handlerEP10JavaThreadP13methodOopDescPiS4_
-	ldr	r1, [r9, #THREAD_PENDING_EXC]
-	mov	r3, #0
-	cmp	r1, #0
-	str	r3, [r9, #THREAD_LAST_JAVA_SP]
-	mov	r5, r0
-	bne	.native_entry_exception
-.native_entry_get_handler:
-
-	sub	ip, r7, r4
-	mov	ip, ip, asr #2
-	add	lr, ip, #4
-	bic	lr, lr, #1
-
-	add	r3, r4, #ISTATE_OOP_TEMP-76
-
-	mov	r4, sp
-	sub	sp, sp, #16
-	sub	sp, sp, lr, lsl #2
-	mov	lr, sp
-
-	add	r1, r5, #24
-
-	add	r2, r9, #THREAD_JNI_ENVIRONMENT
-	str	r2, [lr], #4
-	add	r1, r1, #4
-
-	ldr	r2, [r11, #24]
-	tst	r2, #8
-	beq	.do_copy_args
-
-	ldr	r2, [r11, #12]
-	ldr	r2, [r2, #16]
-	ldr	r2, [r2, #60]
-	str	r2, [r3]
-
-	str	r3, [lr], #4
-	add	r1, r1, #4
-
-.do_copy_args:
-	cmp	ip, #0
-	blt	.no_args
-
-.copy_args:
-	ldr	r0, [r1], #4
-	ldrh	r3, [r0, #6]
-	cmp	r3, #FFI_TYPE_DOUBLE
-	cmpne	r3, #FFI_TYPE_SINT64
-	beq	.copy_long
-
-	cmp	r3, #FFI_TYPE_POINTER
-	beq	.copy_ptr
-
-	ldr	r2, [r7], #-4
-	str	r2, [lr], #4
-	subs	ip, ip, #1
-	bge	.copy_args
-	b	.no_args
-
-.copy_long:
-	tst	lr, #4
-	addne	lr, lr, #4
-	ldmda	r7!, {r2, r3}
-	stmia	lr!, {r2, r3}
-	subs	ip, ip, #2
-	bge	.copy_args
-	b	.no_args
-
-.copy_ptr:
-	ldr	r2, [r7], #-4
-	cmp	r2, #0
-	addne	r2, r7, #4
-	str	r2, [lr], #4
-	subs	ip, ip, #1
-	bge	.copy_args
-
-.no_args:
-	ldr	r0, [r9, #THREAD_TOP_ZERO_FRAME]
-	str	r0, [r9, #THREAD_LAST_JAVA_SP]
-
-	mov	r2, #_thread_in_native
-	str	r2, [r9, #THREAD_STATE]
-
-	ldr	ip, [r11, #80]
-	ldrh	r11, [r11, #42]
-	ldmia	sp!, {r0, r1, r2, r3}
-	blx	ip
-
-	mov	sp, r4
-
-	mov	r3, #_thread_in_native_trans
-	str	r3, [r9, #THREAD_STATE]
-
-.L206_native_entry:
-	ldr	r3, [dispatch, #SafePointSynchronize_state_Address-XXX]
-	ldr	r3, [r3, #0]
-	cmp	r3, #0
-	ldreq	r3, [r9, #THREAD_SUSPEND_FLAGS]
-	cmpeq	r3, #0
-	bne	.native_entry_do_special
-
-.native_entry_do_return:
-	mov	r3, #_thread_in_Java
-	mov	r2, #0
-	str	r3, [r9, #THREAD_STATE]
-	str	r2, [r9, #THREAD_LAST_JAVA_SP]
-
-	add	r2, r5, #24
-	ldr	r3, [r5, #4]
-
-	ldr	r5, [r9, #THREAD_TOP_ZERO_FRAME]
-	ldr	ip, [r5], #4
-	str	ip, [r9, #THREAD_TOP_ZERO_FRAME]
-
-	add	r5, r5, r11, lsl #2
-
-	ldr	ip, [r2, r3, asl #2]
-	ldrh	r2, [ip, #6]
+	ldr	ip, [r0, #12]
+	bne	normal_entry
+	ldr	ip, [ip, #12]
+	orr	r3, r3, r1, lsl #8		@ r3 = index
 
-	cmp	r2, #FFI_TYPE_POINTER
-	beq	.native_return_obj
+	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
 
-	ldr	ip, [r9, #THREAD_ACTIVE_HANDLES]
-	mov	r3, #0			@ ECN: OK, not an obj, save to clear handles
-	str	r3, [ip, #128]
+	cmp	r3, #0
+	beq	normal_entry
 
-	cmp	r2, #FFI_TYPE_VOID
-	beq	.native_return_void
-	cmp	r2, #FFI_TYPE_FLOAT
-	cmpne	r2, #FFI_TYPE_SINT32
-	beq	.native_return_w
-	cmp	r2, #FFI_TYPE_DOUBLE
-	cmpne	r2, #FFI_TYPE_SINT64
-	beq	.native_return_dw
-
-	cmp	r2, #FFI_TYPE_UINT16
-	beq	.native_return_char
-	cmp	r2, #FFI_TYPE_SINT16
-	beq	.native_return_short
-	cmp	r2, #FFI_TYPE_BOOL
-	beq	.native_return_bool
-	cmp	r2, #FFI_TYPE_SINT8
-	beq	.native_return_byte
+	ldr	r0, [r1, #12]
+	ldr	r1, [r1, #8]
+	movs	r0, r0, lsr #29
+	bls	accessor_non_w
 
-	str	r0, [r0, -r0]
+	ldr	r0, [r3, r1]
+	str	r0, [ip, #0]
+	bx	lr
 
-.native_return_obj:
-	cmp	r0, #0
-	ldrne	r0, [r0]
-	str	r0, [r5, #-4]!
-	str	r5, [r9, #THREAD_JAVA_SP]
-	ldr	r2, [r9, #THREAD_ACTIVE_HANDLES]
-	mov	r3, #0			@ ECN: Now that the object is safe on the Java stack
-	str	r3, [r2, #128]		@ stack, with the Thread SP updated, clear the active_handles.
-	ldmfd	sp!, {r3, r4, r5, r7, r9, r10, r11, pc}
-.native_return_short:
-	mov	r0, r0, lsl #16
-	mov	r0, r0, asr #16
-.native_return_w:
-	str	r0, [r5, #-4]!
-.native_return_void:
-	str	r5, [r9, #THREAD_JAVA_SP]
-	ldmfd	sp!, {r3, r4, r5, r7, r9, r10, r11, pc}
-.native_return_dw:
-	stmdb	r5!, {r0, r1}
-	str	r5, [r9, #THREAD_JAVA_SP]
-	ldmfd	sp!, {r3, r4, r5, r7, r9, r10, r11, pc}
-.native_return_byte:
-	mov	r0, r0, lsl #24
-	mov	r0, r0, asr #24
-	str	r0, [r5, #-4]!
-	str	r5, [r9, #THREAD_JAVA_SP]
-	ldmfd	sp!, {r3, r4, r5, r7, r9, r10, r11, pc}
-.native_return_char:
-	mov	r0, r0, lsl #16
-	mov	r0, r0, lsr #16
-	str	r0, [r5, #-4]!
-	str	r5, [r9, #THREAD_JAVA_SP]
-	ldmfd	sp!, {r3, r4, r5, r7, r9, r10, r11, pc}
-.native_return_bool:
-	ands	r0, r0, #255
-	movne	r0, #1
-	str	r0, [r5, #-4]!
-	str	r5, [r9, #THREAD_JAVA_SP]
-	ldmfd	sp!, {r3, r4, r5, r7, r9, r10, r11, pc}
+#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}
 
-.native_entry_throw_stack_overflow:
-	str	r0, [r9, #THREAD_LAST_JAVA_SP]
-	mov	r0, r9
-	bl	_ZN18InterpreterRuntime24throw_StackOverflowErrorEP10JavaThread
-	mov	r3, #0
-	ldr	r1, [r9, #THREAD_PENDING_EXC]
-	str	r3, [r9, #THREAD_LAST_JAVA_SP]
-.native_entry_exception:
-	ldr	r5, [r9, #THREAD_TOP_ZERO_FRAME]
-	ldr	r3, [r5], #4
-	str	r3, [r9, #THREAD_TOP_ZERO_FRAME]
+	ldm	ip, {dispatch, r7}
+	mov	r11, r0
+	add	dispatch, dispatch, ip
+	add	dispatch, dispatch, r7
 
-	ldrh	r3, [r11, #42]
-	add	r5, r5, r3, lsl #2
-	str	r5, [r9, #THREAD_JAVA_SP]
+	mov	istate, #0
 
-	ldmfd	sp!, {r3, r4, r5, r7, r9, r10, r11, pc}
-.native_entry_do_special:
-	stmdb	sp!, {r0, r1}
-	mov	r0, r9
-	bl	_ZN10JavaThread40check_special_condition_for_native_transEPS_
-	ldmia	sp!, {r0, r1}
-	b	.native_entry_do_return
+	b	fast_native_entry_with_args
+#endif
 
+@ tmp1 = thread
+@ tmp2 == method
+@ stack == THREAD_JAVA_SP (=> FULL stack)
 	ALIGN_CODE
 fast_normal_entry:
-	ldrh	r0, [tmp2, #40]
+	mov	tmp_invoke_len, #3
+fast_normal_entry_with_len:
+	ldrh	r0, [tmp2, #METHOD_MAXLOCALS]
 	mov	r1, #0
-	ldrh	r3, [tmp2, #42]
+	ldrh	r3, [tmp2, #METHOD_SIZEOFPARAMETERS]
         mvn     ip, #0x540             @ form 0xCAFEBABF in ip
-	ldrh	r2, [tmp2, #38]
+	ldrh	r2, [tmp2, #METHOD_MAXSTACK]
         bic     ip, ip, #0x35000000
         sub     r7, r0, r3
         subs    r5, r7, #2
@@ -4001,43 +4598,56 @@
         subs    r5, r5, #2
         bcs     1b
 3:
-	ldr	lr, [tmp1, #THREAD_TOP_ZERO_FRAME]
-        str     istate, [stack, #-76 + ISTATE_SAVED_ISTATE]
-        sub     istate, stack, #76                      @ istate == istate
+	ldr	r3, [tmp1, #THREAD_TOP_ZERO_FRAME]
+        sub     istate, stack, #FRAME_SIZE
         sub     r2, istate, r2, lsl #2
-        str     r1, [stack, #-76 + ISTATE_MDX]
-        mov     r7, istate                              @ monitor_base == istate
+        str     tmp_invoke_len, [istate, #ISTATE_ADVANCE_PC]
 	str	r2, [tmp1, #THREAD_JAVA_SP]
         sub     r5, r2, #4                      @ stack limit = istate - stackwords - 4
-        mov     r3, istate
-        stmdb   stack, {r1, r3, r5, r7, istate, ip, lr} @
+	str	r3, [istate, #ISTATE_NEXT_FRAME]
+	str	ip, [istate, #ISTATE_CAFEBABF]
+@	str	istate, [istate, #ISTATE_SELF_LINK]
+	str	istate, [istate, #ISTATE_MONITOR_BASE]
+	str	r5, [istate, #ISTATE_STACK_LIMIT]
+	str	istate, [istate, #ISTATE_STACK_BASE]
         sub     locals, stack, #4
-        add     locals, locals, r0, lsl #2      @ locals == r7
+	str	r1, [istate, #ISTATE_OOP_TEMP]
+        add     locals, locals, r0, lsl #2
         ldr     r3, [tmp1, #THREAD_JAVA_STACK_BASE]
-        sub     stack, istate, #4                       @ stack == r4
-        ldr     jpc, [tmp2, #8]
-        ldr     constpool, [tmp2, #12]                  @
-        str     stack, [istate, #ISTATE_STACK]
-        add     ip, istate, #72
+        sub     stack, istate, #4
+        ldr     jpc, [tmp2, #METHOD_CONSTMETHOD]
+        ldr     constpool, [tmp2, #METHOD_CONSTANTS]
+        add     ip, istate, #ISTATE_NEXT_FRAME
 	DISPATCH_START	48
-	mov	lr, #0				@ ECN: FIXME - r1 already 0
-        ldr     constpool, [constpool, #12]
+        ldr     constpool, [constpool, #CONSTANTPOOL_CACHE]
         str     ip, [tmp1, #THREAD_TOP_ZERO_FRAME]
         rsb     r2, r3, r2
         str     ip, [tmp1, #THREAD_LAST_JAVA_SP]
 	DISPATCH_NEXT
         str     tmp1, [istate, #ISTATE_THREAD]
-        stmib   istate, {jpc, locals, constpool, r10}
+	str	locals, [istate, #ISTATE_LOCALS]
+	str	constpool, [istate, #ISTATE_CONSTANTS]
 	DISPATCH_NEXT
         cmp     r2, #4096
-        add     constpool, constpool, #CONST_POOL_OFFSET
-        str     lr, [istate, #ISTATE_PREV_LINK]
-	blt	.throw_stack_overflow
+	blt	1f
 	DISPATCH_NEXT
-	str	lr, [istate, #ISTATE_CALLEE]
+	DISPATCH_NEXT
+	str	r10, [istate, #ISTATE_METHOD]
+@	mov	lr, #0
+@        str     lr, [istate, #ISTATE_PREV_LINK]
+@	str	lr, [istate, #ISTATE_CALLEE]
 	DISPATCH_FINISH
+1:
+	str	r10, [istate, #ISTATE_METHOD]
+	DECACHE_JPC
+	ldr	stack, [istate, #ISTATE_STACK_BASE]
+	sub	stack, stack, #4
+	DECACHE_STACK
+	b	.throw_stack_overflow
 
 handle_return:
+@	CHECK_CONSTPOOL
+@	CHECK_BACKTRACE
 
 	ldr	tmp2, [istate, #ISTATE_MONITOR_BASE]	@ tmp2 = base
 
@@ -4047,8 +4657,11 @@
 	cmp	tmp1, tmp2
 	blcc	return_check_monitors
 
+@	CHECK_CONSTPOOL
+@	CHECK_BACKTRACE
+
 	mov	r3, #0
-	ldrb	ip, [jpc, #0]
+	ldrb	lr, [jpc, #0]
 
 	ldr	r2, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 	str	r3, [tmp_xxx, #THREAD_LAST_JAVA_SP]
@@ -4058,57 +4671,76 @@
 	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	ip, #opc_lreturn
-	cmpne	ip, #opc_dreturn
+	cmp	lr, #opc_lreturn
+	cmpne	lr, #opc_dreturn
 	ldreq	r0, [stack, #8]
 	streq	r0, [r1, #-4]!
-	cmpne	ip, #opc_ireturn
-	cmpne	ip, #opc_freturn
-	cmpne	ip, #opc_areturn
+	cmpne	lr, #opc_ireturn
+	cmpne	lr, #opc_freturn
+	cmpne	lr, #opc_areturn
 	ldreq	r0, [stack, #4]
 	streq	r0, [r1, #-4]!
 
-	ldr	istate, [istate, #ISTATE_SAVED_ISTATE]
-
 	str	r1, [tmp_xxx, #THREAD_JAVA_SP]
 
-	cmp	istate, #ISTATE_THREAD
+	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
 
-	addeq	sp, sp, #220
-	ldmeqfd	sp!, {regset, pc}
+        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	ip, [istate, #ISTATE_THREAD]
-        ldr     r3, [ip, #THREAD_JAVA_SP]
+        ldr	lr, [istate, #-ISTATE_NEXT_FRAME+ISTATE_THREAD]!
+        CACHE_JPC
+        ldr     stack, [lr, #THREAD_JAVA_SP]
         ldr     r2, [istate, #ISTATE_STACK_LIMIT]
-        sub     r3, r3, #4
-        str     r3, [istate, #ISTATE_STACK]
+        sub     stack, stack, #4
 
-        ldr     r1, [ip, #THREAD_TOP_ZERO_FRAME]
+        ldr     r1, [lr, #THREAD_TOP_ZERO_FRAME]
         add     r2, r2, #4
-        str     r2, [ip, #THREAD_JAVA_SP]
-        str     r1, [ip, #THREAD_LAST_JAVA_SP]
-        ldr     r0, [istate, #ISTATE_THREAD]
-        ldr     stack, [istate, #ISTATE_STACK]
-        ldr     jpc, [istate, #ISTATE_BCP]
-        ldr     r3, [r0, #THREAD_PENDING_EXC]
-        DISPATCH_START	3
-        ldr     constpool, [istate, #ISTATE_CONSTANTS]
-        ldr     locals, [istate, #ISTATE_LOCALS]
+        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
-	add	constpool, constpool, #CONST_POOL_OFFSET
         DISPATCH_NEXT
         cmp     r3, #0
         DISPATCH_NEXT
         bne     return_exception
+	DISPATCH_NEXT
+        CACHE_CP
         DISPATCH_FINISH
 
 normal_return:
-        add   sp, sp, #220
         str   stack, [tmp_xxx, #THREAD_JAVA_SP]
-        ldmfd sp!, {regset, pc}
+        ldmfd arm_sp!, {regset, pc}
 
 return_check_monitors:
 	ldr	r2, [istate, #ISTATE_METHOD]
@@ -4125,13 +4757,17 @@
 	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
-	cmp	tmp1, #0
-	beq	return_throw_illegal_monitor_state
+	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
@@ -4142,38 +4778,43 @@
 	mov	tmp_vvv, lr
 	mov	r1, tmp1
 	mov	r2, tmp2
-	bl	_ZN6Atomic11cmpxchg_ptrEPvPVvS0_
+	bl	cmpxchg_ptr
 	cmp	tmp2, r0
 	bxeq	tmp_vvv
 
 	str	tmp1, [tmp2, #4]
-	add	r0, sp, #144
+	sub	arm_sp, arm_sp, #RETURN_STACKSIZE
+	mov	r0, arm_sp
 	mov	r1, tmp_xxx
 	bl	_ZN10HandleMark10initializeEP6Thread
 	mov	r1, tmp2
 	mov	r0, tmp_xxx
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_JPC
+	DECACHE_STACK
 	bl	_ZN18InterpreterRuntime11monitorexitEP10JavaThreadP15BasicObjectLock
-	ldr	stack, [istate, #ISTATE_STACK]
-	ldr	jpc, [istate, #ISTATE_BCP]
-	add	r0, sp, #144
+	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
-	bx	tmp_vvv
+	mov	lr, tmp_vvv
+	bx	lr
 
 return_throw_illegal_monitor_state:
-	add	r0, sp, #144
+	sub	arm_sp, arm_sp, #RETURN_STACKSIZE
+	mov	r0, arm_sp
 	mov	r1, tmp_xxx
 	bl	_ZN10HandleMark10initializeEP6Thread
-	str	jpc, [istate, #ISTATE_BCP]
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_JPC
+	DECACHE_STACK
 	mov	r0, tmp_xxx
 	bl	_ZN18InterpreterRuntime37throw_illegal_monitor_state_exceptionEP10JavaThread
-	add	r0, sp, #144
+	mov	r0, arm_sp
 	bl	_ZN10HandleMarkD1Ev
+	add	arm_sp, arm_sp, #RETURN_STACKSIZE
 	b	handle_exception_with_bcp
 
 @ ----------------------------------------------------------------------------------------
@@ -4194,10 +4835,10 @@
 	mov	r3, r3, asl #2
 	add	r1, r1, r3
 	str	r1, [ip, #THREAD_JAVA_SP]
-	ldr	istate, [istate, #ISTATE_SAVED_ISTATE]
-	cmp	istate, #ISTATE_THREAD
-	addeq	sp, sp, #220
-	ldmeqfd	sp!, {regset, pc}
+	ldr	ip, [istate, #ISTATE_ADVANCE_PC]
+	ldr	istate, [istate, #ISTATE_NEXT_FRAME]
+	cmp	ip, #0
+	ldmeqfd	arm_sp!, {regset, pc}
 	b	fast_handle_return
 
 handle_exception_do_not_unlock:
@@ -4205,51 +4846,71 @@
 	strb	r3, [r2, #THREAD_DO_NOT_UNLOCK]
 	b	handle_exception
 
+abstractmethod_exception:
+	mov	r0, #VMSYMBOLS_AbstractMethodError
+	b	raise_exception
+incompatibleclass_exception:
+	mov	r0, #VMSYMBOLS_IncompatibleClassChangeError
 raise_exception:
 	adr	r1, null_str
 raise_exception_with_msg:
-	str	r1, [sp]
+	str	r1, [arm_sp]
 	ldr	r3, [dispatch, #VmSymbols_symbols_Address-XXX]
 	ldr	r3, [r3, r0, lsl #2]
-        ldr     tmp1, [istate, #ISTATE_THREAD]
-        str     jpc, [istate, #ISTATE_BCP]
-        str     stack, [istate, #ISTATE_STACK]
+        ldr     r0, [istate, #ISTATE_THREAD]
+	DECACHE_JPC
+        DECACHE_STACK
         mov     ip, #_thread_in_vm
-        str     ip, [tmp1, #THREAD_STATE]
+        str     ip, [r0, #THREAD_STATE]
         mov     r2, #99
-        ldr     r0, [istate, #ISTATE_THREAD]
         adrl    r1, bytecode_interpreter_str
        	bl      _ZN10Exceptions10_throw_msgEP6ThreadPKciP13symbolOopDescS3_
-        mov     r0, sp
-        str     tmp1, [sp]
-       	bl      _ZN18ThreadInVMfromJavaD1Ev
+	add	r0, istate, #ISTATE_THREAD
+       	bl      ThreadInVMfromJavaD
         b       handle_exception_with_bcp
 null_str:
 	.byte	0
 	ALIGN_WORD
 
-invokespecial_exception_fix:
-invokestatic_exception_fix:
-invokevirtual_exception_fix:
+#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:
+invokenative_exception:
 return_exception:
 	sub	jpc, jpc, #3
-invokespecial_exception:
-invokestatic_exception:
-invokevirtual_exception:
+resolve_exception:
 putfield_exception:
 getfield_exception:
 handle_exception:
-	str	jpc, [istate, #ISTATE_BCP]
+@ jpc = Exception PC
+@ stack = garbage
+@ locals = garbage
+@ constpool = garbage
+	DECACHE_JPC
 handle_exception_with_bcp:
+	sub	except_sp, except_sp, #EXCEPTION_STACKSIZE
 	ldr	stack, [istate, #ISTATE_STACK_BASE]
 	sub	stack, stack, #4
-	str	stack, [istate, #ISTATE_STACK]
-	add	r1, sp, #168
-	str	r1, [sp, #36]
+	DECACHE_STACK
 	ldr	r0, [istate, #ISTATE_THREAD]
 handle_exception_1:
 	ldr	sl, [r0, #4]
-	str	r0, [sp, #124]
+	str	r0, [except_sp, #EXCEPTION_THREAD]
 	cmp	sl, #0
 	moveq	tmp_yyy, sl
 	beq	.handle_exception_3
@@ -4270,7 +4931,7 @@
 	ldr	r0, [istate, #ISTATE_THREAD]
 .handle_exception_3:
 	mov	r1, r0
-	ldr	r0, [sp, #36]
+	add	r0, except_sp, #EXCEPTION_HANDLEMARK
 	bl	_ZN10HandleMark10initializeEP6Thread
 	ldr	r0, [istate, #ISTATE_THREAD]
 	bl	_ZN12ThreadShadow23clear_pending_exceptionEv
@@ -4279,18 +4940,18 @@
 	cmp	tmp_yyy, #0
 	sub	stack, r1, #4
 	moveq	r1, tmp_yyy
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_STACK
 	ldrne	r1, [tmp_yyy, #0]
 	bl	_ZN18InterpreterRuntime31exception_handler_for_exceptionEP10JavaThreadP7oopDesc
-	ldr	stack, [istate, #ISTATE_STACK]
+	ASSERT_STACK_CACHED
 	mov	sl, r0
 	ldr	r0, [istate, #ISTATE_THREAD]
 	ldr	r3, [r0, #THREAD_PENDING_EXC]
 	cmp	r3, #0
 	beq	.handle_exception_5
-	ldr	r0, [sp, #36]
+	add	r0, except_sp, #EXCEPTION_HANDLEMARK
 	bl	_ZN10HandleMarkD1Ev
-	ldr	r1, [sp, #124]
+	ldr	r1, [except_sp, #EXCEPTION_THREAD]
 	ldr	tmp_yyy, [r1, #THREAD_LAST_HANDLE_MARK]
 	ldr	r0, [tmp_yyy, #8]
 	ldr	sl, [tmp_yyy, #4]
@@ -4341,13 +5002,13 @@
 	str	r0, [stack, #0]
 	sub	stack, stack, #4
 	ldr	r3, [istate, #ISTATE_METHOD]
-	ldr	r0, [sp, #36]
+	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, [sp, #124]
+	ldr	r1, [except_sp, #EXCEPTION_THREAD]
 	ldr	tmp_yyy, [r1, #THREAD_LAST_HANDLE_MARK]
 	ldr	r0, [tmp_yyy, #8]
 	ldr	sl, [tmp_yyy, #4]
@@ -4362,6 +5023,7 @@
 	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
@@ -4373,7 +5035,7 @@
 	ldr	r0, [istate, #ISTATE_THREAD]
 	ldr	tmp_yyy, [r0, #4]
 	cmp	tmp_yyy, #0
-	streq	tmp_yyy, [sp, #48]
+	streq	tmp_yyy, [except_sp, #EXCEPTION_EXCEPTION]
 	beq	.handle_exception_11
 	ldr	r0, [r0, #THREAD_HANDLE_AREA]
 	ldr	r1, [r0, #8]
@@ -4389,19 +5051,19 @@
 .handle_exception_10:
 	str	tmp_yyy, [r3, #0]
 	ldr	r0, [istate, #ISTATE_THREAD]
-	str	r3, [sp, #48]
+	str	r3, [except_sp, #EXCEPTION_EXCEPTION]
 .handle_exception_11:
 	bl	_ZN12ThreadShadow23clear_pending_exceptionEv
 	mov	r1, #0
 	ldr	r0, [istate, #ISTATE_THREAD]
-	str	r1, [sp, #44]
+	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, [sp, #48]
+	ldr	r1, [except_sp, #EXCEPTION_EXCEPTION]
 	cmp	r1, #0
 	movne	r2, r1
 	ldrne	r1, [r2, #0]
@@ -4412,7 +5074,7 @@
 	mov	r3, #0
 	ldr	r2, [istate, #ISTATE_BCP]
 	ldrb	r2, [r2, #0]	@ zero_extendqisi2
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_STACK
 	str	r2, [istate, #ISTATE_CALLEE]
 	ldr	lr, [istate, #ISTATE_THREAD]
 	ldr	r1, [lr, #THREAD_TOP_ZERO_FRAME]
@@ -4423,12 +5085,12 @@
 	str	r3, [lr, #THREAD_TOP_ZERO_FRAME]
 	ldr	r1, [istate, #ISTATE_METHOD]
 	ldrh	r3, [r1, #40]
-	ldr	r0, [sp, #36]
+	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, [sp, #124]
+	ldr	r0, [except_sp, #EXCEPTION_THREAD]
 	ldr	tmp_yyy, [r0, #THREAD_LAST_HANDLE_MARK]
 	ldr	r0, [tmp_yyy, #8]
 	ldr	sl, [tmp_yyy, #4]
@@ -4443,29 +5105,27 @@
 	str	r3, [sl, #8]
 	ldr	r2, [tmp_yyy, #16]
 	str	r2, [sl, #12]
-	ldr	istate, [istate, #ISTATE_SAVED_ISTATE]
-	cmp	istate, #ISTATE_THREAD
+	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
-	add	sp, sp, #220
-	ldmfd	sp!, {regset, pc}
+	ldmfd	arm_sp!, {regset, pc}
 .handle_exception_15:
 	ldr	ip, [istate, #ISTATE_MONITOR_BASE]
 	ldr	r2, [istate, #ISTATE_METHOD]
-	str	ip, [sp, #92]
+	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, [sp, #92]
-	ldr	lr, [sp, #92]
-	str	r3, [sp, #96]
+	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
-	add	r0, sp, #144
-	add	r1, sp, #212
-	str	r0, [sp, #28]
-	str	r1, [sp, #24]
+
 	.p2align 3
 .handle_exception_16:
 	ldr	tmp_yyy, [tmp_vvv, #4]
@@ -4493,33 +5153,33 @@
 	cmp	tmp_vvv, sl
 	beq	.handle_exception_19
 	str	tmp_yyy, [tmp_vvv, #4]
-	ldr	r0, [sp, #28]
+	add	r0, except_sp, #EXCEPTION_HANDLEMARK2
 	ldr	r1, [istate, #ISTATE_THREAD]
 	bl	_ZN10HandleMark10initializeEP6Thread
 	mov	r1, tmp_vvv
 	ldr	r0, [istate, #ISTATE_THREAD]
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_STACK
 	bl	_ZN18InterpreterRuntime11monitorexitEP10JavaThreadP15BasicObjectLock
-	ldr	stack, [istate, #ISTATE_STACK]
-	ldr	r0, [sp, #28]
+	ASSERT_STACK_CACHED
+	add	r0, except_sp, #EXCEPTION_HANDLEMARK2
 	bl	_ZN10HandleMarkD1Ev
 .handle_exception_19:
-	ldr	r1, [sp, #44]
+	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, [sp, #92]
+	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, [sp, #96]
+	ldr	ip, [except_sp, #EXCEPTION_TMP1]
 	cmp	ip, #0
 	beq	.handle_exception_23
-	ldr	r0, [sp, #92]
+	ldr	r0, [except_sp, #EXCEPTION_MONITORBASE]
 	ldr	sl, [r0, #4]
 	cmp	sl, #0
 	beq	.handle_exception_26
@@ -4530,33 +5190,33 @@
 	str	r3, [ip, #4]
 	beq	.handle_exception_23
 	mov	r1, sl
-	ldr	r2, [sp, #92]
-	bl	_ZN6Atomic11cmpxchg_ptrEPvPVvS0_
-	ldr	r1, [sp, #92]
+	ldr	r2, [except_sp, #EXCEPTION_MONITORBASE]
+	bl	cmpxchg_ptr
+	ldr	r1, [except_sp, #EXCEPTION_MONITORBASE]
 	cmp	r1, r0
 	beq	.handle_exception_22
-	ldr	r3, [sp, #92]
-	add	tmp_yyy, sp, #144
+	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, [sp, #92]
+	ldr	r1, [except_sp, #EXCEPTION_MONITORBASE]
 	ldr	r0, [istate, #ISTATE_THREAD]
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_STACK
 	bl	_ZN18InterpreterRuntime11monitorexitEP10JavaThreadP15BasicObjectLock
 	mov	r0, tmp_yyy
-	ldr	stack, [istate, #ISTATE_STACK]
+	ASSERT_STACK_CACHED
 	bl	_ZN10HandleMarkD1Ev
 	ldr	r0, [istate, #ISTATE_THREAD]
 	ldr	r1, [r0, #4]
 	cmp	r1, #0
 	beq	.handle_exception_24
-	add	r0, sp, #204
-	bl	_ZN6HandleC1EP7oopDesc
-	ldr	r1, [sp, #204]
+	add	r0, except_sp, #EXCEPTION_HANDLE2
+	bl	HandleC
+	ldr	r1, [except_sp, #EXCEPTION_HANDLE2]
 	ldr	r0, [istate, #ISTATE_THREAD]
-	str	r1, [sp, #44]
+	str	r1, [except_sp, #EXCEPTION_EXCEPTION2]
 	bl	_ZN12ThreadShadow23clear_pending_exceptionEv
 .handle_exception_22:
 	ldr	r0, [istate, #ISTATE_THREAD]
@@ -4564,17 +5224,17 @@
 .handle_exception_23:
 	ldr	r0, [istate, #ISTATE_THREAD]
 .handle_exception_24:
-	ldr	r3, [sp, #44]
+	ldr	r3, [except_sp, #EXCEPTION_EXCEPTION2]
 	cmp	r3, #0
 	beq	.handle_exception_12
 .handle_exception_25:
-	ldr	lr, [sp, #44]
+	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, [sp, #44]
+	ldr	r1, [except_sp, #EXCEPTION_EXCEPTION2]
 	cmp	r1, #0
 	beq	.handle_exception_29
 	ldr	r3, [r1, #0]
@@ -4584,66 +5244,54 @@
 	b	.handle_exception_25
 
 .handle_exception_27:
-	ldr	r0, [sp, #28]
+	add	r0, except_sp, #EXCEPTION_HANDLEMARK2
 	ldr	r1, [istate, #ISTATE_THREAD]
 	bl	_ZN10HandleMark10initializeEP6Thread
 	ldr	r0, [istate, #ISTATE_THREAD]
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_STACK
 	bl	_ZN18InterpreterRuntime37throw_illegal_monitor_state_exceptionEP10JavaThread
-	ldr	r0, [sp, #28]
-	ldr	stack, [istate, #ISTATE_STACK]
+	add	r0, except_sp, #EXCEPTION_HANDLEMARK2
+	ASSERT_STACK_CACHED
 	bl	_ZN10HandleMarkD1Ev
-	ldr	r0, [sp, #24]
+	add	r0, except_sp, #EXCEPTION_HANDLE
 	ldr	r3, [istate, #ISTATE_THREAD]
 	ldr	r1, [r3, #4]
-	bl	_ZN6HandleC1EP7oopDesc
-	ldr	r2, [sp, #212]
+	bl	HandleC
+	ldr	r2, [except_sp, #EXCEPTION_HANDLE]
 	ldr	r0, [istate, #ISTATE_THREAD]
-	str	r2, [sp, #44]
+	str	r2, [except_sp, #EXCEPTION_EXCEPTION2]
 	bl	_ZN12ThreadShadow23clear_pending_exceptionEv
 	b	.handle_exception_20
-.handle_exception_28:
-	mov	r1, fp
-	str	stack, [istate, #ISTATE_STACK]
-	ldr	r0, [istate, #ISTATE_THREAD]
-	bl	_ZN18InterpreterRuntime12monitorenterEP10JavaThreadP15BasicObjectLock
-	ldr	r0, [istate, #ISTATE_THREAD]
-	ldr	stack, [istate, #ISTATE_STACK]
-	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
 .handle_exception_29:
-	add	tmp_yyy, sp, #144
+	add	tmp_yyy, except_sp, #EXCEPTION_HANDLEMARK2
 	mov	r0, tmp_yyy
 	ldr	r1, [istate, #ISTATE_THREAD]
 	bl	_ZN10HandleMark10initializeEP6Thread
 	ldr	r0, [istate, #ISTATE_THREAD]
-	str	stack, [istate, #ISTATE_STACK]
+	DECACHE_STACK
 	bl	_ZN18InterpreterRuntime37throw_illegal_monitor_state_exceptionEP10JavaThread
 	mov	r0, tmp_yyy
-	ldr	stack, [istate, #ISTATE_STACK]
+	ASSERT_STACK_CACHED
 	bl	_ZN10HandleMarkD1Ev
 	ldr	r3, [istate, #ISTATE_THREAD]
-	add	r0, sp, #208
+	add	r0, except_sp, #EXCEPTION_HANDLE3
 	ldr	r1, [r3, #4]
-	bl	_ZN6HandleC1EP7oopDesc
-	ldr	r2, [sp, #208]
+	bl	HandleC
+	ldr	r2, [except_sp, #EXCEPTION_HANDLE3]
 	ldr	r0, [istate, #ISTATE_THREAD]
-	str	r2, [sp, #44]
+	str	r2, [except_sp, #EXCEPTION_EXCEPTION2]
 	bl	_ZN12ThreadShadow23clear_pending_exceptionEv
 	ldr	r0, [istate, #ISTATE_THREAD]
 	b	.handle_exception_24
-opclabels_data_adcon:
-	.word	opclabels_data(GOTOFF)
+
+#ifdef FASTPATH_ENTRY
 
 	ALIGN_CODE
 fast_accessor_entry:
 	ldr	ip, [dispatch, #SafePointSynchronize_state_Address-XXX]
 	ldr	r3, [tmp2, #8]
 	ldr	ip, [ip, #0]
-	ldrb	lr, [r3, #50]
+	ldrb	r2, [r3, #50]
 	ldrb	r3, [r3, #51]
 	cmp	ip, #0
 	ldr	ip, [tmp2, #12]
@@ -4652,28 +5300,28 @@
 
 	DISPATCH_START	3
 
-	orr	lr, lr, r3, lsl #8		@ lr = index
+	orr	r2, r2, r3, lsl #8		@ r2 = index
 	add	r3, ip, #16
-	ldr	lr, [r3, lr, lsl #4]!		@ r3 = cache, lr = flags
+	ldr	r2, [r3, r2, lsl #4]!		@ r3 = cache, r2 = flags
 
 	DISPATCH_NEXT
 
-	cmp	lr, #180 << 16
-	GET_STACK	0, lr
+	cmp	r2, #opc_getfield << 16
+	GET_STACK	0, r2
 	bne	fast_normal_entry
 
-	cmp	lr, #0
+	cmp	r2, #0
 	beq	fast_normal_entry
 
 
-	ldr	r2, [r3, #12]
+	ldr	lr, [r3, #12]
 	ldr	r3, [r3, #8]
-	movs	r2, r2, lsr #29
+	movs	lr, lr, lsr #29
 	bls	.fast_accessor_non_w
 
 	DISPATCH_NEXT
 
-	ldr	tmp1, [lr, r3]
+	ldr	tmp1, [r2, r3]
 
 	DISPATCH_NEXT
 	DISPATCH_NEXT
@@ -4685,12 +5333,12 @@
 .fast_accessor_non_w:
 	bcs	.fast_accessor_h
 	beq	.fast_accessor_sb
-	tst	r2, #2
+	tst	lr, #2
 	bne	.fast_accessor_dw
 .fast_accessor_sh:
 	DISPATCH_STATE	2
 	DISPATCH_NEXT
-	ldrsh	tmp1, [lr, r3]
+	ldrsh	tmp1, [r2, r3]
 	DISPATCH_NEXT
 	DISPATCH_NEXT
 	PUT_STACK	0, tmp1
@@ -4698,7 +5346,7 @@
 .fast_accessor_h:
 	DISPATCH_STATE	2
 	DISPATCH_NEXT
-	ldrh	tmp1, [lr, r3]
+	ldrh	tmp1, [r2, r3]
 	DISPATCH_NEXT
 	DISPATCH_NEXT
 	PUT_STACK	0, tmp1
@@ -4706,14 +5354,14 @@
 .fast_accessor_sb:
 	DISPATCH_STATE	2
 	DISPATCH_NEXT
-	ldrsb	tmp1, [lr, r3]
+	ldrsb	tmp1, [r2, r3]
 	DISPATCH_NEXT
 	DISPATCH_NEXT
 	PUT_STACK	0, tmp1
 	DISPATCH_FINISH
 .fast_accessor_dw:
 	DISPATCH_STATE	2
-	add	tmp1, lr, r3
+	add	tmp1, r2, r3
 	DISPATCH_NEXT
 	ldm	tmp1, {tmp2, tmp1}
 	DISPATCH_NEXT
@@ -4722,12 +5370,12 @@
 	PUSH	tmp2
 	DISPATCH_FINISH
 
-.iconst_div_rem_0:
+#endif // FASTPATH_ENTRY
+
+div_zero_jpc_1:
 	sub	jpc, jpc, #1			@ Point to idiv
 .lrem_0:
 .ldiv_0:
-.remc_0:
-.divc_0:
 divide_by_zero_exception:
 	mov	r0, #VMSYMBOLS_ArithmeticException
 	adr	r1, div_zero_msg
@@ -4761,11 +5409,26 @@
 array_bound_exception_jpc_0:
 array_bounds_exception:
 	adr	r1, percent_d_str
-	add	r0, sp, #168
+	sub	arm_sp, arm_sp, #16
+	add	r0, arm_sp, #4
 	bl	sprintf
-	add	r1, sp, #168
+	add	r1, arm_sp, #4
 	mov	r0, #VMSYMBOLS_ArrayIndexOutOfBounds
-	b	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]
+	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
+        b       handle_exception_with_bcp
 percent_d_str:
 	.ascii	"%d\000"
 	ALIGN_WORD
@@ -4787,6 +5450,133 @@
 	mov	r0, #VMSYMBOLS_NullPointerException
 	b	raise_exception
 
+@ ==== SW FP ==============================================================================
+
+	Opcode	fadd
+	POP	r0, r1
+        bl      __aeabi_fadd
+	PUSH	r0
+	DISPATCH	1
+
+	Opcode	fsub
+	POP	r1
+	POP	r0
+        bl      __aeabi_fsub
+	PUSH	r0
+	DISPATCH	1
+
+	Opcode	fmul
+	POP	r0, r1
+        bl      __aeabi_fmul
+	PUSH	r0
+	DISPATCH	1
+
+	Opcode	fdiv
+	POP	r1
+	POP	r0
+        bl      __aeabi_fdiv
+	PUSH	r0
+	DISPATCH	1
+
+	Opcode	ddiv
+	POP	r2, r3
+	POP	r0, r1
+        bl      __aeabi_ddiv
+	PUSH	r0, r1
+	DISPATCH	1
+
+	Opcode	fcmpl
+        ldmib   stack, {r0, r1}
+        bl      __aeabi_fcmpgt
+        cmp     r0, #0
+        movne   r3, #-1
+        bne     3f
+        ldmib   stack, {r0, r1}
+        bl      __aeabi_fcmplt
+        cmp     r0, #0
+        movne   r3, #1
+        bne     3f
+        ldmib   stack, {r0, r1}
+        bl      __aeabi_fcmpeq
+        cmp     r0, #0
+        movne   r3, #0
+        moveq   r3, #-1
+3:
+	DISPATCH_START	1
+	add	stack, stack, #8
+	DISPATCH_NEXT
+	PUSH	r3
+	DISPATCH_FINISH
+
+	Opcode	fcmpg
+        ldmib   stack, {r0, r1}
+        bl      __aeabi_fcmpgt
+        cmp     r0, #0
+        movne   r3, #-1
+        bne     4f
+        ldmib   stack, {r0, r1}
+        bl      __aeabi_fcmplt
+        cmp     r0, #0
+        movne   r3, #1
+        bne     4f
+        ldmib   stack, {r0, r1}
+        bl      __aeabi_fcmpeq
+        cmp     r0, #0
+        movne   r3, #0
+        moveq   r3, #1
+4:
+	DISPATCH_START	1
+	add	stack, stack, #8
+	DISPATCH_NEXT
+	PUSH	r3
+	DISPATCH_FINISH
+
+	Opcode	dcmpl
+        ldmib   stack, {r0, r1, r2, r3}
+        bl      __aeabi_dcmpgt
+        cmp     r0, #0
+        movne   r3, #-1
+        bne     5f
+        ldmib   stack, {r0, r1, r2, r3}
+        bl      __aeabi_dcmplt
+        cmp     r0, #0
+        movne   r3, #1
+        bne     5f
+        ldmib   stack, {r0, r1, r2, r3}
+        bl      __aeabi_dcmpeq
+        cmp     r0, #0
+        movne   r3, #0
+        moveq   r3, #-1
+5:
+	DISPATCH_START	1
+	add	stack, stack, #16
+	DISPATCH_NEXT
+	PUSH	r3
+	DISPATCH_FINISH
+
+	Opcode	dcmpg
+        ldmib   stack, {r0, r1, r2, r3}
+        bl      __aeabi_dcmpgt
+        cmp     r0, #0
+        movne   r3, #-1
+        bne     6f
+        ldmib   stack, {r0, r1, r2, r3}
+        bl      __aeabi_dcmplt
+        cmp     r0, #0
+        movne   r3, #1
+        bne     6f
+        ldmib   stack, {r0, r1, r2, r3}
+        bl      __aeabi_dcmpeq
+        cmp     r0, #0
+        movne   r3, #0
+        moveq   r3, #1
+6:
+	DISPATCH_START	1
+	add	stack, stack, #16
+	DISPATCH_NEXT
+	PUSH	r3
+	DISPATCH_FINISH
+
 @ ==== Fast SW FP emulation ===============================================================
 
 #define al		r0
@@ -4801,7 +5591,7 @@
 @ What we actually do is TOS = TOS + TOSM1
 @ --- do_dadd_vtos -------------------------------------------------
 	Opcode	dadd
-	POP4	al, ah, bl, bh
+	POP	al, ah, bl, bh
 	mov	tmp, #0xff000000
 	orr	tmp, tmp, #0x00e00000
         bics    ex_add, tmp, ah, LSL #1
@@ -4893,7 +5683,7 @@
 	orr	ah, ah, #0x00f00000
 	orr	ah,ah,a3
 .dadd_exit:
-	PUSH2	al, ah
+	PUSH	al, ah
 	DISPATCH	1
 
 .dadd_uncommon:
@@ -4937,7 +5727,7 @@
 @ ECN: We want TOSM1 - TOS, but args end up in wrong order so do rsb
 @ --- do_dsub_itos -------------------------------------------------
 	Opcode	dsub
-	POP4	al, ah, bl, bh
+	POP	al, ah, bl, bh
         mov     tmp, #0xff000000
         orr     tmp, tmp, #0x00e00000
         bics    ex_add, tmp, ah, LSL #1
@@ -5039,7 +5829,7 @@
         add     ah, ah, ex_add, LSL #20
 .dsub_return1:
 .dsub_exit:
-	PUSH2	al, ah
+	PUSH	al, ah
 	DISPATCH	1
 .dsub_ex_one:    @ underflow when ex = 1 - shift back to denorm
         movs    ah, ah, ASR #1
@@ -5203,8 +5993,8 @@
 
 @ --- do_dmul_itos -------------------------------------------------
 	Opcode	dmul
-	POP4	al, ah, bl, bh
-	stmdb	sp!, {r4, r5}
+	POP	al, ah, bl, bh
+	stmdb	arm_sp!, {r4, r5}
 	mov	tmp, #0x7f00000
 	orr	tmp, tmp, #0x00f0000
         bics    ex_m, tmp, ah, LSR #4     @ test for Infs or NaNs
@@ -5270,8 +6060,8 @@
         bicnes  uh, uh, ah            @ is exp 0 or 7FF?
         beq     .dmul_outflow
 .dmul_exit:
-	ldmia	sp!, {r4, r5}
-	PUSH2	al, ah
+	ldmia	arm_sp!, {r4, r5}
+	PUSH	al, ah
 	DISPATCH	1
 
 .dmul_rdirect:
@@ -5289,7 +6079,7 @@
         addle   ah, ah, #0x60000000 @ Bias up if underflow
         subge   ah, ah, #0x60000000 @ Bias down if overflow
 	mov	ip, rs
-	ldmia	sp!, {r4, r5}
+	ldmia	arm_sp!, {r4, r5}
         ble     .__dunder                @ underflow
 	b	.return_double_Inf
 
@@ -5405,7 +6195,7 @@
 	b	.dmul_exit
 
 .dmul_ivo:
-	ldmia	sp!, {r4, r5}
+	ldmia	arm_sp!, {r4, r5}
 	b	.return_double_NaN
 
 #undef al
@@ -5433,8 +6223,9 @@
 	.global	_ZN14CppInterpreter17ignore_safepointsEv
 	.type	_ZN14CppInterpreter17ignore_safepointsEv, %function
 _ZN14CppInterpreter17ignore_safepointsEv:
+#ifdef NOTICE_SAFEPOINTS
 	adrl	ip, dispatch_init_adcon
-	ldmia	ip, {r2, r3}
+	ldm	ip, {r2, r3}
 	add	r2, r2, ip
 	add	ip, r3, r2
 	ldr	r2, [ip, #AbstractInterpreter_notice_safepoints-XXX]
@@ -5450,15 +6241,22 @@
 	str	r1, [ip], #4
 	subs	r2, r2, #1
 	bne	1b
-
+#ifdef HW_FP
+	sub	ip, ip, #256*4
+	ldr	r0, [ip, #VFP_Flag-XXX]
+	cmp	r0, #0
+	beq	update_vfp_table
+#endif // HW_FP
+#endif // NOTICE_SAFEPOINTS
 	bx	lr
 
 @ --- notice_safepoints ---------------------------------------------------------------------------
 	.global	_ZN14CppInterpreter17notice_safepointsEv
 	.type	_ZN14CppInterpreter17notice_safepointsEv, %function
 _ZN14CppInterpreter17notice_safepointsEv:
+#ifdef NOTICE_SAFEPOINTS
 	adrl	ip, dispatch_init_adcon
-	ldmia	ip, {r2, r3}
+	ldm	ip, {r2, r3}
 	add	r2, r2, ip
 	add	ip, r3, r2
 	ldr	r2, [ip, #AbstractInterpreter_notice_safepoints-XXX]
@@ -5474,17 +6272,18 @@
 	str	r1, [ip], #4
 	subs	r2, r2, #1
 	bne	1b
-
+#endif
 	bx	lr
 
 @ --- END execute.s ----------------------------------------------------------------------------
 
+	ALIGN_CODE
 bci_init:
-	adr	r3, dispatch_init_adcon
-	ldmia	r3, {r0, r1}
+	adrl	r3, dispatch_init_adcon
+	ldm	r3, {r0, r1}
 	add	r0, r0, r3
 	add	r1, r1, r0
-	adr	r2, adcon_init_table
+	adrl	r2, adcon_init_table
 	mov	r3, r1
 1:
 	ldr	ip, [r2], #4
@@ -5492,7 +6291,7 @@
 	ldrne	ip, [r0, ip]
 	strne	ip, [r1, #-4]!
 	bne	1b
-	adr	r2, main_dispatch_table
+	adrl	r2, main_dispatch_table
 	mov	r1, #256
 2:
 	ldr	ip, [r2], #4
@@ -5500,8 +6299,88 @@
 	subs	r1, r1, #1
 	bne	2b
 
+#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
+
+@ No HW FP - replace the HW FP entries with SW entries
+update_vfp_table:
+	adr	r0, vfp_table
+	adrl	ip, dispatch_init_adcon
+	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
+#endif // HW_FP
+
 	bx	lr
 
+#ifdef HW_FP
+vfp_table:
+	.word	opc_fadd,	do_fadd
+	.word	opc_dadd,	do_dadd
+	.word	opc_fsub,	do_fsub
+	.word	opc_dsub,	do_dsub
+	.word	opc_fmul,	do_fmul
+	.word	opc_dmul,	do_dmul
+	.word	opc_fdiv,	do_fdiv
+	.word	opc_ddiv,	do_ddiv
+	.word	opc_fcmpl,	do_fcmpl
+	.word	opc_fcmpg,	do_fcmpg
+	.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
+
 	ALIGN_DATA
 dispatch_init_adcon:
 	.word	_GLOBAL_OFFSET_TABLE_-dispatch_init_adcon, opclabels_data(GOTOFF)
@@ -5510,18 +6389,23 @@
 	.word	_ZN20SafepointSynchronize6_stateE(GOT)
 	.word	_ZN9vmSymbols8_symbolsE(GOT)
 	.word	always_do_update_barrier(GOT)
-	.word	UseBiasedLocking(GOT)
 	.word	_ZN8Universe14_collectedHeapE(GOT)
-	.word	ZeroTLAB(GOT)
-	.word	UseTLAB(GOT)
 	.word	_ZN9Bytecodes5_nameE(GOT)
 	.word	_ZN19AbstractInterpreter18_notice_safepointsE(GOT)
 	.word	_ZN18ThreadLocalStorage13_thread_indexE(GOT)
+	.word	_ZN7oopDesc3_bsE(GOT)
+	.word	PrintCommandLineFlags(GOT)
+	.word	_ZN11JvmtiExport28_can_post_interpreter_eventsE(GOT)
+	.word	UseCompiler(GOT)
 	.word	0
 
 	ALIGN_DATA
 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
 	.word	do_u4const_0
@@ -5676,31 +6560,31 @@
 	.word	do_fcmpg
 	.word	do_dcmpl
 	.word	do_dcmpg
-	.word	do_ifeq_safe
-	.word	do_ifne_safe
-	.word	do_iflt_safe
-	.word	do_ifge_safe
-	.word	do_ifgt_safe
-	.word	do_ifle_safe
-	.word	do_if_icmpeq_safe
-	.word	do_if_icmpne_safe
-	.word	do_if_icmplt_safe
-	.word	do_if_icmpge_safe
-	.word	do_if_icmpgt_safe
-	.word	do_if_icmple_safe
-	.word	do_if_icmpeq_safe
-	.word	do_if_icmpne_safe
-	.word	do_goto_safe
+	.word	do_ifeq
+	.word	do_ifne
+	.word	do_iflt
+	.word	do_ifge
+	.word	do_ifgt
+	.word	do_ifle
+	.word	do_if_icmpeq
+	.word	do_if_icmpne
+	.word	do_if_icmplt
+	.word	do_if_icmpge
+	.word	do_if_icmpgt
+	.word	do_if_icmple
+	.word	do_if_icmpeq
+	.word	do_if_icmpne
+	.word	do_goto
 	.word	do_jsr
 	.word	do_ret
 	.word	do_tableswitch
 	.word	do_lookupswitch
-	.word	do_ireturn_safe
-	.word	do_lreturn_safe
-	.word	do_ireturn_safe
-	.word	do_lreturn_safe
-	.word	do_ireturn_safe
-	.word	do_return_safe
+	.word	do_ireturn
+	.word	do_lreturn
+	.word	do_ireturn
+	.word	do_lreturn
+	.word	do_ireturn
+	.word	do_return
 	.word	do_getstatic
 	.word	do_putstatic
 	.word	do_getfield
@@ -5721,8 +6605,8 @@
 	.word	do_monitorexit
 	.word	do_wide
 	.word	do_multianewarray
-	.word	do_ifeq_safe
-	.word	do_ifne_safe
+	.word	do_ifeq
+	.word	do_ifne
 	.word	do_goto_w
 	.word	do_jsr_w
 	.word	do_breakpoint
@@ -5746,12 +6630,12 @@
 	.word	do_iaccess_0
 	.word	do_iaccess_0
 	.word	do_iaccess_0
-	.word	do_undefined
-	.word	do_undefined
-	.word	do_undefined
+	.word	do_invokeresolved
+	.word	do_invokespecialresolved
+	.word	do_invokestaticresolved
 	.word	do_invokevfinal
-	.word	do_undefined
-	.word	do_undefined
+	.word	do_fast_iload_iload
+	.word	do_fast_iload_iload_N
 	.word	do_return_register_finalizer
 	.word	do_undefined
 	.word	do_iload_0_iconst_N
@@ -5759,7 +6643,6 @@
 	.word	do_iload_0_iconst_N
 	.word	do_iload_0_iconst_N
 	.word	do_iload_iconst_N
-	.word	do_invokeresolved
 	.word	do_iadd_istore_N
 	.word	do_isub_istore_N
 	.word	do_iand_istore_N
@@ -5770,15 +6653,17 @@
 	.word	do_iand_u4store
 	.word	do_ior_u4store
 	.word	do_ixor_u4store
-	.word	do_invokespecialresolved
-	.word	do_invokestaticresolved
-	.word	do_undefined
-	.word	do_undefined
-	.word	do_undefined
-	.word	do_undefined
-	.word	do_undefined
+	.word	do_fast_iload_N_iload
+	.word	do_fast_iload_N_iload
+	.word	do_fast_iload_N_iload
+	.word	do_fast_iload_N_iload
+	.word	do_fast_iload_N_iload_N
+	.word	do_fast_iload_N_iload_N
+	.word	do_fast_iload_N_iload_N
+	.word	do_fast_iload_N_iload_N
 	.word	do_undefined
 	.word	do_undefined
+#endif
 
 	SUB_DISPATCH_TABLES
 
@@ -5787,14 +6672,22 @@
 
 	.data
 	ALIGN_DATA
-	.word	0, 0, 0, 0, 0
+#ifdef CODETRACE
+CodeTrace_Buffer_Base:
+	.space	CODETRACE_BUFFER_SIZE
+#endif
+	.word	0
+DispatchBreakPoint:					.word	0
+VFP_Flag:						.word	0
+CodeTrace_Idx:						.word	0
+UseCompiler_Address:					.word	0
+can_post_interpreter_events:				.word	0
+PrintCommandLineFlags_Address:				.word	0
+oopDesc_Address:					.word	0
 ThreadLocalStorage_thread_index:			.word	0
 AbstractInterpreter_notice_safepoints:			.word	0
 Bytecodes_name_Address:					.word	0
-UseTLAB_Address:					.word	0
-ZeroTLAB_Address:					.word	0
 Universe_collectedHeap_Address:				.word	0
-UseBiasedLocking_Address:				.word	0
 always_do_update_barrier_Address:			.word	0
 VmSymbols_symbols_Address:				.word	0
 SafePointSynchronize_state_Address:			.word	0
@@ -5817,4 +6710,4 @@
 	.word	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 	.word	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 	.word	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-#endif // HOTSPOT_ASM
+#endif



More information about the distro-pkg-dev mailing list