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 1892 2005-01-31 17:05:53Z twisti $
40 #include "mm/memory.h"
41 #include "toolbox/logging.h"
42 #include "vm/builtin.h"
43 #include "vm/global.h"
44 #include "vm/loader.h"
45 #include "vm/options.h"
46 #include "vm/statistics.h"
47 #include "vm/tables.h"
48 #include "vm/jit/codegen.inc.h"
49 #include "vm/jit/jit.h"
51 #include "vm/jit/lsra.h"
53 #include "vm/jit/parse.h"
54 #include "vm/jit/reg.h"
55 #include "vm/jit/stack.h"
56 #include "vm/jit/inline/inline.h"
57 #include "vm/jit/inline/parseRT.h"
58 #include "vm/jit/inline/parseXTA.h"
59 #include "vm/jit/loop/analyze.h"
60 #include "vm/jit/loop/graph.h"
61 #include "vm/jit/loop/loop.h"
62 #include "vm/jit/verify/typecheck.h"
64 #if defined(USE_THREADS)
65 # if defined(NATIVE_THREADS)
66 # include "threads/native/threads.h"
68 # include "threads/green/threads.h"
74 /* global switches ************************************************************/
79 int jcommandsize[256] = {
84 #define JAVA_ACONST_NULL 1
85 #define ICMD_ACONST 1 /* val.a = constant */
87 #define JAVA_ICONST_M1 2
88 #define ICMD_NULLCHECKPOP 2
90 #define JAVA_ICONST_0 3
91 #define ICMD_ICONST 3 /* val.i = constant */
93 #define JAVA_ICONST_1 4
95 #define JAVA_ICONST_2 5
96 #define ICMD_IDIVPOW2 5 /* val.i = constant */
98 #define JAVA_ICONST_3 6
99 #define ICMD_LDIVPOW2 6 /* val.l = constant */
101 #define JAVA_ICONST_4 7
103 #define JAVA_ICONST_5 8
105 #define JAVA_LCONST_0 9
106 #define ICMD_LCONST 9 /* val.l = constant */
108 #define JAVA_LCONST_1 10
109 #define ICMD_LCMPCONST 10 /* val.l = constant */
111 #define JAVA_FCONST_0 11
112 #define ICMD_FCONST 11 /* val.f = constant */
114 #define JAVA_FCONST_1 12
116 #define JAVA_FCONST_2 13
117 #define ICMD_ELSE_ICONST 13
119 #define JAVA_DCONST_0 14
120 #define ICMD_DCONST 14 /* val.d = constant */
122 #define JAVA_DCONST_1 15
123 #define ICMD_IFEQ_ICONST 15
125 #define JAVA_BIPUSH 16
126 #define ICMD_IFNE_ICONST 16
128 #define JAVA_SIPUSH 17
129 #define ICMD_IFLT_ICONST 17
132 #define ICMD_IFGE_ICONST 18
135 #define ICMD_IFGT_ICONST 19
137 #define JAVA_LDC2W 20
138 #define ICMD_IFLE_ICONST 20
140 /* order of LOAD instructions must be */
141 /* equal to order of TYPE_XXX defines */
142 #define JAVA_ILOAD 21
143 #define ICMD_ILOAD 21 /* op1 = local variable */
145 #define JAVA_LLOAD 22
146 #define ICMD_LLOAD 22 /* op1 = local variable */
148 #define JAVA_FLOAD 23
149 #define ICMD_FLOAD 23 /* op1 = local variable */
151 #define JAVA_DLOAD 24
152 #define ICMD_DLOAD 24 /* op1 = local variable */
154 #define JAVA_ALOAD 25
155 #define ICMD_ALOAD 25 /* op1 = local variable */
157 #define JAVA_ILOAD_0 26
158 #define ICMD_IADDCONST 26 /* val.i = constant */
160 #define JAVA_ILOAD_1 27
161 #define ICMD_ISUBCONST 27 /* val.i = constant */
163 #define JAVA_ILOAD_2 28
164 #define ICMD_IMULCONST 28 /* val.i = constant */
166 #define JAVA_ILOAD_3 29
167 #define ICMD_IANDCONST 29 /* val.i = constant */
169 #define JAVA_LLOAD_0 30
170 #define ICMD_IORCONST 30 /* val.i = constant */
172 #define JAVA_LLOAD_1 31
173 #define ICMD_IXORCONST 31 /* val.i = constant */
175 #define JAVA_LLOAD_2 32
176 #define ICMD_ISHLCONST 32 /* val.i = constant */
178 #define JAVA_LLOAD_3 33
179 #define ICMD_ISHRCONST 33 /* val.i = constant */
181 #define JAVA_FLOAD_0 34
182 #define ICMD_IUSHRCONST 34 /* val.i = constant */
184 #define JAVA_FLOAD_1 35
185 #define ICMD_IREMPOW2 35 /* val.i = constant */
187 #define JAVA_FLOAD_2 36
188 #define ICMD_LADDCONST 36 /* val.l = constant */
190 #define JAVA_FLOAD_3 37
191 #define ICMD_LSUBCONST 37 /* val.l = constant */
193 #define JAVA_DLOAD_0 38
194 #define ICMD_LMULCONST 38 /* val.l = constant */
196 #define JAVA_DLOAD_1 39
197 #define ICMD_LANDCONST 39 /* val.l = constant */
199 #define JAVA_DLOAD_2 40
200 #define ICMD_LORCONST 40 /* val.l = constant */
202 #define JAVA_DLOAD_3 41
203 #define ICMD_LXORCONST 41 /* val.l = constant */
205 #define JAVA_ALOAD_0 42
206 #define ICMD_LSHLCONST 42 /* val.l = constant */
208 #define JAVA_ALOAD_1 43
209 #define ICMD_LSHRCONST 43 /* val.l = constant */
211 #define JAVA_ALOAD_2 44
212 #define ICMD_LUSHRCONST 44 /* val.l = constant */
214 #define JAVA_ALOAD_3 45
215 #define ICMD_LREMPOW2 45 /* val.l = constant */
217 #define JAVA_IALOAD 46
218 #define ICMD_IALOAD 46
220 #define JAVA_LALOAD 47
221 #define ICMD_LALOAD 47
223 #define JAVA_FALOAD 48
224 #define ICMD_FALOAD 48
226 #define JAVA_DALOAD 49
227 #define ICMD_DALOAD 49
229 #define JAVA_AALOAD 50
230 #define ICMD_AALOAD 50
232 #define JAVA_BALOAD 51
233 #define ICMD_BALOAD 51
235 #define JAVA_CALOAD 52
236 #define ICMD_CALOAD 52
238 #define JAVA_SALOAD 53
239 #define ICMD_SALOAD 53
241 /* order of STORE instructions must be*/
242 /* equal to order of TYPE_XXX defines */
243 #define JAVA_ISTORE 54
244 #define ICMD_ISTORE 54 /* op1 = local variable */
246 #define JAVA_LSTORE 55
247 #define ICMD_LSTORE 55 /* op1 = local variable */
249 #define JAVA_FSTORE 56
250 #define ICMD_FSTORE 56 /* op1 = local variable */
252 #define JAVA_DSTORE 57
253 #define ICMD_DSTORE 57 /* op1 = local variable */
255 #define JAVA_ASTORE 58
256 #define ICMD_ASTORE 58 /* op1 = local variable */
258 #define JAVA_ISTORE_0 59
259 #define ICMD_IF_LEQ 59 /* op1 = target JavaVM pc, val.l */
261 #define JAVA_ISTORE_1 60
262 #define ICMD_IF_LNE 60 /* op1 = target JavaVM pc, val.l */
264 #define JAVA_ISTORE_2 61
265 #define ICMD_IF_LLT 61 /* op1 = target JavaVM pc, val.l */
267 #define JAVA_ISTORE_3 62
268 #define ICMD_IF_LGE 62 /* op1 = target JavaVM pc, val.l */
270 #define JAVA_LSTORE_0 63
271 #define ICMD_IF_LGT 63 /* op1 = target JavaVM pc, val.l */
273 #define JAVA_LSTORE_1 64
274 #define ICMD_IF_LLE 64 /* op1 = target JavaVM pc, val.l */
276 #define JAVA_LSTORE_2 65
277 #define ICMD_IF_LCMPEQ 65 /* op1 = target JavaVM pc */
279 #define JAVA_LSTORE_3 66
280 #define ICMD_IF_LCMPNE 66 /* op1 = target JavaVM pc */
282 #define JAVA_FSTORE_0 67
283 #define ICMD_IF_LCMPLT 67 /* op1 = target JavaVM pc */
285 #define JAVA_FSTORE_1 68
286 #define ICMD_IF_LCMPGE 68 /* op1 = target JavaVM pc */
288 #define JAVA_FSTORE_2 69
289 #define ICMD_IF_LCMPGT 69 /* op1 = target JavaVM pc */
291 #define JAVA_FSTORE_3 70
292 #define ICMD_IF_LCMPLE 70 /* op1 = target JavaVM pc */
294 #define JAVA_DSTORE_0 71
296 #define JAVA_DSTORE_1 72
298 #define JAVA_DSTORE_2 73
300 #define JAVA_DSTORE_3 74
302 #define JAVA_ASTORE_0 75
304 #define JAVA_ASTORE_1 76
306 #define JAVA_ASTORE_2 77
308 #define JAVA_ASTORE_3 78
310 #define JAVA_IASTORE 79
311 #define ICMD_IASTORE 79
313 #define JAVA_LASTORE 80
314 #define ICMD_LASTORE 80
316 #define JAVA_FASTORE 81
317 #define ICMD_FASTORE 81
319 #define JAVA_DASTORE 82
320 #define ICMD_DASTORE 82
322 #define JAVA_AASTORE 83
323 #define ICMD_AASTORE 83
325 #define JAVA_BASTORE 84
326 #define ICMD_BASTORE 84
328 #define JAVA_CASTORE 85
329 #define ICMD_CASTORE 85
331 #define JAVA_SASTORE 86
332 #define ICMD_SASTORE 86
343 #define JAVA_DUP_X1 90
344 #define ICMD_DUP_X1 90
346 #define JAVA_DUP_X2 91
347 #define ICMD_DUP_X2 91
352 #define JAVA_DUP2_X1 93
353 #define ICMD_DUP2_X1 93
355 #define JAVA_DUP2_X2 94
356 #define ICMD_DUP2_X2 94
373 #define JAVA_ISUB 100
374 #define ICMD_ISUB 100
376 #define JAVA_LSUB 101
377 #define ICMD_LSUB 101
379 #define JAVA_FSUB 102
380 #define ICMD_FSUB 102
382 #define JAVA_DSUB 103
383 #define ICMD_DSUB 103
385 #define JAVA_IMUL 104
386 #define ICMD_IMUL 104
388 #define JAVA_LMUL 105
389 #define ICMD_LMUL 105
391 #define JAVA_FMUL 106
392 #define ICMD_FMUL 106
394 #define JAVA_DMUL 107
395 #define ICMD_DMUL 107
397 #define JAVA_IDIV 108
398 #define ICMD_IDIV 108
400 #define JAVA_LDIV 109
401 #define ICMD_LDIV 109
403 #define JAVA_FDIV 110
404 #define ICMD_FDIV 110
406 #define JAVA_DDIV 111
407 #define ICMD_DDIV 111
409 #define JAVA_IREM 112
410 #define ICMD_IREM 112
412 #define JAVA_LREM 113
413 #define ICMD_LREM 113
415 #define JAVA_FREM 114
416 #define ICMD_FREM 114
418 #define JAVA_DREM 115
419 #define ICMD_DREM 115
421 #define JAVA_INEG 116
422 #define ICMD_INEG 116
424 #define JAVA_LNEG 117
425 #define ICMD_LNEG 117
427 #define JAVA_FNEG 118
428 #define ICMD_FNEG 118
430 #define JAVA_DNEG 119
431 #define ICMD_DNEG 119
433 #define JAVA_ISHL 120
434 #define ICMD_ISHL 120
436 #define JAVA_LSHL 121
437 #define ICMD_LSHL 121
439 #define JAVA_ISHR 122
440 #define ICMD_ISHR 122
442 #define JAVA_LSHR 123
443 #define ICMD_LSHR 123
445 #define JAVA_IUSHR 124
446 #define ICMD_IUSHR 124
448 #define JAVA_LUSHR 125
449 #define ICMD_LUSHR 125
451 #define JAVA_IAND 126
452 #define ICMD_IAND 126
454 #define JAVA_LAND 127
455 #define ICMD_LAND 127
463 #define JAVA_IXOR 130
464 #define ICMD_IXOR 130
466 #define JAVA_LXOR 131
467 #define ICMD_LXOR 131
469 #define JAVA_IINC 132
470 #define ICMD_IINC 132 /* op1 = local variable, val.i = constant */
508 #define JAVA_INT2BYTE 145
509 #define ICMD_INT2BYTE 145
511 #define JAVA_INT2CHAR 146
512 #define ICMD_INT2CHAR 146
514 #define JAVA_INT2SHORT 147
515 #define ICMD_INT2SHORT 147
517 #define JAVA_LCMP 148
518 #define ICMD_LCMP 148
520 #define JAVA_FCMPL 149
521 #define ICMD_FCMPL 149
523 #define JAVA_FCMPG 150
524 #define ICMD_FCMPG 150
526 #define JAVA_DCMPL 151
527 #define ICMD_DCMPL 151
529 #define JAVA_DCMPG 152
530 #define ICMD_DCMPG 152
532 #define JAVA_IFEQ 153
533 #define ICMD_IFEQ 153 /* op1 = target JavaVM pc, val.i */
535 #define JAVA_IFNE 154
536 #define ICMD_IFNE 154 /* op1 = target JavaVM pc, val.i */
538 #define JAVA_IFLT 155
539 #define ICMD_IFLT 155 /* op1 = target JavaVM pc, val.i */
541 #define JAVA_IFGE 156
542 #define ICMD_IFGE 156 /* op1 = target JavaVM pc, val.i */
544 #define JAVA_IFGT 157
545 #define ICMD_IFGT 157 /* op1 = target JavaVM pc, val.i */
547 #define JAVA_IFLE 158
548 #define ICMD_IFLE 158 /* op1 = target JavaVM pc, val.i */
550 #define JAVA_IF_ICMPEQ 159
551 #define ICMD_IF_ICMPEQ 159 /* op1 = target JavaVM pc */
553 #define JAVA_IF_ICMPNE 160
554 #define ICMD_IF_ICMPNE 160 /* op1 = target JavaVM pc */
556 #define JAVA_IF_ICMPLT 161
557 #define ICMD_IF_ICMPLT 161 /* op1 = target JavaVM pc */
559 #define JAVA_IF_ICMPGE 162
560 #define ICMD_IF_ICMPGE 162 /* op1 = target JavaVM pc */
562 #define JAVA_IF_ICMPGT 163
563 #define ICMD_IF_ICMPGT 163 /* op1 = target JavaVM pc */
565 #define JAVA_IF_ICMPLE 164
566 #define ICMD_IF_ICMPLE 164 /* op1 = target JavaVM pc */
568 #define JAVA_IF_ACMPEQ 165
569 #define ICMD_IF_ACMPEQ 165 /* op1 = target JavaVM pc */
571 #define JAVA_IF_ACMPNE 166
572 #define ICMD_IF_ACMPNE 166 /* op1 = target JavaVM pc */
574 #define JAVA_GOTO 167
575 #define ICMD_GOTO 167 /* op1 = target JavaVM pc */
578 #define ICMD_JSR 168 /* op1 = target JavaVM pc */
581 #define ICMD_RET 169 /* op1 = local variable */
583 #define JAVA_TABLESWITCH 170
584 #define ICMD_TABLESWITCH 170 /* val.a = pointer to s4 table */
585 0, /* length must be computed */
586 #define JAVA_LOOKUPSWITCH 171
587 #define ICMD_LOOKUPSWITCH 171 /* val.a = pointer to s4 table */
588 0, /* length must be computed */
589 #define JAVA_IRETURN 172
590 #define ICMD_IRETURN 172
592 #define JAVA_LRETURN 173
593 #define ICMD_LRETURN 173
595 #define JAVA_FRETURN 174
596 #define ICMD_FRETURN 174
598 #define JAVA_DRETURN 175
599 #define ICMD_DRETURN 175
601 #define JAVA_ARETURN 176
602 #define ICMD_ARETURN 176
604 #define JAVA_RETURN 177
605 #define ICMD_RETURN 177
607 #define JAVA_GETSTATIC 178
608 #define ICMD_GETSTATIC 178 /* op1 = type, val.a = field address */
610 #define JAVA_PUTSTATIC 179
611 #define ICMD_PUTSTATIC 179 /* op1 = type, val.a = field address */
613 #define JAVA_GETFIELD 180
614 #define ICMD_GETFIELD 180 /* op1 = type, val.i = field offset */
616 #define JAVA_PUTFIELD 181
617 #define ICMD_PUTFIELD 181 /* op1 = type, val.i = field offset */
619 #define JAVA_INVOKEVIRTUAL 182
620 #define ICMD_INVOKEVIRTUAL 182 /* val.a = method info pointer */
622 #define JAVA_INVOKESPECIAL 183
623 #define ICMD_INVOKESPECIAL 183 /* val.a = method info pointer */
625 #define JAVA_INVOKESTATIC 184
626 #define ICMD_INVOKESTATIC 184 /* val.a = method info pointer */
628 #define JAVA_INVOKEINTERFACE 185
629 #define ICMD_INVOKEINTERFACE 185 /* val.a = method info pointer */
631 #define ICMD_CHECKASIZE 186 /* */
634 #define ICMD_NEW 187 /* op1 = 1, val.a = class pointer */
636 #define JAVA_NEWARRAY 188
637 #define ICMD_NEWARRAY 188 /* op1 = basic type */
639 #define JAVA_ANEWARRAY 189
640 #define ICMD_ANEWARRAY 189 /* op1 = 0, val.a = array pointer */
641 3, /* op1 = 1, val.a = class pointer */
642 #define JAVA_ARRAYLENGTH 190
643 #define ICMD_ARRAYLENGTH 190
645 #define JAVA_ATHROW 191
646 #define ICMD_ATHROW 191
648 #define JAVA_CHECKCAST 192
649 #define ICMD_CHECKCAST 192 /* op1 = 0, val.a = array pointer */
650 3, /* op1 = 1, val.a = class pointer */
651 #define JAVA_INSTANCEOF 193
652 #define ICMD_INSTANCEOF 193 /* op1 = 0, val.a = array pointer */
653 3, /* op1 = 1, val.a = class pointer */
654 #define JAVA_MONITORENTER 194
655 #define ICMD_MONITORENTER 194
657 #define JAVA_MONITOREXIT 195
658 #define ICMD_MONITOREXIT 195
660 #define JAVA_WIDE 196
661 0, /* length must be computed */
662 #define JAVA_MULTIANEWARRAY 197
663 #define ICMD_MULTIANEWARRAY 197 /* op1 = dimension, val.a = array */
665 #define JAVA_IFNULL 198
666 #define ICMD_IFNULL 198 /* op1 = target JavaVM pc */
668 #define JAVA_IFNONNULL 199
669 #define ICMD_IFNONNULL 199 /* op1 = target JavaVM pc */
671 #define JAVA_GOTO_W 200
673 #define JAVA_JSR_W 201
675 #define JAVA_BREAKPOINT 202
677 #define ICMD_CHECKEXCEPTION 203
679 #define ICMD_IASTORECONST 204
681 #define ICMD_LASTORECONST 205
683 #define ICMD_FASTORECONST 206
685 #define ICMD_DASTORECONST 207
687 #define ICMD_AASTORECONST 208
689 #define ICMD_BASTORECONST 209
691 #define ICMD_CASTORECONST 210
693 #define ICMD_SASTORECONST 211
698 1,1,1,1,1,1,1,1,1,1,
699 1,1,1,1,1,1,1,1,1,1,
700 1,1,1,1,1,1,1,1,1,1,
705 char *icmd_names[256] = {
708 "NULLCHECKPOP ", /* ICONST_M1 2 */
710 "UNDEF4 ", /* ICONST_1 4 */
711 "IDIVPOW2 ", /* ICONST_2 5 */
712 "LDIVPOW2 ", /* ICONST_3 6 */
713 "UNDEF7 ", /* ICONST_4 7 */
714 "UNDEF8 ", /* ICONST_5 8 */
716 "LCMPCONST ", /* LCONST_1 10 */
718 "UNDEF12 ", /* FCONST_1 12 */
719 "ELSE_ICONST ", /* FCONST_2 13 */
721 "IFEQ_ICONST ", /* DCONST_1 15 */
722 "IFNE_ICONST ", /* BIPUSH 16 */
723 "IFLT_ICONST ", /* SIPUSH 17 */
724 "IFGE_ICONST ", /* LDC1 18 */
725 "IFGT_ICONST ", /* LDC2 19 */
726 "IFLE_ICONST ", /* LDC2W 20 */
732 "IADDCONST ", /* ILOAD_0 26 */
733 "ISUBCONST ", /* ILOAD_1 27 */
734 "IMULCONST ", /* ILOAD_2 28 */
735 "IANDCONST ", /* ILOAD_3 29 */
736 "IORCONST ", /* LLOAD_0 30 */
737 "IXORCONST ", /* LLOAD_1 31 */
738 "ISHLCONST ", /* LLOAD_2 32 */
739 "ISHRCONST ", /* LLOAD_3 33 */
740 "IUSHRCONST ", /* FLOAD_0 34 */
741 "IREMPOW2 ", /* FLOAD_1 35 */
742 "LADDCONST ", /* FLOAD_2 36 */
743 "LSUBCONST ", /* FLOAD_3 37 */
744 "LMULCONST ", /* DLOAD_0 38 */
745 "LANDCONST ", /* DLOAD_1 39 */
746 "LORCONST ", /* DLOAD_2 40 */
747 "LXORCONST ", /* DLOAD_3 41 */
748 "LSHLCONST ", /* ALOAD_0 42 */
749 "LSHRCONST ", /* ALOAD_1 43 */
750 "LUSHRCONST ", /* ALOAD_2 44 */
751 "LREMPOW2 ", /* ALOAD_3 45 */
765 "IF_LEQ ", /* ISTORE_0 59 */
766 "IF_LNE ", /* ISTORE_1 60 */
767 "IF_LLT ", /* ISTORE_2 61 */
768 "IF_LGE ", /* ISTORE_3 62 */
769 "IF_LGT ", /* LSTORE_0 63 */
770 "IF_LLE ", /* LSTORE_1 64 */
771 "IF_LCMPEQ ", /* LSTORE_2 65 */
772 "IF_LCMPNE ", /* LSTORE_3 66 */
773 "IF_LCMPLT ", /* FSTORE_0 67 */
774 "IF_LCMPGE ", /* FSTORE_1 68 */
775 "IF_LCMPGT ", /* FSTORE_2 69 */
776 "IF_LCMPLE ", /* FSTORE_3 70 */
777 "UNDEF71 ", /* DSTORE_0 71 */
778 "UNDEF72 ", /* DSTORE_1 72 */
779 "UNDEF73 ", /* DSTORE_2 73 */
780 "UNDEF74 ", /* DSTORE_3 74 */
781 "UNDEF75 ", /* ASTORE_0 75 */
782 "UNDEF76 ", /* ASTORE_1 76 */
783 "UNDEF77 ", /* ASTORE_2 77 */
784 "UNDEF78 ", /* ASTORE_3 78 */
851 "INT2BYTE ", /* 145 */
852 "INT2CHAR ", /* 146 */
853 "INT2SHORT ", /* 147 */
865 "IF_ICMPEQ ", /* 159 */
866 "IF_ICMPNE ", /* 160 */
867 "IF_ICMPLT ", /* 161 */
868 "IF_ICMPGE ", /* 162 */
869 "IF_ICMPGT ", /* 163 */
870 "IF_ICMPLE ", /* 164 */
871 "IF_ACMPEQ ", /* 165 */
872 "IF_ACMPNE ", /* 166 */
876 "TABLESWITCH ", /* 170 */
877 "LOOKUPSWITCH ", /* 171 */
878 "IRETURN ", /* 172 */
879 "LRETURN ", /* 173 */
880 "FRETURN ", /* 174 */
881 "DRETURN ", /* 175 */
882 "ARETURN ", /* 176 */
884 "GETSTATIC ", /* 178 */
885 "PUTSTATIC ", /* 179 */
886 "GETFIELD ", /* 180 */
887 "PUTFIELD ", /* 181 */
888 "INVOKEVIRTUAL ", /* 182 */
889 "INVOKESPECIAL ", /* 183 */
890 "INVOKESTATIC ", /* 184 */
891 "INVOKEINTERFACE", /* 185 */
892 "CHECKASIZE ", /* UNDEF186 186 */
894 "NEWARRAY ", /* 188 */
895 "ANEWARRAY ", /* 189 */
896 "ARRAYLENGTH ", /* 190 */
898 "CHECKCAST ", /* 192 */
899 "INSTANCEOF ", /* 193 */
900 "MONITORENTER ", /* 194 */
901 "MONITOREXIT ", /* 195 */
902 "UNDEF196 ", /* WIDE 196 */
903 "MULTIANEWARRAY ", /* 197 */
905 "IFNONNULL ", /* 199 */
906 "UNDEF200 ", /* GOTO_W 200 */
907 "UNDEF201 ", /* JSR_W 201 */
908 "UNDEF202 ", /* BREAKPOINT 202 */
909 "CHECKEXCEPTION ", /* UNDEF203 203 */
910 "IASTORECONST ", /* 204 */
911 "LASTORECONST ", /* 205 */
912 "FASTORECONST ", /* 206 */
913 "DASTORECONST ", /* 207 */
914 "AASTORECONST ", /* 208 */
915 "BASTORECONST ", /* 209 */
916 "CASTORECONST ", /* 210 */
917 "SASTORECONST ", /* 211 */
919 "UNDEF212", "UNDEF213", "UNDEF214", "UNDEF215",
920 "UNDEF216", "UNDEF217", "UNDEF218", "UNDEF219", "UNDEF220",
921 "UNDEF221", "UNDEF222", "UNDEF223", "UNDEF224", "UNDEF225",
922 "UNDEF226", "UNDEF227", "UNDEF228", "UNDEF229", "UNDEF230",
923 "UNDEF231", "UNDEF232", "UNDEF233", "UNDEF234", "UNDEF235",
924 "UNDEF236", "UNDEF237", "UNDEF238", "UNDEF239", "UNDEF240",
925 "UNDEF241", "UNDEF242", "UNDEF243", "UNDEF244", "UNDEF245",
926 "UNDEF246", "UNDEF247", "UNDEF248", "UNDEF249", "UNDEF250",
928 "INLINE_START ", /* 251 */
929 "INLINE_END ", /* 252 */
931 "BUILTIN3 ", /* 253 */
932 "BUILTIN2 ", /* 254 */
933 "BUILTIN1 " /* 255 */
937 char *opcode_names[256] = {
940 "ICONST_M1 ", /* ICONST_M1 2 */
941 "ICONST_0 ", /* ICONST_0 3 */
942 "ICONST_1 ", /* ICONST_1 4 */
943 "ICONST_2 ", /* ICONST_2 5 */
944 "ICONST_3 ", /* ICONST_3 6 */
945 "ICONST_4 ", /* ICONST_4 7 */
946 "ICONST_5 ", /* ICONST_5 8 */
947 "LCONST_0 ", /* LCONST_0 9 */
948 "LCONST_1 ", /* LCONST_1 10 */
949 "FCONST_0 ", /* FCONST_0 11 */
950 "FCONST_1 ", /* FCONST_1 12 */
951 "FCONST_2 ", /* FCONST_2 13 */
952 "DCONST_0 ", /* DCONST_0 14 */
953 "DCONST_1 ", /* DCONST_1 15 */
954 "BIPUSH ", /* BIPUSH 16 */
955 "SIPUSH ", /* SIPUSH 17 */
957 "LDC_W ", /* LDC_W 19 */
958 "LDC2_W ", /* LDC2_W 20 */
964 "ILOAD_0 ", /* ILOAD_0 26 */
965 "ILOAD_1 ", /* ILOAD_1 27 */
966 "ILOAD_2 ", /* ILOAD_2 28 */
967 "ILOAD_3 ", /* ILOAD_3 29 */
968 "LLOAD_0 ", /* LLOAD_0 30 */
969 "LLOAD_1 ", /* LLOAD_1 31 */
970 "LLOAD_2 ", /* LLOAD_2 32 */
971 "LLOAD_3 ", /* LLOAD_3 33 */
972 "FLOAD_0 ", /* FLOAD_0 34 */
973 "FLOAD_1 ", /* FLOAD_1 35 */
974 "FLOAD_2 ", /* FLOAD_2 36 */
975 "FLOAD_3 ", /* FLOAD_3 37 */
976 "DLOAD_0 ", /* DLOAD_0 38 */
977 "DLOAD_1 ", /* DLOAD_1 39 */
978 "DLOAD_2 ", /* DLOAD_2 40 */
979 "DLOAD_3 ", /* DLOAD_3 41 */
980 "ALOAD_0 ", /* ALOAD_0 42 */
981 "ALOAD_1 ", /* ALOAD_1 43 */
982 "ALOAD_2 ", /* ALOAD_2 44 */
983 "ALOAD_3 ", /* ALOAD_3 45 */
997 "ISTORE_0 ", /* ISTORE_0 59 */
998 "ISTORE_1 ", /* ISTORE_1 60 */
999 "ISTORE_2 ", /* ISTORE_2 61 */
1000 "ISTORE_3 ", /* ISTORE_3 62 */
1001 "LSTORE_0 ", /* LSTORE_0 63 */
1002 "LSTORE_1 ", /* LSTORE_1 64 */
1003 "LSTORE_2 ", /* LSTORE_2 65 */
1004 "LSTORE_3 ", /* LSTORE_3 66 */
1005 "FSTORE_0 ", /* FSTORE_0 67 */
1006 "FSTORE_1 ", /* FSTORE_1 68 */
1007 "FSTORE_2 ", /* FSTORE_2 69 */
1008 "FSTORE_3 ", /* FSTORE_3 70 */
1009 "DSTORE_0 ", /* DSTORE_0 71 */
1010 "DSTORE_1 ", /* DSTORE_1 72 */
1011 "DSTORE_2 ", /* DSTORE_2 73 */
1012 "DSTORE_3 ", /* DSTORE_3 74 */
1013 "ASTORE_0 ", /* ASTORE_0 75 */
1014 "ASTORE_1 ", /* ASTORE_1 76 */
1015 "ASTORE_2 ", /* ASTORE_2 77 */
1016 "ASTORE_3 ", /* ASTORE_3 78 */
1017 "IASTORE ", /* 79 */
1018 "LASTORE ", /* 80 */
1019 "FASTORE ", /* 81 */
1020 "DASTORE ", /* 82 */
1021 "AASTORE ", /* 83 */
1022 "BASTORE ", /* 84 */
1023 "CASTORE ", /* 85 */
1024 "SASTORE ", /* 86 */
1031 "DUP2_X1 ", /* 93 */
1032 "DUP2_X2 ", /* 94 */
1083 "INT2BYTE ", /* 145 */
1084 "INT2CHAR ", /* 146 */
1085 "INT2SHORT ", /* 147 */
1097 "IF_ICMPEQ ", /* 159 */
1098 "IF_ICMPNE ", /* 160 */
1099 "IF_ICMPLT ", /* 161 */
1100 "IF_ICMPGE ", /* 162 */
1101 "IF_ICMPGT ", /* 163 */
1102 "IF_ICMPLE ", /* 164 */
1103 "IF_ACMPEQ ", /* 165 */
1104 "IF_ACMPNE ", /* 166 */
1108 "TABLESWITCH ", /* 170 */
1109 "LOOKUPSWITCH ", /* 171 */
1110 "IRETURN ", /* 172 */
1111 "LRETURN ", /* 173 */
1112 "FRETURN ", /* 174 */
1113 "DRETURN ", /* 175 */
1114 "ARETURN ", /* 176 */
1115 "RETURN ", /* 177 */
1116 "GETSTATIC ", /* 178 */
1117 "PUTSTATIC ", /* 179 */
1118 "GETFIELD ", /* 180 */
1119 "PUTFIELD ", /* 181 */
1120 "INVOKEVIRTUAL ", /* 182 */
1121 "INVOKESPECIAL ", /* 183 */
1122 "INVOKESTATIC ", /* 184 */
1123 "INVOKEINTERFACE", /* 185 */
1124 "UNDEF186 ", /* 186 */
1126 "NEWARRAY ", /* 188 */
1127 "ANEWARRAY ", /* 189 */
1128 "ARRAYLENGTH ", /* 190 */
1129 "ATHROW ", /* 191 */
1130 "CHECKCAST ", /* 192 */
1131 "INSTANCEOF ", /* 193 */
1132 "MONITORENTER ", /* 194 */
1133 "MONITOREXIT ", /* 195 */
1134 "WIDE ", /* WIDE 196 */
1135 "MULTIANEWARRAY ", /* 197 */
1136 "IFNULL ", /* 198 */
1137 "IFNONNULL ", /* 199 */
1138 "GOTO_W ", /* GOTO_W 200 */
1139 "JSR_W ", /* JSR_W 201 */
1140 "BREAKPOINT ", /* BREAKPOINT 202 */
1142 "UNDEF203", "UNDEF204", "UNDEF205",
1143 "UNDEF206", "UNDEF207", "UNDEF208", "UNDEF209", "UNDEF210",
1144 "UNDEF211", "UNDEF212", "UNDEF213", "UNDEF214", "UNDEF215",
1145 "UNDEF216", "UNDEF217", "UNDEF218", "UNDEF219", "UNDEF220",
1146 "UNDEF221", "UNDEF222", "UNDEF223", "UNDEF224", "UNDEF225",
1147 "UNDEF226", "UNDEF227", "UNDEF228", "UNDEF229", "UNDEF230",
1148 "UNDEF231", "UNDEF232", "UNDEF233", "UNDEF234", "UNDEF235",
1149 "UNDEF236", "UNDEF237", "UNDEF238", "UNDEF239", "UNDEF240",
1150 "UNDEF241", "UNDEF242", "UNDEF243", "UNDEF244", "UNDEF245",
1151 "UNDEF246", "UNDEF247", "UNDEF248", "UNDEF249", "UNDEF250",
1152 "UNDEF251", "UNDEF252", "UNDEF253", "UNDEF254", "UNDEF255"
1156 #if defined(USEBUILTINTABLE)
1159 stdopdescriptor builtintable[] = {
1160 { ICMD_LCMP, TYPE_LONG, TYPE_LONG, TYPE_INT, ICMD_BUILTIN2,
1161 (functionptr) builtin_lcmp , SUPPORT_LONG && SUPPORT_LONG_CMP, false },
1162 { ICMD_LAND, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1163 (functionptr) builtin_land , SUPPORT_LONG && SUPPORT_LONG_LOG, false },
1164 { ICMD_LOR, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1165 (functionptr) builtin_lor , SUPPORT_LONG && SUPPORT_LONG_LOG, false },
1166 { ICMD_LXOR, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1167 (functionptr) builtin_lxor , SUPPORT_LONG && SUPPORT_LONG_LOG, false },
1168 { ICMD_LSHL, TYPE_LONG, TYPE_INT, TYPE_LONG, ICMD_BUILTIN2,
1169 (functionptr) builtin_lshl , SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
1170 { ICMD_LSHR, TYPE_LONG, TYPE_INT, TYPE_LONG, ICMD_BUILTIN2,
1171 (functionptr) builtin_lshr, SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
1172 { ICMD_LUSHR, TYPE_LONG, TYPE_INT, TYPE_LONG, ICMD_BUILTIN2,
1173 (functionptr) builtin_lushr, SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
1174 { ICMD_LADD, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1175 (functionptr) builtin_ladd , SUPPORT_LONG && SUPPORT_LONG_ADD, false },
1176 { ICMD_LSUB, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1177 (functionptr) builtin_lsub , SUPPORT_LONG && SUPPORT_LONG_ADD, false },
1178 { ICMD_LNEG, TYPE_LONG, TYPE_VOID, TYPE_LONG, ICMD_BUILTIN1,
1179 (functionptr) builtin_lneg, SUPPORT_LONG && SUPPORT_LONG_ADD, true },
1180 { ICMD_LMUL, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1181 (functionptr) builtin_lmul , SUPPORT_LONG && SUPPORT_LONG_MUL, false },
1182 { ICMD_I2F, TYPE_INT, TYPE_VOID, TYPE_FLOAT, ICMD_BUILTIN1,
1183 (functionptr) builtin_i2f, SUPPORT_FLOAT && SUPPORT_IFCVT, true },
1184 { ICMD_I2D, TYPE_INT, TYPE_VOID, TYPE_DOUBLE, ICMD_BUILTIN1,
1185 (functionptr) builtin_i2d, SUPPORT_DOUBLE && SUPPORT_IFCVT, true },
1186 { ICMD_L2F, TYPE_LONG, TYPE_VOID, TYPE_FLOAT, ICMD_BUILTIN1,
1187 (functionptr) builtin_l2f, SUPPORT_LONG && SUPPORT_FLOAT && SUPPORT_LONG_FCVT, true },
1188 { ICMD_L2D, TYPE_LONG, TYPE_VOID, TYPE_DOUBLE, ICMD_BUILTIN1,
1189 (functionptr) builtin_l2d, SUPPORT_LONG && SUPPORT_DOUBLE && SUPPORT_LONG_FCVT, true },
1190 { ICMD_F2L, TYPE_FLOAT, TYPE_VOID, TYPE_LONG, ICMD_BUILTIN1,
1191 (functionptr) builtin_f2l, SUPPORT_FLOAT && SUPPORT_LONG && SUPPORT_LONG_ICVT, true },
1192 { ICMD_D2L, TYPE_DOUBLE, TYPE_VOID, TYPE_LONG, ICMD_BUILTIN1,
1193 (functionptr) builtin_d2l, SUPPORT_DOUBLE && SUPPORT_LONG && SUPPORT_LONG_ICVT, true },
1194 { ICMD_F2I, TYPE_FLOAT, TYPE_VOID, TYPE_INT, ICMD_BUILTIN1,
1195 (functionptr) builtin_f2i, SUPPORT_FLOAT && SUPPORT_FICVT, true },
1196 { ICMD_D2I, TYPE_DOUBLE, TYPE_VOID, TYPE_INT, ICMD_BUILTIN1,
1197 (functionptr) builtin_d2i, SUPPORT_DOUBLE && SUPPORT_FICVT, true },
1198 { 255, 0, 0, 0, 0, NULL, true, false },
1203 static int builtintablelen;
1205 #endif /* USEBUILTINTABLE */
1212 printf("PARSE method name ="); \
1213 utf_display(m->class->name); \
1215 method_display(m); \
1216 printf(" exceptiontablelength %d\n",m->exceptiontablelength); \
1221 /*****************************************************************************
1222 TABLE OF BUILTIN FUNCTIONS
1224 This table lists the builtin functions which are used inside
1227 The first part of the table (up to the 255-marker) lists the
1228 opcodes which are automatically replaced in stack.c.
1230 The second part lists the builtin functions which are "manually"
1231 used for BUILTIN* opcodes in parse.c and stack.c.
1233 *****************************************************************************/
1235 builtin_descriptor builtin_desc[] = {
1236 #if defined(USEBUILTINTABLE)
1237 {ICMD_LCMP , BUILTIN_lcmp ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_INT ,
1238 SUPPORT_LONG && SUPPORT_LONG_CMP,false,"lcmp"},
1240 {ICMD_LAND , BUILTIN_land ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
1241 SUPPORT_LONG && SUPPORT_LONG_LOG,false,"land"},
1242 {ICMD_LOR , BUILTIN_lor ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
1243 SUPPORT_LONG && SUPPORT_LONG_LOG,false,"lor"},
1244 {ICMD_LXOR , BUILTIN_lxor ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
1245 SUPPORT_LONG && SUPPORT_LONG_LOG,false,"lxor"},
1247 {ICMD_LSHL , BUILTIN_lshl ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_INT ,TYPE_VOID ,TYPE_LONG ,
1248 SUPPORT_LONG && SUPPORT_LONG_SHIFT,false,"lshl"},
1249 {ICMD_LSHR , BUILTIN_lshr ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_INT ,TYPE_VOID ,TYPE_LONG ,
1250 SUPPORT_LONG && SUPPORT_LONG_SHIFT,false,"lshr"},
1251 {ICMD_LUSHR, BUILTIN_lushr,ICMD_BUILTIN2,TYPE_LONG ,TYPE_INT ,TYPE_VOID ,TYPE_LONG ,
1252 SUPPORT_LONG && SUPPORT_LONG_SHIFT,false,"lushr"},
1254 {ICMD_LADD , BUILTIN_ladd ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
1255 SUPPORT_LONG && SUPPORT_LONG_ADD,false,"ladd"},
1256 {ICMD_LSUB , BUILTIN_lsub ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
1257 SUPPORT_LONG && SUPPORT_LONG_ADD,false,"lsub"},
1258 {ICMD_LNEG , BUILTIN_lneg ,ICMD_BUILTIN1,TYPE_LONG ,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,
1259 SUPPORT_LONG && SUPPORT_LONG_ADD,false,"lneg"},
1260 {ICMD_LMUL , BUILTIN_lmul ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
1261 SUPPORT_LONG && SUPPORT_LONG_MUL,false,"lmul"},
1263 {ICMD_I2F , BUILTIN_i2f ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_FLOAT ,
1264 SUPPORT_FLOAT && SUPPORT_IFCVT,true ,"i2f"},
1265 {ICMD_I2D , BUILTIN_i2d ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_DOUBLE,
1266 SUPPORT_DOUBLE && SUPPORT_IFCVT,true ,"i2d"},
1267 {ICMD_L2F , BUILTIN_l2f ,ICMD_BUILTIN1,TYPE_LONG ,TYPE_VOID ,TYPE_VOID ,TYPE_FLOAT ,
1268 SUPPORT_LONG && SUPPORT_FLOAT && SUPPORT_LONG_FCVT,true ,"l2f"},
1269 {ICMD_L2D , BUILTIN_l2d ,ICMD_BUILTIN1,TYPE_LONG ,TYPE_VOID ,TYPE_VOID ,TYPE_DOUBLE,
1270 SUPPORT_LONG && SUPPORT_DOUBLE && SUPPORT_LONG_FCVT,true ,"l2d"},
1271 {ICMD_F2L , BUILTIN_f2l ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,
1272 SUPPORT_FLOAT && SUPPORT_LONG && SUPPORT_LONG_ICVT,true ,"f2l"},
1273 {ICMD_D2L , BUILTIN_d2l ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,
1274 SUPPORT_DOUBLE && SUPPORT_LONG && SUPPORT_LONG_ICVT,true ,"d2l"},
1275 {ICMD_F2I , BUILTIN_f2i ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID ,TYPE_VOID ,TYPE_INT ,
1276 SUPPORT_FLOAT && SUPPORT_FICVT,true ,"f2i"},
1277 {ICMD_D2I , BUILTIN_d2i ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID ,TYPE_VOID ,TYPE_INT ,
1278 SUPPORT_DOUBLE && SUPPORT_FICVT,true ,"d2i"},
1280 { ICMD_FADD , BUILTIN_fadd , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fadd" },
1281 { ICMD_FSUB , BUILTIN_fsub , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fsub" },
1282 { ICMD_FMUL , BUILTIN_fmul , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fmul" },
1283 { ICMD_FDIV , BUILTIN_fdiv , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fdiv" },
1284 { ICMD_FNEG , BUILTIN_fneg , ICMD_BUILTIN1, TYPE_FLT, TYPE_VOID , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fneg" },
1285 { ICMD_FCMPL, BUILTIN_fcmpl , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT , TYPE_VOID , TYPE_INT, SUPPORT_FLOAT, true, "fcmpl" },
1286 { ICMD_FCMPG, BUILTIN_fcmpg , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT , TYPE_VOID , TYPE_INT, SUPPORT_FLOAT, true, "fcmpg" },
1288 { ICMD_DADD , BUILTIN_dadd , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "dadd" },
1289 { ICMD_DSUB , BUILTIN_dsub , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "dsub" },
1290 { ICMD_DMUL , BUILTIN_dmul , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "dmul" },
1291 { ICMD_DDIV , BUILTIN_ddiv , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "ddiv" },
1292 { ICMD_DNEG , BUILTIN_dneg , ICMD_BUILTIN1, TYPE_DBL, TYPE_VOID , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "dneg" },
1293 { ICMD_DCMPL, BUILTIN_dcmpl , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL , TYPE_VOID , TYPE_INT, SUPPORT_DOUBLE, true, "dcmpl" },
1294 { ICMD_DCMPG, BUILTIN_dcmpg , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL , TYPE_VOID , TYPE_INT, SUPPORT_DOUBLE, true, "dcmpg" },
1296 { ICMD_F2D, BUILTIN_f2d , ICMD_BUILTIN1, TYPE_FLT, TYPE_VOID , TYPE_VOID , TYPE_DBL, SUPPORT_FLOAT && SUPPORT_DOUBLE, true, "f2d" },
1297 { ICMD_D2F, BUILTIN_d2f , ICMD_BUILTIN1, TYPE_DBL, TYPE_VOID , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT && SUPPORT_DOUBLE, true, "d2f" },
1300 /* this record marks the end of the automatically replaced opcodes */
1301 {255,NULL,0,0,0,0,0,0,0,"<INVALID>"},
1303 /* the following functions are not replaced automatically */
1305 #if defined(__ALPHA__)
1306 {255, BUILTIN_f2l ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,0,0,"f2l"},
1307 {255, BUILTIN_d2l ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,0,0,"d2l"},
1308 {255, BUILTIN_f2i ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID ,TYPE_VOID ,TYPE_INT ,0,0,"f2i"},
1309 {255, BUILTIN_d2i ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID ,TYPE_VOID ,TYPE_INT ,0,0,"d2i"},
1312 {255,BUILTIN_instanceof ,ICMD_BUILTIN2,TYPE_ADR ,TYPE_ADR ,TYPE_VOID ,TYPE_INT ,0,0,"instanceof"},
1313 {255,BUILTIN_arrayinstanceof ,ICMD_BUILTIN2,TYPE_ADR ,TYPE_ADR ,TYPE_VOID ,TYPE_INT ,0,0,"arrayinstanceof"},
1314 {255,BUILTIN_checkarraycast ,ICMD_BUILTIN2,TYPE_ADR ,TYPE_ADR ,TYPE_VOID ,TYPE_VOID ,0,0,"checkarraycast"},
1315 {255,BUILTIN_aastore ,ICMD_BUILTIN3,TYPE_ADR ,TYPE_INT ,TYPE_ADR ,TYPE_VOID ,0,0,"aastore"},
1316 {255,BUILTIN_new ,ICMD_BUILTIN1,TYPE_ADR ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"new"},
1317 {255,BUILTIN_newarray ,ICMD_BUILTIN2,TYPE_INT ,TYPE_ADR ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray"},
1318 {255,BUILTIN_newarray_boolean,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_boolean"},
1319 {255,BUILTIN_newarray_char ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_char"},
1320 {255,BUILTIN_newarray_float ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_float"},
1321 {255,BUILTIN_newarray_double ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_double"},
1322 {255,BUILTIN_newarray_byte ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_byte"},
1323 {255,BUILTIN_newarray_short ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_short"},
1324 {255,BUILTIN_newarray_int ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_int"},
1325 {255,BUILTIN_newarray_long ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_long"},
1326 #if defined(USE_THREADS)
1327 {255,BUILTIN_monitorenter ,ICMD_BUILTIN1,TYPE_ADR ,TYPE_VOID ,TYPE_VOID ,TYPE_VOID ,0,0,"monitorenter"},
1328 {255,BUILTIN_monitorexit ,ICMD_BUILTIN1,TYPE_ADR ,TYPE_VOID ,TYPE_VOID ,TYPE_VOID ,0,0,"monitorexit"},
1330 #if !SUPPORT_DIVISION
1331 {255,BUILTIN_idiv ,ICMD_BUILTIN2,TYPE_INT ,TYPE_INT ,TYPE_VOID ,TYPE_INT ,0,0,"idiv"},
1332 {255,BUILTIN_irem ,ICMD_BUILTIN2,TYPE_INT ,TYPE_INT ,TYPE_VOID ,TYPE_INT ,0,0,"irem"},
1334 #if !(SUPPORT_DIVISION && SUPPORT_LONG && SUPPORT_LONG_DIV)
1335 {255,BUILTIN_ldiv ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,0,0,"ldiv"},
1336 {255,BUILTIN_lrem ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,0,0,"lrem"},
1338 {255,BUILTIN_frem ,ICMD_BUILTIN2,TYPE_FLOAT ,TYPE_FLOAT ,TYPE_VOID ,TYPE_FLOAT ,0,0,"frem"},
1339 {255,BUILTIN_drem ,ICMD_BUILTIN2,TYPE_DOUBLE,TYPE_DOUBLE,TYPE_VOID ,TYPE_DOUBLE,0,0,"drem"},
1341 /* this record marks the end of the list */
1342 { 0,NULL,0,0,0,0,0,0,0,"<END>"}
1346 /* include compiler subsystems ************************************************/
1348 /* dummy function, used when there is no JavaVM code available */
1350 static functionptr do_nothing_function()
1356 /* jit_compile *****************************************************************
1358 jit_compile, new version of compiler, translates one method to machine code
1360 *******************************************************************************/
1362 static functionptr jit_compile_intern(methodinfo *m, codegendata *cd,
1363 registerdata *rd, loopdata *ld,
1364 t_inlining_globals *id);
1366 functionptr jit_compile(methodinfo *m)
1372 t_inlining_globals *id;
1378 /* this is the case if a native function is called by jni */
1380 if (m->flags & ACC_NATIVE)
1381 return (functionptr) m->stubroutine;
1383 #if defined(USE_THREADS)
1384 /* enter a monitor on the method */
1386 builtin_monitorenter((java_objectheader *) m);
1389 /* if method has been already compiled return immediately */
1391 if (m->entrypoint) {
1392 #if defined(USE_THREADS)
1393 builtin_monitorexit((java_objectheader *) m);
1396 return m->entrypoint;
1402 /* if there is no javacode, print error message and return empty method */
1406 log_message_method("No code given for: ", m);
1408 m->entrypoint = (functionptr) do_nothing_function;
1410 return m->entrypoint; /* return empty method */
1415 if (getcompilingtime)
1416 compilingtime_start();
1418 /* mark start of dump memory area */
1420 dumpsize = dump_size();
1422 /* allocate memory */
1424 cd = DNEW(codegendata);
1425 rd = DNEW(registerdata);
1426 ld = DNEW(loopdata);
1427 id = DNEW(t_inlining_globals);
1429 /* RTA static analysis must be called before inlining */
1431 RT_jit_parse(m); /* will be called just once */
1432 /* return value ignored for now */
1433 /* XTA static analysis must be called before inlining */
1435 XTA_jit_parse(m); /* will be called just once */
1436 /* return value ignored for now */
1439 /* must be called before reg_setup, because it can change maxlocals */
1440 /* init reqd to initialize for parse even in no inlining */
1441 inlining_setup(m, id);
1443 /* initialize the register allocator */
1444 reg_setup(m, rd, id);
1446 /* setup the codegendata memory */
1447 codegen_setup(m, cd, id);
1449 /* now call internal compile function */
1451 r = jit_compile_intern(m, cd, rd, ld, id);
1453 /* free some memory */
1456 codegen_free(m, cd);
1458 /* clear pointers to dump memory area */
1460 m->basicblocks = NULL;
1461 m->basicblockindex = NULL;
1462 m->instructions = NULL;
1464 /* NO !!! m->exceptiontable = NULL; */
1466 /* release dump area */
1468 dump_release(dumpsize);
1472 if (getcompilingtime)
1473 compilingtime_stop();
1475 /* define in options.h; Used in main.c, jit.c & inline.c */
1477 if ((utf_new_char("main") == m->name) && (useinliningm))
1478 useinlining = false;
1481 #if defined(USE_THREADS)
1482 /* leave the monitor */
1484 builtin_monitorexit((java_objectheader *) m );
1489 log_message_method("Running: ", m);
1492 /* return pointer to the methods entry point */
1498 /* jit_compile_intern **********************************************************
1500 Static internal function which does the actual compilation.
1502 *******************************************************************************/
1504 static functionptr jit_compile_intern(methodinfo *m, codegendata *cd,
1505 registerdata *rd, loopdata *ld,
1506 t_inlining_globals *id)
1508 /* print log message for compiled method */
1511 log_message_method("Compiling: ", m);
1513 /* initialize the static function's class */
1515 if (m->flags & ACC_STATIC && !m->class->initialized) {
1517 log_message_class("Initialize class ", m->class);
1519 if (!class_init(m->class))
1523 /* initialisation of variables and subsystems */
1525 m->isleafmethod = true;
1527 #if defined(STATISTICS)
1529 count_tryblocks += m->exceptiontablelength;
1530 count_javacodesize += m->jcodelength + 18;
1531 count_javaexcsize += m->exceptiontablelength * POINTERSIZE;
1535 /* initialise parameter type descriptor */
1537 descriptor2types(m);
1539 /* call the compiler passes ***********************************************/
1542 log_message_method("Parsing: ", m);
1544 /* call parse pass */
1545 if (!parse(m, cd, id)) {
1547 log_message_method("Exception while parsing: ", m);
1552 if (compileverbose) {
1553 log_message_method("Parsing done: ", m);
1554 log_message_method("Analysing: ", m);
1557 /* call stack analysis pass */
1558 if (!analyse_stack(m, cd, rd)) {
1560 log_message_method("Exception while analysing: ", m);
1566 log_message_method("Analysing done: ", m);
1568 #ifdef CACAO_TYPECHECK
1571 log_message_method("Typechecking: ", m);
1573 /* call typecheck pass */
1574 if (!typecheck(m, cd, rd)) {
1576 log_message_method("Exception while typechecking: ", m);
1582 log_message_method("Typechecking done: ", m);
1588 analyseGraph(m, ld);
1589 optimize_loops(m, cd, ld);
1592 #ifdef SPECIALMEMUSE
1597 log_message_method("Allocating registers: ", m);
1599 /* allocate registers */
1602 lsra(m, cd, rd, ld, id);
1605 regalloc(m, cd, rd);
1607 if (compileverbose) {
1608 log_message_method("Allocating registers done: ", m);
1609 log_message_method("Generating code: ", m);
1612 /* now generate the machine code */
1616 log_message_method("Generating code done: ", m);
1618 /* intermediate and assembly code listings */
1620 if (showintermediate) {
1621 show_icmd_method(m, cd, rd);
1623 } else if (showdisassemble) {
1624 disassemble((void *) ((long) m->mcode + cd->dseglen),
1625 m->mcodelength - cd->dseglen);
1628 if (showddatasegment)
1629 dseg_display(m, cd);
1632 log_message_method("Compiling done: ", m);
1634 /* return pointer to the methods entry point */
1636 return m->entrypoint;
1640 void compile_all_class_methods(classinfo *c)
1644 for (i = 0; i < c->methodscount; i++) {
1645 (void) jit_compile(&(c->methods[i]));
1650 /* functions for compiler initialisation and finalisation *********************/
1652 #ifdef USEBUILTINTABLE
1654 static int stdopcompare(const void *a, const void *b)
1656 builtin_descriptor *o1 = (builtin_descriptor *) a;
1657 builtin_descriptor *o2 = (builtin_descriptor *) b;
1658 if (!o1->supported && o2->supported)
1660 if (o1->supported && !o2->supported)
1662 return (o1->opcode < o2->opcode) ? -1 : (o1->opcode > o2->opcode);
1665 static inline void sort_builtintable()
1670 while (builtin_desc[len].opcode != 255) len++;
1671 qsort(builtin_desc, len, sizeof(builtin_descriptor), stdopcompare);
1673 for (--len; len>=0 && builtin_desc[len].supported; len--);
1674 builtintablelen = ++len;
1678 builtin_descriptor *find_builtin(int icmd)
1680 builtin_descriptor *first = builtin_desc;
1681 builtin_descriptor *last = builtin_desc + builtintablelen;
1682 int len = last - first;
1684 builtin_descriptor *middle;
1688 middle = first + half;
1689 if (middle->opcode < icmd) {
1695 return first != last ? first : NULL;
1706 #ifdef USEBUILTINTABLE
1707 sort_builtintable();
1710 #if defined(__ALPHA__)
1711 has_ext_instr_set = ! has_no_x_instr_set();
1714 for (i = 0; i < 256; i++)
1717 stackreq[JAVA_NOP] = 0;
1718 stackreq[JAVA_ISTORE] = 0;
1719 stackreq[JAVA_LSTORE] = 0;
1720 stackreq[JAVA_FSTORE] = 0;
1721 stackreq[JAVA_DSTORE] = 0;
1722 stackreq[JAVA_ASTORE] = 0;
1723 stackreq[JAVA_ISTORE_0] = 0;
1724 stackreq[JAVA_ISTORE_1] = 0;
1725 stackreq[JAVA_ISTORE_2] = 0;
1726 stackreq[JAVA_ISTORE_3] = 0;
1727 stackreq[JAVA_LSTORE_0] = 0;
1728 stackreq[JAVA_LSTORE_1] = 0;
1729 stackreq[JAVA_LSTORE_2] = 0;
1730 stackreq[JAVA_LSTORE_3] = 0;
1731 stackreq[JAVA_FSTORE_0] = 0;
1732 stackreq[JAVA_FSTORE_1] = 0;
1733 stackreq[JAVA_FSTORE_2] = 0;
1734 stackreq[JAVA_FSTORE_3] = 0;
1735 stackreq[JAVA_DSTORE_0] = 0;
1736 stackreq[JAVA_DSTORE_1] = 0;
1737 stackreq[JAVA_DSTORE_2] = 0;
1738 stackreq[JAVA_DSTORE_3] = 0;
1739 stackreq[JAVA_ASTORE_0] = 0;
1740 stackreq[JAVA_ASTORE_1] = 0;
1741 stackreq[JAVA_ASTORE_2] = 0;
1742 stackreq[JAVA_ASTORE_3] = 0;
1743 stackreq[JAVA_IASTORE] = 0;
1744 stackreq[JAVA_LASTORE] = 0;
1745 stackreq[JAVA_FASTORE] = 0;
1746 stackreq[JAVA_DASTORE] = 0;
1747 stackreq[JAVA_AASTORE] = 0;
1748 stackreq[JAVA_BASTORE] = 0;
1749 stackreq[JAVA_CASTORE] = 0;
1750 stackreq[JAVA_SASTORE] = 0;
1751 stackreq[JAVA_POP] = 0;
1752 stackreq[JAVA_POP2] = 0;
1753 stackreq[JAVA_IINC] = 0;
1754 stackreq[JAVA_IFEQ] = 0;
1755 stackreq[JAVA_IFNE] = 0;
1756 stackreq[JAVA_IFLT] = 0;
1757 stackreq[JAVA_IFGE] = 0;
1758 stackreq[JAVA_IFGT] = 0;
1759 stackreq[JAVA_IFLE] = 0;
1760 stackreq[JAVA_IF_ICMPEQ] = 0;
1761 stackreq[JAVA_IF_ICMPNE] = 0;
1762 stackreq[JAVA_IF_ICMPLT] = 0;
1763 stackreq[JAVA_IF_ICMPGE] = 0;
1764 stackreq[JAVA_IF_ICMPGT] = 0;
1765 stackreq[JAVA_IF_ICMPLE] = 0;
1766 stackreq[JAVA_IF_ACMPEQ] = 0;
1767 stackreq[JAVA_IF_ACMPNE] = 0;
1768 stackreq[JAVA_GOTO] = 0;
1769 stackreq[JAVA_RET] = 0;
1770 stackreq[JAVA_TABLESWITCH] = 0;
1771 stackreq[JAVA_LOOKUPSWITCH] = 0;
1772 stackreq[JAVA_IRETURN] = 0;
1773 stackreq[JAVA_LRETURN] = 0;
1774 stackreq[JAVA_FRETURN] = 0;
1775 stackreq[JAVA_DRETURN] = 0;
1776 stackreq[JAVA_ARETURN] = 0;
1777 stackreq[JAVA_RETURN] = 0;
1778 stackreq[JAVA_PUTSTATIC] = 0;
1779 stackreq[JAVA_PUTFIELD] = 0;
1780 stackreq[JAVA_MONITORENTER] = 0;
1781 stackreq[JAVA_MONITOREXIT] = 0;
1782 stackreq[JAVA_WIDE] = 0;
1783 stackreq[JAVA_IFNULL] = 0;
1784 stackreq[JAVA_IFNONNULL] = 0;
1785 stackreq[JAVA_GOTO_W] = 0;
1786 stackreq[JAVA_BREAKPOINT] = 0;
1788 stackreq[JAVA_SWAP] = 2;
1789 stackreq[JAVA_DUP2] = 2;
1790 stackreq[JAVA_DUP_X1] = 3;
1791 stackreq[JAVA_DUP_X2] = 4;
1792 stackreq[JAVA_DUP2_X1] = 3;
1793 stackreq[JAVA_DUP2_X2] = 4;
1795 /* initialize the codegen stuff */
1806 * These are local overrides for various environment variables in Emacs.
1807 * Please do not remove this and leave it at the end of the file, where
1808 * Emacs will automagically detect them.
1809 * ---------------------------------------------------------------------
1812 * indent-tabs-mode: t