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