1 /* src/vm/jit/jit.c - calls the code generation functions
3 Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 Contact: cacao@cacaojvm.org
27 Authors: Andreas Krall
30 Changes: Edwin Steiner
34 $Id: jit.c 4737 2006-04-05 12:56:43Z edwin $
44 #if defined(ENABLE_RT_TIMING)
49 #include "mm/memory.h"
50 #include "native/native.h"
51 #include "toolbox/logging.h"
52 #include "vm/builtin.h"
54 #include "vm/global.h"
55 #include "vm/initialize.h"
56 #include "vm/loader.h"
57 #include "vm/method.h"
58 #include "vm/options.h"
59 #include "vm/statistics.h"
60 #include "vm/jit/asmpart.h"
61 #include "vm/jit/codegen-common.h"
62 #include "vm/jit/disass.h"
63 #include "vm/jit/dseg.h"
64 #include "vm/jit/jit.h"
67 #include "vm/jit/parse.h"
68 #include "vm/jit/reg.h"
69 #include "vm/jit/stack.h"
71 #include "vm/jit/allocator/simplereg.h"
72 #if defined(ENABLE_LSRA)
73 # include "vm/jit/allocator/lsra.h"
76 #if defined(ENABLE_IFCONV)
77 # include "vm/jit/ifconv/ifconv.h"
80 #include "vm/jit/loop/analyze.h"
81 #include "vm/jit/loop/graph.h"
82 #include "vm/jit/loop/loop.h"
83 #include "vm/jit/verify/typecheck.h"
85 #if defined(USE_THREADS)
86 # if defined(NATIVE_THREADS)
87 # include "threads/native/threads.h"
89 # include "threads/green/threads.h"
94 /* debug macros ***************************************************************/
97 #define DEBUG_JIT_COMPILEVERBOSE(x) \
99 if (compileverbose) { \
100 log_message_method(x, m); \
104 #define DEBUG_JIT_COMPILEVERBOSE(x) /* nothing */
108 /* global switches ************************************************************/
113 int jcommandsize[256] = {
118 #define JAVA_ACONST_NULL 1
119 #define ICMD_ACONST 1 /* val.a = constant */
121 #define JAVA_ICONST_M1 2
122 #define ICMD_CHECKNULL 2
124 #define JAVA_ICONST_0 3
125 #define ICMD_ICONST 3 /* val.i = constant */
127 #define JAVA_ICONST_1 4
129 #define JAVA_ICONST_2 5
130 #define ICMD_IDIVPOW2 5 /* val.i = constant */
132 #define JAVA_ICONST_3 6
133 #define ICMD_LDIVPOW2 6 /* val.l = constant */
135 #define JAVA_ICONST_4 7
137 #define JAVA_ICONST_5 8
139 #define JAVA_LCONST_0 9
140 #define ICMD_LCONST 9 /* val.l = constant */
142 #define JAVA_LCONST_1 10
143 #define ICMD_LCMPCONST 10 /* val.l = constant */
145 #define JAVA_FCONST_0 11
146 #define ICMD_FCONST 11 /* val.f = constant */
148 #define JAVA_FCONST_1 12
150 #define JAVA_FCONST_2 13
151 #define ICMD_ELSE_ICONST 13
153 #define JAVA_DCONST_0 14
154 #define ICMD_DCONST 14 /* val.d = constant */
156 #define JAVA_DCONST_1 15
157 #define ICMD_IFEQ_ICONST 15
159 #define JAVA_BIPUSH 16
160 #define ICMD_IFNE_ICONST 16
162 #define JAVA_SIPUSH 17
163 #define ICMD_IFLT_ICONST 17
166 #define ICMD_IFGE_ICONST 18
169 #define ICMD_IFGT_ICONST 19
171 #define JAVA_LDC2W 20
172 #define ICMD_IFLE_ICONST 20
174 /* order of LOAD instructions must be */
175 /* equal to order of TYPE_XXX defines */
176 #define JAVA_ILOAD 21
177 #define ICMD_ILOAD 21 /* op1 = local variable */
179 #define JAVA_LLOAD 22
180 #define ICMD_LLOAD 22 /* op1 = local variable */
182 #define JAVA_FLOAD 23
183 #define ICMD_FLOAD 23 /* op1 = local variable */
185 #define JAVA_DLOAD 24
186 #define ICMD_DLOAD 24 /* op1 = local variable */
188 #define JAVA_ALOAD 25
189 #define ICMD_ALOAD 25 /* op1 = local variable */
191 #define JAVA_ILOAD_0 26
192 #define ICMD_IADDCONST 26 /* val.i = constant */
194 #define JAVA_ILOAD_1 27
195 #define ICMD_ISUBCONST 27 /* val.i = constant */
197 #define JAVA_ILOAD_2 28
198 #define ICMD_IMULCONST 28 /* val.i = constant */
200 #define JAVA_ILOAD_3 29
201 #define ICMD_IANDCONST 29 /* val.i = constant */
203 #define JAVA_LLOAD_0 30
204 #define ICMD_IORCONST 30 /* val.i = constant */
206 #define JAVA_LLOAD_1 31
207 #define ICMD_IXORCONST 31 /* val.i = constant */
209 #define JAVA_LLOAD_2 32
210 #define ICMD_ISHLCONST 32 /* val.i = constant */
212 #define JAVA_LLOAD_3 33
213 #define ICMD_ISHRCONST 33 /* val.i = constant */
215 #define JAVA_FLOAD_0 34
216 #define ICMD_IUSHRCONST 34 /* val.i = constant */
218 #define JAVA_FLOAD_1 35
219 #define ICMD_IREMPOW2 35 /* val.i = constant */
221 #define JAVA_FLOAD_2 36
222 #define ICMD_LADDCONST 36 /* val.l = constant */
224 #define JAVA_FLOAD_3 37
225 #define ICMD_LSUBCONST 37 /* val.l = constant */
227 #define JAVA_DLOAD_0 38
228 #define ICMD_LMULCONST 38 /* val.l = constant */
230 #define JAVA_DLOAD_1 39
231 #define ICMD_LANDCONST 39 /* val.l = constant */
233 #define JAVA_DLOAD_2 40
234 #define ICMD_LORCONST 40 /* val.l = constant */
236 #define JAVA_DLOAD_3 41
237 #define ICMD_LXORCONST 41 /* val.l = constant */
239 #define JAVA_ALOAD_0 42
240 #define ICMD_LSHLCONST 42 /* val.l = constant */
242 #define JAVA_ALOAD_1 43
243 #define ICMD_LSHRCONST 43 /* val.l = constant */
245 #define JAVA_ALOAD_2 44
246 #define ICMD_LUSHRCONST 44 /* val.l = constant */
248 #define JAVA_ALOAD_3 45
249 #define ICMD_LREMPOW2 45 /* val.l = constant */
251 #define JAVA_IALOAD 46
252 #define ICMD_IALOAD 46
254 #define JAVA_LALOAD 47
255 #define ICMD_LALOAD 47
257 #define JAVA_FALOAD 48
258 #define ICMD_FALOAD 48
260 #define JAVA_DALOAD 49
261 #define ICMD_DALOAD 49
263 #define JAVA_AALOAD 50
264 #define ICMD_AALOAD 50
266 #define JAVA_BALOAD 51
267 #define ICMD_BALOAD 51
269 #define JAVA_CALOAD 52
270 #define ICMD_CALOAD 52
272 #define JAVA_SALOAD 53
273 #define ICMD_SALOAD 53
275 /* order of STORE instructions must be*/
276 /* equal to order of TYPE_XXX defines */
277 #define JAVA_ISTORE 54
278 #define ICMD_ISTORE 54 /* op1 = local variable */
280 #define JAVA_LSTORE 55
281 #define ICMD_LSTORE 55 /* op1 = local variable */
283 #define JAVA_FSTORE 56
284 #define ICMD_FSTORE 56 /* op1 = local variable */
286 #define JAVA_DSTORE 57
287 #define ICMD_DSTORE 57 /* op1 = local variable */
289 #define JAVA_ASTORE 58
290 #define ICMD_ASTORE 58 /* op1 = local variable */
292 #define JAVA_ISTORE_0 59
293 #define ICMD_IF_LEQ 59 /* op1 = target JavaVM pc, val.l */
295 #define JAVA_ISTORE_1 60
296 #define ICMD_IF_LNE 60 /* op1 = target JavaVM pc, val.l */
298 #define JAVA_ISTORE_2 61
299 #define ICMD_IF_LLT 61 /* op1 = target JavaVM pc, val.l */
301 #define JAVA_ISTORE_3 62
302 #define ICMD_IF_LGE 62 /* op1 = target JavaVM pc, val.l */
304 #define JAVA_LSTORE_0 63
305 #define ICMD_IF_LGT 63 /* op1 = target JavaVM pc, val.l */
307 #define JAVA_LSTORE_1 64
308 #define ICMD_IF_LLE 64 /* op1 = target JavaVM pc, val.l */
310 #define JAVA_LSTORE_2 65
311 #define ICMD_IF_LCMPEQ 65 /* op1 = target JavaVM pc */
313 #define JAVA_LSTORE_3 66
314 #define ICMD_IF_LCMPNE 66 /* op1 = target JavaVM pc */
316 #define JAVA_FSTORE_0 67
317 #define ICMD_IF_LCMPLT 67 /* op1 = target JavaVM pc */
319 #define JAVA_FSTORE_1 68
320 #define ICMD_IF_LCMPGE 68 /* op1 = target JavaVM pc */
322 #define JAVA_FSTORE_2 69
323 #define ICMD_IF_LCMPGT 69 /* op1 = target JavaVM pc */
325 #define JAVA_FSTORE_3 70
326 #define ICMD_IF_LCMPLE 70 /* op1 = target JavaVM pc */
328 #define JAVA_DSTORE_0 71
330 #define JAVA_DSTORE_1 72
332 #define JAVA_DSTORE_2 73
334 #define JAVA_DSTORE_3 74
336 #define JAVA_ASTORE_0 75
338 #define JAVA_ASTORE_1 76
340 #define JAVA_ASTORE_2 77
342 #define JAVA_ASTORE_3 78
344 #define JAVA_IASTORE 79
345 #define ICMD_IASTORE 79
347 #define JAVA_LASTORE 80
348 #define ICMD_LASTORE 80
350 #define JAVA_FASTORE 81
351 #define ICMD_FASTORE 81
353 #define JAVA_DASTORE 82
354 #define ICMD_DASTORE 82
356 #define JAVA_AASTORE 83
357 #define ICMD_AASTORE 83
359 #define JAVA_BASTORE 84
360 #define ICMD_BASTORE 84
362 #define JAVA_CASTORE 85
363 #define ICMD_CASTORE 85
365 #define JAVA_SASTORE 86
366 #define ICMD_SASTORE 86
377 #define JAVA_DUP_X1 90
378 #define ICMD_DUP_X1 90
380 #define JAVA_DUP_X2 91
381 #define ICMD_DUP_X2 91
386 #define JAVA_DUP2_X1 93
387 #define ICMD_DUP2_X1 93
389 #define JAVA_DUP2_X2 94
390 #define ICMD_DUP2_X2 94
407 #define JAVA_ISUB 100
408 #define ICMD_ISUB 100
410 #define JAVA_LSUB 101
411 #define ICMD_LSUB 101
413 #define JAVA_FSUB 102
414 #define ICMD_FSUB 102
416 #define JAVA_DSUB 103
417 #define ICMD_DSUB 103
419 #define JAVA_IMUL 104
420 #define ICMD_IMUL 104
422 #define JAVA_LMUL 105
423 #define ICMD_LMUL 105
425 #define JAVA_FMUL 106
426 #define ICMD_FMUL 106
428 #define JAVA_DMUL 107
429 #define ICMD_DMUL 107
431 #define JAVA_IDIV 108
432 #define ICMD_IDIV 108
434 #define JAVA_LDIV 109
435 #define ICMD_LDIV 109
437 #define JAVA_FDIV 110
438 #define ICMD_FDIV 110
440 #define JAVA_DDIV 111
441 #define ICMD_DDIV 111
443 #define JAVA_IREM 112
444 #define ICMD_IREM 112
446 #define JAVA_LREM 113
447 #define ICMD_LREM 113
449 #define JAVA_FREM 114
450 #define ICMD_FREM 114
452 #define JAVA_DREM 115
453 #define ICMD_DREM 115
455 #define JAVA_INEG 116
456 #define ICMD_INEG 116
458 #define JAVA_LNEG 117
459 #define ICMD_LNEG 117
461 #define JAVA_FNEG 118
462 #define ICMD_FNEG 118
464 #define JAVA_DNEG 119
465 #define ICMD_DNEG 119
467 #define JAVA_ISHL 120
468 #define ICMD_ISHL 120
470 #define JAVA_LSHL 121
471 #define ICMD_LSHL 121
473 #define JAVA_ISHR 122
474 #define ICMD_ISHR 122
476 #define JAVA_LSHR 123
477 #define ICMD_LSHR 123
479 #define JAVA_IUSHR 124
480 #define ICMD_IUSHR 124
482 #define JAVA_LUSHR 125
483 #define ICMD_LUSHR 125
485 #define JAVA_IAND 126
486 #define ICMD_IAND 126
488 #define JAVA_LAND 127
489 #define ICMD_LAND 127
497 #define JAVA_IXOR 130
498 #define ICMD_IXOR 130
500 #define JAVA_LXOR 131
501 #define ICMD_LXOR 131
503 #define JAVA_IINC 132
504 #define ICMD_IINC 132 /* op1 = local variable, val.i = constant */
542 #define JAVA_INT2BYTE 145
543 #define ICMD_INT2BYTE 145
545 #define JAVA_INT2CHAR 146
546 #define ICMD_INT2CHAR 146
548 #define JAVA_INT2SHORT 147
549 #define ICMD_INT2SHORT 147
551 #define JAVA_LCMP 148
552 #define ICMD_LCMP 148
554 #define JAVA_FCMPL 149
555 #define ICMD_FCMPL 149
557 #define JAVA_FCMPG 150
558 #define ICMD_FCMPG 150
560 #define JAVA_DCMPL 151
561 #define ICMD_DCMPL 151
563 #define JAVA_DCMPG 152
564 #define ICMD_DCMPG 152
566 #define JAVA_IFEQ 153
567 #define ICMD_IFEQ 153 /* op1 = target JavaVM pc, val.i */
569 #define JAVA_IFNE 154
570 #define ICMD_IFNE 154 /* op1 = target JavaVM pc, val.i */
572 #define JAVA_IFLT 155
573 #define ICMD_IFLT 155 /* op1 = target JavaVM pc, val.i */
575 #define JAVA_IFGE 156
576 #define ICMD_IFGE 156 /* op1 = target JavaVM pc, val.i */
578 #define JAVA_IFGT 157
579 #define ICMD_IFGT 157 /* op1 = target JavaVM pc, val.i */
581 #define JAVA_IFLE 158
582 #define ICMD_IFLE 158 /* op1 = target JavaVM pc, val.i */
584 #define JAVA_IF_ICMPEQ 159
585 #define ICMD_IF_ICMPEQ 159 /* op1 = target JavaVM pc */
587 #define JAVA_IF_ICMPNE 160
588 #define ICMD_IF_ICMPNE 160 /* op1 = target JavaVM pc */
590 #define JAVA_IF_ICMPLT 161
591 #define ICMD_IF_ICMPLT 161 /* op1 = target JavaVM pc */
593 #define JAVA_IF_ICMPGE 162
594 #define ICMD_IF_ICMPGE 162 /* op1 = target JavaVM pc */
596 #define JAVA_IF_ICMPGT 163
597 #define ICMD_IF_ICMPGT 163 /* op1 = target JavaVM pc */
599 #define JAVA_IF_ICMPLE 164
600 #define ICMD_IF_ICMPLE 164 /* op1 = target JavaVM pc */
602 #define JAVA_IF_ACMPEQ 165
603 #define ICMD_IF_ACMPEQ 165 /* op1 = target JavaVM pc */
605 #define JAVA_IF_ACMPNE 166
606 #define ICMD_IF_ACMPNE 166 /* op1 = target JavaVM pc */
608 #define JAVA_GOTO 167
609 #define ICMD_GOTO 167 /* op1 = target JavaVM pc */
612 #define ICMD_JSR 168 /* op1 = target JavaVM pc */
615 #define ICMD_RET 169 /* op1 = local variable */
617 #define JAVA_TABLESWITCH 170
618 #define ICMD_TABLESWITCH 170 /* val.a = pointer to s4 table */
619 0, /* length must be computed */
620 #define JAVA_LOOKUPSWITCH 171
621 #define ICMD_LOOKUPSWITCH 171 /* val.a = pointer to s4 table */
622 0, /* length must be computed */
623 #define JAVA_IRETURN 172
624 #define ICMD_IRETURN 172
626 #define JAVA_LRETURN 173
627 #define ICMD_LRETURN 173
629 #define JAVA_FRETURN 174
630 #define ICMD_FRETURN 174
632 #define JAVA_DRETURN 175
633 #define ICMD_DRETURN 175
635 #define JAVA_ARETURN 176
636 #define ICMD_ARETURN 176
638 #define JAVA_RETURN 177
639 #define ICMD_RETURN 177
641 #define JAVA_GETSTATIC 178
642 #define ICMD_GETSTATIC 178 /* op1 = type, val.a = field address */
644 #define JAVA_PUTSTATIC 179
645 #define ICMD_PUTSTATIC 179 /* op1 = type, val.a = field address */
647 #define JAVA_GETFIELD 180
648 #define ICMD_GETFIELD 180 /* op1 = type, val.i = field offset */
650 #define JAVA_PUTFIELD 181
651 #define ICMD_PUTFIELD 181 /* op1 = type, val.i = field offset */
653 #define JAVA_INVOKEVIRTUAL 182
654 #define ICMD_INVOKEVIRTUAL 182 /* val.a = method info pointer */
656 #define JAVA_INVOKESPECIAL 183
657 #define ICMD_INVOKESPECIAL 183 /* val.a = method info pointer */
659 #define JAVA_INVOKESTATIC 184
660 #define ICMD_INVOKESTATIC 184 /* val.a = method info pointer */
662 #define JAVA_INVOKEINTERFACE 185
663 #define ICMD_INVOKEINTERFACE 185 /* val.a = method info pointer */
668 #define ICMD_NEW 187 /* op1 = 1, val.a = class pointer */
670 #define JAVA_NEWARRAY 188
671 #define ICMD_NEWARRAY 188 /* op1 = basic type */
673 #define JAVA_ANEWARRAY 189
674 #define ICMD_ANEWARRAY 189 /* op1 = 0, val.a = array pointer */
675 3, /* op1 = 1, val.a = class pointer */
676 #define JAVA_ARRAYLENGTH 190
677 #define ICMD_ARRAYLENGTH 190
679 #define JAVA_ATHROW 191
680 #define ICMD_ATHROW 191
682 #define JAVA_CHECKCAST 192
683 #define ICMD_CHECKCAST 192 /* op1 = 0, val.a = array pointer */
684 3, /* op1 = 1, val.a = class pointer */
685 #define JAVA_INSTANCEOF 193
686 #define ICMD_INSTANCEOF 193 /* op1 = 0, val.a = array pointer */
687 3, /* op1 = 1, val.a = class pointer */
688 #define JAVA_MONITORENTER 194
689 #define ICMD_MONITORENTER 194
691 #define JAVA_MONITOREXIT 195
692 #define ICMD_MONITOREXIT 195
694 #define JAVA_WIDE 196
695 0, /* length must be computed */
696 #define JAVA_MULTIANEWARRAY 197
697 #define ICMD_MULTIANEWARRAY 197 /* op1 = dimension, val.a = array */
699 #define JAVA_IFNULL 198
700 #define ICMD_IFNULL 198 /* op1 = target JavaVM pc */
702 #define JAVA_IFNONNULL 199
703 #define ICMD_IFNONNULL 199 /* op1 = target JavaVM pc */
705 #define JAVA_GOTO_W 200
707 #define JAVA_JSR_W 201
709 #define JAVA_BREAKPOINT 202
713 #define ICMD_IASTORECONST 204
715 #define ICMD_LASTORECONST 205
717 #define ICMD_FASTORECONST 206
719 #define ICMD_DASTORECONST 207
721 #define ICMD_AASTORECONST 208
723 #define ICMD_BASTORECONST 209
725 #define ICMD_CASTORECONST 210
727 #define ICMD_SASTORECONST 211
729 #define ICMD_PUTSTATICCONST 212
731 #define ICMD_PUTFIELDCONST 213
733 #define ICMD_IMULPOW2 214
735 #define ICMD_LMULPOW2 215
740 1,1,1,1,1,1,1,1,1,1,
741 1,1,1,1,1,1,1,1,1,1,
742 1,1,1,1,1,1,1,1,1,1,
747 char *icmd_names[256] = {
750 "CHECKNULL ", /* ICONST_M1 2 */
752 "UNDEF4 ", /* ICONST_1 4 */
753 "IDIVPOW2 ", /* ICONST_2 5 */
754 "LDIVPOW2 ", /* ICONST_3 6 */
755 "UNDEF7 ", /* ICONST_4 7 */
756 "UNDEF8 ", /* ICONST_5 8 */
758 "LCMPCONST ", /* LCONST_1 10 */
760 "UNDEF12 ", /* FCONST_1 12 */
761 "ELSE_ICONST ", /* FCONST_2 13 */
763 "IFEQ_ICONST ", /* DCONST_1 15 */
764 "IFNE_ICONST ", /* BIPUSH 16 */
765 "IFLT_ICONST ", /* SIPUSH 17 */
766 "IFGE_ICONST ", /* LDC1 18 */
767 "IFGT_ICONST ", /* LDC2 19 */
768 "IFLE_ICONST ", /* LDC2W 20 */
774 "IADDCONST ", /* ILOAD_0 26 */
775 "ISUBCONST ", /* ILOAD_1 27 */
776 "IMULCONST ", /* ILOAD_2 28 */
777 "IANDCONST ", /* ILOAD_3 29 */
778 "IORCONST ", /* LLOAD_0 30 */
779 "IXORCONST ", /* LLOAD_1 31 */
780 "ISHLCONST ", /* LLOAD_2 32 */
781 "ISHRCONST ", /* LLOAD_3 33 */
782 "IUSHRCONST ", /* FLOAD_0 34 */
783 "IREMPOW2 ", /* FLOAD_1 35 */
784 "LADDCONST ", /* FLOAD_2 36 */
785 "LSUBCONST ", /* FLOAD_3 37 */
786 "LMULCONST ", /* DLOAD_0 38 */
787 "LANDCONST ", /* DLOAD_1 39 */
788 "LORCONST ", /* DLOAD_2 40 */
789 "LXORCONST ", /* DLOAD_3 41 */
790 "LSHLCONST ", /* ALOAD_0 42 */
791 "LSHRCONST ", /* ALOAD_1 43 */
792 "LUSHRCONST ", /* ALOAD_2 44 */
793 "LREMPOW2 ", /* ALOAD_3 45 */
807 "IF_LEQ ", /* ISTORE_0 59 */
808 "IF_LNE ", /* ISTORE_1 60 */
809 "IF_LLT ", /* ISTORE_2 61 */
810 "IF_LGE ", /* ISTORE_3 62 */
811 "IF_LGT ", /* LSTORE_0 63 */
812 "IF_LLE ", /* LSTORE_1 64 */
813 "IF_LCMPEQ ", /* LSTORE_2 65 */
814 "IF_LCMPNE ", /* LSTORE_3 66 */
815 "IF_LCMPLT ", /* FSTORE_0 67 */
816 "IF_LCMPGE ", /* FSTORE_1 68 */
817 "IF_LCMPGT ", /* FSTORE_2 69 */
818 "IF_LCMPLE ", /* FSTORE_3 70 */
819 "UNDEF71 ", /* DSTORE_0 71 */
820 "UNDEF72 ", /* DSTORE_1 72 */
821 "UNDEF73 ", /* DSTORE_2 73 */
822 "UNDEF74 ", /* DSTORE_3 74 */
823 "UNDEF75 ", /* ASTORE_0 75 */
824 "UNDEF76 ", /* ASTORE_1 76 */
825 "UNDEF77 ", /* ASTORE_2 77 */
826 "UNDEF78 ", /* ASTORE_3 78 */
893 "INT2BYTE ", /* 145 */
894 "INT2CHAR ", /* 146 */
895 "INT2SHORT ", /* 147 */
907 "IF_ICMPEQ ", /* 159 */
908 "IF_ICMPNE ", /* 160 */
909 "IF_ICMPLT ", /* 161 */
910 "IF_ICMPGE ", /* 162 */
911 "IF_ICMPGT ", /* 163 */
912 "IF_ICMPLE ", /* 164 */
913 "IF_ACMPEQ ", /* 165 */
914 "IF_ACMPNE ", /* 166 */
918 "TABLESWITCH ", /* 170 */
919 "LOOKUPSWITCH ", /* 171 */
920 "IRETURN ", /* 172 */
921 "LRETURN ", /* 173 */
922 "FRETURN ", /* 174 */
923 "DRETURN ", /* 175 */
924 "ARETURN ", /* 176 */
926 "GETSTATIC ", /* 178 */
927 "PUTSTATIC ", /* 179 */
928 "GETFIELD ", /* 180 */
929 "PUTFIELD ", /* 181 */
930 "INVOKEVIRTUAL ", /* 182 */
931 "INVOKESPECIAL ", /* 183 */
932 "INVOKESTATIC ", /* 184 */
933 "INVOKEINTERFACE", /* 185 */
934 "UNDEF186 ", /* UNDEF186 186 */
936 "NEWARRAY ", /* 188 */
937 "ANEWARRAY ", /* 189 */
938 "ARRAYLENGTH ", /* 190 */
940 "CHECKCAST ", /* 192 */
941 "INSTANCEOF ", /* 193 */
942 "MONITORENTER ", /* 194 */
943 "MONITOREXIT ", /* 195 */
944 "UNDEF196 ", /* WIDE 196 */
945 "MULTIANEWARRAY ", /* 197 */
947 "IFNONNULL ", /* 199 */
948 "UNDEF200 ", /* GOTO_W 200 */
949 "UNDEF201 ", /* JSR_W 201 */
950 "UNDEF202 ", /* BREAKPOINT 202 */
951 "UNDEF203 ", /* UNDEF203 203 */
952 "IASTORECONST ", /* 204 */
953 "LASTORECONST ", /* 205 */
954 "FASTORECONST ", /* 206 */
955 "DASTORECONST ", /* 207 */
956 "AASTORECONST ", /* 208 */
957 "BASTORECONST ", /* 209 */
958 "CASTORECONST ", /* 210 */
959 "SASTORECONST ", /* 211 */
960 "PUTSTATICCONST ", /* 212 */
961 "PUTFIELDCONST ", /* 213 */
962 "IMULPOW2 ", /* 214 */
963 "LMULPOW2 ", /* 215 */
965 "UNDEF216", "UNDEF217", "UNDEF218", "UNDEF219", "UNDEF220",
966 "UNDEF221", "UNDEF222", "UNDEF223", "UNDEF224", "UNDEF225",
967 "UNDEF226", "UNDEF227", "UNDEF228", "UNDEF229", "UNDEF230",
968 "UNDEF231", "UNDEF232", "UNDEF233", "UNDEF234", "UNDEF235",
969 "UNDEF236", "UNDEF237", "UNDEF238", "UNDEF239", "UNDEF240",
970 "UNDEF241", "UNDEF242", "UNDEF243", "UNDEF244", "UNDEF245",
971 "UNDEF246", "UNDEF247", "UNDEF248", "UNDEF249", "UNDEF250",
973 "INLINE_START ", /* 251 */
974 "INLINE_END ", /* 252 */
975 "INLINE_GOTO ", /* 253 */
983 char *opcode_names[256] = {
986 "ICONST_M1 ", /* ICONST_M1 2 */
987 "ICONST_0 ", /* ICONST_0 3 */
988 "ICONST_1 ", /* ICONST_1 4 */
989 "ICONST_2 ", /* ICONST_2 5 */
990 "ICONST_3 ", /* ICONST_3 6 */
991 "ICONST_4 ", /* ICONST_4 7 */
992 "ICONST_5 ", /* ICONST_5 8 */
993 "LCONST_0 ", /* LCONST_0 9 */
994 "LCONST_1 ", /* LCONST_1 10 */
995 "FCONST_0 ", /* FCONST_0 11 */
996 "FCONST_1 ", /* FCONST_1 12 */
997 "FCONST_2 ", /* FCONST_2 13 */
998 "DCONST_0 ", /* DCONST_0 14 */
999 "DCONST_1 ", /* DCONST_1 15 */
1000 "BIPUSH ", /* BIPUSH 16 */
1001 "SIPUSH ", /* SIPUSH 17 */
1002 "LDC ", /* LDC 18 */
1003 "LDC_W ", /* LDC_W 19 */
1004 "LDC2_W ", /* LDC2_W 20 */
1010 "ILOAD_0 ", /* ILOAD_0 26 */
1011 "ILOAD_1 ", /* ILOAD_1 27 */
1012 "ILOAD_2 ", /* ILOAD_2 28 */
1013 "ILOAD_3 ", /* ILOAD_3 29 */
1014 "LLOAD_0 ", /* LLOAD_0 30 */
1015 "LLOAD_1 ", /* LLOAD_1 31 */
1016 "LLOAD_2 ", /* LLOAD_2 32 */
1017 "LLOAD_3 ", /* LLOAD_3 33 */
1018 "FLOAD_0 ", /* FLOAD_0 34 */
1019 "FLOAD_1 ", /* FLOAD_1 35 */
1020 "FLOAD_2 ", /* FLOAD_2 36 */
1021 "FLOAD_3 ", /* FLOAD_3 37 */
1022 "DLOAD_0 ", /* DLOAD_0 38 */
1023 "DLOAD_1 ", /* DLOAD_1 39 */
1024 "DLOAD_2 ", /* DLOAD_2 40 */
1025 "DLOAD_3 ", /* DLOAD_3 41 */
1026 "ALOAD_0 ", /* ALOAD_0 42 */
1027 "ALOAD_1 ", /* ALOAD_1 43 */
1028 "ALOAD_2 ", /* ALOAD_2 44 */
1029 "ALOAD_3 ", /* ALOAD_3 45 */
1043 "ISTORE_0 ", /* ISTORE_0 59 */
1044 "ISTORE_1 ", /* ISTORE_1 60 */
1045 "ISTORE_2 ", /* ISTORE_2 61 */
1046 "ISTORE_3 ", /* ISTORE_3 62 */
1047 "LSTORE_0 ", /* LSTORE_0 63 */
1048 "LSTORE_1 ", /* LSTORE_1 64 */
1049 "LSTORE_2 ", /* LSTORE_2 65 */
1050 "LSTORE_3 ", /* LSTORE_3 66 */
1051 "FSTORE_0 ", /* FSTORE_0 67 */
1052 "FSTORE_1 ", /* FSTORE_1 68 */
1053 "FSTORE_2 ", /* FSTORE_2 69 */
1054 "FSTORE_3 ", /* FSTORE_3 70 */
1055 "DSTORE_0 ", /* DSTORE_0 71 */
1056 "DSTORE_1 ", /* DSTORE_1 72 */
1057 "DSTORE_2 ", /* DSTORE_2 73 */
1058 "DSTORE_3 ", /* DSTORE_3 74 */
1059 "ASTORE_0 ", /* ASTORE_0 75 */
1060 "ASTORE_1 ", /* ASTORE_1 76 */
1061 "ASTORE_2 ", /* ASTORE_2 77 */
1062 "ASTORE_3 ", /* ASTORE_3 78 */
1063 "IASTORE ", /* 79 */
1064 "LASTORE ", /* 80 */
1065 "FASTORE ", /* 81 */
1066 "DASTORE ", /* 82 */
1067 "AASTORE ", /* 83 */
1068 "BASTORE ", /* 84 */
1069 "CASTORE ", /* 85 */
1070 "SASTORE ", /* 86 */
1077 "DUP2_X1 ", /* 93 */
1078 "DUP2_X2 ", /* 94 */
1129 "INT2BYTE ", /* 145 */
1130 "INT2CHAR ", /* 146 */
1131 "INT2SHORT ", /* 147 */
1143 "IF_ICMPEQ ", /* 159 */
1144 "IF_ICMPNE ", /* 160 */
1145 "IF_ICMPLT ", /* 161 */
1146 "IF_ICMPGE ", /* 162 */
1147 "IF_ICMPGT ", /* 163 */
1148 "IF_ICMPLE ", /* 164 */
1149 "IF_ACMPEQ ", /* 165 */
1150 "IF_ACMPNE ", /* 166 */
1154 "TABLESWITCH ", /* 170 */
1155 "LOOKUPSWITCH ", /* 171 */
1156 "IRETURN ", /* 172 */
1157 "LRETURN ", /* 173 */
1158 "FRETURN ", /* 174 */
1159 "DRETURN ", /* 175 */
1160 "ARETURN ", /* 176 */
1161 "RETURN ", /* 177 */
1162 "GETSTATIC ", /* 178 */
1163 "PUTSTATIC ", /* 179 */
1164 "GETFIELD ", /* 180 */
1165 "PUTFIELD ", /* 181 */
1166 "INVOKEVIRTUAL ", /* 182 */
1167 "INVOKESPECIAL ", /* 183 */
1168 "INVOKESTATIC ", /* 184 */
1169 "INVOKEINTERFACE", /* 185 */
1170 "UNDEF186 ", /* 186 */
1172 "NEWARRAY ", /* 188 */
1173 "ANEWARRAY ", /* 189 */
1174 "ARRAYLENGTH ", /* 190 */
1175 "ATHROW ", /* 191 */
1176 "CHECKCAST ", /* 192 */
1177 "INSTANCEOF ", /* 193 */
1178 "MONITORENTER ", /* 194 */
1179 "MONITOREXIT ", /* 195 */
1180 "WIDE ", /* WIDE 196 */
1181 "MULTIANEWARRAY ", /* 197 */
1182 "IFNULL ", /* 198 */
1183 "IFNONNULL ", /* 199 */
1184 "GOTO_W ", /* GOTO_W 200 */
1185 "JSR_W ", /* JSR_W 201 */
1186 "BREAKPOINT ", /* BREAKPOINT 202 */
1188 "UNDEF203", "UNDEF204", "UNDEF205",
1189 "UNDEF206", "UNDEF207", "UNDEF208", "UNDEF209", "UNDEF210",
1190 "UNDEF211", "UNDEF212", "UNDEF213", "UNDEF214", "UNDEF215",
1191 "UNDEF216", "UNDEF217", "UNDEF218", "UNDEF219", "UNDEF220",
1192 "UNDEF221", "UNDEF222", "UNDEF223", "UNDEF224", "UNDEF225",
1193 "UNDEF226", "UNDEF227", "UNDEF228", "UNDEF229", "UNDEF230",
1194 "UNDEF231", "UNDEF232", "UNDEF233", "UNDEF234", "UNDEF235",
1195 "UNDEF236", "UNDEF237", "UNDEF238", "UNDEF239", "UNDEF240",
1196 "UNDEF241", "UNDEF242", "UNDEF243", "UNDEF244", "UNDEF245",
1197 "UNDEF246", "UNDEF247", "UNDEF248", "UNDEF249", "UNDEF250",
1198 "UNDEF251", "UNDEF252", "UNDEF253", "UNDEF254", "UNDEF255"
1202 /* jit_init ********************************************************************
1204 Initializes the JIT subsystem.
1206 *******************************************************************************/
1212 for (i = 0; i < 256; i++)
1215 stackreq[JAVA_NOP] = 0;
1216 stackreq[JAVA_ISTORE] = 0;
1217 stackreq[JAVA_LSTORE] = 0;
1218 stackreq[JAVA_FSTORE] = 0;
1219 stackreq[JAVA_DSTORE] = 0;
1220 stackreq[JAVA_ASTORE] = 0;
1221 stackreq[JAVA_ISTORE_0] = 0;
1222 stackreq[JAVA_ISTORE_1] = 0;
1223 stackreq[JAVA_ISTORE_2] = 0;
1224 stackreq[JAVA_ISTORE_3] = 0;
1225 stackreq[JAVA_LSTORE_0] = 0;
1226 stackreq[JAVA_LSTORE_1] = 0;
1227 stackreq[JAVA_LSTORE_2] = 0;
1228 stackreq[JAVA_LSTORE_3] = 0;
1229 stackreq[JAVA_FSTORE_0] = 0;
1230 stackreq[JAVA_FSTORE_1] = 0;
1231 stackreq[JAVA_FSTORE_2] = 0;
1232 stackreq[JAVA_FSTORE_3] = 0;
1233 stackreq[JAVA_DSTORE_0] = 0;
1234 stackreq[JAVA_DSTORE_1] = 0;
1235 stackreq[JAVA_DSTORE_2] = 0;
1236 stackreq[JAVA_DSTORE_3] = 0;
1237 stackreq[JAVA_ASTORE_0] = 0;
1238 stackreq[JAVA_ASTORE_1] = 0;
1239 stackreq[JAVA_ASTORE_2] = 0;
1240 stackreq[JAVA_ASTORE_3] = 0;
1241 stackreq[JAVA_IASTORE] = 0;
1242 stackreq[JAVA_LASTORE] = 0;
1243 stackreq[JAVA_FASTORE] = 0;
1244 stackreq[JAVA_DASTORE] = 0;
1245 stackreq[JAVA_AASTORE] = 0;
1246 stackreq[JAVA_BASTORE] = 0;
1247 stackreq[JAVA_CASTORE] = 0;
1248 stackreq[JAVA_SASTORE] = 0;
1249 stackreq[JAVA_POP] = 0;
1250 stackreq[JAVA_POP2] = 0;
1251 stackreq[JAVA_IFEQ] = 0;
1252 stackreq[JAVA_IFNE] = 0;
1253 stackreq[JAVA_IFLT] = 0;
1254 stackreq[JAVA_IFGE] = 0;
1255 stackreq[JAVA_IFGT] = 0;
1256 stackreq[JAVA_IFLE] = 0;
1257 stackreq[JAVA_IF_ICMPEQ] = 0;
1258 stackreq[JAVA_IF_ICMPNE] = 0;
1259 stackreq[JAVA_IF_ICMPLT] = 0;
1260 stackreq[JAVA_IF_ICMPGE] = 0;
1261 stackreq[JAVA_IF_ICMPGT] = 0;
1262 stackreq[JAVA_IF_ICMPLE] = 0;
1263 stackreq[JAVA_IF_ACMPEQ] = 0;
1264 stackreq[JAVA_IF_ACMPNE] = 0;
1265 stackreq[JAVA_GOTO] = 0;
1266 stackreq[JAVA_RET] = 0;
1267 stackreq[JAVA_TABLESWITCH] = 0;
1268 stackreq[JAVA_LOOKUPSWITCH] = 0;
1269 stackreq[JAVA_IRETURN] = 0;
1270 stackreq[JAVA_LRETURN] = 0;
1271 stackreq[JAVA_FRETURN] = 0;
1272 stackreq[JAVA_DRETURN] = 0;
1273 stackreq[JAVA_ARETURN] = 0;
1274 stackreq[JAVA_RETURN] = 0;
1275 stackreq[JAVA_PUTSTATIC] = 0;
1276 stackreq[JAVA_PUTFIELD] = 0;
1277 stackreq[JAVA_MONITORENTER] = 0;
1278 stackreq[JAVA_MONITOREXIT] = 0;
1279 stackreq[JAVA_WIDE] = 0;
1280 stackreq[JAVA_IFNULL] = 0;
1281 stackreq[JAVA_IFNONNULL] = 0;
1282 stackreq[JAVA_GOTO_W] = 0;
1283 stackreq[JAVA_BREAKPOINT] = 0;
1284 stackreq[JAVA_IINC] = 0;
1286 stackreq[JAVA_SWAP] = 2;
1287 stackreq[JAVA_DUP2] = 2;
1288 stackreq[JAVA_DUP_X1] = 3;
1289 stackreq[JAVA_DUP_X2] = 4;
1290 stackreq[JAVA_DUP2_X1] = 3;
1291 stackreq[JAVA_DUP2_X2] = 4;
1293 /* initialize stack analysis subsystem */
1295 (void) stack_init();
1297 /* initialize codegen subsystem */
1303 /* jit_close *******************************************************************
1305 Close the JIT subsystem.
1307 *******************************************************************************/
1309 void jit_close(void)
1315 /* dummy function, used when there is no JavaVM code available */
1317 static u1 *do_nothing_function(void)
1323 /* jit_compile *****************************************************************
1325 Translates one method to machine code.
1327 *******************************************************************************/
1329 static u1 *jit_compile_intern(jitdata *jd);
1331 u1 *jit_compile(methodinfo *m)
1337 STATISTICS(count_jit_calls++);
1339 /* Initialize the static function's class. */
1341 /* ATTENTION: This MUST be done before the method lock is aquired,
1342 otherwise we could run into a deadlock with <clinit>'s that
1343 call static methods of it's own class. */
1345 if ((m->flags & ACC_STATIC) && !(m->class->state & CLASS_INITIALIZED)) {
1346 #if !defined(NDEBUG)
1348 log_message_class("Initialize class ", m->class);
1351 if (!initialize_class(m->class))
1354 /* check if the method has been compiled during initialization */
1356 if ((m->code != NULL) && (m->code->entrypoint != NULL))
1357 return m->code->entrypoint;
1360 #if defined(USE_THREADS)
1361 /* enter a monitor on the method */
1363 builtin_monitorenter((java_objectheader *) m);
1366 /* if method has been already compiled return immediately */
1369 #if defined(USE_THREADS)
1370 builtin_monitorexit((java_objectheader *) m);
1373 assert(m->code->entrypoint);
1374 return m->code->entrypoint;
1377 STATISTICS(count_methods++);
1379 #if defined(ENABLE_STATISTICS)
1382 if (getcompilingtime)
1383 compilingtime_start();
1386 /* mark start of dump memory area */
1388 dumpsize = dump_size();
1390 /* allocate jitdata structure and fill it */
1395 jd->cd = DNEW(codegendata);
1396 jd->rd = DNEW(registerdata);
1397 #if defined(ENABLE_LOOP)
1398 jd->ld = DNEW(loopdata);
1402 /* Allocate codeinfo memory from the heap as we need to keep them. */
1404 jd->code = code_codeinfo_new(m); /* XXX check allocation */
1406 /* set the flags for the current JIT run */
1409 jd->flags |= JITDATA_FLAG_IFCONV;
1411 #if defined(ENABLE_JIT)
1412 # if defined(ENABLE_INTRP)
1415 /* initialize the register allocator */
1420 /* setup the codegendata memory */
1424 /* now call internal compile function */
1426 r = jit_compile_intern(jd);
1428 /* clear pointers to dump memory area */
1430 m->basicblocks = NULL;
1431 m->basicblockindex = NULL;
1432 m->instructions = NULL;
1435 /* release dump area */
1437 dump_release(dumpsize);
1439 #if defined(ENABLE_STATISTICS)
1442 if (getcompilingtime)
1443 compilingtime_stop();
1447 #if defined(USE_THREADS)
1448 /* leave the monitor */
1450 builtin_monitorexit((java_objectheader *) m);
1454 DEBUG_JIT_COMPILEVERBOSE("Running: ");
1457 /* We had an exception! Finish stuff here if necessary. */
1459 /* Release memory for basic block profiling information. */
1463 MFREE(m->bbfrequency, u4, m->basicblockcount);
1466 /* return pointer to the methods entry point */
1471 /*****************************************************************************/
1472 /* TIMING OF COMPILER PASSES */
1473 /*****************************************************************************/
1475 #if defined(ENABLE_RT_TIMING)
1477 #define JIT_GET_TIME(ts) \
1478 do { if (clock_gettime(CLOCK_THREAD_CPUTIME_ID,&(ts)) != 0) { \
1479 fprintf(stderr,"could not get time: %s\n",strerror(errno)); \
1483 #define JITTIME_CHECKS 0
1484 #define JITTIME_PARSE 1
1485 #define JITTIME_STACK 2
1486 #define JITTIME_TYPECHECK 3
1487 #define JITTIME_LOOP 4
1488 #define JITTIME_IFCONV 5
1489 #define JITTIME_ALLOC 6
1490 #define JITTIME_RPLPOINTS 7
1491 #define JITTIME_CODEGEN 8
1492 #define JITTIME_TOTAL 9
1493 #define JITTIME_N 10
1495 struct jit_time_stat {
1500 static struct jit_time_stat jit_time_stat_defs[] = {
1501 { JITTIME_CHECKS, "checks at beginning" },
1502 { JITTIME_PARSE, "parse" },
1503 { JITTIME_STACK, "analyse_stack" },
1504 { JITTIME_TYPECHECK, "typecheck" },
1505 { JITTIME_LOOP, "loop" },
1506 { JITTIME_IFCONV, "if conversion" },
1507 { JITTIME_ALLOC, "register allocation" },
1508 { JITTIME_RPLPOINTS, "replacement point generation" },
1509 { JITTIME_CODEGEN, "codegen" },
1510 { JITTIME_TOTAL, "total" },
1514 static long long jit_time_sum[JITTIME_N] = { 0 };
1516 static long jit_time_diff_usec(struct timespec *a,struct timespec *b)
1521 diff = (b->tv_nsec - a->tv_nsec) / 1000;
1523 while (atime < b->tv_sec) {
1530 static void jit_time_diff(struct timespec *a,struct timespec *b,int index)
1534 diff = jit_time_diff_usec(a,b);
1535 jit_time_sum[index] += diff;
1538 void jit_print_time_stats(FILE *file)
1540 struct jit_time_stat *stats;
1543 stats = jit_time_stat_defs;
1544 total = jit_time_sum[JITTIME_TOTAL];
1545 while (stats->name) {
1546 fprintf(file,"%12lld usec %3.0f%% %s\n",
1547 jit_time_sum[stats->index],
1548 (total != 0.0) ? jit_time_sum[stats->index] / total * 100.0 : 0.0,
1554 #else /* !defined(ENABLE_RT_TIMING) */
1556 #define JIT_GET_TIME(ts)
1558 #endif /* defined(ENABLE_RT_TIMING) */
1560 /* jit_compile_intern **********************************************************
1562 Static internal function which does the actual compilation.
1564 *******************************************************************************/
1566 static u1 *jit_compile_intern(jitdata *jd)
1572 #if defined(ENABLE_RT_TIMING)
1573 struct timespec time_start,time_checks,time_parse,time_stack,
1574 time_typecheck,time_loop,time_ifconv,time_alloc,
1575 time_rplpoints,time_codegen;
1578 JIT_GET_TIME(time_start);
1580 /* get required compiler data */
1586 /* print log message for compiled method */
1588 DEBUG_JIT_COMPILEVERBOSE("Compiling: ");
1590 /* handle native methods and create a native stub */
1592 if (m->flags & ACC_NATIVE) {
1595 #if defined(WITH_STATIC_CLASSPATH)
1596 f = native_findfunction(m->class->name, m->name, m->descriptor,
1597 (m->flags & ACC_STATIC));
1605 code = codegen_createnativestub(f, m);
1607 assert(!m->code); /* native methods are never recompiled */
1610 return code->entrypoint;
1613 /* if there is no javacode, print error message and return empty method */
1616 DEBUG_JIT_COMPILEVERBOSE("No code given for: ");
1618 code->entrypoint = (u1 *) (ptrint) do_nothing_function;
1621 return code->entrypoint; /* return empty method */
1624 /* initialisation of variables and subsystems */
1626 m->isleafmethod = true;
1628 #if defined(ENABLE_STATISTICS)
1630 count_tryblocks += m->exceptiontablelength;
1631 count_javacodesize += m->jcodelength + 18;
1632 count_javaexcsize += m->exceptiontablelength * SIZEOF_VOID_P;
1636 JIT_GET_TIME(time_checks);
1638 /* call the compiler passes ***********************************************/
1640 DEBUG_JIT_COMPILEVERBOSE("Parsing: ");
1642 /* call parse pass */
1645 DEBUG_JIT_COMPILEVERBOSE("Exception while parsing: ");
1649 JIT_GET_TIME(time_parse);
1651 DEBUG_JIT_COMPILEVERBOSE("Parsing done: ");
1652 DEBUG_JIT_COMPILEVERBOSE("Analysing: ");
1654 /* call stack analysis pass */
1656 if (!stack_analyse(jd)) {
1657 DEBUG_JIT_COMPILEVERBOSE("Exception while analysing: ");
1661 JIT_GET_TIME(time_stack);
1663 DEBUG_JIT_COMPILEVERBOSE("Analysing done: ");
1665 #ifdef ENABLE_VERIFIER
1667 DEBUG_JIT_COMPILEVERBOSE("Typechecking: ");
1669 /* call typecheck pass */
1670 if (!typecheck(jd)) {
1671 DEBUG_JIT_COMPILEVERBOSE("Exception while typechecking: ");
1676 DEBUG_JIT_COMPILEVERBOSE("Typechecking done: ");
1679 JIT_GET_TIME(time_typecheck);
1681 #if defined(ENABLE_LOOP)
1688 JIT_GET_TIME(time_loop);
1690 #if defined(ENABLE_IFCONV)
1691 if (jd->flags & JITDATA_FLAG_IFCONV)
1692 if (!ifconv_static(jd))
1695 JIT_GET_TIME(time_ifconv);
1697 #if defined(ENABLE_JIT)
1698 # if defined(ENABLE_INTRP)
1701 DEBUG_JIT_COMPILEVERBOSE("Allocating registers: ");
1703 /* allocate registers */
1704 # if defined(ENABLE_LSRA)
1709 STATISTICS(count_methods_allocated_by_lsra++);
1712 # endif /* defined(ENABLE_LSRA) */
1714 STATISTICS(count_locals_conflicts += (cd->maxlocals - 1) * (cd->maxlocals));
1719 STATISTICS(reg_make_statistics(jd));
1721 DEBUG_JIT_COMPILEVERBOSE("Allocating registers done: ");
1722 # if defined(ENABLE_INTRP)
1725 #endif /* defined(ENABLE_JIT) */
1726 JIT_GET_TIME(time_alloc);
1728 /* Allocate memory for basic block profiling information. This
1729 _must_ be done after loop optimization and register allocation,
1730 since they can change the basic block count. */
1733 m->bbfrequency = MNEW(u4, m->basicblockcount);
1735 DEBUG_JIT_COMPILEVERBOSE("Generating code: ");
1737 /* create the replacement points */
1739 if (!replace_create_replacement_points(jd))
1741 JIT_GET_TIME(time_rplpoints);
1743 /* now generate the machine code */
1745 #if defined(ENABLE_JIT)
1746 # if defined(ENABLE_INTRP)
1748 if (!intrp_codegen(jd)) {
1749 DEBUG_JIT_COMPILEVERBOSE("Exception while generating code: ");
1757 DEBUG_JIT_COMPILEVERBOSE("Exception while generating code: ");
1763 if (!intrp_codegen(jd)) {
1764 DEBUG_JIT_COMPILEVERBOSE("Exception while generating code: ");
1769 JIT_GET_TIME(time_codegen);
1771 DEBUG_JIT_COMPILEVERBOSE("Generating code done: ");
1773 #if !defined(NDEBUG)
1774 /* intermediate and assembly code listings */
1776 if (opt_showintermediate) {
1777 stack_show_method(jd);
1779 } else if (opt_showdisassemble) {
1780 # if defined(ENABLE_DISASSEMBLER)
1781 DISASSEMBLE(code->entrypoint,
1782 code->entrypoint + (code->mcodelength - cd->dseglen));
1786 if (opt_showddatasegment)
1790 DEBUG_JIT_COMPILEVERBOSE("Compiling done: ");
1792 /* switch to the newly generated code */
1795 assert(code->entrypoint);
1797 /* add the current compile version to the methodinfo */
1799 code->prev = m->code;
1802 #if defined(ENABLE_RT_TIMING)
1803 jit_time_diff(&time_start,&time_checks,JITTIME_CHECKS);
1804 jit_time_diff(&time_checks,&time_parse,JITTIME_PARSE);
1805 jit_time_diff(&time_parse,&time_stack,JITTIME_STACK);
1806 jit_time_diff(&time_stack,&time_typecheck,JITTIME_TYPECHECK);
1807 jit_time_diff(&time_typecheck,&time_loop,JITTIME_LOOP);
1808 jit_time_diff(&time_loop,&time_alloc,JITTIME_ALLOC);
1809 jit_time_diff(&time_alloc,&time_rplpoints,JITTIME_RPLPOINTS);
1810 jit_time_diff(&time_rplpoints,&time_codegen,JITTIME_CODEGEN);
1811 jit_time_diff(&time_start,&time_codegen,JITTIME_TOTAL);
1814 /* return pointer to the methods entry point */
1816 return code->entrypoint;
1821 * These are local overrides for various environment variables in Emacs.
1822 * Please do not remove this and leave it at the end of the file, where
1823 * Emacs will automagically detect them.
1824 * ---------------------------------------------------------------------
1827 * indent-tabs-mode: t
1831 * vim:noexpandtab:sw=4:ts=4: