root/usr/src/cmd/geniconvtbl/disassemble.c
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 1999 by Sun Microsystems, Inc.
 * All rights reserved.
 */

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <fcntl.h>
#include <unistd.h>
#include <libintl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <errno.h>
#include <stdarg.h>
#include <string.h>

#include "iconv_tm.h"
#include "itm_util.h"

/*
 * function prototype
 */

static itm_hdr_t        *itm_attach(const char *);
static void     dump_tables(itm_hdr_t *, itm_info_hdr_t *);
static void     dump_direc_tbl(itm_hdr_t *, itm_place_t);
static void     dump_map(itm_hdr_t *, itm_place_t, int);
static void     dump_map_i_f(itm_hdr_t *, itm_place_t, int);
static void     dump_map_l_f(itm_hdr_t *, itm_place_t, int);
static void     dump_map_hash(itm_hdr_t *, itm_place_t, int);
static void     dump_map_dense_enc(itm_hdr_t *, itm_place_t, int);
static void     dump_cond_tbl(itm_hdr_t *, itm_place_t, int);
static void     dump_op_tbl(itm_hdr_t *, itm_place_t, int);
static void     dump_op(itm_hdr_t *, itm_place2_t);
static void     dump_expr(itm_hdr_t *, itm_place_t);
static void     dump_range(itm_hdr_t *, itm_place_t);
static void     dump_escapeseq(itm_hdr_t *, itm_place_t);

static char     *tbl_name(itm_hdr_t *, itm_tbl_hdr_t *);
static char     *reg_name(itm_hdr_t     *itm_hdr, itm_place_t op);

static void     printi(int, char *, ...);


/*
 * macro definition
 */

#define ADDR(place)     ((void *)(((char *)(itm_hdr)) + \
                        ((itm_place2_t)((place).itm_ptr))))
#define DADDR(n)        (((n)->size <= (sizeof ((n)->place))) ? \
                                ((char *)(&((n)->place))) :\
                                ((char *)(ADDR((n)->place))))
#define ADDR2(place2)   ((void *)(((char *)(itm_hdr)) + \
                        ((itm_place2_t)(place2))))
#define INFO_HDR(pa)    ((void *)(((char *)pa) + \
                        ((itm_hdr_t *)(pa))->info_hdr.itm_ptr))


#if defined(RESERVED_NAME_PREFIX)
#define RNPREF          RESERVED_NAME_PREFIX
#else /* !defined(RESERVED_NAME_PREFIX) */
#define RNPREF          /* null strings */
#endif /* !defined(RESERVED_NAME_PREFIX) */


void
disassemble(char        *file)
{
        itm_hdr_t       *itm_hdr;
        itm_info_hdr_t  *info_hdr;
        itm_data_t      type_id;

        TRACE_MESSAGE('d', ("disassemble %s\n", file));

        itm_hdr = itm_attach(file);

        if (NULL == itm_hdr) {
                exit(3);
        }

        if (0 == itm_hdr->info_hdr.itm_ptr) {
                itm_error(gettext("binarytable is stripped\n"));
                exit(4);
        }

        if (0 == itm_hdr->info_hdr.itm_ptr) {
                info_hdr = malloc_vital(sizeof (itm_info_hdr_t));
                (void) memset(info_hdr, 0, sizeof (itm_info_hdr_t));
        } else {
                info_hdr = INFO_HDR(itm_hdr);
        }

#if defined(ENABLE_TRACE)
        dump_itm_header(itm_hdr, info_hdr);
#endif
        printi(0, "//\n", file);
        printi(0, "// %s\n", file);
        printi(0, "//\n", file);

        type_id = itm_hdr->type_id;
        if ((NULL != cmd_opt.disassemble) &&
            ((sizeof (itm_place_t)) < type_id.size)) {
                type_id.place.itm_ptr += (itm_place2_t)itm_hdr;
        }
        printi(1, "%s {\n", name_to_str(&type_id));
        dump_tables(itm_hdr, info_hdr);
        printi(-1, "}\n");
}

#if defined(ENABLE_TRACE)
void
dump_itm_header(itm_hdr_t       *itm_header, itm_info_hdr_t     *info_header)
{
        char    *str_type_id;
        char    *str_interpreter;

        itm_data_t      type_id;
        itm_data_t      interpreter;

        type_id = itm_header->type_id;
        str_type_id = malloc_vital(itm_header->type_id.size + 1);
        if ((NULL != cmd_opt.disassemble) &&
            ((sizeof (itm_place_t)) < type_id.size)) {
                type_id.place.itm_ptr += (itm_place2_t)itm_header;
        }
        (void) memcpy(str_type_id, name_to_str(&type_id), type_id.size + 1);

        interpreter = itm_header->interpreter;
        str_interpreter = malloc_vital(itm_header->interpreter.size + 1);
        if ((NULL != cmd_opt.disassemble) &&
            ((sizeof (itm_place_t)) < interpreter.size)) {
                interpreter.place.itm_ptr += (itm_place2_t)itm_header;
        }
        (void) memcpy(str_interpreter, name_to_str(&interpreter),
                interpreter.size + 1);

        TRACE_MESSAGE('D',
                        ("\n"
                        "------\n"
                        "Sizeof Data Structures \n"
                        " sizeof(int)               = %ld\n"
                        " sizeof(long)              = %ld\n"
                        " sizeof(uintptr_t)         = %ld\n"
                        " sizeof(struct itm_place_t)  = %ld\n"
                        " sizeof(struct itm_data_t)   = %ld\n"
                        " sizeof(struct itm_hdr_t)    = %ld\n"
                        " sizeof(struct itm_place_tbl_info_t)  = %ld\n"
                        " sizeof(struct itm_section_info_t)    = %ld\n"
                        " sizeof(struct itm_action_type_t)     = %ld\n"
                        " sizeof(struct itm_direct_t)   = %ld\n"
                        " sizeof(struct itm_cond_t)     = %ld\n"
                        " sizeof(struct itm_range_hdr_t)       = %ld\n"
                        " sizeof(struct itm_escapeseq_hdr_t)   = %ld\n"
                        " sizeof(struct itm_map_idx_fix_hdr_t) = %ld\n"
                        " sizeof(struct itm_map_lookup_hdr_t)  = %ld\n"
                        " sizeof(struct itm_map_hash_hdr_t)    = %ld\n"
                        " sizeof(struct itm_map_dense_enc_hdr_t) = %ld\n"
                        " sizeof(struct itm_expr_t)   = %ld\n"
                        " sizeof(enum itm_op_type_t)  = %ld\n"
                        " sizeof(struct itm_op_t)     u= %ld\n"
                        " sizeof(enum itm_expr_type_t)= %ld\n"
                        "\n",

                        sizeof (int),
                        sizeof (long),
                        sizeof (uintptr_t),
                        sizeof (itm_place_t),
                        sizeof (itm_data_t),
                        sizeof (itm_hdr_t),
                        sizeof (itm_place_tbl_info_t),
                        sizeof (itm_section_info_t),
                        sizeof (itm_action_type_t),
                        sizeof (itm_direc_t),
                        sizeof (itm_cond_t),
                        sizeof (itm_range_hdr_t),
                        sizeof (itm_escapeseq_hdr_t),
                        sizeof (itm_map_idx_fix_hdr_t),
                        sizeof (itm_map_lookup_hdr_t),
                        sizeof (itm_map_hash_hdr_t),
                        sizeof (itm_map_dense_enc_hdr_t),
                        sizeof (itm_expr_t),
                        sizeof (itm_op_type_t),
                        sizeof (itm_op_t),
                        sizeof (itm_expr_type_t)));

        TRACE_MESSAGE('H',
                        ("ident         = %c%c%c\n"
                        "spec           = %02x%02x%02x%02x\n"
                        "version        = %02x%02x%02x%02x\n"
                        "itm_size       = %ld\n"
                        "type_id        = %s\n"
                        "interpreter    = %s\n"
                        "op_init_tbl    = %ld\n"
                        "op_reset_tbl   = %ld\n"
                        "direc_init_tbl = %ld\n"
                        "reg_num        = %ld\n"
                        "itm_hdr_size   = %ld\n"
                        "info_hdr       = %ld\n"
                        "info_hdr_size  = %ld\n",

                        itm_header->ident[0],
                        itm_header->ident[1],
                        itm_header->ident[2],
                        /* itm_header->ident[3], */
                        itm_header->spec[0],
                        itm_header->spec[1],
                        itm_header->spec[2],
                        itm_header->spec[3],
                        itm_header->version[0],
                        itm_header->version[1],
                        itm_header->version[2],
                        itm_header->version[3],
                        itm_header->itm_size.itm_ptr,
                        str_type_id,
                        str_interpreter,
                        itm_header->op_init_tbl.itm_ptr,
                        itm_header->op_reset_tbl.itm_ptr,
                        itm_header->direc_init_tbl.itm_ptr,
                        itm_header->reg_num,
                        itm_header->itm_hdr_size,
                        itm_header->info_hdr.itm_ptr,
                        (sizeof (itm_info_hdr_t))));

        TRACE_MESSAGE('H',
                        ("  str_sec     = (%4ld %4ld %4ld)      "
                        "  str_plc_tbl = (%4ld %4ld %4ld)\n"
                        "direc_sec_tbl = (%4ld %4ld %4ld)       "
                        "direc_plc_tbl = (%4ld %4ld %4ld)\n"
                        " cond_sec_tbl = (%4ld %4ld %4ld)       "
                        " cond_plc_tbl = (%4ld %4ld %4ld)\n"
                        "  map_sec_tbl = (%4ld %4ld %4ld)       "
                        "  map_plc_tbl = (%4ld %4ld %4ld)\n"
                        "   op_sec_tbl = (%4ld %4ld %4ld)       "
                        "   op_plc_tbl = (%4ld %4ld %4ld)\n"
                        "range_sec_tbl = (%4ld %4ld %4ld)       "
                        "range_plc_tbl = (%4ld %4ld %4ld)\n"
                        "escsq_sec_tbl = (%4ld %4ld %4ld)       "
                        "escsq_plc_tbl = (%4ld %4ld %4ld)\n"
                        " data_sec     = (%4ld %4ld %4ld)       "
                        " data_plc_tbl = (%4ld %4ld %4ld)\n"
                        " name_sec     = (%4ld %4ld %4ld)       "
                        " name_plc_tbl = (%4ld %4ld %4ld)\n"
                        "                                       "
                        "  reg_plc_tbl = (%4ld %4ld %4ld)\n"
                        "%s\n",
                        info_header->str_sec.place.itm_ptr,
                        info_header->str_sec.size,
                        info_header->str_sec.number,
                        info_header->str_plc_tbl.place.itm_ptr,
                        info_header->str_plc_tbl.size,
                        info_header->str_plc_tbl.number,
                        info_header->direc_tbl_sec.place.itm_ptr,
                        info_header->direc_tbl_sec.size,
                        info_header->direc_tbl_sec.number,
                        info_header->direc_plc_tbl.place.itm_ptr,
                        info_header->direc_plc_tbl.size,
                        info_header->direc_plc_tbl.number,
                        info_header->cond_tbl_sec.place.itm_ptr,
                        info_header->cond_tbl_sec.size,
                        info_header->cond_tbl_sec.number,
                        info_header->cond_plc_tbl.place.itm_ptr,
                        info_header->cond_plc_tbl.size,
                        info_header->cond_plc_tbl.number,
                        info_header->map_tbl_sec.place.itm_ptr,
                        info_header->map_tbl_sec.size,
                        info_header->map_tbl_sec.number,
                        info_header->map_plc_tbl.place.itm_ptr,
                        info_header->map_plc_tbl.size,
                        info_header->map_plc_tbl.number,
                        info_header->op_tbl_sec.place.itm_ptr,
                        info_header->op_tbl_sec.size,
                        info_header->op_tbl_sec.number,
                        info_header->op_plc_tbl.place.itm_ptr,
                        info_header->op_plc_tbl.size,
                        info_header->op_plc_tbl.number,
                        info_header->range_tbl_sec.place.itm_ptr,
                        info_header->range_tbl_sec.size,
                        info_header->range_tbl_sec.number,
                        info_header->range_plc_tbl.place.itm_ptr,
                        info_header->range_plc_tbl.size,
                        info_header->range_plc_tbl.number,
                        info_header->escapeseq_tbl_sec.place.itm_ptr,
                        info_header->escapeseq_tbl_sec.size,
                        info_header->escapeseq_tbl_sec.number,
                        info_header->escapeseq_plc_tbl.place.itm_ptr,
                        info_header->escapeseq_plc_tbl.size,
                        info_header->escapeseq_plc_tbl.number,
                        info_header->data_sec.place.itm_ptr,
                        info_header->data_sec.size,
                        info_header->data_sec.number,
                        info_header->data_plc_tbl.place.itm_ptr,
                        info_header->data_plc_tbl.size,
                        info_header->data_plc_tbl.number,
                        info_header->name_sec.place.itm_ptr,
                        info_header->name_sec.size,
                        info_header->name_sec.number,
                        info_header->name_plc_tbl.place.itm_ptr,
                        info_header->name_plc_tbl.size,
                        info_header->name_plc_tbl.number,
                        info_header->reg_plc_tbl.place.itm_ptr,
                        info_header->reg_plc_tbl.size,
                        info_header->reg_plc_tbl.number,
                        "--------"));
}
#endif

