1 /* src/vm/jit/jit.c - calls the code generation functions
3 Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4 R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5 C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6 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., 59 Temple Place - Suite 330, Boston, MA
25 Contact: cacao@complang.tuwien.ac.at
27 Authors: Andreas Krall
30 Changes: Edwin Steiner
33 $Id: jit.c 2428 2005-05-03 19:24:00Z twisti $
41 #include "mm/memory.h"
42 #include "toolbox/logging.h"
43 #include "vm/builtin.h"
45 #include "vm/global.h"
46 #include "vm/initialize.h"
47 #include "vm/loader.h"
48 #include "vm/method.h"
49 #include "vm/options.h"
50 #include "vm/statistics.h"
51 #include "vm/tables.h"
52 #include "vm/jit/asmpart.h"
53 #include "vm/jit/codegen.inc.h"
54 #include "vm/jit/jit.h"
56 #include "vm/jit/lsra.h"
58 #include "vm/jit/parse.h"
59 #include "vm/jit/reg.h"
60 #include "vm/jit/stack.h"
61 #include "vm/jit/inline/inline.h"
62 #include "vm/jit/inline/parseRT.h"
63 #include "vm/jit/inline/parseXTA.h"
64 #include "vm/jit/loop/analyze.h"
65 #include "vm/jit/loop/graph.h"
66 #include "vm/jit/loop/loop.h"
67 #include "vm/jit/verify/typecheck.h"
69 #if defined(USE_THREADS)
70 # if defined(NATIVE_THREADS)
71 # include "threads/native/threads.h"
73 # include "threads/green/threads.h"
79 /* global switches ************************************************************/
84 int jcommandsize[256] = {
89 #define JAVA_ACONST_NULL 1
90 #define ICMD_ACONST 1 /* val.a = constant */
92 #define JAVA_ICONST_M1 2
93 #define ICMD_CHECKNULL 2
95 #define JAVA_ICONST_0 3
96 #define ICMD_ICONST 3 /* val.i = constant */
98 #define JAVA_ICONST_1 4
100 #define JAVA_ICONST_2 5
101 #define ICMD_IDIVPOW2 5 /* val.i = constant */
103 #define JAVA_ICONST_3 6
104 #define ICMD_LDIVPOW2 6 /* val.l = constant */
106 #define JAVA_ICONST_4 7
108 #define JAVA_ICONST_5 8
110 #define JAVA_LCONST_0 9
111 #define ICMD_LCONST 9 /* val.l = constant */
113 #define JAVA_LCONST_1 10
114 #define ICMD_LCMPCONST 10 /* val.l = constant */
116 #define JAVA_FCONST_0 11
117 #define ICMD_FCONST 11 /* val.f = constant */
119 #define JAVA_FCONST_1 12
121 #define JAVA_FCONST_2 13
122 #define ICMD_ELSE_ICONST 13
124 #define JAVA_DCONST_0 14
125 #define ICMD_DCONST 14 /* val.d = constant */
127 #define JAVA_DCONST_1 15
128 #define ICMD_IFEQ_ICONST 15
130 #define JAVA_BIPUSH 16
131 #define ICMD_IFNE_ICONST 16
133 #define JAVA_SIPUSH 17
134 #define ICMD_IFLT_ICONST 17
137 #define ICMD_IFGE_ICONST 18
140 #define ICMD_IFGT_ICONST 19
142 #define JAVA_LDC2W 20
143 #define ICMD_IFLE_ICONST 20
145 /* order of LOAD instructions must be */
146 /* equal to order of TYPE_XXX defines */
147 #define JAVA_ILOAD 21
148 #define ICMD_ILOAD 21 /* op1 = local variable */
150 #define JAVA_LLOAD 22
151 #define ICMD_LLOAD 22 /* op1 = local variable */
153 #define JAVA_FLOAD 23
154 #define ICMD_FLOAD 23 /* op1 = local variable */
156 #define JAVA_DLOAD 24
157 #define ICMD_DLOAD 24 /* op1 = local variable */
159 #define JAVA_ALOAD 25
160 #define ICMD_ALOAD 25 /* op1 = local variable */
162 #define JAVA_ILOAD_0 26
163 #define ICMD_IADDCONST 26 /* val.i = constant */
165 #define JAVA_ILOAD_1 27
166 #define ICMD_ISUBCONST 27 /* val.i = constant */
168 #define JAVA_ILOAD_2 28
169 #define ICMD_IMULCONST 28 /* val.i = constant */
171 #define JAVA_ILOAD_3 29
172 #define ICMD_IANDCONST 29 /* val.i = constant */
174 #define JAVA_LLOAD_0 30
175 #define ICMD_IORCONST 30 /* val.i = constant */
177 #define JAVA_LLOAD_1 31
178 #define ICMD_IXORCONST 31 /* val.i = constant */
180 #define JAVA_LLOAD_2 32
181 #define ICMD_ISHLCONST 32 /* val.i = constant */
183 #define JAVA_LLOAD_3 33
184 #define ICMD_ISHRCONST 33 /* val.i = constant */
186 #define JAVA_FLOAD_0 34
187 #define ICMD_IUSHRCONST 34 /* val.i = constant */
189 #define JAVA_FLOAD_1 35
190 #define ICMD_IREMPOW2 35 /* val.i = constant */
192 #define JAVA_FLOAD_2 36
193 #define ICMD_LADDCONST 36 /* val.l = constant */
195 #define JAVA_FLOAD_3 37
196 #define ICMD_LSUBCONST 37 /* val.l = constant */
198 #define JAVA_DLOAD_0 38
199 #define ICMD_LMULCONST 38 /* val.l = constant */
201 #define JAVA_DLOAD_1 39
202 #define ICMD_LANDCONST 39 /* val.l = constant */
204 #define JAVA_DLOAD_2 40
205 #define ICMD_LORCONST 40 /* val.l = constant */
207 #define JAVA_DLOAD_3 41
208 #define ICMD_LXORCONST 41 /* val.l = constant */
210 #define JAVA_ALOAD_0 42
211 #define ICMD_LSHLCONST 42 /* val.l = constant */
213 #define JAVA_ALOAD_1 43
214 #define ICMD_LSHRCONST 43 /* val.l = constant */
216 #define JAVA_ALOAD_2 44
217 #define ICMD_LUSHRCONST 44 /* val.l = constant */
219 #define JAVA_ALOAD_3 45
220 #define ICMD_LREMPOW2 45 /* val.l = constant */
222 #define JAVA_IALOAD 46
223 #define ICMD_IALOAD 46
225 #define JAVA_LALOAD 47
226 #define ICMD_LALOAD 47
228 #define JAVA_FALOAD 48
229 #define ICMD_FALOAD 48
231 #define JAVA_DALOAD 49
232 #define ICMD_DALOAD 49
234 #define JAVA_AALOAD 50
235 #define ICMD_AALOAD 50
237 #define JAVA_BALOAD 51
238 #define ICMD_BALOAD 51
240 #define JAVA_CALOAD 52
241 #define ICMD_CALOAD 52
243 #define JAVA_SALOAD 53
244 #define ICMD_SALOAD 53
246 /* order of STORE instructions must be*/
247 /* equal to order of TYPE_XXX defines */
248 #define JAVA_ISTORE 54
249 #define ICMD_ISTORE 54 /* op1 = local variable */
251 #define JAVA_LSTORE 55
252 #define ICMD_LSTORE 55 /* op1 = local variable */
254 #define JAVA_FSTORE 56
255 #define ICMD_FSTORE 56 /* op1 = local variable */
257 #define JAVA_DSTORE 57
258 #define ICMD_DSTORE 57 /* op1 = local variable */
260 #define JAVA_ASTORE 58
261 #define ICMD_ASTORE 58 /* op1 = local variable */
263 #define JAVA_ISTORE_0 59
264 #define ICMD_IF_LEQ 59 /* op1 = target JavaVM pc, val.l */
266 #define JAVA_ISTORE_1 60
267 #define ICMD_IF_LNE 60 /* op1 = target JavaVM pc, val.l */
269 #define JAVA_ISTORE_2 61
270 #define ICMD_IF_LLT 61 /* op1 = target JavaVM pc, val.l */
272 #define JAVA_ISTORE_3 62
273 #define ICMD_IF_LGE 62 /* op1 = target JavaVM pc, val.l */
275 #define JAVA_LSTORE_0 63
276 #define ICMD_IF_LGT 63 /* op1 = target JavaVM pc, val.l */
278 #define JAVA_LSTORE_1 64
279 #define ICMD_IF_LLE 64 /* op1 = target JavaVM pc, val.l */
281 #define JAVA_LSTORE_2 65
282 #define ICMD_IF_LCMPEQ 65 /* op1 = target JavaVM pc */
284 #define JAVA_LSTORE_3 66
285 #define ICMD_IF_LCMPNE 66 /* op1 = target JavaVM pc */
287 #define JAVA_FSTORE_0 67
288 #define ICMD_IF_LCMPLT 67 /* op1 = target JavaVM pc */
290 #define JAVA_FSTORE_1 68
291 #define ICMD_IF_LCMPGE 68 /* op1 = target JavaVM pc */
293 #define JAVA_FSTORE_2 69
294 #define ICMD_IF_LCMPGT 69 /* op1 = target JavaVM pc */
296 #define JAVA_FSTORE_3 70
297 #define ICMD_IF_LCMPLE 70 /* op1 = target JavaVM pc */
299 #define JAVA_DSTORE_0 71
301 #define JAVA_DSTORE_1 72
303 #define JAVA_DSTORE_2 73
305 #define JAVA_DSTORE_3 74
307 #define JAVA_ASTORE_0 75
309 #define JAVA_ASTORE_1 76
311 #define JAVA_ASTORE_2 77
313 #define JAVA_ASTORE_3 78
315 #define JAVA_IASTORE 79
316 #define ICMD_IASTORE 79
318 #define JAVA_LASTORE 80
319 #define ICMD_LASTORE 80
321 #define JAVA_FASTORE 81
322 #define ICMD_FASTORE 81
324 #define JAVA_DASTORE 82
325 #define ICMD_DASTORE 82
327 #define JAVA_AASTORE 83
328 #define ICMD_AASTORE 83
330 #define JAVA_BASTORE 84
331 #define ICMD_BASTORE 84
333 #define JAVA_CASTORE 85
334 #define ICMD_CASTORE 85
336 #define JAVA_SASTORE 86
337 #define ICMD_SASTORE 86
348 #define JAVA_DUP_X1 90
349 #define ICMD_DUP_X1 90
351 #define JAVA_DUP_X2 91
352 #define ICMD_DUP_X2 91
357 #define JAVA_DUP2_X1 93
358 #define ICMD_DUP2_X1 93
360 #define JAVA_DUP2_X2 94
361 #define ICMD_DUP2_X2 94
378 #define JAVA_ISUB 100
379 #define ICMD_ISUB 100
381 #define JAVA_LSUB 101
382 #define ICMD_LSUB 101
384 #define JAVA_FSUB 102
385 #define ICMD_FSUB 102
387 #define JAVA_DSUB 103
388 #define ICMD_DSUB 103
390 #define JAVA_IMUL 104
391 #define ICMD_IMUL 104
393 #define JAVA_LMUL 105
394 #define ICMD_LMUL 105
396 #define JAVA_FMUL 106
397 #define ICMD_FMUL 106
399 #define JAVA_DMUL 107
400 #define ICMD_DMUL 107
402 #define JAVA_IDIV 108
403 #define ICMD_IDIV 108
405 #define JAVA_LDIV 109
406 #define ICMD_LDIV 109
408 #define JAVA_FDIV 110
409 #define ICMD_FDIV 110
411 #define JAVA_DDIV 111
412 #define ICMD_DDIV 111
414 #define JAVA_IREM 112
415 #define ICMD_IREM 112
417 #define JAVA_LREM 113
418 #define ICMD_LREM 113
420 #define JAVA_FREM 114
421 #define ICMD_FREM 114
423 #define JAVA_DREM 115
424 #define ICMD_DREM 115
426 #define JAVA_INEG 116
427 #define ICMD_INEG 116
429 #define JAVA_LNEG 117
430 #define ICMD_LNEG 117
432 #define JAVA_FNEG 118
433 #define ICMD_FNEG 118
435 #define JAVA_DNEG 119
436 #define ICMD_DNEG 119
438 #define JAVA_ISHL 120
439 #define ICMD_ISHL 120
441 #define JAVA_LSHL 121
442 #define ICMD_LSHL 121
444 #define JAVA_ISHR 122
445 #define ICMD_ISHR 122
447 #define JAVA_LSHR 123
448 #define ICMD_LSHR 123
450 #define JAVA_IUSHR 124
451 #define ICMD_IUSHR 124
453 #define JAVA_LUSHR 125
454 #define ICMD_LUSHR 125
456 #define JAVA_IAND 126
457 #define ICMD_IAND 126
459 #define JAVA_LAND 127
460 #define ICMD_LAND 127
468 #define JAVA_IXOR 130
469 #define ICMD_IXOR 130
471 #define JAVA_LXOR 131
472 #define ICMD_LXOR 131
474 #define JAVA_IINC 132
475 #define ICMD_IINC 132 /* op1 = local variable, val.i = constant */
513 #define JAVA_INT2BYTE 145
514 #define ICMD_INT2BYTE 145
516 #define JAVA_INT2CHAR 146
517 #define ICMD_INT2CHAR 146
519 #define JAVA_INT2SHORT 147
520 #define ICMD_INT2SHORT 147
522 #define JAVA_LCMP 148
523 #define ICMD_LCMP 148
525 #define JAVA_FCMPL 149
526 #define ICMD_FCMPL 149
528 #define JAVA_FCMPG 150
529 #define ICMD_FCMPG 150
531 #define JAVA_DCMPL 151
532 #define ICMD_DCMPL 151
534 #define JAVA_DCMPG 152
535 #define ICMD_DCMPG 152
537 #define JAVA_IFEQ 153
538 #define ICMD_IFEQ 153 /* op1 = target JavaVM pc, val.i */
540 #define JAVA_IFNE 154
541 #define ICMD_IFNE 154 /* op1 = target JavaVM pc, val.i */
543 #define JAVA_IFLT 155
544 #define ICMD_IFLT 155 /* op1 = target JavaVM pc, val.i */
546 #define JAVA_IFGE 156
547 #define ICMD_IFGE 156 /* op1 = target JavaVM pc, val.i */
549 #define JAVA_IFGT 157
550 #define ICMD_IFGT 157 /* op1 = target JavaVM pc, val.i */
552 #define JAVA_IFLE 158
553 #define ICMD_IFLE 158 /* op1 = target JavaVM pc, val.i */
555 #define JAVA_IF_ICMPEQ 159
556 #define ICMD_IF_ICMPEQ 159 /* op1 = target JavaVM pc */
558 #define JAVA_IF_ICMPNE 160
559 #define ICMD_IF_ICMPNE 160 /* op1 = target JavaVM pc */
561 #define JAVA_IF_ICMPLT 161
562 #define ICMD_IF_ICMPLT 161 /* op1 = target JavaVM pc */
564 #define JAVA_IF_ICMPGE 162
565 #define ICMD_IF_ICMPGE 162 /* op1 = target JavaVM pc */
567 #define JAVA_IF_ICMPGT 163
568 #define ICMD_IF_ICMPGT 163 /* op1 = target JavaVM pc */
570 #define JAVA_IF_ICMPLE 164
571 #define ICMD_IF_ICMPLE 164 /* op1 = target JavaVM pc */
573 #define JAVA_IF_ACMPEQ 165
574 #define ICMD_IF_ACMPEQ 165 /* op1 = target JavaVM pc */
576 #define JAVA_IF_ACMPNE 166
577 #define ICMD_IF_ACMPNE 166 /* op1 = target JavaVM pc */
579 #define JAVA_GOTO 167
580 #define ICMD_GOTO 167 /* op1 = target JavaVM pc */
583 #define ICMD_JSR 168 /* op1 = target JavaVM pc */
586 #define ICMD_RET 169 /* op1 = local variable */
588 #define JAVA_TABLESWITCH 170
589 #define ICMD_TABLESWITCH 170 /* val.a = pointer to s4 table */
590 0, /* length must be computed */
591 #define JAVA_LOOKUPSWITCH 171
592 #define ICMD_LOOKUPSWITCH 171 /* val.a = pointer to s4 table */
593 0, /* length must be computed */
594 #define JAVA_IRETURN 172
595 #define ICMD_IRETURN 172
597 #define JAVA_LRETURN 173
598 #define ICMD_LRETURN 173
600 #define JAVA_FRETURN 174
601 #define ICMD_FRETURN 174
603 #define JAVA_DRETURN 175
604 #define ICMD_DRETURN 175
606 #define JAVA_ARETURN 176
607 #define ICMD_ARETURN 176
609 #define JAVA_RETURN 177
610 #define ICMD_RETURN 177
612 #define JAVA_GETSTATIC 178
613 #define ICMD_GETSTATIC 178 /* op1 = type, val.a = field address */
615 #define JAVA_PUTSTATIC 179
616 #define ICMD_PUTSTATIC 179 /* op1 = type, val.a = field address */
618 #define JAVA_GETFIELD 180
619 #define ICMD_GETFIELD 180 /* op1 = type, val.i = field offset */
621 #define JAVA_PUTFIELD 181
622 #define ICMD_PUTFIELD 181 /* op1 = type, val.i = field offset */
624 #define JAVA_INVOKEVIRTUAL 182
625 #define ICMD_INVOKEVIRTUAL 182 /* val.a = method info pointer */
627 #define JAVA_INVOKESPECIAL 183
628 #define ICMD_INVOKESPECIAL 183 /* val.a = method info pointer */
630 #define JAVA_INVOKESTATIC 184
631 #define ICMD_INVOKESTATIC 184 /* val.a = method info pointer */
633 #define JAVA_INVOKEINTERFACE 185
634 #define ICMD_INVOKEINTERFACE 185 /* val.a = method info pointer */
636 #define ICMD_CHECKASIZE 186 /* */
639 #define ICMD_NEW 187 /* op1 = 1, val.a = class pointer */
641 #define JAVA_NEWARRAY 188
642 #define ICMD_NEWARRAY 188 /* op1 = basic type */
644 #define JAVA_ANEWARRAY 189
645 #define ICMD_ANEWARRAY 189 /* op1 = 0, val.a = array pointer */
646 3, /* op1 = 1, val.a = class pointer */
647 #define JAVA_ARRAYLENGTH 190
648 #define ICMD_ARRAYLENGTH 190
650 #define JAVA_ATHROW 191
651 #define ICMD_ATHROW 191
653 #define JAVA_CHECKCAST 192
654 #define ICMD_CHECKCAST 192 /* op1 = 0, val.a = array pointer */
655 3, /* op1 = 1, val.a = class pointer */
656 #define JAVA_INSTANCEOF 193
657 #define ICMD_INSTANCEOF 193 /* op1 = 0, val.a = array pointer */
658 3, /* op1 = 1, val.a = class pointer */
659 #define JAVA_MONITORENTER 194
660 #define ICMD_MONITORENTER 194
662 #define JAVA_MONITOREXIT 195
663 #define ICMD_MONITOREXIT 195
665 #define JAVA_WIDE 196
666 0, /* length must be computed */
667 #define JAVA_MULTIANEWARRAY 197
668 #define ICMD_MULTIANEWARRAY 197 /* op1 = dimension, val.a = array */
670 #define JAVA_IFNULL 198
671 #define ICMD_IFNULL 198 /* op1 = target JavaVM pc */
673 #define JAVA_IFNONNULL 199
674 #define ICMD_IFNONNULL 199 /* op1 = target JavaVM pc */
676 #define JAVA_GOTO_W 200
678 #define JAVA_JSR_W 201
680 #define JAVA_BREAKPOINT 202
682 #define ICMD_CHECKEXCEPTION 203
684 #define ICMD_IASTORECONST 204
686 #define ICMD_LASTORECONST 205
688 #define ICMD_FASTORECONST 206
690 #define ICMD_DASTORECONST 207
692 #define ICMD_AASTORECONST 208
694 #define ICMD_BASTORECONST 209
696 #define ICMD_CASTORECONST 210
698 #define ICMD_SASTORECONST 211
700 #define ICMD_PUTSTATICCONST 212
702 #define ICMD_PUTFIELDCONST 213
704 #define ICMD_IMULPOW2 214
706 #define ICMD_LMULPOW2 215
711 1,1,1,1,1,1,1,1,1,1,
712 1,1,1,1,1,1,1,1,1,1,
713 1,1,1,1,1,1,1,1,1,1,
718 char *icmd_names[256] = {
721 "CHECKNULL ", /* ICONST_M1 2 */
723 "UNDEF4 ", /* ICONST_1 4 */
724 "IDIVPOW2 ", /* ICONST_2 5 */
725 "LDIVPOW2 ", /* ICONST_3 6 */
726 "UNDEF7 ", /* ICONST_4 7 */
727 "UNDEF8 ", /* ICONST_5 8 */
729 "LCMPCONST ", /* LCONST_1 10 */
731 "UNDEF12 ", /* FCONST_1 12 */
732 "ELSE_ICONST ", /* FCONST_2 13 */
734 "IFEQ_ICONST ", /* DCONST_1 15 */
735 "IFNE_ICONST ", /* BIPUSH 16 */
736 "IFLT_ICONST ", /* SIPUSH 17 */
737 "IFGE_ICONST ", /* LDC1 18 */
738 "IFGT_ICONST ", /* LDC2 19 */
739 "IFLE_ICONST ", /* LDC2W 20 */
745 "IADDCONST ", /* ILOAD_0 26 */
746 "ISUBCONST ", /* ILOAD_1 27 */
747 "IMULCONST ", /* ILOAD_2 28 */
748 "IANDCONST ", /* ILOAD_3 29 */
749 "IORCONST ", /* LLOAD_0 30 */
750 "IXORCONST ", /* LLOAD_1 31 */
751 "ISHLCONST ", /* LLOAD_2 32 */
752 "ISHRCONST ", /* LLOAD_3 33 */
753 "IUSHRCONST ", /* FLOAD_0 34 */
754 "IREMPOW2 ", /* FLOAD_1 35 */
755 "LADDCONST ", /* FLOAD_2 36 */
756 "LSUBCONST ", /* FLOAD_3 37 */
757 "LMULCONST ", /* DLOAD_0 38 */
758 "LANDCONST ", /* DLOAD_1 39 */
759 "LORCONST ", /* DLOAD_2 40 */
760 "LXORCONST ", /* DLOAD_3 41 */
761 "LSHLCONST ", /* ALOAD_0 42 */
762 "LSHRCONST ", /* ALOAD_1 43 */
763 "LUSHRCONST ", /* ALOAD_2 44 */
764 "LREMPOW2 ", /* ALOAD_3 45 */
778 "IF_LEQ ", /* ISTORE_0 59 */
779 "IF_LNE ", /* ISTORE_1 60 */
780 "IF_LLT ", /* ISTORE_2 61 */
781 "IF_LGE ", /* ISTORE_3 62 */
782 "IF_LGT ", /* LSTORE_0 63 */
783 "IF_LLE ", /* LSTORE_1 64 */
784 "IF_LCMPEQ ", /* LSTORE_2 65 */
785 "IF_LCMPNE ", /* LSTORE_3 66 */
786 "IF_LCMPLT ", /* FSTORE_0 67 */
787 "IF_LCMPGE ", /* FSTORE_1 68 */
788 "IF_LCMPGT ", /* FSTORE_2 69 */
789 "IF_LCMPLE ", /* FSTORE_3 70 */
790 "UNDEF71 ", /* DSTORE_0 71 */
791 "UNDEF72 ", /* DSTORE_1 72 */
792 "UNDEF73 ", /* DSTORE_2 73 */
793 "UNDEF74 ", /* DSTORE_3 74 */
794 "UNDEF75 ", /* ASTORE_0 75 */
795 "UNDEF76 ", /* ASTORE_1 76 */
796 "UNDEF77 ", /* ASTORE_2 77 */
797 "UNDEF78 ", /* ASTORE_3 78 */
864 "INT2BYTE ", /* 145 */
865 "INT2CHAR ", /* 146 */
866 "INT2SHORT ", /* 147 */
878 "IF_ICMPEQ ", /* 159 */
879 "IF_ICMPNE ", /* 160 */
880 "IF_ICMPLT ", /* 161 */
881 "IF_ICMPGE ", /* 162 */
882 "IF_ICMPGT ", /* 163 */
883 "IF_ICMPLE ", /* 164 */
884 "IF_ACMPEQ ", /* 165 */
885 "IF_ACMPNE ", /* 166 */
889 "TABLESWITCH ", /* 170 */
890 "LOOKUPSWITCH ", /* 171 */
891 "IRETURN ", /* 172 */
892 "LRETURN ", /* 173 */
893 "FRETURN ", /* 174 */
894 "DRETURN ", /* 175 */
895 "ARETURN ", /* 176 */
897 "GETSTATIC ", /* 178 */
898 "PUTSTATIC ", /* 179 */
899 "GETFIELD ", /* 180 */
900 "PUTFIELD ", /* 181 */
901 "INVOKEVIRTUAL ", /* 182 */
902 "INVOKESPECIAL ", /* 183 */
903 "INVOKESTATIC ", /* 184 */
904 "INVOKEINTERFACE", /* 185 */
905 "CHECKASIZE ", /* UNDEF186 186 */
907 "NEWARRAY ", /* 188 */
908 "ANEWARRAY ", /* 189 */
909 "ARRAYLENGTH ", /* 190 */
911 "CHECKCAST ", /* 192 */
912 "INSTANCEOF ", /* 193 */
913 "MONITORENTER ", /* 194 */
914 "MONITOREXIT ", /* 195 */
915 "UNDEF196 ", /* WIDE 196 */
916 "MULTIANEWARRAY ", /* 197 */
918 "IFNONNULL ", /* 199 */
919 "UNDEF200 ", /* GOTO_W 200 */
920 "UNDEF201 ", /* JSR_W 201 */
921 "UNDEF202 ", /* BREAKPOINT 202 */
922 "CHECKEXCEPTION ", /* UNDEF203 203 */
923 "IASTORECONST ", /* 204 */
924 "LASTORECONST ", /* 205 */
925 "FASTORECONST ", /* 206 */
926 "DASTORECONST ", /* 207 */
927 "AASTORECONST ", /* 208 */
928 "BASTORECONST ", /* 209 */
929 "CASTORECONST ", /* 210 */
930 "SASTORECONST ", /* 211 */
931 "PUTSTATICCONST ", /* 212 */
932 "PUTFIELDCONST ", /* 213 */
933 "IMULPOW2 ", /* 214 */
934 "LMULPOW2 ", /* 215 */
936 "UNDEF216", "UNDEF217", "UNDEF218", "UNDEF219", "UNDEF220",
937 "UNDEF221", "UNDEF222", "UNDEF223", "UNDEF224", "UNDEF225",
938 "UNDEF226", "UNDEF227", "UNDEF228", "UNDEF229", "UNDEF230",
939 "UNDEF231", "UNDEF232", "UNDEF233", "UNDEF234", "UNDEF235",
940 "UNDEF236", "UNDEF237", "UNDEF238", "UNDEF239", "UNDEF240",
941 "UNDEF241", "UNDEF242", "UNDEF243", "UNDEF244", "UNDEF245",
942 "UNDEF246", "UNDEF247", "UNDEF248", "UNDEF249", "UNDEF250",
944 "INLINE_START ", /* 251 */
945 "INLINE_END ", /* 252 */
947 "BUILTIN3 ", /* 253 */
948 "BUILTIN2 ", /* 254 */
949 "BUILTIN1 " /* 255 */
953 char *opcode_names[256] = {
956 "ICONST_M1 ", /* ICONST_M1 2 */
957 "ICONST_0 ", /* ICONST_0 3 */
958 "ICONST_1 ", /* ICONST_1 4 */
959 "ICONST_2 ", /* ICONST_2 5 */
960 "ICONST_3 ", /* ICONST_3 6 */
961 "ICONST_4 ", /* ICONST_4 7 */
962 "ICONST_5 ", /* ICONST_5 8 */
963 "LCONST_0 ", /* LCONST_0 9 */
964 "LCONST_1 ", /* LCONST_1 10 */
965 "FCONST_0 ", /* FCONST_0 11 */
966 "FCONST_1 ", /* FCONST_1 12 */
967 "FCONST_2 ", /* FCONST_2 13 */
968 "DCONST_0 ", /* DCONST_0 14 */
969 "DCONST_1 ", /* DCONST_1 15 */
970 "BIPUSH ", /* BIPUSH 16 */
971 "SIPUSH ", /* SIPUSH 17 */
973 "LDC_W ", /* LDC_W 19 */
974 "LDC2_W ", /* LDC2_W 20 */
980 "ILOAD_0 ", /* ILOAD_0 26 */
981 "ILOAD_1 ", /* ILOAD_1 27 */
982 "ILOAD_2 ", /* ILOAD_2 28 */
983 "ILOAD_3 ", /* ILOAD_3 29 */
984 "LLOAD_0 ", /* LLOAD_0 30 */
985 "LLOAD_1 ", /* LLOAD_1 31 */
986 "LLOAD_2 ", /* LLOAD_2 32 */
987 "LLOAD_3 ", /* LLOAD_3 33 */
988 "FLOAD_0 ", /* FLOAD_0 34 */
989 "FLOAD_1 ", /* FLOAD_1 35 */
990 "FLOAD_2 ", /* FLOAD_2 36 */
991 "FLOAD_3 ", /* FLOAD_3 37 */
992 "DLOAD_0 ", /* DLOAD_0 38 */
993 "DLOAD_1 ", /* DLOAD_1 39 */
994 "DLOAD_2 ", /* DLOAD_2 40 */
995 "DLOAD_3 ", /* DLOAD_3 41 */
996 "ALOAD_0 ", /* ALOAD_0 42 */
997 "ALOAD_1 ", /* ALOAD_1 43 */
998 "ALOAD_2 ", /* ALOAD_2 44 */
999 "ALOAD_3 ", /* ALOAD_3 45 */
1013 "ISTORE_0 ", /* ISTORE_0 59 */
1014 "ISTORE_1 ", /* ISTORE_1 60 */
1015 "ISTORE_2 ", /* ISTORE_2 61 */
1016 "ISTORE_3 ", /* ISTORE_3 62 */
1017 "LSTORE_0 ", /* LSTORE_0 63 */
1018 "LSTORE_1 ", /* LSTORE_1 64 */
1019 "LSTORE_2 ", /* LSTORE_2 65 */
1020 "LSTORE_3 ", /* LSTORE_3 66 */
1021 "FSTORE_0 ", /* FSTORE_0 67 */
1022 "FSTORE_1 ", /* FSTORE_1 68 */
1023 "FSTORE_2 ", /* FSTORE_2 69 */
1024 "FSTORE_3 ", /* FSTORE_3 70 */
1025 "DSTORE_0 ", /* DSTORE_0 71 */
1026 "DSTORE_1 ", /* DSTORE_1 72 */
1027 "DSTORE_2 ", /* DSTORE_2 73 */
1028 "DSTORE_3 ", /* DSTORE_3 74 */
1029 "ASTORE_0 ", /* ASTORE_0 75 */
1030 "ASTORE_1 ", /* ASTORE_1 76 */
1031 "ASTORE_2 ", /* ASTORE_2 77 */
1032 "ASTORE_3 ", /* ASTORE_3 78 */
1033 "IASTORE ", /* 79 */
1034 "LASTORE ", /* 80 */
1035 "FASTORE ", /* 81 */
1036 "DASTORE ", /* 82 */
1037 "AASTORE ", /* 83 */
1038 "BASTORE ", /* 84 */
1039 "CASTORE ", /* 85 */
1040 "SASTORE ", /* 86 */
1047 "DUP2_X1 ", /* 93 */
1048 "DUP2_X2 ", /* 94 */
1099 "INT2BYTE ", /* 145 */
1100 "INT2CHAR ", /* 146 */
1101 "INT2SHORT ", /* 147 */
1113 "IF_ICMPEQ ", /* 159 */
1114 "IF_ICMPNE ", /* 160 */
1115 "IF_ICMPLT ", /* 161 */
1116 "IF_ICMPGE ", /* 162 */
1117 "IF_ICMPGT ", /* 163 */
1118 "IF_ICMPLE ", /* 164 */
1119 "IF_ACMPEQ ", /* 165 */
1120 "IF_ACMPNE ", /* 166 */
1124 "TABLESWITCH ", /* 170 */
1125 "LOOKUPSWITCH ", /* 171 */
1126 "IRETURN ", /* 172 */
1127 "LRETURN ", /* 173 */
1128 "FRETURN ", /* 174 */
1129 "DRETURN ", /* 175 */
1130 "ARETURN ", /* 176 */
1131 "RETURN ", /* 177 */
1132 "GETSTATIC ", /* 178 */
1133 "PUTSTATIC ", /* 179 */
1134 "GETFIELD ", /* 180 */
1135 "PUTFIELD ", /* 181 */
1136 "INVOKEVIRTUAL ", /* 182 */
1137 "INVOKESPECIAL ", /* 183 */
1138 "INVOKESTATIC ", /* 184 */
1139 "INVOKEINTERFACE", /* 185 */
1140 "UNDEF186 ", /* 186 */
1142 "NEWARRAY ", /* 188 */
1143 "ANEWARRAY ", /* 189 */
1144 "ARRAYLENGTH ", /* 190 */
1145 "ATHROW ", /* 191 */
1146 "CHECKCAST ", /* 192 */
1147 "INSTANCEOF ", /* 193 */
1148 "MONITORENTER ", /* 194 */
1149 "MONITOREXIT ", /* 195 */
1150 "WIDE ", /* WIDE 196 */
1151 "MULTIANEWARRAY ", /* 197 */
1152 "IFNULL ", /* 198 */
1153 "IFNONNULL ", /* 199 */
1154 "GOTO_W ", /* GOTO_W 200 */
1155 "JSR_W ", /* JSR_W 201 */
1156 "BREAKPOINT ", /* BREAKPOINT 202 */
1158 "UNDEF203", "UNDEF204", "UNDEF205",
1159 "UNDEF206", "UNDEF207", "UNDEF208", "UNDEF209", "UNDEF210",
1160 "UNDEF211", "UNDEF212", "UNDEF213", "UNDEF214", "UNDEF215",
1161 "UNDEF216", "UNDEF217", "UNDEF218", "UNDEF219", "UNDEF220",
1162 "UNDEF221", "UNDEF222", "UNDEF223", "UNDEF224", "UNDEF225",
1163 "UNDEF226", "UNDEF227", "UNDEF228", "UNDEF229", "UNDEF230",
1164 "UNDEF231", "UNDEF232", "UNDEF233", "UNDEF234", "UNDEF235",
1165 "UNDEF236", "UNDEF237", "UNDEF238", "UNDEF239", "UNDEF240",
1166 "UNDEF241", "UNDEF242", "UNDEF243", "UNDEF244", "UNDEF245",
1167 "UNDEF246", "UNDEF247", "UNDEF248", "UNDEF249", "UNDEF250",
1168 "UNDEF251", "UNDEF252", "UNDEF253", "UNDEF254", "UNDEF255"
1172 /* include compiler subsystems ************************************************/
1174 /* dummy function, used when there is no JavaVM code available */
1176 static functionptr do_nothing_function()
1182 /* jit_compile *****************************************************************
1184 jit_compile, new version of compiler, translates one method to machine code
1186 *******************************************************************************/
1188 static functionptr jit_compile_intern(methodinfo *m, codegendata *cd,
1189 registerdata *rd, loopdata *ld,
1190 t_inlining_globals *id);
1192 functionptr jit_compile(methodinfo *m)
1198 t_inlining_globals *id;
1201 #if defined(STATISTICS)
1206 /* this is the case if a native function is called by jni */
1208 if (m->flags & ACC_NATIVE)
1209 return (functionptr) m->stubroutine;
1211 #if defined(USE_THREADS)
1212 /* enter a monitor on the method */
1214 builtin_monitorenter((java_objectheader *) m);
1217 /* if method has been already compiled return immediately */
1219 if (m->entrypoint) {
1220 #if defined(USE_THREADS)
1221 builtin_monitorexit((java_objectheader *) m);
1224 return m->entrypoint;
1227 #if defined(STATISTICS)
1232 /* if there is no javacode, print error message and return empty method */
1236 log_message_method("No code given for: ", m);
1238 m->entrypoint = (functionptr) do_nothing_function;
1240 return m->entrypoint; /* return empty method */
1243 #if defined(STATISTICS)
1246 if (getcompilingtime)
1247 compilingtime_start();
1250 /* mark start of dump memory area */
1252 dumpsize = dump_size();
1254 /* allocate memory */
1256 cd = DNEW(codegendata);
1257 rd = DNEW(registerdata);
1258 ld = DNEW(loopdata);
1259 id = DNEW(t_inlining_globals);
1261 /* RTA static analysis must be called before inlining */
1263 RT_jit_parse(m); /* will be called just once */
1264 /* return value ignored for now */
1265 /* XTA static analysis must be called before inlining */
1267 XTA_jit_parse(m); /* will be called just once */
1268 /* return value ignored for now */
1271 /* must be called before reg_setup, because it can change maxlocals */
1272 /* init reqd to initialize for parse even in no inlining */
1273 inlining_setup(m, id);
1275 /* initialize the register allocator */
1276 reg_setup(m, rd, id);
1278 /* setup the codegendata memory */
1279 codegen_setup(m, cd, id);
1281 /* now call internal compile function */
1283 r = jit_compile_intern(m, cd, rd, ld, id);
1285 /* free some memory */
1288 codegen_free(m, cd);
1290 /* clear pointers to dump memory area */
1292 m->basicblocks = NULL;
1293 m->basicblockindex = NULL;
1294 m->instructions = NULL;
1296 /* NO !!! m->exceptiontable = NULL; */
1298 /* release dump area */
1300 dump_release(dumpsize);
1302 #if defined(STATISTICS)
1305 if (getcompilingtime)
1306 compilingtime_stop();
1309 /* define in options.h; Used in main.c, jit.c & inline.c */
1311 if ((utf_new_char("main") == m->name) && (useinliningm))
1312 useinlining = false;
1315 #if defined(USE_THREADS)
1316 /* leave the monitor */
1318 builtin_monitorexit((java_objectheader *) m );
1323 log_message_method("Running: ", m);
1326 /* return pointer to the methods entry point */
1332 /* jit_compile_intern **********************************************************
1334 Static internal function which does the actual compilation.
1336 *******************************************************************************/
1338 static functionptr jit_compile_intern(methodinfo *m, codegendata *cd,
1339 registerdata *rd, loopdata *ld,
1340 t_inlining_globals *id)
1347 /* print log message for compiled method */
1350 log_message_method("Compiling: ", m);
1352 /* initialize the static function's class */
1354 if (m->flags & ACC_STATIC && !m->class->initialized) {
1356 log_message_class("Initialize class ", m->class);
1358 if (!initialize_class(m->class))
1362 /* initialisation of variables and subsystems */
1364 m->isleafmethod = true;
1366 #if defined(STATISTICS)
1368 count_tryblocks += m->exceptiontablelength;
1369 count_javacodesize += m->jcodelength + 18;
1370 count_javaexcsize += m->exceptiontablelength * POINTERSIZE;
1374 /* initialise parameter type descriptor */
1376 method_descriptor2types(m);
1378 /* call the compiler passes ***********************************************/
1381 log_message_method("Parsing: ", m);
1383 /* call parse pass */
1384 if (!parse(m, cd, id)) {
1386 log_message_method("Exception while parsing: ", m);
1391 if (compileverbose) {
1392 log_message_method("Parsing done: ", m);
1393 log_message_method("Analysing: ", m);
1396 /* call stack analysis pass */
1397 if (!analyse_stack(m, cd, rd)) {
1399 log_message_method("Exception while analysing: ", m);
1405 log_message_method("Analysing done: ", m);
1407 #ifdef CACAO_TYPECHECK
1410 log_message_method("Typechecking: ", m);
1412 /* call typecheck pass */
1413 if (!typecheck(m, cd, rd)) {
1415 log_message_method("Exception while typechecking: ", m);
1421 log_message_method("Typechecking done: ", m);
1427 analyseGraph(m, ld);
1428 optimize_loops(m, cd, ld);
1431 #ifdef SPECIALMEMUSE
1432 /* preregpass(m, rd); */
1436 log_message_method("Allocating registers: ", m);
1438 /* allocate registers */
1440 old_opt_lsra=opt_lsra;
1442 if (!lsra(m, cd, rd, id)) {
1444 /* log_message_method("Regalloc Fallback: ", m); */
1445 regalloc( m, cd, rd );
1448 if (opt_stat) count_methods_allocated_by_lsra++;
1450 /* log_message_method("Regalloc LSRA: ", m); */
1461 count_locals_conflicts += (cd->maxlocals-1)*(cd->maxlocals);
1463 regalloc(m, cd, rd);
1468 reg_make_statistics(m, cd, rd);
1471 if (compileverbose) {
1472 log_message_method("Allocating registers done: ", m);
1473 log_message_method("Generating code: ", m);
1476 /* now generate the machine code */
1480 log_message_method("Generating code done: ", m);
1482 /* intermediate and assembly code listings */
1484 if (showintermediate) {
1485 show_icmd_method(m, cd, rd);
1487 } else if (showdisassemble) {
1488 disassemble((void *) ((long) m->mcode + cd->dseglen),
1489 m->mcodelength - cd->dseglen);
1492 if (showddatasegment)
1493 dseg_display(m, cd);
1495 if (compileverbose) {
1496 log_message_method("Compiling done: ", m);
1497 printf("method dataseg:%p, range:%p %p\n",m->mcode,(void *) ((long) m->mcode + cd->dseglen),(void *) ((long) m->mcode + m->mcodelength));
1501 opt_lsra=old_opt_lsra;
1503 /* return pointer to the methods entry point */
1505 return m->entrypoint;
1509 void compile_all_class_methods(classinfo *c)
1513 for (i = 0; i < c->methodscount; i++) {
1514 (void) jit_compile(&(c->methods[i]));
1519 /* functions for compiler initialisation and finalisation *********************/
1525 #if defined(USEBUILTINTABLE)
1526 sort_builtintable();
1529 #if defined(__ALPHA__)
1530 has_ext_instr_set = ! has_no_x_instr_set();
1533 for (i = 0; i < 256; i++)
1536 stackreq[JAVA_NOP] = 0;
1537 stackreq[JAVA_ISTORE] = 0;
1538 stackreq[JAVA_LSTORE] = 0;
1539 stackreq[JAVA_FSTORE] = 0;
1540 stackreq[JAVA_DSTORE] = 0;
1541 stackreq[JAVA_ASTORE] = 0;
1542 stackreq[JAVA_ISTORE_0] = 0;
1543 stackreq[JAVA_ISTORE_1] = 0;
1544 stackreq[JAVA_ISTORE_2] = 0;
1545 stackreq[JAVA_ISTORE_3] = 0;
1546 stackreq[JAVA_LSTORE_0] = 0;
1547 stackreq[JAVA_LSTORE_1] = 0;
1548 stackreq[JAVA_LSTORE_2] = 0;
1549 stackreq[JAVA_LSTORE_3] = 0;
1550 stackreq[JAVA_FSTORE_0] = 0;
1551 stackreq[JAVA_FSTORE_1] = 0;
1552 stackreq[JAVA_FSTORE_2] = 0;
1553 stackreq[JAVA_FSTORE_3] = 0;
1554 stackreq[JAVA_DSTORE_0] = 0;
1555 stackreq[JAVA_DSTORE_1] = 0;
1556 stackreq[JAVA_DSTORE_2] = 0;
1557 stackreq[JAVA_DSTORE_3] = 0;
1558 stackreq[JAVA_ASTORE_0] = 0;
1559 stackreq[JAVA_ASTORE_1] = 0;
1560 stackreq[JAVA_ASTORE_2] = 0;
1561 stackreq[JAVA_ASTORE_3] = 0;
1562 stackreq[JAVA_IASTORE] = 0;
1563 stackreq[JAVA_LASTORE] = 0;
1564 stackreq[JAVA_FASTORE] = 0;
1565 stackreq[JAVA_DASTORE] = 0;
1566 stackreq[JAVA_AASTORE] = 0;
1567 stackreq[JAVA_BASTORE] = 0;
1568 stackreq[JAVA_CASTORE] = 0;
1569 stackreq[JAVA_SASTORE] = 0;
1570 stackreq[JAVA_POP] = 0;
1571 stackreq[JAVA_POP2] = 0;
1572 stackreq[JAVA_IINC] = 0;
1573 stackreq[JAVA_IFEQ] = 0;
1574 stackreq[JAVA_IFNE] = 0;
1575 stackreq[JAVA_IFLT] = 0;
1576 stackreq[JAVA_IFGE] = 0;
1577 stackreq[JAVA_IFGT] = 0;
1578 stackreq[JAVA_IFLE] = 0;
1579 stackreq[JAVA_IF_ICMPEQ] = 0;
1580 stackreq[JAVA_IF_ICMPNE] = 0;
1581 stackreq[JAVA_IF_ICMPLT] = 0;
1582 stackreq[JAVA_IF_ICMPGE] = 0;
1583 stackreq[JAVA_IF_ICMPGT] = 0;
1584 stackreq[JAVA_IF_ICMPLE] = 0;
1585 stackreq[JAVA_IF_ACMPEQ] = 0;
1586 stackreq[JAVA_IF_ACMPNE] = 0;
1587 stackreq[JAVA_GOTO] = 0;
1588 stackreq[JAVA_RET] = 0;
1589 stackreq[JAVA_TABLESWITCH] = 0;
1590 stackreq[JAVA_LOOKUPSWITCH] = 0;
1591 stackreq[JAVA_IRETURN] = 0;
1592 stackreq[JAVA_LRETURN] = 0;
1593 stackreq[JAVA_FRETURN] = 0;
1594 stackreq[JAVA_DRETURN] = 0;
1595 stackreq[JAVA_ARETURN] = 0;
1596 stackreq[JAVA_RETURN] = 0;
1597 stackreq[JAVA_PUTSTATIC] = 0;
1598 stackreq[JAVA_PUTFIELD] = 0;
1599 stackreq[JAVA_MONITORENTER] = 0;
1600 stackreq[JAVA_MONITOREXIT] = 0;
1601 stackreq[JAVA_WIDE] = 0;
1602 stackreq[JAVA_IFNULL] = 0;
1603 stackreq[JAVA_IFNONNULL] = 0;
1604 stackreq[JAVA_GOTO_W] = 0;
1605 stackreq[JAVA_BREAKPOINT] = 0;
1607 stackreq[JAVA_SWAP] = 2;
1608 stackreq[JAVA_DUP2] = 2;
1609 stackreq[JAVA_DUP_X1] = 3;
1610 stackreq[JAVA_DUP_X2] = 4;
1611 stackreq[JAVA_DUP2_X1] = 3;
1612 stackreq[JAVA_DUP2_X2] = 4;
1614 /* initialize the codegen stuff */
1625 * These are local overrides for various environment variables in Emacs.
1626 * Please do not remove this and leave it at the end of the file, where
1627 * Emacs will automagically detect them.
1628 * ---------------------------------------------------------------------
1631 * indent-tabs-mode: t