]> Git Repo - binutils.git/blob - sim/m32c/srcdest.c
sim: switch config.h usage to defs.h
[binutils.git] / sim / m32c / srcdest.c
1 /* srcdest.c --- decoding M32C addressing modes.
2
3 Copyright (C) 2005-2021 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 }
This page took 0.07325 seconds and 4 git commands to generate.