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 4921 2006-05-15 14:24:36Z twisti $
44 #include "mm/memory.h"
45 #include "native/native.h"
46 #include "toolbox/logging.h"
47 #include "vm/builtin.h"
49 #include "vm/global.h"
50 #include "vm/initialize.h"
51 #include "vm/loader.h"
52 #include "vm/method.h"
53 #include "vm/options.h"
54 #include "vm/statistics.h"
55 #include "vm/jit/asmpart.h"
56 #include "vm/jit/codegen-common.h"
57 #include "vm/jit/disass.h"
58 #include "vm/jit/dseg.h"
59 #include "vm/jit/jit.h"
62 #include "vm/jit/parse.h"
63 #include "vm/jit/reg.h"
64 #include "vm/jit/stack.h"
66 #include "vm/jit/allocator/simplereg.h"
67 #if defined(ENABLE_LSRA)
68 # include "vm/jit/allocator/lsra.h"
71 #if defined(ENABLE_IFCONV)
72 # include "vm/jit/ifconv/ifconv.h"
75 #include "vm/jit/loop/analyze.h"
76 #include "vm/jit/loop/graph.h"
77 #include "vm/jit/loop/loop.h"
78 #include "vm/jit/verify/typecheck.h"
79 #include "vm/rt-timing.h"
81 #if defined(ENABLE_THREADS)
82 # include "threads/native/threads.h"
86 /* debug macros ***************************************************************/
89 #define DEBUG_JIT_COMPILEVERBOSE(x) \
91 if (compileverbose) { \
92 log_message_method(x, m); \
96 #define DEBUG_JIT_COMPILEVERBOSE(x) /* nothing */
100 /* global switches ************************************************************/
105 int jcommandsize[256] = {
110 #define JAVA_ACONST_NULL 1
111 #define ICMD_ACONST 1 /* val.a = constant */
113 #define JAVA_ICONST_M1 2
114 #define ICMD_CHECKNULL 2
116 #define JAVA_ICONST_0 3
117 #define ICMD_ICONST 3 /* val.i = constant */
119 #define JAVA_ICONST_1 4
121 #define JAVA_ICONST_2 5
122 #define ICMD_IDIVPOW2 5 /* val.i = constant */
124 #define JAVA_ICONST_3 6
125 #define ICMD_LDIVPOW2 6 /* val.l = constant */
127 #define JAVA_ICONST_4 7
129 #define JAVA_ICONST_5 8
131 #define JAVA_LCONST_0 9
132 #define ICMD_LCONST 9 /* val.l = constant */
134 #define JAVA_LCONST_1 10
135 #define ICMD_LCMPCONST 10 /* val.l = constant */
137 #define JAVA_FCONST_0 11
138 #define ICMD_FCONST 11 /* val.f = constant */
140 #define JAVA_FCONST_1 12
142 #define JAVA_FCONST_2 13
143 #define ICMD_ELSE_ICONST 13
145 #define JAVA_DCONST_0 14
146 #define ICMD_DCONST 14 /* val.d = constant */
148 #define JAVA_DCONST_1 15
149 #define ICMD_IFEQ_ICONST 15
151 #define JAVA_BIPUSH 16
152 #define ICMD_IFNE_ICONST 16
154 #define JAVA_SIPUSH 17
155 #define ICMD_IFLT_ICONST 17
158 #define ICMD_IFGE_ICONST 18
161 #define ICMD_IFGT_ICONST 19
163 #define JAVA_LDC2W 20
164 #define ICMD_IFLE_ICONST 20
166 /* order of LOAD instructions must be */
167 /* equal to order of TYPE_XXX defines */
168 #define JAVA_ILOAD 21
169 #define ICMD_ILOAD 21 /* op1 = local variable */
171 #define JAVA_LLOAD 22
172 #define ICMD_LLOAD 22 /* op1 = local variable */
174 #define JAVA_FLOAD 23
175 #define ICMD_FLOAD 23 /* op1 = local variable */
177 #define JAVA_DLOAD 24
178 #define ICMD_DLOAD 24 /* op1 = local variable */
180 #define JAVA_ALOAD 25
181 #define ICMD_ALOAD 25 /* op1 = local variable */
183 #define JAVA_ILOAD_0 26
184 #define ICMD_IADDCONST 26 /* val.i = constant */
186 #define JAVA_ILOAD_1 27
187 #define ICMD_ISUBCONST 27 /* val.i = constant */
189 #define JAVA_ILOAD_2 28
190 #define ICMD_IMULCONST 28 /* val.i = constant */
192 #define JAVA_ILOAD_3 29
193 #define ICMD_IANDCONST 29 /* val.i = constant */
195 #define JAVA_LLOAD_0 30
196 #define ICMD_IORCONST 30 /* val.i = constant */
198 #define JAVA_LLOAD_1 31
199 #define ICMD_IXORCONST 31 /* val.i = constant */
201 #define JAVA_LLOAD_2 32
202 #define ICMD_ISHLCONST 32 /* val.i = constant */
204 #define JAVA_LLOAD_3 33
205 #define ICMD_ISHRCONST 33 /* val.i = constant */
207 #define JAVA_FLOAD_0 34
208 #define ICMD_IUSHRCONST 34 /* val.i = constant */
210 #define JAVA_FLOAD_1 35
211 #define ICMD_IREMPOW2 35 /* val.i = constant */
213 #define JAVA_FLOAD_2 36
214 #define ICMD_LADDCONST 36 /* val.l = constant */
216 #define JAVA_FLOAD_3 37
217 #define ICMD_LSUBCONST 37 /* val.l = constant */
219 #define JAVA_DLOAD_0 38
220 #define ICMD_LMULCONST 38 /* val.l = constant */
222 #define JAVA_DLOAD_1 39
223 #define ICMD_LANDCONST 39 /* val.l = constant */
225 #define JAVA_DLOAD_2 40
226 #define ICMD_LORCONST 40 /* val.l = constant */
228 #define JAVA_DLOAD_3 41
229 #define ICMD_LXORCONST 41 /* val.l = constant */
231 #define JAVA_ALOAD_0 42
232 #define ICMD_LSHLCONST 42 /* val.l = constant */
234 #define JAVA_ALOAD_1 43
235 #define ICMD_LSHRCONST 43 /* val.l = constant */
237 #define JAVA_ALOAD_2 44
238 #define ICMD_LUSHRCONST 44 /* val.l = constant */
240 #define JAVA_ALOAD_3 45
241 #define ICMD_LREMPOW2 45 /* val.l = constant */
243 #define JAVA_IALOAD 46
244 #define ICMD_IALOAD 46
246 #define JAVA_LALOAD 47
247 #define ICMD_LALOAD 47
249 #define JAVA_FALOAD 48
250 #define ICMD_FALOAD 48
252 #define JAVA_DALOAD 49
253 #define ICMD_DALOAD 49
255 #define JAVA_AALOAD 50
256 #define ICMD_AALOAD 50
258 #define JAVA_BALOAD 51
259 #define ICMD_BALOAD 51
261 #define JAVA_CALOAD 52
262 #define ICMD_CALOAD 52
264 #define JAVA_SALOAD 53
265 #define ICMD_SALOAD 53
267 /* order of STORE instructions must be*/
268 /* equal to order of TYPE_XXX defines */
269 #define JAVA_ISTORE 54
270 #define ICMD_ISTORE 54 /* op1 = local variable */
272 #define JAVA_LSTORE 55
273 #define ICMD_LSTORE 55 /* op1 = local variable */
275 #define JAVA_FSTORE 56
276 #define ICMD_FSTORE 56 /* op1 = local variable */
278 #define JAVA_DSTORE 57
279 #define ICMD_DSTORE 57 /* op1 = local variable */
281 #define JAVA_ASTORE 58
282 #define ICMD_ASTORE 58 /* op1 = local variable */
284 #define JAVA_ISTORE_0 59
285 #define ICMD_IF_LEQ 59 /* op1 = target JavaVM pc, val.l */
287 #define JAVA_ISTORE_1 60
288 #define ICMD_IF_LNE 60 /* op1 = target JavaVM pc, val.l */
290 #define JAVA_ISTORE_2 61
291 #define ICMD_IF_LLT 61 /* op1 = target JavaVM pc, val.l */
293 #define JAVA_ISTORE_3 62
294 #define ICMD_IF_LGE 62 /* op1 = target JavaVM pc, val.l */
296 #define JAVA_LSTORE_0 63
297 #define ICMD_IF_LGT 63 /* op1 = target JavaVM pc, val.l */
299 #define JAVA_LSTORE_1 64
300 #define ICMD_IF_LLE 64 /* op1 = target JavaVM pc, val.l */
302 #define JAVA_LSTORE_2 65
303 #define ICMD_IF_LCMPEQ 65 /* op1 = target JavaVM pc */
305 #define JAVA_LSTORE_3 66
306 #define ICMD_IF_LCMPNE 66 /* op1 = target JavaVM pc */
308 #define JAVA_FSTORE_0 67
309 #define ICMD_IF_LCMPLT 67 /* op1 = target JavaVM pc */
311 #define JAVA_FSTORE_1 68
312 #define ICMD_IF_LCMPGE 68 /* op1 = target JavaVM pc */
314 #define JAVA_FSTORE_2 69
315 #define ICMD_IF_LCMPGT 69 /* op1 = target JavaVM pc */
317 #define JAVA_FSTORE_3 70
318 #define ICMD_IF_LCMPLE 70 /* op1 = target JavaVM pc */
320 #define JAVA_DSTORE_0 71
322 #define JAVA_DSTORE_1 72
324 #define JAVA_DSTORE_2 73
326 #define JAVA_DSTORE_3 74
328 #define JAVA_ASTORE_0 75
330 #define JAVA_ASTORE_1 76
332 #define JAVA_ASTORE_2 77
334 #define JAVA_ASTORE_3 78
336 #define JAVA_IASTORE 79
337 #define ICMD_IASTORE 79
339 #define JAVA_LASTORE 80
340 #define ICMD_LASTORE 80
342 #define JAVA_FASTORE 81
343 #define ICMD_FASTORE 81
345 #define JAVA_DASTORE 82
346 #define ICMD_DASTORE 82
348 #define JAVA_AASTORE 83
349 #define ICMD_AASTORE 83
351 #define JAVA_BASTORE 84
352 #define ICMD_BASTORE 84
354 #define JAVA_CASTORE 85
355 #define ICMD_CASTORE 85
357 #define JAVA_SASTORE 86
358 #define ICMD_SASTORE 86
369 #define JAVA_DUP_X1 90
370 #define ICMD_DUP_X1 90
372 #define JAVA_DUP_X2 91
373 #define ICMD_DUP_X2 91
378 #define JAVA_DUP2_X1 93
379 #define ICMD_DUP2_X1 93
381 #define JAVA_DUP2_X2 94
382 #define ICMD_DUP2_X2 94
399 #define JAVA_ISUB 100
400 #define ICMD_ISUB 100
402 #define JAVA_LSUB 101
403 #define ICMD_LSUB 101
405 #define JAVA_FSUB 102
406 #define ICMD_FSUB 102
408 #define JAVA_DSUB 103
409 #define ICMD_DSUB 103
411 #define JAVA_IMUL 104
412 #define ICMD_IMUL 104
414 #define JAVA_LMUL 105
415 #define ICMD_LMUL 105
417 #define JAVA_FMUL 106
418 #define ICMD_FMUL 106
420 #define JAVA_DMUL 107
421 #define ICMD_DMUL 107
423 #define JAVA_IDIV 108
424 #define ICMD_IDIV 108
426 #define JAVA_LDIV 109
427 #define ICMD_LDIV 109
429 #define JAVA_FDIV 110
430 #define ICMD_FDIV 110
432 #define JAVA_DDIV 111
433 #define ICMD_DDIV 111
435 #define JAVA_IREM 112
436 #define ICMD_IREM 112
438 #define JAVA_LREM 113
439 #define ICMD_LREM 113
441 #define JAVA_FREM 114
442 #define ICMD_FREM 114
444 #define JAVA_DREM 115
445 #define ICMD_DREM 115
447 #define JAVA_INEG 116
448 #define ICMD_INEG 116
450 #define JAVA_LNEG 117
451 #define ICMD_LNEG 117
453 #define JAVA_FNEG 118
454 #define ICMD_FNEG 118
456 #define JAVA_DNEG 119
457 #define ICMD_DNEG 119
459 #define JAVA_ISHL 120
460 #define ICMD_ISHL 120
462 #define JAVA_LSHL 121
463 #define ICMD_LSHL 121
465 #define JAVA_ISHR 122
466 #define ICMD_ISHR 122
468 #define JAVA_LSHR 123
469 #define ICMD_LSHR 123
471 #define JAVA_IUSHR 124
472 #define ICMD_IUSHR 124
474 #define JAVA_LUSHR 125
475 #define ICMD_LUSHR 125
477 #define JAVA_IAND 126
478 #define ICMD_IAND 126
480 #define JAVA_LAND 127
481 #define ICMD_LAND 127
489 #define JAVA_IXOR 130
490 #define ICMD_IXOR 130
492 #define JAVA_LXOR 131
493 #define ICMD_LXOR 131
495 #define JAVA_IINC 132
496 #define ICMD_IINC 132 /* op1 = local variable, val.i = constant */
534 #define JAVA_INT2BYTE 145
535 #define ICMD_INT2BYTE 145
537 #define JAVA_INT2CHAR 146
538 #define ICMD_INT2CHAR 146
540 #define JAVA_INT2SHORT 147
541 #define ICMD_INT2SHORT 147
543 #define JAVA_LCMP 148
544 #define ICMD_LCMP 148
546 #define JAVA_FCMPL 149
547 #define ICMD_FCMPL 149
549 #define JAVA_FCMPG 150
550 #define ICMD_FCMPG 150
552 #define JAVA_DCMPL 151
553 #define ICMD_DCMPL 151
555 #define JAVA_DCMPG 152
556 #define ICMD_DCMPG 152
558 #define JAVA_IFEQ 153
559 #define ICMD_IFEQ 153 /* op1 = target JavaVM pc, val.i */
561 #define JAVA_IFNE 154
562 #define ICMD_IFNE 154 /* op1 = target JavaVM pc, val.i */
564 #define JAVA_IFLT 155
565 #define ICMD_IFLT 155 /* op1 = target JavaVM pc, val.i */
567 #define JAVA_IFGE 156
568 #define ICMD_IFGE 156 /* op1 = target JavaVM pc, val.i */
570 #define JAVA_IFGT 157
571 #define ICMD_IFGT 157 /* op1 = target JavaVM pc, val.i */
573 #define JAVA_IFLE 158
574 #define ICMD_IFLE 158 /* op1 = target JavaVM pc, val.i */
576 #define JAVA_IF_ICMPEQ 159
577 #define ICMD_IF_ICMPEQ 159 /* op1 = target JavaVM pc */
579 #define JAVA_IF_ICMPNE 160
580 #define ICMD_IF_ICMPNE 160 /* op1 = target JavaVM pc */
582 #define JAVA_IF_ICMPLT 161
583 #define ICMD_IF_ICMPLT 161 /* op1 = target JavaVM pc */
585 #define JAVA_IF_ICMPGE 162
586 #define ICMD_IF_ICMPGE 162 /* op1 = target JavaVM pc */
588 #define JAVA_IF_ICMPGT 163
589 #define ICMD_IF_ICMPGT 163 /* op1 = target JavaVM pc */
591 #define JAVA_IF_ICMPLE 164
592 #define ICMD_IF_ICMPLE 164 /* op1 = target JavaVM pc */
594 #define JAVA_IF_ACMPEQ 165
595 #define ICMD_IF_ACMPEQ 165 /* op1 = target JavaVM pc */
597 #define JAVA_IF_ACMPNE 166
598 #define ICMD_IF_ACMPNE 166 /* op1 = target JavaVM pc */
600 #define JAVA_GOTO 167
601 #define ICMD_GOTO 167 /* op1 = target JavaVM pc */
604 #define ICMD_JSR 168 /* op1 = target JavaVM pc */
607 #define ICMD_RET 169 /* op1 = local variable */
609 #define JAVA_TABLESWITCH 170
610 #define ICMD_TABLESWITCH 170 /* val.a = pointer to s4 table */
611 0, /* length must be computed */
612 #define JAVA_LOOKUPSWITCH 171
613 #define ICMD_LOOKUPSWITCH 171 /* val.a = pointer to s4 table */
614 0, /* length must be computed */
615 #define JAVA_IRETURN 172
616 #define ICMD_IRETURN 172
618 #define JAVA_LRETURN 173
619 #define ICMD_LRETURN 173
621 #define JAVA_FRETURN 174
622 #define ICMD_FRETURN 174
624 #define JAVA_DRETURN 175
625 #define ICMD_DRETURN 175
627 #define JAVA_ARETURN 176
628 #define ICMD_ARETURN 176
630 #define JAVA_RETURN 177
631 #define ICMD_RETURN 177
633 #define JAVA_GETSTATIC 178
634 #define ICMD_GETSTATIC 178 /* op1 = type, val.a = field address */
636 #define JAVA_PUTSTATIC 179
637 #define ICMD_PUTSTATIC 179 /* op1 = type, val.a = field address */
639 #define JAVA_GETFIELD 180
640 #define ICMD_GETFIELD 180 /* op1 = type, val.i = field offset */
642 #define JAVA_PUTFIELD 181
643 #define ICMD_PUTFIELD 181 /* op1 = type, val.i = field offset */
645 #define JAVA_INVOKEVIRTUAL 182
646 #define ICMD_INVOKEVIRTUAL 182 /* val.a = method info pointer */
648 #define JAVA_INVOKESPECIAL 183
649 #define ICMD_INVOKESPECIAL 183 /* val.a = method info pointer */
651 #define JAVA_INVOKESTATIC 184
652 #define ICMD_INVOKESTATIC 184 /* val.a = method info pointer */
654 #define JAVA_INVOKEINTERFACE 185
655 #define ICMD_INVOKEINTERFACE 185 /* val.a = method info pointer */
660 #define ICMD_NEW 187 /* op1 = 1, val.a = class pointer */
662 #define JAVA_NEWARRAY 188
663 #define ICMD_NEWARRAY 188 /* op1 = basic type */
665 #define JAVA_ANEWARRAY 189
666 #define ICMD_ANEWARRAY 189 /* op1 = 0, val.a = array pointer */
667 3, /* op1 = 1, val.a = class pointer */
668 #define JAVA_ARRAYLENGTH 190
669 #define ICMD_ARRAYLENGTH 190
671 #define JAVA_ATHROW 191
672 #define ICMD_ATHROW 191
674 #define JAVA_CHECKCAST 192
675 #define ICMD_CHECKCAST 192 /* op1 = 0, val.a = array pointer */
676 3, /* op1 = 1, val.a = class pointer */
677 #define JAVA_INSTANCEOF 193
678 #define ICMD_INSTANCEOF 193 /* op1 = 0, val.a = array pointer */
679 3, /* op1 = 1, val.a = class pointer */
680 #define JAVA_MONITORENTER 194
681 #define ICMD_MONITORENTER 194
683 #define JAVA_MONITOREXIT 195
684 #define ICMD_MONITOREXIT 195
686 #define JAVA_WIDE 196
687 0, /* length must be computed */
688 #define JAVA_MULTIANEWARRAY 197
689 #define ICMD_MULTIANEWARRAY 197 /* op1 = dimension, val.a = array */
691 #define JAVA_IFNULL 198
692 #define ICMD_IFNULL 198 /* op1 = target JavaVM pc */
694 #define JAVA_IFNONNULL 199
695 #define ICMD_IFNONNULL 199 /* op1 = target JavaVM pc */
697 #define JAVA_GOTO_W 200
699 #define JAVA_JSR_W 201
701 #define JAVA_BREAKPOINT 202
705 #define ICMD_IASTORECONST 204
707 #define ICMD_LASTORECONST 205
709 #define ICMD_FASTORECONST 206
711 #define ICMD_DASTORECONST 207
713 #define ICMD_AASTORECONST 208
715 #define ICMD_BASTORECONST 209
717 #define ICMD_CASTORECONST 210
719 #define ICMD_SASTORECONST 211
721 #define ICMD_PUTSTATICCONST 212
723 #define ICMD_PUTFIELDCONST 213
725 #define ICMD_IMULPOW2 214
727 #define ICMD_LMULPOW2 215
730 #define ICMD_IF_FCMPEQ 216
732 #define ICMD_IF_FCMPNE 217
734 #define ICMD_IF_FCMPL_LT 218
736 #define ICMD_IF_FCMPL_GE 219
738 #define ICMD_IF_FCMPL_GT 220
740 #define ICMD_IF_FCMPL_LE 221
743 #define ICMD_IF_FCMPG_LT 222
745 #define ICMD_IF_FCMPG_GE 223
747 #define ICMD_IF_FCMPG_GT 224
749 #define ICMD_IF_FCMPG_LE 225
752 #define ICMD_IF_DCMPEQ 226
754 #define ICMD_IF_DCMPNE 227
757 #define ICMD_IF_DCMPL_LT 228
759 #define ICMD_IF_DCMPL_GE 229
761 #define ICMD_IF_DCMPL_GT 230
763 #define ICMD_IF_DCMPL_LE 231
766 #define ICMD_IF_DCMPG_LT 232
768 #define ICMD_IF_DCMPG_GE 233
770 #define ICMD_IF_DCMPG_GT 234
772 #define ICMD_IF_DCMPG_LE 235
777 1,1,1,1,1,1,1,1,1,1,
782 char *icmd_names[256] = {
785 "CHECKNULL ", /* ICONST_M1 2 */
787 "UNDEF4 ", /* ICONST_1 4 */
788 "IDIVPOW2 ", /* ICONST_2 5 */
789 "LDIVPOW2 ", /* ICONST_3 6 */
790 "UNDEF7 ", /* ICONST_4 7 */
791 "UNDEF8 ", /* ICONST_5 8 */
793 "LCMPCONST ", /* LCONST_1 10 */
795 "UNDEF12 ", /* FCONST_1 12 */
796 "ELSE_ICONST ", /* FCONST_2 13 */
798 "IFEQ_ICONST ", /* DCONST_1 15 */
799 "IFNE_ICONST ", /* BIPUSH 16 */
800 "IFLT_ICONST ", /* SIPUSH 17 */
801 "IFGE_ICONST ", /* LDC1 18 */
802 "IFGT_ICONST ", /* LDC2 19 */
803 "IFLE_ICONST ", /* LDC2W 20 */
809 "IADDCONST ", /* ILOAD_0 26 */
810 "ISUBCONST ", /* ILOAD_1 27 */
811 "IMULCONST ", /* ILOAD_2 28 */
812 "IANDCONST ", /* ILOAD_3 29 */
813 "IORCONST ", /* LLOAD_0 30 */
814 "IXORCONST ", /* LLOAD_1 31 */
815 "ISHLCONST ", /* LLOAD_2 32 */
816 "ISHRCONST ", /* LLOAD_3 33 */
817 "IUSHRCONST ", /* FLOAD_0 34 */
818 "IREMPOW2 ", /* FLOAD_1 35 */
819 "LADDCONST ", /* FLOAD_2 36 */
820 "LSUBCONST ", /* FLOAD_3 37 */
821 "LMULCONST ", /* DLOAD_0 38 */
822 "LANDCONST ", /* DLOAD_1 39 */
823 "LORCONST ", /* DLOAD_2 40 */
824 "LXORCONST ", /* DLOAD_3 41 */
825 "LSHLCONST ", /* ALOAD_0 42 */
826 "LSHRCONST ", /* ALOAD_1 43 */
827 "LUSHRCONST ", /* ALOAD_2 44 */
828 "LREMPOW2 ", /* ALOAD_3 45 */
842 "IF_LEQ ", /* ISTORE_0 59 */
843 "IF_LNE ", /* ISTORE_1 60 */
844 "IF_LLT ", /* ISTORE_2 61 */
845 "IF_LGE ", /* ISTORE_3 62 */
846 "IF_LGT ", /* LSTORE_0 63 */
847 "IF_LLE ", /* LSTORE_1 64 */
848 "IF_LCMPEQ ", /* LSTORE_2 65 */
849 "IF_LCMPNE ", /* LSTORE_3 66 */
850 "IF_LCMPLT ", /* FSTORE_0 67 */
851 "IF_LCMPGE ", /* FSTORE_1 68 */
852 "IF_LCMPGT ", /* FSTORE_2 69 */
853 "IF_LCMPLE ", /* FSTORE_3 70 */
854 "UNDEF71 ", /* DSTORE_0 71 */
855 "UNDEF72 ", /* DSTORE_1 72 */
856 "UNDEF73 ", /* DSTORE_2 73 */
857 "UNDEF74 ", /* DSTORE_3 74 */
858 "UNDEF75 ", /* ASTORE_0 75 */
859 "UNDEF76 ", /* ASTORE_1 76 */
860 "UNDEF77 ", /* ASTORE_2 77 */
861 "UNDEF78 ", /* ASTORE_3 78 */
928 "INT2BYTE ", /* 145 */
929 "INT2CHAR ", /* 146 */
930 "INT2SHORT ", /* 147 */
942 "IF_ICMPEQ ", /* 159 */
943 "IF_ICMPNE ", /* 160 */
944 "IF_ICMPLT ", /* 161 */
945 "IF_ICMPGE ", /* 162 */
946 "IF_ICMPGT ", /* 163 */
947 "IF_ICMPLE ", /* 164 */
948 "IF_ACMPEQ ", /* 165 */
949 "IF_ACMPNE ", /* 166 */
953 "TABLESWITCH ", /* 170 */
954 "LOOKUPSWITCH ", /* 171 */
955 "IRETURN ", /* 172 */
956 "LRETURN ", /* 173 */
957 "FRETURN ", /* 174 */
958 "DRETURN ", /* 175 */
959 "ARETURN ", /* 176 */
961 "GETSTATIC ", /* 178 */
962 "PUTSTATIC ", /* 179 */
963 "GETFIELD ", /* 180 */
964 "PUTFIELD ", /* 181 */
965 "INVOKEVIRTUAL ", /* 182 */
966 "INVOKESPECIAL ", /* 183 */
967 "INVOKESTATIC ", /* 184 */
968 "INVOKEINTERFACE", /* 185 */
969 "UNDEF186 ", /* UNDEF186 186 */
971 "NEWARRAY ", /* 188 */
972 "ANEWARRAY ", /* 189 */
973 "ARRAYLENGTH ", /* 190 */
975 "CHECKCAST ", /* 192 */
976 "INSTANCEOF ", /* 193 */
977 "MONITORENTER ", /* 194 */
978 "MONITOREXIT ", /* 195 */
979 "UNDEF196 ", /* WIDE 196 */
980 "MULTIANEWARRAY ", /* 197 */
982 "IFNONNULL ", /* 199 */
983 "UNDEF200 ", /* GOTO_W 200 */
984 "UNDEF201 ", /* JSR_W 201 */
985 "UNDEF202 ", /* BREAKPOINT 202 */
986 "UNDEF203 ", /* UNDEF203 203 */
987 "IASTORECONST ", /* 204 */
988 "LASTORECONST ", /* 205 */
989 "FASTORECONST ", /* 206 */
990 "DASTORECONST ", /* 207 */
991 "AASTORECONST ", /* 208 */
992 "BASTORECONST ", /* 209 */
993 "CASTORECONST ", /* 210 */
994 "SASTORECONST ", /* 211 */
995 "PUTSTATICCONST ", /* 212 */
996 "PUTFIELDCONST ", /* 213 */
997 "IMULPOW2 ", /* 214 */
998 "LMULPOW2 ", /* 215 */
1000 "IF_FCMPEQ ", /* 216 */
1001 "IF_FCMPNE ", /* 217 */
1003 "IF_FCMPL_LT ", /* 218 */
1004 "IF_FCMPL_GE ", /* 219 */
1005 "IF_FCMPL_GT ", /* 220 */
1006 "IF_FCMPL_LE ", /* 221 */
1008 "IF_FCMPG_LT ", /* 222 */
1009 "IF_FCMPG_GE ", /* 223 */
1010 "IF_FCMPG_GT ", /* 224 */
1011 "IF_FCMPG_LE ", /* 225 */
1013 "IF_DCMPEQ ", /* 226 */
1014 "IF_DCMPNE ", /* 227 */
1016 "IF_DCMPL_LT ", /* 228 */
1017 "IF_DCMPL_GE ", /* 229 */
1018 "IF_DCMPL_GT ", /* 230 */
1019 "IF_DCMPL_LE ", /* 231 */
1021 "IF_DCMPG_LT ", /* 232 */
1022 "IF_DCMPG_GE ", /* 233 */
1023 "IF_DCMPG_GT ", /* 234 */
1024 "IF_DCMPG_LE ", /* 235 */
1026 "UNDEF236", "UNDEF237", "UNDEF238", "UNDEF239", "UNDEF240",
1027 "UNDEF241", "UNDEF242", "UNDEF243", "UNDEF244", "UNDEF245",
1028 "UNDEF246", "UNDEF247", "UNDEF248", "UNDEF249", "UNDEF250",
1030 "INLINE_START ", /* 251 */
1031 "INLINE_END ", /* 252 */
1032 "INLINE_GOTO ", /* 253 */
1036 "BUILTIN " /* 255 */
1040 char *opcode_names[256] = {
1043 "ICONST_M1 ", /* ICONST_M1 2 */
1044 "ICONST_0 ", /* ICONST_0 3 */
1045 "ICONST_1 ", /* ICONST_1 4 */
1046 "ICONST_2 ", /* ICONST_2 5 */
1047 "ICONST_3 ", /* ICONST_3 6 */
1048 "ICONST_4 ", /* ICONST_4 7 */
1049 "ICONST_5 ", /* ICONST_5 8 */
1050 "LCONST_0 ", /* LCONST_0 9 */
1051 "LCONST_1 ", /* LCONST_1 10 */
1052 "FCONST_0 ", /* FCONST_0 11 */
1053 "FCONST_1 ", /* FCONST_1 12 */
1054 "FCONST_2 ", /* FCONST_2 13 */
1055 "DCONST_0 ", /* DCONST_0 14 */
1056 "DCONST_1 ", /* DCONST_1 15 */
1057 "BIPUSH ", /* BIPUSH 16 */
1058 "SIPUSH ", /* SIPUSH 17 */
1059 "LDC ", /* LDC 18 */
1060 "LDC_W ", /* LDC_W 19 */
1061 "LDC2_W ", /* LDC2_W 20 */
1067 "ILOAD_0 ", /* ILOAD_0 26 */
1068 "ILOAD_1 ", /* ILOAD_1 27 */
1069 "ILOAD_2 ", /* ILOAD_2 28 */
1070 "ILOAD_3 ", /* ILOAD_3 29 */
1071 "LLOAD_0 ", /* LLOAD_0 30 */
1072 "LLOAD_1 ", /* LLOAD_1 31 */
1073 "LLOAD_2 ", /* LLOAD_2 32 */
1074 "LLOAD_3 ", /* LLOAD_3 33 */
1075 "FLOAD_0 ", /* FLOAD_0 34 */
1076 "FLOAD_1 ", /* FLOAD_1 35 */
1077 "FLOAD_2 ", /* FLOAD_2 36 */
1078 "FLOAD_3 ", /* FLOAD_3 37 */
1079 "DLOAD_0 ", /* DLOAD_0 38 */
1080 "DLOAD_1 ", /* DLOAD_1 39 */
1081 "DLOAD_2 ", /* DLOAD_2 40 */
1082 "DLOAD_3 ", /* DLOAD_3 41 */
1083 "ALOAD_0 ", /* ALOAD_0 42 */
1084 "ALOAD_1 ", /* ALOAD_1 43 */
1085 "ALOAD_2 ", /* ALOAD_2 44 */
1086 "ALOAD_3 ", /* ALOAD_3 45 */
1100 "ISTORE_0 ", /* ISTORE_0 59 */
1101 "ISTORE_1 ", /* ISTORE_1 60 */
1102 "ISTORE_2 ", /* ISTORE_2 61 */
1103 "ISTORE_3 ", /* ISTORE_3 62 */
1104 "LSTORE_0 ", /* LSTORE_0 63 */
1105 "LSTORE_1 ", /* LSTORE_1 64 */
1106 "LSTORE_2 ", /* LSTORE_2 65 */
1107 "LSTORE_3 ", /* LSTORE_3 66 */
1108 "FSTORE_0 ", /* FSTORE_0 67 */
1109 "FSTORE_1 ", /* FSTORE_1 68 */
1110 "FSTORE_2 ", /* FSTORE_2 69 */
1111 "FSTORE_3 ", /* FSTORE_3 70 */
1112 "DSTORE_0 ", /* DSTORE_0 71 */
1113 "DSTORE_1 ", /* DSTORE_1 72 */
1114 "DSTORE_2 ", /* DSTORE_2 73 */
1115 "DSTORE_3 ", /* DSTORE_3 74 */
1116 "ASTORE_0 ", /* ASTORE_0 75 */
1117 "ASTORE_1 ", /* ASTORE_1 76 */
1118 "ASTORE_2 ", /* ASTORE_2 77 */
1119 "ASTORE_3 ", /* ASTORE_3 78 */
1120 "IASTORE ", /* 79 */
1121 "LASTORE ", /* 80 */
1122 "FASTORE ", /* 81 */
1123 "DASTORE ", /* 82 */
1124 "AASTORE ", /* 83 */
1125 "BASTORE ", /* 84 */
1126 "CASTORE ", /* 85 */
1127 "SASTORE ", /* 86 */
1134 "DUP2_X1 ", /* 93 */
1135 "DUP2_X2 ", /* 94 */
1186 "INT2BYTE ", /* 145 */
1187 "INT2CHAR ", /* 146 */
1188 "INT2SHORT ", /* 147 */
1200 "IF_ICMPEQ ", /* 159 */
1201 "IF_ICMPNE ", /* 160 */
1202 "IF_ICMPLT ", /* 161 */
1203 "IF_ICMPGE ", /* 162 */
1204 "IF_ICMPGT ", /* 163 */
1205 "IF_ICMPLE ", /* 164 */
1206 "IF_ACMPEQ ", /* 165 */
1207 "IF_ACMPNE ", /* 166 */
1211 "TABLESWITCH ", /* 170 */
1212 "LOOKUPSWITCH ", /* 171 */
1213 "IRETURN ", /* 172 */
1214 "LRETURN ", /* 173 */
1215 "FRETURN ", /* 174 */
1216 "DRETURN ", /* 175 */
1217 "ARETURN ", /* 176 */
1218 "RETURN ", /* 177 */
1219 "GETSTATIC ", /* 178 */
1220 "PUTSTATIC ", /* 179 */
1221 "GETFIELD ", /* 180 */
1222 "PUTFIELD ", /* 181 */
1223 "INVOKEVIRTUAL ", /* 182 */
1224 "INVOKESPECIAL ", /* 183 */
1225 "INVOKESTATIC ", /* 184 */
1226 "INVOKEINTERFACE", /* 185 */
1227 "UNDEF186 ", /* 186 */
1229 "NEWARRAY ", /* 188 */
1230 "ANEWARRAY ", /* 189 */
1231 "ARRAYLENGTH ", /* 190 */
1232 "ATHROW ", /* 191 */
1233 "CHECKCAST ", /* 192 */
1234 "INSTANCEOF ", /* 193 */
1235 "MONITORENTER ", /* 194 */
1236 "MONITOREXIT ", /* 195 */
1237 "WIDE ", /* WIDE 196 */
1238 "MULTIANEWARRAY ", /* 197 */
1239 "IFNULL ", /* 198 */
1240 "IFNONNULL ", /* 199 */
1241 "GOTO_W ", /* GOTO_W 200 */
1242 "JSR_W ", /* JSR_W 201 */
1243 "BREAKPOINT ", /* BREAKPOINT 202 */
1245 "UNDEF203", "UNDEF204", "UNDEF205",
1246 "UNDEF206", "UNDEF207", "UNDEF208", "UNDEF209", "UNDEF210",
1247 "UNDEF211", "UNDEF212", "UNDEF213", "UNDEF214", "UNDEF215",
1248 "UNDEF216", "UNDEF217", "UNDEF218", "UNDEF219", "UNDEF220",
1249 "UNDEF221", "UNDEF222", "UNDEF223", "UNDEF224", "UNDEF225",
1250 "UNDEF226", "UNDEF227", "UNDEF228", "UNDEF229", "UNDEF230",
1251 "UNDEF231", "UNDEF232", "UNDEF233", "UNDEF234", "UNDEF235",
1252 "UNDEF236", "UNDEF237", "UNDEF238", "UNDEF239", "UNDEF240",
1253 "UNDEF241", "UNDEF242", "UNDEF243", "UNDEF244", "UNDEF245",
1254 "UNDEF246", "UNDEF247", "UNDEF248", "UNDEF249", "UNDEF250",
1255 "UNDEF251", "UNDEF252", "UNDEF253", "UNDEF254", "UNDEF255"
1259 /* jit_init ********************************************************************
1261 Initializes the JIT subsystem.
1263 *******************************************************************************/
1269 for (i = 0; i < 256; i++)
1272 stackreq[JAVA_NOP] = 0;
1273 stackreq[JAVA_ISTORE] = 0;
1274 stackreq[JAVA_LSTORE] = 0;
1275 stackreq[JAVA_FSTORE] = 0;
1276 stackreq[JAVA_DSTORE] = 0;
1277 stackreq[JAVA_ASTORE] = 0;
1278 stackreq[JAVA_ISTORE_0] = 0;
1279 stackreq[JAVA_ISTORE_1] = 0;
1280 stackreq[JAVA_ISTORE_2] = 0;
1281 stackreq[JAVA_ISTORE_3] = 0;
1282 stackreq[JAVA_LSTORE_0] = 0;
1283 stackreq[JAVA_LSTORE_1] = 0;
1284 stackreq[JAVA_LSTORE_2] = 0;
1285 stackreq[JAVA_LSTORE_3] = 0;
1286 stackreq[JAVA_FSTORE_0] = 0;
1287 stackreq[JAVA_FSTORE_1] = 0;
1288 stackreq[JAVA_FSTORE_2] = 0;
1289 stackreq[JAVA_FSTORE_3] = 0;
1290 stackreq[JAVA_DSTORE_0] = 0;
1291 stackreq[JAVA_DSTORE_1] = 0;
1292 stackreq[JAVA_DSTORE_2] = 0;
1293 stackreq[JAVA_DSTORE_3] = 0;
1294 stackreq[JAVA_ASTORE_0] = 0;
1295 stackreq[JAVA_ASTORE_1] = 0;
1296 stackreq[JAVA_ASTORE_2] = 0;
1297 stackreq[JAVA_ASTORE_3] = 0;
1298 stackreq[JAVA_IASTORE] = 0;
1299 stackreq[JAVA_LASTORE] = 0;
1300 stackreq[JAVA_FASTORE] = 0;
1301 stackreq[JAVA_DASTORE] = 0;
1302 stackreq[JAVA_AASTORE] = 0;
1303 stackreq[JAVA_BASTORE] = 0;
1304 stackreq[JAVA_CASTORE] = 0;
1305 stackreq[JAVA_SASTORE] = 0;
1306 stackreq[JAVA_POP] = 0;
1307 stackreq[JAVA_POP2] = 0;
1308 stackreq[JAVA_IFEQ] = 0;
1309 stackreq[JAVA_IFNE] = 0;
1310 stackreq[JAVA_IFLT] = 0;
1311 stackreq[JAVA_IFGE] = 0;
1312 stackreq[JAVA_IFGT] = 0;
1313 stackreq[JAVA_IFLE] = 0;
1314 stackreq[JAVA_IF_ICMPEQ] = 0;
1315 stackreq[JAVA_IF_ICMPNE] = 0;
1316 stackreq[JAVA_IF_ICMPLT] = 0;
1317 stackreq[JAVA_IF_ICMPGE] = 0;
1318 stackreq[JAVA_IF_ICMPGT] = 0;
1319 stackreq[JAVA_IF_ICMPLE] = 0;
1320 stackreq[JAVA_IF_ACMPEQ] = 0;
1321 stackreq[JAVA_IF_ACMPNE] = 0;
1322 stackreq[JAVA_GOTO] = 0;
1323 stackreq[JAVA_RET] = 0;
1324 stackreq[JAVA_TABLESWITCH] = 0;
1325 stackreq[JAVA_LOOKUPSWITCH] = 0;
1326 stackreq[JAVA_IRETURN] = 0;
1327 stackreq[JAVA_LRETURN] = 0;
1328 stackreq[JAVA_FRETURN] = 0;
1329 stackreq[JAVA_DRETURN] = 0;
1330 stackreq[JAVA_ARETURN] = 0;
1331 stackreq[JAVA_RETURN] = 0;
1332 stackreq[JAVA_PUTSTATIC] = 0;
1333 stackreq[JAVA_PUTFIELD] = 0;
1334 stackreq[JAVA_MONITORENTER] = 0;
1335 stackreq[JAVA_MONITOREXIT] = 0;
1336 stackreq[JAVA_WIDE] = 0;
1337 stackreq[JAVA_IFNULL] = 0;
1338 stackreq[JAVA_IFNONNULL] = 0;
1339 stackreq[JAVA_GOTO_W] = 0;
1340 stackreq[JAVA_BREAKPOINT] = 0;
1341 stackreq[JAVA_IINC] = 0;
1343 stackreq[JAVA_SWAP] = 2;
1344 stackreq[JAVA_DUP2] = 2;
1345 stackreq[JAVA_DUP_X1] = 3;
1346 stackreq[JAVA_DUP_X2] = 4;
1347 stackreq[JAVA_DUP2_X1] = 3;
1348 stackreq[JAVA_DUP2_X2] = 4;
1350 /* initialize stack analysis subsystem */
1352 (void) stack_init();
1354 /* initialize codegen subsystem */
1360 /* jit_close *******************************************************************
1362 Close the JIT subsystem.
1364 *******************************************************************************/
1366 void jit_close(void)
1372 /* dummy function, used when there is no JavaVM code available */
1374 static u1 *do_nothing_function(void)
1380 /* jit_compile *****************************************************************
1382 Translates one method to machine code.
1384 *******************************************************************************/
1386 static u1 *jit_compile_intern(jitdata *jd);
1388 u1 *jit_compile(methodinfo *m)
1394 STATISTICS(count_jit_calls++);
1396 /* Initialize the static function's class. */
1398 /* ATTENTION: This MUST be done before the method lock is aquired,
1399 otherwise we could run into a deadlock with <clinit>'s that
1400 call static methods of it's own class. */
1402 if ((m->flags & ACC_STATIC) && !(m->class->state & CLASS_INITIALIZED)) {
1403 #if !defined(NDEBUG)
1405 log_message_class("Initialize class ", m->class);
1408 if (!initialize_class(m->class))
1411 /* check if the method has been compiled during initialization */
1413 if ((m->code != NULL) && (m->code->entrypoint != NULL))
1414 return m->code->entrypoint;
1417 #if defined(ENABLE_THREADS)
1418 /* enter a monitor on the method */
1420 builtin_monitorenter((java_objectheader *) m);
1423 /* if method has been already compiled return immediately */
1426 #if defined(ENABLE_THREADS)
1427 builtin_monitorexit((java_objectheader *) m);
1430 assert(m->code->entrypoint);
1431 return m->code->entrypoint;
1434 STATISTICS(count_methods++);
1436 #if defined(ENABLE_STATISTICS)
1439 if (opt_getcompilingtime)
1440 compilingtime_start();
1443 /* mark start of dump memory area */
1445 dumpsize = dump_size();
1447 /* allocate jitdata structure and fill it */
1452 jd->cd = DNEW(codegendata);
1453 jd->rd = DNEW(registerdata);
1454 #if defined(ENABLE_LOOP)
1455 jd->ld = DNEW(loopdata);
1459 /* Allocate codeinfo memory from the heap as we need to keep them. */
1461 jd->code = code_codeinfo_new(m); /* XXX check allocation */
1463 /* set the flags for the current JIT run */
1466 jd->flags |= JITDATA_FLAG_IFCONV;
1468 #if defined(ENABLE_JIT)
1469 # if defined(ENABLE_INTRP)
1472 /* initialize the register allocator */
1477 /* setup the codegendata memory */
1481 /* now call internal compile function */
1483 r = jit_compile_intern(jd);
1485 /* clear pointers to dump memory area */
1487 m->basicblocks = NULL;
1488 m->basicblockindex = NULL;
1489 m->instructions = NULL;
1492 /* release dump area */
1494 dump_release(dumpsize);
1496 #if defined(ENABLE_STATISTICS)
1499 if (opt_getcompilingtime)
1500 compilingtime_stop();
1504 #if defined(ENABLE_THREADS)
1505 /* leave the monitor */
1507 builtin_monitorexit((java_objectheader *) m);
1511 DEBUG_JIT_COMPILEVERBOSE("Running: ");
1514 /* We had an exception! Finish stuff here if necessary. */
1516 /* Release memory for basic block profiling information. */
1520 MFREE(m->bbfrequency, u4, m->basicblockcount);
1523 /* return pointer to the methods entry point */
1528 /* jit_compile_intern **********************************************************
1530 Static internal function which does the actual compilation.
1532 *******************************************************************************/
1534 static u1 *jit_compile_intern(jitdata *jd)
1540 #if defined(ENABLE_RT_TIMING)
1541 struct timespec time_start,time_checks,time_parse,time_stack,
1542 time_typecheck,time_loop,time_ifconv,time_alloc,
1543 time_rplpoints,time_codegen;
1546 RT_TIMING_GET_TIME(time_start);
1548 /* get required compiler data */
1554 /* print log message for compiled method */
1556 DEBUG_JIT_COMPILEVERBOSE("Compiling: ");
1558 /* handle native methods and create a native stub */
1560 if (m->flags & ACC_NATIVE) {
1563 #if defined(WITH_STATIC_CLASSPATH)
1564 f = native_findfunction(m->class->name, m->name, m->descriptor,
1565 (m->flags & ACC_STATIC));
1573 code = codegen_createnativestub(f, m);
1575 assert(!m->code); /* native methods are never recompiled */
1578 return code->entrypoint;
1581 /* if there is no javacode, print error message and return empty method */
1584 DEBUG_JIT_COMPILEVERBOSE("No code given for: ");
1586 code->entrypoint = (u1 *) (ptrint) do_nothing_function;
1589 return code->entrypoint; /* return empty method */
1592 /* initialisation of variables and subsystems */
1594 m->isleafmethod = true;
1596 #if defined(ENABLE_STATISTICS)
1598 count_tryblocks += m->exceptiontablelength;
1599 count_javacodesize += m->jcodelength + 18;
1600 count_javaexcsize += m->exceptiontablelength * SIZEOF_VOID_P;
1604 RT_TIMING_GET_TIME(time_checks);
1606 /* call the compiler passes ***********************************************/
1608 DEBUG_JIT_COMPILEVERBOSE("Parsing: ");
1610 /* call parse pass */
1613 DEBUG_JIT_COMPILEVERBOSE("Exception while parsing: ");
1617 RT_TIMING_GET_TIME(time_parse);
1619 DEBUG_JIT_COMPILEVERBOSE("Parsing done: ");
1620 DEBUG_JIT_COMPILEVERBOSE("Analysing: ");
1622 /* call stack analysis pass */
1624 if (!stack_analyse(jd)) {
1625 DEBUG_JIT_COMPILEVERBOSE("Exception while analysing: ");
1629 RT_TIMING_GET_TIME(time_stack);
1631 DEBUG_JIT_COMPILEVERBOSE("Analysing done: ");
1633 #ifdef ENABLE_VERIFIER
1635 DEBUG_JIT_COMPILEVERBOSE("Typechecking: ");
1637 /* call typecheck pass */
1638 if (!typecheck(jd)) {
1639 DEBUG_JIT_COMPILEVERBOSE("Exception while typechecking: ");
1644 DEBUG_JIT_COMPILEVERBOSE("Typechecking done: ");
1647 RT_TIMING_GET_TIME(time_typecheck);
1649 #if defined(ENABLE_LOOP)
1656 RT_TIMING_GET_TIME(time_loop);
1658 #if defined(ENABLE_IFCONV)
1659 if (jd->flags & JITDATA_FLAG_IFCONV)
1660 if (!ifconv_static(jd))
1663 RT_TIMING_GET_TIME(time_ifconv);
1665 #if defined(ENABLE_JIT)
1666 # if defined(ENABLE_INTRP)
1669 DEBUG_JIT_COMPILEVERBOSE("Allocating registers: ");
1671 /* allocate registers */
1672 # if defined(ENABLE_LSRA)
1677 STATISTICS(count_methods_allocated_by_lsra++);
1680 # endif /* defined(ENABLE_LSRA) */
1682 STATISTICS(count_locals_conflicts += (cd->maxlocals - 1) * (cd->maxlocals));
1687 STATISTICS(reg_make_statistics(jd));
1689 DEBUG_JIT_COMPILEVERBOSE("Allocating registers done: ");
1690 # if defined(ENABLE_INTRP)
1693 #endif /* defined(ENABLE_JIT) */
1694 RT_TIMING_GET_TIME(time_alloc);
1696 /* Allocate memory for basic block profiling information. This
1697 _must_ be done after loop optimization and register allocation,
1698 since they can change the basic block count. */
1701 m->bbfrequency = MNEW(u4, m->basicblockcount);
1703 DEBUG_JIT_COMPILEVERBOSE("Generating code: ");
1705 /* create the replacement points */
1707 if (!replace_create_replacement_points(jd))
1709 RT_TIMING_GET_TIME(time_rplpoints);
1711 /* now generate the machine code */
1713 #if defined(ENABLE_JIT)
1714 # if defined(ENABLE_INTRP)
1716 if (!intrp_codegen(jd)) {
1717 DEBUG_JIT_COMPILEVERBOSE("Exception while generating code: ");
1725 DEBUG_JIT_COMPILEVERBOSE("Exception while generating code: ");
1731 if (!intrp_codegen(jd)) {
1732 DEBUG_JIT_COMPILEVERBOSE("Exception while generating code: ");
1737 RT_TIMING_GET_TIME(time_codegen);
1739 DEBUG_JIT_COMPILEVERBOSE("Generating code done: ");
1741 #if !defined(NDEBUG)
1742 /* intermediate and assembly code listings */
1744 if (opt_showintermediate) {
1745 stack_show_method(jd);
1747 } else if (opt_showdisassemble) {
1748 # if defined(ENABLE_DISASSEMBLER)
1749 DISASSEMBLE(code->entrypoint,
1750 code->entrypoint + (code->mcodelength - cd->dseglen));
1754 if (opt_showddatasegment)
1758 DEBUG_JIT_COMPILEVERBOSE("Compiling done: ");
1760 /* switch to the newly generated code */
1763 assert(code->entrypoint);
1765 /* add the current compile version to the methodinfo */
1767 code->prev = m->code;
1770 RT_TIMING_TIME_DIFF(time_start,time_checks,RT_TIMING_JIT_CHECKS);
1771 RT_TIMING_TIME_DIFF(time_checks,time_parse,RT_TIMING_JIT_PARSE);
1772 RT_TIMING_TIME_DIFF(time_parse,time_stack,RT_TIMING_JIT_STACK);
1773 RT_TIMING_TIME_DIFF(time_stack,time_typecheck,RT_TIMING_JIT_TYPECHECK);
1774 RT_TIMING_TIME_DIFF(time_typecheck,time_loop,RT_TIMING_JIT_LOOP);
1775 RT_TIMING_TIME_DIFF(time_loop,time_alloc,RT_TIMING_JIT_ALLOC);
1776 RT_TIMING_TIME_DIFF(time_alloc,time_rplpoints,RT_TIMING_JIT_RPLPOINTS);
1777 RT_TIMING_TIME_DIFF(time_rplpoints,time_codegen,RT_TIMING_JIT_CODEGEN);
1778 RT_TIMING_TIME_DIFF(time_start,time_codegen,RT_TIMING_JIT_TOTAL);
1780 /* return pointer to the methods entry point */
1782 return code->entrypoint;
1786 /* jit_asm_compile *************************************************************
1788 This method is called from asm_vm_call_method and does things like:
1789 create stackframe info for exceptions, compile the method, patch
1790 the entrypoint of the method into the calculated address in the JIT
1791 code, and flushes the instruction cache.
1793 *******************************************************************************/
1795 u1 *jit_asm_compile(methodinfo *m, u1 *mptr, u1 *sp, u1 *ra)
1802 /* create the stackframeinfo (XPC is equal to RA) */
1804 stacktrace_create_extern_stackframeinfo(&sfi, NULL, sp, ra, ra);
1806 /* actually compile the method */
1808 entrypoint = jit_compile(m);
1810 /* remove the stackframeinfo */
1812 stacktrace_remove_stackframeinfo(&sfi);
1814 /* there was a problem during compilation */
1816 if (entrypoint == NULL)
1819 /* get the method patch address */
1821 pa = md_get_method_patch_address(ra, &sfi, mptr);
1823 /* patch the method entry point */
1827 *p = (ptrint) entrypoint;
1829 /* flush the instruction cache */
1831 md_icacheflush(pa, SIZEOF_VOID_P);
1838 * These are local overrides for various environment variables in Emacs.
1839 * Please do not remove this and leave it at the end of the file, where
1840 * Emacs will automagically detect them.
1841 * ---------------------------------------------------------------------
1844 * indent-tabs-mode: t
1848 * vim:noexpandtab:sw=4:ts=4: