diff options
Diffstat (limited to 'opcodes/hppa-dis.c')
-rw-r--r-- | opcodes/hppa-dis.c | 79 |
1 files changed, 77 insertions, 2 deletions
diff --git a/opcodes/hppa-dis.c b/opcodes/hppa-dis.c index 4a7fd06..42c364b 100644 --- a/opcodes/hppa-dis.c +++ b/opcodes/hppa-dis.c @@ -46,6 +46,7 @@ typedef unsigned int CORE_ADDR; /* Get at various relevent fields of an instruction word. */ #define MASK_5 0x1f +#define MASK_10 0x3ff #define MASK_11 0x7ff #define MASK_14 0x3fff #define MASK_21 0x1fffff @@ -127,8 +128,11 @@ static const char float_comp_names[][8] = }; static const char *const signed_unsigned_names[][3] = {",u", ",s"}; static const char *const mix_half_names[][3] = {",l", ",r"}; -static const char *const saturation_names[][3] = {",us", ",ss", 0, ""}; - +static const char *const saturation_names[][4] = {",us", ",ss", 0, ""}; +static const char *const read_write_names[][3] = {",r", ",w"}; +static const char *const add_compl_names[] = { + 0, "", ",l", ",tsv" +}; /* For a bunch of different instructions form an index into a completer name table. */ @@ -235,6 +239,14 @@ extract_5R_store (word) return (word >> 16 & MASK_5); } +/* extract the 10 bit immediate field from a {sr}sm instruction */ +static unsigned +extract_10U_store (word) + unsigned word; +{ + return (word >> 16 & MASK_10); +} + /* extract the immediate field from a bb instruction */ static unsigned extract_5Q_store (word) @@ -440,12 +452,68 @@ print_insn_hppa (memaddr, info) (*info->fprintf_func) (info->stream, "%s ", short_bytes_compl_names[GET_COMPL (insn)]); break; + case 'L': + (*info->fprintf_func) (info->stream, ",l"); + break; + case 'w': + (*info->fprintf_func) (info->stream, "%s ", + read_write_names[GET_FIELD (insn, 25, 25)]); + break; + case 'W': + (*info->fprintf_func) (info->stream, ",w"); + break; + case 'r': + if (GET_FIELD (insn, 23, 26) == 5) + (*info->fprintf_func) (info->stream, ",r"); + break; case 'Z': if (GET_FIELD (insn, 26, 26)) (*info->fprintf_func) (info->stream, ",m "); else (*info->fprintf_func) (info->stream, " "); break; + case 'i': + if (GET_FIELD (insn, 25, 25)) + (*info->fprintf_func) (info->stream, ",i"); + break; + case 'a': + (*info->fprintf_func) + (info->stream, "%s", add_compl_names[GET_FIELD + (insn, 20, 21)]); + break; + case 'Y': + (*info->fprintf_func) + (info->stream, ",dc%s", add_compl_names[GET_FIELD + (insn, 20, 21)]); + break; + case 'y': + (*info->fprintf_func) + (info->stream, ",c%s", add_compl_names[GET_FIELD + (insn, 20, 21)]); + break; + case 'v': + if (GET_FIELD (insn, 20, 20)) + (*info->fprintf_func) (info->stream, ",tsv"); + break; + case 't': + (*info->fprintf_func) (info->stream, ",tc"); + if (GET_FIELD (insn, 20, 20)) + (*info->fprintf_func) (info->stream, ",tsv"); + break; + case 'B': + (*info->fprintf_func) (info->stream, ",db"); + if (GET_FIELD (insn, 20, 20)) + (*info->fprintf_func) (info->stream, ",tsv"); + break; + case 'b': + (*info->fprintf_func) (info->stream, ",b"); + if (GET_FIELD (insn, 20, 20)) + (*info->fprintf_func) (info->stream, ",tsv"); + break; + case 'T': + if (GET_FIELD (insn, 25, 25)) + (*info->fprintf_func) (info->stream, ",tc"); + break; case 'S': /* EXTRD/W has a following condition. */ if (*(s + 1) == '?') @@ -617,6 +685,9 @@ print_insn_hppa (memaddr, info) case 'R': fput_const (extract_5R_store (insn), info); break; + case 'U': + fput_const (extract_10U_store (insn), info); + break; case 'Q': fput_const (extract_5Q_store (insn), info); break; @@ -663,6 +734,10 @@ print_insn_hppa (memaddr, info) (*info->fprintf_func) (info->stream, "%d", GET_FIELD (insn, 24, 25)); break; + case '*': + (*info->fprintf_func) (info->stream, "%d", + GET_FIELD (insn, 22, 25)); + break; case '!': (*info->fprintf_func) (info->stream, "%sar"); break; |