xref: /netbsd-src/external/gpl3/gdb/dist/sim/m32c/srcdest.c (revision 627f7eb200a4419d89b531d55fccd2ee3ffdcde0)
1 /* srcdest.c --- decoding M32C addressing modes.
2 
3 Copyright (C) 2005-2020 Free Software Foundation, Inc.
4 Contributed by Red Hat, Inc.
5 
6 This file is part of the GNU simulators.
7 
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.
12 
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.
17 
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/>.  */
20 
21 
22 #include <stdio.h>
23 #include <stdlib.h>
24 
25 #include "libiberty.h"
26 #include "cpu.h"
27 #include "mem.h"
28 
29 static int src_indirect = 0;
30 static int dest_indirect = 0;
31 static int src_addend = 0;
32 static int dest_addend = 0;
33 
34 static int
35 disp8 (void)
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 
48 static int
49 disp16 (void)
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 
62 static int
63 disp24 (void)
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 
76 static int
77 disp20 (void)
78 {
79   return disp24 () & 0x000fffff;
80 }
81 
82 const char *
83 bits (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 
97 static const char *the_bits = 0;
98 
99 void
100 decode_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 
108 void
109 decode_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 
117 srcdest
118 decode_srcdest4 (int destcode, int bw)
119 {
120   srcdest sd;
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 
128   sd.bytes = bw ? 2 : 1;
129   sd.mem = (destcode >= 6) ? 1 : 0;
130 
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 
200 srcdest
201 decode_jumpdest (int destcode, int w)
202 {
203   srcdest sd;
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 
211   sd.bytes = w ? 2 : 3;
212   sd.mem = (destcode >= 6) ? 1 : 0;
213 
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 
283 srcdest
284 decode_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 
292 srcdest
293 decode_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 
301 static 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 
352 static srcdest
353 decode_sd23 (int bbb, int bb, int bytes, int ind, int add)
354 {
355   srcdest sd;
356   int code = (bbb << 2) | bb;
357 
358   if (code >= ARRAY_SIZE (modes23))
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 
441 srcdest
442 decode_dest23 (int ddd, int dd, int bytes)
443 {
444   return decode_sd23 (ddd, dd, bytes, dest_indirect, dest_addend);
445 }
446 
447 srcdest
448 decode_src23 (int sss, int ss, int bytes)
449 {
450   return decode_sd23 (sss, ss, bytes, src_indirect, src_addend);
451 }
452 
453 srcdest
454 decode_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 
464 srcdest
465 decode_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 
475 srcdest
476 decode_dest1 (int destcode, int bw)
477 {
478   the_bits = bits (destcode, 1);
479   return decode_srcdest4 (destcode, bw);
480 }
481 
482 srcdest
483 decode_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 
493 srcdest
494 decode_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 
509 srcdest
510 widen_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 
538 srcdest
539 reg_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 
548 int
549 get_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 
591 void
592 put_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 
630 srcdest
631 decode_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 
715 srcdest
716 decode_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 
725 int
726 get_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 
736 void
737 put_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 
754 int
755 get_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 
765 void
766 put_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 }
782