plan9front/sys/src/libdtracy/dtefmt.c

115 lines
2.1 KiB
C

#include <u.h>
#include <libc.h>
#include <dtracy.h>
char *dtvarnames[DTNVARS] = {
[DTV_ARG0] "arg0",
[DTV_ARG1] "arg1",
[DTV_ARG2] "arg2",
[DTV_ARG3] "arg3",
[DTV_ARG4] "arg4",
[DTV_ARG5] "arg5",
[DTV_ARG6] "arg6",
[DTV_ARG7] "arg7",
[DTV_ARG8] "arg8",
[DTV_ARG9] "arg9",
[DTV_PID] "pid",
[DTV_TIME] "time",
[DTV_PROBE] "probe",
[DTV_MACHNO] "machno",
};
int
dtefmt(Fmt *f)
{
u32int ins;
u8int op, a, b, c;
u64int x;
static char *opcodes[] = {
[DTE_ADD] "ADD",
[DTE_SUB] "SUB",
[DTE_MUL] "MUL",
[DTE_UDIV] "UDIV",
[DTE_UMOD] "UMOD",
[DTE_SDIV] "SDIV",
[DTE_SMOD] "SMOD",
[DTE_AND] "AND",
[DTE_OR] "OR",
[DTE_XOR] "XOR",
[DTE_XNOR] "XNOR",
[DTE_LSL] "LSL",
[DTE_LSR] "LSR",
[DTE_ASR] "ASR",
[DTE_SEQ] "SEQ",
[DTE_SNE] "SNE",
[DTE_SLT] "SLT",
[DTE_SLE] "SLE",
[DTE_LDI] "LDI",
[DTE_XORI] "XORI",
[DTE_BEQ] "BEQ",
[DTE_BNE] "BNE",
[DTE_BLT] "BLT",
[DTE_BLE] "BLE",
[DTE_LDV] "LDV",
[DTE_RET] "RET",
[DTE_ZXT] "ZXT",
[DTE_SXT] "SXT",
};
ins = va_arg(f->args, u32int);
op = ins >> 24;
a = ins >> 16;
b = ins >> 8;
c = ins;
switch(op){
case DTE_ADD:
case DTE_SUB:
case DTE_MUL:
case DTE_UDIV:
case DTE_UMOD:
case DTE_SDIV:
case DTE_SMOD:
case DTE_AND:
case DTE_OR:
case DTE_XOR:
case DTE_XNOR:
case DTE_LSL:
case DTE_LSR:
case DTE_ASR:
case DTE_SEQ:
case DTE_SNE:
case DTE_SLT:
case DTE_SLE:
fmtprint(f, "%s R%d, R%d, R%d", opcodes[op], a, b, c);
break;
case DTE_LDI:
case DTE_XORI:
x = (s64int)ins << 40 >> 54 << (ins >> 8 & 63);
fmtprint(f, "%s $%#llx, R%d", opcodes[op], x, c);
break;
case DTE_BEQ:
case DTE_BNE:
case DTE_BLT:
case DTE_BLE:
fmtprint(f, "%s R%d, R%d, +%d", opcodes[op], a, b, c);
break;
case DTE_LDV:
if(a >= DTNVARS || dtvarnames[a] == nil)
fmtprint(f, "%s V%d, R%d", opcodes[op], a, b);
else
fmtprint(f, "%s %s, R%d", opcodes[op], dtvarnames[a], b);
break;
case DTE_ZXT:
case DTE_SXT:
fmtprint(f, "%s R%d, $%d, R%d", opcodes[op], a, b, c);
break;
case DTE_RET:
fmtprint(f, "RET R%d", a);
break;
default:
fmtprint(f, "??? (%#.8ux)", op);
break;
}
return 0;
}