Mercurial > hg > release > icedtea6-1.7
changeset 1706:ff08018c9fb6
Merge
author | Andrew John Hughes <ahughes@redhat.com> |
---|---|
date | Sat, 12 Sep 2009 12:45:13 +0100 |
parents | 7c3d22953ef6 (current diff) b7e6ccea40d4 (diff) |
children | f08ebc18b41a |
files | ChangeLog Makefile.am |
diffstat | 11 files changed, 6959 insertions(+), 4124 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Fri Sep 11 17:09:38 2009 +0100 +++ b/ChangeLog Sat Sep 12 12:45:13 2009 +0100 @@ -4,7 +4,34 @@ Reference netscape.* plugin sources by path rather than copying them to rt. This avoids them getting packaged in tarballs. - + +2009-09-11 Edward Nevill <ed@camswl.com> + + * Makefile.am: Changed mkbc rule to allow preprocessing by gcc + * mkbc.c: Changed to allow preprocessing by gcc + * zero.make: Added support for automatic offset generation + * asm_helper.c: Support for offset generation and calling of + C++ virtual functions from Asm + * bytecodes_zero.cpp: Added new fast bytecodes + * bytecodes_zero.hpp: Ditto + * bytes_zero.hpp: Optimised get_native_X and get_Java_X + * cppInterpreter_zero.cpp: Fixed some type definitions & casts + Moved configuration checking from here to asm_generate_entry + * os_linux_zero.cpp: Removed #if defined(PRODUCT) + * cppInterpreter_arm.S: + * bytecodes_arm.def: + Support for HW FP. Lots of debugs and asserts. Build for gcc 4.1 + Automatic generation of asm offsets. Removed sync. native entry. + Support for UseCompiler. Fastpath invokeinterface. Optimised new, + instanceof & checkcast. Additional fast bytecodes and bc sequences. + Fast div and rem by constant. Other minor optimisations. + +2009-09-09 Lillian Angel <langel@redhat.com> + + * Makefile.am: Added NB_PLATFORM and NB_APISUPPORT to determine + current versions to use. This will prevent future failures whenever + NetBeans is updated. + 2009-09-09 Andrew Haley <aph@redhat.com> * NEWS: Update for 1.6.
--- a/Makefile.am Fri Sep 11 17:09:38 2009 +0100 +++ b/Makefile.am Sat Sep 12 12:45:13 2009 +0100 @@ -33,6 +33,14 @@ endif endif +if WITH_VISUALVM +NB_PLATFORM= $(shell ls /usr/share/netbeans | grep platform | tail -n1) +NB_APISUPPORT=$(shell ls /usr/share/netbeans | grep apisupport | tail -n1) +else +NB_PLATFORM= +NB_APISUPPORT= +endif + if ENABLE_PULSE_JAVA # include the makefile in pulseaudio subdir PULSE_JAVA_DIR = $(abs_top_srcdir)/pulseaudio @@ -472,8 +480,18 @@ $(abs_top_srcdir)/mkbc: $(abs_top_srcdir)/mkbc.c $(CC) $< -o $@ +# ECN: The following rule has been changed to allow preprocessing of the bytecode definition +# file prior to running 'mkbc'. This allows you to use -DXXX on the gcc command. There are two +# options currently recognized. +# +# -DDISABLE_NOTICE_SAFEPONTS - Always run in 'safe' mode. +# -DDISABLE_FAST_BYTECODES - Disable fast bytecode replacement and bytecode sequences +# +# These options are provided mainly to assist debugging by returning the bytecode interpreter +# to a 'vanilla' interpreter. +# ${ZERO_ASM_BC_ASM}: ${ZERO_ASM_BC_DEF} $(abs_top_srcdir)/mkbc - $(abs_top_srcdir)/mkbc $< $@ + gcc -E - < $< | $(abs_top_srcdir)/mkbc - $@ # Link ports sources into tree stamps/ports.stamp: stamps/replace-hotspot.stamp @@ -1189,7 +1207,7 @@ $(BUILD_OUTPUT_DIR)/j2sdk-image/lib/visualvm/etc/visualvm.clusters ; \ cp -r visualvm/build/cluster/* \ $(BUILD_OUTPUT_DIR)/j2sdk-image/lib/visualvm/visualvm ; \ - cp -r netbeans/nbbuild/netbeans_visualvm/platform9 \ + cp -r netbeans/nbbuild/netbeans_visualvm/$(NB_PLATFORM) \ $(BUILD_OUTPUT_DIR)/j2sdk-image/lib/visualvm ; \ cp -r netbeans/nbbuild/netbeans_visualvm/profiler3 \ $(BUILD_OUTPUT_DIR)/j2sdk-image/lib/visualvm @@ -1274,7 +1292,7 @@ $(BUILD_OUTPUT_DIR)/j2sdk-image/lib/visualvm/etc/visualvm.clusters ; \ cp -r visualvm/build/cluster/* \ $(BUILD_OUTPUT_DIR)/j2sdk-image/lib/visualvm/visualvm ; \ - cp -r netbeans/nbbuild/netbeans_visualvm/platform9 \ + cp -r netbeans/nbbuild/netbeans_visualvm/$(NB_PLATFORM) \ $(BUILD_OUTPUT_DIR)/j2sdk-image/lib/visualvm ; \ cp -r netbeans/nbbuild/netbeans_visualvm/profiler3 \ $(BUILD_OUTPUT_DIR)/j2sdk-image/lib/visualvm @@ -2032,8 +2050,8 @@ cd netbeans ; \ rm nbbuild/external/binaries-list ; \ mkdir -p ./nbbuild/netbeans_visualvm/ ; \ - ln -s $(SYSTEM_NETBEANS_DIR)/platform9/ ./nbbuild/netbeans_visualvm/platform9 ; \ - ln -s $(SYSTEM_NETBEANS_DIR)/apisupport1/ ./nbbuild/netbeans_visualvm/apisupport1 ; \ + ln -s $(SYSTEM_NETBEANS_DIR)/$(NB_PLATFORM)/ ./nbbuild/netbeans_visualvm/$(NB_PLATFORM) ; \ + ln -s $(SYSTEM_NETBEANS_DIR)/$(NB_APISUPPORT)/ ./nbbuild/netbeans_visualvm/$(NB_APISUPPORT) ; \ ln -s $(SYSTEM_NETBEANS_DIR)/harness/ ./nbbuild/netbeans_visualvm/harness ; \ if ! (uname -a | grep x86_64) ; then \ mkdir -p lib.profiler/release/lib/deployed/jdk15/linux ; \
--- a/mkbc.c Fri Sep 11 17:09:38 2009 +0100 +++ b/mkbc.c Sat Sep 12 12:45:13 2009 +0100 @@ -1,3 +1,17 @@ +/* + * Copyright 2009 Edward Nevill + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + */ + #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -10,7 +24,7 @@ #define ISALPHA(c) (isalpha(c) || (c) == '_') #define ISALNUM(c) (isalnum(c) || (c) == '_') -FILE *source_f, *bci_f, *bci_f; +FILE *source_f, *bci_f; typedef struct Bytecode { char *name; @@ -282,7 +296,7 @@ c = (readchar)(); c = skipwhitespace(c); while (c != EOF) { - if (c == '#') { + if (c == '@' || c == '#') { c = skipeol(c); } else if (ISALPHA(c)) { c = readsymbol(c, buf, BUFLEN); @@ -546,7 +560,7 @@ source = bci = 0; while (s = *++argv) { - if (*s == '-') { + if (s[0] == '-' && s[1] != 0) { if (s[1] == 'P') { prefix = s+2; } else { @@ -566,16 +580,26 @@ fprintf(stderr, "Too few arguments\n"); usage(); } - source_f = fopen(source, "r"); - if (!source_f) fatal("Error opening source file"); - bci_f = fopen(bci, "w"); - if (!bci_f) fatal("Error opening bci file for write"); + if (strcmp(source, "-") == 0) { + source_f = stdin; + } else { + source_f = fopen(source, "r"); + if (!source_f) fatal("Error opening source file"); + } + if (strcmp(bci, "-") == 0) { + bci_f = stdout; + } else { + bci_f = fopen(bci, "w"); + if (!bci_f) fatal("Error opening bci file for write"); + } for (i = 0; i < 256; i++) { bytecodes[i].name = "undefined"; bytecodes[i].len = -1; } mkbc(); dumpbc(); - if (fclose(source_f)) fatal("Error reading source"); - if (fclose(bci_f)) fatal("Error writing bci"); + if (ferror(source_f)) fatal("Error reading source"); + if (ferror(bci_f)) fatal("Error writing bci"); + if (source_f != stdin) fclose(source_f); + if (bci_f != stdout) fclose(bci_f); }
--- a/ports/hotspot/build/linux/makefiles/zero.make Fri Sep 11 17:09:38 2009 +0100 +++ b/ports/hotspot/build/linux/makefiles/zero.make Sat Sep 12 12:45:13 2009 +0100 @@ -24,12 +24,28 @@ # ifeq ($(ZERO_LIBARCH),arm) + +Obj_Files += asm_helper.o Obj_Files += cppInterpreter_arm.o -CFLAGS += -DHOTSPOT_ASM -DHW_NULL_PTR_CHECK + +CFLAGS += -DHOTSPOT_ASM + %.o: %.S @echo Assembling $< $(QUIETLY) $(REMOVE_TARGET) $(COMPILE.CC) -o $@ $< $(COMPILE_DONE) + +cppInterpreter_arm.o: offsets_arm.s + +offsets_arm.s: mkoffsets + @echo Generating assembler offsets + ./mkoffsets > $@ + +mkoffsets: asm_helper.cpp + @echo Compiling offset generator + $(QUIETLY) $(REMOVE_TARGET) + $(CC_COMPILE) -DSTATIC_OFFSETS -o $@ $< $(COMPILE_DONE) + endif # The copied fdlibm routines in sharedRuntimeTrig.o must not be optimized
--- a/ports/hotspot/src/cpu/zero/vm/bytecodes_arm.def Fri Sep 11 17:09:38 2009 +0100 +++ b/ports/hotspot/src/cpu/zero/vm/bytecodes_arm.def Sat Sep 12 12:45:13 2009 +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 + +@agetfield = 0xcb, 3 bgetfield = 0xcc, 3 cgetfield = 0xcd, 3 -#dgetfield = 0xce, 3 -#fgetfield = 0xcf, 3 +@dgetfield = 0xce, 3 +@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 +@dputfield = 0xd6, 3 +@fputfield = 0xd7, 3 iputfield = 0xd8, 3 lputfield = 0xd9, 3 -#sputfield = 0xda, 3 +@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 - -return_register_finalizer = 229, 0 +invokeresolved = 0xdf, 3 +invokespecialresolved = 0xe0, 3 +invokestaticresolved = 0xe1, 3 +invokevfinal = 0xe2, 3 + +iload_iload = 0xe3, 4 +iload_iload_N = 0xe4, 3 + +@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 = 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 - DISPATCH_START \seq_len -#ifndef HW_NULL_PTR_CHECK - cmp r3, #0 - beq null_ptr_exception_jpc_1 -#endif + POP r2, r3 @ r2 = index, r3 = arrayref + DISPATCH_START \seq_len + 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 - DISPATCH_START \seq_len -#ifndef HW_NULL_PTR_CHECK - cmp r3, #0 - beq null_ptr_exception_jpc_1 -#endif + POP r2, r3 + DISPATCH_START \seq_len + 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 - DISPATCH_START \seq_len -#ifndef HW_NULL_PTR_CHECK - cmp r3, #0 - beq null_ptr_exception_jpc_1 -#endif + POP r2, r3 @ r2 = index, r3 = arrayref + DISPATCH_START \seq_len + 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 - DISPATCH_START \seq_len -#ifndef HW_NULL_PTR_CHECK - cmp r3, #0 - beq null_ptr_exception_jpc_1 -#endif + POP r2, r3 @ r2 = index, r3 = arrayref + DISPATCH_START \seq_len + 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 - DISPATCH_START \seq_len -#ifndef HW_NULL_PTR_CHECK - cmp r3, #0 - beq null_ptr_exception_jpc_1 -#endif + POP r2, r3 @ r2 = index, r3 = arrayref + DISPATCH_START \seq_len + 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 - DISPATCH_START \seq_len -#ifndef HW_NULL_PTR_CHECK - cmp tmp1, #0 - beq null_ptr_exception_jpc_1 -#endif + POP r3, tmp2, tmp1 @ r3 = value, tmp2 = index, tmp1 = arrayref + DISPATCH_START \seq_len + 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 - DISPATCH_START \seq_len -#ifndef HW_NULL_PTR_CHECK - cmp tmp1, #0 - beq null_ptr_exception_jpc_1 -#endif + POP r2, r3, tmp2, tmp1 @ r2,r3 = value, tmp2 = index, tmp1 = arrayref + DISPATCH_START \seq_len + 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 - DISPATCH_START \seq_len -#ifndef HW_NULL_PTR_CHECK - cmp tmp1, #0 - beq null_ptr_exception_jpc_1 -#endif + POP r3, tmp2, tmp1 @ r3 = value, tmp2 = index, tmp1 = arrayref + DISPATCH_START \seq_len + 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 - DISPATCH_START \seq_len -#ifndef HW_NULL_PTR_CHECK - cmp tmp1, #0 - beq null_ptr_exception_jpc_1 -#endif + POP r3, tmp2, tmp1 @ r3 = value, tmp2 = index, tmp1 = arrayref + DISPATCH_START \seq_len + 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 - DISPATCH_NEXT - PUSH2 r2, r3 - DISPATCH_NEXT - PUSH3 r2, r3, lr + POP r2, r3, lr + DISPATCH_NEXT + PUSH r2, r3 + DISPATCH_NEXT + PUSH r2, r3, lr DISPATCH_FINISH } (dup2_x2) dup2_x2 { DISPATCH_START \seq_len - POP4 r2, r3, tmp1, lr - DISPATCH_NEXT - PUSH2 r2, r3 - PUSH4 r2, r3, tmp1, lr + POP r2, r3, tmp1, lr + DISPATCH_NEXT + 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 - DISPATCH_FINISH -} - -(fadd) fadd { - POP2 r0, r1 - bl __aeabi_fadd - PUSH r0 - DISPATCH \seq_len + PUSH r2, r3 + DISPATCH_FINISH } (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 - DISPATCH_FINISH -} - -(fsub) fsub { - POP r1 - POP r0 - bl __aeabi_fsub - PUSH r0 - DISPATCH \seq_len + PUSH r2, r3 + DISPATCH_FINISH } (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 - DISPATCH_FINISH -} - -(fmul) fmul { - POP2 r0, r1 - bl __aeabi_fmul - PUSH r0 - DISPATCH \seq_len + PUSH r3, tmp1 + DISPATCH_FINISH } (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 - DISPATCH_FINISH -} - -# r2 = [jpc, #1] + PUSH r2, r3 + DISPATCH_FINISH +} + +@ 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 -} - -# r2 = [jpc, #1] -# r1 = [jpc, #2] +#ifdef NOTICE_SAFEPOINTS + +@ 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 -} - -# r2 = [jpc, #1] -# r1 = [jpc, #2] + b do_goto +} + +@ 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] - - POP2 r2, r3 + ldr ip, [istate, #ISTATE_ADVANCE_PC] + ldr istate, [istate, #ISTATE_NEXT_FRAME] + + POP r2, r3 add stack, r1, r0, lsl #2 stmdb stack!, {r2, r3} - cmp 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 - - DISPATCH_START \seq_len - - ldr r2, [r3, #12] @ constants - ldr r3, [r2, #8] + ldrb lr, [jpc, #1] + + ldr tmp1, [r3, #12] @ constants + + DISPATCH_START \seq_len + + 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 - DISPATCH_NEXT - - add r3, r2, lr, lsl #2 - ldr lr, [r3, #32] - PUSH lr + add r3, tmp1, lr, lsl #2 + ldr r3, [r3, #32] + DISPATCH_NEXT + 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] + ldr r3, [r0, #THREAD_VM_RESULT] bne handle_exception - ldr r3, [r0, #THREAD_VM_RESULT] 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 - DISPATCH_FINISH -} - + 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 - DISPATCH_NEXT - ldr tmp2, [tmp2, #8] + SW_NPC cmp tmp1, #0 + SW_NPC beq null_ptr_exception_jpc_3 + DISPATCH_NEXT + ldr tmp2, [tmp2, #CP_OFFSET+8] DISPATCH_NEXT .abortentry87: ldr tmp2, [tmp1, tmp2] @@ -2400,11 +2272,358 @@ DISPATCH_FINISH } -############################################################################### -# ECN: Optimised bytecode pairs -############################################################################### - -# --- ECN: load; load --------------------------------------------------------- +@ r2 = [jpc, #1] +(iload_iload) fast_iload_iload +{ + ldrb r3, [jpc, #3] + DISPATCH_START \seq_len + rsb r2, r2, #0 + DISPATCH_NEXT + rsb r3, r3, #0 + DISPATCH_NEXT + ldr tmp1, [locals, r2, lsl #2] + DISPATCH_NEXT + ldr r3, [locals, r3, lsl #2] + DISPATCH_NEXT + PUSH r3, tmp1 + DISPATCH_FINISH +} + +@ r2 = [jpc, #1] +(iload_iload_N) fast_iload_iload_N +{ + ldrb r3, [jpc, #2] + DISPATCH_START \seq_len + rsb r2, r2, #0 + DISPATCH_NEXT + rsb r3, r3, #opc_iload_0 + DISPATCH_NEXT + ldr tmp1, [locals, r2, lsl #2] + DISPATCH_NEXT + ldr r3, [locals, r3, lsl #2] + DISPATCH_NEXT + PUSH r3, tmp1 + DISPATCH_FINISH +} + +(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload) fast_iload_N_iload +{ + ldrb r3, [jpc, #2] + rsb r2, r0, #opc_iload_0_iload + DISPATCH_START \seq_len + rsb r3, r3, #0 + DISPATCH_NEXT + ldr tmp1, [locals, r2, lsl #2] + DISPATCH_NEXT + ldr r3, [locals, r3, lsl #2] + DISPATCH_NEXT + DISPATCH_NEXT + PUSH r3, tmp1 + DISPATCH_FINISH +} + +(iload_0_iload_N,iload_1_iload_N,iload_2_iload_N,iload_3_iload_N) fast_iload_N_iload_N +{ + rsb r3, r0, #opc_iload_0_iload_N + DISPATCH_START \seq_len + rsb r2, r2, #opc_iload_0 + DISPATCH_NEXT + ldr tmp1, [locals, r3, lsl #2] + DISPATCH_NEXT + ldr r3, [locals, r2, lsl #2] + DISPATCH_NEXT + DISPATCH_NEXT + PUSH r3, tmp1 + DISPATCH_FINISH +} + +#endif // FAST_BYTECODE + +#ifdef HW_FP + +(fadd) fadd_vfp { + DISPATCH_START 1 + vldr s15, [stack, #8] + vldr s14, [stack, #4] + DISPATCH_NEXT + DISPATCH_NEXT + fadds s15, s15, s14 + DISPATCH_NEXT + DISPATCH_NEXT + vstr s15, [stack, #8] + add stack, stack, #4 + DISPATCH_FINISH +} + +(dadd) dadd_vfp { + DISPATCH_START 1 + vldr d7, [stack, #12] + vldr d6, [stack, #4] + DISPATCH_NEXT + DISPATCH_NEXT + faddd d0, d7, d6 + DISPATCH_NEXT + DISPATCH_NEXT + vstr d0, [stack, #12] + add stack, stack, #8 + DISPATCH_FINISH +} + +(fsub) fsub_vfp { + DISPATCH_START 1 + vldr s15, [stack, #8] + vldr s14, [stack, #4] + DISPATCH_NEXT + DISPATCH_NEXT + fsubs s15, s15, s14 + DISPATCH_NEXT + DISPATCH_NEXT + vstr s15, [stack, #8] + add stack, stack, #4 + DISPATCH_FINISH +} + +(fmul) fmul_vfp { + DISPATCH_START 1 + vldr s15, [stack, #8] + vldr s14, [stack, #4] + DISPATCH_NEXT + DISPATCH_NEXT + fmuls s15, s15, s14 + DISPATCH_NEXT + DISPATCH_NEXT + vstr s15, [stack, #8] + add stack, stack, #4 + DISPATCH_FINISH +} + +(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 + DISPATCH_NEXT + fmuld d0, d7, d6 + DISPATCH_NEXT + 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 +} + +#ifdef FAST_BYTECODES + +(dmac) dmac_vfp { + DISPATCH_START \seq_len + vldr d2, [stack, #20] + vldr d1, [stack, #12] + vldr d0, [stack, #4] + DISPATCH_NEXT + DISPATCH_NEXT + fmacd d2, d1, d0 + DISPATCH_NEXT + DISPATCH_NEXT + vstr d2, [stack, #20] + add stack, stack, #16 + DISPATCH_FINISH +} + +#endif // FAST_BYTECODES + +(fdiv) fdiv_vfp { + DISPATCH_START 1 + vldr s15, [stack, #8] + vldr s14, [stack, #4] + DISPATCH_NEXT + DISPATCH_NEXT + fdivs s15, s15, s14 + DISPATCH_NEXT + DISPATCH_NEXT + vstr s15, [stack, #8] + add stack, stack, #4 + DISPATCH_FINISH +} + +(ddiv) ddiv_vfp { + DISPATCH_START 1 + vldr d7, [stack, #12] + vldr d6, [stack, #4] + DISPATCH_NEXT + DISPATCH_NEXT + fdivd d0, d7, d6 + DISPATCH_NEXT + DISPATCH_NEXT + vstr d0, [stack, #12] + add stack, stack, #8 + DISPATCH_FINISH +} + +(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 + DISPATCH_NEXT + PUSH r3 + DISPATCH_FINISH +} + +(fcmpg) fcmpg_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 + movne r3, #1 +1: + DISPATCH_NEXT + DISPATCH_NEXT + PUSH r3 + DISPATCH_FINISH +} + +(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 + PUSH lr + ldr tmp1, [locals, tmp1, lsl #2] + add tmp2, r3, lsl #4 + DISPATCH_NEXT + 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 + PUSH tmp2 + DISPATCH_FINISH +} + +(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 + PUSH lr + ldr tmp1, [locals, tmp1, lsl #2] + add tmp2, r3, lsl #4 + DISPATCH_NEXT + 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 + PUSH tmp2 + DISPATCH_FINISH +} + +@ --- ECN: load; load --------------------------------------------------------- (aload_0,aload_1,aload_2,aload_3) (aload_0,aload_1,aload_2,aload_3) @@ -2418,7 +2637,7 @@ DISPATCH_NEXT DISPATCH_NEXT DISPATCH_NEXT - PUSH2 tmp2, tmp1 + PUSH tmp2, tmp1 DISPATCH_FINISH } @@ -2434,7 +2653,7 @@ DISPATCH_NEXT DISPATCH_NEXT DISPATCH_NEXT - PUSH2 tmp2, tmp1 + PUSH tmp2, tmp1 DISPATCH_FINISH } @@ -2442,33 +2661,33 @@ (aload_0,aload_1,aload_2,aload_3) { rsb tmp1, r0, #opc_iload_0 - DISPATCH_START \seq_len + DISPATCH_START \seq_len rsb tmp2, r1, #opc_aload_0 - DISPATCH_NEXT + DISPATCH_NEXT ldr tmp1, [locals, tmp1, lsl #2] + cmp r0, #opc_igetfield ldr tmp2, [locals, tmp2, lsl #2] - DISPATCH_NEXT - DISPATCH_NEXT - DISPATCH_NEXT - PUSH2 tmp2, tmp1 - DISPATCH_FINISH -} - -# 7 cycles + beq 1f +2: + DISPATCH_NEXT + DISPATCH_NEXT + DISPATCH_NEXT + 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 +} + +@ 7 cycles (iload_0,iload_1,iload_2,iload_3) (iload_0,iload_1,iload_2,iload_3) { - rsb tmp1, r0, #opc_iload_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 - PUSH2 tmp2, tmp1 - DISPATCH_FINISH + 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) @@ -2484,12 +2703,12 @@ DISPATCH_NEXT DISPATCH_NEXT DISPATCH_NEXT - PUSH2 r3, tmp1 + PUSH r3, tmp1 DISPATCH_FINISH } (iload_0,iload_1,iload_2,iload_3) -(iload,aload,fload) +(aload,fload) { ldrb r3, [jpc, #2] rsb tmp1, r0, #opc_iload_0 @@ -2501,11 +2720,19 @@ DISPATCH_NEXT DISPATCH_NEXT DISPATCH_NEXT - PUSH2 r3, tmp1 - DISPATCH_FINISH -} - -# r2 = [jpc, #1] + 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) { @@ -2514,16 +2741,24 @@ DISPATCH_NEXT rsb tmp1, r2, #0 ldr tmp2, [locals, tmp2, lsl #2] - DISPATCH_NEXT + cmp r0, #opc_igetfield + DISPATCH_NEXT + beq 1f +2: ldr tmp1, [locals, tmp1, lsl #2] DISPATCH_NEXT DISPATCH_NEXT - PUSH2 tmp2, tmp1 - DISPATCH_FINISH -} - -# r2 = [jpc, #1] -(iload,aload,fload) + 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) { DISPATCH_START \seq_len @@ -2535,12 +2770,21 @@ ldr tmp1, [locals, tmp1, lsl #2] DISPATCH_NEXT DISPATCH_NEXT - PUSH2 tmp2, tmp1 - DISPATCH_FINISH -} - -# r2 = [jpc, #1] -(iload,aload,fload)(iload,aload,fload) { + PUSH tmp2, tmp1 + 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] +(aload,fload)(iload,aload,fload) { ldrb tmp2, [jpc, #3] rsb tmp1, r2, #0 DISPATCH_START \seq_len @@ -2550,11 +2794,31 @@ ldr tmp2, [locals, tmp2, lsl #2] DISPATCH_NEXT DISPATCH_NEXT - PUSH2 tmp2, tmp1 - DISPATCH_FINISH -} - -# --- ECN: load; store -------------------------------------------------------- + PUSH tmp2, tmp1 + DISPATCH_FINISH +} + +(iload)(iload) { + mov r0, #opc_iload_iload + strb r0, [jpc] + b do_fast_iload_iload +} + +(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] + DISPATCH_NEXT + ldr tmp2, [locals, tmp2, lsl #2] + DISPATCH_NEXT + DISPATCH_NEXT + PUSH tmp2, tmp1 + DISPATCH_FINISH +} + +@ --- ECN: load; store -------------------------------------------------------- (aload_0,aload_1,aload_2,aload_3) (astore_0,astore_1,astore_2,astore_3) @@ -2618,7 +2882,7 @@ DISPATCH_FINISH } -# r2 = [jpc, #1] +@ r2 = [jpc, #1] (iload,aload,fload) (astore_0,astore_1,astore_2,astore_3) { @@ -2634,7 +2898,7 @@ DISPATCH_FINISH } -# r2 = [jpc, #1] +@ r2 = [jpc, #1] (iload,aload,fload) (istore_0,istore_1,istore_2,istore_3) { @@ -2650,7 +2914,7 @@ DISPATCH_FINISH } -# r2 = [jpc, #1] +@ r2 = [jpc, #1] (iload,aload,fload)(astore,istore,fstore) { ldrb tmp1, [jpc, #3] rsb tmp2, r2, #0 @@ -2665,7 +2929,7 @@ DISPATCH_FINISH } -# --- ECN: load; const ------------------------------------------------------- +@ --- 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) @@ -2691,7 +2955,7 @@ b do_iload_0_iconst_N } -# r2 = [jpc, #1] +@ r2 = [jpc, #1] (iload,aload,fload) (iconst_m1,iconst_0,iconst_1,iconst_2,iconst_3,iconst_4,iconst_5) { @@ -2704,7 +2968,7 @@ beq 1f DISPATCH_NEXT DISPATCH_NEXT - PUSH2 r3, tmp2 + PUSH r3, tmp2 DISPATCH_FINISH 1: mov tmp1, #opc_iload_iconst_N @@ -2720,7 +2984,7 @@ DISPATCH_START \seq_len ldr r3, [locals, r3, lsl #2] DISPATCH_NEXT - PUSH2 r2, r3 + PUSH r2, r3 DISPATCH_FINISH } @@ -2732,7 +2996,7 @@ DISPATCH_START \seq_len ldr r3, [locals, r3, lsl #2] DISPATCH_NEXT - PUSH2 r2, r3 + PUSH r2, r3 DISPATCH_FINISH } @@ -2747,7 +3011,7 @@ DISPATCH_NEXT orr r2, lr, r2, asl #8 DISPATCH_NEXT - PUSH2 r2, r3 + PUSH r2, r3 DISPATCH_FINISH } @@ -2762,21 +3026,21 @@ DISPATCH_NEXT orr r2, lr, r2, asl #8 DISPATCH_NEXT - PUSH2 r2, r3 - DISPATCH_FINISH -} - -# r2 = [jpc, #1] + 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 - PUSH2 r3, lr - DISPATCH_FINISH -} - -# r2 = [jpc, #1] + PUSH r3, lr + DISPATCH_FINISH +} + +@ r2 = [jpc, #1] (iload,aload,fload)(sipush) { ldrsb r3, [jpc, #3] ldrb lr, [jpc, #4] @@ -2784,11 +3048,11 @@ ldr tmp1, [locals, -r2, lsl #2] orr r3, lr, r3, asl #8 DISPATCH_NEXT - PUSH2 r3, tmp1 - DISPATCH_FINISH -} - -# --- ECN: load; Xaload ------------------------------------------------------- + PUSH r3, tmp1 + DISPATCH_FINISH +} + +@ --- ECN: load; Xaload ------------------------------------------------------- (iload_0,iload_1,iload_2,iload_3) (iaload,aaload,faload) @@ -2797,10 +3061,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 .abortentry19: ldr lr, [r3, #8] @ lr = length DISPATCH_NEXT @@ -2813,15 +3075,13 @@ DISPATCH_FINISH } -# r2 = [jpc, #1] +@ r2 = [jpc, #1] (iload,aload,fload)(iaload,aaload,faload) { 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 .abortentry20: ldr lr, [r3, #8] @ lr = length DISPATCH_NEXT @@ -2841,10 +3101,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 .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 - DISPATCH_NEXT - ldr tmp2, [tmp2, #8] + SW_NPC cmp tmp1, #0 + SW_NPC beq null_ptr_exception_jpc_3 + DISPATCH_NEXT + 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 - DISPATCH_START \seq_len -#ifndef HW_NULL_PTR_CHECK - cmp lr, #0 - beq null_ptr_exception_jpc_2 -#endif + POP r3, lr @ r3 = index, lr = arrayref + DISPATCH_START \seq_len + 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 - DISPATCH_START \seq_len -#ifndef HW_NULL_PTR_CHECK - cmp lr, #0 - beq null_ptr_exception_jpc_3 -#endif + POP r3, lr @ r3 = index, lr = arrayref + DISPATCH_START \seq_len + 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 - DISPATCH_START \seq_len -#ifndef HW_NULL_PTR_CHECK - cmp lr, #0 - beq null_ptr_exception_jpc_3 -#endif + POP r3, lr @ r3 = index, lr = arrayref + DISPATCH_START \seq_len + 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 - DISPATCH_START \seq_len -#ifndef HW_NULL_PTR_CHECK - cmp lr, #0 - beq null_ptr_exception_jpc_2 -#endif + POP r3, lr @ r3 = index, lr = arrayref + DISPATCH_START \seq_len + 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 - DISPATCH_START \seq_len -#ifndef HW_NULL_PTR_CHECK - cmp r3, #0 - beq null_ptr_exception_jpc_2 -#endif + POP r2, r3 @ r2 = index, r3 = arrayref + DISPATCH_START \seq_len + 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 - DISPATCH_START \seq_len -#ifndef HW_NULL_PTR_CHECK - cmp r3, #0 - beq null_ptr_exception_jpc_2 -#endif + POP r2, r3 @ r2 = index, r3 = arrayref + DISPATCH_START \seq_len + 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 - DISPATCH_START \seq_len -#ifndef HW_NULL_PTR_CHECK - cmp r3, #0 - beq null_ptr_exception_jpc_2 -#endif + POP r2, r3 @ r2 = index, r3 = arrayref + DISPATCH_START \seq_len + 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 - DISPATCH_NEXT - ldr tmp2, [tmp2, #8] + SW_NPC cmp tmp1, #0 + SW_NPC beq null_ptr_exception_jpc_5 + DISPATCH_NEXT + 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 - DISPATCH_NEXT - ldr tmp2, [tmp2, #8] + SW_NPC cmp tmp1, #0 + SW_NPC beq null_ptr_exception_jpc_4 + DISPATCH_NEXT + 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 - DISPATCH_NEXT - ldr tmp2, [tmp2, #8] + SW_NPC cmp tmp1, #0 + SW_NPC beq null_ptr_exception_jpc_4 + DISPATCH_NEXT + 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,7 +7729,413 @@ DISPATCH_FINISH } -# Former quads +(iload_iconst_N) +(idiv) +{ + ldrb lr, [jpc, #2] + rsb tmp1, r2, #0 + DISPATCH_START \seq_len + ldr tmp1, [locals, tmp1, lsl #2] + subs lr, lr, #opc_iconst_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 +} + +(iload_iload) +(iadd) +{ + ldrb r3, [jpc, #3] + rsb r2, r2, #0 + DISPATCH_START \seq_len + rsb r3, r3, #0 + ldr r2, [locals, r2, lsl #2] + ldr r3, [locals, r3, lsl #2] + DISPATCH_NEXT + DISPATCH_NEXT + add r3, r2, r3 + DISPATCH_NEXT + DISPATCH_NEXT + PUSH r3 + DISPATCH_FINISH +} + +(iload_iload_N) +(iadd) +{ + 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 + add r3, r2, r3 + DISPATCH_NEXT + DISPATCH_NEXT + PUSH r3 + DISPATCH_FINISH +} + +(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload) +(iadd) +{ + 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 + add 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) +(iadd) +{ + 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 + add r3, r2, r3 + DISPATCH_NEXT + DISPATCH_NEXT + PUSH r3 + DISPATCH_FINISH +} + +(iload_iload) +(isub) +{ + ldrb r3, [jpc, #3] + rsb r2, r2, #0 + DISPATCH_START \seq_len + rsb r3, r3, #0 + ldr r2, [locals, r2, lsl #2] + ldr r3, [locals, r3, lsl #2] + DISPATCH_NEXT + DISPATCH_NEXT + sub r3, r2, r3 + DISPATCH_NEXT + DISPATCH_NEXT + PUSH r3 + DISPATCH_FINISH +} + +(iload_iload_N) +(isub) +{ + 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 + sub r3, r2, r3 + DISPATCH_NEXT + DISPATCH_NEXT + PUSH r3 + DISPATCH_FINISH +} + +(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload) +(isub) +{ + 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 + sub 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) +(isub) +{ + 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 + sub r3, r2, r3 + DISPATCH_NEXT + DISPATCH_NEXT + PUSH r3 + DISPATCH_FINISH +} + +(iload_iload) +(iand) +{ + ldrb r3, [jpc, #3] + rsb r2, r2, #0 + DISPATCH_START \seq_len + rsb r3, r3, #0 + ldr r2, [locals, r2, lsl #2] + ldr r3, [locals, r3, lsl #2] + DISPATCH_NEXT + DISPATCH_NEXT + and r3, r2, r3 + DISPATCH_NEXT + DISPATCH_NEXT + PUSH r3 + DISPATCH_FINISH +} + +(iload_iload_N) +(iand) +{ + 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 + and r3, r2, r3 + DISPATCH_NEXT + DISPATCH_NEXT + PUSH r3 + DISPATCH_FINISH +} + +(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload) +(iand) +{ + 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 + and 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) +(iand) +{ + 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 + and r3, r2, r3 + DISPATCH_NEXT + DISPATCH_NEXT + PUSH r3 + DISPATCH_FINISH +} + +(iload_iload) +(ior) +{ + ldrb r3, [jpc, #3] + rsb r2, r2, #0 + DISPATCH_START \seq_len + rsb r3, r3, #0 + ldr r2, [locals, r2, lsl #2] + ldr r3, [locals, r3, lsl #2] + DISPATCH_NEXT + DISPATCH_NEXT + orr r3, r2, r3 + DISPATCH_NEXT + DISPATCH_NEXT + PUSH r3 + DISPATCH_FINISH +} + +(iload_iload_N) +(ior) +{ + 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 + orr r3, r2, r3 + DISPATCH_NEXT + DISPATCH_NEXT + PUSH r3 + DISPATCH_FINISH +} + +(iload_0_iload,iload_1_iload,iload_2_iload,iload_3_iload) +(ior) +{ + 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 + orr 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) +(ior) +{ + 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 + orr r3, r2, r3 + DISPATCH_NEXT + DISPATCH_NEXT + PUSH r3 + DISPATCH_FINISH +} + +(iload_iload) +(ixor) +{ + ldrb r3, [jpc, #3] + rsb r2, r2, #0 + 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_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) (iadd_u4store) @@ -7861,3 +8506,1482 @@ 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
--- a/ports/hotspot/src/cpu/zero/vm/bytecodes_zero.cpp Fri Sep 11 17:09:38 2009 +0100 +++ b/ports/hotspot/src/cpu/zero/vm/bytecodes_zero.cpp Sat Sep 12 12:45:13 2009 +0100 @@ -26,19 +26,29 @@ #include "incls/_precompiled.incl" #include "incls/_bytecodes_zero.cpp.incl" -void Bytecodes::pd_initialize() { -#if defined(PRODUCT) && defined(HOTSPOT_ASM) +void Bytecodes::pd_initialize() +{ + // No zero specific initialization +#ifdef HOTSPOT_ASM def(_iaccess_0, "_iaccess_0", "b_jj", NULL, T_INT, 1, true, _aload_0); def(_iaccess_1, "_iaccess_1", "b_jj", NULL, T_INT, 1, true, _aload_1); def(_iaccess_2, "_iaccess_2", "b_jj", NULL, T_INT, 1, true, _aload_2); def(_iaccess_3, "_iaccess_3", "b_jj", NULL, T_INT, 1, true, _aload_3); + def(_invokeresolved, "invokeresolved", "bjj", NULL, T_ILLEGAL, -1, true, _invokevirtual); + def(_invokespecialresolved, "invokespecialresolved", "bjj", NULL, T_ILLEGAL, -1, true, _invokespecial); + def(_invokestaticresolved, "invokestaticresolved", "bjj", NULL, T_ILLEGAL, 0, true, _invokestatic); + + def(_dmac, "dmac", "b_", NULL, T_DOUBLE, -16, false, _dmul); + + def(_iload_iload, "iload_iload", "bi_i",NULL, T_INT, 2, false, _iload); + def(_iload_iload_N, "ilaod_iload_N", "bi_", NULL, T_INT, 2, false, _iload); + def(_iload_0_iconst_N, "iload_0_iconst_N", "b_", NULL, T_INT, 2, false, _iload_0); def(_iload_1_iconst_N, "iload_1_iconst_N", "b_", NULL, T_INT, 2, false, _iload_1); def(_iload_2_iconst_N, "iload_2_iconst_N", "b_", NULL, T_INT, 2, false, _iload_2); def(_iload_3_iconst_N, "iload_3_iconst_N", "b_", NULL, T_INT, 2, false, _iload_3); def(_iload_iconst_N, "iload_iconst_N", "bi_", NULL, T_INT, 2, false, _iload); - def(_invokeresolved, "invokeresolved", "bjj", NULL, T_ILLEGAL, -1, true, _invokevirtual); def(_iadd_istore_N, "iadd_istore_N", "b_", NULL, T_VOID, -2, false, _iadd); def(_isub_istore_N, "isub_istore_N", "b_", NULL, T_VOID, -2, false, _isub); @@ -52,7 +62,15 @@ def(_ior_u4store, "ior_u4store", "b_i", NULL, T_VOID, -2, false, _ior); def(_ixor_u4store, "ixor_u4store", "b_i", NULL, T_VOID, -2, false, _ixor); - def(_invokespecialresolved, "invokespecialresolved", "bjj", NULL, T_ILLEGAL, -1, true, _invokespecial); - def(_invokestaticresolved, "invokestaticresolved", "bjj", NULL, T_ILLEGAL, 0, true, _invokestatic); -#endif // HOTSPOT_ASM + def(_iload_0_iload, "iload_0_iload", "b_i", NULL, T_INT, 2, false, _iload_0); + def(_iload_1_iload, "iload_1_iload", "b_i", NULL, T_INT, 2, false, _iload_1); + def(_iload_2_iload, "iload_2_iload", "b_i", NULL, T_INT, 2, false, _iload_2); + def(_iload_3_iload, "iload_3_iload", "b_i", NULL, T_INT, 2, false, _iload_3); + + def(_iload_0_iload_N, "iload_0_iload_N", "b_", NULL, T_INT, 2, false, _iload_0); + def(_iload_1_iload_N, "iload_1_iload_N", "b_", NULL, T_INT, 2, false, _iload_1); + def(_iload_2_iload_N, "iload_2_iload_N", "b_", NULL, T_INT, 2, false, _iload_2); + def(_iload_3_iload_N, "iload_3_iload_N", "b_", NULL, T_INT, 2, false, _iload_3); + +#endif }
--- a/ports/hotspot/src/cpu/zero/vm/bytecodes_zero.hpp Fri Sep 11 17:09:38 2009 +0100 +++ b/ports/hotspot/src/cpu/zero/vm/bytecodes_zero.hpp Sat Sep 12 12:45:13 2009 +0100 @@ -1,49 +1,39 @@ -/* - * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. - * Copyright 2009 Red Hat, Inc. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - * - */ - -#if defined(PRODUCT) && defined(HOTSPOT_ASM) +#ifdef HOTSPOT_ASM #define _iaccess_0 ((Bytecodes::Code)0xdb) #define _iaccess_1 ((Bytecodes::Code)0xdc) #define _iaccess_2 ((Bytecodes::Code)0xdd) #define _iaccess_3 ((Bytecodes::Code)0xde) + +#define _invokeresolved ((Bytecodes::Code)0xdf) +#define _invokespecialresolved ((Bytecodes::Code)0xe0) +#define _invokestaticresolved ((Bytecodes::Code)0xe1) + +#define _iload_iload ((Bytecodes::Code)0xe3) +#define _iload_iload_N ((Bytecodes::Code)0xe4) + +#define _dmac ((Bytecodes::Code)0xe6) + _iload_0_iconst_N , // 231 _iload_1_iconst_N , // 232 _iload_2_iconst_N , // 233 _iload_3_iconst_N , // 234 _iload_iconst_N , // 235 - _invokeresolved , // 236 - _iadd_istore_N , // 237 - _isub_istore_N , // 238 - _iand_istore_N , // 239 - _ior_istore_N , // 240 - _ixor_istore_N , // 241 - _iadd_u4store , // 242 - _isub_u4store , // 243 - _iand_u4store , // 244 - _ior_u4store , // 245 - _ixor_u4store , // 246 - _invokespecialresolved , // 247 - _invokestaticresolved , // 248 -#endif // HOTSPOT_ASM + _iadd_istore_N , // 236 + _isub_istore_N , // 237 + _iand_istore_N , // 238 + _ior_istore_N , // 239 + _ixor_istore_N , // 240 + _iadd_u4store , // 241 + _isub_u4store , // 242 + _iand_u4store , // 243 + _ior_u4store , // 244 + _ixor_u4store , // 245 + _iload_0_iload , // 246 + _iload_1_iload , // 247 + _iload_2_iload , // 248 + _iload_3_iload , // 249 + _iload_0_iload_N , // 250 + _iload_1_iload_N , // 251 + _iload_2_iload_N , // 252 + _iload_3_iload_N , // 253 +#endif
--- a/ports/hotspot/src/cpu/zero/vm/bytes_zero.hpp Fri Sep 11 17:09:38 2009 +0100 +++ b/ports/hotspot/src/cpu/zero/vm/bytes_zero.hpp Sat Sep 12 12:45:13 2009 +0100 @@ -23,6 +23,12 @@ * */ +typedef union unaligned { + u4 u; + u2 us; + u8 ul; +} __attribute__((packed)) unaligned; + class Bytes: AllStatic { public: // Returns true if the byte ordering used by Java is different @@ -37,221 +43,76 @@ // Efficient reading and writing of unaligned unsigned data in // platform-specific byte ordering. -#ifdef VM_LITTLE_ENDIAN static inline u2 get_native_u2(address p){ - return (intptr_t(p) & 1) == 0 - ? *(u2*)p - : ( u2(p[1]) << 8 ) - | ( u2(p[0]) ); + unaligned *up = (unaligned *)p; + return up->us; } static inline u4 get_native_u4(address p) { - switch (intptr_t(p) & 3) { - case 0: return *(u4*)p; - - case 2: return ( u4( ((u2*)p)[1] ) << 16 ) - | ( u4( ((u2*)p)[0] ) ); - - default: return ( u4(p[3]) << 24 ) - | ( u4(p[2]) << 16 ) - | ( u4(p[1]) << 8 ) - | u4(p[0]); - } + unaligned *up = (unaligned *)p; + return up->u; } static inline u8 get_native_u8(address p) { - switch (intptr_t(p) & 7) { - case 0: return *(u8*)p; - - case 4: return ( u8( ((u4*)p)[1] ) << 32 ) - | ( u8( ((u4*)p)[0] ) ); - - case 2: return ( u8( ((u2*)p)[3] ) << 48 ) - | ( u8( ((u2*)p)[2] ) << 32 ) - | ( u8( ((u2*)p)[1] ) << 16 ) - | ( u8( ((u2*)p)[0] ) ); - - default: return ( u8(p[7]) << 56 ) - | ( u8(p[6]) << 48 ) - | ( u8(p[5]) << 40 ) - | ( u8(p[4]) << 32 ) - | ( u8(p[3]) << 24 ) - | ( u8(p[2]) << 16 ) - | ( u8(p[1]) << 8 ) - | u8(p[0]); - } + unaligned *up = (unaligned *)p; + return up->ul; } static inline void put_native_u2(address p, u2 x) { - if ((intptr_t(p) & 1) == 0) *(u2*) p = x; - else { - p[1] = x >> 8; - p[0] = x; - } + unaligned *up = (unaligned *)p; + up->us = x; } static inline void put_native_u4(address p, u4 x) { - switch ( intptr_t(p) & 3 ) { - case 0: *(u4*)p = x; - break; - - case 2: ((u2*)p)[1] = x >> 16; - ((u2*)p)[0] = x; - break; - - default: ((u1*)p)[3] = x >> 24; - ((u1*)p)[2] = x >> 16; - ((u1*)p)[1] = x >> 8; - ((u1*)p)[0] = x; - break; - } + unaligned *up = (unaligned *)p; + up->u = x; } static inline void put_native_u8(address p, u8 x) { - switch ( intptr_t(p) & 7 ) { - case 0: *(u8*)p = x; - break; - - case 4: ((u4*)p)[1] = x >> 32; - ((u4*)p)[0] = x; - break; - - case 2: ((u2*)p)[3] = x >> 48; - ((u2*)p)[2] = x >> 32; - ((u2*)p)[1] = x >> 16; - ((u2*)p)[0] = x; - break; - - default: ((u1*)p)[7] = x >> 56; - ((u1*)p)[6] = x >> 48; - ((u1*)p)[5] = x >> 40; - ((u1*)p)[4] = x >> 32; - ((u1*)p)[3] = x >> 24; - ((u1*)p)[2] = x >> 16; - ((u1*)p)[1] = x >> 8; - ((u1*)p)[0] = x; - } - } -#else - static inline u2 get_native_u2(address p){ - return (intptr_t(p) & 1) == 0 - ? *(u2*)p - : ( u2(p[0]) << 8 ) - | ( u2(p[1]) ); - } - - static inline u4 get_native_u4(address p) { - switch (intptr_t(p) & 3) { - case 0: return *(u4*)p; - - case 2: return ( u4( ((u2*)p)[0] ) << 16 ) - | ( u4( ((u2*)p)[1] ) ); - - default: return ( u4(p[0]) << 24 ) - | ( u4(p[1]) << 16 ) - | ( u4(p[2]) << 8 ) - | u4(p[3]); - } + unaligned *up = (unaligned *)p; + up->ul = x; } - static inline u8 get_native_u8(address p) { - switch (intptr_t(p) & 7) { - case 0: return *(u8*)p; - - case 4: return ( u8( ((u4*)p)[0] ) << 32 ) - | ( u8( ((u4*)p)[1] ) ); - - case 2: return ( u8( ((u2*)p)[0] ) << 48 ) - | ( u8( ((u2*)p)[1] ) << 32 ) - | ( u8( ((u2*)p)[2] ) << 16 ) - | ( u8( ((u2*)p)[3] ) ); - - default: return ( u8(p[0]) << 56 ) - | ( u8(p[1]) << 48 ) - | ( u8(p[2]) << 40 ) - | ( u8(p[3]) << 32 ) - | ( u8(p[4]) << 24 ) - | ( u8(p[5]) << 16 ) - | ( u8(p[6]) << 8 ) - | u8(p[7]); - } - } - - static inline void put_native_u2(address p, u2 x) { - if ( (intptr_t(p) & 1) == 0 ) *(u2*)p = x; - else { - p[0] = x >> 8; - p[1] = x; - } - } - - static inline void put_native_u4(address p, u4 x) { - switch ( intptr_t(p) & 3 ) { - case 0: *(u4*)p = x; - break; - - case 2: ((u2*)p)[0] = x >> 16; - ((u2*)p)[1] = x; - break; - - default: ((u1*)p)[0] = x >> 24; - ((u1*)p)[1] = x >> 16; - ((u1*)p)[2] = x >> 8; - ((u1*)p)[3] = x; - break; - } - } - - static inline void put_native_u8(address p, u8 x) { - switch ( intptr_t(p) & 7 ) { - case 0: *(u8*)p = x; - break; - - case 4: ((u4*)p)[0] = x >> 32; - ((u4*)p)[1] = x; - break; - - case 2: ((u2*)p)[0] = x >> 48; - ((u2*)p)[1] = x >> 32; - ((u2*)p)[2] = x >> 16; - ((u2*)p)[3] = x; - break; - - default: ((u1*)p)[0] = x >> 56; - ((u1*)p)[1] = x >> 48; - ((u1*)p)[2] = x >> 40; - ((u1*)p)[3] = x >> 32; - ((u1*)p)[4] = x >> 24; - ((u1*)p)[5] = x >> 16; - ((u1*)p)[6] = x >> 8; - ((u1*)p)[7] = x; - } - } -#endif // VM_LITTLE_ENDIAN - // Efficient reading and writing of unaligned unsigned data in Java // byte ordering (i.e. big-endian ordering). #ifdef VM_LITTLE_ENDIAN // Byte-order reversal is needed static inline u2 get_Java_u2(address p) { - return swap_u2(get_native_u2(p)); + return ( u2(p[0]) << 8 ) | ( u2(p[1]) ); } static inline u4 get_Java_u4(address p) { - return swap_u4(get_native_u4(p)); + return ( u4(p[0]) << 24 ) | ( u4(p[1]) << 16 ) | ( u4(p[2]) << 8 ) | ( u4(p[3]) ); } static inline u8 get_Java_u8(address p) { - return swap_u8(get_native_u8(p)); + u4 hi, lo; + hi = ( u4(p[0]) << 24 ) | ( u4(p[1]) << 16 ) | ( u4(p[2]) << 8 ) | ( u4(p[3]) ); + lo = ( u4(p[4]) << 24 ) | ( u4(p[5]) << 16 ) | ( u4(p[6]) << 8 ) | ( u4(p[7]) ); + return u8(lo) | (u8(hi) << 32); } static inline void put_Java_u2(address p, u2 x) { - put_native_u2(p, swap_u2(x)); + p[0] = x >> 8; + p[1] = x; } static inline void put_Java_u4(address p, u4 x) { - put_native_u4(p, swap_u4(x)); + p[0] = x >> 24; + p[1] = x >> 16; + p[2] = x >> 8; + p[3] = x; } static inline void put_Java_u8(address p, u8 x) { - put_native_u8(p, swap_u8(x)); + u4 hi, lo; + lo = x; + hi = x >> 32; + p[0] = hi >> 24; + p[1] = hi >> 16; + p[2] = hi >> 8; + p[3] = hi; + p[4] = lo >> 24; + p[5] = lo >> 16; + p[6] = lo >> 8; + p[7] = lo; } // Efficient swapping of byte ordering
--- a/ports/hotspot/src/cpu/zero/vm/cppInterpreter_arm.S Fri Sep 11 17:09:38 2009 +0100 +++ b/ports/hotspot/src/cpu/zero/vm/cppInterpreter_arm.S Sat Sep 12 12:45:13 2009 +0100 @@ -1,17 +1,24 @@ -#if defined(PRODUCT) && defined(HOTSPOT_ASM) -//#define HW_NULL_PTR_CHECK -//#define UNALIGNED_ACCESS -//#define B14 +#ifdef HOTSPOT_ASM #define ARMv4 -#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) - -// ECN: DOH!!! gcc 4.4 has changed the name mangling scheme!!! -#if GCC_VERSION >= 40400 -#define oop_store _Z9oop_storeIP7oopDescEvPT_S1_ -#else -#define oop_store _Z9oop_storeIP7oopDescEvPVT_S1_ +#ifndef DISABLE_NOTICE_SAFEPOINTS +#define NOTICE_SAFEPOINTS +#endif +#ifndef DISABLE_HW_NULL_PTR_CHECK +#define HW_NULL_PTR_CHECK +#endif +#ifndef DISABLE_FASTPATH_ENTRY +#define FASTPATH_ENTRY +#endif +#ifndef DISABLE_NATIVE_ENTRY +#define NATIVE_ENTRY +#endif +#ifndef DISABLE_FAST_BYTECODES +#define FAST_BYTECODES +#endif +#ifndef DISABLE_HW_FP +#define HW_FP #endif #define stack r4 @@ -22,7 +29,7 @@ #define constpool r9 #define arm_sp r13 -#define CONST_POOL_OFFSET 16 +#define CP_OFFSET 16 #define tmp_xxx r7 #define tmp_yyy r5 @@ -32,7 +39,9 @@ #define tmp1 r11 #define tmp2 r10 -#define regset r4-r11 +#define tmp_invoke_len lr + +#define regset r3-r11 #define tos_btos 0 #define tos_ctos 1 @@ -43,114 +52,12 @@ #define tos_dtos 6 #define tos_atos 7 -#define JVM_CONSTANT_Utf8 1 -#define JVM_CONSTANT_Unicode 2 -#define JVM_CONSTANT_Integer 3 -#define JVM_CONSTANT_Float 4 -#define JVM_CONSTANT_Long 5 -#define JVM_CONSTANT_Double 6 -#define JVM_CONSTANT_Class 7 -#define JVM_CONSTANT_String 8 -#define JVM_CONSTANT_Fieldref 9 -#define JVM_CONSTANT_Methodref 10 -#define JVM_CONSTANT_InterfaceMethodref 11 -#define JVM_CONSTANT_NameAndType 12 - -#define JVM_CONSTANT_UnresolvedClass 100 -#define JVM_CONSTANT_ClassIndex 101 -#define JVM_CONSTANT_UnresolvedString 102 -#define JVM_CONSTANT_StringIndex 103 -#define JVM_CONSTANT_UnresolvedClassInError 104 - -#define T_BOOLEAN 4 -#define T_CHAR 5 -#define T_FLOAT 6 -#define T_DOUBLE 7 -#define T_BYTE 8 -#define T_SHORT 9 -#define T_INT 10 -#define T_LONG 11 -#define T_OBJECT 12 -#define T_ARRAY 13 -#define T_VOID 14 - -#define _thread_uninitialized 0 -#define _thread_new 2 -#define _thread_new_trans 3 -#define _thread_in_native 4 -#define _thread_in_native_trans 5 -#define _thread_in_vm 6 -#define _thread_in_vm_trans 7 -#define _thread_in_Java 8 -#define _thread_in_Java_trans 9 -#define _thread_blocked 10 -#define _thread_blocked_trans 11 -#define _thread_max_state 12 - - -#define THREAD_VTABLE 0 -#define THREAD_PENDING_EXC 4 -#define THREAD_SUSPEND_FLAGS 24 -#define THREAD_ACTIVE_HANDLES 32 -#define THREAD_LAST_HANDLE_MARK 40 - -#ifdef B14 -#define THREAD_TLAB_TOP 56 -#define THREAD_TLAB_END 64 -#define THREAD_HANDLE_AREA 152 -#define THREAD_STACK_BASE 156 -#define THREAD_STACK_SIZE 160 -#define THREAD_LAST_JAVA_SP 260 -#define THREAD_JNI_ENVIRONMENT 272 -#define THREAD_VM_RESULT 300 -#define THREAD_STATE 320 -#define THREAD_DO_NOT_UNLOCK 345 -#define THREAD_JAVA_STACK_BASE 476 -#define THREAD_JAVA_SP 484 -#define THREAD_TOP_ZERO_FRAME 488 - -#define THREAD_VTABLE_IS_LOCK_OWNED 56 -#else -#define THREAD_TLAB_TOP 56-4 -#define THREAD_TLAB_END 64-4 -#define THREAD_HANDLE_AREA 152-4 -#define THREAD_STACK_BASE 156-4 -#define THREAD_STACK_SIZE 160-4 -#define THREAD_LAST_JAVA_SP 260-4 -#define THREAD_JNI_ENVIRONMENT 272-4 -#define THREAD_VM_RESULT 300-4 -#define THREAD_STATE 320-4 -#define THREAD_DO_NOT_UNLOCK 345-4 -#define THREAD_JAVA_STACK_BASE 476-4 -#define THREAD_JAVA_SP 484-4 -#define THREAD_TOP_ZERO_FRAME 488-4 - -#define THREAD_VTABLE_IS_LOCK_OWNED 52 -#endif - -#define UNIVERSE_VTABLE 0 -#define UNIVERSE_VTABLE_TOP_ADDR 96 -#define UNIVERSE_VTABLE_END_ADDR 100 - -#ifdef B14 -#define VMSYMBOLS_ArithmeticException 77 -#define VMSYMBOLS_ArrayIndexOutOfBounds 78 -#define VMSYMBOLS_ArrayStoreException 79 -#define VMSYMBOLS_ClassCastException 80 -#define VMSYMBOLS_NullPointerException 95 -#define VMSYMBOLS_AbstractMethodError 103 -#define VMSYMBOLS_IncompatibleClassChangeError 110 -#define VMSYMBOLS_InternalError 111 -#else -#define VMSYMBOLS_ArithmeticException 78 -#define VMSYMBOLS_ArrayIndexOutOfBounds 79 -#define VMSYMBOLS_ArrayStoreException 80 -#define VMSYMBOLS_ClassCastException 81 -#define VMSYMBOLS_NullPointerException 96 -#define VMSYMBOLS_AbstractMethodError 104 -#define VMSYMBOLS_IncompatibleClassChangeError 111 -#define VMSYMBOLS_InternalError 112 -#endif +#include "offsets_arm.s" + +#define RESOURCEAREA_AREA 0 +#define RESOURCEAREA_CHUNK 4 +#define RESOURCEAREA_HWM 8 +#define RESOURCEAREA_MAX 12 #define ISTATE_THREAD 0 #define ISTATE_BCP 4 @@ -159,7 +66,7 @@ #define ISTATE_METHOD 16 #define ISTATE_MDX 20 #define ISTATE_STACK 24 -#define ISTATE_SAVED_ISTATE 28 +#define ISTATE_ADVANCE_PC 28 #define ISTATE_MSG 28 #define ISTATE_CALLEE 32 // union frame_manager_message @@ -171,24 +78,145 @@ #define ISTATE_SELF_LINK 64 #define ISTATE_CAFEBABF 68 -#define last_implemented_bytecode 248 +#define ISTATE_NEXT_FRAME 72 + +#define FRAME_SIZE 76 + +#define last_implemented_bytecode 201 .macro ALIGN_CODE - .align 6 + .align 3 .endm .macro ALIGN_DATA - .align 6 + .align 3 .endm .macro ALIGN_OPCODE - .align 6 + .align 3 .endm .macro ALIGN_WORD .align 2 .endm +@------------------------------------------------ +@ Software NULL Pointer check macro. +@ Usage: +@ SW_NPC cmp obj, #0 +@ SW_NPC beq null_ptr_exception +@------------------------------------------------ + .macro SW_NPC p1, p2, p3, p4 +#ifndef HW_NULL_PTR_CHECK + .ifnes "\p4", "" + \p1 \p2, \p3, \p4 + .else + .ifnes "\p3", "" + \p1 \p2, \p3 + .else + \p1 \p2 + .endif + .endif +#endif // HW_NULL_PTR_CHECK + .endm + + .macro HW_NPC p1, p2, p3, p4 +#ifdef HW_NULL_PTR_CHECK + .ifnes "\p4", "" + \p1 \p2, \p3, \p4 + .else + .ifnes "\p3", "" + \p1 \p2, \p3 + .else + \p1 \p2 + .endif + .endif +#endif // HW_NULL_PTR_CHECK + .endm + +@------------------------------------------------ +@ Fast Bytecode Macros FBC and NFBC +@ Use to conditionalise code using fast bytecodes +@ EG: +@ FBC mov r0, #opc_invokeresolved +@ FBC b rewrite_bytecode +@ NFBC code to handle slow case +@ NFBC ... +@------------------------------------------------ + .macro FBC p1, p2, p3, p4, p5 +#ifdef FAST_BYTECODES + .ifnes "\p5", "" + \p1 \p2, \p3, \p4, \p5 + .else + .ifnes "\p4", "" + \p1 \p2, \p3, \p4 + .else + .ifnes "\p3", "" + \p1 \p2, \p3 + .else + \p1 \p2 + .endif + .endif + .endif +#endif + .endm + + .macro NFBC p1, p2, p3, p4 +#ifndef FAST_BYTECODES + .ifnes "\p4", "" + \p1 \p2, \p3, \p4 + .else + .ifnes "\p3", "" + \p1 \p2, \p3 + .else + \p1 \p2 + .endif + .endif +#endif + .endm + +@------------------------------------------------ +@ Notice Safepoints macro +@ Usage: +@ NSP <notice safepoint specific code> +@------------------------------------------------ + .macro NSP p1, p2, p3, p4, p5 +#ifdef NOTICE_SAFEPOINTS + .ifnes "\p5", "" + \p1 \p2, \p3, \p4, \p5 + .else + .ifnes "\p4", "" + \p1 \p2, \p3, \p4 + .else + .ifnes "\p3", "" + \p1 \p2, \p3 + .else + \p1 \p2 + .endif + .endif + .endif +#endif + .endm + +@------------------------------------------------ +@ Use Compiler macro +@ Usage: +@ USEC <compiler specific code> +@------------------------------------------------ + .macro USEC p1, p2, p3, p4 +#ifdef USE_COMPILER + .ifnes "\p4", "" + \p1 \p2, \p3, \p4 + .else + .ifnes "\p3", "" + \p1 \p2, \p3 + .else + \p1 \p2 + .endif + .endif +#endif + .endm + .macro Opcode label ALIGN_OPCODE do_\label: @@ -202,40 +230,308 @@ str \reg, [stack, #(\offset+1) * 4] .endm - .macro PUSH4 reg1, reg2, reg3, reg4 + .macro PUSH reg1, reg2, reg3, reg4 + .ifnes "\reg4", "" stmda stack!, {\reg1, \reg2, \reg3, \reg4} + .else + .ifnes "\reg3", "" + stmda stack!, {\reg1, \reg2, \reg3} + .else + .ifnes "\reg2", "" + stmda stack!, {\reg1, \reg2} + .else + str \reg1, [stack], #-4 + .endif + .endif + .endif .endm - .macro POP4 reg1, reg2, reg3, reg4 + .macro POP reg1, reg2, reg3, reg4 + .ifnes "\reg4", "" ldmib stack!, {\reg1, \reg2, \reg3, \reg4} + .else + .ifnes "\reg3", "" + ldmib stack!, {\reg1, \reg2, \reg3} + .else + .ifnes "\reg2", "" + ldmib stack!, {\reg1, \reg2} + .else + ldr \reg1, [stack, #4]! + .endif + .endif + .endif + .endm + + .macro CACHE_JPC + ldr jpc, [istate, #ISTATE_BCP] + .endm + + .macro CACHE_LOCALS + ldr locals, [istate, #ISTATE_LOCALS] + .endm + + .macro CACHE_STACK + ldr stack, [istate, #ISTATE_STACK] + .endm + + .macro CACHE_CP + ldr constpool, [istate, #ISTATE_CONSTANTS] + .endm + + .macro DECACHE_STACK + str stack, [istate, #ISTATE_STACK] + .endm + + .macro DECACHE_JPC + str jpc, [istate, #ISTATE_BCP] .endm - .macro PUSH3 reg1, reg2, reg3 - stmda stack!, {\reg1, \reg2, \reg3} +@ ECN: I assert that istate->locals and istate->stack cannot move on a GC. +@ The reasoning is that istate itself is stored on the Java stack +@ and locals and stack are relative to istate. Therefore if locals or +@ stack were to move, istate itself would have to move and we would +@ lose our entire interpreter state. +@ To prove this I have changed the code which recaches locals and stack +@ to assert that locals == istate->locals and stack == istate->stack. +@ This saves a lot of needles recaching of interpreter state. + .macro ASSERT_LOCALS_CACHED +#if 0 + str ip, [arm_sp, #-4]! + mrs ip, cpsr + str ip, [arm_sp, #-4]! + mov ip, locals + ldr locals, [istate, #ISTATE_LOCALS] + cmp ip, locals + strne r0, [r0, -r0] + ldr ip, [arm_sp], #4 + msr cpsr, ip + ldr ip, [arm_sp], #4 +#endif + .endm + + .macro ASSERT_STACK_CACHED +#if 0 + str ip, [arm_sp, #-4]! + mrs ip, cpsr + str ip, [arm_sp, #-4]! + mov ip, stack + ldr stack, [istate, #ISTATE_STACK] + cmp ip, stack + strne r0, [r0, -r0] + ldr ip, [arm_sp], #4 + msr cpsr, ip + ldr ip, [arm_sp], #4 +#endif .endm - .macro POP3 reg1, reg2, reg3 - ldmib stack!, {\reg1, \reg2, \reg3} +@ DISPATCH_LOOP causes the dispatch code to branch every time to a label 'dispatch_loop' +@ This is primarily for debugging so we can stick assertions at the dispatch_loop label +@ which will then be checked after every bytcode. +@ #define DISPATCH_LOOP + +@ CODETRACE tarces bytecodes in a code buffer which can be examined under gdb +@ Note: DISPATCH_LOOP must be enabled for CODETRACE to work +@ #define CODETRACE + +@ DISPATCH_ASSERTS enables various assertions in the dispatch loop, such as checking +@ stack, frame, locals and constpool are all consistent and not corrupted +@#define DISPATCH_ASSERTS + + .macro ABORTNE + strne r0, [r0, -r0] + .endm + + .macro ABORTCS + strcs r0, [r0, -r0] + .endm + + .macro ABORTCC + strcc r0, [r0, -r0] + .endm + + .macro CHECK_CONSTPOOL +#ifdef DISPATCH_ASSERTS + @ First check istate->constpool == method->constpool + ldr r1, [istate, #ISTATE_CONSTANTS] + ldr r2, [istate, #ISTATE_METHOD] + ldr r2, [r2, #METHOD_CONSTANTS] + ldr r2, [r2, #CONSTANTPOOL_CACHE] + cmp r1, r2 + ABORTNE +@ cmp r1, constpool +@ ABORTNE +#endif + .endm + + .macro CHECK_LOCALS +#ifdef DISPATCH_ASSERTS + @ Check cached locals var is the same as that in istate + ldr r1, [istate, #ISTATE_LOCALS] + cmp r1, locals + ABORTNE +#endif .endm - .macro PUSH2 reg1, reg2 - stmda stack!, {\reg1, \reg2} - .endm - - .macro PUSH reg - str \reg, [stack], #-4 + .macro CHECK_FRAME +#ifdef DISPATCH_ASSERTS + @ Check 0xCAFEBABF hasn't been overwritten + ldr r1, [istate, #ISTATE_CAFEBABF] + mvn ip, #0x540 @ form 0xCAFEBABF + bic ip, ip, #0x14000 + bic ip, ip, #0x35000000 + cmp r1, ip + ABORTNE + @ Check we are still the topmost frame + ldr r1, [istate, #ISTATE_THREAD] + ldr r1, [r1, #THREAD_TOP_ZERO_FRAME] + add r2, istate, #ISTATE_NEXT_FRAME + cmp r1, r2 + ABORTNE + @ And check the NEXT_FRAME pointer points to a valid frame (CAFEBABF intact) + ldr r1, [istate, #ISTATE_NEXT_FRAME] + ldr r2, [r1, #-ISTATE_NEXT_FRAME + ISTATE_CAFEBABF] + bic r2, r2, #0xff @ ECN: Allow for differing frames + bic ip, ip, #0xff @ Eg. ENTRY_FRAME/INTERPRETER_FRAME/SHARK_FRAME + cmp r2, ip + ABORTNE +#endif .endm - .macro POP2 reg1, reg2 - ldmib stack!, {\reg1, \reg2} + .macro CHECK_BACKTRACE +#ifdef DISPATCH_ASSERTS + add r3, istate, #ISTATE_NEXT_FRAME + mvn ip, #0x540 @ form 0xCAFEBABF + bic ip, ip, #0x14000 + bic ip, ip, #0x35000000 +@ ECN: Only check a limited no of frames back. topmost frame already checked +@ Check 2nd frame up + ldr r3, [r3] + ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_CAFEBABF] + bic r1, ip, #1 + cmp r1, r2 + beq 2f + cmp ip, r2 + ABORTNE @ Must be ENTRY_FRAME, or INTERPRETER_FRAME + ldr r1, [r3, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS] + ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_METHOD] + ldr r2, [r2, #12] + ldr r2, [r2, #12] + cmp r1, r2 + ABORTNE +@ Check 3rd frame up + ldr r3, [r3] + ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_CAFEBABF] + bic r1, ip, #1 + cmp r1, r2 + beq 2f + cmp ip, r2 + ABORTNE @ Must be ENTRY_FRAME, or INTERPRETER_FRAME + ldr r1, [r3, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS] + ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_METHOD] + ldr r2, [r2, #12] + ldr r2, [r2, #12] + cmp r1, r2 + ABORTNE +@ Check 4th frame up + ldr r3, [r3] + ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_CAFEBABF] + bic r1, ip, #1 + cmp r1, r2 + beq 2f + cmp ip, r2 + ABORTNE @ Must be ENTRY_FRAME, or INTERPRETER_FRAME + ldr r1, [r3, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS] + ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_METHOD] + ldr r2, [r2, #12] + ldr r2, [r2, #12] + cmp r1, r2 + ABORTNE +@ Check 5th frame up + ldr r3, [r3] + ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_CAFEBABF] + bic r1, ip, #1 + cmp r1, r2 + beq 2f + cmp ip, r2 + ABORTNE @ Must be ENTRY_FRAME, or INTERPRETER_FRAME + ldr r1, [r3, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS] + ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_METHOD] + ldr r2, [r2, #12] + ldr r2, [r2, #12] + cmp r1, r2 + ABORTNE +@ Check 7th frame up + ldr r3, [r3] + ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_CAFEBABF] + bic r1, ip, #1 + cmp r1, r2 + beq 2f + cmp ip, r2 + ABORTNE @ Must be ENTRY_FRAME, or INTERPRETER_FRAME + ldr r1, [r3, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS] + ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_METHOD] + ldr r2, [r2, #12] + ldr r2, [r2, #12] + cmp r1, r2 + ABORTNE +@ Check 8th frame up + ldr r3, [r3] + ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_CAFEBABF] + bic r1, ip, #1 + cmp r1, r2 + beq 2f + cmp ip, r2 + ABORTNE @ Must be ENTRY_FRAME, or INTERPRETER_FRAME + ldr r1, [r3, #-ISTATE_NEXT_FRAME + ISTATE_CONSTANTS] + ldr r2, [r3, #-ISTATE_NEXT_FRAME + ISTATE_METHOD] + ldr r2, [r2, #12] + ldr r2, [r2, #12] + cmp r1, r2 + ABORTNE +2: +#endif .endm - .macro POP reg - ldr \reg, [stack, #4]! + .macro CHECK_STACK +#ifdef DISPATCH_ASSERTS + ldr r1, [istate, #ISTATE_STACK_BASE] + cmp stack, r1 + ABORTCS + ldr r1, [istate, #ISTATE_STACK_LIMIT] + @ ECN: The stack can point below the stack limit in the + @ case that we have a full stack. As long as we dont actually + @ try writing to it. + add r2, stack, #4 + cmp r2, r1 + ABORTCC +#endif + .endm + +#define CODETRACE_BUFFER_SIZE (1 * 1024) + .macro TRACE_CODE +#ifdef CODETRACE + ldr r1, [dispatch, #CodeTrace_Idx-XXX] + cmp r1, #CODETRACE_BUFFER_SIZE + moveq r1, #0 + sub r2, dispatch, #XXX-CodeTrace_Buffer_Base + str jpc, [r2, r1] + add r1, r1, #4 + str r1, [dispatch, #CodeTrace_Idx-XXX] +#endif + .endm + + .macro BREAK_DISPATCH + ldr r1, [dispatch, #DispatchBreakPoint-XXX] + cmp r1, jpc + bleq do_dispatch_break .endm .set dispatch_state, 0 + .macro DISPATCH_STATE state + .set dispatch_state, \state + .endm + .macro DISPATCH_START step=0 .set dispatch_state, 1 ldrb r0, [jpc, #\step]! @@ -246,10 +542,23 @@ ldrb r0, [jpc, \reg]! .endm - .macro DISPATCH_STATE state - .set dispatch_state, \state +#ifdef DISPATCH_LOOP + .macro DISPATCH_NEXT + .endm + + .macro DISPATCH_FINISH + b dispatch_loop .endm + .macro DISPATCH_BYTECODE + b dispatch_loop + .endm + + .macro DISPATCH step=0 + ldrb r0, [jpc, #\step]! + b dispatch_loop + .endm +#else .macro DISPATCH_1 ldrb r1, [jpc, #2] .endm @@ -333,6 +642,7 @@ ldr ip, [ip, r1, lsl #2] mov pc, ip .endm +#endif // DISPATCH_LOOP #define FFI_TYPE_VOID 0 #define FFI_TYPE_FLOAT 2 @@ -346,48 +656,38 @@ #define FFI_TYPE_POINTER 14 .macro _BLX reg -#ifdef ARMv4 mov lr, pc mov pc, \reg -#else - blx \reg -#endif .endm -#define blx _BLX .macro _BX reg -#ifdef ARMv4 mov pc, \reg -#else - bx \reg -#endif .endm -#define bx _BX .macro _BXEQ reg -#ifdef ARMv4 moveq pc, \reg -#else - bxeq \reg -#endif .endm -#define bxeq _BXEQ .macro _BXNE reg -#ifdef ARMv4 movne pc, \reg -#else - bxne \reg -#endif .endm -#define bxne _BXNE #ifdef ARMv4 + +#define blx _BLX +#define bx _BX +#define bxeq _BXEQ +#define bxne _BXNE .arch armv4 + #else .arch armv7-a #endif +#ifdef HW_FP + .fpu vfp +#else .fpu softvfp +#endif .eabi_attribute 20, 1 .eabi_attribute 21, 1 .eabi_attribute 23, 3 @@ -399,705 +699,377 @@ .text - ALIGN_CODE -build_normal: - ldr ip, [r1, #24] - tst ip, #32 - bne build_normal_synchronized -build_normal_unsynchronized: - stmfd sp!, {r4, r5, r6, r7, r8} - ldr r4, [r0, #8] - ldrh r8, [r1, #38] - ldrh ip, [r1, #40] - mov r5, #0 - sub r3, r4, #4 - str r3, [r0, #8] - str r5, [r4, #-4] - ldr r7, [r0, #8] +do_dispatch_break: + mov pc, lr + +#ifdef DISPATCH_LOOP +@ r0 = bytecode +@ jpc has been updated +dispatch_loop: + TRACE_CODE +dispatch_check_constpool: + CHECK_CONSTPOOL +dispatch_check_locals: + CHECK_LOCALS +dispatch_check_stack: + CHECK_STACK +dispatch_check_frame: + CHECK_FRAME +dispatch_check_backtrace: + CHECK_BACKTRACE +dispatch_break: + BREAK_DISPATCH + ldrb r1, [jpc, #2] + ldr ip, [dispatch, r0, lsl #2] + ldrb r2, [jpc, #1] + ands lr, ip, #7 + moveq pc, ip + ldrb r1, [jpc, lr] + bic ip, ip, #7 + ldr ip, [ip, r1, lsl #2] + mov pc, ip +#endif + +is_subtype_of: + ldr r2, [r1, #16] + add ip, r0, r2 + ldr ip, [ip, #-8] + cmp ip, r1 + moveq r0, #1 + bxeq lr + cmp r2, #20 + movne r0, #0 + bxne lr + b _ZNK5Klass23search_secondary_supersEP12klassOopDesc + +HandleC: + stmfd sp!, {r4, r5, r6, lr} + ldr r3, HandleC_adcons + subs r5, r1, #0 + mov r4, r0 +.HandleC_pic: + add r3, pc, r3 + streq r5, [r0, #0] + beq 2f + ldr r2, HandleC_adcons+4 + ldr r3, [r3, r2] + ldr r0, [r3, #0] + bl pthread_getspecific + ldr r3, [r0, #THREAD_HANDLE_AREA] + ldr r0, [r3, #8] + ldr r1, [r3, #12] + add r2, r0, #4 + cmp r2, r1 + strls r2, [r3, #8] + bhi 3f +1: + str r5, [r0, #0] + str r0, [r4, #0] +2: + mov r0, r4 + ldmfd sp!, {r4, r5, r6, pc} +3: + mov r0, r3 + mov r1, #4 + bl _ZN5Arena4growEj + b 1b +HandleC_adcons: + .word _GLOBAL_OFFSET_TABLE_-(.HandleC_pic+8) + .word _ZN18ThreadLocalStorage13_thread_indexE(GOT) + +HandleMarkCleanerD: + stmfd sp!, {r4, r5, r6, lr} + ldr r3, [r0, #0] mov r6, r0 - sub r3, r7, #4 - str r3, [r0, #8] - mvn r0, #0x540 @ form 0xCAFEBABF in r0 - bic r0, r0, #0x14000 - bic r0, r0, #0x35000000 - mov ip, ip, asl #2 - sub ip, ip, #4 - str r0, [r7, #-4] - ldr r3, [r6, #8] - add r4, r4, ip - sub r0, r3, #68 - str r0, [r6, #8] - str r4, [r0, #8] - str r5, [r0, #44] - str r1, [r0, #16] - str r0, [r0, #64] - str r2, [r3, #-68] - ldr r3, [r1, #8] - cmp r8, r5 - add r3, r3, #48 - str r3, [r0, #4] - ldr r2, [r1, #12] - mov r3, #0 - ldr r1, [r2, #12] - str r5, [r0, #32] - str r5, [r0, #48] - str r1, [r0, #12] - str r5, [r0, #20] - str r3, [r0, #28] - ldr r3, [r6, #8] - str r3, [r0, #60] - ldr r2, [r6, #8] - str r2, [r0, #52] - ldr r3, [r6, #8] - sub r3, r3, #4 - str r3, [r0, #24] - ldrne r3, [r6, #8] - ldreq r3, [r6, #8] - subne r3, r3, r8, asl #2 - strne r3, [r6, #8] - sub r3, r3, #4 - str r3, [r0, #56] - mov r0, r7 - ldmfd sp!, {r4, r5, r6, r7, r8} - bx lr + ldr r4, [r3, #40] + ldr r0, [r4, #8] + ldr r5, [r4, #4] + ldr r3, [r0, #0] + cmp r3, #0 + beq 1f + bl _ZN5Chunk9next_chopEv + ldr r0, [r4, #8] +1: + str r0, [r5, #4] + mov r0, r6 + ldr r3, [r4, #12] + str r3, [r5, #8] + ldr r3, [r4, #16] + str r3, [r5, #12] + ldmfd sp!, {r4, r5, r6, pc} + +cmpxchg_ptr: + stmfd sp!, {r4, r5, r6, r7, r8, lr} + mov r6, #0xffffffc0 + mov r4, r2 + mov r7, r0 + mov r5, r1 + bic r6, r6, #0xf000 + mov r8, r2 +1: + ldr r3, [r5, #0] + mov r0, r4 + mov r1, r7 + mov r2, r5 + cmp r4, r3 + bne 2f + blx r6 + cmp r0, #0 + bne 1b + mov r0, r8 + ldmfd sp!, {r4, r5, r6, r7, r8, pc} +2: + mov r8, r3 + mov r0, r8 + ldmfd sp!, {r4, r5, r6, r7, r8, pc} + +ThreadInVMfromJavaD: + stmfd sp!, {r4, r5, r6, lr} + ldr r5, ThreadInVMfromJavaD_adcons + ldr r3, ThreadInVMfromJavaD_adcons+4 + mov r2, #_thread_in_vm_trans +.ThreadInVMfromJavaD_pic: + add r5, pc, r5 + ldr r6, [r0, #0] + mov r4, r0 + ldr r3, [r5, r3] + str r2, [r6, #THREAD_STATE] + ldr r3, [r3, #0] + cmp r3, #1 + ble 1f + ldr r3, ThreadInVMfromJavaD_adcons+8 + ldr r3, [r5, r3] + ldrb r3, [r3, #0] @ zero_extendqisi2 + cmp r3, #0 + bne 6f + ldr r3, ThreadInVMfromJavaD_adcons+12 + mov r1, #1 + ldr r2, ThreadInVMfromJavaD_adcons+16 + ldr r3, [r5, r3] + ldr r2, [r5, r2] + ldr r3, [r3, #0] + ldr r2, [r2, #0] + and r3, r3, r6, lsr #3 + str r1, [r2, r3] +1: + ldr r3, ThreadInVMfromJavaD_adcons+20 + ldr r3, [r5, r3] + ldr r3, [r3, #0] + cmp r3, #0 + bne 5f +2: + mov r3, #8 + str r3, [r6, #THREAD_STATE] + ldr r0, [r4, #0] + ldr r3, [r0, #THREAD_SPECIALRUNTIMEEXITCONDITION] + cmp r3, #0 + bne 3f + ldr r3, [r0, #THREAD_SUSPEND_FLAGS] + tst r3, #_thread_external_suspend + beq 4f +3: + mov r1, #1 + bl _ZN10JavaThread37handle_special_runtime_exit_conditionEb + mov r0, r4 + ldmfd sp!, {r4, r5, r6, pc} +4: + ldr r3, [r0, #THREAD_SUSPEND_FLAGS] + tst r3, #_thread_deopt_suspend + bne 3b + mov r0, r4 + ldmfd sp!, {r4, r5, r6, pc} +5: + mov r0, r6 + bl _ZN20SafepointSynchronize5blockEP10JavaThread + b 2b +6: + mov r3, #0xffffffa0 + bic r3, r3, #0xf000 + blx r3 + b 1b +ThreadInVMfromJavaD_adcons: + .word _GLOBAL_OFFSET_TABLE_-(.ThreadInVMfromJavaD_pic+8) + .word _ZN2os16_processor_countE(GOT) + .word UseMembar(GOT) + .word _ZN2os20_serialize_page_maskE(GOT) + .word _ZN2os19_mem_serialize_pageE(GOT) + .word _ZN20SafepointSynchronize6_stateE(GOT) + +#define oop_address_tmp tmp1 +#define oop_value_tmp tmp2 +#define oop_lr locals ALIGN_CODE -build_normal_synchronized: - stmfd sp!, {r4, r5, r6, r7, r8, sl} - ldr r6, [r0, #8] - mov r4, r0 - ldrh sl, [r1, #38] - ldrh r0, [r1, #40] - mov r5, r1 - mov ip, #0 - sub r3, r6, #4 - mvn r1, #0x540 @ form 0xCAFEBABF in r1 - bic r1, r1, #0x14000 - bic r1, r1, #0x35000000 - str r3, [r4, #8] - str ip, [r6, #-4] - ldr r7, [r4, #8] - mov r0, r0, asl #2 - sub r3, r7, #4 - str r3, [r4, #8] - str r1, [r7, #-4] - ldr r3, [r4, #8] - sub r8, r0, #4 - sub r0, r3, #68 - str r0, [r4, #8] - str r5, [r0, #16] - str ip, [r0, #44] - str r0, [r0, #64] - str r2, [r3, #-68] - add r2, r6, r8 - str r2, [r0, #8] - ldr r3, [r5, #8] - add r3, r3, #48 - str r3, [r0, #4] - ldr r2, [r5, #12] - mov r3, #0 - ldr r1, [r2, #12] - str ip, [r0, #32] - str ip, [r0, #48] - str r1, [r0, #12] - str ip, [r0, #20] - str r3, [r0, #28] - ldr r3, [r4, #8] - str r3, [r0, #60] - ldr r2, [r4, #8] - sub ip, r2, #8 - str ip, [r4, #8] - ldr r3, [r5, #24] - tst r3, #8 - ldrne r3, [r5, #12] - ldreq r1, [r6, r8] - ldrne r2, [r3, #16] - ldrne r1, [r2, #60] - cmp sl, #0 - str r1, [ip, #4] - ldr r2, [r4, #8] - str r2, [r0, #52] - ldr r3, [r4, #8] - sub r3, r3, #4 - str r3, [r0, #24] - ldrne r3, [r4, #8] - ldreq r3, [r4, #8] - subne r3, r3, sl, asl #2 - strne r3, [r4, #8] - sub r3, r3, #4 - str r3, [r0, #56] - mov r0, r7 - ldmfd sp!, {r4, r5, r6, r7, r8, sl} - bx lr - - ALIGN_CODE -build_native: - ldr ip, [r1, #24] - tst ip, #32 - bne build_native_synchronized -build_native_unsynchronized: - stmfd sp!, {r4, r5, r6, r7} - ldr r6, [r0, #8] - ldrh r4, [r1, #42] - mov r5, r0 - mov r7, #0 - sub r3, r6, #4 - mvn ip, #0x540 @ form 0xCAFEBABF in ip +oop_store: + mov oop_lr, lr +@ mov oop_address_tmp, r0 +@ mov oop_value_tmp, r1 + ldr r3, [dispatch, #oopDesc_Address-XXX] + ldr r3, [r3, #0] + ldr r2, [r3, #8] + cmp r2, #1 + beq 1f + mov r0, r3 + mov r1, oop_address_tmp + ldr r3, [r3, #0] + mov r2, oop_value_tmp + mov lr, pc + ldr pc, [r3, #48] +1: + ldr r3, [dispatch, #always_do_update_barrier_Address-XXX] + ldrb r3, [r3] + cmp r3, #0 + beq 2f + mov r3, #0xffffffa0 + bic r3, r3, #0xf000 + blx r3 +2: + mov lr, oop_lr + CACHE_LOCALS + ldr r3, [dispatch, #oopDesc_Address-XXX] + str oop_value_tmp, [oop_address_tmp, #0] + ldr r3, [r3, #0] + ldr r2, [r3, #8] + cmp r2, #1 + beq 3f + mov r0, r3 + mov r1, oop_address_tmp + mov r2, oop_value_tmp + ldr r3, [r3, #0] + ldr pc, [r3, #52] +3: + ldr r3, [r3, #76] + mov r2, #0 + strb r2, [r3, oop_address_tmp, lsr #9] + mov pc, lr + +build_frame: + mov r3, r0 + ldr r0, [r1, #METHOD_ACCESSFLAGS] + stmfd arm_sp!, {r4, r5, r6, r7, r8} + ands r7, r0, #JVM_ACC_SYNCHRONIZED + movne r7, #2 + tst r0, #JVM_ACC_NATIVE + mov r4, #0 + movne r5, #0 + ldreqh r6, [r1, #METHOD_MAXLOCALS] + ldrneh r6, [r1, #METHOD_SIZEOFPARAMETERS] + ldreq r0, [r3, #8] + subeq r6, r6, #1 + ldrne r0, [r3, #8] + subne r6, r6, #1 + ldreqh r5, [r1, #METHOD_MAXSTACK] + addeq r6, r0, r6, asl #2 + addne r6, r0, r6, asl #2 + sub ip, r0, #4 + str ip, [r3, #8] + mvn ip, #0x540 @ form 0xCAFEBABF bic ip, ip, #0x14000 bic ip, ip, #0x35000000 - str r3, [r0, #8] - str r7, [r6, #-4] - ldr r0, [r0, #8] - mov r4, r4, asl #2 - sub r3, r0, #4 - str r3, [r5, #8] + str r4, [r0, #-4] + ldr r0, [r3, #8] + sub r8, r0, #4 + str r8, [r3, #8] str ip, [r0, #-4] - ldr r3, [r5, #8] - sub r4, r4, #4 - sub ip, r3, #68 - add r6, r6, r4 - str ip, [r5, #8] - str r2, [r3, #-68] + ldr r8, [r3, #8] + sub ip, r8, #68 + str ip, [r3, #8] + str r2, [r8, #-68] + mov r8, #0 + str r4, [ip, #44] str r6, [ip, #8] str r1, [ip, #16] str ip, [ip, #64] - str r7, [ip, #44] - str r7, [ip, #4] - ldr r2, [r1, #12] - mov r3, #2 - ldr r1, [r2, #12] - str r3, [ip, #28] - str r7, [ip, #32] - str r1, [ip, #12] - str r7, [ip, #48] - str r7, [ip, #20] - ldr r3, [r5, #8] - str r3, [ip, #60] - ldr r2, [r5, #8] + ldr r2, [r1, #METHOD_ACCESSFLAGS] + tst r2, #JVM_ACC_NATIVE + mov r2, #0 + ldreq r4, [r1, #METHOD_CONSTMETHOD] + addeq r4, r4, #CONSTMETHOD_CODEOFFSET + str r4, [ip, #4] + ldr r4, [r1, #METHOD_CONSTANTS] + ldr r4, [r4, #CONSTANTPOOL_CACHE] + str r8, [ip, #28] + str r2, [ip, #32] + str r4, [ip, #12] + str r2, [ip, #48] + str r2, [ip, #20] + ldr r2, [r3, #8] + str r2, [ip, #60] + ldr r2, [r1, #METHOD_ACCESSFLAGS] + tst r2, #JVM_ACC_SYNCHRONIZED + beq .L10 + ldr r2, [r3, #8] + sub r7, r2, r7, asl #2 + str r7, [r3, #8] + ldr r2, [r1, #METHOD_ACCESSFLAGS] + tst r2, #JVM_ACC_STATIC + ldrne r2, [r1, #METHOD_CONSTANTS] + ldreq r2, [r6, #0] + ldrne r2, [r2, #16] + ldrne r2, [r2, #60] + str r2, [r7, #4] +.L10: + ldr r2, [r3, #8] + cmp r5, #0 str r2, [ip, #52] - ldr r3, [r5, #8] - sub r3, r3, #4 - str r3, [ip, #24] - ldr r2, [r5, #8] + ldr r2, [r3, #8] sub r2, r2, #4 - str r2, [ip, #56] - ldmfd sp!, {r4, r5, r6, r7} - bx lr - - ALIGN_CODE -build_native_synchronized: - stmfd sp!, {r4, r5, r6, r7, r8} - ldr r7, [r0, #8] - mov r5, r0 - mov ip, #0 - ldrh r0, [r1, #42] - mov r6, r1 - sub r3, r7, #4 - mvn r1, #0x540 @ form 0xCAFEBABF in r1 - bic r1, r1, #0x14000 - bic r1, r1, #0x35000000 - str r3, [r5, #8] - str ip, [r7, #-4] - ldr r8, [r5, #8] - mov r0, r0, asl #2 - sub r3, r8, #4 - str r3, [r5, #8] - str r1, [r8, #-4] - ldr r3, [r5, #8] - sub r0, r0, #4 - sub r4, r3, #68 - str r4, [r5, #8] - str r6, [r4, #16] - str r4, [r4, #64] - str ip, [r4, #44] - str ip, [r4, #4] - str r2, [r3, #-68] - add r3, r7, r0 - str r3, [r4, #8] - ldr r2, [r6, #12] - mov r3, #2 - ldr r1, [r2, #12] - str r3, [r4, #28] - str ip, [r4, #32] - str r1, [r4, #12] - str ip, [r4, #48] - str ip, [r4, #20] - ldr r3, [r5, #8] - str r3, [r4, #60] - ldr r2, [r5, #8] - sub r1, r2, #8 - str r1, [r5, #8] - ldr r3, [r6, #24] - tst r3, #8 - ldrne r3, [r6, #12] - ldreq r0, [r7, r0] - ldrne r2, [r3, #16] - ldrne r0, [r2, #60] - str r0, [r1, #4] - ldr r3, [r5, #8] - mov r0, r8 - str r3, [r4, #52] - ldr r2, [r5, #8] - sub r2, r2, #4 - str r2, [r4, #24] - ldr r3, [r5, #8] - sub r3, r3, #4 - str r3, [r4, #56] - ldmfd sp!, {r4, r5, r6, r7, r8} + str r2, [ip, #24] + ldrne r2, [r3, #8] + ldreq r5, [r3, #8] + subne r5, r2, r5, asl #2 + strne r5, [r3, #8] + sub r5, r5, #4 + str r5, [ip, #56] + ldmfd arm_sp!, {r4, r5, r6, r7, r8} bx lr ALIGN_CODE .global asm_generate_method_entry asm_generate_method_entry: - cmp r0, #6 - movcs r0, #0 + mov r3, r0 + mov r0, #0 + + adrl ip, dispatch_init_adcon + ldm ip, {r1, r2} + add r1, r1, ip + add r1, r1, r2 @ r1->dispatch + +#ifndef USE_COMPILER + ldr r2, [r1, #UseCompiler_Address-XXX] + ldrb r2, [r2] + cmp r2, #0 + bne 1f +#endif + + ldr r2, [r1, #can_post_interpreter_events-XXX] + ldrb r2, [r2] + cmp r2, #0 + bne 1f + + ldr r2, [r1, #PrintCommandLineFlags_Address-XXX] + ldrb r2, [r2] + cmp r2, #0 + bne 1f + + cmp r3, #6 adrcc ip, asm_method_table - ldrcc r0, [ip, r0, lsl #2] + ldrcc r0, [ip, r3, lsl #2] +1: bx lr asm_method_table: .word normal_entry .word normal_entry_synchronized +#ifdef NATIVE_ENTRY .word native_entry - .word native_entry_synchronized +#else + .word 0 +#endif + .word 0 @ cppInterpreter can handle native_entry_synchronized .word empty_entry .word accessor_entry ALIGN_CODE - .global native_entry_synchronized -native_entry_synchronized: - stmfd sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - mov r1, r0 - sub sp, sp, #60 - add r0, r2, #THREAD_JAVA_STACK_BASE - mov r7, r2 - bl build_native - ldr r3, [r7, #THREAD_TOP_ZERO_FRAME] - add r1, sp, #52 - str r1, [sp, #0] - ldr sl, .L306native_entry_synchronized -.LPIC19native_entry_synchronized: - add sl, pc, sl - str r3, [r0, #0] - ldr r2, [r7, #THREAD_STACK_SIZE] - ldr r3, [r7, #THREAD_STACK_BASE] - sub r9, r0, #72 - rsb r3, r2, r3 - str r0, [r7, #THREAD_TOP_ZERO_FRAME] - rsb r3, r3, r1 - ldr r2, [r9, #8] - cmp r3, #3072 - str r2, [sp, #4] - blt .L294native_entry_synchronized - ldr ip, [r9, #16] - ldr r3, [ip, #24] - ands r0, r3, #32 - moveq r8, r0 - bne .L295native_entry_synchronized -.L243native_entry_synchronized: - ldr r4, [ip, #84] - cmp r4, #0 - beq .L296native_entry_synchronized -.L248native_entry_synchronized: - ldr r3, .L306native_entry_synchronized+4 - ldr r2, [sl, r3] - cmp r4, r2 - beq .L297native_entry_synchronized -.L249native_entry_synchronized: - ldr r2, [r4, #4] - ldr ip, [ip, #80] - ldr r1, [r7, #THREAD_JAVA_SP] - mov r2, r2, asl #2 - rsb r2, r2, #0 - str ip, [sp, #8] - add r5, r1, r2 - str r5, [r7, #THREAD_JAVA_SP] - add r3, r7, #THREAD_JNI_ENVIRONMENT - str r3, [sp, #52] - ldr r3, [sp, #0] - add lr, r5, #4 - str r3, [r1, r2] - mov r3, #0 - str r3, [sp, #48] - ldr r2, [r9, #16] - ldr r3, [r2, #24] - tst r3, #8 - bne .L298native_entry_synchronized -.L250native_entry_synchronized: - rsb r3, r5, lr - ldr r2, [r4, #4] - mov ip, r3, asr #2 - cmp ip, r2 - bge .L299native_entry_synchronized - ldr fp, .L306native_entry_synchronized+8 - add r3, ip, #6 - add r1, r4, #24 - mov r3, r3, asl #2 - str r1, [sp, #12] - ldr r6, [sl, fp] - add r1, r4, r3 - ldr r0, [sp, #4] - b .L258native_entry_synchronized -.L257native_entry_synchronized: - cmp r3, #8 - subeq r3, r0, #4 - streq r3, [lr], #4 - ldreq r2, [r4, #4] - add ip, ip, #1 - subeq r0, r3, #4 - cmp ip, r2 - add r1, r1, #4 - bge .L252native_entry_synchronized -.L258native_entry_synchronized: - ldr r3, [r1, #0] - cmp r3, r6 - beq .L300native_entry_synchronized - ldr r3, [r3, #0] - cmp r3, #4 - bne .L257native_entry_synchronized -.L293native_entry_synchronized: - str r0, [lr], #4 -.L291native_entry_synchronized: - ldr r2, [r4, #4] - add ip, ip, #1 - cmp ip, r2 - sub r0, r0, #4 - add r1, r1, #4 - blt .L258native_entry_synchronized -.L252native_entry_synchronized: - ldr r0, [r7, #THREAD_TOP_ZERO_FRAME] - ldr r1, [sp, #8] - mov r3, r5 - str r0, [r7, #THREAD_LAST_JAVA_SP] - mov r2, #_thread_in_native - mov r0, r4 - str r2, [r7, #THREAD_STATE] - add r2, sp, #40 - bl ffi_call - ldr r2, .L306native_entry_synchronized+12 - mov r3, #_thread_in_native_trans - str r3, [r7, #THREAD_STATE] - ldr r3, [sl, r2] - ldr r1, [r3, #0] - cmp r1, #1 - ble .L259native_entry_synchronized - ldr r3, .L306native_entry_synchronized+16 - ldr r2, [sl, r3] - ldrb r1, [r2, #0] @ zero_extendqisi2 - cmp r1, #0 - bne .L301native_entry_synchronized - ldr r3, .L306native_entry_synchronized+20 - ldr r2, .L306native_entry_synchronized+24 - ldr r0, [sl, r3] - ldr r1, [sl, r2] - mov r2, #1 - ldr r3, [r0, #0] - ldr ip, [r1, #0] - and r3, r3, r7, lsr #3 - str r2, [ip, r3] -.L259native_entry_synchronized: - ldr r3, .L306native_entry_synchronized+28 - ldr r2, [sl, r3] - ldr r1, [r2, #0] - cmp r1, #0 - beq .L302native_entry_synchronized -.L261native_entry_synchronized: - mov r0, r7 - bl _ZN10JavaThread40check_special_condition_for_native_transEPS_ - .p2align 3 -.L262native_entry_synchronized: - mov r3, #_thread_in_Java - mov r2, #0 - str r3, [r7, #THREAD_STATE] - str r2, [r7, #THREAD_LAST_JAVA_SP] - ldr r0, [sp, #12] - ldr r1, [r4, #4] - ldr r2, [sl, fp] - ldr r3, [r0, r1, asl #2] - cmp r3, r2 - beq .L303native_entry_synchronized -.L263native_entry_synchronized: - ldr r2, [r7, #THREAD_ACTIVE_HANDLES] - cmp r8, #0 - mov r3, #0 - str r3, [r2, #128] - beq .L292native_entry_synchronized - ldr r1, [r7, #THREAD_PENDING_EXC] - cmp r1, #0 - beq .L304native_entry_synchronized -.L241native_entry_synchronized: - ldr r2, [r7, #THREAD_TOP_ZERO_FRAME] - cmp r1, #0 - add r1, r2, #4 - str r1, [r7, #THREAD_JAVA_SP] - ldr r3, [r2, #0] - str r3, [r7, #THREAD_TOP_ZERO_FRAME] - ldr r2, [r9, #16] - ldrh r3, [r2, #42] - mov r3, r3, asl #2 - add r4, r1, r3 - str r4, [r7, #THREAD_JAVA_SP] - beq .L305native_entry_synchronized -.L279native_entry_synchronized: - add sp, sp, #60 - ldmfd sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} -.L300native_entry_synchronized: - ldr r3, [r0, #0] - cmp r3, #0 - beq .L293native_entry_synchronized - ldr r3, [r7, #THREAD_JAVA_SP] - sub r2, r3, #4 - str r2, [r7, #THREAD_JAVA_SP] - str r0, [r3, #-4] - ldr r2, [r7, #THREAD_JAVA_SP] - str r2, [lr], #4 - b .L291native_entry_synchronized -.L302native_entry_synchronized: - ldr r3, [r7, #THREAD_SUSPEND_FLAGS] - cmp r3, #0 - beq .L262native_entry_synchronized - mov r0, r7 - bl _ZN10JavaThread40check_special_condition_for_native_transEPS_ - b .L262native_entry_synchronized -.L298native_entry_synchronized: - ldr r1, [r2, #12] - add r3, sp, #56 - mov r2, r9 - ldr r0, [r1, #16] - add lr, lr, #4 - ldr r1, [r0, #60] - str r1, [r2, #48]! - str r2, [r3, #-8]! - str r3, [r5, #4] - b .L250native_entry_synchronized -.L295native_entry_synchronized: - ldr r8, [r9, #52] - ldr fp, .L306native_entry_synchronized+32 - ldr r5, [r8, #4] - ldr r3, [r5, #0] - orr r4, r3, #1 - str r4, [r8, #0] - .p2align 3 -.L245native_entry_synchronized: - ldr r6, [r5, #0] - mov r0, r4 - cmp r4, r6 - mov r1, r8 - mov r2, r5 - bne .L244native_entry_synchronized - blx fp - cmp r0, #0 - bne .L245native_entry_synchronized -.L244native_entry_synchronized: - cmp r4, r6 - beq .L290native_entry_synchronized - bic r1, r4, #3 - ldr r3, [r7, #0] - mov r0, r7 - ldr ip, [r3, #THREAD_VTABLE_IS_LOCK_OWNED] - blx ip - subs r4, r0, #0 - beq .L247native_entry_synchronized - mov r3, #0 - str r3, [r8, #0] - ldr ip, [r9, #16] - b .L243native_entry_synchronized -.L304native_entry_synchronized: - ldr r6, [r8, #0] - ldr r5, [r8, #4] - cmp r6, #0 - str r1, [r8, #4] - ldrne fp, .L306native_entry_synchronized+32 - beq .L292native_entry_synchronized - .p2align 3 -.L283native_entry_synchronized: - ldr r4, [r5, #0] - mov r0, r8 - cmp r8, r4 - mov r1, r6 - mov r2, r5 - bne .L265native_entry_synchronized - blx fp - cmp r0, #0 - bne .L283native_entry_synchronized -.L265native_entry_synchronized: - cmp r8, r4 - beq .L292native_entry_synchronized - add r4, sp, #16 - mov r0, r4 - mov r1, r7 - str r5, [r8, #4] - bl _ZN10HandleMark10initializeEP6Thread - ldr r3, [r7, #THREAD_TOP_ZERO_FRAME] - mov r0, r7 - mov r1, r8 - str r3, [r7, #THREAD_LAST_JAVA_SP] - bl _ZN18InterpreterRuntime11monitorexitEP10JavaThreadP15BasicObjectLock - mov r3, #0 - mov r0, r4 - str r3, [r7, #THREAD_LAST_JAVA_SP] - bl _ZN10HandleMarkD1Ev -.L292native_entry_synchronized: - ldr r1, [r7, #4] - b .L241native_entry_synchronized -.L294native_entry_synchronized: - str r0, [r7, #THREAD_LAST_JAVA_SP] - mov r0, r7 - bl _ZN18InterpreterRuntime24throw_StackOverflowErrorEP10JavaThread - mov r3, #0 - ldr r1, [r7, #THREAD_PENDING_EXC] - str r3, [r7, #THREAD_LAST_JAVA_SP] - b .L241native_entry_synchronized -.L247native_entry_synchronized: - ldr r3, [r7, #THREAD_TOP_ZERO_FRAME] - mov r1, r8 - mov r0, r7 - str r3, [r7, #THREAD_LAST_JAVA_SP] - bl _ZN18InterpreterRuntime12monitorenterEP10JavaThreadP15BasicObjectLock - ldr r1, [r7, #THREAD_PENDING_EXC] - str r4, [r7, #THREAD_LAST_JAVA_SP] - cmp r1, #0 - bne .L241native_entry_synchronized - .p2align 3 -.L290native_entry_synchronized: - ldr ip, [r9, #16] - b .L243native_entry_synchronized -.L301native_entry_synchronized: - ldr r3, .L306native_entry_synchronized+28 - ldr r2, [sl, r3] - ldr r1, [r2, #0] - cmp r1, #0 - bne .L261native_entry_synchronized - b .L302native_entry_synchronized -.L303native_entry_synchronized: - ldr r3, [sp, #40] - cmp r3, #0 - streq r3, [r9, #48] - ldrne r3, [r3, #0] - strne r3, [r9, #48] - b .L263native_entry_synchronized -.L305native_entry_synchronized: - ldr r0, [r9, #16] - bl _ZNK13methodOopDesc11result_typeEv - ldr r2, .L306native_entry_synchronized+36 - ldr r1, [sl, r2] - ldr r3, [r1, r0, asl #2] - sub r3, r4, r3, asl #2 - str r3, [r7, #THREAD_JAVA_SP] - ldr r0, [r9, #16] - bl _ZNK13methodOopDesc11result_typeEv - sub r0, r0, #4 - cmp r0, #9 - addls pc, pc, r0, asl #2 - b .L279native_entry_synchronized -.L278native_entry_synchronized: - b .L269native_entry_synchronized - b .L270native_entry_synchronized - b .L271native_entry_synchronized - b .L272native_entry_synchronized - b .L273native_entry_synchronized - b .L274native_entry_synchronized - b .L275native_entry_synchronized - b .L276native_entry_synchronized - b .L277native_entry_synchronized - b .L277native_entry_synchronized -.L299native_entry_synchronized: - add r0, r4, #24 - ldr fp, .L306native_entry_synchronized+8 - str r0, [sp, #12] - b .L252native_entry_synchronized -.L277native_entry_synchronized: - ldr r3, [r9, #48] - ldr r0, [sp, #4] - str r3, [r0, #0] - b .L279native_entry_synchronized -.L276native_entry_synchronized: - add r3, sp, #40 - ldmia r3, {r3-r4} - ldr r0, [sp, #4] - stmda r0, {r3-r4} - b .L279native_entry_synchronized -.L275native_entry_synchronized: - ldr r3, [sp, #40] - ldr r2, [sp, #4] - str r3, [r2, #0] - b .L279native_entry_synchronized -.L274native_entry_synchronized: - ldrsh r3, [sp, #40] - ldr r1, [sp, #4] - str r3, [r1, #0] - b .L279native_entry_synchronized -.L273native_entry_synchronized: - ldrsb r3, [sp, #40] - ldr r0, [sp, #4] - str r3, [r0, #0] - b .L279native_entry_synchronized -.L272native_entry_synchronized: - add r3, sp, #40 - ldmia r3, {r3-r4} - ldr r2, [sp, #4] - stmda r2, {r3-r4} - b .L279native_entry_synchronized -.L271native_entry_synchronized: - ldr r3, [sp, #40] @ float - ldr r1, [sp, #4] - str r3, [r1, #0] @ float - b .L279native_entry_synchronized -.L270native_entry_synchronized: - ldrh r3, [sp, #40] - ldr r2, [sp, #4] - str r3, [r2, #0] - b .L279native_entry_synchronized -.L269native_entry_synchronized: - ldr r1, [sp, #4] - ldrb r3, [sp, #40] @ zero_extendqisi2 - subs r3, r3, #0 - movne r3, #1 - str r3, [r1, #0] - b .L279native_entry_synchronized -.L296native_entry_synchronized: - ldr r3, [r7, #THREAD_TOP_ZERO_FRAME] - mov r0, r7 - str r3, [r7, #THREAD_LAST_JAVA_SP] - ldr r1, [r9, #16] - bl _ZN18InterpreterRuntime19prepare_native_callEP10JavaThreadP13methodOopDesc - ldr r1, [r7, #THREAD_PENDING_EXC] - str r4, [r7, #THREAD_LAST_JAVA_SP] - cmp r1, #0 - bne .L241native_entry_synchronized - ldr ip, [r9, #16] - ldr r4, [ip, #84] - b .L248native_entry_synchronized -.L297native_entry_synchronized: - ldr r3, [r7, #THREAD_TOP_ZERO_FRAME] - mov r2, #0 - mov r0, r7 - str r3, [r7, #THREAD_LAST_JAVA_SP] - mov r3, r2 - ldr r1, [r9, #16] - bl _ZN18InterpreterRuntime22slow_signature_handlerEP10JavaThreadP13methodOopDescPiS4_ - ldr r1, [r7, #THREAD_PENDING_EXC] - mov r3, #0 - cmp r1, #0 - str r3, [r7, #THREAD_LAST_JAVA_SP] - mov r4, r0 - bne .L241native_entry_synchronized - ldr ip, [r9, #16] - b .L249native_entry_synchronized -.L307native_entry_synchronized: - ALIGN_DATA -.L306native_entry_synchronized: - .word _GLOBAL_OFFSET_TABLE_-(.LPIC19native_entry_synchronized+8) - .word _ZN18InterpreterRuntime22slow_signature_handlerEP10JavaThreadP13methodOopDescPiS4_(GOT) - .word ffi_type_pointer(GOT) - .word _ZN2os16_processor_countE(GOT) - .word UseMembar(GOT) - .word _ZN2os20_serialize_page_maskE(GOT) - .word _ZN2os19_mem_serialize_pageE(GOT) - .word _ZN20SafepointSynchronize6_stateE(GOT) - .word -61504 - .word type2size(GOT) - - ALIGN_CODE .global empty_entry empty_entry: ldr r3, .L1359 @@ -1133,138 +1105,140 @@ ldr r1, [r0, #15*4] adr ip, abort_table abort_loop: - ldr r2, [ip], #4 + ldr r2, [ip], #8 cmp r2, #0 moveq r0, #0 bxeq lr cmp r2, r1 bne abort_loop - adr r3, abort_table+4 - sub r3, ip, r3 - - adr ip, jpc_correction_table - ldrb r3, [ip, r3, lsr #2] + ldr r3, [ip, #-4] + cmp r3, #8 + bcs 1f ldr ip, [r0, #5*4] sub ip, ip, r3 str ip, [r0, #5*4] adrl r3, null_ptr_exception +1: str r3, [r0, #15*4] do_setcontext: mov r0, #1 bx lr abort_table: - .word .abortentry5 - .word .abortentry6 - .word .abortentry7 - .word .abortentry8 - .word .abortentry9 - .word .abortentry10 - .word .abortentry11 - .word .abortentry12 - .word .abortentry13 - - .word .abortentry19 - .word .abortentry20 - .word .abortentry21 - .word .abortentry22 - .word .abortentry23 - .word .abortentry24 - .word .abortentry25 - .word .abortentry26 - .word .abortentry27 - .word .abortentry28 - .word .abortentry29 - .word .abortentry30 - .word .abortentry31 - .word .abortentry32 - - .word .abortentry38 - .word .abortentry39 - .word .abortentry40 - .word .abortentry41 - .word .abortentry42 - .word .abortentry42_1 - .word .abortentry43 - .word .abortentry44 - .word .abortentry45 - .word .abortentry46 - .word .abortentry47 - .word .abortentry48 - .word .abortentry49 - .word .abortentry50 - .word .abortentry51 - .word .abortentry52 - - .word .abortentry58 - .word .abortentry59 - .word .abortentry60 - - .word .abortentry61 - .word .abortentry62 - .word .abortentry63 - .word .abortentry64 - .word .abortentry65 - .word .abortentry66 - .word .abortentry67 - .word .abortentry68 - .word .abortentry69 - .word .abortentry70 - .word .abortentry71 - .word .abortentry72 - - .word .abortentry73 - .word .abortentry74 - .word .abortentry75 - .word .abortentry76 - .word .abortentry77 - - .word .abortentry78 - .word .abortentry79 - .word .abortentry80 - .word .abortentry81 - .word .abortentry82 - .word .abortentry83 - .word .abortentry84 - .word .abortentry85 - .word .abortentry86 - .word .abortentry87 - - .word .abortentry88 - .word .abortentry89 - .word .abortentry90 - .word .abortentry91 - .word .abortentry92 - .word .abortentry93 - .word .abortentry94 - .word .abortentry95 - .word .abortentry96 - .word .abortentry97 - .word .abortentry98 - .word .abortentry99 - .word .abortentry100 - .word .abortentry101 - .word .abortentry102 - .word .abortentry103 - .word .abortentry104 - .word .abortentry105 - .word .abortentry106 - .word .abortentry107 - .word .abortentry108 - .word .abortentry109 + .word .abortentry5, 1 + .word .abortentry6, 1 + .word .abortentry7, 1 + .word .abortentry8, 1 + .word .abortentry9, 1 + .word .abortentry10, 1 + .word .abortentry11, 1 + .word .abortentry12, 1 + .word .abortentry13, 1 + + FBC .word .abortentry19, 1 + FBC .word .abortentry20, 1 + FBC .word .abortentry21, 1 + FBC .word .abortentry22, 1 + FBC .word .abortentry23, 1 + FBC .word .abortentry24, 1 + FBC .word .abortentry25, 1 + FBC .word .abortentry26, 1 + FBC .word .abortentry27, 1 + FBC .word .abortentry28, 1 + FBC .word .abortentry29, 1 + FBC .word .abortentry30, 1 + FBC .word .abortentry31, 1 + FBC .word .abortentry32, 1 + + FBC .word .abortentry38, 2 + FBC .word .abortentry39, 3 + FBC .word .abortentry40, 4 + FBC .word .abortentry41, 3 + FBC .word .abortentry42, 2 + FBC .word .abortentry42_1, 2 + FBC .word .abortentry43, 0 + FBC .word .abortentry44, 1 + FBC .word .abortentry45, 3 + FBC .word .abortentry46, 2 + FBC .word .abortentry47, 0 + FBC .word .abortentry48, 1 + FBC .word .abortentry49, 0 + FBC .word .abortentry50, 1 + FBC .word .abortentry51, 0 + FBC .word .abortentry52, 1 + + FBC .word .abortentry58, 2 + FBC .word .abortentry59, 2 + FBC .word .abortentry60, 2 + + NSP FBC .word .abortentry61, 0 + NSP FBC .word .abortentry62, 0 + NSP FBC .word .abortentry63, 0 + NSP FBC .word .abortentry64, 0 + NSP FBC .word .abortentry65, 0 + NSP FBC .word .abortentry66, 0 + NSP FBC .word .abortentry67, 0 + NSP FBC .word .abortentry68, 0 + NSP FBC .word .abortentry69, 0 + NSP FBC .word .abortentry70, 0 + NSP FBC .word .abortentry71, 0 + NSP FBC .word .abortentry72, 0 + + FBC .word .abortentry73, 1 + FBC .word .abortentry74, 1 + FBC .word .abortentry75, 1 + FBC .word .abortentry76, 1 + FBC .word .abortentry77, 1 + + FBC .word .abortentry78, 3 + FBC .word .abortentry79, 3 + FBC .word .abortentry80, 3 + FBC .word .abortentry81, 3 + FBC .word .abortentry82, 3 + FBC .word .abortentry83, 3 + FBC .word .abortentry84, 3 + FBC .word .abortentry85, 3 + FBC .word .abortentry86, 3 + FBC .word .abortentry87, 3 + + FBC .word .abortentry88, 3 + FBC .word .abortentry89, 5 + FBC .word .abortentry90, 4 + FBC .word .abortentry91, 4 + NSP FBC .word .abortentry92, 3 + NSP FBC .word .abortentry93, 3 + NSP FBC .word .abortentry94, 3 + NSP FBC .word .abortentry95, 3 + NSP FBC .word .abortentry96, 3 + NSP FBC .word .abortentry97, 3 + NSP FBC .word .abortentry98, 3 + NSP FBC .word .abortentry99, 3 + NSP FBC .word .abortentry100, 3 + NSP FBC .word .abortentry101, 3 + NSP FBC .word .abortentry102, 3 + NSP FBC .word .abortentry103, 3 + FBC .word .abortentry104, 0 + FBC .word .abortentry105, 1 + FBC .word .abortentry106, 1 + FBC .word .abortentry107, 1 + FBC .word .abortentry108, 1 + FBC .word .abortentry109, 1 + .word .abortentry110, 0 + + FBC .word .abortentry111, 3 + FBC .word .abortentry112, 3 + + FBC .word .abortentry113, 0 + .word .abortentry114, 1 + .word .abortentry115, 0 + .word .abortentry116, abstractmethod_exception + FBC .word .abortentry117, 0 + .word .abortentry118, 0 + .word .abortentry119, return_throw_illegal_monitor_state + FBC .word .abortentry120, 0 .word 0 -jpc_correction_table: - .byte 1, 1, 1, 1, 1, 1, 1, 1, 1 - .byte 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 - .byte 2, 3, 4, 3, 2, 2, 0, 1, 3, 2, 0, 1, 0, 1, 0, 1 - .byte 2, 2, 2 - .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - .byte 1, 1, 1, 1, 1 - .byte 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 - .byte 3, 5, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 1, 1, 1, 1, 1 - ALIGN_WORD #else .global asm_check_null_ptr @@ -1274,44 +1248,58 @@ #endif +#ifdef NATIVE_ENTRY ALIGN_CODE fast_native_entry: - ldr r2, [istate, #ISTATE_THREAD] + mov r2, tmp1 mov r11, tmp2 - ldrh r1, [r11, #42] +fast_native_entry_with_args: + ldrh r1, [r11, #METHOD_SIZEOFPARAMETERS] ldr r4, [r2, #THREAD_JAVA_SP] - ldr ip, [r2, #THREAD_TOP_ZERO_FRAME] + ldr r3, [r2, #THREAD_TOP_ZERO_FRAME] mov r0, #0 - mvn r10, #0x540 @ form 0xCAFEBABF in r10 - bic r10, r10, #0x14000 - bic r10, r10, #0x35000000 - sub r9, r4, #76 - mov r7, r9 + mvn ip, #0x540 @ form 0xCAFEBABF in ip + sub r9, r4, #FRAME_SIZE + bic ip, ip, #0x14000 str r9, [r2, #THREAD_JAVA_SP] @ drop stack sub r5, r9, #4 @ stack limit = r9 - 4 - mov r3, r9 - stmdb r4, {r0, r3, r5, r7, r9, r10, ip} - str r0, [r9, #ISTATE_CALLEE] - str r0, [r9, #ISTATE_PREV_LINK] + bic ip, ip, #0x35000000 + str r3, [r9, #ISTATE_NEXT_FRAME] + str ip, [r9, #ISTATE_CAFEBABF] + str r9, [r9, #ISTATE_MONITOR_BASE] + str r5, [r9, #ISTATE_STACK_LIMIT] + str r9, [r9, #ISTATE_STACK_BASE] + str r0, [r9, #ISTATE_OOP_TEMP] + +@ str r0, [r9, #ISTATE_CALLEE] +@ str r0, [r9, #ISTATE_PREV_LINK] str r0, [r9, #ISTATE_MSG] - str r0, [r9, #ISTATE_MDX] +@ str r0, [r9, #ISTATE_MDX] + + ldr r10, [r11, #METHOD_CONSTANTS] sub r7, r4, #4 - add r7, r7, r1, lsl #2 mov r5, #0 - ldr r10, [r11, #12] - ldr r10, [r10, #12] - stmia r9, {r2, r5, r7, r10, r11} + add r7, r7, r1, lsl #2 + + ldr r10, [r10, #CONSTANTPOOL_CACHE] + + str r2, [r9, #ISTATE_THREAD] + str r5, [r9, #ISTATE_BCP] + str r7, [r9, #ISTATE_LOCALS] + str r10, [r9, #ISTATE_CONSTANTS] + str r11, [r9, #ISTATE_METHOD] + +@ stmia r9, {r2, r5, r7, r10, r11} + ldr r1, [r2, #THREAD_STACK_SIZE] + ldr r3, [r2, #THREAD_STACK_BASE] add r0, r9, #72 mov r9, r2 -.LPIC18_fast_native_entry: - ldr r2, [r9, #THREAD_STACK_SIZE] - ldr r3, [r9, #THREAD_STACK_BASE] - rsb r3, r2, r3 - rsb r3, r3, sp + rsb r3, r1, r3 + rsb r3, r3, arm_sp cmp r3, #4096 str r0, [r9, #THREAD_TOP_ZERO_FRAME] + ldr r5, [r11, #METHOD_SIGNATUREHANDLER] blt .fast_native_entry_throw_stack_overflow - ldr r5, [r11, #84] cmp r5, #0 bne .fast_native_entry_got_handleraddr str r0, [r9, #THREAD_LAST_JAVA_SP] @@ -1324,7 +1312,7 @@ ldr r11, [r11, #-72 + ISTATE_METHOD] cmp r1, #0 bne .fast_native_entry_exception - ldr r5, [r11, #84] + ldr r5, [r11, #METHOD_SIGNATUREHANDLER] .fast_native_entry_got_handleraddr: ldr r2, [dispatch, #InterpreterRuntime_slow_signature_handler_Address-XXX] cmp r5, r2 @@ -1347,34 +1335,35 @@ .fast_native_entry_get_handler: sub ip, r7, r4 + add r3, r4, #ISTATE_OOP_TEMP-76 + mov ip, ip, asr #2 - add lr, ip, #4 - bic lr, lr, #1 - - add r3, r4, #ISTATE_OOP_TEMP-76 - mov r4, arm_sp + + add lr, ip, #4 sub arm_sp, arm_sp, #16 + + bic lr, lr, #1 + add r1, r5, #24 + sub arm_sp, arm_sp, lr, lsl #2 - mov lr, arm_sp - - add r1, r5, #24 - add r2, r9, #THREAD_JNI_ENVIRONMENT + + mov lr, arm_sp str r2, [lr], #4 + + ldr r2, [r11, #METHOD_ACCESSFLAGS] add r1, r1, #4 - - ldr r2, [r11, #24] - tst r2, #8 + tst r2, #JVM_ACC_STATIC beq .do_fast_copy_args - ldr r2, [r11, #12] + ldr r2, [r11, #METHOD_CONSTANTS] ldr r2, [r2, #16] + str r3, [lr], #4 ldr r2, [r2, #60] + add r1, r1, #4 str r2, [r3] - str r3, [lr], #4 - add r1, r1, #4 .do_fast_copy_args: cmp ip, #0 @@ -1383,6 +1372,7 @@ .fast_copy_args: ldr r0, [r1], #4 ldrh r3, [r0, #6] + ldr r2, [r7], #-4 cmp r3, #FFI_TYPE_DOUBLE cmpne r3, #FFI_TYPE_SINT64 beq .fast_copy_long @@ -1390,47 +1380,64 @@ cmp r3, #FFI_TYPE_POINTER beq .fast_copy_ptr - ldr r2, [r7], #-4 + subs ip, ip, #1 str r2, [lr], #4 - subs ip, ip, #1 bge .fast_copy_args b .fast_no_args .fast_copy_long: tst lr, #4 + ldr r3, [r7], #-4 addne lr, lr, #4 - ldmda r7!, {r2, r3} - stmia lr!, {r2, r3} + str r2, [lr, #4] subs ip, ip, #2 + str r3, [lr], #8 bge .fast_copy_args b .fast_no_args .fast_copy_ptr: - ldr r2, [r7], #-4 cmp r2, #0 addne r2, r7, #4 + subs ip, ip, #1 str r2, [lr], #4 - subs ip, ip, #1 bge .fast_copy_args .fast_no_args: ldr r0, [r9, #THREAD_TOP_ZERO_FRAME] + mov r2, #_thread_in_native + str r0, [r9, #THREAD_LAST_JAVA_SP] - - mov r2, #_thread_in_native str r2, [r9, #THREAD_STATE] - ldr ip, [r11, #80] - ldrh r11, [r11, #42] + ldr ip, [r11, #METHOD_NATIVEHANDLER] + ldrh r11, [r11, #METHOD_SIZEOFPARAMETERS] + +#ifdef CODETRACE + ldr r1, [dispatch, #CodeTrace_Idx-XXX] + cmp r1, #CODETRACE_BUFFER_SIZE + moveq r1, #0 + sub r2, dispatch, #XXX-CodeTrace_Buffer_Base + mov r3, #0x4e << 24 @ 'NATV' -> r3 + orr r3, r3, #0x4a << 16 + orr r3, r3, #0x54 << 8 + orr r3, r3, #0x56 + str r3, [r2, r1] + add r1, r1, #4 + cmp r1, #CODETRACE_BUFFER_SIZE + moveq r1, #0 + str ip, [r2, r1] + add r1, r1, #4 + str r1, [dispatch, #CodeTrace_Idx-XXX] +#endif + ldmia arm_sp!, {r0, r1, r2, r3} blx ip + mov ip, #_thread_in_native_trans mov arm_sp, r4 - mov r3, #_thread_in_native_trans - str r3, [r9, #THREAD_STATE] - ldr r3, [dispatch, #SafePointSynchronize_state_Address-XXX] + str ip, [r9, #THREAD_STATE] ldr r3, [r3, #0] cmp r3, #0 @@ -1441,6 +1448,7 @@ .fast_native_entry_do_return: mov r3, #_thread_in_Java mov r2, #0 + str r3, [r9, #THREAD_STATE] str r2, [r9, #THREAD_LAST_JAVA_SP] @@ -1448,67 +1456,121 @@ ldr r3, [r5, #4] ldr r5, [r9, #THREAD_TOP_ZERO_FRAME] -@ ldr r11, [r5, #-72 + ISTATE_METHOD] ldr lr, [r5], #4 add r5, r5, r11, lsl #2 ldr ip, [r2, r3, asl #2] + adr r3, .return_type_table + ldrh r2, [ip, #6] - - cmp r2, #FFI_TYPE_POINTER - beq .fast_native_return_obj - - str lr, [r9, #THREAD_TOP_ZERO_FRAME] @ Defer dropping frame until after we have dealt with - @ objects - ldr ip, [r9, #THREAD_ACTIVE_HANDLES] - mov r3, #0 @ ECN: OK, not an obj, save to clear handles - str r3, [ip, #128] - - cmp r2, #FFI_TYPE_VOID - beq .fast_native_return_void - cmp r2, #FFI_TYPE_FLOAT - cmpne r2, #FFI_TYPE_SINT32 - beq .fast_native_return_w - cmp r2, #FFI_TYPE_DOUBLE - cmpne r2, #FFI_TYPE_SINT64 - beq .fast_native_return_dw - - cmp r2, #FFI_TYPE_UINT16 - beq .fast_native_return_char - cmp r2, #FFI_TYPE_SINT16 - beq .fast_native_return_short - cmp r2, #FFI_TYPE_BOOL - beq .fast_native_return_bool - cmp r2, #FFI_TYPE_SINT8 - beq .fast_native_return_byte - - str r0, [r0, -r0] + + mov tmp1, #0 + ldr pc, [r3, r2, lsl #2] + +.return_type_table: + .word .fast_native_return_void @ FFI_TYPE_VOID == 0 + .word 0 + .word .fast_native_return_w @ FFI_TYPE_FLOAT == 2 + .word .fast_native_return_dw @ FFI_TYPE_DOUBLE == 3 + .word 0 + .word .fast_native_return_bool @ FFI_TYPE_BOOL == 5 + .word .fast_native_return_byte @ FFI_TYPE_SINT8 == 6 + .word .fast_native_return_char @ FFI_TYPE_UINT16 == 7 + .word .fast_native_return_short @ FFI_TYPE_SINT16 == 8 + .word 0 + .word .fast_native_return_w @ FFI_TYPE_SINT32 == 10 + .word 0 + .word .fast_native_return_dw @ FFI_TYPE_SINT64 == 12 + .word 0 + .word .fast_native_return_obj @ FFI_TYPE_POINTER == 14 .fast_native_return_dw: - stmdb r5!, {r0, r1} + str r0, [r5, #-8]! + str lr, [r9, #THREAD_TOP_ZERO_FRAME] + str tmp1, [ip, #JNIHANDLEBLOCK_TOP] + str r1, [r5, #4] + cmp istate, #0 str r5, [r9, #THREAD_JAVA_SP] - b .fast_native_exit + bne .fast_native_return + ldmfd arm_sp!, {r3, r4, r5, r6, r7, r8, r9, r10, r11, pc} .fast_native_return_byte: mov r0, r0, lsl #24 + str lr, [r9, #THREAD_TOP_ZERO_FRAME] mov r0, r0, asr #24 + str tmp1, [ip, #JNIHANDLEBLOCK_TOP] str r0, [r5, #-4]! + cmp istate, #0 str r5, [r9, #THREAD_JAVA_SP] - b .fast_native_exit + bne .fast_native_return + ldmfd arm_sp!, {r3, r4, r5, r6, r7, r8, r9, r10, r11, pc} .fast_native_return_char: mov r0, r0, lsl #16 + str lr, [r9, #THREAD_TOP_ZERO_FRAME] mov r0, r0, lsr #16 + str tmp1, [ip, #JNIHANDLEBLOCK_TOP] str r0, [r5, #-4]! + cmp istate, #0 str r5, [r9, #THREAD_JAVA_SP] - b .fast_native_exit + bne .fast_native_return + ldmfd arm_sp!, {r3, r4, r5, r6, r7, r8, r9, r10, r11, pc} .fast_native_return_bool: ands r0, r0, #255 + str lr, [r9, #THREAD_TOP_ZERO_FRAME] movne r0, #1 + str tmp1, [ip, #JNIHANDLEBLOCK_TOP] + str r0, [r5, #-4]! + cmp istate, #0 + str r5, [r9, #THREAD_JAVA_SP] + bne .fast_native_return + ldmfd arm_sp!, {r3, r4, r5, r6, r7, r8, r9, r10, r11, pc} +.fast_native_return_obj: + cmp r0, #0 + ldrne r0, [r0] + str r0, [r5, #-4]! + str lr, [r9, #THREAD_TOP_ZERO_FRAME] + str tmp1, [ip, #JNIHANDLEBLOCK_TOP] + cmp istate, #0 + str r5, [r9, #THREAD_JAVA_SP] + bne .fast_native_return + ldmfd arm_sp!, {r3, r4, r5, r6, r7, r8, r9, r10, r11, pc} +.fast_native_return_short: + mov r0, r0, lsl #16 + mov r0, r0, asr #16 +.fast_native_return_w: str r0, [r5, #-4]! +.fast_native_return_void: + str lr, [r9, #THREAD_TOP_ZERO_FRAME] + str tmp1, [ip, #JNIHANDLEBLOCK_TOP] +.fast_native_exit: + cmp istate, #0 str r5, [r9, #THREAD_JAVA_SP] - b .fast_native_exit + ldmeqfd arm_sp!, {r3, r4, r5, r6, r7, r8, r9, r10, r11, pc} +.fast_native_return: + ldr r2, [istate, #ISTATE_STACK_LIMIT] + sub r5, r5, #4 + str r5, [istate, #ISTATE_STACK] + + ldr r1, [r9, #THREAD_TOP_ZERO_FRAME] + add r2, r2, #4 + str r2, [r9, #THREAD_JAVA_SP] + str r1, [r9, #THREAD_LAST_JAVA_SP] + ldr r0, [istate, #ISTATE_THREAD] + CACHE_STACK + CACHE_JPC + ldr r3, [r0, #THREAD_PENDING_EXC] + DISPATCH_START 3 + DISPATCH_NEXT + CACHE_CP + DISPATCH_NEXT + cmp r3, #0 + DISPATCH_NEXT + bne invokenative_exception + DISPATCH_NEXT + CACHE_LOCALS + DISPATCH_FINISH .fast_native_entry_throw_stack_overflow: str r0, [r9, #THREAD_LAST_JAVA_SP] @@ -1522,502 +1584,1213 @@ ldr r3, [r5], #4 str r3, [r9, #THREAD_TOP_ZERO_FRAME] - ldrh r3, [r11, #42] + ldrh r3, [r11, #METHOD_SIZEOFPARAMETERS] add r5, r5, r3, lsl #2 - str r5, [r9, #THREAD_JAVA_SP] b .fast_native_exit .fast_native_entry_do_special: - stmdb sp!, {r0, r1} + stmdb arm_sp!, {r0, r1} mov r0, r9 bl _ZN10JavaThread40check_special_condition_for_native_transEPS_ - ldmia sp!, {r0, r1} + ldmia arm_sp!, {r0, r1} b .fast_native_entry_do_return - -.fast_native_return_obj: - cmp r0, #0 - ldrne r0, [r0] - str r0, [r5, #-4]! - - str lr, [r9, #THREAD_TOP_ZERO_FRAME] @ Defer dropping frame until after we have dealt with - @ objects - - str r5, [r9, #THREAD_JAVA_SP] - ldr r2, [r9, #THREAD_ACTIVE_HANDLES] - mov r3, #0 @ ECN: Now that the object is safe on the Java stack - str r3, [r2, #128] @ stack, with the Thread SP updated, clear the active_handles. - b .fast_native_exit -.fast_native_return_short: - mov r0, r0, lsl #16 - mov r0, r0, asr #16 -.fast_native_return_w: - str r0, [r5, #-4]! -.fast_native_return_void: - str r5, [r9, #THREAD_JAVA_SP] -.fast_native_exit: - ldr r2, [istate, #ISTATE_STACK_LIMIT] - sub r5, r5, #4 - str r5, [istate, #ISTATE_STACK] - - ldr r1, [r9, #THREAD_TOP_ZERO_FRAME] - add r2, r2, #4 - str r2, [r9, #THREAD_JAVA_SP] - str r1, [r9, #THREAD_LAST_JAVA_SP] - ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] - ldr jpc, [istate, #ISTATE_BCP] - ldr r3, [r0, #THREAD_PENDING_EXC] - DISPATCH_START 3 - ldr constpool, [istate, #ISTATE_CONSTANTS] - ldr locals, [istate, #ISTATE_LOCALS] - DISPATCH_NEXT - add constpool, constpool, #CONST_POOL_OFFSET - DISPATCH_NEXT - cmp r3, #0 - DISPATCH_NEXT - bne invokespecial_exception_fix - DISPATCH_FINISH +#endif // NATIVE_ENTRY #include "bytecodes_arm.s" Opcode idiv - POP2 r0, r1 + POP tmp2, tmp1 + DISPATCH_START 1 int_div: - cmp r0, #0 - beq .divc_0 - - ands a4, a1, #0x80000000 - rsbmi a1, a1, #0 - eors ip, a4, a2, ASR #32 - rsbcs a2, a2, #0 - movs a3, a1 + cmp tmp2, #0x20 + DISPATCH_NEXT + adr r3, .div_table + DISPATCH_NEXT + ldrcc pc, [r3, tmp2, lsl #2] + + ands a4, tmp2, #0x80000000 + rsbmi tmp2, tmp2, #0 + eors lr, a4, tmp1, ASR #32 + rsbcs tmp1, tmp1, #0 + movs a3, tmp2 .s_loop: - cmp a3, a2, LSR #8 + cmp a3, tmp1, LSR #8 movls a3, a3, LSL #8 blo .s_loop - cmp a3, a2, LSR #1 + cmp a3, tmp1, LSR #1 bhi .s_jump7 - cmp a3, a2, LSR #2 + cmp a3, tmp1, LSR #2 bhi .s_jump6 - cmp a3, a2, LSR #3 + cmp a3, tmp1, LSR #3 bhi .s_jump5 - cmp a3, a2, LSR #4 + cmp a3, tmp1, LSR #4 bhi .s_jump4 - cmp a3, a2, LSR #5 + cmp a3, tmp1, LSR #5 bhi .s_jump3 - cmp a3, a2, LSR #6 + cmp a3, tmp1, LSR #6 bhi .s_jump2 - cmp a3, a2, LSR #7 + cmp a3, tmp1, LSR #7 bhi .s_jump1 .s_loop2: @ not executed when falling into .s_loop2 movhi a3, a3, LSR #8 - cmp a2, a3, LSL #7 + cmp tmp1, a3, LSL #7 adc a4, a4, a4 - subcs a2, a2, a3, LSL #7 - cmp a2, a3, LSL #6 + subcs tmp1, tmp1, a3, LSL #7 + cmp tmp1, a3, LSL #6 .s_jump1: adc a4, a4, a4 - subcs a2, a2, a3, LSL #6 - cmp a2, a3, LSL #5 + subcs tmp1, tmp1, a3, LSL #6 + cmp tmp1, a3, LSL #5 .s_jump2: adc a4, a4, a4 - subcs a2, a2, a3, LSL #5 - cmp a2, a3, LSL #4 + subcs tmp1, tmp1, a3, LSL #5 + cmp tmp1, a3, LSL #4 .s_jump3: adc a4, a4, a4 - subcs a2, a2, a3, LSL #4 - cmp a2, a3, LSL #3 + subcs tmp1, tmp1, a3, LSL #4 + cmp tmp1, a3, LSL #3 .s_jump4: adc a4, a4, a4 - subcs a2, a2, a3, LSL #3 - cmp a2, a3, LSL #2 + subcs tmp1, tmp1, a3, LSL #3 + cmp tmp1, a3, LSL #2 .s_jump5: adc a4, a4, a4 - subcs a2, a2, a3, LSL #2 - cmp a2, a3, LSL #1 + subcs tmp1, tmp1, a3, LSL #2 + cmp tmp1, a3, LSL #1 .s_jump6: adc a4, a4, a4 - subcs a2, a2, a3, LSL #1 + subcs tmp1, tmp1, a3, LSL #1 .s_jump7: - cmp a2, a3 + cmp tmp1, a3 adc a4, a4, a4 - subcs a2, a2, a3 - cmp a3, a1 + subcs tmp1, tmp1, a3 + cmp a3, tmp2 bne .s_loop2 - DISPATCH_START 1 - movs ip, ip, lsl #1 - DISPATCH_NEXT + movs lr, lr, lsl #1 rsbcs a4, a4, #0 DISPATCH_NEXT DISPATCH_NEXT PUSH a4 DISPATCH_FINISH +.div_table: + .word div_zero_jpc_1 + .word .divc_1 + .word .divc_2 + .word .divc_3 + .word .divc_4 + .word .divc_5 + .word .divc_6 + .word .divc_7 + .word .divc_8 + .word .divc_9 + .word .divc_10 + .word .divc_11 + .word .divc_12 + .word .divc_13 + .word .divc_14 + .word .divc_15 + .word .divc_16 + .word .divc_17 + .word .divc_18 + .word .divc_19 + .word .divc_20 + .word .divc_21 + .word .divc_22 + .word .divc_23 + .word .divc_24 + .word .divc_25 + .word .divc_26 + .word .divc_27 + .word .divc_28 + .word .divc_29 + .word .divc_30 + .word .divc_31 + +.divc_1: + DISPATCH_STATE 3 + DISPATCH_NEXT + DISPATCH_NEXT + PUSH tmp1 + DISPATCH_FINISH +.divc_2: + DISPATCH_STATE 3 + DISPATCH_NEXT + add tmp1, tmp1, tmp1, lsr #31 + mov tmp2, tmp1, asr #1 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_3: + DISPATCH_STATE 3 + ldr tmp2, .dc_3 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + sub tmp2, a4, tmp1, asr #31 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_4: + DISPATCH_STATE 3 + movs a4, tmp1 + DISPATCH_NEXT + addmi a4, a4, #3 + mov tmp2, a4, asr #2 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_5: + DISPATCH_STATE 3 + ldr tmp2, .dc_5 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #1 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_6: + DISPATCH_STATE 3 + ldr tmp2, .dc_6 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + sub tmp2, a4, tmp1, asr #31 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_7: + DISPATCH_STATE 3 + ldr tmp2, .dc_7 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov tmp2, tmp1, asr #31 + add lr, tmp1, a4 + rsb tmp2, tmp2, lr, asr #2 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_8: + DISPATCH_STATE 3 + movs lr, tmp1 + DISPATCH_NEXT + addmi lr, lr, #7 + mov tmp2, lr, asr #3 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_9: + DISPATCH_STATE 3 + ldr tmp2, .dc_9 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #1 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_10: + DISPATCH_STATE 3 + ldr tmp2, .dc_10 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #2 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_11: + DISPATCH_STATE 3 + ldr tmp2, .dc_11 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #1 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_12: + DISPATCH_STATE 3 + ldr tmp2, .dc_12 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #1 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_13: + DISPATCH_STATE 3 + ldr tmp2, .dc_13 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #2 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_14: + DISPATCH_STATE 3 + ldr tmp2, .dc_14 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov tmp2, tmp1, asr #31 + add lr, tmp1, a4 + rsb tmp2, tmp2, lr, asr #3 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_15: + DISPATCH_STATE 3 + ldr tmp2, .dc_15 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov tmp2, tmp1, asr #31 + add lr, tmp1, a4 + rsb tmp2, tmp2, lr, asr #3 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_16: + DISPATCH_STATE 3 + movs lr, tmp1 + DISPATCH_NEXT + addmi lr, lr, #15 + mov tmp2, lr, asr #4 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_17: + DISPATCH_STATE 3 + ldr tmp2, .dc_17 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #3 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_18: + DISPATCH_STATE 3 + ldr tmp2, .dc_18 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #2 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_19: + DISPATCH_STATE 3 + ldr tmp2, .dc_19 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #3 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_20: + DISPATCH_STATE 3 + ldr tmp2, .dc_20 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #3 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_21: + DISPATCH_STATE 3 + ldr tmp2, .dc_21 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #2 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_22: + DISPATCH_STATE 3 + ldr tmp2, .dc_22 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #2 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_23: + DISPATCH_STATE 3 + ldr tmp2, .dc_23 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov tmp2, tmp1, asr #31 + add lr, tmp1, a4 + rsb tmp2, tmp2, lr, asr #4 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_24: + DISPATCH_STATE 3 + ldr tmp2, .dc_24 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #2 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_25: + DISPATCH_STATE 3 + ldr tmp2, .dc_25 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #3 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_26: + DISPATCH_STATE 3 + ldr tmp2, .dc_26 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #3 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_27: + DISPATCH_STATE 3 + ldr tmp2, .dc_27 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #3 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_28: + DISPATCH_STATE 3 + ldr tmp2, .dc_28 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov tmp2, tmp1, asr #31 + add lr, tmp1, a4 + rsb tmp2, tmp2, lr, asr #4 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_29: + DISPATCH_STATE 3 + ldr tmp2, .dc_29 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov tmp2, tmp1, asr #31 + add lr, tmp1, a4 + rsb tmp2, tmp2, lr, asr #4 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_30: + DISPATCH_STATE 3 + ldr tmp2, .dc_30 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov tmp2, tmp1, asr #31 + add lr, tmp1, a4 + rsb tmp2, tmp2, lr, asr #4 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.divc_31: + DISPATCH_STATE 3 + ldr tmp2, .dc_31 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov tmp2, tmp1, asr #31 + add lr, tmp1, a4 + rsb tmp2, tmp2, lr, asr #4 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.dc_7: +.dc_14: + .word 0x92492493 +.dc_15: +.dc_30: + .word 0x88888889 +.dc_23: + .word 0xb21642c9 +.dc_28: + .word 0x92492493 +.dc_29: + .word 0x8d3dcb09 +.dc_31: + .word 0x84210843 +.dc_6: +.dc_12: +.dc_24: + .word 0x2aaaaaab +.dc_19: + .word 0x6bca1af3 +.dc_5: +.dc_10: +.dc_20: + .word 0x66666667 +.dc_21: + .word 0x30c30c31 +.dc_11: +.dc_22: + .word 0x2e8ba2e9 +.dc_26: +.dc_13: + .word 0x4ec4ec4f +.dc_25: + .word 0x51eb851f +.dc_27: + .word 0x4bda12f7 +.dc_3: + .word 0x55555556 +.dc_17: + .word 0x78787879 +.dc_9: +.dc_18: + .word 0x38e38e39 + + Opcode irem - POP2 r0, r1 + POP tmp2, tmp1 + DISPATCH_START 1 int_rem: - cmp r0, #0 - beq .remc_0 - - ands a4, a1, #0x80000000 - rsbmi a1, a1, #0 - eors ip, a4, a2, ASR #32 - rsbcs a2, a2, #0 - movs a3, a1 + cmp tmp2, #0x20 + DISPATCH_NEXT + adr r3, .rem_table + DISPATCH_NEXT + ldrcc pc, [r3, tmp2, lsl #2] + + ands a4, tmp2, #0x80000000 + rsbmi tmp2, tmp2, #0 + eors lr, a4, tmp1, ASR #32 + rsbcs tmp1, tmp1, #0 + movs a3, tmp2 .r_loop: - cmp a3, a2, LSR #8 + cmp a3, tmp1, LSR #8 movls a3, a3, LSL #8 blo .r_loop - cmp a3, a2, LSR #1 + cmp a3, tmp1, LSR #1 bhi .r_jump7 - cmp a3, a2, LSR #2 + cmp a3, tmp1, LSR #2 bhi .r_jump6 - cmp a3, a2, LSR #3 + cmp a3, tmp1, LSR #3 bhi .r_jump5 - cmp a3, a2, LSR #4 + cmp a3, tmp1, LSR #4 bhi .r_jump4 - cmp a3, a2, LSR #5 + cmp a3, tmp1, LSR #5 bhi .r_jump3 - cmp a3, a2, LSR #6 + cmp a3, tmp1, LSR #6 bhi .r_jump2 - cmp a3, a2, LSR #7 + cmp a3, tmp1, LSR #7 bhi .r_jump1 .r_loop2: @ not executed when falling into .r_loop2 movhi a3, a3, LSR #8 - cmp a2, a3, LSL #7 + cmp tmp1, a3, LSL #7 adc a4, a4, a4 - subcs a2, a2, a3, LSL #7 - cmp a2, a3, LSL #6 + subcs tmp1, tmp1, a3, LSL #7 + cmp tmp1, a3, LSL #6 .r_jump1: adc a4, a4, a4 - subcs a2, a2, a3, LSL #6 - cmp a2, a3, LSL #5 + subcs tmp1, tmp1, a3, LSL #6 + cmp tmp1, a3, LSL #5 .r_jump2: adc a4, a4, a4 - subcs a2, a2, a3, LSL #5 - cmp a2, a3, LSL #4 + subcs tmp1, tmp1, a3, LSL #5 + cmp tmp1, a3, LSL #4 .r_jump3: adc a4, a4, a4 - subcs a2, a2, a3, LSL #4 - cmp a2, a3, LSL #3 + subcs tmp1, tmp1, a3, LSL #4 + cmp tmp1, a3, LSL #3 .r_jump4: adc a4, a4, a4 - subcs a2, a2, a3, LSL #3 - cmp a2, a3, LSL #2 + subcs tmp1, tmp1, a3, LSL #3 + cmp tmp1, a3, LSL #2 .r_jump5: adc a4, a4, a4 - subcs a2, a2, a3, LSL #2 - cmp a2, a3, LSL #1 + subcs tmp1, tmp1, a3, LSL #2 + cmp tmp1, a3, LSL #1 .r_jump6: adc a4, a4, a4 - subcs a2, a2, a3, LSL #1 + subcs tmp1, tmp1, a3, LSL #1 .r_jump7: - cmp a2, a3 + cmp tmp1, a3 adc a4, a4, a4 - subcs a2, a2, a3 - cmp a3, a1 + subcs tmp1, tmp1, a3 + cmp a3, tmp2 bne .r_loop2 - DISPATCH_START 1 - movs ip, ip, lsl #1 - rsbmi a2, a2, #0 - PUSH a2 + movs lr, lr, lsl #1 + DISPATCH_NEXT + DISPATCH_NEXT + rsbmi tmp1, tmp1, #0 + PUSH tmp1 + DISPATCH_FINISH + +.rem_table: + .word div_zero_jpc_1 + .word .remc_1 + .word .remc_2 + .word .remc_3 + .word .remc_4 + .word .remc_5 + .word .remc_6 + .word .remc_7 + .word .remc_8 + .word .remc_9 + .word .remc_10 + .word .remc_11 + .word .remc_12 + .word .remc_13 + .word .remc_14 + .word .remc_15 + .word .remc_16 + .word .remc_17 + .word .remc_18 + .word .remc_19 + .word .remc_20 + .word .remc_21 + .word .remc_22 + .word .remc_23 + .word .remc_24 + .word .remc_25 + .word .remc_26 + .word .remc_27 + .word .remc_28 + .word .remc_29 + .word .remc_30 + .word .remc_31 + +.remc_1: + DISPATCH_STATE 3 + DISPATCH_NEXT + mov tmp2, #0 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_2: + DISPATCH_STATE 3 + add lr, tmp1, tmp1, lsr #31 + mov tmp2, lr, asr #1 + DISPATCH_NEXT + sub tmp2, tmp1, tmp2, lsl #1 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_3: + DISPATCH_STATE 3 + ldr tmp2, .dc_3 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + sub tmp2, a4, tmp1, asr #31 + add lr, tmp2, tmp2, lsl #1 + sub tmp2, tmp1, lr + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_4: + DISPATCH_STATE 3 + movs lr, tmp1 + DISPATCH_NEXT + addmi lr, lr, #3 + mov tmp2, lr, asr #2 + sub tmp2, tmp1, tmp2, lsl #2 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_5: + DISPATCH_STATE 3 + ldr tmp2, .dc_5 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #1 + add lr, tmp2, tmp2, lsl #2 + sub tmp2, tmp1, lr + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_6: + DISPATCH_STATE 3 + ldr tmp2, .dc_6 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + sub tmp2, a4, tmp1, asr #31 + add lr, tmp2, tmp2, lsl #1 + sub tmp2, tmp1, lr, lsl #1 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_7: + DISPATCH_STATE 3 + ldr tmp2, .dc_7 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov tmp2, tmp1, asr #31 + add lr, tmp1, a4 + rsb tmp2, tmp2, lr, asr #2 + rsb lr, tmp2, tmp2, lsl #3 + sub tmp2, tmp1, lr + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_8: + DISPATCH_STATE 3 + movs lr, tmp1 + DISPATCH_NEXT + addmi lr, lr, #7 + mov tmp2, lr, asr #3 + sub tmp2, tmp1, tmp2, lsl #3 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_9: + DISPATCH_STATE 3 + ldr tmp2, .dc_9 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #1 + add lr, tmp2, tmp2, lsl #3 + sub tmp2, tmp1, lr + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_10: + DISPATCH_STATE 3 + ldr tmp2, .dc_10 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #2 + add lr, tmp2, tmp2, lsl #2 + sub tmp2, tmp1, lr, lsl #1 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_11: + DISPATCH_STATE 3 + ldr tmp2, .dc_11 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #1 + add lr, tmp2, tmp2, lsl #2 + add lr, tmp2, lr, lsl #1 + sub tmp2, tmp1, lr + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_12: + DISPATCH_STATE 3 + ldr tmp2, .dc_12 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #1 + add lr, tmp2, tmp2, lsl #1 + sub tmp2, tmp1, lr, lsl #2 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_13: + DISPATCH_STATE 3 + ldr tmp2, .dc_13 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #2 + add lr, tmp2, tmp2, lsl #1 + add lr, tmp2, lr, lsl #2 + sub tmp2, tmp1, lr + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_14: + DISPATCH_STATE 3 + ldr tmp2, .dc_14 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov tmp2, tmp1, asr #31 + add lr, tmp1, a4 + rsb tmp2, tmp2, lr, asr #3 + rsb lr, tmp2, tmp2, lsl #3 + sub tmp2, tmp1, lr, lsl #1 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_15: + DISPATCH_STATE 3 + ldr tmp2, .dc_15 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov tmp2, tmp1, asr #31 + add lr, tmp1, a4 + rsb tmp2, tmp2, lr, asr #3 + rsb lr, tmp2, tmp2, lsl #4 + sub tmp2, tmp1, lr + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_16: + DISPATCH_STATE 3 + movs lr, tmp1 + DISPATCH_NEXT + addmi lr, lr, #15 + mov tmp2, lr, asr #4 + sub tmp2, tmp1, tmp2, lsl #4 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_17: + DISPATCH_STATE 3 + ldr tmp2, .dc_17 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #3 + add lr, tmp2, tmp2, lsl #4 + sub tmp2, tmp1, lr + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_18: + DISPATCH_STATE 3 + ldr tmp2, .dc_18 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #2 + add lr, tmp2, tmp2, lsl #3 + sub tmp2, tmp1, lr, lsl #1 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_19: + DISPATCH_STATE 3 + ldr tmp2, .dc_19 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #3 + add lr, tmp2, tmp2, lsl #3 + add lr, tmp2, lr, lsl #1 + sub tmp2, tmp1, lr + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_20: + DISPATCH_STATE 3 + ldr tmp2, .dc_20 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #3 + add lr, tmp2, tmp2, lsl #2 + sub tmp2, tmp1, lr, lsl #2 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_21: + DISPATCH_STATE 3 + ldr tmp2, .dc_21 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #2 + add lr, tmp2, tmp2, lsl #1 + rsb lr, lr, lr, lsl #3 + sub tmp2, tmp1, lr + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_22: + DISPATCH_STATE 3 + ldr tmp2, .dc_22 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #2 + add lr, tmp2, tmp2, lsl #2 + add lr, tmp2, lr, lsl #1 + sub tmp2, tmp1, lr, lsl #1 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_23: + DISPATCH_STATE 3 + ldr tmp2, .dc_23 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov tmp2, tmp1, asr #31 + add lr, tmp1, a4 + rsb tmp2, tmp2, lr, asr #4 + add lr, tmp2, tmp2, lsl #1 + rsb lr, tmp2, lr, lsl #3 + sub tmp2, tmp1, lr + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_24: + DISPATCH_STATE 3 + ldr tmp2, .dc_24 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #2 + add lr, tmp2, tmp2, lsl #1 + sub tmp2, tmp1, lr, lsl #3 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_25: + DISPATCH_STATE 3 + ldr tmp2, .dc_25 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #3 + add lr, tmp2, tmp2, lsl #2 + add lr, lr, lr, lsl #2 + sub tmp2, tmp1, lr + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_26: + DISPATCH_STATE 3 + ldr tmp2, .dc_26 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #3 + add lr, tmp2, tmp2, lsl #1 + add lr, tmp2, lr, lsl #2 + sub tmp2, tmp1, lr, lsl #1 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_27: + DISPATCH_STATE 3 + ldr tmp2, .dc_27 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov lr, tmp1, asr #31 + rsb tmp2, lr, a4, asr #3 + add lr, tmp2, tmp2, lsl #1 + add lr, lr, lr, lsl #3 + sub tmp2, tmp1, lr + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_28: + DISPATCH_STATE 3 + ldr tmp2, .dc_28 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov tmp2, tmp1, asr #31 + add lr, tmp1, a4 + rsb tmp2, tmp2, lr, asr #4 + rsb lr, tmp2, tmp2, lsl #3 + sub tmp2, tmp1, lr, lsl #2 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_29: + DISPATCH_STATE 3 + ldr tmp2, .dc_29 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov tmp2, tmp1, asr #31 + add lr, tmp1, a4 + rsb tmp2, tmp2, lr, asr #4 + rsb lr, tmp2, tmp2, lsl #3 + add lr, tmp2, lr, lsl #2 + sub tmp2, tmp1, lr + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_30: + DISPATCH_STATE 3 + ldr tmp2, .dc_30 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov tmp2, tmp1, asr #31 + add lr, tmp1, a4 + rsb tmp2, tmp2, lr, asr #4 + rsb lr, tmp2, tmp2, lsl #4 + sub tmp2, tmp1, lr, lsl #1 + DISPATCH_NEXT + PUSH tmp2 + DISPATCH_FINISH +.remc_31: + DISPATCH_STATE 3 + ldr tmp2, .dc_31 + DISPATCH_NEXT + smull lr, a4, tmp1, tmp2 + mov tmp2, tmp1, asr #31 + add lr, tmp1, a4 + rsb tmp2, tmp2, lr, asr #4 + rsb lr, tmp2, tmp2, lsl #5 + sub tmp2, tmp1, lr + DISPATCH_NEXT + PUSH tmp2 DISPATCH_FINISH @ ip = branch offset @ r0 = 1st bytecode @ jpc has been updated - Opcode goto_safe + Opcode goto ldrsb r1, [jpc, #1] - ldrb ip, [jpc, #2] - orr ip, ip, r1, lsl #8 - DISPATCH_START_REG ip + ldrb tmp1, [jpc, #2] + orr tmp1, tmp1, r1, lsl #8 + DISPATCH_START_REG tmp1 branch_taken: - cmp ip, #0 + ldr r2, [dispatch, #SafePointSynchronize_state_Address-XXX] + cmp tmp1, #0 + USEC ldr tmp2, [istate, #ISTATE_METHOD] + ldr r1, [r2] bgt branch_no_check - ldr r3, [dispatch, #SafePointSynchronize_state_Address-XXX] - ldr r1, [r3] +@ ECN: The C code does... +@ if (UseCompiler && UseLoopCounter) { +@ BACKEDGE_COUNT->increment(); +@ ... +@ } +@ However, I just increment the counter because the check is actually +@ more expensive than the increment. I don't believe this matters +@ semantically, since is UseCompiler or UseLoopCounter is false then +@ we shouldn't even be looking at the backedge counter. +@ +@ ECN: Concerns about counter overflowing +@ + USEC ldr r3, [tmp2, #METHOD_BACKEDGECOUNTER] cmp r1, #1 + USEC add r3, r3, #INVOCATIONCOUNTER_COUNTINCREMENT + USEC str r3, [tmp2, #METHOD_BACKEDGECOUNTER] + bne branch_no_check - ldr r3, [istate, #ISTATE_THREAD] - mov r0, sp - str r3, [sp] - bl _ZN17HandleMarkCleanerD1Ev + sub jpc, jpc, tmp1 @ Point jpc back at the branch!!! + + add r0, istate, #ISTATE_THREAD + bl HandleMarkCleanerD ldr r0, [istate, #ISTATE_THREAD] - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] + DECACHE_JPC + DECACHE_STACK bl _ZN20SafepointSynchronize5blockEP10JavaThread + ASSERT_STACK_CACHED + ASSERT_LOCALS_CACHED ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] + CACHE_CP ldr r3, [r0, #THREAD_PENDING_EXC] - ldr jpc, [istate, #ISTATE_BCP] + CACHE_JPC cmp r3, #0 - ldr locals, [istate, #ISTATE_LOCALS] bne handle_exception - DISPATCH_START 0 + + DISPATCH_START_REG tmp1 @ Refetch opcode and update jpc again branch_no_check: - DISPATCH_BYTECODE - - Opcode ifeq_safe - Opcode ifnull_safe +@ ECN: There is no protection against INVOCATIONCOUNTER overflowing!!! + USEC ldr r3, [tmp2, #METHOD_INVOCATIONCOUNTER] + DISPATCH_NEXT + USEC add r3, r3, #INVOCATIONCOUNTER_COUNTINCREMENT + DISPATCH_NEXT + USEC str r3, [tmp2, #METHOD_INVOCATIONCOUNTER] + DISPATCH_FINISH + + Opcode ifeq + Opcode ifnull POP r3 ldrsb r1, [jpc, #1] - ldrb ip, [jpc, #2] + ldrb tmp1, [jpc, #2] cmp r3, #0 - orreq ip, ip, r1, lsl #8 - ldreqb r0, [jpc, ip]! + orreq tmp1, tmp1, r1, lsl #8 + ldreqb r0, [jpc, tmp1]! ldrneb r0, [jpc, #3]! beq branch_taken DISPATCH_BYTECODE - Opcode ifne_safe - Opcode ifnonnull_safe + Opcode ifne + Opcode ifnonnull POP r3 ldrsb r1, [jpc, #1] - ldrb ip, [jpc, #2] + ldrb tmp1, [jpc, #2] cmp r3, #0 - orrne ip, ip, r1, lsl #8 - ldrneb r0, [jpc, ip]! + orrne tmp1, tmp1, r1, lsl #8 + ldrneb r0, [jpc, tmp1]! ldreqb r0, [jpc, #3]! bne branch_taken DISPATCH_BYTECODE - Opcode iflt_safe + Opcode iflt POP r3 ldrsb r1, [jpc, #1] - ldrb ip, [jpc, #2] + ldrb tmp1, [jpc, #2] cmp r3, #0 - orrlt ip, ip, r1, lsl #8 - ldrltb r0, [jpc, ip]! + orrlt tmp1, tmp1, r1, lsl #8 + ldrltb r0, [jpc, tmp1]! ldrgeb r0, [jpc, #3]! blt branch_taken DISPATCH_BYTECODE - Opcode ifge_safe + Opcode ifge POP r3 ldrsb r1, [jpc, #1] - ldrb ip, [jpc, #2] + ldrb tmp1, [jpc, #2] cmp r3, #0 - orrge ip, ip, r1, lsl #8 - ldrgeb r0, [jpc, ip]! + orrge tmp1, tmp1, r1, lsl #8 + ldrgeb r0, [jpc, tmp1]! ldrltb r0, [jpc, #3]! bge branch_taken DISPATCH_BYTECODE - Opcode ifgt_safe + Opcode ifgt POP r3 ldrsb r1, [jpc, #1] - ldrb ip, [jpc, #2] + ldrb tmp1, [jpc, #2] cmp r3, #0 - orrgt ip, ip, r1, lsl #8 - ldrgtb r0, [jpc, ip]! + orrgt tmp1, tmp1, r1, lsl #8 + ldrgtb r0, [jpc, tmp1]! ldrleb r0, [jpc, #3]! bgt branch_taken DISPATCH_BYTECODE - Opcode ifle_safe + Opcode ifle POP r3 ldrsb r1, [jpc, #1] - ldrb ip, [jpc, #2] + ldrb tmp1, [jpc, #2] cmp r3, #0 - orrle ip, ip, r1, lsl #8 - ldrleb r0, [jpc, ip]! + orrle tmp1, tmp1, r1, lsl #8 + ldrleb r0, [jpc, tmp1]! ldrgtb r0, [jpc, #3]! ble branch_taken DISPATCH_BYTECODE - Opcode if_icmpeq_safe - Opcode if_acmpeq_safe - POP2 r2, r3 + Opcode if_icmpeq + Opcode if_acmpeq + POP r2, r3 ldrsb r1, [jpc, #1] - ldrb ip, [jpc, #2] + ldrb tmp1, [jpc, #2] cmp r3, r2 - orreq ip, ip, r1, lsl #8 - ldreqb r0, [jpc, ip]! + orreq tmp1, tmp1, r1, lsl #8 + ldreqb r0, [jpc, tmp1]! ldrneb r0, [jpc, #3]! beq branch_taken DISPATCH_BYTECODE - Opcode if_icmpne_safe - Opcode if_acmpne_safe - POP2 r2, r3 + Opcode if_icmpne + Opcode if_acmpne + POP r2, r3 ldrsb r1, [jpc, #1] - ldrb ip, [jpc, #2] + ldrb tmp1, [jpc, #2] cmp r3, r2 - orrne ip, ip, r1, lsl #8 - ldrneb r0, [jpc, ip]! + orrne tmp1, tmp1, r1, lsl #8 + ldrneb r0, [jpc, tmp1]! ldreqb r0, [jpc, #3]! bne branch_taken DISPATCH_BYTECODE - Opcode if_icmplt_safe - POP2 r2, r3 + Opcode if_icmplt + POP r2, r3 ldrsb r1, [jpc, #1] - ldrb ip, [jpc, #2] + ldrb tmp1, [jpc, #2] cmp r3, r2 - orrlt ip, ip, r1, lsl #8 - ldrltb r0, [jpc, ip]! + orrlt tmp1, tmp1, r1, lsl #8 + ldrltb r0, [jpc, tmp1]! ldrgeb r0, [jpc, #3]! blt branch_taken DISPATCH_BYTECODE - Opcode if_icmpge_safe - POP2 r2, r3 + Opcode if_icmpge + POP r2, r3 ldrsb r1, [jpc, #1] - ldrb ip, [jpc, #2] + ldrb tmp1, [jpc, #2] cmp r3, r2 - orrge ip, ip, r1, lsl #8 - ldrgeb r0, [jpc, ip]! + orrge tmp1, tmp1, r1, lsl #8 + ldrgeb r0, [jpc, tmp1]! ldrltb r0, [jpc, #3]! bge branch_taken DISPATCH_BYTECODE - Opcode if_icmpgt_safe - POP2 r2, r3 + Opcode if_icmpgt + POP r2, r3 ldrsb r1, [jpc, #1] - ldrb ip, [jpc, #2] + ldrb tmp1, [jpc, #2] cmp r3, r2 - orrgt ip, ip, r1, lsl #8 - ldrgtb r0, [jpc, ip]! + orrgt tmp1, tmp1, r1, lsl #8 + ldrgtb r0, [jpc, tmp1]! ldrleb r0, [jpc, #3]! bgt branch_taken DISPATCH_BYTECODE - Opcode if_icmple_safe - POP2 r2, r3 + Opcode if_icmple + POP r2, r3 ldrsb r1, [jpc, #1] - ldrb ip, [jpc, #2] + ldrb tmp1, [jpc, #2] cmp r3, r2 - orrle ip, ip, r1, lsl #8 - ldrleb r0, [jpc, ip]! + orrle tmp1, tmp1, r1, lsl #8 + ldrleb r0, [jpc, tmp1]! ldrgtb r0, [jpc, #3]! ble branch_taken DISPATCH_BYTECODE - Opcode ireturn_safe - Opcode freturn_safe - Opcode lreturn_safe - Opcode dreturn_safe - Opcode areturn_safe - Opcode return_safe + Opcode ireturn + Opcode freturn + Opcode lreturn + Opcode dreturn + Opcode areturn + Opcode return ldr r3, [dispatch, #SafePointSynchronize_state_Address-XXX] ldr r1, [r3] cmp r1, #1 bne handle_return - ldr r3, [istate, #ISTATE_THREAD] - mov r0, sp - str r3, [sp] - bl _ZN17HandleMarkCleanerD1Ev + add r0, istate, #ISTATE_THREAD + bl HandleMarkCleanerD ldr r0, [istate, #ISTATE_THREAD] - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] + DECACHE_JPC + DECACHE_STACK bl _ZN20SafepointSynchronize5blockEP10JavaThread ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] - ldr jpc, [istate, #ISTATE_BCP] + ASSERT_STACK_CACHED ldr r3, [r0, #THREAD_PENDING_EXC] - ldr locals, [istate, #ISTATE_LOCALS] + CACHE_JPC +@ CACHE_LOCALS & CACHE_CP not require for handle_retuen / handle_exception cmp r3, #0 beq handle_return b handle_exception -resolve_putstatic: - mov r1, #179 - sub jpc, jpc, #3 - ldr r0, [istate, #ISTATE_THREAD] - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] - bl _ZN18InterpreterRuntime15resolve_get_putEP10JavaThreadN9Bytecodes4CodeE - ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] - ldr r3, [r0, #THREAD_PENDING_EXC] - ldr jpc, [istate, #ISTATE_BCP] - cmp r3, #0 - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET - ldr locals, [istate, #ISTATE_LOCALS] - bne getfield_exception - ldrb r3, [jpc, #1] - ldrb r2, [jpc, #2] - DISPATCH_START 3 - orr r3, r3, r2, lsl #8 @ r3 = index - add tmp2, constpool, r3, lsl #4 @ tmp2 = cache - DISPATCH_NEXT - ldr r3, [tmp2, #4] @ r3 = object - ldr lr, [tmp2, #12] @ lr = tos_type - ldr r2, [tmp2, #8] @ r2 = offset - movs lr, lr, lsr #29 - bhi putstatic_w @ C = 1, Z = 0 => R2 == 3, 5, 7 - bcs putstatic_h @ C = 1 => R2 = 1 - beq putstatic_sb @ Z = 1 => R2 = 0 - tst lr, #2 - bne putstatic_dw - b putstatic_sh - -resolve_getstatic: - mov r1, #178 - sub jpc, jpc, #3 - ldr r0, [istate, #ISTATE_THREAD] - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] - bl _ZN18InterpreterRuntime15resolve_get_putEP10JavaThreadN9Bytecodes4CodeE - ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] - ldr r3, [r0, #THREAD_PENDING_EXC] - ldr jpc, [istate, #ISTATE_BCP] - cmp r3, #0 - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET - ldr locals, [istate, #ISTATE_LOCALS] - bne getfield_exception - ldrb r3, [jpc, #1] - ldrb r2, [jpc, #2] - DISPATCH_START 3 - orr r3, r3, r2, lsl #8 @ r3 = index - add tmp2, constpool, r3, lsl #4 @ tmp2 = cache - DISPATCH_NEXT - ldr r3, [tmp2, #4] - ldr r2, [tmp2, #12] - ldr lr, [tmp2, #8] - movs r2, r2, lsr #29 - bhi getstatic_w @ C = 1, Z = 0 => R2 == 3, 5, 7 - bcs getstatic_h @ C = 1 => R2 = 1 - beq getstatic_sb @ Z = 1 => R2 = 0 - tst r2, #2 - bne getstatic_dw - b getstatic_sh - -resolve_putfield: - mov r1, #181 - b resolve_get_put -resolve_getfield: - mov r1, #180 resolve_get_put: + mov r1, r0 mov tmp1, lr ldr r0, [istate, #ISTATE_THREAD] - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] + DECACHE_JPC + DECACHE_STACK bl _ZN18InterpreterRuntime15resolve_get_putEP10JavaThreadN9Bytecodes4CodeE + ASSERT_STACK_CACHED + ASSERT_LOCALS_CACHED ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] + CACHE_JPC ldr r3, [r0, #THREAD_PENDING_EXC] - ldr jpc, [istate, #ISTATE_BCP] + CACHE_CP cmp r3, #0 - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET - ldr locals, [istate, #ISTATE_LOCALS] + mov lr, tmp1 bne getfield_exception @ Now restart the getfield ldrb r3, [jpc, #1] ldrb r2, [jpc, #2] orr r3, r3, r2, lsl #8 @ r3 = index add tmp2, constpool, r3, lsl #4 @ tmp2 = cache - bx tmp1 + bx lr accessor_non_w: bcs accessor_h @@ -2046,24 +2819,36 @@ Opcode getfield add tmp2, constpool, r1, lsl #12 - ldr r3, [tmp2, r2, lsl #4]! @ tmp2 = cache, r3 = flags + add tmp2, tmp2, r2, lsl #4 + ldr r3, [tmp2, #CP_OFFSET] and r3, r3, #0x00ff0000 - cmp r3, #180 << 16 - blne resolve_getfield - - ldr r2, [tmp2, #12] + cmp r3, #opc_getfield << 16 + blne resolve_get_put + NFBC POP tmp1 + ldr r2, [tmp2, #CP_OFFSET+12] + NFBC cmp tmp1, #0 + NFBC beq null_ptr_exception + NFBC ldr tmp2, [tmp2, #CP_OFFSET+8] movs r2, r2, lsr #29 - movhi r0, #opc_igetfield + FBC movhi r0, #opc_igetfield bls getfield_non_w + NFBC ldr tmp2, [tmp1, tmp2] + NFBC PUSH tmp2 + NFBC DISPATCH 3 + +#ifdef FAST_BYTECODES rewrite_bytecode: strb r0, [jpc] DISPATCH_BYTECODE +#endif getfield_non_w: bcs getfield_h @ C = 1 => R2 = 1 beq getfield_sb @ Z = 1 => R2 = 0 tst r2, #2 bne getfield_dw + +#ifdef FAST_BYTECODES getfield_sh: mov r0, #opc_sgetfield b rewrite_bytecode @@ -2076,27 +2861,55 @@ getfield_dw: mov r0, #opc_lgetfield b rewrite_bytecode +#else +getfield_sh: + ldrsh tmp2, [tmp1, tmp2] + PUSH tmp2 + DISPATCH 3 +getfield_h: + ldrh tmp2, [tmp1, tmp2] + PUSH tmp2 + DISPATCH 3 +getfield_sb: + ldrsb tmp2, [tmp1, tmp2] + PUSH tmp2 + DISPATCH 3 +getfield_dw: + add tmp1, tmp1, tmp2 + ldm tmp1, {r2, tmp2} + PUSH r2, tmp2 + DISPATCH 3 +#endif Opcode putfield add tmp2, constpool, r1, lsl #12 - ldr r3, [tmp2, r2, lsl #4]! @ tmp2 = cache, r3 = flags + add tmp2, tmp2, r2, lsl #4 + ldr r3, [tmp2, #CP_OFFSET] and r3, r3, #0xff000000 - cmp r3, #181 << 24 - blne resolve_putfield - - ldr r2, [tmp2, #12] + cmp r3, #opc_putfield << 24 + blne resolve_get_put + ldr r2, [tmp2, #CP_OFFSET+12] + NFBC ldr tmp2, [tmp2, #CP_OFFSET+8] movs r2, r2, lsr #29 bls putfield_non_w - mov r0, #opc_iputfield + FBC mov r0, #opc_iputfield cmp r2, #tos_atos >> 1 - moveq r0, #opc_aputfield - b rewrite_bytecode + FBC moveq r0, #opc_aputfield + FBC b rewrite_bytecode + NFBC beq putfield_a + NFBC POP r2, r3 + NFBC cmp r3, #0 + NFBC beq null_ptr_exception + NFBC str r2, [r3, tmp2] + NFBC DISPATCH 3 putfield_non_w: bcs putfield_h beq putfield_sb tst r2, #2 bne putfield_dw + +#ifdef FAST_BYTECODES putfield_sh: putfield_h: mov r0, #opc_cputfield @@ -2107,37 +2920,71 @@ putfield_dw: mov r0, #opc_lputfield b rewrite_bytecode +#else +putfield_sh: +putfield_h: + POP r2, r3 + cmp r3, #0 + beq null_ptr_exception + strh r2, [r3, tmp2] + DISPATCH 3 +putfield_sb: + POP r2, r3 + cmp r3, #0 + beq null_ptr_exception + strb r2, [r3, tmp2] + DISPATCH 3 +putfield_dw: + POP r2, r3, lr + cmp lr, #0 + beq null_ptr_exception + add tmp2, lr, tmp2 + stm tmp2, {r2, r3} + DISPATCH 3 putfield_a: - mov r0, #opc_aputfield - b rewrite_bytecode + GET_STACK 1, r0 + add oop_address_tmp, r0, tmp2 + POP oop_value_tmp + cmp r0, #0 + beq null_ptr_exception + bl oop_store + ldr r3, [dispatch, #Universe_collectedHeap_Address-XXX] + POP r2 + ldr r3, [r3, #0] + ldr r3, [r3, #12] + ldr r3, [r3, #76] + mov tmp2, #0 + strb tmp2, [r3, r2, lsr #9] + DISPATCH 3 +#endif getstatic_sh: - DISPATCH_STATE 2 + DISPATCH_START 3 ldrsh tmp2, [r3, lr] DISPATCH_NEXT PUSH tmp2 DISPATCH_FINISH getstatic_h: - DISPATCH_STATE 2 + DISPATCH_START 3 ldrh tmp2, [r3, lr] DISPATCH_NEXT PUSH tmp2 DISPATCH_FINISH getstatic_sb: - DISPATCH_STATE 2 + DISPATCH_START 3 ldrsb tmp2, [r3, lr] DISPATCH_NEXT PUSH tmp2 DISPATCH_FINISH getstatic_dw: - DISPATCH_STATE 2 + DISPATCH_START 3 add r3, r3, lr ldm r3, {r2, tmp2} DISPATCH_NEXT - PUSH2 r2, tmp2 + PUSH r2, tmp2 DISPATCH_FINISH getstatic_w: - DISPATCH_STATE 2 + DISPATCH_START 3 ldr tmp2, [r3, lr] DISPATCH_NEXT PUSH tmp2 @@ -2145,39 +2992,39 @@ putstatic_sh: putstatic_h: - DISPATCH_STATE 2 + DISPATCH_START 3 POP tmp2 DISPATCH_NEXT strh tmp2, [r3, r2] DISPATCH_FINISH putstatic_w: - DISPATCH_STATE 2 cmp lr, #tos_atos >> 1 @ >> 1 due to lsr #29 above beq putstatic_a + DISPATCH_START 3 POP tmp2 DISPATCH_NEXT str tmp2, [r3, r2] DISPATCH_FINISH putstatic_sb: - DISPATCH_STATE 2 + DISPATCH_START 3 POP tmp2 DISPATCH_NEXT strb tmp2, [r3, r2] DISPATCH_FINISH putstatic_dw: - DISPATCH_STATE 2 + DISPATCH_START 3 add r2, r2, r3 - POP2 r3, tmp2 + POP r3, tmp2 DISPATCH_NEXT stm r2, {r3, tmp2} DISPATCH_FINISH putstatic_a: - POP r1 @ r1 = value - add r0, r3, r2 + POP oop_value_tmp + add oop_address_tmp, r3, r2 PUSH r3 bl oop_store ldr r3, [dispatch, #Universe_collectedHeap_Address-XXX] - DISPATCH_START 0 + DISPATCH_START 3 POP r2 ldr r3, [r3] DISPATCH_NEXT @@ -2188,360 +3035,142 @@ strb tmp2, [r3, r2, lsr #9] DISPATCH_FINISH - +resolve_invokeinterface: + mov r1, #opc_invokeinterface + b resolve_invoke resolve_invokevirtual: + mov r1, #opc_invokevirtual + b resolve_invoke +resolve_invokespecial: + mov r1, #opc_invokespecial + b resolve_invoke +resolve_invokestatic: + mov r1, #opc_invokestatic +resolve_invoke: mov tmp1, lr - mov r1, #182 - ldr r0, [istate, #ISTATE_THREAD] - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] - bl _ZN18InterpreterRuntime14resolve_invokeEP10JavaThreadN9Bytecodes4CodeE ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] - ldr r3, [r0, #THREAD_PENDING_EXC] - ldr jpc, [istate, #ISTATE_BCP] + DECACHE_JPC + DECACHE_STACK + bl _ZN18InterpreterRuntime14resolve_invokeEP10JavaThreadN9Bytecodes4CodeE + ASSERT_STACK_CACHED + ASSERT_LOCALS_CACHED + ldr r0, [istate, #ISTATE_THREAD] + CACHE_JPC + ldr r3, [r0, #4] + CACHE_CP cmp r3, #0 - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET - ldr locals, [istate, #ISTATE_LOCALS] - bne invokevirtual_exception - ldrb r3, [jpc, #1] ldrb r2, [jpc, #2] - orr r3, r3, r2, lsl #8 @ r3 = index - add r0, constpool, r3, lsl #4 @ r1 = cache - bx tmp1 - -resolve_invokestatic: - mov tmp1, lr - mov r1, #184 - ldr r0, [istate, #ISTATE_THREAD] - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] - bl _ZN18InterpreterRuntime14resolve_invokeEP10JavaThreadN9Bytecodes4CodeE - ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] - ldr r3, [r0, #4] - ldr jpc, [istate, #ISTATE_BCP] - cmp r3, #0 - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET - ldr locals, [istate, #ISTATE_LOCALS] - bne invokestatic_exception - - ldrb r3, [jpc, #1] - ldrb r2, [jpc, #2] - orr r3, r3, r2, lsl #8 @ r3 = index - add r0, constpool, r3, lsl #4 @ r1 = cache - bx tmp1 - -resolve_invokespecial: - mov tmp1, lr - mov r1, #183 - ldr r0, [istate, #ISTATE_THREAD] - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] - bl _ZN18InterpreterRuntime14resolve_invokeEP10JavaThreadN9Bytecodes4CodeE - ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] - ldr r3, [r0, #THREAD_PENDING_EXC] - ldr jpc, [istate, #ISTATE_BCP] - cmp r3, #0 - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET - ldr locals, [istate, #ISTATE_LOCALS] - bne invokespecial_exception - - ldrb r3, [jpc, #1] - ldrb r2, [jpc, #2] + bne resolve_exception orr r3, r3, r2, lsl #8 @ r3 = index add r0, constpool, r3, lsl #4 @ r1 = cache bx tmp1 - Opcode invokeinterface - ldrb r1, [jpc, #2] @ zero_extendqisi2 - ldrb r3, [jpc, #1] @ zero_extendqisi2 - mov r0, constpool - orr r3, r3, r1, asl #8 - ldr r2, [r0, r3, asl #4] - mov tmp1, r3, asl #4 - add r0, r0, tmp1 - mov r2, r2, asr #16 - and r2, r2, #255 - cmp r2, #185 - beq .invokeinterface_1 - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] - ldr r0, [istate, #ISTATE_THREAD] - mov r1, #185 - bl _ZN18InterpreterRuntime14resolve_invokeEP10JavaThreadN9Bytecodes4CodeE +# r2 = [jpc, #1] +# r1 = [jpc, #2] + Opcode new +#define k_entry tmp2 +#define new_result r7 +#define top_addr r7 +#define uch r7 +#define obj_size tmp1 + ldr r3, [istate, #ISTATE_METHOD] + orr r2, r1, r2, lsl #8 + ldr lr, [r3, #METHOD_CONSTANTS] + ldr r1, [lr, #CONSTANTPOOL_TAGS] + add r1, r1, #12 + ldrb r3, [r1, r2] + cmp r3, #JVM_CONSTANT_UnresolvedClassInError + cmpne r3, #JVM_CONSTANT_UnresolvedClass + beq .new_slow_case + + add r3, lr, #32 + ldr k_entry, [r3, r2, lsl #2] + + add r1, k_entry, #KLASS_PART + ldr r3, [r1, #INSTANCEKLASS_INITSTATE] + cmp r3, #class_fully_initialized + bne .new_slow_case + ldr r3, [r1, #4] + tst r3, #1 + bne .new_slow_case + + mov obj_size, r3, asr #2 +.new_retry: + ldr r0, [dispatch, #Universe_collectedHeap_Address-XXX] + ldr r0, [r0] + bl CollectedHeap_top_addr + mov top_addr, r0 + ldr r0, [dispatch, #Universe_collectedHeap_Address-XXX] + ldr r0, [r0] + bl CollectedHeap_end_addr + mov r1, top_addr + ldr new_result, [top_addr, #0] + add ip, new_result, obj_size, lsl #2 + ldr r3, [r0, #0] + cmp ip, r3 + bhi .new_slow_case + mov r2, new_result + add r0, new_result, obj_size, lsl #2 + bl cmpxchg_ptr + cmp r0, new_result + bne .new_retry + subs r2, obj_size, #2 +@ ECN: sub optimimal memset + tst r2, #1 + add r0, new_result, #8 + mov r1, #0 + mov ip, #0 + strne r1, [r0], #4 + tst r2, #2 + mov r3, #0 + mov lr, #0 + stmneia r0!, {r1, r3} + bics r2, r2, #3 + beq .new_zero_done +1: + subs r2, r2, #4 + stmia r0!, {r1, r3, ip, lr} + bne 1b +.new_zero_done: + ldr r3, [dispatch, #always_do_update_barrier_Address-XXX] + mov r2, #1 + ldrb r1, [r3] @ zero_extendqisi2 + str r2, [new_result, #0] + cmp r1, #0 + bne .new_do_update_barrier + str k_entry, [new_result, #4] +.new_exit: + str new_result, [stack], #-4 + CACHE_LOCALS + DISPATCH 3 +.new_do_update_barrier: + add oop_address_tmp, new_result, #4 +@ mov oop_value_tmp, k_entry @ oop_value_tmp == k_entry + adr lr, .new_exit + b oop_store +.new_slow_case: + ldrb r2, [jpc, #1] + ldrb r1, [jpc, #2] + ldr r3, [istate, #ISTATE_METHOD] + DECACHE_JPC + DECACHE_STACK + orr r2, r1, r2, lsl #8 ldr r0, [istate, #ISTATE_THREAD] - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET - ldr stack, [istate, #ISTATE_STACK] - ldr r3, [r0, #THREAD_PENDING_EXC] - ldr jpc, [istate, #ISTATE_BCP] - cmp r3, #0 - ldr locals, [istate, #ISTATE_LOCALS] - bne handle_exception - mov r3, constpool - add r0, r3, tmp1 -.invokeinterface_1: - ldr r3, [r0, #12] - ands tmp_vvv, r3, #16777216 - bne .invokeinterface_6 - ldr lr, [r0, #4] - ldr r3, [r0, #12] - and r3, r3, #255 - ldr r3, [stack, r3, asl #2] - cmp r3, #0 - beq null_ptr_exception - ldr sl, [r3, #4] - add r3, sl, #8 - add tmp1, sl, #304 - ldr r2, [r3, #224] - ldr ip, [r3, #228] - add r2, r2, #1 - bic r2, r2, #1 - cmp ip, #0 - mov r3, r2, asl #2 - add r1, tmp1, r3 - movle r2, tmp_vvv - ble .invokeinterface_4 - ldr r3, [tmp1, r2, asl #2] - cmp lr, r3 - movne r2, tmp_vvv - bne .invokeinterface_3 - b .invokeinterface_5 -.invokeinterface_2: - ldr r3, [r1, #0] - cmp lr, r3 - beq .invokeinterface_5 -.invokeinterface_3: - add r2, r2, #1 - cmp r2, ip - add r1, r1, #8 - blt .invokeinterface_2 -.invokeinterface_4: - cmp r2, ip - beq incompatibleclass_exception -.invokeinterface_5: - ldr r3, [r0, #8] - ldr r2, [r1, #4] - mov r3, r3, asl #2 - add r3, sl, r3 - ldr r0, [r3, r2] - cmp r0, #0 - bne .invokeinterface_7 -abstractmethod_exception: - mov r0, #VMSYMBOLS_AbstractMethodError - b raise_exception -incompatibleclass_exception: - mov r0, #VMSYMBOLS_IncompatibleClassChangeError - b raise_exception - -.invokeinterface_6: - ldr r3, [r0, #12] - mov r1, stack - and r3, r3, #255 - ldr r2, [stack, r3, asl #2] - cmp r2, #0 - beq null_ptr_exception - ldr r3, [r0, #12] - tst r3, #67108864 - ldreq r3, [r0, #12] - ldreq r2, [r0, #8] - andeq r3, r3, #255 - ldrne r0, [r0, #8] - ldreq r1, [stack, r3, asl #2] - moveq r2, r2, asl #2 - ldreq r3, [r1, #4] - addeq r3, r3, r2 - ldreq r0, [r3, #304] -.invokeinterface_7: - str r0, [istate, #ISTATE_CALLEE] - ldr r3, [r0, #76] - mov r1, #0 - str r3, [istate, #36] - str stack, [istate, #ISTATE_STACK] - str jpc, [istate, #ISTATE_BCP] - ldr lr, [istate, #ISTATE_THREAD] - str r1, [lr, #THREAD_LAST_JAVA_SP] - ldr r3, [istate, #ISTATE_STACK] - add r3, r3, #4 - str r3, [lr, #THREAD_JAVA_SP] - ldr ip, [istate, #36] - ldr r2, [istate, #ISTATE_THREAD] - mov r1, ip - ldr ip, [ip] - blx ip - ldr ip, [istate, #ISTATE_THREAD] - ldr r3, [ip, #THREAD_JAVA_SP] - ldr r2, [istate, #ISTATE_STACK_LIMIT] - sub r3, r3, #4 - str r3, [istate, #ISTATE_STACK] - ldr r1, [ip, #THREAD_TOP_ZERO_FRAME] - add r2, r2, #4 - str r2, [ip, #THREAD_JAVA_SP] - str r1, [ip, #THREAD_LAST_JAVA_SP] - ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] - ldr jpc, [istate, #ISTATE_BCP] - ldr r3, [r0, #THREAD_PENDING_EXC] - ldr locals, [istate, #ISTATE_LOCALS] - cmp r3, #0 - bne handle_exception -invokeinterface_exit: - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET - DISPATCH 5 - - Opcode new - ldrb ip, [jpc, #1] @ zero_extendqisi2 - ldrb r2, [jpc, #2] @ zero_extendqisi2 - ldr r3, [istate, #ISTATE_METHOD] - orr r2, r2, ip, asl #8 - ldr lr, [r3, #12] - mov r2, r2, asl #16 - ldr r1, [lr, #8] - add r1, r1, #12 - ldrb r3, [r1, r2, lsr #16] @ zero_extendqisi2 - mov r2, r2, lsr #16 - and r3, r3, #255 - str r2, [sp, #52] - cmp r3, #104 - cmpne r3, #100 - beq .new_1 - mov r3, r2, asl #2 - add r3, lr, r3 - ldr r3, [r3, #32] - add r1, r3, #8 - str r3, [sp, #84] - str r1, [sp, #88] - ldr r3, [r1, #216] - cmp r3, #5 - beq .new_2 -.new_1: - ldr r3, [istate, #ISTATE_METHOD] - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] - ldr r0, [istate, #ISTATE_THREAD] - ldr r1, [r3, #12] - ldr r2, [sp, #52] + ldr r1, [r3, #METHOD_CONSTANTS] bl _ZN18InterpreterRuntime4_newEP10JavaThreadP19constantPoolOopDesci ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] + ASSERT_STACK_CACHED ldr ip, [r0, #THREAD_PENDING_EXC] - ldr jpc, [istate, #ISTATE_BCP] + CACHE_JPC + CACHE_CP cmp ip, #0 - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET - ldr locals, [istate, #ISTATE_LOCALS] - beq new_exit - b handle_exception -.new_2: - ldr r3, [r1, #4] - tst r3, #1 - bne .new_1 - mov fp, r3, asr #2 - ldr r3, [dispatch, #UseTLAB_Address-XXX] - ldr r2, [dispatch, #ZeroTLAB_Address-XXX] - ldrb r1, [r3] - cmp r1, #0 - ldrb r0, [r2] - bne .new_9 -.new_3: - mov tmp_vvv, fp, asl #2 -.new_4: - ldr r2, [dispatch, #Universe_collectedHeap_Address-XXX] - str r2, [sp, #20] -.new_5: - ldr r1, [sp, #20] - ldr r2, [r1, #0] - mov r0, r2 - ldr r3, [r2, #UNIVERSE_VTABLE] - ldr ip, [r3, #UNIVERSE_VTABLE_TOP_ADDR] - blx ip - ldr r3, [sp, #20] - ldr r2, [r3, #0] - ldr r3, [r2, #UNIVERSE_VTABLE] - ldr tmp_xxx, [r0, #0] - mov r0, r2 - ldr ip, [r3, #UNIVERSE_VTABLE_END_ADDR] - blx ip - add sl, tmp_xxx, tmp_vvv - ldr r3, [r0, #0] - cmp sl, r3 - bhi .new_1 - ldr ip, [sp, #20] - ldr r3, [ip, #0] - mov r0, r3 - ldr r2, [r3, #UNIVERSE_VTABLE] - ldr ip, [r2, #UNIVERSE_VTABLE_TOP_ADDR] - blx ip - mov r2, tmp_xxx - mov r1, r0 - mov r0, sl - bl _ZN6Atomic11cmpxchg_ptrEPvPVvS0_ - cmp r0, tmp_xxx - bne .new_5 - subs tmp_xxx, r0, #0 - beq .new_1 -.new_6: - subs r2, fp, #2 - bne .new_10 -.new_7: - ldr r3, [dispatch, #UseBiasedLocking_Address-XXX] - ldrb r1, [r3] - cmp r1, #0 - moveq r3, #1 - ldrne r0, [sp, #88] - streq r3, [tmp_xxx, #0] - ldrne r3, [r0, #96] - add r0, tmp_xxx, #4 - strne r3, [tmp_xxx, #0] - ldr r3, [dispatch, #always_do_update_barrier_Address-XXX] - ldrb r1, [r3] @ zero_extendqisi2 - cmp r1, #0 - ldreq r2, [sp, #84] - streq r2, [tmp_xxx, #4] - beq .new_8 - ldr r1, [sp, #84] - bl oop_store -.new_8: - str tmp_xxx, [stack], #-4 - b new_exit_1 -.new_9: - ldr r1, [istate, #ISTATE_THREAD] - ldr r2, [r1, #THREAD_TLAB_TOP] - ldr r3, [r1, #THREAD_TLAB_END] - rsb r3, r2, r3 - cmp fp, r3, lsr #2 - bhi .new_3 - cmp r2, #0 - mov tmp_vvv, fp, asl #2 - add r3, r2, tmp_vvv - mov tmp_xxx, r2 - str r3, [r1, #THREAD_TLAB_TOP] - beq .new_4 - cmp r0, #0 - bne .new_7 - b .new_6 -.new_10: - mov r2, r2, asl #2 - add r0, tmp_xxx, #8 - mov r1, #0 - bl memset - b .new_7 -new_exit: + CACHE_LOCALS + bne handle_exception ldr r2, [r0, #THREAD_VM_RESULT] str r2, [stack], #-4 ldr r3, [istate, #ISTATE_THREAD] str ip, [r3, #THREAD_VM_RESULT] -new_exit_1: - ldr locals, [istate, #ISTATE_LOCALS] - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET DISPATCH 3 bytecode_interpreter_str: @@ -2552,22 +3181,20 @@ ldrb r1, [jpc, #1] @ zero_extendqisi2 ldr r2, [stack, #4] ldr r0, [istate, #ISTATE_THREAD] - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] + DECACHE_JPC + DECACHE_STACK bl _ZN18InterpreterRuntime8newarrayEP10JavaThread9BasicTypei + ASSERT_LOCALS_CACHED + ASSERT_STACK_CACHED ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] + CACHE_JPC ldr ip, [r0, #THREAD_PENDING_EXC] - ldr jpc, [istate, #ISTATE_BCP] + CACHE_CP cmp ip, #0 - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET - ldr locals, [istate, #ISTATE_LOCALS] + ldr r2, [r0, #THREAD_VM_RESULT] bne handle_exception - ldr r2, [r0, #THREAD_VM_RESULT] str r2, [stack, #4] - ldr r3, [istate, #ISTATE_THREAD] - str ip, [r3, #THREAD_VM_RESULT] + str ip, [r0, #THREAD_VM_RESULT] DISPATCH 2 Opcode anewarray @@ -2576,33 +3203,37 @@ ldr lr, [istate, #ISTATE_METHOD] ldrb r2, [jpc, #2] @ zero_extendqisi2 orr r2, r2, r0, asl #8 - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] - ldr r1, [lr, #12] + DECACHE_JPC + DECACHE_STACK + ldr r1, [lr, #METHOD_CONSTANTS] ldr r0, [istate, #ISTATE_THREAD] bl _ZN18InterpreterRuntime9anewarrayEP10JavaThreadP19constantPoolOopDescii + ASSERT_STACK_CACHED + ASSERT_LOCALS_CACHED ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] + CACHE_JPC ldr ip, [r0, #THREAD_PENDING_EXC] - ldr jpc, [istate, #ISTATE_BCP] + CACHE_CP cmp ip, #0 - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET - ldr locals, [istate, #ISTATE_LOCALS] + ldr r2, [r0, #THREAD_VM_RESULT] bne handle_exception - ldr r2, [r0, #THREAD_VM_RESULT] str r2, [stack, #4] - ldr r3, [istate, #ISTATE_THREAD] - str ip, [r3, #THREAD_VM_RESULT] + str ip, [r0, #THREAD_VM_RESULT] DISPATCH 3 Opcode arraylength + DISPATCH_START 1 ldr r3, [stack, #4] - cmp r3, #0 - beq null_ptr_exception - ldr r1, [r3, #8] - str r1, [stack, #4] - DISPATCH 1 + DISPATCH_NEXT + DISPATCH_NEXT + SW_NPC cmp r3, #0 + SW_NPC beq null_ptr_exception_jpc_1 +.abortentry114: + ldr r3, [r3, #8] + DISPATCH_NEXT + DISPATCH_NEXT + str r3, [stack, #4] + DISPATCH_FINISH Opcode athrow ldr r1, [stack, #4] @@ -2614,159 +3245,181 @@ bl _ZN12ThreadShadow21set_pending_exceptionEP7oopDescPKci b handle_exception +#define secondary_super_cache_offset_in_bytes 20 +#define tmp_chunk locals +#define tmp_hwm stack +#define tmp_max constpool + +# r2 = [jpc, #1] +# r1 = [jpc, #2] Opcode checkcast - ldr r3, [stack, #4] - cmp r3, #0 - beq .checkcast_exit - ldrb sl, [jpc, #2] @ zero_extendqisi2 - ldrb tmp_xxx, [jpc, #1] @ zero_extendqisi2 - orr r1, sl, tmp_xxx, asl #8 ldr r3, [istate, #ISTATE_METHOD] - mov r1, r1, asl #16 - ldr r0, [r3, #12] - mov tmp_xxx, r1, lsr #16 - ldr r2, [r0, #8] - add r2, r2, #12 - ldrb r3, [r2, r1, lsr #16] @ zero_extendqisi2 - and r3, r3, #255 - cmp r3, #104 - cmpne r3, #100 - beq .checkcast_2 -.checkcast_1: - mov r1, tmp_xxx, asl #2 ldr r0, [stack, #4] - ldr r2, [istate, #ISTATE_METHOD] + ldr r3, [r3, #METHOD_CONSTANTS] @ R3 = METHOD->constants() + cmp r0, #0 + ldr ip, [r3, #CONSTANTPOOL_TAGS] + beq .checkcast_exit + add ip, ip, #12 + orr tmp2, r1, r2, lsl #8 + ldrb r2, [ip, tmp2] @ zero_extendqisi2 + cmp r2, #JVM_CONSTANT_UnresolvedClassInError + cmpne r2, #JVM_CONSTANT_UnresolvedClass + beq 3f + +4: ldr r0, [r0, #4] - ldr r3, [r2, #12] - add r3, r3, r1 - ldr tmp_vvv, [r3, #32] - cmp tmp_vvv, r0 + add r3, r3, tmp2, lsl #2 + ldr tmp1, [r3, #32] + cmp tmp1, r0 beq .checkcast_exit - add tmp_xxx, r0, #8 - mov r0, tmp_xxx - mov r1, tmp_vvv - bl _ZNK5Klass13is_subtype_ofEP12klassOopDesc + + ldr r2, [tmp1, #16] + add tmp2, r0, #8 + add ip, tmp2, r2 + ldr ip, [ip, #-8] + cmp ip, tmp1 + beq .checkcast_exit + + cmp r2, #secondary_super_cache_offset_in_bytes + bne 2f + + mov r0, tmp2 + mov r1, tmp1 + + bl _ZNK5Klass23search_secondary_supersEP12klassOopDesc cmp r0, #0 - bne .checkcast_exit - mov r0, tmp_xxx - add sl, sp, #216 + beq 2f +.checkcast_exit: + DISPATCH 3 + +3: + ldr r0, [istate, #ISTATE_THREAD] + DECACHE_JPC + DECACHE_STACK + bl _ZN18InterpreterRuntime13quicken_io_ccEP10JavaThread + ASSERT_STACK_CACHED + ASSERT_LOCALS_CACHED + ldr r0, [istate, #ISTATE_THREAD] + CACHE_JPC + ldr r3, [r0, #THREAD_PENDING_EXC] + CACHE_CP + cmp r3, #0 + ldr r3, [istate, #ISTATE_METHOD] + bne handle_exception + ldr r0, [stack, #4] + ldr r3, [r3, #METHOD_CONSTANTS] @ METHOD->constanst() might have moved + b 4b + +2: + DECACHE_JPC + DECACHE_STACK + mov r0, tmp2 ldr r3, [istate, #ISTATE_THREAD] - ldr fp, [r3, #144] @ THREAD_RESOURCE_AREA - ldr r1, [fp, #4] - str r1, [sp, #112] - ldr r2, [fp, #8] - str r2, [sp, #116] - ldr r3, [fp, #12] - str r3, [sp, #120] + ldr tmp2, [r3, #THREAD_RESOURCEAREA] + + ldr tmp_chunk, [tmp2, #RESOURCEAREA_CHUNK] + ldr tmp_hwm, [tmp2, #RESOURCEAREA_HWM] + ldr tmp_max, [tmp2, #RESOURCEAREA_MAX] + bl _ZNK5Klass13external_nameEv - mov tmp_xxx, r0 - add r0, tmp_vvv, #8 + mov ip, r0 + add r0, tmp1, #8 + mov tmp1, ip bl _ZNK5Klass13external_nameEv mov r1, r0 - mov r0, tmp_xxx + mov r0, tmp1 bl _ZN13SharedRuntime27generate_class_cast_messageEPKcS1_ - ldr tmp_xxx, [dispatch, #VmSymbols_symbols_Address-XXX] - ldr ip, [istate, #ISTATE_THREAD] + str r0, [arm_sp, #0] + ldr r0, [istate, #ISTATE_THREAD] adrl r1, bytecode_interpreter_str mov r2, #99 mov r3, #_thread_in_vm - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] - str ip, [sl, #-72]! - str r3, [ip, #THREAD_STATE] - ldr r3, [tmp_xxx, #VMSYMBOLS_ClassCastException * 4] - ldr ip, [istate, #ISTATE_THREAD] - str r0, [sp, #0] - mov r0, ip + str r3, [r0, #THREAD_STATE] + ldr r3, [dispatch, #VmSymbols_symbols_Address-XXX] + ldr r3, [r3, #VMSYMBOLS_ClassCastException * 4] bl _ZN10Exceptions10_throw_msgEP6ThreadPKciP13symbolOopDescS3_ - mov r0, sl - bl _ZN18ThreadInVMfromJavaD1Ev - ldr r0, [sp, #112] + add r0, istate, #ISTATE_THREAD + bl ThreadInVMfromJavaD + mov r0, tmp_chunk ldr r3, [r0, #0] - ldr stack, [istate, #ISTATE_STACK] + CACHE_JPC cmp r3, #0 - ldr jpc, [istate, #ISTATE_BCP] beq 1f bl _ZN5Chunk9next_chopEv 1: - ldr r2, [sp, #120] - str r2, [fp, #12] - ldr r3, [sp, #112] - str r3, [fp, #4] - ldr ip, [sp, #116] - str ip, [fp, #8] + str tmp_hwm, [tmp2, #RESOURCEAREA_HWM] + str tmp_max, [tmp2, #RESOURCEAREA_MAX] + str tmp_chunk, [tmp2, #RESOURCEAREA_CHUNK] b handle_exception -.checkcast_2: - ldr r0, [istate, #ISTATE_THREAD] - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] - bl _ZN18InterpreterRuntime13quicken_io_ccEP10JavaThread - ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] - ldr r3, [r0, #THREAD_PENDING_EXC] - ldr jpc, [istate, #ISTATE_BCP] - cmp r3, #0 - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET - beq .checkcast_1 - b handle_exception -.checkcast_exit: - ldr locals, [istate, #ISTATE_LOCALS] - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET - DISPATCH 3 - + +# r2 = [jpc, #1] +# r1 = [jpc, #2] Opcode instanceof - ldr r3, [stack, #4] - cmp r3, #0 - beq .instanceof_exit - ldrb tmp1, [jpc, #1] @ zero_extendqisi2 ldr r3, [istate, #ISTATE_METHOD] - ldrb r2, [jpc, #2] @ zero_extendqisi2 - ldr ip, [r3, #12] - orr r2, r2, tmp1, asl #8 - ldr r1, [ip, #8] - mov r2, r2, asl #16 - add r1, r1, #12 - mov tmp1, r2, lsr #16 - ldrb r3, [r1, r2, lsr #16] @ zero_extendqisi2 - and r3, r3, #255 - cmp r3, #104 - cmpne r3, #100 - bne .instanceof_1 + ldr r0, [stack, #4] + ldr r3, [r3, #METHOD_CONSTANTS] + cmp r0, #0 + ldr ip, [r3, #CONSTANTPOOL_TAGS] + beq .instanceof_not_instance + add ip, ip, #12 + orr tmp2, r1, r2, lsl #8 + ldrb r2, [ip, tmp2] + cmp r2, #JVM_CONSTANT_UnresolvedClassInError + cmpne r2, #JVM_CONSTANT_UnresolvedClass + beq 2f + +1: + ldr r0, [r0, #4] + add r3, r3, tmp2, lsl #2 + ldr tmp1, [r3, #32] + cmp tmp1, r0 + beq .instanceof_is_instance + + ldr r2, [tmp1, #16] + add tmp2, r0, #8 + add ip, tmp2, r2 + ldr ip, [ip, #-8] + cmp ip, tmp1 + beq .instanceof_is_instance + + mov r0, #0 + cmp r2, #secondary_super_cache_offset_in_bytes + bne .instanceof_not_instance + + mov r0, tmp2 + mov r1, tmp1 + + bl _ZNK5Klass23search_secondary_supersEP12klassOopDesc + cmp r0, #0 + beq .instanceof_not_instance + +.instanceof_is_instance: + mov r0, #1 + str r0, [stack, #4] + DISPATCH 3 +.instanceof_not_instance: + mov r0, #0 + str r0, [stack, #4] + DISPATCH 3 + +2: ldr r0, [istate, #ISTATE_THREAD] - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] + DECACHE_JPC + DECACHE_STACK bl _ZN18InterpreterRuntime13quicken_io_ccEP10JavaThread + ASSERT_STACK_CACHED + ASSERT_LOCALS_CACHED ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] + CACHE_JPC ldr r3, [r0, #THREAD_PENDING_EXC] - ldr jpc, [istate, #ISTATE_BCP] + CACHE_CP cmp r3, #0 - ldr locals, [istate, #ISTATE_LOCALS] bne handle_exception -.instanceof_1: - mov r1, tmp1, asl #2 + + ldr r3, [istate, #ISTATE_METHOD] ldr r0, [stack, #4] - ldr r2, [istate, #ISTATE_METHOD] - ldr r0, [r0, #4] - ldr r3, [r2, #12] - add r3, r3, r1 - ldr r1, [r3, #32] - cmp r1, r0 - beq .instanceof_2 - add r0, r0, #8 - bl _ZNK5Klass13is_subtype_ofEP12klassOopDesc - cmp r0, #0 - streq r0, [stack, #4] - beq .instanceof_exit -.instanceof_2: - mov r3, #1 - str r3, [stack, #4] -.instanceof_exit: - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET - DISPATCH 3 + ldr r3, [r3, #METHOD_CONSTANTS] @ METHOD->constanst() might have moved + b 1b Opcode monitorenter ldr r1, [stack, #4] @@ -2797,38 +3450,35 @@ orr tmp1, r3, #1 mov r2, tmp1 str tmp1, [sl, #0] - bl _ZN6Atomic11cmpxchg_ptrEPvPVvS0_ + bl cmpxchg_ptr cmp r0, tmp1 beq .monitorenter_exit + ldr r0, [istate, #ISTATE_THREAD] bic r1, tmp1, #3 - ldr r2, [istate, #ISTATE_THREAD] - mov r0, r2 - ldr r3, [r2, #0] - ldr ip, [r3, #THREAD_VTABLE_IS_LOCK_OWNED] - blx ip + bl JavaThread_is_lock_owned cmp r0, #0 movne lr, #0 strne lr, [sl, #0] bne .monitorenter_exit mov r1, sl - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] + DECACHE_JPC + DECACHE_STACK ldr r0, [istate, #ISTATE_THREAD] bl _ZN18InterpreterRuntime12monitorenterEP10JavaThreadP15BasicObjectLock + ASSERT_STACK_CACHED + ASSERT_LOCALS_CACHED ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] - ldr jpc, [istate, #ISTATE_BCP] + CACHE_JPC ldr r3, [r0, #THREAD_PENDING_EXC] cmp r3, #0 - ldr locals, [istate, #ISTATE_LOCALS] beq .monitorenter_exit b handle_exception .monitorenter_4: b null_ptr_exception .monitorenter_5: mov lr, #0 - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] + DECACHE_JPC + DECACHE_STACK ldr r3, [istate, #ISTATE_THREAD] ldr ip, [istate, #ISTATE_THREAD] ldr r1, [r3, #THREAD_JAVA_SP] @@ -2868,11 +3518,11 @@ ldr r1, [istate, #ISTATE_THREAD] ldr r3, [r1, #THREAD_TOP_ZERO_FRAME] str r3, [r1, #THREAD_LAST_JAVA_SP] - ldr stack, [istate, #ISTATE_STACK] + CACHE_STACK ldr sl, [istate, #ISTATE_STACK_BASE] - ldr jpc, [istate, #ISTATE_BCP] ldr r3, [stack, #4] - ldr locals, [istate, #ISTATE_LOCALS] + CACHE_JPC + ASSERT_LOCALS_CACHED mov r1, r3 str r3, [sl, #4] ldr r2, [r3, #0] @@ -2880,35 +3530,31 @@ orr tmp1, r2, #1 mov r2, tmp1 str tmp1, [sl, #0] - bl _ZN6Atomic11cmpxchg_ptrEPvPVvS0_ + bl cmpxchg_ptr cmp r0, tmp1 beq .monitorenter_exit + ldr r0, [istate, #ISTATE_THREAD] bic r1, tmp1, #3 - ldr r2, [istate, #ISTATE_THREAD] - mov r0, r2 - ldr r3, [r2, #0] - ldr ip, [r3, #THREAD_VTABLE_IS_LOCK_OWNED] - blx ip + bl JavaThread_is_lock_owned cmp r0, #0 movne ip, #0 strne ip, [sl, #0] bne .monitorenter_exit mov r1, sl ldr r0, [istate, #ISTATE_THREAD] - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] + DECACHE_JPC + DECACHE_STACK bl _ZN18InterpreterRuntime12monitorenterEP10JavaThreadP15BasicObjectLock + ASSERT_STACK_CACHED + ASSERT_LOCALS_CACHED ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] + CACHE_JPC ldr r3, [r0, #THREAD_PENDING_EXC] - ldr jpc, [istate, #ISTATE_BCP] cmp r3, #0 - ldr locals, [istate, #ISTATE_LOCALS] beq .monitorenter_exit b handle_exception .monitorenter_exit: - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET + CACHE_CP add stack, stack, #4 DISPATCH 1 @@ -2936,35 +3582,34 @@ beq .monitorexit_exit mov r1, sl mov r2, tmp1 - bl _ZN6Atomic11cmpxchg_ptrEPvPVvS0_ + bl cmpxchg_ptr cmp tmp1, r0 beq .monitorexit_exit str sl, [tmp1, #4] mov r1, tmp1 - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] + DECACHE_JPC + DECACHE_STACK ldr r0, [istate, #ISTATE_THREAD] bl _ZN18InterpreterRuntime11monitorexitEP10JavaThreadP15BasicObjectLock ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] - ldr jpc, [istate, #ISTATE_BCP] + ASSERT_STACK_CACHED + ASSERT_LOCALS_CACHED ldr r3, [r0, #THREAD_PENDING_EXC] + CACHE_JPC cmp r3, #0 - ldr locals, [istate, #ISTATE_LOCALS] beq .monitorexit_exit b handle_exception .monitorexit_3: b null_ptr_exception .monitorexit_4: ldr r0, [istate, #ISTATE_THREAD] - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] + DECACHE_JPC + DECACHE_STACK bl _ZN18InterpreterRuntime37throw_illegal_monitor_state_exceptionEP10JavaThread b handle_exception_with_bcp .monitorexit_exit: add stack, stack, #4 - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET + CACHE_CP DISPATCH 1 vm_fatal_error: @@ -2977,23 +3622,24 @@ ALIGN_WORD Opcode aastore - ldr tmp1, [stack, #12] + ldr tmp1, [stack, #12] @ arrObj ldr tmp_vvv, [stack, #8] - cmp tmp1, #0 + SW_NPC cmp tmp1, #0 ldr sl, [stack, #4] - beq null_ptr_exception + SW_NPC beq null_ptr_exception +.abortentry115: ldr r3, [tmp1, #8] cmp tmp_vvv, r3 bcs array_bounds_exception cmp sl, #0 beq .aastore_exit - ldr r3, [tmp1, #4] + ldr r3, [tmp1, #4] @ arrObj->klass() ldr r0, [sl, #4] - ldr r1, [r3, #136] + ldr r1, [r3, #KLASS_PART+OBJARRAYKLASS_ELEMENTKLASS] cmp r0, r1 beq .aastore_exit add r0, r0, #8 - bl _ZNK5Klass13is_subtype_ofEP12klassOopDesc + bl is_subtype_of cmp r0, #0 moveq r0, #VMSYMBOLS_ArrayStoreException beq raise_exception @@ -3007,8 +3653,7 @@ add stack, stack, #12 ldr r3, [r3, #76] strb lr, [r3, r1, lsr #9] - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET + CACHE_CP DISPATCH 1 Opcode wide @@ -3061,6 +3706,7 @@ DISPATCH 4 case_wide_istore: case_wide_fstore: +case_wide_astore: POP r2 str r2, [locals, -r1, lsl #2] DISPATCH 4 @@ -3068,21 +3714,14 @@ case_wide_lload: sub r1, locals, r1, lsl #2 ldmda r1, {r1, r2} - PUSH2 r1, r2 + PUSH r1, r2 DISPATCH 4 case_wide_dstore: case_wide_lstore: - POP2 r2, r3 + POP r2, r3 sub r1, locals, r1, lsl #2 stmda r1, {r2, r3} DISPATCH 4 -case_wide_astore: - mov r3, r1 - mov r0, stack - mvn r1, #0 - mov r2, locals - bl _ZN19BytecodeInterpreter6astoreEPiiS0_i - DISPATCH 4 do_wide_ret: ldr r2, [istate, #ISTATE_METHOD] ldr r2, [r2, #8] @@ -3102,25 +3741,21 @@ ldrb tmp1, [jpc, #3] @ zero_extendqisi2 ldr r0, [istate, #ISTATE_THREAD] add r1, stack, tmp1, lsl #2 - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] + DECACHE_JPC + DECACHE_STACK bl _ZN18InterpreterRuntime14multianewarrayEP10JavaThreadPi + ASSERT_STACK_CACHED + ASSERT_LOCALS_CACHED ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] + CACHE_JPC ldr r1, [r0, #THREAD_PENDING_EXC] - ldr jpc, [istate, #ISTATE_BCP] + CACHE_CP cmp r1, #0 - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET - ldr locals, [istate, #ISTATE_LOCALS] + ldr r3, [r0, #THREAD_VM_RESULT] bne handle_exception - ldr r3, [r0, #THREAD_VM_RESULT] - str r3, [stack, tmp1, asl #2] - ldr r2, [istate, #ISTATE_THREAD] - mov r3, tmp1, asl #2 - sub r3, r3, #4 - str r1, [r2, #THREAD_VM_RESULT] - add stack, stack, r3 + str r3, [stack, tmp1, asl #2]! + str r1, [r0, #THREAD_VM_RESULT] + sub stack, stack, #4 DISPATCH 4 Opcode jsr_w @@ -3148,57 +3783,82 @@ ldr r1, [r3] cmp r1, #1 bne 1f - ldr r3, [istate, #ISTATE_THREAD] - mov r0, sp - str r3, [sp] - bl _ZN17HandleMarkCleanerD1Ev + add r0, istate, #ISTATE_THREAD + bl HandleMarkCleanerD ldr r0, [istate, #ISTATE_THREAD] - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] + DECACHE_JPC + DECACHE_STACK bl _ZN20SafepointSynchronize5blockEP10JavaThread + ASSERT_STACK_CACHED + ASSERT_LOCALS_CACHED ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] + CACHE_JPC ldr r3, [r0, #THREAD_PENDING_EXC] - ldr jpc, [istate, #ISTATE_BCP] + CACHE_CP cmp r3, #0 - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET - ldr locals, [istate, #ISTATE_LOCALS] bne handle_exception 1: DISPATCH 0 Opcode breakpoint mov r2, jpc - str stack, [istate, #ISTATE_STACK] - str jpc, [istate, #ISTATE_BCP] + DECACHE_STACK + DECACHE_JPC ldr r0, [istate, #ISTATE_THREAD] ldr r1, [istate, #ISTATE_METHOD] bl _ZN18InterpreterRuntime24get_original_bytecode_atEP10JavaThreadP13methodOopDescPh - ldr stack, [istate, #ISTATE_STACK] - ldmib istate, {jpc, locals} @ phole ldm mov tmp1, r0 ldr r0, [istate, #ISTATE_THREAD] ldr r3, [r0, #THREAD_PENDING_EXC] cmp r3, #0 bne handle_exception - str stack, [istate, #ISTATE_STACK] - str jpc, [istate, #ISTATE_BCP] - mov r2, jpc + ldr r2, [istate, #ISTATE_BCP] ldr r1, [istate, #ISTATE_METHOD] bl _ZN18InterpreterRuntime11_breakpointEP10JavaThreadP13methodOopDescPh + ASSERT_STACK_CACHED + ASSERT_LOCALS_CACHED ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] + CACHE_JPC ldr r3, [r0, #THREAD_PENDING_EXC] - ldr jpc, [istate, #ISTATE_BCP] + CACHE_CP cmp r3, #0 - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET - ldr locals, [istate, #ISTATE_LOCALS] + and r0, tmp1, #255 bne handle_exception - and r0, tmp1, #255 DISPATCH_BYTECODE +#ifndef FAST_BYTECODES + Opcode bgetfield + Opcode cgetfield + Opcode igetfield + Opcode lgetfield + Opcode sgetfield + Opcode aputfield + Opcode bputfield + Opcode cputfield + Opcode iputfield + Opcode lputfield + Opcode invokevfinal + Opcode invokeresolved + Opcode invokespecialresolved + Opcode invokestaticresolved + Opcode iaccess_0 + Opcode iload_0_iconst_N + Opcode iload_iconst_N + Opcode iadd_istore_N + Opcode isub_istore_N + Opcode iand_istore_N + Opcode ior_istore_N + Opcode ixor_istore_N + Opcode iadd_u4store + Opcode isub_u4store + Opcode iand_u4store + Opcode ior_u4store + Opcode ixor_u4store + Opcode fast_iload_iload + Opcode fast_iload_iload_N + Opcode fast_iload_N_iload + Opcode fast_iload_N_iload_N +#endif Opcode undefined ldr r2, [dispatch, #Bytecodes_name_Address-XXX] ldrb r3, [jpc, #0] @ zero_extendqisi2 @@ -3208,7 +3868,7 @@ ldrcc ip, [r2, r3, asl #2] adr r2, unimplemented_opcode_msg mov r1, #99 - str ip, [sp, #0] + str ip, [arm_sp, #0] bl _Z19report_fatal_varargPKciS0_z b breakpoint unimplemented_opcode_msg: @@ -3220,18 +3880,18 @@ Opcode return_register_finalizer ldr r1, [locals, #0] ldr r3, [r1, #4] - ldr r2, [r3, #84] - tst r2, #1073741824 + ldr r2, [r3, #KLASS_PART+KLASS_ACCESSFLAGS] + tst r2, #JVM_ACC_HAS_FINALIZER beq handle_return - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] + DECACHE_JPC + DECACHE_STACK ldr r0, [istate, #ISTATE_THREAD] bl _ZN18InterpreterRuntime18register_finalizerEP10JavaThreadP7oopDesc + ASSERT_STACK_CACHED ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] - ldr jpc, [istate, #ISTATE_BCP] + CACHE_JPC ldr r3, [r0, #THREAD_PENDING_EXC] - ldr locals, [istate, #ISTATE_LOCALS] +@ CACHE_LOCALS & CACHE_CP not require for handle_retuen / handle_exception cmp r3, #0 beq handle_return b handle_exception @@ -3240,12 +3900,11 @@ @ may or may not be synchronized. So we still have to check the synchronized @ flag in the synchronized path, otherwise we may get an IllegalMonitor. normal_entry_synchronized: - stmfd sp!, {regset, lr} - sub sp, sp, #220 + stmfd arm_sp!, {regset, lr} mov sl, r0 mov tmp1, r2 - ldrh r2, [sl, #40] - ldrh r3, [sl, #42] + ldrh r2, [sl, #METHOD_MAXLOCALS] + ldrh r3, [sl, #METHOD_SIZEOFPARAMETERS] rsb tmp_zzz, r3, r2 cmp tmp_zzz, #0 ble .normal_entry_synchronized_no_locals @@ -3262,15 +3921,11 @@ mov r2, tmp1 mov r1, sl add r0, tmp1, #THREAD_JAVA_STACK_BASE - bl build_normal -@ add lr, sp, #192 -@ str r0, [sp, #56] + bl build_frame mov tmp_vvv, r0 ldr r3, [tmp1, #THREAD_TOP_ZERO_FRAME] sub r0, r0, #72 -@ str lr, [sp, #32] mov istate, r0 -@ str r0, [sp, #60] str r3, [tmp_vvv, #0] ldr r0, [tmp1, #THREAD_STACK_SIZE] ldr r3, [tmp1, #THREAD_STACK_BASE] @@ -3279,61 +3934,48 @@ adrl ip, dispatch_init_adcon rsb r3, r0, r3 rsb r2, r1, r2 - ldmia ip, {r0, r1} - rsb r3, r3, sp + ldm ip, {r0, r1} + rsb r3, r3, arm_sp cmp r2, #4096 cmpge r3, #32768 add r0, r0, ip str tmp_vvv, [tmp1, #THREAD_TOP_ZERO_FRAME] + CACHE_JPC str tmp_vvv, [tmp1, #THREAD_LAST_JAVA_SP] add dispatch, r1, r0 blt .throw_stack_overflow - ldr stack, [istate, #ISTATE_STACK] - ldmib istate, {jpc, locals} @ phole ldm ldr r0, [istate, #ISTATE_METHOD] - ldr r3, [r0, #24] - tst r3, #32 + CACHE_STACK + ldr r3, [r0, #METHOD_ACCESSFLAGS] + CACHE_LOCALS + tst r3, #JVM_ACC_SYNCHRONIZED + CACHE_CP bne normal_do_synchronization - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET DISPATCH 0 do_execute_java_bytecodes_restore_locals_and_jpc: - ldr jpc, [istate, #ISTATE_BCP] + CACHE_JPC do_execute_java_bytecodes_restore_locals: - ldr locals, [istate, #ISTATE_LOCALS] - ldr constpool, [istate, #ISTATE_CONSTANTS] - add constpool, constpool, #CONST_POOL_OFFSET + CACHE_LOCALS + CACHE_CP DISPATCH 0 normal_do_synchronization: - tst r3, #8 - ldrne r3, [r0, #12] + tst r3, #JVM_ACC_STATIC + ldrne r3, [r0, #METHOD_CONSTANTS] ldreq sl, [locals, #0] ldrne r2, [r3, #16] - ldr r3, [dispatch, #UseBiasedLocking_Address-XXX] - ldr ip, [istate, #ISTATE_MONITOR_BASE] + ldr tmp1, [istate, #ISTATE_MONITOR_BASE] ldrne sl, [r2, #60] - str ip, [sp, #100] - ldrb r1, [r3] - cmp r1, #0 - beq .normal_do_synchronisation_1 - ldr tmp_xxx, [sl, #0] - and r3, tmp_xxx, #7 - cmp r3, #5 - beq .normal_do_synchronisation_4 -.normal_do_synchronisation_1: - ldr r0, [sp, #100] ldr r3, [sl, #0] - sub fp, r0, #8 orr tmp_xxx, r3, #1 - str tmp_xxx, [r0, #-8] + str tmp_xxx, [tmp1, #-8]! .normal_do_synchronisation_2: ldr tmp_vvv, [sl, #0] cmp tmp_xxx, tmp_vvv bne .normal_do_synchronisation_3 mov r0, tmp_xxx - mov r1, fp + mov r1, tmp1 mov r2, sl mov r3, #0xffffffc0 bic r3, r3, #0xf000 @@ -3343,85 +3985,153 @@ .normal_do_synchronisation_3: cmp tmp_xxx, tmp_vvv beq do_execute_java_bytecodes_restore_locals + ldr r0, [istate, #ISTATE_THREAD] bic r1, tmp_xxx, #3 - ldr r2, [istate, #ISTATE_THREAD] - mov r0, r2 - ldr r3, [r2, #0] - ldr ip, [r3, #THREAD_VTABLE_IS_LOCK_OWNED] - blx ip + bl JavaThread_is_lock_owned cmp r0, #0 - beq .handle_exception_28 - ldr r0, [sp, #100] + beq .normal_do_synchronisation_4 mov r3, #0 - str r3, [r0, #-8] + str r3, [tmp1] b do_execute_java_bytecodes_restore_locals .normal_do_synchronisation_4: - ldr r2, [sl, #4] - ldr r2, [r2, #104] + mov r1, tmp1 + DECACHE_STACK + ldr r0, [istate, #ISTATE_THREAD] + bl _ZN18InterpreterRuntime12monitorenterEP10JavaThreadP15BasicObjectLock ldr r0, [istate, #ISTATE_THREAD] - eor r3, r2, r0 - eor r3, r3, tmp_xxx - bics ip, r3, #120 - beq do_execute_java_bytecodes_restore_locals - mov r0, r2 - mov r1, sl - mov r2, tmp_xxx - bl _ZN6Atomic11cmpxchg_ptrEPvPVvS0_ - cmp tmp_xxx, r0 - beq .normal_do_synchronisation_1 - b do_execute_java_bytecodes_restore_locals + ASSERT_STACK_CACHED + ldr r3, [r0, #THREAD_PENDING_EXC] + cmp r3, #0 + mov r2, r0 + beq do_execute_java_bytecodes_restore_locals_and_jpc + b handle_exception_do_not_unlock # r2 = [jpc, #1] # r1 = [jpc, #2] - Opcode invokevirtual - add r0, constpool, r1, lsl #12 - ldr r2, [r0, r2, asl #4]! @ r0 = cache - and r2, r2, #0xff000000 - cmp r2, #182 << 24 - blne resolve_invokevirtual - ldr r3, [r0, #12] - mov r0, #opc_invokeresolved - tst r3, #67108864 - movne r0, #opc_invokevfinal - b rewrite_bytecode - - Opcode invokespecial + Opcode invokeinterface + DECACHE_STACK add r0, constpool, r1, lsl #12 - ldr r2, [r0, r2, asl #4]! @ r0 = cache + add r0, r0, r2, asl #4 + DECACHE_JPC + ldr r2, [r0, #CP_OFFSET] and r2, r2, #0x00ff0000 - cmp r2, #183 << 16 - blne resolve_invokespecial - mov r0, #opc_invokespecialresolved - b rewrite_bytecode - - Opcode invokestatic - add r0, constpool, r1, lsl #12 - ldr r2, [r0, r2, asl #4]! @ r0 = cache - and r2, r2, #0x00ff0000 - cmp r2, #184 << 16 - blne resolve_invokestatic - mov r0, #opc_invokestaticresolved - b rewrite_bytecode - + cmp r2, #opc_invokeinterface << 16 + blne resolve_invokeinterface + + ldr r3, [r0, #CP_OFFSET+12] + and r2, r3, #255 + ldr r2, [stack, r2, lsl #2] + SW_NPC cmp r2, #0 + SW_NPC beq null_ptr_exception +.abortentry110: + ldr tmp2, [r2, #4] @ rcvr->klass() + tst r3, #flag_methodInterface + bne .invokeinterface_methodInterface + + ldr lr, [r0, #CP_OFFSET+4] @ lr = iclass + + add r1, tmp2, #INSTANCEKLASS_VTABLE_OFFSET + ldr r2, [tmp2, #KLASS_PART+INSTANCEKLASS_VTABLE_LEN] + ldr ip, [tmp2, #KLASS_PART+INSTANCEKLASS_ITABLE_LEN] + add r2, r2, #1 + bic r2, r2, #1 + + add r1, r1, r2, lsl #2 + + mov r2, #0 +1: + cmp r2, ip + beq incompatibleclass_exception + ldr r3, [r1], #8 + add r2, r2, #1 + cmp lr, r3 + bne 1b + + ldr r3, [r0, #CP_OFFSET+8] + ldr r2, [r1, #-4] + add r3, tmp2, r3, lsl #2 + ldr tmp2, [r3, r2] + SW_NPC cmp tmp2, #0 + SW_NPC beq abstractmethod_exception +.invokeinterface_invoke: + ldr tmp1, [istate, #ISTATE_THREAD] +@ str tmp2, [istate, #ISTATE_CALLEE] +.abortentry116: + ldr ip, [tmp2, #METHOD_FROM_INTERPRETED] + mov r1, #0 + str ip, [istate, #36] + str r1, [tmp1, #THREAD_LAST_JAVA_SP] + + add stack, stack, #4 + str stack, [tmp1, #THREAD_JAVA_SP] + + ldr r3, [ip] + + mov tmp_invoke_len, #5 + + adr r0, normal_entry + cmp r3, r0 + beq fast_normal_entry_with_len + + mov r0, tmp2 + mov r1, ip + mov r2, tmp1 + blx r3 + + ASSERT_LOCALS_CACHED + + ldr ip, [istate, #ISTATE_THREAD] + CACHE_JPC + ldr stack, [ip, #THREAD_JAVA_SP] + ldr r2, [istate, #ISTATE_STACK_LIMIT] + sub stack, stack, #4 + + ldr r1, [ip, #THREAD_TOP_ZERO_FRAME] + add r2, r2, #4 + str r2, [ip, #THREAD_JAVA_SP] + str r1, [ip, #THREAD_LAST_JAVA_SP] + DISPATCH_START 5 + ldr r3, [ip, #4] + DISPATCH_NEXT + DISPATCH_NEXT + cmp r3, #0 + DISPATCH_NEXT + bne invokeinterface_exception_fix + DISPATCH_NEXT + CACHE_CP + DISPATCH_FINISH + +.invokeinterface_methodInterface: + tst r3, #flag_vfinalMethod + ldrne tmp2, [r0, #CP_OFFSET+8] + bne .invokeinterface_invoke + ldr r1, [r0, #CP_OFFSET+8] + add r3, tmp2, r1, lsl #2 + ldr tmp2, [r3, #INSTANCEKLASS_VTABLE_OFFSET] + b .invokeinterface_invoke + +#ifdef FAST_BYTECODES # r2 = [jpc, #1] # r1 = [jpc, #2] Opcode invokevfinal - str stack, [istate, #ISTATE_STACK] + DECACHE_STACK add r0, constpool, r1, lsl #12 - str jpc, [istate, #ISTATE_BCP] + DECACHE_JPC add r0, r2, asl #4 - ldr r3, [r0, #12] + ldr r3, [r0, #CP_OFFSET+12] ldr tmp1, [istate, #ISTATE_THREAD] and r1, r3, #255 ldr r2, [stack, r1, asl #2] mov r1, #0 - cmp r2, #0 - beq null_ptr_exception - - ldr tmp2, [r0, #8] - - str tmp2, [istate, #ISTATE_CALLEE] - ldr ip, [tmp2, #76] + SW_NPC cmp r2, #0 + SW_NPC beq null_ptr_exception +.abortentry117: + HW_NPC ldr r3, [r2] @ Only to provoke abort + + ldr tmp2, [r0, #CP_OFFSET+8] + +@ str tmp2, [istate, #ISTATE_CALLEE] + ldr ip, [tmp2, #METHOD_FROM_INTERPRETED] str r1, [tmp1, #THREAD_LAST_JAVA_SP] str ip, [istate, #36] @@ -3429,42 +4139,82 @@ str stack, [tmp1, #THREAD_JAVA_SP] ldr r3, [ip, #0] - adr lr, normal_entry - cmp r3, lr +#ifdef FASTPATH_ENTRY + adr r0, normal_entry + cmp r3, r0 beq fast_normal_entry - adr lr, native_entry - cmp r3, lr +#ifdef NATIVE_ENTRY + adrl r0, native_entry + cmp r3, r0 beq fast_native_entry - adr lr, accessor_entry - cmp r3, lr +#endif + adr r0, accessor_entry + cmp r3, r0 beq fast_accessor_entry +#endif b normal_dispatch_and_return +#endif // FAST_BYTECODES # r2 = [jpc, #1] # r1 = [jpc, #2] - Opcode invokeresolved - str stack, [istate, #ISTATE_STACK] + Opcode invokevirtual add r0, constpool, r1, lsl #12 - str jpc, [istate, #ISTATE_BCP] - add r0, r0, r2, asl #4 - ldr r3, [r0, #12] + add r0, r0, r2, asl #4 + ldr r2, [r0, #CP_OFFSET] + and r2, r2, #0xff000000 + cmp r2, #opc_invokevirtual << 24 + blne resolve_invokevirtual + ldr r3, [r0, #CP_OFFSET+12] +#ifdef FAST_BYTECODES + mov r0, #opc_invokeresolved + tst r3, #flag_vfinalMethod + movne r0, #opc_invokevfinal + b rewrite_bytecode +#else + DECACHE_STACK + DECACHE_JPC ldr tmp1, [istate, #ISTATE_THREAD] and r1, r3, #255 ldr r2, [stack, r1, asl #2] mov r1, #0 -#ifndef HW_NULL_PTR_CHECK cmp r2, #0 - beq null_ptr_exception_jpc_0 -#endif - - ldr tmp2, [r0, #8] + beq null_ptr_exception + + ldr tmp2, [r0, #CP_OFFSET+8] + tst r3, #flag_vfinalMethod + bne 1f + + ldr r3, [r2, #4] + add r3, r3, tmp2, lsl #2 + ldr tmp2, [r3, #INSTANCEKLASS_VTABLE_OFFSET] +1: +#endif // FAST_BYTECODES + +#ifdef FAST_BYTECODES +# r2 = [jpc, #1] +# r1 = [jpc, #2] + Opcode invokeresolved + DECACHE_STACK + add r0, constpool, r1, lsl #12 + DECACHE_JPC + add r0, r0, r2, asl #4 + ldr r3, [r0, #CP_OFFSET+12] + ldr tmp1, [istate, #ISTATE_THREAD] + and r1, r3, #255 + ldr r2, [stack, r1, asl #2] + mov r1, #0 + SW_NPC cmp r2, #0 + SW_NPC beq null_ptr_exception_jpc_0 + + ldr tmp2, [r0, #CP_OFFSET+8] .abortentry104: ldr r3, [r2, #4] add r3, r3, tmp2, lsl #2 - ldr tmp2, [r3, #304] - - str tmp2, [istate, #ISTATE_CALLEE] - ldr ip, [tmp2, #76] + ldr tmp2, [r3, #INSTANCEKLASS_VTABLE_OFFSET] +#endif // FAST_BYTECODES + +@ str tmp2, [istate, #ISTATE_CALLEE] + ldr ip, [tmp2, #METHOD_FROM_INTERPRETED] str r1, [tmp1, #THREAD_LAST_JAVA_SP] str ip, [istate, #36] @@ -3472,57 +4222,70 @@ str stack, [tmp1, #THREAD_JAVA_SP] ldr r3, [ip, #0] - adr lr, normal_entry - cmp r3, lr +#ifdef FASTPATH_ENTRY + adr r0, normal_entry + cmp r3, r0 beq fast_normal_entry - adr lr, native_entry - cmp r3, lr +#ifdef NATIVE_ENTRY + adr r0, native_entry + cmp r3, r0 beq fast_native_entry - adr lr, accessor_entry - cmp r3, lr +#endif + adr r0, accessor_entry + cmp r3, r0 beq fast_accessor_entry +#endif normal_dispatch_and_return: mov r0, tmp2 mov r1, ip + mov r2, tmp1 ldr r2, [istate, #ISTATE_THREAD] blx r3 + ASSERT_LOCALS_CACHED + ldr ip, [istate, #ISTATE_THREAD] - ldr r3, [ip, #THREAD_JAVA_SP] + CACHE_JPC + ldr stack, [ip, #THREAD_JAVA_SP] ldr r2, [istate, #ISTATE_STACK_LIMIT] - sub r3, r3, #4 - str r3, [istate, #ISTATE_STACK] + sub stack, stack, #4 ldr r1, [ip, #THREAD_TOP_ZERO_FRAME] add r2, r2, #4 str r2, [ip, #THREAD_JAVA_SP] str r1, [ip, #THREAD_LAST_JAVA_SP] - ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] - ldr jpc, [istate, #ISTATE_BCP] - ldr r3, [r0, #4] DISPATCH_START 3 - ldr locals, [istate, #ISTATE_LOCALS] - ldr constpool, [istate, #ISTATE_CONSTANTS] - DISPATCH_NEXT - DISPATCH_NEXT - add constpool, constpool, #CONST_POOL_OFFSET + ldr r3, [ip, #4] + DISPATCH_NEXT + DISPATCH_NEXT cmp r3, #0 DISPATCH_NEXT - bne invokespecial_exception_fix + bne invoke_exception_fix + DISPATCH_NEXT + CACHE_CP DISPATCH_FINISH - Opcode invokestaticresolved - str stack, [istate, #ISTATE_STACK] + Opcode invokestatic add r0, constpool, r1, lsl #12 - str jpc, [istate, #ISTATE_BCP] - add r0, r2, asl #4 - - ldr tmp2, [r0, #4] + add r0, r0, r2, asl #4 + ldr r2, [r0, #CP_OFFSET] + and r2, r2, #0x00ff0000 + cmp r2, #opc_invokestatic << 16 + blne resolve_invokestatic + FBC mov r0, #opc_invokestaticresolved + FBC b rewrite_bytecode + + FBC Opcode invokestaticresolved + DECACHE_STACK + FBC add r0, constpool, r1, lsl #12 + DECACHE_JPC + FBC add r0, r2, asl #4 + + ldr tmp2, [r0, #CP_OFFSET+4] mov r1, #0 - str tmp2, [istate, #ISTATE_CALLEE] - ldr r3, [tmp2, #76] +@ str tmp2, [istate, #ISTATE_CALLEE] + ldr r3, [tmp2, #METHOD_FROM_INTERPRETED] ldr tmp1, [istate, #ISTATE_THREAD] str r3, [istate, #36] str r1, [tmp1, #THREAD_LAST_JAVA_SP] @@ -3532,35 +4295,78 @@ ldr ip, [istate, #36] ldr r3, [ip, #0] - adr lr, normal_entry - cmp r3, lr +#ifdef FASTPATH_ENTRY + adr r0, normal_entry + cmp r3, r0 beq fast_normal_entry - adr lr, native_entry - cmp r3, lr +#ifdef NATIVE_ENTRY + adr r0, native_entry + cmp r3, r0 beq fast_native_entry - adr lr, accessor_entry - cmp r3, lr +#endif + adr r0, accessor_entry + cmp r3, r0 beq fast_accessor_entry +#endif b normal_dispatch_and_return - Opcode invokespecialresolved - str stack, [istate, #ISTATE_STACK] + ALIGN_CODE +normal_entry: + adrl ip, dispatch_init_adcon + stmfd arm_sp!, {regset, lr} + mov tmp2, r0 + ldm ip, {r0, r1} + + mov tmp_invoke_len, #0 + mov tmp1, r2 + + add r0, r0, ip + add dispatch, r1, r0 + + ldr stack, [tmp1, #THREAD_JAVA_SP] + + ldr r0, [tmp1, #THREAD_STACK_SIZE] + ldr r3, [tmp1, #THREAD_STACK_BASE] + rsb r3, r0, r3 + rsb r3, r3, arm_sp + cmp r3, #32768 + bge fast_normal_entry_with_len + + mov r0, tmp1 + bl _ZN18InterpreterRuntime24throw_StackOverflowErrorEP10JavaThread + + ldmfd arm_sp!, {regset, pc} + + Opcode invokespecial add r0, constpool, r1, lsl #12 - str jpc, [istate, #ISTATE_BCP] - add r0, r2, asl #4 - - ldr r3, [r0, #12] + add r0, r0, r2, asl #4 + ldr r2, [r0, #CP_OFFSET] + and r2, r2, #0x00ff0000 + cmp r2, #opc_invokespecial << 16 + blne resolve_invokespecial + FBC mov r0, #opc_invokespecialresolved + FBC b rewrite_bytecode + + FBC Opcode invokespecialresolved + DECACHE_STACK + FBC add r0, constpool, r1, lsl #12 + DECACHE_JPC + FBC add r0, r2, asl #4 + + ldr r3, [r0, #CP_OFFSET+12] ldr tmp1, [istate, #ISTATE_THREAD] and r3, r3, #255 ldr r2, [stack, r3, asl #2] mov r1, #0 - cmp r2, #0 - beq null_ptr_exception - - ldr tmp2, [r0, #4] - - str tmp2, [istate, #ISTATE_CALLEE] - ldr ip, [tmp2, #76] + SW_NPC cmp r2, #0 + SW_NPC beq null_ptr_exception +.abortentry118: + HW_NPC ldr r3, [r2] @ Only to provoke abort + + ldr tmp2, [r0, #CP_OFFSET+4] + +@ str tmp2, [istate, #ISTATE_CALLEE] + ldr ip, [tmp2, #METHOD_FROM_INTERPRETED] str r1, [tmp1, #THREAD_LAST_JAVA_SP] str ip, [istate, #36] @@ -3568,15 +4374,19 @@ str stack, [tmp1, #THREAD_JAVA_SP] ldr r3, [ip, #0] - adr lr, normal_entry - cmp r3, lr +#ifdef FASTPATH_ENTRY + adr r0, normal_entry + cmp r3, r0 beq fast_normal_entry - adr lr, native_entry - cmp r3, lr +#ifdef NATIVE_ENTRY + adr r0, native_entry + cmp r3, r0 beq fast_native_entry - adr lr, accessor_entry - cmp r3, lr +#endif + adr r0, accessor_entry + cmp r3, r0 beq fast_accessor_entry +#endif b normal_dispatch_and_return ALIGN_CODE @@ -3600,7 +4410,7 @@ ldr r3, [r1, r3, lsl #4]! @ r1 = cache, r3 = flags ldr ip, [r2, #THREAD_JAVA_SP] @ ip == stack and r3, r3, #0x00ff0000 - cmp r3, #180 << 16 + cmp r3, #opc_getfield << 16 ldr r3, [ip, #0] bne normal_entry @@ -3616,378 +4426,34 @@ str r0, [ip, #0] bx lr - ALIGN_CODE -normal_entry: - adrl ip, dispatch_init_adcon - stmfd sp!, {regset, lr} - mov tmp2, r0 - ldmia ip, {r0, r1} - sub sp, sp, #220 - - mov istate, #ISTATE_THREAD - add dispatch, ip, r3 - - add r0, r0, ip - add dispatch, r1, r0 - - ldrh r1, [tmp2, #40] - ldrh r3, [tmp2, #42] - mov tmp1, r2 - - rsb tmp_xxx, r3, r1 - ldr stack, [tmp1, #THREAD_JAVA_SP] - movs tmp_xxx, tmp_xxx, asr #1 - mov r0, #0 - mov ip, #0 - strcs r0, [stack, #-4]! -.zero_locals: - subs tmp_xxx, tmp_xxx, #1 - stmgedb stack!, {r0, ip} - bgt .zero_locals - -@ r11 = thread -@ r10 = method - ldrh r2, [r10, #38] - mvn tmp_vvv, #0x540 @ form 0xCAFEBABF - bic tmp_vvv, tmp_vvv, #0x14000 - bic tmp_vvv, tmp_vvv, #0x35000000 - str istate, [stack, #-76 + ISTATE_SAVED_ISTATE] - sub istate, stack, #76 @ istate == istate - mov r7, istate @ monitor_base == istate - sub r5, istate, r2, lsl #2 - str r5, [tmp1, #THREAD_JAVA_SP] @ drop stack now - sub r5, r5, #4 @ stack limit = istate - stackwords - 4 - mov r3, istate - stmdb stack, {r0, r3, r5, r7, istate, tmp_vvv, ip} @ - - str ip, [istate, #ISTATE_CALLEE] - str ip, [istate, #ISTATE_MDX] - str ip, [istate, #ISTATE_PREV_LINK] - - sub locals, stack, #4 - add locals, locals, r1, lsl #2 @ locals == r7 - - ldr jpc, [r10, #8] @ jpc == r5 - ldr constpool, [r10, #12] @ - - sub stack, istate, #ISTATE_BCP @ stack == r4 - str stack, [istate, #ISTATE_STACK] - - add jpc, jpc, #48 - - ldr constpool, [constpool, #12] - - str tmp1, [istate, #ISTATE_THREAD] - stmib istate, {jpc, locals, constpool, r10} - - add constpool, constpool, #CONST_POOL_OFFSET - - str stack, [istate, #ISTATE_STACK] - - add tmp2, istate, #72 - - ldr r3, [tmp1, #THREAD_TOP_ZERO_FRAME] - str r3, [istate, #72] @ Fill in prev_link - ldr r0, [tmp1, #THREAD_STACK_SIZE] - ldr r3, [tmp1, #THREAD_STACK_BASE] - ldr r2, [tmp1, #THREAD_JAVA_SP] - ldr r1, [tmp1, #THREAD_JAVA_STACK_BASE] - rsb r3, r0, r3 - DISPATCH_START 0 - rsb r2, r1, r2 - rsb r3, r3, sp - DISPATCH_NEXT - cmp r2, #4096 - cmpge r3, #32768 - DISPATCH_NEXT - str tmp2, [tmp1, #THREAD_TOP_ZERO_FRAME] - str tmp2, [tmp1, #THREAD_LAST_JAVA_SP] - DISPATCH_NEXT - blt .throw_stack_overflow - DISPATCH_FINISH - +#ifdef NATIVE_ENTRY ALIGN_CODE native_entry: adrl ip, dispatch_init_adcon - stmfd sp!, {r3, r4, r5, r7, r9, r10, r11, lr} -@--- - ldmia ip, {dispatch, r7} + stmfd arm_sp!, {r3, r4, r5, r6, r7, r8, r9, r10, r11, lr} + + ldm ip, {dispatch, r7} mov r11, r0 - ldrh r1, [r11, #42] add dispatch, dispatch, ip - ldr r4, [r2, #THREAD_JAVA_SP] add dispatch, dispatch, r7 - ldr ip, [r2, #THREAD_TOP_ZERO_FRAME] - mov r0, #0 - mvn r10, #0x540 @ form 0xCAFEBABF in r10 - bic r10, r10, #0x14000 - bic r10, r10, #0x35000000 - sub r9, r4, #76 - mov r7, r9 - str r9, [r2, #THREAD_JAVA_SP] @ drop stack - sub r5, r9, #4 @ stack limit = r9 - 4 - mov r3, r9 - stmdb r4, {r0, r3, r5, r7, r9, r10, ip} - str r0, [r9, #ISTATE_CALLEE] - str r0, [r9, #ISTATE_PREV_LINK] - str r0, [r9, #ISTATE_MSG] - str r0, [r9, #ISTATE_MDX] - sub r7, r4, #4 - add r7, r7, r1, lsl #2 - mov r5, #0 - ldr r10, [r11, #12] - ldr r10, [r10, #12] - stmia r9, {r2, r5, r7, r10, r11} - add r0, r9, #72 - mov r9, r2 -@--- -.LPIC18_native_entry: - ldr r2, [r9, #THREAD_STACK_SIZE] - ldr r3, [r9, #THREAD_STACK_BASE] - rsb r3, r2, r3 - rsb r3, r3, sp - cmp r3, #4096 - str r0, [r9, #THREAD_TOP_ZERO_FRAME] - blt .native_entry_throw_stack_overflow - ldr r5, [r11, #84] - cmp r5, #0 - bne .native_entry_got_handleraddr - str r0, [r9, #THREAD_LAST_JAVA_SP] - mov r0, r9 - mov r1, r11 - bl _ZN18InterpreterRuntime19prepare_native_callEP10JavaThreadP13methodOopDesc - ldr r1, [r9, #THREAD_PENDING_EXC] - str r5, [r9, #THREAD_LAST_JAVA_SP] - cmp r1, #0 - bne .native_entry_exception - ldr r5, [r11, #84] -.native_entry_got_handleraddr: - ldr r2, [dispatch, #InterpreterRuntime_slow_signature_handler_Address-XXX] - cmp r5, r2 - bne .native_entry_get_handler - ldr r3, [r9, #THREAD_TOP_ZERO_FRAME] - mov r2, #0 - mov r0, r9 - str r3, [r9, #THREAD_LAST_JAVA_SP] - mov r3, r2 - mov r1, r11 - bl _ZN18InterpreterRuntime22slow_signature_handlerEP10JavaThreadP13methodOopDescPiS4_ - ldr r1, [r9, #THREAD_PENDING_EXC] - mov r3, #0 - cmp r1, #0 - str r3, [r9, #THREAD_LAST_JAVA_SP] - mov r5, r0 - bne .native_entry_exception -.native_entry_get_handler: - - sub ip, r7, r4 - mov ip, ip, asr #2 - add lr, ip, #4 - bic lr, lr, #1 - - add r3, r4, #ISTATE_OOP_TEMP-76 - - mov r4, sp - sub sp, sp, #16 - sub sp, sp, lr, lsl #2 - mov lr, sp - - add r1, r5, #24 - - add r2, r9, #THREAD_JNI_ENVIRONMENT - str r2, [lr], #4 - add r1, r1, #4 - - ldr r2, [r11, #24] - tst r2, #8 - beq .do_copy_args - - ldr r2, [r11, #12] - ldr r2, [r2, #16] - ldr r2, [r2, #60] - str r2, [r3] - - str r3, [lr], #4 - add r1, r1, #4 - -.do_copy_args: - cmp ip, #0 - blt .no_args - -.copy_args: - ldr r0, [r1], #4 - ldrh r3, [r0, #6] - cmp r3, #FFI_TYPE_DOUBLE - cmpne r3, #FFI_TYPE_SINT64 - beq .copy_long - - cmp r3, #FFI_TYPE_POINTER - beq .copy_ptr - - ldr r2, [r7], #-4 - str r2, [lr], #4 - subs ip, ip, #1 - bge .copy_args - b .no_args - -.copy_long: - tst lr, #4 - addne lr, lr, #4 - ldmda r7!, {r2, r3} - stmia lr!, {r2, r3} - subs ip, ip, #2 - bge .copy_args - b .no_args - -.copy_ptr: - ldr r2, [r7], #-4 - cmp r2, #0 - addne r2, r7, #4 - str r2, [lr], #4 - subs ip, ip, #1 - bge .copy_args - -.no_args: - ldr r0, [r9, #THREAD_TOP_ZERO_FRAME] - str r0, [r9, #THREAD_LAST_JAVA_SP] - - mov r2, #_thread_in_native - str r2, [r9, #THREAD_STATE] - - ldr ip, [r11, #80] - ldrh r11, [r11, #42] - ldmia sp!, {r0, r1, r2, r3} - blx ip - - mov sp, r4 - - mov r3, #_thread_in_native_trans - str r3, [r9, #THREAD_STATE] - -.L206_native_entry: - ldr r3, [dispatch, #SafePointSynchronize_state_Address-XXX] - ldr r3, [r3, #0] - cmp r3, #0 - ldreq r3, [r9, #THREAD_SUSPEND_FLAGS] - cmpeq r3, #0 - bne .native_entry_do_special - -.native_entry_do_return: - mov r3, #_thread_in_Java - mov r2, #0 - str r3, [r9, #THREAD_STATE] - str r2, [r9, #THREAD_LAST_JAVA_SP] - - add r2, r5, #24 - ldr r3, [r5, #4] - - ldr r5, [r9, #THREAD_TOP_ZERO_FRAME] - ldr ip, [r5], #4 - str ip, [r9, #THREAD_TOP_ZERO_FRAME] - - add r5, r5, r11, lsl #2 - - ldr ip, [r2, r3, asl #2] - ldrh r2, [ip, #6] - - cmp r2, #FFI_TYPE_POINTER - beq .native_return_obj - - ldr ip, [r9, #THREAD_ACTIVE_HANDLES] - mov r3, #0 @ ECN: OK, not an obj, save to clear handles - str r3, [ip, #128] - - cmp r2, #FFI_TYPE_VOID - beq .native_return_void - cmp r2, #FFI_TYPE_FLOAT - cmpne r2, #FFI_TYPE_SINT32 - beq .native_return_w - cmp r2, #FFI_TYPE_DOUBLE - cmpne r2, #FFI_TYPE_SINT64 - beq .native_return_dw - - cmp r2, #FFI_TYPE_UINT16 - beq .native_return_char - cmp r2, #FFI_TYPE_SINT16 - beq .native_return_short - cmp r2, #FFI_TYPE_BOOL - beq .native_return_bool - cmp r2, #FFI_TYPE_SINT8 - beq .native_return_byte - - str r0, [r0, -r0] - -.native_return_obj: - cmp r0, #0 - ldrne r0, [r0] - str r0, [r5, #-4]! - str r5, [r9, #THREAD_JAVA_SP] - ldr r2, [r9, #THREAD_ACTIVE_HANDLES] - mov r3, #0 @ ECN: Now that the object is safe on the Java stack - str r3, [r2, #128] @ stack, with the Thread SP updated, clear the active_handles. - ldmfd sp!, {r3, r4, r5, r7, r9, r10, r11, pc} -.native_return_short: - mov r0, r0, lsl #16 - mov r0, r0, asr #16 -.native_return_w: - str r0, [r5, #-4]! -.native_return_void: - str r5, [r9, #THREAD_JAVA_SP] - ldmfd sp!, {r3, r4, r5, r7, r9, r10, r11, pc} -.native_return_dw: - stmdb r5!, {r0, r1} - str r5, [r9, #THREAD_JAVA_SP] - ldmfd sp!, {r3, r4, r5, r7, r9, r10, r11, pc} -.native_return_byte: - mov r0, r0, lsl #24 - mov r0, r0, asr #24 - str r0, [r5, #-4]! - str r5, [r9, #THREAD_JAVA_SP] - ldmfd sp!, {r3, r4, r5, r7, r9, r10, r11, pc} -.native_return_char: - mov r0, r0, lsl #16 - mov r0, r0, lsr #16 - str r0, [r5, #-4]! - str r5, [r9, #THREAD_JAVA_SP] - ldmfd sp!, {r3, r4, r5, r7, r9, r10, r11, pc} -.native_return_bool: - ands r0, r0, #255 - movne r0, #1 - str r0, [r5, #-4]! - str r5, [r9, #THREAD_JAVA_SP] - ldmfd sp!, {r3, r4, r5, r7, r9, r10, r11, pc} - -.native_entry_throw_stack_overflow: - str r0, [r9, #THREAD_LAST_JAVA_SP] - mov r0, r9 - bl _ZN18InterpreterRuntime24throw_StackOverflowErrorEP10JavaThread - mov r3, #0 - ldr r1, [r9, #THREAD_PENDING_EXC] - str r3, [r9, #THREAD_LAST_JAVA_SP] -.native_entry_exception: - ldr r5, [r9, #THREAD_TOP_ZERO_FRAME] - ldr r3, [r5], #4 - str r3, [r9, #THREAD_TOP_ZERO_FRAME] - - ldrh r3, [r11, #42] - add r5, r5, r3, lsl #2 - str r5, [r9, #THREAD_JAVA_SP] - - ldmfd sp!, {r3, r4, r5, r7, r9, r10, r11, pc} -.native_entry_do_special: - stmdb sp!, {r0, r1} - mov r0, r9 - bl _ZN10JavaThread40check_special_condition_for_native_transEPS_ - ldmia sp!, {r0, r1} - b .native_entry_do_return - + + mov istate, #0 + + b fast_native_entry_with_args +#endif + +@ tmp1 = thread +@ tmp2 == method +@ stack == THREAD_JAVA_SP (=> FULL stack) ALIGN_CODE fast_normal_entry: - ldrh r0, [tmp2, #40] + mov tmp_invoke_len, #3 +fast_normal_entry_with_len: + ldrh r0, [tmp2, #METHOD_MAXLOCALS] mov r1, #0 - ldrh r3, [tmp2, #42] + ldrh r3, [tmp2, #METHOD_SIZEOFPARAMETERS] mvn ip, #0x540 @ form 0xCAFEBABF in ip - ldrh r2, [tmp2, #38] + ldrh r2, [tmp2, #METHOD_MAXSTACK] bic ip, ip, #0x35000000 sub r7, r0, r3 subs r5, r7, #2 @@ -4001,43 +4467,56 @@ subs r5, r5, #2 bcs 1b 3: - ldr lr, [tmp1, #THREAD_TOP_ZERO_FRAME] - str istate, [stack, #-76 + ISTATE_SAVED_ISTATE] - sub istate, stack, #76 @ istate == istate + ldr r3, [tmp1, #THREAD_TOP_ZERO_FRAME] + sub istate, stack, #FRAME_SIZE sub r2, istate, r2, lsl #2 - str r1, [stack, #-76 + ISTATE_MDX] - mov r7, istate @ monitor_base == istate + str tmp_invoke_len, [istate, #ISTATE_ADVANCE_PC] str r2, [tmp1, #THREAD_JAVA_SP] sub r5, r2, #4 @ stack limit = istate - stackwords - 4 - mov r3, istate - stmdb stack, {r1, r3, r5, r7, istate, ip, lr} @ + str r3, [istate, #ISTATE_NEXT_FRAME] + str ip, [istate, #ISTATE_CAFEBABF] +@ str istate, [istate, #ISTATE_SELF_LINK] + str istate, [istate, #ISTATE_MONITOR_BASE] + str r5, [istate, #ISTATE_STACK_LIMIT] + str istate, [istate, #ISTATE_STACK_BASE] sub locals, stack, #4 - add locals, locals, r0, lsl #2 @ locals == r7 + str r1, [istate, #ISTATE_OOP_TEMP] + add locals, locals, r0, lsl #2 ldr r3, [tmp1, #THREAD_JAVA_STACK_BASE] - sub stack, istate, #4 @ stack == r4 - ldr jpc, [tmp2, #8] - ldr constpool, [tmp2, #12] @ - str stack, [istate, #ISTATE_STACK] - add ip, istate, #72 + sub stack, istate, #4 + ldr jpc, [tmp2, #METHOD_CONSTMETHOD] + ldr constpool, [tmp2, #METHOD_CONSTANTS] + add ip, istate, #ISTATE_NEXT_FRAME DISPATCH_START 48 - mov lr, #0 @ ECN: FIXME - r1 already 0 - ldr constpool, [constpool, #12] + ldr constpool, [constpool, #CONSTANTPOOL_CACHE] str ip, [tmp1, #THREAD_TOP_ZERO_FRAME] rsb r2, r3, r2 str ip, [tmp1, #THREAD_LAST_JAVA_SP] DISPATCH_NEXT str tmp1, [istate, #ISTATE_THREAD] - stmib istate, {jpc, locals, constpool, r10} + str locals, [istate, #ISTATE_LOCALS] + str constpool, [istate, #ISTATE_CONSTANTS] DISPATCH_NEXT cmp r2, #4096 - add constpool, constpool, #CONST_POOL_OFFSET - str lr, [istate, #ISTATE_PREV_LINK] - blt .throw_stack_overflow - DISPATCH_NEXT - str lr, [istate, #ISTATE_CALLEE] + blt 1f + DISPATCH_NEXT + DISPATCH_NEXT + str r10, [istate, #ISTATE_METHOD] +@ mov lr, #0 +@ str lr, [istate, #ISTATE_PREV_LINK] +@ str lr, [istate, #ISTATE_CALLEE] DISPATCH_FINISH +1: + str r10, [istate, #ISTATE_METHOD] + DECACHE_JPC + ldr stack, [istate, #ISTATE_STACK_BASE] + sub stack, stack, #4 + DECACHE_STACK + b .throw_stack_overflow handle_return: +@ CHECK_CONSTPOOL +@ CHECK_BACKTRACE ldr tmp2, [istate, #ISTATE_MONITOR_BASE] @ tmp2 = base @@ -4047,8 +4526,11 @@ cmp tmp1, tmp2 blcc return_check_monitors +@ CHECK_CONSTPOOL +@ CHECK_BACKTRACE + mov r3, #0 - ldrb ip, [jpc, #0] + ldrb lr, [jpc, #0] ldr r2, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] str r3, [tmp_xxx, #THREAD_LAST_JAVA_SP] @@ -4058,57 +4540,76 @@ add r1, r2, #4 str r3, [tmp_xxx, #THREAD_TOP_ZERO_FRAME] + ldr ip, [istate, #ISTATE_ADVANCE_PC] + ldr istate, [istate, #ISTATE_NEXT_FRAME] + add r1, r1, r0, lsl #2 - cmp ip, #opc_lreturn - cmpne ip, #opc_dreturn + cmp lr, #opc_lreturn + cmpne lr, #opc_dreturn ldreq r0, [stack, #8] streq r0, [r1, #-4]! - cmpne ip, #opc_ireturn - cmpne ip, #opc_freturn - cmpne ip, #opc_areturn + cmpne lr, #opc_ireturn + cmpne lr, #opc_freturn + cmpne lr, #opc_areturn ldreq r0, [stack, #4] streq r0, [r1, #-4]! - ldr istate, [istate, #ISTATE_SAVED_ISTATE] - str r1, [tmp_xxx, #THREAD_JAVA_SP] - cmp istate, #ISTATE_THREAD - - addeq sp, sp, #220 - ldmeqfd sp!, {regset, pc} - -fast_handle_return: - ldr ip, [istate, #ISTATE_THREAD] - ldr r3, [ip, #THREAD_JAVA_SP] + cmp ip, #0 + + ldmeqfd arm_sp!, {regset, pc} + + ldr lr, [istate, #-ISTATE_NEXT_FRAME+ISTATE_THREAD]! + CACHE_JPC + ldr stack, [lr, #THREAD_JAVA_SP] ldr r2, [istate, #ISTATE_STACK_LIMIT] - sub r3, r3, #4 - str r3, [istate, #ISTATE_STACK] - - ldr r1, [ip, #THREAD_TOP_ZERO_FRAME] + sub stack, stack, #4 + + ldr r1, [lr, #THREAD_TOP_ZERO_FRAME] add r2, r2, #4 - str r2, [ip, #THREAD_JAVA_SP] - str r1, [ip, #THREAD_LAST_JAVA_SP] - ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] - ldr jpc, [istate, #ISTATE_BCP] - ldr r3, [r0, #THREAD_PENDING_EXC] - DISPATCH_START 3 - ldr constpool, [istate, #ISTATE_CONSTANTS] - ldr locals, [istate, #ISTATE_LOCALS] + str r2, [lr, #THREAD_JAVA_SP] + str r1, [lr, #THREAD_LAST_JAVA_SP] + ldr r3, [lr, #THREAD_PENDING_EXC] + DISPATCH_START_REG ip + CACHE_LOCALS DISPATCH_NEXT - add constpool, constpool, #CONST_POOL_OFFSET DISPATCH_NEXT cmp r3, #0 DISPATCH_NEXT bne return_exception + DISPATCH_NEXT + CACHE_CP + DISPATCH_FINISH + +@ ip = PC ADVANCE +fast_handle_return: + ldr lr, [istate, #-ISTATE_NEXT_FRAME+ISTATE_THREAD]! + CACHE_JPC + ldr stack, [lr, #THREAD_JAVA_SP] + ldr r2, [istate, #ISTATE_STACK_LIMIT] + sub stack, stack, #4 + + ldr r1, [lr, #THREAD_TOP_ZERO_FRAME] + add r2, r2, #4 + str r2, [lr, #THREAD_JAVA_SP] + str r1, [lr, #THREAD_LAST_JAVA_SP] + ldr r3, [lr, #THREAD_PENDING_EXC] + DISPATCH_START_REG ip + CACHE_LOCALS + DISPATCH_NEXT + DISPATCH_NEXT + cmp r3, #0 + DISPATCH_NEXT + bne return_exception + DISPATCH_NEXT + CACHE_CP DISPATCH_FINISH normal_return: - add sp, sp, #220 str stack, [tmp_xxx, #THREAD_JAVA_SP] - ldmfd sp!, {regset, pc} + ldmfd arm_sp!, {regset, pc} return_check_monitors: ldr r2, [istate, #ISTATE_METHOD] @@ -4125,13 +4626,17 @@ cmp tmp1, tmp2 bcc 1b +#define RETURN_STACKSIZE SIZEOF_HANDLEMARK + .return_unlock: tst r0, #1<<5 bxeq lr - ldr tmp1, [tmp2, #4] @ base->obj == NULL - cmp tmp1, #0 - beq return_throw_illegal_monitor_state + ldr tmp1, [tmp2, #4] @ base->obj == NULL + SW_NPC cmp tmp1, #0 + SW_NPC beq return_throw_illegal_monitor_state +.abortentry119: + HW_NPC ldr ip, [tmp1] @ Only to provoke abort ldr r0, [tmp2, #0] @ r0 = header mov r3, #0 @@ -4142,38 +4647,43 @@ mov tmp_vvv, lr mov r1, tmp1 mov r2, tmp2 - bl _ZN6Atomic11cmpxchg_ptrEPvPVvS0_ + bl cmpxchg_ptr cmp tmp2, r0 bxeq tmp_vvv str tmp1, [tmp2, #4] - add r0, sp, #144 + sub arm_sp, arm_sp, #RETURN_STACKSIZE + mov r0, arm_sp mov r1, tmp_xxx bl _ZN10HandleMark10initializeEP6Thread mov r1, tmp2 mov r0, tmp_xxx - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] + DECACHE_JPC + DECACHE_STACK bl _ZN18InterpreterRuntime11monitorexitEP10JavaThreadP15BasicObjectLock - ldr stack, [istate, #ISTATE_STACK] - ldr jpc, [istate, #ISTATE_BCP] - add r0, sp, #144 + ASSERT_STACK_CACHED + CACHE_JPC + mov r0, arm_sp bl _ZN10HandleMarkD1Ev + add arm_sp, arm_sp, #RETURN_STACKSIZE ldr r3, [tmp_xxx, #THREAD_PENDING_EXC] cmp r3, #0 bne handle_exception - bx tmp_vvv + mov lr, tmp_vvv + bx lr return_throw_illegal_monitor_state: - add r0, sp, #144 + sub arm_sp, arm_sp, #RETURN_STACKSIZE + mov r0, arm_sp mov r1, tmp_xxx bl _ZN10HandleMark10initializeEP6Thread - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] + DECACHE_JPC + DECACHE_STACK mov r0, tmp_xxx bl _ZN18InterpreterRuntime37throw_illegal_monitor_state_exceptionEP10JavaThread - add r0, sp, #144 + mov r0, arm_sp bl _ZN10HandleMarkD1Ev + add arm_sp, arm_sp, #RETURN_STACKSIZE b handle_exception_with_bcp @ ---------------------------------------------------------------------------------------- @@ -4194,10 +4704,10 @@ mov r3, r3, asl #2 add r1, r1, r3 str r1, [ip, #THREAD_JAVA_SP] - ldr istate, [istate, #ISTATE_SAVED_ISTATE] - cmp istate, #ISTATE_THREAD - addeq sp, sp, #220 - ldmeqfd sp!, {regset, pc} + ldr ip, [istate, #ISTATE_ADVANCE_PC] + ldr istate, [istate, #ISTATE_NEXT_FRAME] + cmp ip, #0 + ldmeqfd arm_sp!, {regset, pc} b fast_handle_return handle_exception_do_not_unlock: @@ -4205,51 +4715,71 @@ strb r3, [r2, #THREAD_DO_NOT_UNLOCK] b handle_exception +abstractmethod_exception: + mov r0, #VMSYMBOLS_AbstractMethodError + b raise_exception +incompatibleclass_exception: + mov r0, #VMSYMBOLS_IncompatibleClassChangeError raise_exception: adr r1, null_str raise_exception_with_msg: - str r1, [sp] + str r1, [arm_sp] ldr r3, [dispatch, #VmSymbols_symbols_Address-XXX] ldr r3, [r3, r0, lsl #2] - ldr tmp1, [istate, #ISTATE_THREAD] - str jpc, [istate, #ISTATE_BCP] - str stack, [istate, #ISTATE_STACK] + ldr r0, [istate, #ISTATE_THREAD] + DECACHE_JPC + DECACHE_STACK mov ip, #_thread_in_vm - str ip, [tmp1, #THREAD_STATE] + str ip, [r0, #THREAD_STATE] mov r2, #99 - ldr r0, [istate, #ISTATE_THREAD] adrl r1, bytecode_interpreter_str bl _ZN10Exceptions10_throw_msgEP6ThreadPKciP13symbolOopDescS3_ - mov r0, sp - str tmp1, [sp] - bl _ZN18ThreadInVMfromJavaD1Ev + add r0, istate, #ISTATE_THREAD + bl ThreadInVMfromJavaD b handle_exception_with_bcp null_str: .byte 0 ALIGN_WORD -invokespecial_exception_fix: -invokestatic_exception_fix: -invokevirtual_exception_fix: +#define EXCEPTION_HANDLEMARK 0 +#define EXCEPTION_THREAD EXCEPTION_HANDLEMARK + SIZEOF_HANDLEMARK +#define EXCEPTION_EXCEPTION EXCEPTION_THREAD + 4 +#define EXCEPTION_EXCEPTION2 EXCEPTION_EXCEPTION + 4 +#define EXCEPTION_MONITORBASE EXCEPTION_EXCEPTION2 + 4 +#define EXCEPTION_TMP1 EXCEPTION_MONITORBASE + 4 +#define EXCEPTION_HANDLEMARK2 EXCEPTION_TMP1 + 4 +#define EXCEPTION_HANDLE EXCEPTION_HANDLEMARK2 + SIZEOF_HANDLEMARK +#define EXCEPTION_HANDLE2 EXCEPTION_HANDLE + 4 +#define EXCEPTION_HANDLE3 EXCEPTION_HANDLE2 + 4 + +#define EXCEPTION_STACKSIZE EXCEPTION_HANDLE3 + 4 + +#define except_sp r13 + +invokeinterface_exception_fix: + sub jpc, jpc, #2 +invoke_exception_fix: +invokenative_exception: return_exception: sub jpc, jpc, #3 -invokespecial_exception: -invokestatic_exception: -invokevirtual_exception: +resolve_exception: putfield_exception: getfield_exception: handle_exception: - str jpc, [istate, #ISTATE_BCP] +@ jpc = Exception PC +@ stack = garbage +@ locals = garbage +@ constpool = garbage + DECACHE_JPC handle_exception_with_bcp: + sub except_sp, except_sp, #EXCEPTION_STACKSIZE ldr stack, [istate, #ISTATE_STACK_BASE] sub stack, stack, #4 - str stack, [istate, #ISTATE_STACK] - add r1, sp, #168 - str r1, [sp, #36] + DECACHE_STACK ldr r0, [istate, #ISTATE_THREAD] handle_exception_1: ldr sl, [r0, #4] - str r0, [sp, #124] + str r0, [except_sp, #EXCEPTION_THREAD] cmp sl, #0 moveq tmp_yyy, sl beq .handle_exception_3 @@ -4270,7 +4800,7 @@ ldr r0, [istate, #ISTATE_THREAD] .handle_exception_3: mov r1, r0 - ldr r0, [sp, #36] + add r0, except_sp, #EXCEPTION_HANDLEMARK bl _ZN10HandleMark10initializeEP6Thread ldr r0, [istate, #ISTATE_THREAD] bl _ZN12ThreadShadow23clear_pending_exceptionEv @@ -4279,18 +4809,18 @@ cmp tmp_yyy, #0 sub stack, r1, #4 moveq r1, tmp_yyy - str stack, [istate, #ISTATE_STACK] + DECACHE_STACK ldrne r1, [tmp_yyy, #0] bl _ZN18InterpreterRuntime31exception_handler_for_exceptionEP10JavaThreadP7oopDesc - ldr stack, [istate, #ISTATE_STACK] + ASSERT_STACK_CACHED mov sl, r0 ldr r0, [istate, #ISTATE_THREAD] ldr r3, [r0, #THREAD_PENDING_EXC] cmp r3, #0 beq .handle_exception_5 - ldr r0, [sp, #36] + add r0, except_sp, #EXCEPTION_HANDLEMARK bl _ZN10HandleMarkD1Ev - ldr r1, [sp, #124] + ldr r1, [except_sp, #EXCEPTION_THREAD] ldr tmp_yyy, [r1, #THREAD_LAST_HANDLE_MARK] ldr r0, [tmp_yyy, #8] ldr sl, [tmp_yyy, #4] @@ -4341,13 +4871,13 @@ str r0, [stack, #0] sub stack, stack, #4 ldr r3, [istate, #ISTATE_METHOD] - ldr r0, [sp, #36] + add r0, except_sp, #EXCEPTION_HANDLEMARK ldr r2, [r3, #8] add r2, r2, #48 add ip, r2, sl str ip, [istate, #ISTATE_BCP] bl _ZN10HandleMarkD1Ev - ldr r1, [sp, #124] + ldr r1, [except_sp, #EXCEPTION_THREAD] ldr tmp_yyy, [r1, #THREAD_LAST_HANDLE_MARK] ldr r0, [tmp_yyy, #8] ldr sl, [tmp_yyy, #4] @@ -4362,6 +4892,7 @@ str r3, [sl, #8] ldr r2, [tmp_yyy, #16] str r2, [sl, #12] + add except_sp, except_sp, #EXCEPTION_STACKSIZE b do_execute_java_bytecodes_restore_locals_and_jpc .handle_exception_9: cmp r1, #0 @@ -4373,7 +4904,7 @@ ldr r0, [istate, #ISTATE_THREAD] ldr tmp_yyy, [r0, #4] cmp tmp_yyy, #0 - streq tmp_yyy, [sp, #48] + streq tmp_yyy, [except_sp, #EXCEPTION_EXCEPTION] beq .handle_exception_11 ldr r0, [r0, #THREAD_HANDLE_AREA] ldr r1, [r0, #8] @@ -4389,19 +4920,19 @@ .handle_exception_10: str tmp_yyy, [r3, #0] ldr r0, [istate, #ISTATE_THREAD] - str r3, [sp, #48] + str r3, [except_sp, #EXCEPTION_EXCEPTION] .handle_exception_11: bl _ZN12ThreadShadow23clear_pending_exceptionEv mov r1, #0 ldr r0, [istate, #ISTATE_THREAD] - str r1, [sp, #44] + str r1, [except_sp, #EXCEPTION_EXCEPTION2] ldrb r3, [r0, #THREAD_DO_NOT_UNLOCK] @ zero_extendqisi2 cmp r3, r1 beq .handle_exception_15 strb r1, [r0, #THREAD_DO_NOT_UNLOCK] ldr r0, [istate, #ISTATE_THREAD] .handle_exception_12: - ldr r1, [sp, #48] + ldr r1, [except_sp, #EXCEPTION_EXCEPTION] cmp r1, #0 movne r2, r1 ldrne r1, [r2, #0] @@ -4412,7 +4943,7 @@ mov r3, #0 ldr r2, [istate, #ISTATE_BCP] ldrb r2, [r2, #0] @ zero_extendqisi2 - str stack, [istate, #ISTATE_STACK] + DECACHE_STACK str r2, [istate, #ISTATE_CALLEE] ldr lr, [istate, #ISTATE_THREAD] ldr r1, [lr, #THREAD_TOP_ZERO_FRAME] @@ -4423,12 +4954,12 @@ str r3, [lr, #THREAD_TOP_ZERO_FRAME] ldr r1, [istate, #ISTATE_METHOD] ldrh r3, [r1, #40] - ldr r0, [sp, #36] + add r0, except_sp, #EXCEPTION_HANDLEMARK mov r3, r3, asl #2 add r2, r2, r3 str r2, [lr, #THREAD_JAVA_SP] bl _ZN10HandleMarkD1Ev - ldr r0, [sp, #124] + ldr r0, [except_sp, #EXCEPTION_THREAD] ldr tmp_yyy, [r0, #THREAD_LAST_HANDLE_MARK] ldr r0, [tmp_yyy, #8] ldr sl, [tmp_yyy, #4] @@ -4443,29 +4974,27 @@ str r3, [sl, #8] ldr r2, [tmp_yyy, #16] str r2, [sl, #12] - ldr istate, [istate, #ISTATE_SAVED_ISTATE] - cmp istate, #ISTATE_THREAD + add except_sp, except_sp, #EXCEPTION_STACKSIZE + ldr ip, [istate, #ISTATE_ADVANCE_PC] + ldr istate, [istate, #ISTATE_NEXT_FRAME] + cmp ip, #0 bne fast_handle_return - add sp, sp, #220 - ldmfd sp!, {regset, pc} + ldmfd arm_sp!, {regset, pc} .handle_exception_15: ldr ip, [istate, #ISTATE_MONITOR_BASE] ldr r2, [istate, #ISTATE_METHOD] - str ip, [sp, #92] + str ip, [except_sp, #EXCEPTION_MONITORBASE] ldr tmp_vvv, [istate, #ISTATE_STACK_BASE] ldr r3, [r2, #24] mov r3, r3, lsr #5 ands r3, r3, #1 subne ip, ip, #8 - strne ip, [sp, #92] - ldr lr, [sp, #92] - str r3, [sp, #96] + strne ip, [except_sp, #EXCEPTION_MONITORBASE] + ldr lr, [except_sp, #EXCEPTION_MONITORBASE] + str r3, [except_sp, #EXCEPTION_TMP1] cmp tmp_vvv, lr bcs .handle_exception_21 - add r0, sp, #144 - add r1, sp, #212 - str r0, [sp, #28] - str r1, [sp, #24] + .p2align 3 .handle_exception_16: ldr tmp_yyy, [tmp_vvv, #4] @@ -4493,33 +5022,33 @@ cmp tmp_vvv, sl beq .handle_exception_19 str tmp_yyy, [tmp_vvv, #4] - ldr r0, [sp, #28] + add r0, except_sp, #EXCEPTION_HANDLEMARK2 ldr r1, [istate, #ISTATE_THREAD] bl _ZN10HandleMark10initializeEP6Thread mov r1, tmp_vvv ldr r0, [istate, #ISTATE_THREAD] - str stack, [istate, #ISTATE_STACK] + DECACHE_STACK bl _ZN18InterpreterRuntime11monitorexitEP10JavaThreadP15BasicObjectLock - ldr stack, [istate, #ISTATE_STACK] - ldr r0, [sp, #28] + ASSERT_STACK_CACHED + add r0, except_sp, #EXCEPTION_HANDLEMARK2 bl _ZN10HandleMarkD1Ev .handle_exception_19: - ldr r1, [sp, #44] + ldr r1, [except_sp, #EXCEPTION_EXCEPTION2] cmp r1, #0 beq .handle_exception_27 ldr r3, [r1, #0] cmp r3, #0 beq .handle_exception_27 .handle_exception_20: - ldr r3, [sp, #92] + ldr r3, [except_sp, #EXCEPTION_MONITORBASE] add tmp_vvv, tmp_vvv, #8 cmp tmp_vvv, r3 bcc .handle_exception_16 .handle_exception_21: - ldr ip, [sp, #96] + ldr ip, [except_sp, #EXCEPTION_TMP1] cmp ip, #0 beq .handle_exception_23 - ldr r0, [sp, #92] + ldr r0, [except_sp, #EXCEPTION_MONITORBASE] ldr sl, [r0, #4] cmp sl, #0 beq .handle_exception_26 @@ -4530,33 +5059,33 @@ str r3, [ip, #4] beq .handle_exception_23 mov r1, sl - ldr r2, [sp, #92] - bl _ZN6Atomic11cmpxchg_ptrEPvPVvS0_ - ldr r1, [sp, #92] + ldr r2, [except_sp, #EXCEPTION_MONITORBASE] + bl cmpxchg_ptr + ldr r1, [except_sp, #EXCEPTION_MONITORBASE] cmp r1, r0 beq .handle_exception_22 - ldr r3, [sp, #92] - add tmp_yyy, sp, #144 + ldr r3, [except_sp, #EXCEPTION_MONITORBASE] + add tmp_yyy, except_sp, #EXCEPTION_HANDLEMARK2 mov r0, tmp_yyy str sl, [r3, #4] ldr r1, [istate, #ISTATE_THREAD] bl _ZN10HandleMark10initializeEP6Thread - ldr r1, [sp, #92] + ldr r1, [except_sp, #EXCEPTION_MONITORBASE] ldr r0, [istate, #ISTATE_THREAD] - str stack, [istate, #ISTATE_STACK] + DECACHE_STACK bl _ZN18InterpreterRuntime11monitorexitEP10JavaThreadP15BasicObjectLock mov r0, tmp_yyy - ldr stack, [istate, #ISTATE_STACK] + ASSERT_STACK_CACHED bl _ZN10HandleMarkD1Ev ldr r0, [istate, #ISTATE_THREAD] ldr r1, [r0, #4] cmp r1, #0 beq .handle_exception_24 - add r0, sp, #204 - bl _ZN6HandleC1EP7oopDesc - ldr r1, [sp, #204] + add r0, except_sp, #EXCEPTION_HANDLE2 + bl HandleC + ldr r1, [except_sp, #EXCEPTION_HANDLE2] ldr r0, [istate, #ISTATE_THREAD] - str r1, [sp, #44] + str r1, [except_sp, #EXCEPTION_EXCEPTION2] bl _ZN12ThreadShadow23clear_pending_exceptionEv .handle_exception_22: ldr r0, [istate, #ISTATE_THREAD] @@ -4564,17 +5093,17 @@ .handle_exception_23: ldr r0, [istate, #ISTATE_THREAD] .handle_exception_24: - ldr r3, [sp, #44] + ldr r3, [except_sp, #EXCEPTION_EXCEPTION2] cmp r3, #0 beq .handle_exception_12 .handle_exception_25: - ldr lr, [sp, #44] + ldr lr, [except_sp, #EXCEPTION_EXCEPTION2] ldr r1, [lr, #0] cmp r1, #0 bne .handle_exception_13 b .handle_exception_12 .handle_exception_26: - ldr r1, [sp, #44] + ldr r1, [except_sp, #EXCEPTION_EXCEPTION2] cmp r1, #0 beq .handle_exception_29 ldr r3, [r1, #0] @@ -4584,66 +5113,54 @@ b .handle_exception_25 .handle_exception_27: - ldr r0, [sp, #28] + add r0, except_sp, #EXCEPTION_HANDLEMARK2 ldr r1, [istate, #ISTATE_THREAD] bl _ZN10HandleMark10initializeEP6Thread ldr r0, [istate, #ISTATE_THREAD] - str stack, [istate, #ISTATE_STACK] + DECACHE_STACK bl _ZN18InterpreterRuntime37throw_illegal_monitor_state_exceptionEP10JavaThread - ldr r0, [sp, #28] - ldr stack, [istate, #ISTATE_STACK] + add r0, except_sp, #EXCEPTION_HANDLEMARK2 + ASSERT_STACK_CACHED bl _ZN10HandleMarkD1Ev - ldr r0, [sp, #24] + add r0, except_sp, #EXCEPTION_HANDLE ldr r3, [istate, #ISTATE_THREAD] ldr r1, [r3, #4] - bl _ZN6HandleC1EP7oopDesc - ldr r2, [sp, #212] + bl HandleC + ldr r2, [except_sp, #EXCEPTION_HANDLE] ldr r0, [istate, #ISTATE_THREAD] - str r2, [sp, #44] + str r2, [except_sp, #EXCEPTION_EXCEPTION2] bl _ZN12ThreadShadow23clear_pending_exceptionEv b .handle_exception_20 -.handle_exception_28: - mov r1, fp - str stack, [istate, #ISTATE_STACK] - ldr r0, [istate, #ISTATE_THREAD] - bl _ZN18InterpreterRuntime12monitorenterEP10JavaThreadP15BasicObjectLock - ldr r0, [istate, #ISTATE_THREAD] - ldr stack, [istate, #ISTATE_STACK] - ldr r3, [r0, #THREAD_PENDING_EXC] - cmp r3, #0 - mov r2, r0 - beq do_execute_java_bytecodes_restore_locals_and_jpc - b handle_exception_do_not_unlock .handle_exception_29: - add tmp_yyy, sp, #144 + add tmp_yyy, except_sp, #EXCEPTION_HANDLEMARK2 mov r0, tmp_yyy ldr r1, [istate, #ISTATE_THREAD] bl _ZN10HandleMark10initializeEP6Thread ldr r0, [istate, #ISTATE_THREAD] - str stack, [istate, #ISTATE_STACK] + DECACHE_STACK bl _ZN18InterpreterRuntime37throw_illegal_monitor_state_exceptionEP10JavaThread mov r0, tmp_yyy - ldr stack, [istate, #ISTATE_STACK] + ASSERT_STACK_CACHED bl _ZN10HandleMarkD1Ev ldr r3, [istate, #ISTATE_THREAD] - add r0, sp, #208 + add r0, except_sp, #EXCEPTION_HANDLE3 ldr r1, [r3, #4] - bl _ZN6HandleC1EP7oopDesc - ldr r2, [sp, #208] + bl HandleC + ldr r2, [except_sp, #EXCEPTION_HANDLE3] ldr r0, [istate, #ISTATE_THREAD] - str r2, [sp, #44] + str r2, [except_sp, #EXCEPTION_EXCEPTION2] bl _ZN12ThreadShadow23clear_pending_exceptionEv ldr r0, [istate, #ISTATE_THREAD] b .handle_exception_24 -opclabels_data_adcon: - .word opclabels_data(GOTOFF) + +#ifdef FASTPATH_ENTRY ALIGN_CODE fast_accessor_entry: ldr ip, [dispatch, #SafePointSynchronize_state_Address-XXX] ldr r3, [tmp2, #8] ldr ip, [ip, #0] - ldrb lr, [r3, #50] + ldrb r2, [r3, #50] ldrb r3, [r3, #51] cmp ip, #0 ldr ip, [tmp2, #12] @@ -4652,28 +5169,28 @@ DISPATCH_START 3 - orr lr, lr, r3, lsl #8 @ lr = index + orr r2, r2, r3, lsl #8 @ r2 = index add r3, ip, #16 - ldr lr, [r3, lr, lsl #4]! @ r3 = cache, lr = flags - - DISPATCH_NEXT - - cmp lr, #180 << 16 - GET_STACK 0, lr + ldr r2, [r3, r2, lsl #4]! @ r3 = cache, r2 = flags + + DISPATCH_NEXT + + cmp r2, #opc_getfield << 16 + GET_STACK 0, r2 bne fast_normal_entry - cmp lr, #0 + cmp r2, #0 beq fast_normal_entry - ldr r2, [r3, #12] + ldr lr, [r3, #12] ldr r3, [r3, #8] - movs r2, r2, lsr #29 + movs lr, lr, lsr #29 bls .fast_accessor_non_w DISPATCH_NEXT - ldr tmp1, [lr, r3] + ldr tmp1, [r2, r3] DISPATCH_NEXT DISPATCH_NEXT @@ -4685,12 +5202,12 @@ .fast_accessor_non_w: bcs .fast_accessor_h beq .fast_accessor_sb - tst r2, #2 + tst lr, #2 bne .fast_accessor_dw .fast_accessor_sh: DISPATCH_STATE 2 DISPATCH_NEXT - ldrsh tmp1, [lr, r3] + ldrsh tmp1, [r2, r3] DISPATCH_NEXT DISPATCH_NEXT PUT_STACK 0, tmp1 @@ -4698,7 +5215,7 @@ .fast_accessor_h: DISPATCH_STATE 2 DISPATCH_NEXT - ldrh tmp1, [lr, r3] + ldrh tmp1, [r2, r3] DISPATCH_NEXT DISPATCH_NEXT PUT_STACK 0, tmp1 @@ -4706,14 +5223,14 @@ .fast_accessor_sb: DISPATCH_STATE 2 DISPATCH_NEXT - ldrsb tmp1, [lr, r3] + ldrsb tmp1, [r2, r3] DISPATCH_NEXT DISPATCH_NEXT PUT_STACK 0, tmp1 DISPATCH_FINISH .fast_accessor_dw: DISPATCH_STATE 2 - add tmp1, lr, r3 + add tmp1, r2, r3 DISPATCH_NEXT ldm tmp1, {tmp2, tmp1} DISPATCH_NEXT @@ -4722,12 +5239,12 @@ PUSH tmp2 DISPATCH_FINISH -.iconst_div_rem_0: +#endif // FASTPATH_ENTRY + +div_zero_jpc_1: sub jpc, jpc, #1 @ Point to idiv .lrem_0: .ldiv_0: -.remc_0: -.divc_0: divide_by_zero_exception: mov r0, #VMSYMBOLS_ArithmeticException adr r1, div_zero_msg @@ -4761,11 +5278,26 @@ array_bound_exception_jpc_0: array_bounds_exception: adr r1, percent_d_str - add r0, sp, #168 + sub arm_sp, arm_sp, #16 + add r0, arm_sp, #4 bl sprintf - add r1, sp, #168 + add r1, arm_sp, #4 mov r0, #VMSYMBOLS_ArrayIndexOutOfBounds - b raise_exception_with_msg + str r1, [arm_sp] + ldr r3, [dispatch, #VmSymbols_symbols_Address-XXX] + ldr r3, [r3, r0, lsl #2] + ldr r0, [istate, #ISTATE_THREAD] + DECACHE_JPC + DECACHE_STACK + mov ip, #_thread_in_vm + str ip, [r0, #THREAD_STATE] + mov r2, #99 + adrl r1, bytecode_interpreter_str + bl _ZN10Exceptions10_throw_msgEP6ThreadPKciP13symbolOopDescS3_ + add r0, istate, #ISTATE_THREAD + bl ThreadInVMfromJavaD + add arm_sp, arm_sp, #16 + b handle_exception_with_bcp percent_d_str: .ascii "%d\000" ALIGN_WORD @@ -4787,6 +5319,133 @@ mov r0, #VMSYMBOLS_NullPointerException b raise_exception +@ ==== SW FP ============================================================================== + + Opcode fadd + POP r0, r1 + bl __aeabi_fadd + PUSH r0 + DISPATCH 1 + + Opcode fsub + POP r1 + POP r0 + bl __aeabi_fsub + PUSH r0 + DISPATCH 1 + + Opcode fmul + POP r0, r1 + bl __aeabi_fmul + PUSH r0 + DISPATCH 1 + + Opcode fdiv + POP r1 + POP r0 + bl __aeabi_fdiv + PUSH r0 + DISPATCH 1 + + Opcode ddiv + POP r2, r3 + POP r0, r1 + bl __aeabi_ddiv + PUSH r0, r1 + DISPATCH 1 + + Opcode fcmpl + ldmib stack, {r0, r1} + bl __aeabi_fcmpgt + cmp r0, #0 + movne r3, #-1 + bne 3f + ldmib stack, {r0, r1} + bl __aeabi_fcmplt + cmp r0, #0 + movne r3, #1 + bne 3f + ldmib stack, {r0, r1} + bl __aeabi_fcmpeq + cmp r0, #0 + movne r3, #0 + moveq r3, #-1 +3: + DISPATCH_START 1 + add stack, stack, #8 + DISPATCH_NEXT + PUSH r3 + DISPATCH_FINISH + + Opcode fcmpg + ldmib stack, {r0, r1} + bl __aeabi_fcmpgt + cmp r0, #0 + movne r3, #-1 + bne 4f + ldmib stack, {r0, r1} + bl __aeabi_fcmplt + cmp r0, #0 + movne r3, #1 + bne 4f + ldmib stack, {r0, r1} + bl __aeabi_fcmpeq + cmp r0, #0 + movne r3, #0 + moveq r3, #1 +4: + DISPATCH_START 1 + add stack, stack, #8 + DISPATCH_NEXT + PUSH r3 + DISPATCH_FINISH + + Opcode dcmpl + ldmib stack, {r0, r1, r2, r3} + bl __aeabi_dcmpgt + cmp r0, #0 + movne r3, #-1 + bne 5f + ldmib stack, {r0, r1, r2, r3} + bl __aeabi_dcmplt + cmp r0, #0 + movne r3, #1 + bne 5f + ldmib stack, {r0, r1, r2, r3} + bl __aeabi_dcmpeq + cmp r0, #0 + movne r3, #0 + moveq r3, #-1 +5: + DISPATCH_START 1 + add stack, stack, #16 + DISPATCH_NEXT + PUSH r3 + DISPATCH_FINISH + + Opcode dcmpg + ldmib stack, {r0, r1, r2, r3} + bl __aeabi_dcmpgt + cmp r0, #0 + movne r3, #-1 + bne 6f + ldmib stack, {r0, r1, r2, r3} + bl __aeabi_dcmplt + cmp r0, #0 + movne r3, #1 + bne 6f + ldmib stack, {r0, r1, r2, r3} + bl __aeabi_dcmpeq + cmp r0, #0 + movne r3, #0 + moveq r3, #1 +6: + DISPATCH_START 1 + add stack, stack, #16 + DISPATCH_NEXT + PUSH r3 + DISPATCH_FINISH + @ ==== Fast SW FP emulation =============================================================== #define al r0 @@ -4801,7 +5460,7 @@ @ What we actually do is TOS = TOS + TOSM1 @ --- do_dadd_vtos ------------------------------------------------- Opcode dadd - POP4 al, ah, bl, bh + POP al, ah, bl, bh mov tmp, #0xff000000 orr tmp, tmp, #0x00e00000 bics ex_add, tmp, ah, LSL #1 @@ -4893,7 +5552,7 @@ orr ah, ah, #0x00f00000 orr ah,ah,a3 .dadd_exit: - PUSH2 al, ah + PUSH al, ah DISPATCH 1 .dadd_uncommon: @@ -4937,7 +5596,7 @@ @ ECN: We want TOSM1 - TOS, but args end up in wrong order so do rsb @ --- do_dsub_itos ------------------------------------------------- Opcode dsub - POP4 al, ah, bl, bh + POP al, ah, bl, bh mov tmp, #0xff000000 orr tmp, tmp, #0x00e00000 bics ex_add, tmp, ah, LSL #1 @@ -5039,7 +5698,7 @@ add ah, ah, ex_add, LSL #20 .dsub_return1: .dsub_exit: - PUSH2 al, ah + PUSH al, ah DISPATCH 1 .dsub_ex_one: @ underflow when ex = 1 - shift back to denorm movs ah, ah, ASR #1 @@ -5203,8 +5862,8 @@ @ --- do_dmul_itos ------------------------------------------------- Opcode dmul - POP4 al, ah, bl, bh - stmdb sp!, {r4, r5} + POP al, ah, bl, bh + stmdb arm_sp!, {r4, r5} mov tmp, #0x7f00000 orr tmp, tmp, #0x00f0000 bics ex_m, tmp, ah, LSR #4 @ test for Infs or NaNs @@ -5270,8 +5929,8 @@ bicnes uh, uh, ah @ is exp 0 or 7FF? beq .dmul_outflow .dmul_exit: - ldmia sp!, {r4, r5} - PUSH2 al, ah + ldmia arm_sp!, {r4, r5} + PUSH al, ah DISPATCH 1 .dmul_rdirect: @@ -5289,7 +5948,7 @@ addle ah, ah, #0x60000000 @ Bias up if underflow subge ah, ah, #0x60000000 @ Bias down if overflow mov ip, rs - ldmia sp!, {r4, r5} + ldmia arm_sp!, {r4, r5} ble .__dunder @ underflow b .return_double_Inf @@ -5405,7 +6064,7 @@ b .dmul_exit .dmul_ivo: - ldmia sp!, {r4, r5} + ldmia arm_sp!, {r4, r5} b .return_double_NaN #undef al @@ -5433,8 +6092,9 @@ .global _ZN14CppInterpreter17ignore_safepointsEv .type _ZN14CppInterpreter17ignore_safepointsEv, %function _ZN14CppInterpreter17ignore_safepointsEv: +#ifdef NOTICE_SAFEPOINTS adrl ip, dispatch_init_adcon - ldmia ip, {r2, r3} + ldm ip, {r2, r3} add r2, r2, ip add ip, r3, r2 ldr r2, [ip, #AbstractInterpreter_notice_safepoints-XXX] @@ -5450,15 +6110,22 @@ str r1, [ip], #4 subs r2, r2, #1 bne 1b - +#ifdef HW_FP + sub ip, ip, #256*4 + ldr r0, [ip, #VFP_Flag-XXX] + cmp r0, #0 + beq update_vfp_table +#endif // HW_FP +#endif // NOTICE_SAFEPOINTS bx lr @ --- notice_safepoints --------------------------------------------------------------------------- .global _ZN14CppInterpreter17notice_safepointsEv .type _ZN14CppInterpreter17notice_safepointsEv, %function _ZN14CppInterpreter17notice_safepointsEv: +#ifdef NOTICE_SAFEPOINTS adrl ip, dispatch_init_adcon - ldmia ip, {r2, r3} + ldm ip, {r2, r3} add r2, r2, ip add ip, r3, r2 ldr r2, [ip, #AbstractInterpreter_notice_safepoints-XXX] @@ -5474,17 +6141,18 @@ str r1, [ip], #4 subs r2, r2, #1 bne 1b - +#endif bx lr @ --- END execute.s ---------------------------------------------------------------------------- + ALIGN_CODE bci_init: - adr r3, dispatch_init_adcon - ldmia r3, {r0, r1} + adrl r3, dispatch_init_adcon + ldm r3, {r0, r1} add r0, r0, r3 add r1, r1, r0 - adr r2, adcon_init_table + adrl r2, adcon_init_table mov r3, r1 1: ldr ip, [r2], #4 @@ -5492,7 +6160,7 @@ ldrne ip, [r0, ip] strne ip, [r1, #-4]! bne 1b - adr r2, main_dispatch_table + adrl r2, main_dispatch_table mov r1, #256 2: ldr ip, [r2], #4 @@ -5500,8 +6168,88 @@ subs r1, r1, #1 bne 2b +#ifdef HW_FP +vfp_init: + stmfd sp!, {r4, r5, lr} + sub sp, sp, #132 + mov r4, #0 + adr r0, proc_self_auxv + mov r1, #0 + bl open + subs r5, r0, #0 + blt .exit_vfp_init +.vfp_init_read_loop: + mov r2, #128 + mov r0, r5 + mov r1, sp + bl read + mov r2, sp + mov r3, r0, lsr #3 + b .vfp_init_1 +.vfp_init_vec_loop: + ldmia r2!, {r1, ip} + cmp r1, #0 + beq .fini_vfp_init + cmp r1, #16 + bne .vfp_init_1 + tst ip, #64 + movne r4, #1 + bne .fini_vfp_init +.vfp_init_1: + subs r3, r3, #1 + bpl .vfp_init_vec_loop + cmp r0, #128 + beq .vfp_init_read_loop +.fini_vfp_init: + mov r0, r5 + bl close +.exit_vfp_init: + movs r0, r4 + add sp, sp, #132 + ldmfd sp!, {r4, r5, lr} + bxne lr @ We have HW FP - just exit + +@ No HW FP - replace the HW FP entries with SW entries +update_vfp_table: + adr r0, vfp_table + adrl ip, dispatch_init_adcon + ldm ip, {r2, r3} + add r2, r2, ip + add ip, r3, r2 + mov r1, #1 + str r1, [ip, #VFP_Flag-XXX] +.update_vfp_loop: + ldr r1, [r0], #4 + cmp r1, #0 + ldrne r2, [r0], #4 + strne r2, [ip, r1, lsl #2] + bne .update_vfp_loop +#endif // HW_FP + bx lr +#ifdef HW_FP +vfp_table: + .word opc_fadd, do_fadd + .word opc_dadd, do_dadd + .word opc_fsub, do_fsub + .word opc_dsub, do_dsub + .word opc_fmul, do_fmul + .word opc_dmul, do_dmul + .word opc_fdiv, do_fdiv + .word opc_ddiv, do_ddiv + .word opc_fcmpl, do_fcmpl + .word opc_fcmpg, do_fcmpg + .word opc_dcmpl, do_dcmpl + .word opc_dcmpg, do_dcmpg + .word 0 + +proc_self_auxv: + .ascii "/proc/self/auxv\000" + .align 2 + +#endif // HW_FP + ALIGN_DATA dispatch_init_adcon: .word _GLOBAL_OFFSET_TABLE_-dispatch_init_adcon, opclabels_data(GOTOFF) @@ -5510,18 +6258,23 @@ .word _ZN20SafepointSynchronize6_stateE(GOT) .word _ZN9vmSymbols8_symbolsE(GOT) .word always_do_update_barrier(GOT) - .word UseBiasedLocking(GOT) .word _ZN8Universe14_collectedHeapE(GOT) - .word ZeroTLAB(GOT) - .word UseTLAB(GOT) .word _ZN9Bytecodes5_nameE(GOT) .word _ZN19AbstractInterpreter18_notice_safepointsE(GOT) .word _ZN18ThreadLocalStorage13_thread_indexE(GOT) + .word _ZN7oopDesc3_bsE(GOT) + .word PrintCommandLineFlags(GOT) + .word _ZN11JvmtiExport28_can_post_interpreter_eventsE(GOT) + .word UseCompiler(GOT) .word 0 ALIGN_DATA main_dispatch_table: MAIN_DISPATCH_TABLE + +@ ECN: Strange logic here! We don't need the safe_dispatch_table if NOTICE_SAFEPOINTS is +@ disabled because in this case the main_dispatch_table must be safepoint safe. +#ifdef NOTICE_SAFEPOINTS safe_dispatch_table: .word do_nop .word do_u4const_0 @@ -5676,31 +6429,31 @@ .word do_fcmpg .word do_dcmpl .word do_dcmpg - .word do_ifeq_safe - .word do_ifne_safe - .word do_iflt_safe - .word do_ifge_safe - .word do_ifgt_safe - .word do_ifle_safe - .word do_if_icmpeq_safe - .word do_if_icmpne_safe - .word do_if_icmplt_safe - .word do_if_icmpge_safe - .word do_if_icmpgt_safe - .word do_if_icmple_safe - .word do_if_icmpeq_safe - .word do_if_icmpne_safe - .word do_goto_safe + .word do_ifeq + .word do_ifne + .word do_iflt + .word do_ifge + .word do_ifgt + .word do_ifle + .word do_if_icmpeq + .word do_if_icmpne + .word do_if_icmplt + .word do_if_icmpge + .word do_if_icmpgt + .word do_if_icmple + .word do_if_icmpeq + .word do_if_icmpne + .word do_goto .word do_jsr .word do_ret .word do_tableswitch .word do_lookupswitch - .word do_ireturn_safe - .word do_lreturn_safe - .word do_ireturn_safe - .word do_lreturn_safe - .word do_ireturn_safe - .word do_return_safe + .word do_ireturn + .word do_lreturn + .word do_ireturn + .word do_lreturn + .word do_ireturn + .word do_return .word do_getstatic .word do_putstatic .word do_getfield @@ -5721,8 +6474,8 @@ .word do_monitorexit .word do_wide .word do_multianewarray - .word do_ifeq_safe - .word do_ifne_safe + .word do_ifeq + .word do_ifne .word do_goto_w .word do_jsr_w .word do_breakpoint @@ -5746,12 +6499,12 @@ .word do_iaccess_0 .word do_iaccess_0 .word do_iaccess_0 - .word do_undefined - .word do_undefined - .word do_undefined + .word do_invokeresolved + .word do_invokespecialresolved + .word do_invokestaticresolved .word do_invokevfinal - .word do_undefined - .word do_undefined + .word do_fast_iload_iload + .word do_fast_iload_iload_N .word do_return_register_finalizer .word do_undefined .word do_iload_0_iconst_N @@ -5759,7 +6512,6 @@ .word do_iload_0_iconst_N .word do_iload_0_iconst_N .word do_iload_iconst_N - .word do_invokeresolved .word do_iadd_istore_N .word do_isub_istore_N .word do_iand_istore_N @@ -5770,15 +6522,17 @@ .word do_iand_u4store .word do_ior_u4store .word do_ixor_u4store - .word do_invokespecialresolved - .word do_invokestaticresolved - .word do_undefined + .word do_fast_iload_N_iload + .word do_fast_iload_N_iload + .word do_fast_iload_N_iload + .word do_fast_iload_N_iload + .word do_fast_iload_N_iload_N + .word do_fast_iload_N_iload_N + .word do_fast_iload_N_iload_N + .word do_fast_iload_N_iload_N .word do_undefined .word do_undefined - .word do_undefined - .word do_undefined - .word do_undefined - .word do_undefined +#endif SUB_DISPATCH_TABLES @@ -5787,14 +6541,22 @@ .data ALIGN_DATA - .word 0, 0, 0, 0, 0 +#ifdef CODETRACE +CodeTrace_Buffer_Base: + .space CODETRACE_BUFFER_SIZE +#endif + .word 0 +DispatchBreakPoint: .word 0 +VFP_Flag: .word 0 +CodeTrace_Idx: .word 0 +UseCompiler_Address: .word 0 +can_post_interpreter_events: .word 0 +PrintCommandLineFlags_Address: .word 0 +oopDesc_Address: .word 0 ThreadLocalStorage_thread_index: .word 0 AbstractInterpreter_notice_safepoints: .word 0 Bytecodes_name_Address: .word 0 -UseTLAB_Address: .word 0 -ZeroTLAB_Address: .word 0 Universe_collectedHeap_Address: .word 0 -UseBiasedLocking_Address: .word 0 always_do_update_barrier_Address: .word 0 VmSymbols_symbols_Address: .word 0 SafePointSynchronize_state_Address: .word 0 @@ -5817,4 +6579,4 @@ .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -#endif // HOTSPOT_ASM +#endif
--- a/ports/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp Fri Sep 11 17:09:38 2009 +0100 +++ b/ports/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp Sat Sep 12 12:45:13 2009 +0100 @@ -719,9 +719,8 @@ return generate_entry((address) CppInterpreter::normal_entry); } -#if defined(PRODUCT) && defined(HOTSPOT_ASM) -typedef void (*BCI_ENTRY)(methodOopDesc*, intptr_t, Thread*); -extern "C" BCI_ENTRY asm_generate_method_entry( +#ifdef HOTSPOT_ASM +extern "C" address asm_generate_method_entry( AbstractInterpreter::MethodKind kind); #endif // HOTSPOT_ASM @@ -729,14 +728,10 @@ AbstractInterpreter::MethodKind kind) { address entry_point = NULL; -#if defined(PRODUCT) && defined(HOTSPOT_ASM) - if (!UseCompiler && !TaggedStackInterpreter && - !JvmtiExport::can_post_interpreter_events() && - !PrintCommandLineFlags) { - address asm_entry = (address) asm_generate_method_entry(kind); +#ifdef HOTSPOT_ASM + address asm_entry = asm_generate_method_entry(kind); if (asm_entry) return ((InterpreterGenerator*) this)->generate_entry(asm_entry); - } #endif // HOTSPOT_ASM switch (kind) {
--- a/ports/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp Fri Sep 11 17:09:38 2009 +0100 +++ b/ports/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp Sat Sep 12 12:45:13 2009 +0100 @@ -82,7 +82,7 @@ Unimplemented(); } -#if defined(PRODUCT) && defined(HOTSPOT_ASM) +#ifdef HOTSPOT_ASM extern "C" int asm_check_null_ptr(ucontext_t *uc); #endif // HOTSPOT_ASM @@ -93,7 +93,7 @@ int abort_if_unrecognized) { ucontext_t* uc = (ucontext_t*) ucVoid; -#if defined(PRODUCT) && defined(HOTSPOT_ASM) +#ifdef HOTSPOT_ASM if (sig == SIGSEGV) { if (asm_check_null_ptr(uc)) return 1; }