/*
 * Dump tables
 */
static void
dump_tables(itm_hdr_t   *itm_hdr, itm_info_hdr_t        *info_hdr)
{
        itm_num_t       n;
        itm_data_t      *data;
        itm_place_t     *place;
        itm_place2_t    place2;
        itm_data_t      d;

        data = (itm_data_t *)(ADDR(info_hdr->reg_plc_tbl.place));
        for (n = 0; n < info_hdr->reg_plc_tbl.number; n++, data += 1) {
                d = *(data);
                if ((sizeof (itm_place_t)) < d.size) {
                        d.place.itm_ptr = (itm_place2_t)ADDR(d.place);
                }
                printi(0, "// register: %s\n", name_to_str(&d));
        }

        data = (itm_data_t *)(ADDR(info_hdr->name_plc_tbl.place));
        for (n = 0, place2 = info_hdr->name_plc_tbl.place.itm_ptr;
            n < info_hdr->name_plc_tbl.number;
            n++, data += 1, place2 += sizeof (itm_data_t)) {
                d = *(data);

                if ((sizeof (itm_place_t)) < d.size) {
                        d.place.itm_ptr = (itm_place2_t)ADDR(d.place);
                }
                TRACE_MESSAGE('p', ("(*)name=%ld",
                                ((sizeof (itm_place_t)) < d.size) ?
                                d.place.itm_ptr:
                                (place2 + offsetof(itm_data_t, place))));
                printi(0, "// name: %s\n", name_to_str(&d));

        }

        place = (itm_place_t *)(ADDR(info_hdr->cond_plc_tbl.place));
        for (n = 0; n < info_hdr->cond_plc_tbl.number; n++, place += 1) {
                dump_cond_tbl(itm_hdr, *place, 1);
        }
        place = (itm_place_t *)(ADDR(info_hdr->map_plc_tbl.place));
        for (n = 0; n < info_hdr->map_plc_tbl.number;
            n++, place += 1) {
                dump_map(itm_hdr, *place, 1);
        }
        place = (itm_place_t *)(ADDR(info_hdr->op_plc_tbl.place));
        for (n = 0; n < info_hdr->op_plc_tbl.number;
            n++, place += 1) {
                dump_op_tbl(itm_hdr, *place, 1);
        }
        place = (itm_place_t *)(ADDR(info_hdr->direc_plc_tbl.place));
        for (n = 0; n < info_hdr->direc_plc_tbl.number; n++, place += 1) {
                dump_direc_tbl(itm_hdr, *place);
        }
}


/*
 * Dump direction
 */
static void
dump_direc_tbl(itm_hdr_t        *itm_hdr, itm_place_t direc_place)
{
        itm_tbl_hdr_t   *direc_hdr;
        itm_direc_t     *direc;
        itm_type_t      type;
        long            i;
        char            *name;

        direc_hdr = (itm_tbl_hdr_t *)ADDR(direc_place);
        direc = (itm_direc_t *)(direc_hdr + 1);

        TRACE_MESSAGE('p', ("(&)direc=%ld ", direc_place.itm_ptr));

        printi(1, RNPREF "direction");
        if (0 != direc_hdr->name.itm_ptr) {
                name = tbl_name(itm_hdr, direc_hdr);
                if (NULL != name) {
                        printi(0, " %s", name);
                }
        }
        printi(0, " {\n");

        for (i = 0; i < direc_hdr->number; i++, direc++) {
                dump_cond_tbl(itm_hdr, direc->condition, 0);

                printi(0, "\t");

                type = (ITM_TBL_MASK &
                        (((itm_tbl_hdr_t *)(ADDR(direc->action)))->type));

                if (ITM_TBL_OP == type) {
                        dump_op_tbl(itm_hdr, direc->action, 0);
                } else if (ITM_TBL_DIREC == type) {
                        printi(0, "direction: action: %ld\n",
                                direc->action.itm_ptr);
                } else if (ITM_TBL_MAP == type) {
                        dump_map(itm_hdr, direc->action, 0);
                } else {
                        printi(0, RNPREF
                                "error ELIBBAD // unknown operation (%lx)\n",
                                type);
                }
        }

        printi(-1, "};\n");
}


