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 1897 2005-02-07 16:59:00Z twisti $
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)
1510 /* print log message for compiled method */
1513 log_message_method("Compiling: ", m);
1515 /* initialize the static function's class */
1517 if (m->flags & ACC_STATIC && !m->class->initialized) {
1519 log_message_class("Initialize class ", m->class);
1521 if (!class_init(m->class))
1525 /* initialisation of variables and subsystems */
1527 m->isleafmethod = true;
1529 #if defined(STATISTICS)
1531 count_tryblocks += m->exceptiontablelength;
1532 count_javacodesize += m->jcodelength + 18;
1533 count_javaexcsize += m->exceptiontablelength * POINTERSIZE;
1537 /* initialise parameter type descriptor */
1539 descriptor2types(m);
1541 /* call the compiler passes ***********************************************/
1544 log_message_method("Parsing: ", m);
1546 /* call parse pass */
1547 if (!parse(m, cd, id)) {
1549 log_message_method("Exception while parsing: ", m);
1554 if (compileverbose) {
1555 log_message_method("Parsing done: ", m);
1556 log_message_method("Analysing: ", m);
1559 /* call stack analysis pass */
1560 if (!analyse_stack(m, cd, rd)) {
1562 log_message_method("Exception while analysing: ", m);
1568 log_message_method("Analysing done: ", m);
1570 #ifdef CACAO_TYPECHECK
1573 log_message_method("Typechecking: ", m);
1575 /* call typecheck pass */
1576 if (!typecheck(m, cd, rd)) {
1578 log_message_method("Exception while typechecking: ", m);
1584 log_message_method("Typechecking done: ", m);
1590 analyseGraph(m, ld);
1591 optimize_loops(m, cd, ld);
1594 #ifdef SPECIALMEMUSE
1599 log_message_method("Allocating registers: ", m);
1601 /* allocate registers */
1604 lsra(m, cd, rd, ld, id);
1607 regalloc(m, cd, rd);
1609 if (compileverbose) {
1610 log_message_method("Allocating registers done: ", m);
1611 log_message_method("Generating code: ", m);
1614 /* now generate the machine code */
1618 log_message_method("Generating code done: ", m);
1620 /* intermediate and assembly code listings */
1622 if (showintermediate) {
1623 show_icmd_method(m, cd, rd);
1625 } else if (showdisassemble) {
1626 disassemble((void *) ((long) m->mcode + cd->dseglen),
1627 m->mcodelength - cd->dseglen);
1630 if (showddatasegment)
1631 dseg_display(m, cd);
1634 log_message_method("Compiling done: ", m);
1636 /* return pointer to the methods entry point */
1638 return m->entrypoint;
1642 void compile_all_class_methods(classinfo *c)
1646 for (i = 0; i < c->methodscount; i++) {
1647 (void) jit_compile(&(c->methods[i]));
1652 /* functions for compiler initialisation and finalisation *********************/
1654 #ifdef USEBUILTINTABLE
1656 static int stdopcompare(const void *a, const void *b)
1658 builtin_descriptor *o1 = (builtin_descriptor *) a;
1659 builtin_descriptor *o2 = (builtin_descriptor *) b;
1660 if (!o1->supported && o2->supported)
1662 if (o1->supported && !o2->supported)
1664 return (o1->opcode < o2->opcode) ? -1 : (o1->opcode > o2->opcode);
1667 static inline void sort_builtintable()
1672 while (builtin_desc[len].opcode != 255) len++;
1673 qsort(builtin_desc, len, sizeof(builtin_descriptor), stdopcompare);
1675 for (--len; len>=0 && builtin_desc[len].supported; len--);
1676 builtintablelen = ++len;
1680 builtin_descriptor *find_builtin(int icmd)
1682 builtin_descriptor *first = builtin_desc;
1683 builtin_descriptor *last = builtin_desc + builtintablelen;
1684 int len = last - first;
1686 builtin_descriptor *middle;
1690 middle = first + half;
1691 if (middle->opcode < icmd) {
1697 return first != last ? first : NULL;
1708 #ifdef USEBUILTINTABLE
1709 sort_builtintable();
1712 #if defined(__ALPHA__)
1713 has_ext_instr_set = ! has_no_x_instr_set();
1716 for (i = 0; i < 256; i++)
1719 stackreq[JAVA_NOP] = 0;
1720 stackreq[JAVA_ISTORE] = 0;
1721 stackreq[JAVA_LSTORE] = 0;
1722 stackreq[JAVA_FSTORE] = 0;
1723 stackreq[JAVA_DSTORE] = 0;
1724 stackreq[JAVA_ASTORE] = 0;
1725 stackreq[JAVA_ISTORE_0] = 0;
1726 stackreq[JAVA_ISTORE_1] = 0;
1727 stackreq[JAVA_ISTORE_2] = 0;
1728 stackreq[JAVA_ISTORE_3] = 0;
1729 stackreq[JAVA_LSTORE_0] = 0;
1730 stackreq[JAVA_LSTORE_1] = 0;
1731 stackreq[JAVA_LSTORE_2] = 0;
1732 stackreq[JAVA_LSTORE_3] = 0;
1733 stackreq[JAVA_FSTORE_0] = 0;
1734 stackreq[JAVA_FSTORE_1] = 0;
1735 stackreq[JAVA_FSTORE_2] = 0;
1736 stackreq[JAVA_FSTORE_3] = 0;
1737 stackreq[JAVA_DSTORE_0] = 0;
1738 stackreq[JAVA_DSTORE_1] = 0;
1739 stackreq[JAVA_DSTORE_2] = 0;
1740 stackreq[JAVA_DSTORE_3] = 0;
1741 stackreq[JAVA_ASTORE_0] = 0;
1742 stackreq[JAVA_ASTORE_1] = 0;
1743 stackreq[JAVA_ASTORE_2] = 0;
1744 stackreq[JAVA_ASTORE_3] = 0;
1745 stackreq[JAVA_IASTORE] = 0;
1746 stackreq[JAVA_LASTORE] = 0;
1747 stackreq[JAVA_FASTORE] = 0;
1748 stackreq[JAVA_DASTORE] = 0;
1749 stackreq[JAVA_AASTORE] = 0;
1750 stackreq[JAVA_BASTORE] = 0;
1751 stackreq[JAVA_CASTORE] = 0;
1752 stackreq[JAVA_SASTORE] = 0;
1753 stackreq[JAVA_POP] = 0;
1754 stackreq[JAVA_POP2] = 0;
1755 stackreq[JAVA_IINC] = 0;
1756 stackreq[JAVA_IFEQ] = 0;
1757 stackreq[JAVA_IFNE] = 0;
1758 stackreq[JAVA_IFLT] = 0;
1759 stackreq[JAVA_IFGE] = 0;
1760 stackreq[JAVA_IFGT] = 0;
1761 stackreq[JAVA_IFLE] = 0;
1762 stackreq[JAVA_IF_ICMPEQ] = 0;
1763 stackreq[JAVA_IF_ICMPNE] = 0;
1764 stackreq[JAVA_IF_ICMPLT] = 0;
1765 stackreq[JAVA_IF_ICMPGE] = 0;
1766 stackreq[JAVA_IF_ICMPGT] = 0;
1767 stackreq[JAVA_IF_ICMPLE] = 0;
1768 stackreq[JAVA_IF_ACMPEQ] = 0;
1769 stackreq[JAVA_IF_ACMPNE] = 0;
1770 stackreq[JAVA_GOTO] = 0;
1771 stackreq[JAVA_RET] = 0;
1772 stackreq[JAVA_TABLESWITCH] = 0;
1773 stackreq[JAVA_LOOKUPSWITCH] = 0;
1774 stackreq[JAVA_IRETURN] = 0;
1775 stackreq[JAVA_LRETURN] = 0;
1776 stackreq[JAVA_FRETURN] = 0;
1777 stackreq[JAVA_DRETURN] = 0;
1778 stackreq[JAVA_ARETURN] = 0;
1779 stackreq[JAVA_RETURN] = 0;
1780 stackreq[JAVA_PUTSTATIC] = 0;
1781 stackreq[JAVA_PUTFIELD] = 0;
1782 stackreq[JAVA_MONITORENTER] = 0;
1783 stackreq[JAVA_MONITOREXIT] = 0;
1784 stackreq[JAVA_WIDE] = 0;
1785 stackreq[JAVA_IFNULL] = 0;
1786 stackreq[JAVA_IFNONNULL] = 0;
1787 stackreq[JAVA_GOTO_W] = 0;
1788 stackreq[JAVA_BREAKPOINT] = 0;
1790 stackreq[JAVA_SWAP] = 2;
1791 stackreq[JAVA_DUP2] = 2;
1792 stackreq[JAVA_DUP_X1] = 3;
1793 stackreq[JAVA_DUP_X2] = 4;
1794 stackreq[JAVA_DUP2_X1] = 3;
1795 stackreq[JAVA_DUP2_X2] = 4;
1797 /* initialize the codegen stuff */
1808 * These are local overrides for various environment variables in Emacs.
1809 * Please do not remove this and leave it at the end of the file, where
1810 * Emacs will automagically detect them.
1811 * ---------------------------------------------------------------------
1814 * indent-tabs-mode: t