/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (c) 1999 by Sun Microsystems, Inc. * All rights reserved. */ #pragma ident "%Z%%M% %I% %E% SMI" #include #include #include #include #include #include #include #include #include #include #include #include #include "iconv_tm.h" #include "itm_util.h" /* * function prototype */ static itm_hdr_t *itm_attach(const char *); static void dump_tables(itm_hdr_t *, itm_info_hdr_t *); static void dump_direc_tbl(itm_hdr_t *, itm_place_t); static void dump_map(itm_hdr_t *, itm_place_t, int); static void dump_map_i_f(itm_hdr_t *, itm_place_t, int); static void dump_map_l_f(itm_hdr_t *, itm_place_t, int); static void dump_map_hash(itm_hdr_t *, itm_place_t, int); static void dump_map_dense_enc(itm_hdr_t *, itm_place_t, int); static void dump_cond_tbl(itm_hdr_t *, itm_place_t, int); static void dump_op_tbl(itm_hdr_t *, itm_place_t, int); static void dump_op(itm_hdr_t *, itm_place2_t); static void dump_expr(itm_hdr_t *, itm_place_t); static void dump_range(itm_hdr_t *, itm_place_t); static void dump_escapeseq(itm_hdr_t *, itm_place_t); static char *tbl_name(itm_hdr_t *, itm_tbl_hdr_t *); static char *reg_name(itm_hdr_t *itm_hdr, itm_place_t op); static void printi(int, char *, ...); /* * macro definition */ #define ADDR(place) ((void *)(((char *)(itm_hdr)) + \ ((itm_place2_t)((place).itm_ptr)))) #define DADDR(n) (((n)->size <= (sizeof ((n)->place))) ? \ ((char *)(&((n)->place))) :\ ((char *)(ADDR((n)->place)))) #define ADDR2(place2) ((void *)(((char *)(itm_hdr)) + \ ((itm_place2_t)(place2)))) #define INFO_HDR(pa) ((void *)(((char *)pa) + \ ((itm_hdr_t *)(pa))->info_hdr.itm_ptr)) #if defined(RESERVED_NAME_PREFIX) #define RNPREF RESERVED_NAME_PREFIX #else /* !defined(RESERVED_NAME_PREFIX) */ #define RNPREF /* null strings */ #endif /* !defined(RESERVED_NAME_PREFIX) */ void disassemble(char *file) { itm_hdr_t *itm_hdr; itm_info_hdr_t *info_hdr; itm_data_t type_id; TRACE_MESSAGE('d', ("disassemble %s\n", file)); itm_hdr = itm_attach(file); if (NULL == itm_hdr) { exit(3); } if (0 == itm_hdr->info_hdr.itm_ptr) { itm_error(gettext("binarytable is stripped\n")); exit(4); } if (0 == itm_hdr->info_hdr.itm_ptr) { info_hdr = malloc_vital(sizeof (itm_info_hdr_t)); (void) memset(info_hdr, 0, sizeof (itm_info_hdr_t)); } else { info_hdr = INFO_HDR(itm_hdr); } #if defined(ENABLE_TRACE) dump_itm_header(itm_hdr, info_hdr); #endif printi(0, "//\n", file); printi(0, "// %s\n", file); printi(0, "//\n", file); type_id = itm_hdr->type_id; if ((NULL != cmd_opt.disassemble) && ((sizeof (itm_place_t)) < type_id.size)) { type_id.place.itm_ptr += (itm_place2_t)itm_hdr; } printi(1, "%s {\n", name_to_str(&type_id)); dump_tables(itm_hdr, info_hdr); printi(-1, "}\n"); } #if defined(ENABLE_TRACE) void dump_itm_header(itm_hdr_t *itm_header, itm_info_hdr_t *info_header) { char *str_type_id; char *str_interpreter; itm_data_t type_id; itm_data_t interpreter; type_id = itm_header->type_id; str_type_id = malloc_vital(itm_header->type_id.size + 1); if ((NULL != cmd_opt.disassemble) && ((sizeof (itm_place_t)) < type_id.size)) { type_id.place.itm_ptr += (itm_place2_t)itm_header; } (void) memcpy(str_type_id, name_to_str(&type_id), type_id.size + 1); interpreter = itm_header->interpreter; str_interpreter = malloc_vital(itm_header->interpreter.size + 1); if ((NULL != cmd_opt.disassemble) && ((sizeof (itm_place_t)) < interpreter.size)) { interpreter.place.itm_ptr += (itm_place2_t)itm_header; } (void) memcpy(str_interpreter, name_to_str(&interpreter), interpreter.size + 1); TRACE_MESSAGE('D', ("\n" "------\n" "Sizeof Data Structures \n" " sizeof(int) = %ld\n" " sizeof(long) = %ld\n" " sizeof(uintptr_t) = %ld\n" " sizeof(struct itm_place_t) = %ld\n" " sizeof(struct itm_data_t) = %ld\n" " sizeof(struct itm_hdr_t) = %ld\n" " sizeof(struct itm_place_tbl_info_t) = %ld\n" " sizeof(struct itm_section_info_t) = %ld\n" " sizeof(struct itm_action_type_t) = %ld\n" " sizeof(struct itm_direct_t) = %ld\n" " sizeof(struct itm_cond_t) = %ld\n" " sizeof(struct itm_range_hdr_t) = %ld\n" " sizeof(struct itm_escapeseq_hdr_t) = %ld\n" " sizeof(struct itm_map_idx_fix_hdr_t) = %ld\n" " sizeof(struct itm_map_lookup_hdr_t) = %ld\n" " sizeof(struct itm_map_hash_hdr_t) = %ld\n" " sizeof(struct itm_map_dense_enc_hdr_t) = %ld\n" " sizeof(struct itm_expr_t) = %ld\n" " sizeof(enum itm_op_type_t) = %ld\n" " sizeof(struct itm_op_t) u= %ld\n" " sizeof(enum itm_expr_type_t)= %ld\n" "\n", sizeof (int), sizeof (long), sizeof (uintptr_t), sizeof (itm_place_t), sizeof (itm_data_t), sizeof (itm_hdr_t), sizeof (itm_place_tbl_info_t), sizeof (itm_section_info_t), sizeof (itm_action_type_t), sizeof (itm_direc_t), sizeof (itm_cond_t), sizeof (itm_range_hdr_t), sizeof (itm_escapeseq_hdr_t), sizeof (itm_map_idx_fix_hdr_t), sizeof (itm_map_lookup_hdr_t), sizeof (itm_map_hash_hdr_t), sizeof (itm_map_dense_enc_hdr_t), sizeof (itm_expr_t), sizeof (itm_op_type_t), sizeof (itm_op_t), sizeof (itm_expr_type_t))); TRACE_MESSAGE('H', ("ident = %c%c%c\n" "spec = %02x%02x%02x%02x\n" "version = %02x%02x%02x%02x\n" "itm_size = %ld\n" "type_id = %s\n" "interpreter = %s\n" "op_init_tbl = %ld\n" "op_reset_tbl = %ld\n" "direc_init_tbl = %ld\n" "reg_num = %ld\n" "itm_hdr_size = %ld\n" "info_hdr = %ld\n" "info_hdr_size = %ld\n", itm_header->ident[0], itm_header->ident[1], itm_header->ident[2], /* itm_header->ident[3], */ itm_header->spec[0], itm_header->spec[1], itm_header->spec[2], itm_header->spec[3], itm_header->version[0], itm_header->version[1], itm_header->version[2], itm_header->version[3], itm_header->itm_size.itm_ptr, str_type_id, str_interpreter, itm_header->op_init_tbl.itm_ptr, itm_header->op_reset_tbl.itm_ptr, itm_header->direc_init_tbl.itm_ptr, itm_header->reg_num, itm_header->itm_hdr_size, itm_header->info_hdr.itm_ptr, (sizeof (itm_info_hdr_t)))); TRACE_MESSAGE('H', (" str_sec = (%4ld %4ld %4ld) " " str_plc_tbl = (%4ld %4ld %4ld)\n" "direc_sec_tbl = (%4ld %4ld %4ld) " "direc_plc_tbl = (%4ld %4ld %4ld)\n" " cond_sec_tbl = (%4ld %4ld %4ld) " " cond_plc_tbl = (%4ld %4ld %4ld)\n" " map_sec_tbl = (%4ld %4ld %4ld) " " map_plc_tbl = (%4ld %4ld %4ld)\n" " op_sec_tbl = (%4ld %4ld %4ld) " " op_plc_tbl = (%4ld %4ld %4ld)\n" "range_sec_tbl = (%4ld %4ld %4ld) " "range_plc_tbl = (%4ld %4ld %4ld)\n" "escsq_sec_tbl = (%4ld %4ld %4ld) " "escsq_plc_tbl = (%4ld %4ld %4ld)\n" " data_sec = (%4ld %4ld %4ld) " " data_plc_tbl = (%4ld %4ld %4ld)\n" " name_sec = (%4ld %4ld %4ld) " " name_plc_tbl = (%4ld %4ld %4ld)\n" " " " reg_plc_tbl = (%4ld %4ld %4ld)\n" "%s\n", info_header->str_sec.place.itm_ptr, info_header->str_sec.size, info_header->str_sec.number, info_header->str_plc_tbl.place.itm_ptr, info_header->str_plc_tbl.size, info_header->str_plc_tbl.number, info_header->direc_tbl_sec.place.itm_ptr, info_header->direc_tbl_sec.size, info_header->direc_tbl_sec.number, info_header->direc_plc_tbl.place.itm_ptr, info_header->direc_plc_tbl.size, info_header->direc_plc_tbl.number, info_header->cond_tbl_sec.place.itm_ptr, info_header->cond_tbl_sec.size, info_header->cond_tbl_sec.number, info_header->cond_plc_tbl.place.itm_ptr, info_header->cond_plc_tbl.size, info_header->cond_plc_tbl.number, info_header->map_tbl_sec.place.itm_ptr, info_header->map_tbl_sec.size, info_header->map_tbl_sec.number, info_header->map_plc_tbl.place.itm_ptr, info_header->map_plc_tbl.size, info_header->map_plc_tbl.number, info_header->op_tbl_sec.place.itm_ptr, info_header->op_tbl_sec.size, info_header->op_tbl_sec.number, info_header->op_plc_tbl.place.itm_ptr, info_header->op_plc_tbl.size, info_header->op_plc_tbl.number, info_header->range_tbl_sec.place.itm_ptr, info_header->range_tbl_sec.size, info_header->range_tbl_sec.number, info_header->range_plc_tbl.place.itm_ptr, info_header->range_plc_tbl.size, info_header->range_plc_tbl.number, info_header->escapeseq_tbl_sec.place.itm_ptr, info_header->escapeseq_tbl_sec.size, info_header->escapeseq_tbl_sec.number, info_header->escapeseq_plc_tbl.place.itm_ptr, info_header->escapeseq_plc_tbl.size, info_header->escapeseq_plc_tbl.number, info_header->data_sec.place.itm_ptr, info_header->data_sec.size, info_header->data_sec.number, info_header->data_plc_tbl.place.itm_ptr, info_header->data_plc_tbl.size, info_header->data_plc_tbl.number, info_header->name_sec.place.itm_ptr, info_header->name_sec.size, info_header->name_sec.number, info_header->name_plc_tbl.place.itm_ptr, info_header->name_plc_tbl.size, info_header->name_plc_tbl.number, info_header->reg_plc_tbl.place.itm_ptr, info_header->reg_plc_tbl.size, info_header->reg_plc_tbl.number, "--------")); } #endif /* * Dump tables */ static void dump_tables(itm_hdr_t *itm_hdr, itm_info_hdr_t *info_hdr) { itm_num_t n; itm_data_t *data; itm_place_t *place; itm_place2_t place2; itm_data_t d; data = (itm_data_t *)(ADDR(info_hdr->reg_plc_tbl.place)); for (n = 0; n < info_hdr->reg_plc_tbl.number; n++, data += 1) { d = *(data); if ((sizeof (itm_place_t)) < d.size) { d.place.itm_ptr = (itm_place2_t)ADDR(d.place); } printi(0, "// register: %s\n", name_to_str(&d)); } data = (itm_data_t *)(ADDR(info_hdr->name_plc_tbl.place)); for (n = 0, place2 = info_hdr->name_plc_tbl.place.itm_ptr; n < info_hdr->name_plc_tbl.number; n++, data += 1, place2 += sizeof (itm_data_t)) { d = *(data); if ((sizeof (itm_place_t)) < d.size) { d.place.itm_ptr = (itm_place2_t)ADDR(d.place); } TRACE_MESSAGE('p', ("(*)name=%ld", ((sizeof (itm_place_t)) < d.size) ? d.place.itm_ptr: (place2 + offsetof(itm_data_t, place)))); printi(0, "// name: %s\n", name_to_str(&d)); } place = (itm_place_t *)(ADDR(info_hdr->cond_plc_tbl.place)); for (n = 0; n < info_hdr->cond_plc_tbl.number; n++, place += 1) { dump_cond_tbl(itm_hdr, *place, 1); } place = (itm_place_t *)(ADDR(info_hdr->map_plc_tbl.place)); for (n = 0; n < info_hdr->map_plc_tbl.number; n++, place += 1) { dump_map(itm_hdr, *place, 1); } place = (itm_place_t *)(ADDR(info_hdr->op_plc_tbl.place)); for (n = 0; n < info_hdr->op_plc_tbl.number; n++, place += 1) { dump_op_tbl(itm_hdr, *place, 1); } place = (itm_place_t *)(ADDR(info_hdr->direc_plc_tbl.place)); for (n = 0; n < info_hdr->direc_plc_tbl.number; n++, place += 1) { dump_direc_tbl(itm_hdr, *place); } } /* * Dump direction */ static void dump_direc_tbl(itm_hdr_t *itm_hdr, itm_place_t direc_place) { itm_tbl_hdr_t *direc_hdr; itm_direc_t *direc; itm_type_t type; long i; char *name; direc_hdr = (itm_tbl_hdr_t *)ADDR(direc_place); direc = (itm_direc_t *)(direc_hdr + 1); TRACE_MESSAGE('p', ("(&)direc=%ld ", direc_place.itm_ptr)); printi(1, RNPREF "direction"); if (0 != direc_hdr->name.itm_ptr) { name = tbl_name(itm_hdr, direc_hdr); if (NULL != name) { printi(0, " %s", name); } } printi(0, " {\n"); for (i = 0; i < direc_hdr->number; i++, direc++) { dump_cond_tbl(itm_hdr, direc->condition, 0); printi(0, "\t"); type = (ITM_TBL_MASK & (((itm_tbl_hdr_t *)(ADDR(direc->action)))->type)); if (ITM_TBL_OP == type) { dump_op_tbl(itm_hdr, direc->action, 0); } else if (ITM_TBL_DIREC == type) { printi(0, "direction: action: %ld\n", direc->action.itm_ptr); } else if (ITM_TBL_MAP == type) { dump_map(itm_hdr, direc->action, 0); } else { printi(0, RNPREF "error ELIBBAD // unknown operation (%lx)\n", type); } } printi(-1, "};\n"); } static void dump_map(itm_hdr_t *itm_hdr, itm_place_t map_place, int standalone) { itm_tbl_hdr_t *tbl_hdr; tbl_hdr = (itm_tbl_hdr_t *)ADDR(map_place); switch (tbl_hdr->type) { case ITM_TBL_MAP_INDEX_FIXED_1_1: case ITM_TBL_MAP_INDEX_FIXED: dump_map_i_f(itm_hdr, map_place, standalone); break; case ITM_TBL_MAP_LOOKUP: dump_map_l_f(itm_hdr, map_place, standalone); break; case ITM_TBL_MAP_HASH: dump_map_hash(itm_hdr, map_place, standalone); break; case ITM_TBL_MAP_DENSE_ENC: dump_map_dense_enc(itm_hdr, map_place, standalone); break; default: break; } } /* * Dump map-indexed-fixed */ static void dump_map_i_f(itm_hdr_t *itm_hdr, itm_place_t map_place, int standalone) { itm_tbl_hdr_t *tbl_hdr; itm_map_idx_fix_hdr_t *map_hdr; itm_num_t i; itm_num_t j; unsigned char *p; unsigned char *map_error; char *name; int error_flag; TRACE_MESSAGE('d', ("dump_map_i_f\n")); tbl_hdr = (itm_tbl_hdr_t *)ADDR(map_place); map_hdr = (itm_map_idx_fix_hdr_t *)(tbl_hdr + 1); if (0 < map_hdr->error_num) { p = (unsigned char *)(map_hdr + 1); map_error = p + (map_hdr->result_len * (tbl_hdr->number)); if (0 == map_hdr->default_error) { map_error += map_hdr->result_len; } } else if (1 == map_hdr->default_error) { p = (unsigned char *)(map_hdr + 1); map_error = p + (map_hdr->result_len * (tbl_hdr->number)); } else { map_error = NULL; } if ((standalone) && (0 == tbl_hdr->name.itm_ptr) && (map_place.itm_ptr != itm_hdr->direc_init_tbl.itm_ptr)) { return; } TRACE_MESSAGE('p', ("(&)map=%ld ", map_place.itm_ptr)); if (0 == tbl_hdr->name.itm_ptr) { name = NULL; } else { name = tbl_name(itm_hdr, tbl_hdr); } if ((0 == standalone) && (0 != tbl_hdr->name.itm_ptr)) { if (NULL != name) { printi(0, "%s;\n", name); } else { printi(0, RNPREF "unknown;\n", name); } return; } else { printi(1, RNPREF "map"); if (NULL != name) { printi(0, " %s", name); } printi(0, " {\n"); } printi(0, "// simple indexed map\n"); printi(0, "// source_len=%ld result_len=%ld\n", map_hdr->source_len, map_hdr->result_len); printi(0, "// start=0x%p end=0x%p\n", /* DO NOT CHANGE to %ld */ map_hdr->start.itm_ptr, map_hdr->end.itm_ptr); if (0 < map_hdr->error_num) { printi(0, "// error_num=%ld\n", map_hdr->error_num); } if (0 == map_hdr->default_error) { p = (((unsigned char *)(map_hdr + 1)) + (map_hdr->result_len * (map_hdr->end.itm_ptr - map_hdr->start.itm_ptr + 1))); printi(0, RNPREF "default 0x"); for (j = 0; j < map_hdr->result_len; j++) { printi(0, "%02x", *(p + j)); } printi(0, "\n"); } else if (-1 == map_hdr->default_error) { printi(0, RNPREF "default\t" RNPREF "default\n"); } error_flag = 0; for (i = 0; i <= (map_hdr->end.itm_ptr - map_hdr->start.itm_ptr); i++) { p = (((unsigned char *)(map_hdr + 1)) + (map_hdr->result_len * i)); if ((NULL == map_error) || (0 == *(map_error + i))) { printi(0, "0x%0*p\t", (map_hdr->source_len * 2), i + map_hdr->start.itm_ptr); printi(0, "0x"); for (j = 0; j < map_hdr->result_len; j++) { printi(0, "%02x", *(p + j)); } error_flag = 0; printi(0, "\n"); } else if (0 >= map_hdr->default_error) { if (0 == error_flag) { printi(0, "0x%0*p\t", (map_hdr->source_len * 2), i + map_hdr->start.itm_ptr); printi(0, "error\n"); error_flag = 1; } else if (error_flag == 1) { printi(0, " :\t:\n"); error_flag = 2; } } } printi(-1, "};\n"); } /* * Dump map-lookup-fixed */ static void dump_map_l_f(itm_hdr_t *itm_hdr, itm_place_t map_place, int standalone) { itm_tbl_hdr_t *tbl_hdr; itm_map_lookup_hdr_t *map_hdr; itm_num_t i; itm_num_t j; unsigned char *p; char *name; TRACE_MESSAGE('d', ("dump_map_l_f\n")); tbl_hdr = (itm_tbl_hdr_t *)ADDR(map_place); map_hdr = (itm_map_lookup_hdr_t *)(tbl_hdr + 1); if ((standalone) && (0 == tbl_hdr->name.itm_ptr) && (map_place.itm_ptr != itm_hdr->direc_init_tbl.itm_ptr)) { return; } TRACE_MESSAGE('p', ("(&)map=%ld ", map_place.itm_ptr)); if (0 == tbl_hdr->name.itm_ptr) { name = NULL; } else { name = tbl_name(itm_hdr, tbl_hdr); } if ((0 == standalone) && (0 != tbl_hdr->name.itm_ptr)) { if (NULL != name) { printi(0, "%s;\n", name); } else { printi(0, RNPREF "unknown;\n", name); } return; } else { printi(1, RNPREF "map"); if (NULL != name) { printi(0, " %s", name); } printi(0, " {\n"); } printi(0, "// binary search map\n"); printi(0, "// source_len=%ld result_len=%ld\n", map_hdr->source_len, map_hdr->result_len); if (0 < map_hdr->error_num) { printi(0, "// error_num=%ld\n", map_hdr->error_num); } if (0 == map_hdr->default_error) { printi(0, RNPREF "default\t0x"); p = ((unsigned char *)(map_hdr + 1) + (tbl_hdr->number * (map_hdr->source_len + map_hdr->result_len + 1)) + map_hdr->source_len + 1); for (j = 0; j < map_hdr->result_len; j++, p++) { printi(0, "%02x", *p); } printi(0, "\n"); } else if (-1 == map_hdr->default_error) { printi(0, RNPREF "default\t" RNPREF "default\n"); } p = (unsigned char *)(map_hdr + 1); for (i = 0; i < tbl_hdr->number; i++) { printi(0, "0x"); for (j = 0; j < map_hdr->source_len; j++, p++) { printi(0, "%02x", *p); } if (0 != (*p)) { p += map_hdr->result_len + 1; printi(0, "\terror"); } else { p++; printi(0, "\t0x"); for (j = 0; j < map_hdr->result_len; j++, p++) { printi(0, "%02x", *p); } } printi(0, "\n"); } printi(-1, "};\n"); } /* * Dump map-hash */ static void dump_map_hash(itm_hdr_t *itm_hdr, itm_place_t map_place, int standalone) { itm_tbl_hdr_t *tbl_hdr; itm_map_hash_hdr_t *map_hdr; itm_num_t i; itm_num_t j; unsigned char *p; unsigned char *map_hash; unsigned char *map_error; char *name; TRACE_MESSAGE('d', ("dump_map_hash\n")); tbl_hdr = (itm_tbl_hdr_t *)ADDR(map_place); map_hdr = (itm_map_hash_hdr_t *)(tbl_hdr + 1); map_error = (unsigned char *)(map_hdr + 1); map_hash = (map_error + map_hdr->hash_tbl_num); if ((standalone) && (0 == tbl_hdr->name.itm_ptr) && (map_place.itm_ptr != itm_hdr->direc_init_tbl.itm_ptr)) { return; } TRACE_MESSAGE('p', ("(&)map=%ld ", map_place.itm_ptr)); if (0 == tbl_hdr->name.itm_ptr) { name = NULL; } else { name = tbl_name(itm_hdr, tbl_hdr); } if ((0 == standalone) && (0 != tbl_hdr->name.itm_ptr)) { if (NULL != name) { printi(0, "%s;\n", name); } else { printi(0, RNPREF "unknown;\n", name); } return; } else { printi(1, RNPREF "map"); if (NULL != name) { printi(0, " %s", name); } printi(0, " {\n"); } printi(0, "// hashed map\n"); printi(0, "// number=%ld\n", tbl_hdr->number); printi(0, "// source_len=%ld result_len=%ld\n", map_hdr->source_len, map_hdr->result_len); printi(0, "// hash_tbl_size=%ld hash_of_size=%ld hash_of_num=%ld\n", map_hdr->hash_tbl_size, map_hdr->hash_of_size, map_hdr->hash_of_num); if (0 < map_hdr->error_num) { printi(0, "// error_num=%ld\n", map_hdr->error_num); } if (0 == map_hdr->default_error) { printi(0, RNPREF "default\t0x"); p = map_hash + map_hdr->hash_tbl_size + map_hdr->hash_of_size; for (j = 0; j < map_hdr->result_len; j++, p++) { printi(0, "%02x", *p); } printi(0, "\n"); } else if (-1 == map_hdr->default_error) { printi(0, RNPREF "default\t" RNPREF "default\n"); } p = map_hash; TRACE_MESSAGE('d', ("dump_map_hash: %ld %ld\n", tbl_hdr->number, map_hdr->hash_of_num)); for (i = 0; i < map_hdr->hash_tbl_num; i++) { TRACE_MESSAGE('d', ("dump_map_hash: %x (0x%08p)\n", *p, p)); if (0 == *(map_error + i)) { p += (map_hdr->source_len + 1 + map_hdr->result_len); continue; } printi(0, "0x"); for (j = 0; j < map_hdr->source_len; j++, p++) { printi(0, "%02x", *p); } if (0 != (*p)) { p += map_hdr->result_len + 1; printi(0, "\terror"); } else { p++; printi(0, "\t0x"); for (j = 0; j < map_hdr->result_len; j++, p++) { printi(0, "%02x", *p); } } printi(0, "\n"); } printi(0, "// of table\n"); for (i = 0; i < map_hdr->hash_of_num; i++) { printi(0, "0x"); for (j = 0; j < map_hdr->source_len; j++, p++) { printi(0, "%02x", *p); } if (0 != (*p)) { p += map_hdr->result_len + 1; printi(0, "\terror\n"); } else { p++; printi(0, "\t0x"); for (j = 0; j < map_hdr->result_len; j++, p++) { printi(0, "%02x", *p); } printi(0, "\n"); } } printi(-1, "};\n"); } /* * Dump map-dense-encoding */ static void dump_map_dense_enc(itm_hdr_t *itm_hdr, itm_place_t map_place, int standalone) { itm_tbl_hdr_t *tbl_hdr; itm_map_dense_enc_hdr_t *map_hdr; itm_num_t i; itm_num_t j; unsigned char *p; unsigned char *map_ptr; unsigned char *map_error; unsigned char *byte_seq_min; unsigned char *byte_seq_max; char *name; int error_flag; TRACE_MESSAGE('d', ("dump_map_dense_enc\n")); tbl_hdr = (itm_tbl_hdr_t *)ADDR(map_place); map_hdr = (itm_map_dense_enc_hdr_t *)(tbl_hdr + 1); map_ptr = ((unsigned char *)(map_hdr + 1) + map_hdr->source_len + map_hdr->source_len); if (0 < map_hdr->error_num) { map_error = (map_ptr + (tbl_hdr->number * map_hdr->result_len)); if (0 == map_hdr->default_error) { map_error += map_hdr->result_len; } } else if (1 == map_hdr->default_error) { map_error = (map_ptr + (tbl_hdr->number * map_hdr->result_len)); } else { map_error = NULL; } byte_seq_min = (unsigned char *)(map_hdr + 1); byte_seq_max = byte_seq_min + map_hdr->source_len; if ((standalone) && (0 == tbl_hdr->name.itm_ptr) && (map_place.itm_ptr != itm_hdr->direc_init_tbl.itm_ptr)) { return; } TRACE_MESSAGE('p', ("(&)map=%ld ", map_place.itm_ptr)); if (0 == tbl_hdr->name.itm_ptr) { name = NULL; } else { name = tbl_name(itm_hdr, tbl_hdr); } if ((0 == standalone) && (0 != tbl_hdr->name.itm_ptr)) { if (NULL != name) { printi(0, "%s;\n", name); } else { printi(0, RNPREF "unknown;\n", name); } return; } else { printi(1, RNPREF "map"); if (NULL != name) { printi(0, " %s", name); } printi(0, " {\n"); } printi(0, "// dense encoded map\n"); printi(0, "// entry_number=%ld\n", tbl_hdr->number); printi(0, "// source_len=%ld result_len=%ld\n", map_hdr->source_len, map_hdr->result_len); printi(0, "// byte_seq_min=0x"); p = byte_seq_min; for (i = 0; i < map_hdr->source_len; i++, p++) { printi(0, "%02x", *p); } printi(0, "\n"); printi(0, "// byte_seq_max=0x"); p = byte_seq_max; for (i = 0; i < map_hdr->source_len; i++, p++) { printi(0, "%02x", *p); } printi(0, "\n"); if (0 < map_hdr->error_num) { printi(0, "// error_num=%ld\n", map_hdr->error_num); } if (0 == map_hdr->default_error) { p = (map_ptr + (tbl_hdr->number * map_hdr->result_len)); printi(0, RNPREF "default 0x"); for (j = 0; j < map_hdr->result_len; j++) { printi(0, "%02x", *(p + j)); } printi(0, "\n"); } else if (-1 == map_hdr->default_error) { printi(0, RNPREF "default\t" RNPREF "default\n"); } error_flag = 0; for (i = 0, p = map_ptr; i < tbl_hdr->number; i++, p += map_hdr->result_len) { if ((NULL == map_error) || (0 == *(map_error + i))) { printi(0, "%s\t", dense_enc_index_to_byte_seq( i, map_hdr->source_len, byte_seq_min, byte_seq_max)); printi(0, "0x"); for (j = 0; j < map_hdr->result_len; j++) { printi(0, "%02x", *(p + j)); } printi(0, "\n"); error_flag = 0; } else if (0 >= map_hdr->default_error) { if (0 == error_flag) { printi(0, "%s\t", dense_enc_index_to_byte_seq( i, map_hdr->source_len, byte_seq_min, byte_seq_max)); printi(0, "error\n"); error_flag = 1; } else if (error_flag == 1) { printi(0, " :\t:\n"); error_flag = 2; } } } printi(-1, "};\n"); } /* * Evaluate condition table */ static void dump_cond_tbl(itm_hdr_t *itm_hdr, itm_place_t cond_place, int standalone) { itm_tbl_hdr_t *cond_hdr; itm_cond_t *cond; long i; char *name; TRACE_MESSAGE('p', ("(&)cond_tbl=%ld ", cond_place.itm_ptr)); cond_hdr = (itm_tbl_hdr_t *)(ADDR(cond_place)); cond = (itm_cond_t *)(cond_hdr + 1); if ((standalone) && (0 == cond_hdr->name.itm_ptr)) { TRACE_MESSAGE('t', ("skip condition(%d, %ld)\n", standalone, cond_hdr->name.itm_ptr)); return; } if (0 == cond_place.itm_ptr) { printi(0, RNPREF "true"); return; } if (0 == cond_hdr->name.itm_ptr) { name = NULL; } else { name = tbl_name(itm_hdr, cond_hdr); } if ((0 == standalone) && (0 != cond_hdr->name.itm_ptr)) { if (NULL != name) { printi(0, "%s", name); } else { printi(0, RNPREF "unknown"); } return; } else { printi(1, RNPREF "condition"); if (NULL != name) { printi(0, " %s", name); } printi(0, " {\n"); } for (i = 0; i < cond_hdr->number; i++, cond++) { switch (cond->type) { case ITM_COND_BETWEEN: dump_range(itm_hdr, cond->operand.place); break; case ITM_COND_EXPR: dump_expr(itm_hdr, cond->operand.place); printi(0, ";\n"); break; case ITM_COND_ESCAPESEQ: dump_escapeseq(itm_hdr, cond->operand.place); break; default: printi(0, "// unknown %d\n", cond->type); break; } } if (standalone) { printi(-1, "};\n"); } else { printi(-1, "}"); } } /* * Dump operation table */ static void dump_op_tbl(itm_hdr_t *itm_hdr, itm_place_t op_tbl_place, int standalone) { itm_tbl_hdr_t *op_hdr; itm_op_t *operation; itm_place2_t op_place; long i; char *name; static int op_tbl_level; op_hdr = (itm_tbl_hdr_t *)(ADDR(op_tbl_place)); operation = (itm_op_t *)(op_hdr + 1); TRACE_MESSAGE('p', ("(&)op_tbl=%ld ", op_tbl_place)); name = tbl_name(itm_hdr, op_hdr); if ((standalone) && (NULL == name)) return; if (0 == op_tbl_level) { if ((0 == standalone) && (0 != op_hdr->name.itm_ptr)) { if (NULL != name) { printi(0, "%s;\n", name); } else { printi(0, RNPREF "unknown;", name); } return; } else { printi(1, RNPREF "operation"); if (NULL != name) { printi(0, " %s", name); } printi(0, " {\n"); } } op_tbl_level += 1; op_place = op_tbl_place.itm_ptr + (sizeof (itm_tbl_hdr_t)); for (i = 0; i < op_hdr->number; i++, operation++, op_place += (sizeof (itm_op_t))) { dump_op(itm_hdr, op_place); } op_tbl_level -= 1; if (0 == op_tbl_level) { printi(-1, "};\n"); } } /* * Evaluate single operation */ static void dump_op(itm_hdr_t *itm_hdr, itm_place2_t op_place) { itm_op_t *operation; itm_tbl_hdr_t *op_hdr; operation = (itm_op_t *)ADDR2(op_place); TRACE_MESSAGE('p', ("(&)op=%ld ", op_place)); switch (operation->type) { case ITM_OP_EXPR: dump_expr(itm_hdr, operation->data.operand[0]); printi(0, ";\n"); break; case ITM_OP_ERROR: printi(0, RNPREF "error "); dump_expr(itm_hdr, operation->data.operand[0]); printi(0, ";\n"); break; case ITM_OP_ERROR_D: printi(0, RNPREF "error %d;", operation->data.operand[0].itm_ptr); printi(0, "\n"); break; case ITM_OP_DISCARD: printi(0, RNPREF "discard "); dump_expr(itm_hdr, operation->data.operand[0]); printi(0, ";\n"); break; case ITM_OP_DISCARD_D: printi(0, RNPREF "discard %ld;\n", operation->data.operand[0].itm_ptr); break; case ITM_OP_OUT: case ITM_OP_OUT_D: case ITM_OP_OUT_R: case ITM_OP_OUT_S: case ITM_OP_OUT_INVD: printi(0, RNPREF "out = "); dump_expr(itm_hdr, operation->data.operand[0]); printi(0, ";\n"); break; case ITM_OP_IF: printi(0, RNPREF "if "); dump_expr(itm_hdr, operation->data.operand[0]); printi(1, " {\n"); dump_op_tbl(itm_hdr, operation->data.operand[1], 0); printi(-1, "}\n"); break; case ITM_OP_IF_ELSE: printi(0, RNPREF "if "); dump_expr(itm_hdr, operation->data.operand[0]); printi(1, " {\n"); dump_op_tbl(itm_hdr, operation->data.operand[1], 0); printi(-1, "} "); op_hdr = ADDR(operation->data.operand[2]); if ((1 == op_hdr->number) && ((ITM_OP_IF_ELSE == ((itm_op_t *)(op_hdr + 1))->type) || (ITM_OP_IF == ((itm_op_t *)(op_hdr + 1))->type))) { printi(0, RNPREF "else "); dump_op_tbl(itm_hdr, operation->data.operand[2], 0); } else { printi(1, RNPREF "else {\n"); dump_op_tbl(itm_hdr, operation->data.operand[2], 0); printi(-1, "}\n"); } break; case ITM_OP_DIRECTION: /* switch direction */ printi(0, RNPREF "direction %1$s;\n", tbl_name(itm_hdr, (itm_tbl_hdr_t *)ADDR(operation->data.operand[0]))); break; case ITM_OP_MAP: /* use map */ printi(0, RNPREF "map %1$s", tbl_name(itm_hdr, (itm_tbl_hdr_t *)ADDR(operation->data.operand[0]))); if (0 != operation->data.operand[1].itm_ptr) { printi(0, " "); dump_expr(itm_hdr, operation->data.operand[1]); } printi(0, ";\n"); break; case ITM_OP_OPERATION: /* invoke operation */ printi(0, RNPREF "operation %1$s;\n", tbl_name(itm_hdr, (itm_tbl_hdr_t *)ADDR(operation->data.operand[0]))); break; case ITM_OP_INIT: /* invoke init operation */ printi(0, RNPREF "operation " RNPREF "init;\n"); break; case ITM_OP_RESET: /* invoke reset operation */ printi(0, RNPREF "operation " RNPREF "reset;\n"); break; case ITM_OP_BREAK: /* break */ printi(0, RNPREF "break;\n"); break; case ITM_OP_RETURN: /* return */ printi(0, RNPREF "return;\n"); break; case ITM_OP_PRINTCHR: printi(0, RNPREF "printchr "); dump_expr(itm_hdr, operation->data.operand[0]); printi(0, ";\n"); break; case ITM_OP_PRINTHD: printi(0, RNPREF "printhd "); dump_expr(itm_hdr, operation->data.operand[0]); printi(0, ";\n"); break; case ITM_OP_PRINTINT: printi(0, RNPREF "printint "); dump_expr(itm_hdr, operation->data.operand[0]); printi(0, ";\n"); break; default: printi(0, "// unknown operation: %lx\n", operation->type); break; } } /* * Dump expression */ static void dump_expr(itm_hdr_t *itm_hdr, itm_place_t expr_place) { itm_expr_t *expr; itm_data_t data; expr = (itm_expr_t *)ADDR(expr_place); TRACE_MESSAGE('p', ("(*)ex=%ld ", expr_place.itm_ptr)); switch (expr->type) { case ITM_EXPR_NONE: /* not used */ printi(0, "none"); break; case ITM_EXPR_NOP: /* not used */ printi(0, "NOP"); break; case ITM_EXPR_NAME: /* not used */ printi(0, "NAME"); break; case ITM_EXPR_INT: /* integer */ printi(0, "%ld", expr->data.itm_exnum); break; case ITM_EXPR_SEQ: /* byte sequence */ data = expr->data.value; if ((sizeof (itm_place_t)) < data.size) { data.place.itm_ptr = (itm_place2_t)ADDR(data.place); } printi(0, "0x%s", data_to_hexadecimal(&data)); break; case ITM_EXPR_REG: /* register */ printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); break; case ITM_EXPR_IN_VECTOR: /* in[expr] */ printi(0, RNPREF "in["); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, "]"); break; case ITM_EXPR_IN_VECTOR_D: /* in[num] */ printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); if (0 == expr->data.operand[0].itm_ptr) { printi(0, " // inputsize"); } break; case ITM_EXPR_OUT: /* out */ printi(0, RNPREF "out"); break; case ITM_EXPR_TRUE: /* true */ printi(0, RNPREF "true"); break; case ITM_EXPR_FALSE: /* false */ printi(0, RNPREF "false"); break; case ITM_EXPR_UMINUS: /* unary minus */ printi(0, "-"); dump_expr(itm_hdr, expr->data.operand[0]); break; case ITM_EXPR_PLUS: /* A + B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " + "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_PLUS_E_D: /* exprA + B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " + "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_PLUS_E_R: /* exprA + varB */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " + "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_PLUS_E_INVD: /* exprA + in[B] */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " + "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_PLUS_D_E: /* intA + exprB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " + "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_PLUS_D_D: /* intA + B */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " + "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_PLUS_D_R: /* intA + varB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " + "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_PLUS_D_INVD: /* intA + in[B] */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " + "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_PLUS_R_E: /* varA + exprB */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " + "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_PLUS_R_D: /* varA + B */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " + "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_PLUS_R_R: /* varA + varB */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " + "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_PLUS_R_INVD: /* varA + in[B] */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " + "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_PLUS_INVD_E: /* in[A] + exprB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " + "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_PLUS_INVD_D: /* in[A] + B */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " + "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_PLUS_INVD_R: /* in[A] + varB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " + "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_PLUS_INVD_INVD: /* in[A] + in[B] */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " + "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MINUS: /* A - B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " - "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_MINUS_E_D: /* exprA - B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " - "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MINUS_E_R: /* exprA - varB */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " - "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_MINUS_E_INVD: /* exprA - in[B] */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " - "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MINUS_D_E: /* intA - exprB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " - "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_MINUS_D_D: /* intA - B */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " - "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MINUS_D_R: /* intA - varB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " - "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_MINUS_D_INVD: /* intA - in[B] */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " - "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MINUS_R_E: /* varA - exprB */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " - "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_MINUS_R_D: /* varA - B */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " - "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MINUS_R_R: /* varA - varB */ printi(0, "("); printi(0, " - "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, ")"); break; case ITM_EXPR_MINUS_R_INVD: /* varA - in[B] */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " - "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MINUS_INVD_E: /* in[A] - exprB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " - "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_MINUS_INVD_D: /* in[A] - B */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " - "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MINUS_INVD_R: /* in[A] - varB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " - "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_MINUS_INVD_INVD: /* in[A] - in[B] */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " - "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MUL: /* A * B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " * "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_MUL_E_D: /* exprA * B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " * "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MUL_E_R: /* exprA * varB */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " * "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_MUL_E_INVD: /* exprA * in[B] */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " * "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MUL_D_E: /* intA * exprB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " * "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_MUL_D_D: /* intA * B */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " * "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MUL_D_R: /* intA * varB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " * "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_MUL_D_INVD: /* intA * in[B] */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " * "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MUL_R_E: /* varA * exprB */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " * "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_MUL_R_D: /* varA * B */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " * "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MUL_R_R: /* varA * varB */ printi(0, "("); printi(0, " * "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, ")"); break; case ITM_EXPR_MUL_R_INVD: /* varA * in[B] */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " * "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MUL_INVD_E: /* in[A] * exprB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " * "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_MUL_INVD_D: /* in[A] * B */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " * "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MUL_INVD_R: /* in[A] * varB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " * "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_MUL_INVD_INVD: /* in[A] * in[B] */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " * "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_DIV: /* A / B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " / "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_DIV_E_D: /* exprA / B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " / "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_DIV_E_R: /* exprA / varB */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " / "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_DIV_E_INVD: /* exprA / in[B] */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " / "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_DIV_D_E: /* intA / exprB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " / "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_DIV_D_D: /* intA / B */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " / "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_DIV_D_R: /* intA / varB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " / "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_DIV_D_INVD: /* intA / in[B] */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " / "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_DIV_R_E: /* varA / exprB */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " / "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_DIV_R_D: /* varA / B */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " / "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_DIV_R_R: /* varA / varB */ printi(0, "("); printi(0, " / "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, ")"); break; case ITM_EXPR_DIV_R_INVD: /* varA / in[B] */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " / "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_DIV_INVD_E: /* in[A] / exprB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " / "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_DIV_INVD_D: /* in[A] / B */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " / "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_DIV_INVD_R: /* in[A] / varB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " / "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_DIV_INVD_INVD: /* in[A] / in[B] */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " / "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MOD: /* A % B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " %% "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_MOD_E_D: /* exprA % B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " %% "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MOD_E_R: /* exprA % varB */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " %% "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_MOD_E_INVD: /* exprA % in[B] */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " %% "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MOD_D_E: /* intA % exprB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " %% "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_MOD_D_D: /* intA % B */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " %% "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MOD_D_R: /* intA % varB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " %% "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_MOD_D_INVD: /* intA % in[B] */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " %% "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MOD_R_E: /* varA % exprB */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " %% "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_MOD_R_D: /* varA % B */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " %% "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MOD_R_R: /* varA % varB */ printi(0, "("); printi(0, " %% "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, ")"); break; case ITM_EXPR_MOD_R_INVD: /* varA % in[B] */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " %% "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MOD_INVD_E: /* in[A] % exprB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " %% "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_MOD_INVD_D: /* in[A] % B */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " %% "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_MOD_INVD_R: /* in[A] % varB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " %% "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_MOD_INVD_INVD: /* in[A] % in[B] */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " %% "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_SHIFT_L: /* A << B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " << "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_SHIFT_L_E_D: /* exprA << B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " << "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_SHIFT_L_E_R: /* exprA << varB */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " << "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_SHIFT_L_E_INVD: /* exprA << in[B] */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " << "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_SHIFT_L_D_E: /* intA << exprB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " << "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_SHIFT_L_D_D: /* intA << B */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " << "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_SHIFT_L_D_R: /* intA << varB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " << "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_SHIFT_L_D_INVD: /* intA << in[B] */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " << "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_SHIFT_L_R_E: /* varA << exprB */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " << "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_SHIFT_L_R_D: /* varA << B */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " << "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_SHIFT_L_R_R: /* varA << varB */ printi(0, "("); printi(0, " << "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, ")"); break; case ITM_EXPR_SHIFT_L_R_INVD: /* varA << in[B] */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " << "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_SHIFT_L_INVD_E: /* in[A] << exprB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " << "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_SHIFT_L_INVD_D: /* in[A] << B */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " << "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_SHIFT_L_INVD_R: /* in[A] << varB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " << "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_SHIFT_L_INVD_INVD: /* in[A] << in[B] */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " << "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_SHIFT_R: /* A >> B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " >> "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_SHIFT_R_E_D: /* exprA >> B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " >> "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_SHIFT_R_E_R: /* exprA >> varB */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " >> "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_SHIFT_R_E_INVD: /* exprA >> in[B] */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " >> "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_SHIFT_R_D_E: /* intA >> exprB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " >> "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_SHIFT_R_D_D: /* intA >> B */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " >> "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_SHIFT_R_D_R: /* intA >> varB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " >> "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_SHIFT_R_D_INVD: /* intA >> in[B] */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " >> "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_SHIFT_R_R_E: /* varA >> exprB */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " >> "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_SHIFT_R_R_D: /* varA >> B */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " >> "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_SHIFT_R_R_R: /* varA >> varB */ printi(0, "("); printi(0, " >> "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, ")"); break; case ITM_EXPR_SHIFT_R_R_INVD: /* varA >> in[B] */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " >> "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_SHIFT_R_INVD_E: /* in[A] >> exprB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " >> "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_SHIFT_R_INVD_D: /* in[A] >> B */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " >> "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_SHIFT_R_INVD_R: /* in[A] >> varB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " >> "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_SHIFT_R_INVD_INVD: /* in[A] >> in[B] */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " >> "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_OR: /* A | B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " | "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_OR_E_D: /* exprA | B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " | "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_OR_E_R: /* exprA | varB */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " | "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_OR_E_INVD: /* exprA | in[B] */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " | "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_OR_D_E: /* intA | exprB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " | "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_OR_D_D: /* intA | B */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " | "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_OR_D_R: /* intA | varB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " | "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_OR_D_INVD: /* intA | in[B] */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " | "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_OR_R_E: /* varA | exprB */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " | "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_OR_R_D: /* varA | B */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " | "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_OR_R_R: /* varA | varB */ printi(0, "("); printi(0, " | "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, ")"); break; case ITM_EXPR_OR_R_INVD: /* varA | in[B] */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " | "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_OR_INVD_E: /* in[A] | exprB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " | "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_OR_INVD_D: /* in[A] | B */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " | "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_OR_INVD_R: /* in[A] | varB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " | "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_OR_INVD_INVD: /* in[A] | in[B] */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " | "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_XOR: /* A ^ B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " ^ "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_XOR_E_D: /* exprA ^ B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " ^ "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_XOR_E_R: /* exprA ^ varB */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " ^ "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_XOR_E_INVD: /* exprA ^ in[B] */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " ^ "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_XOR_D_E: /* intA ^ exprB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " ^ "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_XOR_D_D: /* intA ^ B */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " ^ "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_XOR_D_R: /* intA ^ varB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " ^ "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_XOR_D_INVD: /* intA ^ in[B] */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " ^ "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_XOR_R_E: /* varA ^ exprB */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " ^ "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_XOR_R_D: /* varA ^ B */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " ^ "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_XOR_R_R: /* varA ^ varB */ printi(0, "("); printi(0, " ^ "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, ")"); break; case ITM_EXPR_XOR_R_INVD: /* varA ^ in[B] */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " ^ "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_XOR_INVD_E: /* in[A] ^ exprB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " ^ "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_XOR_INVD_D: /* in[A] ^ B */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " ^ "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_XOR_INVD_R: /* in[A] ^ varB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " ^ "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_XOR_INVD_INVD: /* in[A] ^ in[B] */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " ^ "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_AND: /* A & B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " & "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_AND_E_D: /* exprA & B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " & "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_AND_E_R: /* exprA & varB */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " & "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_AND_E_INVD: /* exprA & in[B] */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " & "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_AND_D_E: /* intA & exprB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " & "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_AND_D_D: /* intA & B */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " & "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_AND_D_R: /* intA & varB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " & "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_AND_D_INVD: /* intA & in[B] */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " & "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_AND_R_E: /* varA & exprB */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " & "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_AND_R_D: /* varA & B */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " & "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_AND_R_R: /* varA & varB */ printi(0, "("); printi(0, " & "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, ")"); break; case ITM_EXPR_AND_R_INVD: /* varA & in[B] */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " & "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_AND_INVD_E: /* in[A] & exprB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " & "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_AND_INVD_D: /* in[A] & B */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " & "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_AND_INVD_R: /* in[A] & varB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " & "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_AND_INVD_INVD: /* in[A] & in[B] */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " & "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_EQ: /* A == B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " == "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_EQ_E_D: /* exprA == B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " == "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_EQ_E_R: /* exprA == varB */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " == "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_EQ_E_INVD: /* exprA == in[B] */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " == "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_EQ_D_E: /* intA == exprB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " == "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_EQ_D_D: /* intA == B */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " == "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_EQ_D_R: /* intA == varB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " == "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_EQ_D_INVD: /* intA == in[B] */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " == "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_EQ_R_E: /* varA == exprB */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " == "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_EQ_R_D: /* varA == B */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " == "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_EQ_R_R: /* varA == varB */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " == "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_EQ_R_INVD: /* varA == in[B] */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " == "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_EQ_INVD_E: /* in[A] == exprB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " == "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_EQ_INVD_D: /* in[A] == B */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " == "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_EQ_INVD_R: /* in[A] == varB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " == "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_EQ_INVD_INVD: /* in[A] == in[B] */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " == "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_NE: /* A != B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " != "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_NE_E_D: /* exprA != B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " != "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_NE_E_R: /* exprA != varB */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " != "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_NE_E_INVD: /* exprA != in[B] */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " != "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_NE_D_E: /* intA != exprB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " != "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_NE_D_D: /* intA != B */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " != "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_NE_D_R: /* intA != varB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " != "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_NE_D_INVD: /* intA != in[B] */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " != "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_NE_R_E: /* varA != exprB */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " != "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_NE_R_D: /* varA != B */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " != "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_NE_R_R: /* varA != varB */ printi(0, "("); printi(0, " != "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, ")"); break; case ITM_EXPR_NE_R_INVD: /* varA != in[B] */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " != "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_NE_INVD_E: /* in[A] != exprB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " != "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_NE_INVD_D: /* in[A] != B */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " != "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_NE_INVD_R: /* in[A] != varB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " != "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_NE_INVD_INVD: /* in[A] != in[B] */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " != "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_GT: /* A > B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " > "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_GT_E_D: /* exprA > B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " > "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_GT_E_R: /* exprA > varB */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " > "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_GT_E_INVD: /* exprA > in[B] */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " > "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_GT_D_E: /* intA > exprB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " > "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_GT_D_D: /* intA > B */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " > "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_GT_D_R: /* intA > varB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " > "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_GT_D_INVD: /* intA > in[B] */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " > "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_GT_R_E: /* varA > exprB */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " > "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_GT_R_D: /* varA > B */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " > "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_GT_R_R: /* varA > varB */ printi(0, "("); printi(0, " > "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, ")"); break; case ITM_EXPR_GT_R_INVD: /* varA > in[B] */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " > "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_GT_INVD_E: /* in[A] > exprB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " > "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_GT_INVD_D: /* in[A] > B */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " > "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_GT_INVD_R: /* in[A] > varB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " > "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_GT_INVD_INVD: /* in[A] > in[B] */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " > "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_GE: /* A >= B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " >= "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_GE_E_D: /* exprA >= B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " >= "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_GE_E_R: /* exprA >= varB */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " >= "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_GE_E_INVD: /* exprA >= in[B] */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " >= "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_GE_D_E: /* intA >= exprB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " >= "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_GE_D_D: /* intA >= B */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " >= "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_GE_D_R: /* intA >= varB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " >= "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_GE_D_INVD: /* intA >= in[B] */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " >= "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_GE_R_E: /* varA >= exprB */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " >= "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_GE_R_D: /* varA >= B */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " >= "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_GE_R_R: /* varA >= varB */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " >= "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_GE_R_INVD: /* varA >= in[B] */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " >= "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_GE_INVD_E: /* in[A] >= exprB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " >= "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_GE_INVD_D: /* in[A] >= B */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " >= "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_GE_INVD_R: /* in[A] >= varB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " >= "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_GE_INVD_INVD: /* in[A] >= in[B] */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " >= "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_LT: /* A < B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " < "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_LT_E_D: /* exprA < B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " < "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_LT_E_R: /* exprA < varB */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " < "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_LT_E_INVD: /* exprA < in[B] */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " < "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_LT_D_E: /* intA < exprB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " < "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_LT_D_D: /* intA < B */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " < "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_LT_D_R: /* intA < varB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " < "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_LT_D_INVD: /* intA < in[B] */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " < "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_LT_R_E: /* varA < exprB */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " < "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_LT_R_D: /* varA < B */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " < "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_LT_R_R: /* varA < varB */ printi(0, "("); printi(0, " < "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, ")"); break; case ITM_EXPR_LT_R_INVD: /* varA < in[B] */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " < "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_LT_INVD_E: /* in[A] < exprB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " < "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_LT_INVD_D: /* in[A] < B */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " < "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_LT_INVD_R: /* in[A] < varB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " < "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_LT_INVD_INVD: /* in[A] < in[B] */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " < "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_LE: /* A <= B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " <= "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_LE_E_D: /* exprA <= B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " <= "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_LE_E_R: /* exprA <= varB */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " <= "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_LE_E_INVD: /* exprA <= in[B] */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " <= "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_LE_D_E: /* intA <= exprB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " <= "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_LE_D_D: /* intA <= B */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " <= "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_LE_D_R: /* intA <= varB */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " <= "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_LE_D_INVD: /* intA <= in[B] */ printi(0, "("); printi(0, "%ld", expr->data.operand[0].itm_ptr); printi(0, " <= "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_LE_R_E: /* varA <= exprB */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " <= "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_LE_R_D: /* varA <= B */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " <= "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_LE_R_R: /* varA <= varB */ printi(0, "("); printi(0, " <= "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, ")"); break; case ITM_EXPR_LE_R_INVD: /* varA <= in[B] */ printi(0, "("); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); printi(0, " <= "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_LE_INVD_E: /* in[A] <= exprB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " <= "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_LE_INVD_D: /* in[A] <= B */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " <= "); printi(0, "%ld", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_LE_INVD_R: /* in[A] <= varB */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " <= "); printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); printi(0, ")"); break; case ITM_EXPR_LE_INVD_INVD: /* in[A] <= in[B] */ printi(0, "("); printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); printi(0, " <= "); printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); printi(0, ")"); break; case ITM_EXPR_NOT: /* !A */ printi(0, "("); printi(0, "!"); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, ")"); break; case ITM_EXPR_NEG: /* ~A */ printi(0, "("); printi(0, " ~"); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, ")"); break; case ITM_EXPR_LOR: /* A || B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " || "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_LAND: /* A && B */ printi(0, "("); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, " && "); dump_expr(itm_hdr, expr->data.operand[1]); printi(0, ")"); break; case ITM_EXPR_ASSIGN: /* A = B */ printi(0, "%s = ", reg_name(itm_hdr, expr->data.operand[0])); dump_expr(itm_hdr, expr->data.operand[1]); break; case ITM_EXPR_IN_EQ: /* in == A */ printi(0, "(" RNPREF "in == ", 0); dump_expr(itm_hdr, expr->data.operand[0]); printi(0, ")"); break; default: break; } } /* * Dump range (between) */ static void dump_range(itm_hdr_t *itm_hdr, itm_place_t range_place) { itm_tbl_hdr_t *rth; itm_range_hdr_t *rtsh; unsigned char *p; long i; long j; rth = (itm_tbl_hdr_t *)(ADDR(range_place)); rtsh = (itm_range_hdr_t *)(rth + 1); p = (unsigned char *)(rtsh + 1); TRACE_MESSAGE('p', ("(&)between=%ld ", range_place.itm_ptr)); printi(0, RNPREF "between "); for (i = 0; i < rth->number; i++) { if (0 != i) printi(0, "\t "); printi(0, "0x"); for (j = 0; j < rtsh->len; j++) { printi(0, "%02x", *(p++)); } printi(0, " - "); printi(0, "0x"); for (j = 0; j < rtsh->len; j++) { printi(0, "%02x", *(p++)); } if (i < (rth->number - 1)) { printi(0, ",\n"); } else { printi(0, ";\n"); } } } /* * Dump escape sequence */ static void dump_escapeseq(itm_hdr_t *itm_hdr, itm_place_t escapeseq_place) { itm_tbl_hdr_t *eth; itm_escapeseq_hdr_t *eh; itm_data_t *d; itm_data_t data; long i; eth = (itm_tbl_hdr_t *)(ADDR(escapeseq_place)); eh = (itm_escapeseq_hdr_t *)(eth + 1); d = (itm_data_t *)(eh + 1); TRACE_MESSAGE('p', ("(&)escseq=%ld ", escapeseq_place.itm_ptr)); printi(1, RNPREF "escapceseq {"); for (i = 0; i < eth->number; i++, d++) { if (0 != i) printi(0, " "); data = *d; if ((sizeof (itm_place_t)) < data.size) { data.place.itm_ptr = (itm_place2_t)ADDR(d->place); } printi(0, "0x%s;", data_to_hexadecimal(&data)); } printi(-1, "}\n"); } static void printi(int c, char *format, ...) { static int indent_level; static int new_line = 1; int i; va_list ap; va_start(ap, format); if (c < 0) { indent_level += c; if (indent_level < 0) { indent_level = 0; } } if (new_line) { for (i = indent_level; 0 < i; i -= 1) { (void) putchar('\t'); } } if (0 < c) { indent_level += c; if (indent_level < 0) { indent_level = 0; } } if (NULL == strchr(format, '\n')) { new_line = 0; } else { new_line = 1; } (void) vfprintf(stdout, format, ap); va_end(ap); } static char * name_place_to_str(itm_hdr_t *itm_hdr, itm_place2_t place) { itm_data_t d; if (0 != place) { d = *((itm_data_t *)ADDR2(place)); if ((sizeof (itm_place_t)) < d.size) { d.place.itm_ptr = (itm_place2_t)ADDR(d.place); } } else { d.size = 0; d.place.itm_ptr = 0; } return (name_to_str(&d)); } static char * tbl_name(itm_hdr_t *itm_hdr, itm_tbl_hdr_t *tbl_hdr) { if (ITM_TBL_OP_INIT == tbl_hdr->type) { return (RNPREF "init"); } else if (ITM_TBL_OP_RESET == tbl_hdr->type) { return (RNPREF "reset"); } else if (tbl_hdr->name.itm_ptr) { return (name_place_to_str(itm_hdr, tbl_hdr->name.itm_ptr)); } else { return (NULL); } } static char * reg_name(itm_hdr_t *itm_hdr, itm_place_t op) { itm_info_hdr_t *info_hdr; static char sbuf[32]; itm_num_t reg_num; reg_num = (itm_num_t)(op.itm_ptr); if (0 == itm_hdr->info_hdr.itm_ptr) { (void) sprintf(sbuf, "reg%ld\n", reg_num); return (sbuf); } else { info_hdr = INFO_HDR(itm_hdr); return (name_place_to_str( itm_hdr, info_hdr->reg_plc_tbl.place.itm_ptr + (reg_num *sizeof (itm_data_t)))); } } static itm_hdr_t * itm_attach(const char *itm_file) { itm_hdr_t *itm_hdr; struct stat st; int fd; fd = open(itm_file, O_RDONLY, 0); if (fd == -1) { PERROR(gettext("open()")); return (NULL); } if (fstat(fd, &st) == -1) { PERROR(gettext("fstat()")); return (NULL); } itm_hdr = (void *) mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0); if (MAP_FAILED == itm_hdr) { PERROR(gettext("mmap()")); return (NULL); } (void) close(fd); if ((itm_hdr->ident[0] != ITM_IDENT_0) || (itm_hdr->ident[1] != ITM_IDENT_1) || (itm_hdr->ident[2] != ITM_IDENT_2) || (itm_hdr->ident[3] != ITM_IDENT_3)) { itm_error(gettext("magic number error\n")); return (NULL); } if ((itm_hdr->version[0] != ITM_VER_0) || (itm_hdr->version[1] != ITM_VER_1) || (itm_hdr->version[2] != ITM_VER_2) || #if defined(_LITTLE_ENDIAN) #if defined(_LP64) ((itm_hdr->spec[3] != ITM_SPEC_3_32_LITTLE_ENDIAN) && (itm_hdr->spec[3] != ITM_SPEC_3_64_LITTLE_ENDIAN))) { #else (itm_hdr->spec[3] != ITM_SPEC_3_32_LITTLE_ENDIAN)) { #endif #else #if defined(_LP64) ((itm_hdr->spec[3] != ITM_SPEC_3_32_BIG_ENDIAN) && (itm_hdr->spec[3] != ITM_SPEC_3_64_BIG_ENDIAN))) { #else (itm_hdr->spec[3] != ITM_SPEC_3_32_BIG_ENDIAN)) { #endif #endif itm_error(gettext("version number error\n")); return (NULL); } if (itm_hdr->itm_size.itm_ptr != st.st_size) { itm_error(gettext( "size error: expected=%1$d current=%2$d\n"), (size_t)(itm_hdr->itm_size.itm_ptr), st.st_size); return (NULL); } return (itm_hdr); }