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
disassemble(char * file)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
dump_itm_header(itm_hdr_t * itm_header,itm_info_hdr_t * info_header)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
dump_tables(itm_hdr_t * itm_hdr,itm_info_hdr_t * info_hdr)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
dump_direc_tbl(itm_hdr_t * itm_hdr,itm_place_t direc_place)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
dump_map(itm_hdr_t * itm_hdr,itm_place_t map_place,int standalone)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
dump_map_i_f(itm_hdr_t * itm_hdr,itm_place_t map_place,int standalone)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
dump_map_l_f(itm_hdr_t * itm_hdr,itm_place_t map_place,int standalone)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
dump_map_hash(itm_hdr_t * itm_hdr,itm_place_t map_place,int standalone)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
dump_map_dense_enc(itm_hdr_t * itm_hdr,itm_place_t map_place,int standalone)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
dump_cond_tbl(itm_hdr_t * itm_hdr,itm_place_t cond_place,int standalone)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
dump_op_tbl(itm_hdr_t * itm_hdr,itm_place_t op_tbl_place,int standalone)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
dump_op(itm_hdr_t * itm_hdr,itm_place2_t op_place)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
dump_expr(itm_hdr_t * itm_hdr,itm_place_t expr_place)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
dump_range(itm_hdr_t * itm_hdr,itm_place_t range_place)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
dump_escapeseq(itm_hdr_t * itm_hdr,itm_place_t escapeseq_place)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
printi(int c,char * format,...)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 *
name_place_to_str(itm_hdr_t * itm_hdr,itm_place2_t place)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 *
tbl_name(itm_hdr_t * itm_hdr,itm_tbl_hdr_t * tbl_hdr)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 *
reg_name(itm_hdr_t * itm_hdr,itm_place_t op)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 *
itm_attach(const char * itm_file)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