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