-/* jit/jit.c - calls the code generation functions
+/* src/vm/jit/jit.c - calls the code generation functions
- Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
- R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser,
- M. Probst, S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck,
- P. Tomsich, J. Wenninger
+ Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
+ C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
+ E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
+ J. Wenninger, Institut f. Computersprachen - TU Wien
This file is part of CACAO.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA.
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
- Contact: cacao@complang.tuwien.ac.at
+*/
- Authors: Andreas Krall
- Reinhard Grafl
- Changes: Edwin Steiner
+#include "config.h"
- $Id: jit.c 800 2003-12-16 22:47:59Z edwin $
+#include <assert.h>
-*/
+#include "vm/types.h"
+#include "mm/memory.h"
-#include <stdlib.h>
-#include <string.h>
-#include "global.h" /* we define _GNU_SOURCE there */
-#include "tables.h"
-#include "loader.h"
-#include "jit.h"
-#include "parse.h"
-#include "stack.h"
-#include "reg.h"
-#include "inline.h"
-#include "builtin.h"
-#include "native.h"
-#include "asmpart.h"
-#include "codegen.h"
-#include "types.h"
-#include "threads/thread.h"
-#include "disass.h"
-#include "loop/loop.h"
-#include "loop/graph.h"
-#include "loop/analyze.h"
-#include "toolbox/loging.h"
-#include "toolbox/memory.h"
-
-
-/* global switches ************************************************************/
-
-bool getcompilingtime = false;
-long compilingtime = 0;
-
-int has_ext_instr_set = 0;
-
-bool statistics = false;
-
-int count_jit_calls = 0;
-int count_methods = 0;
-int count_spills = 0;
-int count_pcmd_activ = 0;
-int count_pcmd_drop = 0;
-int count_pcmd_zero = 0;
-int count_pcmd_const_store = 0;
-int count_pcmd_const_alu = 0;
-int count_pcmd_const_bra = 0;
-int count_pcmd_load = 0;
-int count_pcmd_move = 0;
-int count_load_instruction = 0;
-int count_pcmd_store = 0;
-int count_pcmd_store_comb = 0;
-int count_dup_instruction = 0;
-int count_pcmd_op = 0;
-int count_pcmd_mem = 0;
-int count_pcmd_met = 0;
-int count_pcmd_bra = 0;
-int count_pcmd_table = 0;
-int count_pcmd_return = 0;
-int count_pcmd_returnx = 0;
-int count_check_null = 0;
-int count_check_bound = 0;
-int count_max_basic_blocks = 0;
-int count_basic_blocks = 0;
-int count_javainstr = 0;
-int count_max_javainstr = 0;
-int count_javacodesize = 0;
-int count_javaexcsize = 0;
-int count_calls = 0;
-int count_tryblocks = 0;
-int count_code_len = 0;
-int count_data_len = 0;
-int count_cstub_len = 0;
-int count_nstub_len = 0;
-int count_max_new_stack = 0;
-int count_upper_bound_new_stack = 0;
-static int count_block_stack_init[11] = {
- 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- 0
-};
-int *count_block_stack = count_block_stack_init;
-static int count_analyse_iterations_init[5] = {
- 0, 0, 0, 0, 0
-};
-int *count_analyse_iterations = count_analyse_iterations_init;
-static int count_method_bb_distribution_init[9] = {
- 0, 0, 0, 0, 0,
- 0, 0, 0, 0
-};
-int *count_method_bb_distribution = count_method_bb_distribution_init;
-static int count_block_size_distribution_init[18] = {
- 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- 0, 0, 0
-};
-int *count_block_size_distribution = count_block_size_distribution_init;
-static int count_store_length_init[21] = {
- 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- 0
-};
-int *count_store_length = count_store_length_init;
-static int count_store_depth_init[11] = {
- 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,
- 0
-};
-int *count_store_depth = count_store_depth_init;
+#include "native/native.h"
+#include "toolbox/logging.h"
+#include "threads/lock-common.h"
+#include "threads/threads-common.h"
-/* global compiler variables **************************************************/
+#include "vm/global.h"
+#include "vm/initialize.h"
- /* data about the currently compiled method */
+#include "vm/jit/asmpart.h"
-classinfo *class; /* class the compiled method belongs to */
-methodinfo *method; /* pointer to method info of compiled method */
-static utf *descriptor; /* type descriptor of compiled method */
-int mparamcount; /* number of parameters (incl. this) */
-u1 *mparamtypes; /* types of all parameters (TYPE_INT, ...) */
-static int mreturntype; /* return type of method */
-
-int maxstack; /* maximal JavaVM stack size */
-int maxlocals; /* maximal number of local JavaVM variables */
-int jcodelength; /* length of JavaVM-codes */
-u1 *jcode; /* pointer to start of JavaVM-code */
-int exceptiontablelength; /* length of exception table */
-xtable *extable; /* pointer to start of exception table */
-exceptiontable *raw_extable;
+# include "vm/jit/cfg.h"
+
+#include "vm/jit/codegen-common.h"
+#include "vm/jit/disass.h"
+#include "vm/jit/dseg.h"
+#include "vm/jit/jit.h"
+#include "vm/jit/md.h"
+#include "vm/jit/parse.h"
+#include "vm/jit/reg.h"
-int block_count; /* number of basic blocks */
-basicblock *block; /* points to basic block array */
-int *block_index; /* a table which contains for every byte of */
- /* JavaVM code a basic block index if at this */
- /* byte there is the start of a basic block */
+#include "vm/jit/show.h"
+#include "vm/jit/stack.h"
+
+#include "vm/jit/allocator/simplereg.h"
+#if defined(ENABLE_LSRA) && !defined(ENABLE_SSA)
+# include "vm/jit/allocator/lsra.h"
+#endif
+#if defined(ENABLE_SSA)
+# include "vm/jit/optimizing/lsra.h"
+# include "vm/jit/optimizing/ssa.h"
+#endif
-int instr_count; /* number of JavaVM instructions */
-instruction *instr; /* points to intermediate code instructions */
+#if defined(ENABLE_INLINING)
+# include "vm/jit/inline/inline.h"
+#endif
-int stack_count; /* number of stack elements */
-stackelement *stack; /* points to intermediate code instructions */
+#include "vm/jit/loop/analyze.h"
+#include "vm/jit/loop/graph.h"
+#include "vm/jit/loop/loop.h"
-bool isleafmethod; /* true if a method doesn't call subroutines */
+#if defined(ENABLE_IFCONV)
+# include "vm/jit/optimizing/ifconv.h"
+#endif
-basicblock *last_block; /* points to the end of the BB list */
+#include "vm/jit/optimizing/reorder.h"
-bool regs_ok; /* true if registers have been allocated */
+#include "vm/jit/verify/typecheck.h"
-/* list of all classes used by the compiled method which have to be */
-/* initialised (if not already done) before execution of this method */
-chain *uninitializedclasses;
+#include "vmcore/class.h"
+#include "vmcore/loader.h"
+#include "vmcore/method.h"
+#include "vmcore/options.h"
+#include "vmcore/rt-timing.h"
+#include "vmcore/statistics.h"
-int stackreq[256];
-
-#if defined(__I386__)
-/* these define if a method has ICMDs which use %edx or %ecx */
-bool method_uses_ecx;
-bool method_uses_edx;
+/* debug macros ***************************************************************/
+
+#if !defined(NDEBUG)
+#define DEBUG_JIT_COMPILEVERBOSE(x) \
+ do { \
+ if (compileverbose) { \
+ log_message_method(x, m); \
+ } \
+ } while (0)
+#else
+#define DEBUG_JIT_COMPILEVERBOSE(x) /* nothing */
+#endif
+
+
+/* the ICMD table ************************************************************/
+
+#if !defined(NDEBUG)
+#define N(name) name,
+#else
+#define N(name)
+#endif
+
+/* abbreviations for flags */
+
+#define PEI ICMDTABLE_PEI
+#define CALLS ICMDTABLE_CALLS
+
+/* some machine dependent values */
+
+#if SUPPORT_DIVISION
+#define IDIV_CALLS 0
+#else
+#define IDIV_CALLS ICMDTABLE_CALLS
#endif
+#if (SUPPORT_DIVISION && SUPPORT_LONG && SUPPORT_LONG_DIV)
+#define LDIV_CALLS 0
+#else
+#define LDIV_CALLS ICMDTABLE_CALLS
+#endif
+/* include the actual table */
+
+icmdtable_entry_t icmd_table[256] = {
+#include <vm/jit/icmdtable.inc>
+};
+
+#undef N
+#undef PEI
+#undef CALLS
+
+/* XXX hack until the old "PEI" definition is removed */
+#define PEI 1
+
+
+/* stackelement requirements of Java opcodes **********************************/
+
+int stackreq[256] = {
+ 0, /* JAVA_NOP 0 */
+ 1, /* JAVA_ACONST 1 */
+ 1, /* JAVA_ICONST_M1 2 */
+ 1, /* JAVA_ICONST_0 3 */
+ 1, /* JAVA_ICONST_1 4 */
+ 1, /* JAVA_ICONST_2 5 */
+ 1, /* JAVA_ICONST_3 6 */
+ 1, /* JAVA_ICONST_4 7 */
+ 1, /* JAVA_ICONST_5 8 */
+ 1, /* JAVA_LCONST_0 9 */
+ 1, /* JAVA_LCONST_1 10 */
+ 1, /* JAVA_FCONST_0 11 */
+ 1, /* JAVA_FCONST_1 12 */
+ 1, /* JAVA_FCONST_2 13 */
+ 1, /* JAVA_DCONST_0 14 */
+ 1, /* JAVA_DCONST_1 15 */
+ 1, /* JAVA_BIPUSH 16 */
+ 1, /* JAVA_SIPUSH 17 */
+ 1, /* JAVA_LDC 18 */
+ 1, /* JAVA_LDC_W 19 */
+ 1, /* JAVA_LDC2_W 20 */
+ 1, /* JAVA_ILOAD 21 */
+ 1, /* JAVA_LLOAD 22 */
+ 1, /* JAVA_FLOAD 23 */
+ 1, /* JAVA_DLOAD 24 */
+ 1, /* JAVA_ALOAD 25 */
+ 1, /* JAVA_ILOAD_0 26 */
+ 1, /* JAVA_ILOAD_1 27 */
+ 1, /* JAVA_ILOAD_2 28 */
+ 1, /* JAVA_ILOAD_3 29 */
+ 1, /* JAVA_LLOAD_0 30 */
+ 1, /* JAVA_LLOAD_1 31 */
+ 1, /* JAVA_LLOAD_2 32 */
+ 1, /* JAVA_LLOAD_3 33 */
+ 1, /* JAVA_FLOAD_0 34 */
+ 1, /* JAVA_FLOAD_1 35 */
+ 1, /* JAVA_FLOAD_2 36 */
+ 1, /* JAVA_FLOAD_3 37 */
+ 1, /* JAVA_DLOAD_0 38 */
+ 1, /* JAVA_DLOAD_1 39 */
+ 1, /* JAVA_DLOAD_2 40 */
+ 1, /* JAVA_DLOAD_3 41 */
+ 1, /* JAVA_ALOAD_0 42 */
+ 1, /* JAVA_ALOAD_1 43 */
+ 1, /* JAVA_ALOAD_2 44 */
+ 1, /* JAVA_ALOAD_3 45 */
+ 1, /* JAVA_IALOAD 46 */
+ 1, /* JAVA_LALOAD 47 */
+ 1, /* JAVA_FALOAD 48 */
+ 1, /* JAVA_DALOAD 49 */
+ 1, /* JAVA_AALOAD 50 */
+ 1, /* JAVA_BALOAD 51 */
+ 1, /* JAVA_CALOAD 52 */
+ 1, /* JAVA_SALOAD 53 */
+ 0, /* JAVA_ISTORE 54 */
+ 0, /* JAVA_LSTORE 55 */
+ 0, /* JAVA_FSTORE 56 */
+ 0, /* JAVA_DSTORE 57 */
+ 0, /* JAVA_ASTORE 58 */
+ 0, /* JAVA_ISTORE_0 59 */
+ 0, /* JAVA_ISTORE_1 60 */
+ 0, /* JAVA_ISTORE_2 61 */
+ 0, /* JAVA_ISTORE_3 62 */
+ 0, /* JAVA_LSTORE_0 63 */
+ 0, /* JAVA_LSTORE_1 64 */
+ 0, /* JAVA_LSTORE_2 65 */
+ 0, /* JAVA_LSTORE_3 66 */
+ 0, /* JAVA_FSTORE_0 67 */
+ 0, /* JAVA_FSTORE_1 68 */
+ 0, /* JAVA_FSTORE_2 69 */
+ 0, /* JAVA_FSTORE_3 70 */
+ 0, /* JAVA_DSTORE_0 71 */
+ 0, /* JAVA_DSTORE_1 72 */
+ 0, /* JAVA_DSTORE_2 73 */
+ 0, /* JAVA_DSTORE_3 74 */
+ 0, /* JAVA_ASTORE_0 75 */
+ 0, /* JAVA_ASTORE_1 76 */
+ 0, /* JAVA_ASTORE_2 77 */
+ 0, /* JAVA_ASTORE_3 78 */
+ 0, /* JAVA_IASTORE 79 */
+ 0, /* JAVA_LASTORE 80 */
+ 0, /* JAVA_FASTORE 81 */
+ 0, /* JAVA_DASTORE 82 */
+ 0, /* JAVA_AASTORE 83 */
+ 0, /* JAVA_BASTORE 84 */
+ 0, /* JAVA_CASTORE 85 */
+ 0, /* JAVA_SASTORE 86 */
+ 0, /* JAVA_POP 87 */
+ 0, /* JAVA_POP2 88 */
+ 1, /* JAVA_DUP 89 */
+ 1+3, /* JAVA_DUP_X1 90 */
+ 2+4, /* JAVA_DUP_X2 91 */
+ 2, /* JAVA_DUP2 92 */
+ 2+5, /* JAVA_DUP2_X1 93 */
+ 3+6, /* JAVA_DUP2_X2 94 */
+ 1+2, /* JAVA_SWAP 95 */
+ 1, /* JAVA_IADD 96 */
+ 1, /* JAVA_LADD 97 */
+ 1, /* JAVA_FADD 98 */
+ 1, /* JAVA_DADD 99 */
+ 1, /* JAVA_ISUB 100 */
+ 1, /* JAVA_LSUB 101 */
+ 1, /* JAVA_FSUB 102 */
+ 1, /* JAVA_DSUB 103 */
+ 1, /* JAVA_IMUL 104 */
+ 1, /* JAVA_LMUL 105 */
+ 1, /* JAVA_FMUL 106 */
+ 1, /* JAVA_DMUL 107 */
+ 1, /* JAVA_IDIV 108 */
+ 1, /* JAVA_LDIV 109 */
+ 1, /* JAVA_FDIV 110 */
+ 1, /* JAVA_DDIV 111 */
+ 1, /* JAVA_IREM 112 */
+ 1, /* JAVA_LREM 113 */
+ 1, /* JAVA_FREM 114 */
+ 1, /* JAVA_DREM 115 */
+ 1, /* JAVA_INEG 116 */
+ 1, /* JAVA_LNEG 117 */
+ 1, /* JAVA_FNEG 118 */
+ 1, /* JAVA_DNEG 119 */
+ 1, /* JAVA_ISHL 120 */
+ 1, /* JAVA_LSHL 121 */
+ 1, /* JAVA_ISHR 122 */
+ 1, /* JAVA_LSHR 123 */
+ 1, /* JAVA_IUSHR 124 */
+ 1, /* JAVA_LUSHR 125 */
+ 1, /* JAVA_IAND 126 */
+ 1, /* JAVA_LAND 127 */
+ 1, /* JAVA_IOR 128 */
+ 1, /* JAVA_LOR 129 */
+ 1, /* JAVA_IXOR 130 */
+ 1, /* JAVA_LXOR 131 */
+ 0, /* JAVA_IINC 132 */
+ 1, /* JAVA_I2L 133 */
+ 1, /* JAVA_I2F 134 */
+ 1, /* JAVA_I2D 135 */
+ 1, /* JAVA_L2I 136 */
+ 1, /* JAVA_L2F 137 */
+ 1, /* JAVA_L2D 138 */
+ 1, /* JAVA_F2I 139 */
+ 1, /* JAVA_F2L 140 */
+ 1, /* JAVA_F2D 141 */
+ 1, /* JAVA_D2I 142 */
+ 1, /* JAVA_D2L 143 */
+ 1, /* JAVA_D2F 144 */
+ 1, /* JAVA_INT2BYTE 145 */
+ 1, /* JAVA_INT2CHAR 146 */
+ 1, /* JAVA_INT2SHORT 147 */
+ 1, /* JAVA_LCMP 148 */
+ 1, /* JAVA_FCMPL 149 */
+ 1, /* JAVA_FCMPG 150 */
+ 1, /* JAVA_DCMPL 151 */
+ 1, /* JAVA_DCMPG 152 */
+ 0, /* JAVA_IFEQ 153 */
+ 0, /* JAVA_IFNE 154 */
+ 0, /* JAVA_IFLT 155 */
+ 0, /* JAVA_IFGE 156 */
+ 0, /* JAVA_IFGT 157 */
+ 0, /* JAVA_IFLE 158 */
+ 0, /* JAVA_IF_ICMPEQ 159 */
+ 0, /* JAVA_IF_ICMPNE 160 */
+ 0, /* JAVA_IF_ICMPLT 161 */
+ 0, /* JAVA_IF_ICMPGE 162 */
+ 0, /* JAVA_IF_ICMPGT 163 */
+ 0, /* JAVA_IF_ICMPLE 164 */
+ 0, /* JAVA_IF_ACMPEQ 165 */
+ 0, /* JAVA_IF_ACMPNE 166 */
+ 0, /* JAVA_GOTO 167 */
+ 1, /* JAVA_JSR 168 */
+ 0, /* JAVA_RET 169 */
+ 0, /* JAVA_TABLESWITCH 170 */
+ 0, /* JAVA_LOOKUPSWITCH 171 */
+ 0, /* JAVA_IRETURN 172 */
+ 0, /* JAVA_LRETURN 173 */
+ 0, /* JAVA_FRETURN 174 */
+ 0, /* JAVA_DRETURN 175 */
+ 0, /* JAVA_ARETURN 176 */
+ 0, /* JAVA_RETURN 177 */
+ 1, /* JAVA_GETSTATIC 178 */
+ 0, /* JAVA_PUTSTATIC 179 */
+ 1, /* JAVA_GETFIELD 180 */
+ 0, /* JAVA_PUTFIELD 181 */
+ 1, /* JAVA_INVOKEVIRTUAL 182 */
+ 1, /* JAVA_INVOKESPECIAL 183 */
+ 1, /* JAVA_INVOKESTATIC 184 */
+ 1, /* JAVA_INVOKEINTERFACE 185 */
+ 1, /* JAVA_UNDEF186 186 */
+ 1, /* JAVA_NEW 187 */
+ 1, /* JAVA_NEWARRAY 188 */
+ 1, /* JAVA_ANEWARRAY 189 */
+ 1, /* JAVA_ARRAYLENGTH 190 */
+ 1, /* JAVA_ATHROW 191 */
+ 1, /* JAVA_CHECKCAST 192 */
+ 1, /* JAVA_INSTANCEOF 193 */
+ 0, /* JAVA_MONITORENTER 194 */
+ 0, /* JAVA_MONITOREXIT 195 */
+ 0, /* JAVA_WIDE 196 */
+ 1, /* JAVA_MULTIANEWARRAY 197 */
+ 0, /* JAVA_IFNULL 198 */
+ 0, /* JAVA_IFNONNULL 199 */
+ 0, /* JAVA_GOTO_W 200 */
+ 1, /* JAVA_JSR_W 201 */
+ 0, /* JAVA_BREAKPOINT 202 */
+ 1, /* JAVA_UNDEF203 203 */
+ 1, /* JAVA_UNDEF204 204 */
+ 1, /* JAVA_UNDEF205 205 */
+ 1, /* JAVA_UNDEF206 206 */
+ 1, /* JAVA_UNDEF207 207 */
+ 1, /* JAVA_UNDEF208 208 */
+ 1, /* JAVA_UNDEF209 209 */
+ 1, /* JAVA_UNDEF210 210 */
+ 1, /* JAVA_UNDEF211 211 */
+ 1, /* JAVA_UNDEF212 212 */
+ 1, /* JAVA_UNDEF213 213 */
+ 1, /* JAVA_UNDEF214 214 */
+ 1, /* JAVA_UNDEF215 215 */
+ 1, /* JAVA_UNDEF216 216 */
+ 1, /* JAVA_UNDEF217 217 */
+ 1, /* JAVA_UNDEF218 218 */
+ 1, /* JAVA_UNDEF219 219 */
+ 1, /* JAVA_UNDEF220 220 */
+ 1, /* JAVA_UNDEF221 221 */
+ 1, /* JAVA_UNDEF222 222 */
+ 1, /* JAVA_UNDEF223 223 */
+ 1, /* JAVA_UNDEF224 224 */
+ 1, /* JAVA_UNDEF225 225 */
+ 1, /* JAVA_UNDEF226 226 */
+ 1, /* JAVA_UNDEF227 227 */
+ 1, /* JAVA_UNDEF228 228 */
+ 1, /* JAVA_UNDEF229 229 */
+ 1, /* JAVA_UNDEF230 230 */
+ 1, /* JAVA_UNDEF231 231 */
+ 1, /* JAVA_UNDEF232 232 */
+ 1, /* JAVA_UNDEF233 233 */
+ 1, /* JAVA_UNDEF234 234 */
+ 1, /* JAVA_UNDEF235 235 */
+ 1, /* JAVA_UNDEF236 236 */
+ 1, /* JAVA_UNDEF237 237 */
+ 1, /* JAVA_UNDEF238 238 */
+ 1, /* JAVA_UNDEF239 239 */
+ 1, /* JAVA_UNDEF240 240 */
+ 1, /* JAVA_UNDEF241 241 */
+ 1, /* JAVA_UNDEF242 242 */
+ 1, /* JAVA_UNDEF243 243 */
+ 1, /* JAVA_UNDEF244 244 */
+ 1, /* JAVA_UNDEF245 245 */
+ 1, /* JAVA_UNDEF246 246 */
+ 1, /* JAVA_UNDEF247 247 */
+ 1, /* JAVA_UNDEF248 248 */
+ 1, /* JAVA_UNDEF249 249 */
+ 1, /* JAVA_UNDEF250 250 */
+ 1, /* JAVA_UNDEF251 251 */
+ 1, /* JAVA_UNDEF252 252 */
+ 1, /* JAVA_UNDEF253 253 */
+ 1, /* JAVA_UNDEF254 254 */
+ 1, /* JAVA_UNDEF255 255 */
+};
+
+
+/* size in bytes of Java opcodes **********************************************/
+
int jcommandsize[256] = {
-#define JAVA_NOP 0
-#define ICMD_NOP 0
- 1,
-#define JAVA_ACONST_NULL 1
-#define ICMD_ACONST 1 /* val.a = constant */
- 1,
-#define JAVA_ICONST_M1 2
-#define ICMD_NULLCHECKPOP 2
- 1,
-#define JAVA_ICONST_0 3
-#define ICMD_ICONST 3 /* val.i = constant */
- 1,
-#define JAVA_ICONST_1 4
-#define ICMD_IREM0X10001 4
- 1,
-#define JAVA_ICONST_2 5
-#define ICMD_IDIVPOW2 5 /* val.i = constant */
- 1,
-#define JAVA_ICONST_3 6
-#define ICMD_LDIVPOW2 6 /* val.l = constant */
- 1,
-#define JAVA_ICONST_4 7
- 1,
-#define JAVA_ICONST_5 8
-#define ICMD_LREM0X10001 8
- 1,
-#define JAVA_LCONST_0 9
-#define ICMD_LCONST 9 /* val.l = constant */
- 1,
-#define JAVA_LCONST_1 10
-#define ICMD_LCMPCONST 10 /* val.l = constant */
- 1,
-#define JAVA_FCONST_0 11
-#define ICMD_FCONST 11 /* val.f = constant */
- 1,
-#define JAVA_FCONST_1 12
- 1,
-#define JAVA_FCONST_2 13
-#define ICMD_ELSE_ICONST 13
- 1,
-#define JAVA_DCONST_0 14
-#define ICMD_DCONST 14 /* val.d = constant */
- 1,
-#define JAVA_DCONST_1 15
-#define ICMD_IFEQ_ICONST 15
- 1,
-#define JAVA_BIPUSH 16
-#define ICMD_IFNE_ICONST 16
- 2,
-#define JAVA_SIPUSH 17
-#define ICMD_IFLT_ICONST 17
- 3,
-#define JAVA_LDC1 18
-#define ICMD_IFGE_ICONST 18
- 2,
-#define JAVA_LDC2 19
-#define ICMD_IFGT_ICONST 19
- 3,
-#define JAVA_LDC2W 20
-#define ICMD_IFLE_ICONST 20
- 3,
- /* order of LOAD instructions must be */
- /* equal to order of TYPE_XXX defines */
-#define JAVA_ILOAD 21
-#define ICMD_ILOAD 21 /* op1 = local variable */
- 2,
-#define JAVA_LLOAD 22
-#define ICMD_LLOAD 22 /* op1 = local variable */
- 2,
-#define JAVA_FLOAD 23
-#define ICMD_FLOAD 23 /* op1 = local variable */
- 2,
-#define JAVA_DLOAD 24
-#define ICMD_DLOAD 24 /* op1 = local variable */
- 2,
-#define JAVA_ALOAD 25
-#define ICMD_ALOAD 25 /* op1 = local variable */
- 2,
-#define JAVA_ILOAD_0 26
-#define ICMD_IADDCONST 26 /* val.i = constant */
- 1,
-#define JAVA_ILOAD_1 27
-#define ICMD_ISUBCONST 27 /* val.i = constant */
- 1,
-#define JAVA_ILOAD_2 28
-#define ICMD_IMULCONST 28 /* val.i = constant */
- 1,
-#define JAVA_ILOAD_3 29
-#define ICMD_IANDCONST 29 /* val.i = constant */
- 1,
-#define JAVA_LLOAD_0 30
-#define ICMD_IORCONST 30 /* val.i = constant */
- 1,
-#define JAVA_LLOAD_1 31
-#define ICMD_IXORCONST 31 /* val.i = constant */
- 1,
-#define JAVA_LLOAD_2 32
-#define ICMD_ISHLCONST 32 /* val.i = constant */
- 1,
-#define JAVA_LLOAD_3 33
-#define ICMD_ISHRCONST 33 /* val.i = constant */
- 1,
-#define JAVA_FLOAD_0 34
-#define ICMD_IUSHRCONST 34 /* val.i = constant */
- 1,
-#define JAVA_FLOAD_1 35
-#define ICMD_IREMPOW2 35 /* val.i = constant */
- 1,
-#define JAVA_FLOAD_2 36
-#define ICMD_LADDCONST 36 /* val.l = constant */
- 1,
-#define JAVA_FLOAD_3 37
-#define ICMD_LSUBCONST 37 /* val.l = constant */
- 1,
-#define JAVA_DLOAD_0 38
-#define ICMD_LMULCONST 38 /* val.l = constant */
- 1,
-#define JAVA_DLOAD_1 39
-#define ICMD_LANDCONST 39 /* val.l = constant */
- 1,
-#define JAVA_DLOAD_2 40
-#define ICMD_LORCONST 40 /* val.l = constant */
- 1,
-#define JAVA_DLOAD_3 41
-#define ICMD_LXORCONST 41 /* val.l = constant */
- 1,
-#define JAVA_ALOAD_0 42
-#define ICMD_LSHLCONST 42 /* val.l = constant */
- 1,
-#define JAVA_ALOAD_1 43
-#define ICMD_LSHRCONST 43 /* val.l = constant */
- 1,
-#define JAVA_ALOAD_2 44
-#define ICMD_LUSHRCONST 44 /* val.l = constant */
- 1,
-#define JAVA_ALOAD_3 45
-#define ICMD_LREMPOW2 45 /* val.l = constant */
- 1,
-#define JAVA_IALOAD 46
-#define ICMD_IALOAD 46
- 1,
-#define JAVA_LALOAD 47
-#define ICMD_LALOAD 47
- 1,
-#define JAVA_FALOAD 48
-#define ICMD_FALOAD 48
- 1,
-#define JAVA_DALOAD 49
-#define ICMD_DALOAD 49
- 1,
-#define JAVA_AALOAD 50
-#define ICMD_AALOAD 50
- 1,
-#define JAVA_BALOAD 51
-#define ICMD_BALOAD 51
- 1,
-#define JAVA_CALOAD 52
-#define ICMD_CALOAD 52
- 1,
-#define JAVA_SALOAD 53
-#define ICMD_SALOAD 53
- 1,
- /* order of STORE instructions must be*/
- /* equal to order of TYPE_XXX defines */
-#define JAVA_ISTORE 54
-#define ICMD_ISTORE 54 /* op1 = local variable */
- 2,
-#define JAVA_LSTORE 55
-#define ICMD_LSTORE 55 /* op1 = local variable */
- 2,
-#define JAVA_FSTORE 56
-#define ICMD_FSTORE 56 /* op1 = local variable */
- 2,
-#define JAVA_DSTORE 57
-#define ICMD_DSTORE 57 /* op1 = local variable */
- 2,
-#define JAVA_ASTORE 58
-#define ICMD_ASTORE 58 /* op1 = local variable */
- 2,
-#define JAVA_ISTORE_0 59
-#define ICMD_IF_LEQ 59 /* op1 = target JavaVM pc, val.l */
- 1,
-#define JAVA_ISTORE_1 60
-#define ICMD_IF_LNE 60 /* op1 = target JavaVM pc, val.l */
- 1,
-#define JAVA_ISTORE_2 61
-#define ICMD_IF_LLT 61 /* op1 = target JavaVM pc, val.l */
- 1,
-#define JAVA_ISTORE_3 62
-#define ICMD_IF_LGE 62 /* op1 = target JavaVM pc, val.l */
- 1,
-#define JAVA_LSTORE_0 63
-#define ICMD_IF_LGT 63 /* op1 = target JavaVM pc, val.l */
- 1,
-#define JAVA_LSTORE_1 64
-#define ICMD_IF_LLE 64 /* op1 = target JavaVM pc, val.l */
- 1,
-#define JAVA_LSTORE_2 65
-#define ICMD_IF_LCMPEQ 65 /* op1 = target JavaVM pc */
- 1,
-#define JAVA_LSTORE_3 66
-#define ICMD_IF_LCMPNE 66 /* op1 = target JavaVM pc */
- 1,
-#define JAVA_FSTORE_0 67
-#define ICMD_IF_LCMPLT 67 /* op1 = target JavaVM pc */
- 1,
-#define JAVA_FSTORE_1 68
-#define ICMD_IF_LCMPGE 68 /* op1 = target JavaVM pc */
- 1,
-#define JAVA_FSTORE_2 69
-#define ICMD_IF_LCMPGT 69 /* op1 = target JavaVM pc */
- 1,
-#define JAVA_FSTORE_3 70
-#define ICMD_IF_LCMPLE 70 /* op1 = target JavaVM pc */
- 1,
-#define JAVA_DSTORE_0 71
- 1,
-#define JAVA_DSTORE_1 72
- 1,
-#define JAVA_DSTORE_2 73
- 1,
-#define JAVA_DSTORE_3 74
- 1,
-#define JAVA_ASTORE_0 75
- 1,
-#define JAVA_ASTORE_1 76
- 1,
-#define JAVA_ASTORE_2 77
- 1,
-#define JAVA_ASTORE_3 78
- 1,
-#define JAVA_IASTORE 79
-#define ICMD_IASTORE 79
- 1,
-#define JAVA_LASTORE 80
-#define ICMD_LASTORE 80
- 1,
-#define JAVA_FASTORE 81
-#define ICMD_FASTORE 81
- 1,
-#define JAVA_DASTORE 82
-#define ICMD_DASTORE 82
- 1,
-#define JAVA_AASTORE 83
-#define ICMD_AASTORE 83
- 1,
-#define JAVA_BASTORE 84
-#define ICMD_BASTORE 84
- 1,
-#define JAVA_CASTORE 85
-#define ICMD_CASTORE 85
- 1,
-#define JAVA_SASTORE 86
-#define ICMD_SASTORE 86
- 1,
-#define JAVA_POP 87
-#define ICMD_POP 87
- 1,
-#define JAVA_POP2 88
-#define ICMD_POP2 88
- 1,
-#define JAVA_DUP 89
-#define ICMD_DUP 89
- 1,
-#define JAVA_DUP_X1 90
-#define ICMD_DUP_X1 90
- 1,
-#define JAVA_DUP_X2 91
-#define ICMD_DUP_X2 91
- 1,
-#define JAVA_DUP2 92
-#define ICMD_DUP2 92
- 1,
-#define JAVA_DUP2_X1 93
-#define ICMD_DUP2_X1 93
- 1,
-#define JAVA_DUP2_X2 94
-#define ICMD_DUP2_X2 94
- 1,
-#define JAVA_SWAP 95
-#define ICMD_SWAP 95
- 1,
-#define JAVA_IADD 96
-#define ICMD_IADD 96
- 1,
-#define JAVA_LADD 97
-#define ICMD_LADD 97
- 1,
-#define JAVA_FADD 98
-#define ICMD_FADD 98
- 1,
-#define JAVA_DADD 99
-#define ICMD_DADD 99
- 1,
-#define JAVA_ISUB 100
-#define ICMD_ISUB 100
- 1,
-#define JAVA_LSUB 101
-#define ICMD_LSUB 101
- 1,
-#define JAVA_FSUB 102
-#define ICMD_FSUB 102
- 1,
-#define JAVA_DSUB 103
-#define ICMD_DSUB 103
- 1,
-#define JAVA_IMUL 104
-#define ICMD_IMUL 104
+ 1, /* JAVA_NOP 0 */
+ 1, /* JAVA_ACONST_NULL 1 */
+ 1, /* JAVA_ICONST_M1 2 */
+ 1, /* JAVA_ICONST_0 3 */
+ 1, /* JAVA_ICONST_1 4 */
+ 1, /* JAVA_ICONST_2 5 */
+ 1, /* JAVA_ICONST_3 6 */
+ 1, /* JAVA_ICONST_4 7 */
+ 1, /* JAVA_ICONST_5 8 */
+ 1, /* JAVA_LCONST_0 9 */
+ 1, /* JAVA_LCONST_1 10 */
+ 1, /* JAVA_FCONST_0 11 */
+ 1, /* JAVA_FCONST_1 12 */
+ 1, /* JAVA_FCONST_2 13 */
+ 1, /* JAVA_DCONST_0 14 */
+ 1, /* JAVA_DCONST_1 15 */
+ 2, /* JAVA_BIPUSH 16 */
+ 3, /* JAVA_SIPUSH 17 */
+ 2, /* JAVA_LDC1 18 */
+ 3, /* JAVA_LDC2 19 */
+ 3, /* JAVA_LDC2W 20 */
+ 2, /* JAVA_ILOAD 21 */
+ 2, /* JAVA_LLOAD 22 */
+ 2, /* JAVA_FLOAD 23 */
+ 2, /* JAVA_DLOAD 24 */
+ 2, /* JAVA_ALOAD 25 */
+ 1, /* JAVA_ILOAD_0 26 */
+ 1, /* JAVA_ILOAD_1 27 */
+ 1, /* JAVA_ILOAD_2 28 */
+ 1, /* JAVA_ILOAD_3 29 */
+ 1, /* JAVA_LLOAD_0 30 */
+ 1, /* JAVA_LLOAD_1 31 */
+ 1, /* JAVA_LLOAD_2 32 */
+ 1, /* JAVA_LLOAD_3 33 */
+ 1, /* JAVA_FLOAD_0 34 */
+ 1, /* JAVA_FLOAD_1 35 */
+ 1, /* JAVA_FLOAD_2 36 */
+ 1, /* JAVA_FLOAD_3 37 */
+ 1, /* JAVA_DLOAD_0 38 */
+ 1, /* JAVA_DLOAD_1 39 */
+ 1, /* JAVA_DLOAD_2 40 */
+ 1, /* JAVA_DLOAD_3 41 */
+ 1, /* JAVA_ALOAD_0 42 */
+ 1, /* JAVA_ALOAD_1 43 */
+ 1, /* JAVA_ALOAD_2 44 */
+ 1, /* JAVA_ALOAD_3 45 */
+ 1, /* JAVA_IALOAD 46 */
+ 1, /* JAVA_LALOAD 47 */
+ 1, /* JAVA_FALOAD 48 */
+ 1, /* JAVA_DALOAD 49 */
+ 1, /* JAVA_AALOAD 50 */
+ 1, /* JAVA_BALOAD 51 */
+ 1, /* JAVA_CALOAD 52 */
+ 1, /* JAVA_SALOAD 53 */
+ 2, /* JAVA_ISTORE 54 */
+ 2, /* JAVA_LSTORE 55 */
+ 2, /* JAVA_FSTORE 56 */
+ 2, /* JAVA_DSTORE 57 */
+ 2, /* JAVA_ASTORE 58 */
+ 1, /* JAVA_ISTORE_0 59 */
+ 1, /* JAVA_ISTORE_1 60 */
+ 1, /* JAVA_ISTORE_2 61 */
+ 1, /* JAVA_ISTORE_3 62 */
+ 1, /* JAVA_LSTORE_0 63 */
+ 1, /* JAVA_LSTORE_1 64 */
+ 1, /* JAVA_LSTORE_2 65 */
+ 1, /* JAVA_LSTORE_3 66 */
+ 1, /* JAVA_FSTORE_0 67 */
+ 1, /* JAVA_FSTORE_1 68 */
+ 1, /* JAVA_FSTORE_2 69 */
+ 1, /* JAVA_FSTORE_3 70 */
+ 1, /* JAVA_DSTORE_0 71 */
+ 1, /* JAVA_DSTORE_1 72 */
+ 1, /* JAVA_DSTORE_2 73 */
+ 1, /* JAVA_DSTORE_3 74 */
+ 1, /* JAVA_ASTORE_0 75 */
+ 1, /* JAVA_ASTORE_1 76 */
+ 1, /* JAVA_ASTORE_2 77 */
+ 1, /* JAVA_ASTORE_3 78 */
+ 1, /* JAVA_IASTORE 79 */
+ 1, /* JAVA_LASTORE 80 */
+ 1, /* JAVA_FASTORE 81 */
+ 1, /* JAVA_DASTORE 82 */
+ 1, /* JAVA_AASTORE 83 */
+ 1, /* JAVA_BASTORE 84 */
+ 1, /* JAVA_CASTORE 85 */
+ 1, /* JAVA_SASTORE 86 */
+ 1, /* JAVA_POP 87 */
+ 1, /* JAVA_POP2 88 */
+ 1, /* JAVA_DUP 89 */
+ 1, /* JAVA_DUP_X1 90 */
+ 1, /* JAVA_DUP_X2 91 */
+ 1, /* JAVA_DUP2 92 */
+ 1, /* JAVA_DUP2_X1 93 */
+ 1, /* JAVA_DUP2_X2 94 */
+ 1, /* JAVA_SWAP 95 */
+ 1, /* JAVA_IADD 96 */
+ 1, /* JAVA_LADD 97 */
+ 1, /* JAVA_FADD 98 */
+ 1, /* JAVA_DADD 99 */
+ 1, /* JAVA_ISUB 100 */
+ 1, /* JAVA_LSUB 101 */
+ 1, /* JAVA_FSUB 102 */
+ 1, /* JAVA_DSUB 103 */
+ 1, /* JAVA_IMUL 104 */
+ 1, /* JAVA_LMUL 105 */
+ 1, /* JAVA_FMUL 106 */
+ 1, /* JAVA_DMUL 107 */
+ 1, /* JAVA_IDIV 108 */
+ 1, /* JAVA_LDIV 109 */
+ 1, /* JAVA_FDIV 110 */
+ 1, /* JAVA_DDIV 111 */
+ 1, /* JAVA_IREM 112 */
+ 1, /* JAVA_LREM 113 */
+ 1, /* JAVA_FREM 114 */
+ 1, /* JAVA_DREM 115 */
+ 1, /* JAVA_INEG 116 */
+ 1, /* JAVA_LNEG 117 */
+ 1, /* JAVA_FNEG 118 */
+ 1, /* JAVA_DNEG 119 */
+ 1, /* JAVA_ISHL 120 */
+ 1, /* JAVA_LSHL 121 */
+ 1, /* JAVA_ISHR 122 */
+ 1, /* JAVA_LSHR 123 */
+ 1, /* JAVA_IUSHR 124 */
+ 1, /* JAVA_LUSHR 125 */
+ 1, /* JAVA_IAND 126 */
+ 1, /* JAVA_LAND 127 */
+ 1, /* JAVA_IOR 128 */
+ 1, /* JAVA_LOR 129 */
+ 1, /* JAVA_IXOR 130 */
+ 1, /* JAVA_LXOR 131 */
+ 3, /* JAVA_IINC 132 */
+ 1, /* JAVA_I2L 133 */
+ 1, /* JAVA_I2F 134 */
+ 1, /* JAVA_I2D 135 */
+ 1, /* JAVA_L2I 136 */
+ 1, /* JAVA_L2F 137 */
+ 1, /* JAVA_L2D 138 */
+ 1, /* JAVA_F2I 139 */
+ 1, /* JAVA_F2L 140 */
+ 1, /* JAVA_F2D 141 */
+ 1, /* JAVA_D2I 142 */
+ 1, /* JAVA_D2L 143 */
+ 1, /* JAVA_D2F 144 */
+ 1, /* JAVA_INT2BYTE 145 */
+ 1, /* JAVA_INT2CHAR 146 */
+ 1, /* JAVA_INT2SHORT 147 */
+ 1, /* JAVA_LCMP 148 */
+ 1, /* JAVA_FCMPL 149 */
+ 1, /* JAVA_FCMPG 150 */
+ 1, /* JAVA_DCMPL 151 */
+ 1, /* JAVA_DCMPG 152 */
+ 3, /* JAVA_IFEQ 153 */
+ 3, /* JAVA_IFNE 154 */
+ 3, /* JAVA_IFLT 155 */
+ 3, /* JAVA_IFGE 156 */
+ 3, /* JAVA_IFGT 157 */
+ 3, /* JAVA_IFLE 158 */
+ 3, /* JAVA_IF_ICMPEQ 159 */
+ 3, /* JAVA_IF_ICMPNE 160 */
+ 3, /* JAVA_IF_ICMPLT 161 */
+ 3, /* JAVA_IF_ICMPGE 162 */
+ 3, /* JAVA_IF_ICMPGT 163 */
+ 3, /* JAVA_IF_ICMPLE 164 */
+ 3, /* JAVA_IF_ACMPEQ 165 */
+ 3, /* JAVA_IF_ACMPNE 166 */
+ 3, /* JAVA_GOTO 167 */
+ 3, /* JAVA_JSR 168 */
+ 2, /* JAVA_RET 169 */
+ 0, /* JAVA_TABLESWITCH 170 */ /* variable length */
+ 0, /* JAVA_LOOKUPSWITCH 171 */ /* variable length */
+ 1, /* JAVA_IRETURN 172 */
+ 1, /* JAVA_LRETURN 173 */
+ 1, /* JAVA_FRETURN 174 */
+ 1, /* JAVA_DRETURN 175 */
+ 1, /* JAVA_ARETURN 176 */
+ 1, /* JAVA_RETURN 177 */
+ 3, /* JAVA_GETSTATIC 178 */
+ 3, /* JAVA_PUTSTATIC 179 */
+ 3, /* JAVA_GETFIELD 180 */
+ 3, /* JAVA_PUTFIELD 181 */
+ 3, /* JAVA_INVOKEVIRTUAL 182 */
+ 3, /* JAVA_INVOKESPECIAL 183 */
+ 3, /* JAVA_INVOKESTATIC 184 */
+ 5, /* JAVA_INVOKEINTERFACE 185 */
+ 1, /* UNDEF186 */
+ 3, /* JAVA_NEW 187 */
+ 2, /* JAVA_NEWARRAY 188 */
+ 3, /* JAVA_ANEWARRAY 189 */
+ 1, /* JAVA_ARRAYLENGTH 190 */
+ 1, /* JAVA_ATHROW 191 */
+ 3, /* JAVA_CHECKCAST 192 */
+ 3, /* JAVA_INSTANCEOF 193 */
+ 1, /* JAVA_MONITORENTER 194 */
+ 1, /* JAVA_MONITOREXIT 195 */
+ 0, /* JAVA_WIDE 196 */ /* variable length */
+ 4, /* JAVA_MULTIANEWARRAY 197 */
+ 3, /* JAVA_IFNULL 198 */
+ 3, /* JAVA_IFNONNULL 199 */
+ 5, /* JAVA_GOTO_W 200 */
+ 5, /* JAVA_JSR_W 201 */
+ 1, /* JAVA_BREAKPOINT 202 */
+
+ 1, /* UNDEF203 */
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1, /* UNDEF210 */
+ 1,
+ 1,
+ 1,
+ 1,
1,
-#define JAVA_LMUL 105
-#define ICMD_LMUL 105
1,
-#define JAVA_FMUL 106
-#define ICMD_FMUL 106
1,
-#define JAVA_DMUL 107
-#define ICMD_DMUL 107
1,
-#define JAVA_IDIV 108
-#define ICMD_IDIV 108
1,
-#define JAVA_LDIV 109
-#define ICMD_LDIV 109
+ 1, /* UNDEF220 */
1,
-#define JAVA_FDIV 110
-#define ICMD_FDIV 110
1,
-#define JAVA_DDIV 111
-#define ICMD_DDIV 111
1,
-#define JAVA_IREM 112
-#define ICMD_IREM 112
1,
-#define JAVA_LREM 113
-#define ICMD_LREM 113
1,
-#define JAVA_FREM 114
-#define ICMD_FREM 114
1,
-#define JAVA_DREM 115
-#define ICMD_DREM 115
1,
-#define JAVA_INEG 116
-#define ICMD_INEG 116
1,
-#define JAVA_LNEG 117
-#define ICMD_LNEG 117
1,
-#define JAVA_FNEG 118
-#define ICMD_FNEG 118
+ 1, /* UNDEF230 */
1,
-#define JAVA_DNEG 119
-#define ICMD_DNEG 119
1,
-#define JAVA_ISHL 120
-#define ICMD_ISHL 120
1,
-#define JAVA_LSHL 121
-#define ICMD_LSHL 121
- 1,
-#define JAVA_ISHR 122
-#define ICMD_ISHR 122
- 1,
-#define JAVA_LSHR 123
-#define ICMD_LSHR 123
- 1,
-#define JAVA_IUSHR 124
-#define ICMD_IUSHR 124
- 1,
-#define JAVA_LUSHR 125
-#define ICMD_LUSHR 125
- 1,
-#define JAVA_IAND 126
-#define ICMD_IAND 126
- 1,
-#define JAVA_LAND 127
-#define ICMD_LAND 127
- 1,
-#define JAVA_IOR 128
-#define ICMD_IOR 128
- 1,
-#define JAVA_LOR 129
-#define ICMD_LOR 129
- 1,
-#define JAVA_IXOR 130
-#define ICMD_IXOR 130
- 1,
-#define JAVA_LXOR 131
-#define ICMD_LXOR 131
- 1,
-#define JAVA_IINC 132
-#define ICMD_IINC 132 /* op1 = local variable, val.i = constant */
- 3,
-#define JAVA_I2L 133
-#define ICMD_I2L 133
- 1,
-#define JAVA_I2F 134
-#define ICMD_I2F 134
- 1,
-#define JAVA_I2D 135
-#define ICMD_I2D 135
- 1,
-#define JAVA_L2I 136
-#define ICMD_L2I 136
- 1,
-#define JAVA_L2F 137
-#define ICMD_L2F 137
- 1,
-#define JAVA_L2D 138
-#define ICMD_L2D 138
- 1,
-#define JAVA_F2I 139
-#define ICMD_F2I 139
- 1,
-#define JAVA_F2L 140
-#define ICMD_F2L 140
- 1,
-#define JAVA_F2D 141
-#define ICMD_F2D 141
- 1,
-#define JAVA_D2I 142
-#define ICMD_D2I 142
- 1,
-#define JAVA_D2L 143
-#define ICMD_D2L 143
- 1,
-#define JAVA_D2F 144
-#define ICMD_D2F 144
- 1,
-#define JAVA_INT2BYTE 145
-#define ICMD_INT2BYTE 145
- 1,
-#define JAVA_INT2CHAR 146
-#define ICMD_INT2CHAR 146
- 1,
-#define JAVA_INT2SHORT 147
-#define ICMD_INT2SHORT 147
- 1,
-#define JAVA_LCMP 148
-#define ICMD_LCMP 148
- 1,
-#define JAVA_FCMPL 149
-#define ICMD_FCMPL 149
- 1,
-#define JAVA_FCMPG 150
-#define ICMD_FCMPG 150
- 1,
-#define JAVA_DCMPL 151
-#define ICMD_DCMPL 151
- 1,
-#define JAVA_DCMPG 152
-#define ICMD_DCMPG 152
- 1,
-#define JAVA_IFEQ 153
-#define ICMD_IFEQ 153 /* op1 = target JavaVM pc, val.i */
- 3,
-#define JAVA_IFNE 154
-#define ICMD_IFNE 154 /* op1 = target JavaVM pc, val.i */
- 3,
-#define JAVA_IFLT 155
-#define ICMD_IFLT 155 /* op1 = target JavaVM pc, val.i */
- 3,
-#define JAVA_IFGE 156
-#define ICMD_IFGE 156 /* op1 = target JavaVM pc, val.i */
- 3,
-#define JAVA_IFGT 157
-#define ICMD_IFGT 157 /* op1 = target JavaVM pc, val.i */
- 3,
-#define JAVA_IFLE 158
-#define ICMD_IFLE 158 /* op1 = target JavaVM pc, val.i */
- 3,
-#define JAVA_IF_ICMPEQ 159
-#define ICMD_IF_ICMPEQ 159 /* op1 = target JavaVM pc */
- 3,
-#define JAVA_IF_ICMPNE 160
-#define ICMD_IF_ICMPNE 160 /* op1 = target JavaVM pc */
- 3,
-#define JAVA_IF_ICMPLT 161
-#define ICMD_IF_ICMPLT 161 /* op1 = target JavaVM pc */
- 3,
-#define JAVA_IF_ICMPGE 162
-#define ICMD_IF_ICMPGE 162 /* op1 = target JavaVM pc */
- 3,
-#define JAVA_IF_ICMPGT 163
-#define ICMD_IF_ICMPGT 163 /* op1 = target JavaVM pc */
- 3,
-#define JAVA_IF_ICMPLE 164
-#define ICMD_IF_ICMPLE 164 /* op1 = target JavaVM pc */
- 3,
-#define JAVA_IF_ACMPEQ 165
-#define ICMD_IF_ACMPEQ 165 /* op1 = target JavaVM pc */
- 3,
-#define JAVA_IF_ACMPNE 166
-#define ICMD_IF_ACMPNE 166 /* op1 = target JavaVM pc */
- 3,
-#define JAVA_GOTO 167
-#define ICMD_GOTO 167 /* op1 = target JavaVM pc */
- 3,
-#define JAVA_JSR 168
-#define ICMD_JSR 168 /* op1 = target JavaVM pc */
- 3,
-#define JAVA_RET 169
-#define ICMD_RET 169 /* op1 = local variable */
- 2,
-#define JAVA_TABLESWITCH 170
-#define ICMD_TABLESWITCH 170 /* val.a = pointer to s4 table */
- 0, /* length must be computed */
-#define JAVA_LOOKUPSWITCH 171
-#define ICMD_LOOKUPSWITCH 171 /* val.a = pointer to s4 table */
- 0, /* length must be computed */
-#define JAVA_IRETURN 172
-#define ICMD_IRETURN 172
- 1,
-#define JAVA_LRETURN 173
-#define ICMD_LRETURN 173
- 1,
-#define JAVA_FRETURN 174
-#define ICMD_FRETURN 174
- 1,
-#define JAVA_DRETURN 175
-#define ICMD_DRETURN 175
- 1,
-#define JAVA_ARETURN 176
-#define ICMD_ARETURN 176
- 1,
-#define JAVA_RETURN 177
-#define ICMD_RETURN 177
- 1,
-#define JAVA_GETSTATIC 178
-#define ICMD_GETSTATIC 178 /* op1 = type, val.a = field address */
- 3,
-#define JAVA_PUTSTATIC 179
-#define ICMD_PUTSTATIC 179 /* op1 = type, val.a = field address */
- 3,
-#define JAVA_GETFIELD 180
-#define ICMD_GETFIELD 180 /* op1 = type, val.i = field offset */
- 3,
-#define JAVA_PUTFIELD 181
-#define ICMD_PUTFIELD 181 /* op1 = type, val.i = field offset */
- 3,
-#define JAVA_INVOKEVIRTUAL 182
-#define ICMD_INVOKEVIRTUAL 182 /* val.a = method info pointer */
- 3,
-#define JAVA_INVOKESPECIAL 183
-#define ICMD_INVOKESPECIAL 183 /* val.a = method info pointer */
- 3,
-#define JAVA_INVOKESTATIC 184
-#define ICMD_INVOKESTATIC 184 /* val.a = method info pointer */
- 3,
-#define JAVA_INVOKEINTERFACE 185
-#define ICMD_INVOKEINTERFACE 185 /* val.a = method info pointer */
- 5,
-#define ICMD_CHECKASIZE 186 /* */
- 1, /* unused */
-#define JAVA_NEW 187
-#define ICMD_NEW 187 /* op1 = 1, val.a = class pointer */
- 3,
-#define JAVA_NEWARRAY 188
-#define ICMD_NEWARRAY 188 /* op1 = basic type */
- 2,
-#define JAVA_ANEWARRAY 189
-#define ICMD_ANEWARRAY 189 /* op1 = 0, val.a = array pointer */
- 3, /* op1 = 1, val.a = class pointer */
-#define JAVA_ARRAYLENGTH 190
-#define ICMD_ARRAYLENGTH 190
- 1,
-#define JAVA_ATHROW 191
-#define ICMD_ATHROW 191
- 1,
-#define JAVA_CHECKCAST 192
-#define ICMD_CHECKCAST 192 /* op1 = 0, val.a = array pointer */
- 3, /* op1 = 1, val.a = class pointer */
-#define JAVA_INSTANCEOF 193
-#define ICMD_INSTANCEOF 193 /* op1 = 0, val.a = array pointer */
- 3, /* op1 = 1, val.a = class pointer */
-#define JAVA_MONITORENTER 194
-#define ICMD_MONITORENTER 194
- 1,
-#define JAVA_MONITOREXIT 195
-#define ICMD_MONITOREXIT 195
- 1,
-#define JAVA_WIDE 196
- 0, /* length must be computed */
-#define JAVA_MULTIANEWARRAY 197
-#define ICMD_MULTIANEWARRAY 197 /* op1 = dimension, val.a = array */
- 4, /* pointer */
-#define JAVA_IFNULL 198
-#define ICMD_IFNULL 198 /* op1 = target JavaVM pc */
- 3,
-#define JAVA_IFNONNULL 199
-#define ICMD_IFNONNULL 199 /* op1 = target JavaVM pc */
- 3,
-#define JAVA_GOTO_W 200
- 5,
-#define JAVA_JSR_W 201
- 5,
-#define JAVA_BREAKPOINT 202
1,
- 1,1,1,1,1,1,1,1, /* unused */
- 1,1,1,1,1,1,1,1,1,1,
- 1,1,1,1,1,1,1,1,1,1,
- 1,1,1,1,1,1,1,1,1,1,
+ /* unused */
+ 1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1
};
-char *icmd_names[256] = {
- "NOP ", /* 0 */
- "ACONST ", /* 1 */
- "NULLCHECKPOP ", /* ICONST_M1 2 */
- "ICONST ", /* 3 */
- "IREM0X10001 ", /* ICONST_1 4 */
- "IDIVPOW2 ", /* ICONST_2 5 */
- "LDIVPOW2 ", /* ICONST_3 6 */
- "UNDEF__7 ", /* ICONST_4 7 */
- "LREM0X10001 ", /* ICONST_5 8 */
- "LCONST ", /* 9 */
- "LCMPCONST ", /* LCONST_1 10 */
- "FCONST ", /* 11 */
- "UNDEF_12 ", /* FCONST_1 12 */
- "ELSE_ICONST ", /* FCONST_2 13 */
- "DCONST ", /* 14 */
- "IFEQ_ICONST ", /* DCONST_1 15 */
- "IFNE_ICONST ", /* BIPUSH 16 */
- "IFLT_ICONST ", /* SIPUSH 17 */
- "IFGE_ICONST ", /* LDC1 18 */
- "IFGT_ICONST ", /* LDC2 19 */
- "IFLE_ICONST ", /* LDC2W 20 */
- "ILOAD ", /* 21 */
- "LLOAD ", /* 22 */
- "FLOAD ", /* 23 */
- "DLOAD ", /* 24 */
- "ALOAD ", /* 25 */
- "IADDCONST ", /* ILOAD_0 26 */
- "ISUBCONST ", /* ILOAD_1 27 */
- "IMULCONST ", /* ILOAD_2 28 */
- "IANDCONST ", /* ILOAD_3 29 */
- "IORCONST ", /* LLOAD_0 30 */
- "IXORCONST ", /* LLOAD_1 31 */
- "ISHLCONST ", /* LLOAD_2 32 */
- "ISHRCONST ", /* LLOAD_3 33 */
- "IUSHRCONST ", /* FLOAD_0 34 */
- "IREMPOW2 ", /* FLOAD_1 35 */
- "LADDCONST ", /* FLOAD_2 36 */
- "LSUBCONST ", /* FLOAD_3 37 */
- "LMULCONST ", /* DLOAD_0 38 */
- "LANDCONST ", /* DLOAD_1 39 */
- "LORCONST ", /* DLOAD_2 40 */
- "LXORCONST ", /* DLOAD_3 41 */
- "LSHLCONST ", /* ALOAD_0 42 */
- "LSHRCONST ", /* ALOAD_1 43 */
- "LUSHRCONST ", /* ALOAD_2 44 */
- "LREMPOW2 ", /* ALOAD_3 45 */
- "IALOAD ", /* 46 */
- "LALOAD ", /* 47 */
- "FALOAD ", /* 48 */
- "DALOAD ", /* 49 */
- "AALOAD ", /* 50 */
- "BALOAD ", /* 51 */
- "CALOAD ", /* 52 */
- "SALOAD ", /* 53 */
- "ISTORE ", /* 54 */
- "LSTORE ", /* 55 */
- "FSTORE ", /* 56 */
- "DSTORE ", /* 57 */
- "ASTORE ", /* 58 */
- "IF_LEQ ", /* ISTORE_0 59 */
- "IF_LNE ", /* ISTORE_1 60 */
- "IF_LLT ", /* ISTORE_2 61 */
- "IF_LGE ", /* ISTORE_3 62 */
- "IF_LGT ", /* LSTORE_0 63 */
- "IF_LLE ", /* LSTORE_1 64 */
- "IF_LCMPEQ ", /* LSTORE_2 65 */
- "IF_LCMPNE ", /* LSTORE_3 66 */
- "IF_LCMPLT ", /* FSTORE_0 67 */
- "IF_LCMPGE ", /* FSTORE_1 68 */
- "IF_LCMPGT ", /* FSTORE_2 69 */
- "IF_LCMPLE ", /* FSTORE_3 70 */
- "UNDEF_71 ", /* DSTORE_0 71 */
- "UNDEF_72 ", /* DSTORE_1 72 */
- "UNDEF_73 ", /* DSTORE_2 73 */
- "UNDEF_74 ", /* DSTORE_3 74 */
- "UNDEF_75 ", /* ASTORE_0 75 */
- "UNDEF_76 ", /* ASTORE_1 76 */
- "UNDEF_77 ", /* ASTORE_2 77 */
- "UNDEF_78 ", /* ASTORE_3 78 */
- "IASTORE ", /* 79 */
- "LASTORE ", /* 80 */
- "FASTORE ", /* 81 */
- "DASTORE ", /* 82 */
- "AASTORE ", /* 83 */
- "BASTORE ", /* 84 */
- "CASTORE ", /* 85 */
- "SASTORE ", /* 86 */
- "POP ", /* 87 */
- "POP2 ", /* 88 */
- "DUP ", /* 89 */
- "DUP_X1 ", /* 90 */
- "DUP_X2 ", /* 91 */
- "DUP2 ", /* 92 */
- "DUP2_X1 ", /* 93 */
- "DUP2_X2 ", /* 94 */
- "SWAP ", /* 95 */
- "IADD ", /* 96 */
- "LADD ", /* 97 */
- "FADD ", /* 98 */
- "DADD ", /* 99 */
- "ISUB ", /* 100 */
- "LSUB ", /* 101 */
- "FSUB ", /* 102 */
- "DSUB ", /* 103 */
- "IMUL ", /* 104 */
- "LMUL ", /* 105 */
- "FMUL ", /* 106 */
- "DMUL ", /* 107 */
- "IDIV ", /* 108 */
- "LDIV ", /* 109 */
- "FDIV ", /* 110 */
- "DDIV ", /* 111 */
- "IREM ", /* 112 */
- "LREM ", /* 113 */
- "FREM ", /* 114 */
- "DREM ", /* 115 */
- "INEG ", /* 116 */
- "LNEG ", /* 117 */
- "FNEG ", /* 118 */
- "DNEG ", /* 119 */
- "ISHL ", /* 120 */
- "LSHL ", /* 121 */
- "ISHR ", /* 122 */
- "LSHR ", /* 123 */
- "IUSHR ", /* 124 */
- "LUSHR ", /* 125 */
- "IAND ", /* 126 */
- "LAND ", /* 127 */
- "IOR ", /* 128 */
- "LOR ", /* 129 */
- "IXOR ", /* 130 */
- "LXOR ", /* 131 */
- "IINC ", /* 132 */
- "I2L ", /* 133 */
- "I2F ", /* 134 */
- "I2D ", /* 135 */
- "L2I ", /* 136 */
- "L2F ", /* 137 */
- "L2D ", /* 138 */
- "F2I ", /* 139 */
- "F2L ", /* 140 */
- "F2D ", /* 141 */
- "D2I ", /* 142 */
- "D2L ", /* 143 */
- "D2F ", /* 144 */
- "INT2BYTE ", /* 145 */
- "INT2CHAR ", /* 146 */
- "INT2SHORT ", /* 147 */
- "LCMP ", /* 148 */
- "FCMPL ", /* 149 */
- "FCMPG ", /* 150 */
- "DCMPL ", /* 151 */
- "DCMPG ", /* 152 */
- "IFEQ ", /* 153 */
- "IFNE ", /* 154 */
- "IFLT ", /* 155 */
- "IFGE ", /* 156 */
- "IFGT ", /* 157 */
- "IFLE ", /* 158 */
- "IF_ICMPEQ ", /* 159 */
- "IF_ICMPNE ", /* 160 */
- "IF_ICMPLT ", /* 161 */
- "IF_ICMPGE ", /* 162 */
- "IF_ICMPGT ", /* 163 */
- "IF_ICMPLE ", /* 164 */
- "IF_ACMPEQ ", /* 165 */
- "IF_ACMPNE ", /* 166 */
- "GOTO ", /* 167 */
- "JSR ", /* 168 */
- "RET ", /* 169 */
- "TABLESWITCH ", /* 170 */
- "LOOKUPSWITCH ", /* 171 */
- "IRETURN ", /* 172 */
- "LRETURN ", /* 173 */
- "FRETURN ", /* 174 */
- "DRETURN ", /* 175 */
- "ARETURN ", /* 176 */
- "RETURN ", /* 177 */
- "GETSTATIC ", /* 178 */
- "PUTSTATIC ", /* 179 */
- "GETFIELD ", /* 180 */
- "PUTFIELD ", /* 181 */
- "INVOKEVIRTUAL", /* 182 */
- "INVOKESPECIAL", /* 183 */
- "INVOKESTATIC ", /* 184 */
- "INVOKEINTERFACE",/* 185 */
- "CHECKASIZE ", /* UNDEF186 186 */
- "NEW ", /* 187 */
- "NEWARRAY ", /* 188 */
- "ANEWARRAY ", /* 189 */
- "ARRAYLENGTH ", /* 190 */
- "ATHROW ", /* 191 */
- "CHECKCAST ", /* 192 */
- "INSTANCEOF ", /* 193 */
- "MONITORENTER ", /* 194 */
- "MONITOREXIT ", /* 195 */
- "UNDEF196 ", /* WIDE 196 */
- "MULTIANEWARRAY",/* 197 */
- "IFNULL ", /* 198 */
- "IFNONNULL ", /* 199 */
- "UNDEF200 ", /* GOTO_W 200 */
- "UNDEF201 ", /* JSR_W 201 */
- "UNDEF202 ", /* BREAKPOINT 202 */
-
- "UNDEF203","UNDEF204","UNDEF205",
- "UNDEF206","UNDEF207","UNDEF208","UNDEF209","UNDEF210",
- "UNDEF","UNDEF","UNDEF","UNDEF","UNDEF",
- "UNDEF216","UNDEF217","UNDEF218","UNDEF219","UNDEF220",
- "UNDEF","UNDEF","UNDEF","UNDEF","UNDEF",
- "UNDEF226","UNDEF227","UNDEF228","UNDEF229","UNDEF230",
- "UNDEF","UNDEF","UNDEF","UNDEF","UNDEF",
- "UNDEF236","UNDEF237","UNDEF238","UNDEF239","UNDEF240",
- "UNDEF","UNDEF","UNDEF","UNDEF","UNDEF",
- "UNDEF246","UNDEF247","UNDEF248","UNDEF249","UNDEF250",
- "UNDEF251","UNDEF252",
-
- "BUILTIN3 ", /* 253 */
- "BUILTIN2 ", /* 254 */
- "BUILTIN1 " /* 255 */
-};
-
+/* Java opcode names *********************************************************/
char *opcode_names[256] = {
- "NOP ", /* 0 */
- "ACONST ", /* 1 */
- "ICONST_M1 ", /* ICONST_M1 2 */
- "ICONST_0 ", /* ICONST_0 3 */
- "ICONST_1 ", /* ICONST_1 4 */
- "ICONST_2 ", /* ICONST_2 5 */
- "ICONST_3 ", /* ICONST_3 6 */
- "ICONST_4 ", /* ICONST_4 7 */
- "ICONST_5 ", /* ICONST_5 8 */
- "LCONST_0 ", /* LCONST_0 9 */
- "LCONST_1 ", /* LCONST_1 10 */
- "FCONST_0 ", /* FCONST_0 11 */
- "FCONST_1 ", /* FCONST_1 12 */
- "FCONST_2 ", /* FCONST_2 13 */
- "DCONST_0 ", /* DCONST_0 14 */
- "DCONST_1 ", /* DCONST_1 15 */
- "BIPUSH ", /* BIPUSH 16 */
- "SIPUSH ", /* SIPUSH 17 */
- "LDC ", /* LDC 18 */
- "LDC_W ", /* LDC_W 19 */
- "LDC2_W ", /* LDC2_W 20 */
- "ILOAD ", /* 21 */
- "LLOAD ", /* 22 */
- "FLOAD ", /* 23 */
- "DLOAD ", /* 24 */
- "ALOAD ", /* 25 */
- "ILOAD_0 ", /* ILOAD_0 26 */
- "ILOAD_1 ", /* ILOAD_1 27 */
- "ILOAD_2 ", /* ILOAD_2 28 */
- "ILOAD_3 ", /* ILOAD_3 29 */
- "LLOAD_0 ", /* LLOAD_0 30 */
- "LLOAD_1 ", /* LLOAD_1 31 */
- "LLOAD_2 ", /* LLOAD_2 32 */
- "LLOAD_3 ", /* LLOAD_3 33 */
- "FLOAD_0 ", /* FLOAD_0 34 */
- "FLOAD_1 ", /* FLOAD_1 35 */
- "FLOAD_2 ", /* FLOAD_2 36 */
- "FLOAD_3 ", /* FLOAD_3 37 */
- "DLOAD_0 ", /* DLOAD_0 38 */
- "DLOAD_1 ", /* DLOAD_1 39 */
- "DLOAD_2 ", /* DLOAD_2 40 */
- "DLOAD_3 ", /* DLOAD_3 41 */
- "ALOAD_0 ", /* ALOAD_0 42 */
- "ALOAD_1 ", /* ALOAD_1 43 */
- "ALOAD_2 ", /* ALOAD_2 44 */
- "ALOAD_3 ", /* ALOAD_3 45 */
- "IALOAD ", /* 46 */
- "LALOAD ", /* 47 */
- "FALOAD ", /* 48 */
- "DALOAD ", /* 49 */
- "AALOAD ", /* 50 */
- "BALOAD ", /* 51 */
- "CALOAD ", /* 52 */
- "SALOAD ", /* 53 */
- "ISTORE ", /* 54 */
- "LSTORE ", /* 55 */
- "FSTORE ", /* 56 */
- "DSTORE ", /* 57 */
- "ASTORE ", /* 58 */
- "ISTORE_0 ", /* ISTORE_0 59 */
- "ISTORE_1 ", /* ISTORE_1 60 */
- "ISTORE_2 ", /* ISTORE_2 61 */
- "ISTORE_3 ", /* ISTORE_3 62 */
- "LSTORE_0 ", /* LSTORE_0 63 */
- "LSTORE_1 ", /* LSTORE_1 64 */
- "LSTORE_2 ", /* LSTORE_2 65 */
- "LSTORE_3 ", /* LSTORE_3 66 */
- "FSTORE_0 ", /* FSTORE_0 67 */
- "FSTORE_1 ", /* FSTORE_1 68 */
- "FSTORE_2 ", /* FSTORE_2 69 */
- "FSTORE_3 ", /* FSTORE_3 70 */
- "DSTORE_0 ", /* DSTORE_0 71 */
- "DSTORE_1 ", /* DSTORE_1 72 */
- "DSTORE_2 ", /* DSTORE_2 73 */
- "DSTORE_3 ", /* DSTORE_3 74 */
- "ASTORE_0 ", /* ASTORE_0 75 */
- "ASTORE_1 ", /* ASTORE_1 76 */
- "ASTORE_2 ", /* ASTORE_2 77 */
- "ASTORE_3 ", /* ASTORE_3 78 */
- "IASTORE ", /* 79 */
- "LASTORE ", /* 80 */
- "FASTORE ", /* 81 */
- "DASTORE ", /* 82 */
- "AASTORE ", /* 83 */
- "BASTORE ", /* 84 */
- "CASTORE ", /* 85 */
- "SASTORE ", /* 86 */
- "POP ", /* 87 */
- "POP2 ", /* 88 */
- "DUP ", /* 89 */
- "DUP_X1 ", /* 90 */
- "DUP_X2 ", /* 91 */
- "DUP2 ", /* 92 */
- "DUP2_X1 ", /* 93 */
- "DUP2_X2 ", /* 94 */
- "SWAP ", /* 95 */
- "IADD ", /* 96 */
- "LADD ", /* 97 */
- "FADD ", /* 98 */
- "DADD ", /* 99 */
- "ISUB ", /* 100 */
- "LSUB ", /* 101 */
- "FSUB ", /* 102 */
- "DSUB ", /* 103 */
- "IMUL ", /* 104 */
- "LMUL ", /* 105 */
- "FMUL ", /* 106 */
- "DMUL ", /* 107 */
- "IDIV ", /* 108 */
- "LDIV ", /* 109 */
- "FDIV ", /* 110 */
- "DDIV ", /* 111 */
- "IREM ", /* 112 */
- "LREM ", /* 113 */
- "FREM ", /* 114 */
- "DREM ", /* 115 */
- "INEG ", /* 116 */
- "LNEG ", /* 117 */
- "FNEG ", /* 118 */
- "DNEG ", /* 119 */
- "ISHL ", /* 120 */
- "LSHL ", /* 121 */
- "ISHR ", /* 122 */
- "LSHR ", /* 123 */
- "IUSHR ", /* 124 */
- "LUSHR ", /* 125 */
- "IAND ", /* 126 */
- "LAND ", /* 127 */
- "IOR ", /* 128 */
- "LOR ", /* 129 */
- "IXOR ", /* 130 */
- "LXOR ", /* 131 */
- "IINC ", /* 132 */
- "I2L ", /* 133 */
- "I2F ", /* 134 */
- "I2D ", /* 135 */
- "L2I ", /* 136 */
- "L2F ", /* 137 */
- "L2D ", /* 138 */
- "F2I ", /* 139 */
- "F2L ", /* 140 */
- "F2D ", /* 141 */
- "D2I ", /* 142 */
- "D2L ", /* 143 */
- "D2F ", /* 144 */
- "INT2BYTE ", /* 145 */
- "INT2CHAR ", /* 146 */
- "INT2SHORT ", /* 147 */
- "LCMP ", /* 148 */
- "FCMPL ", /* 149 */
- "FCMPG ", /* 150 */
- "DCMPL ", /* 151 */
- "DCMPG ", /* 152 */
- "IFEQ ", /* 153 */
- "IFNE ", /* 154 */
- "IFLT ", /* 155 */
- "IFGE ", /* 156 */
- "IFGT ", /* 157 */
- "IFLE ", /* 158 */
- "IF_ICMPEQ ", /* 159 */
- "IF_ICMPNE ", /* 160 */
- "IF_ICMPLT ", /* 161 */
- "IF_ICMPGE ", /* 162 */
- "IF_ICMPGT ", /* 163 */
- "IF_ICMPLE ", /* 164 */
- "IF_ACMPEQ ", /* 165 */
- "IF_ACMPNE ", /* 166 */
- "GOTO ", /* 167 */
- "JSR ", /* 168 */
- "RET ", /* 169 */
- "TABLESWITCH ", /* 170 */
- "LOOKUPSWITCH ", /* 171 */
- "IRETURN ", /* 172 */
- "LRETURN ", /* 173 */
- "FRETURN ", /* 174 */
- "DRETURN ", /* 175 */
- "ARETURN ", /* 176 */
- "RETURN ", /* 177 */
- "GETSTATIC ", /* 178 */
- "PUTSTATIC ", /* 179 */
- "GETFIELD ", /* 180 */
- "PUTFIELD ", /* 181 */
- "INVOKEVIRTUAL", /* 182 */
- "INVOKESPECIAL", /* 183 */
- "INVOKESTATIC ", /* 184 */
- "INVOKEINTERFACE",/* 185 */
- "CHECKASIZE ", /* UNDEF186 186 */
- "NEW ", /* 187 */
- "NEWARRAY ", /* 188 */
- "ANEWARRAY ", /* 189 */
- "ARRAYLENGTH ", /* 190 */
- "ATHROW ", /* 191 */
- "CHECKCAST ", /* 192 */
- "INSTANCEOF ", /* 193 */
- "MONITORENTER ", /* 194 */
- "MONITOREXIT ", /* 195 */
- "WIDE ", /* WIDE 196 */
- "MULTIANEWARRAY",/* 197 */
- "IFNULL ", /* 198 */
- "IFNONNULL ", /* 199 */
- "GOTO_W ", /* GOTO_W 200 */
- "JSR_W ", /* JSR_W 201 */
- "BREAKPOINT ", /* BREAKPOINT 202 */
-
- "UNDEF203","UNDEF204","UNDEF205",
- "UNDEF206","UNDEF207","UNDEF208","UNDEF209","UNDEF210",
- "UNDEF","UNDEF","UNDEF","UNDEF","UNDEF",
- "UNDEF216","UNDEF217","UNDEF218","UNDEF219","UNDEF220",
- "UNDEF","UNDEF","UNDEF","UNDEF","UNDEF",
- "UNDEF226","UNDEF227","UNDEF228","UNDEF229","UNDEF230",
- "UNDEF","UNDEF","UNDEF","UNDEF","UNDEF",
- "UNDEF236","UNDEF237","UNDEF238","UNDEF239","UNDEF240",
- "UNDEF","UNDEF","UNDEF","UNDEF","UNDEF",
- "UNDEF246","UNDEF247","UNDEF248","UNDEF249","UNDEF250",
- "UNDEF251","UNDEF252",
-
- "BUILTIN3 ", /* 253 */
- "BUILTIN2 ", /* 254 */
- "BUILTIN1 " /* 255 */
+ "NOP ", /* 0 */
+ "ACONST ", /* 1 */
+ "ICONST_M1 ", /* ICONST_M1 2 */
+ "ICONST_0 ", /* ICONST_0 3 */
+ "ICONST_1 ", /* ICONST_1 4 */
+ "ICONST_2 ", /* ICONST_2 5 */
+ "ICONST_3 ", /* ICONST_3 6 */
+ "ICONST_4 ", /* ICONST_4 7 */
+ "ICONST_5 ", /* ICONST_5 8 */
+ "LCONST_0 ", /* LCONST_0 9 */
+ "LCONST_1 ", /* LCONST_1 10 */
+ "FCONST_0 ", /* FCONST_0 11 */
+ "FCONST_1 ", /* FCONST_1 12 */
+ "FCONST_2 ", /* FCONST_2 13 */
+ "DCONST_0 ", /* DCONST_0 14 */
+ "DCONST_1 ", /* DCONST_1 15 */
+ "BIPUSH ", /* BIPUSH 16 */
+ "SIPUSH ", /* SIPUSH 17 */
+ "LDC ", /* LDC 18 */
+ "LDC_W ", /* LDC_W 19 */
+ "LDC2_W ", /* LDC2_W 20 */
+ "ILOAD ", /* 21 */
+ "LLOAD ", /* 22 */
+ "FLOAD ", /* 23 */
+ "DLOAD ", /* 24 */
+ "ALOAD ", /* 25 */
+ "ILOAD_0 ", /* ILOAD_0 26 */
+ "ILOAD_1 ", /* ILOAD_1 27 */
+ "ILOAD_2 ", /* ILOAD_2 28 */
+ "ILOAD_3 ", /* ILOAD_3 29 */
+ "LLOAD_0 ", /* LLOAD_0 30 */
+ "LLOAD_1 ", /* LLOAD_1 31 */
+ "LLOAD_2 ", /* LLOAD_2 32 */
+ "LLOAD_3 ", /* LLOAD_3 33 */
+ "FLOAD_0 ", /* FLOAD_0 34 */
+ "FLOAD_1 ", /* FLOAD_1 35 */
+ "FLOAD_2 ", /* FLOAD_2 36 */
+ "FLOAD_3 ", /* FLOAD_3 37 */
+ "DLOAD_0 ", /* DLOAD_0 38 */
+ "DLOAD_1 ", /* DLOAD_1 39 */
+ "DLOAD_2 ", /* DLOAD_2 40 */
+ "DLOAD_3 ", /* DLOAD_3 41 */
+ "ALOAD_0 ", /* ALOAD_0 42 */
+ "ALOAD_1 ", /* ALOAD_1 43 */
+ "ALOAD_2 ", /* ALOAD_2 44 */
+ "ALOAD_3 ", /* ALOAD_3 45 */
+ "IALOAD ", /* 46 */
+ "LALOAD ", /* 47 */
+ "FALOAD ", /* 48 */
+ "DALOAD ", /* 49 */
+ "AALOAD ", /* 50 */
+ "BALOAD ", /* 51 */
+ "CALOAD ", /* 52 */
+ "SALOAD ", /* 53 */
+ "ISTORE ", /* 54 */
+ "LSTORE ", /* 55 */
+ "FSTORE ", /* 56 */
+ "DSTORE ", /* 57 */
+ "ASTORE ", /* 58 */
+ "ISTORE_0 ", /* ISTORE_0 59 */
+ "ISTORE_1 ", /* ISTORE_1 60 */
+ "ISTORE_2 ", /* ISTORE_2 61 */
+ "ISTORE_3 ", /* ISTORE_3 62 */
+ "LSTORE_0 ", /* LSTORE_0 63 */
+ "LSTORE_1 ", /* LSTORE_1 64 */
+ "LSTORE_2 ", /* LSTORE_2 65 */
+ "LSTORE_3 ", /* LSTORE_3 66 */
+ "FSTORE_0 ", /* FSTORE_0 67 */
+ "FSTORE_1 ", /* FSTORE_1 68 */
+ "FSTORE_2 ", /* FSTORE_2 69 */
+ "FSTORE_3 ", /* FSTORE_3 70 */
+ "DSTORE_0 ", /* DSTORE_0 71 */
+ "DSTORE_1 ", /* DSTORE_1 72 */
+ "DSTORE_2 ", /* DSTORE_2 73 */
+ "DSTORE_3 ", /* DSTORE_3 74 */
+ "ASTORE_0 ", /* ASTORE_0 75 */
+ "ASTORE_1 ", /* ASTORE_1 76 */
+ "ASTORE_2 ", /* ASTORE_2 77 */
+ "ASTORE_3 ", /* ASTORE_3 78 */
+ "IASTORE ", /* 79 */
+ "LASTORE ", /* 80 */
+ "FASTORE ", /* 81 */
+ "DASTORE ", /* 82 */
+ "AASTORE ", /* 83 */
+ "BASTORE ", /* 84 */
+ "CASTORE ", /* 85 */
+ "SASTORE ", /* 86 */
+ "POP ", /* 87 */
+ "POP2 ", /* 88 */
+ "DUP ", /* 89 */
+ "DUP_X1 ", /* 90 */
+ "DUP_X2 ", /* 91 */
+ "DUP2 ", /* 92 */
+ "DUP2_X1 ", /* 93 */
+ "DUP2_X2 ", /* 94 */
+ "SWAP ", /* 95 */
+ "IADD ", /* 96 */
+ "LADD ", /* 97 */
+ "FADD ", /* 98 */
+ "DADD ", /* 99 */
+ "ISUB ", /* 100 */
+ "LSUB ", /* 101 */
+ "FSUB ", /* 102 */
+ "DSUB ", /* 103 */
+ "IMUL ", /* 104 */
+ "LMUL ", /* 105 */
+ "FMUL ", /* 106 */
+ "DMUL ", /* 107 */
+ "IDIV ", /* 108 */
+ "LDIV ", /* 109 */
+ "FDIV ", /* 110 */
+ "DDIV ", /* 111 */
+ "IREM ", /* 112 */
+ "LREM ", /* 113 */
+ "FREM ", /* 114 */
+ "DREM ", /* 115 */
+ "INEG ", /* 116 */
+ "LNEG ", /* 117 */
+ "FNEG ", /* 118 */
+ "DNEG ", /* 119 */
+ "ISHL ", /* 120 */
+ "LSHL ", /* 121 */
+ "ISHR ", /* 122 */
+ "LSHR ", /* 123 */
+ "IUSHR ", /* 124 */
+ "LUSHR ", /* 125 */
+ "IAND ", /* 126 */
+ "LAND ", /* 127 */
+ "IOR ", /* 128 */
+ "LOR ", /* 129 */
+ "IXOR ", /* 130 */
+ "LXOR ", /* 131 */
+ "IINC ", /* 132 */
+ "I2L ", /* 133 */
+ "I2F ", /* 134 */
+ "I2D ", /* 135 */
+ "L2I ", /* 136 */
+ "L2F ", /* 137 */
+ "L2D ", /* 138 */
+ "F2I ", /* 139 */
+ "F2L ", /* 140 */
+ "F2D ", /* 141 */
+ "D2I ", /* 142 */
+ "D2L ", /* 143 */
+ "D2F ", /* 144 */
+ "INT2BYTE ", /* 145 */
+ "INT2CHAR ", /* 146 */
+ "INT2SHORT ", /* 147 */
+ "LCMP ", /* 148 */
+ "FCMPL ", /* 149 */
+ "FCMPG ", /* 150 */
+ "DCMPL ", /* 151 */
+ "DCMPG ", /* 152 */
+ "IFEQ ", /* 153 */
+ "IFNE ", /* 154 */
+ "IFLT ", /* 155 */
+ "IFGE ", /* 156 */
+ "IFGT ", /* 157 */
+ "IFLE ", /* 158 */
+ "IF_ICMPEQ ", /* 159 */
+ "IF_ICMPNE ", /* 160 */
+ "IF_ICMPLT ", /* 161 */
+ "IF_ICMPGE ", /* 162 */
+ "IF_ICMPGT ", /* 163 */
+ "IF_ICMPLE ", /* 164 */
+ "IF_ACMPEQ ", /* 165 */
+ "IF_ACMPNE ", /* 166 */
+ "GOTO ", /* 167 */
+ "JSR ", /* 168 */
+ "RET ", /* 169 */
+ "TABLESWITCH ", /* 170 */
+ "LOOKUPSWITCH ", /* 171 */
+ "IRETURN ", /* 172 */
+ "LRETURN ", /* 173 */
+ "FRETURN ", /* 174 */
+ "DRETURN ", /* 175 */
+ "ARETURN ", /* 176 */
+ "RETURN ", /* 177 */
+ "GETSTATIC ", /* 178 */
+ "PUTSTATIC ", /* 179 */
+ "GETFIELD ", /* 180 */
+ "PUTFIELD ", /* 181 */
+ "INVOKEVIRTUAL ", /* 182 */
+ "INVOKESPECIAL ", /* 183 */
+ "INVOKESTATIC ", /* 184 */
+ "INVOKEINTERFACE", /* 185 */
+ "UNDEF186 ", /* 186 */
+ "NEW ", /* 187 */
+ "NEWARRAY ", /* 188 */
+ "ANEWARRAY ", /* 189 */
+ "ARRAYLENGTH ", /* 190 */
+ "ATHROW ", /* 191 */
+ "CHECKCAST ", /* 192 */
+ "INSTANCEOF ", /* 193 */
+ "MONITORENTER ", /* 194 */
+ "MONITOREXIT ", /* 195 */
+ "WIDE ", /* WIDE 196 */
+ "MULTIANEWARRAY ", /* 197 */
+ "IFNULL ", /* 198 */
+ "IFNONNULL ", /* 199 */
+ "GOTO_W ", /* GOTO_W 200 */
+ "JSR_W ", /* JSR_W 201 */
+ "BREAKPOINT ", /* BREAKPOINT 202 */
+
+ "UNDEF203", "UNDEF204", "UNDEF205",
+ "UNDEF206", "UNDEF207", "UNDEF208", "UNDEF209", "UNDEF210",
+ "UNDEF211", "UNDEF212", "UNDEF213", "UNDEF214", "UNDEF215",
+ "UNDEF216", "UNDEF217", "UNDEF218", "UNDEF219", "UNDEF220",
+ "UNDEF221", "UNDEF222", "UNDEF223", "UNDEF224", "UNDEF225",
+ "UNDEF226", "UNDEF227", "UNDEF228", "UNDEF229", "UNDEF230",
+ "UNDEF231", "UNDEF232", "UNDEF233", "UNDEF234", "UNDEF235",
+ "UNDEF236", "UNDEF237", "UNDEF238", "UNDEF239", "UNDEF240",
+ "UNDEF241", "UNDEF242", "UNDEF243", "UNDEF244", "UNDEF245",
+ "UNDEF246", "UNDEF247", "UNDEF248", "UNDEF249", "UNDEF250",
+ "UNDEF251", "UNDEF252", "UNDEF253", "UNDEF254", "UNDEF255"
};
-#if defined(USEBUILTINTABLE)
+/* jit_init ********************************************************************
-#if 0
-stdopdescriptor builtintable[] = {
- { ICMD_LCMP, TYPE_LONG, TYPE_LONG, TYPE_INT, ICMD_BUILTIN2,
- (functionptr) builtin_lcmp , SUPPORT_LONG && SUPPORT_LONG_CMP, false },
- { ICMD_LAND, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
- (functionptr) builtin_land , SUPPORT_LONG && SUPPORT_LONG_LOG, false },
- { ICMD_LOR, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
- (functionptr) builtin_lor , SUPPORT_LONG && SUPPORT_LONG_LOG, false },
- { ICMD_LXOR, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
- (functionptr) builtin_lxor , SUPPORT_LONG && SUPPORT_LONG_LOG, false },
- { ICMD_LSHL, TYPE_LONG, TYPE_INT, TYPE_LONG, ICMD_BUILTIN2,
- (functionptr) builtin_lshl , SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
- { ICMD_LSHR, TYPE_LONG, TYPE_INT, TYPE_LONG, ICMD_BUILTIN2,
- (functionptr) builtin_lshr, SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
- { ICMD_LUSHR, TYPE_LONG, TYPE_INT, TYPE_LONG, ICMD_BUILTIN2,
- (functionptr) builtin_lushr, SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
- { ICMD_LADD, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
- (functionptr) builtin_ladd , SUPPORT_LONG && SUPPORT_LONG_ADD, false },
- { ICMD_LSUB, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
- (functionptr) builtin_lsub , SUPPORT_LONG && SUPPORT_LONG_ADD, false },
- { ICMD_LNEG, TYPE_LONG, TYPE_VOID, TYPE_LONG, ICMD_BUILTIN1,
- (functionptr) builtin_lneg, SUPPORT_LONG && SUPPORT_LONG_ADD, true },
- { ICMD_LMUL, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
- (functionptr) builtin_lmul , SUPPORT_LONG && SUPPORT_LONG_MUL, false },
- { ICMD_I2F, TYPE_INT, TYPE_VOID, TYPE_FLOAT, ICMD_BUILTIN1,
- (functionptr) builtin_i2f, SUPPORT_FLOAT && SUPPORT_IFCVT, true },
- { ICMD_I2D, TYPE_INT, TYPE_VOID, TYPE_DOUBLE, ICMD_BUILTIN1,
- (functionptr) builtin_i2d, SUPPORT_DOUBLE && SUPPORT_IFCVT, true },
- { ICMD_L2F, TYPE_LONG, TYPE_VOID, TYPE_FLOAT, ICMD_BUILTIN1,
- (functionptr) builtin_l2f, SUPPORT_LONG && SUPPORT_FLOAT && SUPPORT_LONG_FCVT, true },
- { ICMD_L2D, TYPE_LONG, TYPE_VOID, TYPE_DOUBLE, ICMD_BUILTIN1,
- (functionptr) builtin_l2d, SUPPORT_LONG && SUPPORT_DOUBLE && SUPPORT_LONG_FCVT, true },
- { ICMD_F2L, TYPE_FLOAT, TYPE_VOID, TYPE_LONG, ICMD_BUILTIN1,
- (functionptr) builtin_f2l, SUPPORT_FLOAT && SUPPORT_LONG && SUPPORT_LONG_ICVT, true },
- { ICMD_D2L, TYPE_DOUBLE, TYPE_VOID, TYPE_LONG, ICMD_BUILTIN1,
- (functionptr) builtin_d2l, SUPPORT_DOUBLE && SUPPORT_LONG && SUPPORT_LONG_ICVT, true },
- { ICMD_F2I, TYPE_FLOAT, TYPE_VOID, TYPE_INT, ICMD_BUILTIN1,
- (functionptr) builtin_f2i, SUPPORT_FLOAT && SUPPORT_FICVT, true },
- { ICMD_D2I, TYPE_DOUBLE, TYPE_VOID, TYPE_INT, ICMD_BUILTIN1,
- (functionptr) builtin_d2i, SUPPORT_DOUBLE && SUPPORT_FICVT, true },
- { 255, 0, 0, 0, 0, NULL, true, false },
-};
+ Initializes the JIT subsystem.
+*******************************************************************************/
+
+void jit_init(void)
+{
+#if defined(ENABLE_JIT)
+ /* initialize stack analysis subsystem */
+
+ (void) stack_init();
#endif
-static int builtintablelen;
+ /* initialize show subsystem */
-#endif /* USEBUILTINTABLE */
+#if !defined(NDEBUG)
+ (void) show_init();
+#endif
+ /* initialize codegen subsystem */
-/*****************************************************************************
- TABLE OF BUILTIN FUNCTIONS
+ codegen_init();
- This table lists the builtin functions which are used inside
- BUILTIN* opcodes.
+ /* initialize code subsystem */
- The first part of the table (up to the 255-marker) lists the
- opcodes which are automatically replaced in stack.c.
+ (void) code_init();
+}
- The second part lists the builtin functions which are "manually"
- used for BUILTIN* opcodes in parse.c and stack.c.
-*****************************************************************************/
+/* jit_close *******************************************************************
-builtin_descriptor builtin_desc[] = {
-#if defined(USEBUILTINTABLE)
- {ICMD_LCMP , BUILTIN_lcmp ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_INT ,
- SUPPORT_LONG && SUPPORT_LONG_CMP,false,"lcmp"},
-
- {ICMD_LAND , BUILTIN_land ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
- SUPPORT_LONG && SUPPORT_LONG_LOG,false,"land"},
- {ICMD_LOR , BUILTIN_lor ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
- SUPPORT_LONG && SUPPORT_LONG_LOG,false,"lor"},
- {ICMD_LXOR , BUILTIN_lxor ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
- SUPPORT_LONG && SUPPORT_LONG_LOG,false,"lxor"},
-
- {ICMD_LSHL , BUILTIN_lshl ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_INT ,TYPE_VOID ,TYPE_LONG ,
- SUPPORT_LONG && SUPPORT_LONG_SHIFT,false,"lshl"},
- {ICMD_LSHR , BUILTIN_lshr ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_INT ,TYPE_VOID ,TYPE_LONG ,
- SUPPORT_LONG && SUPPORT_LONG_SHIFT,false,"lshr"},
- {ICMD_LUSHR, BUILTIN_lushr,ICMD_BUILTIN2,TYPE_LONG ,TYPE_INT ,TYPE_VOID ,TYPE_LONG ,
- SUPPORT_LONG && SUPPORT_LONG_SHIFT,false,"lushr"},
-
- {ICMD_LADD , BUILTIN_ladd ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
- SUPPORT_LONG && SUPPORT_LONG_ADD,false,"ladd"},
- {ICMD_LSUB , BUILTIN_lsub ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
- SUPPORT_LONG && SUPPORT_LONG_ADD,false,"lsub"},
- {ICMD_LNEG , BUILTIN_lneg ,ICMD_BUILTIN1,TYPE_LONG ,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,
- SUPPORT_LONG && SUPPORT_LONG_ADD,false,"lneg"},
- {ICMD_LMUL , BUILTIN_lmul ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
- SUPPORT_LONG && SUPPORT_LONG_MUL,false,"lmul"},
-
- {ICMD_I2F , BUILTIN_i2f ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_FLOAT ,
- SUPPORT_FLOAT && SUPPORT_IFCVT,true ,"i2f"},
- {ICMD_I2D , BUILTIN_i2d ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_DOUBLE,
- SUPPORT_DOUBLE && SUPPORT_IFCVT,true ,"i2d"},
- {ICMD_L2F , BUILTIN_l2f ,ICMD_BUILTIN1,TYPE_LONG ,TYPE_VOID ,TYPE_VOID ,TYPE_FLOAT ,
- SUPPORT_LONG && SUPPORT_FLOAT && SUPPORT_LONG_FCVT,true ,"l2f"},
- {ICMD_L2D , BUILTIN_l2d ,ICMD_BUILTIN1,TYPE_LONG ,TYPE_VOID ,TYPE_VOID ,TYPE_DOUBLE,
- SUPPORT_LONG && SUPPORT_DOUBLE && SUPPORT_LONG_FCVT,true ,"l2d"},
- {ICMD_F2L , BUILTIN_f2l ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,
- SUPPORT_FLOAT && SUPPORT_LONG && SUPPORT_LONG_ICVT,true ,"f2l"},
- {ICMD_D2L , BUILTIN_d2l ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,
- SUPPORT_DOUBLE && SUPPORT_LONG && SUPPORT_LONG_ICVT,true ,"d2l"},
- {ICMD_F2I , BUILTIN_f2i ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID ,TYPE_VOID ,TYPE_INT ,
- SUPPORT_FLOAT && SUPPORT_FICVT,true ,"f2i"},
- {ICMD_D2I , BUILTIN_d2i ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID ,TYPE_VOID ,TYPE_INT ,
- SUPPORT_DOUBLE && SUPPORT_FICVT,true ,"d2i"},
-#endif
+ Close the JIT subsystem.
- /* this record marks the end of the automatically replaced opcodes */
- {255,NULL,0,0,0,0,0,0,0,"<INVALID>"},
+*******************************************************************************/
- /* the following functions are not replaced automatically */
-
-#if defined(__ALPHA__)
- {255, BUILTIN_f2l ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,0,0,"f2l"},
- {255, BUILTIN_d2l ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,0,0,"d2l"},
- {255, BUILTIN_f2i ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID ,TYPE_VOID ,TYPE_INT ,0,0,"f2i"},
- {255, BUILTIN_d2i ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID ,TYPE_VOID ,TYPE_INT ,0,0,"d2i"},
-#endif
+void jit_close(void)
+{
+ /* do nothing */
+}
- {255,BUILTIN_instanceof ,ICMD_BUILTIN2,TYPE_ADR ,TYPE_ADR ,TYPE_VOID ,TYPE_INT ,0,0,"instanceof"},
- {255,BUILTIN_arrayinstanceof ,ICMD_BUILTIN2,TYPE_ADR ,TYPE_ADR ,TYPE_VOID ,TYPE_INT ,0,0,"arrayinstanceof"},
- {255,BUILTIN_checkarraycast ,ICMD_BUILTIN2,TYPE_ADR ,TYPE_ADR ,TYPE_VOID ,TYPE_VOID ,0,0,"checkarraycast"},
- {255,BUILTIN_aastore ,ICMD_BUILTIN3,TYPE_ADR ,TYPE_INT ,TYPE_ADR ,TYPE_VOID ,0,0,"aastore"},
- {255,BUILTIN_new ,ICMD_BUILTIN1,TYPE_ADR ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"new"},
- {255,BUILTIN_newarray ,ICMD_BUILTIN2,TYPE_INT ,TYPE_ADR ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray"},
- {255,BUILTIN_newarray_boolean,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_boolean"},
- {255,BUILTIN_newarray_char ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_char"},
- {255,BUILTIN_newarray_float ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_float"},
- {255,BUILTIN_newarray_double ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_double"},
- {255,BUILTIN_newarray_byte ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_byte"},
- {255,BUILTIN_newarray_short ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_short"},
- {255,BUILTIN_newarray_int ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_int"},
- {255,BUILTIN_newarray_long ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_long"},
- {255,BUILTIN_monitorenter ,ICMD_BUILTIN1,TYPE_ADR ,TYPE_VOID ,TYPE_VOID ,TYPE_VOID ,0,0,"monitorenter"},
- {255,BUILTIN_monitorexit ,ICMD_BUILTIN1,TYPE_ADR ,TYPE_VOID ,TYPE_VOID ,TYPE_VOID ,0,0,"monitorexit"},
-#if !SUPPORT_DIVISION
- {255,BUILTIN_idiv ,ICMD_BUILTIN2,TYPE_INT ,TYPE_INT ,TYPE_VOID ,TYPE_INT ,0,0,"idiv"},
- {255,BUILTIN_irem ,ICMD_BUILTIN2,TYPE_INT ,TYPE_INT ,TYPE_VOID ,TYPE_INT ,0,0,"irem"},
-#endif
-#if !(SUPPORT_DIVISION && SUPPORT_LONG && SUPPORT_LONG_DIV)
- {255,BUILTIN_ldiv ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,0,0,"ldiv"},
- {255,BUILTIN_lrem ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,0,0,"lrem"},
-#endif
- {255,BUILTIN_frem ,ICMD_BUILTIN2,TYPE_FLOAT ,TYPE_FLOAT ,TYPE_VOID ,TYPE_FLOAT ,0,0,"frem"},
- {255,BUILTIN_drem ,ICMD_BUILTIN2,TYPE_DOUBLE,TYPE_DOUBLE,TYPE_VOID ,TYPE_DOUBLE,0,0,"drem"},
- /* this record marks the end of the list */
- { 0,NULL,0,0,0,0,0,0,0,"<END>"}
-};
+/* dummy function, used when there is no JavaVM code available */
+
+static u1 *do_nothing_function(void)
+{
+ return NULL;
+}
-/* include compiler subsystems ************************************************/
-/* from codegen.inc */
-extern int dseglen;
+/* jit_jitdata_new *************************************************************
+ Allocates and initalizes a new jitdata structure.
-/* dummy function, used when there is no JavaVM code available */
+*******************************************************************************/
-static void* do_nothing_function()
+jitdata *jit_jitdata_new(methodinfo *m)
{
- return NULL;
+ jitdata *jd;
+
+ /* allocate jitdata structure and fill it */
+
+ jd = DNEW(jitdata);
+
+ jd->m = m;
+ jd->cd = DNEW(codegendata);
+ jd->rd = DNEW(registerdata);
+#if defined(ENABLE_LOOP)
+ jd->ld = DNEW(loopdata);
+#endif
+
+ /* Allocate codeinfo memory from the heap as we need to keep them. */
+
+ jd->code = code_codeinfo_new(m);
+
+ /* initialize variables */
+
+ jd->flags = 0;
+ jd->exceptiontable = NULL;
+ jd->exceptiontablelength = 0;
+ jd->returncount = 0;
+ jd->branchtoentry = false;
+ jd->branchtoend = false;
+ jd->returncount = 0;
+ jd->returnblock = NULL;
+ jd->maxlocals = m->maxlocals;
+
+#if defined(ENABLE_THREADS)
+ if (checksync && (m->flags & ACC_SYNCHRONIZED))
+ jd->isleafmethod = false;
+ else
+#endif
+ jd->isleafmethod = true;
+
+ return jd;
}
/* jit_compile *****************************************************************
- jit_compile, new version of compiler, translates one method to machine code
+ Translates one method to machine code.
*******************************************************************************/
-#if 0
-#define LOG_STEP(step) \
- if (compileverbose) { \
- char logtext[MAXLOGTEXT]; \
- sprintf(logtext, "%s: ",step); \
- utf_sprint(logtext+strlen(logtext), m->class->name); \
- strcpy(logtext+strlen(logtext), "."); \
- utf_sprint(logtext+strlen(logtext), m->name); \
- utf_sprint(logtext+strlen(logtext), m->descriptor); \
- log_text(logtext); \
- }
-#else
-#define LOG_STEP(step)
-#endif
+static u1 *jit_compile_intern(jitdata *jd);
-methodptr jit_compile(methodinfo *m)
+u1 *jit_compile(methodinfo *m)
{
- int dumpsize;
- long starttime = 0;
- long stoptime = 0;
+ u1 *r;
+ jitdata *jd;
+ s4 dumpsize;
+
+ STATISTICS(count_jit_calls++);
+
+ /* Initialize the static function's class. */
+
+ /* ATTENTION: This MUST be done before the method lock is aquired,
+ otherwise we could run into a deadlock with <clinit>'s that
+ call static methods of it's own class. */
- count_jit_calls++;
+ if ((m->flags & ACC_STATIC) && !(m->class->state & CLASS_INITIALIZED)) {
+#if !defined(NDEBUG)
+ if (initverbose)
+ log_message_class("Initialize class ", m->class);
+#endif
+
+ if (!initialize_class(m->class))
+ return NULL;
+
+ /* check if the method has been compiled during initialization */
+
+ if ((m->code != NULL) && (m->code->entrypoint != NULL))
+ return m->code->entrypoint;
+ }
+
+ /* enter a monitor on the method */
+
+ LOCK_MONITOR_ENTER(m);
/* if method has been already compiled return immediately */
- if (m->entrypoint)
- return m->entrypoint;
+ if (m->code != NULL) {
+ LOCK_MONITOR_EXIT(m);
- count_methods++;
+ assert(m->code->entrypoint);
+ return m->code->entrypoint;
+ }
-#if defined(USE_THREADS) && defined(NATIVE_THREADS)
- pthread_mutex_lock(&compiler_mutex);
-#endif
+ STATISTICS(count_methods++);
- intsDisable(); /* disable interrupts */
+#if defined(ENABLE_STATISTICS)
+ /* measure time */
- regs_ok = false;
+ if (opt_getcompilingtime)
+ compilingtime_start();
+#endif
/* mark start of dump memory area */
dumpsize = dump_size();
- /* measure time */
+ /* create jitdata structure */
- if (getcompilingtime)
- starttime = getcputime();
-
- /* if there is no javacode print error message and return empty method */
-
- if (!m->jcode) {
- char logtext[MAXLOGTEXT];
- sprintf(logtext, "No code given for: ");
- utf_sprint(logtext+strlen(logtext), m->class->name);
- strcpy(logtext+strlen(logtext), ".");
- utf_sprint(logtext+strlen(logtext), m->name);
- utf_sprint(logtext+strlen(logtext), m->descriptor);
- log_text(logtext);
- intsRestore(); /* enable interrupts again */
- return (methodptr) do_nothing_function; /* return empty method */
+ jd = jit_jitdata_new(m);
+
+ /* set the flags for the current JIT run */
+
+ jd->flags = JITDATA_FLAG_PARSE;
+
+#if defined(ENABLE_VERIFIER)
+ if (opt_verify)
+ jd->flags |= JITDATA_FLAG_VERIFY;
+#endif
+
+#if defined(ENABLE_PROFILING)
+ if (opt_prof)
+ jd->flags |= JITDATA_FLAG_INSTRUMENT;
+#endif
+
+#if defined(ENABLE_IFCONV)
+ if (opt_ifconv)
+ jd->flags |= JITDATA_FLAG_IFCONV;
+#endif
+
+#if defined(ENABLE_INLINING) && defined(ENABLE_INLINING_DEBUG)
+ if (opt_inlining && opt_inline_debug_all)
+ jd->flags |= JITDATA_FLAG_INLINE;
+#endif
+
+ if (opt_showintermediate)
+ jd->flags |= JITDATA_FLAG_SHOWINTERMEDIATE;
+
+ if (opt_showdisassemble)
+ jd->flags |= JITDATA_FLAG_SHOWDISASSEMBLE;
+
+ if (opt_verbosecall)
+ jd->flags |= JITDATA_FLAG_VERBOSECALL;
+
+#if defined(ENABLE_REPLACEMENT) && defined(ENABLE_INLINING)
+ if (opt_inlining)
+ jd->flags |= JITDATA_FLAG_COUNTDOWN;
+#endif
+
+#if defined(ENABLE_JIT)
+# if defined(ENABLE_INTRP)
+ if (!opt_intrp)
+# endif
+ /* initialize the register allocator */
+ {
+ reg_setup(jd);
}
+#endif
- /* print log message for compiled method */
+ /* setup the codegendata memory */
- if (compileverbose) {
- char logtext[MAXLOGTEXT];
- sprintf(logtext, "Compiling: ");
- utf_sprint(logtext+strlen(logtext), m->class->name);
- strcpy(logtext+strlen(logtext), ".");
- utf_sprint(logtext+strlen(logtext), m->name);
- utf_sprint(logtext+strlen(logtext), m->descriptor);
- log_text(logtext);
+ codegen_setup(jd);
+
+ /* now call internal compile function */
+
+ r = jit_compile_intern(jd);
+
+ if (r == NULL) {
+ /* We had an exception! Finish stuff here if necessary. */
+
+ /* release codeinfo */
+
+ code_codeinfo_free(jd->code);
+
+#if defined(ENABLE_PROFILING)
+ /* Release memory for basic block profiling information. */
+
+ if (JITDATA_HAS_FLAG_INSTRUMENT(jd))
+ if (jd->code->bbfrequency != NULL)
+ MFREE(jd->code->bbfrequency, u4, jd->code->basicblockcount);
+#endif
}
+ else {
+ DEBUG_JIT_COMPILEVERBOSE("Running: ");
+ }
+
+ /* release dump area */
+
+ dump_release(dumpsize);
+
+#if defined(ENABLE_STATISTICS)
+ /* measure time */
+
+ if (opt_getcompilingtime)
+ compilingtime_stop();
+#endif
+
+ /* leave the monitor */
+
+ LOCK_MONITOR_EXIT(m);
+
+ /* return pointer to the methods entry point */
+
+ return r;
+}
+
+/* jit_recompile ***************************************************************
- /* initialisation of variables and subsystems */
+ Recompiles a Java method.
- isleafmethod = true;
+*******************************************************************************/
+
+u1 *jit_recompile(methodinfo *m)
+{
+ u1 *r;
+ jitdata *jd;
+ u1 optlevel;
+ s4 dumpsize;
+
+ /* check for max. optimization level */
- method = m;
- class = m->class;
- descriptor = m->descriptor;
- maxstack = m->maxstack;
- maxlocals = m->maxlocals;
- jcodelength = m->jcodelength;
- jcode = m->jcode;
- exceptiontablelength = m->exceptiontablelength;
- raw_extable = m->exceptiontable;
+ optlevel = (m->code) ? m->code->optlevel : 0;
-#ifdef STATISTICS
- count_tryblocks += exceptiontablelength;
- count_javacodesize += jcodelength + 18;
- count_javaexcsize += exceptiontablelength * POINTERSIZE;
+#if 0
+ if (optlevel == 1) {
+/* log_message_method("not recompiling: ", m); */
+ return NULL;
+ }
#endif
- /* initialise parameter type descriptor */
+ DEBUG_JIT_COMPILEVERBOSE("Recompiling start: ");
- descriptor2types(m);
- mreturntype = m->returntype;
- mparamcount = m->paramcount;
- mparamtypes = m->paramtypes;
+ STATISTICS(count_jit_calls++);
- /* initialize class list with class the compiled method belongs to */
+#if defined(ENABLE_STATISTICS)
+ /* measure time */
- uninitializedclasses = chain_new();
- compiler_addinitclass(m->class);
+ if (opt_getcompilingtime)
+ compilingtime_start();
+#endif
+ /* mark start of dump memory area */
+
+ dumpsize = dump_size();
+
+ /* create jitdata structure */
+
+ jd = jit_jitdata_new(m);
+
+ /* set the current optimization level to the previous one plus 1 */
+
+ jd->code->optlevel = optlevel + 1;
+
+ /* get the optimization flags for the current JIT run */
-#if defined(__I386__)
- method_uses_ecx = true;
- method_uses_edx = false;
+#if defined(ENABLE_VERIFIER)
+ jd->flags |= JITDATA_FLAG_VERIFY;
#endif
- /* call the compiler passes ***********************************************/
+ /* jd->flags |= JITDATA_FLAG_REORDER; */
+ if (opt_showintermediate)
+ jd->flags |= JITDATA_FLAG_SHOWINTERMEDIATE;
+ if (opt_showdisassemble)
+ jd->flags |= JITDATA_FLAG_SHOWDISASSEMBLE;
+ if (opt_verbosecall)
+ jd->flags |= JITDATA_FLAG_VERBOSECALL;
+
+#if defined(ENABLE_INLINING)
+ if (opt_inlining)
+ jd->flags |= JITDATA_FLAG_INLINE;
+#endif
- /* must be called before reg_init, because it can change maxlocals */
- if (useinlining)
- inlining_init(m);
+#if defined(ENABLE_JIT)
+# if defined(ENABLE_INTRP)
+ if (!opt_intrp)
+# endif
+ /* initialize the register allocator */
- reg_setup();
+ reg_setup(jd);
+#endif
- codegen_init();
+ /* setup the codegendata memory */
+
+ codegen_setup(jd);
+
+ /* now call internal compile function */
+
+ r = jit_compile_intern(jd);
+
+ if (r == NULL) {
+ /* We had an exception! Finish stuff here if necessary. */
- parse();
- analyse_stack();
-
-#ifdef CACAO_TYPECHECK
- if (opt_verify) {
- LOG_STEP("Typechecking");
- typecheck();
- LOG_STEP("Done typechecking");
+ /* release codeinfo */
+
+ code_codeinfo_free(jd->code);
}
+
+ /* release dump area */
+
+ dump_release(dumpsize);
+
+#if defined(ENABLE_STATISTICS)
+ /* measure time */
+
+ if (opt_getcompilingtime)
+ compilingtime_stop();
+#endif
+
+ DEBUG_JIT_COMPILEVERBOSE("Recompiling done: ");
+
+ /* return pointer to the methods entry point */
+
+ return r;
+}
+
+
+/* jit_compile_intern **********************************************************
+
+ Static internal function which does the actual compilation.
+
+*******************************************************************************/
+
+static u1 *jit_compile_intern(jitdata *jd)
+{
+ methodinfo *m;
+ codegendata *cd;
+ codeinfo *code;
+
+#if defined(ENABLE_RT_TIMING)
+ struct timespec time_start,time_checks,time_parse,time_stack,
+ time_typecheck,time_loop,time_ifconv,time_alloc,
+ time_codegen;
#endif
- if (opt_loops) {
- depthFirst();
- analyseGraph();
- optimize_loops();
- }
-
-#ifdef SPECIALMEMUSE
- preregpass();
+ RT_TIMING_GET_TIME(time_start);
+
+ /* get required compiler data */
+
+#if defined(ENABLE_LSRA) || defined(ENABLE_SSA)
+ jd->ls = NULL;
+#endif
+ m = jd->m;
+ code = jd->code;
+ cd = jd->cd;
+
+ /* print log message for compiled method */
+
+ DEBUG_JIT_COMPILEVERBOSE("Compiling: ");
+
+#if defined(ENABLE_DEBUG_FILTER)
+ show_filters_apply(jd->m);
#endif
- LOG_STEP("Regalloc");
- regalloc();
- regs_ok = true;
+ /* handle native methods and create a native stub */
- LOG_STEP("Codegen");
- codegen();
+ if (m->flags & ACC_NATIVE) {
+ functionptr f;
- /* intermediate and assembly code listings ********************************/
+#if defined(WITH_STATIC_CLASSPATH)
+ f = native_findfunction(m->class->name, m->name, m->descriptor,
+ (m->flags & ACC_STATIC));
+ if (f == NULL)
+ return NULL;
+#else
+ f = NULL;
+#endif
+
+ code = codegen_generate_stub_native(m, f);
+
+ assert(!m->code); /* native methods are never recompiled */
+ m->code = code;
- if (showintermediate)
- show_icmd_method();
- else if (showdisassemble)
- disassemble((void*) (m->mcode + dseglen), m->mcodelength - dseglen);
+ return code->entrypoint;
+ }
- if (showddatasegment)
- dseg_display((void*) (m->mcode));
+ /* if there is no javacode, print error message and return empty method */
- /* release dump area */
+ if (m->jcode == NULL) {
+ DEBUG_JIT_COMPILEVERBOSE("No code given for: ");
- dump_release(dumpsize);
+ code->entrypoint = (u1 *) (ptrint) do_nothing_function;
+ m->code = code;
- /* measure time */
+ return code->entrypoint; /* return empty method */
+ }
- if (getcompilingtime) {
- stoptime = getcputime();
- compilingtime += (stoptime - starttime);
+#if defined(ENABLE_STATISTICS)
+ if (opt_stat) {
+ count_javacodesize += m->jcodelength + 18;
+ count_tryblocks += jd->exceptiontablelength;
+ count_javaexcsize += jd->exceptiontablelength * SIZEOF_VOID_P;
}
+#endif
- /* initialize all used classes */
- /* because of reentrant code global variables are not allowed here */
+ RT_TIMING_GET_TIME(time_checks);
- LOG_STEP("Initializing");
- {
- chain *ul = uninitializedclasses; /* list of uninitialized classes */
- classinfo *c; /* single class */
+ /* call the compiler passes ***********************************************/
+
+ DEBUG_JIT_COMPILEVERBOSE("Parsing: ");
+
+ /* call parse pass */
+
+ if (!parse(jd)) {
+ DEBUG_JIT_COMPILEVERBOSE("Exception while parsing: ");
+
+ return NULL;
+ }
+ RT_TIMING_GET_TIME(time_parse);
+
+ DEBUG_JIT_COMPILEVERBOSE("Parsing done: ");
+
+#if defined(ENABLE_JIT)
+# if defined(ENABLE_INTRP)
+ if (!opt_intrp) {
+# endif
+ DEBUG_JIT_COMPILEVERBOSE("Analysing: ");
+
+ /* call stack analysis pass */
+
+ if (!stack_analyse(jd)) {
+ DEBUG_JIT_COMPILEVERBOSE("Exception while analysing: ");
+
+ return NULL;
+ }
+ RT_TIMING_GET_TIME(time_stack);
+
+ DEBUG_JIT_COMPILEVERBOSE("Analysing done: ");
+
+ /* Build the CFG. This has to be done after stack_analyse, as
+ there happens the JSR elimination. */
+
+ if (!cfg_build(jd))
+ return NULL;
+
+#ifdef ENABLE_VERIFIER
+ if (JITDATA_HAS_FLAG_VERIFY(jd)) {
+ DEBUG_JIT_COMPILEVERBOSE("Typechecking: ");
+
+ /* call typecheck pass */
+ if (!typecheck(jd)) {
+ DEBUG_JIT_COMPILEVERBOSE("Exception while typechecking: ");
+
+ return NULL;
+ }
+
+ DEBUG_JIT_COMPILEVERBOSE("Typechecking done: ");
+ }
+#endif
+ RT_TIMING_GET_TIME(time_typecheck);
+
+#if defined(ENABLE_LOOP)
+ if (opt_loops) {
+ depthFirst(jd);
+ analyseGraph(jd);
+ optimize_loops(jd);
+ jit_renumber_basicblocks(jd);
+ }
+#endif
+ RT_TIMING_GET_TIME(time_loop);
+
+#if defined(ENABLE_IFCONV)
+ if (JITDATA_HAS_FLAG_IFCONV(jd)) {
+ if (!ifconv_static(jd))
+ return NULL;
+ jit_renumber_basicblocks(jd);
+ }
+#endif
+ RT_TIMING_GET_TIME(time_ifconv);
+
+ /* inlining */
+
+#if defined(ENABLE_INLINING)
+ if (JITDATA_HAS_FLAG_INLINE(jd)) {
+ if (!inline_inline(jd))
+ return NULL;
+ }
+#endif
+
+#if defined(ENABLE_PROFILING)
+ /* Basic block reordering. I think this should be done after
+ if-conversion, as we could lose the ability to do the
+ if-conversion. */
+
+ if (JITDATA_HAS_FLAG_REORDER(jd)) {
+ if (!reorder(jd))
+ return NULL;
+ jit_renumber_basicblocks(jd);
+ }
+#endif
+
+ DEBUG_JIT_COMPILEVERBOSE("Allocating registers: ");
+
+#if defined(ENABLE_LSRA) && !defined(ENABLE_SSA)
+ /* allocate registers */
+ if (opt_lsra) {
+ if (!lsra(jd))
+ return NULL;
+
+ STATISTICS(count_methods_allocated_by_lsra++);
- while ((c = chain_first(ul)) != NULL) {
- chain_remove(ul);
- class_init(c); /* may again call the compiler */
+ } else
+# endif /* defined(ENABLE_LSRA) && !defined(ENABLE_SSA) */
+#if defined(ENABLE_SSA)
+ /* allocate registers */
+ if ((opt_lsra) && (jd->exceptiontablelength == 0)) {
+ jd->ls = DNEW(lsradata);
+ lsra(jd);
+
+ STATISTICS(count_methods_allocated_by_lsra++);
+
+ } else
+# endif /* defined(ENABLE_SSA) */
+ {
+ STATISTICS(count_locals_conflicts += (jd->maxlocals - 1) * (jd->maxlocals));
+
+ regalloc(jd);
+ }
+
+ STATISTICS(simplereg_make_statistics(jd));
+
+ DEBUG_JIT_COMPILEVERBOSE("Allocating registers done: ");
+# if defined(ENABLE_INTRP)
+ }
+# endif
+#endif /* defined(ENABLE_JIT) */
+ RT_TIMING_GET_TIME(time_alloc);
+
+#if defined(ENABLE_PROFILING)
+ /* Allocate memory for basic block profiling information. This
+ _must_ be done after loop optimization and register allocation,
+ since they can change the basic block count. */
+
+ if (JITDATA_HAS_FLAG_INSTRUMENT(jd))
+ code->bbfrequency = MNEW(u4, jd->basicblockcount);
+#endif
+
+ DEBUG_JIT_COMPILEVERBOSE("Generating code: ");
+
+ /* now generate the machine code */
+
+#if defined(ENABLE_JIT)
+# if defined(ENABLE_INTRP)
+ if (opt_intrp) {
+#if defined(ENABLE_VERIFIER)
+ if (opt_verify) {
+ DEBUG_JIT_COMPILEVERBOSE("Typechecking (stackbased): ");
+
+ if (!typecheck_stackbased(jd)) {
+ DEBUG_JIT_COMPILEVERBOSE("Exception while typechecking (stackbased): ");
+ return NULL;
+ }
}
- chain_free(ul);
+#endif
+ if (!intrp_codegen(jd)) {
+ DEBUG_JIT_COMPILEVERBOSE("Exception while generating code: ");
+
+ return NULL;
+ }
+ } else
+# endif
+ {
+ if (!codegen_generate(jd)) {
+ DEBUG_JIT_COMPILEVERBOSE("Exception while generating code: ");
+
+ return NULL;
+ }
+ }
+#else
+ if (!intrp_codegen(jd)) {
+ DEBUG_JIT_COMPILEVERBOSE("Exception while generating code: ");
+
+ return NULL;
}
+#endif
+ RT_TIMING_GET_TIME(time_codegen);
+
+ DEBUG_JIT_COMPILEVERBOSE("Generating code done: ");
- intsRestore(); /* enable interrupts again */
+#if !defined(NDEBUG)
+#if defined(ENABLE_DEBUG_FILTER)
+ if (jd->m->filtermatches & SHOW_FILTER_FLAG_SHOW_METHOD)
+#endif
+ {
+ /* intermediate and assembly code listings */
+
+ if (JITDATA_HAS_FLAG_SHOWINTERMEDIATE(jd)) {
+ show_method(jd, SHOW_CODE);
+ }
+ else if (JITDATA_HAS_FLAG_SHOWDISASSEMBLE(jd)) {
+# if defined(ENABLE_DISASSEMBLER)
+ DISASSEMBLE(code->entrypoint,
+ code->entrypoint + (code->mcodelength - cd->dseglen));
+# endif
+ }
-#if defined(USE_THREADS) && defined(NATIVE_THREADS)
- pthread_mutex_unlock(&compiler_mutex);
+ if (opt_showddatasegment)
+ dseg_display(jd);
+ }
#endif
+ DEBUG_JIT_COMPILEVERBOSE("Compiling done: ");
+
+ /* switch to the newly generated code */
+
+ assert(code);
+ assert(code->entrypoint);
+
+ /* add the current compile version to the methodinfo */
+
+ code->prev = m->code;
+ m->code = code;
+
+ RT_TIMING_TIME_DIFF(time_start,time_checks,RT_TIMING_JIT_CHECKS);
+ RT_TIMING_TIME_DIFF(time_checks,time_parse,RT_TIMING_JIT_PARSE);
+ RT_TIMING_TIME_DIFF(time_parse,time_stack,RT_TIMING_JIT_STACK);
+ RT_TIMING_TIME_DIFF(time_stack,time_typecheck,RT_TIMING_JIT_TYPECHECK);
+ RT_TIMING_TIME_DIFF(time_typecheck,time_loop,RT_TIMING_JIT_LOOP);
+ RT_TIMING_TIME_DIFF(time_loop,time_alloc,RT_TIMING_JIT_ALLOC);
+ RT_TIMING_TIME_DIFF(time_alloc,time_codegen,RT_TIMING_JIT_CODEGEN);
+ RT_TIMING_TIME_DIFF(time_start,time_codegen,RT_TIMING_JIT_TOTAL);
+
/* return pointer to the methods entry point */
-
- LOG_STEP("Done compiling");
- return m->entrypoint;
+
+ return code->entrypoint;
}
+/* jit_invalidate_code *********************************************************
-/* functions for compiler initialisation and finalisation *********************/
+ Mark the compiled code of the given method as invalid and take care that
+ it is replaced if necessary.
-#ifdef USEBUILTINTABLE
+ XXX Not fully implemented, yet.
-/* XXX delete */
-#if 0
-static int stdopcompare(const void *a, const void *b)
+*******************************************************************************/
+
+void jit_invalidate_code(methodinfo *m)
{
- stdopdescriptor *o1 = (stdopdescriptor *) a;
- stdopdescriptor *o2 = (stdopdescriptor *) b;
- if (!o1->supported && o2->supported)
- return -1;
- if (o1->supported && !o2->supported)
- return 1;
- return (o1->opcode < o2->opcode) ? -1 : (o1->opcode > o2->opcode);
-}
+ codeinfo *code;
+
+ code = m->code;
+ if (code == NULL || CODE_IS_INVALID(code))
+ return;
+
+ CODE_SETFLAG_INVALID(code);
+
+ /* activate mappable replacement points */
+
+#if defined(ENABLE_REPLACEMENT)
+ replace_activate_replacement_points(code, true);
+#else
+ vm_abort("invalidating code only works with ENABLE_REPLACEMENT");
#endif
-static int stdopcompare(const void *a, const void *b)
+}
+
+
+/* jit_request_optimization ****************************************************
+
+ Request optimization of the given method. If the code of the method is
+ unoptimized, it will be invalidated, so the next jit_get_current_code(m)
+ triggers an optimized recompilation.
+ If the method is already optimized, this function does nothing.
+
+ IN:
+ m................the method
+
+*******************************************************************************/
+
+void jit_request_optimization(methodinfo *m)
{
- builtin_descriptor *o1 = (builtin_descriptor *) a;
- builtin_descriptor *o2 = (builtin_descriptor *) b;
- if (!o1->supported && o2->supported)
- return -1;
- if (o1->supported && !o2->supported)
- return 1;
- return (o1->opcode < o2->opcode) ? -1 : (o1->opcode > o2->opcode);
+ codeinfo *code;
+
+ code = m->code;
+
+ if (code && code->optlevel == 0)
+ jit_invalidate_code(m);
}
-/* XXX delete */
-#if 0
-static inline void sort_builtintable()
+
+/* jit_get_current_code ********************************************************
+
+ Get the currently valid code for the given method. If there is no valid
+ code, (re)compile the method.
+
+ IN:
+ m................the method
+
+ RETURN VALUE:
+ the codeinfo* for the current code, or
+ NULL if an exception has been thrown during recompilation.
+
+*******************************************************************************/
+
+codeinfo *jit_get_current_code(methodinfo *m)
{
- int len;
+ assert(m);
- len = sizeof(builtintable) / sizeof(stdopdescriptor);
- qsort(builtintable, len, sizeof(builtin_descriptor), stdopcompare);
+ /* if we have valid code, return it */
- for (--len; len>=0 && builtintable[len].supported; len--);
- builtintablelen = ++len;
+ if (m->code && CODE_IS_VALID(m->code))
+ return m->code;
-#if 0
- {
- int i;
- for (i=0; i<len; i++)
- if (!builtintable[i].supported)
- printf("%s\n", icmd_names[builtintable[i].opcode]);
- }
-#endif
+ /* otherwise: recompile */
+
+ if (!jit_recompile(m))
+ return NULL;
+
+ assert(m->code);
+
+ return m->code;
}
-#endif
-static inline void sort_builtintable()
+
+/* jit_asm_compile *************************************************************
+
+ This method is called from asm_vm_call_method and does:
+
+ - create stackframe info for exceptions
+ - compile the method
+ - patch the entrypoint of the method into the calculated address in
+ the JIT code
+ - flushes the instruction cache.
+
+*******************************************************************************/
+
+#if defined(ENABLE_JIT)
+u1 *jit_asm_compile(methodinfo *m, u1 *mptr, u1 *sp, u1 *ra)
{
- int len;
+ stackframeinfo sfi;
+ u1 *entrypoint;
+ u1 *pa;
+ ptrint *p;
- len = 0;
- while (builtin_desc[len].opcode != 255) len++;
- qsort(builtin_desc, len, sizeof(builtin_descriptor), stdopcompare);
+ /* create the stackframeinfo (subtract 1 from RA as it points to the */
+ /* instruction after the call) */
- for (--len; len>=0 && builtin_desc[len].supported; len--);
- builtintablelen = ++len;
+ stacktrace_create_extern_stackframeinfo(&sfi, NULL, sp, ra, ra-1);
+
+ /* actually compile the method */
+
+ entrypoint = jit_compile(m);
+
+ /* remove the stackframeinfo */
+
+ stacktrace_remove_stackframeinfo(&sfi);
+
+ /* there was a problem during compilation */
+
+ if (entrypoint == NULL)
+ return NULL;
+
+ /* get the method patch address */
+
+ pa = md_get_method_patch_address(ra, &sfi, mptr);
+
+ /* patch the method entry point */
+
+ p = (ptrint *) pa;
+
+ *p = (ptrint) entrypoint;
+
+ /* flush the instruction cache */
+
+ md_icacheflush(pa, SIZEOF_VOID_P);
+
+ return entrypoint;
}
+#endif /* defined(ENABLE_JIT) */
-#if 0
-stdopdescriptor *find_builtin(int icmd)
-{
- builtin_descriptor *first = builtintable;
- builtin_descriptor *last = builtintable + builtintablelen;
-#endif
-builtin_descriptor *find_builtin(int icmd)
+/* jit_complement_condition ****************************************************
+
+ Returns the complement of the passed conditional instruction.
+
+ We use the order of the different conditions, e.g.:
+
+ ICMD_IFEQ 153
+ ICMD_IFNE 154
+
+ If the passed opcode is odd, we simply add 1 to get the complement.
+ If the opcode is even, we subtract 1.
+
+ Exception:
+
+ ICMD_IFNULL 198
+ ICMD_IFNONNULL 199
+
+*******************************************************************************/
+
+s4 jit_complement_condition(s4 opcode)
{
- builtin_descriptor *first = builtin_desc;
- builtin_descriptor *last = builtin_desc + builtintablelen;
- int len = last - first;
- int half;
- builtin_descriptor *middle;
-
- while (len > 0) {
- half = len / 2;
- middle = first + half;
- if (middle->opcode < icmd) {
- first = middle + 1;
- len -= half + 1;
- } else
- len = half;
+ switch (opcode) {
+ case ICMD_IFNULL:
+ return ICMD_IFNONNULL;
+
+ case ICMD_IFNONNULL:
+ return ICMD_IFNULL;
+
+ default:
+ /* check if opcode is odd */
+
+ if (opcode & 0x1)
+ return opcode + 1;
+ else
+ return opcode - 1;
}
- return first != last ? first : NULL;
}
-#endif
+/* jit_renumber_basicblocks ****************************************************
+ Set the ->nr of all blocks so it increases when traversing ->next.
-void jit_init()
+ IN:
+ jitdata..........the current jitdata
+
+*******************************************************************************/
+
+void jit_renumber_basicblocks(jitdata *jd)
{
- int i;
+ s4 nr;
+ basicblock *bptr;
-#ifdef USEBUILTINTABLE
- sort_builtintable();
-#endif
+ nr = 0;
+ for (bptr = jd->basicblocks; bptr != NULL; bptr = bptr->next) {
+ bptr->nr = nr++;
+ }
-#if defined(__ALPHA__)
- has_ext_instr_set = ! has_no_x_instr_set();
-#endif
+ /* we have one block more than jd->basicblockcount (the end marker) */
- for (i = 0; i < 256; i++)
- stackreq[i] = 1;
-
- stackreq[JAVA_NOP] = 0;
- stackreq[JAVA_ISTORE] = 0;
- stackreq[JAVA_LSTORE] = 0;
- stackreq[JAVA_FSTORE] = 0;
- stackreq[JAVA_DSTORE] = 0;
- stackreq[JAVA_ASTORE] = 0;
- stackreq[JAVA_ISTORE_0] = 0;
- stackreq[JAVA_ISTORE_1] = 0;
- stackreq[JAVA_ISTORE_2] = 0;
- stackreq[JAVA_ISTORE_3] = 0;
- stackreq[JAVA_LSTORE_0] = 0;
- stackreq[JAVA_LSTORE_1] = 0;
- stackreq[JAVA_LSTORE_2] = 0;
- stackreq[JAVA_LSTORE_3] = 0;
- stackreq[JAVA_FSTORE_0] = 0;
- stackreq[JAVA_FSTORE_1] = 0;
- stackreq[JAVA_FSTORE_2] = 0;
- stackreq[JAVA_FSTORE_3] = 0;
- stackreq[JAVA_DSTORE_0] = 0;
- stackreq[JAVA_DSTORE_1] = 0;
- stackreq[JAVA_DSTORE_2] = 0;
- stackreq[JAVA_DSTORE_3] = 0;
- stackreq[JAVA_ASTORE_0] = 0;
- stackreq[JAVA_ASTORE_1] = 0;
- stackreq[JAVA_ASTORE_2] = 0;
- stackreq[JAVA_ASTORE_3] = 0;
- stackreq[JAVA_IASTORE] = 0;
- stackreq[JAVA_LASTORE] = 0;
- stackreq[JAVA_FASTORE] = 0;
- stackreq[JAVA_DASTORE] = 0;
- stackreq[JAVA_AASTORE] = 0;
- stackreq[JAVA_BASTORE] = 0;
- stackreq[JAVA_CASTORE] = 0;
- stackreq[JAVA_SASTORE] = 0;
- stackreq[JAVA_POP] = 0;
- stackreq[JAVA_POP2] = 0;
- stackreq[JAVA_IINC] = 0;
- stackreq[JAVA_IFEQ] = 0;
- stackreq[JAVA_IFNE] = 0;
- stackreq[JAVA_IFLT] = 0;
- stackreq[JAVA_IFGE] = 0;
- stackreq[JAVA_IFGT] = 0;
- stackreq[JAVA_IFLE] = 0;
- stackreq[JAVA_IF_ICMPEQ] = 0;
- stackreq[JAVA_IF_ICMPNE] = 0;
- stackreq[JAVA_IF_ICMPLT] = 0;
- stackreq[JAVA_IF_ICMPGE] = 0;
- stackreq[JAVA_IF_ICMPGT] = 0;
- stackreq[JAVA_IF_ICMPLE] = 0;
- stackreq[JAVA_IF_ACMPEQ] = 0;
- stackreq[JAVA_IF_ACMPNE] = 0;
- stackreq[JAVA_GOTO] = 0;
- stackreq[JAVA_RET] = 0;
- stackreq[JAVA_TABLESWITCH] = 0;
- stackreq[JAVA_LOOKUPSWITCH] = 0;
- stackreq[JAVA_IRETURN] = 0;
- stackreq[JAVA_LRETURN] = 0;
- stackreq[JAVA_FRETURN] = 0;
- stackreq[JAVA_DRETURN] = 0;
- stackreq[JAVA_ARETURN] = 0;
- stackreq[JAVA_RETURN] = 0;
- stackreq[JAVA_PUTSTATIC] = 0;
- stackreq[JAVA_PUTFIELD] = 0;
- stackreq[JAVA_MONITORENTER] = 0;
- stackreq[JAVA_MONITOREXIT] = 0;
- stackreq[JAVA_WIDE] = 0;
- stackreq[JAVA_IFNULL] = 0;
- stackreq[JAVA_IFNONNULL] = 0;
- stackreq[JAVA_GOTO_W] = 0;
- stackreq[JAVA_BREAKPOINT] = 0;
-
- stackreq[JAVA_SWAP] = 2;
- stackreq[JAVA_DUP2] = 2;
- stackreq[JAVA_DUP_X1] = 3;
- stackreq[JAVA_DUP_X2] = 4;
- stackreq[JAVA_DUP2_X1] = 3;
- stackreq[JAVA_DUP2_X2] = 4;
-
- reg_init();
- init_exceptions();
+ assert(nr == jd->basicblockcount + 1);
}
+/* jit_check_basicblock_numbers ************************************************
+
+ Assert that the ->nr of the first block is zero and increases by 1 each
+ time ->next is traversed.
+ This function should be called before any analysis that relies on
+ the basicblock numbers.
+
+ IN:
+ jitdata..........the current jitdata
-void jit_close()
+ NOTE: Aborts with an assertion if the condition is not met!
+
+*******************************************************************************/
+
+#if !defined(NDEBUG)
+void jit_check_basicblock_numbers(jitdata *jd)
{
- codegen_close();
- reg_close();
+ s4 nr;
+ basicblock *bptr;
+
+ nr = 0;
+ for (bptr = jd->basicblocks; bptr != NULL; bptr = bptr->next) {
+ assert(bptr->nr == nr);
+ nr++;
+ }
+
+ /* we have one block more than jd->basicblockcount (the end marker) */
+
+ assert(nr == jd->basicblockcount + 1);
}
+#endif /* !defined(NDEBUG) */
/*
* c-basic-offset: 4
* tab-width: 4
* End:
+ * vim:noexpandtab:sw=4:ts=4:
*/