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