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