static void
dump_map(itm_hdr_t      *itm_hdr, itm_place_t map_place, int standalone)
{
        itm_tbl_hdr_t   *tbl_hdr;

        tbl_hdr = (itm_tbl_hdr_t *)ADDR(map_place);

        switch (tbl_hdr->type) {
        case ITM_TBL_MAP_INDEX_FIXED_1_1:
        case ITM_TBL_MAP_INDEX_FIXED:
                dump_map_i_f(itm_hdr, map_place, standalone);
                break;
        case ITM_TBL_MAP_LOOKUP:
                dump_map_l_f(itm_hdr, map_place, standalone);
                break;
        case ITM_TBL_MAP_HASH:
                dump_map_hash(itm_hdr, map_place, standalone);
                break;
        case ITM_TBL_MAP_DENSE_ENC:
                dump_map_dense_enc(itm_hdr, map_place, standalone);
                break;
        default:
                break;
        }
}


/*
 * Dump map-indexed-fixed
 */
static void
dump_map_i_f(itm_hdr_t          *itm_hdr, itm_place_t map_place, int standalone)
{
        itm_tbl_hdr_t           *tbl_hdr;
        itm_map_idx_fix_hdr_t   *map_hdr;
        itm_num_t               i;
        itm_num_t               j;
        unsigned char           *p;
        unsigned char           *map_error;
        char                    *name;
        int                     error_flag;

        TRACE_MESSAGE('d', ("dump_map_i_f\n"));

        tbl_hdr = (itm_tbl_hdr_t *)ADDR(map_place);
        map_hdr = (itm_map_idx_fix_hdr_t *)(tbl_hdr + 1);

        if (0 < map_hdr->error_num) {
                p = (unsigned char *)(map_hdr + 1);
                map_error = p + (map_hdr->result_len * (tbl_hdr->number));
                if (0 == map_hdr->default_error) {
                        map_error += map_hdr->result_len;
                }
        } else if (1 == map_hdr->default_error) {
                p = (unsigned char *)(map_hdr + 1);
                map_error = p + (map_hdr->result_len * (tbl_hdr->number));
        } else {
                map_error = NULL;
        }

        if ((standalone) &&
            (0 == tbl_hdr->name.itm_ptr) &&
            (map_place.itm_ptr != itm_hdr->direc_init_tbl.itm_ptr)) {
                return;
        }

        TRACE_MESSAGE('p', ("(&)map=%ld ", map_place.itm_ptr));

        if (0 == tbl_hdr->name.itm_ptr) {
                name = NULL;
        } else {
                name = tbl_name(itm_hdr, tbl_hdr);
        }

        if ((0 == standalone) && (0 != tbl_hdr->name.itm_ptr)) {
                if (NULL != name) {
                        printi(0, "%s;\n", name);
                } else {
                        printi(0, RNPREF "unknown;\n", name);
                }
                return;
        } else {
                printi(1, RNPREF "map");
                if (NULL != name) {
                        printi(0, " %s", name);
                }
                printi(0, " {\n");
        }

        printi(0, "//  simple indexed map\n");
        printi(0, "//  source_len=%ld result_len=%ld\n",
                map_hdr->source_len, map_hdr->result_len);
        printi(0, "//  start=0x%p end=0x%p\n", /* DO NOT CHANGE to %ld */
                map_hdr->start.itm_ptr, map_hdr->end.itm_ptr);
        if (0 < map_hdr->error_num) {
                printi(0, "//  error_num=%ld\n",
                        map_hdr->error_num);
        }
        if (0 == map_hdr->default_error) {
                p = (((unsigned char *)(map_hdr + 1)) +
                        (map_hdr->result_len *
                        (map_hdr->end.itm_ptr - map_hdr->start.itm_ptr + 1)));
                printi(0, RNPREF "default 0x");
                for (j = 0; j < map_hdr->result_len; j++) {
                        printi(0, "%02x", *(p + j));
                }
                printi(0, "\n");
        } else if (-1 == map_hdr->default_error) {
                printi(0, RNPREF "default\t" RNPREF "default\n");
        }
        error_flag = 0;
        for (i = 0; i <= (map_hdr->end.itm_ptr - map_hdr->start.itm_ptr); i++) {
                p = (((unsigned char *)(map_hdr + 1)) +
                        (map_hdr->result_len * i));
                if ((NULL == map_error) ||
                    (0 == *(map_error + i))) {
                        printi(0, "0x%0*p\t",
                        (map_hdr->source_len * 2), i + map_hdr->start.itm_ptr);
                        printi(0, "0x");
                        for (j = 0; j < map_hdr->result_len; j++) {
                                printi(0, "%02x", *(p + j));
                        }
                        error_flag = 0;
                        printi(0, "\n");
                } else  if (0 >= map_hdr->default_error) {
                        if (0 == error_flag) {
                                printi(0, "0x%0*p\t",
                                (map_hdr->source_len * 2),
                                i + map_hdr->start.itm_ptr);
                                printi(0, "error\n");
                                error_flag = 1;
                        } else if (error_flag == 1) {
                                printi(0, " :\t:\n");
                                error_flag = 2;
                        }
                }
        }
        printi(-1, "};\n");
}


/*
 * Dump map-lookup-fixed
 */
static void
dump_map_l_f(itm_hdr_t          *itm_hdr, itm_place_t map_place, int standalone)
{
        itm_tbl_hdr_t           *tbl_hdr;
        itm_map_lookup_hdr_t    *map_hdr;
        itm_num_t               i;
        itm_num_t               j;
        unsigned char           *p;
        char                    *name;

        TRACE_MESSAGE('d', ("dump_map_l_f\n"));

        tbl_hdr = (itm_tbl_hdr_t *)ADDR(map_place);
        map_hdr = (itm_map_lookup_hdr_t *)(tbl_hdr + 1);

        if ((standalone) &&
            (0 == tbl_hdr->name.itm_ptr) &&
            (map_place.itm_ptr != itm_hdr->direc_init_tbl.itm_ptr)) {
                return;
        }

        TRACE_MESSAGE('p', ("(&)map=%ld ", map_place.itm_ptr));

        if (0 == tbl_hdr->name.itm_ptr) {
                name = NULL;
        } else {
                name = tbl_name(itm_hdr, tbl_hdr);
        }

        if ((0 == standalone) && (0 != tbl_hdr->name.itm_ptr)) {
                if (NULL != name) {
                        printi(0, "%s;\n", name);
                } else {
                        printi(0, RNPREF "unknown;\n", name);
                }
                return;
        } else {
                printi(1, RNPREF "map");
                if (NULL != name) {
                        printi(0, " %s", name);
                }
                printi(0, " {\n");
        }

        printi(0, "//  binary search map\n");
        printi(0, "//  source_len=%ld result_len=%ld\n",
                map_hdr->source_len, map_hdr->result_len);
        if (0 < map_hdr->error_num) {
                printi(0, "//  error_num=%ld\n",
                        map_hdr->error_num);
        }

        if (0 == map_hdr->default_error) {
                printi(0, RNPREF "default\t0x");
                p = ((unsigned char *)(map_hdr + 1) +
                        (tbl_hdr->number *
                        (map_hdr->source_len + map_hdr->result_len + 1)) +
                        map_hdr->source_len + 1);
                for (j = 0; j < map_hdr->result_len; j++, p++) {
                        printi(0, "%02x", *p);
                }
                printi(0, "\n");
        } else if (-1 == map_hdr->default_error) {
                printi(0, RNPREF "default\t" RNPREF "default\n");
        }
        p = (unsigned char *)(map_hdr + 1);
        for (i = 0; i < tbl_hdr->number; i++) {
                printi(0, "0x");
                for (j = 0; j < map_hdr->source_len; j++, p++) {
                        printi(0, "%02x", *p);
                }

                if (0 != (*p)) {
                        p += map_hdr->result_len + 1;
                        printi(0, "\terror");
                } else {
                        p++;
                        printi(0, "\t0x");
                        for (j = 0; j < map_hdr->result_len; j++, p++) {
                                printi(0, "%02x", *p);
                        }
                }
                printi(0, "\n");
        }
        printi(-1, "};\n");
}

/*
 * Dump map-hash
 */
