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