1 /* srcdest.c --- decoding M32C addressing modes.
3 Copyright (C) 2005-2021 Free Software Foundation, Inc.
4 Contributed by Red Hat, Inc.
6 This file is part of the GNU simulators.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 /* This must come before any other includes. */
27 #include "libiberty.h"
31 static int src_indirect = 0;
32 static int dest_indirect = 0;
33 static int src_addend = 0;
34 static int dest_addend = 0;
44 rv = mem_get_qi (get_reg (pc));
58 rv = mem_get_hi (get_reg (pc));
72 rv = mem_get_psi (get_reg (pc));
81 return disp24 () & 0x000fffff;
92 *--bp = (v & 1) ? '1' : '0';
99 static const char *the_bits = 0;
102 decode_indirect (int si, int di)
106 if (trace && (si || di))
107 printf ("indirect: s:%d d:%d\n", si, di);
111 decode_index (int sa, int da)
115 if (trace && (sa || da))
116 printf ("index: s:%d d:%d\n", sa, da);
120 decode_srcdest4 (int destcode, int bw)
123 static const char *dc_wnames[16] = { "r0", "r1", "r2", "r3",
124 "a0", "a1", "[a0]", "[a1]",
125 "disp8[a0]", "disp8[a1]", "disp8[sb]", "disp8[fb]",
126 "disp16[a0]", "disp16[a1]", "disp16[sb]", "disp16"
128 static const char *dc_bnames[4] = { "r0l", "r0h", "r1l", "r1h" };;
130 sd.bytes = bw ? 2 : 1;
131 sd.mem = (destcode >= 6) ? 1 : 0;
135 const char *n = dc_wnames[destcode];
136 if (bw == 0 && destcode <= 3)
137 n = dc_bnames[destcode];
139 the_bits = bits (destcode, 4);
140 printf ("decode: %s (%d) : %s\n", the_bits, destcode, n);
147 sd.u.reg = bw ? r0 : r0l;
150 sd.u.reg = bw ? r1 : r0h;
153 sd.u.reg = bw ? r2 : r1l;
156 sd.u.reg = bw ? r3 : r1h;
165 sd.u.addr = get_reg (a0);
168 sd.u.addr = get_reg (a1);
171 sd.u.addr = get_reg (a0) + disp8 ();
174 sd.u.addr = get_reg (a1) + disp8 ();
177 sd.u.addr = get_reg (sb) + disp8 ();
180 sd.u.addr = get_reg (fb) + sign_ext (disp8 (), 8);
183 sd.u.addr = get_reg (a0) + disp16 ();
186 sd.u.addr = get_reg (a1) + disp16 ();
189 sd.u.addr = get_reg (sb) + disp16 ();
192 sd.u.addr = disp16 ();
198 sd.u.addr &= addr_mask;
203 decode_jumpdest (int destcode, int w)
206 static const char *dc_wnames[16] = { "r0", "r1", "r2", "r3",
207 "a0", "a1", "[a0]", "[a1]",
208 "disp8[a0]", "disp8[a1]", "disp8[sb]", "disp8[fb]",
209 "disp20[a0]", "disp20[a1]", "disp16[sb]", "abs16"
211 static const char *dc_anames[4] = { "r0l", "r0h", "r1l", "r1h" };
213 sd.bytes = w ? 2 : 3;
214 sd.mem = (destcode >= 6) ? 1 : 0;
218 const char *n = dc_wnames[destcode];
219 if (w == 0 && destcode <= 3)
220 n = dc_anames[destcode];
222 the_bits = bits (destcode, 4);
223 printf ("decode: %s : %s\n", the_bits, n);
230 sd.u.reg = w ? r0 : r2r0;
233 sd.u.reg = w ? r1 : r2r0;
236 sd.u.reg = w ? r2 : r3r1;
239 sd.u.reg = w ? r3 : r3r1;
242 sd.u.reg = w ? a0 : a1a0;
245 sd.u.reg = w ? a1 : a1a0;
248 sd.u.addr = get_reg (a0);
251 sd.u.addr = get_reg (a1);
254 sd.u.addr = get_reg (a0) + disp8 ();
257 sd.u.addr = get_reg (a1) + disp8 ();
260 sd.u.addr = get_reg (sb) + disp8 ();
263 sd.u.addr = get_reg (fb) + sign_ext (disp8 (), 8);
266 sd.u.addr = get_reg (a0) + disp20 ();
269 sd.u.addr = get_reg (a1) + disp20 ();
272 sd.u.addr = get_reg (sb) + disp16 ();
275 sd.u.addr = disp16 ();
281 sd.u.addr &= addr_mask;
286 decode_dest3 (int destcode, int bw)
288 static char map[8] = { -1, -1, -1, 1, 0, 10, 11, 15 };
290 the_bits = bits (destcode, 3);
291 return decode_srcdest4 (map[destcode], bw);
295 decode_src2 (int srccode, int bw, int d)
297 static char map[4] = { 0, 10, 11, 15 };
299 the_bits = bits (srccode, 2);
300 return decode_srcdest4 (srccode ? map[srccode] : 1 - d, bw);
313 a0, a0, 1, 0, "[A0]"}, /* 0 0 0 0 0 */
315 a1, a1, 1, 0, "[A1]"}, /* 0 0 0 0 1 */
317 a0, a0, 0, 0, "A0"}, /* 0 0 0 1 0 */
319 a1, a1, 0, 0, "A1"}, /* 0 0 0 1 1 */
321 a0, a0, 1, 1, "dsp:8[A0]"}, /* 0 0 1 0 0 */
323 a1, a1, 1, 1, "dsp:8[A1]"}, /* 0 0 1 0 1 */
325 sb, sb, 1, 1, "dsp:8[SB]"}, /* 0 0 1 1 0 */
327 fb, fb, 1, -1, "dsp:8[FB]"}, /* 0 0 1 1 1 */
329 a0, a0, 1, 2, "dsp:16[A0]"}, /* 0 1 0 0 0 */
331 a1, a1, 1, 2, "dsp:16[A1]"}, /* 0 1 0 0 1 */
333 sb, sb, 1, 2, "dsp:16[SB]"}, /* 0 1 0 1 0 */
335 fb, fb, 1, -2, "dsp:16[FB]"}, /* 0 1 0 1 1 */
337 a0, a0, 1, 3, "dsp:24[A0]"}, /* 0 1 1 0 0 */
339 a1, a1, 1, 3, "dsp:24[A1]"}, /* 0 1 1 0 1 */
341 mem, mem, 1, 3, "abs24"}, /* 0 1 1 1 0 */
343 mem, mem, 1, 2, "abs16"}, /* 0 1 1 1 1 */
345 r0h, r2, 0, 0, "R0H/R2"}, /* 1 0 0 0 0 */
347 r1h, r3, 0, 0, "R1H/R3"}, /* 1 0 0 0 1 */
349 r0l, r0, 0, 0, "R0L/R0"}, /* 1 0 0 1 0 */
351 r1l, r1, 0, 0, "R1L/R1"}, /* 1 0 0 1 1 */
355 decode_sd23 (int bbb, int bb, int bytes, int ind, int add)
358 int code = (bbb << 2) | bb;
360 if (code >= ARRAY_SIZE (modes23))
374 sprintf (ad, "%+d", add);
378 the_bits = bits (code, 4);
379 printf ("decode: %s (%d) : %s%s%s%s\n", the_bits, code, b1,
380 modes23[code].name, ad, b2);
385 sd.mem = modes23[code].is_memory;
388 if (modes23[code].w_regno == mem)
391 sd.u.addr = get_reg (modes23[code].w_regno);
392 switch (modes23[code].disp_bytes)
395 sd.u.addr += disp8 ();
398 sd.u.addr += disp16 ();
401 sd.u.addr += sign_ext (disp8 (), 8);
404 sd.u.addr += sign_ext (disp16 (), 16);
407 sd.u.addr += disp24 ();
415 sd.u.addr = mem_get_si (sd.u.addr & membus_mask);
416 sd.u.addr &= membus_mask;
420 sd.u.reg = (bytes > 1) ? modes23[code].w_regno : modes23[code].b_regno;
421 if (bytes == 3 || bytes == 4)
444 decode_dest23 (int ddd, int dd, int bytes)
446 return decode_sd23 (ddd, dd, bytes, dest_indirect, dest_addend);
450 decode_src23 (int sss, int ss, int bytes)
452 return decode_sd23 (sss, ss, bytes, src_indirect, src_addend);
456 decode_dest2 (int dd, int bytes)
458 /* r0l/r0, abs16, dsp:8[SB], dsp:8[FB] */
459 static char map[4] = { 0x12, 0x0f, 0x06, 0x07 };
461 the_bits = bits (dd, 2);
462 return decode_sd23 (map[dd] >> 2, map[dd] & 3, bytes, dest_indirect,
467 decode_src3 (int sss, int bytes)
469 /* r0, r1, a0, a1, r2, r3, N/A, N/A */
470 static char map[8] = { 0x12, 0x13, 0x02, 0x03, 0x10, 0x11, 0, 0 };
472 the_bits = bits (sss, 3);
473 return decode_sd23 (map[sss] >> 2, map[sss] & 3, bytes, src_indirect,
478 decode_dest1 (int destcode, int bw)
480 the_bits = bits (destcode, 1);
481 return decode_srcdest4 (destcode, bw);
485 decode_cr (int crcode)
487 static int regcode[] = { 0, intbl, intbh, flags, isp, sp, sb, fb };
491 sd.u.reg = regcode[crcode & 7];
496 decode_cr_b (int crcode, int bank)
498 /* FIXME: intbl, intbh, isp */
499 static int regcode[3][8] = {
500 {0, 0, flags, 0, 0, 0, 0, 0},
501 {intb, sp, sb, fb, 0, 0, 0, isp},
502 {0, 0, 0, 0, 0, 0, 0, 0}
506 sd.bytes = bank ? 3 : 2;
507 sd.u.reg = regcode[bank][crcode & 7];
512 widen_sd (srcdest sd)
544 rv.bytes = reg_bytes[reg];
559 v = mem_get_qi (sd.u.addr);
562 v = mem_get_hi (sd.u.addr);
565 v = mem_get_psi (sd.u.addr);
568 v = mem_get_si (sd.u.addr);
576 v = get_reg (sd.u.reg);
594 put_dest (srcdest sd, int v)
601 mem_put_qi (sd.u.addr, v);
604 mem_put_hi (sd.u.addr, v);
607 mem_put_psi (sd.u.addr, v);
610 mem_put_si (sd.u.addr, v);
628 put_reg (sd.u.reg, v);
633 decode_bit (int destcode)
637 static const char *dc_names[] = { "r0", "r1", "r2", "r3",
638 "a0", "a1", "[a0]", "[a1]",
639 "disp8[a0]", "disp8[a1]", "disp8[sb]", "disp8[fb]",
640 "disp16[a0]", "disp16[a1]", "disp16[sb]", "abs16"
645 const char *the_bits = bits (destcode, 4);
646 printf ("decode: %s : %s\n", the_bits, dc_names[destcode]);
676 addr = get_reg (a0) + disp8 ();
679 addr = get_reg (a1) + disp8 ();
682 addr = get_reg (sb) * 8 + disp8 ();
685 addr = get_reg (fb) * 8 + sign_ext (disp8 (), 8);
688 addr = get_reg (a0) + disp16 ();
691 addr = get_reg (a1) + disp16 ();
694 addr = get_reg (sb) + disp16 ();
705 sd.mask = 1 << (d & 0x0f);
711 sd.mask = 1 << (addr & 7);
712 sd.u.addr = addr >> 3;
718 decode_bit11 (int op0)
721 sd.mask = 1 << (op0 & 7);
723 sd.u.addr = get_reg (sb) + disp8 ();
732 b = mem_get_qi (sd.u.addr) & sd.mask;
734 b = get_reg (sd.u.reg) & sd.mask;
739 put_bit (srcdest sd, int val)
743 b = mem_get_qi (sd.u.addr);
745 b = get_reg (sd.u.reg);
751 mem_put_qi (sd.u.addr, b);
753 put_reg (sd.u.reg, b);
757 get_bit2 (srcdest sd, int bit)
761 b = mem_get_qi (sd.u.addr + (bit >> 3)) & (1 << (bit & 7));
763 b = get_reg (sd.u.reg) & (1 << bit);
768 put_bit2 (srcdest sd, int bit, int val)
772 b = mem_get_qi (sd.u.addr + (bit >> 3));
774 b = get_reg (sd.u.reg);
776 b |= (1 << (bit & 7));
778 b &= ~(1 << (bit & 7));
780 mem_put_qi (sd.u.addr + (bit >> 3), b);
782 put_reg (sd.u.reg, b);