static void
dump_map_hash(itm_hdr_t         *itm_hdr, itm_place_t map_place, int standalone)
{
        itm_tbl_hdr_t           *tbl_hdr;
        itm_map_hash_hdr_t      *map_hdr;
        itm_num_t               i;
        itm_num_t               j;
        unsigned char           *p;
        unsigned char           *map_hash;
        unsigned char           *map_error;
        char                    *name;

        TRACE_MESSAGE('d', ("dump_map_hash\n"));

        tbl_hdr = (itm_tbl_hdr_t *)ADDR(map_place);
        map_hdr = (itm_map_hash_hdr_t *)(tbl_hdr + 1);
        map_error = (unsigned char *)(map_hdr + 1);
        map_hash = (map_error + map_hdr->hash_tbl_num);

        if ((standalone) &&
            (0 == tbl_hdr->name.itm_ptr) &&
            (map_place.itm_ptr != itm_hdr->direc_init_tbl.itm_ptr)) {
                return;
        }

        TRACE_MESSAGE('p', ("(&)map=%ld ", map_place.itm_ptr));

        if (0 == tbl_hdr->name.itm_ptr) {
                name = NULL;
        } else {
                name = tbl_name(itm_hdr, tbl_hdr);
        }

        if ((0 == standalone) && (0 != tbl_hdr->name.itm_ptr)) {
                if (NULL != name) {
                        printi(0, "%s;\n", name);
                } else {
                        printi(0, RNPREF "unknown;\n", name);
                }
                return;
        } else {
                printi(1, RNPREF "map");
                if (NULL != name) {
                        printi(0, " %s", name);
                }
                printi(0, " {\n");
        }

        printi(0, "//  hashed map\n");
        printi(0, "//  number=%ld\n",
                tbl_hdr->number);
        printi(0, "//  source_len=%ld result_len=%ld\n",
                map_hdr->source_len, map_hdr->result_len);
        printi(0, "//  hash_tbl_size=%ld hash_of_size=%ld hash_of_num=%ld\n",
                map_hdr->hash_tbl_size,
                map_hdr->hash_of_size, map_hdr->hash_of_num);
        if (0 < map_hdr->error_num) {
                printi(0, "//  error_num=%ld\n",
                        map_hdr->error_num);
        }


        if (0 == map_hdr->default_error) {
                printi(0, RNPREF "default\t0x");
                p = map_hash + map_hdr->hash_tbl_size +
                        map_hdr->hash_of_size;
                for (j = 0; j < map_hdr->result_len; j++, p++) {
                        printi(0, "%02x", *p);
                }
                printi(0, "\n");
        } else if (-1 == map_hdr->default_error) {
                printi(0, RNPREF "default\t" RNPREF "default\n");
        }
        p = map_hash;
        TRACE_MESSAGE('d', ("dump_map_hash: %ld %ld\n",
                        tbl_hdr->number, map_hdr->hash_of_num));
        for (i = 0; i < map_hdr->hash_tbl_num; i++) {
                TRACE_MESSAGE('d', ("dump_map_hash: %x (0x%08p)\n", *p, p));
                if (0 == *(map_error + i)) {
                        p += (map_hdr->source_len + 1 + map_hdr->result_len);
                        continue;
                }
                printi(0, "0x");
                for (j = 0; j < map_hdr->source_len; j++, p++) {
                        printi(0, "%02x", *p);
                }

                if (0 != (*p)) {
                        p += map_hdr->result_len + 1;
                        printi(0, "\terror");
                } else {
                        p++;
                        printi(0, "\t0x");
                        for (j = 0; j < map_hdr->result_len; j++, p++) {
                                printi(0, "%02x", *p);
                        }
                }
                printi(0, "\n");
        }
        printi(0, "// of table\n");
        for (i = 0; i < map_hdr->hash_of_num; i++) {
                printi(0, "0x");
                for (j = 0; j < map_hdr->source_len; j++, p++) {
                        printi(0, "%02x", *p);
                }
                if (0 != (*p)) {
                        p += map_hdr->result_len + 1;
                        printi(0, "\terror\n");
                } else {
                        p++;
                        printi(0, "\t0x");
                        for (j = 0; j < map_hdr->result_len; j++, p++) {
                                printi(0, "%02x", *p);
                        }
                        printi(0, "\n");
                }
        }
        printi(-1, "};\n");
}


/*
 * Dump map-dense-encoding
 */
static void
dump_map_dense_enc(itm_hdr_t    *itm_hdr, itm_place_t map_place, int standalone)
{
        itm_tbl_hdr_t                   *tbl_hdr;
        itm_map_dense_enc_hdr_t         *map_hdr;
        itm_num_t                       i;
        itm_num_t                       j;
        unsigned char                   *p;
        unsigned char                   *map_ptr;
        unsigned char                   *map_error;
        unsigned char                   *byte_seq_min;
        unsigned char                   *byte_seq_max;
        char                            *name;
        int                             error_flag;

        TRACE_MESSAGE('d', ("dump_map_dense_enc\n"));

        tbl_hdr = (itm_tbl_hdr_t *)ADDR(map_place);
        map_hdr = (itm_map_dense_enc_hdr_t *)(tbl_hdr + 1);
        map_ptr = ((unsigned char *)(map_hdr + 1) +
                        map_hdr->source_len + map_hdr->source_len);

        if (0 < map_hdr->error_num) {
                map_error = (map_ptr +
                        (tbl_hdr->number * map_hdr->result_len));
                if (0 == map_hdr->default_error) {
                        map_error += map_hdr->result_len;
                }
        } else if (1 == map_hdr->default_error) {
                map_error = (map_ptr +
                        (tbl_hdr->number * map_hdr->result_len));
        } else {
                map_error = NULL;
        }
        byte_seq_min = (unsigned char *)(map_hdr + 1);
        byte_seq_max = byte_seq_min + map_hdr->source_len;

        if ((standalone) &&
            (0 == tbl_hdr->name.itm_ptr) &&
            (map_place.itm_ptr != itm_hdr->direc_init_tbl.itm_ptr)) {
                return;
        }

        TRACE_MESSAGE('p', ("(&)map=%ld ", map_place.itm_ptr));

        if (0 == tbl_hdr->name.itm_ptr) {
                name = NULL;
        } else {
                name = tbl_name(itm_hdr, tbl_hdr);
        }

        if ((0 == standalone) && (0 != tbl_hdr->name.itm_ptr)) {
                if (NULL != name) {
                        printi(0, "%s;\n", name);
                } else {
                        printi(0, RNPREF "unknown;\n", name);
                }
                return;
        } else {
                printi(1, RNPREF "map");
                if (NULL != name) {
                        printi(0, " %s", name);
                }
                printi(0, " {\n");
        }

        printi(0, "//  dense encoded map\n");
        printi(0, "//  entry_number=%ld\n", tbl_hdr->number);
        printi(0, "//  source_len=%ld result_len=%ld\n",
                map_hdr->source_len, map_hdr->result_len);
        printi(0, "//  byte_seq_min=0x");
        p = byte_seq_min;
        for (i = 0; i < map_hdr->source_len; i++, p++) {
                printi(0, "%02x", *p);
        }
        printi(0, "\n");
        printi(0, "//  byte_seq_max=0x");
        p = byte_seq_max;
        for (i = 0; i < map_hdr->source_len; i++, p++) {
                printi(0, "%02x", *p);
        }
        printi(0, "\n");
        if (0 < map_hdr->error_num) {
                printi(0, "//  error_num=%ld\n",
                        map_hdr->error_num);
        }
        if (0 == map_hdr->default_error) {
                p = (map_ptr + (tbl_hdr->number * map_hdr->result_len));
                printi(0, RNPREF "default 0x");
                for (j = 0; j < map_hdr->result_len; j++) {
                        printi(0, "%02x", *(p + j));
                }
                printi(0, "\n");
        } else if (-1 == map_hdr->default_error) {
                printi(0, RNPREF "default\t" RNPREF "default\n");
        }

        error_flag = 0;
        for (i = 0, p = map_ptr; i < tbl_hdr->number;
            i++, p += map_hdr->result_len) {
                if ((NULL == map_error) || (0 == *(map_error + i))) {
                        printi(0, "%s\t",
                                dense_enc_index_to_byte_seq(
                                        i, map_hdr->source_len,
                                        byte_seq_min, byte_seq_max));
                        printi(0, "0x");
                        for (j = 0; j < map_hdr->result_len; j++) {
                                printi(0, "%02x", *(p + j));
                        }
                        printi(0, "\n");
                        error_flag = 0;
                } else  if (0 >= map_hdr->default_error) {
                        if (0 == error_flag) {
                                printi(0, "%s\t",
                                        dense_enc_index_to_byte_seq(
                                        i, map_hdr->source_len,
                                        byte_seq_min, byte_seq_max));
                                printi(0, "error\n");
                                error_flag = 1;
                        } else if (error_flag == 1) {
                                printi(0, " :\t:\n");
                                error_flag = 2;
                        }
                }
        }
        printi(-1, "};\n");
}


/*
 * Evaluate condition table
 */
