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