1 /* 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
32 $Id: jit.c 1953 2005-02-17 13:42:23Z christian $
42 #include "mm/memory.h"
43 #include "toolbox/logging.h"
44 #include "vm/builtin.h"
45 #include "vm/global.h"
46 #include "vm/loader.h"
47 #include "vm/options.h"
48 #include "vm/statistics.h"
49 #include "vm/tables.h"
50 #include "vm/jit/codegen.inc.h"
51 #include "vm/jit/jit.h"
53 #include "vm/jit/lsra.h"
55 #include "vm/jit/parse.h"
56 #include "vm/jit/reg.h"
57 #include "vm/jit/stack.h"
58 #include "vm/jit/inline/inline.h"
59 #include "vm/jit/inline/parseRT.h"
60 #include "vm/jit/inline/parseXTA.h"
61 #include "vm/jit/loop/analyze.h"
62 #include "vm/jit/loop/graph.h"
63 #include "vm/jit/loop/loop.h"
64 #include "vm/jit/verify/typecheck.h"
66 #if defined(USE_THREADS)
67 # if defined(NATIVE_THREADS)
68 # include "threads/native/threads.h"
70 # include "threads/green/threads.h"
76 /* global switches ************************************************************/
81 int jcommandsize[256] = {
86 #define JAVA_ACONST_NULL 1
87 #define ICMD_ACONST 1 /* val.a = constant */
89 #define JAVA_ICONST_M1 2
90 #define ICMD_NULLCHECKPOP 2
92 #define JAVA_ICONST_0 3
93 #define ICMD_ICONST 3 /* val.i = constant */
95 #define JAVA_ICONST_1 4
97 #define JAVA_ICONST_2 5
98 #define ICMD_IDIVPOW2 5 /* val.i = constant */
100 #define JAVA_ICONST_3 6
101 #define ICMD_LDIVPOW2 6 /* val.l = constant */
103 #define JAVA_ICONST_4 7
105 #define JAVA_ICONST_5 8
107 #define JAVA_LCONST_0 9
108 #define ICMD_LCONST 9 /* val.l = constant */
110 #define JAVA_LCONST_1 10
111 #define ICMD_LCMPCONST 10 /* val.l = constant */
113 #define JAVA_FCONST_0 11
114 #define ICMD_FCONST 11 /* val.f = constant */
116 #define JAVA_FCONST_1 12
118 #define JAVA_FCONST_2 13
119 #define ICMD_ELSE_ICONST 13
121 #define JAVA_DCONST_0 14
122 #define ICMD_DCONST 14 /* val.d = constant */
124 #define JAVA_DCONST_1 15
125 #define ICMD_IFEQ_ICONST 15
127 #define JAVA_BIPUSH 16
128 #define ICMD_IFNE_ICONST 16
130 #define JAVA_SIPUSH 17
131 #define ICMD_IFLT_ICONST 17
134 #define ICMD_IFGE_ICONST 18
137 #define ICMD_IFGT_ICONST 19
139 #define JAVA_LDC2W 20
140 #define ICMD_IFLE_ICONST 20
142 /* order of LOAD instructions must be */
143 /* equal to order of TYPE_XXX defines */
144 #define JAVA_ILOAD 21
145 #define ICMD_ILOAD 21 /* op1 = local variable */
147 #define JAVA_LLOAD 22
148 #define ICMD_LLOAD 22 /* op1 = local variable */
150 #define JAVA_FLOAD 23
151 #define ICMD_FLOAD 23 /* op1 = local variable */
153 #define JAVA_DLOAD 24
154 #define ICMD_DLOAD 24 /* op1 = local variable */
156 #define JAVA_ALOAD 25
157 #define ICMD_ALOAD 25 /* op1 = local variable */
159 #define JAVA_ILOAD_0 26
160 #define ICMD_IADDCONST 26 /* val.i = constant */
162 #define JAVA_ILOAD_1 27
163 #define ICMD_ISUBCONST 27 /* val.i = constant */
165 #define JAVA_ILOAD_2 28
166 #define ICMD_IMULCONST 28 /* val.i = constant */
168 #define JAVA_ILOAD_3 29
169 #define ICMD_IANDCONST 29 /* val.i = constant */
171 #define JAVA_LLOAD_0 30
172 #define ICMD_IORCONST 30 /* val.i = constant */
174 #define JAVA_LLOAD_1 31
175 #define ICMD_IXORCONST 31 /* val.i = constant */
177 #define JAVA_LLOAD_2 32
178 #define ICMD_ISHLCONST 32 /* val.i = constant */
180 #define JAVA_LLOAD_3 33
181 #define ICMD_ISHRCONST 33 /* val.i = constant */
183 #define JAVA_FLOAD_0 34
184 #define ICMD_IUSHRCONST 34 /* val.i = constant */
186 #define JAVA_FLOAD_1 35
187 #define ICMD_IREMPOW2 35 /* val.i = constant */
189 #define JAVA_FLOAD_2 36
190 #define ICMD_LADDCONST 36 /* val.l = constant */
192 #define JAVA_FLOAD_3 37
193 #define ICMD_LSUBCONST 37 /* val.l = constant */
195 #define JAVA_DLOAD_0 38
196 #define ICMD_LMULCONST 38 /* val.l = constant */
198 #define JAVA_DLOAD_1 39
199 #define ICMD_LANDCONST 39 /* val.l = constant */
201 #define JAVA_DLOAD_2 40
202 #define ICMD_LORCONST 40 /* val.l = constant */
204 #define JAVA_DLOAD_3 41
205 #define ICMD_LXORCONST 41 /* val.l = constant */
207 #define JAVA_ALOAD_0 42
208 #define ICMD_LSHLCONST 42 /* val.l = constant */
210 #define JAVA_ALOAD_1 43
211 #define ICMD_LSHRCONST 43 /* val.l = constant */
213 #define JAVA_ALOAD_2 44
214 #define ICMD_LUSHRCONST 44 /* val.l = constant */
216 #define JAVA_ALOAD_3 45
217 #define ICMD_LREMPOW2 45 /* val.l = constant */
219 #define JAVA_IALOAD 46
220 #define ICMD_IALOAD 46
222 #define JAVA_LALOAD 47
223 #define ICMD_LALOAD 47
225 #define JAVA_FALOAD 48
226 #define ICMD_FALOAD 48
228 #define JAVA_DALOAD 49
229 #define ICMD_DALOAD 49
231 #define JAVA_AALOAD 50
232 #define ICMD_AALOAD 50
234 #define JAVA_BALOAD 51
235 #define ICMD_BALOAD 51
237 #define JAVA_CALOAD 52
238 #define ICMD_CALOAD 52
240 #define JAVA_SALOAD 53
241 #define ICMD_SALOAD 53
243 /* order of STORE instructions must be*/
244 /* equal to order of TYPE_XXX defines */
245 #define JAVA_ISTORE 54
246 #define ICMD_ISTORE 54 /* op1 = local variable */
248 #define JAVA_LSTORE 55
249 #define ICMD_LSTORE 55 /* op1 = local variable */
251 #define JAVA_FSTORE 56
252 #define ICMD_FSTORE 56 /* op1 = local variable */
254 #define JAVA_DSTORE 57
255 #define ICMD_DSTORE 57 /* op1 = local variable */
257 #define JAVA_ASTORE 58
258 #define ICMD_ASTORE 58 /* op1 = local variable */
260 #define JAVA_ISTORE_0 59
261 #define ICMD_IF_LEQ 59 /* op1 = target JavaVM pc, val.l */
263 #define JAVA_ISTORE_1 60
264 #define ICMD_IF_LNE 60 /* op1 = target JavaVM pc, val.l */
266 #define JAVA_ISTORE_2 61
267 #define ICMD_IF_LLT 61 /* op1 = target JavaVM pc, val.l */
269 #define JAVA_ISTORE_3 62
270 #define ICMD_IF_LGE 62 /* op1 = target JavaVM pc, val.l */
272 #define JAVA_LSTORE_0 63
273 #define ICMD_IF_LGT 63 /* op1 = target JavaVM pc, val.l */
275 #define JAVA_LSTORE_1 64
276 #define ICMD_IF_LLE 64 /* op1 = target JavaVM pc, val.l */
278 #define JAVA_LSTORE_2 65
279 #define ICMD_IF_LCMPEQ 65 /* op1 = target JavaVM pc */
281 #define JAVA_LSTORE_3 66
282 #define ICMD_IF_LCMPNE 66 /* op1 = target JavaVM pc */
284 #define JAVA_FSTORE_0 67
285 #define ICMD_IF_LCMPLT 67 /* op1 = target JavaVM pc */
287 #define JAVA_FSTORE_1 68
288 #define ICMD_IF_LCMPGE 68 /* op1 = target JavaVM pc */
290 #define JAVA_FSTORE_2 69
291 #define ICMD_IF_LCMPGT 69 /* op1 = target JavaVM pc */
293 #define JAVA_FSTORE_3 70
294 #define ICMD_IF_LCMPLE 70 /* op1 = target JavaVM pc */
296 #define JAVA_DSTORE_0 71
298 #define JAVA_DSTORE_1 72
300 #define JAVA_DSTORE_2 73
302 #define JAVA_DSTORE_3 74
304 #define JAVA_ASTORE_0 75
306 #define JAVA_ASTORE_1 76
308 #define JAVA_ASTORE_2 77
310 #define JAVA_ASTORE_3 78
312 #define JAVA_IASTORE 79
313 #define ICMD_IASTORE 79
315 #define JAVA_LASTORE 80
316 #define ICMD_LASTORE 80
318 #define JAVA_FASTORE 81
319 #define ICMD_FASTORE 81
321 #define JAVA_DASTORE 82
322 #define ICMD_DASTORE 82
324 #define JAVA_AASTORE 83
325 #define ICMD_AASTORE 83
327 #define JAVA_BASTORE 84
328 #define ICMD_BASTORE 84
330 #define JAVA_CASTORE 85
331 #define ICMD_CASTORE 85
333 #define JAVA_SASTORE 86
334 #define ICMD_SASTORE 86
345 #define JAVA_DUP_X1 90
346 #define ICMD_DUP_X1 90
348 #define JAVA_DUP_X2 91
349 #define ICMD_DUP_X2 91
354 #define JAVA_DUP2_X1 93
355 #define ICMD_DUP2_X1 93
357 #define JAVA_DUP2_X2 94
358 #define ICMD_DUP2_X2 94
375 #define JAVA_ISUB 100
376 #define ICMD_ISUB 100
378 #define JAVA_LSUB 101
379 #define ICMD_LSUB 101
381 #define JAVA_FSUB 102
382 #define ICMD_FSUB 102
384 #define JAVA_DSUB 103
385 #define ICMD_DSUB 103
387 #define JAVA_IMUL 104
388 #define ICMD_IMUL 104
390 #define JAVA_LMUL 105
391 #define ICMD_LMUL 105
393 #define JAVA_FMUL 106
394 #define ICMD_FMUL 106
396 #define JAVA_DMUL 107
397 #define ICMD_DMUL 107
399 #define JAVA_IDIV 108
400 #define ICMD_IDIV 108
402 #define JAVA_LDIV 109
403 #define ICMD_LDIV 109
405 #define JAVA_FDIV 110
406 #define ICMD_FDIV 110
408 #define JAVA_DDIV 111
409 #define ICMD_DDIV 111
411 #define JAVA_IREM 112
412 #define ICMD_IREM 112
414 #define JAVA_LREM 113
415 #define ICMD_LREM 113
417 #define JAVA_FREM 114
418 #define ICMD_FREM 114
420 #define JAVA_DREM 115
421 #define ICMD_DREM 115
423 #define JAVA_INEG 116
424 #define ICMD_INEG 116
426 #define JAVA_LNEG 117
427 #define ICMD_LNEG 117
429 #define JAVA_FNEG 118
430 #define ICMD_FNEG 118
432 #define JAVA_DNEG 119
433 #define ICMD_DNEG 119
435 #define JAVA_ISHL 120
436 #define ICMD_ISHL 120
438 #define JAVA_LSHL 121
439 #define ICMD_LSHL 121
441 #define JAVA_ISHR 122
442 #define ICMD_ISHR 122
444 #define JAVA_LSHR 123
445 #define ICMD_LSHR 123
447 #define JAVA_IUSHR 124
448 #define ICMD_IUSHR 124
450 #define JAVA_LUSHR 125
451 #define ICMD_LUSHR 125
453 #define JAVA_IAND 126
454 #define ICMD_IAND 126
456 #define JAVA_LAND 127
457 #define ICMD_LAND 127
465 #define JAVA_IXOR 130
466 #define ICMD_IXOR 130
468 #define JAVA_LXOR 131
469 #define ICMD_LXOR 131
471 #define JAVA_IINC 132
472 #define ICMD_IINC 132 /* op1 = local variable, val.i = constant */
510 #define JAVA_INT2BYTE 145
511 #define ICMD_INT2BYTE 145
513 #define JAVA_INT2CHAR 146
514 #define ICMD_INT2CHAR 146
516 #define JAVA_INT2SHORT 147
517 #define ICMD_INT2SHORT 147
519 #define JAVA_LCMP 148
520 #define ICMD_LCMP 148
522 #define JAVA_FCMPL 149
523 #define ICMD_FCMPL 149
525 #define JAVA_FCMPG 150
526 #define ICMD_FCMPG 150
528 #define JAVA_DCMPL 151
529 #define ICMD_DCMPL 151
531 #define JAVA_DCMPG 152
532 #define ICMD_DCMPG 152
534 #define JAVA_IFEQ 153
535 #define ICMD_IFEQ 153 /* op1 = target JavaVM pc, val.i */
537 #define JAVA_IFNE 154
538 #define ICMD_IFNE 154 /* op1 = target JavaVM pc, val.i */
540 #define JAVA_IFLT 155
541 #define ICMD_IFLT 155 /* op1 = target JavaVM pc, val.i */
543 #define JAVA_IFGE 156
544 #define ICMD_IFGE 156 /* op1 = target JavaVM pc, val.i */
546 #define JAVA_IFGT 157
547 #define ICMD_IFGT 157 /* op1 = target JavaVM pc, val.i */
549 #define JAVA_IFLE 158
550 #define ICMD_IFLE 158 /* op1 = target JavaVM pc, val.i */
552 #define JAVA_IF_ICMPEQ 159
553 #define ICMD_IF_ICMPEQ 159 /* op1 = target JavaVM pc */
555 #define JAVA_IF_ICMPNE 160
556 #define ICMD_IF_ICMPNE 160 /* op1 = target JavaVM pc */
558 #define JAVA_IF_ICMPLT 161
559 #define ICMD_IF_ICMPLT 161 /* op1 = target JavaVM pc */
561 #define JAVA_IF_ICMPGE 162
562 #define ICMD_IF_ICMPGE 162 /* op1 = target JavaVM pc */
564 #define JAVA_IF_ICMPGT 163
565 #define ICMD_IF_ICMPGT 163 /* op1 = target JavaVM pc */
567 #define JAVA_IF_ICMPLE 164
568 #define ICMD_IF_ICMPLE 164 /* op1 = target JavaVM pc */
570 #define JAVA_IF_ACMPEQ 165
571 #define ICMD_IF_ACMPEQ 165 /* op1 = target JavaVM pc */
573 #define JAVA_IF_ACMPNE 166
574 #define ICMD_IF_ACMPNE 166 /* op1 = target JavaVM pc */
576 #define JAVA_GOTO 167
577 #define ICMD_GOTO 167 /* op1 = target JavaVM pc */
580 #define ICMD_JSR 168 /* op1 = target JavaVM pc */
583 #define ICMD_RET 169 /* op1 = local variable */
585 #define JAVA_TABLESWITCH 170
586 #define ICMD_TABLESWITCH 170 /* val.a = pointer to s4 table */
587 0, /* length must be computed */
588 #define JAVA_LOOKUPSWITCH 171
589 #define ICMD_LOOKUPSWITCH 171 /* val.a = pointer to s4 table */
590 0, /* length must be computed */
591 #define JAVA_IRETURN 172
592 #define ICMD_IRETURN 172
594 #define JAVA_LRETURN 173
595 #define ICMD_LRETURN 173
597 #define JAVA_FRETURN 174
598 #define ICMD_FRETURN 174
600 #define JAVA_DRETURN 175
601 #define ICMD_DRETURN 175
603 #define JAVA_ARETURN 176
604 #define ICMD_ARETURN 176
606 #define JAVA_RETURN 177
607 #define ICMD_RETURN 177
609 #define JAVA_GETSTATIC 178
610 #define ICMD_GETSTATIC 178 /* op1 = type, val.a = field address */
612 #define JAVA_PUTSTATIC 179
613 #define ICMD_PUTSTATIC 179 /* op1 = type, val.a = field address */
615 #define JAVA_GETFIELD 180
616 #define ICMD_GETFIELD 180 /* op1 = type, val.i = field offset */
618 #define JAVA_PUTFIELD 181
619 #define ICMD_PUTFIELD 181 /* op1 = type, val.i = field offset */
621 #define JAVA_INVOKEVIRTUAL 182
622 #define ICMD_INVOKEVIRTUAL 182 /* val.a = method info pointer */
624 #define JAVA_INVOKESPECIAL 183
625 #define ICMD_INVOKESPECIAL 183 /* val.a = method info pointer */
627 #define JAVA_INVOKESTATIC 184
628 #define ICMD_INVOKESTATIC 184 /* val.a = method info pointer */
630 #define JAVA_INVOKEINTERFACE 185
631 #define ICMD_INVOKEINTERFACE 185 /* val.a = method info pointer */
633 #define ICMD_CHECKASIZE 186 /* */
636 #define ICMD_NEW 187 /* op1 = 1, val.a = class pointer */
638 #define JAVA_NEWARRAY 188
639 #define ICMD_NEWARRAY 188 /* op1 = basic type */
641 #define JAVA_ANEWARRAY 189
642 #define ICMD_ANEWARRAY 189 /* op1 = 0, val.a = array pointer */
643 3, /* op1 = 1, val.a = class pointer */
644 #define JAVA_ARRAYLENGTH 190
645 #define ICMD_ARRAYLENGTH 190
647 #define JAVA_ATHROW 191
648 #define ICMD_ATHROW 191
650 #define JAVA_CHECKCAST 192
651 #define ICMD_CHECKCAST 192 /* op1 = 0, val.a = array pointer */
652 3, /* op1 = 1, val.a = class pointer */
653 #define JAVA_INSTANCEOF 193
654 #define ICMD_INSTANCEOF 193 /* op1 = 0, val.a = array pointer */
655 3, /* op1 = 1, val.a = class pointer */
656 #define JAVA_MONITORENTER 194
657 #define ICMD_MONITORENTER 194
659 #define JAVA_MONITOREXIT 195
660 #define ICMD_MONITOREXIT 195
662 #define JAVA_WIDE 196
663 0, /* length must be computed */
664 #define JAVA_MULTIANEWARRAY 197
665 #define ICMD_MULTIANEWARRAY 197 /* op1 = dimension, val.a = array */
667 #define JAVA_IFNULL 198
668 #define ICMD_IFNULL 198 /* op1 = target JavaVM pc */
670 #define JAVA_IFNONNULL 199
671 #define ICMD_IFNONNULL 199 /* op1 = target JavaVM pc */
673 #define JAVA_GOTO_W 200
675 #define JAVA_JSR_W 201
677 #define JAVA_BREAKPOINT 202
679 #define ICMD_CHECKEXCEPTION 203
681 #define ICMD_IASTORECONST 204
683 #define ICMD_LASTORECONST 205
685 #define ICMD_FASTORECONST 206
687 #define ICMD_DASTORECONST 207
689 #define ICMD_AASTORECONST 208
691 #define ICMD_BASTORECONST 209
693 #define ICMD_CASTORECONST 210
695 #define ICMD_SASTORECONST 211
700 1,1,1,1,1,1,1,1,1,1,
701 1,1,1,1,1,1,1,1,1,1,
702 1,1,1,1,1,1,1,1,1,1,
707 char *icmd_names[256] = {
710 "NULLCHECKPOP ", /* ICONST_M1 2 */
712 "UNDEF4 ", /* ICONST_1 4 */
713 "IDIVPOW2 ", /* ICONST_2 5 */
714 "LDIVPOW2 ", /* ICONST_3 6 */
715 "UNDEF7 ", /* ICONST_4 7 */
716 "UNDEF8 ", /* ICONST_5 8 */
718 "LCMPCONST ", /* LCONST_1 10 */
720 "UNDEF12 ", /* FCONST_1 12 */
721 "ELSE_ICONST ", /* FCONST_2 13 */
723 "IFEQ_ICONST ", /* DCONST_1 15 */
724 "IFNE_ICONST ", /* BIPUSH 16 */
725 "IFLT_ICONST ", /* SIPUSH 17 */
726 "IFGE_ICONST ", /* LDC1 18 */
727 "IFGT_ICONST ", /* LDC2 19 */
728 "IFLE_ICONST ", /* LDC2W 20 */
734 "IADDCONST ", /* ILOAD_0 26 */
735 "ISUBCONST ", /* ILOAD_1 27 */
736 "IMULCONST ", /* ILOAD_2 28 */
737 "IANDCONST ", /* ILOAD_3 29 */
738 "IORCONST ", /* LLOAD_0 30 */
739 "IXORCONST ", /* LLOAD_1 31 */
740 "ISHLCONST ", /* LLOAD_2 32 */
741 "ISHRCONST ", /* LLOAD_3 33 */
742 "IUSHRCONST ", /* FLOAD_0 34 */
743 "IREMPOW2 ", /* FLOAD_1 35 */
744 "LADDCONST ", /* FLOAD_2 36 */
745 "LSUBCONST ", /* FLOAD_3 37 */
746 "LMULCONST ", /* DLOAD_0 38 */
747 "LANDCONST ", /* DLOAD_1 39 */
748 "LORCONST ", /* DLOAD_2 40 */
749 "LXORCONST ", /* DLOAD_3 41 */
750 "LSHLCONST ", /* ALOAD_0 42 */
751 "LSHRCONST ", /* ALOAD_1 43 */
752 "LUSHRCONST ", /* ALOAD_2 44 */
753 "LREMPOW2 ", /* ALOAD_3 45 */
767 "IF_LEQ ", /* ISTORE_0 59 */
768 "IF_LNE ", /* ISTORE_1 60 */
769 "IF_LLT ", /* ISTORE_2 61 */
770 "IF_LGE ", /* ISTORE_3 62 */
771 "IF_LGT ", /* LSTORE_0 63 */
772 "IF_LLE ", /* LSTORE_1 64 */
773 "IF_LCMPEQ ", /* LSTORE_2 65 */
774 "IF_LCMPNE ", /* LSTORE_3 66 */
775 "IF_LCMPLT ", /* FSTORE_0 67 */
776 "IF_LCMPGE ", /* FSTORE_1 68 */
777 "IF_LCMPGT ", /* FSTORE_2 69 */
778 "IF_LCMPLE ", /* FSTORE_3 70 */
779 "UNDEF71 ", /* DSTORE_0 71 */
780 "UNDEF72 ", /* DSTORE_1 72 */
781 "UNDEF73 ", /* DSTORE_2 73 */
782 "UNDEF74 ", /* DSTORE_3 74 */
783 "UNDEF75 ", /* ASTORE_0 75 */
784 "UNDEF76 ", /* ASTORE_1 76 */
785 "UNDEF77 ", /* ASTORE_2 77 */
786 "UNDEF78 ", /* ASTORE_3 78 */
853 "INT2BYTE ", /* 145 */
854 "INT2CHAR ", /* 146 */
855 "INT2SHORT ", /* 147 */
867 "IF_ICMPEQ ", /* 159 */
868 "IF_ICMPNE ", /* 160 */
869 "IF_ICMPLT ", /* 161 */
870 "IF_ICMPGE ", /* 162 */
871 "IF_ICMPGT ", /* 163 */
872 "IF_ICMPLE ", /* 164 */
873 "IF_ACMPEQ ", /* 165 */
874 "IF_ACMPNE ", /* 166 */
878 "TABLESWITCH ", /* 170 */
879 "LOOKUPSWITCH ", /* 171 */
880 "IRETURN ", /* 172 */
881 "LRETURN ", /* 173 */
882 "FRETURN ", /* 174 */
883 "DRETURN ", /* 175 */
884 "ARETURN ", /* 176 */
886 "GETSTATIC ", /* 178 */
887 "PUTSTATIC ", /* 179 */
888 "GETFIELD ", /* 180 */
889 "PUTFIELD ", /* 181 */
890 "INVOKEVIRTUAL ", /* 182 */
891 "INVOKESPECIAL ", /* 183 */
892 "INVOKESTATIC ", /* 184 */
893 "INVOKEINTERFACE", /* 185 */
894 "CHECKASIZE ", /* UNDEF186 186 */
896 "NEWARRAY ", /* 188 */
897 "ANEWARRAY ", /* 189 */
898 "ARRAYLENGTH ", /* 190 */
900 "CHECKCAST ", /* 192 */
901 "INSTANCEOF ", /* 193 */
902 "MONITORENTER ", /* 194 */
903 "MONITOREXIT ", /* 195 */
904 "UNDEF196 ", /* WIDE 196 */
905 "MULTIANEWARRAY ", /* 197 */
907 "IFNONNULL ", /* 199 */
908 "UNDEF200 ", /* GOTO_W 200 */
909 "UNDEF201 ", /* JSR_W 201 */
910 "UNDEF202 ", /* BREAKPOINT 202 */
911 "CHECKEXCEPTION ", /* UNDEF203 203 */
912 "IASTORECONST ", /* 204 */
913 "LASTORECONST ", /* 205 */
914 "FASTORECONST ", /* 206 */
915 "DASTORECONST ", /* 207 */
916 "AASTORECONST ", /* 208 */
917 "BASTORECONST ", /* 209 */
918 "CASTORECONST ", /* 210 */
919 "SASTORECONST ", /* 211 */
921 "UNDEF212", "UNDEF213", "UNDEF214", "UNDEF215",
922 "UNDEF216", "UNDEF217", "UNDEF218", "UNDEF219", "UNDEF220",
923 "UNDEF221", "UNDEF222", "UNDEF223", "UNDEF224", "UNDEF225",
924 "UNDEF226", "UNDEF227", "UNDEF228", "UNDEF229", "UNDEF230",
925 "UNDEF231", "UNDEF232", "UNDEF233", "UNDEF234", "UNDEF235",
926 "UNDEF236", "UNDEF237", "UNDEF238", "UNDEF239", "UNDEF240",
927 "UNDEF241", "UNDEF242", "UNDEF243", "UNDEF244", "UNDEF245",
928 "UNDEF246", "UNDEF247", "UNDEF248", "UNDEF249", "UNDEF250",
930 "INLINE_START ", /* 251 */
931 "INLINE_END ", /* 252 */
933 "BUILTIN3 ", /* 253 */
934 "BUILTIN2 ", /* 254 */
935 "BUILTIN1 " /* 255 */
939 char *opcode_names[256] = {
942 "ICONST_M1 ", /* ICONST_M1 2 */
943 "ICONST_0 ", /* ICONST_0 3 */
944 "ICONST_1 ", /* ICONST_1 4 */
945 "ICONST_2 ", /* ICONST_2 5 */
946 "ICONST_3 ", /* ICONST_3 6 */
947 "ICONST_4 ", /* ICONST_4 7 */
948 "ICONST_5 ", /* ICONST_5 8 */
949 "LCONST_0 ", /* LCONST_0 9 */
950 "LCONST_1 ", /* LCONST_1 10 */
951 "FCONST_0 ", /* FCONST_0 11 */
952 "FCONST_1 ", /* FCONST_1 12 */
953 "FCONST_2 ", /* FCONST_2 13 */
954 "DCONST_0 ", /* DCONST_0 14 */
955 "DCONST_1 ", /* DCONST_1 15 */
956 "BIPUSH ", /* BIPUSH 16 */
957 "SIPUSH ", /* SIPUSH 17 */
959 "LDC_W ", /* LDC_W 19 */
960 "LDC2_W ", /* LDC2_W 20 */
966 "ILOAD_0 ", /* ILOAD_0 26 */
967 "ILOAD_1 ", /* ILOAD_1 27 */
968 "ILOAD_2 ", /* ILOAD_2 28 */
969 "ILOAD_3 ", /* ILOAD_3 29 */
970 "LLOAD_0 ", /* LLOAD_0 30 */
971 "LLOAD_1 ", /* LLOAD_1 31 */
972 "LLOAD_2 ", /* LLOAD_2 32 */
973 "LLOAD_3 ", /* LLOAD_3 33 */
974 "FLOAD_0 ", /* FLOAD_0 34 */
975 "FLOAD_1 ", /* FLOAD_1 35 */
976 "FLOAD_2 ", /* FLOAD_2 36 */
977 "FLOAD_3 ", /* FLOAD_3 37 */
978 "DLOAD_0 ", /* DLOAD_0 38 */
979 "DLOAD_1 ", /* DLOAD_1 39 */
980 "DLOAD_2 ", /* DLOAD_2 40 */
981 "DLOAD_3 ", /* DLOAD_3 41 */
982 "ALOAD_0 ", /* ALOAD_0 42 */
983 "ALOAD_1 ", /* ALOAD_1 43 */
984 "ALOAD_2 ", /* ALOAD_2 44 */
985 "ALOAD_3 ", /* ALOAD_3 45 */
999 "ISTORE_0 ", /* ISTORE_0 59 */
1000 "ISTORE_1 ", /* ISTORE_1 60 */
1001 "ISTORE_2 ", /* ISTORE_2 61 */
1002 "ISTORE_3 ", /* ISTORE_3 62 */
1003 "LSTORE_0 ", /* LSTORE_0 63 */
1004 "LSTORE_1 ", /* LSTORE_1 64 */
1005 "LSTORE_2 ", /* LSTORE_2 65 */
1006 "LSTORE_3 ", /* LSTORE_3 66 */
1007 "FSTORE_0 ", /* FSTORE_0 67 */
1008 "FSTORE_1 ", /* FSTORE_1 68 */
1009 "FSTORE_2 ", /* FSTORE_2 69 */
1010 "FSTORE_3 ", /* FSTORE_3 70 */
1011 "DSTORE_0 ", /* DSTORE_0 71 */
1012 "DSTORE_1 ", /* DSTORE_1 72 */
1013 "DSTORE_2 ", /* DSTORE_2 73 */
1014 "DSTORE_3 ", /* DSTORE_3 74 */
1015 "ASTORE_0 ", /* ASTORE_0 75 */
1016 "ASTORE_1 ", /* ASTORE_1 76 */
1017 "ASTORE_2 ", /* ASTORE_2 77 */
1018 "ASTORE_3 ", /* ASTORE_3 78 */
1019 "IASTORE ", /* 79 */
1020 "LASTORE ", /* 80 */
1021 "FASTORE ", /* 81 */
1022 "DASTORE ", /* 82 */
1023 "AASTORE ", /* 83 */
1024 "BASTORE ", /* 84 */
1025 "CASTORE ", /* 85 */
1026 "SASTORE ", /* 86 */
1033 "DUP2_X1 ", /* 93 */
1034 "DUP2_X2 ", /* 94 */
1085 "INT2BYTE ", /* 145 */
1086 "INT2CHAR ", /* 146 */
1087 "INT2SHORT ", /* 147 */
1099 "IF_ICMPEQ ", /* 159 */
1100 "IF_ICMPNE ", /* 160 */
1101 "IF_ICMPLT ", /* 161 */
1102 "IF_ICMPGE ", /* 162 */
1103 "IF_ICMPGT ", /* 163 */
1104 "IF_ICMPLE ", /* 164 */
1105 "IF_ACMPEQ ", /* 165 */
1106 "IF_ACMPNE ", /* 166 */
1110 "TABLESWITCH ", /* 170 */
1111 "LOOKUPSWITCH ", /* 171 */
1112 "IRETURN ", /* 172 */
1113 "LRETURN ", /* 173 */
1114 "FRETURN ", /* 174 */
1115 "DRETURN ", /* 175 */
1116 "ARETURN ", /* 176 */
1117 "RETURN ", /* 177 */
1118 "GETSTATIC ", /* 178 */
1119 "PUTSTATIC ", /* 179 */
1120 "GETFIELD ", /* 180 */
1121 "PUTFIELD ", /* 181 */
1122 "INVOKEVIRTUAL ", /* 182 */
1123 "INVOKESPECIAL ", /* 183 */
1124 "INVOKESTATIC ", /* 184 */
1125 "INVOKEINTERFACE", /* 185 */
1126 "UNDEF186 ", /* 186 */
1128 "NEWARRAY ", /* 188 */
1129 "ANEWARRAY ", /* 189 */
1130 "ARRAYLENGTH ", /* 190 */
1131 "ATHROW ", /* 191 */
1132 "CHECKCAST ", /* 192 */
1133 "INSTANCEOF ", /* 193 */
1134 "MONITORENTER ", /* 194 */
1135 "MONITOREXIT ", /* 195 */
1136 "WIDE ", /* WIDE 196 */
1137 "MULTIANEWARRAY ", /* 197 */
1138 "IFNULL ", /* 198 */
1139 "IFNONNULL ", /* 199 */
1140 "GOTO_W ", /* GOTO_W 200 */
1141 "JSR_W ", /* JSR_W 201 */
1142 "BREAKPOINT ", /* BREAKPOINT 202 */
1144 "UNDEF203", "UNDEF204", "UNDEF205",
1145 "UNDEF206", "UNDEF207", "UNDEF208", "UNDEF209", "UNDEF210",
1146 "UNDEF211", "UNDEF212", "UNDEF213", "UNDEF214", "UNDEF215",
1147 "UNDEF216", "UNDEF217", "UNDEF218", "UNDEF219", "UNDEF220",
1148 "UNDEF221", "UNDEF222", "UNDEF223", "UNDEF224", "UNDEF225",
1149 "UNDEF226", "UNDEF227", "UNDEF228", "UNDEF229", "UNDEF230",
1150 "UNDEF231", "UNDEF232", "UNDEF233", "UNDEF234", "UNDEF235",
1151 "UNDEF236", "UNDEF237", "UNDEF238", "UNDEF239", "UNDEF240",
1152 "UNDEF241", "UNDEF242", "UNDEF243", "UNDEF244", "UNDEF245",
1153 "UNDEF246", "UNDEF247", "UNDEF248", "UNDEF249", "UNDEF250",
1154 "UNDEF251", "UNDEF252", "UNDEF253", "UNDEF254", "UNDEF255"
1158 #if defined(USEBUILTINTABLE)
1161 stdopdescriptor builtintable[] = {
1162 { ICMD_LCMP, TYPE_LONG, TYPE_LONG, TYPE_INT, ICMD_BUILTIN2,
1163 (functionptr) builtin_lcmp , SUPPORT_LONG && SUPPORT_LONG_CMP, false },
1164 { ICMD_LAND, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1165 (functionptr) builtin_land , SUPPORT_LONG && SUPPORT_LONG_LOG, false },
1166 { ICMD_LOR, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1167 (functionptr) builtin_lor , SUPPORT_LONG && SUPPORT_LONG_LOG, false },
1168 { ICMD_LXOR, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1169 (functionptr) builtin_lxor , SUPPORT_LONG && SUPPORT_LONG_LOG, false },
1170 { ICMD_LSHL, TYPE_LONG, TYPE_INT, TYPE_LONG, ICMD_BUILTIN2,
1171 (functionptr) builtin_lshl , SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
1172 { ICMD_LSHR, TYPE_LONG, TYPE_INT, TYPE_LONG, ICMD_BUILTIN2,
1173 (functionptr) builtin_lshr, SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
1174 { ICMD_LUSHR, TYPE_LONG, TYPE_INT, TYPE_LONG, ICMD_BUILTIN2,
1175 (functionptr) builtin_lushr, SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
1176 { ICMD_LADD, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1177 (functionptr) builtin_ladd , SUPPORT_LONG && SUPPORT_LONG_ADD, false },
1178 { ICMD_LSUB, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1179 (functionptr) builtin_lsub , SUPPORT_LONG && SUPPORT_LONG_ADD, false },
1180 { ICMD_LNEG, TYPE_LONG, TYPE_VOID, TYPE_LONG, ICMD_BUILTIN1,
1181 (functionptr) builtin_lneg, SUPPORT_LONG && SUPPORT_LONG_ADD, true },
1182 { ICMD_LMUL, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1183 (functionptr) builtin_lmul , SUPPORT_LONG && SUPPORT_LONG_MUL, false },
1184 { ICMD_I2F, TYPE_INT, TYPE_VOID, TYPE_FLOAT, ICMD_BUILTIN1,
1185 (functionptr) builtin_i2f, SUPPORT_FLOAT && SUPPORT_IFCVT, true },
1186 { ICMD_I2D, TYPE_INT, TYPE_VOID, TYPE_DOUBLE, ICMD_BUILTIN1,
1187 (functionptr) builtin_i2d, SUPPORT_DOUBLE && SUPPORT_IFCVT, true },
1188 { ICMD_L2F, TYPE_LONG, TYPE_VOID, TYPE_FLOAT, ICMD_BUILTIN1,
1189 (functionptr) builtin_l2f, SUPPORT_LONG && SUPPORT_FLOAT && SUPPORT_LONG_FCVT, true },
1190 { ICMD_L2D, TYPE_LONG, TYPE_VOID, TYPE_DOUBLE, ICMD_BUILTIN1,
1191 (functionptr) builtin_l2d, SUPPORT_LONG && SUPPORT_DOUBLE && SUPPORT_LONG_FCVT, true },
1192 { ICMD_F2L, TYPE_FLOAT, TYPE_VOID, TYPE_LONG, ICMD_BUILTIN1,
1193 (functionptr) builtin_f2l, SUPPORT_FLOAT && SUPPORT_LONG && SUPPORT_LONG_ICVT, true },
1194 { ICMD_D2L, TYPE_DOUBLE, TYPE_VOID, TYPE_LONG, ICMD_BUILTIN1,
1195 (functionptr) builtin_d2l, SUPPORT_DOUBLE && SUPPORT_LONG && SUPPORT_LONG_ICVT, true },
1196 { ICMD_F2I, TYPE_FLOAT, TYPE_VOID, TYPE_INT, ICMD_BUILTIN1,
1197 (functionptr) builtin_f2i, SUPPORT_FLOAT && SUPPORT_FICVT, true },
1198 { ICMD_D2I, TYPE_DOUBLE, TYPE_VOID, TYPE_INT, ICMD_BUILTIN1,
1199 (functionptr) builtin_d2i, SUPPORT_DOUBLE && SUPPORT_FICVT, true },
1200 { 255, 0, 0, 0, 0, NULL, true, false },
1205 static int builtintablelen;
1207 #endif /* USEBUILTINTABLE */
1214 printf("PARSE method name ="); \
1215 utf_display(m->class->name); \
1217 method_display(m); \
1218 printf(" exceptiontablelength %d\n",m->exceptiontablelength); \
1223 /*****************************************************************************
1224 TABLE OF BUILTIN FUNCTIONS
1226 This table lists the builtin functions which are used inside
1229 The first part of the table (up to the 255-marker) lists the
1230 opcodes which are automatically replaced in stack.c.
1232 The second part lists the builtin functions which are "manually"
1233 used for BUILTIN* opcodes in parse.c and stack.c.
1235 *****************************************************************************/
1237 builtin_descriptor builtin_desc[] = {
1238 #if defined(USEBUILTINTABLE)
1239 {ICMD_LCMP , BUILTIN_lcmp ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_INT ,
1240 SUPPORT_LONG && SUPPORT_LONG_CMP,false,"lcmp"},
1242 {ICMD_LAND , BUILTIN_land ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
1243 SUPPORT_LONG && SUPPORT_LONG_LOG,false,"land"},
1244 {ICMD_LOR , BUILTIN_lor ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
1245 SUPPORT_LONG && SUPPORT_LONG_LOG,false,"lor"},
1246 {ICMD_LXOR , BUILTIN_lxor ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
1247 SUPPORT_LONG && SUPPORT_LONG_LOG,false,"lxor"},
1249 {ICMD_LSHL , BUILTIN_lshl ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_INT ,TYPE_VOID ,TYPE_LONG ,
1250 SUPPORT_LONG && SUPPORT_LONG_SHIFT,false,"lshl"},
1251 {ICMD_LSHR , BUILTIN_lshr ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_INT ,TYPE_VOID ,TYPE_LONG ,
1252 SUPPORT_LONG && SUPPORT_LONG_SHIFT,false,"lshr"},
1253 {ICMD_LUSHR, BUILTIN_lushr,ICMD_BUILTIN2,TYPE_LONG ,TYPE_INT ,TYPE_VOID ,TYPE_LONG ,
1254 SUPPORT_LONG && SUPPORT_LONG_SHIFT,false,"lushr"},
1256 {ICMD_LADD , BUILTIN_ladd ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
1257 SUPPORT_LONG && SUPPORT_LONG_ADD,false,"ladd"},
1258 {ICMD_LSUB , BUILTIN_lsub ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
1259 SUPPORT_LONG && SUPPORT_LONG_ADD,false,"lsub"},
1260 {ICMD_LNEG , BUILTIN_lneg ,ICMD_BUILTIN1,TYPE_LONG ,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,
1261 SUPPORT_LONG && SUPPORT_LONG_ADD,false,"lneg"},
1262 {ICMD_LMUL , BUILTIN_lmul ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
1263 SUPPORT_LONG && SUPPORT_LONG_MUL,false,"lmul"},
1265 {ICMD_I2F , BUILTIN_i2f ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_FLOAT ,
1266 SUPPORT_FLOAT && SUPPORT_IFCVT,true ,"i2f"},
1267 {ICMD_I2D , BUILTIN_i2d ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_DOUBLE,
1268 SUPPORT_DOUBLE && SUPPORT_IFCVT,true ,"i2d"},
1269 {ICMD_L2F , BUILTIN_l2f ,ICMD_BUILTIN1,TYPE_LONG ,TYPE_VOID ,TYPE_VOID ,TYPE_FLOAT ,
1270 SUPPORT_LONG && SUPPORT_FLOAT && SUPPORT_LONG_FCVT,true ,"l2f"},
1271 {ICMD_L2D , BUILTIN_l2d ,ICMD_BUILTIN1,TYPE_LONG ,TYPE_VOID ,TYPE_VOID ,TYPE_DOUBLE,
1272 SUPPORT_LONG && SUPPORT_DOUBLE && SUPPORT_LONG_FCVT,true ,"l2d"},
1273 {ICMD_F2L , BUILTIN_f2l ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,
1274 SUPPORT_FLOAT && SUPPORT_LONG && SUPPORT_LONG_ICVT,true ,"f2l"},
1275 {ICMD_D2L , BUILTIN_d2l ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,
1276 SUPPORT_DOUBLE && SUPPORT_LONG && SUPPORT_LONG_ICVT,true ,"d2l"},
1277 {ICMD_F2I , BUILTIN_f2i ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID ,TYPE_VOID ,TYPE_INT ,
1278 SUPPORT_FLOAT && SUPPORT_FICVT,true ,"f2i"},
1279 {ICMD_D2I , BUILTIN_d2i ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID ,TYPE_VOID ,TYPE_INT ,
1280 SUPPORT_DOUBLE && SUPPORT_FICVT,true ,"d2i"},
1282 { ICMD_FADD , BUILTIN_fadd , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fadd" },
1283 { ICMD_FSUB , BUILTIN_fsub , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fsub" },
1284 { ICMD_FMUL , BUILTIN_fmul , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fmul" },
1285 { ICMD_FDIV , BUILTIN_fdiv , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fdiv" },
1286 { ICMD_FNEG , BUILTIN_fneg , ICMD_BUILTIN1, TYPE_FLT, TYPE_VOID , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fneg" },
1287 { ICMD_FCMPL, BUILTIN_fcmpl , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT , TYPE_VOID , TYPE_INT, SUPPORT_FLOAT, true, "fcmpl" },
1288 { ICMD_FCMPG, BUILTIN_fcmpg , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT , TYPE_VOID , TYPE_INT, SUPPORT_FLOAT, true, "fcmpg" },
1290 { ICMD_DADD , BUILTIN_dadd , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "dadd" },
1291 { ICMD_DSUB , BUILTIN_dsub , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "dsub" },
1292 { ICMD_DMUL , BUILTIN_dmul , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "dmul" },
1293 { ICMD_DDIV , BUILTIN_ddiv , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "ddiv" },
1294 { ICMD_DNEG , BUILTIN_dneg , ICMD_BUILTIN1, TYPE_DBL, TYPE_VOID , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "dneg" },
1295 { ICMD_DCMPL, BUILTIN_dcmpl , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL , TYPE_VOID , TYPE_INT, SUPPORT_DOUBLE, true, "dcmpl" },
1296 { ICMD_DCMPG, BUILTIN_dcmpg , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL , TYPE_VOID , TYPE_INT, SUPPORT_DOUBLE, true, "dcmpg" },
1298 { ICMD_F2D, BUILTIN_f2d , ICMD_BUILTIN1, TYPE_FLT, TYPE_VOID , TYPE_VOID , TYPE_DBL, SUPPORT_FLOAT && SUPPORT_DOUBLE, true, "f2d" },
1299 { ICMD_D2F, BUILTIN_d2f , ICMD_BUILTIN1, TYPE_DBL, TYPE_VOID , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT && SUPPORT_DOUBLE, true, "d2f" },
1302 /* this record marks the end of the automatically replaced opcodes */
1303 {255,NULL,0,0,0,0,0,0,0,"<INVALID>"},
1305 /* the following functions are not replaced automatically */
1307 #if defined(__ALPHA__)
1308 {255, BUILTIN_f2l ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,0,0,"f2l"},
1309 {255, BUILTIN_d2l ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,0,0,"d2l"},
1310 {255, BUILTIN_f2i ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID ,TYPE_VOID ,TYPE_INT ,0,0,"f2i"},
1311 {255, BUILTIN_d2i ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID ,TYPE_VOID ,TYPE_INT ,0,0,"d2i"},
1314 {255,BUILTIN_instanceof ,ICMD_BUILTIN2,TYPE_ADR ,TYPE_ADR ,TYPE_VOID ,TYPE_INT ,0,0,"instanceof"},
1315 {255,BUILTIN_arrayinstanceof ,ICMD_BUILTIN2,TYPE_ADR ,TYPE_ADR ,TYPE_VOID ,TYPE_INT ,0,0,"arrayinstanceof"},
1316 {255,BUILTIN_checkarraycast ,ICMD_BUILTIN2,TYPE_ADR ,TYPE_ADR ,TYPE_VOID ,TYPE_VOID ,0,0,"checkarraycast"},
1317 {255,BUILTIN_aastore ,ICMD_BUILTIN3,TYPE_ADR ,TYPE_INT ,TYPE_ADR ,TYPE_VOID ,0,0,"aastore"},
1318 {255,BUILTIN_new ,ICMD_BUILTIN1,TYPE_ADR ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"new"},
1319 {255,BUILTIN_newarray ,ICMD_BUILTIN2,TYPE_INT ,TYPE_ADR ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray"},
1320 {255,BUILTIN_newarray_boolean,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_boolean"},
1321 {255,BUILTIN_newarray_char ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_char"},
1322 {255,BUILTIN_newarray_float ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_float"},
1323 {255,BUILTIN_newarray_double ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_double"},
1324 {255,BUILTIN_newarray_byte ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_byte"},
1325 {255,BUILTIN_newarray_short ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_short"},
1326 {255,BUILTIN_newarray_int ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_int"},
1327 {255,BUILTIN_newarray_long ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_long"},
1328 #if defined(USE_THREADS)
1329 {255,BUILTIN_monitorenter ,ICMD_BUILTIN1,TYPE_ADR ,TYPE_VOID ,TYPE_VOID ,TYPE_VOID ,0,0,"monitorenter"},
1330 {255,BUILTIN_monitorexit ,ICMD_BUILTIN1,TYPE_ADR ,TYPE_VOID ,TYPE_VOID ,TYPE_VOID ,0,0,"monitorexit"},
1332 #if !SUPPORT_DIVISION
1333 {255,BUILTIN_idiv ,ICMD_BUILTIN2,TYPE_INT ,TYPE_INT ,TYPE_VOID ,TYPE_INT ,0,0,"idiv"},
1334 {255,BUILTIN_irem ,ICMD_BUILTIN2,TYPE_INT ,TYPE_INT ,TYPE_VOID ,TYPE_INT ,0,0,"irem"},
1336 #if !(SUPPORT_DIVISION && SUPPORT_LONG && SUPPORT_LONG_DIV)
1337 {255,BUILTIN_ldiv ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,0,0,"ldiv"},
1338 {255,BUILTIN_lrem ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,0,0,"lrem"},
1340 {255,BUILTIN_frem ,ICMD_BUILTIN2,TYPE_FLOAT ,TYPE_FLOAT ,TYPE_VOID ,TYPE_FLOAT ,0,0,"frem"},
1341 {255,BUILTIN_drem ,ICMD_BUILTIN2,TYPE_DOUBLE,TYPE_DOUBLE,TYPE_VOID ,TYPE_DOUBLE,0,0,"drem"},
1343 /* this record marks the end of the list */
1344 { 0,NULL,0,0,0,0,0,0,0,"<END>"}
1348 /* include compiler subsystems ************************************************/
1350 /* dummy function, used when there is no JavaVM code available */
1352 static functionptr do_nothing_function()
1358 /* jit_compile *****************************************************************
1360 jit_compile, new version of compiler, translates one method to machine code
1362 *******************************************************************************/
1364 static functionptr jit_compile_intern(methodinfo *m, codegendata *cd,
1365 registerdata *rd, loopdata *ld,
1366 t_inlining_globals *id);
1368 functionptr jit_compile(methodinfo *m)
1374 t_inlining_globals *id;
1380 /* this is the case if a native function is called by jni */
1382 if (m->flags & ACC_NATIVE)
1383 return (functionptr) m->stubroutine;
1385 #if defined(USE_THREADS)
1386 /* enter a monitor on the method */
1388 builtin_monitorenter((java_objectheader *) m);
1391 /* if method has been already compiled return immediately */
1393 if (m->entrypoint) {
1394 #if defined(USE_THREADS)
1395 builtin_monitorexit((java_objectheader *) m);
1398 return m->entrypoint;
1404 /* if there is no javacode, print error message and return empty method */
1408 log_message_method("No code given for: ", m);
1410 m->entrypoint = (functionptr) do_nothing_function;
1412 return m->entrypoint; /* return empty method */
1417 if (getcompilingtime)
1418 compilingtime_start();
1420 /* mark start of dump memory area */
1422 dumpsize = dump_size();
1424 /* allocate memory */
1426 cd = DNEW(codegendata);
1427 rd = DNEW(registerdata);
1428 ld = DNEW(loopdata);
1429 id = DNEW(t_inlining_globals);
1431 /* RTA static analysis must be called before inlining */
1433 RT_jit_parse(m); /* will be called just once */
1434 /* return value ignored for now */
1435 /* XTA static analysis must be called before inlining */
1437 XTA_jit_parse(m); /* will be called just once */
1438 /* return value ignored for now */
1441 /* must be called before reg_setup, because it can change maxlocals */
1442 /* init reqd to initialize for parse even in no inlining */
1443 inlining_setup(m, id);
1445 /* initialize the register allocator */
1446 reg_setup(m, rd, id);
1448 /* setup the codegendata memory */
1449 codegen_setup(m, cd, id);
1451 /* now call internal compile function */
1453 r = jit_compile_intern(m, cd, rd, ld, id);
1455 /* free some memory */
1458 codegen_free(m, cd);
1460 /* clear pointers to dump memory area */
1462 m->basicblocks = NULL;
1463 m->basicblockindex = NULL;
1464 m->instructions = NULL;
1466 /* NO !!! m->exceptiontable = NULL; */
1468 /* release dump area */
1470 dump_release(dumpsize);
1474 if (getcompilingtime)
1475 compilingtime_stop();
1477 /* define in options.h; Used in main.c, jit.c & inline.c */
1479 if ((utf_new_char("main") == m->name) && (useinliningm))
1480 useinlining = false;
1483 #if defined(USE_THREADS)
1484 /* leave the monitor */
1486 builtin_monitorexit((java_objectheader *) m );
1491 log_message_method("Running: ", m);
1494 /* return pointer to the methods entry point */
1500 /* jit_compile_intern **********************************************************
1502 Static internal function which does the actual compilation.
1504 *******************************************************************************/
1506 static functionptr jit_compile_intern(methodinfo *m, codegendata *cd,
1507 registerdata *rd, loopdata *ld,
1508 t_inlining_globals *id)
1516 stackptr src, src_old;
1522 /* print log message for compiled method */
1525 log_message_method("Compiling: ", m);
1527 /* initialize the static function's class */
1529 if (m->flags & ACC_STATIC && !m->class->initialized) {
1531 log_message_class("Initialize class ", m->class);
1533 if (!class_init(m->class))
1537 /* initialisation of variables and subsystems */
1539 m->isleafmethod = true;
1541 #if defined(STATISTICS)
1543 count_tryblocks += m->exceptiontablelength;
1544 count_javacodesize += m->jcodelength + 18;
1545 count_javaexcsize += m->exceptiontablelength * POINTERSIZE;
1549 /* initialise parameter type descriptor */
1551 descriptor2types(m);
1553 /* call the compiler passes ***********************************************/
1556 log_message_method("Parsing: ", m);
1558 /* call parse pass */
1559 if (!parse(m, cd, id)) {
1561 log_message_method("Exception while parsing: ", m);
1566 if (compileverbose) {
1567 log_message_method("Parsing done: ", m);
1568 log_message_method("Analysing: ", m);
1571 /* call stack analysis pass */
1572 if (!analyse_stack(m, cd, rd)) {
1574 log_message_method("Exception while analysing: ", m);
1580 log_message_method("Analysing done: ", m);
1582 #ifdef CACAO_TYPECHECK
1585 log_message_method("Typechecking: ", m);
1587 /* call typecheck pass */
1588 if (!typecheck(m, cd, rd)) {
1590 log_message_method("Exception while typechecking: ", m);
1596 log_message_method("Typechecking done: ", m);
1602 analyseGraph(m, ld);
1603 optimize_loops(m, cd, ld);
1606 #ifdef SPECIALMEMUSE
1611 log_message_method("Allocating registers: ", m);
1613 /* allocate registers */
1615 old_opt_lsra=opt_lsra;
1617 if (!lsra(m, cd, rd, ld, id)) {
1619 /* log_message_method("Regalloc Fallback: ", m); */
1620 regalloc( m, cd, rd );
1623 if (opt_stat) count_methods_allocated_by_lsra++;
1625 /* log_message_method("Regalloc LSRA: ", m); */
1636 count_locals_conflicts += (cd->maxlocals-1)*(cd->maxlocals);
1638 regalloc(m, cd, rd);
1643 /* count how many local variables are held in memory or register */
1644 for(i=0; i < cd->maxlocals; i++)
1645 for (type=0; type <=4; type++)
1646 if (rd->locals[i][type].type != -1) { /* valid local */
1647 if (rd->locals[i][type].flags & INMEMORY)
1648 count_locals_spilled++;
1650 count_locals_register++;
1652 /* count how many stack slots are held in memory or register */
1654 bptr = m->basicblocks;
1655 while (bptr != NULL) {
1656 if (bptr->flags >= BBREACHED) {
1661 /* check for memory moves from interface to BB instack */
1662 dst = bptr->instack;
1663 len = bptr->indepth;
1664 while (dst != NULL) {
1666 if (dst->varkind != STACKVAR) {
1667 if ( (dst->flags & INMEMORY) ||
1668 (rd->interfaces[len][dst->type].flags & INMEMORY) ||
1669 ( (dst->flags & INMEMORY) &&
1670 (rd->interfaces[len][dst->type].flags & INMEMORY) &&
1671 (dst->regoff != rd->interfaces[len][dst->type].regoff) ))
1673 /* one in memory or both inmemory at different offsets */
1674 count_mem_move_bb++;
1681 /* check for memory moves from BB outstack to interface */
1682 dst = bptr->outstack;
1683 len = bptr->outdepth;
1687 if (dst->varkind != STACKVAR) {
1688 if ( (dst->flags & INMEMORY) || \
1689 (rd->interfaces[len][dst->type].flags & INMEMORY) || \
1690 ( (dst->flags & INMEMORY) && \
1691 (rd->interfaces[len][dst->type].flags & INMEMORY) && \
1692 (dst->regoff != rd->interfaces[len][dst->type].regoff) ))
1694 /* one in memory or both inmemory at different offsets */
1695 count_mem_move_bb++;
1706 dst = bptr->instack;
1707 iptr = bptr->iinstr;
1711 while (--len >= 0) {
1715 if ((src!= NULL) && (src != src_old)) { /* new stackslot */
1716 switch (src->varkind) {
1719 if (!(src->flags & INMEMORY))
1720 count_ss_register++;
1724 /* case LOCALVAR: */
1725 /* if (!(rd->locals[src->varnum][src->type].flags & INMEMORY)) */
1726 /* count_ss_register++; */
1728 /* count_ss_spilled++; */
1731 /* if (IS_FLT_DBL_TYPE(src->type)) { */
1732 /* if (src->varnum < FLT_ARG_CNT) { */
1733 /* count_ss_register++; */
1737 /* #if defined(__POWERPC__) */
1738 /* if (src->varnum < INT_ARG_CNT - (IS_2_WORD_TYPE(src->type) != 0)) { */
1740 /* if (src->varnum < INT_ARG_CNT) { */
1742 /* count_ss_register++; */
1746 /* count_ss_spilled++; */
1753 } /* while instructions */
1756 } /* while blocks */
1760 if (compileverbose) {
1761 log_message_method("Allocating registers done: ", m);
1762 log_message_method("Generating code: ", m);
1765 /* now generate the machine code */
1769 log_message_method("Generating code done: ", m);
1771 /* intermediate and assembly code listings */
1773 if (showintermediate) {
1774 show_icmd_method(m, cd, rd);
1776 } else if (showdisassemble) {
1777 disassemble((void *) ((long) m->mcode + cd->dseglen),
1778 m->mcodelength - cd->dseglen);
1781 if (showddatasegment)
1782 dseg_display(m, cd);
1785 log_message_method("Compiling done: ", m);
1788 opt_lsra=old_opt_lsra;
1790 /* return pointer to the methods entry point */
1792 return m->entrypoint;
1796 void compile_all_class_methods(classinfo *c)
1800 for (i = 0; i < c->methodscount; i++) {
1801 (void) jit_compile(&(c->methods[i]));
1806 /* functions for compiler initialisation and finalisation *********************/
1808 #ifdef USEBUILTINTABLE
1810 static int stdopcompare(const void *a, const void *b)
1812 builtin_descriptor *o1 = (builtin_descriptor *) a;
1813 builtin_descriptor *o2 = (builtin_descriptor *) b;
1814 if (!o1->supported && o2->supported)
1816 if (o1->supported && !o2->supported)
1818 return (o1->opcode < o2->opcode) ? -1 : (o1->opcode > o2->opcode);
1821 static inline void sort_builtintable()
1826 while (builtin_desc[len].opcode != 255) len++;
1827 qsort(builtin_desc, len, sizeof(builtin_descriptor), stdopcompare);
1829 for (--len; len>=0 && builtin_desc[len].supported; len--);
1830 builtintablelen = ++len;
1834 builtin_descriptor *find_builtin(int icmd)
1836 builtin_descriptor *first = builtin_desc;
1837 builtin_descriptor *last = builtin_desc + builtintablelen;
1838 int len = last - first;
1840 builtin_descriptor *middle;
1844 middle = first + half;
1845 if (middle->opcode < icmd) {
1851 return first != last ? first : NULL;
1862 #ifdef USEBUILTINTABLE
1863 sort_builtintable();
1866 #if defined(__ALPHA__)
1867 has_ext_instr_set = ! has_no_x_instr_set();
1870 for (i = 0; i < 256; i++)
1873 stackreq[JAVA_NOP] = 0;
1874 stackreq[JAVA_ISTORE] = 0;
1875 stackreq[JAVA_LSTORE] = 0;
1876 stackreq[JAVA_FSTORE] = 0;
1877 stackreq[JAVA_DSTORE] = 0;
1878 stackreq[JAVA_ASTORE] = 0;
1879 stackreq[JAVA_ISTORE_0] = 0;
1880 stackreq[JAVA_ISTORE_1] = 0;
1881 stackreq[JAVA_ISTORE_2] = 0;
1882 stackreq[JAVA_ISTORE_3] = 0;
1883 stackreq[JAVA_LSTORE_0] = 0;
1884 stackreq[JAVA_LSTORE_1] = 0;
1885 stackreq[JAVA_LSTORE_2] = 0;
1886 stackreq[JAVA_LSTORE_3] = 0;
1887 stackreq[JAVA_FSTORE_0] = 0;
1888 stackreq[JAVA_FSTORE_1] = 0;
1889 stackreq[JAVA_FSTORE_2] = 0;
1890 stackreq[JAVA_FSTORE_3] = 0;
1891 stackreq[JAVA_DSTORE_0] = 0;
1892 stackreq[JAVA_DSTORE_1] = 0;
1893 stackreq[JAVA_DSTORE_2] = 0;
1894 stackreq[JAVA_DSTORE_3] = 0;
1895 stackreq[JAVA_ASTORE_0] = 0;
1896 stackreq[JAVA_ASTORE_1] = 0;
1897 stackreq[JAVA_ASTORE_2] = 0;
1898 stackreq[JAVA_ASTORE_3] = 0;
1899 stackreq[JAVA_IASTORE] = 0;
1900 stackreq[JAVA_LASTORE] = 0;
1901 stackreq[JAVA_FASTORE] = 0;
1902 stackreq[JAVA_DASTORE] = 0;
1903 stackreq[JAVA_AASTORE] = 0;
1904 stackreq[JAVA_BASTORE] = 0;
1905 stackreq[JAVA_CASTORE] = 0;
1906 stackreq[JAVA_SASTORE] = 0;
1907 stackreq[JAVA_POP] = 0;
1908 stackreq[JAVA_POP2] = 0;
1909 stackreq[JAVA_IINC] = 0;
1910 stackreq[JAVA_IFEQ] = 0;
1911 stackreq[JAVA_IFNE] = 0;
1912 stackreq[JAVA_IFLT] = 0;
1913 stackreq[JAVA_IFGE] = 0;
1914 stackreq[JAVA_IFGT] = 0;
1915 stackreq[JAVA_IFLE] = 0;
1916 stackreq[JAVA_IF_ICMPEQ] = 0;
1917 stackreq[JAVA_IF_ICMPNE] = 0;
1918 stackreq[JAVA_IF_ICMPLT] = 0;
1919 stackreq[JAVA_IF_ICMPGE] = 0;
1920 stackreq[JAVA_IF_ICMPGT] = 0;
1921 stackreq[JAVA_IF_ICMPLE] = 0;
1922 stackreq[JAVA_IF_ACMPEQ] = 0;
1923 stackreq[JAVA_IF_ACMPNE] = 0;
1924 stackreq[JAVA_GOTO] = 0;
1925 stackreq[JAVA_RET] = 0;
1926 stackreq[JAVA_TABLESWITCH] = 0;
1927 stackreq[JAVA_LOOKUPSWITCH] = 0;
1928 stackreq[JAVA_IRETURN] = 0;
1929 stackreq[JAVA_LRETURN] = 0;
1930 stackreq[JAVA_FRETURN] = 0;
1931 stackreq[JAVA_DRETURN] = 0;
1932 stackreq[JAVA_ARETURN] = 0;
1933 stackreq[JAVA_RETURN] = 0;
1934 stackreq[JAVA_PUTSTATIC] = 0;
1935 stackreq[JAVA_PUTFIELD] = 0;
1936 stackreq[JAVA_MONITORENTER] = 0;
1937 stackreq[JAVA_MONITOREXIT] = 0;
1938 stackreq[JAVA_WIDE] = 0;
1939 stackreq[JAVA_IFNULL] = 0;
1940 stackreq[JAVA_IFNONNULL] = 0;
1941 stackreq[JAVA_GOTO_W] = 0;
1942 stackreq[JAVA_BREAKPOINT] = 0;
1944 stackreq[JAVA_SWAP] = 2;
1945 stackreq[JAVA_DUP2] = 2;
1946 stackreq[JAVA_DUP_X1] = 3;
1947 stackreq[JAVA_DUP_X2] = 4;
1948 stackreq[JAVA_DUP2_X1] = 3;
1949 stackreq[JAVA_DUP2_X2] = 4;
1951 /* initialize the codegen stuff */
1962 * These are local overrides for various environment variables in Emacs.
1963 * Please do not remove this and leave it at the end of the file, where
1964 * Emacs will automagically detect them.
1965 * ---------------------------------------------------------------------
1968 * indent-tabs-mode: t