m32c.opc revision 1.1.1.11 1 1.1 christos /* m32c.opc --- semantics for m32c opcodes. -*- mode: c -*-
2 1.1 christos
3 1.1.1.11 christos Copyright (C) 2005-2024 Free Software Foundation, Inc.
4 1.1 christos Contributed by Red Hat, Inc.
5 1.1 christos
6 1.1 christos This file is part of the GNU simulators.
7 1.1 christos
8 1.1 christos This program is free software; you can redistribute it and/or modify
9 1.1 christos it under the terms of the GNU General Public License as published by
10 1.1 christos the Free Software Foundation; either version 3 of the License, or
11 1.1 christos (at your option) any later version.
12 1.1 christos
13 1.1 christos This program is distributed in the hope that it will be useful,
14 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
15 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 1.1 christos GNU General Public License for more details.
17 1.1 christos
18 1.1 christos You should have received a copy of the GNU General Public License
19 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 1.1 christos
21 1.1.1.10 christos /* This must come before any other includes. */
22 1.1.1.10 christos #include "defs.h"
23 1.1 christos
24 1.1 christos #include <stdio.h>
25 1.1 christos #include <stdlib.h>
26 1.1 christos
27 1.1.1.10 christos #include "ansidecl.h"
28 1.1 christos #include "cpu.h"
29 1.1 christos #include "mem.h"
30 1.1 christos #include "misc.h"
31 1.1 christos #include "int.h"
32 1.1 christos
33 1.1 christos #define tprintf if (trace) printf
34 1.1 christos
35 1.1 christos static unsigned char
36 1.1.1.5 christos getbyte (void)
37 1.1 christos {
38 1.1 christos int tsave = trace;
39 1.1 christos unsigned char b;
40 1.1 christos
41 1.1 christos if (trace == 1)
42 1.1 christos trace = 0;
43 1.1 christos b = mem_get_pc ();
44 1.1 christos regs.r_pc ++;
45 1.1 christos trace = tsave;
46 1.1 christos return b;
47 1.1 christos }
48 1.1 christos
49 1.1 christos #define M32C_ONLY() /* FIXME: add something here */
50 1.1 christos
51 1.1 christos #define GETBYTE() (op[opi++] = getbyte())
52 1.1 christos
53 1.1 christos #define UNSUPPORTED() unsupported("unsupported", m32c_opcode_pc)
54 1.1 christos #define NOTYET() unsupported("unimplemented", m32c_opcode_pc)
55 1.1 christos
56 1.1 christos static void
57 1.1 christos unsupported (char *tag, int orig_pc)
58 1.1 christos {
59 1.1 christos int i;
60 1.1 christos printf("%s opcode at %08x\n", tag, orig_pc);
61 1.1 christos regs.r_pc = orig_pc;
62 1.1 christos for (i=0; i<2; i++)
63 1.1 christos {
64 1.1 christos int b = mem_get_pc();
65 1.1 christos printf(" %s", bits(b>>4, 4));
66 1.1 christos printf(" %s", bits(b, 4));
67 1.1 christos regs.r_pc ++;
68 1.1 christos }
69 1.1 christos printf("\n");
70 1.1 christos regs.r_pc = orig_pc;
71 1.1 christos for (i=0; i<6; i++)
72 1.1 christos {
73 1.1 christos printf(" %02x", mem_get_pc ());
74 1.1 christos regs.r_pc ++;
75 1.1 christos }
76 1.1 christos printf("\n");
77 1.1 christos exit(1);
78 1.1 christos }
79 1.1 christos
80 1.1 christos static int
81 1.1 christos IMM(int bytes)
82 1.1 christos {
83 1.1 christos int rv = 0;
84 1.1 christos switch (bytes)
85 1.1 christos {
86 1.1 christos case 1:
87 1.1 christos rv = mem_get_qi (get_reg(pc));
88 1.1 christos break;
89 1.1 christos case 2:
90 1.1 christos rv = mem_get_hi (get_reg(pc));
91 1.1 christos break;
92 1.1 christos case 3:
93 1.1 christos rv = mem_get_psi (get_reg(pc));
94 1.1 christos break;
95 1.1 christos case 4:
96 1.1 christos rv = mem_get_si (get_reg(pc));
97 1.1 christos break;
98 1.1 christos }
99 1.1 christos regs.r_pc += bytes;
100 1.1 christos return rv;
101 1.1 christos }
102 1.1 christos
103 1.1 christos #define IMM4() (immm >= 8 ? 7 - immm : immm + 1)
104 1.1 christos
105 1.1 christos #define NO_PREFIX() PREFIX(0,0,0)
106 1.1 christos
107 1.1 christos /* Indicate which sorts of prefixes are allowed for the current
108 1.1 christos opcode. */
109 1.1.1.5 christos static void
110 1.1.1.5 christos prefix (int src_allowed, int dest_allowed, int index_bytewidth)
111 1.1 christos {
112 1.1 christos /* At the moment, we don't do anything with this information. We
113 1.1 christos just wanted to get the information entered in some
114 1.1 christos machine-readable form while we were going through all the
115 1.1 christos opcodes. */
116 1.1 christos }
117 1.1 christos
118 1.1 christos #define MATH_OP(dc,s,c,op) \
119 1.1 christos { \
120 1.1 christos int ma, mb; \
121 1.1 christos ma = get_src(dc); \
122 1.1 christos mb = s & b2mask[dc.bytes]; \
123 1.1 christos ll = (long long)ma op (long long)mb op c; \
124 1.1 christos tprintf("0x%x " #op " 0x%x " #op " 0x%x = 0x%llx\n", ma, mb, c, ll); \
125 1.1 christos ma = sign_ext (ma, dc.bytes * 8); \
126 1.1 christos mb = sign_ext (s, dc.bytes * 8); \
127 1.1 christos v = ma op mb op c; \
128 1.1 christos tprintf("%d " #op " %d " #op " %d = %d\n", ma, mb, c, v); \
129 1.1 christos set_oszc (v, dc.bytes, (1 op 1) ? (ll > b2mask[dc.bytes]) : (ll >= 0)); \
130 1.1 christos put_dest (dc, v); \
131 1.1 christos }
132 1.1 christos
133 1.1 christos #define LOGIC_OP(dc,s,op) \
134 1.1 christos { \
135 1.1 christos int ma, mb; \
136 1.1 christos ma = get_src(dc); \
137 1.1 christos mb = s & b2mask[dc.bytes]; \
138 1.1 christos v = ma op mb; \
139 1.1 christos tprintf("0x%x " #op " 0x%x = 0x%x\n", ma, mb, v); \
140 1.1 christos set_sz (v, dc.bytes); \
141 1.1 christos put_dest (dc, v); \
142 1.1 christos }
143 1.1 christos
144 1.1 christos #define BIT_OP(dc,bit,expr) \
145 1.1 christos b = get_bit2 (dc, bitindex == -1 ? bit : bitindex); \
146 1.1 christos v = expr; \
147 1.1 christos tprintf ("b=%d, bit=%d, carry=%d, %s = %d\n", \
148 1.1 christos b, bitindex == -1 ? bit : bitindex, carry, #expr, v); \
149 1.1 christos put_bit2 (dc, bitindex == -1 ? bit : bitindex, v);
150 1.1 christos
151 1.1 christos #define BIT_OPC(dc,bit,expr) \
152 1.1 christos b = get_bit2 (dc, bitindex == -1 ? bit : bitindex); \
153 1.1 christos v = expr; \
154 1.1 christos tprintf ("b=%d, bit=%d, carry=%d, %s = %d\n", \
155 1.1 christos b, bitindex == -1 ? bit : bitindex, carry, #expr, v); \
156 1.1 christos set_c (v);
157 1.1 christos
158 1.1 christos #define carry (FLAG_C ? 1 : 0)
159 1.1 christos
160 1.1 christos static void
161 1.1 christos cmp (int d, int s, int bytes)
162 1.1 christos {
163 1.1 christos int a, b, f=0;
164 1.1 christos a = d - s;
165 1.1 christos b = sign_ext (d, bytes*8) - sign_ext (s, bytes*8);
166 1.1 christos tprintf ("cmp: %x - %x = %08x, %x - %x = %d\n",
167 1.1 christos d, s, a,
168 1.1 christos sign_ext(d,bytes*8), sign_ext(s,bytes*8), b);
169 1.1 christos
170 1.1 christos if (b == 0)
171 1.1 christos f |= FLAGBIT_Z;
172 1.1 christos if (b & b2signbit[bytes])
173 1.1 christos f |= FLAGBIT_S;
174 1.1 christos if ((d & b2mask[bytes]) >= (s & b2mask[bytes]))
175 1.1 christos f |= FLAGBIT_C;
176 1.1 christos if (b < b2minsigned[bytes] || b > b2maxsigned[bytes])
177 1.1 christos f |= FLAGBIT_O;
178 1.1 christos
179 1.1 christos set_flags (FLAGBIT_Z | FLAGBIT_S | FLAGBIT_O | FLAGBIT_C, f);
180 1.1 christos }
181 1.1 christos
182 1.1 christos static void
183 1.1 christos dadd_op (int ddd, int dd, int sss, int ss, int imm, int add, int cy, int w)
184 1.1 christos {
185 1.1 christos srcdest sc, dc;
186 1.1 christos int a, b=0, res;
187 1.1 christos
188 1.1 christos prefix (0, 0, 0);
189 1.1 christos
190 1.1 christos if (!imm)
191 1.1 christos {
192 1.1 christos sc = decode_src23 (sss, ss, w+1);
193 1.1 christos b = get_src (sc);
194 1.1 christos }
195 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
196 1.1 christos a = get_src (dc);
197 1.1 christos if (imm)
198 1.1 christos b = IMM(w+1);
199 1.1 christos
200 1.1 christos a = bcd2int(a, w);
201 1.1 christos b = bcd2int(b, w);
202 1.1 christos
203 1.1 christos tprintf("decimal: %d %s %d", a, add?"+":"-", b);
204 1.1 christos if (cy)
205 1.1 christos tprintf(" c=%d", carry);
206 1.1 christos
207 1.1 christos if (add)
208 1.1 christos {
209 1.1 christos res = a + b;
210 1.1 christos if (cy)
211 1.1 christos res += carry;
212 1.1 christos cy = res > (w ? 9999 : 99);
213 1.1 christos }
214 1.1 christos else
215 1.1 christos {
216 1.1 christos res = a - b;
217 1.1 christos if (cy)
218 1.1 christos res -= (1-carry);
219 1.1 christos cy = res >= 0;
220 1.1 christos if (res < 0)
221 1.1 christos res += w ? 10000 : 100;
222 1.1 christos }
223 1.1 christos
224 1.1 christos res = int2bcd (res, w);
225 1.1 christos tprintf(" = %x\n", res);
226 1.1 christos
227 1.1 christos set_szc (res, w+1, cy);
228 1.1 christos
229 1.1 christos put_dest (dc, res);
230 1.1 christos }
231 1.1 christos #define DADDV(A,C) dadd_op(ddd, dd, sss, ss, 0, A, C, w)
232 1.1 christos #define DADDI(A,C) dadd_op(ddd, dd, 0, 0, 1, A, C, w)
233 1.1 christos
234 1.1 christos static void
235 1.1 christos div_op (int sss, int ss, int u, int x, int bytes)
236 1.1 christos {
237 1.1 christos srcdest sc;
238 1.1 christos int s, v, a, b;
239 1.1 christos
240 1.1 christos if (sss == -1)
241 1.1 christos s = IMM(bytes);
242 1.1 christos else
243 1.1 christos {
244 1.1 christos sc = decode_dest23 (sss, ss, bytes);
245 1.1 christos s = get_src (sc);
246 1.1 christos }
247 1.1 christos
248 1.1 christos v = get_reg (bytes > 1 ? r2r0 : r0);
249 1.1 christos
250 1.1 christos if (!u)
251 1.1 christos {
252 1.1 christos /* FIXME? do we sign extend a0/a1 to .L? Docs say zero extend. */
253 1.1 christos s = sign_ext (s, bytes*8);
254 1.1 christos v = sign_ext (v, bytes*8);
255 1.1 christos }
256 1.1 christos
257 1.1 christos if (s == 0)
258 1.1 christos {
259 1.1 christos set_flags (FLAGBIT_O, FLAGBIT_O);
260 1.1 christos return;
261 1.1 christos }
262 1.1 christos
263 1.1 christos if (u)
264 1.1 christos {
265 1.1 christos a = (unsigned int)v / (unsigned int)s;
266 1.1 christos b = (unsigned int)v % (unsigned int)s;
267 1.1 christos }
268 1.1 christos else
269 1.1 christos {
270 1.1 christos a = v / s;
271 1.1 christos b = v % s;
272 1.1 christos }
273 1.1 christos if (x)
274 1.1 christos {
275 1.1 christos if ((s > 0 && b < 0)
276 1.1 christos || (s < 0 && b > 0))
277 1.1 christos {
278 1.1 christos a --;
279 1.1 christos b += s;
280 1.1 christos }
281 1.1 christos }
282 1.1 christos tprintf ("%d / %d = %d rem %d\n", v, s, a, b);
283 1.1 christos if ((!u && (a > b2maxsigned[bytes]
284 1.1 christos || a < b2minsigned[bytes]))
285 1.1 christos || (u && (a > b2mask[bytes])))
286 1.1 christos set_flags (FLAGBIT_O, FLAGBIT_O);
287 1.1 christos else
288 1.1 christos set_flags (FLAGBIT_O, 0);
289 1.1 christos
290 1.1 christos switch (bytes)
291 1.1 christos {
292 1.1 christos case 1:
293 1.1 christos put_reg (r0l, a);
294 1.1 christos put_reg (r0h, b);
295 1.1 christos break;
296 1.1 christos case 2:
297 1.1 christos put_reg (r0, a);
298 1.1 christos put_reg (r2, b);
299 1.1 christos break;
300 1.1 christos case 4:
301 1.1 christos put_reg (r2r0, a);
302 1.1 christos break;
303 1.1 christos }
304 1.1 christos }
305 1.1 christos
306 1.1 christos static void
307 1.1 christos index_op (int sss, int ss, int do_s, int do_d, int scale, int w)
308 1.1 christos {
309 1.1 christos srcdest sc = decode_src23 (sss, ss, w+1);
310 1.1 christos int v = get_src (sc) * scale;
311 1.1 christos tprintf("%d = %d * %d, %d %d\n", v, get_src(sc), scale, do_s, do_d);
312 1.1 christos decode_index (do_s * v, do_d * v);
313 1.1 christos }
314 1.1 christos #define INDEXOP(scale,do_s,do_d) \
315 1.1 christos index_op (sss, ss, do_s, do_d, scale, w); goto next_opcode
316 1.1 christos
317 1.1 christos static void
318 1.1 christos rot_op (srcdest sd, int rotc, int count)
319 1.1 christos {
320 1.1 christos int mask = (sd.bytes == 2) ? 0xffff : 0xff;
321 1.1 christos int msb = (sd.bytes == 2) ? 0x8000 : 0x80;
322 1.1 christos int v = get_src (sd);
323 1.1 christos int c = carry, ct;
324 1.1 christos
325 1.1 christos tprintf("%s %x by %d\n", rotc ? "rotc" : "rot", v, count);
326 1.1 christos tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
327 1.1 christos while (count > 0)
328 1.1 christos {
329 1.1 christos ct = (v & msb) ? 1 : 0;
330 1.1 christos v <<= 1;
331 1.1 christos v |= rotc ? c : ct;
332 1.1 christos v &= mask;
333 1.1 christos c = ct;
334 1.1 christos tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
335 1.1 christos count --;
336 1.1 christos }
337 1.1 christos while (count < 0)
338 1.1 christos {
339 1.1 christos ct = v & 1;
340 1.1 christos v >>= 1;
341 1.1 christos v |= (rotc ? c : ct) * msb;
342 1.1 christos c = ct;
343 1.1 christos tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
344 1.1 christos count ++;
345 1.1 christos }
346 1.1 christos put_dest (sd, v);
347 1.1 christos set_szc (v, sd.bytes, c);
348 1.1 christos }
349 1.1 christos
350 1.1 christos static void
351 1.1 christos shift_op (srcdest sd, int arith, int count, int setc)
352 1.1 christos {
353 1.1 christos int mask = (sd.bytes == 2) ? 0xffff : 0xff;
354 1.1 christos int msb = (sd.bytes == 2) ? 0x8000 : 0x80;
355 1.1 christos int v = get_src (sd);
356 1.1 christos int c = 0;
357 1.1 christos int o = 0;
358 1.1 christos
359 1.1 christos if (sd.bytes == 4)
360 1.1 christos {
361 1.1 christos mask = 0xffffffffU;
362 1.1 christos msb = 0x80000000U;
363 1.1 christos }
364 1.1 christos
365 1.1 christos tprintf("%s %x by %d\n", arith ? "sha" : "shl", v, count);
366 1.1 christos tprintf (": %s %d %d\n", bits(v, 8*sd.bytes), c, o);
367 1.1 christos while (count > 0)
368 1.1 christos {
369 1.1 christos c = (v & msb) ? 1 : 0;
370 1.1 christos v <<= 1;
371 1.1 christos v &= mask;
372 1.1 christos if (c != ((v & msb) ? 1 : 0))
373 1.1 christos o = 1;
374 1.1 christos tprintf (": %s %d %d\n", bits(v, 8*sd.bytes), c, o);
375 1.1 christos count --;
376 1.1 christos }
377 1.1 christos while (count < 0)
378 1.1 christos {
379 1.1 christos c = v & 1;
380 1.1 christos if (arith)
381 1.1 christos v = (v & msb) | (v >> 1);
382 1.1 christos else
383 1.1 christos v = (v >> 1) & (msb - 1);
384 1.1 christos tprintf (": %s %d %d\n", bits(v, 8*sd.bytes), c, o);
385 1.1 christos count ++;
386 1.1 christos }
387 1.1 christos put_dest (sd, v);
388 1.1 christos set_sz (v, sd.bytes);
389 1.1 christos if (setc)
390 1.1 christos set_c (c);
391 1.1 christos set_flags (FLAGBIT_O, o ? FLAGBIT_O : 0);
392 1.1 christos }
393 1.1 christos
394 1.1 christos static int pcs[16];
395 1.1 christos static int ipcs = 0;
396 1.1 christos
397 1.1 christos int
398 1.1.1.5 christos decode_m32c (void)
399 1.1 christos {
400 1.1 christos unsigned char op[40];
401 1.1 christos int opi;
402 1.1 christos int v, a, b;
403 1.1 christos long long ll;
404 1.1 christos srcdest sc, dc;
405 1.1 christos int imm;
406 1.1 christos int bitindex = -1;
407 1.1 christos int t0, t1=0, t2, t3=0;
408 1.1 christos int ta0, ta1, dif;
409 1.1 christos
410 1.1 christos step_result = M32C_MAKE_STEPPED ();
411 1.1 christos
412 1.1 christos decode_indirect (0, 0);
413 1.1 christos decode_index (0, 0);
414 1.1 christos
415 1.1 christos next_opcode:
416 1.1 christos opi = 0;
417 1.1 christos m32c_opcode_pc = get_reg (pc);
418 1.1 christos
419 1.1 christos tprintf("trace: decode pc = %06x\n", m32c_opcode_pc);
420 1.1 christos
421 1.1 christos if (m32c_opcode_pc == 0)
422 1.1 christos {
423 1.1 christos int i;
424 1.1 christos printf("Abort: PC is zero, here from:\n");
425 1.1 christos for (i=0; i<4; i++)
426 1.1 christos printf(" 0x%06x\n", pcs[(ipcs+15-i)%16]);
427 1.1 christos return M32C_MAKE_HIT_BREAK ();
428 1.1 christos }
429 1.1 christos pcs[ipcs++] = m32c_opcode_pc;
430 1.1 christos ipcs %= 16;
431 1.1 christos
432 1.1 christos /** VARY sss 000 001 010 011 100 */
433 1.1 christos /** VARY ddd 000 001 010 011 100 */
434 1.1 christos
435 1.1 christos /** 0000 1001 indirect dest */
436 1.1 christos
437 1.1 christos decode_indirect (0, 1);
438 1.1 christos goto next_opcode;
439 1.1 christos
440 1.1 christos /** 0100 0001 indirect src */
441 1.1 christos
442 1.1 christos decode_indirect (1, 0);
443 1.1 christos goto next_opcode;
444 1.1 christos
445 1.1 christos /** 0100 1001 indirect src and dest */
446 1.1 christos
447 1.1 christos decode_indirect (1, 1);
448 1.1 christos goto next_opcode;
449 1.1 christos
450 1.1 christos /** 1010 ddd w dd01 1111 ABS.size dest */
451 1.1 christos
452 1.1 christos prefix (0, 1, 0);
453 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
454 1.1 christos v = sign_ext (get_src (dc), w?16:8);
455 1.1 christos a = v<0 ? -v : v;
456 1.1 christos tprintf("abs(%d) = %d\n", v, a);
457 1.1 christos set_osz(a, w+1);
458 1.1 christos put_dest (dc, a);
459 1.1 christos
460 1.1 christos /** 0000 0001 1000 ddd w dd10 1110 ADC.size #IMM,dest */
461 1.1 christos
462 1.1 christos prefix (0, 0, 0);
463 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
464 1.1 christos imm = IMM (w+1);
465 1.1 christos MATH_OP (dc, imm, carry, +);
466 1.1 christos
467 1.1 christos /** 0000 0001 1sss ddd w dd ss 0100 ADC.size src,dest */
468 1.1 christos
469 1.1 christos prefix (0, 0, 0);
470 1.1 christos sc = decode_src23 (sss, ss, w+1);
471 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
472 1.1 christos b = get_src (sc);
473 1.1 christos MATH_OP (dc, b, carry, +);
474 1.1 christos
475 1.1 christos /** 1011 ddd w dd01 1110 ADCF.size dest */
476 1.1 christos
477 1.1 christos prefix (0, 1, 0);
478 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
479 1.1 christos MATH_OP (dc, 0, carry, +);
480 1.1 christos
481 1.1 christos /** 1000 ddd w dd10 1110 ADD.size:G #IMM,dest */
482 1.1 christos
483 1.1 christos prefix (0, 1, 0);
484 1.1 christos dc = decode_dest23(ddd, dd, w+1);
485 1.1 christos imm = IMM(w+1);
486 1.1 christos MATH_OP (dc, imm, 0, +);
487 1.1 christos
488 1.1 christos /** 1000 ddd0 dd11 0001 ADD.L:G #IMM,dest */
489 1.1 christos
490 1.1 christos prefix (0, 1, 0);
491 1.1 christos dc = decode_dest23(ddd, dd, 4);
492 1.1 christos imm = IMM(4);
493 1.1 christos MATH_OP (dc, imm, 0, +);
494 1.1 christos
495 1.1 christos /** 111L ddd w dd11 immm ADD.size:Q #IMM,dest */
496 1.1 christos
497 1.1 christos prefix (0, 1, 0);
498 1.1 christos dc = decode_dest23(ddd, dd, L ? 4 : (w+1));
499 1.1 christos imm = sign_ext (immm, 4);
500 1.1 christos MATH_OP (dc, imm, 0, +);
501 1.1 christos
502 1.1 christos /** 00dd 011w ADD.size:S #IMM,dest */
503 1.1 christos
504 1.1 christos prefix (0, 1, 0);
505 1.1 christos dc = decode_dest2(dd, w+1);
506 1.1 christos imm = IMM (w+1);
507 1.1 christos MATH_OP (dc, imm, 0, +);
508 1.1 christos
509 1.1 christos /** 10i0 110d ADD.L:S #IMM,A0/A1 */
510 1.1 christos
511 1.1 christos prefix (0, 0, 0);
512 1.1 christos dc = reg_sd (d ? a1 : a0);
513 1.1 christos imm = i ? 2 : 1;
514 1.1 christos MATH_OP (dc, imm, 0, +);
515 1.1 christos
516 1.1 christos /** 1sss ddd w dd ss 1000 ADD.size:G src,dest */
517 1.1 christos
518 1.1 christos prefix (1, 1, 0);
519 1.1 christos sc = decode_src23(sss, ss, w+1);
520 1.1 christos dc = decode_dest23(ddd, dd, w+1);
521 1.1 christos b = get_src (sc);
522 1.1 christos MATH_OP (dc, b, 0, +);
523 1.1 christos
524 1.1 christos /** 1sss ddd1 dd ss 0010 ADD.L:G src,dest */
525 1.1 christos
526 1.1 christos prefix (1, 1, 0);
527 1.1 christos sc = decode_src23(sss, ss, 4);
528 1.1 christos dc = decode_dest23(ddd, dd, 4);
529 1.1 christos b = get_src (sc);
530 1.1 christos MATH_OP (dc, b, 0, +);
531 1.1 christos
532 1.1 christos /** 1011 0110 0001 0011 ADD.L:G #IMM16,SP */
533 1.1 christos
534 1.1 christos prefix (0, 0, 0);
535 1.1 christos dc = reg_sd (sp);
536 1.1 christos b = sign_ext (IMM(2), 16);
537 1.1 christos MATH_OP (dc, b, 0, +);
538 1.1 christos
539 1.1 christos /** 01ii 001i ADD.L:Q #IMM3,SP */
540 1.1 christos
541 1.1 christos prefix (0, 0, 0);
542 1.1 christos dc = reg_sd (sp);
543 1.1 christos b = ii * 2 + i + 1;
544 1.1 christos MATH_OP (dc, b, 0, +);
545 1.1 christos
546 1.1 christos /** 1011 0110 0000 0011 ADD.L:S #IMM8,SP */
547 1.1 christos
548 1.1 christos prefix (0, 0, 0);
549 1.1 christos dc = reg_sd (sp);
550 1.1 christos b = sign_ext (IMM(1), 8);
551 1.1 christos MATH_OP (dc, b, 0, +);
552 1.1 christos
553 1.1 christos /** 1000 ddd0 dd01 0001 ADDX #IMM,dest */
554 1.1 christos
555 1.1 christos prefix (0, 1, 0);
556 1.1 christos dc = decode_dest23(ddd, dd, 4);
557 1.1 christos imm = sign_ext (IMM(1), 8);
558 1.1 christos MATH_OP (dc, imm, 0, +);
559 1.1 christos
560 1.1 christos /** 1sss ddd0 dd ss 0010 ADDX src,dest */
561 1.1 christos
562 1.1 christos prefix (1, 1, 0);
563 1.1 christos sc = decode_src23(sss, ss, 1);
564 1.1 christos dc = decode_dest23(ddd, dd, 4);
565 1.1 christos b = sign_ext (get_src (sc), 8);
566 1.1 christos MATH_OP (dc, b, 0, +);
567 1.1 christos
568 1.1 christos /** 1111 ddd w dd01 immm ADJNZ.size #IMM,dest,label */
569 1.1 christos
570 1.1 christos prefix (0, 0, 0);
571 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
572 1.1 christos v = get_src (dc);
573 1.1 christos imm = sign_ext(immm, 4);
574 1.1 christos tprintf("%d + %d = %d\n", v, imm, v+imm);
575 1.1 christos v += imm;
576 1.1 christos put_dest (dc, v);
577 1.1 christos a = sign_ext (IMM(1), 8);
578 1.1 christos if ((v & (w ? 0xffff : 0xff)) != 0)
579 1.1 christos {
580 1.1 christos tprintf("jmp: %x + 2 + %d = ", get_reg (pc), a);
581 1.1 christos put_reg (pc, m32c_opcode_pc + 2 + a);
582 1.1 christos tprintf("%x\n", get_reg (pc));
583 1.1 christos }
584 1.1 christos
585 1.1 christos /** 1000 ddd w dd11 1111 AND.size:G #IMM,dest */
586 1.1 christos
587 1.1 christos prefix (0, 1, 0);
588 1.1 christos dc = decode_dest23(ddd, dd, w+1);
589 1.1 christos imm = IMM(w+1);
590 1.1 christos LOGIC_OP (dc, imm, &);
591 1.1 christos
592 1.1 christos /** 01dd 110w AND.size:S #IMM,dest */
593 1.1 christos
594 1.1 christos prefix (0, 1, 0);
595 1.1 christos dc = decode_dest2(dd, w+1);
596 1.1 christos imm = IMM (w+1);
597 1.1 christos LOGIC_OP (dc, imm, &);
598 1.1 christos
599 1.1 christos /** 1sss ddd w dd ss 1101 AND.size:G src,dest */
600 1.1 christos
601 1.1 christos prefix (1, 1, 0);
602 1.1 christos sc = decode_src23(sss, ss, w+1);
603 1.1 christos dc = decode_dest23(ddd, dd, w+1);
604 1.1 christos b = get_src (sc);
605 1.1 christos LOGIC_OP (dc, b, &);
606 1.1 christos
607 1.1 christos /** 0000 0001 1101 sss0 ss00 1bit BAND src */
608 1.1 christos
609 1.1 christos sc = decode_src23 (sss, ss, 1);
610 1.1 christos BIT_OPC (sc, bit, b & carry);
611 1.1 christos
612 1.1 christos /** 1101 ddd0 dd11 0bit BCLR dest */
613 1.1 christos
614 1.1 christos dc = decode_dest23 (ddd, dd, 1);
615 1.1 christos BIT_OP (dc, bit, 0);
616 1.1 christos
617 1.1 christos /** 1100 ddd w dd10 1110 BITINDEX.size src */
618 1.1 christos
619 1.1 christos prefix (0, 0, 0);
620 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
621 1.1 christos bitindex = get_src (dc);
622 1.1 christos tprintf ("bitindex set to %d\n", bitindex);
623 1.1 christos goto next_opcode;
624 1.1 christos
625 1.1 christos /** 1101 ddd0 dd01 0bit BMcnd dest */
626 1.1 christos
627 1.1 christos prefix (0, 0, 0);
628 1.1 christos dc = decode_dest23 (ddd, dd, 1);
629 1.1 christos if (condition_true (IMM (1)))
630 1.1 christos put_bit2 (dc, bit, 1);
631 1.1 christos else
632 1.1 christos put_bit2 (dc, bit, 0);
633 1.1 christos
634 1.1 christos /** 1101 1001 0c10 1cnd BMcnd C */
635 1.1 christos
636 1.1 christos prefix (0, 0, 0);
637 1.1 christos if (condition_true (c * 8 + cnd))
638 1.1 christos set_c (1);
639 1.1 christos else
640 1.1 christos set_c (0);
641 1.1 christos
642 1.1 christos /** 0000 0001 1101 sss0 ss01 1bit BNAND src */
643 1.1 christos
644 1.1 christos prefix (0, 0, 0);
645 1.1 christos sc = decode_src23 (sss, ss, 1);
646 1.1 christos BIT_OPC (sc, bit, (!b) & carry);
647 1.1 christos
648 1.1 christos /** 0000 0001 1101 sss0 ss11 0bit BNOR src */
649 1.1 christos
650 1.1 christos prefix (0, 0, 0);
651 1.1 christos sc = decode_src23 (sss, ss, 1);
652 1.1 christos BIT_OPC (sc, bit, (!b) | carry);
653 1.1 christos
654 1.1 christos /** 1101 ddd0 dd01 1bit BNOT dest */
655 1.1 christos
656 1.1 christos prefix (0, 0, 0);
657 1.1 christos dc = decode_dest23 (ddd, dd, 1);
658 1.1 christos BIT_OP (dc, bit, !b);
659 1.1 christos
660 1.1 christos /** 0000 0001 1101 sss0 ss00 0bit BNTST src */
661 1.1 christos
662 1.1 christos prefix (0, 0, 0);
663 1.1 christos sc = decode_dest23 (sss, ss, 1);
664 1.1 christos b = get_bit2 (sc, bit);
665 1.1 christos set_zc (!b, !b);
666 1.1 christos
667 1.1 christos /** 0000 0001 1101 sss0 ss11 1bit BNXOR src */
668 1.1 christos
669 1.1 christos prefix (0, 0, 0);
670 1.1 christos sc = decode_src23 (sss, ss, 1);
671 1.1 christos BIT_OPC (sc, bit, !b ^ carry);
672 1.1 christos
673 1.1 christos /** 0000 0001 1101 sss0 ss10 0bit BOR src */
674 1.1 christos
675 1.1 christos prefix (0, 0, 0);
676 1.1 christos sc = decode_src23 (sss, ss, 1);
677 1.1 christos BIT_OPC (sc, bit, b | carry);
678 1.1 christos
679 1.1 christos /** 0000 0000 BRK */
680 1.1 christos
681 1.1 christos /* We report the break to our caller with the PC still pointing at the
682 1.1 christos breakpoint instruction. */
683 1.1 christos put_reg (pc, m32c_opcode_pc);
684 1.1 christos if (verbose)
685 1.1 christos printf("[break]\n");
686 1.1 christos if (in_gdb || (regs.r_intbl == 0 && regs.r_intbh == 0))
687 1.1 christos return M32C_MAKE_HIT_BREAK ();
688 1.1 christos if (mem_get_qi (0xFFFFE7) == 0xff)
689 1.1 christos trigger_based_interrupt (0);
690 1.1 christos else
691 1.1 christos trigger_fixed_interrupt (0xFFFFE4);
692 1.1 christos
693 1.1 christos /** 1111 1110 GBRK */
694 1.1 christos
695 1.1 christos /* This alternate break, which is not part of the chip's opcode set,
696 1.1 christos is here in case you need to debug a program that itself uses the
697 1.1 christos chip's BRK opcode. You'll need to modify your copy of GDB to use
698 1.1 christos this opcode instead of the real BRK. */
699 1.1 christos
700 1.1 christos /* GDB Break. */
701 1.1 christos /* We report the break to our caller with the PC still pointing at the
702 1.1 christos breakpoint instruction. */
703 1.1 christos put_reg (pc, m32c_opcode_pc);
704 1.1 christos if (verbose)
705 1.1 christos printf("[gdb break]\n");
706 1.1 christos return M32C_MAKE_HIT_BREAK ();
707 1.1 christos
708 1.1 christos /** 0000 1000 BRK2 */
709 1.1 christos
710 1.1 christos if (verbose)
711 1.1 christos printf("[break2]\n");
712 1.1 christos if (in_gdb)
713 1.1 christos return M32C_MAKE_HIT_BREAK ();
714 1.1 christos if (mem_get_qi (0xFFFFE7) == 0xff)
715 1.1 christos trigger_based_interrupt (0);
716 1.1 christos else
717 1.1 christos trigger_fixed_interrupt (0xFFFFE4);
718 1.1 christos
719 1.1 christos /** 1101 ddd0 dd11 1bit BSET dest */
720 1.1 christos
721 1.1 christos dc = decode_dest23 (ddd, dd, 1);
722 1.1 christos BIT_OP (dc, bit, 1);
723 1.1 christos
724 1.1 christos /** 1101 sss0 ss00 0bit BTST:G src */
725 1.1 christos
726 1.1 christos prefix (0, 0, 0);
727 1.1 christos sc = decode_src23 (sss, ss, 1);
728 1.1 christos b = get_bit2 (sc, bit);
729 1.1 christos set_zc (!b, b);
730 1.1 christos
731 1.1.1.11 christos /** 00bb 101bit BTST:S src */
732 1.1 christos
733 1.1 christos sc = decode_src23 (3, 3, 1); /* bit,base:19 */
734 1.1.1.11 christos bit = get_bit2 (sc, bb*2 + bit);
735 1.1.1.11 christos set_zc (!bit, bit);
736 1.1 christos
737 1.1 christos /** 1101 ddd0 dd10 0bit BTSTC dest */
738 1.1 christos
739 1.1 christos prefix (0, 0, 0);
740 1.1 christos sc = decode_dest23 (ddd, dd, 1);
741 1.1 christos b = get_bit2 (sc, bit);
742 1.1 christos set_zc (!b, b);
743 1.1 christos put_bit2 (sc, bit, 0);
744 1.1 christos
745 1.1 christos /** 1101 ddd0 dd10 1bit BTSTS dest */
746 1.1 christos
747 1.1 christos prefix (0, 0, 0);
748 1.1 christos sc = decode_dest23 (ddd, dd, 1);
749 1.1 christos b = get_bit2 (sc, bit);
750 1.1 christos set_zc (!b, b);
751 1.1 christos put_bit2 (sc, bit, 1);
752 1.1 christos
753 1.1 christos /** 0000 0001 1101 sss0 ss10 1bit BXOR src */
754 1.1 christos
755 1.1 christos prefix (0, 0, 0);
756 1.1 christos sc = decode_src23 (sss, ss, 1);
757 1.1 christos BIT_OPC (sc, bit, b ^ carry);
758 1.1 christos
759 1.1 christos /** 0000 0001 1000 ddd w dd11 1110 CLIP.size #IMM1,#IMM2,dest */
760 1.1 christos
761 1.1 christos prefix (0, 0, 0);
762 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
763 1.1 christos a = sign_ext (IMM(w+1), w*8+8);
764 1.1 christos b = sign_ext (IMM(w+1), w*8+8);
765 1.1 christos v = sign_ext (get_src (dc), w*8+8);
766 1.1 christos tprintf("clip %d <= %d <= %d : ", a, v, b);
767 1.1 christos if (a > v)
768 1.1 christos v = a;
769 1.1 christos if (v > b)
770 1.1 christos v = b;
771 1.1 christos tprintf("%d\n", v);
772 1.1 christos put_dest (dc, v);
773 1.1 christos
774 1.1 christos /** 1001 ddd w dd10 1110 CMP.size:G #IMM,dest */
775 1.1 christos
776 1.1 christos prefix (0, 1, 0);
777 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
778 1.1 christos v = get_src (dc);
779 1.1 christos imm = IMM(w+1);
780 1.1 christos cmp (v, imm, w+1);
781 1.1 christos
782 1.1 christos /** 1010 ddd0 dd11 0001 CMP.L:G #IMM32,dest */
783 1.1 christos
784 1.1 christos prefix (0, 1, 0);
785 1.1 christos dc = decode_dest23 (ddd, dd, 4);
786 1.1 christos v = get_src (dc);
787 1.1 christos imm = IMM(4);
788 1.1 christos cmp (v, imm, 4);
789 1.1 christos
790 1.1 christos /** 1110 ddd w dd01 immm CMP.size:Q #IMM,dest */
791 1.1 christos
792 1.1 christos prefix (0, 1, 0);
793 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
794 1.1 christos v = get_src (dc);
795 1.1 christos immm = sign_ext (immm, 4);
796 1.1 christos cmp (v, immm, w+1);
797 1.1 christos
798 1.1 christos /** 01dd 011w CMP.size:S #IMM,dest */
799 1.1 christos
800 1.1 christos prefix (0, 1, 0);
801 1.1 christos dc = decode_dest2 (dd, w+1);
802 1.1 christos v = get_src (dc);
803 1.1 christos imm = sign_ext (IMM(w+1),w*8+8);
804 1.1 christos cmp (v, imm, w+1);
805 1.1 christos
806 1.1 christos /** 1sss ddd w dd ss 0110 CMP.size:G src,dest */
807 1.1 christos
808 1.1 christos prefix (1, 1, 0);
809 1.1 christos sc = decode_src23 (sss, ss, w+1);
810 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
811 1.1 christos a = get_src (dc);
812 1.1 christos b = get_src (sc);
813 1.1 christos cmp (a, b, w+1);
814 1.1 christos
815 1.1 christos /** 1sss ddd1 dd ss 0001 CMP.L:G src,dest */
816 1.1 christos
817 1.1 christos prefix (1, 1, 0);
818 1.1 christos sc = decode_src23 (sss, ss, 4);
819 1.1 christos dc = decode_dest23 (ddd, dd, 4);
820 1.1 christos a = get_src (dc);
821 1.1 christos b = get_src (sc);
822 1.1 christos cmp (a, b, 4);
823 1.1 christos
824 1.1 christos /** 01dd 000w CMP.size:S src,R0/R0L */
825 1.1 christos
826 1.1 christos prefix (0, 1, 0);
827 1.1 christos dc = decode_dest2 (dd, w+1);
828 1.1 christos a = get_reg (w ? r0 : r0l);
829 1.1 christos b = get_src (dc);
830 1.1 christos cmp (a, b, w+1);
831 1.1 christos
832 1.1 christos /** 1010 ddd0 dd01 0001 CMPX #IMM,dest */
833 1.1 christos
834 1.1 christos prefix (0, 1, 0);
835 1.1 christos dc = decode_dest23 (ddd, dd, 4);
836 1.1 christos v = get_src (dc);
837 1.1 christos imm = sign_ext (IMM(1), 8);
838 1.1 christos cmp (v, imm, 4);
839 1.1 christos
840 1.1 christos /** 0000 0001 1000 ddd w dd00 1110 DADC.size #IMM,dest */
841 1.1 christos
842 1.1 christos DADDI(1,1);
843 1.1 christos
844 1.1 christos /** 0000 0001 1sss ddd w dd ss 1000 DADC.size src,dest */
845 1.1 christos
846 1.1 christos DADDV(1,1);
847 1.1 christos
848 1.1 christos /** 0000 0001 1000 ddd w dd01 1110 DADD.size #IMM,dest */
849 1.1 christos
850 1.1 christos DADDI(1,0);
851 1.1 christos
852 1.1 christos /** 0000 0001 1sss ddd w dd ss 0000 DADD.size src,dest */
853 1.1 christos
854 1.1 christos DADDV(1,0);
855 1.1 christos
856 1.1 christos /** 1011 ddd w dd00 1110 DEC.size dest */
857 1.1 christos
858 1.1 christos prefix (0, 1, 0);
859 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
860 1.1 christos a = get_src (dc);
861 1.1 christos v = a-1;
862 1.1 christos tprintf ("%x -- = %x\n", a, v);
863 1.1 christos set_sz (v, w+1);
864 1.1 christos put_dest (dc, v);
865 1.1 christos
866 1.1 christos /** 1011 0000 010w 0011 DIV.size #IMM */
867 1.1 christos
868 1.1 christos prefix (0, 0, 0);
869 1.1 christos div_op (-1, 0, 0, 0, w+1);
870 1.1 christos
871 1.1 christos /** 1000 sss w ss01 1110 DIV.size src */
872 1.1 christos
873 1.1 christos prefix (0, 1, 0);
874 1.1 christos div_op (sss, ss, 0, 0, w+1);
875 1.1 christos
876 1.1 christos /** 0000 0001 1010 sss1 ss01 1111 DIV.L src */
877 1.1 christos
878 1.1 christos M32C_ONLY();
879 1.1 christos prefix (0, 0, 0);
880 1.1 christos div_op (sss, ss, 0, 0, 4);
881 1.1 christos
882 1.1 christos /** 1011 0000 000w 0011 DIVU.size #IMM */
883 1.1 christos
884 1.1 christos prefix (0, 0, 0);
885 1.1 christos div_op (-1, 0, 1, 0, w+1);
886 1.1 christos
887 1.1 christos /** 1000 sss w ss00 1110 DIVU.size src */
888 1.1 christos
889 1.1 christos prefix (0, 1, 0);
890 1.1 christos div_op (sss, ss, 1, 0, w+1);
891 1.1 christos
892 1.1 christos /** 0000 0001 1010 sss1 ss00 1111 DIVU.L src */
893 1.1 christos
894 1.1 christos M32C_ONLY();
895 1.1 christos prefix (0, 0, 0);
896 1.1 christos div_op (sss, ss, 1, 0, 4);
897 1.1 christos
898 1.1 christos /** 1011 0010 010w 0011 DIVX.size #IMM */
899 1.1 christos
900 1.1 christos prefix (0, 0, 0);
901 1.1 christos div_op (-1, 0, 0, 1, w+1);
902 1.1 christos
903 1.1 christos /** 1001 sss w ss01 1110 DIVX.size src */
904 1.1 christos
905 1.1 christos prefix (0, 1, 0);
906 1.1 christos div_op (sss, ss, 0, 1, w+1);
907 1.1 christos
908 1.1 christos /** 0000 0001 1010 sss1 ss10 1111 DIVX.L src */
909 1.1 christos
910 1.1 christos M32C_ONLY();
911 1.1 christos prefix (0, 0, 0);
912 1.1 christos div_op (sss, ss, 0, 1, 4);
913 1.1 christos
914 1.1 christos /** 0000 0001 1001 ddd w dd00 1110 DSBB.size #IMM,dest */
915 1.1 christos
916 1.1 christos DADDI(0,1);
917 1.1 christos
918 1.1 christos /** 0000 0001 1sss ddd w dd ss 1010 DSBB.size src,dest */
919 1.1 christos
920 1.1 christos DADDV(0,1);
921 1.1 christos
922 1.1 christos /** 0000 0001 1001 ddd w dd01 1110 DSUB.size #IMM,dest */
923 1.1 christos
924 1.1 christos DADDI(0,0);
925 1.1 christos
926 1.1 christos /** 0000 0001 1sss ddd w dd ss 0010 DSUB.size src,dest */
927 1.1 christos
928 1.1 christos DADDV(0,0);
929 1.1 christos
930 1.1 christos /** 1110 1100 ENTER #IMM */
931 1.1 christos
932 1.1 christos imm = IMM(1);
933 1.1 christos put_reg (sp, get_reg (sp) - 4);
934 1.1 christos mem_put_si (get_reg (sp), get_reg (fb));
935 1.1 christos put_reg (fb, get_reg (sp));
936 1.1 christos put_reg (sp, get_reg (sp) - imm);
937 1.1 christos
938 1.1 christos /** 1111 1100 EXITD */
939 1.1 christos
940 1.1 christos put_reg (sp, get_reg (fb));
941 1.1 christos put_reg (fb, mem_get_si (get_reg (sp)));
942 1.1 christos put_reg (sp, get_reg (sp) + 4);
943 1.1 christos put_reg (pc, mem_get_si (get_reg (sp)));
944 1.1 christos put_reg (sp, get_reg (sp) + 4);
945 1.1 christos
946 1.1 christos /** 1100 ddd w dd01 1110 EXTS.size dest */
947 1.1 christos
948 1.1 christos prefix (0, 0, 0);
949 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
950 1.1 christos v = sign_ext (get_src (dc), (w+1)*8);
951 1.1 christos dc = widen_sd (dc);
952 1.1 christos put_dest (dc, v);
953 1.1 christos set_sz (v, (w+1)*2);
954 1.1 christos
955 1.1 christos /** 0000 0001 1sss ddd0 dd ss 0111 EXTS.B src,dest */
956 1.1 christos
957 1.1 christos prefix (0, 0, 0);
958 1.1 christos sc = decode_src23 (sss, ss, 1);
959 1.1 christos dc = decode_dest23 (ddd, dd, 2);
960 1.1 christos v = sign_ext (get_src (sc), 8);
961 1.1 christos put_dest (dc, v);
962 1.1 christos set_sz (v, 16);
963 1.1 christos
964 1.1 christos /** 0000 0001 1sss ddd0 dd ss 1011 EXTZ src,dest */
965 1.1 christos
966 1.1 christos prefix (0, 0, 0);
967 1.1 christos sc = decode_src23 (sss, ss, 1);
968 1.1 christos dc = decode_dest23 (ddd, dd, 2);
969 1.1 christos v = get_src (sc);
970 1.1 christos put_dest (dc, v);
971 1.1 christos set_sz (v, 16);
972 1.1 christos
973 1.1 christos /** 1101 0011 1110 1dst FCLR dest */
974 1.1 christos
975 1.1 christos set_flags (1 << dst, 0);
976 1.1 christos
977 1.1 christos /** 1001 1111 FREIT */
978 1.1 christos
979 1.1 christos NOTYET();
980 1.1 christos
981 1.1 christos /** 1101 0001 1110 1dst FSET dest */
982 1.1 christos
983 1.1 christos set_flags (1 << dst, 1 << dst);
984 1.1 christos
985 1.1 christos /** 1010 ddd w dd00 1110 INC.size dest */
986 1.1 christos
987 1.1 christos prefix (0, 1, 0);
988 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
989 1.1 christos a = get_src (dc);
990 1.1 christos v = a+1;
991 1.1 christos tprintf ("%x ++ = %x\n", a, v);
992 1.1 christos set_sz (v, w+1);
993 1.1 christos put_dest (dc, v);
994 1.1 christos
995 1.1 christos /** 1000 sss0 ss0w 0011 INDEXB.size src */
996 1.1 christos INDEXOP(1, 1, 1);
997 1.1 christos /** 1010 sss0 ss0w 0011 INDEXBD.size src */
998 1.1 christos INDEXOP(1, 0, 1);
999 1.1 christos /** 1100 sss0 ss0w 0011 INDEXBS.size src */
1000 1.1 christos INDEXOP(1, 1, 0);
1001 1.1 christos /** 1001 sss0 ss1w 0011 INDEXL.size src */
1002 1.1 christos INDEXOP(4, 1, 1);
1003 1.1 christos /** 1011 sss0 ss1w 0011 INDEXLD.size src */
1004 1.1 christos INDEXOP(4, 0, 1);
1005 1.1 christos /** 1001 sss0 ss0w 0011 INDEXLS.size src */
1006 1.1 christos INDEXOP(4, 1, 0);
1007 1.1 christos /** 1000 sss0 ss1w 0011 INDEXW.size src */
1008 1.1 christos INDEXOP(2, 1, 1);
1009 1.1 christos /** 1010 sss0 ss1w 0011 INDEXWD.size src */
1010 1.1 christos INDEXOP(2, 0, 1);
1011 1.1 christos /** 1100 sss0 ss1w 0011 INDEXWS.size src */
1012 1.1 christos INDEXOP(2, 1, 0);
1013 1.1 christos
1014 1.1 christos /** 1011 1110 vector00 INT #IMM */
1015 1.1 christos
1016 1.1 christos prefix (0, 0, 0);
1017 1.1 christos trigger_based_interrupt (vector);
1018 1.1 christos
1019 1.1 christos /** 1011 1111 INTO */
1020 1.1 christos
1021 1.1 christos prefix (0, 0, 0);
1022 1.1 christos if (FLAG_O)
1023 1.1 christos trigger_fixed_interrupt (0xffffe0);
1024 1.1 christos
1025 1.1 christos /** 1ccc 101c Jcnd label */
1026 1.1 christos
1027 1.1 christos prefix (0, 0, 0);
1028 1.1 christos v = sign_ext (IMM(1), 8);
1029 1.1 christos if (condition_true (ccc*2+c))
1030 1.1 christos put_reg (pc, m32c_opcode_pc + 1 + v);
1031 1.1 christos
1032 1.1 christos /** 01dd 101d JMP.S label */
1033 1.1 christos
1034 1.1 christos prefix (0, 0, 0);
1035 1.1 christos put_reg (pc, m32c_opcode_pc + (dd*2+d) + 2);
1036 1.1 christos
1037 1.1 christos /** 1011 1011 JMP.B label */
1038 1.1 christos
1039 1.1 christos prefix (0, 0, 0);
1040 1.1 christos imm = sign_ext (IMM(1), 8);
1041 1.1 christos if (imm == -1)
1042 1.1 christos {
1043 1.1 christos if (verbose)
1044 1.1 christos printf("[jmp-to-self detected as exit]\n");
1045 1.1 christos return M32C_MAKE_HIT_BREAK ();
1046 1.1 christos }
1047 1.1 christos put_reg (pc, m32c_opcode_pc + 1 + imm);
1048 1.1 christos
1049 1.1 christos /** 1100 1110 JMP.W label */
1050 1.1 christos
1051 1.1 christos prefix (0, 0, 0);
1052 1.1 christos imm = sign_ext (IMM(2), 16);
1053 1.1 christos put_reg (pc, m32c_opcode_pc + 1 + imm);
1054 1.1 christos
1055 1.1 christos /** 1100 1100 JMP.A label */
1056 1.1 christos
1057 1.1 christos prefix (0, 0, 0);
1058 1.1 christos imm = IMM(3);
1059 1.1 christos put_reg (pc, imm);
1060 1.1 christos
1061 1.1 christos /** 1100 sss1 ss00 1111 JMPI.W src */
1062 1.1 christos
1063 1.1 christos prefix (0, 0, 0);
1064 1.1 christos sc = decode_src23 (sss, ss, 2);
1065 1.1 christos a = get_src (sc);
1066 1.1 christos a = sign_ext (a, 16);
1067 1.1 christos put_reg (pc, m32c_opcode_pc + a);
1068 1.1 christos
1069 1.1 christos /** 1000 sss0 ss00 0001 JMPI.A src */
1070 1.1 christos
1071 1.1 christos prefix (0, 0, 0);
1072 1.1 christos sc = decode_src23 (sss, ss, 3);
1073 1.1 christos a = get_src (sc);
1074 1.1 christos put_reg (pc, a);
1075 1.1 christos
1076 1.1 christos /** 1101 1100 JMPS #IMM8 */
1077 1.1 christos
1078 1.1 christos prefix (0, 0, 0);
1079 1.1 christos imm = IMM(1);
1080 1.1 christos a = 0xff0000 + mem_get_hi (0xfffe00 - imm * 2);
1081 1.1 christos put_reg (pc, a);
1082 1.1 christos
1083 1.1 christos /** 1100 1111 JSR.W label */
1084 1.1 christos
1085 1.1 christos prefix (0, 0, 0);
1086 1.1 christos imm = sign_ext (IMM(2), 16);
1087 1.1 christos put_reg (sp, get_reg (sp) - 4);
1088 1.1 christos mem_put_si (get_reg (sp), get_reg (pc));
1089 1.1 christos put_reg (pc, m32c_opcode_pc + imm + 1);
1090 1.1 christos
1091 1.1 christos /** 1100 1101 JSR.A label */
1092 1.1 christos
1093 1.1 christos prefix (0, 0, 0);
1094 1.1 christos imm = IMM(3);
1095 1.1 christos put_reg (sp, get_reg (sp) - 4);
1096 1.1 christos mem_put_si (get_reg (sp), get_reg (pc));
1097 1.1 christos put_reg (pc, imm);
1098 1.1 christos
1099 1.1 christos /** 1100 sss1 ss01 1111 JSRI.W src */
1100 1.1 christos
1101 1.1 christos prefix (0, 0, 0);
1102 1.1 christos sc = decode_src23 (sss, ss, 2);
1103 1.1 christos a = get_src (sc);
1104 1.1 christos a = sign_ext (a, 16);
1105 1.1 christos put_reg (sp, get_reg (sp) - 4);
1106 1.1 christos mem_put_si (get_reg (sp), get_reg (pc));
1107 1.1 christos put_reg (pc, m32c_opcode_pc + a);
1108 1.1 christos
1109 1.1 christos /** 1001 sss0 ss00 0001 JSRI.A src */
1110 1.1 christos
1111 1.1 christos prefix (0, 0, 0);
1112 1.1 christos sc = decode_src23 (sss, ss, 3);
1113 1.1 christos a = get_src (sc);
1114 1.1 christos put_reg (sp, get_reg (sp) - 4);
1115 1.1 christos mem_put_si (get_reg (sp), get_reg (pc));
1116 1.1 christos put_reg (pc, a);
1117 1.1 christos
1118 1.1 christos /** 1101 1101 JSRS #IMM8 */
1119 1.1 christos
1120 1.1 christos prefix (0, 0, 0);
1121 1.1 christos imm = IMM(1);
1122 1.1 christos a = 0xff0000 + mem_get_hi (0xfffe00 - imm * 2);
1123 1.1 christos put_reg (sp, get_reg (sp) - 4);
1124 1.1 christos mem_put_si (get_reg (sp), get_reg (pc));
1125 1.1 christos put_reg (pc, a);
1126 1.1 christos
1127 1.1 christos /** 1101 0101 1010 1dst LDC #IMM16,dest */
1128 1.1 christos
1129 1.1 christos imm = IMM(2);
1130 1.1 christos dc = decode_cr_b (dst, CR_B_DCT0);
1131 1.1 christos put_dest (dc, imm);
1132 1.1 christos
1133 1.1 christos /** 1101 0101 0010 1dst LDC #IMM24,dest */
1134 1.1 christos
1135 1.1 christos imm = IMM(3);
1136 1.1 christos dc = decode_cr_b (dst, CR_B_INTB);
1137 1.1 christos put_dest (dc, imm);
1138 1.1 christos
1139 1.1 christos /** 1101 0101 0110 1dst LDC #IMM24,dest */
1140 1.1 christos
1141 1.1 christos imm = IMM(3);
1142 1.1 christos dc = decode_cr_b (dst, CR_B_DMA0);
1143 1.1 christos put_dest (dc, imm);
1144 1.1 christos
1145 1.1 christos /** 0000 0001 1101 sss1 ss00 1dst LDC src,dest */
1146 1.1 christos
1147 1.1 christos prefix (0, 0, 0);
1148 1.1 christos sc = decode_src23 (sss, ss, 2);
1149 1.1 christos dc = decode_cr_b (dst, CR_B_DCT0);
1150 1.1 christos a = get_src (sc);
1151 1.1 christos put_dest (dc, a);
1152 1.1 christos
1153 1.1 christos /** 1101 sss1 ss00 0dst LDC src,dest */
1154 1.1 christos
1155 1.1 christos prefix (0, 0, 0);
1156 1.1 christos sc = decode_src23 (sss, ss, 3);
1157 1.1 christos dc = decode_cr_b (dst, CR_B_INTB);
1158 1.1 christos a = get_src (sc);
1159 1.1 christos put_dest (dc, a);
1160 1.1 christos
1161 1.1 christos /** 0000 0001 1101 sss1 ss00 0dst LDC src,dest */
1162 1.1 christos
1163 1.1 christos prefix (0, 0, 0);
1164 1.1 christos sc = decode_src23 (sss, ss, 3);
1165 1.1 christos dc = decode_cr_b (dst, CR_B_DMA0);
1166 1.1 christos a = get_src (sc);
1167 1.1 christos put_dest (dc, a);
1168 1.1 christos
1169 1.1 christos /** 1011 0110 1100 0011 LDCTX */
1170 1.1 christos
1171 1.1 christos NOTYET();
1172 1.1 christos
1173 1.1.1.11 christos /** 1101 0101 1110 1flg LDIPL #IMM */
1174 1.1 christos
1175 1.1.1.11 christos set_flags (0x7000, flg*0x1000);
1176 1.1 christos
1177 1.1 christos /** 0000 0001 1000 ddd w dd11 1111 MAX.size #IMM,dest */
1178 1.1 christos
1179 1.1 christos prefix (0, 0, 0);
1180 1.1 christos w++;
1181 1.1 christos dc = decode_dest23 (ddd, dd, w);
1182 1.1 christos imm = sign_ext (IMM(w), w*8);
1183 1.1 christos a = sign_ext (get_src (dc), w*8);
1184 1.1 christos tprintf ("max %d %d\n", imm, a);
1185 1.1 christos if (imm > a)
1186 1.1 christos put_dest (dc, imm);
1187 1.1 christos
1188 1.1 christos /** 0000 0001 1sss ddd w dd ss 1101 MAX.size src,dest */
1189 1.1 christos
1190 1.1 christos prefix (0, 0, 0);
1191 1.1 christos w++;
1192 1.1 christos sc = decode_src23 (sss, ss, w);
1193 1.1 christos dc = decode_dest23 (ddd, dd, w);
1194 1.1 christos b = sign_ext (get_src (sc), w*8);
1195 1.1 christos a = sign_ext (get_src (dc), w*8);
1196 1.1 christos tprintf ("max %d %d\n", b, a);
1197 1.1 christos if (b > a)
1198 1.1 christos put_dest (dc, b);
1199 1.1 christos
1200 1.1 christos /** 0000 0001 1000 ddd w dd10 1111 MIN.size #IMM,dest */
1201 1.1 christos
1202 1.1 christos prefix (0, 0, 0);
1203 1.1 christos w++;
1204 1.1 christos dc = decode_dest23 (ddd, dd, w);
1205 1.1 christos imm = sign_ext (IMM(w), w*8);
1206 1.1 christos a = sign_ext (get_src (dc), w*8);
1207 1.1 christos tprintf ("min %d %d\n", imm, a);
1208 1.1 christos if (imm < a)
1209 1.1 christos put_dest (dc, imm);
1210 1.1 christos
1211 1.1 christos /** 0000 0001 1sss ddd w dd ss 1100 MIN.size src,dest */
1212 1.1 christos
1213 1.1 christos prefix (0, 0, 0);
1214 1.1 christos w++;
1215 1.1 christos sc = decode_src23 (sss, ss, w);
1216 1.1 christos dc = decode_dest23 (ddd, dd, w);
1217 1.1 christos b = sign_ext (get_src (sc), w*8);
1218 1.1 christos a = sign_ext (get_src (dc), w*8);
1219 1.1 christos tprintf ("min %d %d\n", b, a);
1220 1.1 christos if (b < a)
1221 1.1 christos put_dest (dc, b);
1222 1.1 christos
1223 1.1 christos /** 1001 ddd w dd10 1111 MOV.size:G #IMM,dest */
1224 1.1 christos
1225 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1226 1.1 christos imm = IMM(w+1);
1227 1.1 christos v = imm;
1228 1.1 christos tprintf("%x = %x\n", v, v);
1229 1.1 christos set_sz(v, w+1);
1230 1.1 christos put_dest (dc, v);
1231 1.1 christos
1232 1.1 christos /** 1011 ddd0 dd11 0001 MOV.L:G #IMM,dest */
1233 1.1 christos
1234 1.1 christos dc = decode_dest23 (ddd, dd, 4);
1235 1.1 christos imm = IMM(4);
1236 1.1 christos v = imm;
1237 1.1 christos tprintf("%x = %x\n", v, v);
1238 1.1 christos set_sz(v, 4);
1239 1.1 christos put_dest (dc, v);
1240 1.1 christos
1241 1.1 christos /** 1111 ddd w dd10 immm MOV.size:Q #IMM4,dest */
1242 1.1 christos
1243 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1244 1.1 christos imm = sign_ext (immm, 4);
1245 1.1 christos v = imm;
1246 1.1 christos tprintf("%x = %d\n", v, v);
1247 1.1 christos set_sz(v, w+1);
1248 1.1 christos put_dest (dc, v);
1249 1.1 christos
1250 1.1 christos /** 00dd 010w MOV.size:S #IMM,dest */
1251 1.1 christos
1252 1.1 christos prefix (0, 1, 0);
1253 1.1 christos dc = decode_dest2 (dd, w+1);
1254 1.1 christos imm = IMM(w+1);
1255 1.1 christos put_dest (dc, imm);
1256 1.1 christos set_sz (imm, w+1);
1257 1.1 christos
1258 1.1 christos /** 10w1 110d MOV.size:S #IMM,a0/a1 */
1259 1.1 christos
1260 1.1 christos imm = IMM(w ? 3 : 2);
1261 1.1 christos put_reg (d ? a1 : a0, imm);
1262 1.1 christos set_sz (imm & addr_mask, w+1);
1263 1.1 christos
1264 1.1 christos /** 00dd 001w MOV.size:Z #0,dest */
1265 1.1 christos
1266 1.1 christos prefix (0, 1, 0);
1267 1.1 christos dc = decode_dest2 (dd, w+1);
1268 1.1 christos put_dest (dc, 0);
1269 1.1 christos set_sz (0, w+1);
1270 1.1 christos
1271 1.1 christos /** 1sss ddd w dd ss 1011 MOV.size:G src,dest */
1272 1.1 christos
1273 1.1 christos prefix (1, 1, 0);
1274 1.1 christos sc = decode_src23 (sss, ss, w+1);
1275 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1276 1.1 christos v = get_src (sc);
1277 1.1 christos put_dest (dc, v);
1278 1.1 christos set_sz (v, w+1);
1279 1.1 christos
1280 1.1 christos /** 1sss ddd1 dd ss 0011 MOV.L:G src,dest */
1281 1.1 christos
1282 1.1 christos prefix (1, 1, 0);
1283 1.1 christos sc = decode_src23 (sss, ss, 4);
1284 1.1 christos dc = decode_dest23 (ddd, dd, 4);
1285 1.1 christos v = get_src (sc);
1286 1.1 christos put_dest (dc, v);
1287 1.1 christos set_sz (v, 4);
1288 1.1 christos
1289 1.1 christos /** VARY SS 01 10 11 */
1290 1.1 christos /** 00SS 100w MOV.size:S src,R0L/R0 */
1291 1.1 christos
1292 1.1 christos prefix (0, 1, 0);
1293 1.1 christos sc = decode_dest2 (SS, w+1);
1294 1.1 christos v = get_src (sc);
1295 1.1 christos put_reg (w ? r0 : r0l, v);
1296 1.1 christos set_sz (v, w+1);
1297 1.1 christos
1298 1.1 christos /** 01ss 111w MOV.size:S src,R1L/R1 */
1299 1.1 christos
1300 1.1 christos prefix (0, 1, 0);
1301 1.1 christos sc = decode_dest2 (ss, w+1);
1302 1.1 christos v = get_src (sc);
1303 1.1 christos put_reg (w ? r1 : r1l, v);
1304 1.1 christos set_sz (v, w+1);
1305 1.1 christos
1306 1.1 christos /** VARY DD 01 10 11 */
1307 1.1 christos /** 00DD 000w MOV.size:S R0L/R0,dest */
1308 1.1 christos
1309 1.1 christos prefix (0, 1, 0);
1310 1.1 christos dc = decode_dest2 (DD, w+1);
1311 1.1 christos v = get_reg (w ? r0 : r0l);
1312 1.1 christos put_dest (dc, v);
1313 1.1 christos set_sz (v, w+1);
1314 1.1 christos
1315 1.1 christos /** 01ss 100d MOV.L:S src,A0/A1 */
1316 1.1 christos
1317 1.1 christos prefix (0, 1, 0);
1318 1.1 christos sc = decode_dest2 (ss, 4);
1319 1.1 christos v = get_src (sc);
1320 1.1 christos put_reg (d ? a1 : a0, v);
1321 1.1 christos set_sz (v, 4);
1322 1.1 christos
1323 1.1 christos /** 1011 ddd w dd00 1111 MOV.size:G dsp:8[SP], dest */
1324 1.1 christos
1325 1.1 christos prefix (0, 0, 0);
1326 1.1 christos imm = IMM(1);
1327 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1328 1.1 christos a = get_reg (sp) + sign_ext (imm, 8);
1329 1.1 christos a &= addr_mask;
1330 1.1 christos if (w)
1331 1.1 christos v = mem_get_hi (a);
1332 1.1 christos else
1333 1.1 christos v = mem_get_qi (a);
1334 1.1 christos put_dest (dc, v);
1335 1.1 christos set_sz (v, w+1);
1336 1.1 christos
1337 1.1 christos /** 1010 sss w ss00 1111 MOV.size:G src,dsp:8[SP] */
1338 1.1 christos
1339 1.1 christos prefix (0, 0, 0);
1340 1.1 christos sc = decode_dest23 (sss, ss, w+1);
1341 1.1 christos imm = IMM(1);
1342 1.1 christos a = get_reg (sp) + sign_ext (imm, 8);
1343 1.1 christos a &= addr_mask;
1344 1.1 christos v = get_src (sc);
1345 1.1 christos if (w)
1346 1.1 christos mem_put_hi (a, v);
1347 1.1 christos else
1348 1.1 christos mem_put_qi (a, v);
1349 1.1 christos set_sz (v, w+1);
1350 1.1 christos
1351 1.1 christos /** 1101 sss1 ss01 1dst MOVA src,dest */
1352 1.1 christos
1353 1.1.1.10 christos {
1354 1.1 christos static reg_id map[8] = { r2r0, r3r1, a0, a1 };
1355 1.1 christos prefix (0, 0, 0);
1356 1.1 christos sc = decode_src23 (sss, ss, 1);
1357 1.1 christos if (!sc.mem || !map[dst])
1358 1.1 christos UNSUPPORTED();
1359 1.1 christos put_reg (map[dst], sc.u.addr);
1360 1.1.1.10 christos }
1361 1.1 christos
1362 1.1 christos /** 0000 0001 1011 ddd0 dd hl 1110 MOVdir R0L,dest */
1363 1.1 christos
1364 1.1 christos prefix (0, 0, 0);
1365 1.1 christos dc = decode_dest23 (ddd, dd, 1);
1366 1.1 christos a = get_src (dc);
1367 1.1 christos b = get_reg (r0l);
1368 1.1 christos switch (hl)
1369 1.1 christos {
1370 1.1 christos case 0: a = (a & 0xf0) | (b & 0x0f); break;
1371 1.1 christos case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break;
1372 1.1 christos case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break;
1373 1.1 christos case 3: a = (a & 0x0f) | (b & 0xf0); break;
1374 1.1 christos }
1375 1.1 christos put_dest (dc, a);
1376 1.1 christos
1377 1.1 christos /** 0000 0001 1010 sss0 ss hl 1110 MOVdir src,R0L */
1378 1.1 christos
1379 1.1 christos prefix (0, 0, 0);
1380 1.1 christos sc = decode_dest23 (sss, ss, 1);
1381 1.1 christos a = get_reg (r0l);
1382 1.1 christos b = get_src (dc);
1383 1.1 christos switch (hl)
1384 1.1 christos {
1385 1.1 christos case 0: a = (a & 0xf0) | (b & 0x0f); break;
1386 1.1 christos case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break;
1387 1.1 christos case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break;
1388 1.1 christos case 3: a = (a & 0x0f) | (b & 0xf0); break;
1389 1.1 christos }
1390 1.1 christos put_reg (r0l, a);
1391 1.1 christos
1392 1.1 christos /** 1011 ddd0 dd01 0001 MOVX #IMM,dest */
1393 1.1 christos
1394 1.1 christos prefix (0, 1, 0);
1395 1.1 christos dc = decode_dest23 (ddd, dd, 4);
1396 1.1 christos imm = sign_ext (IMM(1), 8);
1397 1.1 christos put_dest (dc, imm);
1398 1.1 christos set_sz (imm, 1);
1399 1.1 christos
1400 1.1 christos /** 1000 ddd w dd01 1111 MUL.size #IMM,dest */
1401 1.1 christos
1402 1.1 christos prefix (0, 1, 0);
1403 1.1 christos w ++;
1404 1.1 christos dc = decode_dest23 (ddd, dd, w);
1405 1.1 christos v = sign_ext (get_src (dc), w*8);
1406 1.1 christos imm = sign_ext (IMM(w), w*8);
1407 1.1 christos tprintf("%d * %d = %d\n", v, imm, v*imm);
1408 1.1 christos v *= imm;
1409 1.1 christos dc = widen_sd (dc);
1410 1.1 christos put_dest (dc, v);
1411 1.1 christos
1412 1.1 christos /** 1sss ddd w dd ss 1100 MUL.size src,dest */
1413 1.1 christos
1414 1.1 christos prefix (1, 1, 0);
1415 1.1 christos w ++;
1416 1.1 christos sc = decode_src23 (sss, ss, w);
1417 1.1 christos dc = decode_dest23 (ddd, dd, w);
1418 1.1 christos a = sign_ext (get_src (sc), w*8);
1419 1.1 christos b = sign_ext (get_src (dc), w*8);
1420 1.1 christos tprintf("%d * %d = %d\n", a, b, a*b);
1421 1.1 christos v = a * b;
1422 1.1 christos dc = widen_sd (dc);
1423 1.1 christos put_dest (dc, v);
1424 1.1 christos
1425 1.1 christos /** 0000 0001 1000 sss1 ss01 1111 MUL.L src,R2R0 */
1426 1.1 christos
1427 1.1 christos M32C_ONLY();
1428 1.1 christos prefix (0, 0, 0);
1429 1.1 christos sc = decode_src23 (sss, ss, 4);
1430 1.1 christos a = sign_ext (get_src (sc), 32);
1431 1.1 christos b = sign_ext (get_reg (r2r0), 32);
1432 1.1 christos ll = (long long)a * (long long)b;
1433 1.1 christos tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll);
1434 1.1 christos if (ll < b2minsigned[4] || ll > b2maxsigned[4])
1435 1.1 christos set_flags (FLAGBIT_O, FLAGBIT_O);
1436 1.1 christos else
1437 1.1 christos set_flags (FLAGBIT_O, 0);
1438 1.1 christos put_reg (r2r0, (int)ll);
1439 1.1 christos
1440 1.1 christos /** 1100 sss1 ss11 1110 MULEX src */
1441 1.1 christos
1442 1.1 christos prefix (0, 1, 0);
1443 1.1 christos sc = decode_dest23 (sss, ss, 2);
1444 1.1 christos a = sign_ext (get_src (sc), 16);
1445 1.1 christos b = sign_ext (get_reg (r2r0), 32);
1446 1.1 christos ll = (long long)a * (long long)b;
1447 1.1 christos tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll);
1448 1.1 christos put_reg (r2r0, (int)ll);
1449 1.1 christos put_reg (r1, (int)(ll >> 32));
1450 1.1 christos
1451 1.1 christos /** 1000 ddd w dd00 1111 MULU.size #IMM,dest */
1452 1.1 christos
1453 1.1 christos prefix (0, 1, 0);
1454 1.1 christos w ++;
1455 1.1 christos dc = decode_dest23 (ddd, dd, w);
1456 1.1 christos v = get_src (dc);
1457 1.1 christos imm = IMM(w);
1458 1.1 christos tprintf("%d * %d = %d\n", v, imm, v*imm);
1459 1.1 christos v *= imm;
1460 1.1 christos dc = widen_sd (dc);
1461 1.1 christos put_dest (dc, v);
1462 1.1 christos
1463 1.1 christos /** 1sss ddd w dd ss 0100 MULU.size src,dest */
1464 1.1 christos
1465 1.1 christos prefix (1, 1, 0);
1466 1.1 christos w ++;
1467 1.1 christos sc = decode_src23 (sss, ss, w);
1468 1.1 christos dc = decode_dest23 (ddd, dd, w);
1469 1.1 christos a = get_src (sc);
1470 1.1 christos b = get_src (dc);
1471 1.1 christos tprintf("%d * %d = %d\n", a, b, a*b);
1472 1.1 christos v = a * b;
1473 1.1 christos dc = widen_sd (dc);
1474 1.1 christos put_dest (dc, v);
1475 1.1 christos
1476 1.1 christos /** 0000 0001 1000 sss1 ss00 1111 MULU.L src,R2R0 */
1477 1.1 christos
1478 1.1 christos M32C_ONLY();
1479 1.1 christos prefix (0, 0, 0);
1480 1.1 christos sc = decode_src23 (sss, ss, 4);
1481 1.1 christos a = get_src (sc);
1482 1.1 christos b = get_reg (r2r0);
1483 1.1 christos ll = (long long)a * (long long)b;
1484 1.1 christos tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll);
1485 1.1 christos if (ll < b2minsigned[4] || ll > b2maxsigned[4])
1486 1.1 christos set_flags (FLAGBIT_O, FLAGBIT_O);
1487 1.1 christos else
1488 1.1 christos set_flags (FLAGBIT_O, 0);
1489 1.1 christos put_reg (r2r0, (int)ll);
1490 1.1 christos
1491 1.1 christos /** 1010 ddd w dd10 1111 NEG.size dest */
1492 1.1 christos
1493 1.1 christos prefix (0, 1, 0);
1494 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1495 1.1 christos a = sign_ext (get_src (dc), (w+1)*8);
1496 1.1 christos v = -a;
1497 1.1 christos tprintf("%d * -1 = %d\n", a, v);
1498 1.1 christos set_oszc(v, w+1, v==0);
1499 1.1 christos put_dest (dc, v);
1500 1.1 christos
1501 1.1 christos /** 1101 1110 NOP */
1502 1.1 christos
1503 1.1 christos tprintf("nop\n");
1504 1.1 christos
1505 1.1 christos /** 1010 ddd w dd01 1110 NOT.size dest */
1506 1.1 christos
1507 1.1 christos prefix (0, 1, 0);
1508 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1509 1.1 christos a = get_src (dc);
1510 1.1 christos v = ~a;
1511 1.1 christos tprintf("~ %x = %x\n", a, v);
1512 1.1 christos set_sz(v, w+1);
1513 1.1 christos put_dest (dc, v);
1514 1.1 christos
1515 1.1 christos /** 1000 ddd w dd10 1111 OR.size:G #IMM,dest */
1516 1.1 christos
1517 1.1 christos prefix (0, 1, 0);
1518 1.1 christos dc = decode_dest23(ddd, dd, w+1);
1519 1.1 christos imm = IMM(w+1);
1520 1.1 christos LOGIC_OP (dc, imm, |);
1521 1.1 christos
1522 1.1 christos /** 01dd 010w OR.size:S #IMM,dest */
1523 1.1 christos
1524 1.1 christos prefix (0, 1, 0);
1525 1.1 christos dc = decode_dest2(dd, w+1);
1526 1.1 christos imm = IMM (w+1);
1527 1.1 christos LOGIC_OP (dc, imm, |);
1528 1.1 christos
1529 1.1 christos /** 1sss ddd w dd ss 0101 OR.size:G src,dest */
1530 1.1 christos
1531 1.1 christos prefix (1, 1, 0);
1532 1.1 christos sc = decode_src23(sss, ss, w+1);
1533 1.1 christos dc = decode_dest23(ddd, dd, w+1);
1534 1.1 christos b = get_src (sc);
1535 1.1 christos LOGIC_OP (dc, b, |);
1536 1.1 christos
1537 1.1 christos /** 1011 ddd w dd10 1111 POP.size dest */
1538 1.1 christos
1539 1.1 christos prefix (0, 1, 0);
1540 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1541 1.1 christos if (w)
1542 1.1 christos a = mem_get_hi (get_reg (sp));
1543 1.1 christos else
1544 1.1 christos a = mem_get_qi (get_reg (sp));
1545 1.1 christos put_reg (sp, get_reg (sp) + 2);
1546 1.1 christos tprintf("pop%s: %x\n", w ? "hi" : "qi", a);
1547 1.1 christos put_dest (dc, a);
1548 1.1 christos
1549 1.1 christos /** 1101 0011 1010 1dst POPC dest */
1550 1.1 christos
1551 1.1 christos prefix (0, 0, 0);
1552 1.1 christos dc = decode_cr_b (dst, CR_B_DCT0);
1553 1.1 christos a = mem_get_hi (get_reg (sp));
1554 1.1 christos put_reg (sp, get_reg (sp) + 2);
1555 1.1 christos tprintf("pophi: %x\n", a);
1556 1.1 christos put_dest (dc, a);
1557 1.1 christos
1558 1.1 christos /** 1101 0011 0010 1dst POPC dest */
1559 1.1 christos
1560 1.1 christos prefix (0, 0, 0);
1561 1.1 christos dc = decode_cr_b (dst, CR_B_INTB);
1562 1.1 christos a = mem_get_si (get_reg (sp));
1563 1.1 christos put_reg (sp, get_reg (sp) + 4);
1564 1.1 christos tprintf("popsi: %x\n", a);
1565 1.1 christos put_dest (dc, a);
1566 1.1 christos
1567 1.1 christos /** 1000 1110 POPM dest */
1568 1.1 christos
1569 1.1.1.10 christos {
1570 1.1 christos static int map[] = { r0, r1, r2, r3, a0, a1, sb, fb };
1571 1.1 christos prefix (0, 0, 0);
1572 1.1 christos imm = IMM(1);
1573 1.1 christos tprintf("popm: %x\n", imm);
1574 1.1 christos for (a=0; a<4; a++)
1575 1.1 christos if (imm & (1<<a))
1576 1.1 christos {
1577 1.1 christos v = mem_get_hi (get_reg (sp));
1578 1.1 christos put_reg (map[a], v);
1579 1.1 christos put_reg (sp, get_reg (sp) + 2);
1580 1.1 christos }
1581 1.1 christos for (; a<8; a++)
1582 1.1 christos if (imm & (1<<a))
1583 1.1 christos {
1584 1.1 christos v = mem_get_si (get_reg (sp));
1585 1.1 christos put_reg (map[a], v);
1586 1.1 christos put_reg (sp, get_reg (sp) + 4);
1587 1.1 christos }
1588 1.1.1.10 christos }
1589 1.1 christos
1590 1.1 christos /** 1010 111w PUSH.size #IMM */
1591 1.1 christos
1592 1.1 christos prefix (0, 0, 0);
1593 1.1 christos imm = IMM(w+1);
1594 1.1 christos tprintf("push%s: %x\n", w ? "hi" : "qi", imm);
1595 1.1.1.10 christos a = get_reg (sp) - 2;
1596 1.1 christos if (w)
1597 1.1 christos mem_put_hi (a, imm);
1598 1.1 christos else
1599 1.1 christos mem_put_qi (a, imm);
1600 1.1 christos put_reg (sp, a);
1601 1.1 christos
1602 1.1 christos /** 1100 sss w ss00 1110 PUSH.size src */
1603 1.1 christos
1604 1.1 christos prefix (0, 1, 0);
1605 1.1 christos sc = decode_dest23 (sss, ss, w+1);
1606 1.1 christos a = get_src (sc);
1607 1.1 christos put_reg (sp, get_reg (sp) - 2);
1608 1.1 christos if (w)
1609 1.1 christos mem_put_hi (get_reg (sp), a);
1610 1.1 christos else
1611 1.1 christos mem_put_qi (get_reg (sp), a);
1612 1.1 christos tprintf("push%s: %x\n", w ? "hi" : "qi", a);
1613 1.1 christos
1614 1.1 christos /** 1011 0110 0101 0011 PUSH.L #IMM32 */
1615 1.1 christos
1616 1.1 christos imm = IMM(4);
1617 1.1 christos put_reg (sp, get_reg (sp) - 4);
1618 1.1 christos mem_put_si (get_reg (sp), imm);
1619 1.1 christos
1620 1.1 christos /** 1010 sss0 ss00 0001 PUSH.L src */
1621 1.1 christos
1622 1.1 christos prefix (0, 1, 0);
1623 1.1 christos sc = decode_dest23 (sss, ss, 4);
1624 1.1 christos a = get_src (sc);
1625 1.1 christos put_reg (sp, get_reg (sp) - 4);
1626 1.1 christos mem_put_si (get_reg (sp), a);
1627 1.1 christos
1628 1.1 christos /** 1011 0sa0 ss00 0001 PUSHA src */
1629 1.1 christos
1630 1.1 christos prefix (0, 0, 0);
1631 1.1 christos sc = decode_dest23 (sa, ss, 1);
1632 1.1 christos put_reg (sp, get_reg (sp) - 4);
1633 1.1 christos mem_put_hi (get_reg (sp), sc.u.addr);
1634 1.1 christos tprintf("pushsi: %x\n", sc.u.addr);
1635 1.1 christos
1636 1.1 christos /** 1101 0001 1010 1src PUSHC src */
1637 1.1 christos
1638 1.1 christos prefix (0, 0, 0);
1639 1.1 christos sc = decode_cr_b (src, CR_B_DCT0);
1640 1.1 christos a = get_src (sc);
1641 1.1 christos put_reg (sp, get_reg (sp) - 2);
1642 1.1 christos mem_put_hi (get_reg (sp), a);
1643 1.1 christos tprintf("pushhi: %x\n", a);
1644 1.1 christos
1645 1.1 christos /** 1101 0001 0010 1src PUSHC src */
1646 1.1 christos
1647 1.1 christos prefix (0, 0, 0);
1648 1.1 christos sc = decode_cr_b (src, CR_B_INTB);
1649 1.1 christos a = get_src (sc);
1650 1.1 christos put_reg (sp, get_reg (sp) - 4);
1651 1.1 christos mem_put_si (get_reg (sp), a);
1652 1.1 christos tprintf("pushsi: %x\n", a);
1653 1.1 christos
1654 1.1 christos /** 1000 1111 PUSHM src */
1655 1.1 christos
1656 1.1.1.10 christos {
1657 1.1 christos static int map[] = { fb, sb, a1, a0, r3, r2, r1, r0 };
1658 1.1 christos imm = IMM(1);
1659 1.1 christos tprintf("pushm: %x\n", imm);
1660 1.1 christos for (a=0; a<4; a++)
1661 1.1 christos if (imm & (1<<a))
1662 1.1 christos {
1663 1.1 christos put_reg (sp, get_reg (sp) - 4);
1664 1.1 christos v = get_reg (map[a]);
1665 1.1 christos mem_put_si (get_reg (sp), v);
1666 1.1 christos }
1667 1.1 christos for (; a<8; a++)
1668 1.1 christos if (imm & (1<<a))
1669 1.1 christos {
1670 1.1 christos put_reg (sp, get_reg (sp) - 2);
1671 1.1 christos v = get_reg (map[a]);
1672 1.1 christos mem_put_hi (get_reg (sp), v);
1673 1.1 christos }
1674 1.1.1.10 christos }
1675 1.1 christos
1676 1.1 christos /** 1001 1110 REIT */
1677 1.1 christos
1678 1.1 christos a = get_reg (sp);
1679 1.1 christos put_reg (pc, mem_get_si (a));
1680 1.1 christos a += 4;
1681 1.1 christos put_reg (flags, mem_get_hi (a));
1682 1.1 christos a += 2;
1683 1.1 christos put_reg (sp, a);
1684 1.1 christos
1685 1.1 christos /** 1011 1000 010w 0011 RMPA.size */
1686 1.1 christos
1687 1.1.1.10 christos {
1688 1.1 christos int count = get_reg (r3);
1689 1.1 christos int list1 = get_reg (a0);
1690 1.1 christos int list2 = get_reg (a1);
1691 1.1 christos long long sum = get_reg_ll (r3r1r2r0) & 0xffffff;
1692 1.1 christos
1693 1.1 christos while (count)
1694 1.1 christos {
1695 1.1 christos if (w)
1696 1.1 christos {
1697 1.1 christos a = sign_ext (mem_get_hi (list1), 16);
1698 1.1 christos b = sign_ext (mem_get_hi (list2), 16);
1699 1.1 christos }
1700 1.1 christos else
1701 1.1 christos {
1702 1.1 christos a = sign_ext (mem_get_qi (list1), 8);
1703 1.1 christos b = sign_ext (mem_get_qi (list2), 8);
1704 1.1 christos }
1705 1.1 christos tprintf("%lld + %d * %d = ", sum, a, b);
1706 1.1 christos sum += a * b;
1707 1.1 christos tprintf("%lld\n", sum);
1708 1.1 christos list1 += w ? 2 : 1;
1709 1.1 christos list2 += w ? 2 : 1;
1710 1.1 christos count --;
1711 1.1 christos }
1712 1.1 christos put_reg (r3, count);
1713 1.1 christos put_reg (a0, list1);
1714 1.1 christos put_reg (a1, list2);
1715 1.1 christos put_reg (r2r0, (int)(sum & 0xffffffffU));
1716 1.1 christos put_reg (r1, (int)(sum >> 32));
1717 1.1.1.10 christos }
1718 1.1 christos
1719 1.1 christos /** 1011 ddd w dd10 1110 ROLC.size dest */
1720 1.1 christos
1721 1.1 christos prefix (0, 1, 0);
1722 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1723 1.1 christos rot_op (dc, 1, 1);
1724 1.1 christos
1725 1.1 christos /** 1010 ddd w dd10 1110 RORC.size dest */
1726 1.1 christos
1727 1.1 christos prefix (0, 1, 0);
1728 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1729 1.1 christos rot_op (dc, 1, -1);
1730 1.1 christos
1731 1.1 christos /** 1110 ddd w dd10 immm ROT.size #IMM, dest */
1732 1.1 christos
1733 1.1 christos prefix (0, 1, 0);
1734 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1735 1.1 christos rot_op (dc, IMM4(), -1);
1736 1.1 christos
1737 1.1 christos /** 1010 ddd w dd11 1111 ROT.size R1H,dest */
1738 1.1 christos
1739 1.1 christos prefix (0, 1, 0);
1740 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1741 1.1 christos a = sign_ext (get_reg (r1h), 8);
1742 1.1 christos rot_op (dc, a, -1);
1743 1.1 christos
1744 1.1 christos /** 1101 1111 RTS */
1745 1.1 christos
1746 1.1 christos put_reg (pc, mem_get_si (get_reg (sp)));
1747 1.1 christos put_reg (sp, get_reg (sp) + 4);
1748 1.1 christos
1749 1.1 christos /** 0000 0001 1001 ddd w dd10 1110 SBB.size #IMM, dest */
1750 1.1 christos
1751 1.1 christos prefix (0, 0, 0);
1752 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1753 1.1 christos imm = IMM (w+1);
1754 1.1 christos MATH_OP (dc, imm, !carry, -);
1755 1.1 christos
1756 1.1 christos /** 0000 0001 1sss ddd w dd ss 0110 SBB.size src,dest */
1757 1.1 christos
1758 1.1 christos prefix (0, 0, 0);
1759 1.1 christos sc = decode_src23 (sss, ss, w+1);
1760 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1761 1.1 christos MATH_OP (dc, get_src (sc), !carry, -);
1762 1.1 christos
1763 1.1 christos /** 1101 ddd1 dd11 cond SCcond dest */
1764 1.1 christos
1765 1.1 christos prefix (0, 1, 0);
1766 1.1 christos dc = decode_dest23 (ddd, dd, 2);
1767 1.1 christos if (condition_true (cond))
1768 1.1 christos put_dest (dc, 1);
1769 1.1 christos else
1770 1.1 christos put_dest (dc, 0);
1771 1.1 christos
1772 1.1 christos /** 1011 1000 110w 0011 SCMPU.size */
1773 1.1 christos
1774 1.1 christos ta0 = get_reg (a0);
1775 1.1 christos ta1 = get_reg (a1);
1776 1.1 christos
1777 1.1 christos for (;;)
1778 1.1 christos {
1779 1.1 christos t0 = mem_get_qi (ta0);
1780 1.1 christos t2 = mem_get_qi (ta1);
1781 1.1 christos if (w)
1782 1.1 christos {
1783 1.1 christos t1 = mem_get_qi (ta0 + 1);
1784 1.1 christos t3 = mem_get_qi (ta1 + 1);
1785 1.1 christos }
1786 1.1 christos dif = t0 - t2;
1787 1.1 christos if (dif == 0 && t0 != 0 && w)
1788 1.1 christos dif = t1 - t3;
1789 1.1 christos set_oszc (dif, 1, dif > 0);
1790 1.1 christos
1791 1.1 christos ta0 += w ? 2 : 1;
1792 1.1 christos ta1 += w ? 2 : 1;
1793 1.1 christos
1794 1.1 christos if (t0 == 0 || t0 != t2)
1795 1.1 christos break;
1796 1.1 christos if (w && (t1 == 0 || t1 != t3))
1797 1.1 christos break;
1798 1.1 christos }
1799 1.1 christos
1800 1.1 christos /** 1111 ddd w dd00 immm SHA.size #IMM,dest */
1801 1.1 christos
1802 1.1 christos prefix (0, 1, 0);
1803 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1804 1.1 christos shift_op (dc, 1, IMM4(), 1);
1805 1.1 christos
1806 1.1 christos /** 1010 ddd0 dd10 0001 SHA.L #IMM,dest */
1807 1.1 christos
1808 1.1 christos prefix (0, 1, 0);
1809 1.1 christos dc = decode_dest23 (ddd, dd, 4);
1810 1.1 christos imm = sign_ext (IMM(1), 8);
1811 1.1 christos shift_op (dc, 1, imm, 1);
1812 1.1 christos
1813 1.1 christos /** 1011 ddd w dd11 1110 SHA.size R1H,dest */
1814 1.1 christos
1815 1.1 christos prefix (0, 1, 0);
1816 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1817 1.1 christos a = sign_ext (get_reg (r1h), 8);
1818 1.1 christos shift_op (dc, 1, a, 1);
1819 1.1 christos
1820 1.1 christos /** 1100 ddd0 dd01 0001 SHA.L R1H,dest */
1821 1.1 christos
1822 1.1 christos prefix (0, 1, 0);
1823 1.1 christos dc = decode_dest23 (ddd, dd, 4);
1824 1.1 christos a = sign_ext (get_reg (r1h), 8);
1825 1.1 christos shift_op (dc, 1, a, 1);
1826 1.1 christos
1827 1.1 christos /** 1100 ddd0 dd10 0001 SHANC.L #IMM,dest */
1828 1.1 christos
1829 1.1 christos M32C_ONLY();
1830 1.1 christos prefix (0, 1, 0);
1831 1.1 christos dc = decode_dest23 (ddd, dd, 4);
1832 1.1 christos imm = sign_ext (IMM(1), 8);
1833 1.1 christos shift_op (dc, 1, imm, 0);
1834 1.1 christos
1835 1.1 christos /** 1110 ddd w dd00 immm SHL.size #IMM, dest */
1836 1.1 christos
1837 1.1 christos prefix (0, 1, 0);
1838 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1839 1.1 christos shift_op (dc, 0, IMM4(), 1);
1840 1.1 christos
1841 1.1 christos /** 1001 ddd0 dd10 0001 SHL.L #IMM, dest */
1842 1.1 christos
1843 1.1 christos prefix (0, 1, 0);
1844 1.1 christos dc = decode_dest23 (ddd, dd, 4);
1845 1.1 christos imm = sign_ext (IMM(1), 8);
1846 1.1 christos shift_op (dc, 0, imm, 1);
1847 1.1 christos
1848 1.1 christos /** 1010 ddd w dd11 1110 SHL.size R1H,dest */
1849 1.1 christos
1850 1.1 christos prefix (0, 1, 0);
1851 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1852 1.1 christos a = sign_ext (get_reg (r1h), 8);
1853 1.1 christos shift_op (dc, 0, a, 1);
1854 1.1 christos
1855 1.1 christos /** 1100 ddd0 dd00 0001 SHL.L R1H,dest */
1856 1.1 christos
1857 1.1 christos prefix (0, 1, 0);
1858 1.1 christos dc = decode_dest23 (ddd, dd, 4);
1859 1.1 christos a = sign_ext (get_reg (r1h), 8);
1860 1.1 christos shift_op (dc, 0, a, 1);
1861 1.1 christos
1862 1.1 christos /** 1000 ddd0 dd10 0001 SHLNC.L #IMM,dest */
1863 1.1 christos
1864 1.1 christos M32C_ONLY();
1865 1.1 christos prefix (0, 1, 0);
1866 1.1 christos dc = decode_dest23 (ddd, dd, 4);
1867 1.1 christos imm = sign_ext (IMM(1), 8);
1868 1.1 christos shift_op (dc, 0, imm, 0);
1869 1.1 christos
1870 1.1 christos /** 1011 0010 100w 0011 SIN.size */
1871 1.1 christos
1872 1.1 christos v = get_reg (a0);
1873 1.1 christos a = get_reg (a1);
1874 1.1 christos b = get_reg (r3);
1875 1.1 christos if (b) for (;b;)
1876 1.1 christos {
1877 1.1 christos if (w)
1878 1.1 christos mem_put_hi(a, mem_get_hi (v));
1879 1.1 christos else
1880 1.1 christos mem_put_qi(a, mem_get_qi (v));
1881 1.1 christos a += w ? 2 : 1;
1882 1.1 christos b --;
1883 1.1 christos }
1884 1.1 christos put_reg (a0, v);
1885 1.1 christos put_reg (a1, a);
1886 1.1 christos put_reg (r3, b);
1887 1.1 christos
1888 1.1 christos /** 1011 0110 100w 0011 SMOVB.size */
1889 1.1 christos
1890 1.1 christos v = get_reg (a0);
1891 1.1 christos a = get_reg (a1);
1892 1.1 christos b = get_reg (r3);
1893 1.1 christos if (b) for (;b;)
1894 1.1 christos {
1895 1.1 christos if (w)
1896 1.1 christos mem_put_hi(a, mem_get_hi (v));
1897 1.1 christos else
1898 1.1 christos mem_put_qi(a, mem_get_qi (v));
1899 1.1 christos v -= w ? 2 : 1;
1900 1.1 christos a -= w ? 2 : 1;
1901 1.1 christos b --;
1902 1.1 christos }
1903 1.1 christos put_reg (a0, v);
1904 1.1 christos put_reg (a1, a);
1905 1.1 christos put_reg (r3, b);
1906 1.1 christos
1907 1.1 christos /** 1011 0000 100w 0011 SMOVF.size */
1908 1.1 christos
1909 1.1 christos v = get_reg (a0);
1910 1.1 christos a = get_reg (a1);
1911 1.1 christos b = get_reg (r3);
1912 1.1 christos if (b) for (;b;)
1913 1.1 christos {
1914 1.1 christos if (w)
1915 1.1 christos mem_put_hi(a, mem_get_hi (v));
1916 1.1 christos else
1917 1.1 christos mem_put_qi(a, mem_get_qi (v));
1918 1.1 christos v += w ? 2 : 1;
1919 1.1 christos a += w ? 2 : 1;
1920 1.1 christos b --;
1921 1.1 christos }
1922 1.1 christos put_reg (a0, v);
1923 1.1 christos put_reg (a1, a);
1924 1.1 christos put_reg (r3, b);
1925 1.1 christos
1926 1.1 christos /** 1011 1000 100w 0011 SMOVU.size */
1927 1.1 christos
1928 1.1 christos v = get_reg (a0);
1929 1.1 christos a = get_reg (a1);
1930 1.1 christos do
1931 1.1 christos {
1932 1.1 christos if (w)
1933 1.1 christos mem_put_hi(a, (t0 = mem_get_hi (v)));
1934 1.1 christos else
1935 1.1 christos mem_put_qi(a, (t0 = mem_get_qi (v)));
1936 1.1 christos v += w ? 2 : 1;
1937 1.1 christos a += w ? 2 : 1;
1938 1.1 christos if (t0 == 0
1939 1.1 christos || (w && ((t0 & 0xff) == 0 || (t0 & 0xff00) == 0)))
1940 1.1 christos break;
1941 1.1 christos } while (1);
1942 1.1 christos put_reg (a0, v);
1943 1.1 christos put_reg (a1, a);
1944 1.1 christos
1945 1.1 christos /** 1011 0100 100w 0011 SOUT.size */
1946 1.1 christos
1947 1.1 christos v = get_reg (a0);
1948 1.1 christos a = get_reg (a1);
1949 1.1 christos b = get_reg (r3);
1950 1.1 christos for (;b;)
1951 1.1 christos {
1952 1.1 christos if (w)
1953 1.1 christos mem_put_hi(a, mem_get_hi (v));
1954 1.1 christos else
1955 1.1 christos mem_put_qi(a, mem_get_qi (v));
1956 1.1 christos v += w ? 2 : 1;
1957 1.1 christos b --;
1958 1.1 christos }
1959 1.1 christos put_reg (a0, v);
1960 1.1 christos put_reg (a1, a);
1961 1.1 christos put_reg (r3, b);
1962 1.1 christos
1963 1.1 christos /** 1011 1000 000w 0011 SSTR.size */
1964 1.1 christos
1965 1.1 christos a = get_reg (a1);
1966 1.1 christos b = get_reg (r3);
1967 1.1 christos v = get_reg (w ? r0 : r0l);
1968 1.1 christos for (;b;)
1969 1.1 christos {
1970 1.1 christos if (w)
1971 1.1 christos mem_put_hi(a, v);
1972 1.1 christos else
1973 1.1 christos mem_put_qi(a, v);
1974 1.1 christos a += w ? 2 : 1;
1975 1.1 christos b --;
1976 1.1 christos }
1977 1.1 christos put_reg (a1, a);
1978 1.1 christos put_reg (r3, b);
1979 1.1 christos
1980 1.1 christos /** 0000 0001 1101 ddd1 dd01 0src STC src,dest */
1981 1.1 christos
1982 1.1 christos prefix (0, 0, 0);
1983 1.1 christos dc = decode_dest23 (ddd, dd, 4);
1984 1.1 christos sc = decode_cr_b (src, CR_B_DMA0);
1985 1.1 christos a = get_src (sc);
1986 1.1 christos put_dest (dc, a);
1987 1.1 christos
1988 1.1 christos /** 0000 0001 1101 ddd1 dd01 1src STC src,dest */
1989 1.1 christos
1990 1.1 christos prefix (0, 0, 0);
1991 1.1 christos dc = decode_dest23 (ddd, dd, 2);
1992 1.1 christos sc = decode_cr_b (src, CR_B_DCT0);
1993 1.1 christos a = get_src (sc);
1994 1.1 christos put_dest (dc, a);
1995 1.1 christos
1996 1.1 christos /** 1101 ddd1 dd01 0src STC src,dest */
1997 1.1 christos
1998 1.1 christos prefix (0, 0, 0);
1999 1.1 christos dc = decode_dest23 (ddd, dd, 4);
2000 1.1 christos sc = decode_cr_b (src, CR_B_INTB);
2001 1.1 christos a = get_src (sc);
2002 1.1 christos put_dest (dc, a);
2003 1.1 christos
2004 1.1 christos /** 1011 0110 1101 0011 STCX abs16,abs24 */
2005 1.1 christos
2006 1.1 christos NOTYET();
2007 1.1 christos
2008 1.1 christos /** 1001 ddd w dd01 1111 STNZ.size #IMM,dest */
2009 1.1 christos
2010 1.1 christos prefix (0, 1, 0);
2011 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
2012 1.1 christos imm = IMM(w+1);
2013 1.1 christos if (! FLAG_Z)
2014 1.1 christos put_dest (dc, imm);
2015 1.1 christos
2016 1.1 christos /** 1001 ddd w dd00 1111 STZ.size #IMM,dest */
2017 1.1 christos
2018 1.1 christos prefix (0, 1, 0);
2019 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
2020 1.1 christos imm = IMM(w+1);
2021 1.1 christos if (FLAG_Z)
2022 1.1 christos put_dest (dc, imm);
2023 1.1 christos
2024 1.1 christos /** 1001 ddd w dd11 1111 STZX.size #IMM1,#IMM2,dest */
2025 1.1 christos
2026 1.1 christos prefix (0, 1, 0);
2027 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
2028 1.1 christos a = IMM(w+1);
2029 1.1 christos b = IMM(w+1);
2030 1.1 christos if (FLAG_Z)
2031 1.1 christos put_dest (dc, a);
2032 1.1 christos else
2033 1.1 christos put_dest (dc, b);
2034 1.1 christos
2035 1.1 christos /** 1000 ddd w dd11 1110 SUB.size:G #IMM,dest */
2036 1.1 christos
2037 1.1 christos prefix (0, 1, 0);
2038 1.1 christos dc = decode_dest23(ddd, dd, w+1);
2039 1.1 christos imm = IMM(w+1);
2040 1.1 christos MATH_OP (dc, imm, 0, -);
2041 1.1 christos
2042 1.1 christos /** 1001 ddd0 dd11 0001 SUB.L:G #IMM,dest */
2043 1.1 christos
2044 1.1 christos prefix (0, 1, 0);
2045 1.1 christos dc = decode_dest23(ddd, dd, 4);
2046 1.1 christos imm = IMM(4);
2047 1.1 christos MATH_OP (dc, imm, 0, -);
2048 1.1 christos
2049 1.1 christos /** 00dd 111w SUB.size:S #IMM,dest */
2050 1.1 christos
2051 1.1 christos prefix (0, 1, 0);
2052 1.1 christos dc = decode_dest2(dd, w+1);
2053 1.1 christos imm = IMM (w+1);
2054 1.1 christos MATH_OP (dc, imm, 0, -);
2055 1.1 christos
2056 1.1 christos /** 1sss ddd w dd ss 1010 SUB.size:G src,dest */
2057 1.1 christos
2058 1.1 christos prefix (1, 1, 0);
2059 1.1 christos sc = decode_src23(sss, ss, w+1);
2060 1.1 christos dc = decode_dest23(ddd, dd, w+1);
2061 1.1 christos b = get_src (sc);
2062 1.1 christos MATH_OP (dc, b, 0, -);
2063 1.1 christos
2064 1.1 christos /** 1sss ddd1 dd ss 0000 SUB.L:G src,dest */
2065 1.1 christos
2066 1.1 christos prefix (1, 1, 0);
2067 1.1 christos sc = decode_src23(sss, ss, 4);
2068 1.1 christos dc = decode_dest23(ddd, dd, 4);
2069 1.1 christos b = get_src (sc);
2070 1.1 christos MATH_OP (dc, b, 0, -);
2071 1.1 christos
2072 1.1 christos /** 1001 ddd0 dd01 0001 SUBX #IMM,dest */
2073 1.1 christos
2074 1.1 christos prefix (0, 1, 0);
2075 1.1 christos dc = decode_dest23(ddd, dd, 4);
2076 1.1 christos imm = sign_ext (IMM(1), 8);
2077 1.1 christos MATH_OP (dc, imm, 0, -);
2078 1.1 christos
2079 1.1 christos /** 1sss ddd0 dd ss 0000 SUBX src,dest */
2080 1.1 christos
2081 1.1 christos prefix (1, 1, 0);
2082 1.1 christos sc = decode_src23(sss, ss, 1);
2083 1.1 christos dc = decode_dest23(ddd, dd, 4);
2084 1.1 christos b = sign_ext (get_src (sc), 8);
2085 1.1 christos MATH_OP (dc, b, 0, -);
2086 1.1 christos
2087 1.1 christos /** 1001 ddd w dd11 1110 TST.size:G #IMM,dest */
2088 1.1 christos
2089 1.1 christos prefix (0, 0, 0);
2090 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
2091 1.1 christos imm = IMM(w+1);
2092 1.1 christos a = get_src (dc);
2093 1.1 christos v = a & imm;
2094 1.1 christos set_sz (v, w+1);
2095 1.1 christos
2096 1.1 christos /** 00dd 110w TST.size:S #IMM,dest */
2097 1.1 christos
2098 1.1 christos prefix (0, 0, 0);
2099 1.1 christos dc = decode_dest2 (dd, w+1);
2100 1.1 christos imm = IMM(w+1);
2101 1.1 christos a = get_src (dc);
2102 1.1 christos v = a & imm;
2103 1.1 christos set_sz (v, w+1);
2104 1.1 christos
2105 1.1 christos /** 0000 0001 1sss ddd w dd ss 1001 TST.size:G src,dest */
2106 1.1 christos
2107 1.1 christos prefix (0, 0, 0);
2108 1.1 christos sc = decode_src23 (sss, ss, w+1);
2109 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
2110 1.1 christos b = get_src (sc);
2111 1.1 christos a = get_src (dc);
2112 1.1 christos v = a & b;
2113 1.1 christos set_sz (v, w+1);
2114 1.1 christos
2115 1.1 christos /** 1111 1111 UND */
2116 1.1 christos
2117 1.1 christos trigger_fixed_interrupt (0xffffdc);
2118 1.1 christos
2119 1.1 christos /** 1011 0010 0000 0011 WAIT */
2120 1.1 christos
2121 1.1 christos ;
2122 1.1 christos
2123 1.1 christos /** 1101 ddd w dd00 1src XCHG.size src,dest */
2124 1.1 christos
2125 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
2126 1.1 christos sc = decode_src3 (src, w+1);
2127 1.1 christos a = get_src (dc);
2128 1.1 christos b = get_src (sc);
2129 1.1 christos put_dest (dc, b);
2130 1.1 christos put_dest (sc, a);
2131 1.1 christos
2132 1.1 christos /** 1001 ddd w dd00 1110 XOR.size #IMM,dest */
2133 1.1 christos
2134 1.1 christos prefix (0, 1, 0);
2135 1.1 christos dc = decode_dest23(ddd, dd, w+1);
2136 1.1 christos imm = IMM(w+1);
2137 1.1 christos LOGIC_OP (dc, imm, ^);
2138 1.1 christos
2139 1.1 christos /** 1sss ddd w dd ss 1001 XOR.size src,dest */
2140 1.1 christos
2141 1.1 christos prefix (1, 1, 0);
2142 1.1 christos sc = decode_src23(sss, ss, w+1);
2143 1.1 christos dc = decode_dest23(ddd, dd, w+1);
2144 1.1 christos b = get_src (sc);
2145 1.1 christos LOGIC_OP (dc, b, ^);
2146 1.1 christos
2147 1.1 christos /** */
2148 1.1 christos
2149 1.1 christos return step_result;
2150 1.1 christos }
2151