ARM asm improvements - part 2

Edward Nevill ed at camswl.com
Thu Sep 10 11:26:37 PDT 2009


Hi,

Here is part 2 of the diffs, the changes to bytecodes_arm.def.

Whats changed?

(the following is a combined list of changes in cppInterpreter_arm.S
and bytecodes_arm.def).

- Added support for HW floating point.
  (checks /proc/sys/... to see the processor actually has HW FP
  before executing any HW FP instructions).
- Added #ifdefs to allow disabling of various optimisations. The
  list is
	-DDISABLE_NOTICE_SAFEPOINTS
	-DDISABLE_HW_NULL_PTR_CHECK
	-DDISABLE_FASTPATH_ENTRY
	-DDISABLE_NATIVE_ENTRY
	-DDISABLE_FAST_BYTECODES
	-DDISABLE_HW_FP
- Removed #ifdefs on GCC_VERSION and B14/B16. It should now build for
  any of gcc 4.1, 4.3 and 4.4 and handle the differences between B14
  and B16 automatically using asm_helper.cpp
- Added lots of debugging and asert ifdefs. The list is
	DISPATCH_LOOP
	CODETRACE
	DISPATCH_ASSERTS
	CHECK_LOCALS
	CHECK_FRAME
	CHECK_BACKTRACE
	CHECK_STACK
  Basically, if DISPATCH_LOOP is set then you can enable any of the
  other assertions and it will do the appropriate checks after every
  bytecode.
- Support for gcc 4.1
  Basically I have inlined the problem functions which were causing
  unresolved symbols with gcc 4.1. Also changed the code alignment
  from 64 to 8 as earlier binutils have a problem with 64 byte
  alignment.
- Synchronized native entry is now thrown to cppInterpreter_zero.
  It was too much of a hazard to maintain/debug this for almost no
  performance gain.
- Optimised integer divide and remainder by constant.
- Support for UseCompiler.
  I have tested this out by building Shark for ARM and it runs at least
  as well as the C version, however there is a lot of work to make
  Shark work on ARM so asm_generate_entry still returns NULL if
  UseCompiler is set.
- invokeinterface can now do a fastpath entry, previously always did
  a slow path and created a full native and java frame. The fast path
  entry only creates a java frame, no new native frame is created.
- Optimised new, checkcast and instanceof.
- Added support for additional bytecode sequences of the form
	<load - any><load - ant><data op><store - any>
- Lots of other minor optimisations.

Regards,
Ed.

--- CUT HERE -----------------------------------------------------------
diff -ruNE old/icedtea6/ports/hotspot/src/cpu/zero/vm/bytecodes_arm.def new/icedtea6/ports/hotspot/src/cpu/zero/vm/bytecodes_arm.def
--- old/icedtea6/ports/hotspot/src/cpu/zero/vm/bytecodes_arm.def	2009-09-08 14:30:25.000000000 +0100
+++ new/icedtea6/ports/hotspot/src/cpu/zero/vm/bytecodes_arm.def	2009-09-10 14:18:17.000000000 +0100
@@ -1,3 +1,13 @@
+#ifndef DISABLE_HW_FP
+#define HW_FP
+#endif
+#ifndef DISABLE_NOTICE_SAFEPOINTS
+#define NOTICE_SAFEPOINTS
+#endif
+#ifndef DISABLE_FAST_BYTECODES
+#define FAST_BYTECODES
+#endif
+
 nop                  = 0x00, 1
 aconst_null          = 0x01, 1
 iconst_m1            = 0x02, 1
@@ -201,11 +211,13 @@
 jsr_w                = 0xc9, 0
 breakpoint           = 0xca, 0
 
-#agetfield	= 0xcb, 3
+#ifdef FAST_BYTECODES
+
+ at agetfield	= 0xcb, 3
 bgetfield	= 0xcc, 3
 cgetfield	= 0xcd, 3
-#dgetfield	= 0xce, 3
-#fgetfield	= 0xcf, 3
+ at dgetfield	= 0xce, 3
+ at fgetfield	= 0xcf, 3
 igetfield	= 0xd0, 3
 lgetfield	= 0xd1, 3
 sgetfield	= 0xd2, 3
@@ -213,45 +225,56 @@
 aputfield	= 0xd3, 3
 bputfield	= 0xd4, 3
 cputfield	= 0xd5, 3
-#dputfield	= 0xd6, 3
-#fputfield	= 0xd7, 3
+ at dputfield	= 0xd6, 3
+ at fputfield	= 0xd7, 3
 iputfield	= 0xd8, 3
 lputfield	= 0xd9, 3
-#sputfield	= 0xda, 3
+ at sputfield	= 0xda, 3
 
 iaccess_0	= 0xdb, 4
 iaccess_1	= 0xdc, 4
 iaccess_2	= 0xdd, 4
 iaccess_3	= 0xde, 4
 
-#fast_iload	= 0xdf, 2
-#fast_iload2	= 0xe0, 4
-#fast_icaload	= 0xe1, 3
-
-invokevfinal 	= 0xe2, 3
-#linearswitch 	= 0xe3, 0
-#binaryswitch 	= 0xe4, 0
-
-iload_0_iconst_N        = 231, 2
-iload_1_iconst_N        = 232, 2
-iload_2_iconst_N        = 233, 2
-iload_3_iconst_N        = 234, 2
-iload_iconst_N          = 235, 3
-invokeresolved          = 236, 3
-iadd_istore_N		= 237, 2
-isub_istore_N		= 238, 2
-iand_istore_N		= 239, 2
-ior_istore_N		= 240, 2
-ixor_istore_N		= 241, 2
-iadd_u4store		= 242, 3
-isub_u4store		= 243, 3
-iand_u4store		= 244, 3
-ior_u4store		= 245, 3
-ixor_u4store		= 246, 3
-invokespecialresolved	= 247, 3
-invokestaticresolved	= 248, 3
+invokeresolved		= 0xdf, 3
+invokespecialresolved	= 0xe0, 3
+invokestaticresolved	= 0xe1, 3
+invokevfinal 		= 0xe2, 3
+
+iload_iload	= 0xe3, 4
+iload_iload_N	= 0xe4, 3
+
+ at return_register_finalizer = 0xe5, 1
+
+dmac			= 0xe6, 2
+
+iload_0_iconst_N        = 0xe7, 2
+iload_1_iconst_N        = 0xe8, 2
+iload_2_iconst_N        = 0xe9, 2
+iload_3_iconst_N        = 0xea, 2
+iload_iconst_N          = 0xeb, 3
+iadd_istore_N		= 0xec, 2
+isub_istore_N		= 0xed, 2
+iand_istore_N		= 0xee, 2
+ior_istore_N		= 0xef, 2
+ixor_istore_N		= 0xf0, 2
+iadd_u4store		= 0xf1, 3
+isub_u4store		= 0xf2, 3
+iand_u4store		= 0xf3, 3
+ior_u4store		= 0xf4, 3
+ixor_u4store		= 0xf5, 3
+iload_0_iload		= 0xf6, 3
+iload_1_iload		= 0xf7, 3
+iload_2_iload		= 0xf8, 3
+iload_3_iload		= 0xf9, 3
+iload_0_iload_N		= 0xfa, 2
+iload_1_iload_N		= 0xfb, 2
+iload_2_iload_N		= 0xfc, 2
+iload_3_iload_N		= 0xfd, 2
+
+#endif // FAST_BYTECODES
 
-return_register_finalizer = 229, 0
+return_register_finalizer = 0xe5, 1
 
 (nop) {
 	DISPATCH	\seq_len
@@ -292,7 +315,7 @@
 	DISPATCH_NEXT
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	PUSH2	tmp2, tmp1
+	PUSH	tmp2, tmp1
 	DISPATCH_FINISH
 }
 
@@ -321,7 +344,7 @@
         mov     tmp2, #0
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	PUSH2	tmp2, tmp1
+	PUSH	tmp2, tmp1
 	DISPATCH_FINISH
 }
 
@@ -337,8 +360,8 @@
 	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
