Home | History | Annotate | Line # | Download | only in config
tc-bfin.c revision 1.1.1.7
      1 /* tc-bfin.c -- Assembler for the ADI Blackfin.
      2    Copyright (C) 2005-2024 Free Software Foundation, Inc.
      3 
      4    This file is part of GAS, the GNU Assembler.
      5 
      6    GAS is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3, or (at your option)
      9    any later version.
     10 
     11    GAS is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with GAS; see the file COPYING.  If not, write to the Free
     18    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
     19    02110-1301, USA.  */
     20 
     21 #include "as.h"
     22 #include "bfin-defs.h"
     23 #include "obstack.h"
     24 #include "safe-ctype.h"
     25 #ifdef OBJ_ELF
     26 #include "dwarf2dbg.h"
     27 #endif
     28 #include "elf/common.h"
     29 #include "elf/bfin.h"
     30 
     31 extern int yyparse (void);
     32 struct yy_buffer_state;
     33 typedef struct yy_buffer_state *YY_BUFFER_STATE;
     34 extern YY_BUFFER_STATE yy_scan_string (const char *yy_str);
     35 extern void yy_delete_buffer (YY_BUFFER_STATE b);
     36 static parse_state parse (char *line);
     37 
     38 /* Global variables. */
     39 struct bfin_insn *insn;
     40 int last_insn_size;
     41 
     42 extern struct obstack mempool;
     43 FILE *errorf;
     44 
     45 /* Flags to set in the elf header */
     46 #define DEFAULT_FLAGS 0
     47 
     48 #ifdef OBJ_FDPIC_ELF
     49 # define DEFAULT_FDPIC EF_BFIN_FDPIC
     50 #else
     51 # define DEFAULT_FDPIC 0
     52 #endif
     53 
     54 static flagword bfin_flags = DEFAULT_FLAGS | DEFAULT_FDPIC;
     55 static const char *bfin_pic_flag = DEFAULT_FDPIC ? "-mfdpic" : (const char *)0;
     56 
     57 /* Blackfin specific function to handle FD-PIC pointer initializations.  */
     58 
     59 static void
     60 bfin_pic_ptr (int nbytes)
     61 {
     62   expressionS exp;
     63   char *p;
     64 
     65   if (nbytes != 4)
     66     abort ();
     67 
     68 #ifdef md_flush_pending_output
     69   md_flush_pending_output ();
     70 #endif
     71 
     72   if (is_it_end_of_statement ())
     73     {
     74       demand_empty_rest_of_line ();
     75       return;
     76     }
     77 
     78 #ifdef md_cons_align
     79   md_cons_align (nbytes);
     80 #endif
     81 
     82   do
     83     {
     84       bfd_reloc_code_real_type reloc_type = BFD_RELOC_BFIN_FUNCDESC;
     85 
     86       if (strncasecmp (input_line_pointer, "funcdesc(", 9) == 0)
     87 	{
     88 	  input_line_pointer += 9;
     89 	  expression (&exp);
     90 	  if (*input_line_pointer == ')')
     91 	    input_line_pointer++;
     92 	  else
     93 	    as_bad (_("missing ')'"));
     94 	}
     95       else
     96 	error ("missing funcdesc in picptr");
     97 
     98       p = frag_more (4);
     99       memset (p, 0, 4);
    100       fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &exp, 0,
    101 		   reloc_type);
    102     }
    103   while (*input_line_pointer++ == ',');
    104 
    105   input_line_pointer--;			/* Put terminator back into stream. */
    106   demand_empty_rest_of_line ();
    107 }
    108 
    109 const pseudo_typeS md_pseudo_table[] = {
    110   {"align", s_align_bytes, 0},
    111   {"byte2", cons, 2},
    112   {"byte4", cons, 4},
    113   {"picptr", bfin_pic_ptr, 4},
    114   {"code", obj_elf_section, 0},
    115   {"db", cons, 1},
    116   {"dd", cons, 4},
    117   {"dw", cons, 2},
    118   {"p", s_ignore, 0},
    119   {"pdata", s_ignore, 0},
    120   {"var", s_ignore, 0},
    121   {0, 0, 0}
    122 };
    123 
    124 /* Characters that are used to denote comments and line separators. */
    125 const char comment_chars[] = "#";
    126 const char line_comment_chars[] = "#";
    127 const char line_separator_chars[] = ";";
    128 
    129 /* Characters that can be used to separate the mantissa from the
    130    exponent in floating point numbers. */
    131 const char EXP_CHARS[] = "eE";
    132 
    133 /* Characters that mean this number is a floating point constant.
    134    As in 0f12.456 or  0d1.2345e12.  */
    135 const char FLT_CHARS[] = "fFdDxX";
    136 
    137 typedef enum bfin_cpu_type
    138 {
    139   BFIN_CPU_UNKNOWN,
    140   BFIN_CPU_BF504,
    141   BFIN_CPU_BF506,
    142   BFIN_CPU_BF512,
    143   BFIN_CPU_BF514,
    144   BFIN_CPU_BF516,
    145   BFIN_CPU_BF518,
    146   BFIN_CPU_BF522,
    147   BFIN_CPU_BF523,
    148   BFIN_CPU_BF524,
    149   BFIN_CPU_BF525,
    150   BFIN_CPU_BF526,
    151   BFIN_CPU_BF527,
    152   BFIN_CPU_BF531,
    153   BFIN_CPU_BF532,
    154   BFIN_CPU_BF533,
    155   BFIN_CPU_BF534,
    156   BFIN_CPU_BF536,
    157   BFIN_CPU_BF537,
    158   BFIN_CPU_BF538,
    159   BFIN_CPU_BF539,
    160   BFIN_CPU_BF542,
    161   BFIN_CPU_BF542M,
    162   BFIN_CPU_BF544,
    163   BFIN_CPU_BF544M,
    164   BFIN_CPU_BF547,
    165   BFIN_CPU_BF547M,
    166   BFIN_CPU_BF548,
    167   BFIN_CPU_BF548M,
    168   BFIN_CPU_BF549,
    169   BFIN_CPU_BF549M,
    170   BFIN_CPU_BF561,
    171   BFIN_CPU_BF592,
    172 } bfin_cpu_t;
    173 
    174 bfin_cpu_t bfin_cpu_type = BFIN_CPU_UNKNOWN;
    175 /* -msi-revision support. There are three special values:
    176    -1      -msi-revision=none.
    177    0xffff  -msi-revision=any.  */
    178 int bfin_si_revision;
    179 
    180 unsigned int bfin_anomaly_checks = 0;
    181 
    182 struct bfin_cpu
    183 {
    184   const char *name;
    185   bfin_cpu_t type;
    186   int si_revision;
    187   unsigned int anomaly_checks;
    188 };
    189 
    190 struct bfin_cpu bfin_cpus[] =
    191 {
    192   {"bf504", BFIN_CPU_BF504, 0x0000, AC_05000074},
    193 
    194   {"bf506", BFIN_CPU_BF506, 0x0000, AC_05000074},
    195 
    196   {"bf512", BFIN_CPU_BF512, 0x0002, AC_05000074},
    197   {"bf512", BFIN_CPU_BF512, 0x0001, AC_05000074},
    198   {"bf512", BFIN_CPU_BF512, 0x0000, AC_05000074},
    199 
    200   {"bf514", BFIN_CPU_BF514, 0x0002, AC_05000074},
    201   {"bf514", BFIN_CPU_BF514, 0x0001, AC_05000074},
    202   {"bf514", BFIN_CPU_BF514, 0x0000, AC_05000074},
    203 
    204   {"bf516", BFIN_CPU_BF516, 0x0002, AC_05000074},
    205   {"bf516", BFIN_CPU_BF516, 0x0001, AC_05000074},
    206   {"bf516", BFIN_CPU_BF516, 0x0000, AC_05000074},
    207 
    208   {"bf518", BFIN_CPU_BF518, 0x0002, AC_05000074},
    209   {"bf518", BFIN_CPU_BF518, 0x0001, AC_05000074},
    210   {"bf518", BFIN_CPU_BF518, 0x0000, AC_05000074},
    211 
    212   {"bf522", BFIN_CPU_BF522, 0x0002, AC_05000074},
    213   {"bf522", BFIN_CPU_BF522, 0x0001, AC_05000074},
    214   {"bf522", BFIN_CPU_BF522, 0x0000, AC_05000074},
    215 
    216   {"bf523", BFIN_CPU_BF523, 0x0002, AC_05000074},
    217   {"bf523", BFIN_CPU_BF523, 0x0001, AC_05000074},
    218   {"bf523", BFIN_CPU_BF523, 0x0000, AC_05000074},
    219 
    220   {"bf524", BFIN_CPU_BF524, 0x0002, AC_05000074},
    221   {"bf524", BFIN_CPU_BF524, 0x0001, AC_05000074},
    222   {"bf524", BFIN_CPU_BF524, 0x0000, AC_05000074},
    223 
    224   {"bf525", BFIN_CPU_BF525, 0x0002, AC_05000074},
    225   {"bf525", BFIN_CPU_BF525, 0x0001, AC_05000074},
    226   {"bf525", BFIN_CPU_BF525, 0x0000, AC_05000074},
    227 
    228   {"bf526", BFIN_CPU_BF526, 0x0002, AC_05000074},
    229   {"bf526", BFIN_CPU_BF526, 0x0001, AC_05000074},
    230   {"bf526", BFIN_CPU_BF526, 0x0000, AC_05000074},
    231 
    232   {"bf527", BFIN_CPU_BF527, 0x0002, AC_05000074},
    233   {"bf527", BFIN_CPU_BF527, 0x0001, AC_05000074},
    234   {"bf527", BFIN_CPU_BF527, 0x0000, AC_05000074},
    235 
    236   {"bf531", BFIN_CPU_BF531, 0x0006, AC_05000074},
    237   {"bf531", BFIN_CPU_BF531, 0x0005, AC_05000074},
    238   {"bf531", BFIN_CPU_BF531, 0x0004, AC_05000074},
    239   {"bf531", BFIN_CPU_BF531, 0x0003, AC_05000074},
    240 
    241   {"bf532", BFIN_CPU_BF532, 0x0006, AC_05000074},
    242   {"bf532", BFIN_CPU_BF532, 0x0005, AC_05000074},
    243   {"bf532", BFIN_CPU_BF532, 0x0004, AC_05000074},
    244   {"bf532", BFIN_CPU_BF532, 0x0003, AC_05000074},
    245 
    246   {"bf533", BFIN_CPU_BF533, 0x0006, AC_05000074},
    247   {"bf533", BFIN_CPU_BF533, 0x0005, AC_05000074},
    248   {"bf533", BFIN_CPU_BF533, 0x0004, AC_05000074},
    249   {"bf533", BFIN_CPU_BF533, 0x0003, AC_05000074},
    250 
    251   {"bf534", BFIN_CPU_BF534, 0x0003, AC_05000074},
    252   {"bf534", BFIN_CPU_BF534, 0x0002, AC_05000074},
    253   {"bf534", BFIN_CPU_BF534, 0x0001, AC_05000074},
    254 
    255   {"bf536", BFIN_CPU_BF536, 0x0003, AC_05000074},
    256   {"bf536", BFIN_CPU_BF536, 0x0002, AC_05000074},
    257   {"bf536", BFIN_CPU_BF536, 0x0001, AC_05000074},
    258 
    259   {"bf537", BFIN_CPU_BF537, 0x0003, AC_05000074},
    260   {"bf537", BFIN_CPU_BF537, 0x0002, AC_05000074},
    261   {"bf537", BFIN_CPU_BF537, 0x0001, AC_05000074},
    262 
    263   {"bf538", BFIN_CPU_BF538, 0x0005, AC_05000074},
    264   {"bf538", BFIN_CPU_BF538, 0x0004, AC_05000074},
    265   {"bf538", BFIN_CPU_BF538, 0x0003, AC_05000074},
    266   {"bf538", BFIN_CPU_BF538, 0x0002, AC_05000074},
    267 
    268   {"bf539", BFIN_CPU_BF539, 0x0005, AC_05000074},
    269   {"bf539", BFIN_CPU_BF539, 0x0004, AC_05000074},
    270   {"bf539", BFIN_CPU_BF539, 0x0003, AC_05000074},
    271   {"bf539", BFIN_CPU_BF539, 0x0002, AC_05000074},
    272 
    273   {"bf542m", BFIN_CPU_BF542M, 0x0003, AC_05000074},
    274 
    275   {"bf542", BFIN_CPU_BF542, 0x0004, AC_05000074},
    276   {"bf542", BFIN_CPU_BF542, 0x0002, AC_05000074},
    277   {"bf542", BFIN_CPU_BF542, 0x0001, AC_05000074},
    278   {"bf542", BFIN_CPU_BF542, 0x0000, AC_05000074},
    279 
    280   {"bf544m", BFIN_CPU_BF544M, 0x0003, AC_05000074},
    281 
    282   {"bf544", BFIN_CPU_BF544, 0x0004, AC_05000074},
    283   {"bf544", BFIN_CPU_BF544, 0x0002, AC_05000074},
    284   {"bf544", BFIN_CPU_BF544, 0x0001, AC_05000074},
    285   {"bf544", BFIN_CPU_BF544, 0x0000, AC_05000074},
    286 
    287   {"bf547m", BFIN_CPU_BF547M, 0x0003, AC_05000074},
    288 
    289   {"bf547", BFIN_CPU_BF547, 0x0004, AC_05000074},
    290   {"bf547", BFIN_CPU_BF547, 0x0002, AC_05000074},
    291   {"bf547", BFIN_CPU_BF547, 0x0001, AC_05000074},
    292   {"bf547", BFIN_CPU_BF547, 0x0000, AC_05000074},
    293 
    294   {"bf548m", BFIN_CPU_BF548M, 0x0003, AC_05000074},
    295 
    296   {"bf548", BFIN_CPU_BF548, 0x0004, AC_05000074},
    297   {"bf548", BFIN_CPU_BF548, 0x0002, AC_05000074},
    298   {"bf548", BFIN_CPU_BF548, 0x0001, AC_05000074},
    299   {"bf548", BFIN_CPU_BF548, 0x0000, AC_05000074},
    300 
    301   {"bf549m", BFIN_CPU_BF549M, 0x0003, AC_05000074},
    302 
    303   {"bf549", BFIN_CPU_BF549, 0x0004, AC_05000074},
    304   {"bf549", BFIN_CPU_BF549, 0x0002, AC_05000074},
    305   {"bf549", BFIN_CPU_BF549, 0x0001, AC_05000074},
    306   {"bf549", BFIN_CPU_BF549, 0x0000, AC_05000074},
    307 
    308   {"bf561", BFIN_CPU_BF561, 0x0005, AC_05000074},
    309   {"bf561", BFIN_CPU_BF561, 0x0003, AC_05000074},
    310   {"bf561", BFIN_CPU_BF561, 0x0002, AC_05000074},
    311 
    312   {"bf592", BFIN_CPU_BF592, 0x0001, AC_05000074},
    313   {"bf592", BFIN_CPU_BF592, 0x0000, AC_05000074},
    314 };
    315 
    316 /* Define bfin-specific command-line options (there are none). */
    317 const char *md_shortopts = "";
    318 
    319 #define OPTION_FDPIC		(OPTION_MD_BASE)
    320 #define OPTION_NOPIC		(OPTION_MD_BASE + 1)
    321 #define OPTION_MCPU		(OPTION_MD_BASE + 2)
    322 
    323 struct option md_longopts[] =
    324 {
    325   { "mcpu",		required_argument,	NULL, OPTION_MCPU	},
    326   { "mfdpic",		no_argument,		NULL, OPTION_FDPIC      },
    327   { "mnopic",		no_argument,		NULL, OPTION_NOPIC      },
    328   { "mno-fdpic",	no_argument,		NULL, OPTION_NOPIC      },
    329   { NULL,		no_argument,		NULL, 0                 },
    330 };
    331 
    332 size_t md_longopts_size = sizeof (md_longopts);
    333 
    334 
    335 int
    336 md_parse_option (int c ATTRIBUTE_UNUSED, const char *arg ATTRIBUTE_UNUSED)
    337 {
    338   switch (c)
    339     {
    340     default:
    341       return 0;
    342 
    343     case OPTION_MCPU:
    344       {
    345 	const char *q;
    346 	unsigned int i;
    347 
    348 	for (i = 0; i < ARRAY_SIZE (bfin_cpus); i++)
    349 	  {
    350 	    const char *p = bfin_cpus[i].name;
    351 	    if (strncmp (arg, p, strlen (p)) == 0)
    352 	      break;
    353 	  }
    354 
    355 	if (i == ARRAY_SIZE (bfin_cpus))
    356 	  as_fatal ("-mcpu=%s is not valid", arg);
    357 
    358 	bfin_cpu_type = bfin_cpus[i].type;
    359 
    360 	q = arg + strlen (bfin_cpus[i].name);
    361 
    362 	if (*q == '\0')
    363 	  {
    364 	    bfin_si_revision = bfin_cpus[i].si_revision;
    365 	    bfin_anomaly_checks |= bfin_cpus[i].anomaly_checks;
    366 	  }
    367 	else if (strcmp (q, "-none") == 0)
    368 	  bfin_si_revision = -1;
    369       	else if (strcmp (q, "-any") == 0)
    370 	  {
    371 	    bfin_si_revision = 0xffff;
    372 	    while (i < ARRAY_SIZE (bfin_cpus)
    373 		   && bfin_cpus[i].type == bfin_cpu_type)
    374 	      {
    375 		bfin_anomaly_checks |= bfin_cpus[i].anomaly_checks;
    376 		i++;
    377 	      }
    378 	  }
    379 	else
    380 	  {
    381 	    unsigned int si_major, si_minor;
    382 	    int rev_len, n;
    383 
    384 	    rev_len = strlen (q);
    385 
    386 	    if (sscanf (q, "-%u.%u%n", &si_major, &si_minor, &n) != 2
    387 		|| n != rev_len
    388 		|| si_major > 0xff || si_minor > 0xff)
    389 	      {
    390 	      invalid_silicon_revision:
    391 		as_fatal ("-mcpu=%s has invalid silicon revision", arg);
    392 	      }
    393 
    394 	    bfin_si_revision = (si_major << 8) | si_minor;
    395 
    396 	    while (i < ARRAY_SIZE (bfin_cpus)
    397 		   && bfin_cpus[i].type == bfin_cpu_type
    398 		   && bfin_cpus[i].si_revision != bfin_si_revision)
    399 	      i++;
    400 
    401 	    if (i == ARRAY_SIZE (bfin_cpus)
    402 	       	|| bfin_cpus[i].type != bfin_cpu_type)
    403 	      goto invalid_silicon_revision;
    404 
    405 	    bfin_anomaly_checks |= bfin_cpus[i].anomaly_checks;
    406 	  }
    407 
    408 	break;
    409       }
    410 
    411     case OPTION_FDPIC:
    412       bfin_flags |= EF_BFIN_FDPIC;
    413       bfin_pic_flag = "-mfdpic";
    414       break;
    415 
    416     case OPTION_NOPIC:
    417       bfin_flags &= ~(EF_BFIN_FDPIC);
    418       bfin_pic_flag = 0;
    419       break;
    420     }
    421 
    422   return 1;
    423 }
    424 
    425 void
    426 md_show_usage (FILE * stream)
    427 {
    428   fprintf (stream, _(" Blackfin specific assembler options:\n"));
    429   fprintf (stream, _("  -mcpu=<cpu[-sirevision]> specify the name of the target CPU\n"));
    430   fprintf (stream, _("  -mfdpic                  assemble for the FDPIC ABI\n"));
    431   fprintf (stream, _("  -mno-fdpic/-mnopic       disable -mfdpic\n"));
    432 }
    433 
    434 /* Perform machine-specific initializations.  */
    435 void
    436 md_begin (void)
    437 {
    438   /* Set the ELF flags if desired. */
    439   if (bfin_flags)
    440     bfd_set_private_flags (stdoutput, bfin_flags);
    441 
    442   /* Set the default machine type. */
    443   if (!bfd_set_arch_mach (stdoutput, bfd_arch_bfin, 0))
    444     as_warn (_("Could not set architecture and machine."));
    445 
    446   /* Ensure that lines can begin with '(', for multiple
    447      register stack pops. */
    448   lex_type ['('] = LEX_BEGIN_NAME;
    449 
    450 #ifdef OBJ_ELF
    451   record_alignment (text_section, 2);
    452   record_alignment (data_section, 2);
    453   record_alignment (bss_section, 2);
    454 #endif
    455 
    456   errorf = stderr;
    457   obstack_init (&mempool);
    458 
    459 #ifdef DEBUG
    460   extern int debug_codeselection;
    461   debug_codeselection = 1;
    462 #endif
    463 
    464   last_insn_size = 0;
    465 }
    466 
    467 /* Perform the main parsing, and assembly of the input here.  Also,
    468    call the required routines for alignment and fixups here.
    469    This is called for every line that contains real assembly code.  */
    470 
    471 void
    472 md_assemble (char *line)
    473 {
    474   char *toP = 0;
    475   int size, insn_size;
    476   struct bfin_insn *tmp_insn;
    477   size_t len;
    478   static size_t buffer_len = 0;
    479   static char *current_inputline;
    480   parse_state state;
    481 
    482   len = strlen (line);
    483   if (len + 2 > buffer_len)
    484     {
    485       buffer_len = len + 40;
    486       current_inputline = XRESIZEVEC (char, current_inputline, buffer_len);
    487     }
    488   memcpy (current_inputline, line, len);
    489   current_inputline[len] = ';';
    490   current_inputline[len + 1] = '\0';
    491 
    492   state = parse (current_inputline);
    493   if (state == NO_INSN_GENERATED)
    494     return;
    495 
    496   for (insn_size = 0, tmp_insn = insn; tmp_insn; tmp_insn = tmp_insn->next)
    497     if (!tmp_insn->reloc || !tmp_insn->exp->symbol)
    498       insn_size += 2;
    499 
    500   if (insn_size)
    501     toP = frag_more (insn_size);
    502 
    503   last_insn_size = insn_size;
    504 
    505 #ifdef DEBUG
    506   printf ("INS:");
    507 #endif
    508   while (insn)
    509     {
    510       if (insn->reloc && insn->exp->symbol)
    511 	{
    512 	  char *prev_toP = toP - 2;
    513 	  switch (insn->reloc)
    514 	    {
    515 	    case BFD_RELOC_BFIN_24_PCREL_JUMP_L:
    516 	    case BFD_RELOC_24_PCREL:
    517 	    case BFD_RELOC_BFIN_16_LOW:
    518 	    case BFD_RELOC_BFIN_16_HIGH:
    519 	      size = 4;
    520 	      break;
    521 	    default:
    522 	      size = 2;
    523 	    }
    524 
    525 	  /* Following if condition checks for the arithmetic relocations.
    526 	     If the case then it doesn't required to generate the code.
    527 	     It has been assumed that, their ID will be contiguous.  */
    528 	  if ((BFD_ARELOC_BFIN_PUSH <= insn->reloc
    529                && BFD_ARELOC_BFIN_COMP >= insn->reloc)
    530               || insn->reloc == BFD_RELOC_BFIN_16_IMM)
    531 	    {
    532 	      size = 2;
    533 	    }
    534 	  if (insn->reloc == BFD_ARELOC_BFIN_CONST
    535               || insn->reloc == BFD_ARELOC_BFIN_PUSH)
    536 	    size = 4;
    537 
    538 	  fix_new (frag_now,
    539                    (prev_toP - frag_now->fr_literal),
    540 		   size, insn->exp->symbol, insn->exp->value,
    541                    insn->pcrel, insn->reloc);
    542 	}
    543       else
    544 	{
    545 	  md_number_to_chars (toP, insn->value, 2);
    546 	  toP += 2;
    547 	}
    548 
    549 #ifdef DEBUG
    550       printf (" reloc :");
    551       printf (" %02x%02x", ((unsigned char *) &insn->value)[0],
    552               ((unsigned char *) &insn->value)[1]);
    553       printf ("\n");
    554 #endif
    555       insn = insn->next;
    556     }
    557 #ifdef OBJ_ELF
    558   dwarf2_emit_insn (insn_size);
    559 #endif
    560 
    561   while (*line++ != '\0')
    562     if (*line == '\n')
    563       bump_line_counters ();
    564 }
    565 
    566 /* Parse one line of instructions, and generate opcode for it.
    567    To parse the line, YACC and LEX are used, because the instruction set
    568    syntax doesn't confirm to the AT&T assembly syntax.
    569    To call a YACC & LEX generated parser, we must provide the input via
    570    a FILE stream, otherwise stdin is used by default.  Below the input
    571    to the function will be put into a temporary file, then the generated
    572    parser uses the temporary file for parsing.  */
    573 
    574 static parse_state
    575 parse (char *line)
    576 {
    577   parse_state state;
    578   YY_BUFFER_STATE buffstate;
    579 
    580   buffstate = yy_scan_string (line);
    581 
    582   /* our lex requires setting the start state to keyword
    583      every line as the first word may be a keyword.
    584      Fixes a bug where we could not have keywords as labels.  */
    585   set_start_state ();
    586 
    587   /* Call yyparse here.  */
    588   state = yyparse ();
    589   if (state == SEMANTIC_ERROR)
    590     {
    591       as_bad (_("Parse failed."));
    592       insn = 0;
    593     }
    594 
    595   yy_delete_buffer (buffstate);
    596   return state;
    597 }
    598 
    599 /* We need to handle various expressions properly.
    600    Such as, [SP--] = 34, concerned by md_assemble().  */
    601 
    602 void
    603 md_operand (expressionS * expressionP)
    604 {
    605   if (*input_line_pointer == '[')
    606     {
    607       as_tsktsk ("We found a '['!");
    608       input_line_pointer++;
    609       expression (expressionP);
    610     }
    611 }
    612 
    613 /* Handle undefined symbols. */
    614 symbolS *
    615 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
    616 {
    617   return (symbolS *) 0;
    618 }
    619 
    620 int
    621 md_estimate_size_before_relax (fragS * fragP ATTRIBUTE_UNUSED,
    622                                segT segment ATTRIBUTE_UNUSED)
    623 {
    624   return 0;
    625 }
    626 
    627 /* Convert from target byte order to host byte order.  */
    628 
    629 static int
    630 md_chars_to_number (char *val, int n)
    631 {
    632   int retval;
    633 
    634   for (retval = 0; n--;)
    635     {
    636       retval <<= 8;
    637       retval |= val[n];
    638     }
    639   return retval;
    640 }
    641 
    642 void
    643 md_apply_fix (fixS *fixP, valueT *valueP, segT seg ATTRIBUTE_UNUSED)
    644 {
    645   char *where = fixP->fx_frag->fr_literal + fixP->fx_where;
    646 
    647   long value = *valueP;
    648   long newval;
    649 
    650   switch (fixP->fx_r_type)
    651     {
    652     case BFD_RELOC_BFIN_GOT:
    653     case BFD_RELOC_BFIN_GOT17M4:
    654     case BFD_RELOC_BFIN_FUNCDESC_GOT17M4:
    655       fixP->fx_no_overflow = 1;
    656       newval = md_chars_to_number (where, 2);
    657       newval |= 0x0 & 0x7f;
    658       md_number_to_chars (where, newval, 2);
    659       break;
    660 
    661     case BFD_RELOC_BFIN_10_PCREL:
    662       if (!value)
    663 	break;
    664       if (value < -1024 || value > 1022)
    665 	as_bad_where (fixP->fx_file, fixP->fx_line,
    666                       _("pcrel too far BFD_RELOC_BFIN_10"));
    667 
    668       /* 11 bit offset even numbered, so we remove right bit.  */
    669       value = value >> 1;
    670       newval = md_chars_to_number (where, 2);
    671       newval |= value & 0x03ff;
    672       md_number_to_chars (where, newval, 2);
    673       break;
    674 
    675     case BFD_RELOC_BFIN_12_PCREL_JUMP:
    676     case BFD_RELOC_BFIN_12_PCREL_JUMP_S:
    677     case BFD_RELOC_12_PCREL:
    678       if (!value)
    679 	break;
    680 
    681       if (value < -4096 || value > 4094)
    682 	as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far BFD_RELOC_BFIN_12"));
    683       /* 13 bit offset even numbered, so we remove right bit.  */
    684       value = value >> 1;
    685       newval = md_chars_to_number (where, 2);
    686       newval |= value & 0xfff;
    687       md_number_to_chars (where, newval, 2);
    688       break;
    689 
    690     case BFD_RELOC_BFIN_16_LOW:
    691     case BFD_RELOC_BFIN_16_HIGH:
    692       fixP->fx_done = false;
    693       break;
    694 
    695     case BFD_RELOC_BFIN_24_PCREL_JUMP_L:
    696     case BFD_RELOC_BFIN_24_PCREL_CALL_X:
    697     case BFD_RELOC_24_PCREL:
    698       if (!value)
    699 	break;
    700 
    701       if (value < -16777216 || value > 16777214)
    702 	as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far BFD_RELOC_BFIN_24"));
    703 
    704       /* 25 bit offset even numbered, so we remove right bit.  */
    705       value = value >> 1;
    706       value++;
    707 
    708       md_number_to_chars (where - 2, value >> 16, 1);
    709       md_number_to_chars (where, value, 1);
    710       md_number_to_chars (where + 1, value >> 8, 1);
    711       break;
    712 
    713     case BFD_RELOC_BFIN_5_PCREL:	/* LSETUP (a, b) : "a" */
    714       if (!value)
    715 	break;
    716       if (value < 4 || value > 30)
    717 	as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far BFD_RELOC_BFIN_5"));
    718       value = value >> 1;
    719       newval = md_chars_to_number (where, 1);
    720       newval = (newval & 0xf0) | (value & 0xf);
    721       md_number_to_chars (where, newval, 1);
    722       break;
    723 
    724     case BFD_RELOC_BFIN_11_PCREL:	/* LSETUP (a, b) : "b" */
    725       if (!value)
    726 	break;
    727       value += 2;
    728       if (value < 4 || value > 2046)
    729 	as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far BFD_RELOC_BFIN_11_PCREL"));
    730       /* 11 bit unsigned even, so we remove right bit.  */
    731       value = value >> 1;
    732       newval = md_chars_to_number (where, 2);
    733       newval |= value & 0x03ff;
    734       md_number_to_chars (where, newval, 2);
    735       break;
    736 
    737     case BFD_RELOC_8:
    738       if (value < -0x80 || value >= 0x7f)
    739 	as_bad_where (fixP->fx_file, fixP->fx_line, _("rel too far BFD_RELOC_8"));
    740       md_number_to_chars (where, value, 1);
    741       break;
    742 
    743     case BFD_RELOC_BFIN_16_IMM:
    744     case BFD_RELOC_16:
    745       if (value < -0x8000 || value >= 0x7fff)
    746 	as_bad_where (fixP->fx_file, fixP->fx_line, _("rel too far BFD_RELOC_16"));
    747       md_number_to_chars (where, value, 2);
    748       break;
    749 
    750     case BFD_RELOC_32:
    751       md_number_to_chars (where, value, 4);
    752       break;
    753 
    754     case BFD_RELOC_BFIN_PLTPC:
    755       md_number_to_chars (where, value, 2);
    756       break;
    757 
    758     case BFD_RELOC_BFIN_FUNCDESC:
    759     case BFD_RELOC_VTABLE_INHERIT:
    760     case BFD_RELOC_VTABLE_ENTRY:
    761       fixP->fx_done = false;
    762       break;
    763 
    764     default:
    765       if ((BFD_ARELOC_BFIN_PUSH > fixP->fx_r_type) || (BFD_ARELOC_BFIN_COMP < fixP->fx_r_type))
    766 	{
    767 	  fprintf (stderr, "Relocation %d not handled in gas." " Contact support.\n", fixP->fx_r_type);
    768 	  return;
    769 	}
    770     }
    771 
    772   if (!fixP->fx_addsy)
    773     fixP->fx_done = true;
    774 
    775 }
    776 
    777 /* Round up a section size to the appropriate boundary.  */
    778 valueT
    779 md_section_align (segT segment, valueT size)
    780 {
    781   int boundary = bfd_section_alignment (segment);
    782   return ((size + (1 << boundary) - 1) & -(1 << boundary));
    783 }
    784 
    785 
    786 const char *
    787 md_atof (int type, char * litP, int * sizeP)
    788 {
    789   return ieee_md_atof (type, litP, sizeP, false);
    790 }
    791 
    792 
    793 /* If while processing a fixup, a reloc really needs to be created
    794    then it is done here.  */
    795 
    796 arelent *
    797 tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
    798 {
    799   arelent *reloc;
    800 
    801   reloc		      = XNEW (arelent);
    802   reloc->sym_ptr_ptr  = XNEW (asymbol *);
    803   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
    804   reloc->address      = fixp->fx_frag->fr_address + fixp->fx_where;
    805 
    806   reloc->addend = fixp->fx_offset;
    807   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
    808 
    809   if (reloc->howto == (reloc_howto_type *) NULL)
    810     {
    811       as_bad_where (fixp->fx_file, fixp->fx_line,
    812 		    /* xgettext:c-format.  */
    813 		    _("reloc %d not supported by object file format"),
    814 		    (int) fixp->fx_r_type);
    815 
    816       xfree (reloc);
    817 
    818       return NULL;
    819     }
    820 
    821   return reloc;
    822 }
    823 
    824 /*  The location from which a PC relative jump should be calculated,
    825     given a PC relative reloc.  */
    826 
    827 long
    828 md_pcrel_from_section (fixS *fixP, segT sec)
    829 {
    830   if (fixP->fx_addsy != (symbolS *) NULL
    831       && (!S_IS_DEFINED (fixP->fx_addsy)
    832       || S_GET_SEGMENT (fixP->fx_addsy) != sec))
    833     {
    834       /* The symbol is undefined (or is defined but not in this section).
    835          Let the linker figure it out.  */
    836       return 0;
    837     }
    838   return fixP->fx_frag->fr_address + fixP->fx_where;
    839 }
    840 
    841 /* Return true if the fix can be handled by GAS, false if it must
    842    be passed through to the linker.  */
    843 
    844 bool
    845 bfin_fix_adjustable (fixS *fixP)
    846 {
    847   switch (fixP->fx_r_type)
    848     {
    849   /* Adjust_reloc_syms doesn't know about the GOT.  */
    850     case BFD_RELOC_BFIN_GOT:
    851     case BFD_RELOC_BFIN_PLTPC:
    852   /* We need the symbol name for the VTABLE entries.  */
    853     case BFD_RELOC_VTABLE_INHERIT:
    854     case BFD_RELOC_VTABLE_ENTRY:
    855       return 0;
    856 
    857     default:
    858       return 1;
    859     }
    860 }
    861 
    862 /* Special extra functions that help bfin-parse.y perform its job.  */
    863 
    864 struct obstack mempool;
    865 
    866 INSTR_T
    867 conscode (INSTR_T head, INSTR_T tail)
    868 {
    869   if (!head)
    870     return tail;
    871   head->next = tail;
    872   return head;
    873 }
    874 
    875 INSTR_T
    876 conctcode (INSTR_T head, INSTR_T tail)
    877 {
    878   INSTR_T temp = (head);
    879   if (!head)
    880     return tail;
    881   while (temp->next)
    882     temp = temp->next;
    883   temp->next = tail;
    884 
    885   return head;
    886 }
    887 
    888 INSTR_T
    889 note_reloc (INSTR_T code, Expr_Node * symbol, int reloc, int pcrel)
    890 {
    891   /* Assert that the symbol is not an operator.  */
    892   gas_assert (symbol->type == Expr_Node_Reloc);
    893 
    894   return note_reloc1 (code, symbol->value.s_value, reloc, pcrel);
    895 
    896 }
    897 
    898 INSTR_T
    899 note_reloc1 (INSTR_T code, const char *symbol, int reloc, int pcrel)
    900 {
    901   code->reloc = reloc;
    902   code->exp = mkexpr (0, symbol_find_or_make (symbol));
    903   code->pcrel = pcrel;
    904   return code;
    905 }
    906 
    907 INSTR_T
    908 note_reloc2 (INSTR_T code, const char *symbol, int reloc, int value, int pcrel)
    909 {
    910   code->reloc = reloc;
    911   code->exp = mkexpr (value, symbol_find_or_make (symbol));
    912   code->pcrel = pcrel;
    913   return code;
    914 }
    915 
    916 INSTR_T
    917 gencode (unsigned long x)
    918 {
    919   INSTR_T cell = XOBNEW (&mempool, struct bfin_insn);
    920   memset (cell, 0, sizeof (struct bfin_insn));
    921   cell->value = (x);
    922   return cell;
    923 }
    924 
    925 int reloc;
    926 int ninsns;
    927 int count_insns;
    928 
    929 static void *
    930 allocate (size_t n)
    931 {
    932   return obstack_alloc (&mempool, n);
    933 }
    934 
    935 Expr_Node *
    936 Expr_Node_Create (Expr_Node_Type type,
    937 	          Expr_Node_Value value,
    938                   Expr_Node *Left_Child,
    939                   Expr_Node *Right_Child)
    940 {
    941 
    942 
    943   Expr_Node *node = (Expr_Node *) allocate (sizeof (Expr_Node));
    944   node->type = type;
    945   node->value = value;
    946   node->Left_Child = Left_Child;
    947   node->Right_Child = Right_Child;
    948   return node;
    949 }
    950 
    951 static const char *con = ".__constant";
    952 static const char *op = ".__operator";
    953 static INSTR_T Expr_Node_Gen_Reloc_R (Expr_Node * head);
    954 INSTR_T Expr_Node_Gen_Reloc (Expr_Node *head, int parent_reloc);
    955 
    956 INSTR_T
    957 Expr_Node_Gen_Reloc (Expr_Node * head, int parent_reloc)
    958 {
    959   /* Top level relocation expression generator VDSP style.
    960    If the relocation is just by itself, generate one item
    961    else generate this convoluted expression.  */
    962 
    963   INSTR_T note = NULL_CODE;
    964   INSTR_T note1 = NULL_CODE;
    965   int pcrel = 1;  /* Is the parent reloc pc-relative?
    966 		  This calculation here and HOWTO should match.  */
    967 
    968   if (parent_reloc)
    969     {
    970       /*  If it's 32 bit quantity then 16bit code needs to be added.  */
    971       int value = 0;
    972 
    973       if (head->type == Expr_Node_Constant)
    974 	{
    975 	  /* If note1 is not null code, we have to generate a right
    976              aligned value for the constant. Otherwise the reloc is
    977              a part of the basic command and the yacc file
    978              generates this.  */
    979 	  value = head->value.i_value;
    980 	}
    981       switch (parent_reloc)
    982 	{
    983 	  /*  Some relocations will need to allocate extra words.  */
    984 	case BFD_RELOC_BFIN_16_IMM:
    985 	case BFD_RELOC_BFIN_16_LOW:
    986 	case BFD_RELOC_BFIN_16_HIGH:
    987 	  note1 = conscode (gencode (value), NULL_CODE);
    988 	  pcrel = 0;
    989 	  break;
    990 	case BFD_RELOC_BFIN_PLTPC:
    991 	  note1 = conscode (gencode (value), NULL_CODE);
    992 	  pcrel = 0;
    993 	  break;
    994 	case BFD_RELOC_16:
    995 	case BFD_RELOC_BFIN_GOT:
    996 	case BFD_RELOC_BFIN_GOT17M4:
    997 	case BFD_RELOC_BFIN_FUNCDESC_GOT17M4:
    998 	  note1 = conscode (gencode (value), NULL_CODE);
    999 	  pcrel = 0;
   1000 	  break;
   1001 	case BFD_RELOC_24_PCREL:
   1002 	case BFD_RELOC_BFIN_24_PCREL_JUMP_L:
   1003 	case BFD_RELOC_BFIN_24_PCREL_CALL_X:
   1004 	  /* These offsets are even numbered pcrel.  */
   1005 	  note1 = conscode (gencode (value >> 1), NULL_CODE);
   1006 	  break;
   1007 	default:
   1008 	  note1 = NULL_CODE;
   1009 	}
   1010     }
   1011   if (head->type == Expr_Node_Constant)
   1012     note = note1;
   1013   else if (head->type == Expr_Node_Reloc)
   1014     {
   1015       note = note_reloc1 (gencode (0), head->value.s_value, parent_reloc, pcrel);
   1016       if (note1 != NULL_CODE)
   1017 	note = conscode (note1, note);
   1018     }
   1019   else if (head->type == Expr_Node_Binop
   1020 	   && (head->value.op_value == Expr_Op_Type_Add
   1021 	       || head->value.op_value == Expr_Op_Type_Sub)
   1022 	   && head->Left_Child->type == Expr_Node_Reloc
   1023 	   && head->Right_Child->type == Expr_Node_Constant)
   1024     {
   1025       int val = head->Right_Child->value.i_value;
   1026       if (head->value.op_value == Expr_Op_Type_Sub)
   1027 	val = -val;
   1028       note = conscode (note_reloc2 (gencode (0), head->Left_Child->value.s_value,
   1029 				    parent_reloc, val, 0),
   1030 		       NULL_CODE);
   1031       if (note1 != NULL_CODE)
   1032 	note = conscode (note1, note);
   1033     }
   1034   else
   1035     {
   1036       /* Call the recursive function.  */
   1037       note = note_reloc1 (gencode (0), op, parent_reloc, pcrel);
   1038       if (note1 != NULL_CODE)
   1039 	note = conscode (note1, note);
   1040       note = conctcode (Expr_Node_Gen_Reloc_R (head), note);
   1041     }
   1042   return note;
   1043 }
   1044 
   1045 static INSTR_T
   1046 Expr_Node_Gen_Reloc_R (Expr_Node * head)
   1047 {
   1048 
   1049   INSTR_T note = 0;
   1050   INSTR_T note1 = 0;
   1051 
   1052   switch (head->type)
   1053     {
   1054     case Expr_Node_Constant:
   1055       note = conscode (note_reloc2 (gencode (0), con, BFD_ARELOC_BFIN_CONST, head->value.i_value, 0), NULL_CODE);
   1056       break;
   1057     case Expr_Node_Reloc:
   1058       note = conscode (note_reloc (gencode (0), head, BFD_ARELOC_BFIN_PUSH, 0), NULL_CODE);
   1059       break;
   1060     case Expr_Node_Binop:
   1061       note1 = conctcode (Expr_Node_Gen_Reloc_R (head->Left_Child), Expr_Node_Gen_Reloc_R (head->Right_Child));
   1062       switch (head->value.op_value)
   1063 	{
   1064 	case Expr_Op_Type_Add:
   1065 	  note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_ADD, 0), NULL_CODE));
   1066 	  break;
   1067 	case Expr_Op_Type_Sub:
   1068 	  note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_SUB, 0), NULL_CODE));
   1069 	  break;
   1070 	case Expr_Op_Type_Mult:
   1071 	  note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_MULT, 0), NULL_CODE));
   1072 	  break;
   1073 	case Expr_Op_Type_Div:
   1074 	  note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_DIV, 0), NULL_CODE));
   1075 	  break;
   1076 	case Expr_Op_Type_Mod:
   1077 	  note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_MOD, 0), NULL_CODE));
   1078 	  break;
   1079 	case Expr_Op_Type_Lshift:
   1080 	  note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_LSHIFT, 0), NULL_CODE));
   1081 	  break;
   1082 	case Expr_Op_Type_Rshift:
   1083 	  note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_RSHIFT, 0), NULL_CODE));
   1084 	  break;
   1085 	case Expr_Op_Type_BAND:
   1086 	  note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_AND, 0), NULL_CODE));
   1087 	  break;
   1088 	case Expr_Op_Type_BOR:
   1089 	  note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_OR, 0), NULL_CODE));
   1090 	  break;
   1091 	case Expr_Op_Type_BXOR:
   1092 	  note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_XOR, 0), NULL_CODE));
   1093 	  break;
   1094 	case Expr_Op_Type_LAND:
   1095 	  note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_LAND, 0), NULL_CODE));
   1096 	  break;
   1097 	case Expr_Op_Type_LOR:
   1098 	  note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_LOR, 0), NULL_CODE));
   1099 	  break;
   1100 	default:
   1101 	  fprintf (stderr, "%s:%d:Unknown operator found for arithmetic" " relocation", __FILE__, __LINE__);
   1102 
   1103 
   1104 	}
   1105       break;
   1106     case Expr_Node_Unop:
   1107       note1 = conscode (Expr_Node_Gen_Reloc_R (head->Left_Child), NULL_CODE);
   1108       switch (head->value.op_value)
   1109 	{
   1110 	case Expr_Op_Type_NEG:
   1111 	  note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_NEG, 0), NULL_CODE));
   1112 	  break;
   1113 	case Expr_Op_Type_COMP:
   1114 	  note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_COMP, 0), NULL_CODE));
   1115 	  break;
   1116 	default:
   1117 	  fprintf (stderr, "%s:%d:Unknown operator found for arithmetic" " relocation", __FILE__, __LINE__);
   1118 	}
   1119       break;
   1120     default:
   1121       fprintf (stderr, "%s:%d:Unknown node expression found during " "arithmetic relocation generation", __FILE__, __LINE__);
   1122     }
   1123   return note;
   1124 }
   1125 
   1126 /* Blackfin opcode generation.  */
   1128 
   1129 /* These functions are called by the generated parser
   1130    (from bfin-parse.y), the register type classification
   1131    happens in bfin-lex.l.  */
   1132 
   1133 #include "bfin-aux.h"
   1134 #include "opcode/bfin.h"
   1135 
   1136 #define INIT(t)  t c_code = init_##t
   1137 #define ASSIGN(x) c_code.opcode |= ((x & c_code.mask_##x)<<c_code.bits_##x)
   1138 #define ASSIGNF(x,f) c_code.opcode |= ((x & c_code.mask_##f)<<c_code.bits_##f)
   1139 #define ASSIGN_R(x) c_code.opcode |= (((x ? (x->regno & CODE_MASK) : 0) & c_code.mask_##x)<<c_code.bits_##x)
   1140 
   1141 #define HI(x) ((x >> 16) & 0xffff)
   1142 #define LO(x) ((x      ) & 0xffff)
   1143 
   1144 #define GROUP(x) ((x->regno & CLASS_MASK) >> 4)
   1145 
   1146 #define GEN_OPCODE32()  \
   1147 	conscode (gencode (HI (c_code.opcode)), \
   1148 	conscode (gencode (LO (c_code.opcode)), NULL_CODE))
   1149 
   1150 #define GEN_OPCODE16()  \
   1151 	conscode (gencode (c_code.opcode), NULL_CODE)
   1152 
   1153 
   1154 /*  32 BIT INSTRUCTIONS.  */
   1155 
   1156 
   1157 /* DSP32 instruction generation.  */
   1158 
   1159 INSTR_T
   1160 bfin_gen_dsp32mac (int op1, int MM, int mmod, int w1, int P,
   1161 	           int h01, int h11, int h00, int h10, int op0,
   1162                    REG_T dst, REG_T src0, REG_T src1, int w0)
   1163 {
   1164   INIT (DSP32Mac);
   1165 
   1166   ASSIGN (op0);
   1167   ASSIGN (op1);
   1168   ASSIGN (MM);
   1169   ASSIGN (mmod);
   1170   ASSIGN (w0);
   1171   ASSIGN (w1);
   1172   ASSIGN (h01);
   1173   ASSIGN (h11);
   1174   ASSIGN (h00);
   1175   ASSIGN (h10);
   1176   ASSIGN (P);
   1177 
   1178   /* If we have full reg assignments, mask out LSB to encode
   1179   single or simultaneous even/odd register moves.  */
   1180   if (P)
   1181     {
   1182       dst->regno &= 0x06;
   1183     }
   1184 
   1185   ASSIGN_R (dst);
   1186   ASSIGN_R (src0);
   1187   ASSIGN_R (src1);
   1188 
   1189   return GEN_OPCODE32 ();
   1190 }
   1191 
   1192 INSTR_T
   1193 bfin_gen_dsp32mult (int op1, int MM, int mmod, int w1, int P,
   1194 	            int h01, int h11, int h00, int h10, int op0,
   1195                     REG_T dst, REG_T src0, REG_T src1, int w0)
   1196 {
   1197   INIT (DSP32Mult);
   1198 
   1199   ASSIGN (op0);
   1200   ASSIGN (op1);
   1201   ASSIGN (MM);
   1202   ASSIGN (mmod);
   1203   ASSIGN (w0);
   1204   ASSIGN (w1);
   1205   ASSIGN (h01);
   1206   ASSIGN (h11);
   1207   ASSIGN (h00);
   1208   ASSIGN (h10);
   1209   ASSIGN (P);
   1210 
   1211   if (P)
   1212     {
   1213       dst->regno &= 0x06;
   1214     }
   1215 
   1216   ASSIGN_R (dst);
   1217   ASSIGN_R (src0);
   1218   ASSIGN_R (src1);
   1219 
   1220   return GEN_OPCODE32 ();
   1221 }
   1222 
   1223 INSTR_T
   1224 bfin_gen_dsp32alu (int HL, int aopcde, int aop, int s, int x,
   1225               REG_T dst0, REG_T dst1, REG_T src0, REG_T src1)
   1226 {
   1227   INIT (DSP32Alu);
   1228 
   1229   ASSIGN (HL);
   1230   ASSIGN (aopcde);
   1231   ASSIGN (aop);
   1232   ASSIGN (s);
   1233   ASSIGN (x);
   1234   ASSIGN_R (dst0);
   1235   ASSIGN_R (dst1);
   1236   ASSIGN_R (src0);
   1237   ASSIGN_R (src1);
   1238 
   1239   return GEN_OPCODE32 ();
   1240 }
   1241 
   1242 INSTR_T
   1243 bfin_gen_dsp32shift (int sopcde, REG_T dst0, REG_T src0,
   1244                 REG_T src1, int sop, int HLs)
   1245 {
   1246   INIT (DSP32Shift);
   1247 
   1248   ASSIGN (sopcde);
   1249   ASSIGN (sop);
   1250   ASSIGN (HLs);
   1251 
   1252   ASSIGN_R (dst0);
   1253   ASSIGN_R (src0);
   1254   ASSIGN_R (src1);
   1255 
   1256   return GEN_OPCODE32 ();
   1257 }
   1258 
   1259 INSTR_T
   1260 bfin_gen_dsp32shiftimm (int sopcde, REG_T dst0, int immag,
   1261                    REG_T src1, int sop, int HLs)
   1262 {
   1263   INIT (DSP32ShiftImm);
   1264 
   1265   ASSIGN (sopcde);
   1266   ASSIGN (sop);
   1267   ASSIGN (HLs);
   1268 
   1269   ASSIGN_R (dst0);
   1270   ASSIGN (immag);
   1271   ASSIGN_R (src1);
   1272 
   1273   return GEN_OPCODE32 ();
   1274 }
   1275 
   1276 /* LOOP SETUP.  */
   1277 
   1278 INSTR_T
   1279 bfin_gen_loopsetup (Expr_Node * psoffset, REG_T c, int rop,
   1280                Expr_Node * peoffset, REG_T reg)
   1281 {
   1282   int soffset, eoffset;
   1283   INIT (LoopSetup);
   1284 
   1285   soffset = (EXPR_VALUE (psoffset) >> 1);
   1286   ASSIGN (soffset);
   1287   eoffset = (EXPR_VALUE (peoffset) >> 1);
   1288   ASSIGN (eoffset);
   1289   ASSIGN (rop);
   1290   ASSIGN_R (c);
   1291   ASSIGN_R (reg);
   1292 
   1293   return
   1294       conscode (gencode (HI (c_code.opcode)),
   1295 		conctcode (Expr_Node_Gen_Reloc (psoffset, BFD_RELOC_BFIN_5_PCREL),
   1296 			   conctcode (gencode (LO (c_code.opcode)), Expr_Node_Gen_Reloc (peoffset, BFD_RELOC_BFIN_11_PCREL))));
   1297 
   1298 }
   1299 
   1300 /*  Call, Link.  */
   1301 
   1302 INSTR_T
   1303 bfin_gen_calla (Expr_Node * addr, int S)
   1304 {
   1305   int val;
   1306   int high_val;
   1307   int rel = 0;
   1308   INIT (CALLa);
   1309 
   1310   switch(S){
   1311    case 0 : rel = BFD_RELOC_BFIN_24_PCREL_JUMP_L; break;
   1312    case 1 : rel = BFD_RELOC_24_PCREL; break;
   1313    case 2 : rel = BFD_RELOC_BFIN_PLTPC; break;
   1314    default : break;
   1315   }
   1316 
   1317   ASSIGN (S);
   1318 
   1319   val = EXPR_VALUE (addr) >> 1;
   1320   high_val = val >> 16;
   1321 
   1322   return conscode (gencode (HI (c_code.opcode) | (high_val & 0xff)),
   1323                      Expr_Node_Gen_Reloc (addr, rel));
   1324   }
   1325 
   1326 INSTR_T
   1327 bfin_gen_linkage (int R, int framesize)
   1328 {
   1329   INIT (Linkage);
   1330 
   1331   ASSIGN (R);
   1332   ASSIGN (framesize);
   1333 
   1334   return GEN_OPCODE32 ();
   1335 }
   1336 
   1337 
   1338 /* Load and Store.  */
   1339 
   1340 INSTR_T
   1341 bfin_gen_ldimmhalf (REG_T reg, int H, int S, int Z, Expr_Node * phword, int rel)
   1342 {
   1343   int grp, hword;
   1344   unsigned val = EXPR_VALUE (phword);
   1345   INIT (LDIMMhalf);
   1346 
   1347   ASSIGN (H);
   1348   ASSIGN (S);
   1349   ASSIGN (Z);
   1350 
   1351   ASSIGN_R (reg);
   1352   grp = (GROUP (reg));
   1353   ASSIGN (grp);
   1354   if (rel == 2)
   1355     {
   1356       return conscode (gencode (HI (c_code.opcode)), Expr_Node_Gen_Reloc (phword, BFD_RELOC_BFIN_16_IMM));
   1357     }
   1358   else if (rel == 1)
   1359     {
   1360       return conscode (gencode (HI (c_code.opcode)), Expr_Node_Gen_Reloc (phword, IS_H (*reg) ? BFD_RELOC_BFIN_16_HIGH : BFD_RELOC_BFIN_16_LOW));
   1361     }
   1362   else
   1363     {
   1364       hword = val;
   1365       ASSIGN (hword);
   1366     }
   1367   return GEN_OPCODE32 ();
   1368 }
   1369 
   1370 INSTR_T
   1371 bfin_gen_ldstidxi (REG_T ptr, REG_T reg, int W, int sz, int Z, Expr_Node * poffset)
   1372 {
   1373   INIT (LDSTidxI);
   1374 
   1375   if (!IS_PREG (*ptr) || (!IS_DREG (*reg) && !Z))
   1376     {
   1377       fprintf (stderr, "Warning: possible mixup of Preg/Dreg\n");
   1378       return 0;
   1379     }
   1380 
   1381   ASSIGN_R (ptr);
   1382   ASSIGN_R (reg);
   1383   ASSIGN (W);
   1384   ASSIGN (sz);
   1385 
   1386   ASSIGN (Z);
   1387 
   1388   if (poffset->type != Expr_Node_Constant)
   1389     {
   1390       /* a GOT relocation such as R0 = [P5 + symbol@GOT] */
   1391       /* distinguish between R0 = [P5 + symbol@GOT] and
   1392 	 P5 = [P5 + _current_shared_library_p5_offset_]
   1393       */
   1394       if (poffset->type == Expr_Node_Reloc
   1395 	  && !strcmp (poffset->value.s_value,
   1396 		      "_current_shared_library_p5_offset_"))
   1397 	{
   1398 	  return  conscode (gencode (HI (c_code.opcode)),
   1399 			    Expr_Node_Gen_Reloc(poffset, BFD_RELOC_16));
   1400 	}
   1401       else if (poffset->type != Expr_Node_GOT_Reloc)
   1402 	abort ();
   1403 
   1404       return conscode (gencode (HI (c_code.opcode)),
   1405 		       Expr_Node_Gen_Reloc(poffset->Left_Child,
   1406 					   poffset->value.i_value));
   1407     }
   1408   else
   1409     {
   1410       int value, offset;
   1411       switch (sz)
   1412 	{				/* load/store access size */
   1413 	case 0:			/* 32 bit */
   1414 	  value = EXPR_VALUE (poffset) >> 2;
   1415 	  break;
   1416 	case 1:			/* 16 bit */
   1417 	  value = EXPR_VALUE (poffset) >> 1;
   1418 	  break;
   1419 	case 2:			/* 8 bit */
   1420 	  value = EXPR_VALUE (poffset);
   1421 	  break;
   1422 	default:
   1423 	  abort ();
   1424 	}
   1425 
   1426       offset = (value & 0xffff);
   1427       ASSIGN (offset);
   1428       return GEN_OPCODE32 ();
   1429     }
   1430 }
   1431 
   1432 
   1433 INSTR_T
   1434 bfin_gen_ldst (REG_T ptr, REG_T reg, int aop, int sz, int Z, int W)
   1435 {
   1436   INIT (LDST);
   1437 
   1438   if (!IS_PREG (*ptr) || (!IS_DREG (*reg) && !Z))
   1439     {
   1440       fprintf (stderr, "Warning: possible mixup of Preg/Dreg\n");
   1441       return 0;
   1442     }
   1443 
   1444   ASSIGN_R (ptr);
   1445   ASSIGN_R (reg);
   1446   ASSIGN (aop);
   1447   ASSIGN (sz);
   1448   ASSIGN (Z);
   1449   ASSIGN (W);
   1450 
   1451   return GEN_OPCODE16 ();
   1452 }
   1453 
   1454 INSTR_T
   1455 bfin_gen_ldstii (REG_T ptr, REG_T reg, Expr_Node * poffset, int W, int opc)
   1456 {
   1457   int offset;
   1458   int value = 0;
   1459   INIT (LDSTii);
   1460 
   1461   if (!IS_PREG (*ptr))
   1462     {
   1463       fprintf (stderr, "Warning: possible mixup of Preg/Dreg\n");
   1464       return 0;
   1465     }
   1466 
   1467   switch (opc)
   1468     {
   1469     case 1:
   1470     case 2:
   1471       value = EXPR_VALUE (poffset) >> 1;
   1472       break;
   1473     case 0:
   1474     case 3:
   1475       value = EXPR_VALUE (poffset) >> 2;
   1476       break;
   1477     }
   1478 
   1479   ASSIGN_R (ptr);
   1480   ASSIGN_R (reg);
   1481 
   1482   offset = value;
   1483   ASSIGN (offset);
   1484   ASSIGN (W);
   1485   ASSIGNF (opc, op);
   1486 
   1487   return GEN_OPCODE16 ();
   1488 }
   1489 
   1490 INSTR_T
   1491 bfin_gen_ldstiifp (REG_T sreg, Expr_Node * poffset, int W)
   1492 {
   1493   /* Set bit 4 if it's a Preg.  */
   1494   int reg = (sreg->regno & CODE_MASK) | (IS_PREG (*sreg) ? 0x8 : 0x0);
   1495   int offset = ((~(EXPR_VALUE (poffset) >> 2)) & 0x1f) + 1;
   1496   INIT (LDSTiiFP);
   1497   ASSIGN (reg);
   1498   ASSIGN (offset);
   1499   ASSIGN (W);
   1500 
   1501   return GEN_OPCODE16 ();
   1502 }
   1503 
   1504 INSTR_T
   1505 bfin_gen_ldstpmod (REG_T ptr, REG_T reg, int aop, int W, REG_T idx)
   1506 {
   1507   INIT (LDSTpmod);
   1508 
   1509   ASSIGN_R (ptr);
   1510   ASSIGN_R (reg);
   1511   ASSIGN (aop);
   1512   ASSIGN (W);
   1513   ASSIGN_R (idx);
   1514 
   1515   return GEN_OPCODE16 ();
   1516 }
   1517 
   1518 INSTR_T
   1519 bfin_gen_dspldst (REG_T i, REG_T reg, int aop, int W, int m)
   1520 {
   1521   INIT (DspLDST);
   1522 
   1523   ASSIGN_R (i);
   1524   ASSIGN_R (reg);
   1525   ASSIGN (aop);
   1526   ASSIGN (W);
   1527   ASSIGN (m);
   1528 
   1529   return GEN_OPCODE16 ();
   1530 }
   1531 
   1532 INSTR_T
   1533 bfin_gen_logi2op (int opc, int src, int dst)
   1534 {
   1535   INIT (LOGI2op);
   1536 
   1537   ASSIGN (opc);
   1538   ASSIGN (src);
   1539   ASSIGN (dst);
   1540 
   1541   return GEN_OPCODE16 ();
   1542 }
   1543 
   1544 INSTR_T
   1545 bfin_gen_brcc (int T, int B, Expr_Node * poffset)
   1546 {
   1547   int offset;
   1548   INIT (BRCC);
   1549 
   1550   ASSIGN (T);
   1551   ASSIGN (B);
   1552   offset = ((EXPR_VALUE (poffset) >> 1));
   1553   ASSIGN (offset);
   1554   return conscode (gencode (c_code.opcode), Expr_Node_Gen_Reloc (poffset, BFD_RELOC_BFIN_10_PCREL));
   1555 }
   1556 
   1557 INSTR_T
   1558 bfin_gen_ujump (Expr_Node * poffset)
   1559 {
   1560   int offset;
   1561   INIT (UJump);
   1562 
   1563   offset = ((EXPR_VALUE (poffset) >> 1));
   1564   ASSIGN (offset);
   1565 
   1566   return conscode (gencode (c_code.opcode),
   1567                    Expr_Node_Gen_Reloc (
   1568                        poffset, BFD_RELOC_BFIN_12_PCREL_JUMP_S));
   1569 }
   1570 
   1571 INSTR_T
   1572 bfin_gen_alu2op (REG_T dst, REG_T src, int opc)
   1573 {
   1574   INIT (ALU2op);
   1575 
   1576   ASSIGN_R (dst);
   1577   ASSIGN_R (src);
   1578   ASSIGN (opc);
   1579 
   1580   return GEN_OPCODE16 ();
   1581 }
   1582 
   1583 INSTR_T
   1584 bfin_gen_compi2opd (REG_T dst, int src, int opc)
   1585 {
   1586   INIT (COMPI2opD);
   1587 
   1588   ASSIGN_R (dst);
   1589   ASSIGN (src);
   1590   ASSIGNF (opc, op);
   1591 
   1592   return GEN_OPCODE16 ();
   1593 }
   1594 
   1595 INSTR_T
   1596 bfin_gen_compi2opp (REG_T dst, int src, int opc)
   1597 {
   1598   INIT (COMPI2opP);
   1599 
   1600   ASSIGN_R (dst);
   1601   ASSIGN (src);
   1602   ASSIGNF (opc, op);
   1603 
   1604   return GEN_OPCODE16 ();
   1605 }
   1606 
   1607 INSTR_T
   1608 bfin_gen_dagmodik (REG_T i, int opc)
   1609 {
   1610   INIT (DagMODik);
   1611 
   1612   ASSIGN_R (i);
   1613   ASSIGNF (opc, op);
   1614 
   1615   return GEN_OPCODE16 ();
   1616 }
   1617 
   1618 INSTR_T
   1619 bfin_gen_dagmodim (REG_T i, REG_T m, int opc, int br)
   1620 {
   1621   INIT (DagMODim);
   1622 
   1623   ASSIGN_R (i);
   1624   ASSIGN_R (m);
   1625   ASSIGNF (opc, op);
   1626   ASSIGN (br);
   1627 
   1628   return GEN_OPCODE16 ();
   1629 }
   1630 
   1631 INSTR_T
   1632 bfin_gen_ptr2op (REG_T dst, REG_T src, int opc)
   1633 {
   1634   INIT (PTR2op);
   1635 
   1636   ASSIGN_R (dst);
   1637   ASSIGN_R (src);
   1638   ASSIGN (opc);
   1639 
   1640   return GEN_OPCODE16 ();
   1641 }
   1642 
   1643 INSTR_T
   1644 bfin_gen_comp3op (REG_T src0, REG_T src1, REG_T dst, int opc)
   1645 {
   1646   INIT (COMP3op);
   1647 
   1648   ASSIGN_R (src0);
   1649   ASSIGN_R (src1);
   1650   ASSIGN_R (dst);
   1651   ASSIGN (opc);
   1652 
   1653   return GEN_OPCODE16 ();
   1654 }
   1655 
   1656 INSTR_T
   1657 bfin_gen_ccflag (REG_T x, int y, int opc, int I, int G)
   1658 {
   1659   INIT (CCflag);
   1660 
   1661   ASSIGN_R (x);
   1662   ASSIGN (y);
   1663   ASSIGN (opc);
   1664   ASSIGN (I);
   1665   ASSIGN (G);
   1666 
   1667   return GEN_OPCODE16 ();
   1668 }
   1669 
   1670 INSTR_T
   1671 bfin_gen_ccmv (REG_T src, REG_T dst, int T)
   1672 {
   1673   int s, d;
   1674   INIT (CCmv);
   1675 
   1676   ASSIGN_R (src);
   1677   ASSIGN_R (dst);
   1678   s = (GROUP (src));
   1679   ASSIGN (s);
   1680   d = (GROUP (dst));
   1681   ASSIGN (d);
   1682   ASSIGN (T);
   1683 
   1684   return GEN_OPCODE16 ();
   1685 }
   1686 
   1687 INSTR_T
   1688 bfin_gen_cc2stat (int cbit, int opc, int D)
   1689 {
   1690   INIT (CC2stat);
   1691 
   1692   ASSIGN (cbit);
   1693   ASSIGNF (opc, op);
   1694   ASSIGN (D);
   1695 
   1696   return GEN_OPCODE16 ();
   1697 }
   1698 
   1699 INSTR_T
   1700 bfin_gen_regmv (REG_T src, REG_T dst)
   1701 {
   1702   int gs, gd;
   1703   INIT (RegMv);
   1704 
   1705   ASSIGN_R (src);
   1706   ASSIGN_R (dst);
   1707 
   1708   gs = (GROUP (src));
   1709   ASSIGN (gs);
   1710   gd = (GROUP (dst));
   1711   ASSIGN (gd);
   1712 
   1713   return GEN_OPCODE16 ();
   1714 }
   1715 
   1716 INSTR_T
   1717 bfin_gen_cc2dreg (int opc, REG_T reg)
   1718 {
   1719   INIT (CC2dreg);
   1720 
   1721   ASSIGNF (opc, op);
   1722   ASSIGN_R (reg);
   1723 
   1724   return GEN_OPCODE16 ();
   1725 }
   1726 
   1727 INSTR_T
   1728 bfin_gen_progctrl (int prgfunc, int poprnd)
   1729 {
   1730   INIT (ProgCtrl);
   1731 
   1732   ASSIGN (prgfunc);
   1733   ASSIGN (poprnd);
   1734 
   1735   return GEN_OPCODE16 ();
   1736 }
   1737 
   1738 INSTR_T
   1739 bfin_gen_cactrl (REG_T reg, int a, int opc)
   1740 {
   1741   INIT (CaCTRL);
   1742 
   1743   ASSIGN_R (reg);
   1744   ASSIGN (a);
   1745   ASSIGNF (opc, op);
   1746 
   1747   return GEN_OPCODE16 ();
   1748 }
   1749 
   1750 INSTR_T
   1751 bfin_gen_pushpopmultiple (int dr, int pr, int d, int p, int W)
   1752 {
   1753   INIT (PushPopMultiple);
   1754 
   1755   ASSIGN (dr);
   1756   ASSIGN (pr);
   1757   ASSIGN (d);
   1758   ASSIGN (p);
   1759   ASSIGN (W);
   1760 
   1761   return GEN_OPCODE16 ();
   1762 }
   1763 
   1764 INSTR_T
   1765 bfin_gen_pushpopreg (REG_T reg, int W)
   1766 {
   1767   int grp;
   1768   INIT (PushPopReg);
   1769 
   1770   ASSIGN_R (reg);
   1771   grp = (GROUP (reg));
   1772   ASSIGN (grp);
   1773   ASSIGN (W);
   1774 
   1775   return GEN_OPCODE16 ();
   1776 }
   1777 
   1778 /* Pseudo Debugging Support.  */
   1779 
   1780 INSTR_T
   1781 bfin_gen_pseudodbg (int fn, int reg, int grp)
   1782 {
   1783   INIT (PseudoDbg);
   1784 
   1785   ASSIGN (fn);
   1786   ASSIGN (reg);
   1787   ASSIGN (grp);
   1788 
   1789   return GEN_OPCODE16 ();
   1790 }
   1791 
   1792 INSTR_T
   1793 bfin_gen_pseudodbg_assert (int dbgop, REG_T regtest, int expected)
   1794 {
   1795   int grp;
   1796   INIT (PseudoDbg_Assert);
   1797 
   1798   ASSIGN (dbgop);
   1799   ASSIGN_R (regtest);
   1800   grp = GROUP (regtest);
   1801   ASSIGN (grp);
   1802   ASSIGN (expected);
   1803 
   1804   return GEN_OPCODE32 ();
   1805 }
   1806 
   1807 INSTR_T
   1808 bfin_gen_pseudochr (int ch)
   1809 {
   1810   INIT (PseudoChr);
   1811 
   1812   ASSIGN (ch);
   1813 
   1814   return GEN_OPCODE16 ();
   1815 }
   1816 
   1817 /* Multiple instruction generation.  */
   1818 
   1819 INSTR_T
   1820 bfin_gen_multi_instr (INSTR_T dsp32, INSTR_T dsp16_grp1, INSTR_T dsp16_grp2)
   1821 {
   1822   INSTR_T walk;
   1823 
   1824   /* If it's a 0, convert into MNOP. */
   1825   if (dsp32)
   1826     {
   1827       walk = dsp32->next;
   1828       SET_MULTI_INSTRUCTION_BIT (dsp32);
   1829     }
   1830   else
   1831     {
   1832       dsp32 = gencode (0xc803);
   1833       walk = gencode (0x1800);
   1834       dsp32->next = walk;
   1835     }
   1836 
   1837   if (!dsp16_grp1)
   1838     {
   1839       dsp16_grp1 = gencode (0x0000);
   1840     }
   1841 
   1842   if (!dsp16_grp2)
   1843     {
   1844       dsp16_grp2 = gencode (0x0000);
   1845     }
   1846 
   1847   walk->next = dsp16_grp1;
   1848   dsp16_grp1->next = dsp16_grp2;
   1849   dsp16_grp2->next = NULL_CODE;
   1850 
   1851   return dsp32;
   1852 }
   1853 
   1854 INSTR_T
   1855 bfin_gen_loop (Expr_Node *exp, REG_T reg, int rop, REG_T preg)
   1856 {
   1857   const char *loopsym;
   1858   char *lbeginsym, *lendsym;
   1859   Expr_Node_Value lbeginval, lendval;
   1860   Expr_Node *lbegin, *lend;
   1861   symbolS *sym;
   1862 
   1863   loopsym = exp->value.s_value;
   1864   lbeginsym = (char *) xmalloc (strlen (loopsym) + strlen ("__BEGIN") + 5);
   1865   lendsym = (char *) xmalloc (strlen (loopsym) + strlen ("__END") + 5);
   1866 
   1867   lbeginsym[0] = 0;
   1868   lendsym[0] = 0;
   1869 
   1870   strcat (lbeginsym, "L$L$");
   1871   strcat (lbeginsym, loopsym);
   1872   strcat (lbeginsym, "__BEGIN");
   1873 
   1874   strcat (lendsym, "L$L$");
   1875   strcat (lendsym, loopsym);
   1876   strcat (lendsym, "__END");
   1877 
   1878   lbeginval.s_value = lbeginsym;
   1879   lendval.s_value = lendsym;
   1880 
   1881   lbegin = Expr_Node_Create (Expr_Node_Reloc, lbeginval, NULL, NULL);
   1882   lend   = Expr_Node_Create (Expr_Node_Reloc, lendval, NULL, NULL);
   1883 
   1884   sym = symbol_find(loopsym);
   1885   if (!S_IS_LOCAL (sym) || (S_IS_LOCAL (sym) && !symbol_used_p (sym)))
   1886     symbol_remove (sym, &symbol_rootP, &symbol_lastP);
   1887 
   1888   return bfin_gen_loopsetup (lbegin, reg, rop, lend, preg);
   1889 }
   1890 
   1891 void
   1892 bfin_loop_attempt_create_label (Expr_Node *exp, int is_begin)
   1893 {
   1894   char *name;
   1895   name = fb_label_name (exp->value.i_value, is_begin);
   1896   exp->value.s_value = xstrdup (name);
   1897   exp->type = Expr_Node_Reloc;
   1898 }
   1899 
   1900 void
   1901 bfin_loop_beginend (Expr_Node *exp, int begin)
   1902 {
   1903   const char *loopsym;
   1904   char *label_name;
   1905   symbolS *linelabel;
   1906   const char *suffix = begin ? "__BEGIN" : "__END";
   1907 
   1908   loopsym = exp->value.s_value;
   1909   label_name = (char *) xmalloc (strlen (loopsym) + strlen (suffix) + 5);
   1910 
   1911   label_name[0] = 0;
   1912 
   1913   strcat (label_name, "L$L$");
   1914   strcat (label_name, loopsym);
   1915   strcat (label_name, suffix);
   1916 
   1917   linelabel = colon (label_name);
   1918 
   1919   /* LOOP_END follows the last instruction in the loop.
   1920      Adjust label address.  */
   1921   if (!begin)
   1922     *symbol_X_add_number (linelabel) -= last_insn_size;
   1923 }
   1924 
   1925 bool
   1926 bfin_eol_in_insn (char *line)
   1927 {
   1928    /* Allow a new-line to appear in the middle of a multi-issue instruction.  */
   1929 
   1930    char *temp = line;
   1931 
   1932   if (*line != '\n')
   1933     return false;
   1934 
   1935   /* A semi-colon followed by a newline is always the end of a line.  */
   1936   if (line[-1] == ';')
   1937     return false;
   1938 
   1939   if (line[-1] == '|')
   1940     return true;
   1941 
   1942   /* If the || is on the next line, there might be leading whitespace.  */
   1943   temp++;
   1944   while (*temp == ' ' || *temp == '\t') temp++;
   1945 
   1946   if (*temp == '|')
   1947     return true;
   1948 
   1949   return false;
   1950 }
   1951 
   1952 bool
   1953 bfin_start_label (char *s)
   1954 {
   1955   while (*s != 0)
   1956     {
   1957       if (*s == '(' || *s == '[')
   1958 	return false;
   1959       s++;
   1960     }
   1961 
   1962   return true;
   1963 }
   1964 
   1965 int
   1966 bfin_force_relocation (struct fix *fixp)
   1967 {
   1968   if (fixp->fx_r_type ==BFD_RELOC_BFIN_16_LOW
   1969       || fixp->fx_r_type == BFD_RELOC_BFIN_16_HIGH)
   1970     return true;
   1971 
   1972   return generic_force_reloc (fixp);
   1973 }
   1974 
   1975 /* This is a stripped down version of the disassembler.  The only thing it
   1977    does is return a mask of registers modified by an instruction.  Only
   1978    instructions that can occur in a parallel-issue bundle are handled, and
   1979    only the registers that can cause a conflict are recorded.  */
   1980 
   1981 #define DREG_MASK(n) (0x101 << (n))
   1982 #define DREGH_MASK(n) (0x100 << (n))
   1983 #define DREGL_MASK(n) (0x001 << (n))
   1984 #define IREG_MASK(n) (1 << ((n) + 16))
   1985 
   1986 static int
   1987 decode_ProgCtrl_0 (int iw0)
   1988 {
   1989   if (iw0 == 0)
   1990     return 0;
   1991   abort ();
   1992 }
   1993 
   1994 static int
   1995 decode_LDSTpmod_0 (int iw0)
   1996 {
   1997   /* LDSTpmod
   1998      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   1999      | 1 | 0 | 0 | 0 |.W.|.aop...|.reg.......|.idx.......|.ptr.......|
   2000      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2001   int W   = ((iw0 >> LDSTpmod_W_bits) & LDSTpmod_W_mask);
   2002   int aop = ((iw0 >> LDSTpmod_aop_bits) & LDSTpmod_aop_mask);
   2003   int idx = ((iw0 >> LDSTpmod_idx_bits) & LDSTpmod_idx_mask);
   2004   int ptr = ((iw0 >> LDSTpmod_ptr_bits) & LDSTpmod_ptr_mask);
   2005   int reg = ((iw0 >> LDSTpmod_reg_bits) & LDSTpmod_reg_mask);
   2006 
   2007   if (aop == 1 && W == 0 && idx == ptr)
   2008     return DREGL_MASK (reg);
   2009   else if (aop == 2 && W == 0 && idx == ptr)
   2010     return DREGH_MASK (reg);
   2011   else if (aop == 1 && W == 1 && idx == ptr)
   2012     return 0;
   2013   else if (aop == 2 && W == 1 && idx == ptr)
   2014     return 0;
   2015   else if (aop == 0 && W == 0)
   2016     return DREG_MASK (reg);
   2017   else if (aop == 1 && W == 0)
   2018     return DREGL_MASK (reg);
   2019   else if (aop == 2 && W == 0)
   2020     return DREGH_MASK (reg);
   2021   else if (aop == 3 && W == 0)
   2022     return DREG_MASK (reg);
   2023   else if (aop == 3 && W == 1)
   2024     return DREG_MASK (reg);
   2025   else if (aop == 0 && W == 1)
   2026     return 0;
   2027   else if (aop == 1 && W == 1)
   2028     return 0;
   2029   else if (aop == 2 && W == 1)
   2030     return 0;
   2031   else
   2032     return 0;
   2033 
   2034   return 2;
   2035 }
   2036 
   2037 static int
   2038 decode_dagMODim_0 (int iw0)
   2039 {
   2040   /* dagMODim
   2041      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2042      | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 |.br| 1 | 1 |.op|.m.....|.i.....|
   2043      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2044   int i  = ((iw0 >> DagMODim_i_bits) & DagMODim_i_mask);
   2045   int opc  = ((iw0 >> DagMODim_op_bits) & DagMODim_op_mask);
   2046 
   2047   if (opc == 0 || opc == 1)
   2048     return IREG_MASK (i);
   2049   else
   2050     return 0;
   2051 
   2052   return 2;
   2053 }
   2054 
   2055 static int
   2056 decode_dagMODik_0 (int iw0)
   2057 {
   2058   /* dagMODik
   2059      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2060      | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 |.op....|.i.....|
   2061      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2062   int i  = ((iw0 >> DagMODik_i_bits) & DagMODik_i_mask);
   2063   return IREG_MASK (i);
   2064 }
   2065 
   2066 /* GOOD */
   2067 static int
   2068 decode_dspLDST_0 (int iw0)
   2069 {
   2070   /* dspLDST
   2071      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2072      | 1 | 0 | 0 | 1 | 1 | 1 |.W.|.aop...|.m.....|.i.....|.reg.......|
   2073      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2074   int i   = ((iw0 >> DspLDST_i_bits) & DspLDST_i_mask);
   2075   int m   = ((iw0 >> DspLDST_m_bits) & DspLDST_m_mask);
   2076   int W   = ((iw0 >> DspLDST_W_bits) & DspLDST_W_mask);
   2077   int aop = ((iw0 >> DspLDST_aop_bits) & DspLDST_aop_mask);
   2078   int reg = ((iw0 >> DspLDST_reg_bits) & DspLDST_reg_mask);
   2079 
   2080   if (aop == 0 && W == 0 && m == 0)
   2081     return DREG_MASK (reg) | IREG_MASK (i);
   2082   else if (aop == 0 && W == 0 && m == 1)
   2083     return DREGL_MASK (reg) | IREG_MASK (i);
   2084   else if (aop == 0 && W == 0 && m == 2)
   2085     return DREGH_MASK (reg) | IREG_MASK (i);
   2086   else if (aop == 1 && W == 0 && m == 0)
   2087     return DREG_MASK (reg) | IREG_MASK (i);
   2088   else if (aop == 1 && W == 0 && m == 1)
   2089     return DREGL_MASK (reg) | IREG_MASK (i);
   2090   else if (aop == 1 && W == 0 && m == 2)
   2091     return DREGH_MASK (reg) | IREG_MASK (i);
   2092   else if (aop == 2 && W == 0 && m == 0)
   2093     return DREG_MASK (reg);
   2094   else if (aop == 2 && W == 0 && m == 1)
   2095     return DREGL_MASK (reg);
   2096   else if (aop == 2 && W == 0 && m == 2)
   2097     return DREGH_MASK (reg);
   2098   else if (aop == 0 && W == 1 && m == 0)
   2099     return IREG_MASK (i);
   2100   else if (aop == 0 && W == 1 && m == 1)
   2101     return IREG_MASK (i);
   2102   else if (aop == 0 && W == 1 && m == 2)
   2103     return IREG_MASK (i);
   2104   else if (aop == 1 && W == 1 && m == 0)
   2105     return IREG_MASK (i);
   2106   else if (aop == 1 && W == 1 && m == 1)
   2107     return IREG_MASK (i);
   2108   else if (aop == 1 && W == 1 && m == 2)
   2109     return IREG_MASK (i);
   2110   else if (aop == 2 && W == 1 && m == 0)
   2111     return 0;
   2112   else if (aop == 2 && W == 1 && m == 1)
   2113     return 0;
   2114   else if (aop == 2 && W == 1 && m == 2)
   2115     return 0;
   2116   else if (aop == 3 && W == 0)
   2117     return DREG_MASK (reg) | IREG_MASK (i);
   2118   else if (aop == 3 && W == 1)
   2119     return IREG_MASK (i);
   2120 
   2121   abort ();
   2122 }
   2123 
   2124 /* GOOD */
   2125 static int
   2126 decode_LDST_0 (int iw0)
   2127 {
   2128   /* LDST
   2129      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2130      | 1 | 0 | 0 | 1 |.sz....|.W.|.aop...|.Z.|.ptr.......|.reg.......|
   2131      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2132   int Z   = ((iw0 >> LDST_Z_bits) & LDST_Z_mask);
   2133   int W   = ((iw0 >> LDST_W_bits) & LDST_W_mask);
   2134   int sz  = ((iw0 >> LDST_sz_bits) & LDST_sz_mask);
   2135   int aop = ((iw0 >> LDST_aop_bits) & LDST_aop_mask);
   2136   int reg = ((iw0 >> LDST_reg_bits) & LDST_reg_mask);
   2137 
   2138   if (aop == 0 && sz == 0 && Z == 0 && W == 0)
   2139     return DREG_MASK (reg);
   2140   else if (aop == 0 && sz == 0 && Z == 1 && W == 0)
   2141     return 0;
   2142   else if (aop == 0 && sz == 1 && Z == 0 && W == 0)
   2143     return DREG_MASK (reg);
   2144   else if (aop == 0 && sz == 1 && Z == 1 && W == 0)
   2145     return DREG_MASK (reg);
   2146   else if (aop == 0 && sz == 2 && Z == 0 && W == 0)
   2147     return DREG_MASK (reg);
   2148   else if (aop == 0 && sz == 2 && Z == 1 && W == 0)
   2149     return DREG_MASK (reg);
   2150   else if (aop == 1 && sz == 0 && Z == 0 && W == 0)
   2151     return DREG_MASK (reg);
   2152   else if (aop == 1 && sz == 0 && Z == 1 && W == 0)
   2153     return 0;
   2154   else if (aop == 1 && sz == 1 && Z == 0 && W == 0)
   2155     return DREG_MASK (reg);
   2156   else if (aop == 1 && sz == 1 && Z == 1 && W == 0)
   2157     return DREG_MASK (reg);
   2158   else if (aop == 1 && sz == 2 && Z == 0 && W == 0)
   2159     return DREG_MASK (reg);
   2160   else if (aop == 1 && sz == 2 && Z == 1 && W == 0)
   2161     return DREG_MASK (reg);
   2162   else if (aop == 2 && sz == 0 && Z == 0 && W == 0)
   2163     return DREG_MASK (reg);
   2164   else if (aop == 2 && sz == 0 && Z == 1 && W == 0)
   2165     return 0;
   2166   else if (aop == 2 && sz == 1 && Z == 0 && W == 0)
   2167     return DREG_MASK (reg);
   2168   else if (aop == 2 && sz == 1 && Z == 1 && W == 0)
   2169     return DREG_MASK (reg);
   2170   else if (aop == 2 && sz == 2 && Z == 0 && W == 0)
   2171     return DREG_MASK (reg);
   2172   else if (aop == 2 && sz == 2 && Z == 1 && W == 0)
   2173     return DREG_MASK (reg);
   2174   else if (aop == 0 && sz == 0 && Z == 0 && W == 1)
   2175     return 0;
   2176   else if (aop == 0 && sz == 0 && Z == 1 && W == 1)
   2177     return 0;
   2178   else if (aop == 0 && sz == 1 && Z == 0 && W == 1)
   2179     return 0;
   2180   else if (aop == 0 && sz == 2 && Z == 0 && W == 1)
   2181     return 0;
   2182   else if (aop == 1 && sz == 0 && Z == 0 && W == 1)
   2183     return 0;
   2184   else if (aop == 1 && sz == 0 && Z == 1 && W == 1)
   2185     return 0;
   2186   else if (aop == 1 && sz == 1 && Z == 0 && W == 1)
   2187     return 0;
   2188   else if (aop == 1 && sz == 2 && Z == 0 && W == 1)
   2189     return 0;
   2190   else if (aop == 2 && sz == 0 && Z == 0 && W == 1)
   2191     return 0;
   2192   else if (aop == 2 && sz == 0 && Z == 1 && W == 1)
   2193     return 0;
   2194   else if (aop == 2 && sz == 1 && Z == 0 && W == 1)
   2195     return 0;
   2196   else if (aop == 2 && sz == 2 && Z == 0 && W == 1)
   2197     return 0;
   2198 
   2199   abort ();
   2200 }
   2201 
   2202 static int
   2203 decode_LDSTiiFP_0 (int iw0)
   2204 {
   2205   /* LDSTiiFP
   2206      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2207      | 1 | 0 | 1 | 1 | 1 | 0 |.W.|.offset............|.reg...........|
   2208      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2209   int reg = ((iw0 >> LDSTiiFP_reg_bits) & LDSTiiFP_reg_mask);
   2210   int W = ((iw0 >> LDSTiiFP_W_bits) & LDSTiiFP_W_mask);
   2211 
   2212   if (W == 0)
   2213     return reg < 8 ? DREG_MASK (reg) : 0;
   2214   else
   2215     return 0;
   2216 }
   2217 
   2218 static int
   2219 decode_LDSTii_0 (int iw0)
   2220 {
   2221   /* LDSTii
   2222      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2223      | 1 | 0 | 1 |.W.|.op....|.offset........|.ptr.......|.reg.......|
   2224      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2225   int reg = ((iw0 >> LDSTii_reg_bit) & LDSTii_reg_mask);
   2226   int opc = ((iw0 >> LDSTii_op_bit) & LDSTii_op_mask);
   2227   int W = ((iw0 >> LDSTii_W_bit) & LDSTii_W_mask);
   2228 
   2229   if (W == 0 && opc != 3)
   2230     return DREG_MASK (reg);
   2231   else if (W == 0 && opc == 3)
   2232    return 0;
   2233   else if (W == 1 && opc == 0)
   2234     return 0;
   2235   else if (W == 1 && opc == 1)
   2236     return 0;
   2237   else if (W == 1 && opc == 3)
   2238     return 0;
   2239 
   2240   abort ();
   2241 }
   2242 
   2243 static int
   2244 decode_dsp32mac_0 (int iw0, int iw1)
   2245 {
   2246   int result = 0;
   2247   /* dsp32mac
   2248      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2249      | 1 | 1 | 0 | 0 |.M.| 0 | 0 |.mmod..........|.MM|.P.|.w1|.op1...|
   2250      |.h01|.h11|.w0|.op0...|.h00|.h10|.dst.......|.src0......|.src1..|
   2251      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2252   int op1  = ((iw0 >> (DSP32Mac_op1_bits - 16)) & DSP32Mac_op1_mask);
   2253   int w1   = ((iw0 >> (DSP32Mac_w1_bits - 16)) & DSP32Mac_w1_mask);
   2254   int P    = ((iw0 >> (DSP32Mac_p_bits - 16)) & DSP32Mac_p_mask);
   2255   int mmod = ((iw0 >> (DSP32Mac_mmod_bits - 16)) & DSP32Mac_mmod_mask);
   2256   int w0   = ((iw1 >> DSP32Mac_w0_bits) & DSP32Mac_w0_mask);
   2257   int MM   = ((iw1 >> DSP32Mac_MM_bits) & DSP32Mac_MM_mask);
   2258   int dst  = ((iw1 >> DSP32Mac_dst_bits) & DSP32Mac_dst_mask);
   2259   int op0  = ((iw1 >> DSP32Mac_op0_bits) & DSP32Mac_op0_mask);
   2260 
   2261   if (w0 == 0 && w1 == 0 && op1 == 3 && op0 == 3)
   2262     return 0;
   2263 
   2264   if (op1 == 3 && MM)
   2265     return 0;
   2266 
   2267   if ((w1 || w0) && mmod == M_W32)
   2268     return 0;
   2269 
   2270   if (((1 << mmod) & (P ? 0x131b : 0x1b5f)) == 0)
   2271     return 0;
   2272 
   2273   if (w1 == 1 || op1 != 3)
   2274     {
   2275       if (w1)
   2276 	{
   2277 	  if (P)
   2278 	    return DREG_MASK (dst + 1);
   2279 	  else
   2280 	    return DREGH_MASK (dst);
   2281 	}
   2282     }
   2283 
   2284   if (w0 == 1 || op0 != 3)
   2285     {
   2286       if (w0)
   2287 	{
   2288 	  if (P)
   2289 	    return DREG_MASK (dst);
   2290 	  else
   2291 	    return DREGL_MASK (dst);
   2292 	}
   2293     }
   2294 
   2295   return result;
   2296 }
   2297 
   2298 static int
   2299 decode_dsp32mult_0 (int iw0, int iw1)
   2300 {
   2301   /* dsp32mult
   2302      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2303      | 1 | 1 | 0 | 0 |.M.| 0 | 1 |.mmod..........|.MM|.P.|.w1|.op1...|
   2304      |.h01|.h11|.w0|.op0...|.h00|.h10|.dst.......|.src0......|.src1..|
   2305      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2306   int w1   = ((iw0 >> (DSP32Mac_w1_bits - 16)) & DSP32Mac_w1_mask);
   2307   int P    = ((iw0 >> (DSP32Mac_p_bits - 16)) & DSP32Mac_p_mask);
   2308   int mmod = ((iw0 >> (DSP32Mac_mmod_bits - 16)) & DSP32Mac_mmod_mask);
   2309   int w0   = ((iw1 >> DSP32Mac_w0_bits) & DSP32Mac_w0_mask);
   2310   int dst  = ((iw1 >> DSP32Mac_dst_bits) & DSP32Mac_dst_mask);
   2311   int result = 0;
   2312 
   2313   if (w1 == 0 && w0 == 0)
   2314     return 0;
   2315 
   2316   if (((1 << mmod) & (P ? 0x313 : 0x1b57)) == 0)
   2317     return 0;
   2318 
   2319   if (w1)
   2320     {
   2321       if (P)
   2322 	return DREG_MASK (dst | 1);
   2323       else
   2324 	return DREGH_MASK (dst);
   2325     }
   2326 
   2327   if (w0)
   2328     {
   2329       if (P)
   2330 	return DREG_MASK (dst);
   2331       else
   2332 	return DREGL_MASK (dst);
   2333     }
   2334 
   2335   return result;
   2336 }
   2337 
   2338 static int
   2339 decode_dsp32alu_0 (int iw0, int iw1)
   2340 {
   2341   /* dsp32alu
   2342      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2343      | 1 | 1 | 0 | 0 |.M.| 1 | 0 | - | - | - |.HL|.aopcde............|
   2344      |.aop...|.s.|.x.|.dst0......|.dst1......|.src0......|.src1......|
   2345      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2346   int s    = ((iw1 >> DSP32Alu_s_bits) & DSP32Alu_s_mask);
   2347   int x    = ((iw1 >> DSP32Alu_x_bits) & DSP32Alu_x_mask);
   2348   int aop  = ((iw1 >> DSP32Alu_aop_bits) & DSP32Alu_aop_mask);
   2349   int dst0 = ((iw1 >> DSP32Alu_dst0_bits) & DSP32Alu_dst0_mask);
   2350   int dst1 = ((iw1 >> DSP32Alu_dst1_bits) & DSP32Alu_dst1_mask);
   2351   int HL   = ((iw0 >> (DSP32Alu_HL_bits - 16)) & DSP32Alu_HL_mask);
   2352   int aopcde = ((iw0 >> (DSP32Alu_aopcde_bits - 16)) & DSP32Alu_aopcde_mask);
   2353 
   2354   if (aop == 0 && aopcde == 9 && s == 0)
   2355     return 0;
   2356   else if (aop == 2 && aopcde == 9 && HL == 0 && s == 0)
   2357     return 0;
   2358   else if (aop >= x * 2 && aopcde == 5)
   2359     return HL ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
   2360   else if (HL == 0 && aopcde == 2)
   2361     return DREGL_MASK (dst0);
   2362   else if (HL == 1 && aopcde == 2)
   2363     return DREGH_MASK (dst0);
   2364   else if (HL == 0 && aopcde == 3)
   2365     return DREGL_MASK (dst0);
   2366   else if (HL == 1 && aopcde == 3)
   2367     return DREGH_MASK (dst0);
   2368 
   2369   else if (aop == 0 && aopcde == 9 && s == 1)
   2370     return 0;
   2371   else if (aop == 1 && aopcde == 9 && s == 0)
   2372     return 0;
   2373   else if (aop == 2 && aopcde == 9 && s == 1)
   2374     return 0;
   2375   else if (aop == 3 && aopcde == 9 && s == 0)
   2376     return 0;
   2377   else if (aopcde == 8)
   2378     return 0;
   2379   else if (aop == 0 && aopcde == 11)
   2380     return DREG_MASK (dst0);
   2381   else if (aop == 1 && aopcde == 11)
   2382     return HL ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
   2383   else if (aopcde == 11)
   2384     return 0;
   2385   else if (aopcde == 22)
   2386     return DREG_MASK (dst0);
   2387 
   2388   else if ((aop == 0 || aop == 1) && aopcde == 14)
   2389     return 0;
   2390   else if (aop == 3 && HL == 0 && aopcde == 14)
   2391     return 0;
   2392 
   2393   else if (aop == 3 && HL == 0 && aopcde == 15)
   2394     return DREG_MASK (dst0);
   2395 
   2396   else if (aop == 1 && aopcde == 16)
   2397     return 0;
   2398 
   2399   else if (aop == 0 && aopcde == 16)
   2400     return 0;
   2401 
   2402   else if (aop == 3 && HL == 0 && aopcde == 16)
   2403     return 0;
   2404 
   2405   else if (aop == 3 && HL == 0 && aopcde == 7)
   2406     return DREG_MASK (dst0);
   2407   else if ((aop == 0 || aop == 1 || aop == 2) && aopcde == 7)
   2408     return DREG_MASK (dst0);
   2409 
   2410   else if (aop == 0 && aopcde == 12)
   2411     return DREG_MASK (dst0);
   2412   else if (aop == 1 && aopcde == 12)
   2413     return DREG_MASK (dst0) | DREG_MASK (dst1);
   2414   else if (aop == 3 && aopcde == 12)
   2415     return HL ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
   2416 
   2417   else if (aopcde == 0)
   2418     return DREG_MASK (dst0);
   2419   else if (aopcde == 1)
   2420     return DREG_MASK (dst0) | DREG_MASK (dst1);
   2421 
   2422   else if (aop == 0 && aopcde == 10)
   2423     return DREGL_MASK (dst0);
   2424   else if (aop == 1 && aopcde == 10)
   2425     return DREGL_MASK (dst0);
   2426 
   2427   else if ((aop == 1 || aop == 0) && aopcde == 4)
   2428     return DREG_MASK (dst0);
   2429   else if (aop == 2 && aopcde == 4)
   2430     return DREG_MASK (dst0) | DREG_MASK (dst1);
   2431 
   2432   else if (aop == 0 && aopcde == 17)
   2433     return DREG_MASK (dst0) | DREG_MASK (dst1);
   2434   else if (aop == 1 && aopcde == 17)
   2435     return DREG_MASK (dst0) | DREG_MASK (dst1);
   2436   else if (aop == 0 && aopcde == 18)
   2437     return 0;
   2438   else if (aop == 3 && aopcde == 18)
   2439     return 0;
   2440 
   2441   else if ((aop == 0 || aop == 1 || aop == 2) && aopcde == 6)
   2442     return DREG_MASK (dst0);
   2443 
   2444   else if ((aop == 0 || aop == 1) && aopcde == 20)
   2445     return DREG_MASK (dst0);
   2446 
   2447   else if ((aop == 0 || aop == 1) && aopcde == 21)
   2448     return DREG_MASK (dst0) | DREG_MASK (dst1);
   2449 
   2450   else if (aop == 0 && aopcde == 23 && HL == 1)
   2451     return DREG_MASK (dst0);
   2452   else if (aop == 0 && aopcde == 23 && HL == 0)
   2453     return DREG_MASK (dst0);
   2454 
   2455   else if (aop == 0 && aopcde == 24)
   2456     return DREG_MASK (dst0);
   2457   else if (aop == 1 && aopcde == 24)
   2458     return DREG_MASK (dst0) | DREG_MASK (dst1);
   2459   else if (aopcde == 13)
   2460     return DREG_MASK (dst0) | DREG_MASK (dst1);
   2461   else
   2462     return 0;
   2463 
   2464   return 4;
   2465 }
   2466 
   2467 static int
   2468 decode_dsp32shift_0 (int iw0, int iw1)
   2469 {
   2470   /* dsp32shift
   2471      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2472      | 1 | 1 | 0 | 0 |.M.| 1 | 1 | 0 | 0 | - | - |.sopcde............|
   2473      |.sop...|.HLs...|.dst0......| - | - | - |.src0......|.src1......|
   2474      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2475   int HLs  = ((iw1 >> DSP32Shift_HLs_bits) & DSP32Shift_HLs_mask);
   2476   int sop  = ((iw1 >> DSP32Shift_sop_bits) & DSP32Shift_sop_mask);
   2477   int src0 = ((iw1 >> DSP32Shift_src0_bits) & DSP32Shift_src0_mask);
   2478   int src1 = ((iw1 >> DSP32Shift_src1_bits) & DSP32Shift_src1_mask);
   2479   int dst0 = ((iw1 >> DSP32Shift_dst0_bits) & DSP32Shift_dst0_mask);
   2480   int sopcde = ((iw0 >> (DSP32Shift_sopcde_bits - 16)) & DSP32Shift_sopcde_mask);
   2481 
   2482   if (sop == 0 && sopcde == 0)
   2483     return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
   2484   else if (sop == 1 && sopcde == 0)
   2485     return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
   2486   else if (sop == 2 && sopcde == 0)
   2487     return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
   2488   else if (sop == 0 && sopcde == 3)
   2489     return 0;
   2490   else if (sop == 1 && sopcde == 3)
   2491     return 0;
   2492   else if (sop == 2 && sopcde == 3)
   2493     return 0;
   2494   else if (sop == 3 && sopcde == 3)
   2495     return DREG_MASK (dst0);
   2496   else if (sop == 0 && sopcde == 1)
   2497     return DREG_MASK (dst0);
   2498   else if (sop == 1 && sopcde == 1)
   2499     return DREG_MASK (dst0);
   2500   else if (sop == 2 && sopcde == 1)
   2501     return DREG_MASK (dst0);
   2502   else if (sopcde == 2)
   2503     return DREG_MASK (dst0);
   2504   else if (sopcde == 4)
   2505     return DREG_MASK (dst0);
   2506   else if (sop == 0 && sopcde == 5)
   2507     return DREGL_MASK (dst0);
   2508   else if (sop == 1 && sopcde == 5)
   2509     return DREGL_MASK (dst0);
   2510   else if (sop == 2 && sopcde == 5)
   2511     return DREGL_MASK (dst0);
   2512   else if (sop == 0 && sopcde == 6)
   2513     return DREGL_MASK (dst0);
   2514   else if (sop == 1 && sopcde == 6)
   2515     return DREGL_MASK (dst0);
   2516   else if (sop == 3 && sopcde == 6)
   2517     return DREGL_MASK (dst0);
   2518   else if (sop == 0 && sopcde == 7)
   2519     return DREGL_MASK (dst0);
   2520   else if (sop == 1 && sopcde == 7)
   2521     return DREGL_MASK (dst0);
   2522   else if (sop == 2 && sopcde == 7)
   2523     return DREGL_MASK (dst0);
   2524   else if (sop == 3 && sopcde == 7)
   2525     return DREGL_MASK (dst0);
   2526   else if (sop == 0 && sopcde == 8)
   2527     return DREG_MASK (src0) | DREG_MASK (src1);
   2528 #if 0
   2529     {
   2530       OUTS (outf, "BITMUX (");
   2531       OUTS (outf, dregs (src0));
   2532       OUTS (outf, ", ");
   2533       OUTS (outf, dregs (src1));
   2534       OUTS (outf, ", A0) (ASR)");
   2535     }
   2536 #endif
   2537   else if (sop == 1 && sopcde == 8)
   2538     return DREG_MASK (src0) | DREG_MASK (src1);
   2539 #if 0
   2540     {
   2541       OUTS (outf, "BITMUX (");
   2542       OUTS (outf, dregs (src0));
   2543       OUTS (outf, ", ");
   2544       OUTS (outf, dregs (src1));
   2545       OUTS (outf, ", A0) (ASL)");
   2546     }
   2547 #endif
   2548   else if (sopcde == 9)
   2549     return sop < 2 ? DREGL_MASK (dst0) : DREG_MASK (dst0);
   2550   else if (sopcde == 10)
   2551     return DREG_MASK (dst0);
   2552   else if (sop == 0 && sopcde == 11)
   2553     return DREGL_MASK (dst0);
   2554   else if (sop == 1 && sopcde == 11)
   2555     return DREGL_MASK (dst0);
   2556   else if (sop == 0 && sopcde == 12)
   2557     return 0;
   2558   else if (sop == 1 && sopcde == 12)
   2559     return DREGL_MASK (dst0);
   2560   else if (sop == 0 && sopcde == 13)
   2561     return DREG_MASK (dst0);
   2562   else if (sop == 1 && sopcde == 13)
   2563     return DREG_MASK (dst0);
   2564   else if (sop == 2 && sopcde == 13)
   2565     return DREG_MASK (dst0);
   2566 
   2567   abort ();
   2568 }
   2569 
   2570 static int
   2571 decode_dsp32shiftimm_0 (int iw0, int iw1)
   2572 {
   2573   /* dsp32shiftimm
   2574      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
   2575      | 1 | 1 | 0 | 0 |.M.| 1 | 1 | 0 | 1 | - | - |.sopcde............|
   2576      |.sop...|.HLs...|.dst0......|.immag.................|.src1......|
   2577      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
   2578   int sop      = ((iw1 >> DSP32ShiftImm_sop_bits) & DSP32ShiftImm_sop_mask);
   2579   int bit8     = ((iw1 >> 8) & 0x1);
   2580   int dst0     = ((iw1 >> DSP32ShiftImm_dst0_bits) & DSP32ShiftImm_dst0_mask);
   2581   int sopcde   = ((iw0 >> (DSP32ShiftImm_sopcde_bits - 16)) & DSP32ShiftImm_sopcde_mask);
   2582   int HLs      = ((iw1 >> DSP32ShiftImm_HLs_bits) & DSP32ShiftImm_HLs_mask);
   2583 
   2584 
   2585   if (sop == 0 && sopcde == 0)
   2586     return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
   2587   else if (sop == 1 && sopcde == 0 && bit8 == 0)
   2588     return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
   2589   else if (sop == 1 && sopcde == 0 && bit8 == 1)
   2590     return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
   2591   else if (sop == 2 && sopcde == 0 && bit8 == 0)
   2592     return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
   2593   else if (sop == 2 && sopcde == 0 && bit8 == 1)
   2594     return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
   2595   else if (sop == 2 && sopcde == 3 && HLs == 1)
   2596     return 0;
   2597   else if (sop == 0 && sopcde == 3 && HLs == 0 && bit8 == 0)
   2598     return 0;
   2599   else if (sop == 0 && sopcde == 3 && HLs == 0 && bit8 == 1)
   2600     return 0;
   2601   else if (sop == 0 && sopcde == 3 && HLs == 1 && bit8 == 0)
   2602     return 0;
   2603   else if (sop == 0 && sopcde == 3 && HLs == 1 && bit8 == 1)
   2604     return 0;
   2605   else if (sop == 1 && sopcde == 3 && HLs == 0)
   2606     return 0;
   2607   else if (sop == 1 && sopcde == 3 && HLs == 1)
   2608     return 0;
   2609   else if (sop == 2 && sopcde == 3 && HLs == 0)
   2610     return 0;
   2611   else if (sop == 1 && sopcde == 1 && bit8 == 0)
   2612     return DREG_MASK (dst0);
   2613   else if (sop == 1 && sopcde == 1 && bit8 == 1)
   2614     return DREG_MASK (dst0);
   2615   else if (sop == 2 && sopcde == 1 && bit8 == 1)
   2616     return DREG_MASK (dst0);
   2617   else if (sop == 2 && sopcde == 1 && bit8 == 0)
   2618     return DREG_MASK (dst0);
   2619   else if (sop == 0 && sopcde == 1)
   2620     return DREG_MASK (dst0);
   2621   else if (sop == 1 && sopcde == 2)
   2622     return DREG_MASK (dst0);
   2623   else if (sop == 2 && sopcde == 2 && bit8 == 1)
   2624     return DREG_MASK (dst0);
   2625   else if (sop == 2 && sopcde == 2 && bit8 == 0)
   2626     return DREG_MASK (dst0);
   2627   else if (sop == 3 && sopcde == 2)
   2628     return DREG_MASK (dst0);
   2629   else if (sop == 0 && sopcde == 2)
   2630     return DREG_MASK (dst0);
   2631 
   2632   abort ();
   2633 }
   2634 
   2635 int
   2636 insn_regmask (int iw0, int iw1)
   2637 {
   2638   if ((iw0 & 0xf7ff) == 0xc003 && iw1 == 0x1800)
   2639     return 0; /* MNOP */
   2640   else if ((iw0 & 0xff00) == 0x0000)
   2641     return decode_ProgCtrl_0 (iw0);
   2642   else if ((iw0 & 0xffc0) == 0x0240)
   2643     abort ();
   2644   else if ((iw0 & 0xff80) == 0x0100)
   2645     abort ();
   2646   else if ((iw0 & 0xfe00) == 0x0400)
   2647     abort ();
   2648   else if ((iw0 & 0xfe00) == 0x0600)
   2649     abort ();
   2650   else if ((iw0 & 0xf800) == 0x0800)
   2651     abort ();
   2652   else if ((iw0 & 0xffe0) == 0x0200)
   2653     abort ();
   2654   else if ((iw0 & 0xff00) == 0x0300)
   2655     abort ();
   2656   else if ((iw0 & 0xf000) == 0x1000)
   2657     abort ();
   2658   else if ((iw0 & 0xf000) == 0x2000)
   2659     abort ();
   2660   else if ((iw0 & 0xf000) == 0x3000)
   2661     abort ();
   2662   else if ((iw0 & 0xfc00) == 0x4000)
   2663     abort ();
   2664   else if ((iw0 & 0xfe00) == 0x4400)
   2665     abort ();
   2666   else if ((iw0 & 0xf800) == 0x4800)
   2667     abort ();
   2668   else if ((iw0 & 0xf000) == 0x5000)
   2669     abort ();
   2670   else if ((iw0 & 0xf800) == 0x6000)
   2671     abort ();
   2672   else if ((iw0 & 0xf800) == 0x6800)
   2673     abort ();
   2674   else if ((iw0 & 0xf000) == 0x8000)
   2675     return decode_LDSTpmod_0 (iw0);
   2676   else if ((iw0 & 0xff60) == 0x9e60)
   2677     return decode_dagMODim_0 (iw0);
   2678   else if ((iw0 & 0xfff0) == 0x9f60)
   2679     return decode_dagMODik_0 (iw0);
   2680   else if ((iw0 & 0xfc00) == 0x9c00)
   2681     return decode_dspLDST_0 (iw0);
   2682   else if ((iw0 & 0xf000) == 0x9000)
   2683     return decode_LDST_0 (iw0);
   2684   else if ((iw0 & 0xfc00) == 0xb800)
   2685     return decode_LDSTiiFP_0 (iw0);
   2686   else if ((iw0 & 0xe000) == 0xA000)
   2687     return decode_LDSTii_0 (iw0);
   2688   else if ((iw0 & 0xff80) == 0xe080 && (iw1 & 0x0C00) == 0x0000)
   2689     abort ();
   2690   else if ((iw0 & 0xff00) == 0xe100 && (iw1 & 0x0000) == 0x0000)
   2691     abort ();
   2692   else if ((iw0 & 0xfe00) == 0xe200 && (iw1 & 0x0000) == 0x0000)
   2693     abort ();
   2694   else if ((iw0 & 0xfc00) == 0xe400 && (iw1 & 0x0000) == 0x0000)
   2695     abort ();
   2696   else if ((iw0 & 0xfffe) == 0xe800 && (iw1 & 0x0000) == 0x0000)
   2697     abort ();
   2698   else if ((iw0 & 0xf600) == 0xc000 && (iw1 & 0x0000) == 0x0000)
   2699     return decode_dsp32mac_0 (iw0, iw1);
   2700   else if ((iw0 & 0xf600) == 0xc200 && (iw1 & 0x0000) == 0x0000)
   2701     return decode_dsp32mult_0 (iw0, iw1);
   2702   else if ((iw0 & 0xf7c0) == 0xc400 && (iw1 & 0x0000) == 0x0000)
   2703     return decode_dsp32alu_0 (iw0, iw1);
   2704   else if ((iw0 & 0xf780) == 0xc600 && (iw1 & 0x01c0) == 0x0000)
   2705     return decode_dsp32shift_0 (iw0, iw1);
   2706   else if ((iw0 & 0xf780) == 0xc680 && (iw1 & 0x0000) == 0x0000)
   2707     return decode_dsp32shiftimm_0 (iw0, iw1);
   2708   else if ((iw0 & 0xff00) == 0xf800)
   2709     abort ();
   2710   else if ((iw0 & 0xFFC0) == 0xf000 && (iw1 & 0x0000) == 0x0000)
   2711     abort ();
   2712 
   2713   abort ();
   2714 }
   2715