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