1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#include "qemu/osdep.h"
21#include "qemu-common.h"
22#include "disas/bfd.h"
23#include "qemu/bitops.h"
24#include "cpu.h"
25
26typedef disassemble_info DisasContext;
27
28
29#include "decode.inc.c"
30
31#define output(mnemonic, format, ...) \
32 (info->fprintf_func(info->stream, "%-9s " format, \
33 mnemonic, ##__VA_ARGS__))
34
35int print_insn_or1k(bfd_vma addr, disassemble_info *info)
36{
37 bfd_byte buffer[4];
38 uint32_t insn;
39 int status;
40
41 status = info->read_memory_func(addr, buffer, 4, info);
42 if (status != 0) {
43 info->memory_error_func(status, addr, info);
44 return -1;
45 }
46 insn = bfd_getb32(buffer);
47
48 if (!decode(info, insn)) {
49 output(".long", "%#08x", insn);
50 }
51 return 4;
52}
53
54#define INSN(opcode, format, ...) \
55static bool trans_l_##opcode(disassemble_info *info, arg_l_##opcode *a) \
56{ \
57 output("l." #opcode, format, ##__VA_ARGS__); \
58 return true; \
59}
60
61INSN(add, "r%d, r%d, r%d", a->d, a->a, a->b)
62INSN(addc, "r%d, r%d, r%d", a->d, a->a, a->b)
63INSN(sub, "r%d, r%d, r%d", a->d, a->a, a->b)
64INSN(and, "r%d, r%d, r%d", a->d, a->a, a->b)
65INSN(or, "r%d, r%d, r%d", a->d, a->a, a->b)
66INSN(xor, "r%d, r%d, r%d", a->d, a->a, a->b)
67INSN(sll, "r%d, r%d, r%d", a->d, a->a, a->b)
68INSN(srl, "r%d, r%d, r%d", a->d, a->a, a->b)
69INSN(sra, "r%d, r%d, r%d", a->d, a->a, a->b)
70INSN(ror, "r%d, r%d, r%d", a->d, a->a, a->b)
71INSN(exths, "r%d, r%d", a->d, a->a)
72INSN(extbs, "r%d, r%d", a->d, a->a)
73INSN(exthz, "r%d, r%d", a->d, a->a)
74INSN(extbz, "r%d, r%d", a->d, a->a)
75INSN(cmov, "r%d, r%d, r%d", a->d, a->a, a->b)
76INSN(ff1, "r%d, r%d", a->d, a->a)
77INSN(fl1, "r%d, r%d", a->d, a->a)
78INSN(mul, "r%d, r%d, r%d", a->d, a->a, a->b)
79INSN(mulu, "r%d, r%d, r%d", a->d, a->a, a->b)
80INSN(div, "r%d, r%d, r%d", a->d, a->a, a->b)
81INSN(divu, "r%d, r%d, r%d", a->d, a->a, a->b)
82INSN(muld, "r%d, r%d", a->a, a->b)
83INSN(muldu, "r%d, r%d", a->a, a->b)
84INSN(j, "%d", a->n)
85INSN(jal, "%d", a->n)
86INSN(bf, "%d", a->n)
87INSN(bnf, "%d", a->n)
88INSN(jr, "r%d", a->b)
89INSN(jalr, "r%d", a->b)
90INSN(lwa, "r%d, %d(r%d)", a->d, a->i, a->a)
91INSN(lwz, "r%d, %d(r%d)", a->d, a->i, a->a)
92INSN(lws, "r%d, %d(r%d)", a->d, a->i, a->a)
93INSN(lbz, "r%d, %d(r%d)", a->d, a->i, a->a)
94INSN(lbs, "r%d, %d(r%d)", a->d, a->i, a->a)
95INSN(lhz, "r%d, %d(r%d)", a->d, a->i, a->a)
96INSN(lhs, "r%d, %d(r%d)", a->d, a->i, a->a)
97INSN(swa, "%d(r%d), r%d", a->i, a->a, a->b)
98INSN(sw, "%d(r%d), r%d", a->i, a->a, a->b)
99INSN(sb, "%d(r%d), r%d", a->i, a->a, a->b)
100INSN(sh, "%d(r%d), r%d", a->i, a->a, a->b)
101INSN(nop, "")
102INSN(addi, "r%d, r%d, %d", a->d, a->a, a->i)
103INSN(addic, "r%d, r%d, %d", a->d, a->a, a->i)
104INSN(muli, "r%d, r%d, %d", a->d, a->a, a->i)
105INSN(maci, "r%d, %d", a->a, a->i)
106INSN(andi, "r%d, r%d, %d", a->d, a->a, a->k)
107INSN(ori, "r%d, r%d, %d", a->d, a->a, a->k)
108INSN(xori, "r%d, r%d, %d", a->d, a->a, a->i)
109INSN(mfspr, "r%d, r%d, %d", a->d, a->a, a->k)
110INSN(mtspr, "r%d, r%d, %d", a->a, a->b, a->k)
111INSN(mac, "r%d, r%d", a->a, a->b)
112INSN(msb, "r%d, r%d", a->a, a->b)
113INSN(macu, "r%d, r%d", a->a, a->b)
114INSN(msbu, "r%d, r%d", a->a, a->b)
115INSN(slli, "r%d, r%d, %d", a->d, a->a, a->l)
116INSN(srli, "r%d, r%d, %d", a->d, a->a, a->l)
117INSN(srai, "r%d, r%d, %d", a->d, a->a, a->l)
118INSN(rori, "r%d, r%d, %d", a->d, a->a, a->l)
119INSN(movhi, "r%d, %d", a->d, a->k)
120INSN(macrc, "r%d", a->d)
121INSN(sfeq, "r%d, r%d", a->a, a->b)
122INSN(sfne, "r%d, r%d", a->a, a->b)
123INSN(sfgtu, "r%d, r%d", a->a, a->b)
124INSN(sfgeu, "r%d, r%d", a->a, a->b)
125INSN(sfltu, "r%d, r%d", a->a, a->b)
126INSN(sfleu, "r%d, r%d", a->a, a->b)
127INSN(sfgts, "r%d, r%d", a->a, a->b)
128INSN(sfges, "r%d, r%d", a->a, a->b)
129INSN(sflts, "r%d, r%d", a->a, a->b)
130INSN(sfles, "r%d, r%d", a->a, a->b)
131INSN(sfeqi, "r%d, %d", a->a, a->i)
132INSN(sfnei, "r%d, %d", a->a, a->i)
133INSN(sfgtui, "r%d, %d", a->a, a->i)
134INSN(sfgeui, "r%d, %d", a->a, a->i)
135INSN(sfltui, "r%d, %d", a->a, a->i)
136INSN(sfleui, "r%d, %d", a->a, a->i)
137INSN(sfgtsi, "r%d, %d", a->a, a->i)
138INSN(sfgesi, "r%d, %d", a->a, a->i)
139INSN(sfltsi, "r%d, %d", a->a, a->i)
140INSN(sflesi, "r%d, %d", a->a, a->i)
141INSN(sys, "%d", a->k)
142INSN(trap, "%d", a->k)
143INSN(msync, "")
144INSN(psync, "")
145INSN(csync, "")
146INSN(rfe, "")
147
148#define FP_INSN(opcode, suffix, format, ...) \
149static bool trans_lf_##opcode##_##suffix(disassemble_info *info, \
150 arg_lf_##opcode##_##suffix *a) \
151{ \
152 output("lf." #opcode "." #suffix, format, ##__VA_ARGS__); \
153 return true; \
154}
155
156FP_INSN(add, s, "r%d, r%d, r%d", a->d, a->a, a->b)
157FP_INSN(sub, s, "r%d, r%d, r%d", a->d, a->a, a->b)
158FP_INSN(mul, s, "r%d, r%d, r%d", a->d, a->a, a->b)
159FP_INSN(div, s, "r%d, r%d, r%d", a->d, a->a, a->b)
160FP_INSN(rem, s, "r%d, r%d, r%d", a->d, a->a, a->b)
161FP_INSN(itof, s, "r%d, r%d", a->d, a->a)
162FP_INSN(ftoi, s, "r%d, r%d", a->d, a->a)
163FP_INSN(madd, s, "r%d, r%d, r%d", a->d, a->a, a->b)
164FP_INSN(sfeq, s, "r%d, r%d", a->a, a->b)
165FP_INSN(sfne, s, "r%d, r%d", a->a, a->b)
166FP_INSN(sfgt, s, "r%d, r%d", a->a, a->b)
167FP_INSN(sfge, s, "r%d, r%d", a->a, a->b)
168FP_INSN(sflt, s, "r%d, r%d", a->a, a->b)
169FP_INSN(sfle, s, "r%d, r%d", a->a, a->b)
170