|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: #include "m88100disasm.h"
1.1.1.5 root 8: #include "debugger_memory.h"
1.1.1.3 root 9: #include "mpu.h"
1.1 root 10: #include "mystring.h"
11:
1.1.1.2 root 12: #define O(inst, expstd) { __LINE__, inst, expstd }
13: #define T(inst, expstd, expalt) { __LINE__, inst, expstd, expalt }
14: #define M(b, d, s1, s2) ((b) | ((d)<<21) | ((s1)<<16) | (s2))
15:
1.1 root 16: struct {
1.1.1.2 root 17: int line;
1.1 root 18: uint32 inst;
1.1.1.2 root 19: std::string expstd;
20: std::string expalt;
1.1 root 21: } table[] = {
1.1.1.2 root 22: T(0x02328765, "xmem.bu r17,r18,#0x8765", "{xmem.bu r17,(r18,#0x8765)}"),
23: T(0x06328765, "xmem r17,r18,#0x8765", "{xmem r17,(r18,#0x8765)}"),
24: T(0x06320000, "xmem r17,r18,#0x0000", "{xmem r17,(r18)}"),
25: T(0x06200001, "xmem r17,r0, #0x0001", "{xmem r17,(r0,#0x0001)}"),
26: T(0x0a328765, "ld.hu r17,r18,#0x8765", "{ld.hu r17,(r18,#0x8765)}"),
27: T(0x0e328765, "ld.bu r17,r18,#0x8765", "{ld.bu r17,(r18,#0x8765)}"),
28: T(0x12328765, "ld.d r17,r18,#0x8765", "{ld.d r17,(r18,#0x8765)}"),
29: T(0x16328765, "ld r17,r18,#0x8765", "{ld r17,(r18,#0x8765)}"),
30: T(0x1a328765, "ld.h r17,r18,#0x8765", "{ld.h r17,(r18,#0x8765)}"),
31: T(0x1e328765, "ld.b r17,r18,#0x8765", "{ld.b r17,(r18,#0x8765)}"),
32: T(0x22328765, "st.d r17,r18,#0x8765", "{st.d r17,(r18,#0x8765)}"),
33: T(0x26328765, "st r17,r18,#0x8765", "{st r17,(r18,#0x8765)}"),
34: T(0x2a328765, "st.h r17,r18,#0x8765", "{st.h r17,(r18,#0x8765)}"),
35: T(0x2e328765, "st.b r17,r18,#0x8765", "{st.b r17,(r18,#0x8765)}"),
36: T(0x32328765, "lda.d r17,r18,#0x8765", "{lda.d r17,r18,#0x8765}"),
37: T(0x36328765, "lda r17,r18,#0x8765", "{lda r17,r18,#0x8765}"),
38: T(0x3a328765, "lda.h r17,r18,#0x8765", "{lda.h r17,r18,#0x8765}"),
39: T(0x3e328765, "lda.b r17,r18,#0x8765", "{lda.b r17,r18,#0x8765}"),
40: T(0x36320000, "lda r17,r18,#0x0000", "{lda r17,r18}"),
41: T(0x36200001, "lda r17,r0, #0x0001", "{lda r17,r0,#0x0001}"),
42:
43: T(0x40128765, "and r0, r18,#0x8765", "{nop}"),
44: T(0x42208765, "and r17,r0, #0x8765", "{clr r17}"),
45: T(0x42318765, "and r17,r17,#0x8765", "{and r17,#0xffff8765}"),
46: T(0x42328765, "and r17,r18,#0x8765", "{and r17,r18,#0xffff8765}"),
47: T(0x44128765, "and.u r0, r18,#0x8765", "{nop}"),
48: T(0x46208765, "and.u r17,r0, #0x8765", "{clr r17}"),
49: T(0x46318765, "and.u r17,r17,#0x8765", "{and r17,#0x8765ffff}"),
50: T(0x46328765, "and.u r17,r18,#0x8765", "{and r17,r18,#0x8765ffff}"),
51: T(0x48128765, "mask r0, r18,#0x8765", "{nop}"),
52: T(0x4a208765, "mask r17,r0, #0x8765", "{clr r17}"),
53: T(0x4a318765, "mask r17,r17,#0x8765", "{and r17,#0x00008765}"),
54: T(0x4a328765, "mask r17,r18,#0x8765", "{and r17,r18,#0x00008765}"),
55: T(0x4c128765, "mask.u r0, r18,#0x8765", "{nop}"),
56: T(0x4e208765, "mask.u r17,r0, #0x8765", "{clr r17}"),
57: T(0x4e318765, "mask.u r17,r17,#0x8765", "{and r17,#0x87650000}"),
58: T(0x4e328765, "mask.u r17,r18,#0x8765", "{and r17,r18,#0x87650000}"),
59:
60: T(0x50128765, "xor r0, r18,#0x8765", "{nop}"),
61: T(0x52208765, "xor r17,r0, #0x8765", "{mov r17,#0x8765}"),
62: T(0x52318765, "xor r17,r17,#0x8765", "{xor r17,#0x8765}"),
63: T(0x52328765, "xor r17,r18,#0x8765", "{xor r17,r18,#0x8765}"),
64: T(0x54128765, "xor.u r0, r18,#0x8765", "{nop}"),
65: T(0x56208765, "xor.u r17,r0, #0x8765", "{mov r17,#0x87650000}"),
66: T(0x56318765, "xor.u r17,r17,#0x8765", "{xor r17,#0x87650000}"),
67: T(0x56328765, "xor.u r17,r18,#0x8765", "{xor r17,r18,#0x87650000}"),
68: T(0x58128765, "or r0, r18,#0x8765", "{nop}"),
69: T(0x5a208765, "or r17,r0, #0x8765", "{mov r17,#0x8765}"),
70: T(0x5a318765, "or r17,r17,#0x8765", "{or r17,#0x8765}"),
71: T(0x5a328765, "or r17,r18,#0x8765", "{or r17,r18,#0x8765}"),
72: T(0x5c128765, "or.u r0, r18,#0x8765", "{nop}"),
73: T(0x5e208765, "or.u r17,r0, #0x8765", "{mov r17,#0x87650000}"),
74: T(0x5e318765, "or.u r17,r17,#0x8765", "{or r17,#0x87650000}"),
75: T(0x5e328765, "or.u r17,r18,#0x8765", "{or r17,r18,#0x87650000}"),
76:
77: T(0x60128765, "addu r0, r18,#0x8765", "{nop}"),
78: T(0x62208765, "addu r17,r0, #0x8765", "{mov r17,#0x00008765}"),
79: T(0x62318765, "addu r17,r17,#0x8765", "{addu r17,#0x00008765}"),
80: T(0x62328765, "addu r17,r18,#0x8765", "{addu r17,r18,#0x00008765}"),
81: T(0x64128765, "subu r0, r18,#0x8765", "{nop}"),
82: T(0x66208765, "subu r17,r0, #0x8765", "{mov r17,#0xffff789b}"),
83: T(0x66318765, "subu r17,r17,#0x8765", "{subu r17,#0x00008765}"),
84: T(0x66328765, "subu r17,r18,#0x8765", "{subu r17,r18,#0x00008765}"),
85: T(0x68128765, "divu r0, r18,#0x8765", "{divu r0, r18,#0x00008765}"),
86: T(0x6a208765, "divu r17,r0, #0x8765", "{divu r17,r0, #0x00008765}"),
87: T(0x6a318765, "divu r17,r17,#0x8765", "{divu r17,#0x00008765}"),
88: T(0x6a328765, "divu r17,r18,#0x8765", "{divu r17,r18,#0x00008765}"),
89: T(0x6c128765, "mul r0, r18,#0x8765", "{mul r0, r18,#0x00008765}"),
90: T(0x6e208765, "mul r17,r0, #0x8765", "{mul r17,r0, #0x00008765}"),
91: T(0x6e318765, "mul r17,r17,#0x8765", "{mul r17,#0x00008765}"),
92: T(0x6e328765, "mul r17,r18,#0x8765", "{mul r17,r18,#0x00008765}"),
93:
94: T(0x70128765, "add r0, r18,#0x8765", "{adds r0, r18,#0x00008765}"),
95: T(0x72208765, "add r17,r0, #0x8765", "{adds r17,r0, #0x00008765}"),
96: T(0x72318765, "add r17,r17,#0x8765", "{adds r17,#0x00008765}"),
97: T(0x72328765, "add r17,r18,#0x8765", "{adds r17,r18,#0x00008765}"),
98: T(0x74128765, "sub r0, r18,#0x8765", "{subs r0, r18,#0x00008765}"),
99: T(0x76208765, "sub r17,r0, #0x8765", "{subs r17,r0, #0x00008765}"),
100: T(0x76318765, "sub r17,r17,#0x8765", "{subs r17,#0x00008765}"),
101: T(0x76328765, "sub r17,r18,#0x8765", "{subs r17,r18,#0x00008765}"),
102: T(0x78128765, "div r0, r18,#0x8765", "{div r0, r18,#0x00008765}"),
103: T(0x7a208765, "div r17,r0, #0x8765", "{div r17,r0, #0x00008765}"),
104: T(0x7a318765, "div r17,r17,#0x8765", "{div r17,#0x00008765}"),
105: T(0x7a328765, "div r17,r18,#0x8765", "{div r17,r18,#0x00008765}"),
106: T(0x7c128765, "cmp r0, r18,#0x8765", "{nop}"),
107: T(0x7e208765, "cmp r17,r0, #0x8765", "{cmp r17,r0, #0x00008765}"),
108: T(0x7e318765, "cmp r17,r17,#0x8765", "{cmp r17,r17,#0x00008765}"),
109: T(0x7e328765, "cmp r17,r18,#0x8765", "{cmp r17,r18,#0x00008765}"),
110:
111: O(0x82204260, "ldcr r17,sr2"),
112: O(0x82204fe0, "fldcr r17,fpcr"),
113: O(0x80118271, "stcr r17,sr2"),
114: O(0x80118ff1, "fstcr r17,fpcr"),
115: O(0x8232c272, "xcr r17,r18,sr2"),
116: O(0x8232cff2, "fxcr r17,r18,fpcr"),
117:
118: O(0x86320001, "fmul.sss r17,r18,r1"),
119: O(0x86202001, "flt.ss r17,r1"),
120: O(0x86322801, "fadd.sss r17,r18,r1"),
121: O(0x86323001, "fsub.sss r17,r18,r1"),
122: O(0x86323801, "fcmp.sss r17,r18,r1"),
123: O(0x86204801, "int.ss r17,r1"),
124: O(0x86205001, "nint.ss r17,r1"),
125: O(0x86205801, "trnc.ss r17,r1"),
126: O(0x86327001, "fdiv.sss r17,r18,r1"),
1.1 root 127: // fmul のサイズ
1.1.1.2 root 128: O(0x86320021, "fmul.dss r17,r18,r1"),
129: O(0x86320081, "fmul.ssd r17,r18,r1"),
130: O(0x863200a1, "fmul.dsd r17,r18,r1"),
131: O(0x86320201, "fmul.sds r17,r18,r1"),
132: O(0x86320221, "fmul.dds r17,r18,r1"),
133: O(0x86320281, "fmul.sdd r17,r18,r1"),
134: O(0x863202a1, "fmul.ddd r17,r18,r1"),
135:
136: O(0xc3ffffff, "br 0x000000fc"),
137: O(0xc7ffffff, "br.n 0x000000fc"),
138: O(0xcbffffff, "bsr 0x000000fc"),
139: O(0xcfffffff, "bsr.n 0x000000fc"),
140: O(0xd232ffff, "bb0 #17,r18,0x000000fc"),
141: O(0xd632ffff, "bb0.n #17,r18,0x000000fc"),
142: O(0xda32ffff, "bb1 #17,r18,0x000000fc"),
143: O(0xde32ffff, "bb1.n #17,r18,0x000000fc"),
1.1.1.5 root 144:
145: #define L "0x000000fc"
146: T(0xe852ffff, "bcnd eq0,r18," L, "{br (r18==0|(float)r18==+0)," L "}"),
147: T(0xec52ffff, "bcnd.n eq0,r18," L, "{br.n (r18==0|(float)r18==+0)," L "}"),
148: #define A(m5, s1) M(0xe8000000, m5, s1, 0xffff)
149: T(A(0x00, 2), "bcnd #0, r2, " L, "{br false," L "}"),
150: T(A(0x01, 2), "bcnd gt0,r2, " L, "{br (r2>0|(float)r2>+0)," L "}"),
151: T(A(0x02, 2), "bcnd eq0,r2, " L, "{br (r2==0|(float)r2==+0)," L "}"),
152: T(A(0x03, 2), "bcnd ge0,r2, " L, "{br (r2>=0|(float)r2>=+0)," L "}"),
153: T(A(0x04, 2), "bcnd #4, r2, " L, "{br ((float)r2<-0)," L "}"),
154: T(A(0x05, 2), "bcnd #5, r2, " L, "{br ((float)r2!=0)," L "}"),
155: O(A(0x06, 2), "bcnd #6, r2, " L),
156: T(A(0x07, 2), "bcnd #7, r2, " L, "{br (r2!=0x80000000)," L "}"),
157: T(A(0x08, 2), "bcnd #8, r2, " L, "{br (r2==0x80000000)," L "}"),
158: O(A(0x09, 2), "bcnd #9, r2, " L),
159: T(A(0x0a, 2), "bcnd #10,r2, " L, "{br ((float)r2==0)," L "}"),
160: T(A(0x0b, 2), "bcnd #11,r2, " L, "{br ((float)r2>=-0)," L "}"),
161: T(A(0x0c, 2), "bcnd lt0,r2, " L, "{br (r2<0|(float)r2<+0)," L "}"),
162: T(A(0x0d, 2), "bcnd ne0,r2, " L, "{br (r2!=0|(float)r2!=+0)," L "}"),
163: T(A(0x0e, 2), "bcnd le0,r2, " L, "{br (r2<=0|(float)r2<=+0)," L "}"),
164: T(A(0x0f, 2), "bcnd #15,r2, " L, "{br " L "}"),
165: O(A(0x10, 2), "bcnd #16,r2, " L),
166: O(A(0x1f, 2), "bcnd #31,r2, " L),
167: T(A(0x00, 0), "bcnd #0, r0, " L, "{br false," L "}"),
168: T(A(0x01, 0), "bcnd gt0,r0, " L, "{br false," L "}"),
169: T(A(0x02, 0), "bcnd eq0,r0, " L, "{br " L "}"),
170: T(A(0x03, 0), "bcnd ge0,r0, " L, "{br " L "}"),
171: T(A(0x04, 0), "bcnd #4, r0, " L, "{br false," L "}"),
172: T(A(0x05, 0), "bcnd #5, r0, " L, "{br false," L "}"),
173: T(A(0x06, 0), "bcnd #6, r0, " L, "{br " L "}"),
174: T(A(0x07, 0), "bcnd #7, r0, " L, "{br " L "}"),
175: T(A(0x08, 0), "bcnd #8, r0, " L, "{br false," L "}"),
176: T(A(0x09, 0), "bcnd #9, r0, " L, "{br false," L "}"),
177: T(A(0x0a, 0), "bcnd #10,r0, " L, "{br " L "}"),
178: T(A(0x0b, 0), "bcnd #11,r0, " L, "{br " L "}"),
179: T(A(0x0c, 0), "bcnd lt0,r0, " L, "{br false," L "}"),
180: T(A(0x0d, 0), "bcnd ne0,r0, " L, "{br false," L "}"),
181: T(A(0x0e, 0), "bcnd le0,r0, " L, "{br " L "}"),
182: T(A(0x0f, 0), "bcnd #15,r0, " L, "{br " L "}"),
183: O(A(0x10, 0), "bcnd #16,r0, " L),
184: O(A(0x1f, 0), "bcnd #31,r0, " L),
185: #undef A
186: #undef L
187:
188: T(0xf2328034, "clr r17,r18,1<20>", "{and r17,r18,0xffefffff}"),
189: T(0xf2328274, "clr r17,r18,19<20>", "{and r17,r18,0x000fffff}"),
190: T(0xf2328834, "set r17,r18,1<20>", "{or r17,r18,0x00100000}"),
191: T(0xf2328a74, "set r17,r18,19<20>", "{or r17,r18,0xfff00000}"),
1.1.1.2 root 192:
193: T(0xf0129274, "ext r0, r18,19<20>", "{nop}"),
194: T(0xf2209274, "ext r17,r0, 19<20>", "{clr r17}"),
195: T(0xf2319014, "ext r17,r17,32<20>", "{asr r17,#20}"),
196: T(0xf2329014, "ext r17,r18,32<20>", "{asr r17,r18,#20}"),
197: T(0xf2319194, "ext r17,r17,12<20>", "{asr r17,#20}"),
198: T(0xf2319174, "ext r17,r17,11<20>", "{bfexts r17,11<20>}"),
199: T(0xf2329194, "ext r17,r18,12<20>", "{asr r17,r18,#20}"),
200: T(0xf2329174, "ext r17,r18,11<20>", "{bfexts r17,r18,11<20>}"),
201: T(0xf0129a74, "extu r0, r18,19<20>", "{nop}"),
202: T(0xf2209a74, "extu r17,r0, 19<20>", "{clr r17}"),
203: T(0xf2319814, "extu r17,r17,32<20>", "{lsr r17,#20}"),
204: T(0xf2329814, "extu r17,r18,32<20>", "{lsr r17,r18,#20}"),
205: T(0xf2319994, "extu r17,r17,12<20>", "{lsr r17,#20}"),
206: T(0xf2319974, "extu r17,r17,11<20>", "{bfextu r17,11<20>}"),
207: T(0xf2329994, "extu r17,r18,12<20>", "{lsr r17,r18,#20}"),
208: T(0xf2329974, "extu r17,r18,11<20>", "{bfextu r17,r18,11<20>}"),
209:
210: T(0xf012a274, "mak r0, r18,19<20>", "{nop}"),
211: T(0xf220a274, "mak r17,r0, 19<20>", "{clr r17}"),
212: T(0xf231a014, "mak r17,r17,32<20>", "{lsl r17,#20}"),
213: T(0xf232a014, "mak r17,r18,32<20>", "{lsl r17,r18,#20}"),
214: T(0xf231a194, "mak r17,r17,12<20>", "{lsl r17,#20}"),
215: T(0xf231a174, "mak r17,r17,11<20>", "{bfmak r17,11<20>}"),
216: T(0xf232a194, "mak r17,r18,12<20>", "{lsl r17,r18,#20}"),
217: T(0xf232a174, "mak r17,r18,11<20>", "{bfmak r17,r18,11<20>}"),
218: T(0xf012a814, "rot r0, r18,<20>", "{nop}"),
219: T(0xf231a800, "rot r17,r17,<0>", "{nop}"),
220: T(0xf220a814, "rot r17,r0, <20>", "{clr r17}"),
221: T(0xf231a810, "rot r17,r17,<16>", "{ror r17,#16}"),
222: T(0xf232a810, "rot r17,r18,<16>", "{ror r17,r18,#16}"),
223: T(0xf231a814, "rot r17,r17,<20>", "{rol r17,#12}"),
224: T(0xf232a814, "rot r17,r18,<20>", "{rol r17,r18,#12}"),
225:
226: O(0xf232d101, "tb0 #17,r18,#0x101"),
227: O(0xf232d901, "tb1 #17,r18,#0x101"),
228: T(0xf220d87f, "tb1 #17,r0, #0x07f", "{ssync}"),
229: T(0xf220d880, "tb1 #17,r0, #0x080", "{usync}"),
230: O(0xf052e901, "tcnd eq0,r18,#0x101"),
231:
232: T(0xf6320001, "xmem.bu r17,r18,r1", "{xmem.bu r17,(r18,r1)}"),
233: T(0xf6320401, "xmem r17,r18,r1", "{xmem r17,(r18,r1)}"),
234: T(0xf6320801, "ld.hu r17,r18,r1", "{ld.hu r17,(r18,r1)}"),
235: T(0xf6320c01, "ld.bu r17,r18,r1", "{ld.bu r17,(r18,r1)}"),
236: T(0xf6321001, "ld.d r17,r18,r1", "{ld.d r17,(r18,r1)}"),
237: T(0xf6321401, "ld r17,r18,r1", "{ld r17,(r18,r1)}"),
238: T(0xf6321801, "ld.h r17,r18,r1", "{ld.h r17,(r18,r1)}"),
239: T(0xf6321c01, "ld.b r17,r18,r1", "{ld.b r17,(r18,r1)}"),
240: T(0xf6322001, "st.d r17,r18,r1", "{st.d r17,(r18,r1)}"),
241: T(0xf6322401, "st r17,r18,r1", "{st r17,(r18,r1)}"),
242: T(0xf6322801, "st.h r17,r18,r1", "{st.h r17,(r18,r1)}"),
243: T(0xf6322c01, "st.b r17,r18,r1", "{st.b r17,(r18,r1)}"),
1.1 root 244: // 全種について全引数パターンはつらいので ld だけで引数を変える
1.1.1.2 root 245: T(0xf6321000, "ld.d r17,r18,r0", "{ld.d r17,(r18)}"),
246: T(0xf6321200, "ld.d r17,r18[r0]", "{ld.d r17,(r18)}"),
247: T(0xf6201001, "ld.d r17,r0, r1", "{ld.d r17,(r1)}"),
248: T(0xf6321001, "ld.d r17,r18,r1", "{ld.d r17,(r18,r1)}"),
249: T(0xf6201201, "ld.d r17,r0[r1]", "{ld.d r17,(r0[r1])}"),
250: T(0xf6321201, "ld.d r17,r18[r1]", "{ld.d r17,(r18[r1])}"),
1.1 root 251: // .usr も一部代表だけ
1.1.1.2 root 252: T(0xf6321101, "ld.d.usr r17,r18,r1", "{ldusr.d r17,(r18,r1)}"),
253: T(0xf6321401, "ld r17,r18,r1", "{ld r17,(r18,r1)}"),
254: T(0xf6321501, "ld.usr r17,r18,r1", "{ldusr r17,(r18,r1)}"),
1.1 root 255: // lda
1.1.1.2 root 256: T(0xf6323001, "lda.d r17,r18,r1", "{lda.d r17,r18,r1}"),
257: T(0xf6323401, "lda r17,r18,r1", "{lda r17,r18,r1}"),
258: T(0xf6323801, "lda.h r17,r18,r1", "{lda.h r17,r18,r1}"),
259: T(0xf6323c01, "lda.b r17,r18,r1", "{lda.b r17,r18,r1}"),
260:
261: // ここから3項になってパターンが増えるので r17, r18 ではなく r1, r2 を使う
262: #define A(d, s1, s2) M(0xf400'4000, d, s1, s2)
263: T(A(0, 0, 0), "and r0, r0, r0", "{nop}"),
264: T(A(0, 0, 1), "and r0, r0, r1", "{nop}"),
265: T(A(0, 1, 0), "and r0, r1, r0", "{nop}"),
266: T(A(0, 1, 1), "and r0, r1, r1", "{nop}"),
267: T(A(0, 1, 2), "and r0, r1, r2", "{nop}"),
268: T(A(0, 2, 1), "and r0, r2, r1", "{nop}"),
269: T(A(1, 0, 0), "and r1, r0, r0", "{clr r1}"),
270: T(A(1, 0, 1), "and r1, r0, r1", "{clr r1}"),
271: T(A(1, 0, 2), "and r1, r0, r2", "{clr r1}"),
272: T(A(1, 1, 0), "and r1, r1, r0", "{clr r1}"),
273: T(A(1, 1, 1), "and r1, r1, r1", "{nop}"),
274: T(A(1, 1, 2), "and r1, r1, r2", "{and r1, r2}"),
275: T(A(1, 2, 0), "and r1, r2, r0", "{clr r1}"),
276: T(A(1, 2, 1), "and r1, r2, r1", "{and r1, r2}"),
277: T(A(1, 2, 2), "and r1, r2, r2", "{mov r1, r2}"),
278: T(A(1, 2, 3), "and r1, r2, r3", "{and r1, r2, r3}"),
279: #undef A
280:
281: #define A(d, s1, s2) M(0xf400'4400, d, s1, s2)
282: T(A(0, 0, 0), "and.c r0, r0, r0", "{nop}"),
283: T(A(0, 0, 1), "and.c r0, r0, r1", "{nop}"),
284: T(A(0, 1, 0), "and.c r0, r1, r0", "{nop}"),
285: T(A(0, 1, 1), "and.c r0, r1, r1", "{nop}"),
286: T(A(0, 1, 2), "and.c r0, r1, r2", "{nop}"),
287: T(A(0, 2, 1), "and.c r0, r2, r1", "{nop}"),
288: T(A(1, 0, 0), "and.c r1, r0, r0", "{clr r1}"),
289: T(A(1, 0, 1), "and.c r1, r0, r1", "{clr r1}"),
290: T(A(1, 0, 2), "and.c r1, r0, r2", "{clr r1}"),
291: T(A(1, 1, 0), "and.c r1, r1, r0", "{nop}"),
292: T(A(1, 1, 1), "and.c r1, r1, r1", "{clr r1}"),
293: T(A(1, 1, 2), "and.c r1, r1, r2", "{and r1, ~r2}"),
294: T(A(1, 2, 0), "and.c r1, r2, r0", "{mov r1, r2}"),
295: T(A(1, 2, 1), "and.c r1, r2, r1", "{and r1, r2, ~r1}"),
296: T(A(1, 2, 2), "and.c r1, r2, r2", "{clr r1}"),
297: T(A(1, 2, 3), "and.c r1, r2, r3", "{and r1, r2, ~r3}"),
298: #undef A
299:
300: #define A(d, s1, s2) M(0xf400'5000, d, s1, s2)
301: T(A(0, 0, 0), "xor r0, r0, r0", "{nop}"),
302: T(A(0, 0, 1), "xor r0, r0, r1", "{nop}"),
303: T(A(0, 1, 0), "xor r0, r1, r0", "{nop}"),
304: T(A(0, 1, 1), "xor r0, r1, r1", "{nop}"),
305: T(A(0, 1, 2), "xor r0, r1, r2", "{nop}"),
306: T(A(0, 2, 1), "xor r0, r2, r1", "{nop}"),
307: T(A(1, 0, 0), "xor r1, r0, r0", "{clr r1}"),
308: T(A(1, 0, 1), "xor r1, r0, r1", "{nop}"),
309: T(A(1, 0, 2), "xor r1, r0, r2", "{mov r1, r2}"),
310: T(A(1, 1, 0), "xor r1, r1, r0", "{nop}"),
311: T(A(1, 1, 1), "xor r1, r1, r1", "{clr r1}"),
312: T(A(1, 1, 2), "xor r1, r1, r2", "{xor r1, r2}"),
313: T(A(1, 2, 0), "xor r1, r2, r0", "{mov r1, r2}"),
314: T(A(1, 2, 1), "xor r1, r2, r1", "{xor r1, r2}"),
315: T(A(1, 2, 2), "xor r1, r2, r2", "{clr r1}"),
316: T(A(1, 2, 3), "xor r1, r2, r3", "{xor r1, r2, r3}"),
317: #undef A
318:
319: // 独自ニーモニック側の XOR rD,rS1,~rS2 はもうちょっと演算したい
320: #define A(d, s1, s2) M(0xf400'5400, d, s1, s2)
321: T(A(0, 0, 0), "xor.c r0, r0, r0", "{nop}"),
322: T(A(0, 0, 1), "xor.c r0, r0, r1", "{nop}"),
323: T(A(0, 1, 0), "xor.c r0, r1, r0", "{nop}"),
324: T(A(0, 1, 1), "xor.c r0, r1, r1", "{nop}"),
325: T(A(0, 1, 2), "xor.c r0, r1, r2", "{nop}"),
326: T(A(0, 2, 1), "xor.c r0, r2, r1", "{nop}"),
327: T(A(1, 0, 0), "xor.c r1, r0, r0", "{mov r1, #0xffffffff}"),
328: T(A(1, 0, 1), "xor.c r1, r0, r1", "{not r1}"),
329: T(A(1, 0, 2), "xor.c r1, r0, r2", "{not r1, r2}"),
330: T(A(1, 1, 0), "xor.c r1, r1, r0", "{not r1}"),
331: T(A(1, 1, 1), "xor.c r1, r1, r1", "{mov r1, #0xffffffff}"),
332: T(A(1, 1, 2), "xor.c r1, r1, r2", "{xor r1, ~r2}"),
333: T(A(1, 2, 0), "xor.c r1, r2, r0", "{not r1, r2}"),
334: T(A(1, 2, 1), "xor.c r1, r2, r1", "{xor r1, r2, ~r1}"),
335: T(A(1, 2, 2), "xor.c r1, r2, r2", "{mov r1, #0xffffffff}"),
336: T(A(1, 2, 3), "xor.c r1, r2, r3", "{xor r1, r2, ~r3}"),
337: #undef A
338:
339: #define A(d, s1, s2) M(0xf400'5800, d, s1, s2)
340: T(A(0, 0, 0), "or r0, r0, r0", "{nop}"),
341: T(A(0, 0, 1), "or r0, r0, r1", "{nop}"),
342: T(A(0, 1, 0), "or r0, r1, r0", "{nop}"),
343: T(A(0, 1, 1), "or r0, r1, r1", "{nop}"),
344: T(A(0, 1, 2), "or r0, r1, r2", "{nop}"),
345: T(A(0, 2, 1), "or r0, r2, r1", "{nop}"),
346: T(A(1, 0, 0), "or r1, r0, r0", "{clr r1}"),
347: T(A(1, 0, 1), "or r1, r0, r1", "{nop}"),
348: T(A(1, 0, 2), "or r1, r0, r2", "{mov r1, r2}"),
349: T(A(1, 1, 0), "or r1, r1, r0", "{nop}"),
350: T(A(1, 1, 1), "or r1, r1, r1", "{nop}"),
351: T(A(1, 1, 2), "or r1, r1, r2", "{or r1, r2}"),
352: T(A(1, 2, 0), "or r1, r2, r0", "{mov r1, r2}"),
353: T(A(1, 2, 1), "or r1, r2, r1", "{or r1, r2}"),
354: T(A(1, 2, 2), "or r1, r2, r2", "{mov r1, r2}"),
355: T(A(1, 2, 3), "or r1, r2, r3", "{or r1, r2, r3}"),
356: #undef A
357:
358: #define A(d, s1, s2) M(0xf400'5c00, d, s1, s2)
359: T(A(0, 0, 0), "or.c r0, r0, r0", "{nop}"),
360: T(A(0, 0, 1), "or.c r0, r0, r1", "{nop}"),
361: T(A(0, 1, 0), "or.c r0, r1, r0", "{nop}"),
362: T(A(0, 1, 1), "or.c r0, r1, r1", "{nop}"),
363: T(A(0, 1, 2), "or.c r0, r1, r2", "{nop}"),
364: T(A(0, 2, 1), "or.c r0, r2, r1", "{nop}"),
365: T(A(1, 0, 0), "or.c r1, r0, r0", "{mov r1, #0xffffffff}"),
366: T(A(1, 0, 1), "or.c r1, r0, r1", "{not r1}"),
367: T(A(1, 0, 2), "or.c r1, r0, r2", "{not r1, r2}"),
368: T(A(1, 1, 0), "or.c r1, r1, r0", "{mov r1, #0xffffffff}"),
369: T(A(1, 1, 1), "or.c r1, r1, r1", "{mov r1, #0xffffffff}"),
370: T(A(1, 1, 2), "or.c r1, r1, r2", "{or r1, ~r2}"),
371: T(A(1, 2, 0), "or.c r1, r2, r0", "{mov r1, #0xffffffff}"),
372: T(A(1, 2, 1), "or.c r1, r2, r1", "{or r1, r2, ~r1}"),
373: T(A(1, 2, 2), "or.c r1, r2, r2", "{mov r1, #0xffffffff}"),
374: T(A(1, 2, 3), "or.c r1, r2, r3", "{or r1, r2, ~r3}"),
375: #undef A
376:
377: #define A(d, s1, s2) M(0xf400'6000, d, s1, s2)
378: T(A(0, 0, 0), "addu r0, r0, r0", "{nop}"),
379: T(A(0, 0, 1), "addu r0, r0, r1", "{nop}"),
380: T(A(0, 1, 0), "addu r0, r1, r0", "{nop}"),
381: T(A(0, 1, 1), "addu r0, r1, r1", "{nop}"),
382: T(A(0, 1, 2), "addu r0, r1, r2", "{nop}"),
383: T(A(0, 2, 1), "addu r0, r2, r1", "{nop}"),
384: T(A(1, 0, 0), "addu r1, r0, r0", "{clr r1}"),
385: T(A(1, 0, 1), "addu r1, r0, r1", "{nop}"),
386: T(A(1, 0, 2), "addu r1, r0, r2", "{mov r1, r2}"),
387: T(A(1, 1, 0), "addu r1, r1, r0", "{nop}"),
388: T(A(1, 1, 1), "addu r1, r1, r1", "{addu r1, r1}"),
389: T(A(1, 1, 2), "addu r1, r1, r2", "{addu r1, r2}"),
390: T(A(1, 2, 0), "addu r1, r2, r0", "{mov r1, r2}"),
391: T(A(1, 2, 1), "addu r1, r2, r1", "{addu r1, r2}"),
392: T(A(1, 2, 2), "addu r1, r2, r2", "{addu r1, r2, r2}"),
393: T(A(1, 2, 3), "addu r1, r2, r3", "{addu r1, r2, r3}"),
394: #undef A
395:
396: // Carry In/Out を含むやつは 2オペランドへの省略のみ (.coだけ代表でテスト)
397: #define A(d, s1, s2) M(0xf400'6100, d, s1, s2)
398: T(A(0, 0, 0), "addu.co r0, r0, r0", "{addu.co r0, r0}"),
399: T(A(0, 0, 1), "addu.co r0, r0, r1", "{addu.co r0, r1}"),
400: T(A(0, 1, 0), "addu.co r0, r1, r0", "{addu.co r0, r1, r0}"),
401: T(A(0, 1, 1), "addu.co r0, r1, r1", "{addu.co r0, r1, r1}"),
402: T(A(0, 1, 2), "addu.co r0, r1, r2", "{addu.co r0, r1, r2}"),
403: T(A(0, 2, 1), "addu.co r0, r2, r1", "{addu.co r0, r2, r1}"),
404: T(A(1, 0, 0), "addu.co r1, r0, r0", "{addu.co r1, r0, r0}"),
405: T(A(1, 0, 1), "addu.co r1, r0, r1", "{addu.co r1, r0, r1}"),
406: T(A(1, 0, 2), "addu.co r1, r0, r2", "{addu.co r1, r0, r2}"),
407: T(A(1, 1, 0), "addu.co r1, r1, r0", "{addu.co r1, r0}"),
408: T(A(1, 1, 1), "addu.co r1, r1, r1", "{addu.co r1, r1}"),
409: T(A(1, 1, 2), "addu.co r1, r1, r2", "{addu.co r1, r2}"),
410: T(A(1, 2, 0), "addu.co r1, r2, r0", "{addu.co r1, r2, r0}"),
411: T(A(1, 2, 1), "addu.co r1, r2, r1", "{addu.co r1, r2, r1}"),
412: T(A(1, 2, 2), "addu.co r1, r2, r2", "{addu.co r1, r2, r2}"),
413: T(A(1, 2, 3), "addu.co r1, r2, r3", "{addu.co r1, r2, r3}"),
414: #undef A
415: T(0xf6326201, "addu.ci r17,r18,r1", "{addu.ci r17,r18,r1}"),
416: T(0xf6326301, "addu.cio r17,r18,r1", "{addu.cio r17,r18,r1}"),
417:
418: #define A(d, s1, s2) M(0xf400'6400, d, s1, s2)
419: T(A(0, 0, 0), "subu r0, r0, r0", "{nop}"),
420: T(A(0, 0, 1), "subu r0, r0, r1", "{nop}"),
421: T(A(0, 1, 0), "subu r0, r1, r0", "{nop}"),
422: T(A(0, 1, 1), "subu r0, r1, r1", "{nop}"),
423: T(A(0, 1, 2), "subu r0, r1, r2", "{nop}"),
424: T(A(0, 2, 1), "subu r0, r2, r1", "{nop}"),
425: T(A(1, 0, 0), "subu r1, r0, r0", "{clr r1}"),
426: T(A(1, 0, 1), "subu r1, r0, r1", "{subu r1, r0, r1}"),
427: T(A(1, 0, 2), "subu r1, r0, r2", "{subu r1, r0, r2}"),
428: T(A(1, 1, 0), "subu r1, r1, r0", "{nop}"),
429: T(A(1, 1, 1), "subu r1, r1, r1", "{clr r1}"),
430: T(A(1, 1, 2), "subu r1, r1, r2", "{subu r1, r2}"),
431: T(A(1, 2, 0), "subu r1, r2, r0", "{mov r1, r2}"),
432: T(A(1, 2, 1), "subu r1, r2, r1", "{subu r1, r2, r1}"),
433: T(A(1, 2, 2), "subu r1, r2, r2", "{clr r1}"),
434: T(A(1, 2, 3), "subu r1, r2, r3", "{subu r1, r2, r3}"),
435: #undef A
436:
437: // Carry In/Out を含むやつは 2オペランドへの省略のみ (.coだけ代表でテスト)
438: #define A(d, s1, s2) M(0xf400'6500, d, s1, s2)
439: T(A(0, 0, 0), "subu.co r0, r0, r0", "{subu.co r0, r0}"),
440: T(A(0, 0, 1), "subu.co r0, r0, r1", "{subu.co r0, r1}"),
441: T(A(0, 1, 0), "subu.co r0, r1, r0", "{subu.co r0, r1, r0}"),
442: T(A(0, 1, 1), "subu.co r0, r1, r1", "{subu.co r0, r1, r1}"),
443: T(A(0, 1, 2), "subu.co r0, r1, r2", "{subu.co r0, r1, r2}"),
444: T(A(0, 2, 1), "subu.co r0, r2, r1", "{subu.co r0, r2, r1}"),
445: T(A(1, 0, 0), "subu.co r1, r0, r0", "{subu.co r1, r0, r0}"),
446: T(A(1, 0, 1), "subu.co r1, r0, r1", "{subu.co r1, r0, r1}"),
447: T(A(1, 0, 2), "subu.co r1, r0, r2", "{subu.co r1, r0, r2}"),
448: T(A(1, 1, 0), "subu.co r1, r1, r0", "{subu.co r1, r0}"),
449: T(A(1, 1, 1), "subu.co r1, r1, r1", "{subu.co r1, r1}"),
450: T(A(1, 1, 2), "subu.co r1, r1, r2", "{subu.co r1, r2}"),
451: T(A(1, 2, 0), "subu.co r1, r2, r0", "{subu.co r1, r2, r0}"),
452: T(A(1, 2, 1), "subu.co r1, r2, r1", "{subu.co r1, r2, r1}"),
453: T(A(1, 2, 2), "subu.co r1, r2, r2", "{subu.co r1, r2, r2}"),
454: T(A(1, 2, 3), "subu.co r1, r2, r3", "{subu.co r1, r2, r3}"),
455: #undef A
456: T(0xf6326601, "subu.ci r17,r18,r1", "{subu.ci r17,r18,r1}"),
457: T(0xf6326701, "subu.cio r17,r18,r1", "{subu.cio r17,r18,r1}"),
458:
459: #define A(d, s1, s2) M(0xf400'6800, d, s1, s2)
460: T(A(0, 0, 0), "divu r0, r0, r0", "{divu r0, r0}"),
461: T(A(0, 0, 1), "divu r0, r0, r1", "{divu r0, r1}"),
462: T(A(0, 1, 0), "divu r0, r1, r0", "{divu r0, r1, r0}"),
463: T(A(0, 1, 1), "divu r0, r1, r1", "{divu r0, r1, r1}"),
464: T(A(0, 1, 2), "divu r0, r1, r2", "{divu r0, r1, r2}"),
465: T(A(0, 2, 1), "divu r0, r2, r1", "{divu r0, r2, r1}"),
466: T(A(1, 0, 0), "divu r1, r0, r0", "{divu r1, r0, r0}"),
467: T(A(1, 0, 1), "divu r1, r0, r1", "{divu r1, r0, r1}"),
468: T(A(1, 0, 2), "divu r1, r0, r2", "{divu r1, r0, r2}"),
469: T(A(1, 1, 0), "divu r1, r1, r0", "{divu r1, r0}"),
470: T(A(1, 1, 1), "divu r1, r1, r1", "{divu r1, r1}"),
471: T(A(1, 1, 2), "divu r1, r1, r2", "{divu r1, r2}"),
472: T(A(1, 2, 0), "divu r1, r2, r0", "{divu r1, r2, r0}"),
473: T(A(1, 2, 1), "divu r1, r2, r1", "{divu r1, r2, r1}"),
474: T(A(1, 2, 2), "divu r1, r2, r2", "{divu r1, r2, r2}"),
475: T(A(1, 2, 3), "divu r1, r2, r3", "{divu r1, r2, r3}"),
476: #undef A
477:
478: #define A(d, s1, s2) M(0xf400'6c00, d, s1, s2)
479: T(A(0, 0, 0), "mul r0, r0, r0", "{mul r0, r0}"),
480: T(A(0, 0, 1), "mul r0, r0, r1", "{mul r0, r1}"),
481: T(A(0, 1, 0), "mul r0, r1, r0", "{mul r0, r1, r0}"),
482: T(A(0, 1, 1), "mul r0, r1, r1", "{mul r0, r1, r1}"),
483: T(A(0, 1, 2), "mul r0, r1, r2", "{mul r0, r1, r2}"),
484: T(A(0, 2, 1), "mul r0, r2, r1", "{mul r0, r2, r1}"),
485: T(A(1, 0, 0), "mul r1, r0, r0", "{mul r1, r0, r0}"),
486: T(A(1, 0, 1), "mul r1, r0, r1", "{mul r1, r0, r1}"),
487: T(A(1, 0, 2), "mul r1, r0, r2", "{mul r1, r0, r2}"),
488: T(A(1, 1, 0), "mul r1, r1, r0", "{mul r1, r0}"),
489: T(A(1, 1, 1), "mul r1, r1, r1", "{mul r1, r1}"),
490: T(A(1, 1, 2), "mul r1, r1, r2", "{mul r1, r2}"),
491: T(A(1, 2, 0), "mul r1, r2, r0", "{mul r1, r2, r0}"),
492: T(A(1, 2, 1), "mul r1, r2, r1", "{mul r1, r2, r1}"),
493: T(A(1, 2, 2), "mul r1, r2, r2", "{mul r1, r2, r2}"),
494: T(A(1, 2, 3), "mul r1, r2, r3", "{mul r1, r2, r3}"),
495: #undef A
496:
497: #define A(d, s1, s2) M(0xf400'7000, d, s1, s2)
498: T(A(0, 0, 0), "add r0, r0, r0", "{nop}"),
499: T(A(0, 0, 1), "add r0, r0, r1", "{nop}"),
500: T(A(0, 1, 0), "add r0, r1, r0", "{nop}"),
501: T(A(0, 1, 1), "add r0, r1, r1", "{adds r0, r1, r1}"),
502: T(A(0, 1, 2), "add r0, r1, r2", "{adds r0, r1, r2}"),
503: T(A(0, 2, 1), "add r0, r2, r1", "{adds r0, r2, r1}"),
504: T(A(1, 0, 0), "add r1, r0, r0", "{clr r1}"),
505: T(A(1, 0, 1), "add r1, r0, r1", "{nop}"),
506: T(A(1, 0, 2), "add r1, r0, r2", "{mov r1, r2}"),
507: T(A(1, 1, 0), "add r1, r1, r0", "{nop}"),
508: T(A(1, 1, 1), "add r1, r1, r1", "{adds r1, r1}"),
509: T(A(1, 1, 2), "add r1, r1, r2", "{adds r1, r2}"),
510: T(A(1, 2, 0), "add r1, r2, r0", "{mov r1, r2}"),
511: T(A(1, 2, 1), "add r1, r2, r1", "{adds r1, r2, r1}"),
512: T(A(1, 2, 2), "add r1, r2, r2", "{adds r1, r2, r2}"),
513: T(A(1, 2, 3), "add r1, r2, r3", "{adds r1, r2, r3}"),
514: #undef A
515:
516: // Carry In/Out を含むやつは 2オペランドへの省略のみ (.coだけ代表でテスト)
517: #define A(d, s1, s2) M(0xf400'7100, d, s1, s2)
518: T(A(0, 0, 0), "add.co r0, r0, r0", "{adds.co r0, r0}"),
519: T(A(0, 0, 1), "add.co r0, r0, r1", "{adds.co r0, r1}"),
520: T(A(0, 1, 0), "add.co r0, r1, r0", "{adds.co r0, r1, r0}"),
521: T(A(0, 1, 1), "add.co r0, r1, r1", "{adds.co r0, r1, r1}"),
522: T(A(0, 1, 2), "add.co r0, r1, r2", "{adds.co r0, r1, r2}"),
523: T(A(0, 2, 1), "add.co r0, r2, r1", "{adds.co r0, r2, r1}"),
524: T(A(1, 0, 0), "add.co r1, r0, r0", "{adds.co r1, r0, r0}"),
525: T(A(1, 0, 1), "add.co r1, r0, r1", "{adds.co r1, r0, r1}"),
526: T(A(1, 0, 2), "add.co r1, r0, r2", "{adds.co r1, r0, r2}"),
527: T(A(1, 1, 0), "add.co r1, r1, r0", "{adds.co r1, r0}"),
528: T(A(1, 1, 1), "add.co r1, r1, r1", "{adds.co r1, r1}"),
529: T(A(1, 1, 2), "add.co r1, r1, r2", "{adds.co r1, r2}"),
530: T(A(1, 2, 0), "add.co r1, r2, r0", "{adds.co r1, r2, r0}"),
531: T(A(1, 2, 1), "add.co r1, r2, r1", "{adds.co r1, r2, r1}"),
532: T(A(1, 2, 2), "add.co r1, r2, r2", "{adds.co r1, r2, r2}"),
533: T(A(1, 2, 3), "add.co r1, r2, r3", "{adds.co r1, r2, r3}"),
534: #undef A
535: T(0xf6327201, "add.ci r17,r18,r1", "{adds.ci r17,r18,r1}"),
536: T(0xf6327301, "add.cio r17,r18,r1", "{adds.cio r17,r18,r1}"),
537:
538: #define A(d, s1, s2) M(0xf400'7400, d, s1, s2)
539: T(A(0, 0, 0), "sub r0, r0, r0", "{nop}"),
540: T(A(0, 0, 1), "sub r0, r0, r1", "{subs r0, r1}"),
541: T(A(0, 1, 0), "sub r0, r1, r0", "{nop}"),
542: T(A(0, 1, 1), "sub r0, r1, r1", "{subs r0, r1, r1}"),
543: T(A(0, 1, 2), "sub r0, r1, r2", "{subs r0, r1, r2}"),
544: T(A(0, 2, 1), "sub r0, r2, r1", "{subs r0, r2, r1}"),
545: T(A(1, 0, 0), "sub r1, r0, r0", "{clr r1}"),
546: T(A(1, 0, 1), "sub r1, r0, r1", "{subs r1, r0, r1}"),
547: T(A(1, 0, 2), "sub r1, r0, r2", "{subs r1, r0, r2}"),
548: T(A(1, 1, 0), "sub r1, r1, r0", "{nop}"),
549: T(A(1, 1, 1), "sub r1, r1, r1", "{subs r1, r1}"),
550: T(A(1, 1, 2), "sub r1, r1, r2", "{subs r1, r2}"),
551: T(A(1, 2, 0), "sub r1, r2, r0", "{mov r1, r2}"),
552: T(A(1, 2, 1), "sub r1, r2, r1", "{subs r1, r2, r1}"),
553: T(A(1, 2, 2), "sub r1, r2, r2", "{subs r1, r2, r2}"),
554: T(A(1, 2, 3), "sub r1, r2, r3", "{subs r1, r2, r3}"),
555: #undef A
556:
557: // Carry In/Out を含むやつは 2オペランドへの省略のみ (.coだけ代表でテスト)
558: #define A(d, s1, s2) M(0xf400'7500, d, s1, s2)
559: T(A(0, 0, 0), "sub.co r0, r0, r0", "{subs.co r0, r0}"),
560: T(A(0, 0, 1), "sub.co r0, r0, r1", "{subs.co r0, r1}"),
561: T(A(0, 1, 0), "sub.co r0, r1, r0", "{subs.co r0, r1, r0}"),
562: T(A(0, 1, 1), "sub.co r0, r1, r1", "{subs.co r0, r1, r1}"),
563: T(A(0, 1, 2), "sub.co r0, r1, r2", "{subs.co r0, r1, r2}"),
564: T(A(0, 2, 1), "sub.co r0, r2, r1", "{subs.co r0, r2, r1}"),
565: T(A(1, 0, 0), "sub.co r1, r0, r0", "{subs.co r1, r0, r0}"),
566: T(A(1, 0, 1), "sub.co r1, r0, r1", "{subs.co r1, r0, r1}"),
567: T(A(1, 0, 2), "sub.co r1, r0, r2", "{subs.co r1, r0, r2}"),
568: T(A(1, 1, 0), "sub.co r1, r1, r0", "{subs.co r1, r0}"),
569: T(A(1, 1, 1), "sub.co r1, r1, r1", "{subs.co r1, r1}"),
570: T(A(1, 1, 2), "sub.co r1, r1, r2", "{subs.co r1, r2}"),
571: T(A(1, 2, 0), "sub.co r1, r2, r0", "{subs.co r1, r2, r0}"),
572: T(A(1, 2, 1), "sub.co r1, r2, r1", "{subs.co r1, r2, r1}"),
573: T(A(1, 2, 2), "sub.co r1, r2, r2", "{subs.co r1, r2, r2}"),
574: T(A(1, 2, 3), "sub.co r1, r2, r3", "{subs.co r1, r2, r3}"),
575: #undef A
576: T(0xf6327601, "sub.ci r17,r18,r1", "{subs.ci r17,r18,r1}"),
577: T(0xf6327701, "sub.cio r17,r18,r1", "{subs.cio r17,r18,r1}"),
578:
579: #define A(d, s1, s2) M(0xf400'7800, d, s1, s2)
580: T(A(0, 0, 0), "div r0, r0, r0", "{div r0, r0}"),
581: T(A(0, 0, 1), "div r0, r0, r1", "{div r0, r1}"),
582: T(A(0, 1, 0), "div r0, r1, r0", "{div r0, r1, r0}"),
583: T(A(0, 1, 1), "div r0, r1, r1", "{div r0, r1, r1}"),
584: T(A(0, 1, 2), "div r0, r1, r2", "{div r0, r1, r2}"),
585: T(A(0, 2, 1), "div r0, r2, r1", "{div r0, r2, r1}"),
586: T(A(1, 0, 0), "div r1, r0, r0", "{div r1, r0, r0}"),
587: T(A(1, 0, 1), "div r1, r0, r1", "{div r1, r0, r1}"),
588: T(A(1, 0, 2), "div r1, r0, r2", "{div r1, r0, r2}"),
589: T(A(1, 1, 0), "div r1, r1, r0", "{div r1, r0}"),
590: T(A(1, 1, 1), "div r1, r1, r1", "{div r1, r1}"),
591: T(A(1, 1, 2), "div r1, r1, r2", "{div r1, r2}"),
592: T(A(1, 2, 0), "div r1, r2, r0", "{div r1, r2, r0}"),
593: T(A(1, 2, 1), "div r1, r2, r1", "{div r1, r2, r1}"),
594: T(A(1, 2, 2), "div r1, r2, r2", "{div r1, r2, r2}"),
595: T(A(1, 2, 3), "div r1, r2, r3", "{div r1, r2, r3}"),
596: #undef A
597:
598: #define A(d, s1, s2) M(0xf400'7c00, d, s1, s2)
599: T(A(0, 0, 0), "cmp r0, r0, r0", "{nop}"),
600: T(A(0, 0, 1), "cmp r0, r0, r1", "{nop}"),
601: T(A(0, 1, 0), "cmp r0, r1, r0", "{nop}"),
602: T(A(0, 1, 1), "cmp r0, r1, r1", "{nop}"),
603: T(A(0, 1, 2), "cmp r0, r1, r2", "{nop}"),
604: T(A(0, 2, 1), "cmp r0, r2, r1", "{nop}"),
605: O(A(1, 0, 0), "cmp r1, r0, r0"),
606: O(A(1, 0, 1), "cmp r1, r0, r1"),
607: O(A(1, 0, 2), "cmp r1, r0, r2"),
608: O(A(1, 1, 0), "cmp r1, r1, r0"),
609: O(A(1, 1, 1), "cmp r1, r1, r1"),
610: O(A(1, 1, 2), "cmp r1, r1, r2"),
611: O(A(1, 2, 0), "cmp r1, r2, r0"),
612: O(A(1, 2, 1), "cmp r1, r2, r1"),
613: O(A(1, 2, 2), "cmp r1, r2, r2"),
614: O(A(1, 2, 3), "cmp r1, r2, r3"),
615: #undef A
616:
617: #define A(d, s1, s2) M(0xf400'8000, d, s1, s2)
618: T(A(0, 0, 0), "clr r0, r0, r0", "{nop}"),
619: T(A(0, 0, 1), "clr r0, r0, r1", "{nop}"),
620: T(A(0, 1, 0), "clr r0, r1, r0", "{nop}"),
621: T(A(0, 1, 1), "clr r0, r1, r1", "{nop}"),
622: T(A(0, 1, 2), "clr r0, r1, r2", "{nop}"),
623: T(A(0, 2, 1), "clr r0, r2, r1", "{nop}"),
624: T(A(1, 0, 0), "clr r1, r0, r0", "{clr r1}"),
625: T(A(1, 0, 1), "clr r1, r0, r1", "{clr r1}"),
626: T(A(1, 0, 2), "clr r1, r0, r2", "{clr r1}"),
627: T(A(1, 1, 0), "clr r1, r1, r0", "{nop}"),
628: T(A(1, 1, 1), "clr r1, r1, r1", "{bfclr r1, r1}"),
629: T(A(1, 1, 2), "clr r1, r1, r2", "{bfclr r1, r2}"),
630: T(A(1, 2, 0), "clr r1, r2, r0", "{mov r1, r2}"),
631: T(A(1, 2, 1), "clr r1, r2, r1", "{bfclr r1, r2, r1}"),
632: T(A(1, 2, 2), "clr r1, r2, r2", "{bfclr r1, r2, r2}"),
633: T(A(1, 2, 3), "clr r1, r2, r3", "{bfclr r1, r2, r3}"),
634: #undef A
635:
636: #define A(d, s1, s2) M(0xf400'8800, d, s1, s2)
637: T(A(0, 0, 0), "set r0, r0, r0", "{nop}"),
638: T(A(0, 0, 1), "set r0, r0, r1", "{nop}"),
639: T(A(0, 1, 0), "set r0, r1, r0", "{nop}"),
640: T(A(0, 1, 1), "set r0, r1, r1", "{nop}"),
641: T(A(0, 1, 2), "set r0, r1, r2", "{nop}"),
642: T(A(0, 2, 1), "set r0, r2, r1", "{nop}"),
643: T(A(1, 0, 0), "set r1, r0, r0", "{mov r1, #0xffffffff}"),
644: T(A(1, 0, 1), "set r1, r0, r1", "{bfset r1, r0, r1}"),
645: T(A(1, 0, 2), "set r1, r0, r2", "{bfset r1, r0, r2}"),
646: T(A(1, 1, 0), "set r1, r1, r0", "{mov r1, #0xffffffff}"),
647: T(A(1, 1, 1), "set r1, r1, r1", "{bfset r1, r1}"),
648: T(A(1, 1, 2), "set r1, r1, r2", "{bfset r1, r2}"),
649: T(A(1, 2, 0), "set r1, r2, r0", "{mov r1, #0xffffffff}"),
650: T(A(1, 2, 1), "set r1, r2, r1", "{bfset r1, r2, r1}"),
651: T(A(1, 2, 2), "set r1, r2, r2", "{bfset r1, r2, r2}"),
652: T(A(1, 2, 3), "set r1, r2, r3", "{bfset r1, r2, r3}"),
653: #undef A
654:
655: #define A(d, s1, s2) M(0xf400'9000, d, s1, s2)
656: T(A(0, 0, 0), "ext r0, r0, r0", "{nop}"),
657: T(A(0, 0, 1), "ext r0, r0, r1", "{nop}"),
658: T(A(0, 1, 0), "ext r0, r1, r0", "{nop}"),
659: T(A(0, 1, 1), "ext r0, r1, r1", "{nop}"),
660: T(A(0, 1, 2), "ext r0, r1, r2", "{nop}"),
661: T(A(0, 2, 1), "ext r0, r2, r1", "{nop}"),
662: T(A(1, 0, 0), "ext r1, r0, r0", "{mov r1, r0}"),
663: T(A(1, 0, 1), "ext r1, r0, r1", "{bfexts r1, r0, r1}"),
664: T(A(1, 0, 2), "ext r1, r0, r2", "{bfexts r1, r0, r2}"),
665: T(A(1, 1, 0), "ext r1, r1, r0", "{nop}"),
666: T(A(1, 1, 1), "ext r1, r1, r1", "{bfexts r1, r1}"),
667: T(A(1, 1, 2), "ext r1, r1, r2", "{bfexts r1, r2}"),
668: T(A(1, 2, 0), "ext r1, r2, r0", "{mov r1, r2}"),
669: T(A(1, 2, 1), "ext r1, r2, r1", "{bfexts r1, r2, r1}"),
670: T(A(1, 2, 2), "ext r1, r2, r2", "{bfexts r1, r2, r2}"),
671: T(A(1, 2, 3), "ext r1, r2, r3", "{bfexts r1, r2, r3}"),
672: #undef A
673:
674: #define A(d, s1, s2) M(0xf400'9800, d, s1, s2)
675: T(A(0, 0, 0), "extu r0, r0, r0", "{nop}"),
676: T(A(0, 0, 1), "extu r0, r0, r1", "{nop}"),
677: T(A(0, 1, 0), "extu r0, r1, r0", "{nop}"),
678: T(A(0, 1, 1), "extu r0, r1, r1", "{nop}"),
679: T(A(0, 1, 2), "extu r0, r1, r2", "{nop}"),
680: T(A(0, 2, 1), "extu r0, r2, r1", "{nop}"),
681: T(A(1, 0, 0), "extu r1, r0, r0", "{mov r1, r0}"),
682: T(A(1, 0, 1), "extu r1, r0, r1", "{bfextu r1, r0, r1}"),
683: T(A(1, 0, 2), "extu r1, r0, r2", "{bfextu r1, r0, r2}"),
684: T(A(1, 1, 0), "extu r1, r1, r0", "{nop}"),
685: T(A(1, 1, 1), "extu r1, r1, r1", "{bfextu r1, r1}"),
686: T(A(1, 1, 2), "extu r1, r1, r2", "{bfextu r1, r2}"),
687: T(A(1, 2, 0), "extu r1, r2, r0", "{mov r1, r2}"),
688: T(A(1, 2, 1), "extu r1, r2, r1", "{bfextu r1, r2, r1}"),
689: T(A(1, 2, 2), "extu r1, r2, r2", "{bfextu r1, r2, r2}"),
690: T(A(1, 2, 3), "extu r1, r2, r3", "{bfextu r1, r2, r3}"),
691: #undef A
692:
693: #define A(d, s1, s2) M(0xf400'a000, d, s1, s2)
694: T(A(0, 0, 0), "mak r0, r0, r0", "{nop}"),
695: T(A(0, 0, 1), "mak r0, r0, r1", "{nop}"),
696: T(A(0, 1, 0), "mak r0, r1, r0", "{nop}"),
697: T(A(0, 1, 1), "mak r0, r1, r1", "{nop}"),
698: T(A(0, 1, 2), "mak r0, r1, r2", "{nop}"),
699: T(A(0, 2, 1), "mak r0, r2, r1", "{nop}"),
700: T(A(1, 0, 0), "mak r1, r0, r0", "{clr r1}"),
701: T(A(1, 0, 1), "mak r1, r0, r1", "{clr r1}"),
702: T(A(1, 0, 2), "mak r1, r0, r2", "{clr r1}"),
703: T(A(1, 1, 0), "mak r1, r1, r0", "{nop}"),
704: T(A(1, 1, 1), "mak r1, r1, r1", "{bfmak r1, r1}"),
705: T(A(1, 1, 2), "mak r1, r1, r2", "{bfmak r1, r2}"),
706: T(A(1, 2, 0), "mak r1, r2, r0", "{mov r1, r2}"),
707: T(A(1, 2, 1), "mak r1, r2, r1", "{bfmak r1, r2, r1}"),
708: T(A(1, 2, 2), "mak r1, r2, r2", "{bfmak r1, r2, r2}"),
709: T(A(1, 2, 3), "mak r1, r2, r3", "{bfmak r1, r2, r3}"),
710: #undef A
711:
712: #define A(d, s1, s2) M(0xf400'a800, d, s1, s2)
713: T(A(0, 0, 0), "rot r0, r0, r0", "{nop}"),
714: T(A(0, 0, 1), "rot r0, r0, r1", "{nop}"),
715: T(A(0, 1, 0), "rot r0, r1, r0", "{nop}"),
716: T(A(0, 1, 1), "rot r0, r1, r1", "{nop}"),
717: T(A(0, 1, 2), "rot r0, r1, r2", "{nop}"),
718: T(A(0, 2, 1), "rot r0, r2, r1", "{nop}"),
719: T(A(1, 0, 0), "rot r1, r0, r0", "{clr r1}"),
720: T(A(1, 0, 1), "rot r1, r0, r1", "{clr r1}"),
721: T(A(1, 0, 2), "rot r1, r0, r2", "{clr r1}"),
722: T(A(1, 1, 0), "rot r1, r1, r0", "{nop}"),
723: T(A(1, 1, 1), "rot r1, r1, r1", "{ror r1, r1}"),
724: T(A(1, 1, 2), "rot r1, r1, r2", "{ror r1, r2}"),
725: T(A(1, 2, 0), "rot r1, r2, r0", "{mov r1, r2}"),
726: T(A(1, 2, 1), "rot r1, r2, r1", "{ror r1, r2, r1}"),
727: T(A(1, 2, 2), "rot r1, r2, r2", "{ror r1, r2, r2}"),
728: T(A(1, 2, 3), "rot r1, r2, r3", "{ror r1, r2, r3}"),
729: #undef A
730:
731: O(0xf400c011, "jmp r17"),
732: O(0xf400c411, "jmp.n r17"),
733: O(0xf400c811, "jsr r17"),
734: O(0xf400cc11, "jsr.n r17"),
735:
736: #define A(d, s2) M(0xf400'e800, d, 0, s2)
737: T(A(0, 0), "ff1 r0, r0", "{nop}"),
738: T(A(0, 1), "ff1 r0, r1", "{nop}"),
739: T(A(1, 0), "ff1 r1, r0", "{mov r1, #32}"),
740: T(A(1, 1), "ff1 r1, r1", "{ff1 r1, r1}"),
741: T(A(1, 2), "ff1 r1, r2", "{ff1 r1, r2}"),
742: #undef A
743: #define A(d, s2) M(0xf400'ec00, d, 0, s2)
744: T(A(0, 0), "ff0 r0, r0", "{nop}"),
745: T(A(0, 1), "ff0 r0, r1", "{nop}"),
746: T(A(1, 0), "ff0 r1, r0", "{clr r1}"),
747: T(A(1, 1), "ff0 r1, r1", "{ff0 r1, r1}"),
748: T(A(1, 2), "ff0 r1, r2", "{ff0 r1, r2}"),
749: #undef A
750:
751: O(0xf400fc00, "rte"),
752: O(0xf411f801, "tbnd r17,r1"),
753: O(0xf8118765, "tbnd r17,#0x8765"),
1.1 root 754: };
755:
756: static uint8 ram[1024];
757: static int failed;
758:
1.1.1.5 root 759: #include "test_debugger_memory.cpp"
1.1 root 760:
761: // リンカを通すためのダミー
1.1.1.5 root 762: DisasmLine::~DisasmLine() { }
1.1 root 763: DebuggerMD::~DebuggerMD() { }
1.1.1.8 ! root 764: uint32 DebuggerMD::GetNextPC() { return 0; }
! 765: void DebuggerMD::PrintExceptionFrame(FILE *, busaddr) { }
1.1 root 766:
767: int
768: main(int ac, char *av[])
769: {
1.1.1.6 root 770: busaddr saddr;
1.1 root 771:
1.1.1.4 root 772: m88100disasm::use_altname = 1;
1.1.1.2 root 773:
1.1 root 774: // DebuggerMD (の継承クラス)を用意するのは芋づる式に大変なので、
775: // 中でアクセスする変数だけ強引に用意する。
1.1.1.7 root 776: DebuggerMD *md = (DebuggerMD *)calloc(1, sizeof(DebuggerMD));
1.1 root 777: md->inst_bytes = 4;
778:
779: for (int i = 0; i < countof(table); i++) {
1.1.1.2 root 780: int line = table[i].line;
781: std::string expstd = table[i].expstd;
782: std::string expalt = table[i].expalt;
1.1 root 783: uint32 inst = table[i].inst;
784:
785: // エラー表示用
1.1.1.2 root 786: std::string inst_str = string_format("%d: $%08x", line, inst);
1.1 root 787:
788: // 全体を初期化
789: memset(ram, 0xdd, sizeof(ram));
790: // 100番地に命令列を書き込む
791: *(uint16 *)(ram + 0x100) = inst >> 16;
792: *(uint16 *)(ram + 0x102) = inst & 0xffff;
793: // 検査
1.1.1.7 root 794: saddr = busaddr(0x100);
1.1.1.5 root 795: m88100disasm dis;
796: DebuggerMemoryStream mem(NULL, saddr);
797: dis.Exec(&mem);
1.1 root 798: // 照合
1.1.1.2 root 799: if (dis.text != expstd) {
800: printf("%s std expects \"%s\" but \"%s\"\n", inst_str.c_str(),
801: expstd.c_str(), dis.text.c_str());
1.1 root 802: failed++;
803: continue;
804: }
805: uint32 expected_len = 4;
806: if (dis.bin.size() != expected_len) {
1.1.1.2 root 807: printf("%s std expects len=$%x but $%x\n", inst_str.c_str(),
1.1 root 808: expected_len, (uint)dis.bin.size());
809: failed++;
810: continue;
811: }
1.1.1.2 root 812:
813: // 照合(別名)
814: if (dis.alttext != expalt) {
815: printf("%s alt expects \"%s\" but \"%s\"\n", inst_str.c_str(),
816: expalt.c_str(), dis.alttext.c_str());
817: failed++;
818: continue;
819: }
1.1 root 820: }
821:
822: int total = countof(table);
823: printf("%d tests, %d success", total, total - failed);
824: if (failed > 0) {
825: printf(", %d failed", failed);
826: }
827: printf("\n");
828: return 0;
829: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.