-# r1 = [jpc, #2]
+@ r2 = [jpc, #1]
+@ r1 = [jpc, #2]
 (sipush) sipush {
 	DISPATCH_START	\seq_len
 	mov	tmp1, r1
@@ -352,7 +375,7 @@
 	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
+@ r2 = [jpc, #1]
 (iload,fload,aload) u4load {
 	DISPATCH_START	\seq_len
 	rsb	tmp1, r2, #0
@@ -365,7 +388,7 @@
 	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
+@ r2 = [jpc, #1]
 (lload,dload) u8load {
 	DISPATCH_START	\seq_len
 	sub	r3, locals, r2, lsl #2
@@ -374,7 +397,7 @@
 	DISPATCH_NEXT
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	PUSH2	tmp2, tmp1
+	PUSH	tmp2, tmp1
 	DISPATCH_FINISH
 }
 
@@ -446,7 +469,7 @@
 	DISPATCH_NEXT
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	PUSH2	tmp2, tmp1
+	PUSH	tmp2, tmp1
 	DISPATCH_FINISH
 }
 
@@ -458,17 +481,15 @@
 	DISPATCH_NEXT
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	PUSH2	tmp2, tmp1
+	PUSH	tmp2, tmp1
 	DISPATCH_FINISH
 }
 
 (iaload,faload,aaload) u4aload {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
+	POP	r2, r3			@ r2 = index, r3 = arrayref
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry5:
 	ldr	lr, [r3, #8]		@ lr = length
 	DISPATCH_NEXT
@@ -484,12 +505,10 @@
 }
 
 (laload,daload) u8aload {
-	POP2	r2, r3
+	POP	r2, r3
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry6:
 	ldr	lr, [r3, #8]		@ lr = length
 	DISPATCH_NEXT
@@ -501,17 +520,15 @@
 	DISPATCH_NEXT
 	ldr	tmp1, [r3, #20]
 	DISPATCH_NEXT
-	PUSH2	tmp2, tmp1
+	PUSH	tmp2, tmp1
 	DISPATCH_FINISH
 }
 
 (baload) baload {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
+	POP	r2, r3			@ r2 = index, r3 = arrayref
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry7:
 	ldr	lr, [r3, #8]		@ lr = length
 	DISPATCH_NEXT
@@ -527,12 +544,10 @@
 }
 
 (caload) caload {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
+	POP	r2, r3			@ r2 = index, r3 = arrayref
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry8:
 	ldr	lr, [r3, #8]		@ lr = length
 	DISPATCH_NEXT
@@ -548,12 +563,10 @@
 }
 
 (saload) saload {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
+	POP	r2, r3			@ r2 = index, r3 = arrayref
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry9:
 	ldr	lr, [r3, #8]		@ lr = length
 	DISPATCH_NEXT
@@ -568,7 +581,7 @@
 	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
+@ r2 = [jpc, #1]
 (astore,istore,fstore) u4store {
 	DISPATCH_START	\seq_len
 	rsb	tmp1, r2, #0
@@ -581,10 +594,10 @@
 	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
+@ r2 = [jpc, #1]
 (lstore,dstore) u8store {
 	DISPATCH_START	\seq_len
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	sub	r3, locals, r2, lsl #2
 	DISPATCH_NEXT
@@ -641,7 +654,7 @@
 (lstore_0,dstore_0) u8store_0 {
 	DISPATCH_START	\seq_len
 	DISPATCH_NEXT
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	DISPATCH_NEXT
 	DISPATCH_NEXT
@@ -652,7 +665,7 @@
 (lstore_1,dstore_1) u8store_1 {
 	DISPATCH_START	\seq_len
 	DISPATCH_NEXT
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	DISPATCH_NEXT
 	DISPATCH_NEXT
@@ -662,7 +675,7 @@
 
 (lstore_2,dstore_2) u8store_2 {
 	DISPATCH_START	\seq_len
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
         str     tmp2, [locals, #-12]
 	DISPATCH_NEXT
@@ -674,7 +687,7 @@
 
 (lstore_3,dstore_3) u8store_3 {
 	DISPATCH_START	\seq_len
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
         str     tmp2, [locals, #-16]
 	DISPATCH_NEXT
@@ -685,12 +698,10 @@
 }
 
 (iastore,fastore) u4astore {
-	POP3	r3, tmp2, tmp1		@ r3 = value, tmp2 = index, tmp1 = arrayref
+	POP	r3, tmp2, tmp1		@ r3 = value, tmp2 = index, tmp1 = arrayref
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry10:
 	ldr	lr, [tmp1, #8]		@ lr = limit
 	DISPATCH_NEXT
@@ -704,12 +715,10 @@
 }
 
 (lastore,dastore) u8astore {
-	POP4	r2, r3, tmp2, tmp1		@ r2,r3 = value, tmp2 = index, tmp1 = arrayref
+	POP	r2, r3, tmp2, tmp1		@ r2,r3 = value, tmp2 = index, tmp1 = arrayref
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry11:
 	ldr	ip, [tmp1, #8]		@ ip = limit
 	cmp	tmp2, ip
@@ -725,12 +734,10 @@
 }
 
 (bastore) bastore {
-	POP3	r3, tmp2, tmp1		@ r3 = value, tmp2 = index, tmp1 = arrayref
+	POP	r3, tmp2, tmp1		@ r3 = value, tmp2 = index, tmp1 = arrayref
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry12:
 	ldr	lr, [tmp1, #8]		@ lr = limit
 	DISPATCH_NEXT
@@ -744,12 +751,10 @@
 }
 
 (castore,sastore) u2astore {
-	POP3	r3, tmp2, tmp1		@ r3 = value, tmp2 = index, tmp1 = arrayref
+	POP	r3, tmp2, tmp1		@ r3 = value, tmp2 = index, tmp1 = arrayref
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry13:
 	ldr	lr, [tmp1, #8]		@ lr = limit
 	DISPATCH_NEXT
@@ -784,21 +789,21 @@
 
 (dup_x1) dup_x1 {
 	DISPATCH_START	\seq_len
-	POP2	r2, r3
+	POP	r2, r3
 	DISPATCH_NEXT
 	PUSH	r2
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	PUSH	r2, r3
 	DISPATCH_FINISH
 }
 
 (dup_x2) dup_x2 {
 	DISPATCH_START	\seq_len
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
 	DISPATCH_NEXT
 	PUSH	r2
 	DISPATCH_NEXT
-	PUSH3	r2, r3, lr
+	PUSH	r2, r3, lr
 	DISPATCH_FINISH
 }
 
@@ -806,32 +811,32 @@
 	DISPATCH_START	\seq_len
 	ldmib	stack, {r2, r3}
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	PUSH	r2, r3
 	DISPATCH_FINISH
 }
 
 (dup2_x1) dup2_x1 {
 	DISPATCH_START	\seq_len
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	PUSH	r2, r3
 	DISPATCH_NEXT
-	PUSH3	r2, r3, lr
+	PUSH	r2, r3, lr
 	DISPATCH_FINISH
 }
 
 (dup2_x2) dup2_x2 {
 	DISPATCH_START	\seq_len
-	POP4	r2, r3, tmp1, lr
+	POP	r2, r3, tmp1, lr
 	DISPATCH_NEXT
-	PUSH2	r2, r3
-	PUSH4	r2, r3, tmp1, lr
+	PUSH	r2, r3
+	PUSH	r2, r3, tmp1, lr
 	DISPATCH_FINISH
 }
 
 (swap) swap {
 	DISPATCH_START	\seq_len
-	POP2	r2, r3
+	POP	r2, r3
 	DISPATCH_NEXT
 	PUSH	r2
 	DISPATCH_NEXT
@@ -842,7 +847,7 @@
 
 (iadd) iadd {
 	DISPATCH_START	\seq_len
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	add	tmp2, tmp2, tmp1
 	DISPATCH_NEXT
@@ -854,25 +859,18 @@
 
 (ladd) ladd {
 	DISPATCH_START	\seq_len
-	POP4	r2, r3, tmp1, lr
+	POP	r2, r3, tmp1, lr
 	DISPATCH_NEXT
 	adds	r2, r2, tmp1
 	adc	r3, r3, lr
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	PUSH	r2, r3
 	DISPATCH_FINISH
 }
 
-(fadd) fadd {
-	POP2	r0, r1
-        bl      __aeabi_fadd
-	PUSH	r0
-	DISPATCH	\seq_len
-}
-
 (isub) isub {
 	DISPATCH_START	\seq_len
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	sub	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
@@ -884,26 +882,18 @@
 
 (lsub) lsub {
 	DISPATCH_START	\seq_len
-	POP4	r2, r3, tmp1, lr
+	POP	r2, r3, tmp1, lr
 	DISPATCH_NEXT
 	subs	r2, tmp1, r2
 	sbc	r3, lr, r3
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	PUSH	r2, r3
 	DISPATCH_FINISH
 }
 
-(fsub) fsub {
-	POP	r1
-	POP	r0
-        bl      __aeabi_fsub
-	PUSH	r0
-	DISPATCH	\seq_len
-}
-
 (imul) imul {
 	DISPATCH_START	\seq_len
-	POP2	r2, tmp1
+	POP	r2, tmp1
 	DISPATCH_NEXT
 	mul	tmp2, r2, tmp1
 	DISPATCH_NEXT
@@ -914,56 +904,33 @@
 }
 
 (lmul) lmul {
-	POP4	r2, tmp1, ip, lr
+	POP	r2, tmp1, ip, lr
         umull   r3, r0, ip, r2
         mla     tmp1, ip, tmp1, r0
 	DISPATCH_START	\seq_len
         mla     tmp1, lr, r2, tmp1
 	DISPATCH_NEXT
-	PUSH2	r3, tmp1
+	PUSH	r3, tmp1
 	DISPATCH_FINISH
 }
 
-(fmul) fmul {
-	POP2	r0, r1
-        bl      __aeabi_fmul
-	PUSH	r0
-	DISPATCH	\seq_len
-}
-
 (ldiv) ldiv {
-	POP2	r2, r3
-	POP2	r0, r1
+	POP	r2, r3
+	POP	r0, r1
 	orrs	lr, r2, r3
 	beq	.ldiv_0
 	bl	__aeabi_ldivmod
-	PUSH2	r0, r1
-	DISPATCH	\seq_len
-}
-
-(fdiv) fdiv {
-	POP	r1
-	POP	r0
-        bl      __aeabi_fdiv
-	PUSH	r0
-	DISPATCH	\seq_len
-}
-
-(ddiv) ddiv {
-	POP2	r2, r3
-	POP2	r0, r1
-        bl      __aeabi_ddiv
-	PUSH2	r0, r1
+	PUSH	r0, r1
 	DISPATCH	\seq_len
 }
 
 (lrem) lrem {
-	POP2	r2, r3
-	POP2	r0, r1
+	POP	r2, r3
+	POP	r0, r1
 	orrs	lr, r2, r3
 	beq	.lrem_0
 	bl	__aeabi_ldivmod
-	PUSH2	r2, r3
+	PUSH	r2, r3
 	DISPATCH	\seq_len
 }
 
@@ -971,10 +938,10 @@
 @ ECN: It must be possible to do better than this
 	POP	r0
         bl      __aeabi_f2d
-	PUSH2	r0, r1
+	PUSH	r0, r1
 	GET_STACK	2, r0
         bl      __aeabi_f2d
-	POP2	r2, r3
+	POP	r2, r3
         bl      fmod
         bl      __aeabi_d2f
 	PUT_STACK	0, r0
@@ -982,10 +949,10 @@
 }
 
 (drem) drem {
-	POP2	r2, r3
-	POP2	r0, r1
+	POP	r2, r3
+	POP	r0, r1
         bl      fmod
-	PUSH2	r0, r1
+	PUSH	r0, r1
 	DISPATCH	\seq_len
 }
 
@@ -1003,12 +970,12 @@
 
 (lneg) lneg {
 	DISPATCH_START	\seq_len
-	POP2	r2, r3
+	POP	r2, r3
 	DISPATCH_NEXT
 	rsbs	r2, r2, #0
 	rsc	r3, r3, #0
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	PUSH	r2, r3
 	DISPATCH_FINISH
 }
 
@@ -1034,7 +1001,7 @@
 
 (ishl) ishl {
 	DISPATCH_START	\seq_len
-	POP2	r2, r3
+	POP	r2, r3
 	DISPATCH_NEXT
 	and	r2, r2, #31
 	mov	r2, r3, lsl r2
@@ -1045,7 +1012,7 @@
 
 (lshl) lshl {
 	DISPATCH_START	\seq_len
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
 	DISPATCH_NEXT
 	tst	r2, #32
 	and	r2, r2, #31
@@ -1055,13 +1022,13 @@
 	moveq	lr, lr, lsl r2
 	rsbeq	r2, r2, #32
 	orreq	lr, lr, r3, lsr r2
-	PUSH2	tmp1, lr
+	PUSH	tmp1, lr
 	DISPATCH_FINISH
 }
 
 (ishr) ishr {
 	DISPATCH_START	\seq_len
-	POP2	r2, r3
+	POP	r2, r3
 	DISPATCH_NEXT
 	and	r2, r2, #31
 	mov	r2, r3, asr r2
@@ -1072,7 +1039,7 @@
 
 (lshr) lshr {
 	DISPATCH_START	\seq_len
-	POP3	r2, r3, tmp1
+	POP	r2, r3, tmp1
 	DISPATCH_NEXT
 	tst	r2, #32
 	and	r2, r2, #31
@@ -1082,13 +1049,13 @@
 	moveq	r3, r3, lsr r2
 	rsbeq	r2, r2, #32
 	orreq	r3, r3, tmp1, lsl r2
-	PUSH2	r3, lr
+	PUSH	r3, lr
 	DISPATCH_FINISH
 }
 
 (iushr) iushr {
 	DISPATCH_START	\seq_len
-	POP2	r2, r3
+	POP	r2, r3
 	DISPATCH_NEXT
 	and	r2, r2, #31
 	mov	r2, r3, lsr r2
@@ -1099,7 +1066,7 @@
 
 (lushr) lushr {
 	DISPATCH_START	\seq_len
-	POP3	r2, r3, tmp1
+	POP	r2, r3, tmp1
 	DISPATCH_NEXT
 	tst	r2, #32
 	and	r2, r2, #31
@@ -1109,13 +1076,13 @@
 	moveq	r3, r3, lsr r2
 	rsbeq	r2, r2, #32
 	orreq	r3, r3, tmp1, lsl r2
-	PUSH2	r3, lr
+	PUSH	r3, lr
 	DISPATCH_FINISH
 }
 
 (iand) iand {
 	DISPATCH_START	\seq_len
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	and	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
@@ -1127,18 +1094,18 @@
 
 (land) land {
 	DISPATCH_START	\seq_len
-	POP4	r2, r3, tmp1, lr
+	POP	r2, r3, tmp1, lr
 	DISPATCH_NEXT
 	and	r2, tmp1, r2
 	and	r3, lr, r3
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	PUSH	r2, r3
 	DISPATCH_FINISH
 }
 
 (ior) ior {
 	DISPATCH_START	\seq_len
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	orr	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
@@ -1150,18 +1117,18 @@
 
 (lor) lor {
 	DISPATCH_START	\seq_len
-	POP4	r2, r3, tmp1, lr
+	POP	r2, r3, tmp1, lr
 	DISPATCH_NEXT
 	orr	r2, tmp1, r2
 	orr	r3, lr, r3
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	PUSH	r2, r3
 	DISPATCH_FINISH
 }
 
 (ixor) ixor {
 	DISPATCH_START	\seq_len
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	eor	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
@@ -1173,16 +1140,16 @@
 
 (lxor) lxor {
 	DISPATCH_START	\seq_len
-	POP4	r2, r3, tmp1, lr
+	POP	r2, r3, tmp1, lr
 	DISPATCH_NEXT
 	eor	r2, tmp1, r2
 	eor	r3, lr, r3
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	PUSH	r2, r3
 	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
+@ r2 = [jpc, #1]
 (iinc) iinc {
 	ldrsb	lr, [jpc, #2]
 	DISPATCH_START	\seq_len
@@ -1203,7 +1170,7 @@
 	DISPATCH_NEXT
 	mov	r3, r2, asr #31
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	PUSH	r2, r3
 	DISPATCH_FINISH
 }
 
@@ -1217,7 +1184,7 @@
 (i2d) i2d {
 	POP	r0
         bl      __aeabi_i2d
-	PUSH2	r0, r1
+	PUSH	r0, r1
 	DISPATCH	\seq_len
 }
 
@@ -1230,16 +1197,16 @@
 }
 
 (l2f) l2f {
-	POP2	r0, r1
+	POP	r0, r1
         bl      __aeabi_l2f
 	PUSH	r0
 	DISPATCH	\seq_len
 }
 
 (l2d) l2d {
-	POP2	r0, r1
+	POP	r0, r1
         bl      __aeabi_l2d
-	PUSH2	r0, r1
+	PUSH	r0, r1
 	DISPATCH	\seq_len
 }
 
@@ -1253,33 +1220,33 @@
 (f2l) f2l {
 	POP	r0
         bl      _ZN13SharedRuntime3f2lEf
-	PUSH2	r0, r1
+	PUSH	r0, r1
 	DISPATCH	\seq_len
 }
 
 (f2d) f2d {
 	POP	r0
         bl      __aeabi_f2d
-	PUSH2	r0, r1
+	PUSH	r0, r1
 	DISPATCH	\seq_len
 }
 
 (d2i) d2i {
-	POP2	r0, r1
+	POP	r0, r1
         bl      _ZN13SharedRuntime3d2iEd
 	PUSH	r0
 	DISPATCH	\seq_len
 }
 
 (d2l) d2l {
-	POP2	r0, r1
+	POP	r0, r1
         bl      _ZN13SharedRuntime3d2lEd
-	PUSH2	r0, r1
+	PUSH	r0, r1
 	DISPATCH	\seq_len
 }
 
 (d2f) d2f {
-	POP2	r0, r1
+	POP	r0, r1
         bl      __aeabi_d2f
 	PUSH	r0
 	DISPATCH	\seq_len
@@ -1319,7 +1286,7 @@
 }
 
 (lcmp) lcmp {
-	POP4	r2, r3, tmp1, lr
+	POP	r2, r3, tmp1, lr
 	DISPATCH_START	\seq_len
 	subs	r2, tmp1, r2
 	movne	r2, #1
@@ -1332,104 +1299,10 @@
 	DISPATCH_FINISH
 }
 
-(fcmpl) 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	\seq_len
-	add	stack, stack, #8
-	DISPATCH_NEXT
-	PUSH	r3
-	DISPATCH_FINISH
-}
-
-(fcmpg) 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	\seq_len
-	add	stack, stack, #8
-	DISPATCH_NEXT
-	PUSH	r3
-	DISPATCH_FINISH
-}
-
-(dcmpl) 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	\seq_len
-	add	stack, stack, #16
-	DISPATCH_NEXT
-	PUSH	r3
-	DISPATCH_FINISH
-}
-
-(dcmpg) 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	\seq_len
-	add	stack, stack, #16
-	DISPATCH_NEXT
-	PUSH	r3
-	DISPATCH_FINISH
-}
+#ifdef NOTICE_SAFEPOINTS
 
-# r2 = [jpc, #1]
-# r1 = [jpc, #2]
+@ r2 = [jpc, #1]
+@ r1 = [jpc, #2]
 (ifeq,ifnull) ifeq_unsafe {
 	POP	r3
 	mov	r2, r2, lsl #24
@@ -1503,7 +1376,7 @@
 }
 
 (if_icmpeq,if_acmpeq) if_icmpeq_unsafe {
-	POP2	r3, tmp1
+	POP	r3, tmp1
 	mov	r2, r2, lsl #24
         cmp     tmp1, r3
 	orr	ip, r1, r2, asr #16
@@ -1515,7 +1388,7 @@
 }
 
 (if_icmpne,if_acmpne) if_icmpne_unsafe {
-	POP2	r3, tmp1
+	POP	r3, tmp1
 	mov	r2, r2, lsl #24
         cmp     tmp1, r3
 	orr	ip, r1, r2, asr #16
@@ -1527,7 +1400,7 @@
 }
 
 (if_icmplt) if_icmplt_unsafe {
-	POP2	r3, tmp1
+	POP	r3, tmp1
 	mov	r2, r2, lsl #24
         cmp     tmp1, r3
 	orr	ip, r1, r2, asr #16
@@ -1539,7 +1412,7 @@
 }
 
 (if_icmpge) if_icmpge_unsafe {
-	POP2	r3, tmp1
+	POP	r3, tmp1
 	mov	r2, r2, lsl #24
         cmp     tmp1, r3
 	orr	ip, r1, r2, asr #16
@@ -1551,7 +1424,7 @@
 }
 
 (if_icmpgt) if_icmpgt_unsafe {
-	POP2	r3, tmp1
+	POP	r3, tmp1
 	mov	r2, r2, lsl #24
         cmp     tmp1, r3
 	orr	ip, r1, r2, asr #16
@@ -1563,7 +1436,7 @@
 }
 
 (if_icmple) if_icmple_unsafe {
-	POP2	r3, tmp1
+	POP	r3, tmp1
 	mov	r2, r2, lsl #24
         cmp     tmp1, r3
 	orr	ip, r1, r2, asr #16
@@ -1581,17 +1454,19 @@
 	DISPATCH_BYTECODE
 }
 
+#endif // NOTICE_SAFEPOINTS
+
 (jsr) jsr {
 	ldr	r3, [istate, #ISTATE_METHOD]
 	ldr	r1, [r3, #8]
 	rsb	r2, r1, jpc
 	sub	r2, r2, #45
 	PUSH	r2
-	b	do_goto_safe
+	b	do_goto
 }
 
-# r2 = [jpc, #1]
-# r1 = [jpc, #2]
+@ r2 = [jpc, #1]
+@ r1 = [jpc, #2]
 (ret) ret {
 	ldr	r0, [istate, #ISTATE_METHOD]
 	ldr	r3, [r0, #8]
@@ -1600,7 +1475,7 @@
 	DISPATCH	48
 }
 
-# ECN: We dont do safe and unsafe versions of tableswitch and lookupswitch
+@ ECN: We dont do safe and unsafe versions of tableswitch and lookupswitch
 (tableswitch) tableswitch {
 	POP	a2
         bic     a1, jpc, #3
@@ -1679,17 +1554,16 @@
 	DISPATCH_BYTECODE
 }
 
+#ifdef FAST_BYTECODES
 (igetfield) igetfield {
 	DISPATCH_START	3
         add     tmp2, constpool, r1, lsl #12
 	POP	tmp1
 	add	tmp2, tmp2, r2, lsl #4
 	DISPATCH_NEXT
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-	ldr	tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+	ldr	tmp2, [tmp2, #CP_OFFSET+8]
 	DISPATCH_NEXT
 .abortentry78:
 	ldr	tmp2, [tmp1, tmp2]
@@ -1705,11 +1579,9 @@
 	POP	tmp1
 	add	tmp2, tmp2, r2, lsl #4
 	DISPATCH_NEXT
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-	ldr	tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+	ldr	tmp2, [tmp2, #CP_OFFSET+8]
 	DISPATCH_NEXT
 .abortentry79:
 	ldrsb	tmp2, [tmp1, tmp2]
@@ -1725,11 +1597,9 @@
 	POP	tmp1
 	add	tmp2, tmp2, r2, lsl #4
 	DISPATCH_NEXT
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-	ldr	tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+	ldr	tmp2, [tmp2, #CP_OFFSET+8]
 	DISPATCH_NEXT
 .abortentry80:
 	ldrh	tmp2, [tmp1, tmp2]
@@ -1745,11 +1615,9 @@
 	POP	tmp1
 	add	tmp2, tmp2, r2, lsl #4
 	DISPATCH_NEXT
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-	ldr	tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+	ldr	tmp2, [tmp2, #CP_OFFSET+8]
 	DISPATCH_NEXT
 .abortentry81:
 	ldrsh	tmp2, [tmp1, tmp2]
@@ -1765,32 +1633,28 @@
 	POP	tmp1
 	add	tmp2, tmp2, r2, lsl #4
 	DISPATCH_NEXT
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-	ldr	tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+	ldr	tmp2, [tmp2, #CP_OFFSET+8]
 	DISPATCH_NEXT
 	add	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
 .abortentry82:
 	ldmia	tmp2, {tmp2, tmp1}
 	DISPATCH_NEXT
-	PUSH2	tmp2, tmp1
+	PUSH	tmp2, tmp1
 	DISPATCH_FINISH
 }
 
 (iputfield) iputfield {
 	DISPATCH_START	3
         add     tmp2, constpool, r1, lsl #12
-	POP2	r3, tmp1		@ r3 = value, tmp1 = object
+	POP	r3, tmp1		@ r3 = value, tmp1 = object
 	add	tmp2, tmp2, r2, lsl #4
 	DISPATCH_NEXT
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-	ldr	tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+	ldr	tmp2, [tmp2, #CP_OFFSET+8]
 	DISPATCH_NEXT
 	DISPATCH_NEXT
 	DISPATCH_NEXT
@@ -1802,14 +1666,12 @@
 (cputfield) cputfield {
 	DISPATCH_START	3
         add     tmp2, constpool, r1, lsl #12
-	POP2	r3, tmp1		@ r3 = value, tmp1 = object
+	POP	r3, tmp1		@ r3 = value, tmp1 = object
 	add	tmp2, tmp2, r2, lsl #4
 	DISPATCH_NEXT
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-	ldr	tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+	ldr	tmp2, [tmp2, #CP_OFFSET+8]
 	DISPATCH_NEXT
 	DISPATCH_NEXT
 	DISPATCH_NEXT
@@ -1821,14 +1683,12 @@
 (bputfield) bputfield {
 	DISPATCH_START	3
         add     tmp2, constpool, r1, lsl #12
-	POP2	r3, tmp1		@ r3 = value, tmp1 = object
+	POP	r3, tmp1		@ r3 = value, tmp1 = object
 	add	tmp2, tmp2, r2, lsl #4
 	DISPATCH_NEXT
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-	ldr	tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+	ldr	tmp2, [tmp2, #CP_OFFSET+8]
 	DISPATCH_NEXT
 	DISPATCH_NEXT
 	DISPATCH_NEXT
@@ -1839,13 +1699,15 @@
 
 (aputfield) aputfield {
 	GET_STACK	1, r0		@ r0 = object
-        add     tmp2, constpool, r1, lsl #12
-	POP	r1			@ r1 = value
-	add	tmp2, tmp2, r2, lsl #4
-	ldr	tmp2, [tmp2, #8]
-	cmp	r0, #0
-	beq	null_ptr_exception
-	add	r0, r0, tmp2
+        add     r3, constpool, r1, lsl #12
+	POP	oop_value_tmp			@ r1 = value
+	add	r3, r3, r2, lsl #4
+	ldr	r3, [r3, #CP_OFFSET+8]
+	SW_NPC	cmp	r0, #0
+	add	oop_address_tmp, r0, r3
+	SW_NPC	beq	null_ptr_exception
+.abortentry113:
+	HW_NPC	ldr	ip, [r0]		@ Only to provoke an abort
 	bl	oop_store
     ldr	r3, [dispatch, #Universe_collectedHeap_Address-XXX]
         DISPATCH_START  3
@@ -1863,14 +1725,12 @@
 (lputfield) lputfield {
 	DISPATCH_START	3
         add     tmp2, constpool, r1, lsl #12
-	POP3	r3, tmp1, lr		@ r3, tmp1 = value, lr = object
+	POP	r3, tmp1, lr		@ r3, tmp1 = value, lr = object
 	add	tmp2, tmp2, r2, lsl #4
 	DISPATCH_NEXT
-#ifndef HW_NULL_PTR_CHECK
-	cmp	lr, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-	ldr	tmp2, [tmp2, #8]
+	SW_NPC	cmp	lr, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+	ldr	tmp2, [tmp2, #CP_OFFSET+8]
 	DISPATCH_NEXT
 	add	tmp2, lr, tmp2
 	DISPATCH_NEXT
@@ -1880,19 +1740,20 @@
 	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
-# r1 = [jpc, #2]
+#endif // FAST_BYTECODES
+
+@ r2 = [jpc, #1]
+@ r1 = [jpc, #2]
 (getstatic) getstatic {
-        DISPATCH_START  \seq_len
         add     tmp2, constpool, r1, lsl #12
-        ldr     r3, [tmp2, r2, lsl #4]! @ tmp2 = cache, r3 = flags
-        DISPATCH_NEXT
+	add	tmp2, tmp2, r2, lsl #4
+        ldr     r3, [tmp2, #CP_OFFSET]
 	and	r3, r3, #0x00ff0000
-	cmp	r3, #178 << 16
-	bne	resolve_getstatic
-	ldr	r3, [tmp2, #4]
-	ldr	r2, [tmp2, #12]
-        ldr     lr, [tmp2, #8]
+	cmp	r3, #opc_getstatic << 16
+	blne	resolve_get_put
+	ldr	r3, [tmp2, #CP_OFFSET+4]
+	ldr	r2, [tmp2, #CP_OFFSET+12]
+        ldr     lr, [tmp2, #CP_OFFSET+8]
         movs    r2, r2, lsr #29
 	bhi	getstatic_w		@ C = 1, Z = 0 => R2 == 3, 5, 7
 	bcs	getstatic_h		@ C = 1 => R2 = 1
@@ -1902,19 +1763,18 @@
 	b	getstatic_sh
 }
 
-# r2 = [jpc, #1]
-# r1 = [jpc, #2]
+@ r2 = [jpc, #1]
+@ r1 = [jpc, #2]
 (putstatic) putstatic {
-        DISPATCH_START  \seq_len
         add     tmp2, constpool, r1, lsl #12
-        ldr     r3, [tmp2, r2, lsl #4]! @ tmp2 = cache, r3 = flags
-        DISPATCH_NEXT
+	add	tmp2, tmp2, r2, lsl #4
+        ldr     r3, [tmp2, #CP_OFFSET]
         and     r3, r3, #0xff000000
-        cmp     r3, #179 << 24
-	bne	resolve_putstatic
-	ldr	r3, [tmp2, #4]		@ r3 = object
-        ldr     lr, [tmp2, #12]           @ lr = tos_type
-        ldr     r2, [tmp2, #8]            @ r2 = offset
+        cmp     r3, #opc_putstatic << 24
+	blne	resolve_get_put
+	ldr	r3, [tmp2, #CP_OFFSET+4]		@ r3 = object
+        ldr     lr, [tmp2, #CP_OFFSET+12]           @ lr = tos_type
+        ldr     r2, [tmp2, #CP_OFFSET+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
@@ -1924,6 +1784,8 @@
 	b	putstatic_sh
 }
 
+#ifdef NOTICE_SAFEPOINTS
+
 (return) return_unsafe {
 
 	ldr	tmp2, [istate, #ISTATE_MONITOR_BASE]	@ tmp2 = base
@@ -1943,14 +1805,17 @@
 	add	r1, r2, #4
 	str	r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 
-	ldr	istate, [istate, #ISTATE_SAVED_ISTATE]
+	ldr	ip, [istate, #ISTATE_ADVANCE_PC]
+	ldr	istate, [istate, #ISTATE_NEXT_FRAME]
 	add	stack, r1, r0, lsl #2
-	cmp	istate, #0
+	cmp	ip, #0
 	beq	normal_return
 
-        ldr     jpc, [istate, #ISTATE_BCP]
+	sub	istate, istate, #ISTATE_NEXT_FRAME
+
+        CACHE_JPC
         ldr     r2, [istate, #ISTATE_STACK_LIMIT]
-        DISPATCH_START  3
+        DISPATCH_START_REG ip
         sub     stack, stack, #4
         ldr     r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
         DISPATCH_NEXT
@@ -1959,10 +1824,9 @@
         str     r2, [tmp_xxx, #THREAD_JAVA_SP]
         DISPATCH_NEXT
         str     r3, [tmp_xxx, #THREAD_LAST_JAVA_SP]
-        ldr     constpool, [istate, #ISTATE_CONSTANTS]
-        ldr     locals, [istate, #ISTATE_LOCALS]
+        CACHE_CP
+        CACHE_LOCALS
         DISPATCH_NEXT
-	add	constpool, constpool, #CONST_POOL_OFFSET
         DISPATCH_FINISH
 1:
 	bl	return_check_monitors
@@ -1988,15 +1852,18 @@
 	ldr	r3, [stack, #0]
 	ldrh	r0, [r0, #40]
 
-	ldr	istate, [istate, #ISTATE_SAVED_ISTATE]
+	ldr	ip, [istate, #ISTATE_ADVANCE_PC]
+	ldr	istate, [istate, #ISTATE_NEXT_FRAME]
 	str	r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 	str	r1, [stack, r0, lsl #2]!
-	cmp	istate, #0
+	cmp	ip, #0
 	beq	normal_return
 
-        ldr     jpc, [istate, #ISTATE_BCP]
+	sub	istate, istate, #ISTATE_NEXT_FRAME
+
+        CACHE_JPC
         ldr     r2, [istate, #ISTATE_STACK_LIMIT]
-	DISPATCH_START	3				@ ldrb	r0, [jpc, #3]!
+	DISPATCH_START_REG ip
         sub     stack, stack, #4
         ldr     r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 	DISPATCH_NEXT					@ ldrb	r1, [jpc, #2]
@@ -2005,10 +1872,9 @@
         str     r2, [tmp_xxx, #THREAD_JAVA_SP]
 	DISPATCH_NEXT					@ ldrb	r2, [jpc, #1]
         str     r3, [tmp_xxx, #THREAD_LAST_JAVA_SP]
-        ldr     constpool, [istate, #ISTATE_CONSTANTS]
-        ldr     locals, [istate, #ISTATE_LOCALS]
+        CACHE_CP
+        CACHE_LOCALS
 	DISPATCH_NEXT					@ ands	lr, ip, lr
-	add	constpool, constpool, #CONST_POOL_OFFSET
         DISPATCH_FINISH
 1:
 	bl	return_check_monitors
@@ -2033,18 +1899,21 @@
 	add	r1, r2, #4
 	str	r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 
-	ldr	istate, [istate, #ISTATE_SAVED_ISTATE]
+	ldr	ip, [istate, #ISTATE_ADVANCE_PC]
+	ldr	istate, [istate, #ISTATE_NEXT_FRAME]
 
-	POP2	r2, r3
+	POP	r2, r3
 
 	add	stack, r1, r0, lsl #2
 	stmdb	stack!, {r2, r3}
-	cmp	istate, #0
+	cmp	ip, #0
 	beq	normal_return
 
-        ldr     jpc, [istate, #ISTATE_BCP]
+	sub	istate, istate, #ISTATE_NEXT_FRAME
+
+        CACHE_JPC
         ldr     r2, [istate, #ISTATE_STACK_LIMIT]
-        DISPATCH_START  3
+        DISPATCH_START_REG ip
         sub     stack, stack, #4
         ldr     r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
         DISPATCH_NEXT
@@ -2053,44 +1922,47 @@
         str     r2, [tmp_xxx, #THREAD_JAVA_SP]
         DISPATCH_NEXT
         str     r3, [tmp_xxx, #THREAD_LAST_JAVA_SP]
-        ldr     constpool, [istate, #ISTATE_CONSTANTS]
-        ldr     locals, [istate, #ISTATE_LOCALS]
+        CACHE_CP
+        CACHE_LOCALS
         DISPATCH_NEXT
-	add	constpool, constpool, #CONST_POOL_OFFSET
         DISPATCH_FINISH
 1:
 	bl	return_check_monitors
 	b	2b
 }
 
+#endif // NOTICE_SAFEPOINTS
+
 (ldc) ldc {
-	ldrb	lr, [jpc, #1]
 	ldr	r3, [istate, #ISTATE_METHOD]			@ method
+	ldrb	lr, [jpc, #1]
+
+	ldr	tmp1, [r3, #12]			@ constants
 
 	DISPATCH_START	\seq_len
 
-	ldr	r2, [r3, #12]			@ constants
-	ldr	r3, [r2, #8]
+	ldr	r3, [tmp1, #8]
+	DISPATCH_NEXT
 	add	r3, r3, #12
 	ldrb	r3, [r3, lr]
 
 	DISPATCH_NEXT
+	DISPATCH_NEXT
 
 	cmp	r3, #JVM_CONSTANT_Integer
 	cmpne	r3, #JVM_CONSTANT_Float
 	cmpne	r3, #JVM_CONSTANT_String
 	bne	1f
 
+	add	r3, tmp1, lr, lsl #2
+	ldr	r3, [r3, #32]
 	DISPATCH_NEXT
-
-	add	r3, r2, lr, lsl #2
-	ldr	lr, [r3, #32]
-	PUSH	lr
+	PUSH	r3
 	DISPATCH_FINISH
 1:
 	cmp	r3, #JVM_CONSTANT_Class
 	bne	2f
-	add	r0, r2, #32
+	add	r0, tmp1, #32
 	ldr	r0, [r0, lr, lsl #2]
 	ldr	r1, [r0, #60]
 	PUSH	r1
@@ -2098,18 +1970,17 @@
 2:
 	sub	jpc, jpc, #\seq_len
 	ldr	r0, [istate, #ISTATE_THREAD]
-        str     jpc, [istate, #ISTATE_BCP]
-        str     stack, [istate, #ISTATE_STACK]
+        DECACHE_JPC
+        DECACHE_STACK
 	mov	r1, #0
         bl      _ZN18InterpreterRuntime3ldcEP10JavaThreadb
 	ldr	r0, [istate, #ISTATE_THREAD]			@ thread
-	ldr	stack, [istate, #ISTATE_STACK]
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
+	ASSERT_STACK_CACHED
+	CACHE_CP
 	ldr	r1, [r0, #THREAD_PENDING_EXC]
-	ldr	jpc, [istate, #ISTATE_BCP]
-	add	constpool, constpool, #CONST_POOL_OFFSET
+	CACHE_JPC
 	cmp	r1, #0
-	ldr	locals, [istate, #ISTATE_LOCALS]
+	ASSERT_LOCALS_CACHED
 	bne	handle_exception
 	ldr	r3, [r0, #THREAD_VM_RESULT]
 	mov	r2, #0
@@ -2133,17 +2004,18 @@
 	ldrb	r3, [r3, lr]
 
 	DISPATCH_NEXT
+	DISPATCH_NEXT
 
 	cmp	r3, #JVM_CONSTANT_Integer
 	cmpne	r3, #JVM_CONSTANT_Float
 	cmpne	r3, #JVM_CONSTANT_String
 	bne	1f
 
-	DISPATCH_NEXT
-
 	add	r3, r2, lr, lsl #2
-	ldr	lr, [r3, #32]
-	PUSH	lr
+	ldr	r3, [r3, #32]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	PUSH	r3
 	DISPATCH_FINISH
 1:
 	cmp	r3, #JVM_CONSTANT_Class
@@ -2156,20 +2028,19 @@
 2:
 	sub	jpc, jpc, #\seq_len
 	ldr	r0, [istate, #ISTATE_THREAD]
-        str     jpc, [istate, #ISTATE_BCP]
-        str     stack, [istate, #ISTATE_STACK]
+        DECACHE_JPC
+        DECACHE_STACK
 	mov	r1, #1
         bl      _ZN18InterpreterRuntime3ldcEP10JavaThreadb
+	ASSERT_STACK_CACHED
+	ASSERT_LOCALS_CACHED
 	ldr	r0, [istate, #ISTATE_THREAD]			@ thread
-	ldr	stack, [istate, #ISTATE_STACK]
-	ldr	constpool, [istate, #ISTATE_CONSTANTS]
+	CACHE_CP
 	ldr	r1, [r0, #THREAD_PENDING_EXC]
-	ldr	jpc, [istate, #ISTATE_BCP]
-	add	constpool, constpool, #CONST_POOL_OFFSET
+	CACHE_JPC
 	cmp	r1, #0
-	ldr	locals, [istate, #ISTATE_LOCALS]
-	bne	handle_exception
 	ldr	r3, [r0, #THREAD_VM_RESULT]
+	bne	handle_exception
 	mov	r2, #0
 	PUSH	r3
 	str	r2, [r0, #THREAD_VM_RESULT]
@@ -2191,23 +2062,26 @@
 	ldrb	tmp1, [tmp1, r3]
 
 	DISPATCH_NEXT
+	DISPATCH_NEXT
 
 	cmp	tmp1, #JVM_CONSTANT_Long
 	cmpne	tmp1, #JVM_CONSTANT_Double
 	bne	vm_fatal_error
 
-	DISPATCH_NEXT
 	add	tmp1, r2, r3, lsl #2
-	add	tmp1, tmp1, #32
-	ldmia	tmp1, {r3, tmp1}
-	PUSH2	r3, tmp1
+	ldr	r3, [tmp1, #32]
+	ldr	tmp1, [tmp1, #36]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	PUSH	r3, tmp1
 	DISPATCH_FINISH
 }
 
+#ifdef FAST_BYTECODES
 (iadd_u4store) {
 	ldrb	r3, [jpc, #2]
 	DISPATCH_START	\seq_len
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	add	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
@@ -2221,7 +2095,7 @@
 (isub_u4store) {
 	ldrb	r3, [jpc, #2]
 	DISPATCH_START	\seq_len
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	sub	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
@@ -2235,7 +2109,7 @@
 (iand_u4store) {
 	ldrb	r3, [jpc, #2]
 	DISPATCH_START	\seq_len
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	and	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
@@ -2249,7 +2123,7 @@
 (ior_u4store) {
 	ldrb	r3, [jpc, #2]
 	DISPATCH_START	\seq_len
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	orr	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
@@ -2263,7 +2137,7 @@
 (ixor_u4store) {
 	ldrb	r3, [jpc, #2]
 	DISPATCH_START	\seq_len
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	eor	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
@@ -2279,7 +2153,7 @@
 	DISPATCH_START	\seq_len
 	DISPATCH_NEXT
 	rsb	r3, lr, #opc_istore_0
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	add	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
@@ -2293,7 +2167,7 @@
 	DISPATCH_START	\seq_len
 	DISPATCH_NEXT
 	rsb	r3, lr, #opc_istore_0
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	sub	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
@@ -2307,7 +2181,7 @@
 	DISPATCH_START	\seq_len
 	DISPATCH_NEXT
 	rsb	r3, lr, #opc_istore_0
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	and	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
@@ -2321,7 +2195,7 @@
 	DISPATCH_START	\seq_len
 	DISPATCH_NEXT
 	rsb	r3, lr, #opc_istore_0
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	orr	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
@@ -2335,7 +2209,7 @@
 	DISPATCH_START	\seq_len
 	DISPATCH_NEXT
 	rsb	r3, lr, #opc_istore_0
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	eor	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
@@ -2344,7 +2218,7 @@
 	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
+@ r2 = [jpc, #1]
 (iload_iconst_N)
 {
         ldrb    r3, [jpc, #2]
@@ -2356,7 +2230,7 @@
         DISPATCH_NEXT
         DISPATCH_NEXT
         DISPATCH_NEXT
-        PUSH2   r3, tmp1
+        PUSH   r3, tmp1
         DISPATCH_FINISH
 }
 
@@ -2371,11 +2245,11 @@
         sub     tmp2, r2, #opc_iconst_0
         DISPATCH_NEXT
         DISPATCH_NEXT
-        PUSH2   tmp2, tmp1
+        PUSH   tmp2, tmp1
         DISPATCH_FINISH
 }
 
-# (aload_N)(getfield)
+@ (aload_N)(getfield)
 (iaccess_0,iaccess_1,iaccess_2,iaccess_3)
 {
 	ldrb	r2, [jpc, #3]
@@ -2386,12 +2260,10 @@
 	ldr	tmp1, [locals, tmp1, lsl #2]
 	add	tmp2, r3, lsl #4
 	DISPATCH_NEXT
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
 	DISPATCH_NEXT
-        ldr     tmp2, [tmp2, #8]
+        ldr     tmp2, [tmp2, #CP_OFFSET+8]
 	DISPATCH_NEXT
 .abortentry87:
 	ldr	tmp2, [tmp1, tmp2]
@@ -2400,451 +2272,837 @@
 	DISPATCH_FINISH
 }
 
-###############################################################################
-# ECN: Optimised bytecode pairs
-###############################################################################
-
-# --- ECN: load; load ---------------------------------------------------------
-
-(aload_0,aload_1,aload_2,aload_3)
-(aload_0,aload_1,aload_2,aload_3)
+@ r2 = [jpc, #1]
+(iload_iload) fast_iload_iload
 {
-	rsb	tmp1, r0, #opc_aload_0
+	ldrb	r3, [jpc, #3]
 	DISPATCH_START	\seq_len
-	rsb	tmp2, r1, #opc_aload_0
+	rsb	r2, r2, #0
 	DISPATCH_NEXT
-	ldr	tmp1, [locals, tmp1, lsl #2]
-	ldr	tmp2, [locals, tmp2, lsl #2]
+	rsb	r3, r3, #0
 	DISPATCH_NEXT
+	ldr	tmp1, [locals, r2, lsl #2]
 	DISPATCH_NEXT
+	ldr	r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-	PUSH2	tmp2, tmp1
+	PUSH	r3, tmp1
 	DISPATCH_FINISH
 }
 
-(aload_0,aload_1,aload_2,aload_3)
-(iload_0,iload_1,iload_2,iload_3)
+@ r2 = [jpc, #1]
+(iload_iload_N) fast_iload_iload_N
 {
-	rsb	tmp1, r0, #opc_aload_0
+	ldrb	r3, [jpc, #2]
 	DISPATCH_START	\seq_len
-	rsb	tmp2, r1, #opc_iload_0
+	rsb	r2, r2, #0
 	DISPATCH_NEXT
-	ldr	tmp1, [locals, tmp1, lsl #2]
-	ldr	tmp2, [locals, tmp2, lsl #2]
+	rsb	r3, r3, #opc_iload_0
 	DISPATCH_NEXT
+	ldr	tmp1, [locals, r2, lsl #2]
 	DISPATCH_NEXT
+	ldr	r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-	PUSH2	tmp2, tmp1
+	PUSH	r3, tmp1
 	DISPATCH_FINISH
 }
 
-(iload_0,iload_1,iload_2,iload_3)
-(aload_0,aload_1,aload_2,aload_3)
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload) fast_iload_N_iload
 {
-	rsb	tmp1, r0, #opc_iload_0
+	ldrb	r3, [jpc, #2]
+	rsb	r2, r0, #opc_iload_0_iload
 	DISPATCH_START	\seq_len
-	rsb	tmp2, r1, #opc_aload_0
+	rsb	r3, r3, #0
 	DISPATCH_NEXT
-	ldr	tmp1, [locals, tmp1, lsl #2]
-	ldr	tmp2, [locals, tmp2, lsl #2]
+	ldr	tmp1, [locals, r2, lsl #2]
 	DISPATCH_NEXT
+	ldr	r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	PUSH2	tmp2, tmp1
+	PUSH	r3, tmp1
 	DISPATCH_FINISH
 }
 
-# 7 cycles
-(iload_0,iload_1,iload_2,iload_3)
-(iload_0,iload_1,iload_2,iload_3)
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N) fast_iload_N_iload_N
 {
-	rsb	tmp1, r0, #opc_iload_0
+	rsb	r3, r0, #opc_iload_0_iload_N
 	DISPATCH_START	\seq_len
-	rsb	tmp2, r1, #opc_iload_0
+	rsb	r2, r2, #opc_iload_0
 	DISPATCH_NEXT
-	ldr	tmp1, [locals, tmp1, lsl #2]
-	ldr	tmp2, [locals, tmp2, lsl #2]
+	ldr	tmp1, [locals, r3, lsl #2]
 	DISPATCH_NEXT
+	ldr	r3, [locals, r2, lsl #2]
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	PUSH2	tmp2, tmp1
+	PUSH	r3, tmp1
 	DISPATCH_FINISH
 }
 
-(aload_0,aload_1,aload_2,aload_3)
-(iload,aload,fload)
-{
-	ldrb	r3, [jpc, #2]
-	rsb	tmp1, r0, #opc_aload_0
-	DISPATCH_START	\seq_len
-	ldr	tmp1, [locals, tmp1, lsl #2]
-	rsb	r3, r3, #0
+#endif // FAST_BYTECODE
+
+#ifdef HW_FP
+
+(fadd) fadd_vfp {
+	DISPATCH_START	1
+	vldr	s15, [stack, #8]
+	vldr	s14, [stack, #4]
 	DISPATCH_NEXT
-	ldr	r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
+	fadds	s15, s15, s14
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	PUSH2	r3, tmp1
+	vstr	s15, [stack, #8]
+	add	stack, stack, #4
 	DISPATCH_FINISH
 }
 
-(iload_0,iload_1,iload_2,iload_3)
-(iload,aload,fload)
-{
-	ldrb	r3, [jpc, #2]
-	rsb	tmp1, r0, #opc_iload_0
-	DISPATCH_START	\seq_len
-	ldr	tmp1, [locals, tmp1, lsl #2]
-	rsb	r3, r3, #0
+(dadd) dadd_vfp {
+	DISPATCH_START	1
+	vldr	d7, [stack, #12]
+	vldr	d6, [stack, #4]
 	DISPATCH_NEXT
-	ldr	r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
+	faddd	d0, d7, d6
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	PUSH2	r3, tmp1
+	vstr	d0, [stack, #12]
+	add	stack, stack, #8
 	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
-(iload,aload,fload)
-(aload_0,aload_1,aload_2,aload_3)
-{
-	DISPATCH_START	\seq_len
-	rsb	tmp2, r1, #opc_aload_0
+(fsub) fsub_vfp {
+	DISPATCH_START	1
+	vldr	s15, [stack, #8]
+	vldr	s14, [stack, #4]
 	DISPATCH_NEXT
-	rsb	tmp1, r2, #0
-	ldr	tmp2, [locals, tmp2, lsl #2]
 	DISPATCH_NEXT
-	ldr	tmp1, [locals, tmp1, lsl #2]
+	fsubs	s15, s15, s14
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	PUSH2	tmp2, tmp1
+	vstr	s15, [stack, #8]
+	add	stack, stack, #4
 	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
-(iload,aload,fload)
-(iload_0,iload_1,iload_2,iload_3)
-{
-	DISPATCH_START	\seq_len
-	rsb	tmp2, r1, #opc_iload_0
+(fmul) fmul_vfp {
+	DISPATCH_START	1
+	vldr	s15, [stack, #8]
+	vldr	s14, [stack, #4]
 	DISPATCH_NEXT
-	rsb	tmp1, r2, #0
-	ldr	tmp2, [locals, tmp2, lsl #2]
 	DISPATCH_NEXT
-	ldr	tmp1, [locals, tmp1, lsl #2]
+	fmuls	s15, s15, s14
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	PUSH2	tmp2, tmp1
+	vstr	s15, [stack, #8]
+	add	stack, stack, #4
 	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
-(iload,aload,fload)(iload,aload,fload) {
-	ldrb	tmp2, [jpc, #3]
-	rsb	tmp1, r2, #0
-	DISPATCH_START	\seq_len
-	rsb	tmp2, tmp2, #0
-	ldr	tmp1, [locals, tmp1, lsl #2]
+(dmul) dmul_vfp {
+	FBC	cmp	r2, #opc_dadd
+	DISPATCH_START	1
+	FBC	beq	1f
+2:
+	vldr	d7, [stack, #12]
+	vldr	d6, [stack, #4]
 	DISPATCH_NEXT
-	ldr	tmp2, [locals, tmp2, lsl #2]
 	DISPATCH_NEXT
+	fmuld	d0, d7, d6
 	DISPATCH_NEXT
-	PUSH2	tmp2, tmp1
+	DISPATCH_NEXT
+	vstr	d0, [stack, #12]
+	add	stack, stack, #8
 	DISPATCH_FINISH
+1:
+	FBC	mov	r2, #opc_dmac
+	FBC	strb	r2, [jpc, #-1]
+	FBC	b	2b
 }
 
-# --- ECN: load; store --------------------------------------------------------
+#ifdef FAST_BYTECODES
 
-(aload_0,aload_1,aload_2,aload_3)
-(astore_0,astore_1,astore_2,astore_3)
-{
-	rsb	tmp1, r0, #opc_aload_0
+(dmac) dmac_vfp {
 	DISPATCH_START	\seq_len
-	rsb	tmp2, r1, #opc_astore_0
+	vldr	d2, [stack, #20]
+	vldr	d1, [stack, #12]
+	vldr	d0, [stack, #4]
 	DISPATCH_NEXT
-	ldr	tmp1, [locals, tmp1, lsl #2]
 	DISPATCH_NEXT
+	fmacd	d2, d1, d0
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	str	tmp1, [locals, tmp2, lsl #2]
+	vstr	d2, [stack, #20]
+	add	stack, stack, #16
 	DISPATCH_FINISH
 }
 
-(iload_0,iload_1,iload_2,iload_3)
-(istore_0,istore_1,istore_2,istore_3)
-{
-	rsb	tmp1, r0, #opc_iload_0
-	DISPATCH_START	\seq_len
-	rsb	tmp2, r1, #opc_istore_0
+#endif // FAST_BYTECODES
+
+(fdiv) fdiv_vfp {
+	DISPATCH_START	1
+	vldr	s15, [stack, #8]
+	vldr	s14, [stack, #4]
 	DISPATCH_NEXT
-	ldr	tmp1, [locals, tmp1, lsl #2]
 	DISPATCH_NEXT
+	fdivs	s15, s15, s14
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	str	tmp1, [locals, tmp2, lsl #2]
+	vstr	s15, [stack, #8]
+	add	stack, stack, #4
 	DISPATCH_FINISH
 }
 
-(aload_0,aload_1,aload_2,aload_3)
-(astore,istore,fstore)
-{
-	ldrb	tmp2, [jpc, #2]
-	rsb	tmp1, r0, #opc_aload_0
-	DISPATCH_START	\seq_len
-	rsb	tmp2, tmp2, #0
+(ddiv) ddiv_vfp {
+	DISPATCH_START	1
+	vldr	d7, [stack, #12]
+	vldr	d6, [stack, #4]
 	DISPATCH_NEXT
-	ldr	tmp1, [locals, tmp1, lsl #2]
 	DISPATCH_NEXT
+	fdivd	d0, d7, d6
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	str	tmp1, [locals, tmp2, lsl #2]
+	vstr	d0, [stack, #12]
+	add	stack, stack, #8
 	DISPATCH_FINISH
 }
 
-(iload_0,iload_1,iload_2,iload_3)
-(astore,istore,fstore)
-{
-	ldrb	tmp2, [jpc, #2]
-	rsb	tmp1, r0, #opc_iload_0
-	DISPATCH_START	\seq_len
-	rsb	tmp2, tmp2, #0
-	DISPATCH_NEXT
-	ldr	tmp1, [locals, tmp1, lsl #2]
+(fcmpl) fcmpl_vfp {
+	DISPATCH_START 1
+	flds	s14, [stack, #8]
+	flds	s15, [stack, #4]
 	DISPATCH_NEXT
 	DISPATCH_NEXT
+	fcmpes	s14, s15
+	add	stack, stack, #8
+	fmstat
+	mvnmi	r3, #0
+	bmi	1f
+	movgt	r3, #1
+	bgt	1f
+	fcmps	s14, s15
+	fmstat
+	moveq	r3, #0
+	mvnne	r3, #0
+1:
 	DISPATCH_NEXT
-	str	tmp1, [locals, tmp2, lsl #2]
+	DISPATCH_NEXT
+	PUSH	r3
 	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
-(iload,aload,fload)
-(astore_0,astore_1,astore_2,astore_3)
-{
-	DISPATCH_START	\seq_len
-	rsb	tmp1, r1, #opc_astore_0
+(fcmpg) fcmpg_vfp {
+	DISPATCH_START	1
+	flds	s14, [stack, #8]
+	flds	s15, [stack, #4]
 	DISPATCH_NEXT
-	rsb	tmp2, r2, #0
-	ldr	tmp2, [locals, tmp2, lsl #2]
 	DISPATCH_NEXT
+	fcmpes	s14, s15
+	add	stack, stack, #8
+	fmstat
+	mvnmi	r3, #0
+	bmi	1f
+	movgt	r3, #1
+	bgt	1f
+	fcmps	s14, s15
+	fmstat
+	moveq	r3, #0
+	movne	r3, #1
+1:
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	str	tmp2, [locals, tmp1, lsl #2]
+	PUSH	r3
 	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
-(iload,aload,fload)
-(istore_0,istore_1,istore_2,istore_3)
+(dcmpl) dcmpl_vfp {
+	DISPATCH_START	1
+	fldd	d6, [stack, #12]
+	fldd	d7, [stack, #4]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	fcmped	d6, d7
+	fmstat
+	mvnmi	r3, #0
+	bmi	1f
+	movgt	r3, #1
+	bgt	1f
+	fcmpd	d6, d7
+	fmstat
+	moveq	r3, #0
+	mvnne	r3, #0
+1:
+	add	stack, stack, #16
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	PUSH	r3
+	DISPATCH_FINISH
+}
+
+(dcmpg) dcmpg_vfp {
+	DISPATCH_START	1
+	fldd	d6, [stack, #12]
+	fldd	d7, [stack, #4]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	fcmped	d6, d7
+	fmstat
+	mvnmi	r3, #0
+	bmi	1f
+	movgt	r3, #1
+	bgt	1f
+	fcmpd	d6, d7
+	fmstat
+	moveq	r3, #0
+	movne	r3, #1
+1:
+	add	stack, stack, #16
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	PUSH	r3
+	DISPATCH_FINISH
+}
+
+#endif // HW_FP
+
+#ifdef FAST_BYTECODES
+
+@##############################################################################
+@ ECN: Optimised bytecode pairs
+@##############################################################################
+
+@ --- ECN: load; iaccess ------------------------------------------------------
+
+(iload_0,iload_1,iload_2,iload_3)
+(iaccess_0,iaccess_1,iaccess_2,iaccess_3)
 {
+	rsb	lr, r0, #opc_iload_0
+	ldrb	r2, [jpc, #4]
+	rsb	tmp1, r1, #opc_iaccess_0
+	ldrb	r3, [jpc, #3]
+	ldr	lr, [locals, lr, lsl #2]
+	add	tmp2, constpool, r2, lsl #12
 	DISPATCH_START	\seq_len
-	rsb	tmp1, r1, #opc_istore_0
+	PUSH	lr
+	ldr	tmp1, [locals, tmp1, lsl #2]
+	add	tmp2, r3, lsl #4
 	DISPATCH_NEXT
-	rsb	tmp2, r2, #0
-	ldr	tmp2, [locals, tmp2, lsl #2]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
 	DISPATCH_NEXT
+        ldr     tmp2, [tmp2, #CP_OFFSET+8]
 	DISPATCH_NEXT
+.abortentry111:
+	ldr	tmp2, [tmp1, tmp2]
 	DISPATCH_NEXT
-	str	tmp2, [locals, tmp1, lsl #2]
+	PUSH	tmp2
 	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
-(iload,aload,fload)(astore,istore,fstore) {
-	ldrb	tmp1, [jpc, #3]
-	rsb	tmp2, r2, #0
+(iload,aload,fload)
+(iaccess_0,iaccess_1,iaccess_2,iaccess_3)
+{
+	rsb	lr, r2, #0
+	ldrb	r2, [jpc, #5]
+	rsb	tmp1, r1, #opc_iaccess_0
+	ldrb	r3, [jpc, #4]
+	ldr	lr, [locals, lr, lsl #2]
+	add	tmp2, constpool, r2, lsl #12
 	DISPATCH_START	\seq_len
-	rsb	tmp1, tmp1, #0
+	PUSH	lr
+	ldr	tmp1, [locals, tmp1, lsl #2]
+	add	tmp2, r3, lsl #4
 	DISPATCH_NEXT
-	ldr	tmp2, [locals, tmp2, lsl #2]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
 	DISPATCH_NEXT
+        ldr     tmp2, [tmp2, #CP_OFFSET+8]
 	DISPATCH_NEXT
+.abortentry112:
+	ldr	tmp2, [tmp1, tmp2]
 	DISPATCH_NEXT
-	str	tmp2, [locals, tmp1, lsl #2]
+	PUSH	tmp2
 	DISPATCH_FINISH
 }
 
-# --- ECN: load; const -------------------------------------------------------
+@ --- ECN: load; load ---------------------------------------------------------
 
 (aload_0,aload_1,aload_2,aload_3)
-(iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5)
+(aload_0,aload_1,aload_2,aload_3)
 {
 	rsb	tmp1, r0, #opc_aload_0
 	DISPATCH_START	\seq_len
-	sub	tmp2, r1, #opc_iconst_0
+	rsb	tmp2, r1, #opc_aload_0
 	DISPATCH_NEXT
 	ldr	tmp1, [locals, tmp1, lsl #2]
+	ldr	tmp2, [locals, tmp2, lsl #2]
 	DISPATCH_NEXT
-	PUSH	tmp1
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	PUSH	tmp2
+	PUSH	tmp2, tmp1
 	DISPATCH_FINISH
 }
 
+(aload_0,aload_1,aload_2,aload_3)
 (iload_0,iload_1,iload_2,iload_3)
-(iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5)
 {
-        add     r0, r0, #opc_iload_0_iconst_N-opc_iload_0
-        strb    r0, [jpc]
-	b	do_iload_0_iconst_N
+	rsb	tmp1, r0, #opc_aload_0
+	DISPATCH_START	\seq_len
+	rsb	tmp2, r1, #opc_iload_0
+	DISPATCH_NEXT
+	ldr	tmp1, [locals, tmp1, lsl #2]
+	ldr	tmp2, [locals, tmp2, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	PUSH	tmp2, tmp1
+	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
-(iload,aload,fload)
-(iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5)
+(iload_0,iload_1,iload_2,iload_3)
+(aload_0,aload_1,aload_2,aload_3)
 {
-        cmp     r0, #opc_iload
+	rsb	tmp1, r0, #opc_iload_0
         DISPATCH_START  \seq_len
-        sub     r3, r1, #opc_iconst_0
-        DISPATCH_NEXT
-        ldr     tmp2, [locals, -r2, lsl #2]
+	rsb	tmp2, r1, #opc_aload_0
         DISPATCH_NEXT
+	ldr	tmp1, [locals, tmp1, lsl #2]
+	cmp	r0, #opc_igetfield
+	ldr	tmp2, [locals, tmp2, lsl #2]
         beq     1f
+2:
         DISPATCH_NEXT
         DISPATCH_NEXT
-        PUSH2   r3, tmp2
+	DISPATCH_NEXT
+	PUSH	tmp2, tmp1
         DISPATCH_FINISH
 1:
-        mov     tmp1, #opc_iload_iconst_N
-        strb    tmp1, [jpc, #-\seq_len]!
-	b	do_iload_iconst_N
+	ldrb	lr, [jpc, #-1]
+	add	lr, lr, #opc_iaccess_0-opc_aload_0
+	strb	lr, [jpc, #-1]
+	b	2b
+}
+
+@ 7 cycles
+(iload_0,iload_1,iload_2,iload_3)
+(iload_0,iload_1,iload_2,iload_3)
+{
+	add	r0, r0, #opc_iload_0_iload_N-opc_iload_0
+	strb	r0, [jpc]
+	b	do_fast_iload_N_iload_N
 }
 
 (aload_0,aload_1,aload_2,aload_3)
-(bipush)
+(iload,aload,fload)
 {
-	ldrsb	r2, [jpc, #2]
-	rsb	r3, r0, #opc_aload_0
+	ldrb	r3, [jpc, #2]
+	rsb	tmp1, r0, #opc_aload_0
 	DISPATCH_START	\seq_len
+	ldr	tmp1, [locals, tmp1, lsl #2]
+	rsb	r3, r3, #0
+	DISPATCH_NEXT
 	ldr	r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	PUSH	r3, tmp1
 	DISPATCH_FINISH
 }
 
 (iload_0,iload_1,iload_2,iload_3)
-(bipush)
+(aload,fload)
 {
-	ldrsb	r2, [jpc, #2]
-	rsb	r3, r0, #opc_iload_0
+	ldrb	r3, [jpc, #2]
+	rsb	tmp1, r0, #opc_iload_0
 	DISPATCH_START	\seq_len
+	ldr	tmp1, [locals, tmp1, lsl #2]
+	rsb	r3, r3, #0
+	DISPATCH_NEXT
 	ldr	r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	PUSH	r3, tmp1
 	DISPATCH_FINISH
 }
 
+(iload_0,iload_1,iload_2,iload_3)
+(iload)
+{
+	add	r0, r0, #opc_iload_0_iload-opc_iload_0
+	strb	r0, [jpc]
+	b	do_fast_iload_N_iload
+}
+
+@ r2 = [jpc, #1]
+(iload,aload,fload)
 (aload_0,aload_1,aload_2,aload_3)
-(sipush)
 {
-        ldrsb   r2, [jpc, #2]   @ zero_extendqisi2
-        ldrb    lr, [jpc, #3]   @ zero_extendqisi2
-	rsb	r3, r0, #opc_aload_0
 	DISPATCH_START	\seq_len
-	ldr	r3, [locals, r3, lsl #2]
+	rsb	tmp2, r1, #opc_aload_0
+	DISPATCH_NEXT
+	rsb	tmp1, r2, #0
+	ldr	tmp2, [locals, tmp2, lsl #2]
+	cmp	r0, #opc_igetfield
+	DISPATCH_NEXT
+	beq	1f
+2:
+	ldr	tmp1, [locals, tmp1, lsl #2]
 	DISPATCH_NEXT
-        orr     r2, lr, r2, asl #8
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	PUSH	tmp2, tmp1
 	DISPATCH_FINISH
+1:
+	ldrb	lr, [jpc, #-1]
+	add	lr, lr, #opc_iaccess_0-opc_aload_0
+	strb	lr, [jpc, #-1]
+	b	2b
 }
 
+@ r2 = [jpc, #1]
+(aload,fload)
 (iload_0,iload_1,iload_2,iload_3)
-(sipush)
 {
-        ldrsb   r2, [jpc, #2]   @ zero_extendqisi2
-        ldrb    lr, [jpc, #3]   @ zero_extendqisi2
-	rsb	r3, r0, #opc_iload_0
 	DISPATCH_START	\seq_len
-	ldr	r3, [locals, r3, lsl #2]
+	rsb	tmp2, r1, #opc_iload_0
+	DISPATCH_NEXT
+	rsb	tmp1, r2, #0
+	ldr	tmp2, [locals, tmp2, lsl #2]
+	DISPATCH_NEXT
+	ldr	tmp1, [locals, tmp1, lsl #2]
 	DISPATCH_NEXT
-        orr     r2, lr, r2, asl #8
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	PUSH	tmp2, tmp1
 	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
-(iload,aload,fload)(bipush) {
-	ldrsb	r3, [jpc, #3]
-	DISPATCH_START	\seq_len
-	ldr	lr, [locals, -r2, lsl #2]
-	DISPATCH_NEXT
-	PUSH2	r3, lr
-	DISPATCH_FINISH
+@ r2 = [jpc, #1]
+(iload)
+(iload_0,iload_1,iload_2,iload_3)
+{
+	mov	r0, #opc_iload_iload_N
+	strb	r0, [jpc]
+	b	do_fast_iload_iload_N
 }
 
-# r2 = [jpc, #1]
-(iload,aload,fload)(sipush) {
-	ldrsb	r3, [jpc, #3]
-	ldrb	lr, [jpc, #4]
+@ r2 = [jpc, #1]
+(aload,fload)(iload,aload,fload) {
+	ldrb	tmp2, [jpc, #3]
+	rsb	tmp1, r2, #0
 	DISPATCH_START	\seq_len
-	ldr	tmp1, [locals, -r2, lsl #2]
-        orr     r3, lr, r3, asl #8
+	rsb	tmp2, tmp2, #0
+	ldr	tmp1, [locals, tmp1, lsl #2]
+	DISPATCH_NEXT
+	ldr	tmp2, [locals, tmp2, lsl #2]
 	DISPATCH_NEXT
-	PUSH2	r3, tmp1
+	DISPATCH_NEXT
+	PUSH	tmp2, tmp1
 	DISPATCH_FINISH
 }
 
-# --- ECN: load; Xaload -------------------------------------------------------
+(iload)(iload) {
+	mov	r0, #opc_iload_iload
+	strb	r0, [jpc]
+	b	do_fast_iload_iload
+}
 
-(iload_0,iload_1,iload_2,iload_3)
-(iaload,aaload,faload)
-{
-	POP	r3
-	rsb	r2, r0, #opc_iload_0
+(iload)(aload,fload) {
+	ldrb	tmp2, [jpc, #3]
+	rsb	tmp1, r2, #0
 	DISPATCH_START	\seq_len
-	ldr	r2, [locals, r2, lsl #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
-.abortentry19:
-	ldr	lr, [r3, #8]		@ lr = length
+	rsb	tmp2, tmp2, #0
+	ldr	tmp1, [locals, tmp1, lsl #2]
 	DISPATCH_NEXT
-	cmp	r2, lr
-	bcs	array_bound_exception_jpc_1
-	add	r3, r3, r2, lsl #2
-	ldr	lr, [r3, #12]
+	ldr	tmp2, [locals, tmp2, lsl #2]
 	DISPATCH_NEXT
-	PUSH	lr
+	DISPATCH_NEXT
+	PUSH	tmp2, tmp1
 	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
-(iload,aload,fload)(iaload,aaload,faload) {
-	POP	r3
-	ldr	r2, [locals, -r2, lsl #2]
+@ --- ECN: load; store --------------------------------------------------------
+
+(aload_0,aload_1,aload_2,aload_3)
+(astore_0,astore_1,astore_2,astore_3)
+{
+	rsb	tmp1, r0, #opc_aload_0
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
-.abortentry20:
-	ldr	lr, [r3, #8]		@ lr = length
+	rsb	tmp2, r1, #opc_astore_0
 	DISPATCH_NEXT
-	cmp	r2, lr
-	bcs	array_bound_exception_jpc_1
-	add	r3, r3, r2, lsl #2
-	ldr	lr, [r3, #12]
+	ldr	tmp1, [locals, tmp1, lsl #2]
 	DISPATCH_NEXT
-	PUSH	lr
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	str	tmp1, [locals, tmp2, lsl #2]
 	DISPATCH_FINISH
 }
 
 (iload_0,iload_1,iload_2,iload_3)
-(baload)
+(istore_0,istore_1,istore_2,istore_3)
 {
-	POP	r3
-	rsb	r2, r0, #opc_iload_0
+	rsb	tmp1, r0, #opc_iload_0
 	DISPATCH_START	\seq_len
-	ldr	r2, [locals, r2, lsl #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	rsb	tmp2, r1, #opc_istore_0
+	DISPATCH_NEXT
+	ldr	tmp1, [locals, tmp1, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	str	tmp1, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(aload_0,aload_1,aload_2,aload_3)
+(astore,istore,fstore)
+{
+	ldrb	tmp2, [jpc, #2]
+	rsb	tmp1, r0, #opc_aload_0
+	DISPATCH_START	\seq_len
+	rsb	tmp2, tmp2, #0
+	DISPATCH_NEXT
+	ldr	tmp1, [locals, tmp1, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	str	tmp1, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0,iload_1,iload_2,iload_3)
+(astore,istore,fstore)
+{
+	ldrb	tmp2, [jpc, #2]
+	rsb	tmp1, r0, #opc_iload_0
+	DISPATCH_START	\seq_len
+	rsb	tmp2, tmp2, #0
+	DISPATCH_NEXT
+	ldr	tmp1, [locals, tmp1, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	str	tmp1, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+@ r2 = [jpc, #1]
+(iload,aload,fload)
+(astore_0,astore_1,astore_2,astore_3)
+{
+	DISPATCH_START	\seq_len
+	rsb	tmp1, r1, #opc_astore_0
+	DISPATCH_NEXT
+	rsb	tmp2, r2, #0
+	ldr	tmp2, [locals, tmp2, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	str	tmp2, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+@ r2 = [jpc, #1]
+(iload,aload,fload)
+(istore_0,istore_1,istore_2,istore_3)
+{
+	DISPATCH_START	\seq_len
+	rsb	tmp1, r1, #opc_istore_0
+	DISPATCH_NEXT
+	rsb	tmp2, r2, #0
+	ldr	tmp2, [locals, tmp2, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	str	tmp2, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+@ r2 = [jpc, #1]
+(iload,aload,fload)(astore,istore,fstore) {
+	ldrb	tmp1, [jpc, #3]
+	rsb	tmp2, r2, #0
+	DISPATCH_START	\seq_len
+	rsb	tmp1, tmp1, #0
+	DISPATCH_NEXT
+	ldr	tmp2, [locals, tmp2, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	str	tmp2, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+@ --- ECN: load; const -------------------------------------------------------
+
+(aload_0,aload_1,aload_2,aload_3)
+(iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5)
+{
+	rsb	tmp1, r0, #opc_aload_0
+	DISPATCH_START	\seq_len
+	sub	tmp2, r1, #opc_iconst_0
+	DISPATCH_NEXT
+	ldr	tmp1, [locals, tmp1, lsl #2]
+	DISPATCH_NEXT
+	PUSH	tmp1
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	PUSH	tmp2
+	DISPATCH_FINISH
+}
+
+(iload_0,iload_1,iload_2,iload_3)
+(iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5)
+{
+        add     r0, r0, #opc_iload_0_iconst_N-opc_iload_0
+        strb    r0, [jpc]
+	b	do_iload_0_iconst_N
+}
+
+@ r2 = [jpc, #1]
+(iload,aload,fload)
+(iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5)
+{
+        cmp     r0, #opc_iload
+        DISPATCH_START  \seq_len
+        sub     r3, r1, #opc_iconst_0
+        DISPATCH_NEXT
+        ldr     tmp2, [locals, -r2, lsl #2]
+        DISPATCH_NEXT
+        beq     1f
+        DISPATCH_NEXT
+        DISPATCH_NEXT
+        PUSH   r3, tmp2
+        DISPATCH_FINISH
+1:
+        mov     tmp1, #opc_iload_iconst_N
+        strb    tmp1, [jpc, #-\seq_len]!
+	b	do_iload_iconst_N
+}
+
+(aload_0,aload_1,aload_2,aload_3)
+(bipush)
+{
+	ldrsb	r2, [jpc, #2]
+	rsb	r3, r0, #opc_aload_0
+	DISPATCH_START	\seq_len
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	PUSH	r2, r3
+	DISPATCH_FINISH
+}
+
+(iload_0,iload_1,iload_2,iload_3)
+(bipush)
+{
+	ldrsb	r2, [jpc, #2]
+	rsb	r3, r0, #opc_iload_0
+	DISPATCH_START	\seq_len
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	PUSH	r2, r3
+	DISPATCH_FINISH
+}
+
+(aload_0,aload_1,aload_2,aload_3)
+(sipush)
+{
+        ldrsb   r2, [jpc, #2]   @ zero_extendqisi2
+        ldrb    lr, [jpc, #3]   @ zero_extendqisi2
+	rsb	r3, r0, #opc_aload_0
+	DISPATCH_START	\seq_len
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+        orr     r2, lr, r2, asl #8
+	DISPATCH_NEXT
+	PUSH	r2, r3
+	DISPATCH_FINISH
+}
+
+(iload_0,iload_1,iload_2,iload_3)
+(sipush)
+{
+        ldrsb   r2, [jpc, #2]   @ zero_extendqisi2
+        ldrb    lr, [jpc, #3]   @ zero_extendqisi2
+	rsb	r3, r0, #opc_iload_0
+	DISPATCH_START	\seq_len
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+        orr     r2, lr, r2, asl #8
+	DISPATCH_NEXT
+	PUSH	r2, r3
+	DISPATCH_FINISH
+}
+
+@ r2 = [jpc, #1]
+(iload,aload,fload)(bipush) {
+	ldrsb	r3, [jpc, #3]
+	DISPATCH_START	\seq_len
+	ldr	lr, [locals, -r2, lsl #2]
+	DISPATCH_NEXT
+	PUSH	r3, lr
+	DISPATCH_FINISH
+}
+
+@ r2 = [jpc, #1]
+(iload,aload,fload)(sipush) {
+	ldrsb	r3, [jpc, #3]
+	ldrb	lr, [jpc, #4]
+	DISPATCH_START	\seq_len
+	ldr	tmp1, [locals, -r2, lsl #2]
+        orr     r3, lr, r3, asl #8
+	DISPATCH_NEXT
+	PUSH	r3, tmp1
+	DISPATCH_FINISH
+}
+
+@ --- ECN: load; Xaload -------------------------------------------------------
+
+(iload_0,iload_1,iload_2,iload_3)
+(iaload,aaload,faload)
+{
+	POP	r3
+	rsb	r2, r0, #opc_iload_0
+	DISPATCH_START	\seq_len
+	ldr	r2, [locals, r2, lsl #2]
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
+.abortentry19:
+	ldr	lr, [r3, #8]		@ lr = length
+	DISPATCH_NEXT
+	cmp	r2, lr
+	bcs	array_bound_exception_jpc_1
+	add	r3, r3, r2, lsl #2
+	ldr	lr, [r3, #12]
+	DISPATCH_NEXT
+	PUSH	lr
+	DISPATCH_FINISH
+}
+
+@ r2 = [jpc, #1]
+(iload,aload,fload)(iaload,aaload,faload) {
+	POP	r3
+	ldr	r2, [locals, -r2, lsl #2]
+	DISPATCH_START	\seq_len
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
+.abortentry20:
+	ldr	lr, [r3, #8]		@ lr = length
+	DISPATCH_NEXT
+	cmp	r2, lr
+	bcs	array_bound_exception_jpc_1
+	add	r3, r3, r2, lsl #2
+	ldr	lr, [r3, #12]
+	DISPATCH_NEXT
+	PUSH	lr
+	DISPATCH_FINISH
+}
+
+(iload_0,iload_1,iload_2,iload_3)
+(baload)
+{
+	POP	r3
+	rsb	r2, r0, #opc_iload_0
+	DISPATCH_START	\seq_len
+	ldr	r2, [locals, r2, lsl #2]
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry21:
 	ldr	lr, [r3, #8]		@ lr = length
 	DISPATCH_NEXT
@@ -2864,10 +3122,8 @@
 	rsb	r2, r0, #opc_iload_0
 	DISPATCH_START	\seq_len
 	ldr	r2, [locals, r2, lsl #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry22:
 	ldr	lr, [r3, #8]		@ lr = length
 	DISPATCH_NEXT
@@ -2887,10 +3143,8 @@
 	rsb	r2, r0, #opc_iload_0
 	DISPATCH_START	\seq_len
 	ldr	r2, [locals, r2, lsl #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry23:
 	ldr	lr, [r3, #8]		@ lr = length
 	DISPATCH_NEXT
@@ -2903,15 +3157,13 @@
 	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
+@ r2 = [jpc, #1]
 (iload,aload,fload)(baload) {
 	POP	r3
 	ldr	r2, [locals, -r2, lsl #2]
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry24:
 	ldr	lr, [r3, #8]		@ lr = length
 	DISPATCH_NEXT
@@ -2924,15 +3176,13 @@
 	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
+@ r2 = [jpc, #1]
 (iload,aload,fload)(caload) {
 	POP	r3
 	ldr	r2, [locals, -r2, lsl #2]
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry25:
 	ldr	lr, [r3, #8]		@ lr = length
 	DISPATCH_NEXT
@@ -2945,15 +3195,13 @@
 	DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
+@ r2 = [jpc, #1]
 (iload,aload,fload)(saload) {
 	POP	r3
 	ldr	r2, [locals, -r2, lsl #2]
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry26:
 	ldr	lr, [r3, #8]		@ lr = length
 	DISPATCH_NEXT
@@ -2966,19 +3214,17 @@
 	DISPATCH_FINISH
 }
 
-# --- ECN: load; Xastore -------------------------------------------------------
+@ --- ECN: load; Xastore -------------------------------------------------------
 
 (iload_0,iload_1,iload_2,iload_3)
 (iastore,fastore)
 {
-	POP2	r2, r3
+	POP	r2, r3
 	rsb	tmp1, r0, #opc_iload_0
 	DISPATCH_START	\seq_len
 	ldr	tmp1, [locals, tmp1, lsl #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry27:
 	ldr	lr, [r3, #8]		@ lr = limit
 	DISPATCH_NEXT
@@ -2993,14 +3239,12 @@
 (iload_0,iload_1,iload_2,iload_3)
 (bastore)
 {
-	POP2	r2, r3
+	POP	r2, r3
 	rsb	tmp1, r0, #opc_iload_0
 	DISPATCH_START	\seq_len
 	ldr	tmp1, [locals, tmp1, lsl #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry28:
 	ldr	lr, [r3, #8]		@ lr = limit
 	DISPATCH_NEXT
@@ -3015,14 +3259,12 @@
 (iload_0,iload_1,iload_2,iload_3)
 (castore,sastore)
 {
-	POP2	r2, r3
+	POP	r2, r3
 	rsb	tmp1, r0, #opc_iload_0
 	DISPATCH_START	\seq_len
 	ldr	tmp1, [locals, tmp1, lsl #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry29:
 	ldr	lr, [r3, #8]		@ lr = limit
 	DISPATCH_NEXT
@@ -3035,13 +3277,11 @@
 }
 
 (iload,aload,fload)(iastore,fastore) {
-	POP2	r3, tmp1
+	POP	r3, tmp1
 	DISPATCH_START	\seq_len
 	ldr	r2, [locals, -r2, lsl #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry30:
 	ldr	lr, [tmp1, #8]		@ lr = limit
 	DISPATCH_NEXT
@@ -3054,13 +3294,11 @@
 }
 
 (iload,aload,fload)(bastore) {
-	POP2	r3, tmp1
+	POP	r3, tmp1
 	DISPATCH_START	\seq_len
 	ldr	r2, [locals, -r2, lsl #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry31:
 	ldr	lr, [tmp1, #8]		@ lr = limit
 	DISPATCH_NEXT
@@ -3073,13 +3311,11 @@
 }
 
 (iload,aload,fload)(castore,sastore) {
-	POP2	r3, tmp1
+	POP	r3, tmp1
 	DISPATCH_START	\seq_len
 	ldr	r2, [locals, -r2, lsl #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry32:
 	ldr	lr, [tmp1, #8]		@ lr = limit
 	DISPATCH_NEXT
@@ -3091,7 +3327,7 @@
 	DISPATCH_FINISH
 }
 
-# --- ECN: load; dataop -------------------------------------------------------
+@ --- ECN: load; dataop -------------------------------------------------------
 
 (iload_0,iload_1,iload_2,iload_3)
 (iadd)
@@ -3181,34 +3417,34 @@
 (iload_0,iload_1,iload_2,iload_3)
 (idiv)
 {
-	rsb	r0, r0, #opc_iload_0
-	ldr	r0, [locals, r0, lsl #2]
-	add	jpc, jpc, #1
-	POP	r1
+	rsb	tmp2, r0, #opc_iload_0
+	DISPATCH_START	2
+	ldr	tmp2, [locals, tmp2, lsl #2]
+	POP	tmp1
 	b	int_div
 }
 
 (iload,aload,fload)(idiv) {
-	add	jpc, jpc, #2
-	POP	r1
-	ldr	r0, [locals, -r2, lsl #2]
+	DISPATCH_START	3
+	POP	tmp1
+	ldr	tmp2, [locals, -r2, lsl #2]
 	b	int_div
 }
 
 (iload_0,iload_1,iload_2,iload_3)
 (irem)
 {
-	rsb	r0, r0, #opc_iload_0
-	ldr	r0, [locals, r0, lsl #2]
-	add	jpc, jpc, #1
-	POP	r1
+	rsb	tmp2, r0, #opc_iload_0
+	DISPATCH_START	2
+	ldr	tmp2, [locals, tmp2, lsl #2]
+	POP	tmp1
 	b	int_rem
 }
 
 (iload,aload,fload)(irem) {
-	ldr	r0, [locals, -r2, lsl #2]
-	add	jpc, jpc, #2
-	POP	r1
+	DISPATCH_START	3
+	POP	tmp1
+	ldr	tmp2, [locals, -r2, lsl #2]
 	b	int_rem
 }
 
@@ -3422,7 +3658,9 @@
 	DISPATCH_FINISH
 }
 
-# --- ECN: load; branch -------------------------------------------------------
+#ifdef NOTICE_SAFEPOINTS
+
+@ --- ECN: load; branch -------------------------------------------------------
 
 (iload_0,iload_1,iload_2,iload_3)
 (ifeq,ifnull)
@@ -3808,7 +4046,7 @@
 	DISPATCH_BYTECODE
 }
 
-# --- ECN: load; return/invoke -------------------------------------------------
+@ --- ECN: load; return/invoke -------------------------------------------------
 
 (iload_0,iload_1,iload_2,iload_3)
 (ireturn,areturn,freturn)
@@ -3827,14 +4065,18 @@
 	ldr	r0, [istate, #ISTATE_METHOD]
 	ldr	r3, [stack, #0]
 	ldrh	r0, [r0, #40]
-	ldr	istate, [istate, #ISTATE_SAVED_ISTATE]
+	ldr	ip, [istate, #ISTATE_ADVANCE_PC]
+	ldr	istate, [istate, #ISTATE_NEXT_FRAME]
 	str	r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 	str	r1, [stack, r0, lsl #2]!
-	cmp	istate, #0
+	cmp	ip, #0
 	beq	normal_return
-        ldr     jpc, [istate, #ISTATE_BCP]
+
+	sub	istate, istate, #ISTATE_NEXT_FRAME
+
+        CACHE_JPC
         ldr     r2, [istate, #ISTATE_STACK_LIMIT]
-	DISPATCH_START	3				@ ldrb	r0, [jpc, #3]!
+	DISPATCH_START_REG ip
         sub     stack, stack, #4
         ldr     r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 	DISPATCH_NEXT					@ ldrb	r1, [jpc, #2]
@@ -3843,10 +4085,9 @@
         str     r2, [tmp_xxx, #THREAD_JAVA_SP]
 	DISPATCH_NEXT					@ ldrb	r2, [jpc, #1]
         str     r3, [tmp_xxx, #THREAD_LAST_JAVA_SP]
-        ldr     constpool, [istate, #ISTATE_CONSTANTS]
-        ldr     locals, [istate, #ISTATE_LOCALS]
+        CACHE_CP
+        CACHE_LOCALS
 	DISPATCH_NEXT					@ ands	lr, ip, lr
-	add	constpool, constpool, #CONST_POOL_OFFSET
         DISPATCH_FINISH
 1:
 	PUSH	r1
@@ -3871,14 +4112,18 @@
 	ldr	r0, [istate, #ISTATE_METHOD]
 	ldr	r3, [stack, #0]
 	ldrh	r0, [r0, #40]
-	ldr	istate, [istate, #ISTATE_SAVED_ISTATE]
+	ldr	ip, [istate, #ISTATE_ADVANCE_PC]
+	ldr	istate, [istate, #ISTATE_NEXT_FRAME]
 	str	r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 	str	r1, [stack, r0, lsl #2]!
-	cmp	istate, #0
+	cmp	ip, #0
 	beq	normal_return
-        ldr     jpc, [istate, #ISTATE_BCP]
+
+	sub	istate, istate, #ISTATE_NEXT_FRAME
+
+        CACHE_JPC
         ldr     r2, [istate, #ISTATE_STACK_LIMIT]
-	DISPATCH_START	3				@ ldrb	r0, [jpc, #3]!
+	DISPATCH_START_REG ip
         sub     stack, stack, #4
         ldr     r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 	DISPATCH_NEXT					@ ldrb	r1, [jpc, #2]
@@ -3887,10 +4132,9 @@
         str     r2, [tmp_xxx, #THREAD_JAVA_SP]
 	DISPATCH_NEXT					@ ldrb	r2, [jpc, #1]
         str     r3, [tmp_xxx, #THREAD_LAST_JAVA_SP]
-        ldr     constpool, [istate, #ISTATE_CONSTANTS]
-        ldr     locals, [istate, #ISTATE_LOCALS]
+        CACHE_CP
+        CACHE_LOCALS
 	DISPATCH_NEXT					@ ands	lr, ip, lr
-	add	constpool, constpool, #CONST_POOL_OFFSET
         DISPATCH_FINISH
 1:
 	PUSH	r1
@@ -3900,6 +4144,8 @@
 	b	2b
 }
 
+#endif // NOTICE_SAFEPOINTS
+
 (iload_0,iload_1,iload_2,iload_3)
 (invokeresolved)
 {
@@ -4030,6 +4276,7 @@
         ldrb     r1, [jpc, #2]
 	PUSH	r0
 	b	do_invokestaticresolved
+
 }
 
 (iload_0,iload_1,iload_2,iload_3)
@@ -4038,6 +4285,8 @@
 	add	jpc, jpc, #1
 	rsb	r0, r0, #opc_iload_0
 	ldr	r0, [locals, r0, lsl #2]
+        ldrb     r2, [jpc, #1]
+        ldrb     r1, [jpc, #2]
 	PUSH	r0
 	b	do_invokeinterface
 }
@@ -4048,6 +4297,8 @@
 	add	jpc, jpc, #1
 	rsb	r0, r0, #opc_aload_0
 	ldr	r0, [locals, r0, lsl #2]
+        ldrb     r2, [jpc, #1]
+        ldrb     r1, [jpc, #2]
 	PUSH	r0
 	b	do_invokeinterface
 }
@@ -4055,6 +4306,8 @@
 (iload,aload,fload)(invokeinterface) {
 	ldr	r0, [locals, -r2, lsl #2]
 	add	jpc, jpc, #2
+        ldrb     r2, [jpc, #1]
+        ldrb     r1, [jpc, #2]
 	PUSH	r0
 	b	do_invokeinterface
 }
@@ -4067,7 +4320,7 @@
 	DISPATCH_BYTECODE
 }
 
-# 13 cycles
+@ 13 cycles
 (iload,aload,fload)(igetfield) {
 	ldrb	ip, [jpc, #4]
 	rsb	tmp1, r2, #0
@@ -4077,12 +4330,10 @@
 	ldr	tmp1, [locals, tmp1, lsl #2]
 	add	tmp2, r3, lsl #4
 	DISPATCH_NEXT
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
 	DISPATCH_NEXT
-        ldr     tmp2, [tmp2, #8]
+        ldr     tmp2, [tmp2, #CP_OFFSET+8]
 	DISPATCH_NEXT
 .abortentry88:
 	ldr	tmp2, [tmp1, tmp2]
@@ -4091,7 +4342,7 @@
 	DISPATCH_FINISH
 }
 
-# --- ECN: iconst; store -------------------------------------------------
+@ --- ECN: iconst; store -------------------------------------------------
 
 (iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5)
 (istore_0,istore_1,istore_2,istore_3)
@@ -4111,7 +4362,7 @@
 	DISPATCH_BYTECODE
 }
 
-# --- ECN: iconst; dataop -------------------------------------------------
+@ --- ECN: iconst; dataop -------------------------------------------------
 
 (iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5)(iadd) {
 	sub	tmp1, r0, #opc_iconst_0
@@ -4168,7 +4419,7 @@
 	b	6f
 3:
 	cmp	lr, #(opc_iconst_0-opc_iconst_2)
-	beq	.iconst_div_rem_0
+	beq	div_zero_jpc_1
 	rsbcc	tmp1, tmp1, #0		@ Divide by -1 or 1
 	b	6f
 @ divide by 4
@@ -4197,7 +4448,9 @@
 	DISPATCH_FINISH
 }
 
-# --- ECN: iconst; branch -------------------------------------------------
+@ --- ECN: iconst; branch -------------------------------------------------
+
+#ifdef NOTICE_SAFEPOINTS
 
 (iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5)(if_icmpeq) {
 	POP	r3
@@ -4303,14 +4556,18 @@
 	ldr	r0, [istate, #ISTATE_METHOD]
 	ldr	r3, [stack, #0]
 	ldrh	r0, [r0, #40]
-	ldr	istate, [istate, #ISTATE_SAVED_ISTATE]
+	ldr	ip, [istate, #ISTATE_ADVANCE_PC]
+	ldr	istate, [istate, #ISTATE_NEXT_FRAME]
 	str	r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 	str	r1, [stack, r0, lsl #2]!
-	cmp	istate, #0
+	cmp	ip, #0
 	beq	normal_return
-        ldr     jpc, [istate, #ISTATE_BCP]
+
+	sub	istate, istate, #ISTATE_NEXT_FRAME
+
+        CACHE_JPC
         ldr     r2, [istate, #ISTATE_STACK_LIMIT]
-	DISPATCH_START	3				@ ldrb	r0, [jpc, #3]!
+	DISPATCH_START_REG ip
         sub     stack, stack, #4
         ldr     r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 	DISPATCH_NEXT					@ ldrb	r1, [jpc, #2]
@@ -4319,10 +4576,9 @@
         str     r2, [tmp_xxx, #THREAD_JAVA_SP]
 	DISPATCH_NEXT					@ ldrb	r2, [jpc, #1]
         str     r3, [tmp_xxx, #THREAD_LAST_JAVA_SP]
-        ldr     constpool, [istate, #ISTATE_CONSTANTS]
-        ldr     locals, [istate, #ISTATE_LOCALS]
+        CACHE_CP
+        CACHE_LOCALS
 	DISPATCH_NEXT					@ ands	lr, ip, lr
-	add	constpool, constpool, #CONST_POOL_OFFSET
         DISPATCH_FINISH
 1:
 	PUSH	r1
@@ -4332,6 +4588,8 @@
 	b	2b
 }
 
+#endif // NOTICE_SAFEPOINTS
+
 (iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5)(invokeresolved) {
 	add	jpc, jpc, #1
 	sub	r0, r0, #opc_iconst_0
@@ -4368,16 +4626,14 @@
 	b	do_invokespecialresolved
 }
 
-## --- Bytecode sequences iaload; xxx -----------------------------------------------
+@# --- Bytecode sequences iaload; xxx -----------------------------------------------
 
 (iaload,faload,aaload)(iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5) {
 	sub	r2, r1, #opc_iconst_0
-	POP2	r3, lr			@ r3 = index, lr = arrayref
+	POP	r3, lr			@ r3 = index, lr = arrayref
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	lr, #0
-	beq	null_ptr_exception_jpc_2
-#endif
+	SW_NPC	cmp	lr, #0
+	SW_NPC	beq	null_ptr_exception_jpc_2
 .abortentry38:
 	ldr	tmp1, [lr, #8]		@ tmp1 = length
 	DISPATCH_NEXT
@@ -4386,18 +4642,16 @@
 	add	lr, lr, r3, lsl #2
 	ldr	r3, [lr, #12]
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	PUSH	r2, r3
 	DISPATCH_FINISH
 }
 
 (iaload,faload,aaload)(bipush) {
 	ldrsb	r2, [jpc, #2]
-	POP2	r3, lr			@ r3 = index, lr = arrayref
+	POP	r3, lr			@ r3 = index, lr = arrayref
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	lr, #0
-	beq	null_ptr_exception_jpc_3
-#endif
+	SW_NPC	cmp	lr, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
 .abortentry39:
 	ldr	tmp1, [lr, #8]		@ tmp1 = length
 	DISPATCH_NEXT
@@ -4406,20 +4660,18 @@
 	add	lr, lr, r3, lsl #2
 	ldr	r3, [lr, #12]
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	PUSH	r2, r3
 	DISPATCH_FINISH
 }
 
 (iaload,faload,aaload)(sipush) {
 	ldrsb	r2, [jpc, #2]
 	ldrb	tmp1, [jpc, #3]
-	POP2	r3, lr			@ r3 = index, lr = arrayref
+	POP	r3, lr			@ r3 = index, lr = arrayref
 	DISPATCH_START	\seq_len
 	orr	r2, tmp1, r2, lsl #8
-#ifndef HW_NULL_PTR_CHECK
-	cmp	lr, #0
-	beq	null_ptr_exception_jpc_4
-#endif
+	SW_NPC	cmp	lr, #0
+	SW_NPC	beq	null_ptr_exception_jpc_4
 .abortentry40:
 	ldr	tmp1, [lr, #8]		@ tmp1 = length
 	DISPATCH_NEXT
@@ -4428,19 +4680,17 @@
 	add	lr, lr, r3, lsl #2
 	ldr	r3, [lr, #12]
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	PUSH	r2, r3
 	DISPATCH_FINISH
 }
 
 (iaload,faload,aaload)(iload,fload,aload) {
 	ldrb	r2, [jpc, #2]
-	POP2	r3, lr			@ r3 = index, lr = arrayref
+	POP	r3, lr			@ r3 = index, lr = arrayref
 	DISPATCH_START	\seq_len
 	ldr	r2, [locals, -r2, lsl #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	lr, #0
-	beq	null_ptr_exception_jpc_3
-#endif
+	SW_NPC	cmp	lr, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
 .abortentry41:
 	ldr	tmp1, [lr, #8]		@ tmp1 = length
 	DISPATCH_NEXT
@@ -4449,7 +4699,7 @@
 	add	lr, lr, r3, lsl #2
 	ldr	r3, [lr, #12]
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	PUSH	r2, r3
 	DISPATCH_FINISH
 }
 
@@ -4457,13 +4707,11 @@
 (iload_0,iload_1,iload_2,iload_3)
 {
 	rsb	r2, r1, #opc_iload_0
-	POP2	r3, lr			@ r3 = index, lr = arrayref
+	POP	r3, lr			@ r3 = index, lr = arrayref
 	DISPATCH_START	\seq_len
 	ldr	r2, [locals, r2, lsl #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	lr, #0
-	beq	null_ptr_exception_jpc_2
-#endif
+	SW_NPC	cmp	lr, #0
+	SW_NPC	beq	null_ptr_exception_jpc_2
 .abortentry42:
 	ldr	tmp1, [lr, #8]		@ tmp1 = length
 	DISPATCH_NEXT
@@ -4472,7 +4720,7 @@
 	add	lr, lr, r3, lsl #2
 	ldr	r3, [lr, #12]
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	PUSH	r2, r3
 	DISPATCH_FINISH
 }
 
@@ -4480,13 +4728,11 @@
 (aload_0,aload_1,aload_2,aload_3)
 {
 	rsb	r2, r1, #opc_aload_0
-	POP2	r3, lr			@ r3 = index, lr = arrayref
+	POP	r3, lr			@ r3 = index, lr = arrayref
 	DISPATCH_START	\seq_len
 	ldr	r2, [locals, r2, lsl #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	lr, #0
-	beq	null_ptr_exception_jpc_2
-#endif
+	SW_NPC	cmp	lr, #0
+	SW_NPC	beq	null_ptr_exception_jpc_2
 .abortentry42_1:
 	ldr	tmp1, [lr, #8]		@ tmp1 = length
 	DISPATCH_NEXT
@@ -4495,17 +4741,15 @@
 	add	lr, lr, r3, lsl #2
 	ldr	r3, [lr, #12]
 	DISPATCH_NEXT
-	PUSH2	r2, r3
+	PUSH	r2, r3
 	DISPATCH_FINISH
 }
 
 (iaload,faload,aaload)(iaload,faload,aaload)
 {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_0
-#endif
+	POP	r2, r3			@ r2 = index, r3 = arrayref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_0
 .abortentry43:
 	ldr	tmp1, [r3, #8]		@ tmp1 = length
 	DISPATCH_START	\seq_len
@@ -4514,10 +4758,8 @@
 	add	r3, r3, r2, lsl #2
 	POP	lr			@ r2 = index, lr = arrayref
 	ldr	r2, [r3, #12]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	lr, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	lr, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry44:
 	ldr	tmp1, [lr, #8]		@ tmp1 = length
 	DISPATCH_NEXT
@@ -4532,12 +4774,10 @@
 
 (iaload,faload,aaload)(astore,istore,fstore) {
 	ldrb	r2, [jpc, #2]
-	POP2	r3, lr			@ r3 = index, lr = arrayref
+	POP	r3, lr			@ r3 = index, lr = arrayref
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	lr, #0
-	beq	null_ptr_exception_jpc_3
-#endif
+	SW_NPC	cmp	lr, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
 .abortentry45:
 	ldr	tmp1, [lr, #8]		@ tmp1 = length
 	DISPATCH_NEXT
@@ -4553,12 +4793,10 @@
 (iaload,faload,aaload)
 (istore_0,istore_1,istore_2,istore_3) {
 	rsb	r2, r1, #opc_istore_0
-	POP2	r3, lr			@ r3 = index, lr = arrayref
+	POP	r3, lr			@ r3 = index, lr = arrayref
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	lr, #0
-	beq	null_ptr_exception_jpc_2
-#endif
+	SW_NPC	cmp	lr, #0
+	SW_NPC	beq	null_ptr_exception_jpc_2
 .abortentry46:
 	ldr	tmp1, [lr, #8]		@ tmp1 = length
 	DISPATCH_NEXT
@@ -4572,11 +4810,9 @@
 }
 
 (iaload,faload,aaload)(iastore,fastore) {
-	POP2	r3, lr			@ r3 = index, lr = arrayref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	lr, #0
-	beq	null_ptr_exception_jpc_0
-#endif
+	POP	r3, lr			@ r3 = index, lr = arrayref
+	SW_NPC	cmp	lr, #0
+	SW_NPC	beq	null_ptr_exception_jpc_0
 .abortentry47:
 	ldr	tmp1, [lr, #8]		@ tmp1 = length
 	DISPATCH_START	\seq_len
@@ -4585,11 +4821,9 @@
 	add	lr, lr, r3, lsl #2
 	ldr	tmp1, [lr, #12]
 
-	POP2	r2, r3		@ tmp1 = value, r2 = index, r3 = arrayref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	POP	r2, r3		@ tmp1 = value, r2 = index, r3 = arrayref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry48:
 	ldr	lr, [r3, #8]		@ lr = limit
 	DISPATCH_NEXT
@@ -4602,11 +4836,9 @@
 }
 
 (iaload,faload,aaload)(bastore) {
-	POP2	r3, lr			@ r3 = index, lr = arrayref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	lr, #0
-	beq	null_ptr_exception_jpc_0
-#endif
+	POP	r3, lr			@ r3 = index, lr = arrayref
+	SW_NPC	cmp	lr, #0
+	SW_NPC	beq	null_ptr_exception_jpc_0
 .abortentry49:
 	ldr	tmp1, [lr, #8]		@ tmp1 = length
 	DISPATCH_START	\seq_len
@@ -4615,11 +4847,9 @@
 	add	lr, lr, r3, lsl #2
 	ldr	tmp1, [lr, #12]
 
-	POP2	r2, r3		@ tmp1 = value, r2 = index, r3 = arrayref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	POP	r2, r3		@ tmp1 = value, r2 = index, r3 = arrayref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry50:
 	ldr	lr, [r3, #8]		@ lr = limit
 	DISPATCH_NEXT
@@ -4632,11 +4862,9 @@
 }
 
 (iaload,faload,aaload)(castore,sastore) {
-	POP2	r3, lr			@ r3 = index, lr = arrayref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	lr, #0
-	beq	null_ptr_exception_jpc_0
-#endif
+	POP	r3, lr			@ r3 = index, lr = arrayref
+	SW_NPC	cmp	lr, #0
+	SW_NPC	beq	null_ptr_exception_jpc_0
 .abortentry51:
 	ldr	tmp1, [lr, #8]		@ tmp1 = length
 	DISPATCH_START	\seq_len
@@ -4645,11 +4873,9 @@
 	add	lr, lr, r3, lsl #2
 	ldr	tmp1, [lr, #12]
 
-	POP2	r2, r3		@ tmp1 = value, r2 = index, r3 = arrayref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	POP	r2, r3		@ tmp1 = value, r2 = index, r3 = arrayref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry52:
 	ldr	lr, [r3, #8]		@ lr = limit
 	DISPATCH_NEXT
@@ -4662,12 +4888,10 @@
 }
 
 (iaload,faload,aaload)(iand) {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
+	POP	r2, r3			@ r2 = index, r3 = arrayref
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_2
-#endif
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_2
 .abortentry58:
 	ldr	tmp1, [r3, #8]		@ tmp1 = length
 	DISPATCH_NEXT
@@ -4683,12 +4907,10 @@
 }
 
 (iaload,faload,aaload)(ior) {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
+	POP	r2, r3			@ r2 = index, r3 = arrayref
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_2
-#endif
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_2
 .abortentry59:
 	ldr	tmp1, [r3, #8]		@ tmp1 = length
 	DISPATCH_NEXT
@@ -4704,12 +4926,10 @@
 }
 
 (iaload,faload,aaload)(ixor) {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
+	POP	r2, r3			@ r2 = index, r3 = arrayref
 	DISPATCH_START	\seq_len
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_2
-#endif
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_2
 .abortentry60:
 	ldr	tmp1, [r3, #8]		@ tmp1 = length
 	DISPATCH_NEXT
@@ -4724,12 +4944,12 @@
 	DISPATCH_FINISH
 }
 
+#ifdef NOTICE_SAFEPOINTS
+
 (iaload,faload,aaload)(ifeq,ifnull) {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_0
-#endif
+	POP	r2, r3			@ r2 = index, r3 = arrayref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_0
 .abortentry61:
 	ldr	r1, [r3, #8]		@ r1 = length
 	cmp	r2, r1
@@ -4750,11 +4970,9 @@
 }
 
 (iaload,faload,aaload)(ifne,ifnonnull) {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_0
-#endif
+	POP	r2, r3			@ r2 = index, r3 = arrayref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_0
 .abortentry62:
 	ldr	r1, [r3, #8]		@ r1 = length
 	cmp	r2, r1
@@ -4775,11 +4993,9 @@
 }
 
 (iaload,faload,aaload)(iflt) {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_0
-#endif
+	POP	r2, r3			@ r2 = index, r3 = arrayref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_0
 .abortentry63:
 	ldr	r1, [r3, #8]		@ r1 = length
 	cmp	r2, r1
@@ -4800,11 +5016,9 @@
 }
 
 (iaload,faload,aaload)(ifge) {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_0
-#endif
+	POP	r2, r3			@ r2 = index, r3 = arrayref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_0
 .abortentry64:
 	ldr	r1, [r3, #8]		@ r1 = length
 	cmp	r2, r1
@@ -4825,11 +5039,9 @@
 }
 
 (iaload,faload,aaload)(ifgt) {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_0
-#endif
+	POP	r2, r3			@ r2 = index, r3 = arrayref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_0
 .abortentry65:
 	ldr	r1, [r3, #8]		@ r1 = length
 	cmp	r2, r1
@@ -4850,11 +5062,9 @@
 }
 
 (iaload,faload,aaload)(ifle) {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_0
-#endif
+	POP	r2, r3			@ r2 = index, r3 = arrayref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_0
 .abortentry66:
 	ldr	r1, [r3, #8]		@ r1 = length
 	cmp	r2, r1
@@ -4875,11 +5085,9 @@
 }
 
 (iaload,faload,aaload)(if_icmpeq,if_acmpeq) {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_0
-#endif
+	POP	r2, r3			@ r2 = index, r3 = arrayref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_0
 .abortentry67:
 	ldr	r1, [r3, #8]		@ r1 = length
 	cmp	r2, r1
@@ -4901,11 +5109,9 @@
 }
 
 (iaload,faload,aaload)(if_icmpne,if_acmpne) {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_0
-#endif
+	POP	r2, r3			@ r2 = index, r3 = arrayref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_0
 .abortentry68:
 	ldr	r1, [r3, #8]		@ r1 = length
 	cmp	r2, r1
@@ -4927,11 +5133,9 @@
 }
 
 (iaload,faload,aaload)(if_icmplt) {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_0
-#endif
+	POP	r2, r3			@ r2 = index, r3 = arrayref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_0
 .abortentry69:
 	ldr	r1, [r3, #8]		@ r1 = length
 	cmp	r2, r1
@@ -4953,11 +5157,9 @@
 }
 
 (iaload,faload,aaload)(if_icmpge) {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_0
-#endif
+	POP	r2, r3			@ r2 = index, r3 = arrayref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_0
 .abortentry70:
 	ldr	r1, [r3, #8]		@ r1 = length
 	cmp	r2, r1
@@ -4979,11 +5181,9 @@
 }
 
 (iaload,faload,aaload)(if_icmpgt) {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_0
-#endif
+	POP	r2, r3			@ r2 = index, r3 = arrayref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_0
 .abortentry71:
 	ldr	r1, [r3, #8]		@ r1 = length
 	cmp	r2, r1
@@ -5005,11 +5205,9 @@
 }
 
 (iaload,faload,aaload)(if_icmple) {
-	POP2	r2, r3			@ r2 = index, r3 = arrayref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_0
-#endif
+	POP	r2, r3			@ r2 = index, r3 = arrayref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_0
 .abortentry72:
 	ldr	r1, [r3, #8]		@ r1 = length
 	cmp	r2, r1
@@ -5030,12 +5228,14 @@
 	DISPATCH_BYTECODE
 }
 
-# ---- iadd; xxx ------------------------------------------------------------
+#endif // NOTICE_SAFEPOINTS
+
+@ ---- iadd; xxx ------------------------------------------------------------
 
 (iadd)(iload,fload,aload) {
 	ldrb	r3, [jpc, #2]
 	DISPATCH_START	\seq_len
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	rsb	r3, r3, #0
 	DISPATCH_NEXT
@@ -5043,7 +5243,7 @@
 	DISPATCH_NEXT
 	add	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
-	PUSH2	r3, tmp2
+	PUSH	r3, tmp2
 	DISPATCH_FINISH
 }
 
@@ -5052,25 +5252,23 @@
 {
 	DISPATCH_START	\seq_len
 	rsb	r3, r1, #opc_iload_0
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	ldr	r3, [locals, r3, lsl #2]
 	add	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	PUSH2	r3, tmp2
+	PUSH	r3, tmp2
 	DISPATCH_FINISH
 }
 
 (iadd)(iaload,aaload,faload) {
-	POP3	r2, r3, lr		@ lr = ref
+	POP	r2, r3, lr		@ lr = ref
 	DISPATCH_START	\seq_len
 	add	r2, r3, r2		@ r2 = index
-#ifndef HW_NULL_PTR_CHECK
-	cmp	lr, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	lr, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry73:
 	ldr	tmp1, [lr, #8]		@ tmp1 = length
 	DISPATCH_NEXT
@@ -5097,14 +5295,12 @@
 }
 
 (iadd)(iastore,fastore) {
-	POP2	r2, r3
+	POP	r2, r3
 	DISPATCH_START	\seq_len
 	add	tmp1, r3, r2		@ tmp1 = value
-	POP2	r2, r3			@ r2, index, r3 = ref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	POP	r2, r3			@ r2, index, r3 = ref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry106:
 	ldr	lr, [r3, #8]		@ lr = limit
 	DISPATCH_NEXT
@@ -5118,7 +5314,7 @@
 
 (iadd)(iadd) {
 	DISPATCH_START	\seq_len
-	POP3	r2, r3, tmp1
+	POP	r2, r3, tmp1
 	DISPATCH_NEXT
 	add	tmp2, r3, r2
 	DISPATCH_NEXT
@@ -5131,7 +5327,7 @@
 
 (iadd)(isub) {
 	DISPATCH_START	\seq_len
-	POP3	r2, r3, tmp1
+	POP	r2, r3, tmp1
 	DISPATCH_NEXT
 	add	tmp2, r3, r2
 	DISPATCH_NEXT
@@ -5142,8 +5338,10 @@
 	DISPATCH_FINISH
 }
 
+#ifdef NOTICE_SAFEPOINTS
+
 (iadd)(ifeq,ifnull) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	add	r3, r3, r2
@@ -5158,7 +5356,7 @@
 }
 
 (iadd)(ifne,ifnonnull) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	add	r3, r3, r2
@@ -5173,7 +5371,7 @@
 }
 
 (iadd)(iflt) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	add	r3, r3, r2
@@ -5188,7 +5386,7 @@
 }
 
 (iadd)(ifge) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	add	r3, r3, r2
@@ -5203,7 +5401,7 @@
 }
 
 (iadd)(ifgt) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	add	r3, r3, r2
@@ -5218,7 +5416,7 @@
 }
 
 (iadd)(ifle) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	add	r3, r3, r2
@@ -5233,7 +5431,7 @@
 }
 
 (iadd)(if_icmpeq,if_acmpeq) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	add	r2, r3, r2
@@ -5248,7 +5446,7 @@
 }
 
 (iadd)(if_icmpne,if_acmpne) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	add	r2, r3, r2
@@ -5263,7 +5461,7 @@
 }
 
 (iadd)(if_icmplt) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	add	r2, r3, r2
@@ -5278,7 +5476,7 @@
 }
 
 (iadd)(if_icmpge) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	add	r2, r3, r2
@@ -5293,7 +5491,7 @@
 }
 
 (iadd)(if_icmpgt) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	add	r2, r3, r2
@@ -5308,7 +5506,7 @@
 }
 
 (iadd)(if_icmple) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	add	r2, r3, r2
@@ -5328,7 +5526,7 @@
 	add	jpc, jpc, #1
 	orr	ip, ip, r1, lsl #8
 	DISPATCH_START_REG	ip
-	POP2	r2, r3
+	POP	r2, r3
 	add	r2, r3, r2
 	DISPATCH_NEXT
 	PUSH	r2
@@ -5336,7 +5534,7 @@
 }
 
 (iadd)(ireturn) {
-	POP2	r2, r3
+	POP	r2, r3
 	ldr	tmp2, [istate, #ISTATE_MONITOR_BASE]	@ tmp2 = base
 	ldr	tmp1, [istate, #ISTATE_STACK_BASE]	@ tmp1 = end
 	add	r1, r3, r2
@@ -5350,14 +5548,18 @@
 	ldr	r0, [istate, #ISTATE_METHOD]
 	ldr	r3, [stack, #0]
 	ldrh	r0, [r0, #40]
-	ldr	istate, [istate, #ISTATE_SAVED_ISTATE]
+	ldr	ip, [istate, #ISTATE_ADVANCE_PC]
+	ldr	istate, [istate, #ISTATE_NEXT_FRAME]
 	str	r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 	str	r1, [stack, r0, lsl #2]!
-	cmp	istate, #0
+	cmp	ip, #0
 	beq	normal_return
-        ldr     jpc, [istate, #ISTATE_BCP]
+
+	sub	istate, istate, #ISTATE_NEXT_FRAME
+
+        CACHE_JPC
         ldr     r2, [istate, #ISTATE_STACK_LIMIT]
-	DISPATCH_START	3				@ ldrb	r0, [jpc, #3]!
+	DISPATCH_START_REG ip
         sub     stack, stack, #4
         ldr     r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 	DISPATCH_NEXT					@ ldrb	r1, [jpc, #2]
@@ -5366,10 +5568,9 @@
         str     r2, [tmp_xxx, #THREAD_JAVA_SP]
 	DISPATCH_NEXT					@ ldrb	r2, [jpc, #1]
         str     r3, [tmp_xxx, #THREAD_LAST_JAVA_SP]
-        ldr     constpool, [istate, #ISTATE_CONSTANTS]
-        ldr     locals, [istate, #ISTATE_LOCALS]
+        CACHE_CP
+        CACHE_LOCALS
 	DISPATCH_NEXT					@ ands	lr, ip, lr
-	add	constpool, constpool, #CONST_POOL_OFFSET
         DISPATCH_FINISH
 1:
 	PUSH	r1
@@ -5379,8 +5580,10 @@
 	b	2b
 }
 
+#endif // NOTICE_SAFEPOINTS
+
 (iadd)(iinc) {
-	POP2	tmp1, lr
+	POP	tmp1, lr
 	DISPATCH_START	\seq_len
 	add	tmp1, lr, tmp1
         ldrb    r3, [jpc, #-2]	@ ECN: jpc now points to next bc
@@ -5393,12 +5596,12 @@
 	str	tmp1, [locals, -r3, lsl #2]
 	DISPATCH_FINISH
 }
-# ---- sub; xxx ------------------------------------------------------------
+@ ---- sub; xxx ------------------------------------------------------------
 
 (isub)(iload,fload,aload) {
 	ldrb	r3, [jpc, #2]
 	DISPATCH_START	\seq_len
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	rsb	r3, r3, #0
 	DISPATCH_NEXT
@@ -5406,7 +5609,7 @@
 	DISPATCH_NEXT
 	sub	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
-	PUSH2	r3, tmp2
+	PUSH	r3, tmp2
 	DISPATCH_FINISH
 }
 
@@ -5415,25 +5618,23 @@
 {
 	DISPATCH_START	\seq_len
 	rsb	r3, r1, #opc_iload_0
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	ldr	r3, [locals, r3, lsl #2]
 	sub	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	PUSH2	r3, tmp2
+	PUSH	r3, tmp2
 	DISPATCH_FINISH
 }
 
 (isub)(iaload,aaload,faload) {
-	POP3	r2, r3, lr		@ lr = ref
+	POP	r2, r3, lr		@ lr = ref
 	DISPATCH_START	\seq_len
 	sub	r2, r3, r2		@ r2 = index
-#ifndef HW_NULL_PTR_CHECK
-	cmp	lr, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	lr, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry74:
 	ldr	tmp1, [lr, #8]		@ tmp1 = length
 	DISPATCH_NEXT
@@ -5460,14 +5661,12 @@
 }
 
 (isub)(iastore,fastore) {
-	POP2	r2, r3
+	POP	r2, r3
 	DISPATCH_START	\seq_len
 	sub	tmp1, r3, r2		@ tmp1 = value
-	POP2	r2, r3			@ r2, index, r3 = ref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	POP	r2, r3			@ r2, index, r3 = ref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry105:
 	ldr	lr, [r3, #8]		@ lr = limit
 	DISPATCH_NEXT
@@ -5481,7 +5680,7 @@
 
 (isub)(iadd) {
 	DISPATCH_START	\seq_len
-	POP3	r2, r3, tmp1
+	POP	r2, r3, tmp1
 	DISPATCH_NEXT
 	sub	tmp2, r3, r2
 	DISPATCH_NEXT
@@ -5494,7 +5693,7 @@
 
 (isub)(isub) {
 	DISPATCH_START	\seq_len
-	POP3	r2, r3, tmp1
+	POP	r2, r3, tmp1
 	DISPATCH_NEXT
 	sub	tmp2, r3, r2
 	DISPATCH_NEXT
@@ -5505,8 +5704,10 @@
 	DISPATCH_FINISH
 }
 
+#ifdef NOTICE_SAFEPOINTS
+
 (isub)(ifeq,ifnull) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	sub	r3, r3, r2
@@ -5521,7 +5722,7 @@
 }
 
 (isub)(ifne,ifnonnull) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	sub	r3, r3, r2
@@ -5536,7 +5737,7 @@
 }
 
 (isub)(iflt) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	sub	r3, r3, r2
@@ -5551,7 +5752,7 @@
 }
 
 (isub)(ifge) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	sub	r3, r3, r2
@@ -5566,7 +5767,7 @@
 }
 
 (isub)(ifgt) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	sub	r3, r3, r2
@@ -5581,7 +5782,7 @@
 }
 
 (isub)(ifle) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	sub	r3, r3, r2
@@ -5596,7 +5797,7 @@
 }
 
 (isub)(if_icmpeq,if_acmpeq) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	sub	r2, r3, r2
@@ -5611,7 +5812,7 @@
 }
 
 (isub)(if_icmpne,if_acmpne) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	sub	r2, r3, r2
@@ -5626,7 +5827,7 @@
 }
 
 (isub)(if_icmplt) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	sub	r2, r3, r2
@@ -5641,7 +5842,7 @@
 }
 
 (isub)(if_icmpge) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	sub	r2, r3, r2
@@ -5656,7 +5857,7 @@
 }
 
 (isub)(if_icmpgt) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	sub	r2, r3, r2
@@ -5671,7 +5872,7 @@
 }
 
 (isub)(if_icmple) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	sub	r2, r3, r2
@@ -5691,7 +5892,7 @@
 	add	jpc, jpc, #1
 	orr	ip, ip, r1, lsl #8
 	DISPATCH_START_REG	ip
-	POP2	r2, r3
+	POP	r2, r3
 	sub	r2, r3, r2
 	DISPATCH_NEXT
 	PUSH	r2
@@ -5699,7 +5900,7 @@
 }
 
 (isub)(ireturn) {
-	POP2	r2, r3
+	POP	r2, r3
 	ldr	tmp2, [istate, #ISTATE_MONITOR_BASE]	@ tmp2 = base
 	ldr	tmp1, [istate, #ISTATE_STACK_BASE]	@ tmp1 = end
 	sub	r1, r3, r2
@@ -5713,14 +5914,18 @@
 	ldr	r0, [istate, #ISTATE_METHOD]
 	ldr	r3, [stack, #0]
 	ldrh	r0, [r0, #40]
-	ldr	istate, [istate, #ISTATE_SAVED_ISTATE]
+	ldr	ip, [istate, #ISTATE_ADVANCE_PC]
+	ldr	istate, [istate, #ISTATE_NEXT_FRAME]
 	str	r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 	str	r1, [stack, r0, lsl #2]!
-	cmp	istate, #0
+	cmp	ip, #0
 	beq	normal_return
-        ldr     jpc, [istate, #ISTATE_BCP]
+
+	sub	istate, istate, #ISTATE_NEXT_FRAME
+
+        CACHE_JPC
         ldr     r2, [istate, #ISTATE_STACK_LIMIT]
-	DISPATCH_START	3				@ ldrb	r0, [jpc, #3]!
+	DISPATCH_START_REG ip
         sub     stack, stack, #4
         ldr     r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 	DISPATCH_NEXT					@ ldrb	r1, [jpc, #2]
@@ -5729,10 +5934,9 @@
         str     r2, [tmp_xxx, #THREAD_JAVA_SP]
 	DISPATCH_NEXT					@ ldrb	r2, [jpc, #1]
         str     r3, [tmp_xxx, #THREAD_LAST_JAVA_SP]
-        ldr     constpool, [istate, #ISTATE_CONSTANTS]
-        ldr     locals, [istate, #ISTATE_LOCALS]
+        CACHE_CP
+        CACHE_LOCALS
 	DISPATCH_NEXT					@ ands	lr, ip, lr
-	add	constpool, constpool, #CONST_POOL_OFFSET
         DISPATCH_FINISH
 1:
 	PUSH	r1
@@ -5742,8 +5946,10 @@
 	b	2b
 }
 
+#endif // NOTICE_SAFEPOINTS
+
 (isub)(iinc) {
-	POP2	tmp1, lr
+	POP	tmp1, lr
 	DISPATCH_START	\seq_len
 	sub	tmp1, lr, tmp1
         ldrb    r3, [jpc, #-2]	@ ECN: jpc now points to next bc
@@ -5756,12 +5962,12 @@
 	str	tmp1, [locals, -r3, lsl #2]
 	DISPATCH_FINISH
 }
-# ---- iand; xxx ------------------------------------------------------------
+@ ---- iand; xxx ------------------------------------------------------------
 
 (iand)(iload,fload,aload) {
 	ldrb	r3, [jpc, #2]
 	DISPATCH_START	\seq_len
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	rsb	r3, r3, #0
 	DISPATCH_NEXT
@@ -5769,7 +5975,7 @@
 	DISPATCH_NEXT
 	and	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
-	PUSH2	r3, tmp2
+	PUSH	r3, tmp2
 	DISPATCH_FINISH
 }
 
@@ -5778,25 +5984,23 @@
 {
 	DISPATCH_START	\seq_len
 	rsb	r3, r1, #opc_iload_0
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	ldr	r3, [locals, r3, lsl #2]
 	and	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	PUSH2	r3, tmp2
+	PUSH	r3, tmp2
 	DISPATCH_FINISH
 }
 
 (iand)(iaload,aaload,faload) {
-	POP3	r2, r3, lr		@ lr = ref
+	POP	r2, r3, lr		@ lr = ref
 	DISPATCH_START	\seq_len
 	and	r2, r3, r2		@ r2 = index
-#ifndef HW_NULL_PTR_CHECK
-	cmp	lr, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	lr, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry75:
 	ldr	tmp1, [lr, #8]		@ tmp1 = length
 	DISPATCH_NEXT
@@ -5823,14 +6027,12 @@
 }
 
 (iand)(iastore,fastore) {
-	POP2	r2, r3
+	POP	r2, r3
 	DISPATCH_START	\seq_len
 	and	tmp1, r3, r2		@ tmp1 = value
-	POP2	r2, r3			@ r2, index, r3 = ref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	POP	r2, r3			@ r2, index, r3 = ref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry107:
 	ldr	lr, [r3, #8]		@ lr = limit
 	DISPATCH_NEXT
@@ -5844,7 +6046,7 @@
 
 (iand)(iadd) {
 	DISPATCH_START	\seq_len
-	POP3	r2, r3, tmp1
+	POP	r2, r3, tmp1
 	DISPATCH_NEXT
 	and	tmp2, r3, r2
 	DISPATCH_NEXT
@@ -5857,7 +6059,7 @@
 
 (iand)(isub) {
 	DISPATCH_START	\seq_len
-	POP3	r2, r3, tmp1
+	POP	r2, r3, tmp1
 	DISPATCH_NEXT
 	and	tmp2, r3, r2
 	DISPATCH_NEXT
@@ -5868,8 +6070,10 @@
 	DISPATCH_FINISH
 }
 
+#ifdef NOTICE_SAFEPOINTS
+
 (iand)(ifeq,ifnull) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	and	r3, r3, r2
@@ -5884,7 +6088,7 @@
 }
 
 (iand)(ifne,ifnonnull) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	and	r3, r3, r2
@@ -5899,7 +6103,7 @@
 }
 
 (iand)(iflt) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	and	r3, r3, r2
@@ -5914,7 +6118,7 @@
 }
 
 (iand)(ifge) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	and	r3, r3, r2
@@ -5929,7 +6133,7 @@
 }
 
 (iand)(ifgt) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	and	r3, r3, r2
@@ -5944,7 +6148,7 @@
 }
 
 (iand)(ifle) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	and	r3, r3, r2
@@ -5959,7 +6163,7 @@
 }
 
 (iand)(if_icmpeq,if_acmpeq) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	and	r2, r3, r2
@@ -5974,7 +6178,7 @@
 }
 
 (iand)(if_icmpne,if_acmpne) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	and	r2, r3, r2
@@ -5989,7 +6193,7 @@
 }
 
 (iand)(if_icmplt) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	and	r2, r3, r2
@@ -6004,7 +6208,7 @@
 }
 
 (iand)(if_icmpge) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	and	r2, r3, r2
@@ -6019,7 +6223,7 @@
 }
 
 (iand)(if_icmpgt) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	and	r2, r3, r2
@@ -6034,7 +6238,7 @@
 }
 
 (iand)(if_icmple) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	and	r2, r3, r2
@@ -6054,7 +6258,7 @@
 	add	jpc, jpc, #1
 	orr	ip, ip, r1, lsl #8
 	DISPATCH_START_REG	ip
-	POP2	r2, r3
+	POP	r2, r3
 	and	r2, r3, r2
 	DISPATCH_NEXT
 	PUSH	r2
@@ -6062,7 +6266,7 @@
 }
 
 (iand)(ireturn) {
-	POP2	r2, r3
+	POP	r2, r3
 	ldr	tmp2, [istate, #ISTATE_MONITOR_BASE]	@ tmp2 = base
 	ldr	tmp1, [istate, #ISTATE_STACK_BASE]	@ tmp1 = end
 	and	r1, r3, r2
@@ -6076,14 +6280,18 @@
 	ldr	r0, [istate, #ISTATE_METHOD]
 	ldr	r3, [stack, #0]
 	ldrh	r0, [r0, #40]
-	ldr	istate, [istate, #ISTATE_SAVED_ISTATE]
+	ldr	ip, [istate, #ISTATE_ADVANCE_PC]
+	ldr	istate, [istate, #ISTATE_NEXT_FRAME]
 	str	r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 	str	r1, [stack, r0, lsl #2]!
-	cmp	istate, #0
+	cmp	ip, #0
 	beq	normal_return
-        ldr     jpc, [istate, #ISTATE_BCP]
+
+	sub	istate, istate, #ISTATE_NEXT_FRAME
+
+        CACHE_JPC
         ldr     r2, [istate, #ISTATE_STACK_LIMIT]
-	DISPATCH_START	3				@ ldrb	r0, [jpc, #3]!
+	DISPATCH_START_REG ip
         sub     stack, stack, #4
         ldr     r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 	DISPATCH_NEXT					@ ldrb	r1, [jpc, #2]
@@ -6092,10 +6300,9 @@
         str     r2, [tmp_xxx, #THREAD_JAVA_SP]
 	DISPATCH_NEXT					@ ldrb	r2, [jpc, #1]
         str     r3, [tmp_xxx, #THREAD_LAST_JAVA_SP]
-        ldr     constpool, [istate, #ISTATE_CONSTANTS]
-        ldr     locals, [istate, #ISTATE_LOCALS]
+        CACHE_CP
+        CACHE_LOCALS
 	DISPATCH_NEXT					@ ands	lr, ip, lr
-	add	constpool, constpool, #CONST_POOL_OFFSET
         DISPATCH_FINISH
 1:
 	PUSH	r1
@@ -6105,8 +6312,10 @@
 	b	2b
 }
 
+#endif // NOTICE_SAFEPOINTS
+
 (iand)(iinc) {
-	POP2	tmp1, lr
+	POP	tmp1, lr
 	DISPATCH_START	\seq_len
 	and	tmp1, lr, tmp1
         ldrb    r3, [jpc, #-2]	@ ECN: jpc now points to next bc
@@ -6119,12 +6328,12 @@
 	str	tmp1, [locals, -r3, lsl #2]
 	DISPATCH_FINISH
 }
-# ---- ior; xxx ------------------------------------------------------------
+@ ---- ior; xxx ------------------------------------------------------------
 
 (ior)(iload,fload,aload) {
 	ldrb	r3, [jpc, #2]
 	DISPATCH_START	\seq_len
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	rsb	r3, r3, #0
 	DISPATCH_NEXT
@@ -6132,7 +6341,7 @@
 	DISPATCH_NEXT
 	orr	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
-	PUSH2	r3, tmp2
+	PUSH	r3, tmp2
 	DISPATCH_FINISH
 }
 
@@ -6141,25 +6350,23 @@
 {
 	DISPATCH_START	\seq_len
 	rsb	r3, r1, #opc_iload_0
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	ldr	r3, [locals, r3, lsl #2]
 	orr	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	PUSH2	r3, tmp2
+	PUSH	r3, tmp2
 	DISPATCH_FINISH
 }
 
 (ior)(iaload,aaload,faload) {
-	POP3	r2, r3, lr		@ lr = ref
+	POP	r2, r3, lr		@ lr = ref
 	DISPATCH_START	\seq_len
 	orr	r2, r3, r2		@ r2 = index
-#ifndef HW_NULL_PTR_CHECK
-	cmp	lr, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	lr, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry76:
 	ldr	tmp1, [lr, #8]		@ tmp1 = length
 	DISPATCH_NEXT
@@ -6186,14 +6393,12 @@
 }
 
 (ior)(iastore,fastore) {
-	POP2	r2, r3
+	POP	r2, r3
 	DISPATCH_START	\seq_len
 	orr	tmp1, r3, r2		@ tmp1 = value
-	POP2	r2, r3			@ r2, index, r3 = ref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	POP	r2, r3			@ r2, index, r3 = ref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry108:
 	ldr	lr, [r3, #8]		@ lr = limit
 	DISPATCH_NEXT
@@ -6207,7 +6412,7 @@
 
 (ior)(iadd) {
 	DISPATCH_START	\seq_len
-	POP3	r2, r3, tmp1
+	POP	r2, r3, tmp1
 	DISPATCH_NEXT
 	orr	tmp2, r3, r2
 	DISPATCH_NEXT
@@ -6220,7 +6425,7 @@
 
 (ior)(isub) {
 	DISPATCH_START	\seq_len
-	POP3	r2, r3, tmp1
+	POP	r2, r3, tmp1
 	DISPATCH_NEXT
 	orr	tmp2, r3, r2
 	DISPATCH_NEXT
@@ -6231,8 +6436,10 @@
 	DISPATCH_FINISH
 }
 
+#ifdef NOTICE_SAFEPOINTS
+
 (ior)(ifeq,ifnull) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	orr	r3, r3, r2
@@ -6247,7 +6454,7 @@
 }
 
 (ior)(ifne,ifnonnull) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	orr	r3, r3, r2
@@ -6262,7 +6469,7 @@
 }
 
 (ior)(iflt) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	orr	r3, r3, r2
@@ -6277,7 +6484,7 @@
 }
 
 (ior)(ifge) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	orr	r3, r3, r2
@@ -6292,7 +6499,7 @@
 }
 
 (ior)(ifgt) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	orr	r3, r3, r2
@@ -6307,7 +6514,7 @@
 }
 
 (ior)(ifle) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	orr	r3, r3, r2
@@ -6322,7 +6529,7 @@
 }
 
 (ior)(if_icmpeq,if_acmpeq) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	orr	r2, r3, r2
@@ -6337,7 +6544,7 @@
 }
 
 (ior)(if_icmpne,if_acmpne) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	orr	r2, r3, r2
@@ -6352,7 +6559,7 @@
 }
 
 (ior)(if_icmplt) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	orr	r2, r3, r2
@@ -6367,7 +6574,7 @@
 }
 
 (ior)(if_icmpge) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	orr	r2, r3, r2
@@ -6382,7 +6589,7 @@
 }
 
 (ior)(if_icmpgt) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	orr	r2, r3, r2
@@ -6397,7 +6604,7 @@
 }
 
 (ior)(if_icmple) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	orr	r2, r3, r2
@@ -6417,7 +6624,7 @@
 	add	jpc, jpc, #1
 	orr	ip, ip, r1, lsl #8
 	DISPATCH_START_REG	ip
-	POP2	r2, r3
+	POP	r2, r3
 	orr	r2, r3, r2
 	DISPATCH_NEXT
 	PUSH	r2
@@ -6425,7 +6632,7 @@
 }
 
 (ior)(ireturn) {
-	POP2	r2, r3
+	POP	r2, r3
 	ldr	tmp2, [istate, #ISTATE_MONITOR_BASE]	@ tmp2 = base
 	ldr	tmp1, [istate, #ISTATE_STACK_BASE]	@ tmp1 = end
 	orr	r1, r3, r2
@@ -6439,14 +6646,18 @@
 	ldr	r0, [istate, #ISTATE_METHOD]
 	ldr	r3, [stack, #0]
 	ldrh	r0, [r0, #40]
-	ldr	istate, [istate, #ISTATE_SAVED_ISTATE]
+	ldr	ip, [istate, #ISTATE_ADVANCE_PC]
+	ldr	istate, [istate, #ISTATE_NEXT_FRAME]
 	str	r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 	str	r1, [stack, r0, lsl #2]!
-	cmp	istate, #0
+	cmp	ip, #0
 	beq	normal_return
-        ldr     jpc, [istate, #ISTATE_BCP]
+
+	sub	istate, istate, #ISTATE_NEXT_FRAME
+
+        CACHE_JPC
         ldr     r2, [istate, #ISTATE_STACK_LIMIT]
-	DISPATCH_START	3				@ ldrb	r0, [jpc, #3]!
+	DISPATCH_START_REG ip
         sub     stack, stack, #4
         ldr     r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 	DISPATCH_NEXT					@ ldrb	r1, [jpc, #2]
@@ -6455,10 +6666,9 @@
         str     r2, [tmp_xxx, #THREAD_JAVA_SP]
 	DISPATCH_NEXT					@ ldrb	r2, [jpc, #1]
         str     r3, [tmp_xxx, #THREAD_LAST_JAVA_SP]
-        ldr     constpool, [istate, #ISTATE_CONSTANTS]
-        ldr     locals, [istate, #ISTATE_LOCALS]
+        CACHE_CP
+        CACHE_LOCALS
 	DISPATCH_NEXT					@ ands	lr, ip, lr
-	add	constpool, constpool, #CONST_POOL_OFFSET
         DISPATCH_FINISH
 1:
 	PUSH	r1
@@ -6468,8 +6678,10 @@
 	b	2b
 }
 
+#endif // NOTICE_SAFEPOINTS
+
 (ior)(iinc) {
-	POP2	tmp1, lr
+	POP	tmp1, lr
 	DISPATCH_START	\seq_len
 	orr	tmp1, lr, tmp1
         ldrb    r3, [jpc, #-2]	@ ECN: jpc now points to next bc
@@ -6483,12 +6695,12 @@
 	DISPATCH_FINISH
 }
 
-# ---- ixor; xxx ------------------------------------------------------------
+@ ---- ixor; xxx ------------------------------------------------------------
 
 (ixor)(iload,fload,aload) {
 	ldrb	r3, [jpc, #2]
 	DISPATCH_START	\seq_len
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	rsb	r3, r3, #0
 	DISPATCH_NEXT
@@ -6496,7 +6708,7 @@
 	DISPATCH_NEXT
 	eor	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
-	PUSH2	r3, tmp2
+	PUSH	r3, tmp2
 	DISPATCH_FINISH
 }
 
@@ -6505,25 +6717,23 @@
 {
 	DISPATCH_START	\seq_len
 	rsb	r3, r1, #opc_iload_0
-	POP2	tmp2, tmp1
+	POP	tmp2, tmp1
 	DISPATCH_NEXT
 	ldr	r3, [locals, r3, lsl #2]
 	eor	tmp2, tmp1, tmp2
 	DISPATCH_NEXT
 	DISPATCH_NEXT
 	DISPATCH_NEXT
-	PUSH2	r3, tmp2
+	PUSH	r3, tmp2
 	DISPATCH_FINISH
 }
 
 (ixor)(iaload,aaload,faload) {
-	POP3	r2, r3, lr		@ lr = ref
+	POP	r2, r3, lr		@ lr = ref
 	DISPATCH_START	\seq_len
 	eor	r2, r3, r2		@ r2 = index
-#ifndef HW_NULL_PTR_CHECK
-	cmp	lr, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	SW_NPC	cmp	lr, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry77:
 	ldr	tmp1, [lr, #8]		@ tmp1 = length
 	DISPATCH_NEXT
@@ -6550,14 +6760,12 @@
 }
 
 (ixor)(iastore,fastore) {
-	POP2	r2, r3
+	POP	r2, r3
 	DISPATCH_START	\seq_len
 	eor	tmp1, r3, r2		@ tmp1 = value
-	POP2	r2, r3			@ r2, index, r3 = ref
-#ifndef HW_NULL_PTR_CHECK
-	cmp	r3, #0
-	beq	null_ptr_exception_jpc_1
-#endif
+	POP	r2, r3			@ r2, index, r3 = ref
+	SW_NPC	cmp	r3, #0
+	SW_NPC	beq	null_ptr_exception_jpc_1
 .abortentry109:
 	ldr	lr, [r3, #8]		@ lr = limit
 	DISPATCH_NEXT
@@ -6571,7 +6779,7 @@
 
 (ixor)(iadd) {
 	DISPATCH_START	\seq_len
-	POP3	r2, r3, tmp1
+	POP	r2, r3, tmp1
 	DISPATCH_NEXT
 	eor	tmp2, r3, r2
 	DISPATCH_NEXT
@@ -6584,7 +6792,7 @@
 
 (ixor)(isub) {
 	DISPATCH_START	\seq_len
-	POP3	r2, r3, tmp1
+	POP	r2, r3, tmp1
 	DISPATCH_NEXT
 	eor	tmp2, r3, r2
 	DISPATCH_NEXT
@@ -6595,8 +6803,10 @@
 	DISPATCH_FINISH
 }
 
+#ifdef NOTICE_SAFEPOINTS
+
 (ixor)(ifeq,ifnull) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	eor	r3, r3, r2
@@ -6611,7 +6821,7 @@
 }
 
 (ixor)(ifne,ifnonnull) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	eor	r3, r3, r2
@@ -6626,7 +6836,7 @@
 }
 
 (ixor)(iflt) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	eor	r3, r3, r2
@@ -6641,7 +6851,7 @@
 }
 
 (ixor)(ifge) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	eor	r3, r3, r2
@@ -6656,7 +6866,7 @@
 }
 
 (ixor)(ifgt) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	eor	r3, r3, r2
@@ -6671,7 +6881,7 @@
 }
 
 (ixor)(ifle) {
-	POP2	r2, r3
+	POP	r2, r3
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	eor	r3, r3, r2
@@ -6686,7 +6896,7 @@
 }
 
 (ixor)(if_icmpeq,if_acmpeq) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	eor	r2, r3, r2
@@ -6701,7 +6911,7 @@
 }
 
 (ixor)(if_icmpne,if_acmpne) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	eor	r2, r3, r2
@@ -6716,7 +6926,7 @@
 }
 
 (ixor)(if_icmplt) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	eor	r2, r3, r2
@@ -6731,7 +6941,7 @@
 }
 
 (ixor)(if_icmpge) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	eor	r2, r3, r2
@@ -6746,7 +6956,7 @@
 }
 
 (ixor)(if_icmpgt) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	eor	r2, r3, r2
@@ -6761,7 +6971,7 @@
 }
 
 (ixor)(if_icmple) {
-	POP3	r2, r3, lr
+	POP	r2, r3, lr
         ldrsb   r1, [jpc, #2]
         ldrb    ip, [jpc, #3]
 	eor	r2, r3, r2
@@ -6781,7 +6991,7 @@
 	add	jpc, jpc, #1
 	orr	ip, ip, r1, lsl #8
 	DISPATCH_START_REG	ip
-	POP2	r2, r3
+	POP	r2, r3
 	eor	r2, r3, r2
 	DISPATCH_NEXT
 	PUSH	r2
@@ -6789,7 +6999,7 @@
 }
 
 (ixor)(ireturn) {
-	POP2	r2, r3
+	POP	r2, r3
 	ldr	tmp2, [istate, #ISTATE_MONITOR_BASE]	@ tmp2 = base
 	ldr	tmp1, [istate, #ISTATE_STACK_BASE]	@ tmp1 = end
 	eor	r1, r3, r2
@@ -6803,14 +7013,18 @@
 	ldr	r0, [istate, #ISTATE_METHOD]
 	ldr	r3, [stack, #0]
 	ldrh	r0, [r0, #40]
-	ldr	istate, [istate, #ISTATE_SAVED_ISTATE]
+	ldr	ip, [istate, #ISTATE_ADVANCE_PC]
+	ldr	istate, [istate, #ISTATE_NEXT_FRAME]
 	str	r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 	str	r1, [stack, r0, lsl #2]!
-	cmp	istate, #0
+	cmp	ip, #0
 	beq	normal_return
-        ldr     jpc, [istate, #ISTATE_BCP]
+
+	sub	istate, istate, #ISTATE_NEXT_FRAME
+
+        CACHE_JPC
         ldr     r2, [istate, #ISTATE_STACK_LIMIT]
-	DISPATCH_START	3				@ ldrb	r0, [jpc, #3]!
+	DISPATCH_START_REG ip
         sub     stack, stack, #4
         ldr     r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME]
 	DISPATCH_NEXT					@ ldrb	r1, [jpc, #2]
@@ -6819,10 +7033,9 @@
         str     r2, [tmp_xxx, #THREAD_JAVA_SP]
 	DISPATCH_NEXT					@ ldrb	r2, [jpc, #1]
         str     r3, [tmp_xxx, #THREAD_LAST_JAVA_SP]
-        ldr     constpool, [istate, #ISTATE_CONSTANTS]
-        ldr     locals, [istate, #ISTATE_LOCALS]
+        CACHE_CP
+        CACHE_LOCALS
 	DISPATCH_NEXT					@ ands	lr, ip, lr
-	add	constpool, constpool, #CONST_POOL_OFFSET
         DISPATCH_FINISH
 1:
 	PUSH	r1
@@ -6832,8 +7045,10 @@
 	b	2b
 }
 
+#endif // NOTICE_SAFEPOINTS
+
 (ixor)(iinc) {
-	POP2	tmp1, lr
+	POP	tmp1, lr
 	DISPATCH_START	\seq_len
 	eor	tmp1, lr, tmp1
         ldrb    r3, [jpc, #-2]	@ ECN: jpc now points to next bc
@@ -6847,7 +7062,7 @@
 	DISPATCH_FINISH
 }
 
-# --- iinc; xxx --------------------------------------------------------------
+@ --- iinc; xxx --------------------------------------------------------------
 
 (iinc)(iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5) {
         ldrsb   tmp1, [jpc, #2]
@@ -6902,9 +7117,9 @@
 	DISPATCH_FINISH
 }
 
-################################################################################
-## ECN: Optimised bytecode triples
-################################################################################
+@###############################################################################
+@# ECN: Optimised bytecode triples
+@###############################################################################
 
 (iaccess_0,iaccess_1,iaccess_2,iaccess_3)
 (iload,fload,aload) {
@@ -6917,19 +7132,17 @@
 	add	tmp2, r3, lsl #4
 	ldrb	r3, [jpc, #-1]
 	DISPATCH_NEXT
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_5
-#endif
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_5
 	DISPATCH_NEXT
-        ldr     tmp2, [tmp2, #8]
+        ldr     tmp2, [tmp2, #CP_OFFSET+8]
 	DISPATCH_NEXT
 	rsb	r3, r3, #0
 .abortentry89:
 	ldr	tmp2, [tmp1, tmp2]
 	ldr	r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-	PUSH2	r3, tmp2
+	PUSH	r3, tmp2
 	DISPATCH_FINISH
 }
 
@@ -6944,18 +7157,16 @@
 	ldr	tmp1, [locals, tmp1, lsl #2]
 	add	tmp2, ip, lsl #4
 	DISPATCH_NEXT
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_4
-#endif
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_4
 	DISPATCH_NEXT
-        ldr     tmp2, [tmp2, #8]
+        ldr     tmp2, [tmp2, #CP_OFFSET+8]
 	DISPATCH_NEXT
 .abortentry90:
 	ldr	tmp2, [tmp1, tmp2]
 	ldr	r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-	PUSH2	r3, tmp2
+	PUSH	r3, tmp2
 	DISPATCH_FINISH
 }
 
@@ -6969,12 +7180,10 @@
 	ldr	tmp1, [locals, tmp1, lsl #2]
 	add	tmp2, ip, lsl #4
 	DISPATCH_NEXT
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_4
-#endif
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_4
 	DISPATCH_NEXT
-        ldr     tmp2, [tmp2, #8]
+        ldr     tmp2, [tmp2, #CP_OFFSET+8]
 	DISPATCH_NEXT
 	POP	r3
 .abortentry91:
@@ -6985,6 +7194,8 @@
 	DISPATCH_FINISH
 }
 
+#ifdef NOTICE_SAFEPOINTS
+
 (iaccess_0,iaccess_1,iaccess_2,iaccess_3)
 (ifeq,ifnull) {
 	ldrb	r2, [jpc, #3]
@@ -6996,11 +7207,9 @@
 	ldr	tmp1, [locals, tmp1, lsl #2]
 	add	tmp2, ip, lsl #4
 	ldrb	ip, [jpc, #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-        ldr     tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+        ldr     tmp2, [tmp2, #CP_OFFSET+8]
 	orr	ip, ip, r0, lsl #8
 .abortentry92:
 	ldr	tmp2, [tmp1, tmp2]
@@ -7023,11 +7232,9 @@
 	ldr	tmp1, [locals, tmp1, lsl #2]
 	add	tmp2, ip, lsl #4
 	ldrb	ip, [jpc, #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-        ldr     tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+        ldr     tmp2, [tmp2, #CP_OFFSET+8]
 	orr	ip, ip, r0, lsl #8
 .abortentry93:
 	ldr	tmp2, [tmp1, tmp2]
@@ -7050,11 +7257,9 @@
 	ldr	tmp1, [locals, tmp1, lsl #2]
 	add	tmp2, ip, lsl #4
 	ldrb	ip, [jpc, #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-        ldr     tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+        ldr     tmp2, [tmp2, #CP_OFFSET+8]
 	orr	ip, ip, r0, lsl #8
 .abortentry94:
 	ldr	tmp2, [tmp1, tmp2]
@@ -7077,11 +7282,9 @@
 	ldr	tmp1, [locals, tmp1, lsl #2]
 	add	tmp2, ip, lsl #4
 	ldrb	ip, [jpc, #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-        ldr     tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+        ldr     tmp2, [tmp2, #CP_OFFSET+8]
 	orr	ip, ip, r0, lsl #8
 .abortentry95:
 	ldr	tmp2, [tmp1, tmp2]
@@ -7104,11 +7307,9 @@
 	ldr	tmp1, [locals, tmp1, lsl #2]
 	add	tmp2, ip, lsl #4
 	ldrb	ip, [jpc, #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-        ldr     tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+        ldr     tmp2, [tmp2, #CP_OFFSET+8]
 	orr	ip, ip, r0, lsl #8
 .abortentry96:
 	ldr	tmp2, [tmp1, tmp2]
@@ -7131,11 +7332,9 @@
 	ldr	tmp1, [locals, tmp1, lsl #2]
 	add	tmp2, ip, lsl #4
 	ldrb	ip, [jpc, #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-        ldr     tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+        ldr     tmp2, [tmp2, #CP_OFFSET+8]
 	orr	ip, ip, r0, lsl #8
 .abortentry97:
 	ldr	tmp2, [tmp1, tmp2]
@@ -7158,11 +7357,9 @@
 	ldr	tmp1, [locals, tmp1, lsl #2]
 	add	tmp2, ip, lsl #4
 	ldrb	ip, [jpc, #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-        ldr     tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+        ldr     tmp2, [tmp2, #CP_OFFSET+8]
 	POP	r3
 	orr	ip, ip, r0, lsl #8
 .abortentry98:
@@ -7186,11 +7383,9 @@
 	ldr	tmp1, [locals, tmp1, lsl #2]
 	add	tmp2, ip, lsl #4
 	ldrb	ip, [jpc, #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-        ldr     tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+        ldr     tmp2, [tmp2, #CP_OFFSET+8]
 	POP	r3
 	orr	ip, ip, r0, lsl #8
 .abortentry99:
@@ -7214,11 +7409,9 @@
 	ldr	tmp1, [locals, tmp1, lsl #2]
 	add	tmp2, ip, lsl #4
 	ldrb	ip, [jpc, #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-        ldr     tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+        ldr     tmp2, [tmp2, #CP_OFFSET+8]
 	POP	r3
 	orr	ip, ip, r0, lsl #8
 .abortentry100:
@@ -7242,11 +7435,9 @@
 	ldr	tmp1, [locals, tmp1, lsl #2]
 	add	tmp2, ip, lsl #4
 	ldrb	ip, [jpc, #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-        ldr     tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+        ldr     tmp2, [tmp2, #CP_OFFSET+8]
 	POP	r3
 	orr	ip, ip, r0, lsl #8
 .abortentry101:
@@ -7270,11 +7461,9 @@
 	ldr	tmp1, [locals, tmp1, lsl #2]
 	add	tmp2, ip, lsl #4
 	ldrb	ip, [jpc, #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-        ldr     tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+        ldr     tmp2, [tmp2, #CP_OFFSET+8]
 	POP	r3
 	orr	ip, ip, r0, lsl #8
 .abortentry102:
@@ -7298,11 +7487,9 @@
 	ldr	tmp1, [locals, tmp1, lsl #2]
 	add	tmp2, ip, lsl #4
 	ldrb	ip, [jpc, #2]
-#ifndef HW_NULL_PTR_CHECK
-	cmp	tmp1, #0
-	beq	null_ptr_exception_jpc_3
-#endif
-        ldr     tmp2, [tmp2, #8]
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception_jpc_3
+        ldr     tmp2, [tmp2, #CP_OFFSET+8]
 	POP	r3
 	orr	ip, ip, r0, lsl #8
 .abortentry103:
@@ -7315,6 +7502,8 @@
 	DISPATCH_BYTECODE
 }
 
+#endif // NOTICE_SAFEPOINTS
+
 (iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
 (iadd)
 {
@@ -7400,7 +7589,57 @@
         DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
+(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
+(idiv)
+{
+	rsb	tmp1, r0, #opc_iload_0_iconst_N
+	subs	lr, r2, #opc_iconst_2
+	DISPATCH_START	\seq_len
+	ldr	tmp1, [locals, tmp1, lsl #2]
+	DISPATCH_NEXT
+	beq	5f
+	bcc	3f
+	cmp	lr, #(opc_iconst_4-opc_iconst_2)
+	beq	4f
+	bcc	2f
+@ divide by 5
+1:
+	mvn	lr, #0x198		@ Form 0x66666667 in lr
+	bic	lr, lr, #0x9800
+	add	lr, lr, lr, lsl #16
+	smull	a3, a4, tmp1, lr
+	mov	a3, tmp1, asr #31
+	rsb	tmp1, a3, a4, asr #1
+	b	6f
+@ divide by 3
+2:
+	mvn	lr, #0xa9		@ Form 0x55555556 in lr
+	bic	lr, lr, #0xaa00
+	add	lr, lr, lr, lsl #16
+        smull   a3, a4, tmp1, lr
+        sub     tmp1, a4, tmp1, asr #31
+	b	6f
+3:
+	cmp	lr, #(opc_iconst_0-opc_iconst_2)
+	beq	div_zero_jpc_1
+	rsbcc	tmp1, tmp1, #0		@ Divide by -1 or 1
+	b	6f
+@ divide by 4
+4:	movs	a4, tmp1
+	addmi	a4, a4, #3
+	mov	tmp1, a4, asr #2
+	b	6f
+@ divide by 2
+5:
+	add	tmp1, tmp1, tmp1, lsr #31
+	mov	tmp1, tmp1, asr #1
+6:
+	DISPATCH_NEXT
+	PUSH	tmp1
+	DISPATCH_FINISH
+}
+
+@ r2 = [jpc, #1]
 (iload_iconst_N)
 (iadd)
 {
@@ -7418,7 +7657,7 @@
         DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
+@ r2 = [jpc, #1]
 (iload_iconst_N)
 (isub)
 {
@@ -7436,7 +7675,7 @@
         DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
+@ r2 = [jpc, #1]
 (iload_iconst_N)
 (iand)
 {
@@ -7454,7 +7693,7 @@
         DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
+@ r2 = [jpc, #1]
 (iload_iconst_N)
 (ior)
 {
@@ -7472,7 +7711,7 @@
         DISPATCH_FINISH
 }
 
-# r2 = [jpc, #1]
+@ r2 = [jpc, #1]
 (iload_iconst_N)
 (ixor)
 {
@@ -7490,343 +7729,416 @@
         DISPATCH_FINISH
 }
 
-# Former quads
-
-(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
-(iadd_u4store)
+(iload_iconst_N)
+(idiv)
 {
-        rsb     r3, r0, #opc_iload_0_iconst_N
+	ldrb	lr, [jpc, #2]
+	rsb	tmp1, r2, #0
         DISPATCH_START  \seq_len
-	sub	r2, r2, #opc_iconst_0
-	DISPATCH_NEXT
-        ldrb    tmp1, [jpc, #-1]
-        ldr     r3, [locals, r3, lsl #2]
-	DISPATCH_NEXT
-        add     r3, r3, r2
+	ldr	tmp1, [locals, tmp1, lsl #2]
+	subs	lr, lr, #opc_iconst_2
 	DISPATCH_NEXT
-	rsb	tmp1, tmp1, #0
+	beq	5f
+	bcc	3f
+	cmp	lr, #(opc_iconst_4-opc_iconst_2)
+	beq	4f
+	bcc	2f
+@ divide by 5
+1:
+	mvn	lr, #0x198		@ Form 0x66666667 in lr
+	bic	lr, lr, #0x9800
+	add	lr, lr, lr, lsl #16
+	smull	a3, a4, tmp1, lr
+	mov	a3, tmp1, asr #31
+	rsb	tmp1, a3, a4, asr #1
+	b	6f
+@ divide by 3
+2:
+	mvn	lr, #0xa9		@ Form 0x55555556 in lr
+	bic	lr, lr, #0xaa00
+	add	lr, lr, lr, lsl #16
+        smull   a3, a4, tmp1, lr
+        sub     tmp1, a4, tmp1, asr #31
+	b	6f
+3:
+	cmp	lr, #(opc_iconst_0-opc_iconst_2)
+	beq	div_zero_jpc_1
+	rsbcc	tmp1, tmp1, #0		@ Divide by -1 or 1
+	b	6f
+@ divide by 4
+4:	movs	a4, tmp1
+	addmi	a4, a4, #3
+	mov	tmp1, a4, asr #2
+	b	6f
+@ divide by 2
+5:
+	add	tmp1, tmp1, tmp1, lsr #31
+	mov	tmp1, tmp1, asr #1
+6:
 	DISPATCH_NEXT
-        str     r3, [locals, tmp1, lsl #2]
+	PUSH	tmp1
 	DISPATCH_FINISH
 }
 
-(iload_iconst_N)
-(iadd_u4store)
+(iload_iload)
+(iadd)
 {
-	ldrb	r3, [jpc, #2]
-        ldrb    lr, [jpc, #5]
+        ldrb    r3, [jpc, #3]
         rsb     r2, r2, #0
         DISPATCH_START  \seq_len
-	sub	r3, r3, #opc_iconst_0
+        rsb     r3, r3, #0
+        ldr     r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-        rsb     tmp2, lr, #0
 	DISPATCH_NEXT
-        ldr     tmp1, [locals, r2, lsl #2]
+        add     r3, r2, r3
 	DISPATCH_NEXT
-        add     r3, tmp1, r3
 	DISPATCH_NEXT
-        str     r3, [locals, tmp2, lsl #2]
+        PUSH    r3
 	DISPATCH_FINISH
 }
 
-(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
-(iadd_istore_N)
+(iload_iload_N)
+(iadd)
 {
-        rsb     r3, r0, #opc_iload_0_iconst_N
+        ldrb    r3, [jpc, #2]
+        rsb     r2, r2, #0
         DISPATCH_START  \seq_len
-	sub	r2, r2, #opc_iconst_0
-	DISPATCH_NEXT
-        ldrb    tmp1, [jpc, #-1]
+        rsb     r3, r3, #opc_iload_0
+        ldr     r2, [locals, r2, lsl #2]
         ldr     r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-        add     r3, r3, r2
 	DISPATCH_NEXT
-	rsb	tmp1, tmp1, #opc_istore_0
+        add     r3, r2, r3
 	DISPATCH_NEXT
-        str     r3, [locals, tmp1, lsl #2]
+        DISPATCH_NEXT
+        PUSH    r3
 	DISPATCH_FINISH
 }
 
-(iload_iconst_N)
-(iadd_istore_N)
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(iadd)
 {
 	ldrb	r3, [jpc, #2]
-        ldrb    lr, [jpc, #4]
-        rsb     r2, r2, #0
+	rsb	r2, r0, #opc_iload_0_iload
         DISPATCH_START  \seq_len
-	sub	r3, r3, #opc_iconst_0
+        rsb     r3, r3, #0
+        ldr     r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-        rsb     tmp2, lr, #opc_istore_0
 	DISPATCH_NEXT
-        ldr     tmp1, [locals, r2, lsl #2]
+        add     r3, r2, r3
 	DISPATCH_NEXT
-        add     r3, tmp1, r3
 	DISPATCH_NEXT
-        str     r3, [locals, tmp2, lsl #2]
+        PUSH    r3
 	DISPATCH_FINISH
 }
 
-(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
-(isub_u4store)
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(iadd)
 {
-        rsb     r3, r0, #opc_iload_0_iconst_N
+	rsb	r3, r2, #opc_iload_0
+	rsb	r2, r0, #opc_iload_0_iload_N
         DISPATCH_START  \seq_len
-	sub	r2, r2, #opc_iconst_0
-	DISPATCH_NEXT
-        ldrb    tmp1, [jpc, #-1]
+        ldr     r2, [locals, r2, lsl #2]
         ldr     r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-        sub     r3, r3, r2
 	DISPATCH_NEXT
-	rsb	tmp1, tmp1, #0
+        add     r3, r2, r3
 	DISPATCH_NEXT
-        str     r3, [locals, tmp1, lsl #2]
+        DISPATCH_NEXT
+        PUSH    r3
 	DISPATCH_FINISH
 }
 
-(iload_iconst_N)
-(isub_u4store)
+(iload_iload)
+(isub)
 {
-	ldrb	r3, [jpc, #2]
-        ldrb    lr, [jpc, #5]
+        ldrb    r3, [jpc, #3]
         rsb     r2, r2, #0
         DISPATCH_START  \seq_len
-	sub	r3, r3, #opc_iconst_0
+        rsb     r3, r3, #0
+        ldr     r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-        rsb     tmp2, lr, #0
 	DISPATCH_NEXT
-        ldr     tmp1, [locals, r2, lsl #2]
+        sub     r3, r2, r3
 	DISPATCH_NEXT
-        sub     r3, tmp1, r3
 	DISPATCH_NEXT
-        str     r3, [locals, tmp2, lsl #2]
+        PUSH    r3
 	DISPATCH_FINISH
 }
 
-(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
-(isub_istore_N)
+(iload_iload_N)
+(isub)
 {
-        rsb     r3, r0, #opc_iload_0_iconst_N
+        ldrb    r3, [jpc, #2]
+        rsb     r2, r2, #0
         DISPATCH_START  \seq_len
-	sub	r2, r2, #opc_iconst_0
-	DISPATCH_NEXT
-        ldrb    tmp1, [jpc, #-1]
+        rsb     r3, r3, #opc_iload_0
+        ldr     r2, [locals, r2, lsl #2]
         ldr     r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-        sub     r3, r3, r2
 	DISPATCH_NEXT
-	rsb	tmp1, tmp1, #opc_istore_0
+        sub     r3, r2, r3
 	DISPATCH_NEXT
-        str     r3, [locals, tmp1, lsl #2]
+        DISPATCH_NEXT
+        PUSH    r3
 	DISPATCH_FINISH
 }
 
-(iload_iconst_N)
-(isub_istore_N)
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(isub)
 {
 	ldrb	r3, [jpc, #2]
-        ldrb    lr, [jpc, #4]
-        rsb     r2, r2, #0
+	rsb	r2, r0, #opc_iload_0_iload
         DISPATCH_START  \seq_len
-	sub	r3, r3, #opc_iconst_0
+        rsb     r3, r3, #0
+        ldr     r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-        rsb     tmp2, lr, #opc_istore_0
 	DISPATCH_NEXT
-        ldr     tmp1, [locals, r2, lsl #2]
+        sub     r3, r2, r3
 	DISPATCH_NEXT
-        sub     r3, tmp1, r3
 	DISPATCH_NEXT
-        str     r3, [locals, tmp2, lsl #2]
+        PUSH    r3
 	DISPATCH_FINISH
 }
 
-(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
-(iand_u4store)
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(isub)
 {
-        rsb     r3, r0, #opc_iload_0_iconst_N
+	rsb	r3, r2, #opc_iload_0
+	rsb	r2, r0, #opc_iload_0_iload_N
         DISPATCH_START  \seq_len
-	sub	r2, r2, #opc_iconst_0
-	DISPATCH_NEXT
-        ldrb    tmp1, [jpc, #-1]
+        ldr     r2, [locals, r2, lsl #2]
         ldr     r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-        and     r3, r3, r2
 	DISPATCH_NEXT
-	rsb	tmp1, tmp1, #0
+        sub     r3, r2, r3
 	DISPATCH_NEXT
-        str     r3, [locals, tmp1, lsl #2]
+        DISPATCH_NEXT
+        PUSH    r3
 	DISPATCH_FINISH
 }
 
-(iload_iconst_N)
-(iand_u4store)
+(iload_iload)
+(iand)
 {
-	ldrb	r3, [jpc, #2]
-        ldrb    lr, [jpc, #5]
+        ldrb    r3, [jpc, #3]
         rsb     r2, r2, #0
         DISPATCH_START  \seq_len
-	sub	r3, r3, #opc_iconst_0
+        rsb     r3, r3, #0
+        ldr     r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-        rsb     tmp2, lr, #0
 	DISPATCH_NEXT
-        ldr     tmp1, [locals, r2, lsl #2]
+        and     r3, r2, r3
 	DISPATCH_NEXT
-        and     r3, tmp1, r3
 	DISPATCH_NEXT
-        str     r3, [locals, tmp2, lsl #2]
+        PUSH    r3
 	DISPATCH_FINISH
 }
 
-(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
-(iand_istore_N)
+(iload_iload_N)
+(iand)
 {
-        rsb     r3, r0, #opc_iload_0_iconst_N
+        ldrb    r3, [jpc, #2]
+        rsb     r2, r2, #0
         DISPATCH_START  \seq_len
-	sub	r2, r2, #opc_iconst_0
-	DISPATCH_NEXT
-        ldrb    tmp1, [jpc, #-1]
+        rsb     r3, r3, #opc_iload_0
+        ldr     r2, [locals, r2, lsl #2]
         ldr     r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-        and     r3, r3, r2
 	DISPATCH_NEXT
-	rsb	tmp1, tmp1, #opc_istore_0
+        and     r3, r2, r3
 	DISPATCH_NEXT
-        str     r3, [locals, tmp1, lsl #2]
+        DISPATCH_NEXT
+        PUSH    r3
 	DISPATCH_FINISH
 }
 
-(iload_iconst_N)
-(iand_istore_N)
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(iand)
 {
 	ldrb	r3, [jpc, #2]
-        ldrb    lr, [jpc, #4]
-        rsb     r2, r2, #0
+	rsb	r2, r0, #opc_iload_0_iload
         DISPATCH_START  \seq_len
-	sub	r3, r3, #opc_iconst_0
+        rsb     r3, r3, #0
+        ldr     r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-        rsb     tmp2, lr, #opc_istore_0
 	DISPATCH_NEXT
-        ldr     tmp1, [locals, r2, lsl #2]
+        and     r3, r2, r3
 	DISPATCH_NEXT
-        and     r3, tmp1, r3
 	DISPATCH_NEXT
-        str     r3, [locals, tmp2, lsl #2]
+        PUSH    r3
 	DISPATCH_FINISH
 }
 
-(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
-(ior_u4store)
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(iand)
 {
-        rsb     r3, r0, #opc_iload_0_iconst_N
+	rsb	r3, r2, #opc_iload_0
+	rsb	r2, r0, #opc_iload_0_iload_N
         DISPATCH_START  \seq_len
-	sub	r2, r2, #opc_iconst_0
-	DISPATCH_NEXT
-        ldrb    tmp1, [jpc, #-1]
+        ldr     r2, [locals, r2, lsl #2]
         ldr     r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-        orr     r3, r3, r2
 	DISPATCH_NEXT
-	rsb	tmp1, tmp1, #0
+        and     r3, r2, r3
 	DISPATCH_NEXT
-        str     r3, [locals, tmp1, lsl #2]
+        DISPATCH_NEXT
+        PUSH    r3
 	DISPATCH_FINISH
 }
 
-(iload_iconst_N)
-(ior_u4store)
+(iload_iload)
+(ior)
 {
-	ldrb	r3, [jpc, #2]
-        ldrb    lr, [jpc, #5]
+        ldrb    r3, [jpc, #3]
         rsb     r2, r2, #0
         DISPATCH_START  \seq_len
-	sub	r3, r3, #opc_iconst_0
+        rsb     r3, r3, #0
+        ldr     r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-        rsb     tmp2, lr, #0
 	DISPATCH_NEXT
-        ldr     tmp1, [locals, r2, lsl #2]
+        orr     r3, r2, r3
 	DISPATCH_NEXT
-        orr     r3, tmp1, r3
 	DISPATCH_NEXT
-        str     r3, [locals, tmp2, lsl #2]
+        PUSH    r3
 	DISPATCH_FINISH
 }
 
-(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
-(ior_istore_N)
+(iload_iload_N)
+(ior)
 {
-        rsb     r3, r0, #opc_iload_0_iconst_N
+        ldrb    r3, [jpc, #2]
+        rsb     r2, r2, #0
         DISPATCH_START  \seq_len
-	sub	r2, r2, #opc_iconst_0
-	DISPATCH_NEXT
-        ldrb    tmp1, [jpc, #-1]
+        rsb     r3, r3, #opc_iload_0
+        ldr     r2, [locals, r2, lsl #2]
         ldr     r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-        orr     r3, r3, r2
 	DISPATCH_NEXT
-	rsb	tmp1, tmp1, #opc_istore_0
+        orr     r3, r2, r3
 	DISPATCH_NEXT
-        str     r3, [locals, tmp1, lsl #2]
+        DISPATCH_NEXT
+        PUSH    r3
 	DISPATCH_FINISH
 }
 
-(iload_iconst_N)
-(ior_istore_N)
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(ior)
 {
 	ldrb	r3, [jpc, #2]
-        ldrb    lr, [jpc, #4]
-        rsb     r2, r2, #0
+	rsb	r2, r0, #opc_iload_0_iload
         DISPATCH_START  \seq_len
-	sub	r3, r3, #opc_iconst_0
+        rsb     r3, r3, #0
+        ldr     r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-        rsb     tmp2, lr, #opc_istore_0
 	DISPATCH_NEXT
-        ldr     tmp1, [locals, r2, lsl #2]
+        orr     r3, r2, r3
 	DISPATCH_NEXT
-        orr     r3, tmp1, r3
 	DISPATCH_NEXT
-        str     r3, [locals, tmp2, lsl #2]
+        PUSH    r3
 	DISPATCH_FINISH
 }
 
-(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
-(ixor_u4store)
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(ior)
 {
-        rsb     r3, r0, #opc_iload_0_iconst_N
+	rsb	r3, r2, #opc_iload_0
+	rsb	r2, r0, #opc_iload_0_iload_N
         DISPATCH_START  \seq_len
-	sub	r2, r2, #opc_iconst_0
-	DISPATCH_NEXT
-        ldrb    tmp1, [jpc, #-1]
+        ldr     r2, [locals, r2, lsl #2]
         ldr     r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-        eor     r3, r3, r2
 	DISPATCH_NEXT
-	rsb	tmp1, tmp1, #0
+        orr     r3, r2, r3
 	DISPATCH_NEXT
-        str     r3, [locals, tmp1, lsl #2]
+        DISPATCH_NEXT
+        PUSH    r3
 	DISPATCH_FINISH
 }
 
-(iload_iconst_N)
-(ixor_u4store)
+(iload_iload)
+(ixor)
 {
-	ldrb	r3, [jpc, #2]
-        ldrb    lr, [jpc, #5]
+        ldrb    r3, [jpc, #3]
         rsb     r2, r2, #0
         DISPATCH_START  \seq_len
-	sub	r3, r3, #opc_iconst_0
+        rsb     r3, r3, #0
+        ldr     r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-        rsb     tmp2, lr, #0
 	DISPATCH_NEXT
-        ldr     tmp1, [locals, r2, lsl #2]
+        eor     r3, r2, r3
 	DISPATCH_NEXT
-        eor     r3, tmp1, r3
 	DISPATCH_NEXT
-        str     r3, [locals, tmp2, lsl #2]
+        PUSH    r3
+        DISPATCH_FINISH
+}
+
+(iload_iload_N)
+(ixor)
+{
+        ldrb    r3, [jpc, #2]
+        rsb     r2, r2, #0
+        DISPATCH_START  \seq_len
+        rsb     r3, r3, #opc_iload_0
+        ldr     r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+        DISPATCH_NEXT
+        DISPATCH_NEXT
+        eor     r3, r2, r3
+        DISPATCH_NEXT
+        DISPATCH_NEXT
+        PUSH    r3
+        DISPATCH_FINISH
+}
+
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(ixor)
+{
+        ldrb    r3, [jpc, #2]
+	rsb	r2, r0, #opc_iload_0_iload
+        DISPATCH_START  \seq_len
+        rsb     r3, r3, #0
+        ldr     r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+        DISPATCH_NEXT
+        DISPATCH_NEXT
+        eor     r3, r2, r3
+        DISPATCH_NEXT
+        DISPATCH_NEXT
+        PUSH    r3
+        DISPATCH_FINISH
+}
+
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(ixor)
+{
+	rsb	r3, r2, #opc_iload_0
+	rsb	r2, r0, #opc_iload_0_iload_N
+        DISPATCH_START  \seq_len
+        ldr     r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+        DISPATCH_NEXT
+        DISPATCH_NEXT
+        eor     r3, r2, r3
+        DISPATCH_NEXT
+        DISPATCH_NEXT
+        PUSH    r3
 	DISPATCH_FINISH
 }
 
+@ Former quads
+
 (iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
-(ixor_istore_N)
+(iadd_u4store)
 {
         rsb     r3, r0, #opc_iload_0_iconst_N
         DISPATCH_START  \seq_len
@@ -7835,7 +8147,44 @@
         ldrb    tmp1, [jpc, #-1]
         ldr     r3, [locals, r3, lsl #2]
 	DISPATCH_NEXT
-        eor     r3, r3, r2
+        add     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iconst_N)
+(iadd_u4store)
+{
+	ldrb	r3, [jpc, #2]
+        ldrb    lr, [jpc, #5]
+        rsb     r2, r2, #0
+        DISPATCH_START  \seq_len
+	sub	r3, r3, #opc_iconst_0
+	DISPATCH_NEXT
+        rsb     tmp2, lr, #0
+	DISPATCH_NEXT
+        ldr     tmp1, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        add     r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
+(iadd_istore_N)
+{
+        rsb     r3, r0, #opc_iload_0_iconst_N
+        DISPATCH_START  \seq_len
+	sub	r2, r2, #opc_iconst_0
+	DISPATCH_NEXT
+        ldrb    tmp1, [jpc, #-1]
+        ldr     r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+        add     r3, r3, r2
 	DISPATCH_NEXT
 	rsb	tmp1, tmp1, #opc_istore_0
 	DISPATCH_NEXT
@@ -7844,7 +8193,7 @@
 }
 
 (iload_iconst_N)
-(ixor_istore_N)
+(iadd_istore_N)
 {
 	ldrb	r3, [jpc, #2]
         ldrb    lr, [jpc, #4]
@@ -7856,8 +8205,1783 @@
 	DISPATCH_NEXT
         ldr     tmp1, [locals, r2, lsl #2]
 	DISPATCH_NEXT
-        eor     r3, tmp1, r3
+        add     r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
+(isub_u4store)
+{
+        rsb     r3, r0, #opc_iload_0_iconst_N
+        DISPATCH_START  \seq_len
+	sub	r2, r2, #opc_iconst_0
+	DISPATCH_NEXT
+        ldrb    tmp1, [jpc, #-1]
+        ldr     r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+        sub     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iconst_N)
+(isub_u4store)
+{
+	ldrb	r3, [jpc, #2]
+        ldrb    lr, [jpc, #5]
+        rsb     r2, r2, #0
+        DISPATCH_START  \seq_len
+	sub	r3, r3, #opc_iconst_0
+	DISPATCH_NEXT
+        rsb     tmp2, lr, #0
+	DISPATCH_NEXT
+        ldr     tmp1, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        sub     r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
+(isub_istore_N)
+{
+        rsb     r3, r0, #opc_iload_0_iconst_N
+        DISPATCH_START  \seq_len
+	sub	r2, r2, #opc_iconst_0
+	DISPATCH_NEXT
+        ldrb    tmp1, [jpc, #-1]
+        ldr     r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+        sub     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #opc_istore_0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iconst_N)
+(isub_istore_N)
+{
+	ldrb	r3, [jpc, #2]
+        ldrb    lr, [jpc, #4]
+        rsb     r2, r2, #0
+        DISPATCH_START  \seq_len
+	sub	r3, r3, #opc_iconst_0
+	DISPATCH_NEXT
+        rsb     tmp2, lr, #opc_istore_0
+	DISPATCH_NEXT
+        ldr     tmp1, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        sub     r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
+(iand_u4store)
+{
+        rsb     r3, r0, #opc_iload_0_iconst_N
+        DISPATCH_START  \seq_len
+	sub	r2, r2, #opc_iconst_0
+	DISPATCH_NEXT
+        ldrb    tmp1, [jpc, #-1]
+        ldr     r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+        and     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iconst_N)
+(iand_u4store)
+{
+	ldrb	r3, [jpc, #2]
+        ldrb    lr, [jpc, #5]
+        rsb     r2, r2, #0
+        DISPATCH_START  \seq_len
+	sub	r3, r3, #opc_iconst_0
+	DISPATCH_NEXT
+        rsb     tmp2, lr, #0
+	DISPATCH_NEXT
+        ldr     tmp1, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        and     r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
+(iand_istore_N)
+{
+        rsb     r3, r0, #opc_iload_0_iconst_N
+        DISPATCH_START  \seq_len
+	sub	r2, r2, #opc_iconst_0
+	DISPATCH_NEXT
+        ldrb    tmp1, [jpc, #-1]
+        ldr     r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+        and     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #opc_istore_0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iconst_N)
+(iand_istore_N)
+{
+	ldrb	r3, [jpc, #2]
+        ldrb    lr, [jpc, #4]
+        rsb     r2, r2, #0
+        DISPATCH_START  \seq_len
+	sub	r3, r3, #opc_iconst_0
+	DISPATCH_NEXT
+        rsb     tmp2, lr, #opc_istore_0
+	DISPATCH_NEXT
+        ldr     tmp1, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        and     r3, tmp1, r3
 	DISPATCH_NEXT
         str     r3, [locals, tmp2, lsl #2]
 	DISPATCH_FINISH
 }
+
+(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
+(ior_u4store)
+{
+        rsb     r3, r0, #opc_iload_0_iconst_N
+        DISPATCH_START  \seq_len
+	sub	r2, r2, #opc_iconst_0
+	DISPATCH_NEXT
+        ldrb    tmp1, [jpc, #-1]
+        ldr     r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+        orr     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iconst_N)
+(ior_u4store)
+{
+	ldrb	r3, [jpc, #2]
+        ldrb    lr, [jpc, #5]
+        rsb     r2, r2, #0
+        DISPATCH_START  \seq_len
+	sub	r3, r3, #opc_iconst_0
+	DISPATCH_NEXT
+        rsb     tmp2, lr, #0
+	DISPATCH_NEXT
+        ldr     tmp1, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        orr     r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
+(ior_istore_N)
+{
+        rsb     r3, r0, #opc_iload_0_iconst_N
+        DISPATCH_START  \seq_len
+	sub	r2, r2, #opc_iconst_0
+	DISPATCH_NEXT
+        ldrb    tmp1, [jpc, #-1]
+        ldr     r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+        orr     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #opc_istore_0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iconst_N)
+(ior_istore_N)
+{
+	ldrb	r3, [jpc, #2]
+        ldrb    lr, [jpc, #4]
+        rsb     r2, r2, #0
+        DISPATCH_START  \seq_len
+	sub	r3, r3, #opc_iconst_0
+	DISPATCH_NEXT
+        rsb     tmp2, lr, #opc_istore_0
+	DISPATCH_NEXT
+        ldr     tmp1, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        orr     r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
+(ixor_u4store)
+{
+        rsb     r3, r0, #opc_iload_0_iconst_N
+        DISPATCH_START  \seq_len
+	sub	r2, r2, #opc_iconst_0
+	DISPATCH_NEXT
+        ldrb    tmp1, [jpc, #-1]
+        ldr     r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+        eor     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iconst_N)
+(ixor_u4store)
+{
+	ldrb	r3, [jpc, #2]
+        ldrb    lr, [jpc, #5]
+        rsb     r2, r2, #0
+        DISPATCH_START  \seq_len
+	sub	r3, r3, #opc_iconst_0
+	DISPATCH_NEXT
+        rsb     tmp2, lr, #0
+	DISPATCH_NEXT
+        ldr     tmp1, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        eor     r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
+(ixor_istore_N)
+{
+        rsb     r3, r0, #opc_iload_0_iconst_N
+        DISPATCH_START  \seq_len
+	sub	r2, r2, #opc_iconst_0
+	DISPATCH_NEXT
+        ldrb    tmp1, [jpc, #-1]
+        ldr     r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+        eor     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #opc_istore_0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iconst_N)
+(ixor_istore_N)
+{
+	ldrb	r3, [jpc, #2]
+        ldrb    lr, [jpc, #4]
+        rsb     r2, r2, #0
+        DISPATCH_START  \seq_len
+	sub	r3, r3, #opc_iconst_0
+	DISPATCH_NEXT
+        rsb     tmp2, lr, #opc_istore_0
+	DISPATCH_NEXT
+        ldr     tmp1, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        eor     r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
+(if_icmpeq,if_acmpeq)
+{
+	ldrb	r3, [jpc, #1]
+	rsb	r2, r0, #opc_iload_0_iconst_N
+	ldrsb	r1, [jpc, #3]
+	sub	r3, r3, #opc_iconst_0
+	ldrb	ip, [jpc, #4]
+	ldr	r2, [locals, r2, lsl #2]
+	add	jpc, jpc, #2
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	beq	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_iconst_N)
+(if_icmpeq,if_acmpeq)
+{
+	ldrb	r3, [jpc, #2]
+	rsb	r2, r2, #0
+	ldrsb	r1, [jpc, #4]
+	sub	r3, r3, #opc_iconst_0
+	ldrb	ip, [jpc, #5]
+	ldr	r2, [locals, r2, lsl #2]
+	add	jpc, jpc, #3
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	beq	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
+(if_icmpne,if_acmpne)
+{
+	ldrb	r3, [jpc, #1]
+	rsb	r2, r0, #opc_iload_0_iconst_N
+	ldrsb	r1, [jpc, #3]
+	sub	r3, r3, #opc_iconst_0
+	ldrb	ip, [jpc, #4]
+	ldr	r2, [locals, r2, lsl #2]
+	add	jpc, jpc, #2
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	bne	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_iconst_N)
+(if_icmpne,if_acmpne)
+{
+	ldrb	r3, [jpc, #2]
+	rsb	r2, r2, #0
+	ldrsb	r1, [jpc, #4]
+	sub	r3, r3, #opc_iconst_0
+	ldrb	ip, [jpc, #5]
+	ldr	r2, [locals, r2, lsl #2]
+	add	jpc, jpc, #3
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	bne	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
+(if_icmplt)
+{
+	ldrb	r3, [jpc, #1]
+	rsb	r2, r0, #opc_iload_0_iconst_N
+	ldrsb	r1, [jpc, #3]
+	sub	r3, r3, #opc_iconst_0
+	ldrb	ip, [jpc, #4]
+	ldr	r2, [locals, r2, lsl #2]
+	add	jpc, jpc, #2
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	blt	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_iconst_N)
+(if_icmplt)
+{
+	ldrb	r3, [jpc, #2]
+	rsb	r2, r2, #0
+	ldrsb	r1, [jpc, #4]
+	sub	r3, r3, #opc_iconst_0
+	ldrb	ip, [jpc, #5]
+	ldr	r2, [locals, r2, lsl #2]
+	add	jpc, jpc, #3
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	blt	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
+(if_icmpge)
+{
+	ldrb	r3, [jpc, #1]
+	rsb	r2, r0, #opc_iload_0_iconst_N
+	ldrsb	r1, [jpc, #3]
+	sub	r3, r3, #opc_iconst_0
+	ldrb	ip, [jpc, #4]
+	ldr	r2, [locals, r2, lsl #2]
+	add	jpc, jpc, #2
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	bge	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_iconst_N)
+(if_icmpge)
+{
+	ldrb	r3, [jpc, #2]
+	rsb	r2, r2, #0
+	ldrsb	r1, [jpc, #4]
+	sub	r3, r3, #opc_iconst_0
+	ldrb	ip, [jpc, #5]
+	ldr	r2, [locals, r2, lsl #2]
+	add	jpc, jpc, #3
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	bge	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
+(if_icmpgt)
+{
+	ldrb	r3, [jpc, #1]
+	rsb	r2, r0, #opc_iload_0_iconst_N
+	ldrsb	r1, [jpc, #3]
+	sub	r3, r3, #opc_iconst_0
+	ldrb	ip, [jpc, #4]
+	ldr	r2, [locals, r2, lsl #2]
+	add	jpc, jpc, #2
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	bgt	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_iconst_N)
+(if_icmpgt)
+{
+	ldrb	r3, [jpc, #2]
+	rsb	r2, r2, #0
+	ldrsb	r1, [jpc, #4]
+	sub	r3, r3, #opc_iconst_0
+	ldrb	ip, [jpc, #5]
+	ldr	r2, [locals, r2, lsl #2]
+	add	jpc, jpc, #3
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	bgt	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_0_iconst_N,iload_1_iconst_N,iload_2_iconst_N,iload_3_iconst_N)
+(if_icmple)
+{
+	ldrb	r3, [jpc, #1]
+	rsb	r2, r0, #opc_iload_0_iconst_N
+	ldrsb	r1, [jpc, #3]
+	sub	r3, r3, #opc_iconst_0
+	ldrb	ip, [jpc, #4]
+	ldr	r2, [locals, r2, lsl #2]
+	add	jpc, jpc, #2
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	ble	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_iconst_N)
+(if_icmple)
+{
+	ldrb	r3, [jpc, #2]
+	rsb	r2, r2, #0
+	ldrsb	r1, [jpc, #4]
+	sub	r3, r3, #opc_iconst_0
+	ldrb	ip, [jpc, #5]
+	ldr	r2, [locals, r2, lsl #2]
+	add	jpc, jpc, #3
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	ble	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_iload)
+(iadd_istore_N)
+{
+	ldrb	r3, [jpc, #3]
+	ldrb	lr, [jpc, #5]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #opc_istore_0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	add	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload_N)
+(iadd_istore_N)
+{
+	ldrb	r3, [jpc, #2]
+	ldrb	lr, [jpc, #4]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #opc_iload_0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #opc_istore_0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	add	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(iadd_istore_N)
+{
+        rsb     r3, r0, #opc_iload_0_iload
+	ldrb	r2, [jpc, #2]
+	ldrb	tmp1, [jpc, #4]
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        add     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #opc_istore_0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(iadd_istore_N)
+{
+	ldrb	tmp1, [jpc, #3]
+	rsb	r3, r0, #opc_iload_0_iload_N
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #opc_iload_0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        add     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #opc_istore_0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload)
+(isub_istore_N)
+{
+	ldrb	r3, [jpc, #3]
+	ldrb	lr, [jpc, #5]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #opc_istore_0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	sub	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload_N)
+(isub_istore_N)
+{
+	ldrb	r3, [jpc, #2]
+	ldrb	lr, [jpc, #4]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #opc_iload_0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #opc_istore_0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	sub	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(isub_istore_N)
+{
+        rsb     r3, r0, #opc_iload_0_iload
+	ldrb	r2, [jpc, #2]
+	ldrb	tmp1, [jpc, #4]
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        sub     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #opc_istore_0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(isub_istore_N)
+{
+	ldrb	tmp1, [jpc, #3]
+	rsb	r3, r0, #opc_iload_0_iload_N
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #opc_iload_0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        sub     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #opc_istore_0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload)
+(iand_istore_N)
+{
+	ldrb	r3, [jpc, #3]
+	ldrb	lr, [jpc, #5]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #opc_istore_0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	and	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload_N)
+(iand_istore_N)
+{
+	ldrb	r3, [jpc, #2]
+	ldrb	lr, [jpc, #4]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #opc_iload_0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #opc_istore_0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	and	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(iand_istore_N)
+{
+        rsb     r3, r0, #opc_iload_0_iload
+	ldrb	r2, [jpc, #2]
+	ldrb	tmp1, [jpc, #4]
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        and     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #opc_istore_0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(iand_istore_N)
+{
+	ldrb	tmp1, [jpc, #3]
+	rsb	r3, r0, #opc_iload_0_iload_N
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #opc_iload_0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        and     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #opc_istore_0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload)
+(ior_istore_N)
+{
+	ldrb	r3, [jpc, #3]
+	ldrb	lr, [jpc, #5]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #opc_istore_0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	orr	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload_N)
+(ior_istore_N)
+{
+	ldrb	r3, [jpc, #2]
+	ldrb	lr, [jpc, #4]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #opc_iload_0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #opc_istore_0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	orr	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(ior_istore_N)
+{
+        rsb     r3, r0, #opc_iload_0_iload
+	ldrb	r2, [jpc, #2]
+	ldrb	tmp1, [jpc, #4]
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        orr     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #opc_istore_0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(ior_istore_N)
+{
+	ldrb	tmp1, [jpc, #3]
+	rsb	r3, r0, #opc_iload_0_iload_N
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #opc_iload_0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        orr     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #opc_istore_0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload)
+(ixor_istore_N)
+{
+	ldrb	r3, [jpc, #3]
+	ldrb	lr, [jpc, #5]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #opc_istore_0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	eor	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload_N)
+(ixor_istore_N)
+{
+	ldrb	r3, [jpc, #2]
+	ldrb	lr, [jpc, #4]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #opc_iload_0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #opc_istore_0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	eor	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(ixor_istore_N)
+{
+        rsb     r3, r0, #opc_iload_0_iload
+	ldrb	r2, [jpc, #2]
+	ldrb	tmp1, [jpc, #4]
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        eor     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #opc_istore_0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(ixor_istore_N)
+{
+	ldrb	tmp1, [jpc, #3]
+	rsb	r3, r0, #opc_iload_0_iload_N
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #opc_iload_0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        eor     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #opc_istore_0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload)
+(iadd_u4store)
+{
+	ldrb	r3, [jpc, #3]
+	ldrb	lr, [jpc, #6]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	add	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload_N)
+(iadd_u4store)
+{
+	ldrb	r3, [jpc, #2]
+	ldrb	lr, [jpc, #5]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #opc_iload_0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	add	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(iadd_u4store)
+{
+        rsb     r3, r0, #opc_iload_0_iload
+	ldrb	r2, [jpc, #2]
+	ldrb	tmp1, [jpc, #5]
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        add     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(iadd_u4store)
+{
+	ldrb	tmp1, [jpc, #4]
+	rsb	r3, r0, #opc_iload_0_iload_N
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #opc_iload_0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        add     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload)
+(isub_u4store)
+{
+	ldrb	r3, [jpc, #3]
+	ldrb	lr, [jpc, #6]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	sub	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload_N)
+(isub_u4store)
+{
+	ldrb	r3, [jpc, #2]
+	ldrb	lr, [jpc, #5]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #opc_iload_0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	sub	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(isub_u4store)
+{
+        rsb     r3, r0, #opc_iload_0_iload
+	ldrb	r2, [jpc, #2]
+	ldrb	tmp1, [jpc, #5]
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        sub     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(isub_u4store)
+{
+	ldrb	tmp1, [jpc, #4]
+	rsb	r3, r0, #opc_iload_0_iload_N
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #opc_iload_0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        sub     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload)
+(iand_u4store)
+{
+	ldrb	r3, [jpc, #3]
+	ldrb	lr, [jpc, #6]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	and	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload_N)
+(iand_u4store)
+{
+	ldrb	r3, [jpc, #2]
+	ldrb	lr, [jpc, #5]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #opc_iload_0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	and	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(iand_u4store)
+{
+        rsb     r3, r0, #opc_iload_0_iload
+	ldrb	r2, [jpc, #2]
+	ldrb	tmp1, [jpc, #5]
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        and     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(iand_u4store)
+{
+	ldrb	tmp1, [jpc, #4]
+	rsb	r3, r0, #opc_iload_0_iload_N
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #opc_iload_0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        and     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload)
+(ior_u4store)
+{
+	ldrb	r3, [jpc, #3]
+	ldrb	lr, [jpc, #6]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	orr	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload_N)
+(ior_u4store)
+{
+	ldrb	r3, [jpc, #2]
+	ldrb	lr, [jpc, #5]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #opc_iload_0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	orr	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(ior_u4store)
+{
+        rsb     r3, r0, #opc_iload_0_iload
+	ldrb	r2, [jpc, #2]
+	ldrb	tmp1, [jpc, #5]
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        orr     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(ior_u4store)
+{
+	ldrb	tmp1, [jpc, #4]
+	rsb	r3, r0, #opc_iload_0_iload_N
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #opc_iload_0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        orr     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload)
+(ixor_u4store)
+{
+	ldrb	r3, [jpc, #3]
+	ldrb	lr, [jpc, #6]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	eor	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload_N)
+(ixor_u4store)
+{
+	ldrb	r3, [jpc, #2]
+	ldrb	lr, [jpc, #5]
+	rsb	r2, r2, #0
+        DISPATCH_START  \seq_len
+	rsb	r3, r3, #opc_iload_0
+	DISPATCH_NEXT
+	rsb	tmp2, lr, #0
+	ldr	tmp1, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	eor	r3, tmp1, r3
+	DISPATCH_NEXT
+        str     r3, [locals, tmp2, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(ixor_u4store)
+{
+        rsb     r3, r0, #opc_iload_0_iload
+	ldrb	r2, [jpc, #2]
+	ldrb	tmp1, [jpc, #5]
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        eor     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(ixor_u4store)
+{
+	ldrb	tmp1, [jpc, #4]
+	rsb	r3, r0, #opc_iload_0_iload_N
+        DISPATCH_START  \seq_len
+	rsb	r2, r2, #opc_iload_0
+	DISPATCH_NEXT
+        ldr     r3, [locals, r3, lsl #2]
+	ldr	r2, [locals, r2, lsl #2]
+	DISPATCH_NEXT
+        eor     r3, r3, r2
+	DISPATCH_NEXT
+	rsb	tmp1, tmp1, #0
+	DISPATCH_NEXT
+        str     r3, [locals, tmp1, lsl #2]
+	DISPATCH_FINISH
+}
+
+(iload_iload)
+(if_icmpeq,if_acmpeq) {
+	ldrb	r3, [jpc, #3]
+	rsb	r2, r2, #0
+	ldrsb	r1, [jpc, #5]
+	rsb	r3, r3, #0
+	ldrb	ip, [jpc, #6]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #4
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	beq	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_iload_N)
+(if_icmpeq,if_acmpeq) {
+	ldrb	r3, [jpc, #2]
+	rsb	r2, r2, #0
+	ldrsb	r1, [jpc, #4]
+	rsb	r3, r3, #opc_iload_0
+	ldrb	ip, [jpc, #5]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #3
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	beq	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(if_icmpeq,if_acmpeq) {
+	ldrb	r3, [jpc, #2]
+	rsb	r2, r0, #opc_iload_0_iload
+	ldrsb	r1, [jpc, #4]
+	rsb	r3, r3, #0
+	ldrb	ip, [jpc, #5]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #3
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	beq	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(if_icmpeq,if_acmpeq) {
+	rsb	r3, r2, #opc_iload_0
+	rsb	r2, r0, #opc_iload_0_iload_N
+	ldrsb	r1, [jpc, #3]
+	ldrb	ip, [jpc, #4]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #2
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	beq	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_iload_N)
+(if_icmpne,if_acmpne) {
+	ldrb	r3, [jpc, #2]
+	rsb	r2, r2, #0
+	ldrsb	r1, [jpc, #4]
+	rsb	r3, r3, #opc_iload_0
+	ldrb	ip, [jpc, #5]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #3
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	bne	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(if_icmpne,if_acmpne) {
+	ldrb	r3, [jpc, #2]
+	rsb	r2, r0, #opc_iload_0_iload
+	ldrsb	r1, [jpc, #4]
+	rsb	r3, r3, #0
+	ldrb	ip, [jpc, #5]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #3
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	bne	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(if_icmpne,if_acmpne) {
+	rsb	r3, r2, #opc_iload_0
+	rsb	r2, r0, #opc_iload_0_iload_N
+	ldrsb	r1, [jpc, #3]
+	ldrb	ip, [jpc, #4]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #2
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	bne	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_iload)
+(if_icmplt) {
+	ldrb	r3, [jpc, #3]
+	rsb	r2, r2, #0
+	ldrsb	r1, [jpc, #5]
+	rsb	r3, r3, #0
+	ldrb	ip, [jpc, #6]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #4
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	blt	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_iload_N)
+(if_icmplt) {
+	ldrb	r3, [jpc, #2]
+	rsb	r2, r2, #0
+	ldrsb	r1, [jpc, #4]
+	rsb	r3, r3, #opc_iload_0
+	ldrb	ip, [jpc, #5]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #3
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	blt	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(if_icmplt) {
+	ldrb	r3, [jpc, #2]
+	rsb	r2, r0, #opc_iload_0_iload
+	ldrsb	r1, [jpc, #4]
+	rsb	r3, r3, #0
+	ldrb	ip, [jpc, #5]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #3
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	blt	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(if_icmplt) {
+	rsb	r3, r2, #opc_iload_0
+	rsb	r2, r0, #opc_iload_0_iload_N
+	ldrsb	r1, [jpc, #3]
+	ldrb	ip, [jpc, #4]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #2
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	blt	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_iload)
+(if_icmpge) {
+	ldrb	r3, [jpc, #3]
+	rsb	r2, r2, #0
+	ldrsb	r1, [jpc, #5]
+	rsb	r3, r3, #0
+	ldrb	ip, [jpc, #6]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #4
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	bge	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_iload_N)
+(if_icmpge) {
+	ldrb	r3, [jpc, #2]
+	rsb	r2, r2, #0
+	ldrsb	r1, [jpc, #4]
+	rsb	r3, r3, #opc_iload_0
+	ldrb	ip, [jpc, #5]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #3
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	bge	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(if_icmpge) {
+	ldrb	r3, [jpc, #2]
+	rsb	r2, r0, #opc_iload_0_iload
+	ldrsb	r1, [jpc, #4]
+	rsb	r3, r3, #0
+	ldrb	ip, [jpc, #5]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #3
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	bge	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(if_icmpge) {
+	rsb	r3, r2, #opc_iload_0
+	rsb	r2, r0, #opc_iload_0_iload_N
+	ldrsb	r1, [jpc, #3]
+	ldrb	ip, [jpc, #4]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #2
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	bge	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_iload)
+(if_icmpgt) {
+	ldrb	r3, [jpc, #3]
+	rsb	r2, r2, #0
+	ldrsb	r1, [jpc, #5]
+	rsb	r3, r3, #0
+	ldrb	ip, [jpc, #6]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #4
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	bgt	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_iload_N)
+(if_icmpgt) {
+	ldrb	r3, [jpc, #2]
+	rsb	r2, r2, #0
+	ldrsb	r1, [jpc, #4]
+	rsb	r3, r3, #opc_iload_0
+	ldrb	ip, [jpc, #5]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #3
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	bgt	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(if_icmpgt) {
+	ldrb	r3, [jpc, #2]
+	rsb	r2, r0, #opc_iload_0_iload
+	ldrsb	r1, [jpc, #4]
+	rsb	r3, r3, #0
+	ldrb	ip, [jpc, #5]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #3
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	bgt	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(if_icmpgt) {
+	rsb	r3, r2, #opc_iload_0
+	rsb	r2, r0, #opc_iload_0_iload_N
+	ldrsb	r1, [jpc, #3]
+	ldrb	ip, [jpc, #4]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #2
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	bgt	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_iload)
+(if_icmple) {
+	ldrb	r3, [jpc, #3]
+	rsb	r2, r2, #0
+	ldrsb	r1, [jpc, #5]
+	rsb	r3, r3, #0
+	ldrb	ip, [jpc, #6]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #4
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	ble	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_iload_N)
+(if_icmple) {
+	ldrb	r3, [jpc, #2]
+	rsb	r2, r2, #0
+	ldrsb	r1, [jpc, #4]
+	rsb	r3, r3, #opc_iload_0
+	ldrb	ip, [jpc, #5]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #3
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	ble	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload)
+(if_icmple) {
+	ldrb	r3, [jpc, #2]
+	rsb	r2, r0, #opc_iload_0_iload
+	ldrsb	r1, [jpc, #4]
+	rsb	r3, r3, #0
+	ldrb	ip, [jpc, #5]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #3
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	ble	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N)
+(if_icmple) {
+	rsb	r3, r2, #opc_iload_0
+	rsb	r2, r0, #opc_iload_0_iload_N
+	ldrsb	r1, [jpc, #3]
+	ldrb	ip, [jpc, #4]
+	ldr	r2, [locals, r2, lsl #2]
+	ldr	r3, [locals, r3, lsl #2]
+	add	jpc, jpc, #2
+	cmp	r2, r3
+	orr	ip, ip, r1, lsl #8
+	ble	1f
+	mov	ip, #3
+1:
+	ldrb	r0, [jpc, ip]!
+	DISPATCH_BYTECODE
+}
+
+#ifdef HW_FP
+
+(dmac)(dastore) {
+	ldr	tmp2, [stack, #28]
+	ldr	tmp1, [stack, #32]
+	vldr	d2, [stack, #20]
+	vldr	d1, [stack, #12]
+	vldr	d0, [stack, #4]
+	DISPATCH_START	\seq_len
+	SW_NPC	cmp	tmp1, #0
+	SW_NPC	beq	null_ptr_exception
+.abortentry120:
+	ldr	ip, [tmp1, #8]
+	cmp	tmp2, ip
+	DISPATCH_NEXT
+	bcs	array_bound_exception_jpc_1_tmp2
+	DISPATCH_NEXT
+	add	tmp2, tmp1, tmp2, lsl #3
+	fmacd	d2, d1, d0
+	vstr	d2, [tmp2, #16]
+	DISPATCH_NEXT
+	DISPATCH_NEXT
+	add	stack, stack, #32
+	DISPATCH_FINISH
+}
+
+#endif //HW_FP
+
+#endif // FAST_BYTECODES



More information about the distro-pkg-dev mailing list