static void
dump_cond_tbl(itm_hdr_t *itm_hdr, itm_place_t cond_place, int standalone)
{
        itm_tbl_hdr_t   *cond_hdr;
        itm_cond_t      *cond;
        long            i;
        char            *name;

        TRACE_MESSAGE('p', ("(&)cond_tbl=%ld ", cond_place.itm_ptr));
        cond_hdr = (itm_tbl_hdr_t *)(ADDR(cond_place));
        cond = (itm_cond_t *)(cond_hdr + 1);

        if ((standalone) && (0 == cond_hdr->name.itm_ptr)) {
                TRACE_MESSAGE('t', ("skip condition(%d, %ld)\n",
                standalone, cond_hdr->name.itm_ptr));
                return;
        }

        if (0 == cond_place.itm_ptr) {
                printi(0, RNPREF "true");
                return;
        }

        if (0 == cond_hdr->name.itm_ptr) {
                name = NULL;
        } else {
                name = tbl_name(itm_hdr, cond_hdr);
        }

        if ((0 == standalone) && (0 != cond_hdr->name.itm_ptr)) {
                if (NULL != name) {
                        printi(0, "%s", name);
                } else {
                        printi(0, RNPREF "unknown");
                }
                return;
        } else {
                printi(1, RNPREF "condition");
                if (NULL != name) {
                        printi(0, " %s", name);
                }
                printi(0, " {\n");
        }

        for (i = 0; i < cond_hdr->number; i++, cond++) {
                switch (cond->type) {
                case ITM_COND_BETWEEN:
                        dump_range(itm_hdr, cond->operand.place);
                        break;
                case ITM_COND_EXPR:
                        dump_expr(itm_hdr, cond->operand.place);
                        printi(0, ";\n");
                        break;
                case ITM_COND_ESCAPESEQ:
                        dump_escapeseq(itm_hdr, cond->operand.place);
                        break;
                default:
                        printi(0, "// unknown %d\n", cond->type);
                        break;
                }
        }

        if (standalone) {
                printi(-1, "};\n");
        } else {
                printi(-1, "}");
        }
}


/*
 * Dump operation table
 */
static void
dump_op_tbl(itm_hdr_t   *itm_hdr, itm_place_t op_tbl_place, int standalone)
{
        itm_tbl_hdr_t   *op_hdr;
        itm_op_t        *operation;
        itm_place2_t    op_place;
        long            i;
        char            *name;
        static int      op_tbl_level;

        op_hdr = (itm_tbl_hdr_t *)(ADDR(op_tbl_place));
        operation = (itm_op_t *)(op_hdr + 1);
        TRACE_MESSAGE('p', ("(&)op_tbl=%ld ", op_tbl_place));

        name = tbl_name(itm_hdr, op_hdr);

        if ((standalone) && (NULL == name))
                return;

        if (0 == op_tbl_level) {
                if ((0 == standalone) && (0 != op_hdr->name.itm_ptr)) {
                        if (NULL != name) {
                                printi(0, "%s;\n", name);
                        } else {
                                printi(0, RNPREF "unknown;", name);
                        }
                        return;
                } else {
                        printi(1, RNPREF "operation");
                        if (NULL != name) {
                                printi(0, " %s", name);
                        }
                        printi(0, " {\n");
                }
        }

        op_tbl_level += 1;

        op_place = op_tbl_place.itm_ptr + (sizeof (itm_tbl_hdr_t));
        for (i = 0; i < op_hdr->number;
            i++, operation++, op_place += (sizeof (itm_op_t))) {
                dump_op(itm_hdr, op_place);
        }

        op_tbl_level -= 1;

        if (0 == op_tbl_level) {
                printi(-1, "};\n");
        }
}


/*
 * Evaluate single operation
 */
static void
dump_op(itm_hdr_t       *itm_hdr, itm_place2_t op_place)
{
        itm_op_t        *operation;
        itm_tbl_hdr_t   *op_hdr;

        operation = (itm_op_t *)ADDR2(op_place);
        TRACE_MESSAGE('p', ("(&)op=%ld ", op_place));

        switch (operation->type) {
        case ITM_OP_EXPR:
                dump_expr(itm_hdr, operation->data.operand[0]);
                printi(0, ";\n");
                break;
        case ITM_OP_ERROR:
                printi(0, RNPREF "error ");
                dump_expr(itm_hdr, operation->data.operand[0]);
                printi(0, ";\n");
                break;
        case ITM_OP_ERROR_D:
                printi(0, RNPREF "error %d;",
                        operation->data.operand[0].itm_ptr);
                printi(0, "\n");
                break;
        case ITM_OP_DISCARD:
                printi(0, RNPREF "discard ");
                dump_expr(itm_hdr, operation->data.operand[0]);
                printi(0, ";\n");
                break;
        case ITM_OP_DISCARD_D:
                printi(0, RNPREF "discard %ld;\n",
                        operation->data.operand[0].itm_ptr);
                break;
        case ITM_OP_OUT:
        case ITM_OP_OUT_D:
        case ITM_OP_OUT_R:
        case ITM_OP_OUT_S:
        case ITM_OP_OUT_INVD:
                printi(0, RNPREF "out = ");
                dump_expr(itm_hdr, operation->data.operand[0]);
                printi(0, ";\n");
                break;
        case ITM_OP_IF:
                printi(0, RNPREF "if ");
                dump_expr(itm_hdr, operation->data.operand[0]);
                printi(1, " {\n");
                dump_op_tbl(itm_hdr, operation->data.operand[1], 0);
                printi(-1, "}\n");
                break;
        case ITM_OP_IF_ELSE:
                printi(0, RNPREF "if ");
                dump_expr(itm_hdr, operation->data.operand[0]);
                printi(1, " {\n");
                dump_op_tbl(itm_hdr, operation->data.operand[1], 0);
                printi(-1, "} ");
                op_hdr = ADDR(operation->data.operand[2]);
                if ((1 == op_hdr->number) &&
                    ((ITM_OP_IF_ELSE == ((itm_op_t *)(op_hdr + 1))->type) ||
                    (ITM_OP_IF == ((itm_op_t *)(op_hdr + 1))->type))) {
                        printi(0, RNPREF "else ");
                        dump_op_tbl(itm_hdr, operation->data.operand[2], 0);
                } else {
                        printi(1, RNPREF "else {\n");
                        dump_op_tbl(itm_hdr, operation->data.operand[2], 0);
                        printi(-1, "}\n");
                }
                break;
        case ITM_OP_DIRECTION: /* switch direction */
                printi(0, RNPREF "direction %1$s;\n", tbl_name(itm_hdr,
                        (itm_tbl_hdr_t *)ADDR(operation->data.operand[0])));
                break;
        case ITM_OP_MAP:        /* use map */
                printi(0, RNPREF "map %1$s", tbl_name(itm_hdr,
                        (itm_tbl_hdr_t *)ADDR(operation->data.operand[0])));
                if (0 != operation->data.operand[1].itm_ptr) {
                        printi(0, " ");
                        dump_expr(itm_hdr, operation->data.operand[1]);
                }
                printi(0, ";\n");
                break;
        case ITM_OP_OPERATION: /* invoke operation */
                printi(0, RNPREF "operation %1$s;\n",
                        tbl_name(itm_hdr,
                        (itm_tbl_hdr_t *)ADDR(operation->data.operand[0])));
                break;
        case ITM_OP_INIT: /* invoke init operation */
                printi(0, RNPREF "operation " RNPREF "init;\n");
                break;
        case ITM_OP_RESET: /* invoke reset operation */
                printi(0, RNPREF "operation " RNPREF "reset;\n");
                break;
        case ITM_OP_BREAK: /* break */
                printi(0, RNPREF "break;\n");
                break;
        case ITM_OP_RETURN: /* return */
                printi(0, RNPREF "return;\n");
                break;
        case ITM_OP_PRINTCHR:
                printi(0, RNPREF "printchr ");
                dump_expr(itm_hdr, operation->data.operand[0]);
                printi(0, ";\n");
                break;
        case ITM_OP_PRINTHD:
                printi(0, RNPREF "printhd ");
                dump_expr(itm_hdr, operation->data.operand[0]);
                printi(0, ";\n");
                break;
        case ITM_OP_PRINTINT:
                printi(0, RNPREF "printint ");
                dump_expr(itm_hdr, operation->data.operand[0]);
                printi(0, ";\n");
                break;
        default:
                printi(0, "// unknown operation: %lx\n", operation->type);
                break;
        }
}


/*
 * Dump expression
 */
