/hg/icedtea7-forest/hotspot: PR2228 - Add ARM32 JIT
enevill at icedtea.classpath.org
enevill at icedtea.classpath.org
Mon Feb 16 15:40:39 UTC 2015
changeset 01a0011cc101 in /hg/icedtea7-forest/hotspot
details: http://icedtea.classpath.org/hg/icedtea7-forest/hotspot?cmd=changeset;node=01a0011cc101
author: Edward Nevill <ed at camswl.com>
date: Mon Feb 16 13:18:10 2015 +0000
PR2228 - Add ARM32 JIT
diffstat:
make/linux/makefiles/zeroshark.make | 4 +-
src/cpu/zero/vm/arm32JIT.cpp | 8583 +++++++++++++++++++++++++++++++++++
src/cpu/zero/vm/thumb2.cpp | 7985 --------------------------------
3 files changed, 8585 insertions(+), 7987 deletions(-)
diffs (truncated from 16594 to 500 lines):
diff -r 436b85007718 -r 01a0011cc101 make/linux/makefiles/zeroshark.make
--- a/make/linux/makefiles/zeroshark.make Thu Feb 05 16:11:14 2015 +0000
+++ b/make/linux/makefiles/zeroshark.make Mon Feb 16 13:18:10 2015 +0000
@@ -30,12 +30,12 @@
ifeq ($(ARM32JIT),true)
Obj_Files += asm_helper.o
Obj_Files += cppInterpreter_arm.o
-Obj_Files += thumb2.o
+Obj_Files += arm32JIT.o
CFLAGS += -DHOTSPOT_ASM
cppInterpreter_arm.o: offsets_arm.s bytecodes_arm.s
-thumb2.o: offsets_arm.s
+arm32JIT.o: offsets_arm.s
offsets_arm.s: mkoffsets
@echo Generating assembler offsets
diff -r 436b85007718 -r 01a0011cc101 src/cpu/zero/vm/arm32JIT.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cpu/zero/vm/arm32JIT.cpp Mon Feb 16 13:18:10 2015 +0000
@@ -0,0 +1,8583 @@
+/*
+ * Copyright 2009, 2010 Edward Nevill
+ * Copyright 2012, 2013 Red Hat
+ * Copyright 2014, 2015 Linaro Ltd
+ *
+ * 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.
+ */
+
+#if defined(__arm__)
+
+#undef T2JIT
+#if !defined(DISABLE_THUMB2) && defined(HOTSPOT_ASM) && !defined(SHARK)
+#define T2JIT
+#endif
+
+unsigned int Thumb2 = 1;
+
+#ifdef T2JIT
+
+// setting DISABLE_THUMB2_JVMTI at build time disables notification
+// of JVMTI dynamic_generate and compiled_method_load events
+#undef THUMB2_JVMTI
+#if !defined(DISABLE_THUMB2_JVMTI)
+#define THUMB2_JVMTI
+#endif
+
+#define T2_PRINT_COMPILATION
+#define T2_PRINT_STATISTICS
+#define T2_PRINT_DISASS
+#define T2_PRINT_REGUSAGE
+
+#define T2EE_PRINT_REGUSAGE
+#define CODE_ALIGN 64
+
+#define SLOW_ENTRY_OFFSET 24
+#define FAST_ENTRY_OFFSET 40
+
+#ifdef T2_PRINT_STATISTICS
+static char *t2_print_statistics;
+#endif
+
+#ifdef T2_PRINT_REGUSAGE
+static char *t2_print_regusage;
+#endif
+
+static char *t2_ospace;
+#define OSPACE t2_ospace
+
+#ifdef PRODUCT
+#define THUMB2_CODEBUF_SIZE (8 * 1024 * 1024)
+#else
+#define THUMB2_CODEBUF_SIZE (4 * 1024 * 1024)
+#endif
+#define THUMB2_MAX_BYTECODE_SIZE 10000
+#define THUMB2_MAX_T2CODE_SIZE 65000
+#define THUMB2_MAXLOCALS 1000
+
+#include <sys/mman.h>
+#include <ucontext.h>
+#include "precompiled.hpp"
+#include "interpreter/bytecodes.hpp"
+#include "compiler/compilerOracle.hpp"
+
+#define opc_nop 0x00
+#define opc_aconst_null 0x01
+#define opc_iconst_m1 0x02
+#define opc_iconst_0 0x03
+#define opc_iconst_1 0x04
+#define opc_iconst_2 0x05
+#define opc_iconst_3 0x06
+#define opc_iconst_4 0x07
+#define opc_iconst_5 0x08
+#define opc_lconst_0 0x09
+#define opc_lconst_1 0x0a
+#define opc_fconst_0 0x0b
+#define opc_fconst_1 0x0c
+#define opc_fconst_2 0x0d
+#define opc_dconst_0 0x0e
+#define opc_dconst_1 0x0f
+#define opc_bipush 0x10
+#define opc_sipush 0x11
+#define opc_ldc 0x12
+#define opc_ldc_w 0x13
+#define opc_ldc2_w 0x14
+#define opc_iload 0x15
+#define opc_lload 0x16
+#define opc_fload 0x17
+#define opc_dload 0x18
+#define opc_aload 0x19
+#define opc_iload_0 0x1a
+#define opc_iload_1 0x1b
+#define opc_iload_2 0x1c
+#define opc_iload_3 0x1d
+#define opc_lload_0 0x1e
+#define opc_lload_1 0x1f
+#define opc_lload_2 0x20
+#define opc_lload_3 0x21
+#define opc_fload_0 0x22
+#define opc_fload_1 0x23
+#define opc_fload_2 0x24
+#define opc_fload_3 0x25
+#define opc_dload_0 0x26
+#define opc_dload_1 0x27
+#define opc_dload_2 0x28
+#define opc_dload_3 0x29
+#define opc_aload_0 0x2a
+#define opc_aload_1 0x2b
+#define opc_aload_2 0x2c
+#define opc_aload_3 0x2d
+#define opc_iaload 0x2e
+#define opc_laload 0x2f
+#define opc_faload 0x30
+#define opc_daload 0x31
+#define opc_aaload 0x32
+#define opc_baload 0x33
+#define opc_caload 0x34
+#define opc_saload 0x35
+#define opc_istore 0x36
+#define opc_lstore 0x37
+#define opc_fstore 0x38
+#define opc_dstore 0x39
+#define opc_astore 0x3a
+#define opc_istore_0 0x3b
+#define opc_istore_1 0x3c
+#define opc_istore_2 0x3d
+#define opc_istore_3 0x3e
+#define opc_lstore_0 0x3f
+#define opc_lstore_1 0x40
+#define opc_lstore_2 0x41
+#define opc_lstore_3 0x42
+#define opc_fstore_0 0x43
+#define opc_fstore_1 0x44
+#define opc_fstore_2 0x45
+#define opc_fstore_3 0x46
+#define opc_dstore_0 0x47
+#define opc_dstore_1 0x48
+#define opc_dstore_2 0x49
+#define opc_dstore_3 0x4a
+#define opc_astore_0 0x4b
+#define opc_astore_1 0x4c
+#define opc_astore_2 0x4d
+#define opc_astore_3 0x4e
+#define opc_iastore 0x4f
+#define opc_lastore 0x50
+#define opc_fastore 0x51
+#define opc_dastore 0x52
+#define opc_aastore 0x53
+#define opc_bastore 0x54
+#define opc_castore 0x55
+#define opc_sastore 0x56
+#define opc_pop 0x57
+#define opc_pop2 0x58
+#define opc_dup 0x59
+#define opc_dup_x1 0x5a
+#define opc_dup_x2 0x5b
+#define opc_dup2 0x5c
+#define opc_dup2_x1 0x5d
+#define opc_dup2_x2 0x5e
+#define opc_swap 0x5f
+#define opc_iadd 0x60
+#define opc_ladd 0x61
+#define opc_fadd 0x62
+#define opc_dadd 0x63
+#define opc_isub 0x64
+#define opc_lsub 0x65
+#define opc_fsub 0x66
+#define opc_dsub 0x67
+#define opc_imul 0x68
+#define opc_lmul 0x69
+#define opc_fmul 0x6a
+#define opc_dmul 0x6b
+#define opc_idiv 0x6c
+#define opc_ldiv 0x6d
+#define opc_fdiv 0x6e
+#define opc_ddiv 0x6f
+#define opc_irem 0x70
+#define opc_lrem 0x71
+#define opc_frem 0x72
+#define opc_drem 0x73
+#define opc_ineg 0x74
+#define opc_lneg 0x75
+#define opc_fneg 0x76
+#define opc_dneg 0x77
+#define opc_ishl 0x78
+#define opc_lshl 0x79
+#define opc_ishr 0x7a
+#define opc_lshr 0x7b
+#define opc_iushr 0x7c
+#define opc_lushr 0x7d
+#define opc_iand 0x7e
+#define opc_land 0x7f
+#define opc_ior 0x80
+#define opc_lor 0x81
+#define opc_ixor 0x82
+#define opc_lxor 0x83
+#define opc_iinc 0x84
+#define opc_i2l 0x85
+#define opc_i2f 0x86
+#define opc_i2d 0x87
+#define opc_l2i 0x88
+#define opc_l2f 0x89
+#define opc_l2d 0x8a
+#define opc_f2i 0x8b
+#define opc_f2l 0x8c
+#define opc_f2d 0x8d
+#define opc_d2i 0x8e
+#define opc_d2l 0x8f
+#define opc_d2f 0x90
+#define opc_i2b 0x91
+#define opc_i2c 0x92
+#define opc_i2s 0x93
+#define opc_lcmp 0x94
+#define opc_fcmpl 0x95
+#define opc_fcmpg 0x96
+#define opc_dcmpl 0x97
+#define opc_dcmpg 0x98
+#define opc_ifeq 0x99
+#define opc_ifne 0x9a
+#define opc_iflt 0x9b
+#define opc_ifge 0x9c
+#define opc_ifgt 0x9d
+#define opc_ifle 0x9e
+#define opc_if_icmpeq 0x9f
+#define opc_if_icmpne 0xa0
+#define opc_if_icmplt 0xa1
+#define opc_if_icmpge 0xa2
+#define opc_if_icmpgt 0xa3
+#define opc_if_icmple 0xa4
+#define opc_if_acmpeq 0xa5
+#define opc_if_acmpne 0xa6
+#define opc_goto 0xa7
+#define opc_jsr 0xa8
+#define opc_ret 0xa9
+#define opc_tableswitch 0xaa
+#define opc_lookupswitch 0xab
+#define opc_ireturn 0xac
+#define opc_lreturn 0xad
+#define opc_freturn 0xae
+#define opc_dreturn 0xaf
+#define opc_areturn 0xb0
+#define opc_return 0xb1
+#define opc_getstatic 0xb2
+#define opc_putstatic 0xb3
+#define opc_getfield 0xb4
+#define opc_putfield 0xb5
+#define opc_invokevirtual 0xb6
+#define opc_invokespecial 0xb7
+#define opc_invokestatic 0xb8
+#define opc_invokeinterface 0xb9
+#define opc_invokedynamic 0xba
+#define opc_new 0xbb
+#define opc_newarray 0xbc
+#define opc_anewarray 0xbd
+#define opc_arraylength 0xbe
+#define opc_athrow 0xbf
+#define opc_checkcast 0xc0
+#define opc_instanceof 0xc1
+#define opc_monitorenter 0xc2
+#define opc_monitorexit 0xc3
+#define opc_wide 0xc4
+#define opc_multianewarray 0xc5
+#define opc_ifnull 0xc6
+#define opc_ifnonnull 0xc7
+#define opc_goto_w 0xc8
+#define opc_jsr_w 0xc9
+#define opc_breakpoint 0xca
+
+#define OPC_LAST_JAVA_OP 0xca
+
+#define opc_fast_aldc Bytecodes::_fast_aldc
+#define opc_fast_aldc_w Bytecodes::_fast_aldc_w
+
+#define opc_bgetfield 0xcc
+#define opc_cgetfield 0xcd
+#define opc_igetfield 0xd0
+#define opc_lgetfield 0xd1
+#define opc_sgetfield 0xd2
+#define opc_aputfield 0xd3
+#define opc_bputfield 0xd4
+#define opc_cputfield 0xd5
+#define opc_iputfield 0xd8
+#define opc_lputfield 0xd9
+#define opc_iaccess_0 0xdb
+#define opc_iaccess_1 0xdc
+#define opc_iaccess_2 0xdd
+#define opc_iaccess_3 0xde
+#define opc_invokeresolved 0xdf
+#define opc_invokespecialresolved 0xe0
+#define opc_invokestaticresolved 0xe1
+#define opc_invokevfinal 0xe2
+#define opc_iload_iload 0xe3
+
+#define opc_return_register_finalizer 0xe7
+#define opc_dmac 0xe8
+#define opc_iload_0_iconst_N 0xe9
+#define opc_iload_1_iconst_N 0xea
+#define opc_iload_2_iconst_N 0xeb
+#define opc_iload_3_iconst_N 0xec
+#define opc_iload_iconst_N 0xed
+#define opc_iadd_istore_N 0xee
+#define opc_isub_istore_N 0xef
+#define opc_iand_istore_N 0xf0
+#define opc_ior_istore_N 0xf1
+#define opc_ixor_istore_N 0xf2
+#define opc_iadd_u4store 0xf3
+#define opc_isub_u4store 0xf4
+#define opc_iand_u4store 0xf5
+#define opc_ior_u4store 0xf6
+#define opc_ixor_u4store 0xf7
+#define opc_iload_0_iload 0xf8
+#define opc_iload_1_iload 0xf9
+#define opc_iload_2_iload 0xfa
+#define opc_iload_3_iload 0xfb
+#define opc_iload_0_iload_N 0xfc
+#define opc_iload_1_iload_N 0xfd
+#define opc_iload_2_iload_N 0xfe
+#define opc_iload_3_iload_N 0xff
+
+
+#define H_IREM 0
+#define H_IDIV 1
+#define H_LDIV 2
+#define H_LREM 3
+#define H_FREM 4
+#define H_DREM 5
+#define H_LDC 6
+#define H_NEW 8
+#define H_I2F 9
+#define H_I2D 10
+#define H_L2F 11
+#define H_L2D 12
+#define H_F2I 13
+#define H_F2L 14
+#define H_F2D 15
+#define H_D2I 16
+#define H_D2L 17
+#define H_D2F 18
+#define H_NEWARRAY 19
+#define H_ANEWARRAY 20
+#define H_MULTIANEWARRAY 21
+#define H_INSTANCEOF 22
+#define H_CHECKCAST 23
+#define H_AASTORE 24
+#define H_APUTFIELD 25
+#define H_SYNCHRONIZED_ENTER 26
+#define H_SYNCHRONIZED_EXIT 27
+
+#define H_EXIT_TO_INTERPRETER 28
+
+#define H_RET H_EXIT_TO_INTERPRETER
+#define H_DEADCODE H_EXIT_TO_INTERPRETER
+#define H_ATHROW H_EXIT_TO_INTERPRETER
+
+#define H_HANDLE_EXCEPTION 29
+#define H_ARRAYBOUND 30
+
+#define H_LDC_W 31
+
+#define H_DEBUG_METHODENTRY 32
+#define H_DEBUG_METHODEXIT 33
+#define H_DEBUG_METHODCALL 34
+
+#define H_INVOKEINTERFACE 35
+#define H_INVOKEVIRTUAL 36
+#define H_INVOKESTATIC 37
+#define H_INVOKESPECIAL 38
+
+#define H_GETFIELD_WORD 39
+#define H_GETFIELD_SH 40
+#define H_GETFIELD_H 41
+#define H_GETFIELD_SB 42
+#define H_GETFIELD_DW 43
+
+#define H_PUTFIELD_WORD 44
+#define H_PUTFIELD_H 45
+#define H_PUTFIELD_B 46
+#define H_PUTFIELD_A 47
+#define H_PUTFIELD_DW 48
+
+#define H_GETSTATIC_WORD 49
+#define H_GETSTATIC_SH 50
+#define H_GETSTATIC_H 51
+#define H_GETSTATIC_SB 52
+#define H_GETSTATIC_DW 53
+
+#define H_PUTSTATIC_WORD 54
+#define H_PUTSTATIC_H 55
+#define H_PUTSTATIC_B 56
+#define H_PUTSTATIC_A 57
+#define H_PUTSTATIC_DW 58
+
+#define H_STACK_OVERFLOW 59
+
+#define H_HANDLE_EXCEPTION_NO_REGS 60
+
+#define H_INVOKESTATIC_RESOLVED 61
+#define H_INVOKESPECIAL_RESOLVED 62
+#define H_INVOKEVIRTUAL_RESOLVED 63
+#define H_INVOKEVFINAL 64
+
+#define H_MONITORENTER 65
+#define H_MONITOREXIT 66
+
+#define H_SAFEPOINT 67
+
+#define H_LAST 68 // Not used
+
+unsigned handlers[H_LAST];
+
+#define LEAF_STACK_SIZE 200
+#define STACK_SPARE 40
+
+#define COMPILER_RESULT_FAILED 1 // Failed to compiled this method
+#define COMPILER_RESULT_FATAL 2 // Fatal - dont try compile anything ever again
+
+#include <setjmp.h>
+
+static jmp_buf compiler_error_env;
+
+#define J_BogusImplementation() longjmp(compiler_error_env, COMPILER_RESULT_FAILED)
+
+#ifdef PRODUCT
+
+//#define JASSERT(cond, msg)
+//#define J_Unimplemented() longjmp(compiler_error_env, COMPILER_RESULT_FATAL)
+#define JASSERT(cond, msg) do { if (!(cond)) fatal(msg); } while (0)
+#define J_Unimplemented() { report_unimplemented(__FILE__, __LINE__); BREAKPOINT; }
+#define JDEBUG_( _j_ )
+
+#else
+
+#define JASSERT(cond, msg) do { if (!(cond)) fatal(msg); } while (0)
+#define J_Unimplemented() { report_unimplemented(__FILE__, __LINE__); BREAKPOINT; }
+#define JDEBUG_( _j_ ) _j_
+
+#endif // PRODUCT
+
+#define GET_NATIVE_U2(p) (*(unsigned short *)(p))
+#define GET_NATIVE_U4(p) (*(unsigned *)(p))
+
+#define GET_JAVA_S1(p) (((signed char *)(p))[0])
+#define GET_JAVA_S2(p) ((((signed char *)(p))[0] << 8) + (p)[1])
+#define GET_JAVA_U2(p) (((p)[0] << 8) + (p)[1])
+#define GET_JAVA_U4(p) (((p)[0] << 24) + ((p)[1] << 16) + ((p)[2] << 8) + (p)[3])
+
+#define BYTESEX_REVERSE(v) (((v)<<24) | (((v)<<8) & 0xff0000) | (((v)>>8) & 0xff00) | ((v)>>24))
+#define BYTESEX_REVERSE_U2(v) (((v)<<8) | ((v)>>8))
+
+// n.b. this value is chosen because it is an illegal thumb2 instruction
+#define THUMB2_POLLING_PAGE_MAGIC 0xdead
+#define ARM_POLLING_PAGE_MAGIC 0xf0bef0be
+
+typedef struct Thumb2_CodeBuf {
+ unsigned size;
+ char *sp;
+ char *hp;
+} Thumb2_CodeBuf;
+
+Thumb2_CodeBuf *thumb2_codebuf;
+
+// We support any arch >= ARM v6. The differences in the archs are:-
+// ARMv6: No Thumb2 support, No LDREXD/STREXD
+// ARMv6k: No Thumb2 support, LDREXD/STREXD
+// >=ARMv6t2: Thumb2 support, LDREXD/STREXD
+// Note: That support for vanilla ARMv6 (as on Raspberry PI) is only available
+// on non-MP systems because of the lack of the necessary LDREXD/STREXD instructions
More information about the distro-pkg-dev
mailing list