Back to index

cell-binutils  2.17cvs20070401
Functions
cgen-asm.c File Reference
#include "sysdep.h"
#include <stdio.h>
#include "ansidecl.h"
#include "libiberty.h"
#include "safe-ctype.h"
#include "bfd.h"
#include "symcat.h"
#include "opcode/cgen.h"
#include "opintl.h"

Go to the source code of this file.

Functions

static CGEN_INSN_LISThash_insn_array (CGEN_CPU_DESC, const CGEN_INSN *, int, int, CGEN_INSN_LIST **, CGEN_INSN_LIST *)
static CGEN_INSN_LISThash_insn_list (CGEN_CPU_DESC, const CGEN_INSN_LIST *, CGEN_INSN_LIST **, CGEN_INSN_LIST *)
static void build_asm_hash_table (CGEN_CPU_DESC)
void cgen_set_parse_operand_fn (CGEN_CPU_DESC cd, cgen_parse_operand_fn fn)
void cgen_init_parse_operand (CGEN_CPU_DESC cd)
static CGEN_INSN_LISThash_insn_array (CGEN_CPU_DESC cd, const CGEN_INSN *insns, int count, int entsize ATTRIBUTE_UNUSED, CGEN_INSN_LIST **htable, CGEN_INSN_LIST *hentbuf)
CGEN_INSN_LISTcgen_asm_lookup_insn (CGEN_CPU_DESC cd, const char *insn)
const char * cgen_parse_keyword (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, const char **strp, CGEN_KEYWORD *keyword_table, long *valuep)
const char * cgen_parse_signed_integer (CGEN_CPU_DESC cd, const char **strp, int opindex, long *valuep)
const char * cgen_parse_unsigned_integer (CGEN_CPU_DESC cd, const char **strp, int opindex, unsigned long *valuep)
const char * cgen_parse_address (CGEN_CPU_DESC cd, const char **strp, int opindex, int opinfo, enum cgen_parse_operand_result *resultp, bfd_vma *valuep)
const char * cgen_validate_signed_integer (long value, long min, long max)
const char * cgen_validate_unsigned_integer (unsigned long value, unsigned long min, unsigned long max)

Function Documentation

static void build_asm_hash_table ( CGEN_CPU_DESC  cd) [static]

Definition at line 122 of file cgen-asm.c.

{
  int count = cgen_insn_count (cd) + cgen_macro_insn_count (cd);
  CGEN_INSN_TABLE *insn_table = &cd->insn_table;
  CGEN_INSN_TABLE *macro_insn_table = &cd->macro_insn_table;
  unsigned int hash_size = cd->asm_hash_size;
  CGEN_INSN_LIST *hash_entry_buf;
  CGEN_INSN_LIST **asm_hash_table;
  CGEN_INSN_LIST *asm_hash_table_entries;

  /* The space allocated for the hash table consists of two parts:
     the hash table and the hash lists.  */

  asm_hash_table = (CGEN_INSN_LIST **)
    xmalloc (hash_size * sizeof (CGEN_INSN_LIST *));
  memset (asm_hash_table, 0, hash_size * sizeof (CGEN_INSN_LIST *));
  asm_hash_table_entries = hash_entry_buf = (CGEN_INSN_LIST *)
    xmalloc (count * sizeof (CGEN_INSN_LIST));

  /* Add compiled in insns.
     Don't include the first one as it is a reserved entry.  */
  /* ??? It was the end of all hash chains, and also the special
     "invalid insn" marker.  May be able to do it differently now.  */

  hash_entry_buf = hash_insn_array (cd,
                                insn_table->init_entries + 1,
                                insn_table->num_init_entries - 1,
                                insn_table->entry_size,
                                asm_hash_table, hash_entry_buf);

  /* Add compiled in macro-insns.  */

  hash_entry_buf = hash_insn_array (cd, macro_insn_table->init_entries,
                                macro_insn_table->num_init_entries,
                                macro_insn_table->entry_size,
                                asm_hash_table, hash_entry_buf);

  /* Add runtime added insns.
     Later added insns will be prefered over earlier ones.  */

  hash_entry_buf = hash_insn_list (cd, insn_table->new_entries,
                               asm_hash_table, hash_entry_buf);

  /* Add runtime added macro-insns.  */

  hash_insn_list (cd, macro_insn_table->new_entries,
                asm_hash_table, hash_entry_buf);

  cd->asm_hash_table = asm_hash_table;
  cd->asm_hash_table_entries = asm_hash_table_entries;
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 177 of file cgen-asm.c.

{
  unsigned int hash;

  if (cd->asm_hash_table == NULL)
    build_asm_hash_table (cd);

  hash = (* cd->asm_hash) (insn);
  return cd->asm_hash_table[hash];
}

Here is the call graph for this function:

Definition at line 47 of file cgen-asm.c.

{
  /* This tells the callback to re-initialize.  */
  (void) (* cd->parse_operand_fn)
    (cd, CGEN_PARSE_OPERAND_INIT, NULL, 0, 0, NULL, NULL);
}

Here is the caller graph for this function:

const char* cgen_parse_address ( CGEN_CPU_DESC  cd,
const char **  strp,
int  opindex,
int  opinfo,
enum cgen_parse_operand_result resultp,
bfd_vma valuep 
)

Definition at line 302 of file cgen-asm.c.

{
  bfd_vma value;
  enum cgen_parse_operand_result result_type;
  const char *errmsg;

  errmsg = (* cd->parse_operand_fn)
    (cd, CGEN_PARSE_OPERAND_ADDRESS, strp, opindex, opinfo,
     &result_type, &value);
  /* FIXME: Examine `result'.  */
  if (!errmsg)
    {
      if (resultp != NULL)
       *resultp = result_type;
      *valuep = value;
    }
  return errmsg;
}

Here is the caller graph for this function:

const char* cgen_parse_keyword ( CGEN_CPU_DESC cd  ATTRIBUTE_UNUSED,
const char **  strp,
CGEN_KEYWORD keyword_table,
long valuep 
)

Definition at line 197 of file cgen-asm.c.

{
  const CGEN_KEYWORD_ENTRY *ke;
  char buf[256];
  const char *p,*start;

  if (keyword_table->name_hash_table == NULL)
    (void) cgen_keyword_search_init (keyword_table, NULL);

  p = start = *strp;

  /* Allow any first character.  This is to make life easier for
     the fairly common case of suffixes, eg. 'ld.b.w', where the first
     character of the suffix ('.') is special.  */
  if (*p)
    ++p;
  
  /* Allow letters, digits, and any special characters.  */
  while (((p - start) < (int) sizeof (buf))
        && *p
        && (ISALNUM (*p)
            || *p == '_'
            || strchr (keyword_table->nonalpha_chars, *p)))
    ++p;

  if (p - start >= (int) sizeof (buf))
    {
      /* All non-empty CGEN keywords can fit into BUF.  The only thing
        we can match here is the empty keyword.  */
      buf[0] = 0;
    }
  else
    {
      memcpy (buf, start, p - start);
      buf[p - start] = 0;
    }

  ke = cgen_keyword_lookup_name (keyword_table, buf);

  if (ke != NULL)
    {
      *valuep = ke->value;
      /* Don't advance pointer if we recognized the null keyword.  */
      if (ke->name[0] != 0)
       *strp = p;
      return NULL;
    }

  return "unrecognized keyword/register name";
}

Here is the call graph for this function:

const char* cgen_parse_signed_integer ( CGEN_CPU_DESC  cd,
const char **  strp,
int  opindex,
long valuep 
)

Definition at line 257 of file cgen-asm.c.

{
  bfd_vma value;
  enum cgen_parse_operand_result result;
  const char *errmsg;

  errmsg = (* cd->parse_operand_fn)
    (cd, CGEN_PARSE_OPERAND_INTEGER, strp, opindex, BFD_RELOC_NONE,
     &result, &value);
  /* FIXME: Examine `result'.  */
  if (!errmsg)
    *valuep = value;
  return errmsg;
}

Here is the caller graph for this function:

const char* cgen_parse_unsigned_integer ( CGEN_CPU_DESC  cd,
const char **  strp,
int  opindex,
unsigned long valuep 
)

Definition at line 281 of file cgen-asm.c.

{
  bfd_vma value;
  enum cgen_parse_operand_result result;
  const char *errmsg;

  errmsg = (* cd->parse_operand_fn)
    (cd, CGEN_PARSE_OPERAND_INTEGER, strp, opindex, BFD_RELOC_NONE,
     &result, &value);
  /* FIXME: Examine `result'.  */
  if (!errmsg)
    *valuep = value;
  return errmsg;
}

Here is the caller graph for this function:

Definition at line 39 of file cgen-asm.c.

{
  cd->parse_operand_fn = fn;
}

Here is the call graph for this function:

Here is the caller graph for this function:

const char* cgen_validate_signed_integer ( long  value,
long  min,
long  max 
)

Definition at line 329 of file cgen-asm.c.

{
  if (value < min || value > max)
    {
      static char buf[100];

      /* xgettext:c-format */
      sprintf (buf, _("operand out of range (%ld not between %ld and %ld)"),
                    value, min, max);
      return buf;
    }

  return NULL;
}

Definition at line 349 of file cgen-asm.c.

{
  if (value < min || value > max)
    {
      static char buf[100];

      /* xgettext:c-format */
      sprintf (buf, _("operand out of range (%lu not between %lu and %lu)"),
              value, min, max);
      return buf;
    }

  return NULL;
}
static CGEN_INSN_LIST* hash_insn_array ( CGEN_CPU_DESC  ,
const CGEN_INSN *  ,
int  ,
int  ,
CGEN_INSN_LIST **  ,
CGEN_INSN_LIST  
) [static]

Here is the caller graph for this function:

static CGEN_INSN_LIST* hash_insn_array ( CGEN_CPU_DESC  cd,
const CGEN_INSN *  insns,
int  count,
int entsize  ATTRIBUTE_UNUSED,
CGEN_INSN_LIST **  htable,
CGEN_INSN_LIST hentbuf 
) [static]

Definition at line 67 of file cgen-asm.c.

{
  int i;

  for (i = count - 1; i >= 0; --i, ++hentbuf)
    {
      unsigned int hash;
      const CGEN_INSN *insn = &insns[i];

      if (! (* cd->asm_hash_p) (insn))
       continue;
      hash = (* cd->asm_hash) (CGEN_INSN_MNEMONIC (insn));
      hentbuf->next = htable[hash];
      hentbuf->insn = insn;
      htable[hash] = hentbuf;
    }

  return hentbuf;
}
static CGEN_INSN_LIST * hash_insn_list ( CGEN_CPU_DESC  cd,
const CGEN_INSN_LIST insns,
CGEN_INSN_LIST **  htable,
CGEN_INSN_LIST hentbuf 
) [static]

Definition at line 97 of file cgen-asm.c.

{
  const CGEN_INSN_LIST *ilist;

  for (ilist = insns; ilist != NULL; ilist = ilist->next, ++ hentbuf)
    {
      unsigned int hash;

      if (! (* cd->asm_hash_p) (ilist->insn))
       continue;
      hash = (* cd->asm_hash) (CGEN_INSN_MNEMONIC (ilist->insn));
      hentbuf->next = htable[hash];
      hentbuf->insn = ilist->insn;
      htable[hash] = hentbuf;
    }

  return hentbuf;
}

Here is the caller graph for this function: