m32c.opc revision 1.1 1 1.1 christos /* m32c.opc --- semantics for m32c opcodes. -*- mode: c -*-
2 1.1 christos
3 1.1 christos Copyright (C) 2005, 2007, 2008, 2009, 2010, 2011
4 1.1 christos Free Software Foundation, Inc.
5 1.1 christos Contributed by Red Hat, Inc.
6 1.1 christos
7 1.1 christos This file is part of the GNU simulators.
8 1.1 christos
9 1.1 christos This program is free software; you can redistribute it and/or modify
10 1.1 christos it under the terms of the GNU General Public License as published by
11 1.1 christos the Free Software Foundation; either version 3 of the License, or
12 1.1 christos (at your option) any later version.
13 1.1 christos
14 1.1 christos This program is distributed in the hope that it will be useful,
15 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
16 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 1.1 christos GNU General Public License for more details.
18 1.1 christos
19 1.1 christos You should have received a copy of the GNU General Public License
20 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 1.1 christos
22 1.1 christos
23 1.1 christos #include <stdio.h>
24 1.1 christos #include <stdlib.h>
25 1.1 christos
26 1.1 christos #include "cpu.h"
27 1.1 christos #include "mem.h"
28 1.1 christos #include "misc.h"
29 1.1 christos #include "int.h"
30 1.1 christos
31 1.1 christos #define AU __attribute__((unused))
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 christos getbyte ()
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 christos void
110 1.1 christos prefix (src_allowed, dest_allowed, 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 christos decode_m32c()
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 christos /** 00bb 101b BTST:S src */
732 1.1 christos
733 1.1 christos sc = decode_src23 (3, 3, 1); /* bit,base:19 */
734 1.1 christos b = get_bit2 (sc, bb*2 + b);
735 1.1 christos set_zc (!b, b);
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 christos /** 1101 0101 1110 1imm LDIPL #IMM */
1174 1.1 christos
1175 1.1 christos set_flags (0x7000, imm*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 christos static reg_id map[8] = { r2r0, r3r1, a0, a1 };
1354 1.1 christos prefix (0, 0, 0);
1355 1.1 christos sc = decode_src23 (sss, ss, 1);
1356 1.1 christos if (!sc.mem || !map[dst])
1357 1.1 christos UNSUPPORTED();
1358 1.1 christos put_reg (map[dst], sc.u.addr);
1359 1.1 christos
1360 1.1 christos /** 0000 0001 1011 ddd0 dd hl 1110 MOVdir R0L,dest */
1361 1.1 christos
1362 1.1 christos prefix (0, 0, 0);
1363 1.1 christos dc = decode_dest23 (ddd, dd, 1);
1364 1.1 christos a = get_src (dc);
1365 1.1 christos b = get_reg (r0l);
1366 1.1 christos switch (hl)
1367 1.1 christos {
1368 1.1 christos case 0: a = (a & 0xf0) | (b & 0x0f); break;
1369 1.1 christos case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break;
1370 1.1 christos case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break;
1371 1.1 christos case 3: a = (a & 0x0f) | (b & 0xf0); break;
1372 1.1 christos }
1373 1.1 christos put_dest (dc, a);
1374 1.1 christos
1375 1.1 christos /** 0000 0001 1010 sss0 ss hl 1110 MOVdir src,R0L */
1376 1.1 christos
1377 1.1 christos prefix (0, 0, 0);
1378 1.1 christos sc = decode_dest23 (sss, ss, 1);
1379 1.1 christos a = get_reg (r0l);
1380 1.1 christos b = get_src (dc);
1381 1.1 christos switch (hl)
1382 1.1 christos {
1383 1.1 christos case 0: a = (a & 0xf0) | (b & 0x0f); break;
1384 1.1 christos case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break;
1385 1.1 christos case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break;
1386 1.1 christos case 3: a = (a & 0x0f) | (b & 0xf0); break;
1387 1.1 christos }
1388 1.1 christos put_reg (r0l, a);
1389 1.1 christos
1390 1.1 christos /** 1011 ddd0 dd01 0001 MOVX #IMM,dest */
1391 1.1 christos
1392 1.1 christos prefix (0, 1, 0);
1393 1.1 christos dc = decode_dest23 (ddd, dd, 4);
1394 1.1 christos imm = sign_ext (IMM(1), 8);
1395 1.1 christos put_dest (dc, imm);
1396 1.1 christos set_sz (imm, 1);
1397 1.1 christos
1398 1.1 christos /** 1000 ddd w dd01 1111 MUL.size #IMM,dest */
1399 1.1 christos
1400 1.1 christos prefix (0, 1, 0);
1401 1.1 christos w ++;
1402 1.1 christos dc = decode_dest23 (ddd, dd, w);
1403 1.1 christos v = sign_ext (get_src (dc), w*8);
1404 1.1 christos imm = sign_ext (IMM(w), w*8);
1405 1.1 christos tprintf("%d * %d = %d\n", v, imm, v*imm);
1406 1.1 christos v *= imm;
1407 1.1 christos dc = widen_sd (dc);
1408 1.1 christos put_dest (dc, v);
1409 1.1 christos
1410 1.1 christos /** 1sss ddd w dd ss 1100 MUL.size src,dest */
1411 1.1 christos
1412 1.1 christos prefix (1, 1, 0);
1413 1.1 christos w ++;
1414 1.1 christos sc = decode_src23 (sss, ss, w);
1415 1.1 christos dc = decode_dest23 (ddd, dd, w);
1416 1.1 christos a = sign_ext (get_src (sc), w*8);
1417 1.1 christos b = sign_ext (get_src (dc), w*8);
1418 1.1 christos tprintf("%d * %d = %d\n", a, b, a*b);
1419 1.1 christos v = a * b;
1420 1.1 christos dc = widen_sd (dc);
1421 1.1 christos put_dest (dc, v);
1422 1.1 christos
1423 1.1 christos /** 0000 0001 1000 sss1 ss01 1111 MUL.L src,R2R0 */
1424 1.1 christos
1425 1.1 christos M32C_ONLY();
1426 1.1 christos prefix (0, 0, 0);
1427 1.1 christos sc = decode_src23 (sss, ss, 4);
1428 1.1 christos a = sign_ext (get_src (sc), 32);
1429 1.1 christos b = sign_ext (get_reg (r2r0), 32);
1430 1.1 christos ll = (long long)a * (long long)b;
1431 1.1 christos tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll);
1432 1.1 christos if (ll < b2minsigned[4] || ll > b2maxsigned[4])
1433 1.1 christos set_flags (FLAGBIT_O, FLAGBIT_O);
1434 1.1 christos else
1435 1.1 christos set_flags (FLAGBIT_O, 0);
1436 1.1 christos put_reg (r2r0, (int)ll);
1437 1.1 christos
1438 1.1 christos /** 1100 sss1 ss11 1110 MULEX src */
1439 1.1 christos
1440 1.1 christos prefix (0, 1, 0);
1441 1.1 christos sc = decode_dest23 (sss, ss, 2);
1442 1.1 christos a = sign_ext (get_src (sc), 16);
1443 1.1 christos b = sign_ext (get_reg (r2r0), 32);
1444 1.1 christos ll = (long long)a * (long long)b;
1445 1.1 christos tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll);
1446 1.1 christos put_reg (r2r0, (int)ll);
1447 1.1 christos put_reg (r1, (int)(ll >> 32));
1448 1.1 christos
1449 1.1 christos /** 1000 ddd w dd00 1111 MULU.size #IMM,dest */
1450 1.1 christos
1451 1.1 christos prefix (0, 1, 0);
1452 1.1 christos w ++;
1453 1.1 christos dc = decode_dest23 (ddd, dd, w);
1454 1.1 christos v = get_src (dc);
1455 1.1 christos imm = IMM(w);
1456 1.1 christos tprintf("%d * %d = %d\n", v, imm, v*imm);
1457 1.1 christos v *= imm;
1458 1.1 christos dc = widen_sd (dc);
1459 1.1 christos put_dest (dc, v);
1460 1.1 christos
1461 1.1 christos /** 1sss ddd w dd ss 0100 MULU.size src,dest */
1462 1.1 christos
1463 1.1 christos prefix (1, 1, 0);
1464 1.1 christos w ++;
1465 1.1 christos sc = decode_src23 (sss, ss, w);
1466 1.1 christos dc = decode_dest23 (ddd, dd, w);
1467 1.1 christos a = get_src (sc);
1468 1.1 christos b = get_src (dc);
1469 1.1 christos tprintf("%d * %d = %d\n", a, b, a*b);
1470 1.1 christos v = a * b;
1471 1.1 christos dc = widen_sd (dc);
1472 1.1 christos put_dest (dc, v);
1473 1.1 christos
1474 1.1 christos /** 0000 0001 1000 sss1 ss00 1111 MULU.L src,R2R0 */
1475 1.1 christos
1476 1.1 christos M32C_ONLY();
1477 1.1 christos prefix (0, 0, 0);
1478 1.1 christos sc = decode_src23 (sss, ss, 4);
1479 1.1 christos a = get_src (sc);
1480 1.1 christos b = get_reg (r2r0);
1481 1.1 christos ll = (long long)a * (long long)b;
1482 1.1 christos tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll);
1483 1.1 christos if (ll < b2minsigned[4] || ll > b2maxsigned[4])
1484 1.1 christos set_flags (FLAGBIT_O, FLAGBIT_O);
1485 1.1 christos else
1486 1.1 christos set_flags (FLAGBIT_O, 0);
1487 1.1 christos put_reg (r2r0, (int)ll);
1488 1.1 christos
1489 1.1 christos /** 1010 ddd w dd10 1111 NEG.size dest */
1490 1.1 christos
1491 1.1 christos prefix (0, 1, 0);
1492 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1493 1.1 christos a = sign_ext (get_src (dc), (w+1)*8);
1494 1.1 christos v = -a;
1495 1.1 christos tprintf("%d * -1 = %d\n", a, v);
1496 1.1 christos set_oszc(v, w+1, v==0);
1497 1.1 christos put_dest (dc, v);
1498 1.1 christos
1499 1.1 christos /** 1101 1110 NOP */
1500 1.1 christos
1501 1.1 christos tprintf("nop\n");
1502 1.1 christos
1503 1.1 christos /** 1010 ddd w dd01 1110 NOT.size dest */
1504 1.1 christos
1505 1.1 christos prefix (0, 1, 0);
1506 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1507 1.1 christos a = get_src (dc);
1508 1.1 christos v = ~a;
1509 1.1 christos tprintf("~ %x = %x\n", a, v);
1510 1.1 christos set_sz(v, w+1);
1511 1.1 christos put_dest (dc, v);
1512 1.1 christos
1513 1.1 christos /** 1000 ddd w dd10 1111 OR.size:G #IMM,dest */
1514 1.1 christos
1515 1.1 christos prefix (0, 1, 0);
1516 1.1 christos dc = decode_dest23(ddd, dd, w+1);
1517 1.1 christos imm = IMM(w+1);
1518 1.1 christos LOGIC_OP (dc, imm, |);
1519 1.1 christos
1520 1.1 christos /** 01dd 010w OR.size:S #IMM,dest */
1521 1.1 christos
1522 1.1 christos prefix (0, 1, 0);
1523 1.1 christos dc = decode_dest2(dd, w+1);
1524 1.1 christos imm = IMM (w+1);
1525 1.1 christos LOGIC_OP (dc, imm, |);
1526 1.1 christos
1527 1.1 christos /** 1sss ddd w dd ss 0101 OR.size:G src,dest */
1528 1.1 christos
1529 1.1 christos prefix (1, 1, 0);
1530 1.1 christos sc = decode_src23(sss, ss, w+1);
1531 1.1 christos dc = decode_dest23(ddd, dd, w+1);
1532 1.1 christos b = get_src (sc);
1533 1.1 christos LOGIC_OP (dc, b, |);
1534 1.1 christos
1535 1.1 christos /** 1011 ddd w dd10 1111 POP.size dest */
1536 1.1 christos
1537 1.1 christos prefix (0, 1, 0);
1538 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1539 1.1 christos if (w)
1540 1.1 christos a = mem_get_hi (get_reg (sp));
1541 1.1 christos else
1542 1.1 christos a = mem_get_qi (get_reg (sp));
1543 1.1 christos put_reg (sp, get_reg (sp) + 2);
1544 1.1 christos tprintf("pop%s: %x\n", w ? "hi" : "qi", a);
1545 1.1 christos put_dest (dc, a);
1546 1.1 christos
1547 1.1 christos /** 1101 0011 1010 1dst POPC dest */
1548 1.1 christos
1549 1.1 christos prefix (0, 0, 0);
1550 1.1 christos dc = decode_cr_b (dst, CR_B_DCT0);
1551 1.1 christos a = mem_get_hi (get_reg (sp));
1552 1.1 christos put_reg (sp, get_reg (sp) + 2);
1553 1.1 christos tprintf("pophi: %x\n", a);
1554 1.1 christos put_dest (dc, a);
1555 1.1 christos
1556 1.1 christos /** 1101 0011 0010 1dst POPC dest */
1557 1.1 christos
1558 1.1 christos prefix (0, 0, 0);
1559 1.1 christos dc = decode_cr_b (dst, CR_B_INTB);
1560 1.1 christos a = mem_get_si (get_reg (sp));
1561 1.1 christos put_reg (sp, get_reg (sp) + 4);
1562 1.1 christos tprintf("popsi: %x\n", a);
1563 1.1 christos put_dest (dc, a);
1564 1.1 christos
1565 1.1 christos /** 1000 1110 POPM dest */
1566 1.1 christos
1567 1.1 christos static int map[] = { r0, r1, r2, r3, a0, a1, sb, fb };
1568 1.1 christos prefix (0, 0, 0);
1569 1.1 christos imm = IMM(1);
1570 1.1 christos tprintf("popm: %x\n", imm);
1571 1.1 christos for (a=0; a<4; a++)
1572 1.1 christos if (imm & (1<<a))
1573 1.1 christos {
1574 1.1 christos v = mem_get_hi (get_reg (sp));
1575 1.1 christos put_reg (map[a], v);
1576 1.1 christos put_reg (sp, get_reg (sp) + 2);
1577 1.1 christos }
1578 1.1 christos for (; a<8; a++)
1579 1.1 christos if (imm & (1<<a))
1580 1.1 christos {
1581 1.1 christos v = mem_get_si (get_reg (sp));
1582 1.1 christos put_reg (map[a], v);
1583 1.1 christos put_reg (sp, get_reg (sp) + 4);
1584 1.1 christos }
1585 1.1 christos
1586 1.1 christos /** 1010 111w PUSH.size #IMM */
1587 1.1 christos
1588 1.1 christos prefix (0, 0, 0);
1589 1.1 christos imm = IMM(w+1);
1590 1.1 christos tprintf("push%s: %x\n", w ? "hi" : "qi", imm);
1591 1.1 christos int a = get_reg (sp) - 2;
1592 1.1 christos if (w)
1593 1.1 christos mem_put_hi (a, imm);
1594 1.1 christos else
1595 1.1 christos mem_put_qi (a, imm);
1596 1.1 christos put_reg (sp, a);
1597 1.1 christos
1598 1.1 christos /** 1100 sss w ss00 1110 PUSH.size src */
1599 1.1 christos
1600 1.1 christos prefix (0, 1, 0);
1601 1.1 christos sc = decode_dest23 (sss, ss, w+1);
1602 1.1 christos a = get_src (sc);
1603 1.1 christos put_reg (sp, get_reg (sp) - 2);
1604 1.1 christos if (w)
1605 1.1 christos mem_put_hi (get_reg (sp), a);
1606 1.1 christos else
1607 1.1 christos mem_put_qi (get_reg (sp), a);
1608 1.1 christos tprintf("push%s: %x\n", w ? "hi" : "qi", a);
1609 1.1 christos
1610 1.1 christos /** 1011 0110 0101 0011 PUSH.L #IMM32 */
1611 1.1 christos
1612 1.1 christos imm = IMM(4);
1613 1.1 christos put_reg (sp, get_reg (sp) - 4);
1614 1.1 christos mem_put_si (get_reg (sp), imm);
1615 1.1 christos
1616 1.1 christos /** 1010 sss0 ss00 0001 PUSH.L src */
1617 1.1 christos
1618 1.1 christos prefix (0, 1, 0);
1619 1.1 christos sc = decode_dest23 (sss, ss, 4);
1620 1.1 christos a = get_src (sc);
1621 1.1 christos put_reg (sp, get_reg (sp) - 4);
1622 1.1 christos mem_put_si (get_reg (sp), a);
1623 1.1 christos
1624 1.1 christos /** 1011 0sa0 ss00 0001 PUSHA src */
1625 1.1 christos
1626 1.1 christos prefix (0, 0, 0);
1627 1.1 christos sc = decode_dest23 (sa, ss, 1);
1628 1.1 christos put_reg (sp, get_reg (sp) - 4);
1629 1.1 christos mem_put_hi (get_reg (sp), sc.u.addr);
1630 1.1 christos tprintf("pushsi: %x\n", sc.u.addr);
1631 1.1 christos
1632 1.1 christos /** 1101 0001 1010 1src PUSHC src */
1633 1.1 christos
1634 1.1 christos prefix (0, 0, 0);
1635 1.1 christos sc = decode_cr_b (src, CR_B_DCT0);
1636 1.1 christos a = get_src (sc);
1637 1.1 christos put_reg (sp, get_reg (sp) - 2);
1638 1.1 christos mem_put_hi (get_reg (sp), a);
1639 1.1 christos tprintf("pushhi: %x\n", a);
1640 1.1 christos
1641 1.1 christos /** 1101 0001 0010 1src PUSHC src */
1642 1.1 christos
1643 1.1 christos prefix (0, 0, 0);
1644 1.1 christos sc = decode_cr_b (src, CR_B_INTB);
1645 1.1 christos a = get_src (sc);
1646 1.1 christos put_reg (sp, get_reg (sp) - 4);
1647 1.1 christos mem_put_si (get_reg (sp), a);
1648 1.1 christos tprintf("pushsi: %x\n", a);
1649 1.1 christos
1650 1.1 christos /** 1000 1111 PUSHM src */
1651 1.1 christos
1652 1.1 christos static int map[] = { fb, sb, a1, a0, r3, r2, r1, r0 };
1653 1.1 christos imm = IMM(1);
1654 1.1 christos tprintf("pushm: %x\n", imm);
1655 1.1 christos for (a=0; a<4; a++)
1656 1.1 christos if (imm & (1<<a))
1657 1.1 christos {
1658 1.1 christos put_reg (sp, get_reg (sp) - 4);
1659 1.1 christos v = get_reg (map[a]);
1660 1.1 christos mem_put_si (get_reg (sp), v);
1661 1.1 christos }
1662 1.1 christos for (; a<8; a++)
1663 1.1 christos if (imm & (1<<a))
1664 1.1 christos {
1665 1.1 christos put_reg (sp, get_reg (sp) - 2);
1666 1.1 christos v = get_reg (map[a]);
1667 1.1 christos mem_put_hi (get_reg (sp), v);
1668 1.1 christos }
1669 1.1 christos
1670 1.1 christos /** 1001 1110 REIT */
1671 1.1 christos
1672 1.1 christos a = get_reg (sp);
1673 1.1 christos put_reg (pc, mem_get_si (a));
1674 1.1 christos a += 4;
1675 1.1 christos put_reg (flags, mem_get_hi (a));
1676 1.1 christos a += 2;
1677 1.1 christos put_reg (sp, a);
1678 1.1 christos
1679 1.1 christos /** 1011 1000 010w 0011 RMPA.size */
1680 1.1 christos
1681 1.1 christos int count = get_reg (r3);
1682 1.1 christos int list1 = get_reg (a0);
1683 1.1 christos int list2 = get_reg (a1);
1684 1.1 christos long long sum = get_reg_ll (r3r1r2r0) & 0xffffff;
1685 1.1 christos
1686 1.1 christos while (count)
1687 1.1 christos {
1688 1.1 christos if (w)
1689 1.1 christos {
1690 1.1 christos a = sign_ext (mem_get_hi (list1), 16);
1691 1.1 christos b = sign_ext (mem_get_hi (list2), 16);
1692 1.1 christos }
1693 1.1 christos else
1694 1.1 christos {
1695 1.1 christos a = sign_ext (mem_get_qi (list1), 8);
1696 1.1 christos b = sign_ext (mem_get_qi (list2), 8);
1697 1.1 christos }
1698 1.1 christos tprintf("%lld + %d * %d = ", sum, a, b);
1699 1.1 christos sum += a * b;
1700 1.1 christos tprintf("%lld\n", sum);
1701 1.1 christos list1 += w ? 2 : 1;
1702 1.1 christos list2 += w ? 2 : 1;
1703 1.1 christos count --;
1704 1.1 christos }
1705 1.1 christos put_reg (r3, count);
1706 1.1 christos put_reg (a0, list1);
1707 1.1 christos put_reg (a1, list2);
1708 1.1 christos put_reg (r2r0, (int)(sum & 0xffffffffU));
1709 1.1 christos put_reg (r1, (int)(sum >> 32));
1710 1.1 christos
1711 1.1 christos /** 1011 ddd w dd10 1110 ROLC.size dest */
1712 1.1 christos
1713 1.1 christos prefix (0, 1, 0);
1714 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1715 1.1 christos rot_op (dc, 1, 1);
1716 1.1 christos
1717 1.1 christos /** 1010 ddd w dd10 1110 RORC.size dest */
1718 1.1 christos
1719 1.1 christos prefix (0, 1, 0);
1720 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1721 1.1 christos rot_op (dc, 1, -1);
1722 1.1 christos
1723 1.1 christos /** 1110 ddd w dd10 immm ROT.size #IMM, dest */
1724 1.1 christos
1725 1.1 christos prefix (0, 1, 0);
1726 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1727 1.1 christos rot_op (dc, IMM4(), -1);
1728 1.1 christos
1729 1.1 christos /** 1010 ddd w dd11 1111 ROT.size R1H,dest */
1730 1.1 christos
1731 1.1 christos prefix (0, 1, 0);
1732 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1733 1.1 christos a = sign_ext (get_reg (r1h), 8);
1734 1.1 christos rot_op (dc, a, -1);
1735 1.1 christos
1736 1.1 christos /** 1101 1111 RTS */
1737 1.1 christos
1738 1.1 christos put_reg (pc, mem_get_si (get_reg (sp)));
1739 1.1 christos put_reg (sp, get_reg (sp) + 4);
1740 1.1 christos
1741 1.1 christos /** 0000 0001 1001 ddd w dd10 1110 SBB.size #IMM, dest */
1742 1.1 christos
1743 1.1 christos prefix (0, 0, 0);
1744 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1745 1.1 christos imm = IMM (w+1);
1746 1.1 christos MATH_OP (dc, imm, !carry, -);
1747 1.1 christos
1748 1.1 christos /** 0000 0001 1sss ddd w dd ss 0110 SBB.size src,dest */
1749 1.1 christos
1750 1.1 christos prefix (0, 0, 0);
1751 1.1 christos sc = decode_src23 (sss, ss, w+1);
1752 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1753 1.1 christos MATH_OP (dc, get_src (sc), !carry, -);
1754 1.1 christos
1755 1.1 christos /** 1101 ddd1 dd11 cond SCcond dest */
1756 1.1 christos
1757 1.1 christos prefix (0, 1, 0);
1758 1.1 christos dc = decode_dest23 (ddd, dd, 2);
1759 1.1 christos if (condition_true (cond))
1760 1.1 christos put_dest (dc, 1);
1761 1.1 christos else
1762 1.1 christos put_dest (dc, 0);
1763 1.1 christos
1764 1.1 christos /** 1011 1000 110w 0011 SCMPU.size */
1765 1.1 christos
1766 1.1 christos ta0 = get_reg (a0);
1767 1.1 christos ta1 = get_reg (a1);
1768 1.1 christos
1769 1.1 christos for (;;)
1770 1.1 christos {
1771 1.1 christos t0 = mem_get_qi (ta0);
1772 1.1 christos t2 = mem_get_qi (ta1);
1773 1.1 christos if (w)
1774 1.1 christos {
1775 1.1 christos t1 = mem_get_qi (ta0 + 1);
1776 1.1 christos t3 = mem_get_qi (ta1 + 1);
1777 1.1 christos }
1778 1.1 christos dif = t0 - t2;
1779 1.1 christos if (dif == 0 && t0 != 0 && w)
1780 1.1 christos dif = t1 - t3;
1781 1.1 christos set_oszc (dif, 1, dif > 0);
1782 1.1 christos
1783 1.1 christos ta0 += w ? 2 : 1;
1784 1.1 christos ta1 += w ? 2 : 1;
1785 1.1 christos
1786 1.1 christos if (t0 == 0 || t0 != t2)
1787 1.1 christos break;
1788 1.1 christos if (w && (t1 == 0 || t1 != t3))
1789 1.1 christos break;
1790 1.1 christos }
1791 1.1 christos
1792 1.1 christos /** 1111 ddd w dd00 immm SHA.size #IMM,dest */
1793 1.1 christos
1794 1.1 christos prefix (0, 1, 0);
1795 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1796 1.1 christos shift_op (dc, 1, IMM4(), 1);
1797 1.1 christos
1798 1.1 christos /** 1010 ddd0 dd10 0001 SHA.L #IMM,dest */
1799 1.1 christos
1800 1.1 christos prefix (0, 1, 0);
1801 1.1 christos dc = decode_dest23 (ddd, dd, 4);
1802 1.1 christos imm = sign_ext (IMM(1), 8);
1803 1.1 christos shift_op (dc, 1, imm, 1);
1804 1.1 christos
1805 1.1 christos /** 1011 ddd w dd11 1110 SHA.size R1H,dest */
1806 1.1 christos
1807 1.1 christos prefix (0, 1, 0);
1808 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1809 1.1 christos a = sign_ext (get_reg (r1h), 8);
1810 1.1 christos shift_op (dc, 1, a, 1);
1811 1.1 christos
1812 1.1 christos /** 1100 ddd0 dd01 0001 SHA.L R1H,dest */
1813 1.1 christos
1814 1.1 christos prefix (0, 1, 0);
1815 1.1 christos dc = decode_dest23 (ddd, dd, 4);
1816 1.1 christos a = sign_ext (get_reg (r1h), 8);
1817 1.1 christos shift_op (dc, 1, a, 1);
1818 1.1 christos
1819 1.1 christos /** 1100 ddd0 dd10 0001 SHANC.L #IMM,dest */
1820 1.1 christos
1821 1.1 christos M32C_ONLY();
1822 1.1 christos prefix (0, 1, 0);
1823 1.1 christos dc = decode_dest23 (ddd, dd, 4);
1824 1.1 christos imm = sign_ext (IMM(1), 8);
1825 1.1 christos shift_op (dc, 1, imm, 0);
1826 1.1 christos
1827 1.1 christos /** 1110 ddd w dd00 immm SHL.size #IMM, dest */
1828 1.1 christos
1829 1.1 christos prefix (0, 1, 0);
1830 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1831 1.1 christos shift_op (dc, 0, IMM4(), 1);
1832 1.1 christos
1833 1.1 christos /** 1001 ddd0 dd10 0001 SHL.L #IMM, dest */
1834 1.1 christos
1835 1.1 christos prefix (0, 1, 0);
1836 1.1 christos dc = decode_dest23 (ddd, dd, 4);
1837 1.1 christos imm = sign_ext (IMM(1), 8);
1838 1.1 christos shift_op (dc, 0, imm, 1);
1839 1.1 christos
1840 1.1 christos /** 1010 ddd w dd11 1110 SHL.size R1H,dest */
1841 1.1 christos
1842 1.1 christos prefix (0, 1, 0);
1843 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
1844 1.1 christos a = sign_ext (get_reg (r1h), 8);
1845 1.1 christos shift_op (dc, 0, a, 1);
1846 1.1 christos
1847 1.1 christos /** 1100 ddd0 dd00 0001 SHL.L R1H,dest */
1848 1.1 christos
1849 1.1 christos prefix (0, 1, 0);
1850 1.1 christos dc = decode_dest23 (ddd, dd, 4);
1851 1.1 christos a = sign_ext (get_reg (r1h), 8);
1852 1.1 christos shift_op (dc, 0, a, 1);
1853 1.1 christos
1854 1.1 christos /** 1000 ddd0 dd10 0001 SHLNC.L #IMM,dest */
1855 1.1 christos
1856 1.1 christos M32C_ONLY();
1857 1.1 christos prefix (0, 1, 0);
1858 1.1 christos dc = decode_dest23 (ddd, dd, 4);
1859 1.1 christos imm = sign_ext (IMM(1), 8);
1860 1.1 christos shift_op (dc, 0, imm, 0);
1861 1.1 christos
1862 1.1 christos /** 1011 0010 100w 0011 SIN.size */
1863 1.1 christos
1864 1.1 christos v = get_reg (a0);
1865 1.1 christos a = get_reg (a1);
1866 1.1 christos b = get_reg (r3);
1867 1.1 christos if (b) for (;b;)
1868 1.1 christos {
1869 1.1 christos if (w)
1870 1.1 christos mem_put_hi(a, mem_get_hi (v));
1871 1.1 christos else
1872 1.1 christos mem_put_qi(a, mem_get_qi (v));
1873 1.1 christos a += w ? 2 : 1;
1874 1.1 christos b --;
1875 1.1 christos }
1876 1.1 christos put_reg (a0, v);
1877 1.1 christos put_reg (a1, a);
1878 1.1 christos put_reg (r3, b);
1879 1.1 christos
1880 1.1 christos /** 1011 0110 100w 0011 SMOVB.size */
1881 1.1 christos
1882 1.1 christos v = get_reg (a0);
1883 1.1 christos a = get_reg (a1);
1884 1.1 christos b = get_reg (r3);
1885 1.1 christos if (b) for (;b;)
1886 1.1 christos {
1887 1.1 christos if (w)
1888 1.1 christos mem_put_hi(a, mem_get_hi (v));
1889 1.1 christos else
1890 1.1 christos mem_put_qi(a, mem_get_qi (v));
1891 1.1 christos v -= w ? 2 : 1;
1892 1.1 christos a -= w ? 2 : 1;
1893 1.1 christos b --;
1894 1.1 christos }
1895 1.1 christos put_reg (a0, v);
1896 1.1 christos put_reg (a1, a);
1897 1.1 christos put_reg (r3, b);
1898 1.1 christos
1899 1.1 christos /** 1011 0000 100w 0011 SMOVF.size */
1900 1.1 christos
1901 1.1 christos v = get_reg (a0);
1902 1.1 christos a = get_reg (a1);
1903 1.1 christos b = get_reg (r3);
1904 1.1 christos if (b) for (;b;)
1905 1.1 christos {
1906 1.1 christos if (w)
1907 1.1 christos mem_put_hi(a, mem_get_hi (v));
1908 1.1 christos else
1909 1.1 christos mem_put_qi(a, mem_get_qi (v));
1910 1.1 christos v += w ? 2 : 1;
1911 1.1 christos a += w ? 2 : 1;
1912 1.1 christos b --;
1913 1.1 christos }
1914 1.1 christos put_reg (a0, v);
1915 1.1 christos put_reg (a1, a);
1916 1.1 christos put_reg (r3, b);
1917 1.1 christos
1918 1.1 christos /** 1011 1000 100w 0011 SMOVU.size */
1919 1.1 christos
1920 1.1 christos v = get_reg (a0);
1921 1.1 christos a = get_reg (a1);
1922 1.1 christos do
1923 1.1 christos {
1924 1.1 christos if (w)
1925 1.1 christos mem_put_hi(a, (t0 = mem_get_hi (v)));
1926 1.1 christos else
1927 1.1 christos mem_put_qi(a, (t0 = mem_get_qi (v)));
1928 1.1 christos v += w ? 2 : 1;
1929 1.1 christos a += w ? 2 : 1;
1930 1.1 christos if (t0 == 0
1931 1.1 christos || (w && ((t0 & 0xff) == 0 || (t0 & 0xff00) == 0)))
1932 1.1 christos break;
1933 1.1 christos } while (1);
1934 1.1 christos put_reg (a0, v);
1935 1.1 christos put_reg (a1, a);
1936 1.1 christos
1937 1.1 christos /** 1011 0100 100w 0011 SOUT.size */
1938 1.1 christos
1939 1.1 christos v = get_reg (a0);
1940 1.1 christos a = get_reg (a1);
1941 1.1 christos b = get_reg (r3);
1942 1.1 christos for (;b;)
1943 1.1 christos {
1944 1.1 christos if (w)
1945 1.1 christos mem_put_hi(a, mem_get_hi (v));
1946 1.1 christos else
1947 1.1 christos mem_put_qi(a, mem_get_qi (v));
1948 1.1 christos v += w ? 2 : 1;
1949 1.1 christos b --;
1950 1.1 christos }
1951 1.1 christos put_reg (a0, v);
1952 1.1 christos put_reg (a1, a);
1953 1.1 christos put_reg (r3, b);
1954 1.1 christos
1955 1.1 christos /** 1011 1000 000w 0011 SSTR.size */
1956 1.1 christos
1957 1.1 christos a = get_reg (a1);
1958 1.1 christos b = get_reg (r3);
1959 1.1 christos v = get_reg (w ? r0 : r0l);
1960 1.1 christos for (;b;)
1961 1.1 christos {
1962 1.1 christos if (w)
1963 1.1 christos mem_put_hi(a, v);
1964 1.1 christos else
1965 1.1 christos mem_put_qi(a, v);
1966 1.1 christos a += w ? 2 : 1;
1967 1.1 christos b --;
1968 1.1 christos }
1969 1.1 christos put_reg (a1, a);
1970 1.1 christos put_reg (r3, b);
1971 1.1 christos
1972 1.1 christos /** 0000 0001 1101 ddd1 dd01 0src STC src,dest */
1973 1.1 christos
1974 1.1 christos prefix (0, 0, 0);
1975 1.1 christos dc = decode_dest23 (ddd, dd, 4);
1976 1.1 christos sc = decode_cr_b (src, CR_B_DMA0);
1977 1.1 christos a = get_src (sc);
1978 1.1 christos put_dest (dc, a);
1979 1.1 christos
1980 1.1 christos /** 0000 0001 1101 ddd1 dd01 1src STC src,dest */
1981 1.1 christos
1982 1.1 christos prefix (0, 0, 0);
1983 1.1 christos dc = decode_dest23 (ddd, dd, 2);
1984 1.1 christos sc = decode_cr_b (src, CR_B_DCT0);
1985 1.1 christos a = get_src (sc);
1986 1.1 christos put_dest (dc, a);
1987 1.1 christos
1988 1.1 christos /** 1101 ddd1 dd01 0src STC src,dest */
1989 1.1 christos
1990 1.1 christos prefix (0, 0, 0);
1991 1.1 christos dc = decode_dest23 (ddd, dd, 4);
1992 1.1 christos sc = decode_cr_b (src, CR_B_INTB);
1993 1.1 christos a = get_src (sc);
1994 1.1 christos put_dest (dc, a);
1995 1.1 christos
1996 1.1 christos /** 1011 0110 1101 0011 STCX abs16,abs24 */
1997 1.1 christos
1998 1.1 christos NOTYET();
1999 1.1 christos
2000 1.1 christos /** 1001 ddd w dd01 1111 STNZ.size #IMM,dest */
2001 1.1 christos
2002 1.1 christos prefix (0, 1, 0);
2003 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
2004 1.1 christos imm = IMM(w+1);
2005 1.1 christos if (! FLAG_Z)
2006 1.1 christos put_dest (dc, imm);
2007 1.1 christos
2008 1.1 christos /** 1001 ddd w dd00 1111 STZ.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 dd11 1111 STZX.size #IMM1,#IMM2,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 a = IMM(w+1);
2021 1.1 christos b = IMM(w+1);
2022 1.1 christos if (FLAG_Z)
2023 1.1 christos put_dest (dc, a);
2024 1.1 christos else
2025 1.1 christos put_dest (dc, b);
2026 1.1 christos
2027 1.1 christos /** 1000 ddd w dd11 1110 SUB.size:G #IMM,dest */
2028 1.1 christos
2029 1.1 christos prefix (0, 1, 0);
2030 1.1 christos dc = decode_dest23(ddd, dd, w+1);
2031 1.1 christos imm = IMM(w+1);
2032 1.1 christos MATH_OP (dc, imm, 0, -);
2033 1.1 christos
2034 1.1 christos /** 1001 ddd0 dd11 0001 SUB.L:G #IMM,dest */
2035 1.1 christos
2036 1.1 christos prefix (0, 1, 0);
2037 1.1 christos dc = decode_dest23(ddd, dd, 4);
2038 1.1 christos imm = IMM(4);
2039 1.1 christos MATH_OP (dc, imm, 0, -);
2040 1.1 christos
2041 1.1 christos /** 00dd 111w SUB.size:S #IMM,dest */
2042 1.1 christos
2043 1.1 christos prefix (0, 1, 0);
2044 1.1 christos dc = decode_dest2(dd, w+1);
2045 1.1 christos imm = IMM (w+1);
2046 1.1 christos MATH_OP (dc, imm, 0, -);
2047 1.1 christos
2048 1.1 christos /** 1sss ddd w dd ss 1010 SUB.size:G src,dest */
2049 1.1 christos
2050 1.1 christos prefix (1, 1, 0);
2051 1.1 christos sc = decode_src23(sss, ss, w+1);
2052 1.1 christos dc = decode_dest23(ddd, dd, w+1);
2053 1.1 christos b = get_src (sc);
2054 1.1 christos MATH_OP (dc, b, 0, -);
2055 1.1 christos
2056 1.1 christos /** 1sss ddd1 dd ss 0000 SUB.L:G src,dest */
2057 1.1 christos
2058 1.1 christos prefix (1, 1, 0);
2059 1.1 christos sc = decode_src23(sss, ss, 4);
2060 1.1 christos dc = decode_dest23(ddd, dd, 4);
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 /** 1001 ddd0 dd01 0001 SUBX #IMM,dest */
2065 1.1 christos
2066 1.1 christos prefix (0, 1, 0);
2067 1.1 christos dc = decode_dest23(ddd, dd, 4);
2068 1.1 christos imm = sign_ext (IMM(1), 8);
2069 1.1 christos MATH_OP (dc, imm, 0, -);
2070 1.1 christos
2071 1.1 christos /** 1sss ddd0 dd ss 0000 SUBX src,dest */
2072 1.1 christos
2073 1.1 christos prefix (1, 1, 0);
2074 1.1 christos sc = decode_src23(sss, ss, 1);
2075 1.1 christos dc = decode_dest23(ddd, dd, 4);
2076 1.1 christos b = sign_ext (get_src (sc), 8);
2077 1.1 christos MATH_OP (dc, b, 0, -);
2078 1.1 christos
2079 1.1 christos /** 1001 ddd w dd11 1110 TST.size:G #IMM,dest */
2080 1.1 christos
2081 1.1 christos prefix (0, 0, 0);
2082 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
2083 1.1 christos imm = IMM(w+1);
2084 1.1 christos a = get_src (dc);
2085 1.1 christos v = a & imm;
2086 1.1 christos set_sz (v, w+1);
2087 1.1 christos
2088 1.1 christos /** 00dd 110w TST.size:S #IMM,dest */
2089 1.1 christos
2090 1.1 christos prefix (0, 0, 0);
2091 1.1 christos dc = decode_dest2 (dd, w+1);
2092 1.1 christos imm = IMM(w+1);
2093 1.1 christos a = get_src (dc);
2094 1.1 christos v = a & imm;
2095 1.1 christos set_sz (v, w+1);
2096 1.1 christos
2097 1.1 christos /** 0000 0001 1sss ddd w dd ss 1001 TST.size:G src,dest */
2098 1.1 christos
2099 1.1 christos prefix (0, 0, 0);
2100 1.1 christos sc = decode_src23 (sss, ss, w+1);
2101 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
2102 1.1 christos b = get_src (sc);
2103 1.1 christos a = get_src (dc);
2104 1.1 christos v = a & b;
2105 1.1 christos set_sz (v, w+1);
2106 1.1 christos
2107 1.1 christos /** 1111 1111 UND */
2108 1.1 christos
2109 1.1 christos trigger_fixed_interrupt (0xffffdc);
2110 1.1 christos
2111 1.1 christos /** 1011 0010 0000 0011 WAIT */
2112 1.1 christos
2113 1.1 christos ;
2114 1.1 christos
2115 1.1 christos /** 1101 ddd w dd00 1src XCHG.size src,dest */
2116 1.1 christos
2117 1.1 christos dc = decode_dest23 (ddd, dd, w+1);
2118 1.1 christos sc = decode_src3 (src, w+1);
2119 1.1 christos a = get_src (dc);
2120 1.1 christos b = get_src (sc);
2121 1.1 christos put_dest (dc, b);
2122 1.1 christos put_dest (sc, a);
2123 1.1 christos
2124 1.1 christos /** 1001 ddd w dd00 1110 XOR.size #IMM,dest */
2125 1.1 christos
2126 1.1 christos prefix (0, 1, 0);
2127 1.1 christos dc = decode_dest23(ddd, dd, w+1);
2128 1.1 christos imm = IMM(w+1);
2129 1.1 christos LOGIC_OP (dc, imm, ^);
2130 1.1 christos
2131 1.1 christos /** 1sss ddd w dd ss 1001 XOR.size src,dest */
2132 1.1 christos
2133 1.1 christos prefix (1, 1, 0);
2134 1.1 christos sc = decode_src23(sss, ss, w+1);
2135 1.1 christos dc = decode_dest23(ddd, dd, w+1);
2136 1.1 christos b = get_src (sc);
2137 1.1 christos LOGIC_OP (dc, b, ^);
2138 1.1 christos
2139 1.1 christos /** */
2140 1.1 christos
2141 1.1 christos return step_result;
2142 1.1 christos }
2143