static void
dump_expr(itm_hdr_t     *itm_hdr, itm_place_t expr_place)
{
        itm_expr_t      *expr;
        itm_data_t      data;

        expr = (itm_expr_t *)ADDR(expr_place);
        TRACE_MESSAGE('p', ("(*)ex=%ld ", expr_place.itm_ptr));

        switch (expr->type) {
        case ITM_EXPR_NONE:             /* not used */
                printi(0, "none");
                break;
        case ITM_EXPR_NOP:              /* not used */
                printi(0, "NOP");
                break;
        case ITM_EXPR_NAME:             /* not used */
                printi(0, "NAME");
                break;
        case ITM_EXPR_INT:              /* integer */
                printi(0, "%ld", expr->data.itm_exnum);
                break;
        case ITM_EXPR_SEQ:              /* byte sequence */
                data = expr->data.value;
                if ((sizeof (itm_place_t)) < data.size) {
                        data.place.itm_ptr = (itm_place2_t)ADDR(data.place);
                }
                printi(0, "0x%s", data_to_hexadecimal(&data));
                break;
        case ITM_EXPR_REG:              /* register */
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                break;
        case ITM_EXPR_IN_VECTOR:        /* in[expr] */
                printi(0, RNPREF "in[");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, "]");
                break;
        case ITM_EXPR_IN_VECTOR_D:      /* in[num] */
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                if (0 == expr->data.operand[0].itm_ptr) {
                        printi(0, " // inputsize");
                }
                break;
        case ITM_EXPR_OUT:              /* out */
                printi(0, RNPREF "out");
                break;
        case ITM_EXPR_TRUE:             /* true */
                printi(0, RNPREF "true");
                break;
        case ITM_EXPR_FALSE:            /* false */
                printi(0, RNPREF "false");
                break;
        case ITM_EXPR_UMINUS:           /* unary minus */
                printi(0, "-");
                dump_expr(itm_hdr, expr->data.operand[0]);
                break;
        case ITM_EXPR_PLUS:             /* A  + B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " + ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_PLUS_E_D:         /* exprA + B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " + ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_PLUS_E_R:         /* exprA + varB */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " + ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_PLUS_E_INVD:      /* exprA + in[B] */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " + ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_PLUS_D_E:         /* intA + exprB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " + ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_PLUS_D_D:         /* intA + B */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " + ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_PLUS_D_R:         /* intA + varB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " + ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_PLUS_D_INVD:      /* intA + in[B] */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " + ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_PLUS_R_E:         /* varA + exprB */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " + ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_PLUS_R_D:         /* varA + B */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " + ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_PLUS_R_R:         /* varA + varB */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " + ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_PLUS_R_INVD:      /* varA + in[B] */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " + ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_PLUS_INVD_E:      /* in[A] + exprB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " + ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_PLUS_INVD_D:      /* in[A] + B */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " + ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_PLUS_INVD_R:      /* in[A] + varB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " + ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_PLUS_INVD_INVD:   /* in[A] + in[B] */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " + ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MINUS:            /* A  - B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " - ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_MINUS_E_D:                /* exprA - B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " - ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MINUS_E_R:                /* exprA - varB */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " - ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_MINUS_E_INVD:     /* exprA - in[B] */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " - ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MINUS_D_E:                /* intA - exprB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " - ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_MINUS_D_D:                /* intA - B */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " - ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MINUS_D_R:                /* intA - varB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " - ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_MINUS_D_INVD:     /* intA - in[B] */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " - ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MINUS_R_E:                /* varA - exprB */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " - ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_MINUS_R_D:                /* varA - B */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " - ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MINUS_R_R:                /* varA - varB */
                printi(0, "(");
                printi(0, " - ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, ")");
                break;
        case ITM_EXPR_MINUS_R_INVD:     /* varA - in[B] */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " - ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MINUS_INVD_E:     /* in[A] - exprB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " - ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_MINUS_INVD_D:     /* in[A] - B */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " - ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MINUS_INVD_R:     /* in[A] - varB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " - ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_MINUS_INVD_INVD:  /* in[A] - in[B] */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " - ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MUL:              /* A  * B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " * ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_MUL_E_D:          /* exprA * B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " * ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MUL_E_R:          /* exprA * varB */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " * ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_MUL_E_INVD:       /* exprA * in[B] */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " * ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MUL_D_E:          /* intA * exprB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " * ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_MUL_D_D:          /* intA * B */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " * ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MUL_D_R:          /* intA * varB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " * ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_MUL_D_INVD:       /* intA * in[B] */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " * ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MUL_R_E:          /* varA * exprB */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " * ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_MUL_R_D:          /* varA * B */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " * ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MUL_R_R:          /* varA * varB */
                printi(0, "(");
                printi(0, " * ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, ")");
                break;
        case ITM_EXPR_MUL_R_INVD:       /* varA * in[B] */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " * ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MUL_INVD_E:       /* in[A] * exprB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " * ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_MUL_INVD_D:       /* in[A] * B */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " * ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MUL_INVD_R:       /* in[A] * varB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " * ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_MUL_INVD_INVD:    /* in[A] * in[B] */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " * ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_DIV:              /* A  / B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " / ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_DIV_E_D:          /* exprA / B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " / ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_DIV_E_R:          /* exprA / varB */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " / ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_DIV_E_INVD:       /* exprA / in[B] */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " / ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_DIV_D_E:          /* intA / exprB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " / ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_DIV_D_D:          /* intA / B */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " / ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_DIV_D_R:          /* intA / varB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " / ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_DIV_D_INVD:       /* intA / in[B] */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " / ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_DIV_R_E:          /* varA / exprB */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " / ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_DIV_R_D:          /* varA / B */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " / ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_DIV_R_R:          /* varA / varB */
                printi(0, "(");
                printi(0, " / ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, ")");
                break;
        case ITM_EXPR_DIV_R_INVD:       /* varA / in[B] */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " / ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_DIV_INVD_E:       /* in[A] / exprB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " / ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_DIV_INVD_D:       /* in[A] / B */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " / ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_DIV_INVD_R:       /* in[A] / varB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " / ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_DIV_INVD_INVD:    /* in[A] / in[B] */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " / ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MOD:              /* A  % B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " %% ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_MOD_E_D:          /* exprA % B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " %% ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MOD_E_R:          /* exprA % varB */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " %% ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_MOD_E_INVD:       /* exprA % in[B] */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " %% ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MOD_D_E:          /* intA % exprB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " %% ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_MOD_D_D:          /* intA % B */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " %% ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MOD_D_R:          /* intA % varB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " %% ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_MOD_D_INVD:       /* intA % in[B] */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " %% ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MOD_R_E:          /* varA % exprB */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " %% ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_MOD_R_D:          /* varA % B */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " %% ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MOD_R_R:          /* varA % varB */
                printi(0, "(");
                printi(0, " %% ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, ")");
                break;
        case ITM_EXPR_MOD_R_INVD:       /* varA % in[B] */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " %% ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MOD_INVD_E:       /* in[A] % exprB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " %% ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_MOD_INVD_D:       /* in[A] % B */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " %% ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_MOD_INVD_R:       /* in[A] % varB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " %% ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_MOD_INVD_INVD:    /* in[A] % in[B] */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " %% ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_L:          /* A << B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " << ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_L_E_D:              /* exprA << B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " << ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_L_E_R:              /* exprA << varB */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " << ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_L_E_INVD:   /* exprA << in[B] */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " << ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_L_D_E:              /* intA << exprB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " << ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_L_D_D:              /* intA << B */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " << ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_L_D_R:              /* intA << varB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " << ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_L_D_INVD:   /* intA << in[B] */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " << ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_L_R_E:              /* varA << exprB */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " << ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_L_R_D:              /* varA << B */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " << ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_L_R_R:              /* varA << varB */
                printi(0, "(");
                printi(0, " << ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_L_R_INVD:   /* varA << in[B] */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " << ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_L_INVD_E:   /* in[A] << exprB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " << ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_L_INVD_D:   /* in[A] << B */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " << ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_L_INVD_R:   /* in[A] << varB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " << ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_L_INVD_INVD:        /* in[A] << in[B] */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " << ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_R:          /* A >> B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " >> ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_R_E_D:              /* exprA >> B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " >> ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_R_E_R:              /* exprA >> varB */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " >> ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_R_E_INVD:   /* exprA >> in[B] */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " >> ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_R_D_E:              /* intA >> exprB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " >> ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_R_D_D:              /* intA >> B */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " >> ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_R_D_R:              /* intA >> varB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " >> ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_R_D_INVD:   /* intA >> in[B] */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " >> ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_R_R_E:              /* varA >> exprB */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " >> ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_R_R_D:              /* varA >> B */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " >> ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_R_R_R:              /* varA >> varB */
                printi(0, "(");
                printi(0, " >> ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_R_R_INVD:   /* varA >> in[B] */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " >> ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_R_INVD_E:   /* in[A] >> exprB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " >> ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_R_INVD_D:   /* in[A] >> B */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " >> ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_R_INVD_R:   /* in[A] >> varB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " >> ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_SHIFT_R_INVD_INVD:        /* in[A] >> in[B] */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " >> ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_OR:               /* A  | B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " | ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_OR_E_D:           /* exprA | B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " | ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_OR_E_R:           /* exprA | varB */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " | ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_OR_E_INVD:        /* exprA | in[B] */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " | ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_OR_D_E:           /* intA | exprB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " | ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_OR_D_D:           /* intA | B */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " | ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_OR_D_R:           /* intA | varB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " | ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_OR_D_INVD:        /* intA | in[B] */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " | ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_OR_R_E:           /* varA | exprB */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " | ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_OR_R_D:           /* varA | B */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " | ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_OR_R_R:           /* varA | varB */
                printi(0, "(");
                printi(0, " | ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, ")");
                break;
        case ITM_EXPR_OR_R_INVD:        /* varA | in[B] */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " | ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_OR_INVD_E:        /* in[A] | exprB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " | ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_OR_INVD_D:        /* in[A] | B */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " | ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_OR_INVD_R:        /* in[A] | varB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " | ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_OR_INVD_INVD:     /* in[A] | in[B] */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " | ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_XOR:              /* A  ^ B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " ^ ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_XOR_E_D:          /* exprA ^ B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " ^ ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_XOR_E_R:          /* exprA ^ varB */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " ^ ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_XOR_E_INVD:       /* exprA ^ in[B] */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " ^ ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_XOR_D_E:          /* intA ^ exprB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " ^ ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_XOR_D_D:          /* intA ^ B */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " ^ ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_XOR_D_R:          /* intA ^ varB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " ^ ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_XOR_D_INVD:       /* intA ^ in[B] */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " ^ ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_XOR_R_E:          /* varA ^ exprB */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " ^ ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_XOR_R_D:          /* varA ^ B */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " ^ ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_XOR_R_R:          /* varA ^ varB */
                printi(0, "(");
                printi(0, " ^ ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, ")");
                break;
        case ITM_EXPR_XOR_R_INVD:       /* varA ^ in[B] */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " ^ ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_XOR_INVD_E:       /* in[A] ^ exprB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " ^ ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_XOR_INVD_D:       /* in[A] ^ B */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " ^ ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_XOR_INVD_R:       /* in[A] ^ varB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " ^ ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_XOR_INVD_INVD:    /* in[A] ^ in[B] */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " ^ ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_AND:              /* A  & B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " & ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_AND_E_D:          /* exprA & B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " & ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_AND_E_R:          /* exprA & varB */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " & ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_AND_E_INVD:       /* exprA & in[B] */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " & ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_AND_D_E:          /* intA & exprB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " & ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_AND_D_D:          /* intA & B */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " & ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_AND_D_R:          /* intA & varB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " & ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_AND_D_INVD:       /* intA & in[B] */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " & ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_AND_R_E:          /* varA & exprB */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " & ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_AND_R_D:          /* varA & B */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " & ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_AND_R_R:          /* varA & varB */
                printi(0, "(");
                printi(0, " & ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, ")");
                break;
        case ITM_EXPR_AND_R_INVD:       /* varA & in[B] */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " & ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_AND_INVD_E:       /* in[A] & exprB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " & ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_AND_INVD_D:       /* in[A] & B */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " & ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_AND_INVD_R:       /* in[A] & varB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " & ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_AND_INVD_INVD:    /* in[A] & in[B] */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " & ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_EQ:               /* A == B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " == ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_EQ_E_D:           /* exprA == B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " == ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_EQ_E_R:           /* exprA == varB */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " == ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_EQ_E_INVD:        /* exprA == in[B] */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " == ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_EQ_D_E:           /* intA == exprB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " == ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_EQ_D_D:           /* intA == B */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " == ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_EQ_D_R:           /* intA == varB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " == ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_EQ_D_INVD:        /* intA == in[B] */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " == ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_EQ_R_E:           /* varA == exprB */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " == ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_EQ_R_D:           /* varA == B */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " == ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_EQ_R_R:           /* varA == varB */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " == ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_EQ_R_INVD:        /* varA == in[B] */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " == ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_EQ_INVD_E:        /* in[A] == exprB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " == ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_EQ_INVD_D:        /* in[A] == B */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " == ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_EQ_INVD_R:        /* in[A] == varB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " == ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_EQ_INVD_INVD:     /* in[A] == in[B] */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " == ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_NE:               /* A != B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " != ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_NE_E_D:           /* exprA != B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " != ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_NE_E_R:           /* exprA != varB */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " != ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_NE_E_INVD:        /* exprA != in[B] */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " != ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_NE_D_E:           /* intA != exprB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " != ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_NE_D_D:           /* intA != B */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " != ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_NE_D_R:           /* intA != varB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " != ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_NE_D_INVD:        /* intA != in[B] */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " != ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_NE_R_E:           /* varA != exprB */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " != ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_NE_R_D:           /* varA != B */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " != ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_NE_R_R:           /* varA != varB */
                printi(0, "(");
                printi(0, " != ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, ")");
                break;
        case ITM_EXPR_NE_R_INVD:        /* varA != in[B] */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " != ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_NE_INVD_E:        /* in[A] != exprB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " != ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_NE_INVD_D:        /* in[A] != B */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " != ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_NE_INVD_R:        /* in[A] != varB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " != ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_NE_INVD_INVD:     /* in[A] != in[B] */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " != ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_GT:               /* A  > B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " > ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_GT_E_D:           /* exprA > B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " > ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_GT_E_R:           /* exprA > varB */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " > ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_GT_E_INVD:        /* exprA > in[B] */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " > ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_GT_D_E:           /* intA > exprB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " > ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_GT_D_D:           /* intA > B */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " > ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_GT_D_R:           /* intA > varB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " > ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_GT_D_INVD:        /* intA > in[B] */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " > ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_GT_R_E:           /* varA > exprB */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " > ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_GT_R_D:           /* varA > B */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " > ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_GT_R_R:           /* varA > varB */
                printi(0, "(");
                printi(0, " > ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, ")");
                break;
        case ITM_EXPR_GT_R_INVD:        /* varA > in[B] */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " > ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_GT_INVD_E:        /* in[A] > exprB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " > ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_GT_INVD_D:        /* in[A] > B */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " > ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_GT_INVD_R:        /* in[A] > varB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " > ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_GT_INVD_INVD:     /* in[A] > in[B] */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " > ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_GE:               /* A >= B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " >= ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_GE_E_D:           /* exprA >= B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " >= ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_GE_E_R:           /* exprA >= varB */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " >= ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_GE_E_INVD:        /* exprA >= in[B] */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " >= ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_GE_D_E:           /* intA >= exprB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " >= ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_GE_D_D:           /* intA >= B */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " >= ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_GE_D_R:           /* intA >= varB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " >= ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_GE_D_INVD:        /* intA >= in[B] */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " >= ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_GE_R_E:           /* varA >= exprB */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " >= ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_GE_R_D:           /* varA >= B */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " >= ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_GE_R_R:           /* varA >= varB */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " >= ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_GE_R_INVD:        /* varA >= in[B] */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " >= ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_GE_INVD_E:        /* in[A] >= exprB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " >= ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_GE_INVD_D:        /* in[A] >= B */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " >= ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_GE_INVD_R:        /* in[A] >= varB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " >= ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_GE_INVD_INVD:     /* in[A] >= in[B] */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " >= ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_LT:               /* A  < B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " < ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_LT_E_D:           /* exprA < B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " < ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_LT_E_R:           /* exprA < varB */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " < ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_LT_E_INVD:        /* exprA < in[B] */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " < ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_LT_D_E:           /* intA < exprB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " < ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_LT_D_D:           /* intA < B */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " < ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_LT_D_R:           /* intA < varB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " < ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_LT_D_INVD:        /* intA < in[B] */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " < ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_LT_R_E:           /* varA < exprB */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " < ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_LT_R_D:           /* varA < B */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " < ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_LT_R_R:           /* varA < varB */
                printi(0, "(");
                printi(0, " < ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, ")");
                break;
        case ITM_EXPR_LT_R_INVD:        /* varA < in[B] */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " < ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_LT_INVD_E:        /* in[A] < exprB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " < ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_LT_INVD_D:        /* in[A] < B */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " < ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_LT_INVD_R:        /* in[A] < varB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " < ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_LT_INVD_INVD:     /* in[A] < in[B] */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " < ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_LE:               /* A <= B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " <= ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_LE_E_D:           /* exprA <= B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " <= ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_LE_E_R:           /* exprA <= varB */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " <= ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_LE_E_INVD:        /* exprA <= in[B] */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " <= ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_LE_D_E:           /* intA <= exprB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " <= ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_LE_D_D:           /* intA <= B */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " <= ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_LE_D_R:           /* intA <= varB */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " <= ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_LE_D_INVD:        /* intA <= in[B] */
                printi(0, "(");
                printi(0, "%ld", expr->data.operand[0].itm_ptr);
                printi(0, " <= ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_LE_R_E:           /* varA <= exprB */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " <= ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_LE_R_D:           /* varA <= B */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " <= ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_LE_R_R:           /* varA <= varB */
                printi(0, "(");
                printi(0, " <= ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, ")");
                break;
        case ITM_EXPR_LE_R_INVD:        /* varA <= in[B] */
                printi(0, "(");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[0]));
                printi(0, " <= ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_LE_INVD_E:        /* in[A] <= exprB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " <= ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_LE_INVD_D:        /* in[A] <= B */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " <= ");
                printi(0, "%ld", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_LE_INVD_R:        /* in[A] <= varB */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " <= ");
                printi(0, "%s", reg_name(itm_hdr, expr->data.operand[1]));
                printi(0, ")");
                break;
        case ITM_EXPR_LE_INVD_INVD:     /* in[A] <= in[B] */
                printi(0, "(");
                printi(0, RNPREF "in[%ld]", expr->data.operand[0].itm_ptr);
                printi(0, " <= ");
                printi(0, RNPREF "in[%ld]", expr->data.operand[1].itm_ptr);
                printi(0, ")");
                break;
        case ITM_EXPR_NOT:              /*   !A   */
                printi(0, "(");
                printi(0, "!");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, ")");
                break;
        case ITM_EXPR_NEG:              /*   ~A   */
                printi(0, "(");
                printi(0, " ~");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, ")");
                break;
        case ITM_EXPR_LOR:              /* A || B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " || ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_LAND:             /* A && B */
                printi(0, "(");
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, " && ");
                dump_expr(itm_hdr, expr->data.operand[1]);
                printi(0, ")");
                break;
        case ITM_EXPR_ASSIGN:           /* A  = B */
                printi(0, "%s = ", reg_name(itm_hdr, expr->data.operand[0]));
                dump_expr(itm_hdr, expr->data.operand[1]);
                break;
        case ITM_EXPR_IN_EQ:            /* in == A */
                printi(0, "(" RNPREF "in == ", 0);
                dump_expr(itm_hdr, expr->data.operand[0]);
                printi(0, ")");
                break;
        default:
                break;
        }
}


