1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright (c) 1999 by Sun Microsystems, Inc. 24 * All rights reserved. 25 */ 26 27 #pragma ident "%Z%%M% %I% %E% SMI" 28 29 30 #include <stdio.h> 31 #include <stdlib.h> 32 #include <stddef.h> 33 #include <fcntl.h> 34 #include <unistd.h> 35 #include <libintl.h> 36 #include <sys/types.h> 37 #include <sys/stat.h> 38 #include <sys/mman.h> 39 #include <errno.h> 40 #include <stdarg.h> 41 #include <string.h> 42 43 #include "iconv_tm.h" 44 #include "itm_util.h" 45 46 /* 47 * function prototype 48 */ 49 50 static itm_hdr_t *itm_attach(const char *); 51 static void dump_tables(itm_hdr_t *, itm_info_hdr_t *); 52 static void dump_direc_tbl(itm_hdr_t *, itm_place_t); 53 static void dump_map(itm_hdr_t *, itm_place_t, int); 54 static void dump_map_i_f(itm_hdr_t *, itm_place_t, int); 55 static void dump_map_l_f(itm_hdr_t *, itm_place_t, int); 56 static void dump_map_hash(itm_hdr_t *, itm_place_t, int); 57 static void dump_map_dense_enc(itm_hdr_t *, itm_place_t, int); 58 static void dump_cond_tbl(itm_hdr_t *, itm_place_t, int); 59 static void dump_op_tbl(itm_hdr_t *, itm_place_t, int); 60 static void dump_op(itm_hdr_t *, itm_place2_t); 61 static void dump_expr(itm_hdr_t *, itm_place_t); 62 static void dump_range(itm_hdr_t *, itm_place_t); 63 static void dump_escapeseq(itm_hdr_t *, itm_place_t); 64 65 static char *tbl_name(itm_hdr_t *, itm_tbl_hdr_t *); 66 static char *reg_name(itm_hdr_t *itm_hdr, itm_place_t op); 67 68 static void printi(int, char *, ...); 69 70 71 /* 72 * macro definition 73 */ 74 75 #define ADDR(place) ((void *)(((char *)(itm_hdr)) + \ 76 ((itm_place2_t)((place).itm_ptr)))) 77 #define DADDR(n) (((n)->size <= (sizeof ((n)->place))) ? \ 78 ((char *)(&((n)->place))) :\ 79 ((char *)(ADDR((n)->place)))) 80 #define ADDR2(place2) ((void *)(((char *)(itm_hdr)) + \ 81 ((itm_place2_t)(place2)))) 82 #define INFO_HDR(pa) ((void *)(((char *)pa) + \ 83 ((itm_hdr_t *)(pa))->info_hdr.itm_ptr)) 84 85 86 #if defined(RESERVED_NAME_PREFIX) 87 #define RNPREF RESERVED_NAME_PREFIX 88 #else /* !defined(RESERVED_NAME_PREFIX) */ 89 #define RNPREF /* null strings */ 90 #endif /* !defined(RESERVED_NAME_PREFIX) */ 91 92 93 void 94 disassemble(char *file) 95 { 96 itm_hdr_t *itm_hdr; 97 itm_info_hdr_t *info_hdr; 98 itm_data_t type_id; 99 100 TRACE_MESSAGE('d', ("disassemble %s\n", file)); 101 102 itm_hdr = itm_attach(file); 103 104 if (NULL == itm_hdr) { 105 exit(3); 106 } 107 108 if (0 == itm_hdr->info_hdr.itm_ptr) { 109 itm_error(gettext("binarytable is stripped\n")); 110 exit(4); 111 } 112 113 if (0 == itm_hdr->info_hdr.itm_ptr) { 114 info_hdr = malloc_vital(sizeof (itm_info_hdr_t)); 115 (void) memset(info_hdr, 0, sizeof (itm_info_hdr_t)); 116 } else { 117 info_hdr = INFO_HDR(itm_hdr); 118 } 119 120 #if defined(ENABLE_TRACE) 121 dump_itm_header(itm_hdr, info_hdr); 122 #endif 123 printi(0, "//\n", file); 124 printi(0, "// %s\n", file); 125 printi(0, "//\n", file); 126 127 type_id = itm_hdr->type_id; 128 if ((NULL != cmd_opt.disassemble) && 129 ((sizeof (itm_place_t)) < type_id.size)) { 130 type_id.place.itm_ptr += (itm_place2_t)itm_hdr; 131 } 132 printi(1, "%s {\n", name_to_str(&type_id)); 133 dump_tables(itm_hdr, info_hdr); 134 printi(-1, "}\n"); 135 } 136 137 #if defined(ENABLE_TRACE) 138 void 139 dump_itm_header(itm_hdr_t *itm_header, itm_info_hdr_t *info_header) 140 { 141 char *str_type_id; 142 char *str_interpreter; 143 144 itm_data_t type_id; 145 itm_data_t interpreter; 146 147 type_id = itm_header->type_id; 148 str_type_id = malloc_vital(itm_header->type_id.size + 1); 149 if ((NULL != cmd_opt.disassemble) && 150 ((sizeof (itm_place_t)) < type_id.size)) { 151 type_id.place.itm_ptr += (itm_place2_t)itm_header; 152 } 153 (void) memcpy(str_type_id, name_to_str(&type_id), type_id.size + 1); 154 155 interpreter = itm_header->interpreter; 156 str_interpreter = malloc_vital(itm_header->interpreter.size + 1); 157 if ((NULL != cmd_opt.disassemble) && 158 ((sizeof (itm_place_t)) < interpreter.size)) { 159 interpreter.place.itm_ptr += (itm_place2_t)itm_header; 160 } 161 (void) memcpy(str_interpreter, name_to_str(&interpreter), 162 interpreter.size + 1); 163 164 TRACE_MESSAGE('D', 165 ("\n" 166 "------\n" 167 "Sizeof Data Structures \n" 168 " sizeof(int) = %ld\n" 169 " sizeof(long) = %ld\n" 170 " sizeof(uintptr_t) = %ld\n" 171 " sizeof(struct itm_place_t) = %ld\n" 172 " sizeof(struct itm_data_t) = %ld\n" 173 " sizeof(struct itm_hdr_t) = %ld\n" 174 " sizeof(struct itm_place_tbl_info_t) = %ld\n" 175 " sizeof(struct itm_section_info_t) = %ld\n" 176 " sizeof(struct itm_action_type_t) = %ld\n" 177 " sizeof(struct itm_direct_t) = %ld\n" 178 " sizeof(struct itm_cond_t) = %ld\n" 179 " sizeof(struct itm_range_hdr_t) = %ld\n" 180 " sizeof(struct itm_escapeseq_hdr_t) = %ld\n" 181 " sizeof(struct itm_map_idx_fix_hdr_t) = %ld\n" 182 " sizeof(struct itm_map_lookup_hdr_t) = %ld\n" 183 " sizeof(struct itm_map_hash_hdr_t) = %ld\n" 184 " sizeof(struct itm_map_dense_enc_hdr_t) = %ld\n" 185 " sizeof(struct itm_expr_t) = %ld\n" 186 " sizeof(enum itm_op_type_t) = %ld\n" 187 " sizeof(struct itm_op_t) u= %ld\n" 188 " sizeof(enum itm_expr_type_t)= %ld\n" 189 "\n", 190 191 sizeof (int), 192 sizeof (long), 193 sizeof (uintptr_t), 194 sizeof (itm_place_t), 195 sizeof (itm_data_t), 196 sizeof (itm_hdr_t), 197 sizeof (itm_place_tbl_info_t), 198 sizeof (itm_section_info_t), 199 sizeof (itm_action_type_t), 200 sizeof (itm_direc_t), 201 sizeof (itm_cond_t), 202 sizeof (itm_range_hdr_t), 203 sizeof (itm_escapeseq_hdr_t), 204 sizeof (itm_map_idx_fix_hdr_t), 205 sizeof (itm_map_lookup_hdr_t), 206 sizeof (itm_map_hash_hdr_t), 207 sizeof (itm_map_dense_enc_hdr_t), 208 sizeof (itm_expr_t), 209 sizeof (itm_op_type_t), 210 sizeof (itm_op_t), 211 sizeof (itm_expr_type_t))); 212 213 TRACE_MESSAGE('H', 214 ("ident = %c%c%c\n" 215 "spec = %02x%02x%02x%02x\n" 216 "version = %02x%02x%02x%02x\n" 217 "itm_size = %ld\n" 218 "type_id = %s\n" 219 "interpreter = %s\n" 220 "op_init_tbl = %ld\n" 221 "op_reset_tbl = %ld\n" 222 "direc_init_tbl = %ld\n" 223 "reg_num = %ld\n" 224 "itm_hdr_size = %ld\n" 225 "info_hdr = %ld\n" 226 "info_hdr_size = %ld\n", 227 228 itm_header->ident[0], 229 itm_header->ident[1], 230 itm_header->ident[2], 231 /* itm_header->ident[3], */ 232 itm_header->spec[0], 233 itm_header->spec[1], 234 itm_header->spec[2], 235 itm_header->spec[3], 236 itm_header->version[0], 237 itm_header->version[1], 238 itm_header->version[2], 239 itm_header->version[3], 240 itm_header->itm_size.itm_ptr, 241 str_type_id, 242 str_interpreter, 243 itm_header->op_init_tbl.itm_ptr, 244 itm_header->op_reset_tbl.itm_ptr, 245 itm_header->direc_init_tbl.itm_ptr, 246 itm_header->reg_num, 247 itm_header->itm_hdr_size, 248 itm_header->info_hdr.itm_ptr, 249 (sizeof (itm_info_hdr_t)))); 250 251 TRACE_MESSAGE('H', 252 (" str_sec = (%4ld %4ld %4ld) " 253 " str_plc_tbl = (%4ld %4ld %4ld)\n" 254 "direc_sec_tbl = (%4ld %4ld %4ld) " 255 "direc_plc_tbl = (%4ld %4ld %4ld)\n" 256 " cond_sec_tbl = (%4ld %4ld %4ld) " 257 " cond_plc_tbl = (%4ld %4ld %4ld)\n" 258 " map_sec_tbl = (%4ld %4ld %4ld) " 259 " map_plc_tbl = (%4ld %4ld %4ld)\n" 260 " op_sec_tbl = (%4ld %4ld %4ld) " 261 " op_plc_tbl = (%4ld %4ld %4ld)\n" 262 "range_sec_tbl = (%4ld %4ld %4ld) " 263 "range_plc_tbl = (%4ld %4ld %4ld)\n" 264 "escsq_sec_tbl = (%4ld %4ld %4ld) " 265 "escsq_plc_tbl = (%4ld %4ld %4ld)\n" 266 " data_sec = (%4ld %4ld %4ld) " 267 " data_plc_tbl = (%4ld %4ld %4ld)\n" 268 " name_sec = (%4ld %4ld %4ld) " 269 " name_plc_tbl = (%4ld %4ld %4ld)\n" 270 " " 271 " reg_plc_tbl = (%4ld %4ld %4ld)\n" 272 "%s\n", 273 info_header->str_sec.place.itm_ptr, 274 info_header->str_sec.size, 275 info_header->str_sec.number, 276 info_header->str_plc_tbl.place.itm_ptr, 277 info_header->str_plc_tbl.size, 278 info_header->str_plc_tbl.number, 279 info_header->direc_tbl_sec.place.itm_ptr, 280 info_header->direc_tbl_sec.size, 281 info_header->direc_tbl_sec.number, 282 info_header->direc_plc_tbl.place.itm_ptr, 283 info_header->direc_plc_tbl.size, 284 info_header->direc_plc_tbl.number, 285 info_header->cond_tbl_sec.place.itm_ptr, 286 info_header->cond_tbl_sec.size, 287 info_header->cond_tbl_sec.number, 288 info_header->cond_plc_tbl.place.itm_ptr, 289 info_header->cond_plc_tbl.size, 290 info_header->cond_plc_tbl.number, 291 info_header->map_tbl_sec.place.itm_ptr, 292 info_header->map_tbl_sec.size, 293 info_header->map_tbl_sec.number, 294 info_header->map_plc_tbl.place.itm_ptr, 295 info_header->map_plc_tbl.size, 296 info_header->map_plc_tbl.number, 297 info_header->op_tbl_sec.place.itm_ptr, 298 info_header->op_tbl_sec.size, 299 info_header->op_tbl_sec.number, 300 info_header->op_plc_tbl.place.itm_ptr, 301 info_header->op_plc_tbl.size, 302 info_header->op_plc_tbl.number, 303 info_header->range_tbl_sec.place.itm_ptr, 304 info_header->range_tbl_sec.size, 305 info_header->range_tbl_sec.number, 306 info_header->range_plc_tbl.place.itm_ptr, 307 info_header->range_plc_tbl.size, 308 info_header->range_plc_tbl.number, 309 info_header->escapeseq_tbl_sec.place.itm_ptr, 310 info_header->escapeseq_tbl_sec.size, 311 info_header->escapeseq_tbl_sec.number, 312 info_header->escapeseq_plc_tbl.place.itm_ptr, 313 info_header->escapeseq_plc_tbl.size, 314 info_header->escapeseq_plc_tbl.number, 315 info_header->data_sec.place.itm_ptr, 316 info_header->data_sec.size, 317 info_header->data_sec.number, 318 info_header->data_plc_tbl.place.itm_ptr, 319 info_header->data_plc_tbl.size, 320 info_header->data_plc_tbl.number, 321 info_header->name_sec.place.itm_ptr, 322 info_header->name_sec.size, 323 info_header->name_sec.number, 324 info_header->name_plc_tbl.place.itm_ptr, 325 info_header->name_plc_tbl.size, 326 info_header->name_plc_tbl.number, 327 info_header->reg_plc_tbl.place.itm_ptr, 328 info_header->reg_plc_tbl.size, 329 info_header->reg_plc_tbl.number, 330 "--------")); 331 } 332 #endif 333 334 /* 335 * Dump tables 336 */ 337 static void 338 dump_tables(itm_hdr_t *itm_hdr, itm_info_hdr_t *info_hdr) 339 { 340 itm_num_t n; 341 itm_data_t *data; 342 itm_place_t *place; 343 itm_place2_t place2; 344 itm_data_t d; 345 346 data = (itm_data_t *)(ADDR(info_hdr->reg_plc_tbl.place)); 347 for (n = 0; n < info_hdr->reg_plc_tbl.number; n++, data += 1) { 348 d = *(data); 349 if ((sizeof (itm_place_t)) < d.size) { 350 d.place.itm_ptr = (itm_place2_t)ADDR(d.place); 351 } 352 printi(0, "// register: %s\n", name_to_str(&d)); 353 } 354 355 data = (itm_data_t *)(ADDR(info_hdr->name_plc_tbl.place)); 356 for (n = 0, place2 = info_hdr->name_plc_tbl.place.itm_ptr; 357 n < info_hdr->name_plc_tbl.number; 358 n++, data += 1, place2 += sizeof (itm_data_t)) { 359 d = *(data); 360 361 if ((sizeof (itm_place_t)) < d.size) { 362 d.place.itm_ptr = (itm_place2_t)ADDR(d.place); 363 } 364 TRACE_MESSAGE('p', ("(*)name=%ld", 365 ((sizeof (itm_place_t)) < d.size) ? 366 d.place.itm_ptr: 367 (place2 + offsetof(itm_data_t, place)))); 368 printi(0, "// name: %s\n", name_to_str(&d)); 369 370 } 371 372 place = (itm_place_t *)(ADDR(info_hdr->cond_plc_tbl.place)); 373 for (n = 0; n < info_hdr->cond_plc_tbl.number; n++, place += 1) { 374 dump_cond_tbl(itm_hdr, *place, 1); 375 } 376 place = (itm_place_t *)(ADDR(info_hdr->map_plc_tbl.place)); 377 for (n = 0; n < info_hdr->map_plc_tbl.number; 378 n++, place += 1) { 379 dump_map(itm_hdr, *place, 1); 380 } 381 place = (itm_place_t *)(ADDR(info_hdr->op_plc_tbl.place)); 382 for (n = 0; n < info_hdr->op_plc_tbl.number; 383 n++, place += 1) { 384 dump_op_tbl(itm_hdr, *place, 1); 385 } 386 place = (itm_place_t *)(ADDR(info_hdr->direc_plc_tbl.place)); 387 for (n = 0; n < info_hdr->direc_plc_tbl.number; n++, place += 1) { 388 dump_direc_tbl(itm_hdr, *place); 389 } 390 } 391 392 393 /* 394 * Dump direction 395 */ 396 static void 397 dump_direc_tbl(itm_hdr_t *itm_hdr, itm_place_t direc_place) 398 { 399 itm_tbl_hdr_t *direc_hdr; 400 itm_direc_t *direc; 401 itm_type_t type; 402 long i; 403 char *name; 404 405 direc_hdr = (itm_tbl_hdr_t *)ADDR(direc_place); 406 direc = (itm_direc_t *)(direc_hdr + 1); 407 408 TRACE_MESSAGE('p', ("(&)direc=%ld ", direc_place.itm_ptr)); 409 410 printi(1, RNPREF "direction"); 411 if (0 != direc_hdr->name.itm_ptr) { 412 name = tbl_name(itm_hdr, direc_hdr); 413 if (NULL != name) { 414 printi(0, " %s", name); 415 } 416 } 417 printi(0, " {\n"); 418 419 for (i = 0; i < direc_hdr->number; i++, direc++) { 420 dump_cond_tbl(itm_hdr, direc->condition, 0); 421 422 printi(0, "\t"); 423 424 type = (ITM_TBL_MASK & 425 (((itm_tbl_hdr_t *)(ADDR(direc->action)))->type)); 426 427 if (ITM_TBL_OP == type) { 428 dump_op_tbl(itm_hdr, direc->action, 0); 429 } else if (ITM_TBL_DIREC == type) { 430 printi(0, "direction: action: %ld\n", 431 direc->action.itm_ptr); 432 } else if (ITM_TBL_MAP == type) { 433 dump_map(itm_hdr, direc->action, 0); 434 } else { 435 printi(0, RNPREF 436 "error ELIBBAD // unknown operation (%lx)\n", 437 type); 438 } 439 } 440 441 printi(-1, "};\n"); 442 } 443 444 445 static void 446 dump_map(itm_hdr_t *itm_hdr, itm_place_t map_place, int standalone) 447 { 448 itm_tbl_hdr_t *tbl_hdr; 449 450 tbl_hdr = (itm_tbl_hdr_t *)ADDR(map_place); 451 452 switch (tbl_hdr->type) { 453 case ITM_TBL_MAP_INDEX_FIXED_1_1: 454 case ITM_TBL_MAP_INDEX_FIXED: 455 dump_map_i_f(itm_hdr, map_place, standalone); 456 break; 457 case ITM_TBL_MAP_LOOKUP: 458 dump_map_l_f(itm_hdr, map_place, standalone); 459 break; 460 case ITM_TBL_MAP_HASH: 461 dump_map_hash(itm_hdr, map_place, standalone); 462 break; 463 case ITM_TBL_MAP_DENSE_ENC: 464 dump_map_dense_enc(itm_hdr, map_place, standalone); 465 break; 466 default: 467 break; 468 } 469 } 470 471 472 /* 473 * Dump map-indexed-fixed 474 */ 475 static void 476 dump_map_i_f(itm_hdr_t *itm_hdr, itm_place_t map_place, int standalone) 477 { 478 itm_tbl_hdr_t *tbl_hdr; 479 itm_map_idx_fix_hdr_t *map_hdr; 480 itm_num_t i; 481 itm_num_t j; 482 unsigned char *p; 483 unsigned char *map_error; 484 char *name; 485 int error_flag; 486 487 TRACE_MESSAGE('d', ("dump_map_i_f\n")); 488 489 tbl_hdr = (itm_tbl_hdr_t *)ADDR(map_place); 490 map_hdr = (itm_map_idx_fix_hdr_t *)(tbl_hdr + 1); 491 492 if (0 < map_hdr->error_num) { 493 p = (unsigned char *)(map_hdr + 1); 494 map_error = p + (map_hdr->result_len * (tbl_hdr->number)); 495 if (0 == map_hdr->default_error) { 496 map_error += map_hdr->result_len; 497 } 498 } else if (1 == map_hdr->default_error) { 499 p = (unsigned char *)(map_hdr + 1); 500 map_error = p + (map_hdr->result_len * (tbl_hdr->number)); 501 } else { 502 map_error = NULL; 503 } 504 505 if ((standalone) && 506 (0 == tbl_hdr->name.itm_ptr) && 507 (map_place.itm_ptr != itm_hdr->direc_init_tbl.itm_ptr)) { 508 return; 509 } 510 511 TRACE_MESSAGE('p', ("(&)map=%ld ", map_place.itm_ptr)); 512 513 if (0 == tbl_hdr->name.itm_ptr) { 514 name = NULL; 515 } else { 516 name = tbl_name(itm_hdr, tbl_hdr); 517 } 518 519 if ((0 == standalone) && (0 != tbl_hdr->name.itm_ptr)) { 520 if (NULL != name) { 521 printi(0, "%s;\n", name); 522 } else { 523 printi(0, RNPREF "unknown;\n", name); 524 } 525 return; 526 } else { 527 printi(1, RNPREF "map"); 528 if (NULL != name) { 529 printi(0, " %s", name); 530 } 531 printi(0, " {\n"); 532 } 533 534 printi(0, "// simple indexed map\n"); 535 printi(0, "// source_len=%ld result_len=%ld\n", 536 map_hdr->source_len, map_hdr->result_len); 537 printi(0, "// start=0x%p end=0x%p\n", /* DO NOT CHANGE to %ld */ 538 map_hdr->start.itm_ptr, map_hdr->end.itm_ptr); 539 if (0 < map_hdr->error_num) { 540 printi(0, "// error_num=%ld\n", 541 map_hdr->error_num); 542 } 543 if (0 == map_hdr->default_error) { 544 p = (((unsigned char *)(map_hdr + 1)) + 545 (map_hdr->result_len * 546 (map_hdr->end.itm_ptr - map_hdr->start.itm_ptr + 1))); 547 printi(0, RNPREF "default 0x"); 548 for (j = 0; j < map_hdr->result_len; j++) { 549 printi(0, "%02x", *(p + j)); 550 } 551 printi(0, "\n"); 552 } else if (-1 == map_hdr->default_error) { 553 printi(0, RNPREF "default\t" RNPREF "default\n"); 554 } 555 error_flag = 0; 556 for (i = 0; i <= (map_hdr->end.itm_ptr - map_hdr->start.itm_ptr); i++) { 557 p = (((unsigned char *)(map_hdr + 1)) + 558 (map_hdr->result_len * i)); 559 if ((NULL == map_error) || 560 (0 == *(map_error + i))) { 561 printi(0, "0x%0*p\t", 562 (map_hdr->source_len * 2), i + map_hdr->start.itm_ptr); 563 printi(0, "0x"); 564 for (j = 0; j < map_hdr->result_len; j++) { 565 printi(0, "%02x", *(p + j)); 566 } 567 error_flag = 0; 568 printi(0, "\n"); 569 } else if (0 >= map_hdr->default_error) { 570 if (0 == error_flag) { 571 printi(0, "0x%0*p\t", 572 (map_hdr->source_len * 2), 573 i + map_hdr->start.itm_ptr); 574 printi(0, "error\n"); 575 error_flag = 1; 576 } else if (error_flag == 1) { 577 printi(0, " :\t:\n"); 578 error_flag = 2; 579 } 580 } 581 } 582 printi(-1, "};\n"); 583 } 584 585 586 /* 587 * Dump map-lookup-fixed 588 */ 589 static void 590 dump_map_l_f(itm_hdr_t *itm_hdr, itm_place_t map_place, int standalone) 591 { 592 itm_tbl_hdr_t *tbl_hdr; 593 itm_map_lookup_hdr_t *map_hdr; 594 itm_num_t i; 595 itm_num_t j; 596 unsigned char *p; 597 char *name; 598 599 TRACE_MESSAGE('d', ("dump_map_l_f\n")); 600 601 tbl_hdr = (itm_tbl_hdr_t *)ADDR(map_place); 602 map_hdr = (itm_map_lookup_hdr_t *)(tbl_hdr + 1); 603 604 if ((standalone) && 605 (0 == tbl_hdr->name.itm_ptr) && 606 (map_place.itm_ptr != itm_hdr->direc_init_tbl.itm_ptr)) { 607 return; 608 } 609 610 TRACE_MESSAGE('p', ("(&)map=%ld ", map_place.itm_ptr)); 611 612 if (0 == tbl_hdr->name.itm_ptr) { 613 name = NULL; 614 } else { 615 name = tbl_name(itm_hdr, tbl_hdr); 616 } 617 618 if ((0 == standalone) && (0 != tbl_hdr->name.itm_ptr)) { 619 if (NULL != name) { 620 printi(0, "%s;\n", name); 621 } else { 622 printi(0, RNPREF "unknown;\n", name); 623 } 624 return; 625 } else { 626 printi(1, RNPREF "map"); 627 if (NULL != name) { 628 printi(0, " %s", name); 629 } 630 printi(0, " {\n"); 631 } 632 633 printi(0, "// binary search map\n"); 634 printi(0, "// source_len=%ld result_len=%ld\n", 635 map_hdr->source_len, map_hdr->result_len); 636 if (0 < map_hdr->error_num) { 637 printi(0, "// error_num=%ld\n", 638 map_hdr->error_num); 639 } 640 641 if (0 == map_hdr->default_error) { 642 printi(0, RNPREF "default\t0x"); 643 p = ((unsigned char *)(map_hdr + 1) + 644 (tbl_hdr->number * 645 (map_hdr->source_len + map_hdr->result_len + 1)) + 646 map_hdr->source_len + 1); 647 for (j = 0; j < map_hdr->result_len; j++, p++) { 648 printi(0, "%02x", *p); 649 } 650 printi(0, "\n"); 651 } else if (-1 == map_hdr->default_error) { 652 printi(0, RNPREF "default\t" RNPREF "default\n"); 653 } 654 p = (unsigned char *)(map_hdr + 1); 655 for (i = 0; i < tbl_hdr->number; i++) { 656 printi(0, "0x"); 657 for (j = 0; j < map_hdr->source_len; j++, p++) { 658 printi(0, "%02x", *p); 659 } 660 661 if (0 != (*p)) { 662 p += map_hdr->result_len + 1; 663 printi(0, "\terror"); 664 } else { 665 p++; 666 printi(0, "\t0x"); 667 for (j = 0; j < map_hdr->result_len; j++, p++) { 668 printi(0, "%02x", *p); 669 } 670 } 671 printi(0, "\n"); 672 } 673 printi(-1, "};\n"); 674 } 675 676 /* 677 * Dump map-hash 678 */ 679 static void 680 dump_map_hash(itm_hdr_t *itm_hdr, itm_place_t map_place, int standalone) 681 { 682 itm_tbl_hdr_t *tbl_hdr; 683 itm_map_hash_hdr_t *map_hdr; 684 itm_num_t i; 685 itm_num_t j; 686 unsigned char *p; 687 unsigned char *map_hash; 688 unsigned char *map_error; 689 char *name; 690 691 TRACE_MESSAGE('d', ("dump_map_hash\n")); 692 693 tbl_hdr = (itm_tbl_hdr_t *)ADDR(map_place); 694 map_hdr = (itm_map_hash_hdr_t *)(tbl_hdr + 1); 695 map_error = (unsigned char *)(map_hdr + 1); 696 map_hash = (map_error + map_hdr->hash_tbl_num); 697 698 if ((standalone) && 699 (0 == tbl_hdr->name.itm_ptr) && 700 (map_place.itm_ptr != itm_hdr->direc_init_tbl.itm_ptr)) { 701 return; 702 } 703 704 TRACE_MESSAGE('p', ("(&)map=%ld ", map_place.itm_ptr)); 705 706 if (0 == tbl_hdr->name.itm_ptr) { 707 name = NULL; 708 } else { 709 name = tbl_name(itm_hdr, tbl_hdr); 710 } 711 712 if ((0 == standalone) && (0 != tbl_hdr->name.itm_ptr)) { 713 if (NULL != name) { 714 printi(0, "%s;\n", name); 715 } else { 716 printi(0, RNPREF "unknown;\n", name); 717 } 718 return; 719 } else { 720 printi(1, RNPREF "map"); 721 if (NULL != name) { 722 printi(0, " %s", name); 723 } 724 printi(0, " {\n"); 725 } 726 727 printi(0, "// hashed map\n"); 728 printi(0, "// number=%ld\n", 729 tbl_hdr->number); 730 printi(0, "// source_len=%ld result_len=%ld\n", 731 map_hdr->source_len, map_hdr->result_len); 732 printi(0, "// hash_tbl_size=%ld hash_of_size=%ld hash_of_num=%ld\n", 733 map_hdr->hash_tbl_size, 734 map_hdr->hash_of_size, map_hdr->hash_of_num); 735 if (0 < map_hdr->error_num) { 736 printi(0, "// error_num=%ld\n", 737 map_hdr->error_num); 738 } 739 740 741 if (0 == map_hdr->default_error) { 742 printi(0, RNPREF "default\t0x"); 743 p = map_hash + map_hdr->hash_tbl_size + 744 map_hdr->hash_of_size; 745 for (j = 0; j < map_hdr->result_len; j++, p++) { 746 printi(0, "%02x", *p); 747 } 748 printi(0, "\n"); 749 } else if (-1 == map_hdr->default_error) { 750 printi(0, RNPREF "default\t" RNPREF "default\n"); 751 } 752 p = map_hash; 753 TRACE_MESSAGE('d', ("dump_map_hash: %ld %ld\n", 754 tbl_hdr->number, map_hdr->hash_of_num)); 755 for (i = 0; i < map_hdr->hash_tbl_num; i++) { 756 TRACE_MESSAGE('d', ("dump_map_hash: %x (0x%08p)\n", *p, p)); 757 if (0 == *(map_error + i)) { 758 p += (map_hdr->source_len + 1 + map_hdr->result_len); 759 continue; 760 } 761 printi(0, "0x"); 762 for (j = 0; j < map_hdr->source_len; j++, p++) { 763 printi(0, "%02x", *p); 764 } 765 766 if (0 != (*p)) { 767 p += map_hdr->result_len + 1; 768 printi(0, "\terror"); 769 } else { 770 p++; 771 printi(0, "\t0x"); 772 for (j = 0; j < map_hdr->result_len; j++, p++) { 773 printi(0, "%02x", *p); 774 } 775 } 776 printi(0, "\n"); 777 } 778 printi(0, "// of table\n"); 779 for (i = 0; i < map_hdr->hash_of_num; i++) { 780 printi(0, "0x"); 781 for (j = 0; j < map_hdr->source_len; j++, p++) { 782 printi(0, "%02x", *p); 783 } 784 if (0 != (*p)) { 785 p += map_hdr->result_len + 1; 786 printi(0, "\terror\n"); 787 } else { 788 p++; 789 printi(0, "\t0x"); 790 for (j = 0; j < map_hdr->result_len; j++, p++) { 791 printi(0, "%02x", *p); 792 } 793 printi(0, "\n"); 794 } 795 } 796 printi(-1, "};\n"); 797 } 798 799 800 /* 801 * Dump map-dense-encoding 802 */ 803 static void 804 dump_map_dense_enc(itm_hdr_t *itm_hdr, itm_place_t map_place, int standalone) 805 { 806 itm_tbl_hdr_t *tbl_hdr; 807 itm_map_dense_enc_hdr_t *map_hdr; 808 itm_num_t i; 809 itm_num_t j; 810 unsigned char *p; 811 unsigned char *map_ptr; 812 unsigned char *map_error; 813 unsigned char *byte_seq_min; 814 unsigned char *byte_seq_max; 815 char *name; 816 int error_flag; 817 818 TRACE_MESSAGE('d', ("dump_map_dense_enc\n")); 819 820 tbl_hdr = (itm_tbl_hdr_t *)ADDR(map_place); 821 map_hdr = (itm_map_dense_enc_hdr_t *)(tbl_hdr + 1); 822 map_ptr = ((unsigned char *)(map_hdr + 1) + 823 map_hdr->source_len + map_hdr->source_len); 824 825 if (0 < map_hdr->error_num) { 826 map_error = (map_ptr + 827 (tbl_hdr->number * map_hdr->result_len)); 828 if (0 == map_hdr->default_error) { 829 map_error += map_hdr->result_len; 830 } 831 } else if (1 == map_hdr->default_error) { 832 map_error = (map_ptr + 833 (tbl_hdr->number * map_hdr->result_len)); 834 } else { 835 map_error = NULL; 836 } 837 byte_seq_min = (unsigned char *)(map_hdr + 1); 838 byte_seq_max = byte_seq_min + map_hdr->source_len; 839 840 if ((standalone) && 841 (0 == tbl_hdr->name.itm_ptr) && 842 (map_place.itm_ptr != itm_hdr->direc_init_tbl.itm_ptr)) { 843 return; 844 } 845 846 TRACE_MESSAGE('p', ("(&)map=%ld ", map_place.itm_ptr)); 847 848 if (0 == tbl_hdr->name.itm_ptr) { 849 name = NULL; 850 } else { 851 name = tbl_name(itm_hdr, tbl_hdr); 852 } 853 854 if ((0 == standalone) && (0 != tbl_hdr->name.itm_ptr)) { 855 if (NULL != name) { 856 printi(0, "%s;\n", name); 857 } else { 858 printi(0, RNPREF "unknown;\n", name); 859 } 860 return; 861 } else { 862 printi(1, RNPREF "map"); 863 if (NULL != name) { 864 printi(0, " %s", name); 865 } 866 printi(0, " {\n"); 867 } 868 869 printi(0, "// dense encoded map\n"); 870 printi(0, "// entry_number=%ld\n", tbl_hdr->number); 871 printi(0, "// source_len=%ld result_len=%ld\n", 872 map_hdr->source_len, map_hdr->result_len); 873 printi(0, "// byte_seq_min=0x"); 874 p = byte_seq_min; 875 for (i = 0; i < map_hdr->source_len; i++, p++) { 876 printi(0, "%02x", *p); 877 } 878 printi(0, "\n"); 879 printi(0, "// byte_seq_max=0x"); 880 p = byte_seq_max; 881 for (i = 0; i < map_hdr->source_len; i++, p++) { 882 printi(0, "%02x", *p); 883 } 884 printi(0, "\n"); 885 if (0 < map_hdr->error_num) { 886 printi(0, "// error_num=%ld\n", 887 map_hdr->error_num); 888 } 889 if (0 == map_hdr->default_error) { 890 p = (map_ptr + (tbl_hdr->number * map_hdr->result_len)); 891 printi(0, RNPREF "default 0x"); 892 for (j = 0; j < map_hdr->result_len; j++) { 893 printi(0, "%02x", *(p + j)); 894 } 895 printi(0, "\n"); 896 } else if (-1 == map_hdr->default_error) { 897 printi(0, RNPREF "default\t" RNPREF "default\n"); 898 } 899 900 error_flag = 0; 901 for (i = 0, p = map_ptr; i < tbl_hdr->number; 902 i++, p += map_hdr->result_len) { 903 if ((NULL == map_error) || (0 == *(map_error + i))) { 904 printi(0, "%s\t", 905 dense_enc_index_to_byte_seq( 906 i, map_hdr->source_len, 907 byte_seq_min, byte_seq_max)); 908 printi(0, "0x"); 909 for (j = 0; j < map_hdr->result_len; j++) { 910 printi(0, "%02x", *(p + j)); 911 } 912 printi(0, "\n"); 913 error_flag = 0; 914 } else if (0 >= map_hdr->default_error) { 915 if (0 == error_flag) { 916 printi(0, "%s\t", 917 dense_enc_index_to_byte_seq( 918 i, map_hdr->source_len, 919 byte_seq_min, byte_seq_max)); 920 printi(0, "error\n"); 921 error_flag = 1; 922 } else if (error_flag == 1) { 923 printi(0, " :\t:\n"); 924 error_flag = 2; 925 } 926 } 927 } 928 printi(-1, "};\n"); 929 } 930 931 932 /* 933 * Evaluate condition table 934 */ 935 static void 936 dump_cond_tbl(itm_hdr_t *itm_hdr, itm_place_t cond_place, int standalone) 937 { 938 itm_tbl_hdr_t *cond_hdr; 939 itm_cond_t *cond; 940 long i; 941 char *name; 942 943 TRACE_MESSAGE('p', ("(&)cond_tbl=%ld ", cond_place.itm_ptr)); 944 cond_hdr = (itm_tbl_hdr_t *)(ADDR(cond_place)); 945 cond = (itm_cond_t *)(cond_hdr + 1); 946 947 if ((standalone) && (0 == cond_hdr->name.itm_ptr)) { 948 TRACE_MESSAGE('t', ("skip condition(%d, %ld)\n", 949 standalone, cond_hdr->name.itm_ptr)); 950 return; 951 } 952 953 if (0 == cond_place.itm_ptr) { 954 printi(0, RNPREF "true"); 955 return; 956 } 957 958 if (0 == cond_hdr->name.itm_ptr) { 959 name = NULL; 960 } else { 961 name = tbl_name(itm_hdr, cond_hdr); 962 } 963 964 if ((0 == standalone) && (0 != cond_hdr->name.itm_ptr)) { 965 if (NULL != name) { 966 printi(0, "%s", name); 967 } else { 968 printi(0, RNPREF "unknown"); 969 } 970 return; 971 } else { 972 printi(1, RNPREF "condition"); 973 if (NULL != name) { 974 printi(0, " %s", name); 975 } 976 printi(0, " {\n"); 977 } 978 979 for (i = 0; i < cond_hdr->number; i++, cond++) { 980 switch (cond->type) { 981 case ITM_COND_BETWEEN: 982 dump_range(itm_hdr, cond->operand.place); 983 break; 984 case ITM_COND_EXPR: 985 dump_expr(itm_hdr, cond->operand.place); 986 printi(0, ";\n"); 987 break; 988 case ITM_COND_ESCAPESEQ: 989 dump_escapeseq(itm_hdr, cond->operand.place); 990 break; 991 default: 992 printi(0, "// unknown %d\n", cond->type); 993 break; 994 } 995 } 996 997 if (standalone) { 998 printi(-1, "};\n"); 999 } else { 1000 printi(-1, "}"); 1001 } 1002 } 1003 1004 1005 /* 1006 * Dump operation table 1007 */ 1008 static void 1009 dump_op_tbl(itm_hdr_t *itm_hdr, itm_place_t op_tbl_place, int standalone) 1010 { 1011 itm_tbl_hdr_t *op_hdr; 1012 itm_op_t *operation; 1013 itm_place2_t op_place; 1014 long i; 1015 char *name; 1016 static int op_tbl_level; 1017 1018 op_hdr = (itm_tbl_hdr_t *)(ADDR(op_tbl_place)); 1019 operation = (itm_op_t *)(op_hdr + 1); 1020 TRACE_MESSAGE('p', ("(&)op_tbl=%ld ", op_tbl_place)); 1021 1022 name = tbl_name(itm_hdr, op_hdr); 1023 1024 if ((standalone) && (NULL == name)) 1025 return; 1026 1027 if (0 == op_tbl_level) { 1028 if ((0 == standalone) && (0 != op_hdr->name.itm_ptr)) { 1029 if (NULL != name) { 1030 printi(0, "%s;\n", name); 1031 } else { 1032 printi(0, RNPREF "unknown;", name); 1033 } 1034 return; 1035 } else { 1036 printi(1, RNPREF "operation"); 1037 if (NULL != name) { 1038 printi(0, " %s", name); 1039 } 1040 printi(0, " {\n"); 1041 } 1042 } 1043 1044 op_tbl_level += 1; 1045 1046 op_place = op_tbl_place.itm_ptr + (sizeof (itm_tbl_hdr_t)); 1047 for (i = 0; i < op_hdr->number; 1048 i++, operation++, op_place += (sizeof (itm_op_t))) { 1049 dump_op(itm_hdr, op_place); 1050 } 1051 1052 op_tbl_level -= 1; 1053 1054 if (0 == op_tbl_level) { 1055 printi(-1, "};\n"); 1056 } 1057 } 1058 1059 1060 /* 1061 * Evaluate single operation 1062 */ 1063 static void 1064 dump_op(itm_hdr_t *itm_hdr, itm_place2_t op_place) 1065 { 1066 itm_op_t *operation; 1067 itm_tbl_hdr_t *op_hdr; 1068 1069 operation = (itm_op_t *)ADDR2(op_place); 1070 TRACE_MESSAGE('p', ("(&)op=%ld ", op_place)); 1071 1072 switch (operation->type) { 1073 case ITM_OP_EXPR: 1074 dump_expr(itm_hdr, operation->data.operand[0]); 1075 printi(0, ";\n"); 1076 break; 1077 case ITM_OP_ERROR: 1078 printi(0, RNPREF "error "); 1079 dump_expr(itm_hdr, operation->data.operand[0]); 1080 printi(0, ";\n"); 1081 break; 1082 case ITM_OP_ERROR_D: 1083 printi(0, RNPREF "error %d;", 1084 operation->data.operand[0].itm_ptr); 1085 printi(0, "\n"); 1086 break; 1087 case ITM_OP_DISCARD: 1088 printi(0, RNPREF "discard "); 1089 dump_expr(itm_hdr, operation->data.operand[0]); 1090 printi(0, ";\n"); 1091 break; 1092 case ITM_OP_DISCARD_D: 1093 printi(0, RNPREF "discard %ld;\n", 1094 operation->data.operand[0].itm_ptr); 1095 break; 1096 case ITM_OP_OUT: 1097 case ITM_OP_OUT_D: 1098 case ITM_OP_OUT_R: 1099 case ITM_OP_OUT_S: 1100 case ITM_OP_OUT_INVD: 1101 printi(0, RNPREF "out = "); 1102 dump_expr(itm_hdr, operation->data.operand[0]); 1103 printi(0, ";\n"); 1104 break; 1105 case ITM_OP_IF: 1106 printi(0, RNPREF "if "); 1107 dump_expr(itm_hdr, operation->data.operand[0]); 1108 printi(1, " {\n"); 1109 dump_op_tbl(itm_hdr, operation->data.operand[1], 0); 1110 printi(-1, "}\n"); 1111 break; 1112 case ITM_OP_IF_ELSE: 1113 printi(0, RNPREF "if "); 1114 dump_expr(itm_hdr, operation->data.operand[0]); 1115 printi(1, " {\n"); 1116 dump_op_tbl(itm_hdr, operation->data.operand[1], 0); 1117 printi(-1, "} "); 1118 op_hdr = ADDR(operation->data.operand[2]); 1119 if ((1 == op_hdr->number) && 1120 ((ITM_OP_IF_ELSE == ((itm_op_t *)(op_hdr + 1))->type) || 1121 (ITM_OP_IF == ((itm_op_t *)(op_hdr + 1))->type))) { 1122 printi(0, RNPREF "else "); 1123 dump_op_tbl(itm_hdr, operation->data.operand[2], 0); 1124 } else { 1125 printi(1, RNPREF "else {\n"); 1126 dump_op_tbl(itm_hdr, operation->data.operand[2], 0); 1127 printi(-1, "}\n"); 1128 } 1129 break; 1130 case ITM_OP_DIRECTION: /* switch direction */ 1131 printi(0, RNPREF "direction %1$s;\n", tbl_name(itm_hdr, 1132 (itm_tbl_hdr_t *)ADDR(operation->data.operand[0]))); 1133 break; 1134 case ITM_OP_MAP: /* use map */ 1135 printi(0, RNPREF "map %1$s", tbl_name(itm_hdr, 1136 (itm_tbl_hdr_t *)ADDR(operation->data.operand[0]))); 1137 if (0 != operation->data.operand[1].itm_ptr) { 1138 printi(0, " "); 1139 dump_expr(itm_hdr, operation->data.operand[1]); 1140 } 1141 printi(0, ";\n"); 1142 break; 1143 case ITM_OP_OPERATION: /* invoke operation */ 1144 printi(0, RNPREF "operation %1$s;\n", 1145 tbl_name(itm_hdr, 1146 (itm_tbl_hdr_t *)ADDR(operation->data.operand[0]))); 1147 break; 1148 case ITM_OP_INIT: /* invoke init operation */ 1149 printi(0, RNPREF "operation " RNPREF "init;\n"); 1150 break; 1151 case ITM_OP_RESET: /* invoke reset operation */ 1152 printi(0, RNPREF "operation " RNPREF "reset;\n"); 1153 break; 1154 case ITM_OP_BREAK: /* break */ 1155 printi(0, RNPREF "break;\n"); 1156 break; 1157 case ITM_OP_RETURN: /* return */ 1158 printi(0, RNPREF "return;\n"); 1159 break; 1160 case ITM_OP_PRINTCHR: 1161 printi(0, RNPREF "printchr "); 1162 dump_expr(itm_hdr, operation->data.operand[0]); 1163 printi(0, ";\n"); 1164 break; 1165 case ITM_OP_PRINTHD: 1166 printi(0, RNPREF "printhd "); 1167 dump_expr(itm_hdr, operation->data.operand[0]); 1168 printi(0, ";\n"); 1169 break; 1170 case ITM_OP_PRINTINT: 1171 printi(0, RNPREF "printint "); 1172 dump_expr(itm_hdr, operation->data.operand[0]); 1173 printi(0, ";\n"); 1174 break; 1175 default: 1176 printi(0, "// unknown operation: %lx\n", operation->type); 1177 break; 1178 } 1179 } 1180 1181 1182 /* 1183 * Dump expression 1184 */ 1185 static void 1186 dump_expr(itm_hdr_t *itm_hdr, itm_place_t expr_place) 1187 { 1188 itm_expr_t *expr; 1189 itm_data_t data; 1190 1191 expr = (itm_expr_t *)ADDR(expr_place); 1192 TRACE_MESSAGE('p', ("(*)ex=%ld ", expr_place.itm_ptr)); 1193 1194 switch (expr->type) { 1195 case ITM_EXPR_NONE: /* not used */ 1196 printi(0, "none"); 1197 break; 1198 case ITM_EXPR_NOP: /* not used */ 1199 printi(0, "NOP"); 1200 break; 1201 case ITM_EXPR_NAME: /* not used */ 1202 printi(0, "NAME"); 1203 break; 1204 case ITM_EXPR_INT: /* integer */ 1205 printi(0, "%ld", expr->data.itm_exnum); 1206 break; 1207 case ITM_EXPR_SEQ: /* byte sequence */ 1208 data = expr->data.value; 1209 if ((sizeof (itm_place_t)) < data.size) { 1210 data.place.itm_ptr = (itm_place2_t)ADDR(data.place); 1211 } 1212 printi(0, "0x%s", data_to_hexadecimal(&data)); 1213 break; 1214 case ITM_EXPR_REG: /* register */ 1215 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1216 break; 1217 case ITM_EXPR_IN_VECTOR: /* in[expr] */ 1218 printi(0, RNPREF "in["); 1219 dump_expr(itm_hdr, expr->data.operand[0]); 1220 printi(0, "]"); 1221 break; 1222 case ITM_EXPR_IN_VECTOR_D: /* in[num] */ 1223 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1224 if (0 == expr->data.operand[0].itm_ptr) { 1225 printi(0, " // inputsize"); 1226 } 1227 break; 1228 case ITM_EXPR_OUT: /* out */ 1229 printi(0, RNPREF "out"); 1230 break; 1231 case ITM_EXPR_TRUE: /* true */ 1232 printi(0, RNPREF "true"); 1233 break; 1234 case ITM_EXPR_FALSE: /* false */ 1235 printi(0, RNPREF "false"); 1236 break; 1237 case ITM_EXPR_UMINUS: /* unary minus */ 1238 printi(0, "-"); 1239 dump_expr(itm_hdr, expr->data.operand[0]); 1240 break; 1241 case ITM_EXPR_PLUS: /* A + B */ 1242 printi(0, "("); 1243 dump_expr(itm_hdr, expr->data.operand[0]); 1244 printi(0, " + "); 1245 dump_expr(itm_hdr, expr->data.operand[1]); 1246 printi(0, ")"); 1247 break; 1248 case ITM_EXPR_PLUS_E_D: /* exprA + B */ 1249 printi(0, "("); 1250 dump_expr(itm_hdr, expr->data.operand[0]); 1251 printi(0, " + "); 1252 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1253 printi(0, ")"); 1254 break; 1255 case ITM_EXPR_PLUS_E_R: /* exprA + varB */ 1256 printi(0, "("); 1257 dump_expr(itm_hdr, expr->data.operand[0]); 1258 printi(0, " + "); 1259 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1260 printi(0, ")"); 1261 break; 1262 case ITM_EXPR_PLUS_E_INVD: /* exprA + in[B] */ 1263 printi(0, "("); 1264 dump_expr(itm_hdr, expr->data.operand[0]); 1265 printi(0, " + "); 1266 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1267 printi(0, ")"); 1268 break; 1269 case ITM_EXPR_PLUS_D_E: /* intA + exprB */ 1270 printi(0, "("); 1271 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1272 printi(0, " + "); 1273 dump_expr(itm_hdr, expr->data.operand[1]); 1274 printi(0, ")"); 1275 break; 1276 case ITM_EXPR_PLUS_D_D: /* intA + B */ 1277 printi(0, "("); 1278 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1279 printi(0, " + "); 1280 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1281 printi(0, ")"); 1282 break; 1283 case ITM_EXPR_PLUS_D_R: /* intA + varB */ 1284 printi(0, "("); 1285 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1286 printi(0, " + "); 1287 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1288 printi(0, ")"); 1289 break; 1290 case ITM_EXPR_PLUS_D_INVD: /* intA + in[B] */ 1291 printi(0, "("); 1292 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1293 printi(0, " + "); 1294 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1295 printi(0, ")"); 1296 break; 1297 case ITM_EXPR_PLUS_R_E: /* varA + exprB */ 1298 printi(0, "("); 1299 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1300 printi(0, " + "); 1301 dump_expr(itm_hdr, expr->data.operand[1]); 1302 printi(0, ")"); 1303 break; 1304 case ITM_EXPR_PLUS_R_D: /* varA + B */ 1305 printi(0, "("); 1306 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1307 printi(0, " + "); 1308 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1309 printi(0, ")"); 1310 break; 1311 case ITM_EXPR_PLUS_R_R: /* varA + varB */ 1312 printi(0, "("); 1313 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1314 printi(0, " + "); 1315 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1316 printi(0, ")"); 1317 break; 1318 case ITM_EXPR_PLUS_R_INVD: /* varA + in[B] */ 1319 printi(0, "("); 1320 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1321 printi(0, " + "); 1322 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1323 printi(0, ")"); 1324 break; 1325 case ITM_EXPR_PLUS_INVD_E: /* in[A] + exprB */ 1326 printi(0, "("); 1327 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1328 printi(0, " + "); 1329 dump_expr(itm_hdr, expr->data.operand[1]); 1330 printi(0, ")"); 1331 break; 1332 case ITM_EXPR_PLUS_INVD_D: /* in[A] + B */ 1333 printi(0, "("); 1334 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1335 printi(0, " + "); 1336 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1337 printi(0, ")"); 1338 break; 1339 case ITM_EXPR_PLUS_INVD_R: /* in[A] + varB */ 1340 printi(0, "("); 1341 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1342 printi(0, " + "); 1343 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1344 printi(0, ")"); 1345 break; 1346 case ITM_EXPR_PLUS_INVD_INVD: /* in[A] + in[B] */ 1347 printi(0, "("); 1348 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1349 printi(0, " + "); 1350 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1351 printi(0, ")"); 1352 break; 1353 case ITM_EXPR_MINUS: /* A - B */ 1354 printi(0, "("); 1355 dump_expr(itm_hdr, expr->data.operand[0]); 1356 printi(0, " - "); 1357 dump_expr(itm_hdr, expr->data.operand[1]); 1358 printi(0, ")"); 1359 break; 1360 case ITM_EXPR_MINUS_E_D: /* exprA - B */ 1361 printi(0, "("); 1362 dump_expr(itm_hdr, expr->data.operand[0]); 1363 printi(0, " - "); 1364 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1365 printi(0, ")"); 1366 break; 1367 case ITM_EXPR_MINUS_E_R: /* exprA - varB */ 1368 printi(0, "("); 1369 dump_expr(itm_hdr, expr->data.operand[0]); 1370 printi(0, " - "); 1371 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1372 printi(0, ")"); 1373 break; 1374 case ITM_EXPR_MINUS_E_INVD: /* exprA - in[B] */ 1375 printi(0, "("); 1376 dump_expr(itm_hdr, expr->data.operand[0]); 1377 printi(0, " - "); 1378 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1379 printi(0, ")"); 1380 break; 1381 case ITM_EXPR_MINUS_D_E: /* intA - exprB */ 1382 printi(0, "("); 1383 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1384 printi(0, " - "); 1385 dump_expr(itm_hdr, expr->data.operand[1]); 1386 printi(0, ")"); 1387 break; 1388 case ITM_EXPR_MINUS_D_D: /* intA - B */ 1389 printi(0, "("); 1390 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1391 printi(0, " - "); 1392 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1393 printi(0, ")"); 1394 break; 1395 case ITM_EXPR_MINUS_D_R: /* intA - varB */ 1396 printi(0, "("); 1397 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1398 printi(0, " - "); 1399 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1400 printi(0, ")"); 1401 break; 1402 case ITM_EXPR_MINUS_D_INVD: /* intA - in[B] */ 1403 printi(0, "("); 1404 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1405 printi(0, " - "); 1406 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1407 printi(0, ")"); 1408 break; 1409 case ITM_EXPR_MINUS_R_E: /* varA - exprB */ 1410 printi(0, "("); 1411 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1412 printi(0, " - "); 1413 dump_expr(itm_hdr, expr->data.operand[1]); 1414 printi(0, ")"); 1415 break; 1416 case ITM_EXPR_MINUS_R_D: /* varA - B */ 1417 printi(0, "("); 1418 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1419 printi(0, " - "); 1420 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1421 printi(0, ")"); 1422 break; 1423 case ITM_EXPR_MINUS_R_R: /* varA - varB */ 1424 printi(0, "("); 1425 printi(0, " - "); 1426 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1427 printi(0, ")"); 1428 break; 1429 case ITM_EXPR_MINUS_R_INVD: /* varA - in[B] */ 1430 printi(0, "("); 1431 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1432 printi(0, " - "); 1433 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1434 printi(0, ")"); 1435 break; 1436 case ITM_EXPR_MINUS_INVD_E: /* in[A] - exprB */ 1437 printi(0, "("); 1438 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1439 printi(0, " - "); 1440 dump_expr(itm_hdr, expr->data.operand[1]); 1441 printi(0, ")"); 1442 break; 1443 case ITM_EXPR_MINUS_INVD_D: /* in[A] - B */ 1444 printi(0, "("); 1445 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1446 printi(0, " - "); 1447 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1448 printi(0, ")"); 1449 break; 1450 case ITM_EXPR_MINUS_INVD_R: /* in[A] - varB */ 1451 printi(0, "("); 1452 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1453 printi(0, " - "); 1454 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1455 printi(0, ")"); 1456 break; 1457 case ITM_EXPR_MINUS_INVD_INVD: /* in[A] - in[B] */ 1458 printi(0, "("); 1459 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1460 printi(0, " - "); 1461 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1462 printi(0, ")"); 1463 break; 1464 case ITM_EXPR_MUL: /* A * B */ 1465 printi(0, "("); 1466 dump_expr(itm_hdr, expr->data.operand[0]); 1467 printi(0, " * "); 1468 dump_expr(itm_hdr, expr->data.operand[1]); 1469 printi(0, ")"); 1470 break; 1471 case ITM_EXPR_MUL_E_D: /* exprA * B */ 1472 printi(0, "("); 1473 dump_expr(itm_hdr, expr->data.operand[0]); 1474 printi(0, " * "); 1475 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1476 printi(0, ")"); 1477 break; 1478 case ITM_EXPR_MUL_E_R: /* exprA * varB */ 1479 printi(0, "("); 1480 dump_expr(itm_hdr, expr->data.operand[0]); 1481 printi(0, " * "); 1482 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1483 printi(0, ")"); 1484 break; 1485 case ITM_EXPR_MUL_E_INVD: /* exprA * in[B] */ 1486 printi(0, "("); 1487 dump_expr(itm_hdr, expr->data.operand[0]); 1488 printi(0, " * "); 1489 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1490 printi(0, ")"); 1491 break; 1492 case ITM_EXPR_MUL_D_E: /* intA * exprB */ 1493 printi(0, "("); 1494 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1495 printi(0, " * "); 1496 dump_expr(itm_hdr, expr->data.operand[1]); 1497 printi(0, ")"); 1498 break; 1499 case ITM_EXPR_MUL_D_D: /* intA * B */ 1500 printi(0, "("); 1501 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1502 printi(0, " * "); 1503 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1504 printi(0, ")"); 1505 break; 1506 case ITM_EXPR_MUL_D_R: /* intA * varB */ 1507 printi(0, "("); 1508 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1509 printi(0, " * "); 1510 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1511 printi(0, ")"); 1512 break; 1513 case ITM_EXPR_MUL_D_INVD: /* intA * in[B] */ 1514 printi(0, "("); 1515 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1516 printi(0, " * "); 1517 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1518 printi(0, ")"); 1519 break; 1520 case ITM_EXPR_MUL_R_E: /* varA * exprB */ 1521 printi(0, "("); 1522 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1523 printi(0, " * "); 1524 dump_expr(itm_hdr, expr->data.operand[1]); 1525 printi(0, ")"); 1526 break; 1527 case ITM_EXPR_MUL_R_D: /* varA * B */ 1528 printi(0, "("); 1529 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1530 printi(0, " * "); 1531 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1532 printi(0, ")"); 1533 break; 1534 case ITM_EXPR_MUL_R_R: /* varA * varB */ 1535 printi(0, "("); 1536 printi(0, " * "); 1537 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1538 printi(0, ")"); 1539 break; 1540 case ITM_EXPR_MUL_R_INVD: /* varA * in[B] */ 1541 printi(0, "("); 1542 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1543 printi(0, " * "); 1544 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1545 printi(0, ")"); 1546 break; 1547 case ITM_EXPR_MUL_INVD_E: /* in[A] * exprB */ 1548 printi(0, "("); 1549 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1550 printi(0, " * "); 1551 dump_expr(itm_hdr, expr->data.operand[1]); 1552 printi(0, ")"); 1553 break; 1554 case ITM_EXPR_MUL_INVD_D: /* in[A] * B */ 1555 printi(0, "("); 1556 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1557 printi(0, " * "); 1558 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1559 printi(0, ")"); 1560 break; 1561 case ITM_EXPR_MUL_INVD_R: /* in[A] * varB */ 1562 printi(0, "("); 1563 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1564 printi(0, " * "); 1565 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1566 printi(0, ")"); 1567 break; 1568 case ITM_EXPR_MUL_INVD_INVD: /* in[A] * in[B] */ 1569 printi(0, "("); 1570 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1571 printi(0, " * "); 1572 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1573 printi(0, ")"); 1574 break; 1575 case ITM_EXPR_DIV: /* A / B */ 1576 printi(0, "("); 1577 dump_expr(itm_hdr, expr->data.operand[0]); 1578 printi(0, " / "); 1579 dump_expr(itm_hdr, expr->data.operand[1]); 1580 printi(0, ")"); 1581 break; 1582 case ITM_EXPR_DIV_E_D: /* exprA / B */ 1583 printi(0, "("); 1584 dump_expr(itm_hdr, expr->data.operand[0]); 1585 printi(0, " / "); 1586 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1587 printi(0, ")"); 1588 break; 1589 case ITM_EXPR_DIV_E_R: /* exprA / varB */ 1590 printi(0, "("); 1591 dump_expr(itm_hdr, expr->data.operand[0]); 1592 printi(0, " / "); 1593 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1594 printi(0, ")"); 1595 break; 1596 case ITM_EXPR_DIV_E_INVD: /* exprA / in[B] */ 1597 printi(0, "("); 1598 dump_expr(itm_hdr, expr->data.operand[0]); 1599 printi(0, " / "); 1600 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1601 printi(0, ")"); 1602 break; 1603 case ITM_EXPR_DIV_D_E: /* intA / exprB */ 1604 printi(0, "("); 1605 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1606 printi(0, " / "); 1607 dump_expr(itm_hdr, expr->data.operand[1]); 1608 printi(0, ")"); 1609 break; 1610 case ITM_EXPR_DIV_D_D: /* intA / B */ 1611 printi(0, "("); 1612 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1613 printi(0, " / "); 1614 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1615 printi(0, ")"); 1616 break; 1617 case ITM_EXPR_DIV_D_R: /* intA / varB */ 1618 printi(0, "("); 1619 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1620 printi(0, " / "); 1621 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1622 printi(0, ")"); 1623 break; 1624 case ITM_EXPR_DIV_D_INVD: /* intA / in[B] */ 1625 printi(0, "("); 1626 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1627 printi(0, " / "); 1628 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1629 printi(0, ")"); 1630 break; 1631 case ITM_EXPR_DIV_R_E: /* varA / exprB */ 1632 printi(0, "("); 1633 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1634 printi(0, " / "); 1635 dump_expr(itm_hdr, expr->data.operand[1]); 1636 printi(0, ")"); 1637 break; 1638 case ITM_EXPR_DIV_R_D: /* varA / B */ 1639 printi(0, "("); 1640 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1641 printi(0, " / "); 1642 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1643 printi(0, ")"); 1644 break; 1645 case ITM_EXPR_DIV_R_R: /* varA / varB */ 1646 printi(0, "("); 1647 printi(0, " / "); 1648 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1649 printi(0, ")"); 1650 break; 1651 case ITM_EXPR_DIV_R_INVD: /* varA / in[B] */ 1652 printi(0, "("); 1653 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1654 printi(0, " / "); 1655 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1656 printi(0, ")"); 1657 break; 1658 case ITM_EXPR_DIV_INVD_E: /* in[A] / exprB */ 1659 printi(0, "("); 1660 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1661 printi(0, " / "); 1662 dump_expr(itm_hdr, expr->data.operand[1]); 1663 printi(0, ")"); 1664 break; 1665 case ITM_EXPR_DIV_INVD_D: /* in[A] / B */ 1666 printi(0, "("); 1667 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1668 printi(0, " / "); 1669 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1670 printi(0, ")"); 1671 break; 1672 case ITM_EXPR_DIV_INVD_R: /* in[A] / varB */ 1673 printi(0, "("); 1674 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1675 printi(0, " / "); 1676 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1677 printi(0, ")"); 1678 break; 1679 case ITM_EXPR_DIV_INVD_INVD: /* in[A] / in[B] */ 1680 printi(0, "("); 1681 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1682 printi(0, " / "); 1683 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1684 printi(0, ")"); 1685 break; 1686 case ITM_EXPR_MOD: /* A % B */ 1687 printi(0, "("); 1688 dump_expr(itm_hdr, expr->data.operand[0]); 1689 printi(0, " %% "); 1690 dump_expr(itm_hdr, expr->data.operand[1]); 1691 printi(0, ")"); 1692 break; 1693 case ITM_EXPR_MOD_E_D: /* exprA % B */ 1694 printi(0, "("); 1695 dump_expr(itm_hdr, expr->data.operand[0]); 1696 printi(0, " %% "); 1697 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1698 printi(0, ")"); 1699 break; 1700 case ITM_EXPR_MOD_E_R: /* exprA % varB */ 1701 printi(0, "("); 1702 dump_expr(itm_hdr, expr->data.operand[0]); 1703 printi(0, " %% "); 1704 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1705 printi(0, ")"); 1706 break; 1707 case ITM_EXPR_MOD_E_INVD: /* exprA % in[B] */ 1708 printi(0, "("); 1709 dump_expr(itm_hdr, expr->data.operand[0]); 1710 printi(0, " %% "); 1711 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1712 printi(0, ")"); 1713 break; 1714 case ITM_EXPR_MOD_D_E: /* intA % exprB */ 1715 printi(0, "("); 1716 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1717 printi(0, " %% "); 1718 dump_expr(itm_hdr, expr->data.operand[1]); 1719 printi(0, ")"); 1720 break; 1721 case ITM_EXPR_MOD_D_D: /* intA % B */ 1722 printi(0, "("); 1723 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1724 printi(0, " %% "); 1725 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1726 printi(0, ")"); 1727 break; 1728 case ITM_EXPR_MOD_D_R: /* intA % varB */ 1729 printi(0, "("); 1730 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1731 printi(0, " %% "); 1732 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1733 printi(0, ")"); 1734 break; 1735 case ITM_EXPR_MOD_D_INVD: /* intA % in[B] */ 1736 printi(0, "("); 1737 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1738 printi(0, " %% "); 1739 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1740 printi(0, ")"); 1741 break; 1742 case ITM_EXPR_MOD_R_E: /* varA % exprB */ 1743 printi(0, "("); 1744 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1745 printi(0, " %% "); 1746 dump_expr(itm_hdr, expr->data.operand[1]); 1747 printi(0, ")"); 1748 break; 1749 case ITM_EXPR_MOD_R_D: /* varA % B */ 1750 printi(0, "("); 1751 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1752 printi(0, " %% "); 1753 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1754 printi(0, ")"); 1755 break; 1756 case ITM_EXPR_MOD_R_R: /* varA % varB */ 1757 printi(0, "("); 1758 printi(0, " %% "); 1759 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1760 printi(0, ")"); 1761 break; 1762 case ITM_EXPR_MOD_R_INVD: /* varA % in[B] */ 1763 printi(0, "("); 1764 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1765 printi(0, " %% "); 1766 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1767 printi(0, ")"); 1768 break; 1769 case ITM_EXPR_MOD_INVD_E: /* in[A] % exprB */ 1770 printi(0, "("); 1771 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1772 printi(0, " %% "); 1773 dump_expr(itm_hdr, expr->data.operand[1]); 1774 printi(0, ")"); 1775 break; 1776 case ITM_EXPR_MOD_INVD_D: /* in[A] % B */ 1777 printi(0, "("); 1778 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1779 printi(0, " %% "); 1780 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1781 printi(0, ")"); 1782 break; 1783 case ITM_EXPR_MOD_INVD_R: /* in[A] % varB */ 1784 printi(0, "("); 1785 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1786 printi(0, " %% "); 1787 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1788 printi(0, ")"); 1789 break; 1790 case ITM_EXPR_MOD_INVD_INVD: /* in[A] % in[B] */ 1791 printi(0, "("); 1792 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1793 printi(0, " %% "); 1794 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1795 printi(0, ")"); 1796 break; 1797 case ITM_EXPR_SHIFT_L: /* A << B */ 1798 printi(0, "("); 1799 dump_expr(itm_hdr, expr->data.operand[0]); 1800 printi(0, " << "); 1801 dump_expr(itm_hdr, expr->data.operand[1]); 1802 printi(0, ")"); 1803 break; 1804 case ITM_EXPR_SHIFT_L_E_D: /* exprA << B */ 1805 printi(0, "("); 1806 dump_expr(itm_hdr, expr->data.operand[0]); 1807 printi(0, " << "); 1808 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1809 printi(0, ")"); 1810 break; 1811 case ITM_EXPR_SHIFT_L_E_R: /* exprA << varB */ 1812 printi(0, "("); 1813 dump_expr(itm_hdr, expr->data.operand[0]); 1814 printi(0, " << "); 1815 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1816 printi(0, ")"); 1817 break; 1818 case ITM_EXPR_SHIFT_L_E_INVD: /* exprA << in[B] */ 1819 printi(0, "("); 1820 dump_expr(itm_hdr, expr->data.operand[0]); 1821 printi(0, " << "); 1822 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1823 printi(0, ")"); 1824 break; 1825 case ITM_EXPR_SHIFT_L_D_E: /* intA << exprB */ 1826 printi(0, "("); 1827 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1828 printi(0, " << "); 1829 dump_expr(itm_hdr, expr->data.operand[1]); 1830 printi(0, ")"); 1831 break; 1832 case ITM_EXPR_SHIFT_L_D_D: /* intA << B */ 1833 printi(0, "("); 1834 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1835 printi(0, " << "); 1836 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1837 printi(0, ")"); 1838 break; 1839 case ITM_EXPR_SHIFT_L_D_R: /* intA << varB */ 1840 printi(0, "("); 1841 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1842 printi(0, " << "); 1843 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1844 printi(0, ")"); 1845 break; 1846 case ITM_EXPR_SHIFT_L_D_INVD: /* intA << in[B] */ 1847 printi(0, "("); 1848 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1849 printi(0, " << "); 1850 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1851 printi(0, ")"); 1852 break; 1853 case ITM_EXPR_SHIFT_L_R_E: /* varA << exprB */ 1854 printi(0, "("); 1855 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1856 printi(0, " << "); 1857 dump_expr(itm_hdr, expr->data.operand[1]); 1858 printi(0, ")"); 1859 break; 1860 case ITM_EXPR_SHIFT_L_R_D: /* varA << B */ 1861 printi(0, "("); 1862 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1863 printi(0, " << "); 1864 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1865 printi(0, ")"); 1866 break; 1867 case ITM_EXPR_SHIFT_L_R_R: /* varA << varB */ 1868 printi(0, "("); 1869 printi(0, " << "); 1870 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1871 printi(0, ")"); 1872 break; 1873 case ITM_EXPR_SHIFT_L_R_INVD: /* varA << in[B] */ 1874 printi(0, "("); 1875 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1876 printi(0, " << "); 1877 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1878 printi(0, ")"); 1879 break; 1880 case ITM_EXPR_SHIFT_L_INVD_E: /* in[A] << exprB */ 1881 printi(0, "("); 1882 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1883 printi(0, " << "); 1884 dump_expr(itm_hdr, expr->data.operand[1]); 1885 printi(0, ")"); 1886 break; 1887 case ITM_EXPR_SHIFT_L_INVD_D: /* in[A] << B */ 1888 printi(0, "("); 1889 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1890 printi(0, " << "); 1891 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1892 printi(0, ")"); 1893 break; 1894 case ITM_EXPR_SHIFT_L_INVD_R: /* in[A] << varB */ 1895 printi(0, "("); 1896 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1897 printi(0, " << "); 1898 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1899 printi(0, ")"); 1900 break; 1901 case ITM_EXPR_SHIFT_L_INVD_INVD: /* in[A] << in[B] */ 1902 printi(0, "("); 1903 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1904 printi(0, " << "); 1905 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1906 printi(0, ")"); 1907 break; 1908 case ITM_EXPR_SHIFT_R: /* A >> B */ 1909 printi(0, "("); 1910 dump_expr(itm_hdr, expr->data.operand[0]); 1911 printi(0, " >> "); 1912 dump_expr(itm_hdr, expr->data.operand[1]); 1913 printi(0, ")"); 1914 break; 1915 case ITM_EXPR_SHIFT_R_E_D: /* exprA >> B */ 1916 printi(0, "("); 1917 dump_expr(itm_hdr, expr->data.operand[0]); 1918 printi(0, " >> "); 1919 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1920 printi(0, ")"); 1921 break; 1922 case ITM_EXPR_SHIFT_R_E_R: /* exprA >> varB */ 1923 printi(0, "("); 1924 dump_expr(itm_hdr, expr->data.operand[0]); 1925 printi(0, " >> "); 1926 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1927 printi(0, ")"); 1928 break; 1929 case ITM_EXPR_SHIFT_R_E_INVD: /* exprA >> in[B] */ 1930 printi(0, "("); 1931 dump_expr(itm_hdr, expr->data.operand[0]); 1932 printi(0, " >> "); 1933 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1934 printi(0, ")"); 1935 break; 1936 case ITM_EXPR_SHIFT_R_D_E: /* intA >> exprB */ 1937 printi(0, "("); 1938 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1939 printi(0, " >> "); 1940 dump_expr(itm_hdr, expr->data.operand[1]); 1941 printi(0, ")"); 1942 break; 1943 case ITM_EXPR_SHIFT_R_D_D: /* intA >> B */ 1944 printi(0, "("); 1945 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1946 printi(0, " >> "); 1947 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1948 printi(0, ")"); 1949 break; 1950 case ITM_EXPR_SHIFT_R_D_R: /* intA >> varB */ 1951 printi(0, "("); 1952 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1953 printi(0, " >> "); 1954 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 1955 printi(0, ")"); 1956 break; 1957 case ITM_EXPR_SHIFT_R_D_INVD: /* intA >> in[B] */ 1958 printi(0, "("); 1959 printi(0, "%ld", expr->data.operand[0].itm_ptr); 1960 printi(0, " >> "); 1961 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1962 printi(0, ")"); 1963 break; 1964 case ITM_EXPR_SHIFT_R_R_E: /* varA >> exprB */ 1965 printi(0, "("); 1966 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1967 printi(0, " >> "); 1968 dump_expr(itm_hdr, expr->data.operand[1]); 1969 printi(0, ")"); 1970 break; 1971 case ITM_EXPR_SHIFT_R_R_D: /* varA >> B */ 1972 printi(0, "("); 1973 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1974 printi(0, " >> "); 1975 printi(0, "%ld", expr->data.operand[1].itm_ptr); 1976 printi(0, ")"); 1977 break; 1978 case ITM_EXPR_SHIFT_R_R_R: /* varA >> varB */ 1979 printi(0, "("); 1980 printi(0, " >> "); 1981 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1982 printi(0, ")"); 1983 break; 1984 case ITM_EXPR_SHIFT_R_R_INVD: /* varA >> in[B] */ 1985 printi(0, "("); 1986 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 1987 printi(0, " >> "); 1988 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 1989 printi(0, ")"); 1990 break; 1991 case ITM_EXPR_SHIFT_R_INVD_E: /* in[A] >> exprB */ 1992 printi(0, "("); 1993 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 1994 printi(0, " >> "); 1995 dump_expr(itm_hdr, expr->data.operand[1]); 1996 printi(0, ")"); 1997 break; 1998 case ITM_EXPR_SHIFT_R_INVD_D: /* in[A] >> B */ 1999 printi(0, "("); 2000 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2001 printi(0, " >> "); 2002 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2003 printi(0, ")"); 2004 break; 2005 case ITM_EXPR_SHIFT_R_INVD_R: /* in[A] >> varB */ 2006 printi(0, "("); 2007 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2008 printi(0, " >> "); 2009 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2010 printi(0, ")"); 2011 break; 2012 case ITM_EXPR_SHIFT_R_INVD_INVD: /* in[A] >> in[B] */ 2013 printi(0, "("); 2014 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2015 printi(0, " >> "); 2016 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2017 printi(0, ")"); 2018 break; 2019 case ITM_EXPR_OR: /* A | B */ 2020 printi(0, "("); 2021 dump_expr(itm_hdr, expr->data.operand[0]); 2022 printi(0, " | "); 2023 dump_expr(itm_hdr, expr->data.operand[1]); 2024 printi(0, ")"); 2025 break; 2026 case ITM_EXPR_OR_E_D: /* exprA | B */ 2027 printi(0, "("); 2028 dump_expr(itm_hdr, expr->data.operand[0]); 2029 printi(0, " | "); 2030 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2031 printi(0, ")"); 2032 break; 2033 case ITM_EXPR_OR_E_R: /* exprA | varB */ 2034 printi(0, "("); 2035 dump_expr(itm_hdr, expr->data.operand[0]); 2036 printi(0, " | "); 2037 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2038 printi(0, ")"); 2039 break; 2040 case ITM_EXPR_OR_E_INVD: /* exprA | in[B] */ 2041 printi(0, "("); 2042 dump_expr(itm_hdr, expr->data.operand[0]); 2043 printi(0, " | "); 2044 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2045 printi(0, ")"); 2046 break; 2047 case ITM_EXPR_OR_D_E: /* intA | exprB */ 2048 printi(0, "("); 2049 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2050 printi(0, " | "); 2051 dump_expr(itm_hdr, expr->data.operand[1]); 2052 printi(0, ")"); 2053 break; 2054 case ITM_EXPR_OR_D_D: /* intA | B */ 2055 printi(0, "("); 2056 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2057 printi(0, " | "); 2058 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2059 printi(0, ")"); 2060 break; 2061 case ITM_EXPR_OR_D_R: /* intA | varB */ 2062 printi(0, "("); 2063 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2064 printi(0, " | "); 2065 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2066 printi(0, ")"); 2067 break; 2068 case ITM_EXPR_OR_D_INVD: /* intA | in[B] */ 2069 printi(0, "("); 2070 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2071 printi(0, " | "); 2072 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2073 printi(0, ")"); 2074 break; 2075 case ITM_EXPR_OR_R_E: /* varA | exprB */ 2076 printi(0, "("); 2077 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2078 printi(0, " | "); 2079 dump_expr(itm_hdr, expr->data.operand[1]); 2080 printi(0, ")"); 2081 break; 2082 case ITM_EXPR_OR_R_D: /* varA | B */ 2083 printi(0, "("); 2084 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2085 printi(0, " | "); 2086 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2087 printi(0, ")"); 2088 break; 2089 case ITM_EXPR_OR_R_R: /* varA | varB */ 2090 printi(0, "("); 2091 printi(0, " | "); 2092 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2093 printi(0, ")"); 2094 break; 2095 case ITM_EXPR_OR_R_INVD: /* varA | in[B] */ 2096 printi(0, "("); 2097 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2098 printi(0, " | "); 2099 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2100 printi(0, ")"); 2101 break; 2102 case ITM_EXPR_OR_INVD_E: /* in[A] | exprB */ 2103 printi(0, "("); 2104 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2105 printi(0, " | "); 2106 dump_expr(itm_hdr, expr->data.operand[1]); 2107 printi(0, ")"); 2108 break; 2109 case ITM_EXPR_OR_INVD_D: /* in[A] | B */ 2110 printi(0, "("); 2111 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2112 printi(0, " | "); 2113 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2114 printi(0, ")"); 2115 break; 2116 case ITM_EXPR_OR_INVD_R: /* in[A] | varB */ 2117 printi(0, "("); 2118 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2119 printi(0, " | "); 2120 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2121 printi(0, ")"); 2122 break; 2123 case ITM_EXPR_OR_INVD_INVD: /* in[A] | in[B] */ 2124 printi(0, "("); 2125 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2126 printi(0, " | "); 2127 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2128 printi(0, ")"); 2129 break; 2130 case ITM_EXPR_XOR: /* A ^ B */ 2131 printi(0, "("); 2132 dump_expr(itm_hdr, expr->data.operand[0]); 2133 printi(0, " ^ "); 2134 dump_expr(itm_hdr, expr->data.operand[1]); 2135 printi(0, ")"); 2136 break; 2137 case ITM_EXPR_XOR_E_D: /* exprA ^ B */ 2138 printi(0, "("); 2139 dump_expr(itm_hdr, expr->data.operand[0]); 2140 printi(0, " ^ "); 2141 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2142 printi(0, ")"); 2143 break; 2144 case ITM_EXPR_XOR_E_R: /* exprA ^ varB */ 2145 printi(0, "("); 2146 dump_expr(itm_hdr, expr->data.operand[0]); 2147 printi(0, " ^ "); 2148 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2149 printi(0, ")"); 2150 break; 2151 case ITM_EXPR_XOR_E_INVD: /* exprA ^ in[B] */ 2152 printi(0, "("); 2153 dump_expr(itm_hdr, expr->data.operand[0]); 2154 printi(0, " ^ "); 2155 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2156 printi(0, ")"); 2157 break; 2158 case ITM_EXPR_XOR_D_E: /* intA ^ exprB */ 2159 printi(0, "("); 2160 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2161 printi(0, " ^ "); 2162 dump_expr(itm_hdr, expr->data.operand[1]); 2163 printi(0, ")"); 2164 break; 2165 case ITM_EXPR_XOR_D_D: /* intA ^ B */ 2166 printi(0, "("); 2167 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2168 printi(0, " ^ "); 2169 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2170 printi(0, ")"); 2171 break; 2172 case ITM_EXPR_XOR_D_R: /* intA ^ varB */ 2173 printi(0, "("); 2174 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2175 printi(0, " ^ "); 2176 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2177 printi(0, ")"); 2178 break; 2179 case ITM_EXPR_XOR_D_INVD: /* intA ^ in[B] */ 2180 printi(0, "("); 2181 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2182 printi(0, " ^ "); 2183 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2184 printi(0, ")"); 2185 break; 2186 case ITM_EXPR_XOR_R_E: /* varA ^ exprB */ 2187 printi(0, "("); 2188 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2189 printi(0, " ^ "); 2190 dump_expr(itm_hdr, expr->data.operand[1]); 2191 printi(0, ")"); 2192 break; 2193 case ITM_EXPR_XOR_R_D: /* varA ^ B */ 2194 printi(0, "("); 2195 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2196 printi(0, " ^ "); 2197 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2198 printi(0, ")"); 2199 break; 2200 case ITM_EXPR_XOR_R_R: /* varA ^ varB */ 2201 printi(0, "("); 2202 printi(0, " ^ "); 2203 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2204 printi(0, ")"); 2205 break; 2206 case ITM_EXPR_XOR_R_INVD: /* varA ^ in[B] */ 2207 printi(0, "("); 2208 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2209 printi(0, " ^ "); 2210 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2211 printi(0, ")"); 2212 break; 2213 case ITM_EXPR_XOR_INVD_E: /* in[A] ^ exprB */ 2214 printi(0, "("); 2215 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2216 printi(0, " ^ "); 2217 dump_expr(itm_hdr, expr->data.operand[1]); 2218 printi(0, ")"); 2219 break; 2220 case ITM_EXPR_XOR_INVD_D: /* in[A] ^ B */ 2221 printi(0, "("); 2222 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2223 printi(0, " ^ "); 2224 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2225 printi(0, ")"); 2226 break; 2227 case ITM_EXPR_XOR_INVD_R: /* in[A] ^ varB */ 2228 printi(0, "("); 2229 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2230 printi(0, " ^ "); 2231 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2232 printi(0, ")"); 2233 break; 2234 case ITM_EXPR_XOR_INVD_INVD: /* in[A] ^ in[B] */ 2235 printi(0, "("); 2236 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2237 printi(0, " ^ "); 2238 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2239 printi(0, ")"); 2240 break; 2241 case ITM_EXPR_AND: /* A & B */ 2242 printi(0, "("); 2243 dump_expr(itm_hdr, expr->data.operand[0]); 2244 printi(0, " & "); 2245 dump_expr(itm_hdr, expr->data.operand[1]); 2246 printi(0, ")"); 2247 break; 2248 case ITM_EXPR_AND_E_D: /* exprA & B */ 2249 printi(0, "("); 2250 dump_expr(itm_hdr, expr->data.operand[0]); 2251 printi(0, " & "); 2252 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2253 printi(0, ")"); 2254 break; 2255 case ITM_EXPR_AND_E_R: /* exprA & varB */ 2256 printi(0, "("); 2257 dump_expr(itm_hdr, expr->data.operand[0]); 2258 printi(0, " & "); 2259 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2260 printi(0, ")"); 2261 break; 2262 case ITM_EXPR_AND_E_INVD: /* exprA & in[B] */ 2263 printi(0, "("); 2264 dump_expr(itm_hdr, expr->data.operand[0]); 2265 printi(0, " & "); 2266 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2267 printi(0, ")"); 2268 break; 2269 case ITM_EXPR_AND_D_E: /* intA & exprB */ 2270 printi(0, "("); 2271 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2272 printi(0, " & "); 2273 dump_expr(itm_hdr, expr->data.operand[1]); 2274 printi(0, ")"); 2275 break; 2276 case ITM_EXPR_AND_D_D: /* intA & B */ 2277 printi(0, "("); 2278 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2279 printi(0, " & "); 2280 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2281 printi(0, ")"); 2282 break; 2283 case ITM_EXPR_AND_D_R: /* intA & varB */ 2284 printi(0, "("); 2285 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2286 printi(0, " & "); 2287 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2288 printi(0, ")"); 2289 break; 2290 case ITM_EXPR_AND_D_INVD: /* intA & in[B] */ 2291 printi(0, "("); 2292 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2293 printi(0, " & "); 2294 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2295 printi(0, ")"); 2296 break; 2297 case ITM_EXPR_AND_R_E: /* varA & exprB */ 2298 printi(0, "("); 2299 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2300 printi(0, " & "); 2301 dump_expr(itm_hdr, expr->data.operand[1]); 2302 printi(0, ")"); 2303 break; 2304 case ITM_EXPR_AND_R_D: /* varA & B */ 2305 printi(0, "("); 2306 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2307 printi(0, " & "); 2308 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2309 printi(0, ")"); 2310 break; 2311 case ITM_EXPR_AND_R_R: /* varA & varB */ 2312 printi(0, "("); 2313 printi(0, " & "); 2314 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2315 printi(0, ")"); 2316 break; 2317 case ITM_EXPR_AND_R_INVD: /* varA & in[B] */ 2318 printi(0, "("); 2319 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2320 printi(0, " & "); 2321 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2322 printi(0, ")"); 2323 break; 2324 case ITM_EXPR_AND_INVD_E: /* in[A] & exprB */ 2325 printi(0, "("); 2326 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2327 printi(0, " & "); 2328 dump_expr(itm_hdr, expr->data.operand[1]); 2329 printi(0, ")"); 2330 break; 2331 case ITM_EXPR_AND_INVD_D: /* in[A] & B */ 2332 printi(0, "("); 2333 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2334 printi(0, " & "); 2335 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2336 printi(0, ")"); 2337 break; 2338 case ITM_EXPR_AND_INVD_R: /* in[A] & varB */ 2339 printi(0, "("); 2340 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2341 printi(0, " & "); 2342 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2343 printi(0, ")"); 2344 break; 2345 case ITM_EXPR_AND_INVD_INVD: /* in[A] & in[B] */ 2346 printi(0, "("); 2347 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2348 printi(0, " & "); 2349 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2350 printi(0, ")"); 2351 break; 2352 case ITM_EXPR_EQ: /* A == B */ 2353 printi(0, "("); 2354 dump_expr(itm_hdr, expr->data.operand[0]); 2355 printi(0, " == "); 2356 dump_expr(itm_hdr, expr->data.operand[1]); 2357 printi(0, ")"); 2358 break; 2359 case ITM_EXPR_EQ_E_D: /* exprA == B */ 2360 printi(0, "("); 2361 dump_expr(itm_hdr, expr->data.operand[0]); 2362 printi(0, " == "); 2363 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2364 printi(0, ")"); 2365 break; 2366 case ITM_EXPR_EQ_E_R: /* exprA == varB */ 2367 printi(0, "("); 2368 dump_expr(itm_hdr, expr->data.operand[0]); 2369 printi(0, " == "); 2370 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2371 printi(0, ")"); 2372 break; 2373 case ITM_EXPR_EQ_E_INVD: /* exprA == in[B] */ 2374 printi(0, "("); 2375 dump_expr(itm_hdr, expr->data.operand[0]); 2376 printi(0, " == "); 2377 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2378 printi(0, ")"); 2379 break; 2380 case ITM_EXPR_EQ_D_E: /* intA == exprB */ 2381 printi(0, "("); 2382 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2383 printi(0, " == "); 2384 dump_expr(itm_hdr, expr->data.operand[1]); 2385 printi(0, ")"); 2386 break; 2387 case ITM_EXPR_EQ_D_D: /* intA == B */ 2388 printi(0, "("); 2389 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2390 printi(0, " == "); 2391 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2392 printi(0, ")"); 2393 break; 2394 case ITM_EXPR_EQ_D_R: /* intA == varB */ 2395 printi(0, "("); 2396 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2397 printi(0, " == "); 2398 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2399 printi(0, ")"); 2400 break; 2401 case ITM_EXPR_EQ_D_INVD: /* intA == in[B] */ 2402 printi(0, "("); 2403 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2404 printi(0, " == "); 2405 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2406 printi(0, ")"); 2407 break; 2408 case ITM_EXPR_EQ_R_E: /* varA == exprB */ 2409 printi(0, "("); 2410 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2411 printi(0, " == "); 2412 dump_expr(itm_hdr, expr->data.operand[1]); 2413 printi(0, ")"); 2414 break; 2415 case ITM_EXPR_EQ_R_D: /* varA == B */ 2416 printi(0, "("); 2417 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2418 printi(0, " == "); 2419 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2420 printi(0, ")"); 2421 break; 2422 case ITM_EXPR_EQ_R_R: /* varA == varB */ 2423 printi(0, "("); 2424 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2425 printi(0, " == "); 2426 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2427 printi(0, ")"); 2428 break; 2429 case ITM_EXPR_EQ_R_INVD: /* varA == in[B] */ 2430 printi(0, "("); 2431 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2432 printi(0, " == "); 2433 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2434 printi(0, ")"); 2435 break; 2436 case ITM_EXPR_EQ_INVD_E: /* in[A] == exprB */ 2437 printi(0, "("); 2438 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2439 printi(0, " == "); 2440 dump_expr(itm_hdr, expr->data.operand[1]); 2441 printi(0, ")"); 2442 break; 2443 case ITM_EXPR_EQ_INVD_D: /* in[A] == B */ 2444 printi(0, "("); 2445 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2446 printi(0, " == "); 2447 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2448 printi(0, ")"); 2449 break; 2450 case ITM_EXPR_EQ_INVD_R: /* in[A] == varB */ 2451 printi(0, "("); 2452 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2453 printi(0, " == "); 2454 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2455 printi(0, ")"); 2456 break; 2457 case ITM_EXPR_EQ_INVD_INVD: /* in[A] == in[B] */ 2458 printi(0, "("); 2459 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2460 printi(0, " == "); 2461 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2462 printi(0, ")"); 2463 break; 2464 case ITM_EXPR_NE: /* A != B */ 2465 printi(0, "("); 2466 dump_expr(itm_hdr, expr->data.operand[0]); 2467 printi(0, " != "); 2468 dump_expr(itm_hdr, expr->data.operand[1]); 2469 printi(0, ")"); 2470 break; 2471 case ITM_EXPR_NE_E_D: /* exprA != B */ 2472 printi(0, "("); 2473 dump_expr(itm_hdr, expr->data.operand[0]); 2474 printi(0, " != "); 2475 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2476 printi(0, ")"); 2477 break; 2478 case ITM_EXPR_NE_E_R: /* exprA != varB */ 2479 printi(0, "("); 2480 dump_expr(itm_hdr, expr->data.operand[0]); 2481 printi(0, " != "); 2482 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2483 printi(0, ")"); 2484 break; 2485 case ITM_EXPR_NE_E_INVD: /* exprA != in[B] */ 2486 printi(0, "("); 2487 dump_expr(itm_hdr, expr->data.operand[0]); 2488 printi(0, " != "); 2489 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2490 printi(0, ")"); 2491 break; 2492 case ITM_EXPR_NE_D_E: /* intA != exprB */ 2493 printi(0, "("); 2494 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2495 printi(0, " != "); 2496 dump_expr(itm_hdr, expr->data.operand[1]); 2497 printi(0, ")"); 2498 break; 2499 case ITM_EXPR_NE_D_D: /* intA != B */ 2500 printi(0, "("); 2501 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2502 printi(0, " != "); 2503 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2504 printi(0, ")"); 2505 break; 2506 case ITM_EXPR_NE_D_R: /* intA != varB */ 2507 printi(0, "("); 2508 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2509 printi(0, " != "); 2510 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2511 printi(0, ")"); 2512 break; 2513 case ITM_EXPR_NE_D_INVD: /* intA != in[B] */ 2514 printi(0, "("); 2515 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2516 printi(0, " != "); 2517 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2518 printi(0, ")"); 2519 break; 2520 case ITM_EXPR_NE_R_E: /* varA != exprB */ 2521 printi(0, "("); 2522 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2523 printi(0, " != "); 2524 dump_expr(itm_hdr, expr->data.operand[1]); 2525 printi(0, ")"); 2526 break; 2527 case ITM_EXPR_NE_R_D: /* varA != B */ 2528 printi(0, "("); 2529 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2530 printi(0, " != "); 2531 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2532 printi(0, ")"); 2533 break; 2534 case ITM_EXPR_NE_R_R: /* varA != varB */ 2535 printi(0, "("); 2536 printi(0, " != "); 2537 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2538 printi(0, ")"); 2539 break; 2540 case ITM_EXPR_NE_R_INVD: /* varA != in[B] */ 2541 printi(0, "("); 2542 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2543 printi(0, " != "); 2544 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2545 printi(0, ")"); 2546 break; 2547 case ITM_EXPR_NE_INVD_E: /* in[A] != exprB */ 2548 printi(0, "("); 2549 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2550 printi(0, " != "); 2551 dump_expr(itm_hdr, expr->data.operand[1]); 2552 printi(0, ")"); 2553 break; 2554 case ITM_EXPR_NE_INVD_D: /* in[A] != B */ 2555 printi(0, "("); 2556 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2557 printi(0, " != "); 2558 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2559 printi(0, ")"); 2560 break; 2561 case ITM_EXPR_NE_INVD_R: /* in[A] != varB */ 2562 printi(0, "("); 2563 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2564 printi(0, " != "); 2565 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2566 printi(0, ")"); 2567 break; 2568 case ITM_EXPR_NE_INVD_INVD: /* in[A] != in[B] */ 2569 printi(0, "("); 2570 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2571 printi(0, " != "); 2572 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2573 printi(0, ")"); 2574 break; 2575 case ITM_EXPR_GT: /* A > B */ 2576 printi(0, "("); 2577 dump_expr(itm_hdr, expr->data.operand[0]); 2578 printi(0, " > "); 2579 dump_expr(itm_hdr, expr->data.operand[1]); 2580 printi(0, ")"); 2581 break; 2582 case ITM_EXPR_GT_E_D: /* exprA > B */ 2583 printi(0, "("); 2584 dump_expr(itm_hdr, expr->data.operand[0]); 2585 printi(0, " > "); 2586 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2587 printi(0, ")"); 2588 break; 2589 case ITM_EXPR_GT_E_R: /* exprA > varB */ 2590 printi(0, "("); 2591 dump_expr(itm_hdr, expr->data.operand[0]); 2592 printi(0, " > "); 2593 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2594 printi(0, ")"); 2595 break; 2596 case ITM_EXPR_GT_E_INVD: /* exprA > in[B] */ 2597 printi(0, "("); 2598 dump_expr(itm_hdr, expr->data.operand[0]); 2599 printi(0, " > "); 2600 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2601 printi(0, ")"); 2602 break; 2603 case ITM_EXPR_GT_D_E: /* intA > exprB */ 2604 printi(0, "("); 2605 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2606 printi(0, " > "); 2607 dump_expr(itm_hdr, expr->data.operand[1]); 2608 printi(0, ")"); 2609 break; 2610 case ITM_EXPR_GT_D_D: /* intA > B */ 2611 printi(0, "("); 2612 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2613 printi(0, " > "); 2614 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2615 printi(0, ")"); 2616 break; 2617 case ITM_EXPR_GT_D_R: /* intA > varB */ 2618 printi(0, "("); 2619 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2620 printi(0, " > "); 2621 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2622 printi(0, ")"); 2623 break; 2624 case ITM_EXPR_GT_D_INVD: /* intA > in[B] */ 2625 printi(0, "("); 2626 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2627 printi(0, " > "); 2628 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2629 printi(0, ")"); 2630 break; 2631 case ITM_EXPR_GT_R_E: /* varA > exprB */ 2632 printi(0, "("); 2633 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2634 printi(0, " > "); 2635 dump_expr(itm_hdr, expr->data.operand[1]); 2636 printi(0, ")"); 2637 break; 2638 case ITM_EXPR_GT_R_D: /* varA > B */ 2639 printi(0, "("); 2640 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2641 printi(0, " > "); 2642 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2643 printi(0, ")"); 2644 break; 2645 case ITM_EXPR_GT_R_R: /* varA > varB */ 2646 printi(0, "("); 2647 printi(0, " > "); 2648 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2649 printi(0, ")"); 2650 break; 2651 case ITM_EXPR_GT_R_INVD: /* varA > in[B] */ 2652 printi(0, "("); 2653 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2654 printi(0, " > "); 2655 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2656 printi(0, ")"); 2657 break; 2658 case ITM_EXPR_GT_INVD_E: /* in[A] > exprB */ 2659 printi(0, "("); 2660 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2661 printi(0, " > "); 2662 dump_expr(itm_hdr, expr->data.operand[1]); 2663 printi(0, ")"); 2664 break; 2665 case ITM_EXPR_GT_INVD_D: /* in[A] > B */ 2666 printi(0, "("); 2667 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2668 printi(0, " > "); 2669 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2670 printi(0, ")"); 2671 break; 2672 case ITM_EXPR_GT_INVD_R: /* in[A] > varB */ 2673 printi(0, "("); 2674 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2675 printi(0, " > "); 2676 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2677 printi(0, ")"); 2678 break; 2679 case ITM_EXPR_GT_INVD_INVD: /* in[A] > in[B] */ 2680 printi(0, "("); 2681 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2682 printi(0, " > "); 2683 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2684 printi(0, ")"); 2685 break; 2686 case ITM_EXPR_GE: /* A >= B */ 2687 printi(0, "("); 2688 dump_expr(itm_hdr, expr->data.operand[0]); 2689 printi(0, " >= "); 2690 dump_expr(itm_hdr, expr->data.operand[1]); 2691 printi(0, ")"); 2692 break; 2693 case ITM_EXPR_GE_E_D: /* exprA >= B */ 2694 printi(0, "("); 2695 dump_expr(itm_hdr, expr->data.operand[0]); 2696 printi(0, " >= "); 2697 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2698 printi(0, ")"); 2699 break; 2700 case ITM_EXPR_GE_E_R: /* exprA >= varB */ 2701 printi(0, "("); 2702 dump_expr(itm_hdr, expr->data.operand[0]); 2703 printi(0, " >= "); 2704 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2705 printi(0, ")"); 2706 break; 2707 case ITM_EXPR_GE_E_INVD: /* exprA >= in[B] */ 2708 printi(0, "("); 2709 dump_expr(itm_hdr, expr->data.operand[0]); 2710 printi(0, " >= "); 2711 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2712 printi(0, ")"); 2713 break; 2714 case ITM_EXPR_GE_D_E: /* intA >= exprB */ 2715 printi(0, "("); 2716 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2717 printi(0, " >= "); 2718 dump_expr(itm_hdr, expr->data.operand[1]); 2719 printi(0, ")"); 2720 break; 2721 case ITM_EXPR_GE_D_D: /* intA >= B */ 2722 printi(0, "("); 2723 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2724 printi(0, " >= "); 2725 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2726 printi(0, ")"); 2727 break; 2728 case ITM_EXPR_GE_D_R: /* intA >= varB */ 2729 printi(0, "("); 2730 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2731 printi(0, " >= "); 2732 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2733 printi(0, ")"); 2734 break; 2735 case ITM_EXPR_GE_D_INVD: /* intA >= in[B] */ 2736 printi(0, "("); 2737 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2738 printi(0, " >= "); 2739 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2740 printi(0, ")"); 2741 break; 2742 case ITM_EXPR_GE_R_E: /* varA >= exprB */ 2743 printi(0, "("); 2744 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2745 printi(0, " >= "); 2746 dump_expr(itm_hdr, expr->data.operand[1]); 2747 printi(0, ")"); 2748 break; 2749 case ITM_EXPR_GE_R_D: /* varA >= B */ 2750 printi(0, "("); 2751 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2752 printi(0, " >= "); 2753 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2754 printi(0, ")"); 2755 break; 2756 case ITM_EXPR_GE_R_R: /* varA >= varB */ 2757 printi(0, "("); 2758 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2759 printi(0, " >= "); 2760 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2761 printi(0, ")"); 2762 break; 2763 case ITM_EXPR_GE_R_INVD: /* varA >= in[B] */ 2764 printi(0, "("); 2765 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2766 printi(0, " >= "); 2767 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2768 printi(0, ")"); 2769 break; 2770 case ITM_EXPR_GE_INVD_E: /* in[A] >= exprB */ 2771 printi(0, "("); 2772 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2773 printi(0, " >= "); 2774 dump_expr(itm_hdr, expr->data.operand[1]); 2775 printi(0, ")"); 2776 break; 2777 case ITM_EXPR_GE_INVD_D: /* in[A] >= B */ 2778 printi(0, "("); 2779 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2780 printi(0, " >= "); 2781 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2782 printi(0, ")"); 2783 break; 2784 case ITM_EXPR_GE_INVD_R: /* in[A] >= varB */ 2785 printi(0, "("); 2786 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2787 printi(0, " >= "); 2788 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2789 printi(0, ")"); 2790 break; 2791 case ITM_EXPR_GE_INVD_INVD: /* in[A] >= in[B] */ 2792 printi(0, "("); 2793 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2794 printi(0, " >= "); 2795 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2796 printi(0, ")"); 2797 break; 2798 case ITM_EXPR_LT: /* A < B */ 2799 printi(0, "("); 2800 dump_expr(itm_hdr, expr->data.operand[0]); 2801 printi(0, " < "); 2802 dump_expr(itm_hdr, expr->data.operand[1]); 2803 printi(0, ")"); 2804 break; 2805 case ITM_EXPR_LT_E_D: /* exprA < B */ 2806 printi(0, "("); 2807 dump_expr(itm_hdr, expr->data.operand[0]); 2808 printi(0, " < "); 2809 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2810 printi(0, ")"); 2811 break; 2812 case ITM_EXPR_LT_E_R: /* exprA < varB */ 2813 printi(0, "("); 2814 dump_expr(itm_hdr, expr->data.operand[0]); 2815 printi(0, " < "); 2816 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2817 printi(0, ")"); 2818 break; 2819 case ITM_EXPR_LT_E_INVD: /* exprA < in[B] */ 2820 printi(0, "("); 2821 dump_expr(itm_hdr, expr->data.operand[0]); 2822 printi(0, " < "); 2823 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2824 printi(0, ")"); 2825 break; 2826 case ITM_EXPR_LT_D_E: /* intA < exprB */ 2827 printi(0, "("); 2828 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2829 printi(0, " < "); 2830 dump_expr(itm_hdr, expr->data.operand[1]); 2831 printi(0, ")"); 2832 break; 2833 case ITM_EXPR_LT_D_D: /* intA < B */ 2834 printi(0, "("); 2835 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2836 printi(0, " < "); 2837 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2838 printi(0, ")"); 2839 break; 2840 case ITM_EXPR_LT_D_R: /* intA < varB */ 2841 printi(0, "("); 2842 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2843 printi(0, " < "); 2844 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2845 printi(0, ")"); 2846 break; 2847 case ITM_EXPR_LT_D_INVD: /* intA < in[B] */ 2848 printi(0, "("); 2849 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2850 printi(0, " < "); 2851 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2852 printi(0, ")"); 2853 break; 2854 case ITM_EXPR_LT_R_E: /* varA < exprB */ 2855 printi(0, "("); 2856 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2857 printi(0, " < "); 2858 dump_expr(itm_hdr, expr->data.operand[1]); 2859 printi(0, ")"); 2860 break; 2861 case ITM_EXPR_LT_R_D: /* varA < B */ 2862 printi(0, "("); 2863 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2864 printi(0, " < "); 2865 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2866 printi(0, ")"); 2867 break; 2868 case ITM_EXPR_LT_R_R: /* varA < varB */ 2869 printi(0, "("); 2870 printi(0, " < "); 2871 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2872 printi(0, ")"); 2873 break; 2874 case ITM_EXPR_LT_R_INVD: /* varA < in[B] */ 2875 printi(0, "("); 2876 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2877 printi(0, " < "); 2878 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2879 printi(0, ")"); 2880 break; 2881 case ITM_EXPR_LT_INVD_E: /* in[A] < exprB */ 2882 printi(0, "("); 2883 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2884 printi(0, " < "); 2885 dump_expr(itm_hdr, expr->data.operand[1]); 2886 printi(0, ")"); 2887 break; 2888 case ITM_EXPR_LT_INVD_D: /* in[A] < B */ 2889 printi(0, "("); 2890 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2891 printi(0, " < "); 2892 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2893 printi(0, ")"); 2894 break; 2895 case ITM_EXPR_LT_INVD_R: /* in[A] < varB */ 2896 printi(0, "("); 2897 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2898 printi(0, " < "); 2899 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2900 printi(0, ")"); 2901 break; 2902 case ITM_EXPR_LT_INVD_INVD: /* in[A] < in[B] */ 2903 printi(0, "("); 2904 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2905 printi(0, " < "); 2906 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2907 printi(0, ")"); 2908 break; 2909 case ITM_EXPR_LE: /* A <= B */ 2910 printi(0, "("); 2911 dump_expr(itm_hdr, expr->data.operand[0]); 2912 printi(0, " <= "); 2913 dump_expr(itm_hdr, expr->data.operand[1]); 2914 printi(0, ")"); 2915 break; 2916 case ITM_EXPR_LE_E_D: /* exprA <= B */ 2917 printi(0, "("); 2918 dump_expr(itm_hdr, expr->data.operand[0]); 2919 printi(0, " <= "); 2920 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2921 printi(0, ")"); 2922 break; 2923 case ITM_EXPR_LE_E_R: /* exprA <= varB */ 2924 printi(0, "("); 2925 dump_expr(itm_hdr, expr->data.operand[0]); 2926 printi(0, " <= "); 2927 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2928 printi(0, ")"); 2929 break; 2930 case ITM_EXPR_LE_E_INVD: /* exprA <= in[B] */ 2931 printi(0, "("); 2932 dump_expr(itm_hdr, expr->data.operand[0]); 2933 printi(0, " <= "); 2934 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2935 printi(0, ")"); 2936 break; 2937 case ITM_EXPR_LE_D_E: /* intA <= exprB */ 2938 printi(0, "("); 2939 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2940 printi(0, " <= "); 2941 dump_expr(itm_hdr, expr->data.operand[1]); 2942 printi(0, ")"); 2943 break; 2944 case ITM_EXPR_LE_D_D: /* intA <= B */ 2945 printi(0, "("); 2946 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2947 printi(0, " <= "); 2948 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2949 printi(0, ")"); 2950 break; 2951 case ITM_EXPR_LE_D_R: /* intA <= varB */ 2952 printi(0, "("); 2953 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2954 printi(0, " <= "); 2955 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 2956 printi(0, ")"); 2957 break; 2958 case ITM_EXPR_LE_D_INVD: /* intA <= in[B] */ 2959 printi(0, "("); 2960 printi(0, "%ld", expr->data.operand[0].itm_ptr); 2961 printi(0, " <= "); 2962 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2963 printi(0, ")"); 2964 break; 2965 case ITM_EXPR_LE_R_E: /* varA <= exprB */ 2966 printi(0, "("); 2967 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2968 printi(0, " <= "); 2969 dump_expr(itm_hdr, expr->data.operand[1]); 2970 printi(0, ")"); 2971 break; 2972 case ITM_EXPR_LE_R_D: /* varA <= B */ 2973 printi(0, "("); 2974 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2975 printi(0, " <= "); 2976 printi(0, "%ld", expr->data.operand[1].itm_ptr); 2977 printi(0, ")"); 2978 break; 2979 case ITM_EXPR_LE_R_R: /* varA <= varB */ 2980 printi(0, "("); 2981 printi(0, " <= "); 2982 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2983 printi(0, ")"); 2984 break; 2985 case ITM_EXPR_LE_R_INVD: /* varA <= in[B] */ 2986 printi(0, "("); 2987 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0])); 2988 printi(0, " <= "); 2989 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 2990 printi(0, ")"); 2991 break; 2992 case ITM_EXPR_LE_INVD_E: /* in[A] <= exprB */ 2993 printi(0, "("); 2994 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 2995 printi(0, " <= "); 2996 dump_expr(itm_hdr, expr->data.operand[1]); 2997 printi(0, ")"); 2998 break; 2999 case ITM_EXPR_LE_INVD_D: /* in[A] <= B */ 3000 printi(0, "("); 3001 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 3002 printi(0, " <= "); 3003 printi(0, "%ld", expr->data.operand[1].itm_ptr); 3004 printi(0, ")"); 3005 break; 3006 case ITM_EXPR_LE_INVD_R: /* in[A] <= varB */ 3007 printi(0, "("); 3008 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 3009 printi(0, " <= "); 3010 printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1])); 3011 printi(0, ")"); 3012 break; 3013 case ITM_EXPR_LE_INVD_INVD: /* in[A] <= in[B] */ 3014 printi(0, "("); 3015 printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr); 3016 printi(0, " <= "); 3017 printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr); 3018 printi(0, ")"); 3019 break; 3020 case ITM_EXPR_NOT: /* !A */ 3021 printi(0, "("); 3022 printi(0, "!"); 3023 dump_expr(itm_hdr, expr->data.operand[0]); 3024 printi(0, ")"); 3025 break; 3026 case ITM_EXPR_NEG: /* ~A */ 3027 printi(0, "("); 3028 printi(0, " ~"); 3029 dump_expr(itm_hdr, expr->data.operand[0]); 3030 printi(0, ")"); 3031 break; 3032 case ITM_EXPR_LOR: /* A || B */ 3033 printi(0, "("); 3034 dump_expr(itm_hdr, expr->data.operand[0]); 3035 printi(0, " || "); 3036 dump_expr(itm_hdr, expr->data.operand[1]); 3037 printi(0, ")"); 3038 break; 3039 case ITM_EXPR_LAND: /* A && B */ 3040 printi(0, "("); 3041 dump_expr(itm_hdr, expr->data.operand[0]); 3042 printi(0, " && "); 3043 dump_expr(itm_hdr, expr->data.operand[1]); 3044 printi(0, ")"); 3045 break; 3046 case ITM_EXPR_ASSIGN: /* A = B */ 3047 printi(0, "%s = ", reg_name(itm_hdr, expr->data.operand[0])); 3048 dump_expr(itm_hdr, expr->data.operand[1]); 3049 break; 3050 case ITM_EXPR_IN_EQ: /* in == A */ 3051 printi(0, "(" RNPREF "in == ", 0); 3052 dump_expr(itm_hdr, expr->data.operand[0]); 3053 printi(0, ")"); 3054 break; 3055 default: 3056 break; 3057 } 3058 } 3059 3060 3061 /* 3062 * Dump range (between) 3063 */ 3064 static void 3065 dump_range(itm_hdr_t *itm_hdr, itm_place_t range_place) 3066 { 3067 itm_tbl_hdr_t *rth; 3068 itm_range_hdr_t *rtsh; 3069 unsigned char *p; 3070 long i; 3071 long j; 3072 3073 rth = (itm_tbl_hdr_t *)(ADDR(range_place)); 3074 rtsh = (itm_range_hdr_t *)(rth + 1); 3075 p = (unsigned char *)(rtsh + 1); 3076 3077 TRACE_MESSAGE('p', ("(&)between=%ld ", range_place.itm_ptr)); 3078 printi(0, RNPREF "between "); 3079 for (i = 0; i < rth->number; i++) { 3080 if (0 != i) printi(0, "\t "); 3081 printi(0, "0x"); 3082 for (j = 0; j < rtsh->len; j++) { 3083 printi(0, "%02x", *(p++)); 3084 } 3085 printi(0, " - "); 3086 printi(0, "0x"); 3087 for (j = 0; j < rtsh->len; j++) { 3088 printi(0, "%02x", *(p++)); 3089 } 3090 if (i < (rth->number - 1)) { 3091 printi(0, ",\n"); 3092 } else { 3093 printi(0, ";\n"); 3094 } 3095 } 3096 } 3097 3098 3099 /* 3100 * Dump escape sequence 3101 */ 3102 static void 3103 dump_escapeseq(itm_hdr_t *itm_hdr, itm_place_t escapeseq_place) 3104 { 3105 itm_tbl_hdr_t *eth; 3106 itm_escapeseq_hdr_t *eh; 3107 itm_data_t *d; 3108 itm_data_t data; 3109 3110 long i; 3111 3112 3113 eth = (itm_tbl_hdr_t *)(ADDR(escapeseq_place)); 3114 eh = (itm_escapeseq_hdr_t *)(eth + 1); 3115 d = (itm_data_t *)(eh + 1); 3116 TRACE_MESSAGE('p', ("(&)escseq=%ld ", escapeseq_place.itm_ptr)); 3117 printi(1, RNPREF "escapceseq {"); 3118 3119 for (i = 0; i < eth->number; i++, d++) { 3120 if (0 != i) printi(0, " "); 3121 data = *d; 3122 if ((sizeof (itm_place_t)) < data.size) { 3123 data.place.itm_ptr = (itm_place2_t)ADDR(d->place); 3124 } 3125 printi(0, "0x%s;", data_to_hexadecimal(&data)); 3126 } 3127 printi(-1, "}\n"); 3128 } 3129 3130 3131 static void 3132 printi(int c, char *format, ...) 3133 { 3134 static int indent_level; 3135 static int new_line = 1; 3136 int i; 3137 va_list ap; 3138 va_start(ap, format); 3139 3140 if (c < 0) { 3141 indent_level += c; 3142 if (indent_level < 0) { 3143 indent_level = 0; 3144 } 3145 } 3146 if (new_line) { 3147 for (i = indent_level; 0 < i; i -= 1) { 3148 (void) putchar('\t'); 3149 } 3150 } 3151 if (0 < c) { 3152 indent_level += c; 3153 if (indent_level < 0) { 3154 indent_level = 0; 3155 } 3156 } 3157 3158 if (NULL == strchr(format, '\n')) { 3159 new_line = 0; 3160 } else { 3161 new_line = 1; 3162 } 3163 3164 (void) vfprintf(stdout, format, ap); 3165 3166 va_end(ap); 3167 } 3168 3169 3170 static char * 3171 name_place_to_str(itm_hdr_t *itm_hdr, itm_place2_t place) 3172 { 3173 itm_data_t d; 3174 3175 if (0 != place) { 3176 d = *((itm_data_t *)ADDR2(place)); 3177 if ((sizeof (itm_place_t)) < d.size) { 3178 d.place.itm_ptr = (itm_place2_t)ADDR(d.place); 3179 } 3180 } else { 3181 d.size = 0; 3182 d.place.itm_ptr = 0; 3183 } 3184 return (name_to_str(&d)); 3185 } 3186 3187 static char * 3188 tbl_name(itm_hdr_t *itm_hdr, itm_tbl_hdr_t *tbl_hdr) 3189 { 3190 if (ITM_TBL_OP_INIT == tbl_hdr->type) { 3191 return (RNPREF "init"); 3192 } else if (ITM_TBL_OP_RESET == tbl_hdr->type) { 3193 return (RNPREF "reset"); 3194 } else if (tbl_hdr->name.itm_ptr) { 3195 return (name_place_to_str(itm_hdr, tbl_hdr->name.itm_ptr)); 3196 } else { 3197 return (NULL); 3198 } 3199 } 3200 3201 3202 static char * 3203 reg_name(itm_hdr_t *itm_hdr, itm_place_t op) 3204 { 3205 itm_info_hdr_t *info_hdr; 3206 static char sbuf[32]; 3207 itm_num_t reg_num; 3208 3209 reg_num = (itm_num_t)(op.itm_ptr); 3210 if (0 == itm_hdr->info_hdr.itm_ptr) { 3211 (void) sprintf(sbuf, "reg%ld\n", reg_num); 3212 return (sbuf); 3213 } else { 3214 info_hdr = INFO_HDR(itm_hdr); 3215 return (name_place_to_str( 3216 itm_hdr, 3217 info_hdr->reg_plc_tbl.place.itm_ptr + 3218 (reg_num *sizeof (itm_data_t)))); 3219 } 3220 } 3221 3222 static itm_hdr_t * 3223 itm_attach(const char *itm_file) 3224 { 3225 itm_hdr_t *itm_hdr; 3226 struct stat st; 3227 int fd; 3228 3229 fd = open(itm_file, O_RDONLY, 0); 3230 if (fd == -1) { 3231 PERROR(gettext("open()")); 3232 return (NULL); 3233 } 3234 3235 if (fstat(fd, &st) == -1) { 3236 PERROR(gettext("fstat()")); 3237 return (NULL); 3238 } 3239 itm_hdr = (void *) mmap(NULL, st.st_size, 3240 PROT_READ, MAP_SHARED, fd, 0); 3241 if (MAP_FAILED == itm_hdr) { 3242 PERROR(gettext("mmap()")); 3243 return (NULL); 3244 } 3245 3246 (void) close(fd); 3247 3248 if ((itm_hdr->ident[0] != ITM_IDENT_0) || 3249 (itm_hdr->ident[1] != ITM_IDENT_1) || 3250 (itm_hdr->ident[2] != ITM_IDENT_2) || 3251 (itm_hdr->ident[3] != ITM_IDENT_3)) { 3252 itm_error(gettext("magic number error\n")); 3253 return (NULL); 3254 } 3255 if ((itm_hdr->version[0] != ITM_VER_0) || 3256 (itm_hdr->version[1] != ITM_VER_1) || 3257 (itm_hdr->version[2] != ITM_VER_2) || 3258 #if defined(_LITTLE_ENDIAN) 3259 #if defined(_LP64) 3260 ((itm_hdr->spec[3] != ITM_SPEC_3_32_LITTLE_ENDIAN) && 3261 (itm_hdr->spec[3] != ITM_SPEC_3_64_LITTLE_ENDIAN))) { 3262 #else 3263 (itm_hdr->spec[3] != ITM_SPEC_3_32_LITTLE_ENDIAN)) { 3264 #endif 3265 #else 3266 #if defined(_LP64) 3267 ((itm_hdr->spec[3] != ITM_SPEC_3_32_BIG_ENDIAN) && 3268 (itm_hdr->spec[3] != ITM_SPEC_3_64_BIG_ENDIAN))) { 3269 #else 3270 (itm_hdr->spec[3] != ITM_SPEC_3_32_BIG_ENDIAN)) { 3271 #endif 3272 #endif 3273 itm_error(gettext("version number error\n")); 3274 return (NULL); 3275 } 3276 if (itm_hdr->itm_size.itm_ptr != st.st_size) { 3277 itm_error(gettext( 3278 "size error: expected=%1$d current=%2$d\n"), 3279 (size_t)(itm_hdr->itm_size.itm_ptr), st.st_size); 3280 return (NULL); 3281 } 3282 3283 return (itm_hdr); 3284 } 3285