OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [gdb-6.8/] [pre-binutils-2.20.1-sync/] [sim/] [m32c/] [srcdest.c] - Diff between revs 157 and 223

Only display areas with differences | Details | Blame | View Log

Rev 157 Rev 223
/* srcdest.c --- decoding M32C addressing modes.
/* srcdest.c --- decoding M32C addressing modes.
 
 
Copyright (C) 2005, 2007, 2008 Free Software Foundation, Inc.
Copyright (C) 2005, 2007, 2008 Free Software Foundation, Inc.
Contributed by Red Hat, Inc.
Contributed by Red Hat, Inc.
 
 
This file is part of the GNU simulators.
This file is part of the GNU simulators.
 
 
This program is free software; you can redistribute it and/or modify
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
(at your option) any later version.
 
 
This program is distributed in the hope that it will be useful,
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
GNU General Public License for more details.
 
 
You should have received a copy of the GNU General Public License
You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
 
 
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
 
 
#include "cpu.h"
#include "cpu.h"
#include "mem.h"
#include "mem.h"
 
 
static int src_indirect = 0;
static int src_indirect = 0;
static int dest_indirect = 0;
static int dest_indirect = 0;
static int src_addend = 0;
static int src_addend = 0;
static int dest_addend = 0;
static int dest_addend = 0;
 
 
static int
static int
disp8 ()
disp8 ()
{
{
  int rv;
  int rv;
  int tsave = trace;
  int tsave = trace;
 
 
  if (trace == 1)
  if (trace == 1)
    trace = 0;
    trace = 0;
  rv = mem_get_qi (get_reg (pc));
  rv = mem_get_qi (get_reg (pc));
  regs.r_pc++;
  regs.r_pc++;
  trace = tsave;
  trace = tsave;
  return rv;
  return rv;
}
}
 
 
static int
static int
disp16 ()
disp16 ()
{
{
  int rv;
  int rv;
  int tsave = trace;
  int tsave = trace;
 
 
  if (trace == 1)
  if (trace == 1)
    trace = 0;
    trace = 0;
  rv = mem_get_hi (get_reg (pc));
  rv = mem_get_hi (get_reg (pc));
  regs.r_pc += 2;
  regs.r_pc += 2;
  trace = tsave;
  trace = tsave;
  return rv;
  return rv;
}
}
 
 
static int
static int
disp24 ()
disp24 ()
{
{
  int rv;
  int rv;
  int tsave = trace;
  int tsave = trace;
 
 
  if (trace == 1)
  if (trace == 1)
    trace = 0;
    trace = 0;
  rv = mem_get_psi (get_reg (pc));
  rv = mem_get_psi (get_reg (pc));
  regs.r_pc += 3;
  regs.r_pc += 3;
  trace = tsave;
  trace = tsave;
  return rv;
  return rv;
}
}
 
 
static int
static int
disp20 ()
disp20 ()
{
{
  return disp24 () & 0x000fffff;
  return disp24 () & 0x000fffff;
}
}
 
 
const char *
const char *
bits (int v, int b)
bits (int v, int b)
{
{
  static char buf[17];
  static char buf[17];
  char *bp = buf + 16;
  char *bp = buf + 16;
  *bp = 0;
  *bp = 0;
  while (b)
  while (b)
    {
    {
      *--bp = (v & 1) ? '1' : '0';
      *--bp = (v & 1) ? '1' : '0';
      v >>= 1;
      v >>= 1;
      b--;
      b--;
    }
    }
  return bp;
  return bp;
}
}
 
 
static const char *the_bits = 0;
static const char *the_bits = 0;
 
 
void
void
decode_indirect (int si, int di)
decode_indirect (int si, int di)
{
{
  src_indirect = si;
  src_indirect = si;
  dest_indirect = di;
  dest_indirect = di;
  if (trace && (si || di))
  if (trace && (si || di))
    printf ("indirect: s:%d d:%d\n", si, di);
    printf ("indirect: s:%d d:%d\n", si, di);
}
}
 
 
void
void
decode_index (int sa, int da)
decode_index (int sa, int da)
{
{
  src_addend = sa;
  src_addend = sa;
  dest_addend = da;
  dest_addend = da;
  if (trace && (sa || da))
  if (trace && (sa || da))
    printf ("index: s:%d d:%d\n", sa, da);
    printf ("index: s:%d d:%d\n", sa, da);
}
}
 
 
srcdest
srcdest
decode_srcdest4 (int destcode, int bw)
decode_srcdest4 (int destcode, int bw)
{
{
  srcdest sd;
  srcdest sd;
  sd.bytes = bw ? 2 : 1;
  sd.bytes = bw ? 2 : 1;
  sd.mem = (destcode >= 6) ? 1 : 0;
  sd.mem = (destcode >= 6) ? 1 : 0;
  static const char *dc_wnames[16] = { "r0", "r1", "r2", "r3",
  static const char *dc_wnames[16] = { "r0", "r1", "r2", "r3",
    "a0", "a1", "[a0]", "[a1]",
    "a0", "a1", "[a0]", "[a1]",
    "disp8[a0]", "disp8[a1]", "disp8[sb]", "disp8[fb]",
    "disp8[a0]", "disp8[a1]", "disp8[sb]", "disp8[fb]",
    "disp16[a0]", "disp16[a1]", "disp16[sb]", "disp16"
    "disp16[a0]", "disp16[a1]", "disp16[sb]", "disp16"
  };
  };
  static const char *dc_bnames[4] = { "r0l", "r0h", "r1l", "r1h" };;
  static const char *dc_bnames[4] = { "r0l", "r0h", "r1l", "r1h" };;
 
 
  if (trace)
  if (trace)
    {
    {
      const char *n = dc_wnames[destcode];
      const char *n = dc_wnames[destcode];
      if (bw == 0 && destcode <= 3)
      if (bw == 0 && destcode <= 3)
        n = dc_bnames[destcode];
        n = dc_bnames[destcode];
      if (!the_bits)
      if (!the_bits)
        the_bits = bits (destcode, 4);
        the_bits = bits (destcode, 4);
      printf ("decode: %s (%d) : %s\n", the_bits, destcode, n);
      printf ("decode: %s (%d) : %s\n", the_bits, destcode, n);
      the_bits = 0;
      the_bits = 0;
    }
    }
 
 
  switch (destcode)
  switch (destcode)
    {
    {
    case 0x0:
    case 0x0:
      sd.u.reg = bw ? r0 : r0l;
      sd.u.reg = bw ? r0 : r0l;
      break;
      break;
    case 0x1:
    case 0x1:
      sd.u.reg = bw ? r1 : r0h;
      sd.u.reg = bw ? r1 : r0h;
      break;
      break;
    case 0x2:
    case 0x2:
      sd.u.reg = bw ? r2 : r1l;
      sd.u.reg = bw ? r2 : r1l;
      break;
      break;
    case 0x3:
    case 0x3:
      sd.u.reg = bw ? r3 : r1h;
      sd.u.reg = bw ? r3 : r1h;
      break;
      break;
    case 0x4:
    case 0x4:
      sd.u.reg = a0;
      sd.u.reg = a0;
      break;
      break;
    case 0x5:
    case 0x5:
      sd.u.reg = a1;
      sd.u.reg = a1;
      break;
      break;
    case 0x6:
    case 0x6:
      sd.u.addr = get_reg (a0);
      sd.u.addr = get_reg (a0);
      break;
      break;
    case 0x7:
    case 0x7:
      sd.u.addr = get_reg (a1);
      sd.u.addr = get_reg (a1);
      break;
      break;
    case 0x8:
    case 0x8:
      sd.u.addr = get_reg (a0) + disp8 ();
      sd.u.addr = get_reg (a0) + disp8 ();
      break;
      break;
    case 0x9:
    case 0x9:
      sd.u.addr = get_reg (a1) + disp8 ();
      sd.u.addr = get_reg (a1) + disp8 ();
      break;
      break;
    case 0xa:
    case 0xa:
      sd.u.addr = get_reg (sb) + disp8 ();
      sd.u.addr = get_reg (sb) + disp8 ();
      break;
      break;
    case 0xb:
    case 0xb:
      sd.u.addr = get_reg (fb) + sign_ext (disp8 (), 8);
      sd.u.addr = get_reg (fb) + sign_ext (disp8 (), 8);
      break;
      break;
    case 0xc:
    case 0xc:
      sd.u.addr = get_reg (a0) + disp16 ();
      sd.u.addr = get_reg (a0) + disp16 ();
      break;
      break;
    case 0xd:
    case 0xd:
      sd.u.addr = get_reg (a1) + disp16 ();
      sd.u.addr = get_reg (a1) + disp16 ();
      break;
      break;
    case 0xe:
    case 0xe:
      sd.u.addr = get_reg (sb) + disp16 ();
      sd.u.addr = get_reg (sb) + disp16 ();
      break;
      break;
    case 0xf:
    case 0xf:
      sd.u.addr = disp16 ();
      sd.u.addr = disp16 ();
      break;
      break;
    default:
    default:
      abort ();
      abort ();
    }
    }
  if (sd.mem)
  if (sd.mem)
    sd.u.addr &= addr_mask;
    sd.u.addr &= addr_mask;
  return sd;
  return sd;
}
}
 
 
srcdest
srcdest
decode_jumpdest (int destcode, int w)
decode_jumpdest (int destcode, int w)
{
{
  srcdest sd;
  srcdest sd;
  sd.bytes = w ? 2 : 3;
  sd.bytes = w ? 2 : 3;
  sd.mem = (destcode >= 6) ? 1 : 0;
  sd.mem = (destcode >= 6) ? 1 : 0;
  static const char *dc_wnames[16] = { "r0", "r1", "r2", "r3",
  static const char *dc_wnames[16] = { "r0", "r1", "r2", "r3",
    "a0", "a1", "[a0]", "[a1]",
    "a0", "a1", "[a0]", "[a1]",
    "disp8[a0]", "disp8[a1]", "disp8[sb]", "disp8[fb]",
    "disp8[a0]", "disp8[a1]", "disp8[sb]", "disp8[fb]",
    "disp20[a0]", "disp20[a1]", "disp16[sb]", "abs16"
    "disp20[a0]", "disp20[a1]", "disp16[sb]", "abs16"
  };
  };
  static const char *dc_anames[4] = { "r0l", "r0h", "r1l", "r1h" };
  static const char *dc_anames[4] = { "r0l", "r0h", "r1l", "r1h" };
 
 
  if (trace)
  if (trace)
    {
    {
      const char *n = dc_wnames[destcode];
      const char *n = dc_wnames[destcode];
      if (w == 0 && destcode <= 3)
      if (w == 0 && destcode <= 3)
        n = dc_anames[destcode];
        n = dc_anames[destcode];
      if (!the_bits)
      if (!the_bits)
        the_bits = bits (destcode, 4);
        the_bits = bits (destcode, 4);
      printf ("decode: %s : %s\n", the_bits, n);
      printf ("decode: %s : %s\n", the_bits, n);
      the_bits = 0;
      the_bits = 0;
    }
    }
 
 
  switch (destcode)
  switch (destcode)
    {
    {
    case 0x0:
    case 0x0:
      sd.u.reg = w ? r0 : r2r0;
      sd.u.reg = w ? r0 : r2r0;
      break;
      break;
    case 0x1:
    case 0x1:
      sd.u.reg = w ? r1 : r2r0;
      sd.u.reg = w ? r1 : r2r0;
      break;
      break;
    case 0x2:
    case 0x2:
      sd.u.reg = w ? r2 : r3r1;
      sd.u.reg = w ? r2 : r3r1;
      break;
      break;
    case 0x3:
    case 0x3:
      sd.u.reg = w ? r3 : r3r1;
      sd.u.reg = w ? r3 : r3r1;
      break;
      break;
    case 0x4:
    case 0x4:
      sd.u.reg = w ? a0 : a1a0;
      sd.u.reg = w ? a0 : a1a0;
      break;
      break;
    case 0x5:
    case 0x5:
      sd.u.reg = w ? a1 : a1a0;
      sd.u.reg = w ? a1 : a1a0;
      break;
      break;
    case 0x6:
    case 0x6:
      sd.u.addr = get_reg (a0);
      sd.u.addr = get_reg (a0);
      break;
      break;
    case 0x7:
    case 0x7:
      sd.u.addr = get_reg (a1);
      sd.u.addr = get_reg (a1);
      break;
      break;
    case 0x8:
    case 0x8:
      sd.u.addr = get_reg (a0) + disp8 ();
      sd.u.addr = get_reg (a0) + disp8 ();
      break;
      break;
    case 0x9:
    case 0x9:
      sd.u.addr = get_reg (a1) + disp8 ();
      sd.u.addr = get_reg (a1) + disp8 ();
      break;
      break;
    case 0xa:
    case 0xa:
      sd.u.addr = get_reg (sb) + disp8 ();
      sd.u.addr = get_reg (sb) + disp8 ();
      break;
      break;
    case 0xb:
    case 0xb:
      sd.u.addr = get_reg (fb) + sign_ext (disp8 (), 8);
      sd.u.addr = get_reg (fb) + sign_ext (disp8 (), 8);
      break;
      break;
    case 0xc:
    case 0xc:
      sd.u.addr = get_reg (a0) + disp20 ();
      sd.u.addr = get_reg (a0) + disp20 ();
      break;
      break;
    case 0xd:
    case 0xd:
      sd.u.addr = get_reg (a1) + disp20 ();
      sd.u.addr = get_reg (a1) + disp20 ();
      break;
      break;
    case 0xe:
    case 0xe:
      sd.u.addr = get_reg (sb) + disp16 ();
      sd.u.addr = get_reg (sb) + disp16 ();
      break;
      break;
    case 0xf:
    case 0xf:
      sd.u.addr = disp16 ();
      sd.u.addr = disp16 ();
      break;
      break;
    default:
    default:
      abort ();
      abort ();
    }
    }
  if (sd.mem)
  if (sd.mem)
    sd.u.addr &= addr_mask;
    sd.u.addr &= addr_mask;
  return sd;
  return sd;
}
}
 
 
srcdest
srcdest
decode_dest3 (int destcode, int bw)
decode_dest3 (int destcode, int bw)
{
{
  static char map[8] = { -1, -1, -1, 1, 0, 10, 11, 15 };
  static char map[8] = { -1, -1, -1, 1, 0, 10, 11, 15 };
 
 
  the_bits = bits (destcode, 3);
  the_bits = bits (destcode, 3);
  return decode_srcdest4 (map[destcode], bw);
  return decode_srcdest4 (map[destcode], bw);
}
}
 
 
srcdest
srcdest
decode_src2 (int srccode, int bw, int d)
decode_src2 (int srccode, int bw, int d)
{
{
  static char map[4] = { 0, 10, 11, 15 };
  static char map[4] = { 0, 10, 11, 15 };
 
 
  the_bits = bits (srccode, 2);
  the_bits = bits (srccode, 2);
  return decode_srcdest4 (srccode ? map[srccode] : 1 - d, bw);
  return decode_srcdest4 (srccode ? map[srccode] : 1 - d, bw);
}
}
 
 
static struct
static struct
{
{
  reg_id b_regno;
  reg_id b_regno;
  reg_id w_regno;
  reg_id w_regno;
  int is_memory;
  int is_memory;
  int disp_bytes;
  int disp_bytes;
  char *name;
  char *name;
} modes23[] =
} modes23[] =
{
{
  {
  {
  a0, a0, 1, 0, "[A0]"}, /* 0 0 0 0 0 */
  a0, a0, 1, 0, "[A0]"}, /* 0 0 0 0 0 */
  {
  {
  a1, a1, 1, 0, "[A1]"}, /* 0 0 0 0 1 */
  a1, a1, 1, 0, "[A1]"}, /* 0 0 0 0 1 */
  {
  {
  a0, a0, 0, 0, "A0"},            /* 0 0 0 1 0 */
  a0, a0, 0, 0, "A0"},            /* 0 0 0 1 0 */
  {
  {
  a1, a1, 0, 0, "A1"},            /* 0 0 0 1 1 */
  a1, a1, 0, 0, "A1"},            /* 0 0 0 1 1 */
  {
  {
  a0, a0, 1, 1, "dsp:8[A0]"},   /* 0 0 1 0 0 */
  a0, a0, 1, 1, "dsp:8[A0]"},   /* 0 0 1 0 0 */
  {
  {
  a1, a1, 1, 1, "dsp:8[A1]"},   /* 0 0 1 0 1 */
  a1, a1, 1, 1, "dsp:8[A1]"},   /* 0 0 1 0 1 */
  {
  {
  sb, sb, 1, 1, "dsp:8[SB]"},   /* 0 0 1 1 0 */
  sb, sb, 1, 1, "dsp:8[SB]"},   /* 0 0 1 1 0 */
  {
  {
  fb, fb, 1, -1, "dsp:8[FB]"},  /* 0 0 1 1 1 */
  fb, fb, 1, -1, "dsp:8[FB]"},  /* 0 0 1 1 1 */
  {
  {
  a0, a0, 1, 2, "dsp:16[A0]"},  /* 0 1 0 0 0 */
  a0, a0, 1, 2, "dsp:16[A0]"},  /* 0 1 0 0 0 */
  {
  {
  a1, a1, 1, 2, "dsp:16[A1]"},  /* 0 1 0 0 1 */
  a1, a1, 1, 2, "dsp:16[A1]"},  /* 0 1 0 0 1 */
  {
  {
  sb, sb, 1, 2, "dsp:16[SB]"},  /* 0 1 0 1 0 */
  sb, sb, 1, 2, "dsp:16[SB]"},  /* 0 1 0 1 0 */
  {
  {
  fb, fb, 1, -2, "dsp:16[FB]"}, /* 0 1 0 1 1 */
  fb, fb, 1, -2, "dsp:16[FB]"}, /* 0 1 0 1 1 */
  {
  {
  a0, a0, 1, 3, "dsp:24[A0]"},  /* 0 1 1 0 0 */
  a0, a0, 1, 3, "dsp:24[A0]"},  /* 0 1 1 0 0 */
  {
  {
  a1, a1, 1, 3, "dsp:24[A1]"},  /* 0 1 1 0 1 */
  a1, a1, 1, 3, "dsp:24[A1]"},  /* 0 1 1 0 1 */
  {
  {
  mem, mem, 1, 3, "abs24"},     /* 0 1 1 1 0 */
  mem, mem, 1, 3, "abs24"},     /* 0 1 1 1 0 */
  {
  {
  mem, mem, 1, 2, "abs16"},     /* 0 1 1 1 1 */
  mem, mem, 1, 2, "abs16"},     /* 0 1 1 1 1 */
  {
  {
  r0h, r2, 0, 0, "R0H/R2"},       /* 1 0 0 0 0 */
  r0h, r2, 0, 0, "R0H/R2"},       /* 1 0 0 0 0 */
  {
  {
  r1h, r3, 0, 0, "R1H/R3"},       /* 1 0 0 0 1 */
  r1h, r3, 0, 0, "R1H/R3"},       /* 1 0 0 0 1 */
  {
  {
  r0l, r0, 0, 0, "R0L/R0"},       /* 1 0 0 1 0 */
  r0l, r0, 0, 0, "R0L/R0"},       /* 1 0 0 1 0 */
  {
  {
  r1l, r1, 0, 0, "R1L/R1"},       /* 1 0 0 1 1 */
  r1l, r1, 0, 0, "R1L/R1"},       /* 1 0 0 1 1 */
};
};
 
 
static srcdest
static srcdest
decode_sd23 (int bbb, int bb, int bytes, int ind, int add)
decode_sd23 (int bbb, int bb, int bytes, int ind, int add)
{
{
  srcdest sd;
  srcdest sd;
  int code = (bbb << 2) | bb;
  int code = (bbb << 2) | bb;
 
 
  if (code >= sizeof (modes23) / sizeof (modes23[0]))
  if (code >= sizeof (modes23) / sizeof (modes23[0]))
    abort ();
    abort ();
 
 
  if (trace)
  if (trace)
    {
    {
      char *b1 = "";
      char *b1 = "";
      char *b2 = "";
      char *b2 = "";
      char ad[30];
      char ad[30];
      if (ind)
      if (ind)
        {
        {
          b1 = "[";
          b1 = "[";
          b2 = "]";
          b2 = "]";
        }
        }
      if (add)
      if (add)
        sprintf (ad, "%+d", add);
        sprintf (ad, "%+d", add);
      else
      else
        ad[0] = 0;
        ad[0] = 0;
      if (!the_bits)
      if (!the_bits)
        the_bits = bits (code, 4);
        the_bits = bits (code, 4);
      printf ("decode: %s (%d) : %s%s%s%s\n", the_bits, code, b1,
      printf ("decode: %s (%d) : %s%s%s%s\n", the_bits, code, b1,
              modes23[code].name, ad, b2);
              modes23[code].name, ad, b2);
      the_bits = 0;
      the_bits = 0;
    }
    }
 
 
  sd.bytes = bytes;
  sd.bytes = bytes;
  sd.mem = modes23[code].is_memory;
  sd.mem = modes23[code].is_memory;
  if (sd.mem)
  if (sd.mem)
    {
    {
      if (modes23[code].w_regno == mem)
      if (modes23[code].w_regno == mem)
        sd.u.addr = 0;
        sd.u.addr = 0;
      else
      else
        sd.u.addr = get_reg (modes23[code].w_regno);
        sd.u.addr = get_reg (modes23[code].w_regno);
      switch (modes23[code].disp_bytes)
      switch (modes23[code].disp_bytes)
        {
        {
        case 1:
        case 1:
          sd.u.addr += disp8 ();
          sd.u.addr += disp8 ();
          break;
          break;
        case 2:
        case 2:
          sd.u.addr += disp16 ();
          sd.u.addr += disp16 ();
          break;
          break;
        case -1:
        case -1:
          sd.u.addr += sign_ext (disp8 (), 8);
          sd.u.addr += sign_ext (disp8 (), 8);
          break;
          break;
        case -2:
        case -2:
          sd.u.addr += sign_ext (disp16 (), 16);
          sd.u.addr += sign_ext (disp16 (), 16);
          break;
          break;
        case 3:
        case 3:
          sd.u.addr += disp24 ();
          sd.u.addr += disp24 ();
          break;
          break;
        default:
        default:
          break;
          break;
        }
        }
      if (add)
      if (add)
        sd.u.addr += add;
        sd.u.addr += add;
      if (ind)
      if (ind)
        sd.u.addr = mem_get_si (sd.u.addr & membus_mask);
        sd.u.addr = mem_get_si (sd.u.addr & membus_mask);
      sd.u.addr &= membus_mask;
      sd.u.addr &= membus_mask;
    }
    }
  else
  else
    {
    {
      sd.u.reg = (bytes > 1) ? modes23[code].w_regno : modes23[code].b_regno;
      sd.u.reg = (bytes > 1) ? modes23[code].w_regno : modes23[code].b_regno;
      if (bytes == 3 || bytes == 4)
      if (bytes == 3 || bytes == 4)
        {
        {
          switch (sd.u.reg)
          switch (sd.u.reg)
            {
            {
            case r0:
            case r0:
              sd.u.reg = r2r0;
              sd.u.reg = r2r0;
              break;
              break;
            case r1:
            case r1:
              sd.u.reg = r3r1;
              sd.u.reg = r3r1;
              break;
              break;
            case r2:
            case r2:
              abort ();
              abort ();
            case r3:
            case r3:
              abort ();
              abort ();
            default:;
            default:;
            }
            }
        }
        }
 
 
    }
    }
  return sd;
  return sd;
}
}
 
 
srcdest
srcdest
decode_dest23 (int ddd, int dd, int bytes)
decode_dest23 (int ddd, int dd, int bytes)
{
{
  return decode_sd23 (ddd, dd, bytes, dest_indirect, dest_addend);
  return decode_sd23 (ddd, dd, bytes, dest_indirect, dest_addend);
}
}
 
 
srcdest
srcdest
decode_src23 (int sss, int ss, int bytes)
decode_src23 (int sss, int ss, int bytes)
{
{
  return decode_sd23 (sss, ss, bytes, src_indirect, src_addend);
  return decode_sd23 (sss, ss, bytes, src_indirect, src_addend);
}
}
 
 
srcdest
srcdest
decode_dest2 (int dd, int bytes)
decode_dest2 (int dd, int bytes)
{
{
  /* r0l/r0, abs16, dsp:8[SB], dsp:8[FB] */
  /* r0l/r0, abs16, dsp:8[SB], dsp:8[FB] */
  static char map[4] = { 0x12, 0x0f, 0x06, 0x07 };
  static char map[4] = { 0x12, 0x0f, 0x06, 0x07 };
 
 
  the_bits = bits (dd, 2);
  the_bits = bits (dd, 2);
  return decode_sd23 (map[dd] >> 2, map[dd] & 3, bytes, dest_indirect,
  return decode_sd23 (map[dd] >> 2, map[dd] & 3, bytes, dest_indirect,
                      dest_addend);
                      dest_addend);
}
}
 
 
srcdest
srcdest
decode_src3 (int sss, int bytes)
decode_src3 (int sss, int bytes)
{
{
  /* r0, r1, a0, a1, r2, r3, N/A, N/A */
  /* r0, r1, a0, a1, r2, r3, N/A, N/A */
  static char map[8] = { 0x12, 0x13, 0x02, 0x03, 0x10, 0x11, 0, 0 };
  static char map[8] = { 0x12, 0x13, 0x02, 0x03, 0x10, 0x11, 0, 0 };
 
 
  the_bits = bits (sss, 3);
  the_bits = bits (sss, 3);
  return decode_sd23 (map[sss] >> 2, map[sss] & 3, bytes, src_indirect,
  return decode_sd23 (map[sss] >> 2, map[sss] & 3, bytes, src_indirect,
                      src_addend);
                      src_addend);
}
}
 
 
srcdest
srcdest
decode_dest1 (int destcode, int bw)
decode_dest1 (int destcode, int bw)
{
{
  the_bits = bits (destcode, 1);
  the_bits = bits (destcode, 1);
  return decode_srcdest4 (destcode, bw);
  return decode_srcdest4 (destcode, bw);
}
}
 
 
srcdest
srcdest
decode_cr (int crcode)
decode_cr (int crcode)
{
{
  static int regcode[] = { 0, intbl, intbh, flags, isp, sp, sb, fb };
  static int regcode[] = { 0, intbl, intbh, flags, isp, sp, sb, fb };
  srcdest sd;
  srcdest sd;
  sd.mem = 0;
  sd.mem = 0;
  sd.bytes = 2;
  sd.bytes = 2;
  sd.u.reg = regcode[crcode & 7];
  sd.u.reg = regcode[crcode & 7];
  return sd;
  return sd;
}
}
 
 
srcdest
srcdest
decode_cr_b (int crcode, int bank)
decode_cr_b (int crcode, int bank)
{
{
  /* FIXME: intbl, intbh, isp */
  /* FIXME: intbl, intbh, isp */
  static int regcode[3][8] = {
  static int regcode[3][8] = {
    {0, 0, flags, 0, 0, 0, 0, 0},
    {0, 0, flags, 0, 0, 0, 0, 0},
    {intb, sp, sb, fb, 0, 0, 0, isp},
    {intb, sp, sb, fb, 0, 0, 0, isp},
    {0, 0, 0, 0, 0, 0, 0, 0}
    {0, 0, 0, 0, 0, 0, 0, 0}
  };
  };
  srcdest sd;
  srcdest sd;
  sd.mem = 0;
  sd.mem = 0;
  sd.bytes = bank ? 3 : 2;
  sd.bytes = bank ? 3 : 2;
  sd.u.reg = regcode[bank][crcode & 7];
  sd.u.reg = regcode[bank][crcode & 7];
  return sd;
  return sd;
}
}
 
 
srcdest
srcdest
widen_sd (srcdest sd)
widen_sd (srcdest sd)
{
{
  sd.bytes *= 2;
  sd.bytes *= 2;
  if (!sd.mem)
  if (!sd.mem)
    switch (sd.u.reg)
    switch (sd.u.reg)
      {
      {
      case r0l:
      case r0l:
        sd.u.reg = r0;
        sd.u.reg = r0;
        break;
        break;
      case r0:
      case r0:
        sd.u.reg = r2r0;
        sd.u.reg = r2r0;
        break;
        break;
      case r1l:
      case r1l:
        sd.u.reg = r1;
        sd.u.reg = r1;
        break;
        break;
      case r1:
      case r1:
        sd.u.reg = r3r1;
        sd.u.reg = r3r1;
        break;
        break;
      case a0:
      case a0:
        if (A16)
        if (A16)
          sd.u.reg = a1a0;
          sd.u.reg = a1a0;
        break;
        break;
      default:
      default:
        break;
        break;
      }
      }
  return sd;
  return sd;
}
}
 
 
srcdest
srcdest
reg_sd (reg_id reg)
reg_sd (reg_id reg)
{
{
  srcdest rv;
  srcdest rv;
  rv.bytes = reg_bytes[reg];
  rv.bytes = reg_bytes[reg];
  rv.mem = 0;
  rv.mem = 0;
  rv.u.reg = reg;
  rv.u.reg = reg;
  return rv;
  return rv;
}
}
 
 
int
int
get_src (srcdest sd)
get_src (srcdest sd)
{
{
  int v;
  int v;
  if (sd.mem)
  if (sd.mem)
    {
    {
      switch (sd.bytes)
      switch (sd.bytes)
        {
        {
        case 1:
        case 1:
          v = mem_get_qi (sd.u.addr);
          v = mem_get_qi (sd.u.addr);
          break;
          break;
        case 2:
        case 2:
          v = mem_get_hi (sd.u.addr);
          v = mem_get_hi (sd.u.addr);
          break;
          break;
        case 3:
        case 3:
          v = mem_get_psi (sd.u.addr);
          v = mem_get_psi (sd.u.addr);
          break;
          break;
        case 4:
        case 4:
          v = mem_get_si (sd.u.addr);
          v = mem_get_si (sd.u.addr);
          break;
          break;
        default:
        default:
          abort ();
          abort ();
        }
        }
    }
    }
  else
  else
    {
    {
      v = get_reg (sd.u.reg);
      v = get_reg (sd.u.reg);
      switch (sd.bytes)
      switch (sd.bytes)
        {
        {
        case 1:
        case 1:
          v &= 0xff;
          v &= 0xff;
          break;
          break;
        case 2:
        case 2:
          v &= 0xffff;
          v &= 0xffff;
          break;
          break;
        case 3:
        case 3:
          v &= 0xffffff;
          v &= 0xffffff;
          break;
          break;
        }
        }
    }
    }
  return v;
  return v;
}
}
 
 
void
void
put_dest (srcdest sd, int v)
put_dest (srcdest sd, int v)
{
{
  if (sd.mem)
  if (sd.mem)
    {
    {
      switch (sd.bytes)
      switch (sd.bytes)
        {
        {
        case 1:
        case 1:
          mem_put_qi (sd.u.addr, v);
          mem_put_qi (sd.u.addr, v);
          break;
          break;
        case 2:
        case 2:
          mem_put_hi (sd.u.addr, v);
          mem_put_hi (sd.u.addr, v);
          break;
          break;
        case 3:
        case 3:
          mem_put_psi (sd.u.addr, v);
          mem_put_psi (sd.u.addr, v);
          break;
          break;
        case 4:
        case 4:
          mem_put_si (sd.u.addr, v);
          mem_put_si (sd.u.addr, v);
          break;
          break;
        }
        }
    }
    }
  else
  else
    {
    {
      switch (sd.bytes)
      switch (sd.bytes)
        {
        {
        case 1:
        case 1:
          v &= 0xff;
          v &= 0xff;
          break;
          break;
        case 2:
        case 2:
          v &= 0xffff;
          v &= 0xffff;
          break;
          break;
        case 3:
        case 3:
          v &= 0xffffff;
          v &= 0xffffff;
          break;
          break;
        }
        }
      put_reg (sd.u.reg, v);
      put_reg (sd.u.reg, v);
    }
    }
}
}
 
 
srcdest
srcdest
decode_bit (int destcode)
decode_bit (int destcode)
{
{
  srcdest sd;
  srcdest sd;
  int addr = 0;
  int addr = 0;
  static const char *dc_names[] = { "r0", "r1", "r2", "r3",
  static const char *dc_names[] = { "r0", "r1", "r2", "r3",
    "a0", "a1", "[a0]", "[a1]",
    "a0", "a1", "[a0]", "[a1]",
    "disp8[a0]", "disp8[a1]", "disp8[sb]", "disp8[fb]",
    "disp8[a0]", "disp8[a1]", "disp8[sb]", "disp8[fb]",
    "disp16[a0]", "disp16[a1]", "disp16[sb]", "abs16"
    "disp16[a0]", "disp16[a1]", "disp16[sb]", "abs16"
  };
  };
 
 
  if (trace)
  if (trace)
    {
    {
      const char *the_bits = bits (destcode, 4);
      const char *the_bits = bits (destcode, 4);
      printf ("decode: %s : %s\n", the_bits, dc_names[destcode]);
      printf ("decode: %s : %s\n", the_bits, dc_names[destcode]);
    }
    }
 
 
  switch (destcode)
  switch (destcode)
    {
    {
    case 0:
    case 0:
      sd.u.reg = r0;
      sd.u.reg = r0;
      break;
      break;
    case 1:
    case 1:
      sd.u.reg = r1;
      sd.u.reg = r1;
      break;
      break;
    case 2:
    case 2:
      sd.u.reg = r2;
      sd.u.reg = r2;
      break;
      break;
    case 3:
    case 3:
      sd.u.reg = r3;
      sd.u.reg = r3;
      break;
      break;
    case 4:
    case 4:
      sd.u.reg = a0;
      sd.u.reg = a0;
      break;
      break;
    case 5:
    case 5:
      sd.u.reg = a1;
      sd.u.reg = a1;
      break;
      break;
    case 6:
    case 6:
      addr = get_reg (a0);
      addr = get_reg (a0);
      break;
      break;
    case 7:
    case 7:
      addr = get_reg (a1);
      addr = get_reg (a1);
      break;
      break;
    case 8:
    case 8:
      addr = get_reg (a0) + disp8 ();
      addr = get_reg (a0) + disp8 ();
      break;
      break;
    case 9:
    case 9:
      addr = get_reg (a1) + disp8 ();
      addr = get_reg (a1) + disp8 ();
      break;
      break;
    case 10:
    case 10:
      addr = get_reg (sb) * 8 + disp8 ();
      addr = get_reg (sb) * 8 + disp8 ();
      break;
      break;
    case 11:
    case 11:
      addr = get_reg (fb) * 8 + sign_ext (disp8 (), 8);
      addr = get_reg (fb) * 8 + sign_ext (disp8 (), 8);
      break;
      break;
    case 12:
    case 12:
      addr = get_reg (a0) + disp16 ();
      addr = get_reg (a0) + disp16 ();
      break;
      break;
    case 13:
    case 13:
      addr = get_reg (a1) + disp16 ();
      addr = get_reg (a1) + disp16 ();
      break;
      break;
    case 14:
    case 14:
      addr = get_reg (sb) + disp16 ();
      addr = get_reg (sb) + disp16 ();
      break;
      break;
    case 15:
    case 15:
      addr = disp16 ();
      addr = disp16 ();
      break;
      break;
    }
    }
 
 
  if (destcode < 6)
  if (destcode < 6)
    {
    {
      int d = disp8 ();
      int d = disp8 ();
      sd.mem = 0;
      sd.mem = 0;
      sd.mask = 1 << (d & 0x0f);
      sd.mask = 1 << (d & 0x0f);
    }
    }
  else
  else
    {
    {
      addr &= addr_mask;
      addr &= addr_mask;
      sd.mem = 1;
      sd.mem = 1;
      sd.mask = 1 << (addr & 7);
      sd.mask = 1 << (addr & 7);
      sd.u.addr = addr >> 3;
      sd.u.addr = addr >> 3;
    }
    }
  return sd;
  return sd;
}
}
 
 
srcdest
srcdest
decode_bit11 (int op0)
decode_bit11 (int op0)
{
{
  srcdest sd;
  srcdest sd;
  sd.mask = 1 << (op0 & 7);
  sd.mask = 1 << (op0 & 7);
  sd.mem = 1;
  sd.mem = 1;
  sd.u.addr = get_reg (sb) + disp8 ();
  sd.u.addr = get_reg (sb) + disp8 ();
  return sd;
  return sd;
}
}
 
 
int
int
get_bit (srcdest sd)
get_bit (srcdest sd)
{
{
  int b;
  int b;
  if (sd.mem)
  if (sd.mem)
    b = mem_get_qi (sd.u.addr) & sd.mask;
    b = mem_get_qi (sd.u.addr) & sd.mask;
  else
  else
    b = get_reg (sd.u.reg) & sd.mask;
    b = get_reg (sd.u.reg) & sd.mask;
  return b ? 1 : 0;
  return b ? 1 : 0;
}
}
 
 
void
void
put_bit (srcdest sd, int val)
put_bit (srcdest sd, int val)
{
{
  int b;
  int b;
  if (sd.mem)
  if (sd.mem)
    b = mem_get_qi (sd.u.addr);
    b = mem_get_qi (sd.u.addr);
  else
  else
    b = get_reg (sd.u.reg);
    b = get_reg (sd.u.reg);
  if (val)
  if (val)
    b |= sd.mask;
    b |= sd.mask;
  else
  else
    b &= ~sd.mask;
    b &= ~sd.mask;
  if (sd.mem)
  if (sd.mem)
    mem_put_qi (sd.u.addr, b);
    mem_put_qi (sd.u.addr, b);
  else
  else
    put_reg (sd.u.reg, b);
    put_reg (sd.u.reg, b);
}
}
 
 
int
int
get_bit2 (srcdest sd, int bit)
get_bit2 (srcdest sd, int bit)
{
{
  int b;
  int b;
  if (sd.mem)
  if (sd.mem)
    b = mem_get_qi (sd.u.addr + (bit >> 3)) & (1 << (bit & 7));
    b = mem_get_qi (sd.u.addr + (bit >> 3)) & (1 << (bit & 7));
  else
  else
    b = get_reg (sd.u.reg) & (1 << bit);
    b = get_reg (sd.u.reg) & (1 << bit);
  return b ? 1 : 0;
  return b ? 1 : 0;
}
}
 
 
void
void
put_bit2 (srcdest sd, int bit, int val)
put_bit2 (srcdest sd, int bit, int val)
{
{
  int b;
  int b;
  if (sd.mem)
  if (sd.mem)
    b = mem_get_qi (sd.u.addr + (bit >> 3));
    b = mem_get_qi (sd.u.addr + (bit >> 3));
  else
  else
    b = get_reg (sd.u.reg);
    b = get_reg (sd.u.reg);
  if (val)
  if (val)
    b |= (1 << (bit & 7));
    b |= (1 << (bit & 7));
  else
  else
    b &= ~(1 << (bit & 7));
    b &= ~(1 << (bit & 7));
  if (sd.mem)
  if (sd.mem)
    mem_put_qi (sd.u.addr + (bit >> 3), b);
    mem_put_qi (sd.u.addr + (bit >> 3), b);
  else
  else
    put_reg (sd.u.reg, b);
    put_reg (sd.u.reg, b);
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.