gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / sim / m32c / srcdest.c
CommitLineData
d45a4bef
JB
1/* srcdest.c --- decoding M32C addressing modes.
2
b811d2c2 3Copyright (C) 2005-2020 Free Software Foundation, Inc.
d45a4bef
JB
4Contributed by Red Hat, Inc.
5
6This file is part of the GNU simulators.
7
4744ac1b
JB
8This program is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 3 of the License, or
11(at your option) any later version.
d45a4bef 12
4744ac1b
JB
13This program is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
d45a4bef
JB
17
18You should have received a copy of the GNU General Public License
4744ac1b 19along with this program. If not, see <http://www.gnu.org/licenses/>. */
d45a4bef
JB
20
21
22#include <stdio.h>
23#include <stdlib.h>
24
13a590ca 25#include "libiberty.h"
d45a4bef
JB
26#include "cpu.h"
27#include "mem.h"
28
29static int src_indirect = 0;
30static int dest_indirect = 0;
31static int src_addend = 0;
32static int dest_addend = 0;
33
34static int
269e9c18 35disp8 (void)
d45a4bef
JB
36{
37 int rv;
38 int tsave = trace;
39
40 if (trace == 1)
41 trace = 0;
42 rv = mem_get_qi (get_reg (pc));
43 regs.r_pc++;
44 trace = tsave;
45 return rv;
46}
47
48static int
269e9c18 49disp16 (void)
d45a4bef
JB
50{
51 int rv;
52 int tsave = trace;
53
54 if (trace == 1)
55 trace = 0;
56 rv = mem_get_hi (get_reg (pc));
57 regs.r_pc += 2;
58 trace = tsave;
59 return rv;
60}
61
62static int
269e9c18 63disp24 (void)
d45a4bef
JB
64{
65 int rv;
66 int tsave = trace;
67
68 if (trace == 1)
69 trace = 0;
70 rv = mem_get_psi (get_reg (pc));
71 regs.r_pc += 3;
72 trace = tsave;
73 return rv;
74}
75
76static int
269e9c18 77disp20 (void)
d45a4bef
JB
78{
79 return disp24 () & 0x000fffff;
80}
81
82const char *
83bits (int v, int b)
84{
85 static char buf[17];
86 char *bp = buf + 16;
87 *bp = 0;
88 while (b)
89 {
90 *--bp = (v & 1) ? '1' : '0';
91 v >>= 1;
92 b--;
93 }
94 return bp;
95}
96
97static const char *the_bits = 0;
98
99void
100decode_indirect (int si, int di)
101{
102 src_indirect = si;
103 dest_indirect = di;
104 if (trace && (si || di))
105 printf ("indirect: s:%d d:%d\n", si, di);
106}
107
108void
109decode_index (int sa, int da)
110{
111 src_addend = sa;
112 dest_addend = da;
113 if (trace && (sa || da))
114 printf ("index: s:%d d:%d\n", sa, da);
115}
116
117srcdest
118decode_srcdest4 (int destcode, int bw)
119{
120 srcdest sd;
d45a4bef
JB
121 static const char *dc_wnames[16] = { "r0", "r1", "r2", "r3",
122 "a0", "a1", "[a0]", "[a1]",
123 "disp8[a0]", "disp8[a1]", "disp8[sb]", "disp8[fb]",
124 "disp16[a0]", "disp16[a1]", "disp16[sb]", "disp16"
125 };
126 static const char *dc_bnames[4] = { "r0l", "r0h", "r1l", "r1h" };;
127
269e9c18
MF
128 sd.bytes = bw ? 2 : 1;
129 sd.mem = (destcode >= 6) ? 1 : 0;
130
d45a4bef
JB
131 if (trace)
132 {
133 const char *n = dc_wnames[destcode];
134 if (bw == 0 && destcode <= 3)
135 n = dc_bnames[destcode];
136 if (!the_bits)
137 the_bits = bits (destcode, 4);
138 printf ("decode: %s (%d) : %s\n", the_bits, destcode, n);
139 the_bits = 0;
140 }
141
142 switch (destcode)
143 {
144 case 0x0:
145 sd.u.reg = bw ? r0 : r0l;
146 break;
147 case 0x1:
148 sd.u.reg = bw ? r1 : r0h;
149 break;
150 case 0x2:
151 sd.u.reg = bw ? r2 : r1l;
152 break;
153 case 0x3:
154 sd.u.reg = bw ? r3 : r1h;
155 break;
156 case 0x4:
157 sd.u.reg = a0;
158 break;
159 case 0x5:
160 sd.u.reg = a1;
161 break;
162 case 0x6:
163 sd.u.addr = get_reg (a0);
164 break;
165 case 0x7:
166 sd.u.addr = get_reg (a1);
167 break;
168 case 0x8:
169 sd.u.addr = get_reg (a0) + disp8 ();
170 break;
171 case 0x9:
172 sd.u.addr = get_reg (a1) + disp8 ();
173 break;
174 case 0xa:
175 sd.u.addr = get_reg (sb) + disp8 ();
176 break;
177 case 0xb:
178 sd.u.addr = get_reg (fb) + sign_ext (disp8 (), 8);
179 break;
180 case 0xc:
181 sd.u.addr = get_reg (a0) + disp16 ();
182 break;
183 case 0xd:
184 sd.u.addr = get_reg (a1) + disp16 ();
185 break;
186 case 0xe:
187 sd.u.addr = get_reg (sb) + disp16 ();
188 break;
189 case 0xf:
190 sd.u.addr = disp16 ();
191 break;
192 default:
193 abort ();
194 }
195 if (sd.mem)
196 sd.u.addr &= addr_mask;
197 return sd;
198}
199
200srcdest
201decode_jumpdest (int destcode, int w)
202{
203 srcdest sd;
d45a4bef
JB
204 static const char *dc_wnames[16] = { "r0", "r1", "r2", "r3",
205 "a0", "a1", "[a0]", "[a1]",
206 "disp8[a0]", "disp8[a1]", "disp8[sb]", "disp8[fb]",
207 "disp20[a0]", "disp20[a1]", "disp16[sb]", "abs16"
208 };
209 static const char *dc_anames[4] = { "r0l", "r0h", "r1l", "r1h" };
210
269e9c18
MF
211 sd.bytes = w ? 2 : 3;
212 sd.mem = (destcode >= 6) ? 1 : 0;
213
d45a4bef
JB
214 if (trace)
215 {
216 const char *n = dc_wnames[destcode];
217 if (w == 0 && destcode <= 3)
218 n = dc_anames[destcode];
219 if (!the_bits)
220 the_bits = bits (destcode, 4);
221 printf ("decode: %s : %s\n", the_bits, n);
222 the_bits = 0;
223 }
224
225 switch (destcode)
226 {
227 case 0x0:
228 sd.u.reg = w ? r0 : r2r0;
229 break;
230 case 0x1:
231 sd.u.reg = w ? r1 : r2r0;
232 break;
233 case 0x2:
234 sd.u.reg = w ? r2 : r3r1;
235 break;
236 case 0x3:
237 sd.u.reg = w ? r3 : r3r1;
238 break;
239 case 0x4:
240 sd.u.reg = w ? a0 : a1a0;
241 break;
242 case 0x5:
243 sd.u.reg = w ? a1 : a1a0;
244 break;
245 case 0x6:
246 sd.u.addr = get_reg (a0);
247 break;
248 case 0x7:
249 sd.u.addr = get_reg (a1);
250 break;
251 case 0x8:
252 sd.u.addr = get_reg (a0) + disp8 ();
253 break;
254 case 0x9:
255 sd.u.addr = get_reg (a1) + disp8 ();
256 break;
257 case 0xa:
258 sd.u.addr = get_reg (sb) + disp8 ();
259 break;
260 case 0xb:
261 sd.u.addr = get_reg (fb) + sign_ext (disp8 (), 8);
262 break;
263 case 0xc:
264 sd.u.addr = get_reg (a0) + disp20 ();
265 break;
266 case 0xd:
267 sd.u.addr = get_reg (a1) + disp20 ();
268 break;
269 case 0xe:
270 sd.u.addr = get_reg (sb) + disp16 ();
271 break;
272 case 0xf:
273 sd.u.addr = disp16 ();
274 break;
275 default:
276 abort ();
277 }
278 if (sd.mem)
279 sd.u.addr &= addr_mask;
280 return sd;
281}
282
283srcdest
284decode_dest3 (int destcode, int bw)
285{
286 static char map[8] = { -1, -1, -1, 1, 0, 10, 11, 15 };
287
288 the_bits = bits (destcode, 3);
289 return decode_srcdest4 (map[destcode], bw);
290}
291
292srcdest
293decode_src2 (int srccode, int bw, int d)
294{
295 static char map[4] = { 0, 10, 11, 15 };
296
297 the_bits = bits (srccode, 2);
298 return decode_srcdest4 (srccode ? map[srccode] : 1 - d, bw);
299}
300
301static struct
302{
303 reg_id b_regno;
304 reg_id w_regno;
305 int is_memory;
306 int disp_bytes;
307 char *name;
308} modes23[] =
309{
310 {
311 a0, a0, 1, 0, "[A0]"}, /* 0 0 0 0 0 */
312 {
313 a1, a1, 1, 0, "[A1]"}, /* 0 0 0 0 1 */
314 {
315 a0, a0, 0, 0, "A0"}, /* 0 0 0 1 0 */
316 {
317 a1, a1, 0, 0, "A1"}, /* 0 0 0 1 1 */
318 {
319 a0, a0, 1, 1, "dsp:8[A0]"}, /* 0 0 1 0 0 */
320 {
321 a1, a1, 1, 1, "dsp:8[A1]"}, /* 0 0 1 0 1 */
322 {
323 sb, sb, 1, 1, "dsp:8[SB]"}, /* 0 0 1 1 0 */
324 {
325 fb, fb, 1, -1, "dsp:8[FB]"}, /* 0 0 1 1 1 */
326 {
327 a0, a0, 1, 2, "dsp:16[A0]"}, /* 0 1 0 0 0 */
328 {
329 a1, a1, 1, 2, "dsp:16[A1]"}, /* 0 1 0 0 1 */
330 {
331 sb, sb, 1, 2, "dsp:16[SB]"}, /* 0 1 0 1 0 */
332 {
333 fb, fb, 1, -2, "dsp:16[FB]"}, /* 0 1 0 1 1 */
334 {
335 a0, a0, 1, 3, "dsp:24[A0]"}, /* 0 1 1 0 0 */
336 {
337 a1, a1, 1, 3, "dsp:24[A1]"}, /* 0 1 1 0 1 */
338 {
339 mem, mem, 1, 3, "abs24"}, /* 0 1 1 1 0 */
340 {
341 mem, mem, 1, 2, "abs16"}, /* 0 1 1 1 1 */
342 {
343 r0h, r2, 0, 0, "R0H/R2"}, /* 1 0 0 0 0 */
344 {
345 r1h, r3, 0, 0, "R1H/R3"}, /* 1 0 0 0 1 */
346 {
347 r0l, r0, 0, 0, "R0L/R0"}, /* 1 0 0 1 0 */
348 {
349 r1l, r1, 0, 0, "R1L/R1"}, /* 1 0 0 1 1 */
350};
351
352static srcdest
353decode_sd23 (int bbb, int bb, int bytes, int ind, int add)
354{
355 srcdest sd;
356 int code = (bbb << 2) | bb;
357
13a590ca 358 if (code >= ARRAY_SIZE (modes23))
d45a4bef
JB
359 abort ();
360
361 if (trace)
362 {
363 char *b1 = "";
364 char *b2 = "";
365 char ad[30];
366 if (ind)
367 {
368 b1 = "[";
369 b2 = "]";
370 }
371 if (add)
372 sprintf (ad, "%+d", add);
373 else
374 ad[0] = 0;
375 if (!the_bits)
376 the_bits = bits (code, 4);
377 printf ("decode: %s (%d) : %s%s%s%s\n", the_bits, code, b1,
378 modes23[code].name, ad, b2);
379 the_bits = 0;
380 }
381
382 sd.bytes = bytes;
383 sd.mem = modes23[code].is_memory;
384 if (sd.mem)
385 {
386 if (modes23[code].w_regno == mem)
387 sd.u.addr = 0;
388 else
389 sd.u.addr = get_reg (modes23[code].w_regno);
390 switch (modes23[code].disp_bytes)
391 {
392 case 1:
393 sd.u.addr += disp8 ();
394 break;
395 case 2:
396 sd.u.addr += disp16 ();
397 break;
398 case -1:
399 sd.u.addr += sign_ext (disp8 (), 8);
400 break;
401 case -2:
402 sd.u.addr += sign_ext (disp16 (), 16);
403 break;
404 case 3:
405 sd.u.addr += disp24 ();
406 break;
407 default:
408 break;
409 }
410 if (add)
411 sd.u.addr += add;
412 if (ind)
413 sd.u.addr = mem_get_si (sd.u.addr & membus_mask);
414 sd.u.addr &= membus_mask;
415 }
416 else
417 {
418 sd.u.reg = (bytes > 1) ? modes23[code].w_regno : modes23[code].b_regno;
419 if (bytes == 3 || bytes == 4)
420 {
421 switch (sd.u.reg)
422 {
423 case r0:
424 sd.u.reg = r2r0;
425 break;
426 case r1:
427 sd.u.reg = r3r1;
428 break;
429 case r2:
430 abort ();
431 case r3:
432 abort ();
433 default:;
434 }
435 }
436
437 }
438 return sd;
439}
440
441srcdest
442decode_dest23 (int ddd, int dd, int bytes)
443{
444 return decode_sd23 (ddd, dd, bytes, dest_indirect, dest_addend);
445}
446
447srcdest
448decode_src23 (int sss, int ss, int bytes)
449{
450 return decode_sd23 (sss, ss, bytes, src_indirect, src_addend);
451}
452
453srcdest
454decode_dest2 (int dd, int bytes)
455{
456 /* r0l/r0, abs16, dsp:8[SB], dsp:8[FB] */
457 static char map[4] = { 0x12, 0x0f, 0x06, 0x07 };
458
459 the_bits = bits (dd, 2);
460 return decode_sd23 (map[dd] >> 2, map[dd] & 3, bytes, dest_indirect,
461 dest_addend);
462}
463
464srcdest
465decode_src3 (int sss, int bytes)
466{
467 /* r0, r1, a0, a1, r2, r3, N/A, N/A */
468 static char map[8] = { 0x12, 0x13, 0x02, 0x03, 0x10, 0x11, 0, 0 };
469
470 the_bits = bits (sss, 3);
471 return decode_sd23 (map[sss] >> 2, map[sss] & 3, bytes, src_indirect,
472 src_addend);
473}
474
475srcdest
476decode_dest1 (int destcode, int bw)
477{
478 the_bits = bits (destcode, 1);
479 return decode_srcdest4 (destcode, bw);
480}
481
482srcdest
483decode_cr (int crcode)
484{
485 static int regcode[] = { 0, intbl, intbh, flags, isp, sp, sb, fb };
486 srcdest sd;
487 sd.mem = 0;
488 sd.bytes = 2;
489 sd.u.reg = regcode[crcode & 7];
490 return sd;
491}
492
493srcdest
494decode_cr_b (int crcode, int bank)
495{
496 /* FIXME: intbl, intbh, isp */
497 static int regcode[3][8] = {
498 {0, 0, flags, 0, 0, 0, 0, 0},
499 {intb, sp, sb, fb, 0, 0, 0, isp},
500 {0, 0, 0, 0, 0, 0, 0, 0}
501 };
502 srcdest sd;
503 sd.mem = 0;
504 sd.bytes = bank ? 3 : 2;
505 sd.u.reg = regcode[bank][crcode & 7];
506 return sd;
507}
508
509srcdest
510widen_sd (srcdest sd)
511{
512 sd.bytes *= 2;
513 if (!sd.mem)
514 switch (sd.u.reg)
515 {
516 case r0l:
517 sd.u.reg = r0;
518 break;
519 case r0:
520 sd.u.reg = r2r0;
521 break;
522 case r1l:
523 sd.u.reg = r1;
524 break;
525 case r1:
526 sd.u.reg = r3r1;
527 break;
528 case a0:
529 if (A16)
530 sd.u.reg = a1a0;
531 break;
532 default:
533 break;
534 }
535 return sd;
536}
537
538srcdest
539reg_sd (reg_id reg)
540{
541 srcdest rv;
542 rv.bytes = reg_bytes[reg];
543 rv.mem = 0;
544 rv.u.reg = reg;
545 return rv;
546}
547
548int
549get_src (srcdest sd)
550{
551 int v;
552 if (sd.mem)
553 {
554 switch (sd.bytes)
555 {
556 case 1:
557 v = mem_get_qi (sd.u.addr);
558 break;
559 case 2:
560 v = mem_get_hi (sd.u.addr);
561 break;
562 case 3:
563 v = mem_get_psi (sd.u.addr);
564 break;
565 case 4:
566 v = mem_get_si (sd.u.addr);
567 break;
568 default:
569 abort ();
570 }
571 }
572 else
573 {
574 v = get_reg (sd.u.reg);
575 switch (sd.bytes)
576 {
577 case 1:
578 v &= 0xff;
579 break;
580 case 2:
581 v &= 0xffff;
582 break;
583 case 3:
584 v &= 0xffffff;
585 break;
586 }
587 }
588 return v;
589}
590
591void
592put_dest (srcdest sd, int v)
593{
594 if (sd.mem)
595 {
596 switch (sd.bytes)
597 {
598 case 1:
599 mem_put_qi (sd.u.addr, v);
600 break;
601 case 2:
602 mem_put_hi (sd.u.addr, v);
603 break;
604 case 3:
605 mem_put_psi (sd.u.addr, v);
606 break;
607 case 4:
608 mem_put_si (sd.u.addr, v);
609 break;
610 }
611 }
612 else
613 {
614 switch (sd.bytes)
615 {
616 case 1:
617 v &= 0xff;
618 break;
619 case 2:
620 v &= 0xffff;
621 break;
622 case 3:
623 v &= 0xffffff;
624 break;
625 }
626 put_reg (sd.u.reg, v);
627 }
628}
629
630srcdest
631decode_bit (int destcode)
632{
633 srcdest sd;
634 int addr = 0;
635 static const char *dc_names[] = { "r0", "r1", "r2", "r3",
636 "a0", "a1", "[a0]", "[a1]",
637 "disp8[a0]", "disp8[a1]", "disp8[sb]", "disp8[fb]",
638 "disp16[a0]", "disp16[a1]", "disp16[sb]", "abs16"
639 };
640
641 if (trace)
642 {
643 const char *the_bits = bits (destcode, 4);
644 printf ("decode: %s : %s\n", the_bits, dc_names[destcode]);
645 }
646
647 switch (destcode)
648 {
649 case 0:
650 sd.u.reg = r0;
651 break;
652 case 1:
653 sd.u.reg = r1;
654 break;
655 case 2:
656 sd.u.reg = r2;
657 break;
658 case 3:
659 sd.u.reg = r3;
660 break;
661 case 4:
662 sd.u.reg = a0;
663 break;
664 case 5:
665 sd.u.reg = a1;
666 break;
667 case 6:
668 addr = get_reg (a0);
669 break;
670 case 7:
671 addr = get_reg (a1);
672 break;
673 case 8:
674 addr = get_reg (a0) + disp8 ();
675 break;
676 case 9:
677 addr = get_reg (a1) + disp8 ();
678 break;
679 case 10:
680 addr = get_reg (sb) * 8 + disp8 ();
681 break;
682 case 11:
683 addr = get_reg (fb) * 8 + sign_ext (disp8 (), 8);
684 break;
685 case 12:
686 addr = get_reg (a0) + disp16 ();
687 break;
688 case 13:
689 addr = get_reg (a1) + disp16 ();
690 break;
691 case 14:
692 addr = get_reg (sb) + disp16 ();
693 break;
694 case 15:
695 addr = disp16 ();
696 break;
697 }
698
699 if (destcode < 6)
700 {
701 int d = disp8 ();
702 sd.mem = 0;
703 sd.mask = 1 << (d & 0x0f);
704 }
705 else
706 {
707 addr &= addr_mask;
708 sd.mem = 1;
709 sd.mask = 1 << (addr & 7);
710 sd.u.addr = addr >> 3;
711 }
712 return sd;
713}
714
715srcdest
716decode_bit11 (int op0)
717{
718 srcdest sd;
719 sd.mask = 1 << (op0 & 7);
720 sd.mem = 1;
721 sd.u.addr = get_reg (sb) + disp8 ();
722 return sd;
723}
724
725int
726get_bit (srcdest sd)
727{
728 int b;
729 if (sd.mem)
730 b = mem_get_qi (sd.u.addr) & sd.mask;
731 else
732 b = get_reg (sd.u.reg) & sd.mask;
733 return b ? 1 : 0;
734}
735
736void
737put_bit (srcdest sd, int val)
738{
739 int b;
740 if (sd.mem)
741 b = mem_get_qi (sd.u.addr);
742 else
743 b = get_reg (sd.u.reg);
744 if (val)
745 b |= sd.mask;
746 else
747 b &= ~sd.mask;
748 if (sd.mem)
749 mem_put_qi (sd.u.addr, b);
750 else
751 put_reg (sd.u.reg, b);
752}
753
754int
755get_bit2 (srcdest sd, int bit)
756{
757 int b;
758 if (sd.mem)
759 b = mem_get_qi (sd.u.addr + (bit >> 3)) & (1 << (bit & 7));
760 else
761 b = get_reg (sd.u.reg) & (1 << bit);
762 return b ? 1 : 0;
763}
764
765void
766put_bit2 (srcdest sd, int bit, int val)
767{
768 int b;
769 if (sd.mem)
770 b = mem_get_qi (sd.u.addr + (bit >> 3));
771 else
772 b = get_reg (sd.u.reg);
773 if (val)
774 b |= (1 << (bit & 7));
775 else
776 b &= ~(1 << (bit & 7));
777 if (sd.mem)
778 mem_put_qi (sd.u.addr + (bit >> 3), b);
779 else
780 put_reg (sd.u.reg, b);
781}
This page took 0.776041 seconds and 4 git commands to generate.