Home | History | Annotate | Line # | Download | only in disasm
disasm_format.c revision 1.1.20.2
      1  1.1.20.2  rpaulo /*	$NetBSD: disasm_format.c,v 1.1.20.2 2006/09/09 02:40:23 rpaulo Exp $	*/
      2  1.1.20.2  rpaulo 
      3  1.1.20.2  rpaulo /*-
      4  1.1.20.2  rpaulo  * Copyright (c) 2000-2003 Marcel Moolenaar
      5  1.1.20.2  rpaulo  * All rights reserved.
      6  1.1.20.2  rpaulo  *
      7  1.1.20.2  rpaulo  * Redistribution and use in source and binary forms, with or without
      8  1.1.20.2  rpaulo  * modification, are permitted provided that the following conditions
      9  1.1.20.2  rpaulo  * are met:
     10  1.1.20.2  rpaulo  *
     11  1.1.20.2  rpaulo  * 1. Redistributions of source code must retain the above copyright
     12  1.1.20.2  rpaulo  *    notice, this list of conditions and the following disclaimer.
     13  1.1.20.2  rpaulo  * 2. Redistributions in binary form must reproduce the above copyright
     14  1.1.20.2  rpaulo  *    notice, this list of conditions and the following disclaimer in the
     15  1.1.20.2  rpaulo  *    documentation and/or other materials provided with the distribution.
     16  1.1.20.2  rpaulo  *
     17  1.1.20.2  rpaulo  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     18  1.1.20.2  rpaulo  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     19  1.1.20.2  rpaulo  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     20  1.1.20.2  rpaulo  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     21  1.1.20.2  rpaulo  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     22  1.1.20.2  rpaulo  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23  1.1.20.2  rpaulo  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24  1.1.20.2  rpaulo  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25  1.1.20.2  rpaulo  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     26  1.1.20.2  rpaulo  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  1.1.20.2  rpaulo  */
     28  1.1.20.2  rpaulo 
     29  1.1.20.2  rpaulo #include "opt_ddb.h"
     30  1.1.20.2  rpaulo 
     31  1.1.20.2  rpaulo #include <sys/cdefs.h>
     32  1.1.20.2  rpaulo /* __FBSDID("$FreeBSD: src/sys/ia64/disasm/disasm_format.c,v 1.2 2005/01/06 22:18:22 imp Exp $"); */
     33  1.1.20.2  rpaulo 
     34  1.1.20.2  rpaulo #include <sys/param.h>
     35  1.1.20.2  rpaulo #include <sys/systm.h>
     36  1.1.20.2  rpaulo 
     37  1.1.20.2  rpaulo #ifdef DDB
     38  1.1.20.2  rpaulo 
     39  1.1.20.2  rpaulo #include <ia64/disasm/disasm_int.h>
     40  1.1.20.2  rpaulo #include <ia64/disasm/disasm.h>
     41  1.1.20.2  rpaulo 
     42  1.1.20.2  rpaulo /*
     43  1.1.20.2  rpaulo  * Mnemonics (keep in sync with enum asm_op).
     44  1.1.20.2  rpaulo  */
     45  1.1.20.2  rpaulo static const char *asm_mnemonics[] = {
     46  1.1.20.2  rpaulo 	"",
     47  1.1.20.2  rpaulo 	"add", "addl", "addp4", "adds", "alloc", "and", "andcm",
     48  1.1.20.2  rpaulo 	"br", "break", "brl", "brp", "bsw",
     49  1.1.20.2  rpaulo 	"chk", "clrrrb", "cmp", "cmp4", "cmp8xchg16", "cmpxchg1", "cmpxchg2",
     50  1.1.20.2  rpaulo 	"cmpxchg4", "cmpxchg8", "cover", "czx1", "czx2",
     51  1.1.20.2  rpaulo 	"dep",
     52  1.1.20.2  rpaulo 	"epc", "extr",
     53  1.1.20.2  rpaulo 	"famax", "famin", "fand", "fandcm", "fc", "fchkf", "fclass", "fclrf",
     54  1.1.20.2  rpaulo 	"fcmp", "fcvt", "fetchadd4", "fetchadd8", "flushrs", "fma", "fmax",
     55  1.1.20.2  rpaulo 	"fmerge", "fmin", "fmix", "fms", "fnma", "for", "fpack", "fpamax",
     56  1.1.20.2  rpaulo 	"fpamin", "fpcmp", "fpcvt", "fpma", "fpmax", "fpmerge", "fpmin",
     57  1.1.20.2  rpaulo 	"fpms", "fpnma", "fprcpa", "fprsqrta", "frcpa", "frsqrta", "fselect",
     58  1.1.20.2  rpaulo 	"fsetc", "fswap", "fsxt", "fwb", "fxor",
     59  1.1.20.2  rpaulo 	"getf",
     60  1.1.20.2  rpaulo 	"invala", "itc", "itr",
     61  1.1.20.2  rpaulo 	"ld1", "ld16", "ld2", "ld4", "ld8", "ldf", "ldf8", "ldfd", "ldfe",
     62  1.1.20.2  rpaulo 	"ldfp8", "ldfpd", "ldfps", "ldfs", "lfetch", "loadrs",
     63  1.1.20.2  rpaulo 	"mf", "mix1", "mix2", "mix4", "mov", "movl", "mux1", "mux2",
     64  1.1.20.2  rpaulo 	"nop",
     65  1.1.20.2  rpaulo 	"or",
     66  1.1.20.2  rpaulo 	"pack2", "pack4", "padd1", "padd2", "padd4", "pavg1", "pavg2",
     67  1.1.20.2  rpaulo 	"pavgsub1", "pavgsub2", "pcmp1", "pcmp2", "pcmp4", "pmax1", "pmax2",
     68  1.1.20.2  rpaulo 	"pmin1", "pmin2", "pmpy2", "pmpyshr2", "popcnt", "probe", "psad1",
     69  1.1.20.2  rpaulo 	"pshl2", "pshl4", "pshladd2", "pshr2", "pshr4", "pshradd2", "psub1",
     70  1.1.20.2  rpaulo 	"psub2", "psub4", "ptc", "ptr",
     71  1.1.20.2  rpaulo 	"rfi", "rsm", "rum",
     72  1.1.20.2  rpaulo 	"setf", "shl", "shladd", "shladdp4", "shr", "shrp", "srlz", "ssm",
     73  1.1.20.2  rpaulo 	"st1", "st16", "st2", "st4", "st8", "stf", "stf8", "stfd", "stfe",
     74  1.1.20.2  rpaulo 	"stfs", "sub", "sum", "sxt1", "sxt2", "sxt4", "sync",
     75  1.1.20.2  rpaulo 	"tak", "tbit", "thash", "tnat", "tpa", "ttag",
     76  1.1.20.2  rpaulo 	"unpack1", "unpack2", "unpack4",
     77  1.1.20.2  rpaulo 	"xchg1", "xchg2", "xchg4", "xchg8", "xma", "xor",
     78  1.1.20.2  rpaulo 	"zxt1", "zxt2", "zxt4"
     79  1.1.20.2  rpaulo };
     80  1.1.20.2  rpaulo 
     81  1.1.20.2  rpaulo /*
     82  1.1.20.2  rpaulo  * Completers (keep in sync with enum asm_cmpltr_type).
     83  1.1.20.2  rpaulo  */
     84  1.1.20.2  rpaulo static const char *asm_completers[] = {
     85  1.1.20.2  rpaulo 	"",
     86  1.1.20.2  rpaulo 	".0", ".1",
     87  1.1.20.2  rpaulo 	".a", ".acq", ".and",
     88  1.1.20.2  rpaulo 	".b", ".bias",
     89  1.1.20.2  rpaulo 	".c.clr", ".c.clr.acq", ".c.nc", ".call", ".cexit", ".cloop", ".clr",
     90  1.1.20.2  rpaulo 	".ctop",
     91  1.1.20.2  rpaulo 	".d", ".dc.dc", ".dc.nt", ".dpnt", ".dptk",
     92  1.1.20.2  rpaulo 	".e", ".eq", ".excl", ".exit", ".exp",
     93  1.1.20.2  rpaulo 	".f", ".fault", ".few", ".fill", ".fx", ".fxu",
     94  1.1.20.2  rpaulo 	".g", ".ga", ".ge", ".gt",
     95  1.1.20.2  rpaulo 	".h", ".hu",
     96  1.1.20.2  rpaulo 	".i", ".ia", ".imp",
     97  1.1.20.2  rpaulo 	".l", ".le", ".loop", ".lr", ".lt", ".ltu",
     98  1.1.20.2  rpaulo 	".m", ".many",
     99  1.1.20.2  rpaulo 	".nc", ".ne", ".neq", ".nl", ".nle", ".nlt", ".nm", ".nr", ".ns",
    100  1.1.20.2  rpaulo 	".nt.dc", ".nt.nt", ".nt.tk", ".nt1", ".nt2", ".nta", ".nz",
    101  1.1.20.2  rpaulo 	".or", ".or.andcm", ".ord",
    102  1.1.20.2  rpaulo 	".pr",
    103  1.1.20.2  rpaulo 	".r", ".raz", ".rel", ".ret", ".rw",
    104  1.1.20.2  rpaulo 	".s", ".s0", ".s1", ".s2", ".s3", ".sa", ".se", ".sig", ".spill",
    105  1.1.20.2  rpaulo 	".spnt", ".sptk", ".sss",
    106  1.1.20.2  rpaulo 	".tk.dc", ".tk.nt", ".tk.tk", ".trunc",
    107  1.1.20.2  rpaulo 	".u", ".unc", ".unord", ".uss", ".uus", ".uuu",
    108  1.1.20.2  rpaulo 	".w", ".wexit", ".wtop",
    109  1.1.20.2  rpaulo 	".x", ".xf",
    110  1.1.20.2  rpaulo 	".z"
    111  1.1.20.2  rpaulo };
    112  1.1.20.2  rpaulo 
    113  1.1.20.2  rpaulo void
    114  1.1.20.2  rpaulo asm_completer(const struct asm_cmpltr *c, char *buf)
    115  1.1.20.2  rpaulo {
    116  1.1.20.2  rpaulo 	strcpy(buf, asm_completers[c->c_type]);
    117  1.1.20.2  rpaulo }
    118  1.1.20.2  rpaulo 
    119  1.1.20.2  rpaulo void
    120  1.1.20.2  rpaulo asm_mnemonic(enum asm_op op, char *buf)
    121  1.1.20.2  rpaulo {
    122  1.1.20.2  rpaulo 	strcpy(buf, asm_mnemonics[(op < ASM_OP_INTERNAL_OPCODES) ? op : 0]);
    123  1.1.20.2  rpaulo }
    124  1.1.20.2  rpaulo 
    125  1.1.20.2  rpaulo void
    126  1.1.20.2  rpaulo asm_operand(const struct asm_oper *o, char *buf, uint64_t ip)
    127  1.1.20.2  rpaulo {
    128  1.1.20.2  rpaulo 	const char *n;
    129  1.1.20.2  rpaulo 
    130  1.1.20.2  rpaulo 	n = "";
    131  1.1.20.2  rpaulo 	switch (o->o_type) {
    132  1.1.20.2  rpaulo 	case ASM_OPER_AREG:
    133  1.1.20.2  rpaulo 		switch ((int)o->o_value) {
    134  1.1.20.2  rpaulo 		case AR_K0: n = "k0"; break;
    135  1.1.20.2  rpaulo 		case AR_K1: n = "k1"; break;
    136  1.1.20.2  rpaulo 		case AR_K2: n = "k2"; break;
    137  1.1.20.2  rpaulo 		case AR_K3: n = "k3"; break;
    138  1.1.20.2  rpaulo 		case AR_K4: n = "k4"; break;
    139  1.1.20.2  rpaulo 		case AR_K5: n = "k5"; break;
    140  1.1.20.2  rpaulo 		case AR_K6: n = "k6"; break;
    141  1.1.20.2  rpaulo 		case AR_K7: n = "k7"; break;
    142  1.1.20.2  rpaulo 		case AR_RSC: n = "rsc"; break;
    143  1.1.20.2  rpaulo 		case AR_BSP: n = "bsp"; break;
    144  1.1.20.2  rpaulo 		case AR_BSPSTORE: n = "bspstore"; break;
    145  1.1.20.2  rpaulo 		case AR_RNAT: n = "rnat"; break;
    146  1.1.20.2  rpaulo 		case AR_FCR: n = "fcr"; break;
    147  1.1.20.2  rpaulo 		case AR_EFLAG: n = "eflag"; break;
    148  1.1.20.2  rpaulo 		case AR_CSD: n = "csd"; break;
    149  1.1.20.2  rpaulo 		case AR_SSD: n = "ssd"; break;
    150  1.1.20.2  rpaulo 		case AR_CFLG: n = "cflg"; break;
    151  1.1.20.2  rpaulo 		case AR_FSR: n = "fsr"; break;
    152  1.1.20.2  rpaulo 		case AR_FIR: n = "fir"; break;
    153  1.1.20.2  rpaulo 		case AR_FDR: n = "fdr"; break;
    154  1.1.20.2  rpaulo 		case AR_CCV: n = "ccv"; break;
    155  1.1.20.2  rpaulo 		case AR_UNAT: n = "unat"; break;
    156  1.1.20.2  rpaulo 		case AR_FPSR: n = "fpsr"; break;
    157  1.1.20.2  rpaulo 		case AR_ITC: n = "itc"; break;
    158  1.1.20.2  rpaulo 		case AR_PFS: n = "pfs"; break;
    159  1.1.20.2  rpaulo 		case AR_LC: n = "lc"; break;
    160  1.1.20.2  rpaulo 		case AR_EC: n = "ec"; break;
    161  1.1.20.2  rpaulo 		default:
    162  1.1.20.2  rpaulo 			sprintf(buf, "ar%d", (int)o->o_value);
    163  1.1.20.2  rpaulo 			return;
    164  1.1.20.2  rpaulo 		}
    165  1.1.20.2  rpaulo 		sprintf(buf, "ar.%s", n);
    166  1.1.20.2  rpaulo 		return;
    167  1.1.20.2  rpaulo 	case ASM_OPER_BREG:
    168  1.1.20.2  rpaulo 		if (o->o_value != 0)
    169  1.1.20.2  rpaulo 			sprintf(buf, "b%d", (int)o->o_value);
    170  1.1.20.2  rpaulo 		else
    171  1.1.20.2  rpaulo 			strcpy(buf, "rp");
    172  1.1.20.2  rpaulo 		return;
    173  1.1.20.2  rpaulo 	case ASM_OPER_CPUID:
    174  1.1.20.2  rpaulo 		n = "cpuid";
    175  1.1.20.2  rpaulo 		break;
    176  1.1.20.2  rpaulo 	case ASM_OPER_CREG:
    177  1.1.20.2  rpaulo 		switch ((int)o->o_value) {
    178  1.1.20.2  rpaulo 		case CR_DCR: n = "dcr"; break;
    179  1.1.20.2  rpaulo 		case CR_ITM: n = "itm"; break;
    180  1.1.20.2  rpaulo 		case CR_IVA: n = "iva"; break;
    181  1.1.20.2  rpaulo 		case CR_PTA: n = "pta"; break;
    182  1.1.20.2  rpaulo 		case CR_IPSR: n = "ipsr"; break;
    183  1.1.20.2  rpaulo 		case CR_ISR: n = "isr"; break;
    184  1.1.20.2  rpaulo 		case CR_IIP: n = "iip"; break;
    185  1.1.20.2  rpaulo 		case CR_IFA: n = "ifa"; break;
    186  1.1.20.2  rpaulo 		case CR_ITIR: n = "itir"; break;
    187  1.1.20.2  rpaulo 		case CR_IIPA: n = "iipa"; break;
    188  1.1.20.2  rpaulo 		case CR_IFS: n = "ifs"; break;
    189  1.1.20.2  rpaulo 		case CR_IIM: n = "iim"; break;
    190  1.1.20.2  rpaulo 		case CR_IHA: n = "iha"; break;
    191  1.1.20.2  rpaulo 		case CR_LID: n = "lid"; break;
    192  1.1.20.2  rpaulo 		case CR_IVR: n = "ivr"; break;
    193  1.1.20.2  rpaulo 		case CR_TPR: n = "tpr"; break;
    194  1.1.20.2  rpaulo 		case CR_EOI: n = "eoi"; break;
    195  1.1.20.2  rpaulo 		case CR_IRR0: n = "irr0"; break;
    196  1.1.20.2  rpaulo 		case CR_IRR1: n = "irr1"; break;
    197  1.1.20.2  rpaulo 		case CR_IRR2: n = "irr2"; break;
    198  1.1.20.2  rpaulo 		case CR_IRR3: n = "irr3"; break;
    199  1.1.20.2  rpaulo 		case CR_ITV: n = "itv"; break;
    200  1.1.20.2  rpaulo 		case CR_PMV: n = "pmv"; break;
    201  1.1.20.2  rpaulo 		case CR_CMCV: n = "cmcv"; break;
    202  1.1.20.2  rpaulo 		case CR_LRR0: n = "lrr0"; break;
    203  1.1.20.2  rpaulo 		case CR_LRR1: n = "lrr1"; break;
    204  1.1.20.2  rpaulo 		default:
    205  1.1.20.2  rpaulo 			sprintf(buf, "cr%d", (int)o->o_value);
    206  1.1.20.2  rpaulo 			return;
    207  1.1.20.2  rpaulo 		}
    208  1.1.20.2  rpaulo 		sprintf(buf, "cr.%s", n);
    209  1.1.20.2  rpaulo 		return;
    210  1.1.20.2  rpaulo 	case ASM_OPER_DBR:
    211  1.1.20.2  rpaulo 		n = "dbr";
    212  1.1.20.2  rpaulo 		break;
    213  1.1.20.2  rpaulo 	case ASM_OPER_DISP:
    214  1.1.20.2  rpaulo 		sprintf(buf, "%lx", ip + o->o_value);
    215  1.1.20.2  rpaulo 		return;
    216  1.1.20.2  rpaulo 	case ASM_OPER_DTR:
    217  1.1.20.2  rpaulo 		n = "dtr";
    218  1.1.20.2  rpaulo 		break;
    219  1.1.20.2  rpaulo 	case ASM_OPER_FREG:
    220  1.1.20.2  rpaulo 		sprintf(buf, "f%d", (int)o->o_value);
    221  1.1.20.2  rpaulo 		return;
    222  1.1.20.2  rpaulo 	case ASM_OPER_GREG:
    223  1.1.20.2  rpaulo 		break;
    224  1.1.20.2  rpaulo 	case ASM_OPER_IBR:
    225  1.1.20.2  rpaulo 		n = "ibr";
    226  1.1.20.2  rpaulo 		break;
    227  1.1.20.2  rpaulo 	case ASM_OPER_IMM:
    228  1.1.20.2  rpaulo 		sprintf(buf, "0x%lx", o->o_value);
    229  1.1.20.2  rpaulo 		return;
    230  1.1.20.2  rpaulo 	case ASM_OPER_IP:
    231  1.1.20.2  rpaulo 		strcpy(buf, "ip");
    232  1.1.20.2  rpaulo 		return;
    233  1.1.20.2  rpaulo 	case ASM_OPER_ITR:
    234  1.1.20.2  rpaulo 		n = "itr";
    235  1.1.20.2  rpaulo 		break;
    236  1.1.20.2  rpaulo 	case ASM_OPER_MEM:
    237  1.1.20.2  rpaulo 		n = "";
    238  1.1.20.2  rpaulo 		break;
    239  1.1.20.2  rpaulo 	case ASM_OPER_MSR:
    240  1.1.20.2  rpaulo 		n = "msr";
    241  1.1.20.2  rpaulo 		break;
    242  1.1.20.2  rpaulo 	case ASM_OPER_PKR:
    243  1.1.20.2  rpaulo 		n = "pkr";
    244  1.1.20.2  rpaulo 		break;
    245  1.1.20.2  rpaulo 	case ASM_OPER_PMC:
    246  1.1.20.2  rpaulo 		n = "pmc";
    247  1.1.20.2  rpaulo 		break;
    248  1.1.20.2  rpaulo 	case ASM_OPER_PMD:
    249  1.1.20.2  rpaulo 		n = "pmd";
    250  1.1.20.2  rpaulo 		break;
    251  1.1.20.2  rpaulo 	case ASM_OPER_PR:
    252  1.1.20.2  rpaulo 		strcpy(buf, "pr");
    253  1.1.20.2  rpaulo                 return;
    254  1.1.20.2  rpaulo 	case ASM_OPER_PR_ROT:
    255  1.1.20.2  rpaulo 		strcpy(buf, "pr.rot");
    256  1.1.20.2  rpaulo 		return;
    257  1.1.20.2  rpaulo 	case ASM_OPER_PREG:
    258  1.1.20.2  rpaulo 		sprintf(buf, "p%d", (int)o->o_value);
    259  1.1.20.2  rpaulo 		return;
    260  1.1.20.2  rpaulo 	case ASM_OPER_PSR:
    261  1.1.20.2  rpaulo 		strcpy(buf, "psr");
    262  1.1.20.2  rpaulo 		return;
    263  1.1.20.2  rpaulo 	case ASM_OPER_PSR_L:
    264  1.1.20.2  rpaulo 		strcpy(buf, "psr.l");
    265  1.1.20.2  rpaulo 		return;
    266  1.1.20.2  rpaulo 	case ASM_OPER_PSR_UM:
    267  1.1.20.2  rpaulo 		strcpy(buf, "psr.um");
    268  1.1.20.2  rpaulo 		return;
    269  1.1.20.2  rpaulo 	case ASM_OPER_RR:
    270  1.1.20.2  rpaulo 		n = "rr";
    271  1.1.20.2  rpaulo 		break;
    272  1.1.20.2  rpaulo 	case ASM_OPER_NONE:
    273  1.1.20.2  rpaulo 		KASSERT(0);
    274  1.1.20.2  rpaulo 		break;
    275  1.1.20.2  rpaulo 	}
    276  1.1.20.2  rpaulo 	if (n[0] != '\0')
    277  1.1.20.2  rpaulo 		buf += sprintf(buf, "%s[", n);
    278  1.1.20.2  rpaulo 	switch ((int)o->o_value) {
    279  1.1.20.2  rpaulo 	case 1:	strcpy(buf, "gp"); buf += 2; break;
    280  1.1.20.2  rpaulo 	case 12: strcpy(buf, "sp"); buf += 2; break;
    281  1.1.20.2  rpaulo 	case 13: strcpy(buf, "tp"); buf += 2; break;
    282  1.1.20.2  rpaulo 	default: buf += sprintf(buf, "r%d", (int)o->o_value); break;
    283  1.1.20.2  rpaulo 	}
    284  1.1.20.2  rpaulo 	if (n[0] != '\0')
    285  1.1.20.2  rpaulo 		strcpy(buf, "]");
    286  1.1.20.2  rpaulo }
    287  1.1.20.2  rpaulo 
    288  1.1.20.2  rpaulo void
    289  1.1.20.2  rpaulo asm_print_bundle(const struct asm_bundle *b, uint64_t ip)
    290  1.1.20.2  rpaulo {
    291  1.1.20.2  rpaulo 	asm_print_inst(b, 0, ip);
    292  1.1.20.2  rpaulo 	asm_print_inst(b, 1, ip);
    293  1.1.20.2  rpaulo 	asm_print_inst(b, 2, ip);
    294  1.1.20.2  rpaulo }
    295  1.1.20.2  rpaulo 
    296  1.1.20.2  rpaulo void
    297  1.1.20.2  rpaulo asm_print_inst(const struct asm_bundle *b, int slot, uint64_t ip)
    298  1.1.20.2  rpaulo {
    299  1.1.20.2  rpaulo 	char buf[32];
    300  1.1.20.2  rpaulo 	const struct asm_inst *i;
    301  1.1.20.2  rpaulo 	const char *tmpl;
    302  1.1.20.2  rpaulo 	int n, w;
    303  1.1.20.2  rpaulo 
    304  1.1.20.2  rpaulo 	tmpl = b->b_templ + slot;
    305  1.1.20.2  rpaulo 	if (*tmpl == ';' || (slot == 2 && b->b_templ[1] == ';'))
    306  1.1.20.2  rpaulo 		tmpl++;
    307  1.1.20.2  rpaulo 	i = b->b_inst + slot;
    308  1.1.20.2  rpaulo 	if (*tmpl == 'L' || i->i_op == ASM_OP_NONE)
    309  1.1.20.2  rpaulo 		return;
    310  1.1.20.2  rpaulo 
    311  1.1.20.2  rpaulo 	/* Address + slot. */
    312  1.1.20.2  rpaulo 	printf("%lx[%c] ", ip + slot, *tmpl);
    313  1.1.20.2  rpaulo 
    314  1.1.20.2  rpaulo 	/* Predicate. */
    315  1.1.20.2  rpaulo 	if (i->i_oper[0].o_value != 0) {
    316  1.1.20.2  rpaulo 		asm_operand(i->i_oper+0, buf, ip);
    317  1.1.20.2  rpaulo 		printf("(%s)", buf);
    318  1.1.20.2  rpaulo 		w = strlen(buf);
    319  1.1.20.2  rpaulo 	} else
    320  1.1.20.2  rpaulo 		w = 0;
    321  1.1.20.2  rpaulo 	while (w++ < 8)
    322  1.1.20.2  rpaulo 		printf(" ");
    323  1.1.20.2  rpaulo 
    324  1.1.20.2  rpaulo 	/* Mnemonic & completers. */
    325  1.1.20.2  rpaulo 	asm_mnemonic(i->i_op, buf);
    326  1.1.20.2  rpaulo 	printf(buf);
    327  1.1.20.2  rpaulo 	w = strlen(buf);
    328  1.1.20.2  rpaulo 	n = 0;
    329  1.1.20.2  rpaulo 	while (n < i->i_ncmpltrs) {
    330  1.1.20.2  rpaulo 		asm_completer(i->i_cmpltr + n, buf);
    331  1.1.20.2  rpaulo 		printf(buf);
    332  1.1.20.2  rpaulo 		w += strlen(buf);
    333  1.1.20.2  rpaulo 		n++;
    334  1.1.20.2  rpaulo 	}
    335  1.1.20.2  rpaulo 	while (w++ < 15)
    336  1.1.20.2  rpaulo 		printf(" ");
    337  1.1.20.2  rpaulo 	printf(" ");
    338  1.1.20.2  rpaulo 
    339  1.1.20.2  rpaulo 	/* Operands. */
    340  1.1.20.2  rpaulo 	n = 1;
    341  1.1.20.2  rpaulo 	while (n < 7 && i->i_oper[n].o_type != ASM_OPER_NONE) {
    342  1.1.20.2  rpaulo 		if (n > 1) {
    343  1.1.20.2  rpaulo 			if (n == i->i_srcidx)
    344  1.1.20.2  rpaulo 				printf(" = ");
    345  1.1.20.2  rpaulo 			else
    346  1.1.20.2  rpaulo 				printf(", ");
    347  1.1.20.2  rpaulo 		}
    348  1.1.20.2  rpaulo 		asm_operand(i->i_oper + n, buf, ip);
    349  1.1.20.2  rpaulo 		printf(buf);
    350  1.1.20.2  rpaulo 		n++;
    351  1.1.20.2  rpaulo 	}
    352  1.1.20.2  rpaulo 	printf("\n");
    353  1.1.20.2  rpaulo }
    354  1.1.20.2  rpaulo 
    355  1.1.20.2  rpaulo #endif
    356