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
34 $Id: jit.c 3744 2005-11-22 23:42:43Z twisti $
43 #include "mm/memory.h"
44 #include "native/native.h"
45 #include "toolbox/logging.h"
46 #include "vm/builtin.h"
48 #include "vm/global.h"
49 #include "vm/initialize.h"
50 #include "vm/loader.h"
51 #include "vm/method.h"
52 #include "vm/options.h"
53 #include "vm/statistics.h"
54 #include "vm/tables.h"
55 #include "vm/jit/asmpart.h"
56 #include "vm/jit/codegen.inc.h"
57 #include "vm/jit/disass.h"
58 #include "vm/jit/jit.h"
61 # include "vm/jit/lsra.h"
64 #include "vm/jit/parse.h"
65 #include "vm/jit/reg.h"
66 #include "vm/jit/stack.h"
68 #if defined(USE_INLINING)
69 # include "vm/jit/inline/inline.h"
70 # include "vm/jit/inline/parseRT.h"
71 # include "vm/jit/inline/parseXTA.h"
74 #include "vm/jit/loop/analyze.h"
75 #include "vm/jit/loop/graph.h"
76 #include "vm/jit/loop/loop.h"
77 #include "vm/jit/verify/typecheck.h"
79 #if defined(USE_THREADS)
80 # if defined(NATIVE_THREADS)
81 # include "threads/native/threads.h"
83 # include "threads/green/threads.h"
89 /* global switches ************************************************************/
94 int jcommandsize[256] = {
99 #define JAVA_ACONST_NULL 1
100 #define ICMD_ACONST 1 /* val.a = constant */
102 #define JAVA_ICONST_M1 2
103 #define ICMD_CHECKNULL 2
105 #define JAVA_ICONST_0 3
106 #define ICMD_ICONST 3 /* val.i = constant */
108 #define JAVA_ICONST_1 4
110 #define JAVA_ICONST_2 5
111 #define ICMD_IDIVPOW2 5 /* val.i = constant */
113 #define JAVA_ICONST_3 6
114 #define ICMD_LDIVPOW2 6 /* val.l = constant */
116 #define JAVA_ICONST_4 7
118 #define JAVA_ICONST_5 8
120 #define JAVA_LCONST_0 9
121 #define ICMD_LCONST 9 /* val.l = constant */
123 #define JAVA_LCONST_1 10
124 #define ICMD_LCMPCONST 10 /* val.l = constant */
126 #define JAVA_FCONST_0 11
127 #define ICMD_FCONST 11 /* val.f = constant */
129 #define JAVA_FCONST_1 12
131 #define JAVA_FCONST_2 13
132 #define ICMD_ELSE_ICONST 13
134 #define JAVA_DCONST_0 14
135 #define ICMD_DCONST 14 /* val.d = constant */
137 #define JAVA_DCONST_1 15
138 #define ICMD_IFEQ_ICONST 15
140 #define JAVA_BIPUSH 16
141 #define ICMD_IFNE_ICONST 16
143 #define JAVA_SIPUSH 17
144 #define ICMD_IFLT_ICONST 17
147 #define ICMD_IFGE_ICONST 18
150 #define ICMD_IFGT_ICONST 19
152 #define JAVA_LDC2W 20
153 #define ICMD_IFLE_ICONST 20
155 /* order of LOAD instructions must be */
156 /* equal to order of TYPE_XXX defines */
157 #define JAVA_ILOAD 21
158 #define ICMD_ILOAD 21 /* op1 = local variable */
160 #define JAVA_LLOAD 22
161 #define ICMD_LLOAD 22 /* op1 = local variable */
163 #define JAVA_FLOAD 23
164 #define ICMD_FLOAD 23 /* op1 = local variable */
166 #define JAVA_DLOAD 24
167 #define ICMD_DLOAD 24 /* op1 = local variable */
169 #define JAVA_ALOAD 25
170 #define ICMD_ALOAD 25 /* op1 = local variable */
172 #define JAVA_ILOAD_0 26
173 #define ICMD_IADDCONST 26 /* val.i = constant */
175 #define JAVA_ILOAD_1 27
176 #define ICMD_ISUBCONST 27 /* val.i = constant */
178 #define JAVA_ILOAD_2 28
179 #define ICMD_IMULCONST 28 /* val.i = constant */
181 #define JAVA_ILOAD_3 29
182 #define ICMD_IANDCONST 29 /* val.i = constant */
184 #define JAVA_LLOAD_0 30
185 #define ICMD_IORCONST 30 /* val.i = constant */
187 #define JAVA_LLOAD_1 31
188 #define ICMD_IXORCONST 31 /* val.i = constant */
190 #define JAVA_LLOAD_2 32
191 #define ICMD_ISHLCONST 32 /* val.i = constant */
193 #define JAVA_LLOAD_3 33
194 #define ICMD_ISHRCONST 33 /* val.i = constant */
196 #define JAVA_FLOAD_0 34
197 #define ICMD_IUSHRCONST 34 /* val.i = constant */
199 #define JAVA_FLOAD_1 35
200 #define ICMD_IREMPOW2 35 /* val.i = constant */
202 #define JAVA_FLOAD_2 36
203 #define ICMD_LADDCONST 36 /* val.l = constant */
205 #define JAVA_FLOAD_3 37
206 #define ICMD_LSUBCONST 37 /* val.l = constant */
208 #define JAVA_DLOAD_0 38
209 #define ICMD_LMULCONST 38 /* val.l = constant */
211 #define JAVA_DLOAD_1 39
212 #define ICMD_LANDCONST 39 /* val.l = constant */
214 #define JAVA_DLOAD_2 40
215 #define ICMD_LORCONST 40 /* val.l = constant */
217 #define JAVA_DLOAD_3 41
218 #define ICMD_LXORCONST 41 /* val.l = constant */
220 #define JAVA_ALOAD_0 42
221 #define ICMD_LSHLCONST 42 /* val.l = constant */
223 #define JAVA_ALOAD_1 43
224 #define ICMD_LSHRCONST 43 /* val.l = constant */
226 #define JAVA_ALOAD_2 44
227 #define ICMD_LUSHRCONST 44 /* val.l = constant */
229 #define JAVA_ALOAD_3 45
230 #define ICMD_LREMPOW2 45 /* val.l = constant */
232 #define JAVA_IALOAD 46
233 #define ICMD_IALOAD 46
235 #define JAVA_LALOAD 47
236 #define ICMD_LALOAD 47
238 #define JAVA_FALOAD 48
239 #define ICMD_FALOAD 48
241 #define JAVA_DALOAD 49
242 #define ICMD_DALOAD 49
244 #define JAVA_AALOAD 50
245 #define ICMD_AALOAD 50
247 #define JAVA_BALOAD 51
248 #define ICMD_BALOAD 51
250 #define JAVA_CALOAD 52
251 #define ICMD_CALOAD 52
253 #define JAVA_SALOAD 53
254 #define ICMD_SALOAD 53
256 /* order of STORE instructions must be*/
257 /* equal to order of TYPE_XXX defines */
258 #define JAVA_ISTORE 54
259 #define ICMD_ISTORE 54 /* op1 = local variable */
261 #define JAVA_LSTORE 55
262 #define ICMD_LSTORE 55 /* op1 = local variable */
264 #define JAVA_FSTORE 56
265 #define ICMD_FSTORE 56 /* op1 = local variable */
267 #define JAVA_DSTORE 57
268 #define ICMD_DSTORE 57 /* op1 = local variable */
270 #define JAVA_ASTORE 58
271 #define ICMD_ASTORE 58 /* op1 = local variable */
273 #define JAVA_ISTORE_0 59
274 #define ICMD_IF_LEQ 59 /* op1 = target JavaVM pc, val.l */
276 #define JAVA_ISTORE_1 60
277 #define ICMD_IF_LNE 60 /* op1 = target JavaVM pc, val.l */
279 #define JAVA_ISTORE_2 61
280 #define ICMD_IF_LLT 61 /* op1 = target JavaVM pc, val.l */
282 #define JAVA_ISTORE_3 62
283 #define ICMD_IF_LGE 62 /* op1 = target JavaVM pc, val.l */
285 #define JAVA_LSTORE_0 63
286 #define ICMD_IF_LGT 63 /* op1 = target JavaVM pc, val.l */
288 #define JAVA_LSTORE_1 64
289 #define ICMD_IF_LLE 64 /* op1 = target JavaVM pc, val.l */
291 #define JAVA_LSTORE_2 65
292 #define ICMD_IF_LCMPEQ 65 /* op1 = target JavaVM pc */
294 #define JAVA_LSTORE_3 66
295 #define ICMD_IF_LCMPNE 66 /* op1 = target JavaVM pc */
297 #define JAVA_FSTORE_0 67
298 #define ICMD_IF_LCMPLT 67 /* op1 = target JavaVM pc */
300 #define JAVA_FSTORE_1 68
301 #define ICMD_IF_LCMPGE 68 /* op1 = target JavaVM pc */
303 #define JAVA_FSTORE_2 69
304 #define ICMD_IF_LCMPGT 69 /* op1 = target JavaVM pc */
306 #define JAVA_FSTORE_3 70
307 #define ICMD_IF_LCMPLE 70 /* op1 = target JavaVM pc */
309 #define JAVA_DSTORE_0 71
311 #define JAVA_DSTORE_1 72
313 #define JAVA_DSTORE_2 73
315 #define JAVA_DSTORE_3 74
317 #define JAVA_ASTORE_0 75
319 #define JAVA_ASTORE_1 76
321 #define JAVA_ASTORE_2 77
323 #define JAVA_ASTORE_3 78
325 #define JAVA_IASTORE 79
326 #define ICMD_IASTORE 79
328 #define JAVA_LASTORE 80
329 #define ICMD_LASTORE 80
331 #define JAVA_FASTORE 81
332 #define ICMD_FASTORE 81
334 #define JAVA_DASTORE 82
335 #define ICMD_DASTORE 82
337 #define JAVA_AASTORE 83
338 #define ICMD_AASTORE 83
340 #define JAVA_BASTORE 84
341 #define ICMD_BASTORE 84
343 #define JAVA_CASTORE 85
344 #define ICMD_CASTORE 85
346 #define JAVA_SASTORE 86
347 #define ICMD_SASTORE 86
358 #define JAVA_DUP_X1 90
359 #define ICMD_DUP_X1 90
361 #define JAVA_DUP_X2 91
362 #define ICMD_DUP_X2 91
367 #define JAVA_DUP2_X1 93
368 #define ICMD_DUP2_X1 93
370 #define JAVA_DUP2_X2 94
371 #define ICMD_DUP2_X2 94
388 #define JAVA_ISUB 100
389 #define ICMD_ISUB 100
391 #define JAVA_LSUB 101
392 #define ICMD_LSUB 101
394 #define JAVA_FSUB 102
395 #define ICMD_FSUB 102
397 #define JAVA_DSUB 103
398 #define ICMD_DSUB 103
400 #define JAVA_IMUL 104
401 #define ICMD_IMUL 104
403 #define JAVA_LMUL 105
404 #define ICMD_LMUL 105
406 #define JAVA_FMUL 106
407 #define ICMD_FMUL 106
409 #define JAVA_DMUL 107
410 #define ICMD_DMUL 107
412 #define JAVA_IDIV 108
413 #define ICMD_IDIV 108
415 #define JAVA_LDIV 109
416 #define ICMD_LDIV 109
418 #define JAVA_FDIV 110
419 #define ICMD_FDIV 110
421 #define JAVA_DDIV 111
422 #define ICMD_DDIV 111
424 #define JAVA_IREM 112
425 #define ICMD_IREM 112
427 #define JAVA_LREM 113
428 #define ICMD_LREM 113
430 #define JAVA_FREM 114
431 #define ICMD_FREM 114
433 #define JAVA_DREM 115
434 #define ICMD_DREM 115
436 #define JAVA_INEG 116
437 #define ICMD_INEG 116
439 #define JAVA_LNEG 117
440 #define ICMD_LNEG 117
442 #define JAVA_FNEG 118
443 #define ICMD_FNEG 118
445 #define JAVA_DNEG 119
446 #define ICMD_DNEG 119
448 #define JAVA_ISHL 120
449 #define ICMD_ISHL 120
451 #define JAVA_LSHL 121
452 #define ICMD_LSHL 121
454 #define JAVA_ISHR 122
455 #define ICMD_ISHR 122
457 #define JAVA_LSHR 123
458 #define ICMD_LSHR 123
460 #define JAVA_IUSHR 124
461 #define ICMD_IUSHR 124
463 #define JAVA_LUSHR 125
464 #define ICMD_LUSHR 125
466 #define JAVA_IAND 126
467 #define ICMD_IAND 126
469 #define JAVA_LAND 127
470 #define ICMD_LAND 127
478 #define JAVA_IXOR 130
479 #define ICMD_IXOR 130
481 #define JAVA_LXOR 131
482 #define ICMD_LXOR 131
484 #define JAVA_IINC 132
485 #define ICMD_IINC 132 /* op1 = local variable, val.i = constant */
523 #define JAVA_INT2BYTE 145
524 #define ICMD_INT2BYTE 145
526 #define JAVA_INT2CHAR 146
527 #define ICMD_INT2CHAR 146
529 #define JAVA_INT2SHORT 147
530 #define ICMD_INT2SHORT 147
532 #define JAVA_LCMP 148
533 #define ICMD_LCMP 148
535 #define JAVA_FCMPL 149
536 #define ICMD_FCMPL 149
538 #define JAVA_FCMPG 150
539 #define ICMD_FCMPG 150
541 #define JAVA_DCMPL 151
542 #define ICMD_DCMPL 151
544 #define JAVA_DCMPG 152
545 #define ICMD_DCMPG 152
547 #define JAVA_IFEQ 153
548 #define ICMD_IFEQ 153 /* op1 = target JavaVM pc, val.i */
550 #define JAVA_IFNE 154
551 #define ICMD_IFNE 154 /* op1 = target JavaVM pc, val.i */
553 #define JAVA_IFLT 155
554 #define ICMD_IFLT 155 /* op1 = target JavaVM pc, val.i */
556 #define JAVA_IFGE 156
557 #define ICMD_IFGE 156 /* op1 = target JavaVM pc, val.i */
559 #define JAVA_IFGT 157
560 #define ICMD_IFGT 157 /* op1 = target JavaVM pc, val.i */
562 #define JAVA_IFLE 158
563 #define ICMD_IFLE 158 /* op1 = target JavaVM pc, val.i */
565 #define JAVA_IF_ICMPEQ 159
566 #define ICMD_IF_ICMPEQ 159 /* op1 = target JavaVM pc */
568 #define JAVA_IF_ICMPNE 160
569 #define ICMD_IF_ICMPNE 160 /* op1 = target JavaVM pc */
571 #define JAVA_IF_ICMPLT 161
572 #define ICMD_IF_ICMPLT 161 /* op1 = target JavaVM pc */
574 #define JAVA_IF_ICMPGE 162
575 #define ICMD_IF_ICMPGE 162 /* op1 = target JavaVM pc */
577 #define JAVA_IF_ICMPGT 163
578 #define ICMD_IF_ICMPGT 163 /* op1 = target JavaVM pc */
580 #define JAVA_IF_ICMPLE 164
581 #define ICMD_IF_ICMPLE 164 /* op1 = target JavaVM pc */
583 #define JAVA_IF_ACMPEQ 165
584 #define ICMD_IF_ACMPEQ 165 /* op1 = target JavaVM pc */
586 #define JAVA_IF_ACMPNE 166
587 #define ICMD_IF_ACMPNE 166 /* op1 = target JavaVM pc */
589 #define JAVA_GOTO 167
590 #define ICMD_GOTO 167 /* op1 = target JavaVM pc */
593 #define ICMD_JSR 168 /* op1 = target JavaVM pc */
596 #define ICMD_RET 169 /* op1 = local variable */
598 #define JAVA_TABLESWITCH 170
599 #define ICMD_TABLESWITCH 170 /* val.a = pointer to s4 table */
600 0, /* length must be computed */
601 #define JAVA_LOOKUPSWITCH 171
602 #define ICMD_LOOKUPSWITCH 171 /* val.a = pointer to s4 table */
603 0, /* length must be computed */
604 #define JAVA_IRETURN 172
605 #define ICMD_IRETURN 172
607 #define JAVA_LRETURN 173
608 #define ICMD_LRETURN 173
610 #define JAVA_FRETURN 174
611 #define ICMD_FRETURN 174
613 #define JAVA_DRETURN 175
614 #define ICMD_DRETURN 175
616 #define JAVA_ARETURN 176
617 #define ICMD_ARETURN 176
619 #define JAVA_RETURN 177
620 #define ICMD_RETURN 177
622 #define JAVA_GETSTATIC 178
623 #define ICMD_GETSTATIC 178 /* op1 = type, val.a = field address */
625 #define JAVA_PUTSTATIC 179
626 #define ICMD_PUTSTATIC 179 /* op1 = type, val.a = field address */
628 #define JAVA_GETFIELD 180
629 #define ICMD_GETFIELD 180 /* op1 = type, val.i = field offset */
631 #define JAVA_PUTFIELD 181
632 #define ICMD_PUTFIELD 181 /* op1 = type, val.i = field offset */
634 #define JAVA_INVOKEVIRTUAL 182
635 #define ICMD_INVOKEVIRTUAL 182 /* val.a = method info pointer */
637 #define JAVA_INVOKESPECIAL 183
638 #define ICMD_INVOKESPECIAL 183 /* val.a = method info pointer */
640 #define JAVA_INVOKESTATIC 184
641 #define ICMD_INVOKESTATIC 184 /* val.a = method info pointer */
643 #define JAVA_INVOKEINTERFACE 185
644 #define ICMD_INVOKEINTERFACE 185 /* val.a = method info pointer */
649 #define ICMD_NEW 187 /* op1 = 1, val.a = class pointer */
651 #define JAVA_NEWARRAY 188
652 #define ICMD_NEWARRAY 188 /* op1 = basic type */
654 #define JAVA_ANEWARRAY 189
655 #define ICMD_ANEWARRAY 189 /* op1 = 0, val.a = array pointer */
656 3, /* op1 = 1, val.a = class pointer */
657 #define JAVA_ARRAYLENGTH 190
658 #define ICMD_ARRAYLENGTH 190
660 #define JAVA_ATHROW 191
661 #define ICMD_ATHROW 191
663 #define JAVA_CHECKCAST 192
664 #define ICMD_CHECKCAST 192 /* op1 = 0, val.a = array pointer */
665 3, /* op1 = 1, val.a = class pointer */
666 #define JAVA_INSTANCEOF 193
667 #define ICMD_INSTANCEOF 193 /* op1 = 0, val.a = array pointer */
668 3, /* op1 = 1, val.a = class pointer */
669 #define JAVA_MONITORENTER 194
670 #define ICMD_MONITORENTER 194
672 #define JAVA_MONITOREXIT 195
673 #define ICMD_MONITOREXIT 195
675 #define JAVA_WIDE 196
676 0, /* length must be computed */
677 #define JAVA_MULTIANEWARRAY 197
678 #define ICMD_MULTIANEWARRAY 197 /* op1 = dimension, val.a = array */
680 #define JAVA_IFNULL 198
681 #define ICMD_IFNULL 198 /* op1 = target JavaVM pc */
683 #define JAVA_IFNONNULL 199
684 #define ICMD_IFNONNULL 199 /* op1 = target JavaVM pc */
686 #define JAVA_GOTO_W 200
688 #define JAVA_JSR_W 201
690 #define JAVA_BREAKPOINT 202
694 #define ICMD_IASTORECONST 204
696 #define ICMD_LASTORECONST 205
698 #define ICMD_FASTORECONST 206
700 #define ICMD_DASTORECONST 207
702 #define ICMD_AASTORECONST 208
704 #define ICMD_BASTORECONST 209
706 #define ICMD_CASTORECONST 210
708 #define ICMD_SASTORECONST 211
710 #define ICMD_PUTSTATICCONST 212
712 #define ICMD_PUTFIELDCONST 213
714 #define ICMD_IMULPOW2 214
716 #define ICMD_LMULPOW2 215
721 1,1,1,1,1,1,1,1,1,1,
722 1,1,1,1,1,1,1,1,1,1,
723 1,1,1,1,1,1,1,1,1,1,
728 char *icmd_names[256] = {
731 "CHECKNULL ", /* ICONST_M1 2 */
733 "UNDEF4 ", /* ICONST_1 4 */
734 "IDIVPOW2 ", /* ICONST_2 5 */
735 "LDIVPOW2 ", /* ICONST_3 6 */
736 "UNDEF7 ", /* ICONST_4 7 */
737 "UNDEF8 ", /* ICONST_5 8 */
739 "LCMPCONST ", /* LCONST_1 10 */
741 "UNDEF12 ", /* FCONST_1 12 */
742 "ELSE_ICONST ", /* FCONST_2 13 */
744 "IFEQ_ICONST ", /* DCONST_1 15 */
745 "IFNE_ICONST ", /* BIPUSH 16 */
746 "IFLT_ICONST ", /* SIPUSH 17 */
747 "IFGE_ICONST ", /* LDC1 18 */
748 "IFGT_ICONST ", /* LDC2 19 */
749 "IFLE_ICONST ", /* LDC2W 20 */
755 "IADDCONST ", /* ILOAD_0 26 */
756 "ISUBCONST ", /* ILOAD_1 27 */
757 "IMULCONST ", /* ILOAD_2 28 */
758 "IANDCONST ", /* ILOAD_3 29 */
759 "IORCONST ", /* LLOAD_0 30 */
760 "IXORCONST ", /* LLOAD_1 31 */
761 "ISHLCONST ", /* LLOAD_2 32 */
762 "ISHRCONST ", /* LLOAD_3 33 */
763 "IUSHRCONST ", /* FLOAD_0 34 */
764 "IREMPOW2 ", /* FLOAD_1 35 */
765 "LADDCONST ", /* FLOAD_2 36 */
766 "LSUBCONST ", /* FLOAD_3 37 */
767 "LMULCONST ", /* DLOAD_0 38 */
768 "LANDCONST ", /* DLOAD_1 39 */
769 "LORCONST ", /* DLOAD_2 40 */
770 "LXORCONST ", /* DLOAD_3 41 */
771 "LSHLCONST ", /* ALOAD_0 42 */
772 "LSHRCONST ", /* ALOAD_1 43 */
773 "LUSHRCONST ", /* ALOAD_2 44 */
774 "LREMPOW2 ", /* ALOAD_3 45 */
788 "IF_LEQ ", /* ISTORE_0 59 */
789 "IF_LNE ", /* ISTORE_1 60 */
790 "IF_LLT ", /* ISTORE_2 61 */
791 "IF_LGE ", /* ISTORE_3 62 */
792 "IF_LGT ", /* LSTORE_0 63 */
793 "IF_LLE ", /* LSTORE_1 64 */
794 "IF_LCMPEQ ", /* LSTORE_2 65 */
795 "IF_LCMPNE ", /* LSTORE_3 66 */
796 "IF_LCMPLT ", /* FSTORE_0 67 */
797 "IF_LCMPGE ", /* FSTORE_1 68 */
798 "IF_LCMPGT ", /* FSTORE_2 69 */
799 "IF_LCMPLE ", /* FSTORE_3 70 */
800 "UNDEF71 ", /* DSTORE_0 71 */
801 "UNDEF72 ", /* DSTORE_1 72 */
802 "UNDEF73 ", /* DSTORE_2 73 */
803 "UNDEF74 ", /* DSTORE_3 74 */
804 "UNDEF75 ", /* ASTORE_0 75 */
805 "UNDEF76 ", /* ASTORE_1 76 */
806 "UNDEF77 ", /* ASTORE_2 77 */
807 "UNDEF78 ", /* ASTORE_3 78 */
874 "INT2BYTE ", /* 145 */
875 "INT2CHAR ", /* 146 */
876 "INT2SHORT ", /* 147 */
888 "IF_ICMPEQ ", /* 159 */
889 "IF_ICMPNE ", /* 160 */
890 "IF_ICMPLT ", /* 161 */
891 "IF_ICMPGE ", /* 162 */
892 "IF_ICMPGT ", /* 163 */
893 "IF_ICMPLE ", /* 164 */
894 "IF_ACMPEQ ", /* 165 */
895 "IF_ACMPNE ", /* 166 */
899 "TABLESWITCH ", /* 170 */
900 "LOOKUPSWITCH ", /* 171 */
901 "IRETURN ", /* 172 */
902 "LRETURN ", /* 173 */
903 "FRETURN ", /* 174 */
904 "DRETURN ", /* 175 */
905 "ARETURN ", /* 176 */
907 "GETSTATIC ", /* 178 */
908 "PUTSTATIC ", /* 179 */
909 "GETFIELD ", /* 180 */
910 "PUTFIELD ", /* 181 */
911 "INVOKEVIRTUAL ", /* 182 */
912 "INVOKESPECIAL ", /* 183 */
913 "INVOKESTATIC ", /* 184 */
914 "INVOKEINTERFACE", /* 185 */
915 "UNDEF186 ", /* UNDEF186 186 */
917 "NEWARRAY ", /* 188 */
918 "ANEWARRAY ", /* 189 */
919 "ARRAYLENGTH ", /* 190 */
921 "CHECKCAST ", /* 192 */
922 "INSTANCEOF ", /* 193 */
923 "MONITORENTER ", /* 194 */
924 "MONITOREXIT ", /* 195 */
925 "UNDEF196 ", /* WIDE 196 */
926 "MULTIANEWARRAY ", /* 197 */
928 "IFNONNULL ", /* 199 */
929 "UNDEF200 ", /* GOTO_W 200 */
930 "UNDEF201 ", /* JSR_W 201 */
931 "UNDEF202 ", /* BREAKPOINT 202 */
932 "UNDEF203 ", /* UNDEF203 203 */
933 "IASTORECONST ", /* 204 */
934 "LASTORECONST ", /* 205 */
935 "FASTORECONST ", /* 206 */
936 "DASTORECONST ", /* 207 */
937 "AASTORECONST ", /* 208 */
938 "BASTORECONST ", /* 209 */
939 "CASTORECONST ", /* 210 */
940 "SASTORECONST ", /* 211 */
941 "PUTSTATICCONST ", /* 212 */
942 "PUTFIELDCONST ", /* 213 */
943 "IMULPOW2 ", /* 214 */
944 "LMULPOW2 ", /* 215 */
946 "UNDEF216", "UNDEF217", "UNDEF218", "UNDEF219", "UNDEF220",
947 "UNDEF221", "UNDEF222", "UNDEF223", "UNDEF224", "UNDEF225",
948 "UNDEF226", "UNDEF227", "UNDEF228", "UNDEF229", "UNDEF230",
949 "UNDEF231", "UNDEF232", "UNDEF233", "UNDEF234", "UNDEF235",
950 "UNDEF236", "UNDEF237", "UNDEF238", "UNDEF239", "UNDEF240",
951 "UNDEF241", "UNDEF242", "UNDEF243", "UNDEF244", "UNDEF245",
952 "UNDEF246", "UNDEF247", "UNDEF248", "UNDEF249", "UNDEF250",
954 "INLINE_START ", /* 251 */
955 "INLINE_END ", /* 252 */
957 "UNDEF253", "UNDEF254",
963 char *opcode_names[256] = {
966 "ICONST_M1 ", /* ICONST_M1 2 */
967 "ICONST_0 ", /* ICONST_0 3 */
968 "ICONST_1 ", /* ICONST_1 4 */
969 "ICONST_2 ", /* ICONST_2 5 */
970 "ICONST_3 ", /* ICONST_3 6 */
971 "ICONST_4 ", /* ICONST_4 7 */
972 "ICONST_5 ", /* ICONST_5 8 */
973 "LCONST_0 ", /* LCONST_0 9 */
974 "LCONST_1 ", /* LCONST_1 10 */
975 "FCONST_0 ", /* FCONST_0 11 */
976 "FCONST_1 ", /* FCONST_1 12 */
977 "FCONST_2 ", /* FCONST_2 13 */
978 "DCONST_0 ", /* DCONST_0 14 */
979 "DCONST_1 ", /* DCONST_1 15 */
980 "BIPUSH ", /* BIPUSH 16 */
981 "SIPUSH ", /* SIPUSH 17 */
983 "LDC_W ", /* LDC_W 19 */
984 "LDC2_W ", /* LDC2_W 20 */
990 "ILOAD_0 ", /* ILOAD_0 26 */
991 "ILOAD_1 ", /* ILOAD_1 27 */
992 "ILOAD_2 ", /* ILOAD_2 28 */
993 "ILOAD_3 ", /* ILOAD_3 29 */
994 "LLOAD_0 ", /* LLOAD_0 30 */
995 "LLOAD_1 ", /* LLOAD_1 31 */
996 "LLOAD_2 ", /* LLOAD_2 32 */
997 "LLOAD_3 ", /* LLOAD_3 33 */
998 "FLOAD_0 ", /* FLOAD_0 34 */
999 "FLOAD_1 ", /* FLOAD_1 35 */
1000 "FLOAD_2 ", /* FLOAD_2 36 */
1001 "FLOAD_3 ", /* FLOAD_3 37 */
1002 "DLOAD_0 ", /* DLOAD_0 38 */
1003 "DLOAD_1 ", /* DLOAD_1 39 */
1004 "DLOAD_2 ", /* DLOAD_2 40 */
1005 "DLOAD_3 ", /* DLOAD_3 41 */
1006 "ALOAD_0 ", /* ALOAD_0 42 */
1007 "ALOAD_1 ", /* ALOAD_1 43 */
1008 "ALOAD_2 ", /* ALOAD_2 44 */
1009 "ALOAD_3 ", /* ALOAD_3 45 */
1023 "ISTORE_0 ", /* ISTORE_0 59 */
1024 "ISTORE_1 ", /* ISTORE_1 60 */
1025 "ISTORE_2 ", /* ISTORE_2 61 */
1026 "ISTORE_3 ", /* ISTORE_3 62 */
1027 "LSTORE_0 ", /* LSTORE_0 63 */
1028 "LSTORE_1 ", /* LSTORE_1 64 */
1029 "LSTORE_2 ", /* LSTORE_2 65 */
1030 "LSTORE_3 ", /* LSTORE_3 66 */
1031 "FSTORE_0 ", /* FSTORE_0 67 */
1032 "FSTORE_1 ", /* FSTORE_1 68 */
1033 "FSTORE_2 ", /* FSTORE_2 69 */
1034 "FSTORE_3 ", /* FSTORE_3 70 */
1035 "DSTORE_0 ", /* DSTORE_0 71 */
1036 "DSTORE_1 ", /* DSTORE_1 72 */
1037 "DSTORE_2 ", /* DSTORE_2 73 */
1038 "DSTORE_3 ", /* DSTORE_3 74 */
1039 "ASTORE_0 ", /* ASTORE_0 75 */
1040 "ASTORE_1 ", /* ASTORE_1 76 */
1041 "ASTORE_2 ", /* ASTORE_2 77 */
1042 "ASTORE_3 ", /* ASTORE_3 78 */
1043 "IASTORE ", /* 79 */
1044 "LASTORE ", /* 80 */
1045 "FASTORE ", /* 81 */
1046 "DASTORE ", /* 82 */
1047 "AASTORE ", /* 83 */
1048 "BASTORE ", /* 84 */
1049 "CASTORE ", /* 85 */
1050 "SASTORE ", /* 86 */
1057 "DUP2_X1 ", /* 93 */
1058 "DUP2_X2 ", /* 94 */
1109 "INT2BYTE ", /* 145 */
1110 "INT2CHAR ", /* 146 */
1111 "INT2SHORT ", /* 147 */
1123 "IF_ICMPEQ ", /* 159 */
1124 "IF_ICMPNE ", /* 160 */
1125 "IF_ICMPLT ", /* 161 */
1126 "IF_ICMPGE ", /* 162 */
1127 "IF_ICMPGT ", /* 163 */
1128 "IF_ICMPLE ", /* 164 */
1129 "IF_ACMPEQ ", /* 165 */
1130 "IF_ACMPNE ", /* 166 */
1134 "TABLESWITCH ", /* 170 */
1135 "LOOKUPSWITCH ", /* 171 */
1136 "IRETURN ", /* 172 */
1137 "LRETURN ", /* 173 */
1138 "FRETURN ", /* 174 */
1139 "DRETURN ", /* 175 */
1140 "ARETURN ", /* 176 */
1141 "RETURN ", /* 177 */
1142 "GETSTATIC ", /* 178 */
1143 "PUTSTATIC ", /* 179 */
1144 "GETFIELD ", /* 180 */
1145 "PUTFIELD ", /* 181 */
1146 "INVOKEVIRTUAL ", /* 182 */
1147 "INVOKESPECIAL ", /* 183 */
1148 "INVOKESTATIC ", /* 184 */
1149 "INVOKEINTERFACE", /* 185 */
1150 "UNDEF186 ", /* 186 */
1152 "NEWARRAY ", /* 188 */
1153 "ANEWARRAY ", /* 189 */
1154 "ARRAYLENGTH ", /* 190 */
1155 "ATHROW ", /* 191 */
1156 "CHECKCAST ", /* 192 */
1157 "INSTANCEOF ", /* 193 */
1158 "MONITORENTER ", /* 194 */
1159 "MONITOREXIT ", /* 195 */
1160 "WIDE ", /* WIDE 196 */
1161 "MULTIANEWARRAY ", /* 197 */
1162 "IFNULL ", /* 198 */
1163 "IFNONNULL ", /* 199 */
1164 "GOTO_W ", /* GOTO_W 200 */
1165 "JSR_W ", /* JSR_W 201 */
1166 "BREAKPOINT ", /* BREAKPOINT 202 */
1168 "UNDEF203", "UNDEF204", "UNDEF205",
1169 "UNDEF206", "UNDEF207", "UNDEF208", "UNDEF209", "UNDEF210",
1170 "UNDEF211", "UNDEF212", "UNDEF213", "UNDEF214", "UNDEF215",
1171 "UNDEF216", "UNDEF217", "UNDEF218", "UNDEF219", "UNDEF220",
1172 "UNDEF221", "UNDEF222", "UNDEF223", "UNDEF224", "UNDEF225",
1173 "UNDEF226", "UNDEF227", "UNDEF228", "UNDEF229", "UNDEF230",
1174 "UNDEF231", "UNDEF232", "UNDEF233", "UNDEF234", "UNDEF235",
1175 "UNDEF236", "UNDEF237", "UNDEF238", "UNDEF239", "UNDEF240",
1176 "UNDEF241", "UNDEF242", "UNDEF243", "UNDEF244", "UNDEF245",
1177 "UNDEF246", "UNDEF247", "UNDEF248", "UNDEF249", "UNDEF250",
1178 "UNDEF251", "UNDEF252", "UNDEF253", "UNDEF254", "UNDEF255"
1182 /* jit_init ********************************************************************
1184 Initializes the JIT subsystem.
1186 *******************************************************************************/
1192 #if defined(__ALPHA__)
1193 has_ext_instr_set = ! has_no_x_instr_set();
1196 for (i = 0; i < 256; i++)
1199 stackreq[JAVA_NOP] = 0;
1200 stackreq[JAVA_ISTORE] = 0;
1201 stackreq[JAVA_LSTORE] = 0;
1202 stackreq[JAVA_FSTORE] = 0;
1203 stackreq[JAVA_DSTORE] = 0;
1204 stackreq[JAVA_ASTORE] = 0;
1205 stackreq[JAVA_ISTORE_0] = 0;
1206 stackreq[JAVA_ISTORE_1] = 0;
1207 stackreq[JAVA_ISTORE_2] = 0;
1208 stackreq[JAVA_ISTORE_3] = 0;
1209 stackreq[JAVA_LSTORE_0] = 0;
1210 stackreq[JAVA_LSTORE_1] = 0;
1211 stackreq[JAVA_LSTORE_2] = 0;
1212 stackreq[JAVA_LSTORE_3] = 0;
1213 stackreq[JAVA_FSTORE_0] = 0;
1214 stackreq[JAVA_FSTORE_1] = 0;
1215 stackreq[JAVA_FSTORE_2] = 0;
1216 stackreq[JAVA_FSTORE_3] = 0;
1217 stackreq[JAVA_DSTORE_0] = 0;
1218 stackreq[JAVA_DSTORE_1] = 0;
1219 stackreq[JAVA_DSTORE_2] = 0;
1220 stackreq[JAVA_DSTORE_3] = 0;
1221 stackreq[JAVA_ASTORE_0] = 0;
1222 stackreq[JAVA_ASTORE_1] = 0;
1223 stackreq[JAVA_ASTORE_2] = 0;
1224 stackreq[JAVA_ASTORE_3] = 0;
1225 stackreq[JAVA_IASTORE] = 0;
1226 stackreq[JAVA_LASTORE] = 0;
1227 stackreq[JAVA_FASTORE] = 0;
1228 stackreq[JAVA_DASTORE] = 0;
1229 stackreq[JAVA_AASTORE] = 0;
1230 stackreq[JAVA_BASTORE] = 0;
1231 stackreq[JAVA_CASTORE] = 0;
1232 stackreq[JAVA_SASTORE] = 0;
1233 stackreq[JAVA_POP] = 0;
1234 stackreq[JAVA_POP2] = 0;
1235 stackreq[JAVA_IFEQ] = 0;
1236 stackreq[JAVA_IFNE] = 0;
1237 stackreq[JAVA_IFLT] = 0;
1238 stackreq[JAVA_IFGE] = 0;
1239 stackreq[JAVA_IFGT] = 0;
1240 stackreq[JAVA_IFLE] = 0;
1241 stackreq[JAVA_IF_ICMPEQ] = 0;
1242 stackreq[JAVA_IF_ICMPNE] = 0;
1243 stackreq[JAVA_IF_ICMPLT] = 0;
1244 stackreq[JAVA_IF_ICMPGE] = 0;
1245 stackreq[JAVA_IF_ICMPGT] = 0;
1246 stackreq[JAVA_IF_ICMPLE] = 0;
1247 stackreq[JAVA_IF_ACMPEQ] = 0;
1248 stackreq[JAVA_IF_ACMPNE] = 0;
1249 stackreq[JAVA_GOTO] = 0;
1250 stackreq[JAVA_RET] = 0;
1251 stackreq[JAVA_TABLESWITCH] = 0;
1252 stackreq[JAVA_LOOKUPSWITCH] = 0;
1253 stackreq[JAVA_IRETURN] = 0;
1254 stackreq[JAVA_LRETURN] = 0;
1255 stackreq[JAVA_FRETURN] = 0;
1256 stackreq[JAVA_DRETURN] = 0;
1257 stackreq[JAVA_ARETURN] = 0;
1258 stackreq[JAVA_RETURN] = 0;
1259 stackreq[JAVA_PUTSTATIC] = 0;
1260 stackreq[JAVA_PUTFIELD] = 0;
1261 stackreq[JAVA_MONITORENTER] = 0;
1262 stackreq[JAVA_MONITOREXIT] = 0;
1263 stackreq[JAVA_WIDE] = 0;
1264 stackreq[JAVA_IFNULL] = 0;
1265 stackreq[JAVA_IFNONNULL] = 0;
1266 stackreq[JAVA_GOTO_W] = 0;
1267 stackreq[JAVA_BREAKPOINT] = 0;
1269 /* we need one dummy stack slot for IINC in order to */
1270 /* avoid that the modified local variable is */
1271 /* kept on the stack (see stack.c, ICMD_IINC) */
1272 stackreq[JAVA_IINC] = 1;
1274 stackreq[JAVA_SWAP] = 2;
1275 stackreq[JAVA_DUP2] = 2;
1276 stackreq[JAVA_DUP_X1] = 3;
1277 stackreq[JAVA_DUP_X2] = 4;
1278 stackreq[JAVA_DUP2_X1] = 3;
1279 stackreq[JAVA_DUP2_X2] = 4;
1281 /* initialize stack analysis subsystem */
1283 (void) stack_init();
1285 /* initialize codegen subsystem */
1291 /* jit_close *******************************************************************
1293 Close the JIT subsystem.
1295 *******************************************************************************/
1297 void jit_close(void)
1303 /* dummy function, used when there is no JavaVM code available */
1305 static u1 *do_nothing_function(void)
1311 /* jit_compile *****************************************************************
1313 jit_compile, new version of compiler, translates one method to machine code
1315 *******************************************************************************/
1317 static u1 *jit_compile_intern(methodinfo *m, codegendata *cd, registerdata *rd,
1318 loopdata *ld, t_inlining_globals *id);
1320 u1 *jit_compile(methodinfo *m)
1326 t_inlining_globals *id;
1329 #if defined(STATISTICS)
1334 #if defined(USE_THREADS)
1335 /* enter a monitor on the method */
1337 builtin_monitorenter((java_objectheader *) m);
1340 /* if method has been already compiled return immediately */
1342 if (m->entrypoint) {
1343 #if defined(USE_THREADS)
1344 builtin_monitorexit((java_objectheader *) m);
1347 return m->entrypoint;
1350 #if defined(STATISTICS)
1355 #if defined(STATISTICS)
1358 if (getcompilingtime)
1359 compilingtime_start();
1362 /* mark start of dump memory area */
1364 dumpsize = dump_size();
1366 /* allocate memory */
1368 cd = DNEW(codegendata);
1369 rd = DNEW(registerdata);
1370 ld = DNEW(loopdata);
1371 id = DNEW(t_inlining_globals);
1373 #if defined(USE_INLINING)
1374 /* RTA static analysis must be called before inlining */
1376 RT_jit_parse(m); /* will be called just once */
1377 /* return value ignored for now */
1378 /* XTA static analysis must be called before inlining */
1380 XTA_jit_parse(m); /* will be called just once */
1381 /* return value ignored for now */
1383 /* must be called before reg_setup, because it can change maxlocals */
1384 /* init reqd to initialize for parse even in no inlining */
1385 inlining_setup(m, id);
1388 #if defined(ENABLE_JIT)
1389 # if defined(ENABLE_INTRP)
1392 /* initialize the register allocator */
1393 reg_setup(m, rd, id);
1396 /* setup the codegendata memory */
1397 codegen_setup(m, cd, id);
1399 /* now call internal compile function */
1401 r = jit_compile_intern(m, cd, rd, ld, id);
1403 /* free some memory */
1405 #if defined(ENABLE_JIT)
1406 # if defined(ENABLE_INTRP)
1409 codegen_free(m, cd);
1412 /* clear pointers to dump memory area */
1414 m->basicblocks = NULL;
1415 m->basicblockindex = NULL;
1416 m->instructions = NULL;
1418 /* NO !!! m->exceptiontable = NULL; */
1420 /* release dump area */
1422 dump_release(dumpsize);
1424 #if defined(STATISTICS)
1427 if (getcompilingtime)
1428 compilingtime_stop();
1431 /* define in options.h; Used in main.c, jit.c & inline.c */
1433 if ((utf_new_char("main") == m->name) && (useinliningm))
1434 useinlining = false;
1437 #if defined(USE_THREADS)
1438 /* leave the monitor */
1440 builtin_monitorexit((java_objectheader *) m );
1445 log_message_method("Running: ", m);
1448 /* return pointer to the methods entry point */
1454 /* jit_compile_intern **********************************************************
1456 Static internal function which does the actual compilation.
1458 *******************************************************************************/
1460 static u1 *jit_compile_intern(methodinfo *m, codegendata *cd, registerdata *rd,
1461 loopdata *ld, t_inlining_globals *id)
1463 /* print log message for compiled method */
1466 log_message_method("Compiling: ", m);
1468 /* initialize the static function's class */
1470 if ((m->flags & ACC_STATIC) && !m->class->initialized) {
1472 log_message_class("Initialize class ", m->class);
1474 if (!initialize_class(m->class))
1478 /* handle native methods and create a native stub */
1480 if (m->flags & ACC_NATIVE) {
1483 #if defined(ENABLE_STATICVM)
1484 f = native_findfunction(m->class->name, m->name, m->descriptor,
1485 (m->flags & ACC_STATIC));
1493 m->entrypoint = codegen_createnativestub(f, m);
1495 return m->entrypoint;
1498 /* if there is no javacode, print error message and return empty method */
1502 log_message_method("No code given for: ", m);
1504 m->entrypoint = (u1 *) (ptrint) do_nothing_function;
1506 return m->entrypoint; /* return empty method */
1509 /* initialisation of variables and subsystems */
1511 m->isleafmethod = true;
1513 #if defined(STATISTICS)
1515 count_tryblocks += m->exceptiontablelength;
1516 count_javacodesize += m->jcodelength + 18;
1517 count_javaexcsize += m->exceptiontablelength * SIZEOF_VOID_P;
1521 /* initialise parameter type descriptor */
1523 method_descriptor2types(m);
1525 /* call the compiler passes ***********************************************/
1528 log_message_method("Parsing: ", m);
1530 /* call parse pass */
1532 if (!parse(m, cd, id)) {
1534 log_message_method("Exception while parsing: ", m);
1539 if (compileverbose) {
1540 log_message_method("Parsing done: ", m);
1541 log_message_method("Analysing: ", m);
1544 /* call stack analysis pass */
1546 if (!analyse_stack(m, cd, rd)) {
1548 log_message_method("Exception while analysing: ", m);
1554 log_message_method("Analysing done: ", m);
1556 #ifdef CACAO_TYPECHECK
1559 log_message_method("Typechecking: ", m);
1561 /* call typecheck pass */
1562 if (!typecheck(m, cd, rd)) {
1564 log_message_method("Exception while typechecking: ", m);
1570 log_message_method("Typechecking done: ", m);
1576 analyseGraph(m, ld);
1577 optimize_loops(m, cd, ld);
1580 #if defined(ENABLE_JIT)
1581 # if defined(ENABLE_INTRP)
1585 log_message_method("Allocating registers: ", m);
1587 /* allocate registers */
1590 lsra(m, cd, rd, id);
1592 if (opt_stat) count_methods_allocated_by_lsra++;
1599 count_locals_conflicts += (cd->maxlocals-1)*(cd->maxlocals);
1601 regalloc(m, cd, rd);
1606 reg_make_statistics(m, cd, rd);
1610 log_message_method("Allocating registers done: ", m);
1611 # if defined(ENABLE_INTRP)
1614 #endif /* defined(ENABLE_JIT) */
1617 log_message_method("Generating code: ", m);
1619 /* now generate the machine code */
1621 if (!codegen(m, cd, rd)) {
1623 log_message_method("Exception while generating code: ", m);
1629 log_message_method("Generating code done: ", m);
1631 /* intermediate and assembly code listings */
1633 if (opt_showintermediate) {
1634 show_icmd_method(m, cd, rd);
1636 } else if (opt_showdisassemble) {
1637 disassemble((u1 *) (ptrint) m->entrypoint,
1638 (u1 *) (ptrint) m->entrypoint + (m->mcodelength - cd->dseglen));
1641 if (opt_showddatasegment)
1642 dseg_display(m, cd);
1645 log_message_method("Compiling done: ", m);
1647 /* return pointer to the methods entry point */
1649 return m->entrypoint;
1654 * These are local overrides for various environment variables in Emacs.
1655 * Please do not remove this and leave it at the end of the file, where
1656 * Emacs will automagically detect them.
1657 * ---------------------------------------------------------------------
1660 * indent-tabs-mode: t