1 /* src/vm/jit/jit.c - calls the code generation functions
3 Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4 R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5 C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6 Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25 Contact: cacao@complang.tuwien.ac.at
27 Authors: Andreas Krall
30 Changes: Edwin Steiner
33 $Id: jit.c 2038 2005-03-20 11:22:40Z twisti $
44 #include "mm/memory.h"
45 #include "toolbox/logging.h"
46 #include "vm/builtin.h"
47 #include "vm/global.h"
48 #include "vm/loader.h"
49 #include "vm/options.h"
50 #include "vm/statistics.h"
51 #include "vm/tables.h"
52 #include "vm/jit/codegen.inc.h"
53 #include "vm/jit/jit.h"
55 #include "vm/jit/lsra.h"
57 #include "vm/jit/parse.h"
58 #include "vm/jit/reg.h"
59 #include "vm/jit/stack.h"
60 #include "vm/jit/inline/inline.h"
61 #include "vm/jit/inline/parseRT.h"
62 #include "vm/jit/inline/parseXTA.h"
63 #include "vm/jit/loop/analyze.h"
64 #include "vm/jit/loop/graph.h"
65 #include "vm/jit/loop/loop.h"
66 #include "vm/jit/verify/typecheck.h"
68 #if defined(USE_THREADS)
69 # if defined(NATIVE_THREADS)
70 # include "threads/native/threads.h"
72 # include "threads/green/threads.h"
78 /* global switches ************************************************************/
83 int jcommandsize[256] = {
88 #define JAVA_ACONST_NULL 1
89 #define ICMD_ACONST 1 /* val.a = constant */
91 #define JAVA_ICONST_M1 2
92 #define ICMD_NULLCHECKPOP 2
94 #define JAVA_ICONST_0 3
95 #define ICMD_ICONST 3 /* val.i = constant */
97 #define JAVA_ICONST_1 4
99 #define JAVA_ICONST_2 5
100 #define ICMD_IDIVPOW2 5 /* val.i = constant */
102 #define JAVA_ICONST_3 6
103 #define ICMD_LDIVPOW2 6 /* val.l = constant */
105 #define JAVA_ICONST_4 7
107 #define JAVA_ICONST_5 8
109 #define JAVA_LCONST_0 9
110 #define ICMD_LCONST 9 /* val.l = constant */
112 #define JAVA_LCONST_1 10
113 #define ICMD_LCMPCONST 10 /* val.l = constant */
115 #define JAVA_FCONST_0 11
116 #define ICMD_FCONST 11 /* val.f = constant */
118 #define JAVA_FCONST_1 12
120 #define JAVA_FCONST_2 13
121 #define ICMD_ELSE_ICONST 13
123 #define JAVA_DCONST_0 14
124 #define ICMD_DCONST 14 /* val.d = constant */
126 #define JAVA_DCONST_1 15
127 #define ICMD_IFEQ_ICONST 15
129 #define JAVA_BIPUSH 16
130 #define ICMD_IFNE_ICONST 16
132 #define JAVA_SIPUSH 17
133 #define ICMD_IFLT_ICONST 17
136 #define ICMD_IFGE_ICONST 18
139 #define ICMD_IFGT_ICONST 19
141 #define JAVA_LDC2W 20
142 #define ICMD_IFLE_ICONST 20
144 /* order of LOAD instructions must be */
145 /* equal to order of TYPE_XXX defines */
146 #define JAVA_ILOAD 21
147 #define ICMD_ILOAD 21 /* op1 = local variable */
149 #define JAVA_LLOAD 22
150 #define ICMD_LLOAD 22 /* op1 = local variable */
152 #define JAVA_FLOAD 23
153 #define ICMD_FLOAD 23 /* op1 = local variable */
155 #define JAVA_DLOAD 24
156 #define ICMD_DLOAD 24 /* op1 = local variable */
158 #define JAVA_ALOAD 25
159 #define ICMD_ALOAD 25 /* op1 = local variable */
161 #define JAVA_ILOAD_0 26
162 #define ICMD_IADDCONST 26 /* val.i = constant */
164 #define JAVA_ILOAD_1 27
165 #define ICMD_ISUBCONST 27 /* val.i = constant */
167 #define JAVA_ILOAD_2 28
168 #define ICMD_IMULCONST 28 /* val.i = constant */
170 #define JAVA_ILOAD_3 29
171 #define ICMD_IANDCONST 29 /* val.i = constant */
173 #define JAVA_LLOAD_0 30
174 #define ICMD_IORCONST 30 /* val.i = constant */
176 #define JAVA_LLOAD_1 31
177 #define ICMD_IXORCONST 31 /* val.i = constant */
179 #define JAVA_LLOAD_2 32
180 #define ICMD_ISHLCONST 32 /* val.i = constant */
182 #define JAVA_LLOAD_3 33
183 #define ICMD_ISHRCONST 33 /* val.i = constant */
185 #define JAVA_FLOAD_0 34
186 #define ICMD_IUSHRCONST 34 /* val.i = constant */
188 #define JAVA_FLOAD_1 35
189 #define ICMD_IREMPOW2 35 /* val.i = constant */
191 #define JAVA_FLOAD_2 36
192 #define ICMD_LADDCONST 36 /* val.l = constant */
194 #define JAVA_FLOAD_3 37
195 #define ICMD_LSUBCONST 37 /* val.l = constant */
197 #define JAVA_DLOAD_0 38
198 #define ICMD_LMULCONST 38 /* val.l = constant */
200 #define JAVA_DLOAD_1 39
201 #define ICMD_LANDCONST 39 /* val.l = constant */
203 #define JAVA_DLOAD_2 40
204 #define ICMD_LORCONST 40 /* val.l = constant */
206 #define JAVA_DLOAD_3 41
207 #define ICMD_LXORCONST 41 /* val.l = constant */
209 #define JAVA_ALOAD_0 42
210 #define ICMD_LSHLCONST 42 /* val.l = constant */
212 #define JAVA_ALOAD_1 43
213 #define ICMD_LSHRCONST 43 /* val.l = constant */
215 #define JAVA_ALOAD_2 44
216 #define ICMD_LUSHRCONST 44 /* val.l = constant */
218 #define JAVA_ALOAD_3 45
219 #define ICMD_LREMPOW2 45 /* val.l = constant */
221 #define JAVA_IALOAD 46
222 #define ICMD_IALOAD 46
224 #define JAVA_LALOAD 47
225 #define ICMD_LALOAD 47
227 #define JAVA_FALOAD 48
228 #define ICMD_FALOAD 48
230 #define JAVA_DALOAD 49
231 #define ICMD_DALOAD 49
233 #define JAVA_AALOAD 50
234 #define ICMD_AALOAD 50
236 #define JAVA_BALOAD 51
237 #define ICMD_BALOAD 51
239 #define JAVA_CALOAD 52
240 #define ICMD_CALOAD 52
242 #define JAVA_SALOAD 53
243 #define ICMD_SALOAD 53
245 /* order of STORE instructions must be*/
246 /* equal to order of TYPE_XXX defines */
247 #define JAVA_ISTORE 54
248 #define ICMD_ISTORE 54 /* op1 = local variable */
250 #define JAVA_LSTORE 55
251 #define ICMD_LSTORE 55 /* op1 = local variable */
253 #define JAVA_FSTORE 56
254 #define ICMD_FSTORE 56 /* op1 = local variable */
256 #define JAVA_DSTORE 57
257 #define ICMD_DSTORE 57 /* op1 = local variable */
259 #define JAVA_ASTORE 58
260 #define ICMD_ASTORE 58 /* op1 = local variable */
262 #define JAVA_ISTORE_0 59
263 #define ICMD_IF_LEQ 59 /* op1 = target JavaVM pc, val.l */
265 #define JAVA_ISTORE_1 60
266 #define ICMD_IF_LNE 60 /* op1 = target JavaVM pc, val.l */
268 #define JAVA_ISTORE_2 61
269 #define ICMD_IF_LLT 61 /* op1 = target JavaVM pc, val.l */
271 #define JAVA_ISTORE_3 62
272 #define ICMD_IF_LGE 62 /* op1 = target JavaVM pc, val.l */
274 #define JAVA_LSTORE_0 63
275 #define ICMD_IF_LGT 63 /* op1 = target JavaVM pc, val.l */
277 #define JAVA_LSTORE_1 64
278 #define ICMD_IF_LLE 64 /* op1 = target JavaVM pc, val.l */
280 #define JAVA_LSTORE_2 65
281 #define ICMD_IF_LCMPEQ 65 /* op1 = target JavaVM pc */
283 #define JAVA_LSTORE_3 66
284 #define ICMD_IF_LCMPNE 66 /* op1 = target JavaVM pc */
286 #define JAVA_FSTORE_0 67
287 #define ICMD_IF_LCMPLT 67 /* op1 = target JavaVM pc */
289 #define JAVA_FSTORE_1 68
290 #define ICMD_IF_LCMPGE 68 /* op1 = target JavaVM pc */
292 #define JAVA_FSTORE_2 69
293 #define ICMD_IF_LCMPGT 69 /* op1 = target JavaVM pc */
295 #define JAVA_FSTORE_3 70
296 #define ICMD_IF_LCMPLE 70 /* op1 = target JavaVM pc */
298 #define JAVA_DSTORE_0 71
300 #define JAVA_DSTORE_1 72
302 #define JAVA_DSTORE_2 73
304 #define JAVA_DSTORE_3 74
306 #define JAVA_ASTORE_0 75
308 #define JAVA_ASTORE_1 76
310 #define JAVA_ASTORE_2 77
312 #define JAVA_ASTORE_3 78
314 #define JAVA_IASTORE 79
315 #define ICMD_IASTORE 79
317 #define JAVA_LASTORE 80
318 #define ICMD_LASTORE 80
320 #define JAVA_FASTORE 81
321 #define ICMD_FASTORE 81
323 #define JAVA_DASTORE 82
324 #define ICMD_DASTORE 82
326 #define JAVA_AASTORE 83
327 #define ICMD_AASTORE 83
329 #define JAVA_BASTORE 84
330 #define ICMD_BASTORE 84
332 #define JAVA_CASTORE 85
333 #define ICMD_CASTORE 85
335 #define JAVA_SASTORE 86
336 #define ICMD_SASTORE 86
347 #define JAVA_DUP_X1 90
348 #define ICMD_DUP_X1 90
350 #define JAVA_DUP_X2 91
351 #define ICMD_DUP_X2 91
356 #define JAVA_DUP2_X1 93
357 #define ICMD_DUP2_X1 93
359 #define JAVA_DUP2_X2 94
360 #define ICMD_DUP2_X2 94
377 #define JAVA_ISUB 100
378 #define ICMD_ISUB 100
380 #define JAVA_LSUB 101
381 #define ICMD_LSUB 101
383 #define JAVA_FSUB 102
384 #define ICMD_FSUB 102
386 #define JAVA_DSUB 103
387 #define ICMD_DSUB 103
389 #define JAVA_IMUL 104
390 #define ICMD_IMUL 104
392 #define JAVA_LMUL 105
393 #define ICMD_LMUL 105
395 #define JAVA_FMUL 106
396 #define ICMD_FMUL 106
398 #define JAVA_DMUL 107
399 #define ICMD_DMUL 107
401 #define JAVA_IDIV 108
402 #define ICMD_IDIV 108
404 #define JAVA_LDIV 109
405 #define ICMD_LDIV 109
407 #define JAVA_FDIV 110
408 #define ICMD_FDIV 110
410 #define JAVA_DDIV 111
411 #define ICMD_DDIV 111
413 #define JAVA_IREM 112
414 #define ICMD_IREM 112
416 #define JAVA_LREM 113
417 #define ICMD_LREM 113
419 #define JAVA_FREM 114
420 #define ICMD_FREM 114
422 #define JAVA_DREM 115
423 #define ICMD_DREM 115
425 #define JAVA_INEG 116
426 #define ICMD_INEG 116
428 #define JAVA_LNEG 117
429 #define ICMD_LNEG 117
431 #define JAVA_FNEG 118
432 #define ICMD_FNEG 118
434 #define JAVA_DNEG 119
435 #define ICMD_DNEG 119
437 #define JAVA_ISHL 120
438 #define ICMD_ISHL 120
440 #define JAVA_LSHL 121
441 #define ICMD_LSHL 121
443 #define JAVA_ISHR 122
444 #define ICMD_ISHR 122
446 #define JAVA_LSHR 123
447 #define ICMD_LSHR 123
449 #define JAVA_IUSHR 124
450 #define ICMD_IUSHR 124
452 #define JAVA_LUSHR 125
453 #define ICMD_LUSHR 125
455 #define JAVA_IAND 126
456 #define ICMD_IAND 126
458 #define JAVA_LAND 127
459 #define ICMD_LAND 127
467 #define JAVA_IXOR 130
468 #define ICMD_IXOR 130
470 #define JAVA_LXOR 131
471 #define ICMD_LXOR 131
473 #define JAVA_IINC 132
474 #define ICMD_IINC 132 /* op1 = local variable, val.i = constant */
512 #define JAVA_INT2BYTE 145
513 #define ICMD_INT2BYTE 145
515 #define JAVA_INT2CHAR 146
516 #define ICMD_INT2CHAR 146
518 #define JAVA_INT2SHORT 147
519 #define ICMD_INT2SHORT 147
521 #define JAVA_LCMP 148
522 #define ICMD_LCMP 148
524 #define JAVA_FCMPL 149
525 #define ICMD_FCMPL 149
527 #define JAVA_FCMPG 150
528 #define ICMD_FCMPG 150
530 #define JAVA_DCMPL 151
531 #define ICMD_DCMPL 151
533 #define JAVA_DCMPG 152
534 #define ICMD_DCMPG 152
536 #define JAVA_IFEQ 153
537 #define ICMD_IFEQ 153 /* op1 = target JavaVM pc, val.i */
539 #define JAVA_IFNE 154
540 #define ICMD_IFNE 154 /* op1 = target JavaVM pc, val.i */
542 #define JAVA_IFLT 155
543 #define ICMD_IFLT 155 /* op1 = target JavaVM pc, val.i */
545 #define JAVA_IFGE 156
546 #define ICMD_IFGE 156 /* op1 = target JavaVM pc, val.i */
548 #define JAVA_IFGT 157
549 #define ICMD_IFGT 157 /* op1 = target JavaVM pc, val.i */
551 #define JAVA_IFLE 158
552 #define ICMD_IFLE 158 /* op1 = target JavaVM pc, val.i */
554 #define JAVA_IF_ICMPEQ 159
555 #define ICMD_IF_ICMPEQ 159 /* op1 = target JavaVM pc */
557 #define JAVA_IF_ICMPNE 160
558 #define ICMD_IF_ICMPNE 160 /* op1 = target JavaVM pc */
560 #define JAVA_IF_ICMPLT 161
561 #define ICMD_IF_ICMPLT 161 /* op1 = target JavaVM pc */
563 #define JAVA_IF_ICMPGE 162
564 #define ICMD_IF_ICMPGE 162 /* op1 = target JavaVM pc */
566 #define JAVA_IF_ICMPGT 163
567 #define ICMD_IF_ICMPGT 163 /* op1 = target JavaVM pc */
569 #define JAVA_IF_ICMPLE 164
570 #define ICMD_IF_ICMPLE 164 /* op1 = target JavaVM pc */
572 #define JAVA_IF_ACMPEQ 165
573 #define ICMD_IF_ACMPEQ 165 /* op1 = target JavaVM pc */
575 #define JAVA_IF_ACMPNE 166
576 #define ICMD_IF_ACMPNE 166 /* op1 = target JavaVM pc */
578 #define JAVA_GOTO 167
579 #define ICMD_GOTO 167 /* op1 = target JavaVM pc */
582 #define ICMD_JSR 168 /* op1 = target JavaVM pc */
585 #define ICMD_RET 169 /* op1 = local variable */
587 #define JAVA_TABLESWITCH 170
588 #define ICMD_TABLESWITCH 170 /* val.a = pointer to s4 table */
589 0, /* length must be computed */
590 #define JAVA_LOOKUPSWITCH 171
591 #define ICMD_LOOKUPSWITCH 171 /* val.a = pointer to s4 table */
592 0, /* length must be computed */
593 #define JAVA_IRETURN 172
594 #define ICMD_IRETURN 172
596 #define JAVA_LRETURN 173
597 #define ICMD_LRETURN 173
599 #define JAVA_FRETURN 174
600 #define ICMD_FRETURN 174
602 #define JAVA_DRETURN 175
603 #define ICMD_DRETURN 175
605 #define JAVA_ARETURN 176
606 #define ICMD_ARETURN 176
608 #define JAVA_RETURN 177
609 #define ICMD_RETURN 177
611 #define JAVA_GETSTATIC 178
612 #define ICMD_GETSTATIC 178 /* op1 = type, val.a = field address */
614 #define JAVA_PUTSTATIC 179
615 #define ICMD_PUTSTATIC 179 /* op1 = type, val.a = field address */
617 #define JAVA_GETFIELD 180
618 #define ICMD_GETFIELD 180 /* op1 = type, val.i = field offset */
620 #define JAVA_PUTFIELD 181
621 #define ICMD_PUTFIELD 181 /* op1 = type, val.i = field offset */
623 #define JAVA_INVOKEVIRTUAL 182
624 #define ICMD_INVOKEVIRTUAL 182 /* val.a = method info pointer */
626 #define JAVA_INVOKESPECIAL 183
627 #define ICMD_INVOKESPECIAL 183 /* val.a = method info pointer */
629 #define JAVA_INVOKESTATIC 184
630 #define ICMD_INVOKESTATIC 184 /* val.a = method info pointer */
632 #define JAVA_INVOKEINTERFACE 185
633 #define ICMD_INVOKEINTERFACE 185 /* val.a = method info pointer */
635 #define ICMD_CHECKASIZE 186 /* */
638 #define ICMD_NEW 187 /* op1 = 1, val.a = class pointer */
640 #define JAVA_NEWARRAY 188
641 #define ICMD_NEWARRAY 188 /* op1 = basic type */
643 #define JAVA_ANEWARRAY 189
644 #define ICMD_ANEWARRAY 189 /* op1 = 0, val.a = array pointer */
645 3, /* op1 = 1, val.a = class pointer */
646 #define JAVA_ARRAYLENGTH 190
647 #define ICMD_ARRAYLENGTH 190
649 #define JAVA_ATHROW 191
650 #define ICMD_ATHROW 191
652 #define JAVA_CHECKCAST 192
653 #define ICMD_CHECKCAST 192 /* op1 = 0, val.a = array pointer */
654 3, /* op1 = 1, val.a = class pointer */
655 #define JAVA_INSTANCEOF 193
656 #define ICMD_INSTANCEOF 193 /* op1 = 0, val.a = array pointer */
657 3, /* op1 = 1, val.a = class pointer */
658 #define JAVA_MONITORENTER 194
659 #define ICMD_MONITORENTER 194
661 #define JAVA_MONITOREXIT 195
662 #define ICMD_MONITOREXIT 195
664 #define JAVA_WIDE 196
665 0, /* length must be computed */
666 #define JAVA_MULTIANEWARRAY 197
667 #define ICMD_MULTIANEWARRAY 197 /* op1 = dimension, val.a = array */
669 #define JAVA_IFNULL 198
670 #define ICMD_IFNULL 198 /* op1 = target JavaVM pc */
672 #define JAVA_IFNONNULL 199
673 #define ICMD_IFNONNULL 199 /* op1 = target JavaVM pc */
675 #define JAVA_GOTO_W 200
677 #define JAVA_JSR_W 201
679 #define JAVA_BREAKPOINT 202
681 #define ICMD_CHECKEXCEPTION 203
683 #define ICMD_IASTORECONST 204
685 #define ICMD_LASTORECONST 205
687 #define ICMD_FASTORECONST 206
689 #define ICMD_DASTORECONST 207
691 #define ICMD_AASTORECONST 208
693 #define ICMD_BASTORECONST 209
695 #define ICMD_CASTORECONST 210
697 #define ICMD_SASTORECONST 211
699 #define ICMD_PUTSTATICCONST 212
701 #define ICMD_PUTFIELDCONST 213
703 #define ICMD_IMULPOW2 214
705 #define ICMD_LMULPOW2 215
710 1,1,1,1,1,1,1,1,1,1,
711 1,1,1,1,1,1,1,1,1,1,
712 1,1,1,1,1,1,1,1,1,1,
717 char *icmd_names[256] = {
720 "NULLCHECKPOP ", /* ICONST_M1 2 */
722 "UNDEF4 ", /* ICONST_1 4 */
723 "IDIVPOW2 ", /* ICONST_2 5 */
724 "LDIVPOW2 ", /* ICONST_3 6 */
725 "UNDEF7 ", /* ICONST_4 7 */
726 "UNDEF8 ", /* ICONST_5 8 */
728 "LCMPCONST ", /* LCONST_1 10 */
730 "UNDEF12 ", /* FCONST_1 12 */
731 "ELSE_ICONST ", /* FCONST_2 13 */
733 "IFEQ_ICONST ", /* DCONST_1 15 */
734 "IFNE_ICONST ", /* BIPUSH 16 */
735 "IFLT_ICONST ", /* SIPUSH 17 */
736 "IFGE_ICONST ", /* LDC1 18 */
737 "IFGT_ICONST ", /* LDC2 19 */
738 "IFLE_ICONST ", /* LDC2W 20 */
744 "IADDCONST ", /* ILOAD_0 26 */
745 "ISUBCONST ", /* ILOAD_1 27 */
746 "IMULCONST ", /* ILOAD_2 28 */
747 "IANDCONST ", /* ILOAD_3 29 */
748 "IORCONST ", /* LLOAD_0 30 */
749 "IXORCONST ", /* LLOAD_1 31 */
750 "ISHLCONST ", /* LLOAD_2 32 */
751 "ISHRCONST ", /* LLOAD_3 33 */
752 "IUSHRCONST ", /* FLOAD_0 34 */
753 "IREMPOW2 ", /* FLOAD_1 35 */
754 "LADDCONST ", /* FLOAD_2 36 */
755 "LSUBCONST ", /* FLOAD_3 37 */
756 "LMULCONST ", /* DLOAD_0 38 */
757 "LANDCONST ", /* DLOAD_1 39 */
758 "LORCONST ", /* DLOAD_2 40 */
759 "LXORCONST ", /* DLOAD_3 41 */
760 "LSHLCONST ", /* ALOAD_0 42 */
761 "LSHRCONST ", /* ALOAD_1 43 */
762 "LUSHRCONST ", /* ALOAD_2 44 */
763 "LREMPOW2 ", /* ALOAD_3 45 */
777 "IF_LEQ ", /* ISTORE_0 59 */
778 "IF_LNE ", /* ISTORE_1 60 */
779 "IF_LLT ", /* ISTORE_2 61 */
780 "IF_LGE ", /* ISTORE_3 62 */
781 "IF_LGT ", /* LSTORE_0 63 */
782 "IF_LLE ", /* LSTORE_1 64 */
783 "IF_LCMPEQ ", /* LSTORE_2 65 */
784 "IF_LCMPNE ", /* LSTORE_3 66 */
785 "IF_LCMPLT ", /* FSTORE_0 67 */
786 "IF_LCMPGE ", /* FSTORE_1 68 */
787 "IF_LCMPGT ", /* FSTORE_2 69 */
788 "IF_LCMPLE ", /* FSTORE_3 70 */
789 "UNDEF71 ", /* DSTORE_0 71 */
790 "UNDEF72 ", /* DSTORE_1 72 */
791 "UNDEF73 ", /* DSTORE_2 73 */
792 "UNDEF74 ", /* DSTORE_3 74 */
793 "UNDEF75 ", /* ASTORE_0 75 */
794 "UNDEF76 ", /* ASTORE_1 76 */
795 "UNDEF77 ", /* ASTORE_2 77 */
796 "UNDEF78 ", /* ASTORE_3 78 */
863 "INT2BYTE ", /* 145 */
864 "INT2CHAR ", /* 146 */
865 "INT2SHORT ", /* 147 */
877 "IF_ICMPEQ ", /* 159 */
878 "IF_ICMPNE ", /* 160 */
879 "IF_ICMPLT ", /* 161 */
880 "IF_ICMPGE ", /* 162 */
881 "IF_ICMPGT ", /* 163 */
882 "IF_ICMPLE ", /* 164 */
883 "IF_ACMPEQ ", /* 165 */
884 "IF_ACMPNE ", /* 166 */
888 "TABLESWITCH ", /* 170 */
889 "LOOKUPSWITCH ", /* 171 */
890 "IRETURN ", /* 172 */
891 "LRETURN ", /* 173 */
892 "FRETURN ", /* 174 */
893 "DRETURN ", /* 175 */
894 "ARETURN ", /* 176 */
896 "GETSTATIC ", /* 178 */
897 "PUTSTATIC ", /* 179 */
898 "GETFIELD ", /* 180 */
899 "PUTFIELD ", /* 181 */
900 "INVOKEVIRTUAL ", /* 182 */
901 "INVOKESPECIAL ", /* 183 */
902 "INVOKESTATIC ", /* 184 */
903 "INVOKEINTERFACE", /* 185 */
904 "CHECKASIZE ", /* UNDEF186 186 */
906 "NEWARRAY ", /* 188 */
907 "ANEWARRAY ", /* 189 */
908 "ARRAYLENGTH ", /* 190 */
910 "CHECKCAST ", /* 192 */
911 "INSTANCEOF ", /* 193 */
912 "MONITORENTER ", /* 194 */
913 "MONITOREXIT ", /* 195 */
914 "UNDEF196 ", /* WIDE 196 */
915 "MULTIANEWARRAY ", /* 197 */
917 "IFNONNULL ", /* 199 */
918 "UNDEF200 ", /* GOTO_W 200 */
919 "UNDEF201 ", /* JSR_W 201 */
920 "UNDEF202 ", /* BREAKPOINT 202 */
921 "CHECKEXCEPTION ", /* UNDEF203 203 */
922 "IASTORECONST ", /* 204 */
923 "LASTORECONST ", /* 205 */
924 "FASTORECONST ", /* 206 */
925 "DASTORECONST ", /* 207 */
926 "AASTORECONST ", /* 208 */
927 "BASTORECONST ", /* 209 */
928 "CASTORECONST ", /* 210 */
929 "SASTORECONST ", /* 211 */
930 "PUTSTATICCONST ", /* 212 */
931 "PUTFIELDCONST ", /* 213 */
932 "IMULPOW2 ", /* 214 */
933 "LMULPOW2 ", /* 215 */
935 "UNDEF216", "UNDEF217", "UNDEF218", "UNDEF219", "UNDEF220",
936 "UNDEF221", "UNDEF222", "UNDEF223", "UNDEF224", "UNDEF225",
937 "UNDEF226", "UNDEF227", "UNDEF228", "UNDEF229", "UNDEF230",
938 "UNDEF231", "UNDEF232", "UNDEF233", "UNDEF234", "UNDEF235",
939 "UNDEF236", "UNDEF237", "UNDEF238", "UNDEF239", "UNDEF240",
940 "UNDEF241", "UNDEF242", "UNDEF243", "UNDEF244", "UNDEF245",
941 "UNDEF246", "UNDEF247", "UNDEF248", "UNDEF249", "UNDEF250",
943 "INLINE_START ", /* 251 */
944 "INLINE_END ", /* 252 */
946 "BUILTIN3 ", /* 253 */
947 "BUILTIN2 ", /* 254 */
948 "BUILTIN1 " /* 255 */
952 char *opcode_names[256] = {
955 "ICONST_M1 ", /* ICONST_M1 2 */
956 "ICONST_0 ", /* ICONST_0 3 */
957 "ICONST_1 ", /* ICONST_1 4 */
958 "ICONST_2 ", /* ICONST_2 5 */
959 "ICONST_3 ", /* ICONST_3 6 */
960 "ICONST_4 ", /* ICONST_4 7 */
961 "ICONST_5 ", /* ICONST_5 8 */
962 "LCONST_0 ", /* LCONST_0 9 */
963 "LCONST_1 ", /* LCONST_1 10 */
964 "FCONST_0 ", /* FCONST_0 11 */
965 "FCONST_1 ", /* FCONST_1 12 */
966 "FCONST_2 ", /* FCONST_2 13 */
967 "DCONST_0 ", /* DCONST_0 14 */
968 "DCONST_1 ", /* DCONST_1 15 */
969 "BIPUSH ", /* BIPUSH 16 */
970 "SIPUSH ", /* SIPUSH 17 */
972 "LDC_W ", /* LDC_W 19 */
973 "LDC2_W ", /* LDC2_W 20 */
979 "ILOAD_0 ", /* ILOAD_0 26 */
980 "ILOAD_1 ", /* ILOAD_1 27 */
981 "ILOAD_2 ", /* ILOAD_2 28 */
982 "ILOAD_3 ", /* ILOAD_3 29 */
983 "LLOAD_0 ", /* LLOAD_0 30 */
984 "LLOAD_1 ", /* LLOAD_1 31 */
985 "LLOAD_2 ", /* LLOAD_2 32 */
986 "LLOAD_3 ", /* LLOAD_3 33 */
987 "FLOAD_0 ", /* FLOAD_0 34 */
988 "FLOAD_1 ", /* FLOAD_1 35 */
989 "FLOAD_2 ", /* FLOAD_2 36 */
990 "FLOAD_3 ", /* FLOAD_3 37 */
991 "DLOAD_0 ", /* DLOAD_0 38 */
992 "DLOAD_1 ", /* DLOAD_1 39 */
993 "DLOAD_2 ", /* DLOAD_2 40 */
994 "DLOAD_3 ", /* DLOAD_3 41 */
995 "ALOAD_0 ", /* ALOAD_0 42 */
996 "ALOAD_1 ", /* ALOAD_1 43 */
997 "ALOAD_2 ", /* ALOAD_2 44 */
998 "ALOAD_3 ", /* ALOAD_3 45 */
1012 "ISTORE_0 ", /* ISTORE_0 59 */
1013 "ISTORE_1 ", /* ISTORE_1 60 */
1014 "ISTORE_2 ", /* ISTORE_2 61 */
1015 "ISTORE_3 ", /* ISTORE_3 62 */
1016 "LSTORE_0 ", /* LSTORE_0 63 */
1017 "LSTORE_1 ", /* LSTORE_1 64 */
1018 "LSTORE_2 ", /* LSTORE_2 65 */
1019 "LSTORE_3 ", /* LSTORE_3 66 */
1020 "FSTORE_0 ", /* FSTORE_0 67 */
1021 "FSTORE_1 ", /* FSTORE_1 68 */
1022 "FSTORE_2 ", /* FSTORE_2 69 */
1023 "FSTORE_3 ", /* FSTORE_3 70 */
1024 "DSTORE_0 ", /* DSTORE_0 71 */
1025 "DSTORE_1 ", /* DSTORE_1 72 */
1026 "DSTORE_2 ", /* DSTORE_2 73 */
1027 "DSTORE_3 ", /* DSTORE_3 74 */
1028 "ASTORE_0 ", /* ASTORE_0 75 */
1029 "ASTORE_1 ", /* ASTORE_1 76 */
1030 "ASTORE_2 ", /* ASTORE_2 77 */
1031 "ASTORE_3 ", /* ASTORE_3 78 */
1032 "IASTORE ", /* 79 */
1033 "LASTORE ", /* 80 */
1034 "FASTORE ", /* 81 */
1035 "DASTORE ", /* 82 */
1036 "AASTORE ", /* 83 */
1037 "BASTORE ", /* 84 */
1038 "CASTORE ", /* 85 */
1039 "SASTORE ", /* 86 */
1046 "DUP2_X1 ", /* 93 */
1047 "DUP2_X2 ", /* 94 */
1098 "INT2BYTE ", /* 145 */
1099 "INT2CHAR ", /* 146 */
1100 "INT2SHORT ", /* 147 */
1112 "IF_ICMPEQ ", /* 159 */
1113 "IF_ICMPNE ", /* 160 */
1114 "IF_ICMPLT ", /* 161 */
1115 "IF_ICMPGE ", /* 162 */
1116 "IF_ICMPGT ", /* 163 */
1117 "IF_ICMPLE ", /* 164 */
1118 "IF_ACMPEQ ", /* 165 */
1119 "IF_ACMPNE ", /* 166 */
1123 "TABLESWITCH ", /* 170 */
1124 "LOOKUPSWITCH ", /* 171 */
1125 "IRETURN ", /* 172 */
1126 "LRETURN ", /* 173 */
1127 "FRETURN ", /* 174 */
1128 "DRETURN ", /* 175 */
1129 "ARETURN ", /* 176 */
1130 "RETURN ", /* 177 */
1131 "GETSTATIC ", /* 178 */
1132 "PUTSTATIC ", /* 179 */
1133 "GETFIELD ", /* 180 */
1134 "PUTFIELD ", /* 181 */
1135 "INVOKEVIRTUAL ", /* 182 */
1136 "INVOKESPECIAL ", /* 183 */
1137 "INVOKESTATIC ", /* 184 */
1138 "INVOKEINTERFACE", /* 185 */
1139 "UNDEF186 ", /* 186 */
1141 "NEWARRAY ", /* 188 */
1142 "ANEWARRAY ", /* 189 */
1143 "ARRAYLENGTH ", /* 190 */
1144 "ATHROW ", /* 191 */
1145 "CHECKCAST ", /* 192 */
1146 "INSTANCEOF ", /* 193 */
1147 "MONITORENTER ", /* 194 */
1148 "MONITOREXIT ", /* 195 */
1149 "WIDE ", /* WIDE 196 */
1150 "MULTIANEWARRAY ", /* 197 */
1151 "IFNULL ", /* 198 */
1152 "IFNONNULL ", /* 199 */
1153 "GOTO_W ", /* GOTO_W 200 */
1154 "JSR_W ", /* JSR_W 201 */
1155 "BREAKPOINT ", /* BREAKPOINT 202 */
1157 "UNDEF203", "UNDEF204", "UNDEF205",
1158 "UNDEF206", "UNDEF207", "UNDEF208", "UNDEF209", "UNDEF210",
1159 "UNDEF211", "UNDEF212", "UNDEF213", "UNDEF214", "UNDEF215",
1160 "UNDEF216", "UNDEF217", "UNDEF218", "UNDEF219", "UNDEF220",
1161 "UNDEF221", "UNDEF222", "UNDEF223", "UNDEF224", "UNDEF225",
1162 "UNDEF226", "UNDEF227", "UNDEF228", "UNDEF229", "UNDEF230",
1163 "UNDEF231", "UNDEF232", "UNDEF233", "UNDEF234", "UNDEF235",
1164 "UNDEF236", "UNDEF237", "UNDEF238", "UNDEF239", "UNDEF240",
1165 "UNDEF241", "UNDEF242", "UNDEF243", "UNDEF244", "UNDEF245",
1166 "UNDEF246", "UNDEF247", "UNDEF248", "UNDEF249", "UNDEF250",
1167 "UNDEF251", "UNDEF252", "UNDEF253", "UNDEF254", "UNDEF255"
1171 #if defined(USEBUILTINTABLE)
1174 stdopdescriptor builtintable[] = {
1175 { ICMD_LCMP, TYPE_LONG, TYPE_LONG, TYPE_INT, ICMD_BUILTIN2,
1176 (functionptr) builtin_lcmp , SUPPORT_LONG && SUPPORT_LONG_CMP, false },
1177 { ICMD_LAND, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1178 (functionptr) builtin_land , SUPPORT_LONG && SUPPORT_LONG_LOG, false },
1179 { ICMD_LOR, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1180 (functionptr) builtin_lor , SUPPORT_LONG && SUPPORT_LONG_LOG, false },
1181 { ICMD_LXOR, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1182 (functionptr) builtin_lxor , SUPPORT_LONG && SUPPORT_LONG_LOG, false },
1183 { ICMD_LSHL, TYPE_LONG, TYPE_INT, TYPE_LONG, ICMD_BUILTIN2,
1184 (functionptr) builtin_lshl , SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
1185 { ICMD_LSHR, TYPE_LONG, TYPE_INT, TYPE_LONG, ICMD_BUILTIN2,
1186 (functionptr) builtin_lshr, SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
1187 { ICMD_LUSHR, TYPE_LONG, TYPE_INT, TYPE_LONG, ICMD_BUILTIN2,
1188 (functionptr) builtin_lushr, SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
1189 { ICMD_LADD, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1190 (functionptr) builtin_ladd , SUPPORT_LONG && SUPPORT_LONG_ADD, false },
1191 { ICMD_LSUB, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1192 (functionptr) builtin_lsub , SUPPORT_LONG && SUPPORT_LONG_ADD, false },
1193 { ICMD_LNEG, TYPE_LONG, TYPE_VOID, TYPE_LONG, ICMD_BUILTIN1,
1194 (functionptr) builtin_lneg, SUPPORT_LONG && SUPPORT_LONG_ADD, true },
1195 { ICMD_LMUL, TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1196 (functionptr) builtin_lmul , SUPPORT_LONG && SUPPORT_LONG_MUL, false },
1197 { ICMD_I2F, TYPE_INT, TYPE_VOID, TYPE_FLOAT, ICMD_BUILTIN1,
1198 (functionptr) builtin_i2f, SUPPORT_FLOAT && SUPPORT_IFCVT, true },
1199 { ICMD_I2D, TYPE_INT, TYPE_VOID, TYPE_DOUBLE, ICMD_BUILTIN1,
1200 (functionptr) builtin_i2d, SUPPORT_DOUBLE && SUPPORT_IFCVT, true },
1201 { ICMD_L2F, TYPE_LONG, TYPE_VOID, TYPE_FLOAT, ICMD_BUILTIN1,
1202 (functionptr) builtin_l2f, SUPPORT_LONG && SUPPORT_FLOAT && SUPPORT_LONG_FCVT, true },
1203 { ICMD_L2D, TYPE_LONG, TYPE_VOID, TYPE_DOUBLE, ICMD_BUILTIN1,
1204 (functionptr) builtin_l2d, SUPPORT_LONG && SUPPORT_DOUBLE && SUPPORT_LONG_FCVT, true },
1205 { ICMD_F2L, TYPE_FLOAT, TYPE_VOID, TYPE_LONG, ICMD_BUILTIN1,
1206 (functionptr) builtin_f2l, SUPPORT_FLOAT && SUPPORT_LONG && SUPPORT_LONG_ICVT, true },
1207 { ICMD_D2L, TYPE_DOUBLE, TYPE_VOID, TYPE_LONG, ICMD_BUILTIN1,
1208 (functionptr) builtin_d2l, SUPPORT_DOUBLE && SUPPORT_LONG && SUPPORT_LONG_ICVT, true },
1209 { ICMD_F2I, TYPE_FLOAT, TYPE_VOID, TYPE_INT, ICMD_BUILTIN1,
1210 (functionptr) builtin_f2i, SUPPORT_FLOAT && SUPPORT_FICVT, true },
1211 { ICMD_D2I, TYPE_DOUBLE, TYPE_VOID, TYPE_INT, ICMD_BUILTIN1,
1212 (functionptr) builtin_d2i, SUPPORT_DOUBLE && SUPPORT_FICVT, true },
1213 { 255, 0, 0, 0, 0, NULL, true, false },
1218 static int builtintablelen;
1220 #endif /* USEBUILTINTABLE */
1227 printf("PARSE method name ="); \
1228 utf_display(m->class->name); \
1230 method_display(m); \
1231 printf(" exceptiontablelength %d\n",m->exceptiontablelength); \
1236 /*****************************************************************************
1237 TABLE OF BUILTIN FUNCTIONS
1239 This table lists the builtin functions which are used inside
1242 The first part of the table (up to the 255-marker) lists the
1243 opcodes which are automatically replaced in stack.c.
1245 The second part lists the builtin functions which are "manually"
1246 used for BUILTIN* opcodes in parse.c and stack.c.
1248 *****************************************************************************/
1250 builtin_descriptor builtin_desc[] = {
1251 #if defined(USEBUILTINTABLE)
1252 {ICMD_LCMP , BUILTIN_lcmp ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_INT ,
1253 SUPPORT_LONG && SUPPORT_LONG_CMP,false,"lcmp"},
1255 {ICMD_LAND , BUILTIN_land ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
1256 SUPPORT_LONG && SUPPORT_LONG_LOG,false,"land"},
1257 {ICMD_LOR , BUILTIN_lor ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
1258 SUPPORT_LONG && SUPPORT_LONG_LOG,false,"lor"},
1259 {ICMD_LXOR , BUILTIN_lxor ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
1260 SUPPORT_LONG && SUPPORT_LONG_LOG,false,"lxor"},
1262 {ICMD_LSHL , BUILTIN_lshl ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_INT ,TYPE_VOID ,TYPE_LONG ,
1263 SUPPORT_LONG && SUPPORT_LONG_SHIFT,false,"lshl"},
1264 {ICMD_LSHR , BUILTIN_lshr ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_INT ,TYPE_VOID ,TYPE_LONG ,
1265 SUPPORT_LONG && SUPPORT_LONG_SHIFT,false,"lshr"},
1266 {ICMD_LUSHR, BUILTIN_lushr,ICMD_BUILTIN2,TYPE_LONG ,TYPE_INT ,TYPE_VOID ,TYPE_LONG ,
1267 SUPPORT_LONG && SUPPORT_LONG_SHIFT,false,"lushr"},
1269 {ICMD_LADD , BUILTIN_ladd ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
1270 SUPPORT_LONG && SUPPORT_LONG_ADD,false,"ladd"},
1271 {ICMD_LSUB , BUILTIN_lsub ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
1272 SUPPORT_LONG && SUPPORT_LONG_ADD,false,"lsub"},
1273 {ICMD_LNEG , BUILTIN_lneg ,ICMD_BUILTIN1,TYPE_LONG ,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,
1274 SUPPORT_LONG && SUPPORT_LONG_ADD,false,"lneg"},
1275 {ICMD_LMUL , BUILTIN_lmul ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,
1276 SUPPORT_LONG && SUPPORT_LONG_MUL,false,"lmul"},
1278 {ICMD_I2F , BUILTIN_i2f ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_FLOAT ,
1279 SUPPORT_FLOAT && SUPPORT_IFCVT,true ,"i2f"},
1280 {ICMD_I2D , BUILTIN_i2d ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_DOUBLE,
1281 SUPPORT_DOUBLE && SUPPORT_IFCVT,true ,"i2d"},
1282 {ICMD_L2F , BUILTIN_l2f ,ICMD_BUILTIN1,TYPE_LONG ,TYPE_VOID ,TYPE_VOID ,TYPE_FLOAT ,
1283 SUPPORT_LONG && SUPPORT_FLOAT && SUPPORT_LONG_FCVT,true ,"l2f"},
1284 {ICMD_L2D , BUILTIN_l2d ,ICMD_BUILTIN1,TYPE_LONG ,TYPE_VOID ,TYPE_VOID ,TYPE_DOUBLE,
1285 SUPPORT_LONG && SUPPORT_DOUBLE && SUPPORT_LONG_FCVT,true ,"l2d"},
1286 {ICMD_F2L , BUILTIN_f2l ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,
1287 SUPPORT_FLOAT && SUPPORT_LONG && SUPPORT_LONG_ICVT,true ,"f2l"},
1288 {ICMD_D2L , BUILTIN_d2l ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,
1289 SUPPORT_DOUBLE && SUPPORT_LONG && SUPPORT_LONG_ICVT,true ,"d2l"},
1290 {ICMD_F2I , BUILTIN_f2i ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID ,TYPE_VOID ,TYPE_INT ,
1291 SUPPORT_FLOAT && SUPPORT_FICVT,true ,"f2i"},
1292 {ICMD_D2I , BUILTIN_d2i ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID ,TYPE_VOID ,TYPE_INT ,
1293 SUPPORT_DOUBLE && SUPPORT_FICVT,true ,"d2i"},
1295 { ICMD_FADD , BUILTIN_fadd , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fadd" },
1296 { ICMD_FSUB , BUILTIN_fsub , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fsub" },
1297 { ICMD_FMUL , BUILTIN_fmul , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fmul" },
1298 { ICMD_FDIV , BUILTIN_fdiv , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fdiv" },
1299 { ICMD_FNEG , BUILTIN_fneg , ICMD_BUILTIN1, TYPE_FLT, TYPE_VOID , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fneg" },
1300 { ICMD_FCMPL, BUILTIN_fcmpl , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT , TYPE_VOID , TYPE_INT, SUPPORT_FLOAT, true, "fcmpl" },
1301 { ICMD_FCMPG, BUILTIN_fcmpg , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT , TYPE_VOID , TYPE_INT, SUPPORT_FLOAT, true, "fcmpg" },
1303 { ICMD_DADD , BUILTIN_dadd , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "dadd" },
1304 { ICMD_DSUB , BUILTIN_dsub , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "dsub" },
1305 { ICMD_DMUL , BUILTIN_dmul , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "dmul" },
1306 { ICMD_DDIV , BUILTIN_ddiv , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "ddiv" },
1307 { ICMD_DNEG , BUILTIN_dneg , ICMD_BUILTIN1, TYPE_DBL, TYPE_VOID , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "dneg" },
1308 { ICMD_DCMPL, BUILTIN_dcmpl , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL , TYPE_VOID , TYPE_INT, SUPPORT_DOUBLE, true, "dcmpl" },
1309 { ICMD_DCMPG, BUILTIN_dcmpg , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL , TYPE_VOID , TYPE_INT, SUPPORT_DOUBLE, true, "dcmpg" },
1311 { ICMD_F2D, BUILTIN_f2d , ICMD_BUILTIN1, TYPE_FLT, TYPE_VOID , TYPE_VOID , TYPE_DBL, SUPPORT_FLOAT && SUPPORT_DOUBLE, true, "f2d" },
1312 { ICMD_D2F, BUILTIN_d2f , ICMD_BUILTIN1, TYPE_DBL, TYPE_VOID , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT && SUPPORT_DOUBLE, true, "d2f" },
1315 /* this record marks the end of the automatically replaced opcodes */
1316 {255,NULL,0,0,0,0,0,0,0,"<INVALID>"},
1318 /* the following functions are not replaced automatically */
1320 #if defined(__ALPHA__)
1321 {255, BUILTIN_f2l ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,0,0,"f2l"},
1322 {255, BUILTIN_d2l ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID ,TYPE_VOID ,TYPE_LONG ,0,0,"d2l"},
1323 {255, BUILTIN_f2i ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID ,TYPE_VOID ,TYPE_INT ,0,0,"f2i"},
1324 {255, BUILTIN_d2i ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID ,TYPE_VOID ,TYPE_INT ,0,0,"d2i"},
1327 {255,BUILTIN_instanceof ,ICMD_BUILTIN2,TYPE_ADR ,TYPE_ADR ,TYPE_VOID ,TYPE_INT ,0,0,"instanceof"},
1328 {255,BUILTIN_arrayinstanceof ,ICMD_BUILTIN2,TYPE_ADR ,TYPE_ADR ,TYPE_VOID ,TYPE_INT ,0,0,"arrayinstanceof"},
1329 {255,BUILTIN_checkarraycast ,ICMD_BUILTIN2,TYPE_ADR ,TYPE_ADR ,TYPE_VOID ,TYPE_VOID ,0,0,"checkarraycast"},
1330 {255,BUILTIN_aastore ,ICMD_BUILTIN3,TYPE_ADR ,TYPE_INT ,TYPE_ADR ,TYPE_VOID ,0,0,"aastore"},
1331 {255,BUILTIN_new ,ICMD_BUILTIN1,TYPE_ADR ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"new"},
1332 {255,BUILTIN_newarray ,ICMD_BUILTIN2,TYPE_INT ,TYPE_ADR ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray"},
1333 {255,BUILTIN_newarray_boolean,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_boolean"},
1334 {255,BUILTIN_newarray_char ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_char"},
1335 {255,BUILTIN_newarray_float ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_float"},
1336 {255,BUILTIN_newarray_double ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_double"},
1337 {255,BUILTIN_newarray_byte ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_byte"},
1338 {255,BUILTIN_newarray_short ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_short"},
1339 {255,BUILTIN_newarray_int ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_int"},
1340 {255,BUILTIN_newarray_long ,ICMD_BUILTIN1,TYPE_INT ,TYPE_VOID ,TYPE_VOID ,TYPE_ADR ,0,0,"newarray_long"},
1341 #if defined(USE_THREADS)
1342 {255,BUILTIN_monitorenter ,ICMD_BUILTIN1,TYPE_ADR ,TYPE_VOID ,TYPE_VOID ,TYPE_VOID ,0,0,"monitorenter"},
1343 {255,BUILTIN_monitorexit ,ICMD_BUILTIN1,TYPE_ADR ,TYPE_VOID ,TYPE_VOID ,TYPE_VOID ,0,0,"monitorexit"},
1345 #if !SUPPORT_DIVISION
1346 {255,BUILTIN_idiv ,ICMD_BUILTIN2,TYPE_INT ,TYPE_INT ,TYPE_VOID ,TYPE_INT ,0,0,"idiv"},
1347 {255,BUILTIN_irem ,ICMD_BUILTIN2,TYPE_INT ,TYPE_INT ,TYPE_VOID ,TYPE_INT ,0,0,"irem"},
1349 #if !(SUPPORT_DIVISION && SUPPORT_LONG && SUPPORT_LONG_DIV)
1350 {255,BUILTIN_ldiv ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,0,0,"ldiv"},
1351 {255,BUILTIN_lrem ,ICMD_BUILTIN2,TYPE_LONG ,TYPE_LONG ,TYPE_VOID ,TYPE_LONG ,0,0,"lrem"},
1353 {255,BUILTIN_frem ,ICMD_BUILTIN2,TYPE_FLOAT ,TYPE_FLOAT ,TYPE_VOID ,TYPE_FLOAT ,0,0,"frem"},
1354 {255,BUILTIN_drem ,ICMD_BUILTIN2,TYPE_DOUBLE,TYPE_DOUBLE,TYPE_VOID ,TYPE_DOUBLE,0,0,"drem"},
1356 /* this record marks the end of the list */
1357 { 0,NULL,0,0,0,0,0,0,0,"<END>"}
1361 /* include compiler subsystems ************************************************/
1363 /* dummy function, used when there is no JavaVM code available */
1365 static functionptr do_nothing_function()
1371 /* jit_compile *****************************************************************
1373 jit_compile, new version of compiler, translates one method to machine code
1375 *******************************************************************************/
1377 static functionptr jit_compile_intern(methodinfo *m, codegendata *cd,
1378 registerdata *rd, loopdata *ld,
1379 t_inlining_globals *id);
1381 functionptr jit_compile(methodinfo *m)
1387 t_inlining_globals *id;
1390 #if defined(STATISTICS)
1395 /* this is the case if a native function is called by jni */
1397 if (m->flags & ACC_NATIVE)
1398 return (functionptr) m->stubroutine;
1400 #if defined(USE_THREADS)
1401 /* enter a monitor on the method */
1403 builtin_monitorenter((java_objectheader *) m);
1406 /* if method has been already compiled return immediately */
1408 if (m->entrypoint) {
1409 #if defined(USE_THREADS)
1410 builtin_monitorexit((java_objectheader *) m);
1413 return m->entrypoint;
1416 #if defined(STATISTICS)
1421 /* if there is no javacode, print error message and return empty method */
1425 log_message_method("No code given for: ", m);
1427 m->entrypoint = (functionptr) do_nothing_function;
1429 return m->entrypoint; /* return empty method */
1432 #if defined(STATISTICS)
1435 if (getcompilingtime)
1436 compilingtime_start();
1439 /* mark start of dump memory area */
1441 dumpsize = dump_size();
1443 /* allocate memory */
1445 cd = DNEW(codegendata);
1446 rd = DNEW(registerdata);
1447 ld = DNEW(loopdata);
1448 id = DNEW(t_inlining_globals);
1450 /* RTA static analysis must be called before inlining */
1452 RT_jit_parse(m); /* will be called just once */
1453 /* return value ignored for now */
1454 /* XTA static analysis must be called before inlining */
1456 XTA_jit_parse(m); /* will be called just once */
1457 /* return value ignored for now */
1460 /* must be called before reg_setup, because it can change maxlocals */
1461 /* init reqd to initialize for parse even in no inlining */
1462 inlining_setup(m, id);
1464 /* initialize the register allocator */
1465 reg_setup(m, rd, id);
1467 /* setup the codegendata memory */
1468 codegen_setup(m, cd, id);
1470 /* now call internal compile function */
1472 r = jit_compile_intern(m, cd, rd, ld, id);
1474 /* free some memory */
1477 codegen_free(m, cd);
1479 /* clear pointers to dump memory area */
1481 m->basicblocks = NULL;
1482 m->basicblockindex = NULL;
1483 m->instructions = NULL;
1485 /* NO !!! m->exceptiontable = NULL; */
1487 /* release dump area */
1489 dump_release(dumpsize);
1491 #if defined(STATISTICS)
1494 if (getcompilingtime)
1495 compilingtime_stop();
1498 /* define in options.h; Used in main.c, jit.c & inline.c */
1500 if ((utf_new_char("main") == m->name) && (useinliningm))
1501 useinlining = false;
1504 #if defined(USE_THREADS)
1505 /* leave the monitor */
1507 builtin_monitorexit((java_objectheader *) m );
1512 log_message_method("Running: ", m);
1515 /* return pointer to the methods entry point */
1521 /* jit_compile_intern **********************************************************
1523 Static internal function which does the actual compilation.
1525 *******************************************************************************/
1527 static functionptr jit_compile_intern(methodinfo *m, codegendata *cd,
1528 registerdata *rd, loopdata *ld,
1529 t_inlining_globals *id)
1536 /* print log message for compiled method */
1539 log_message_method("Compiling: ", m);
1541 /* initialize the static function's class */
1543 if (m->flags & ACC_STATIC && !m->class->initialized) {
1545 log_message_class("Initialize class ", m->class);
1547 if (!class_init(m->class))
1551 /* initialisation of variables and subsystems */
1553 m->isleafmethod = true;
1555 #if defined(STATISTICS)
1557 count_tryblocks += m->exceptiontablelength;
1558 count_javacodesize += m->jcodelength + 18;
1559 count_javaexcsize += m->exceptiontablelength * POINTERSIZE;
1563 /* initialise parameter type descriptor */
1565 descriptor2types(m);
1567 /* call the compiler passes ***********************************************/
1570 log_message_method("Parsing: ", m);
1572 /* call parse pass */
1573 if (!parse(m, cd, id)) {
1575 log_message_method("Exception while parsing: ", m);
1580 if (compileverbose) {
1581 log_message_method("Parsing done: ", m);
1582 log_message_method("Analysing: ", m);
1585 /* call stack analysis pass */
1586 if (!analyse_stack(m, cd, rd)) {
1588 log_message_method("Exception while analysing: ", m);
1594 log_message_method("Analysing done: ", m);
1596 #ifdef CACAO_TYPECHECK
1599 log_message_method("Typechecking: ", m);
1601 /* call typecheck pass */
1602 if (!typecheck(m, cd, rd)) {
1604 log_message_method("Exception while typechecking: ", m);
1610 log_message_method("Typechecking done: ", m);
1616 analyseGraph(m, ld);
1617 optimize_loops(m, cd, ld);
1620 #ifdef SPECIALMEMUSE
1625 log_message_method("Allocating registers: ", m);
1627 /* allocate registers */
1629 old_opt_lsra=opt_lsra;
1631 if (!lsra(m, cd, rd, id)) {
1633 /* log_message_method("Regalloc Fallback: ", m); */
1634 regalloc( m, cd, rd );
1637 if (opt_stat) count_methods_allocated_by_lsra++;
1639 /* log_message_method("Regalloc LSRA: ", m); */
1650 count_locals_conflicts += (cd->maxlocals-1)*(cd->maxlocals);
1652 regalloc(m, cd, rd);
1657 reg_make_statistics(m, cd, rd);
1660 if (compileverbose) {
1661 log_message_method("Allocating registers done: ", m);
1662 log_message_method("Generating code: ", m);
1665 /* now generate the machine code */
1669 log_message_method("Generating code done: ", m);
1671 /* intermediate and assembly code listings */
1673 if (showintermediate) {
1674 show_icmd_method(m, cd, rd);
1676 } else if (showdisassemble) {
1677 disassemble((void *) ((long) m->mcode + cd->dseglen),
1678 m->mcodelength - cd->dseglen);
1681 if (showddatasegment)
1682 dseg_display(m, cd);
1685 log_message_method("Compiling done: ", m);
1688 opt_lsra=old_opt_lsra;
1690 /* return pointer to the methods entry point */
1692 return m->entrypoint;
1696 void compile_all_class_methods(classinfo *c)
1700 for (i = 0; i < c->methodscount; i++) {
1701 (void) jit_compile(&(c->methods[i]));
1706 /* functions for compiler initialisation and finalisation *********************/
1708 #ifdef USEBUILTINTABLE
1710 static int stdopcompare(const void *a, const void *b)
1712 builtin_descriptor *o1 = (builtin_descriptor *) a;
1713 builtin_descriptor *o2 = (builtin_descriptor *) b;
1714 if (!o1->supported && o2->supported)
1716 if (o1->supported && !o2->supported)
1718 return (o1->opcode < o2->opcode) ? -1 : (o1->opcode > o2->opcode);
1721 static inline void sort_builtintable()
1726 while (builtin_desc[len].opcode != 255) len++;
1727 qsort(builtin_desc, len, sizeof(builtin_descriptor), stdopcompare);
1729 for (--len; len>=0 && builtin_desc[len].supported; len--);
1730 builtintablelen = ++len;
1734 builtin_descriptor *find_builtin(int icmd)
1736 builtin_descriptor *first = builtin_desc;
1737 builtin_descriptor *last = builtin_desc + builtintablelen;
1738 int len = last - first;
1740 builtin_descriptor *middle;
1744 middle = first + half;
1745 if (middle->opcode < icmd) {
1751 return first != last ? first : NULL;
1762 #ifdef USEBUILTINTABLE
1763 sort_builtintable();
1766 #if defined(__ALPHA__)
1767 has_ext_instr_set = ! has_no_x_instr_set();
1770 for (i = 0; i < 256; i++)
1773 stackreq[JAVA_NOP] = 0;
1774 stackreq[JAVA_ISTORE] = 0;
1775 stackreq[JAVA_LSTORE] = 0;
1776 stackreq[JAVA_FSTORE] = 0;
1777 stackreq[JAVA_DSTORE] = 0;
1778 stackreq[JAVA_ASTORE] = 0;
1779 stackreq[JAVA_ISTORE_0] = 0;
1780 stackreq[JAVA_ISTORE_1] = 0;
1781 stackreq[JAVA_ISTORE_2] = 0;
1782 stackreq[JAVA_ISTORE_3] = 0;
1783 stackreq[JAVA_LSTORE_0] = 0;
1784 stackreq[JAVA_LSTORE_1] = 0;
1785 stackreq[JAVA_LSTORE_2] = 0;
1786 stackreq[JAVA_LSTORE_3] = 0;
1787 stackreq[JAVA_FSTORE_0] = 0;
1788 stackreq[JAVA_FSTORE_1] = 0;
1789 stackreq[JAVA_FSTORE_2] = 0;
1790 stackreq[JAVA_FSTORE_3] = 0;
1791 stackreq[JAVA_DSTORE_0] = 0;
1792 stackreq[JAVA_DSTORE_1] = 0;
1793 stackreq[JAVA_DSTORE_2] = 0;
1794 stackreq[JAVA_DSTORE_3] = 0;
1795 stackreq[JAVA_ASTORE_0] = 0;
1796 stackreq[JAVA_ASTORE_1] = 0;
1797 stackreq[JAVA_ASTORE_2] = 0;
1798 stackreq[JAVA_ASTORE_3] = 0;
1799 stackreq[JAVA_IASTORE] = 0;
1800 stackreq[JAVA_LASTORE] = 0;
1801 stackreq[JAVA_FASTORE] = 0;
1802 stackreq[JAVA_DASTORE] = 0;
1803 stackreq[JAVA_AASTORE] = 0;
1804 stackreq[JAVA_BASTORE] = 0;
1805 stackreq[JAVA_CASTORE] = 0;
1806 stackreq[JAVA_SASTORE] = 0;
1807 stackreq[JAVA_POP] = 0;
1808 stackreq[JAVA_POP2] = 0;
1809 stackreq[JAVA_IINC] = 0;
1810 stackreq[JAVA_IFEQ] = 0;
1811 stackreq[JAVA_IFNE] = 0;
1812 stackreq[JAVA_IFLT] = 0;
1813 stackreq[JAVA_IFGE] = 0;
1814 stackreq[JAVA_IFGT] = 0;
1815 stackreq[JAVA_IFLE] = 0;
1816 stackreq[JAVA_IF_ICMPEQ] = 0;
1817 stackreq[JAVA_IF_ICMPNE] = 0;
1818 stackreq[JAVA_IF_ICMPLT] = 0;
1819 stackreq[JAVA_IF_ICMPGE] = 0;
1820 stackreq[JAVA_IF_ICMPGT] = 0;
1821 stackreq[JAVA_IF_ICMPLE] = 0;
1822 stackreq[JAVA_IF_ACMPEQ] = 0;
1823 stackreq[JAVA_IF_ACMPNE] = 0;
1824 stackreq[JAVA_GOTO] = 0;
1825 stackreq[JAVA_RET] = 0;
1826 stackreq[JAVA_TABLESWITCH] = 0;
1827 stackreq[JAVA_LOOKUPSWITCH] = 0;
1828 stackreq[JAVA_IRETURN] = 0;
1829 stackreq[JAVA_LRETURN] = 0;
1830 stackreq[JAVA_FRETURN] = 0;
1831 stackreq[JAVA_DRETURN] = 0;
1832 stackreq[JAVA_ARETURN] = 0;
1833 stackreq[JAVA_RETURN] = 0;
1834 stackreq[JAVA_PUTSTATIC] = 0;
1835 stackreq[JAVA_PUTFIELD] = 0;
1836 stackreq[JAVA_MONITORENTER] = 0;
1837 stackreq[JAVA_MONITOREXIT] = 0;
1838 stackreq[JAVA_WIDE] = 0;
1839 stackreq[JAVA_IFNULL] = 0;
1840 stackreq[JAVA_IFNONNULL] = 0;
1841 stackreq[JAVA_GOTO_W] = 0;
1842 stackreq[JAVA_BREAKPOINT] = 0;
1844 stackreq[JAVA_SWAP] = 2;
1845 stackreq[JAVA_DUP2] = 2;
1846 stackreq[JAVA_DUP_X1] = 3;
1847 stackreq[JAVA_DUP_X2] = 4;
1848 stackreq[JAVA_DUP2_X1] = 3;
1849 stackreq[JAVA_DUP2_X2] = 4;
1851 /* initialize the codegen stuff */
1862 * These are local overrides for various environment variables in Emacs.
1863 * Please do not remove this and leave it at the end of the file, where
1864 * Emacs will automagically detect them.
1865 * ---------------------------------------------------------------------
1868 * indent-tabs-mode: t