1 /* src/vm/jit/show.c - showing the intermediate representation
3 Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, 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., 51 Franklin Street, Fifth Floor, Boston, MA
25 Contact: cacao@cacaojvm.org
27 Authors: Andreas Krall
29 Changes: Edwin Steiner
43 #include "mm/memory.h"
45 #if defined(ENABLE_THREADS)
46 # include "threads/native/lock.h"
48 # include "threads/none/lock.h"
51 #include "vm/global.h"
52 #include "vm/options.h"
53 #include "vm/builtin.h"
54 #include "vm/stringlocal.h"
55 #include "vm/jit/jit.h"
56 #include "vm/jit/show.h"
57 #include "vm/jit/disass.h"
60 /* global variables ***********************************************************/
62 #if defined(ENABLE_THREADS) && !defined(NDEBUG)
63 static java_objectheader *show_global_lock;
67 /* show_init *******************************************************************
69 Initialized the show subsystem (called by jit_init).
71 *******************************************************************************/
76 #if defined(ENABLE_THREADS)
77 /* initialize the show lock */
79 show_global_lock = NEW(java_objectheader);
81 lock_init_object_lock(show_global_lock);
92 static char *jit_type[] = {
102 /* show_method *****************************************************************
104 Print the intermediate representation of a method.
106 NOTE: Currently this function may only be called after register allocation!
108 *******************************************************************************/
111 void new_show_method(jitdata *jd, int stage)
118 basicblock *lastbptr;
123 /* get required compiler data */
130 /* We need to enter a lock here, since the binutils disassembler
131 is not reentrant-able and we could not read functions printed
134 LOCK_MONITOR_ENTER(show_global_lock);
136 /* get the last basic block */
138 for (lastbptr = jd->new_basicblocks; lastbptr != NULL; lastbptr = lastbptr->next);
144 printf("\n(NEW INSTRUCTION FORMAT)\n");
145 printf("\nBasic blocks: %d\n", jd->new_basicblockcount);
146 printf("Code length: %d\n", (lastbptr->mpc - jd->new_basicblocks[0].mpc));
147 printf("Data length: %d\n", cd->dseglen);
148 printf("Stub length: %d\n", (s4) (code->mcodelength -
149 ((ptrint) cd->dseglen + lastbptr->mpc)));
150 printf("Max locals: %d\n", cd->maxlocals);
151 printf("Max stack: %d\n", cd->maxstack);
152 printf("Line number table length: %d\n", m->linenumbercount);
154 if (stage >= SHOW_PARSE) {
155 printf("Exceptions (Number: %d):\n", cd->exceptiontablelength);
156 for (ex = cd->exceptiontable; ex != NULL; ex = ex->down) {
157 printf(" L%03d ... ", ex->start->nr );
158 printf("L%03d = ", ex->end->nr);
159 printf("L%03d", ex->handler->nr);
160 printf(" (catchtype: ");
161 if (ex->catchtype.any)
162 if (IS_CLASSREF(ex->catchtype))
163 utf_display_printable_ascii_classname(ex->catchtype.ref->name);
165 utf_display_printable_ascii_classname(ex->catchtype.cls->name);
172 if (stage >= SHOW_PARSE && rd) {
173 printf("Local Table:\n");
174 for (i = 0; i < cd->maxlocals; i++) {
177 #if defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER)
178 for (j = TYPE_INT; j <= TYPE_ADR; j++) {
179 # if defined(ENABLE_INTRP)
182 if (rd->locals[i][j].type >= 0) {
183 printf(" (%s) ", jit_type[j]);
184 if (stage >= SHOW_REGS) {
185 if (rd->locals[i][j].flags & INMEMORY)
186 printf("m%2d", rd->locals[i][j].regoff);
187 # ifdef HAS_ADDRESS_REGISTER_FILE
188 else if (j == TYPE_ADR)
189 printf("r%02d", rd->locals[i][j].regoff);
191 else if ((j == TYPE_FLT) || (j == TYPE_DBL))
192 printf("f%02d", rd->locals[i][j].regoff);
194 # if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
195 if (IS_2_WORD_TYPE(j))
197 regs[GET_LOW_REG(rd->locals[i][j].regoff)],
198 regs[GET_HIGH_REG(rd->locals[i][j].regoff)]);
201 printf("%3s", regs[rd->locals[i][j].regoff]);
205 # if defined(ENABLE_INTRP)
209 #endif /* defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER) */
216 if (stage >= SHOW_STACK && rd) {
217 #if defined(ENABLE_LSRA) || defined(ENABLE_SSA)
220 #if defined(ENABLE_INTRP)
223 printf("Interface Table:\n");
224 for (i = 0; i < cd->maxstack; i++) {
225 if ((rd->interfaces[i][0].type >= 0) ||
226 (rd->interfaces[i][1].type >= 0) ||
227 (rd->interfaces[i][2].type >= 0) ||
228 (rd->interfaces[i][3].type >= 0) ||
229 (rd->interfaces[i][4].type >= 0)) {
232 #if defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER)
233 # if defined(ENABLE_INTRP)
236 for (j = TYPE_INT; j <= TYPE_ADR; j++) {
237 if (rd->interfaces[i][j].type >= 0) {
238 printf(" (%s) ", jit_type[j]);
239 if (stage >= SHOW_REGS) {
240 if (rd->interfaces[i][j].flags & SAVEDVAR) {
241 if (rd->interfaces[i][j].flags & INMEMORY)
242 printf("M%2d", rd->interfaces[i][j].regoff);
243 #ifdef HAS_ADDRESS_REGISTER_FILE
244 else if (j == TYPE_ADR)
245 printf("R%02d", rd->interfaces[i][j].regoff);
247 else if ((j == TYPE_FLT) || (j == TYPE_DBL))
248 printf("F%02d", rd->interfaces[i][j].regoff);
250 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
251 if (IS_2_WORD_TYPE(j))
253 regs[GET_LOW_REG(rd->interfaces[i][j].regoff)],
254 regs[GET_HIGH_REG(rd->interfaces[i][j].regoff)]);
257 printf("%3s",regs[rd->interfaces[i][j].regoff]);
261 if (rd->interfaces[i][j].flags & INMEMORY)
262 printf("m%2d", rd->interfaces[i][j].regoff);
263 #ifdef HAS_ADDRESS_REGISTER_FILE
264 else if (j == TYPE_ADR)
265 printf("r%02d", rd->interfaces[i][j].regoff);
267 else if ((j == TYPE_FLT) || (j == TYPE_DBL))
268 printf("f%02d", rd->interfaces[i][j].regoff);
270 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
271 if (IS_2_WORD_TYPE(j))
273 regs[GET_LOW_REG(rd->interfaces[i][j].regoff)],
274 regs[GET_HIGH_REG(rd->interfaces[i][j].regoff)]);
277 printf("%3s",regs[rd->interfaces[i][j].regoff]);
284 # if defined(ENABLE_INTRP)
287 #endif /* defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER) */
293 #if defined(ENABLE_INTRP)
296 #if defined(ENABLE_LSRA) || defined(ENABLE_SSA)
299 } /* if >= SHOW_STACK */
301 if (code->rplpoints) {
302 printf("Replacement Points:\n");
303 replace_show_replacement_points(code);
307 #if defined(ENABLE_DISASSEMBLER)
308 /* show code before first basic block */
310 if ((stage >= SHOW_CODE) && JITDATA_HAS_FLAG_SHOWDISASSEMBLE(jd)) {
311 u1ptr = (u1 *) ((ptrint) code->mcode + cd->dseglen);
313 for (; u1ptr < (u1 *) ((ptrint) code->mcode + cd->dseglen + jd->new_basicblocks[0].mpc);)
320 /* show code of all basic blocks */
322 for (bptr = jd->new_basicblocks; bptr != NULL; bptr = bptr->next)
323 new_show_basicblock(jd, bptr, stage);
325 #if defined(ENABLE_DISASSEMBLER)
326 /* show stubs code */
328 if (stage >= SHOW_CODE && opt_showdisassemble && opt_showexceptionstubs) {
329 printf("\nStubs code:\n");
330 printf("Length: %d\n\n", (s4) (code->mcodelength -
331 ((ptrint) cd->dseglen + lastbptr->mpc)));
333 u1ptr = (u1 *) ((ptrint) code->mcode + cd->dseglen + lastbptr->mpc);
335 for (; (ptrint) u1ptr < ((ptrint) code->mcode + code->mcodelength);)
342 LOCK_MONITOR_EXIT(show_global_lock);
344 /* finally flush the output */
348 #endif /* !defined(NDEBUG) */
351 /* show_basicblock *************************************************************
353 Print the intermediate representation of a basic block.
355 NOTE: Currently this function may only be called after register allocation!
357 *******************************************************************************/
360 void new_show_basicblock(jitdata *jd, basicblock *bptr, int stage)
367 new_instruction *iptr;
370 /* get required compiler data */
376 if (bptr->flags != BBDELETED) {
377 deadcode = bptr->flags <= BBREACHED;
379 printf("======== %sL%03d ======== (flags: %d, bitflags: %01x, next: %d, type: ",
380 (bptr->bitflags & BBFLAG_REPLACEMENT) ? "<REPLACE> " : "",
381 bptr->nr, bptr->flags, bptr->bitflags,
382 (bptr->next) ? (bptr->next->nr) : -1);
384 switch (bptr->type) {
396 printf(", instruction count: %d, predecessors: %d [ ",
397 bptr->icount, bptr->predecessorcount);
399 for (i = 0; i < bptr->predecessorcount; i++)
400 printf("%d ", bptr->predecessors[i]->nr);
404 iptr = /*XXX*/ (new_instruction *) bptr->iinstr;
406 for (i = 0; i < bptr->icount; i++, iptr++) {
407 printf("%4d: ", iptr->line);
409 new_show_icmd(jd, iptr, deadcode, stage);
413 #if defined(ENABLE_DISASSEMBLER)
414 if ((stage >= SHOW_CODE) && JITDATA_HAS_FLAG_SHOWDISASSEMBLE(jd) &&
417 u1ptr = (u1 *) (code->mcode + cd->dseglen + bptr->mpc);
419 if (bptr->next != NULL) {
420 for (; u1ptr < (u1 *) (code->mcode + cd->dseglen + bptr->next->mpc);)
425 for (; u1ptr < (u1 *) (code->mcode + code->mcodelength);)
433 #endif /* !defined(NDEBUG) */
436 /* show_icmd *******************************************************************
438 Print the intermediate representation of an instruction.
440 NOTE: Currently this function may only be called after register allocation!
442 *******************************************************************************/
446 #define SHOW_TARGET(target) \
447 if (stage >= SHOW_STACK) { \
448 printf("--> L%03d ", (target).block->nr); \
450 else if (stage >= SHOW_PARSE) { \
451 printf("--> insindex %d (L%03d) ", (target).insindex, \
452 jd->new_basicblocks[jd->new_basicblockindex[ \
453 (target).insindex]].nr); \
456 printf("--> insindex %d ", (target).insindex); \
459 #define SHOW_INT_CONST(val) \
460 if (stage >= SHOW_PARSE) { \
461 printf("%ld ", (long) (val)); \
467 #define SHOW_LNG_CONST(val) \
468 if (stage >= SHOW_PARSE) { \
469 printf("%lld ", (long long)(val)); \
475 #define SHOW_FLT_CONST(val) \
476 if (stage >= SHOW_PARSE) { \
477 printf("%g ", (val)); \
483 #define SHOW_DBL_CONST(val) \
484 if (stage >= SHOW_PARSE) { \
485 printf("%g ", (val)); \
491 #define SHOW_INDEX(index) \
492 if (stage >= SHOW_PARSE) { \
493 printf("%d ", index); \
499 #define SHOW_STRING(val) \
500 if (stage >= SHOW_PARSE) { \
502 utf_display_printable_ascii( \
503 javastring_toutf((java_lang_String *)(val), false)); \
510 #define SHOW_CLASSREF_OR_CLASSINFO(c) \
511 if (stage >= SHOW_PARSE) { \
512 if (IS_CLASSREF(c)) \
513 class_classref_print(c.ref); \
515 class_print(c.cls); \
522 #define SHOW_FIELD(fmiref) \
523 if (stage >= SHOW_PARSE) { \
524 field_fieldref_print(fmiref); \
531 #define SHOW_STACKVAR(sp) \
532 new_show_stackvar(jd, (sp), stage)
534 #define SHOW_S1(iptr) \
535 if (stage >= SHOW_STACK) { \
536 SHOW_STACKVAR(iptr->s1.var); \
539 #define SHOW_S2(iptr) \
540 if (stage >= SHOW_STACK) { \
541 SHOW_STACKVAR(iptr->sx.s23.s2.var); \
544 #define SHOW_S3(iptr) \
545 if (stage >= SHOW_STACK) { \
546 SHOW_STACKVAR(iptr->sx.s23.s3.var); \
549 #define SHOW_DST(iptr) \
550 if (stage >= SHOW_STACK) { \
552 SHOW_STACKVAR(iptr->dst.var); \
555 #define SHOW_S1_LOCAL(iptr) \
556 if (stage >= SHOW_STACK) { \
557 printf("L%d ", iptr->s1.localindex); \
560 #define SHOW_DST_LOCAL(iptr) \
561 if (stage >= SHOW_STACK) { \
562 printf("=> L%d ", iptr->dst.localindex); \
565 static void new_show_stackvar(jitdata *jd, stackptr sp, int stage)
570 case TYPE_INT: type = 'i'; break;
571 case TYPE_LNG: type = 'l'; break;
572 case TYPE_FLT: type = 'f'; break;
573 case TYPE_DBL: type = 'd'; break;
574 case TYPE_ADR: type = 'a'; break;
577 printf("S%c%d", type, (int) (sp - jd->new_stack));
579 if (stage >= SHOW_REGS) {
582 if (sp->flags & SAVEDVAR) {
583 switch (sp->varkind) {
585 if (sp->flags & INMEMORY)
586 printf("M%02d", sp->regoff);
587 #ifdef HAS_ADDRESS_REGISTER_FILE
588 else if (sp->type == TYPE_ADR)
589 printf("R%02d", sp->regoff);
591 else if (IS_FLT_DBL_TYPE(sp->type))
592 printf("F%02d", sp->regoff);
594 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
595 if (IS_2_WORD_TYPE(sp->type)) {
596 # if defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER)
597 # if defined(ENABLE_INTRP)
599 printf("%3d/%3d", GET_LOW_REG(sp->regoff),
600 GET_HIGH_REG(sp->regoff));
603 printf("%3s/%3s", regs[GET_LOW_REG(sp->regoff)],
604 regs[GET_HIGH_REG(sp->regoff)]);
606 printf("%3d/%3d", GET_LOW_REG(sp->regoff),
607 GET_HIGH_REG(sp->regoff));
611 #endif /* defined(SUPPORT_COMBINE_INTEGER_REGISTERS) */
613 #if defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER)
614 # if defined(ENABLE_INTRP)
616 printf("%3d", sp->regoff);
619 printf("%3s", regs[sp->regoff]);
621 printf("%3d", sp->regoff);
627 printf("I%02d", sp->varnum);
630 printf("L%02d", sp->varnum);
633 if (sp->varnum == -1) {
635 /* varkind ARGVAR "misused for this special case */
638 else /* "normal" Argvar */
639 printf("A%02d", sp->varnum);
642 printf("!xx {kind=%d, num=%d}", sp->varkind, sp->varnum);
645 else { /* not SAVEDVAR */
646 switch (sp->varkind) {
648 if (sp->flags & INMEMORY)
649 printf("m%02d", sp->regoff);
650 #ifdef HAS_ADDRESS_REGISTER_FILE
651 else if (sp->type == TYPE_ADR)
652 printf("r%02d", sp->regoff);
654 else if (IS_FLT_DBL_TYPE(sp->type))
655 printf("f%02d", sp->regoff);
657 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
658 if (IS_2_WORD_TYPE(sp->type)) {
659 # if defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER)
660 # if defined(ENABLE_INTRP)
662 printf("%3d/%3d", GET_LOW_REG(sp->regoff),
663 GET_HIGH_REG(sp->regoff));
666 printf("%3s/%3s", regs[GET_LOW_REG(sp->regoff)],
667 regs[GET_HIGH_REG(sp->regoff)]);
669 printf("%3d/%3d", GET_LOW_REG(sp->regoff),
670 GET_HIGH_REG(sp->regoff));
674 #endif /* defined(SUPPORT_COMBINE_INTEGER_REGISTERS) */
676 #if defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER)
677 # if defined(ENABLE_INTRP)
679 printf("%3d", sp->regoff);
682 printf("%3s", regs[sp->regoff]);
684 printf("%3d", sp->regoff);
690 printf("i%02d", sp->varnum);
693 printf("l%02d", sp->varnum);
696 if (sp->varnum == -1) {
698 /* varkind ARGVAR "misused for this special case */
701 else /* "normal" Argvar */
702 printf("a%02d", sp->varnum);
705 printf("?xx {kind=%d, num=%d}", sp->varkind, sp->varnum);
714 void new_show_icmd(jitdata *jd, new_instruction *iptr, bool deadcode, int stage)
717 branch_target_t *table;
718 lookup_target_t *lookup;
719 constant_FMIref *fmiref;
723 /* get the opcode and the condition */
727 printf("%s ", icmd_names[opcode]);
729 if (stage < SHOW_PARSE)
735 /* Print the condition for conditional instructions. */
737 /* XXX print condition from flags */
739 if (iptr->flags.bits & INS_FLAG_UNRESOLVED)
740 printf("(UNRESOLVED) ");
746 case ICMD_CHECKNULL_POP:
751 case ICMD_ARRAYLENGTH:
818 /* binary/const INT */
830 case ICMD_IUSHRCONST:
833 case ICMD_LUSHRCONST:
835 SHOW_INT_CONST(iptr->sx.val.i);
839 /* ?ASTORECONST (trinary/const INT) */
840 case ICMD_IASTORECONST:
841 case ICMD_BASTORECONST:
842 case ICMD_CASTORECONST:
843 case ICMD_SASTORECONST:
846 SHOW_INT_CONST(iptr->sx.s23.s3.constval);
851 SHOW_INT_CONST(iptr->sx.val.i);
855 /* binary/const LNG */
866 SHOW_LNG_CONST(iptr->sx.val.l);
870 /* trinary/const LNG (<= pointer size) */
871 case ICMD_LASTORECONST:
874 SHOW_LNG_CONST(iptr->sx.s23.s3.constval);
879 SHOW_LNG_CONST(iptr->sx.val.l);
885 SHOW_FLT_CONST(iptr->sx.val.f);
891 SHOW_DBL_CONST(iptr->sx.val.d);
897 if (iptr->flags.bits & INS_FLAG_CLASS) {
898 SHOW_CLASSREF_OR_CLASSINFO(iptr->sx.val.c);
900 else if (iptr->sx.val.anyptr == NULL) {
904 SHOW_STRING(iptr->sx.val.stringconst);
909 case ICMD_AASTORECONST:
912 printf("%p ", (void*) iptr->sx.s23.s3.constval);
915 case ICMD_GETFIELD: /* 1 -> 1 */
916 case ICMD_PUTFIELD: /* 2 -> 0 */
917 case ICMD_PUTSTATIC: /* 1 -> 0 */
918 case ICMD_GETSTATIC: /* 0 -> 1 */
919 case ICMD_PUTSTATICCONST: /* 0 -> 0 */
920 case ICMD_PUTFIELDCONST: /* 1 -> 0 */
921 if (opcode != ICMD_GETSTATIC && opcode != ICMD_PUTSTATICCONST) {
923 if (opcode == ICMD_PUTFIELD) {
927 NEW_INSTRUCTION_GET_FIELDREF(iptr, fmiref);
930 if (opcode == ICMD_GETSTATIC || opcode == ICMD_GETFIELD) {
937 SHOW_INT_CONST(iptr->sx.val.i);
938 SHOW_DST_LOCAL(iptr);
986 SHOW_DST_LOCAL(iptr);
1001 case ICMD_MULTIANEWARRAY:
1002 if (stage >= SHOW_STACK) {
1003 argp = iptr->sx.s23.s2.args;
1004 i = iptr->s1.argcount;
1006 SHOW_STACKVAR(*(argp++));
1010 printf("argcount=%d ", iptr->s1.argcount);
1015 case ICMD_CHECKCAST:
1020 case ICMD_INSTANCEOF:
1025 case ICMD_INLINE_START:
1026 case ICMD_INLINE_END:
1030 if (stage >= SHOW_STACK) {
1031 argp = iptr->sx.s23.s2.args;
1032 i = iptr->s1.argcount;
1034 SHOW_STACKVAR(*(argp++));
1037 printf("%s ", iptr->sx.s23.s3.bte->cname);
1038 if (iptr->sx.s23.s3.bte->md->returntype.type != TYPE_VOID) {
1043 case ICMD_INVOKEVIRTUAL:
1044 case ICMD_INVOKESPECIAL:
1045 case ICMD_INVOKESTATIC:
1046 case ICMD_INVOKEINTERFACE:
1047 if (stage >= SHOW_STACK) {
1048 argp = iptr->sx.s23.s2.args;
1049 i = iptr->s1.argcount;
1051 SHOW_STACKVAR(*(argp++));
1054 NEW_INSTRUCTION_GET_METHODREF(iptr, fmiref);
1055 method_methodref_print(fmiref);
1056 if (fmiref->parseddesc.md->returntype.type != TYPE_VOID) {
1068 SHOW_TARGET(iptr->dst);
1078 SHOW_TARGET(iptr->dst);
1082 case ICMD_INLINE_GOTO:
1083 SHOW_TARGET(iptr->dst);
1087 SHOW_TARGET(iptr->sx.s23.s3.jsrtarget);
1092 case ICMD_IFNONNULL:
1094 SHOW_TARGET(iptr->dst);
1097 case ICMD_IF_ICMPEQ:
1098 case ICMD_IF_ICMPNE:
1099 case ICMD_IF_ICMPLT:
1100 case ICMD_IF_ICMPGE:
1101 case ICMD_IF_ICMPGT:
1102 case ICMD_IF_ICMPLE:
1104 case ICMD_IF_LCMPEQ:
1105 case ICMD_IF_LCMPNE:
1106 case ICMD_IF_LCMPLT:
1107 case ICMD_IF_LCMPGE:
1108 case ICMD_IF_LCMPGT:
1109 case ICMD_IF_LCMPLE:
1111 case ICMD_IF_FCMPEQ:
1112 case ICMD_IF_FCMPNE:
1114 case ICMD_IF_FCMPL_LT:
1115 case ICMD_IF_FCMPL_GE:
1116 case ICMD_IF_FCMPL_GT:
1117 case ICMD_IF_FCMPL_LE:
1119 case ICMD_IF_FCMPG_LT:
1120 case ICMD_IF_FCMPG_GE:
1121 case ICMD_IF_FCMPG_GT:
1122 case ICMD_IF_FCMPG_LE:
1124 case ICMD_IF_DCMPEQ:
1125 case ICMD_IF_DCMPNE:
1127 case ICMD_IF_DCMPL_LT:
1128 case ICMD_IF_DCMPL_GE:
1129 case ICMD_IF_DCMPL_GT:
1130 case ICMD_IF_DCMPL_LE:
1132 case ICMD_IF_DCMPG_LT:
1133 case ICMD_IF_DCMPG_GE:
1134 case ICMD_IF_DCMPG_GT:
1135 case ICMD_IF_DCMPG_LE:
1137 case ICMD_IF_ACMPEQ:
1138 case ICMD_IF_ACMPNE:
1141 SHOW_TARGET(iptr->dst);
1144 case ICMD_TABLESWITCH:
1148 case ICMD_LOOKUPSWITCH:
1166 if (stage >= SHOW_STACK) {
1167 SHOW_STACKVAR(iptr->dst.dupslots[0]);
1168 SHOW_STACKVAR(iptr->dst.dupslots[1]);
1170 SHOW_STACKVAR(iptr->dst.dupslots[2+0]);
1171 SHOW_STACKVAR(iptr->dst.dupslots[2+1]);
1176 if (stage >= SHOW_STACK) {
1177 SHOW_STACKVAR(iptr->dst.dupslots[0]);
1178 SHOW_STACKVAR(iptr->dst.dupslots[1]);
1180 SHOW_STACKVAR(iptr->dst.dupslots[2+0]);
1181 SHOW_STACKVAR(iptr->dst.dupslots[2+1]);
1182 SHOW_STACKVAR(iptr->dst.dupslots[2+2]);
1187 if (stage >= SHOW_STACK) {
1188 SHOW_STACKVAR(iptr->dst.dupslots[0]);
1189 SHOW_STACKVAR(iptr->dst.dupslots[1]);
1190 SHOW_STACKVAR(iptr->dst.dupslots[2]);
1192 SHOW_STACKVAR(iptr->dst.dupslots[3+0]);
1193 SHOW_STACKVAR(iptr->dst.dupslots[3+1]);
1194 SHOW_STACKVAR(iptr->dst.dupslots[3+2]);
1195 SHOW_STACKVAR(iptr->dst.dupslots[3+3]);
1196 SHOW_STACKVAR(iptr->dst.dupslots[3+4]);
1201 if (stage >= SHOW_STACK) {
1202 SHOW_STACKVAR(iptr->dst.dupslots[0]);
1203 SHOW_STACKVAR(iptr->dst.dupslots[1]);
1204 SHOW_STACKVAR(iptr->dst.dupslots[2]);
1206 SHOW_STACKVAR(iptr->dst.dupslots[3+0]);
1207 SHOW_STACKVAR(iptr->dst.dupslots[3+1]);
1208 SHOW_STACKVAR(iptr->dst.dupslots[3+2]);
1209 SHOW_STACKVAR(iptr->dst.dupslots[3+3]);
1214 if (stage >= SHOW_STACK) {
1215 SHOW_STACKVAR(iptr->dst.dupslots[0]);
1216 SHOW_STACKVAR(iptr->dst.dupslots[1]);
1217 SHOW_STACKVAR(iptr->dst.dupslots[2]);
1218 SHOW_STACKVAR(iptr->dst.dupslots[4]);
1220 SHOW_STACKVAR(iptr->dst.dupslots[4+0]);
1221 SHOW_STACKVAR(iptr->dst.dupslots[4+1]);
1222 SHOW_STACKVAR(iptr->dst.dupslots[4+2]);
1223 SHOW_STACKVAR(iptr->dst.dupslots[4+3]);
1224 SHOW_STACKVAR(iptr->dst.dupslots[4+4]);
1225 SHOW_STACKVAR(iptr->dst.dupslots[4+5]);
1230 if (stage >= SHOW_STACK) {
1231 SHOW_STACKVAR(iptr->dst.dupslots[0]);
1232 SHOW_STACKVAR(iptr->dst.dupslots[1]);
1234 SHOW_STACKVAR(iptr->dst.dupslots[2+0]);
1235 SHOW_STACKVAR(iptr->dst.dupslots[2+1]);
1241 #endif /* !defined(NDEBUG) */
1245 * These are local overrides for various environment variables in Emacs.
1246 * Please do not remove this and leave it at the end of the file, where
1247 * Emacs will automagically detect them.
1248 * ---------------------------------------------------------------------
1251 * indent-tabs-mode: t
1255 * vim:noexpandtab:sw=4:ts=4: