Ignore:
Timestamp:
Aug 16, 2003, 6:59:22 PM (22 years ago)
Author:
bird
Message:

binutils v2.14 - offical sources.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/GNU/src/binutils/opcodes/cgen-opc.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r608 r609  
    2121
    2222#include "sysdep.h"
    23 #include <ctype.h>
    2423#include <stdio.h>
    2524#include "ansidecl.h"
    2625#include "libiberty.h"
     26#include "safe-ctype.h"
    2727#include "bfd.h"
    2828#include "symcat.h"
     
    7070      while (*p
    7171             && (*p == *n
    72                  || (isalpha ((unsigned char) *p)
    73                      && (tolower ((unsigned char) *p)
    74                          == tolower ((unsigned char) *n)))))
     72                 || (ISALPHA (*p) && (TOLOWER (*p) == TOLOWER (*n)))))
    7573        ++n, ++p;
    7674
     
    119117{
    120118  unsigned int hash;
     119  size_t i;
    121120
    122121  if (kt->name_hash_table == NULL)
     
    133132  if (ke->name[0] == 0)
    134133    kt->null_entry = ke;
     134
     135  for (i = 1; i < strlen (ke->name); i++)
     136    if (! ISALNUM (ke->name[i])
     137        && ! strchr (kt->nonalpha_chars, ke->name[i]))
     138      {
     139        size_t idx = strlen (kt->nonalpha_chars);
     140       
     141        /* If you hit this limit, please don't just
     142           increase the size of the field, instead
     143           look for a better algorithm.  */
     144        if (idx >= sizeof (kt->nonalpha_chars) - 1)
     145          abort ();
     146        kt->nonalpha_chars[idx] = ke->name[i];
     147        kt->nonalpha_chars[idx+1] = 0;
     148      }
    135149}
    136150
     
    217231  else
    218232    for (hash = 0; *name; ++name)
    219       hash = (hash * 97) + (unsigned char) tolower (*name);
     233      hash = (hash * 97) + (unsigned char) TOLOWER (*name);
    220234  return hash % kt->hash_table_size;
    221235}
     
    379393     int length;
    380394{
    381   bfd_get_bits (buf, length, cd->insn_endian == CGEN_ENDIAN_BIG);
     395  int big_p = (cd->insn_endian == CGEN_ENDIAN_BIG);
     396  int insn_chunk_bitsize = cd->insn_chunk_bitsize;
     397  CGEN_INSN_INT value = 0;
     398
     399  if (insn_chunk_bitsize != 0 && insn_chunk_bitsize < length)
     400    {
     401      /* We need to divide up the incoming value into insn_chunk_bitsize-length
     402         segments, and endian-convert them, one at a time. */
     403      int i;
     404
     405      /* Enforce divisibility. */
     406      if ((length % insn_chunk_bitsize) != 0)
     407        abort ();
     408
     409      for (i = 0; i < length; i += insn_chunk_bitsize) /* NB: i == bits */
     410        {
     411          int index;
     412          bfd_vma this_value;
     413          index = i; /* NB: not dependent on endianness; opposite of cgen_put_insn_value! */
     414          this_value = bfd_get_bits (& buf[index / 8], insn_chunk_bitsize, big_p);
     415          value = (value << insn_chunk_bitsize) | this_value;
     416        }
     417    }
     418  else
     419    {
     420      value = bfd_get_bits (buf, length, cd->insn_endian == CGEN_ENDIAN_BIG);
     421    }
     422
     423  return value;
    382424}
    383425
     
    391433     CGEN_INSN_INT value;
    392434{
    393   bfd_put_bits ((bfd_vma) value, buf, length,
    394                 cd->insn_endian == CGEN_ENDIAN_BIG);
     435  int big_p = (cd->insn_endian == CGEN_ENDIAN_BIG);
     436  int insn_chunk_bitsize = cd->insn_chunk_bitsize;
     437
     438  if (insn_chunk_bitsize != 0 && insn_chunk_bitsize < length)
     439    {
     440      /* We need to divide up the incoming value into insn_chunk_bitsize-length
     441         segments, and endian-convert them, one at a time. */
     442      int i;
     443
     444      /* Enforce divisibility. */
     445      if ((length % insn_chunk_bitsize) != 0)
     446        abort ();
     447
     448      for (i = 0; i < length; i += insn_chunk_bitsize) /* NB: i == bits */
     449        {
     450          int index;
     451          index = (length - insn_chunk_bitsize - i); /* NB: not dependent on endianness! */
     452          bfd_put_bits ((bfd_vma) value, & buf[index / 8], insn_chunk_bitsize, big_p);
     453          value >>= insn_chunk_bitsize;
     454        }
     455    }
     456  else
     457    {
     458      bfd_put_bits ((bfd_vma) value, buf, length, big_p);
     459    }
    395460}
    396461
Note: See TracChangeset for help on using the changeset viewer.