/*
 * Dump range (between)
 */
static void
dump_range(itm_hdr_t    *itm_hdr, itm_place_t range_place)
{
        itm_tbl_hdr_t   *rth;
        itm_range_hdr_t *rtsh;
        unsigned char   *p;
        long            i;
        long            j;

        rth = (itm_tbl_hdr_t *)(ADDR(range_place));
        rtsh = (itm_range_hdr_t *)(rth + 1);
        p = (unsigned char *)(rtsh + 1);

        TRACE_MESSAGE('p', ("(&)between=%ld ", range_place.itm_ptr));
        printi(0, RNPREF "between ");
        for (i = 0; i < rth->number; i++) {
                if (0 != i)     printi(0, "\t ");
                printi(0, "0x");
                for (j = 0; j < rtsh->len; j++) {
                        printi(0, "%02x", *(p++));
                }
                printi(0, " - ");
                printi(0, "0x");
                for (j = 0; j < rtsh->len; j++) {
                        printi(0, "%02x", *(p++));
                }
                if (i < (rth->number - 1)) {
                        printi(0, ",\n");
                } else {
                        printi(0, ";\n");
                }
        }
}


/*
 * Dump escape sequence
 */
static void
dump_escapeseq(itm_hdr_t        *itm_hdr, itm_place_t escapeseq_place)
{
        itm_tbl_hdr_t           *eth;
        itm_escapeseq_hdr_t     *eh;
        itm_data_t              *d;
        itm_data_t              data;

        long                    i;


        eth = (itm_tbl_hdr_t *)(ADDR(escapeseq_place));
        eh = (itm_escapeseq_hdr_t *)(eth + 1);
        d = (itm_data_t *)(eh + 1);
        TRACE_MESSAGE('p', ("(&)escseq=%ld ", escapeseq_place.itm_ptr));
        printi(1, RNPREF "escapceseq {");

        for (i = 0; i < eth->number; i++, d++) {
                if (0 != i)     printi(0, " ");
                data = *d;
                if ((sizeof (itm_place_t)) < data.size) {
                        data.place.itm_ptr = (itm_place2_t)ADDR(d->place);
                }
                printi(0, "0x%s;", data_to_hexadecimal(&data));
        }
        printi(-1, "}\n");
}


static void
printi(int c, char      *format, ...)
{
        static int      indent_level;
        static int      new_line = 1;
        int             i;
        va_list         ap;
        va_start(ap, format);

        if (c < 0) {
                indent_level += c;
                if (indent_level < 0) {
                        indent_level = 0;
                }
        }
        if (new_line) {
                for (i = indent_level; 0 < i; i -= 1) {
                        (void) putchar('\t');
                }
        }
        if (0 < c) {
                indent_level += c;
                if (indent_level < 0) {
                        indent_level = 0;
                }
        }

        if (NULL == strchr(format, '\n')) {
                new_line = 0;
        } else {
                new_line = 1;
        }

        (void) vfprintf(stdout, format, ap);

        va_end(ap);
}


static char *
name_place_to_str(itm_hdr_t     *itm_hdr, itm_place2_t place)
{
        itm_data_t      d;

        if (0 != place) {
                d = *((itm_data_t *)ADDR2(place));
                if ((sizeof (itm_place_t)) < d.size) {
                        d.place.itm_ptr = (itm_place2_t)ADDR(d.place);
                }
        } else {
                d.size = 0;
                d.place.itm_ptr = 0;
        }
        return (name_to_str(&d));
}

static char *
tbl_name(itm_hdr_t      *itm_hdr, itm_tbl_hdr_t         *tbl_hdr)
{
        if (ITM_TBL_OP_INIT == tbl_hdr->type) {
                return (RNPREF "init");
        } else if (ITM_TBL_OP_RESET == tbl_hdr->type) {
                return (RNPREF "reset");
        } else if (tbl_hdr->name.itm_ptr) {
                return (name_place_to_str(itm_hdr, tbl_hdr->name.itm_ptr));
        } else {
                return (NULL);
        }
}


static char *
reg_name(itm_hdr_t      *itm_hdr, itm_place_t op)
{
        itm_info_hdr_t          *info_hdr;
        static char             sbuf[32];
        itm_num_t               reg_num;

        reg_num = (itm_num_t)(op.itm_ptr);
        if (0 == itm_hdr->info_hdr.itm_ptr) {
                (void) sprintf(sbuf, "reg%ld\n", reg_num);
                return (sbuf);
        } else {
                info_hdr = INFO_HDR(itm_hdr);
                return (name_place_to_str(
                        itm_hdr,
                        info_hdr->reg_plc_tbl.place.itm_ptr +
                        (reg_num        *sizeof (itm_data_t))));
        }
}

static itm_hdr_t *
itm_attach(const char   *itm_file)
{
        itm_hdr_t       *itm_hdr;
        struct stat     st;
        int             fd;

        fd = open(itm_file, O_RDONLY, 0);
        if (fd == -1) {
                PERROR(gettext("open()"));
                return  (NULL);
        }

        if (fstat(fd, &st) == -1) {
                PERROR(gettext("fstat()"));
                return  (NULL);
        }
        itm_hdr = (void *) mmap(NULL, st.st_size,
                                    PROT_READ, MAP_SHARED, fd, 0);
        if (MAP_FAILED == itm_hdr) {
                PERROR(gettext("mmap()"));
                return  (NULL);
        }

        (void) close(fd);

        if ((itm_hdr->ident[0] != ITM_IDENT_0) ||
            (itm_hdr->ident[1] != ITM_IDENT_1) ||
            (itm_hdr->ident[2] != ITM_IDENT_2) ||
            (itm_hdr->ident[3] != ITM_IDENT_3)) {
                itm_error(gettext("magic number error\n"));
                return  (NULL);
        }
        if ((itm_hdr->version[0] != ITM_VER_0) ||
            (itm_hdr->version[1] != ITM_VER_1) ||
            (itm_hdr->version[2] != ITM_VER_2) ||
#if defined(_LITTLE_ENDIAN)
#if defined(_LP64)
            ((itm_hdr->spec[3] != ITM_SPEC_3_32_LITTLE_ENDIAN) &&
            (itm_hdr->spec[3] != ITM_SPEC_3_64_LITTLE_ENDIAN))) {
#else
            (itm_hdr->spec[3] != ITM_SPEC_3_32_LITTLE_ENDIAN)) {
#endif
#else
#if defined(_LP64)
            ((itm_hdr->spec[3] != ITM_SPEC_3_32_BIG_ENDIAN) &&
            (itm_hdr->spec[3] != ITM_SPEC_3_64_BIG_ENDIAN))) {
#else
            (itm_hdr->spec[3] != ITM_SPEC_3_32_BIG_ENDIAN)) {
#endif
#endif
                itm_error(gettext("version number error\n"));
                return  (NULL);
        }
        if (itm_hdr->itm_size.itm_ptr != st.st_size) {
                itm_error(gettext(
                        "size error: expected=%1$d current=%2$d\n"),
                        (size_t)(itm_hdr->itm_size.itm_ptr), st.st_size);
                return (NULL);
        }

        return (itm_hdr);
}