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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [binutils-2.18.50/] [cpu/] [mt.opc] - Diff between revs 156 and 816

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 156 Rev 816
/* Morpho Technologies mRISC opcode support, for GNU Binutils.  -*- C -*-
/* Morpho Technologies mRISC opcode support, for GNU Binutils.  -*- C -*-
   Copyright 2001, 2007, 2008 Free Software Foundation, Inc.
   Copyright 2001, 2007, 2008 Free Software Foundation, Inc.
   Contributed by Red Hat Inc; developed under contract from
   Contributed by Red Hat Inc; developed under contract from
   Morpho Technologies.
   Morpho Technologies.
   This file is part of the GNU Binutils.
   This file is part of the GNU Binutils.
   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, write to the Free Software
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */
   MA 02110-1301, USA.  */
/* Each section is delimited with start and end markers.
/* Each section is delimited with start and end markers.
   -opc.h additions use: "-- opc.h"
   -opc.h additions use: "-- opc.h"
   -opc.c additions use: "-- opc.c"
   -opc.c additions use: "-- opc.c"
   -asm.c additions use: "-- asm.c"
   -asm.c additions use: "-- asm.c"
   -dis.c additions use: "-- dis.c"
   -dis.c additions use: "-- dis.c"
   -ibd.h additions use: "-- ibd.h"  */
   -ibd.h additions use: "-- ibd.h"  */


/* -- opc.h */
/* -- opc.h */
/* Check applicability of instructions against machines.  */
/* Check applicability of instructions against machines.  */
#define CGEN_VALIDATE_INSN_SUPPORTED
#define CGEN_VALIDATE_INSN_SUPPORTED
/* Allows reason codes to be output when assembler errors occur.  */
/* Allows reason codes to be output when assembler errors occur.  */
#define CGEN_VERBOSE_ASSEMBLER_ERRORS
#define CGEN_VERBOSE_ASSEMBLER_ERRORS
/* Override disassembly hashing - there are variable bits in the top
/* Override disassembly hashing - there are variable bits in the top
   byte of these instructions.  */
   byte of these instructions.  */
#define CGEN_DIS_HASH_SIZE 8
#define CGEN_DIS_HASH_SIZE 8
#define CGEN_DIS_HASH(buf, value) (((* (unsigned char *) (buf)) >> 5) % CGEN_DIS_HASH_SIZE)
#define CGEN_DIS_HASH(buf, value) (((* (unsigned char *) (buf)) >> 5) % CGEN_DIS_HASH_SIZE)
#define CGEN_ASM_HASH_SIZE 127
#define CGEN_ASM_HASH_SIZE 127
#define CGEN_ASM_HASH(insn) mt_asm_hash (insn)
#define CGEN_ASM_HASH(insn) mt_asm_hash (insn)
extern unsigned int mt_asm_hash (const char *);
extern unsigned int mt_asm_hash (const char *);
extern int mt_cgen_insn_supported (CGEN_CPU_DESC, const CGEN_INSN *);
extern int mt_cgen_insn_supported (CGEN_CPU_DESC, const CGEN_INSN *);


/* -- opc.c */
/* -- opc.c */
#include "safe-ctype.h"
#include "safe-ctype.h"
/* Special check to ensure that instruction exists for given machine.  */
/* Special check to ensure that instruction exists for given machine.  */
int
int
mt_cgen_insn_supported (CGEN_CPU_DESC cd, const CGEN_INSN *insn)
mt_cgen_insn_supported (CGEN_CPU_DESC cd, const CGEN_INSN *insn)
{
{
  int machs = CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_MACH);
  int machs = CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_MACH);
  /* No mach attribute?  Assume it's supported for all machs.  */
  /* No mach attribute?  Assume it's supported for all machs.  */
  if (machs == 0)
  if (machs == 0)
    return 1;
    return 1;
  return ((machs & cd->machs) != 0);
  return ((machs & cd->machs) != 0);
}
}
/* A better hash function for instruction mnemonics.  */
/* A better hash function for instruction mnemonics.  */
unsigned int
unsigned int
mt_asm_hash (const char* insn)
mt_asm_hash (const char* insn)
{
{
  unsigned int hash;
  unsigned int hash;
  const char* m = insn;
  const char* m = insn;
  for (hash = 0; *m && ! ISSPACE (*m); m++)
  for (hash = 0; *m && ! ISSPACE (*m); m++)
    hash = (hash * 23) ^ (0x1F & TOLOWER (*m));
    hash = (hash * 23) ^ (0x1F & TOLOWER (*m));
  /* printf ("%s %d\n", insn, (hash % CGEN_ASM_HASH_SIZE)); */
  /* printf ("%s %d\n", insn, (hash % CGEN_ASM_HASH_SIZE)); */
  return hash % CGEN_ASM_HASH_SIZE;
  return hash % CGEN_ASM_HASH_SIZE;
}
}


/* -- asm.c */
/* -- asm.c */
/* Range checking for signed numbers.  Returns 0 if acceptable
/* Range checking for signed numbers.  Returns 0 if acceptable
   and 1 if the value is out of bounds for a signed quantity.  */
   and 1 if the value is out of bounds for a signed quantity.  */
static int
static int
signed_out_of_bounds (long val)
signed_out_of_bounds (long val)
{
{
  if ((val < -32768) || (val > 32767))
  if ((val < -32768) || (val > 32767))
    return 1;
    return 1;
  return 0;
  return 0;
}
}
static const char *
static const char *
parse_loopsize (CGEN_CPU_DESC cd,
parse_loopsize (CGEN_CPU_DESC cd,
                const char **strp,
                const char **strp,
                int opindex,
                int opindex,
                void *arg)
                void *arg)
{
{
  signed long * valuep = (signed long *) arg;
  signed long * valuep = (signed long *) arg;
  const char *errmsg;
  const char *errmsg;
  bfd_reloc_code_real_type code = BFD_RELOC_NONE;
  bfd_reloc_code_real_type code = BFD_RELOC_NONE;
  enum cgen_parse_operand_result result_type;
  enum cgen_parse_operand_result result_type;
  bfd_vma value;
  bfd_vma value;
  /* Is it a control transfer instructions?  */
  /* Is it a control transfer instructions?  */
  if (opindex == (CGEN_OPERAND_TYPE) MT_OPERAND_LOOPSIZE)
  if (opindex == (CGEN_OPERAND_TYPE) MT_OPERAND_LOOPSIZE)
    {
    {
      code = BFD_RELOC_MT_PCINSN8;
      code = BFD_RELOC_MT_PCINSN8;
      errmsg = cgen_parse_address (cd, strp, opindex, code,
      errmsg = cgen_parse_address (cd, strp, opindex, code,
                                   & result_type, & value);
                                   & result_type, & value);
      *valuep = value;
      *valuep = value;
      return errmsg;
      return errmsg;
    }
    }
  abort ();
  abort ();
}
}
static const char *
static const char *
parse_imm16 (CGEN_CPU_DESC cd,
parse_imm16 (CGEN_CPU_DESC cd,
             const char **strp,
             const char **strp,
             int opindex,
             int opindex,
             void *arg)
             void *arg)
{
{
  signed long * valuep = (signed long *) arg;
  signed long * valuep = (signed long *) arg;
  const char *errmsg;
  const char *errmsg;
  enum cgen_parse_operand_result result_type;
  enum cgen_parse_operand_result result_type;
  bfd_reloc_code_real_type code = BFD_RELOC_NONE;
  bfd_reloc_code_real_type code = BFD_RELOC_NONE;
  bfd_vma value;
  bfd_vma value;
  /* Is it a control transfer instructions?  */
  /* Is it a control transfer instructions?  */
  if (opindex == (CGEN_OPERAND_TYPE) MT_OPERAND_IMM16O)
  if (opindex == (CGEN_OPERAND_TYPE) MT_OPERAND_IMM16O)
    {
    {
      code = BFD_RELOC_16_PCREL;
      code = BFD_RELOC_16_PCREL;
      errmsg = cgen_parse_address (cd, strp, opindex, code,
      errmsg = cgen_parse_address (cd, strp, opindex, code,
                                   & result_type, & value);
                                   & result_type, & value);
      if (errmsg == NULL)
      if (errmsg == NULL)
        {
        {
          if (signed_out_of_bounds (value))
          if (signed_out_of_bounds (value))
            errmsg = _("Operand out of range. Must be between -32768 and 32767.");
            errmsg = _("Operand out of range. Must be between -32768 and 32767.");
        }
        }
      *valuep = value;
      *valuep = value;
      return errmsg;
      return errmsg;
    }
    }
  /* If it's not a control transfer instruction, then
  /* If it's not a control transfer instruction, then
     we have to check for %OP relocating operators.  */
     we have to check for %OP relocating operators.  */
  if (opindex == (CGEN_OPERAND_TYPE) MT_OPERAND_IMM16L)
  if (opindex == (CGEN_OPERAND_TYPE) MT_OPERAND_IMM16L)
    ;
    ;
  else if (strncmp (*strp, "%hi16", 5) == 0)
  else if (strncmp (*strp, "%hi16", 5) == 0)
    {
    {
      *strp += 5;
      *strp += 5;
      code = BFD_RELOC_HI16;
      code = BFD_RELOC_HI16;
    }
    }
  else if (strncmp (*strp, "%lo16", 5) == 0)
  else if (strncmp (*strp, "%lo16", 5) == 0)
    {
    {
      *strp += 5;
      *strp += 5;
      code = BFD_RELOC_LO16;
      code = BFD_RELOC_LO16;
    }
    }
  /* If we found a %OP relocating operator, then parse it as an address.
  /* If we found a %OP relocating operator, then parse it as an address.
     If not, we need to parse it as an integer, either signed or unsigned
     If not, we need to parse it as an integer, either signed or unsigned
     depending on which operand type we have.  */
     depending on which operand type we have.  */
  if (code != BFD_RELOC_NONE)
  if (code != BFD_RELOC_NONE)
    {
    {
       /* %OP relocating operator found.  */
       /* %OP relocating operator found.  */
       errmsg = cgen_parse_address (cd, strp, opindex, code,
       errmsg = cgen_parse_address (cd, strp, opindex, code,
                                   & result_type, & value);
                                   & result_type, & value);
       if (errmsg == NULL)
       if (errmsg == NULL)
         {
         {
           switch (result_type)
           switch (result_type)
             {
             {
             case (CGEN_PARSE_OPERAND_RESULT_NUMBER):
             case (CGEN_PARSE_OPERAND_RESULT_NUMBER):
               if (code == BFD_RELOC_HI16)
               if (code == BFD_RELOC_HI16)
                 value = (value >> 16) & 0xFFFF;
                 value = (value >> 16) & 0xFFFF;
               else if (code == BFD_RELOC_LO16)
               else if (code == BFD_RELOC_LO16)
                 value = value  & 0xFFFF;
                 value = value  & 0xFFFF;
               else
               else
                 errmsg = _("Biiiig Trouble in parse_imm16!");
                 errmsg = _("Biiiig Trouble in parse_imm16!");
               break;
               break;
             case (CGEN_PARSE_OPERAND_RESULT_QUEUED):
             case (CGEN_PARSE_OPERAND_RESULT_QUEUED):
               /* No special processing for this case.  */
               /* No special processing for this case.  */
               break;
               break;
             default:
             default:
               errmsg = _("The percent-operator's operand is not a symbol");
               errmsg = _("The percent-operator's operand is not a symbol");
               break;
               break;
             }
             }
         }
         }
       *valuep = value;
       *valuep = value;
    }
    }
  else
  else
    {
    {
      /* Parse hex values like 0xffff as unsigned, and sign extend
      /* Parse hex values like 0xffff as unsigned, and sign extend
         them manually.  */
         them manually.  */
      int parse_signed = (opindex == (CGEN_OPERAND_TYPE)MT_OPERAND_IMM16);
      int parse_signed = (opindex == (CGEN_OPERAND_TYPE)MT_OPERAND_IMM16);
      if ((*strp)[0] == '0'
      if ((*strp)[0] == '0'
          && ((*strp)[1] == 'x' || (*strp)[1] == 'X'))
          && ((*strp)[1] == 'x' || (*strp)[1] == 'X'))
        parse_signed = 0;
        parse_signed = 0;
      /* No relocating operator.  Parse as an number.  */
      /* No relocating operator.  Parse as an number.  */
      if (parse_signed)
      if (parse_signed)
        {
        {
          /* Parse as as signed integer.  */
          /* Parse as as signed integer.  */
          errmsg = cgen_parse_signed_integer (cd, strp, opindex, valuep);
          errmsg = cgen_parse_signed_integer (cd, strp, opindex, valuep);
          if (errmsg == NULL)
          if (errmsg == NULL)
            {
            {
#if 0
#if 0
              /* Manual range checking is needed for the signed case.  */
              /* Manual range checking is needed for the signed case.  */
              if (*valuep & 0x8000)
              if (*valuep & 0x8000)
                value = 0xffff0000 | *valuep;
                value = 0xffff0000 | *valuep;
              else
              else
                value = *valuep;
                value = *valuep;
              if (signed_out_of_bounds (value))
              if (signed_out_of_bounds (value))
                errmsg = _("Operand out of range. Must be between -32768 and 32767.");
                errmsg = _("Operand out of range. Must be between -32768 and 32767.");
              /* Truncate to 16 bits. This is necessary
              /* Truncate to 16 bits. This is necessary
                 because cgen will have sign extended *valuep.  */
                 because cgen will have sign extended *valuep.  */
              *valuep &= 0xFFFF;
              *valuep &= 0xFFFF;
#endif
#endif
            }
            }
        }
        }
      else
      else
        {
        {
          /* MT_OPERAND_IMM16Z.  Parse as an unsigned integer.  */
          /* MT_OPERAND_IMM16Z.  Parse as an unsigned integer.  */
          errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, (unsigned long *) valuep);
          errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, (unsigned long *) valuep);
          if (opindex == (CGEN_OPERAND_TYPE) MT_OPERAND_IMM16
          if (opindex == (CGEN_OPERAND_TYPE) MT_OPERAND_IMM16
              && *valuep >= 0x8000
              && *valuep >= 0x8000
              && *valuep <= 0xffff)
              && *valuep <= 0xffff)
            *valuep -= 0x10000;
            *valuep -= 0x10000;
        }
        }
    }
    }
  return errmsg;
  return errmsg;
}
}
static const char *
static const char *
parse_dup (CGEN_CPU_DESC cd,
parse_dup (CGEN_CPU_DESC cd,
           const char **strp,
           const char **strp,
           int opindex,
           int opindex,
           unsigned long *valuep)
           unsigned long *valuep)
{
{
  const char *errmsg = NULL;
  const char *errmsg = NULL;
  if (strncmp (*strp, "dup", 3) == 0 || strncmp (*strp, "DUP", 3) == 0)
  if (strncmp (*strp, "dup", 3) == 0 || strncmp (*strp, "DUP", 3) == 0)
    {
    {
      *strp += 3;
      *strp += 3;
      *valuep = 1;
      *valuep = 1;
    }
    }
  else if (strncmp (*strp, "xx", 2) == 0 || strncmp (*strp, "XX", 2) == 0)
  else if (strncmp (*strp, "xx", 2) == 0 || strncmp (*strp, "XX", 2) == 0)
    {
    {
      *strp += 2;
      *strp += 2;
      *valuep = 0;
      *valuep = 0;
    }
    }
  else
  else
    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
  return errmsg;
  return errmsg;
}
}
static const char *
static const char *
parse_ball (CGEN_CPU_DESC cd,
parse_ball (CGEN_CPU_DESC cd,
            const char **strp,
            const char **strp,
            int opindex,
            int opindex,
            unsigned long *valuep)
            unsigned long *valuep)
{
{
  const char *errmsg = NULL;
  const char *errmsg = NULL;
  if (strncmp (*strp, "all", 3) == 0 || strncmp (*strp, "ALL", 3) == 0)
  if (strncmp (*strp, "all", 3) == 0 || strncmp (*strp, "ALL", 3) == 0)
    {
    {
      *strp += 3;
      *strp += 3;
      *valuep = 1;
      *valuep = 1;
    }
    }
  else if (strncmp (*strp, "one", 3) == 0 || strncmp (*strp, "ONE", 3) == 0)
  else if (strncmp (*strp, "one", 3) == 0 || strncmp (*strp, "ONE", 3) == 0)
    {
    {
      *strp += 3;
      *strp += 3;
      *valuep = 0;
      *valuep = 0;
    }
    }
  else
  else
    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
  return errmsg;
  return errmsg;
}
}
static const char *
static const char *
parse_xmode (CGEN_CPU_DESC cd,
parse_xmode (CGEN_CPU_DESC cd,
             const char **strp,
             const char **strp,
             int opindex,
             int opindex,
             unsigned long *valuep)
             unsigned long *valuep)
{
{
  const char *errmsg = NULL;
  const char *errmsg = NULL;
  if (strncmp (*strp, "pm", 2) == 0 || strncmp (*strp, "PM", 2) == 0)
  if (strncmp (*strp, "pm", 2) == 0 || strncmp (*strp, "PM", 2) == 0)
    {
    {
      *strp += 2;
      *strp += 2;
      *valuep = 1;
      *valuep = 1;
    }
    }
  else if (strncmp (*strp, "xm", 2) == 0 || strncmp (*strp, "XM", 2) == 0)
  else if (strncmp (*strp, "xm", 2) == 0 || strncmp (*strp, "XM", 2) == 0)
    {
    {
      *strp += 2;
      *strp += 2;
      *valuep = 0;
      *valuep = 0;
    }
    }
  else
  else
    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
  return errmsg;
  return errmsg;
}
}
static const char *
static const char *
parse_rc (CGEN_CPU_DESC cd,
parse_rc (CGEN_CPU_DESC cd,
          const char **strp,
          const char **strp,
          int opindex,
          int opindex,
          unsigned long *valuep)
          unsigned long *valuep)
{
{
  const char *errmsg = NULL;
  const char *errmsg = NULL;
  if (strncmp (*strp, "r", 1) == 0 || strncmp (*strp, "R", 1) == 0)
  if (strncmp (*strp, "r", 1) == 0 || strncmp (*strp, "R", 1) == 0)
    {
    {
      *strp += 1;
      *strp += 1;
      *valuep = 1;
      *valuep = 1;
    }
    }
  else if (strncmp (*strp, "c", 1) == 0 || strncmp (*strp, "C", 1) == 0)
  else if (strncmp (*strp, "c", 1) == 0 || strncmp (*strp, "C", 1) == 0)
    {
    {
      *strp += 1;
      *strp += 1;
      *valuep = 0;
      *valuep = 0;
    }
    }
  else
  else
    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
  return errmsg;
  return errmsg;
}
}
static const char *
static const char *
parse_cbrb (CGEN_CPU_DESC cd,
parse_cbrb (CGEN_CPU_DESC cd,
            const char **strp,
            const char **strp,
            int opindex,
            int opindex,
            unsigned long *valuep)
            unsigned long *valuep)
{
{
  const char *errmsg = NULL;
  const char *errmsg = NULL;
  if (strncmp (*strp, "rb", 2) == 0 || strncmp (*strp, "RB", 2) == 0)
  if (strncmp (*strp, "rb", 2) == 0 || strncmp (*strp, "RB", 2) == 0)
    {
    {
      *strp += 2;
      *strp += 2;
      *valuep = 1;
      *valuep = 1;
    }
    }
  else if (strncmp (*strp, "cb", 2) == 0 || strncmp (*strp, "CB", 2) == 0)
  else if (strncmp (*strp, "cb", 2) == 0 || strncmp (*strp, "CB", 2) == 0)
    {
    {
      *strp += 2;
      *strp += 2;
      *valuep = 0;
      *valuep = 0;
    }
    }
  else
  else
    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
  return errmsg;
  return errmsg;
}
}
static const char *
static const char *
parse_rbbc (CGEN_CPU_DESC cd,
parse_rbbc (CGEN_CPU_DESC cd,
            const char **strp,
            const char **strp,
            int opindex,
            int opindex,
            unsigned long *valuep)
            unsigned long *valuep)
{
{
  const char *errmsg = NULL;
  const char *errmsg = NULL;
  if (strncmp (*strp, "rt", 2) == 0 || strncmp (*strp, "RT", 2) == 0)
  if (strncmp (*strp, "rt", 2) == 0 || strncmp (*strp, "RT", 2) == 0)
    {
    {
      *strp += 2;
      *strp += 2;
      *valuep = 0;
      *valuep = 0;
    }
    }
  else if (strncmp (*strp, "br1", 3) == 0 || strncmp (*strp, "BR1", 3) == 0)
  else if (strncmp (*strp, "br1", 3) == 0 || strncmp (*strp, "BR1", 3) == 0)
    {
    {
      *strp += 3;
      *strp += 3;
      *valuep = 1;
      *valuep = 1;
    }
    }
  else if (strncmp (*strp, "br2", 3) == 0 || strncmp (*strp, "BR2", 3) == 0)
  else if (strncmp (*strp, "br2", 3) == 0 || strncmp (*strp, "BR2", 3) == 0)
    {
    {
      *strp += 3;
      *strp += 3;
      *valuep = 2;
      *valuep = 2;
    }
    }
  else if (strncmp (*strp, "cs", 2) == 0 || strncmp (*strp, "CS", 2) == 0)
  else if (strncmp (*strp, "cs", 2) == 0 || strncmp (*strp, "CS", 2) == 0)
    {
    {
      *strp += 2;
      *strp += 2;
      *valuep = 3;
      *valuep = 3;
    }
    }
  else
  else
    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
  return errmsg;
  return errmsg;
}
}
static const char *
static const char *
parse_type (CGEN_CPU_DESC cd,
parse_type (CGEN_CPU_DESC cd,
            const char **strp,
            const char **strp,
            int opindex,
            int opindex,
            unsigned long *valuep)
            unsigned long *valuep)
{
{
  const char *errmsg = NULL;
  const char *errmsg = NULL;
  if (strncmp (*strp, "odd", 3) == 0 || strncmp (*strp, "ODD", 3) == 0)
  if (strncmp (*strp, "odd", 3) == 0 || strncmp (*strp, "ODD", 3) == 0)
    {
    {
      *strp += 3;
      *strp += 3;
      *valuep = 0;
      *valuep = 0;
    }
    }
  else if (strncmp (*strp, "even", 4) == 0 || strncmp (*strp, "EVEN", 4) == 0)
  else if (strncmp (*strp, "even", 4) == 0 || strncmp (*strp, "EVEN", 4) == 0)
    {
    {
      *strp += 4;
      *strp += 4;
      *valuep = 1;
      *valuep = 1;
    }
    }
  else if (strncmp (*strp, "oe", 2) == 0 || strncmp (*strp, "OE", 2) == 0)
  else if (strncmp (*strp, "oe", 2) == 0 || strncmp (*strp, "OE", 2) == 0)
    {
    {
      *strp += 2;
      *strp += 2;
      *valuep = 2;
      *valuep = 2;
    }
    }
  else
  else
    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
    errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
 if ((errmsg == NULL) && (*valuep == 3))
 if ((errmsg == NULL) && (*valuep == 3))
    errmsg = _("invalid operand.  type may have values 0,1,2 only.");
    errmsg = _("invalid operand.  type may have values 0,1,2 only.");
  return errmsg;
  return errmsg;
}
}
/* -- dis.c */
/* -- dis.c */
static void print_dollarhex (CGEN_CPU_DESC, PTR, long, unsigned, bfd_vma, int);
static void print_dollarhex (CGEN_CPU_DESC, PTR, long, unsigned, bfd_vma, int);
static void print_pcrel (CGEN_CPU_DESC, PTR, long, unsigned, bfd_vma, int);
static void print_pcrel (CGEN_CPU_DESC, PTR, long, unsigned, bfd_vma, int);
static void
static void
print_dollarhex (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
print_dollarhex (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
                 void * dis_info,
                 void * dis_info,
                 long value,
                 long value,
                 unsigned int attrs ATTRIBUTE_UNUSED,
                 unsigned int attrs ATTRIBUTE_UNUSED,
                 bfd_vma pc ATTRIBUTE_UNUSED,
                 bfd_vma pc ATTRIBUTE_UNUSED,
                 int length ATTRIBUTE_UNUSED)
                 int length ATTRIBUTE_UNUSED)
{
{
  disassemble_info *info = (disassemble_info *) dis_info;
  disassemble_info *info = (disassemble_info *) dis_info;
  info->fprintf_func (info->stream, "$%lx", value);
  info->fprintf_func (info->stream, "$%lx", value);
  if (0)
  if (0)
    print_normal (cd, dis_info, value, attrs, pc, length);
    print_normal (cd, dis_info, value, attrs, pc, length);
}
}
static void
static void
print_pcrel (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
print_pcrel (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
             void * dis_info,
             void * dis_info,
             long value,
             long value,
             unsigned int attrs ATTRIBUTE_UNUSED,
             unsigned int attrs ATTRIBUTE_UNUSED,
             bfd_vma pc ATTRIBUTE_UNUSED,
             bfd_vma pc ATTRIBUTE_UNUSED,
             int length ATTRIBUTE_UNUSED)
             int length ATTRIBUTE_UNUSED)
{
{
  print_address (cd, dis_info, value + pc, attrs, pc, length);
  print_address (cd, dis_info, value + pc, attrs, pc, length);
}
}
/* -- */
/* -- */
 
 

powered by: WebSVN 2.1.0

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