[PATCH, BINUTILS, AARCH64, 1/9] Add -march=armv8.5-a and related internal feature...
[external/binutils.git] / gas / config / tc-bfin.c
1 /* tc-bfin.c -- Assembler for the ADI Blackfin.
2    Copyright (C) 2005-2018 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 "struc-symbol.h"
23 #include "bfin-defs.h"
24 #include "obstack.h"
25 #include "safe-ctype.h"
26 #ifdef OBJ_ELF
27 #include "dwarf2dbg.h"
28 #endif
29 #include "elf/common.h"
30 #include "elf/bfin.h"
31
32 extern int yyparse (void);
33 struct yy_buffer_state;
34 typedef struct yy_buffer_state *YY_BUFFER_STATE;
35 extern YY_BUFFER_STATE yy_scan_string (const char *yy_str);
36 extern void yy_delete_buffer (YY_BUFFER_STATE b);
37 static parse_state parse (char *line);
38
39 /* Global variables. */
40 struct bfin_insn *insn;
41 int last_insn_size;
42
43 extern struct obstack mempool;
44 FILE *errorf;
45
46 /* Flags to set in the elf header */
47 #define DEFAULT_FLAGS 0
48
49 #ifdef OBJ_FDPIC_ELF
50 # define DEFAULT_FDPIC EF_BFIN_FDPIC
51 #else
52 # define DEFAULT_FDPIC 0
53 #endif
54
55 static flagword bfin_flags = DEFAULT_FLAGS | DEFAULT_FDPIC;
56 static const char *bfin_pic_flag = DEFAULT_FDPIC ? "-mfdpic" : (const char *)0;
57
58 /* Blackfin specific function to handle FD-PIC pointer initializations.  */
59
60 static void
61 bfin_pic_ptr (int nbytes)
62 {
63   expressionS exp;
64   char *p;
65
66   if (nbytes != 4)
67     abort ();
68
69 #ifdef md_flush_pending_output
70   md_flush_pending_output ();
71 #endif
72
73   if (is_it_end_of_statement ())
74     {
75       demand_empty_rest_of_line ();
76       return;
77     }
78
79 #ifdef md_cons_align
80   md_cons_align (nbytes);
81 #endif
82
83   do
84     {
85       bfd_reloc_code_real_type reloc_type = BFD_RELOC_BFIN_FUNCDESC;
86
87       if (strncasecmp (input_line_pointer, "funcdesc(", 9) == 0)
88         {
89           input_line_pointer += 9;
90           expression (&exp);
91           if (*input_line_pointer == ')')
92             input_line_pointer++;
93           else
94             as_bad (_("missing ')'"));
95         }
96       else
97         error ("missing funcdesc in picptr");
98
99       p = frag_more (4);
100       memset (p, 0, 4);
101       fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &exp, 0,
102                    reloc_type);
103     }
104   while (*input_line_pointer++ == ',');
105
106   input_line_pointer--;                 /* Put terminator back into stream. */
107   demand_empty_rest_of_line ();
108 }
109
110 static void
111 bfin_s_bss (int ignore ATTRIBUTE_UNUSED)
112 {
113   int temp;
114
115   temp = get_absolute_expression ();
116   subseg_set (bss_section, (subsegT) temp);
117   demand_empty_rest_of_line ();
118 }
119
120 const pseudo_typeS md_pseudo_table[] = {
121   {"align", s_align_bytes, 0},
122   {"byte2", cons, 2},
123   {"byte4", cons, 4},
124   {"picptr", bfin_pic_ptr, 4},
125   {"code", obj_elf_section, 0},
126   {"db", cons, 1},
127   {"dd", cons, 4},
128   {"dw", cons, 2},
129   {"p", s_ignore, 0},
130   {"pdata", s_ignore, 0},
131   {"var", s_ignore, 0},
132   {"bss", bfin_s_bss, 0},
133   {0, 0, 0}
134 };
135
136 /* Characters that are used to denote comments and line separators. */
137 const char comment_chars[] = "#";
138 const char line_comment_chars[] = "#";
139 const char line_separator_chars[] = ";";
140
141 /* Characters that can be used to separate the mantissa from the
142    exponent in floating point numbers. */
143 const char EXP_CHARS[] = "eE";
144
145 /* Characters that mean this number is a floating point constant.
146    As in 0f12.456 or  0d1.2345e12.  */
147 const char FLT_CHARS[] = "fFdDxX";
148
149 typedef enum bfin_cpu_type
150 {
151   BFIN_CPU_UNKNOWN,
152   BFIN_CPU_BF504,
153   BFIN_CPU_BF506,
154   BFIN_CPU_BF512,
155   BFIN_CPU_BF514,
156   BFIN_CPU_BF516,
157   BFIN_CPU_BF518,
158   BFIN_CPU_BF522,
159   BFIN_CPU_BF523,
160   BFIN_CPU_BF524,
161   BFIN_CPU_BF525,
162   BFIN_CPU_BF526,
163   BFIN_CPU_BF527,
164   BFIN_CPU_BF531,
165   BFIN_CPU_BF532,
166   BFIN_CPU_BF533,
167   BFIN_CPU_BF534,
168   BFIN_CPU_BF536,
169   BFIN_CPU_BF537,
170   BFIN_CPU_BF538,
171   BFIN_CPU_BF539,
172   BFIN_CPU_BF542,
173   BFIN_CPU_BF542M,
174   BFIN_CPU_BF544,
175   BFIN_CPU_BF544M,
176   BFIN_CPU_BF547,
177   BFIN_CPU_BF547M,
178   BFIN_CPU_BF548,
179   BFIN_CPU_BF548M,
180   BFIN_CPU_BF549,
181   BFIN_CPU_BF549M,
182   BFIN_CPU_BF561,
183   BFIN_CPU_BF592,
184 } bfin_cpu_t;
185
186 bfin_cpu_t bfin_cpu_type = BFIN_CPU_UNKNOWN;
187 /* -msi-revision support. There are three special values:
188    -1      -msi-revision=none.
189    0xffff  -msi-revision=any.  */
190 int bfin_si_revision;
191
192 unsigned int bfin_anomaly_checks = 0;
193
194 struct bfin_cpu
195 {
196   const char *name;
197   bfin_cpu_t type;
198   int si_revision;
199   unsigned int anomaly_checks;
200 };
201
202 struct bfin_cpu bfin_cpus[] =
203 {
204   {"bf504", BFIN_CPU_BF504, 0x0000, AC_05000074},
205
206   {"bf506", BFIN_CPU_BF506, 0x0000, AC_05000074},
207
208   {"bf512", BFIN_CPU_BF512, 0x0002, AC_05000074},
209   {"bf512", BFIN_CPU_BF512, 0x0001, AC_05000074},
210   {"bf512", BFIN_CPU_BF512, 0x0000, AC_05000074},
211
212   {"bf514", BFIN_CPU_BF514, 0x0002, AC_05000074},
213   {"bf514", BFIN_CPU_BF514, 0x0001, AC_05000074},
214   {"bf514", BFIN_CPU_BF514, 0x0000, AC_05000074},
215
216   {"bf516", BFIN_CPU_BF516, 0x0002, AC_05000074},
217   {"bf516", BFIN_CPU_BF516, 0x0001, AC_05000074},
218   {"bf516", BFIN_CPU_BF516, 0x0000, AC_05000074},
219
220   {"bf518", BFIN_CPU_BF518, 0x0002, AC_05000074},
221   {"bf518", BFIN_CPU_BF518, 0x0001, AC_05000074},
222   {"bf518", BFIN_CPU_BF518, 0x0000, AC_05000074},
223
224   {"bf522", BFIN_CPU_BF522, 0x0002, AC_05000074},
225   {"bf522", BFIN_CPU_BF522, 0x0001, AC_05000074},
226   {"bf522", BFIN_CPU_BF522, 0x0000, AC_05000074},
227
228   {"bf523", BFIN_CPU_BF523, 0x0002, AC_05000074},
229   {"bf523", BFIN_CPU_BF523, 0x0001, AC_05000074},
230   {"bf523", BFIN_CPU_BF523, 0x0000, AC_05000074},
231
232   {"bf524", BFIN_CPU_BF524, 0x0002, AC_05000074},
233   {"bf524", BFIN_CPU_BF524, 0x0001, AC_05000074},
234   {"bf524", BFIN_CPU_BF524, 0x0000, AC_05000074},
235
236   {"bf525", BFIN_CPU_BF525, 0x0002, AC_05000074},
237   {"bf525", BFIN_CPU_BF525, 0x0001, AC_05000074},
238   {"bf525", BFIN_CPU_BF525, 0x0000, AC_05000074},
239
240   {"bf526", BFIN_CPU_BF526, 0x0002, AC_05000074},
241   {"bf526", BFIN_CPU_BF526, 0x0001, AC_05000074},
242   {"bf526", BFIN_CPU_BF526, 0x0000, AC_05000074},
243
244   {"bf527", BFIN_CPU_BF527, 0x0002, AC_05000074},
245   {"bf527", BFIN_CPU_BF527, 0x0001, AC_05000074},
246   {"bf527", BFIN_CPU_BF527, 0x0000, AC_05000074},
247
248   {"bf531", BFIN_CPU_BF531, 0x0006, AC_05000074},
249   {"bf531", BFIN_CPU_BF531, 0x0005, AC_05000074},
250   {"bf531", BFIN_CPU_BF531, 0x0004, AC_05000074},
251   {"bf531", BFIN_CPU_BF531, 0x0003, AC_05000074},
252
253   {"bf532", BFIN_CPU_BF532, 0x0006, AC_05000074},
254   {"bf532", BFIN_CPU_BF532, 0x0005, AC_05000074},
255   {"bf532", BFIN_CPU_BF532, 0x0004, AC_05000074},
256   {"bf532", BFIN_CPU_BF532, 0x0003, AC_05000074},
257
258   {"bf533", BFIN_CPU_BF533, 0x0006, AC_05000074},
259   {"bf533", BFIN_CPU_BF533, 0x0005, AC_05000074},
260   {"bf533", BFIN_CPU_BF533, 0x0004, AC_05000074},
261   {"bf533", BFIN_CPU_BF533, 0x0003, AC_05000074},
262
263   {"bf534", BFIN_CPU_BF534, 0x0003, AC_05000074},
264   {"bf534", BFIN_CPU_BF534, 0x0002, AC_05000074},
265   {"bf534", BFIN_CPU_BF534, 0x0001, AC_05000074},
266
267   {"bf536", BFIN_CPU_BF536, 0x0003, AC_05000074},
268   {"bf536", BFIN_CPU_BF536, 0x0002, AC_05000074},
269   {"bf536", BFIN_CPU_BF536, 0x0001, AC_05000074},
270
271   {"bf537", BFIN_CPU_BF537, 0x0003, AC_05000074},
272   {"bf537", BFIN_CPU_BF537, 0x0002, AC_05000074},
273   {"bf537", BFIN_CPU_BF537, 0x0001, AC_05000074},
274
275   {"bf538", BFIN_CPU_BF538, 0x0005, AC_05000074},
276   {"bf538", BFIN_CPU_BF538, 0x0004, AC_05000074},
277   {"bf538", BFIN_CPU_BF538, 0x0003, AC_05000074},
278   {"bf538", BFIN_CPU_BF538, 0x0002, AC_05000074},
279
280   {"bf539", BFIN_CPU_BF539, 0x0005, AC_05000074},
281   {"bf539", BFIN_CPU_BF539, 0x0004, AC_05000074},
282   {"bf539", BFIN_CPU_BF539, 0x0003, AC_05000074},
283   {"bf539", BFIN_CPU_BF539, 0x0002, AC_05000074},
284
285   {"bf542m", BFIN_CPU_BF542M, 0x0003, AC_05000074},
286
287   {"bf542", BFIN_CPU_BF542, 0x0004, AC_05000074},
288   {"bf542", BFIN_CPU_BF542, 0x0002, AC_05000074},
289   {"bf542", BFIN_CPU_BF542, 0x0001, AC_05000074},
290   {"bf542", BFIN_CPU_BF542, 0x0000, AC_05000074},
291
292   {"bf544m", BFIN_CPU_BF544M, 0x0003, AC_05000074},
293
294   {"bf544", BFIN_CPU_BF544, 0x0004, AC_05000074},
295   {"bf544", BFIN_CPU_BF544, 0x0002, AC_05000074},
296   {"bf544", BFIN_CPU_BF544, 0x0001, AC_05000074},
297   {"bf544", BFIN_CPU_BF544, 0x0000, AC_05000074},
298
299   {"bf547m", BFIN_CPU_BF547M, 0x0003, AC_05000074},
300
301   {"bf547", BFIN_CPU_BF547, 0x0004, AC_05000074},
302   {"bf547", BFIN_CPU_BF547, 0x0002, AC_05000074},
303   {"bf547", BFIN_CPU_BF547, 0x0001, AC_05000074},
304   {"bf547", BFIN_CPU_BF547, 0x0000, AC_05000074},
305
306   {"bf548m", BFIN_CPU_BF548M, 0x0003, AC_05000074},
307
308   {"bf548", BFIN_CPU_BF548, 0x0004, AC_05000074},
309   {"bf548", BFIN_CPU_BF548, 0x0002, AC_05000074},
310   {"bf548", BFIN_CPU_BF548, 0x0001, AC_05000074},
311   {"bf548", BFIN_CPU_BF548, 0x0000, AC_05000074},
312
313   {"bf549m", BFIN_CPU_BF549M, 0x0003, AC_05000074},
314
315   {"bf549", BFIN_CPU_BF549, 0x0004, AC_05000074},
316   {"bf549", BFIN_CPU_BF549, 0x0002, AC_05000074},
317   {"bf549", BFIN_CPU_BF549, 0x0001, AC_05000074},
318   {"bf549", BFIN_CPU_BF549, 0x0000, AC_05000074},
319
320   {"bf561", BFIN_CPU_BF561, 0x0005, AC_05000074},
321   {"bf561", BFIN_CPU_BF561, 0x0003, AC_05000074},
322   {"bf561", BFIN_CPU_BF561, 0x0002, AC_05000074},
323
324   {"bf592", BFIN_CPU_BF592, 0x0001, AC_05000074},
325   {"bf592", BFIN_CPU_BF592, 0x0000, AC_05000074},
326 };
327
328 /* Define bfin-specific command-line options (there are none). */
329 const char *md_shortopts = "";
330
331 #define OPTION_FDPIC            (OPTION_MD_BASE)
332 #define OPTION_NOPIC            (OPTION_MD_BASE + 1)
333 #define OPTION_MCPU             (OPTION_MD_BASE + 2)
334
335 struct option md_longopts[] =
336 {
337   { "mcpu",             required_argument,      NULL, OPTION_MCPU       },
338   { "mfdpic",           no_argument,            NULL, OPTION_FDPIC      },
339   { "mnopic",           no_argument,            NULL, OPTION_NOPIC      },
340   { "mno-fdpic",        no_argument,            NULL, OPTION_NOPIC      },
341   { NULL,               no_argument,            NULL, 0                 },
342 };
343
344 size_t md_longopts_size = sizeof (md_longopts);
345
346
347 int
348 md_parse_option (int c ATTRIBUTE_UNUSED, const char *arg ATTRIBUTE_UNUSED)
349 {
350   switch (c)
351     {
352     default:
353       return 0;
354
355     case OPTION_MCPU:
356       {
357         const char *q;
358         unsigned int i;
359
360         for (i = 0; i < ARRAY_SIZE (bfin_cpus); i++)
361           {
362             const char *p = bfin_cpus[i].name;
363             if (strncmp (arg, p, strlen (p)) == 0)
364               break;
365           }
366
367         if (i == ARRAY_SIZE (bfin_cpus))
368           as_fatal ("-mcpu=%s is not valid", arg);
369
370         bfin_cpu_type = bfin_cpus[i].type;
371
372         q = arg + strlen (bfin_cpus[i].name);
373
374         if (*q == '\0')
375           {
376             bfin_si_revision = bfin_cpus[i].si_revision;
377             bfin_anomaly_checks |= bfin_cpus[i].anomaly_checks;
378           }
379         else if (strcmp (q, "-none") == 0)
380           bfin_si_revision = -1;
381         else if (strcmp (q, "-any") == 0)
382           {
383             bfin_si_revision = 0xffff;
384             while (i < ARRAY_SIZE (bfin_cpus)
385                    && bfin_cpus[i].type == bfin_cpu_type)
386               {
387                 bfin_anomaly_checks |= bfin_cpus[i].anomaly_checks;
388                 i++;
389               }
390           }
391         else
392           {
393             unsigned int si_major, si_minor;
394             int rev_len, n;
395
396             rev_len = strlen (q);
397
398             if (sscanf (q, "-%u.%u%n", &si_major, &si_minor, &n) != 2
399                 || n != rev_len
400                 || si_major > 0xff || si_minor > 0xff)
401               {
402               invalid_silicon_revision:
403                 as_fatal ("-mcpu=%s has invalid silicon revision", arg);
404               }
405
406             bfin_si_revision = (si_major << 8) | si_minor;
407
408             while (i < ARRAY_SIZE (bfin_cpus)
409                    && bfin_cpus[i].type == bfin_cpu_type
410                    && bfin_cpus[i].si_revision != bfin_si_revision)
411               i++;
412
413             if (i == ARRAY_SIZE (bfin_cpus)
414                 || bfin_cpus[i].type != bfin_cpu_type)
415               goto invalid_silicon_revision;
416
417             bfin_anomaly_checks |= bfin_cpus[i].anomaly_checks;
418           }
419
420         break;
421       }
422
423     case OPTION_FDPIC:
424       bfin_flags |= EF_BFIN_FDPIC;
425       bfin_pic_flag = "-mfdpic";
426       break;
427
428     case OPTION_NOPIC:
429       bfin_flags &= ~(EF_BFIN_FDPIC);
430       bfin_pic_flag = 0;
431       break;
432     }
433
434   return 1;
435 }
436
437 void
438 md_show_usage (FILE * stream)
439 {
440   fprintf (stream, _(" Blackfin specific assembler options:\n"));
441   fprintf (stream, _("  -mcpu=<cpu[-sirevision]> specify the name of the target CPU\n"));
442   fprintf (stream, _("  -mfdpic                  assemble for the FDPIC ABI\n"));
443   fprintf (stream, _("  -mno-fdpic/-mnopic       disable -mfdpic\n"));
444 }
445
446 /* Perform machine-specific initializations.  */
447 void
448 md_begin (void)
449 {
450   /* Set the ELF flags if desired. */
451   if (bfin_flags)
452     bfd_set_private_flags (stdoutput, bfin_flags);
453
454   /* Set the default machine type. */
455   if (!bfd_set_arch_mach (stdoutput, bfd_arch_bfin, 0))
456     as_warn (_("Could not set architecture and machine."));
457
458   /* Ensure that lines can begin with '(', for multiple
459      register stack pops. */
460   lex_type ['('] = LEX_BEGIN_NAME;
461
462 #ifdef OBJ_ELF
463   record_alignment (text_section, 2);
464   record_alignment (data_section, 2);
465   record_alignment (bss_section, 2);
466 #endif
467
468   errorf = stderr;
469   obstack_init (&mempool);
470
471 #ifdef DEBUG
472   extern int debug_codeselection;
473   debug_codeselection = 1;
474 #endif
475
476   last_insn_size = 0;
477 }
478
479 /* Perform the main parsing, and assembly of the input here.  Also,
480    call the required routines for alignment and fixups here.
481    This is called for every line that contains real assembly code.  */
482
483 void
484 md_assemble (char *line)
485 {
486   char *toP = 0;
487   int size, insn_size;
488   struct bfin_insn *tmp_insn;
489   size_t len;
490   static size_t buffer_len = 0;
491   static char *current_inputline;
492   parse_state state;
493
494   len = strlen (line);
495   if (len + 2 > buffer_len)
496     {
497       buffer_len = len + 40;
498       current_inputline = XRESIZEVEC (char, current_inputline, buffer_len);
499     }
500   memcpy (current_inputline, line, len);
501   current_inputline[len] = ';';
502   current_inputline[len + 1] = '\0';
503
504   state = parse (current_inputline);
505   if (state == NO_INSN_GENERATED)
506     return;
507
508   for (insn_size = 0, tmp_insn = insn; tmp_insn; tmp_insn = tmp_insn->next)
509     if (!tmp_insn->reloc || !tmp_insn->exp->symbol)
510       insn_size += 2;
511
512   if (insn_size)
513     toP = frag_more (insn_size);
514
515   last_insn_size = insn_size;
516
517 #ifdef DEBUG
518   printf ("INS:");
519 #endif
520   while (insn)
521     {
522       if (insn->reloc && insn->exp->symbol)
523         {
524           char *prev_toP = toP - 2;
525           switch (insn->reloc)
526             {
527             case BFD_RELOC_BFIN_24_PCREL_JUMP_L:
528             case BFD_RELOC_24_PCREL:
529             case BFD_RELOC_BFIN_16_LOW:
530             case BFD_RELOC_BFIN_16_HIGH:
531               size = 4;
532               break;
533             default:
534               size = 2;
535             }
536
537           /* Following if condition checks for the arithmetic relocations.
538              If the case then it doesn't required to generate the code.
539              It has been assumed that, their ID will be contiguous.  */
540           if ((BFD_ARELOC_BFIN_PUSH <= insn->reloc
541                && BFD_ARELOC_BFIN_COMP >= insn->reloc)
542               || insn->reloc == BFD_RELOC_BFIN_16_IMM)
543             {
544               size = 2;
545             }
546           if (insn->reloc == BFD_ARELOC_BFIN_CONST
547               || insn->reloc == BFD_ARELOC_BFIN_PUSH)
548             size = 4;
549
550           fix_new (frag_now,
551                    (prev_toP - frag_now->fr_literal),
552                    size, insn->exp->symbol, insn->exp->value,
553                    insn->pcrel, insn->reloc);
554         }
555       else
556         {
557           md_number_to_chars (toP, insn->value, 2);
558           toP += 2;
559         }
560
561 #ifdef DEBUG
562       printf (" reloc :");
563       printf (" %02x%02x", ((unsigned char *) &insn->value)[0],
564               ((unsigned char *) &insn->value)[1]);
565       printf ("\n");
566 #endif
567       insn = insn->next;
568     }
569 #ifdef OBJ_ELF
570   dwarf2_emit_insn (insn_size);
571 #endif
572
573   while (*line++ != '\0')
574     if (*line == '\n')
575       bump_line_counters ();
576 }
577
578 /* Parse one line of instructions, and generate opcode for it.
579    To parse the line, YACC and LEX are used, because the instruction set
580    syntax doesn't confirm to the AT&T assembly syntax.
581    To call a YACC & LEX generated parser, we must provide the input via
582    a FILE stream, otherwise stdin is used by default.  Below the input
583    to the function will be put into a temporary file, then the generated
584    parser uses the temporary file for parsing.  */
585
586 static parse_state
587 parse (char *line)
588 {
589   parse_state state;
590   YY_BUFFER_STATE buffstate;
591
592   buffstate = yy_scan_string (line);
593
594   /* our lex requires setting the start state to keyword
595      every line as the first word may be a keyword.
596      Fixes a bug where we could not have keywords as labels.  */
597   set_start_state ();
598
599   /* Call yyparse here.  */
600   state = yyparse ();
601   if (state == SEMANTIC_ERROR)
602     {
603       as_bad (_("Parse failed."));
604       insn = 0;
605     }
606
607   yy_delete_buffer (buffstate);
608   return state;
609 }
610
611 /* We need to handle various expressions properly.
612    Such as, [SP--] = 34, concerned by md_assemble().  */
613
614 void
615 md_operand (expressionS * expressionP)
616 {
617   if (*input_line_pointer == '[')
618     {
619       as_tsktsk ("We found a '['!");
620       input_line_pointer++;
621       expression (expressionP);
622     }
623 }
624
625 /* Handle undefined symbols. */
626 symbolS *
627 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
628 {
629   return (symbolS *) 0;
630 }
631
632 int
633 md_estimate_size_before_relax (fragS * fragP ATTRIBUTE_UNUSED,
634                                segT segment ATTRIBUTE_UNUSED)
635 {
636   return 0;
637 }
638
639 /* Convert from target byte order to host byte order.  */
640
641 static int
642 md_chars_to_number (char *val, int n)
643 {
644   int retval;
645
646   for (retval = 0; n--;)
647     {
648       retval <<= 8;
649       retval |= val[n];
650     }
651   return retval;
652 }
653
654 void
655 md_apply_fix (fixS *fixP, valueT *valueP, segT seg ATTRIBUTE_UNUSED)
656 {
657   char *where = fixP->fx_frag->fr_literal + fixP->fx_where;
658
659   long value = *valueP;
660   long newval;
661
662   switch (fixP->fx_r_type)
663     {
664     case BFD_RELOC_BFIN_GOT:
665     case BFD_RELOC_BFIN_GOT17M4:
666     case BFD_RELOC_BFIN_FUNCDESC_GOT17M4:
667       fixP->fx_no_overflow = 1;
668       newval = md_chars_to_number (where, 2);
669       newval |= 0x0 & 0x7f;
670       md_number_to_chars (where, newval, 2);
671       break;
672
673     case BFD_RELOC_BFIN_10_PCREL:
674       if (!value)
675         break;
676       if (value < -1024 || value > 1022)
677         as_bad_where (fixP->fx_file, fixP->fx_line,
678                       _("pcrel too far BFD_RELOC_BFIN_10"));
679
680       /* 11 bit offset even numbered, so we remove right bit.  */
681       value = value >> 1;
682       newval = md_chars_to_number (where, 2);
683       newval |= value & 0x03ff;
684       md_number_to_chars (where, newval, 2);
685       break;
686
687     case BFD_RELOC_BFIN_12_PCREL_JUMP:
688     case BFD_RELOC_BFIN_12_PCREL_JUMP_S:
689     case BFD_RELOC_12_PCREL:
690       if (!value)
691         break;
692
693       if (value < -4096 || value > 4094)
694         as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far BFD_RELOC_BFIN_12"));
695       /* 13 bit offset even numbered, so we remove right bit.  */
696       value = value >> 1;
697       newval = md_chars_to_number (where, 2);
698       newval |= value & 0xfff;
699       md_number_to_chars (where, newval, 2);
700       break;
701
702     case BFD_RELOC_BFIN_16_LOW:
703     case BFD_RELOC_BFIN_16_HIGH:
704       fixP->fx_done = FALSE;
705       break;
706
707     case BFD_RELOC_BFIN_24_PCREL_JUMP_L:
708     case BFD_RELOC_BFIN_24_PCREL_CALL_X:
709     case BFD_RELOC_24_PCREL:
710       if (!value)
711         break;
712
713       if (value < -16777216 || value > 16777214)
714         as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far BFD_RELOC_BFIN_24"));
715
716       /* 25 bit offset even numbered, so we remove right bit.  */
717       value = value >> 1;
718       value++;
719
720       md_number_to_chars (where - 2, value >> 16, 1);
721       md_number_to_chars (where, value, 1);
722       md_number_to_chars (where + 1, value >> 8, 1);
723       break;
724
725     case BFD_RELOC_BFIN_5_PCREL:        /* LSETUP (a, b) : "a" */
726       if (!value)
727         break;
728       if (value < 4 || value > 30)
729         as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far BFD_RELOC_BFIN_5"));
730       value = value >> 1;
731       newval = md_chars_to_number (where, 1);
732       newval = (newval & 0xf0) | (value & 0xf);
733       md_number_to_chars (where, newval, 1);
734       break;
735
736     case BFD_RELOC_BFIN_11_PCREL:       /* LSETUP (a, b) : "b" */
737       if (!value)
738         break;
739       value += 2;
740       if (value < 4 || value > 2046)
741         as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far BFD_RELOC_BFIN_11_PCREL"));
742       /* 11 bit unsigned even, so we remove right bit.  */
743       value = value >> 1;
744       newval = md_chars_to_number (where, 2);
745       newval |= value & 0x03ff;
746       md_number_to_chars (where, newval, 2);
747       break;
748
749     case BFD_RELOC_8:
750       if (value < -0x80 || value >= 0x7f)
751         as_bad_where (fixP->fx_file, fixP->fx_line, _("rel too far BFD_RELOC_8"));
752       md_number_to_chars (where, value, 1);
753       break;
754
755     case BFD_RELOC_BFIN_16_IMM:
756     case BFD_RELOC_16:
757       if (value < -0x8000 || value >= 0x7fff)
758         as_bad_where (fixP->fx_file, fixP->fx_line, _("rel too far BFD_RELOC_16"));
759       md_number_to_chars (where, value, 2);
760       break;
761
762     case BFD_RELOC_32:
763       md_number_to_chars (where, value, 4);
764       break;
765
766     case BFD_RELOC_BFIN_PLTPC:
767       md_number_to_chars (where, value, 2);
768       break;
769
770     case BFD_RELOC_BFIN_FUNCDESC:
771     case BFD_RELOC_VTABLE_INHERIT:
772     case BFD_RELOC_VTABLE_ENTRY:
773       fixP->fx_done = FALSE;
774       break;
775
776     default:
777       if ((BFD_ARELOC_BFIN_PUSH > fixP->fx_r_type) || (BFD_ARELOC_BFIN_COMP < fixP->fx_r_type))
778         {
779           fprintf (stderr, "Relocation %d not handled in gas." " Contact support.\n", fixP->fx_r_type);
780           return;
781         }
782     }
783
784   if (!fixP->fx_addsy)
785     fixP->fx_done = TRUE;
786
787 }
788
789 /* Round up a section size to the appropriate boundary.  */
790 valueT
791 md_section_align (segT segment, valueT size)
792 {
793   int boundary = bfd_get_section_alignment (stdoutput, segment);
794   return ((size + (1 << boundary) - 1) & -(1 << boundary));
795 }
796
797
798 const char *
799 md_atof (int type, char * litP, int * sizeP)
800 {
801   return ieee_md_atof (type, litP, sizeP, FALSE);
802 }
803
804
805 /* If while processing a fixup, a reloc really needs to be created
806    then it is done here.  */
807
808 arelent *
809 tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
810 {
811   arelent *reloc;
812
813   reloc               = XNEW (arelent);
814   reloc->sym_ptr_ptr  = XNEW (asymbol *);
815   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
816   reloc->address      = fixp->fx_frag->fr_address + fixp->fx_where;
817
818   reloc->addend = fixp->fx_offset;
819   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
820
821   if (reloc->howto == (reloc_howto_type *) NULL)
822     {
823       as_bad_where (fixp->fx_file, fixp->fx_line,
824                     /* xgettext:c-format.  */
825                     _("reloc %d not supported by object file format"),
826                     (int) fixp->fx_r_type);
827
828       xfree (reloc);
829
830       return NULL;
831     }
832
833   return reloc;
834 }
835
836 /*  The location from which a PC relative jump should be calculated,
837     given a PC relative reloc.  */
838
839 long
840 md_pcrel_from_section (fixS *fixP, segT sec)
841 {
842   if (fixP->fx_addsy != (symbolS *) NULL
843       && (!S_IS_DEFINED (fixP->fx_addsy)
844       || S_GET_SEGMENT (fixP->fx_addsy) != sec))
845     {
846       /* The symbol is undefined (or is defined but not in this section).
847          Let the linker figure it out.  */
848       return 0;
849     }
850   return fixP->fx_frag->fr_address + fixP->fx_where;
851 }
852
853 /* Return true if the fix can be handled by GAS, false if it must
854    be passed through to the linker.  */
855
856 bfd_boolean
857 bfin_fix_adjustable (fixS *fixP)
858 {
859   switch (fixP->fx_r_type)
860     {
861   /* Adjust_reloc_syms doesn't know about the GOT.  */
862     case BFD_RELOC_BFIN_GOT:
863     case BFD_RELOC_BFIN_PLTPC:
864   /* We need the symbol name for the VTABLE entries.  */
865     case BFD_RELOC_VTABLE_INHERIT:
866     case BFD_RELOC_VTABLE_ENTRY:
867       return 0;
868
869     default:
870       return 1;
871     }
872 }
873
874 /* Special extra functions that help bfin-parse.y perform its job.  */
875
876 struct obstack mempool;
877
878 INSTR_T
879 conscode (INSTR_T head, INSTR_T tail)
880 {
881   if (!head)
882     return tail;
883   head->next = tail;
884   return head;
885 }
886
887 INSTR_T
888 conctcode (INSTR_T head, INSTR_T tail)
889 {
890   INSTR_T temp = (head);
891   if (!head)
892     return tail;
893   while (temp->next)
894     temp = temp->next;
895   temp->next = tail;
896
897   return head;
898 }
899
900 INSTR_T
901 note_reloc (INSTR_T code, Expr_Node * symbol, int reloc, int pcrel)
902 {
903   /* Assert that the symbol is not an operator.  */
904   gas_assert (symbol->type == Expr_Node_Reloc);
905
906   return note_reloc1 (code, symbol->value.s_value, reloc, pcrel);
907
908 }
909
910 INSTR_T
911 note_reloc1 (INSTR_T code, const char *symbol, int reloc, int pcrel)
912 {
913   code->reloc = reloc;
914   code->exp = mkexpr (0, symbol_find_or_make (symbol));
915   code->pcrel = pcrel;
916   return code;
917 }
918
919 INSTR_T
920 note_reloc2 (INSTR_T code, const char *symbol, int reloc, int value, int pcrel)
921 {
922   code->reloc = reloc;
923   code->exp = mkexpr (value, symbol_find_or_make (symbol));
924   code->pcrel = pcrel;
925   return code;
926 }
927
928 INSTR_T
929 gencode (unsigned long x)
930 {
931   INSTR_T cell = XOBNEW (&mempool, struct bfin_insn);
932   memset (cell, 0, sizeof (struct bfin_insn));
933   cell->value = (x);
934   return cell;
935 }
936
937 int reloc;
938 int ninsns;
939 int count_insns;
940
941 static void *
942 allocate (size_t n)
943 {
944   return obstack_alloc (&mempool, n);
945 }
946
947 Expr_Node *
948 Expr_Node_Create (Expr_Node_Type type,
949                   Expr_Node_Value value,
950                   Expr_Node *Left_Child,
951                   Expr_Node *Right_Child)
952 {
953
954
955   Expr_Node *node = (Expr_Node *) allocate (sizeof (Expr_Node));
956   node->type = type;
957   node->value = value;
958   node->Left_Child = Left_Child;
959   node->Right_Child = Right_Child;
960   return node;
961 }
962
963 static const char *con = ".__constant";
964 static const char *op = ".__operator";
965 static INSTR_T Expr_Node_Gen_Reloc_R (Expr_Node * head);
966 INSTR_T Expr_Node_Gen_Reloc (Expr_Node *head, int parent_reloc);
967
968 INSTR_T
969 Expr_Node_Gen_Reloc (Expr_Node * head, int parent_reloc)
970 {
971   /* Top level relocation expression generator VDSP style.
972    If the relocation is just by itself, generate one item
973    else generate this convoluted expression.  */
974
975   INSTR_T note = NULL_CODE;
976   INSTR_T note1 = NULL_CODE;
977   int pcrel = 1;  /* Is the parent reloc pc-relative?
978                   This calculation here and HOWTO should match.  */
979
980   if (parent_reloc)
981     {
982       /*  If it's 32 bit quantity then 16bit code needs to be added.  */
983       int value = 0;
984
985       if (head->type == Expr_Node_Constant)
986         {
987           /* If note1 is not null code, we have to generate a right
988              aligned value for the constant. Otherwise the reloc is
989              a part of the basic command and the yacc file
990              generates this.  */
991           value = head->value.i_value;
992         }
993       switch (parent_reloc)
994         {
995           /*  Some relocations will need to allocate extra words.  */
996         case BFD_RELOC_BFIN_16_IMM:
997         case BFD_RELOC_BFIN_16_LOW:
998         case BFD_RELOC_BFIN_16_HIGH:
999           note1 = conscode (gencode (value), NULL_CODE);
1000           pcrel = 0;
1001           break;
1002         case BFD_RELOC_BFIN_PLTPC:
1003           note1 = conscode (gencode (value), NULL_CODE);
1004           pcrel = 0;
1005           break;
1006         case BFD_RELOC_16:
1007         case BFD_RELOC_BFIN_GOT:
1008         case BFD_RELOC_BFIN_GOT17M4:
1009         case BFD_RELOC_BFIN_FUNCDESC_GOT17M4:
1010           note1 = conscode (gencode (value), NULL_CODE);
1011           pcrel = 0;
1012           break;
1013         case BFD_RELOC_24_PCREL:
1014         case BFD_RELOC_BFIN_24_PCREL_JUMP_L:
1015         case BFD_RELOC_BFIN_24_PCREL_CALL_X:
1016           /* These offsets are even numbered pcrel.  */
1017           note1 = conscode (gencode (value >> 1), NULL_CODE);
1018           break;
1019         default:
1020           note1 = NULL_CODE;
1021         }
1022     }
1023   if (head->type == Expr_Node_Constant)
1024     note = note1;
1025   else if (head->type == Expr_Node_Reloc)
1026     {
1027       note = note_reloc1 (gencode (0), head->value.s_value, parent_reloc, pcrel);
1028       if (note1 != NULL_CODE)
1029         note = conscode (note1, note);
1030     }
1031   else if (head->type == Expr_Node_Binop
1032            && (head->value.op_value == Expr_Op_Type_Add
1033                || head->value.op_value == Expr_Op_Type_Sub)
1034            && head->Left_Child->type == Expr_Node_Reloc
1035            && head->Right_Child->type == Expr_Node_Constant)
1036     {
1037       int val = head->Right_Child->value.i_value;
1038       if (head->value.op_value == Expr_Op_Type_Sub)
1039         val = -val;
1040       note = conscode (note_reloc2 (gencode (0), head->Left_Child->value.s_value,
1041                                     parent_reloc, val, 0),
1042                        NULL_CODE);
1043       if (note1 != NULL_CODE)
1044         note = conscode (note1, note);
1045     }
1046   else
1047     {
1048       /* Call the recursive function.  */
1049       note = note_reloc1 (gencode (0), op, parent_reloc, pcrel);
1050       if (note1 != NULL_CODE)
1051         note = conscode (note1, note);
1052       note = conctcode (Expr_Node_Gen_Reloc_R (head), note);
1053     }
1054   return note;
1055 }
1056
1057 static INSTR_T
1058 Expr_Node_Gen_Reloc_R (Expr_Node * head)
1059 {
1060
1061   INSTR_T note = 0;
1062   INSTR_T note1 = 0;
1063
1064   switch (head->type)
1065     {
1066     case Expr_Node_Constant:
1067       note = conscode (note_reloc2 (gencode (0), con, BFD_ARELOC_BFIN_CONST, head->value.i_value, 0), NULL_CODE);
1068       break;
1069     case Expr_Node_Reloc:
1070       note = conscode (note_reloc (gencode (0), head, BFD_ARELOC_BFIN_PUSH, 0), NULL_CODE);
1071       break;
1072     case Expr_Node_Binop:
1073       note1 = conctcode (Expr_Node_Gen_Reloc_R (head->Left_Child), Expr_Node_Gen_Reloc_R (head->Right_Child));
1074       switch (head->value.op_value)
1075         {
1076         case Expr_Op_Type_Add:
1077           note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_ADD, 0), NULL_CODE));
1078           break;
1079         case Expr_Op_Type_Sub:
1080           note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_SUB, 0), NULL_CODE));
1081           break;
1082         case Expr_Op_Type_Mult:
1083           note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_MULT, 0), NULL_CODE));
1084           break;
1085         case Expr_Op_Type_Div:
1086           note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_DIV, 0), NULL_CODE));
1087           break;
1088         case Expr_Op_Type_Mod:
1089           note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_MOD, 0), NULL_CODE));
1090           break;
1091         case Expr_Op_Type_Lshift:
1092           note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_LSHIFT, 0), NULL_CODE));
1093           break;
1094         case Expr_Op_Type_Rshift:
1095           note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_RSHIFT, 0), NULL_CODE));
1096           break;
1097         case Expr_Op_Type_BAND:
1098           note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_AND, 0), NULL_CODE));
1099           break;
1100         case Expr_Op_Type_BOR:
1101           note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_OR, 0), NULL_CODE));
1102           break;
1103         case Expr_Op_Type_BXOR:
1104           note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_XOR, 0), NULL_CODE));
1105           break;
1106         case Expr_Op_Type_LAND:
1107           note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_LAND, 0), NULL_CODE));
1108           break;
1109         case Expr_Op_Type_LOR:
1110           note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_LOR, 0), NULL_CODE));
1111           break;
1112         default:
1113           fprintf (stderr, "%s:%d:Unknown operator found for arithmetic" " relocation", __FILE__, __LINE__);
1114
1115
1116         }
1117       break;
1118     case Expr_Node_Unop:
1119       note1 = conscode (Expr_Node_Gen_Reloc_R (head->Left_Child), NULL_CODE);
1120       switch (head->value.op_value)
1121         {
1122         case Expr_Op_Type_NEG:
1123           note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_NEG, 0), NULL_CODE));
1124           break;
1125         case Expr_Op_Type_COMP:
1126           note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_COMP, 0), NULL_CODE));
1127           break;
1128         default:
1129           fprintf (stderr, "%s:%d:Unknown operator found for arithmetic" " relocation", __FILE__, __LINE__);
1130         }
1131       break;
1132     default:
1133       fprintf (stderr, "%s:%d:Unknown node expression found during " "arithmetic relocation generation", __FILE__, __LINE__);
1134     }
1135   return note;
1136 }
1137 \f
1138 /* 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     ((struct local_symbol *) linelabel)->lsy_value -= 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 \f
1986 /* This is a stripped down version of the disassembler.  The only thing it
1987    does is return a mask of registers modified by an instruction.  Only
1988    instructions that can occur in a parallel-issue bundle are handled, and
1989    only the registers that can cause a conflict are recorded.  */
1990
1991 #define DREG_MASK(n) (0x101 << (n))
1992 #define DREGH_MASK(n) (0x100 << (n))
1993 #define DREGL_MASK(n) (0x001 << (n))
1994 #define IREG_MASK(n) (1 << ((n) + 16))
1995
1996 static int
1997 decode_ProgCtrl_0 (int iw0)
1998 {
1999   if (iw0 == 0)
2000     return 0;
2001   abort ();
2002 }
2003
2004 static int
2005 decode_LDSTpmod_0 (int iw0)
2006 {
2007   /* LDSTpmod
2008      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2009      | 1 | 0 | 0 | 0 |.W.|.aop...|.reg.......|.idx.......|.ptr.......|
2010      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2011   int W   = ((iw0 >> LDSTpmod_W_bits) & LDSTpmod_W_mask);
2012   int aop = ((iw0 >> LDSTpmod_aop_bits) & LDSTpmod_aop_mask);
2013   int idx = ((iw0 >> LDSTpmod_idx_bits) & LDSTpmod_idx_mask);
2014   int ptr = ((iw0 >> LDSTpmod_ptr_bits) & LDSTpmod_ptr_mask);
2015   int reg = ((iw0 >> LDSTpmod_reg_bits) & LDSTpmod_reg_mask);
2016
2017   if (aop == 1 && W == 0 && idx == ptr)
2018     return DREGL_MASK (reg);
2019   else if (aop == 2 && W == 0 && idx == ptr)
2020     return DREGH_MASK (reg);
2021   else if (aop == 1 && W == 1 && idx == ptr)
2022     return 0;
2023   else if (aop == 2 && W == 1 && idx == ptr)
2024     return 0;
2025   else if (aop == 0 && W == 0)
2026     return DREG_MASK (reg);
2027   else if (aop == 1 && W == 0)
2028     return DREGL_MASK (reg);
2029   else if (aop == 2 && W == 0)
2030     return DREGH_MASK (reg);
2031   else if (aop == 3 && W == 0)
2032     return DREG_MASK (reg);
2033   else if (aop == 3 && W == 1)
2034     return DREG_MASK (reg);
2035   else if (aop == 0 && W == 1)
2036     return 0;
2037   else if (aop == 1 && W == 1)
2038     return 0;
2039   else if (aop == 2 && W == 1)
2040     return 0;
2041   else
2042     return 0;
2043
2044   return 2;
2045 }
2046
2047 static int
2048 decode_dagMODim_0 (int iw0)
2049 {
2050   /* dagMODim
2051      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2052      | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 |.br| 1 | 1 |.op|.m.....|.i.....|
2053      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2054   int i  = ((iw0 >> DagMODim_i_bits) & DagMODim_i_mask);
2055   int opc  = ((iw0 >> DagMODim_op_bits) & DagMODim_op_mask);
2056
2057   if (opc == 0 || opc == 1)
2058     return IREG_MASK (i);
2059   else
2060     return 0;
2061
2062   return 2;
2063 }
2064
2065 static int
2066 decode_dagMODik_0 (int iw0)
2067 {
2068   /* dagMODik
2069      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2070      | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 |.op....|.i.....|
2071      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2072   int i  = ((iw0 >> DagMODik_i_bits) & DagMODik_i_mask);
2073   return IREG_MASK (i);
2074 }
2075
2076 /* GOOD */
2077 static int
2078 decode_dspLDST_0 (int iw0)
2079 {
2080   /* dspLDST
2081      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2082      | 1 | 0 | 0 | 1 | 1 | 1 |.W.|.aop...|.m.....|.i.....|.reg.......|
2083      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2084   int i   = ((iw0 >> DspLDST_i_bits) & DspLDST_i_mask);
2085   int m   = ((iw0 >> DspLDST_m_bits) & DspLDST_m_mask);
2086   int W   = ((iw0 >> DspLDST_W_bits) & DspLDST_W_mask);
2087   int aop = ((iw0 >> DspLDST_aop_bits) & DspLDST_aop_mask);
2088   int reg = ((iw0 >> DspLDST_reg_bits) & DspLDST_reg_mask);
2089
2090   if (aop == 0 && W == 0 && m == 0)
2091     return DREG_MASK (reg) | IREG_MASK (i);
2092   else if (aop == 0 && W == 0 && m == 1)
2093     return DREGL_MASK (reg) | IREG_MASK (i);
2094   else if (aop == 0 && W == 0 && m == 2)
2095     return DREGH_MASK (reg) | IREG_MASK (i);
2096   else if (aop == 1 && W == 0 && m == 0)
2097     return DREG_MASK (reg) | IREG_MASK (i);
2098   else if (aop == 1 && W == 0 && m == 1)
2099     return DREGL_MASK (reg) | IREG_MASK (i);
2100   else if (aop == 1 && W == 0 && m == 2)
2101     return DREGH_MASK (reg) | IREG_MASK (i);
2102   else if (aop == 2 && W == 0 && m == 0)
2103     return DREG_MASK (reg);
2104   else if (aop == 2 && W == 0 && m == 1)
2105     return DREGL_MASK (reg);
2106   else if (aop == 2 && W == 0 && m == 2)
2107     return DREGH_MASK (reg);
2108   else if (aop == 0 && W == 1 && m == 0)
2109     return IREG_MASK (i);
2110   else if (aop == 0 && W == 1 && m == 1)
2111     return IREG_MASK (i);
2112   else if (aop == 0 && W == 1 && m == 2)
2113     return IREG_MASK (i);
2114   else if (aop == 1 && W == 1 && m == 0)
2115     return IREG_MASK (i);
2116   else if (aop == 1 && W == 1 && m == 1)
2117     return IREG_MASK (i);
2118   else if (aop == 1 && W == 1 && m == 2)
2119     return IREG_MASK (i);
2120   else if (aop == 2 && W == 1 && m == 0)
2121     return 0;
2122   else if (aop == 2 && W == 1 && m == 1)
2123     return 0;
2124   else if (aop == 2 && W == 1 && m == 2)
2125     return 0;
2126   else if (aop == 3 && W == 0)
2127     return DREG_MASK (reg) | IREG_MASK (i);
2128   else if (aop == 3 && W == 1)
2129     return IREG_MASK (i);
2130
2131   abort ();
2132 }
2133
2134 /* GOOD */
2135 static int
2136 decode_LDST_0 (int iw0)
2137 {
2138   /* LDST
2139      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2140      | 1 | 0 | 0 | 1 |.sz....|.W.|.aop...|.Z.|.ptr.......|.reg.......|
2141      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2142   int Z   = ((iw0 >> LDST_Z_bits) & LDST_Z_mask);
2143   int W   = ((iw0 >> LDST_W_bits) & LDST_W_mask);
2144   int sz  = ((iw0 >> LDST_sz_bits) & LDST_sz_mask);
2145   int aop = ((iw0 >> LDST_aop_bits) & LDST_aop_mask);
2146   int reg = ((iw0 >> LDST_reg_bits) & LDST_reg_mask);
2147
2148   if (aop == 0 && sz == 0 && Z == 0 && W == 0)
2149     return DREG_MASK (reg);
2150   else if (aop == 0 && sz == 0 && Z == 1 && W == 0)
2151     return 0;
2152   else if (aop == 0 && sz == 1 && Z == 0 && W == 0)
2153     return DREG_MASK (reg);
2154   else if (aop == 0 && sz == 1 && Z == 1 && W == 0)
2155     return DREG_MASK (reg);
2156   else if (aop == 0 && sz == 2 && Z == 0 && W == 0)
2157     return DREG_MASK (reg);
2158   else if (aop == 0 && sz == 2 && Z == 1 && W == 0)
2159     return DREG_MASK (reg);
2160   else if (aop == 1 && sz == 0 && Z == 0 && W == 0)
2161     return DREG_MASK (reg);
2162   else if (aop == 1 && sz == 0 && Z == 1 && W == 0)
2163     return 0;
2164   else if (aop == 1 && sz == 1 && Z == 0 && W == 0)
2165     return DREG_MASK (reg);
2166   else if (aop == 1 && sz == 1 && Z == 1 && W == 0)
2167     return DREG_MASK (reg);
2168   else if (aop == 1 && sz == 2 && Z == 0 && W == 0)
2169     return DREG_MASK (reg);
2170   else if (aop == 1 && sz == 2 && Z == 1 && W == 0)
2171     return DREG_MASK (reg);
2172   else if (aop == 2 && sz == 0 && Z == 0 && W == 0)
2173     return DREG_MASK (reg);
2174   else if (aop == 2 && sz == 0 && Z == 1 && W == 0)
2175     return 0;
2176   else if (aop == 2 && sz == 1 && Z == 0 && W == 0)
2177     return DREG_MASK (reg);
2178   else if (aop == 2 && sz == 1 && Z == 1 && W == 0)
2179     return DREG_MASK (reg);
2180   else if (aop == 2 && sz == 2 && Z == 0 && W == 0)
2181     return DREG_MASK (reg);
2182   else if (aop == 2 && sz == 2 && Z == 1 && W == 0)
2183     return DREG_MASK (reg);
2184   else if (aop == 0 && sz == 0 && Z == 0 && W == 1)
2185     return 0;
2186   else if (aop == 0 && sz == 0 && Z == 1 && W == 1)
2187     return 0;
2188   else if (aop == 0 && sz == 1 && Z == 0 && W == 1)
2189     return 0;
2190   else if (aop == 0 && sz == 2 && Z == 0 && W == 1)
2191     return 0;
2192   else if (aop == 1 && sz == 0 && Z == 0 && W == 1)
2193     return 0;
2194   else if (aop == 1 && sz == 0 && Z == 1 && W == 1)
2195     return 0;
2196   else if (aop == 1 && sz == 1 && Z == 0 && W == 1)
2197     return 0;
2198   else if (aop == 1 && sz == 2 && Z == 0 && W == 1)
2199     return 0;
2200   else if (aop == 2 && sz == 0 && Z == 0 && W == 1)
2201     return 0;
2202   else if (aop == 2 && sz == 0 && Z == 1 && W == 1)
2203     return 0;
2204   else if (aop == 2 && sz == 1 && Z == 0 && W == 1)
2205     return 0;
2206   else if (aop == 2 && sz == 2 && Z == 0 && W == 1)
2207     return 0;
2208
2209   abort ();
2210 }
2211
2212 static int
2213 decode_LDSTiiFP_0 (int iw0)
2214 {
2215   /* LDSTiiFP
2216      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2217      | 1 | 0 | 1 | 1 | 1 | 0 |.W.|.offset............|.reg...........|
2218      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2219   int reg = ((iw0 >> LDSTiiFP_reg_bits) & LDSTiiFP_reg_mask);
2220   int W = ((iw0 >> LDSTiiFP_W_bits) & LDSTiiFP_W_mask);
2221
2222   if (W == 0)
2223     return reg < 8 ? DREG_MASK (reg) : 0;
2224   else
2225     return 0;
2226 }
2227
2228 static int
2229 decode_LDSTii_0 (int iw0)
2230 {
2231   /* LDSTii
2232      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2233      | 1 | 0 | 1 |.W.|.op....|.offset........|.ptr.......|.reg.......|
2234      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2235   int reg = ((iw0 >> LDSTii_reg_bit) & LDSTii_reg_mask);
2236   int opc = ((iw0 >> LDSTii_op_bit) & LDSTii_op_mask);
2237   int W = ((iw0 >> LDSTii_W_bit) & LDSTii_W_mask);
2238
2239   if (W == 0 && opc != 3)
2240     return DREG_MASK (reg);
2241   else if (W == 0 && opc == 3)
2242    return 0;
2243   else if (W == 1 && opc == 0)
2244     return 0;
2245   else if (W == 1 && opc == 1)
2246     return 0;
2247   else if (W == 1 && opc == 3)
2248     return 0;
2249
2250   abort ();
2251 }
2252
2253 static int
2254 decode_dsp32mac_0 (int iw0, int iw1)
2255 {
2256   int result = 0;
2257   /* dsp32mac
2258      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2259      | 1 | 1 | 0 | 0 |.M.| 0 | 0 |.mmod..........|.MM|.P.|.w1|.op1...|
2260      |.h01|.h11|.w0|.op0...|.h00|.h10|.dst.......|.src0......|.src1..|
2261      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2262   int op1  = ((iw0 >> (DSP32Mac_op1_bits - 16)) & DSP32Mac_op1_mask);
2263   int w1   = ((iw0 >> (DSP32Mac_w1_bits - 16)) & DSP32Mac_w1_mask);
2264   int P    = ((iw0 >> (DSP32Mac_p_bits - 16)) & DSP32Mac_p_mask);
2265   int mmod = ((iw0 >> (DSP32Mac_mmod_bits - 16)) & DSP32Mac_mmod_mask);
2266   int w0   = ((iw1 >> DSP32Mac_w0_bits) & DSP32Mac_w0_mask);
2267   int MM   = ((iw1 >> DSP32Mac_MM_bits) & DSP32Mac_MM_mask);
2268   int dst  = ((iw1 >> DSP32Mac_dst_bits) & DSP32Mac_dst_mask);
2269   int op0  = ((iw1 >> DSP32Mac_op0_bits) & DSP32Mac_op0_mask);
2270
2271   if (w0 == 0 && w1 == 0 && op1 == 3 && op0 == 3)
2272     return 0;
2273
2274   if (op1 == 3 && MM)
2275     return 0;
2276
2277   if ((w1 || w0) && mmod == M_W32)
2278     return 0;
2279
2280   if (((1 << mmod) & (P ? 0x131b : 0x1b5f)) == 0)
2281     return 0;
2282
2283   if (w1 == 1 || op1 != 3)
2284     {
2285       if (w1)
2286         {
2287           if (P)
2288             return DREG_MASK (dst + 1);
2289           else
2290             return DREGH_MASK (dst);
2291         }
2292     }
2293
2294   if (w0 == 1 || op0 != 3)
2295     {
2296       if (w0)
2297         {
2298           if (P)
2299             return DREG_MASK (dst);
2300           else
2301             return DREGL_MASK (dst);
2302         }
2303     }
2304
2305   return result;
2306 }
2307
2308 static int
2309 decode_dsp32mult_0 (int iw0, int iw1)
2310 {
2311   /* dsp32mult
2312      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2313      | 1 | 1 | 0 | 0 |.M.| 0 | 1 |.mmod..........|.MM|.P.|.w1|.op1...|
2314      |.h01|.h11|.w0|.op0...|.h00|.h10|.dst.......|.src0......|.src1..|
2315      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2316   int w1   = ((iw0 >> (DSP32Mac_w1_bits - 16)) & DSP32Mac_w1_mask);
2317   int P    = ((iw0 >> (DSP32Mac_p_bits - 16)) & DSP32Mac_p_mask);
2318   int mmod = ((iw0 >> (DSP32Mac_mmod_bits - 16)) & DSP32Mac_mmod_mask);
2319   int w0   = ((iw1 >> DSP32Mac_w0_bits) & DSP32Mac_w0_mask);
2320   int dst  = ((iw1 >> DSP32Mac_dst_bits) & DSP32Mac_dst_mask);
2321   int result = 0;
2322
2323   if (w1 == 0 && w0 == 0)
2324     return 0;
2325
2326   if (((1 << mmod) & (P ? 0x313 : 0x1b57)) == 0)
2327     return 0;
2328
2329   if (w1)
2330     {
2331       if (P)
2332         return DREG_MASK (dst | 1);
2333       else
2334         return DREGH_MASK (dst);
2335     }
2336
2337   if (w0)
2338     {
2339       if (P)
2340         return DREG_MASK (dst);
2341       else
2342         return DREGL_MASK (dst);
2343     }
2344
2345   return result;
2346 }
2347
2348 static int
2349 decode_dsp32alu_0 (int iw0, int iw1)
2350 {
2351   /* dsp32alu
2352      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2353      | 1 | 1 | 0 | 0 |.M.| 1 | 0 | - | - | - |.HL|.aopcde............|
2354      |.aop...|.s.|.x.|.dst0......|.dst1......|.src0......|.src1......|
2355      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2356   int s    = ((iw1 >> DSP32Alu_s_bits) & DSP32Alu_s_mask);
2357   int x    = ((iw1 >> DSP32Alu_x_bits) & DSP32Alu_x_mask);
2358   int aop  = ((iw1 >> DSP32Alu_aop_bits) & DSP32Alu_aop_mask);
2359   int dst0 = ((iw1 >> DSP32Alu_dst0_bits) & DSP32Alu_dst0_mask);
2360   int dst1 = ((iw1 >> DSP32Alu_dst1_bits) & DSP32Alu_dst1_mask);
2361   int HL   = ((iw0 >> (DSP32Alu_HL_bits - 16)) & DSP32Alu_HL_mask);
2362   int aopcde = ((iw0 >> (DSP32Alu_aopcde_bits - 16)) & DSP32Alu_aopcde_mask);
2363
2364   if (aop == 0 && aopcde == 9 && s == 0)
2365     return 0;
2366   else if (aop == 2 && aopcde == 9 && HL == 0 && s == 0)
2367     return 0;
2368   else if (aop >= x * 2 && aopcde == 5)
2369     return HL ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2370   else if (HL == 0 && aopcde == 2)
2371     return DREGL_MASK (dst0);
2372   else if (HL == 1 && aopcde == 2)
2373     return DREGH_MASK (dst0);
2374   else if (HL == 0 && aopcde == 3)
2375     return DREGL_MASK (dst0);
2376   else if (HL == 1 && aopcde == 3)
2377     return DREGH_MASK (dst0);
2378
2379   else if (aop == 0 && aopcde == 9 && s == 1)
2380     return 0;
2381   else if (aop == 1 && aopcde == 9 && s == 0)
2382     return 0;
2383   else if (aop == 2 && aopcde == 9 && s == 1)
2384     return 0;
2385   else if (aop == 3 && aopcde == 9 && s == 0)
2386     return 0;
2387   else if (aopcde == 8)
2388     return 0;
2389   else if (aop == 0 && aopcde == 11)
2390     return DREG_MASK (dst0);
2391   else if (aop == 1 && aopcde == 11)
2392     return HL ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2393   else if (aopcde == 11)
2394     return 0;
2395   else if (aopcde == 22)
2396     return DREG_MASK (dst0);
2397
2398   else if ((aop == 0 || aop == 1) && aopcde == 14)
2399     return 0;
2400   else if (aop == 3 && HL == 0 && aopcde == 14)
2401     return 0;
2402
2403   else if (aop == 3 && HL == 0 && aopcde == 15)
2404     return DREG_MASK (dst0);
2405
2406   else if (aop == 1 && aopcde == 16)
2407     return 0;
2408
2409   else if (aop == 0 && aopcde == 16)
2410     return 0;
2411
2412   else if (aop == 3 && HL == 0 && aopcde == 16)
2413     return 0;
2414
2415   else if (aop == 3 && HL == 0 && aopcde == 7)
2416     return DREG_MASK (dst0);
2417   else if ((aop == 0 || aop == 1 || aop == 2) && aopcde == 7)
2418     return DREG_MASK (dst0);
2419
2420   else if (aop == 0 && aopcde == 12)
2421     return DREG_MASK (dst0);
2422   else if (aop == 1 && aopcde == 12)
2423     return DREG_MASK (dst0) | DREG_MASK (dst1);
2424   else if (aop == 3 && aopcde == 12)
2425     return HL ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2426
2427   else if (aopcde == 0)
2428     return DREG_MASK (dst0);
2429   else if (aopcde == 1)
2430     return DREG_MASK (dst0) | DREG_MASK (dst1);
2431
2432   else if (aop == 0 && aopcde == 10)
2433     return DREGL_MASK (dst0);
2434   else if (aop == 1 && aopcde == 10)
2435     return DREGL_MASK (dst0);
2436
2437   else if ((aop == 1 || aop == 0) && aopcde == 4)
2438     return DREG_MASK (dst0);
2439   else if (aop == 2 && aopcde == 4)
2440     return DREG_MASK (dst0) | DREG_MASK (dst1);
2441
2442   else if (aop == 0 && aopcde == 17)
2443     return DREG_MASK (dst0) | DREG_MASK (dst1);
2444   else if (aop == 1 && aopcde == 17)
2445     return DREG_MASK (dst0) | DREG_MASK (dst1);
2446   else if (aop == 0 && aopcde == 18)
2447     return 0;
2448   else if (aop == 3 && aopcde == 18)
2449     return 0;
2450
2451   else if ((aop == 0 || aop == 1 || aop == 2) && aopcde == 6)
2452     return DREG_MASK (dst0);
2453
2454   else if ((aop == 0 || aop == 1) && aopcde == 20)
2455     return DREG_MASK (dst0);
2456
2457   else if ((aop == 0 || aop == 1) && aopcde == 21)
2458     return DREG_MASK (dst0) | DREG_MASK (dst1);
2459
2460   else if (aop == 0 && aopcde == 23 && HL == 1)
2461     return DREG_MASK (dst0);
2462   else if (aop == 0 && aopcde == 23 && HL == 0)
2463     return DREG_MASK (dst0);
2464
2465   else if (aop == 0 && aopcde == 24)
2466     return DREG_MASK (dst0);
2467   else if (aop == 1 && aopcde == 24)
2468     return DREG_MASK (dst0) | DREG_MASK (dst1);
2469   else if (aopcde == 13)
2470     return DREG_MASK (dst0) | DREG_MASK (dst1);
2471   else
2472     return 0;
2473
2474   return 4;
2475 }
2476
2477 static int
2478 decode_dsp32shift_0 (int iw0, int iw1)
2479 {
2480   /* dsp32shift
2481      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2482      | 1 | 1 | 0 | 0 |.M.| 1 | 1 | 0 | 0 | - | - |.sopcde............|
2483      |.sop...|.HLs...|.dst0......| - | - | - |.src0......|.src1......|
2484      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2485   int HLs  = ((iw1 >> DSP32Shift_HLs_bits) & DSP32Shift_HLs_mask);
2486   int sop  = ((iw1 >> DSP32Shift_sop_bits) & DSP32Shift_sop_mask);
2487   int src0 = ((iw1 >> DSP32Shift_src0_bits) & DSP32Shift_src0_mask);
2488   int src1 = ((iw1 >> DSP32Shift_src1_bits) & DSP32Shift_src1_mask);
2489   int dst0 = ((iw1 >> DSP32Shift_dst0_bits) & DSP32Shift_dst0_mask);
2490   int sopcde = ((iw0 >> (DSP32Shift_sopcde_bits - 16)) & DSP32Shift_sopcde_mask);
2491
2492   if (sop == 0 && sopcde == 0)
2493     return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2494   else if (sop == 1 && sopcde == 0)
2495     return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2496   else if (sop == 2 && sopcde == 0)
2497     return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2498   else if (sop == 0 && sopcde == 3)
2499     return 0;
2500   else if (sop == 1 && sopcde == 3)
2501     return 0;
2502   else if (sop == 2 && sopcde == 3)
2503     return 0;
2504   else if (sop == 3 && sopcde == 3)
2505     return DREG_MASK (dst0);
2506   else if (sop == 0 && sopcde == 1)
2507     return DREG_MASK (dst0);
2508   else if (sop == 1 && sopcde == 1)
2509     return DREG_MASK (dst0);
2510   else if (sop == 2 && sopcde == 1)
2511     return DREG_MASK (dst0);
2512   else if (sopcde == 2)
2513     return DREG_MASK (dst0);
2514   else if (sopcde == 4)
2515     return DREG_MASK (dst0);
2516   else if (sop == 0 && sopcde == 5)
2517     return DREGL_MASK (dst0);
2518   else if (sop == 1 && sopcde == 5)
2519     return DREGL_MASK (dst0);
2520   else if (sop == 2 && sopcde == 5)
2521     return DREGL_MASK (dst0);
2522   else if (sop == 0 && sopcde == 6)
2523     return DREGL_MASK (dst0);
2524   else if (sop == 1 && sopcde == 6)
2525     return DREGL_MASK (dst0);
2526   else if (sop == 3 && sopcde == 6)
2527     return DREGL_MASK (dst0);
2528   else if (sop == 0 && sopcde == 7)
2529     return DREGL_MASK (dst0);
2530   else if (sop == 1 && sopcde == 7)
2531     return DREGL_MASK (dst0);
2532   else if (sop == 2 && sopcde == 7)
2533     return DREGL_MASK (dst0);
2534   else if (sop == 3 && sopcde == 7)
2535     return DREGL_MASK (dst0);
2536   else if (sop == 0 && sopcde == 8)
2537     return DREG_MASK (src0) | DREG_MASK (src1);
2538 #if 0
2539     {
2540       OUTS (outf, "BITMUX (");
2541       OUTS (outf, dregs (src0));
2542       OUTS (outf, ", ");
2543       OUTS (outf, dregs (src1));
2544       OUTS (outf, ", A0) (ASR)");
2545     }
2546 #endif
2547   else if (sop == 1 && sopcde == 8)
2548     return DREG_MASK (src0) | DREG_MASK (src1);
2549 #if 0
2550     {
2551       OUTS (outf, "BITMUX (");
2552       OUTS (outf, dregs (src0));
2553       OUTS (outf, ", ");
2554       OUTS (outf, dregs (src1));
2555       OUTS (outf, ", A0) (ASL)");
2556     }
2557 #endif
2558   else if (sopcde == 9)
2559     return sop < 2 ? DREGL_MASK (dst0) : DREG_MASK (dst0);
2560   else if (sopcde == 10)
2561     return DREG_MASK (dst0);
2562   else if (sop == 0 && sopcde == 11)
2563     return DREGL_MASK (dst0);
2564   else if (sop == 1 && sopcde == 11)
2565     return DREGL_MASK (dst0);
2566   else if (sop == 0 && sopcde == 12)
2567     return 0;
2568   else if (sop == 1 && sopcde == 12)
2569     return DREGL_MASK (dst0);
2570   else if (sop == 0 && sopcde == 13)
2571     return DREG_MASK (dst0);
2572   else if (sop == 1 && sopcde == 13)
2573     return DREG_MASK (dst0);
2574   else if (sop == 2 && sopcde == 13)
2575     return DREG_MASK (dst0);
2576
2577   abort ();
2578 }
2579
2580 static int
2581 decode_dsp32shiftimm_0 (int iw0, int iw1)
2582 {
2583   /* dsp32shiftimm
2584      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2585      | 1 | 1 | 0 | 0 |.M.| 1 | 1 | 0 | 1 | - | - |.sopcde............|
2586      |.sop...|.HLs...|.dst0......|.immag.................|.src1......|
2587      +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2588   int sop      = ((iw1 >> DSP32ShiftImm_sop_bits) & DSP32ShiftImm_sop_mask);
2589   int bit8     = ((iw1 >> 8) & 0x1);
2590   int dst0     = ((iw1 >> DSP32ShiftImm_dst0_bits) & DSP32ShiftImm_dst0_mask);
2591   int sopcde   = ((iw0 >> (DSP32ShiftImm_sopcde_bits - 16)) & DSP32ShiftImm_sopcde_mask);
2592   int HLs      = ((iw1 >> DSP32ShiftImm_HLs_bits) & DSP32ShiftImm_HLs_mask);
2593
2594
2595   if (sop == 0 && sopcde == 0)
2596     return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2597   else if (sop == 1 && sopcde == 0 && bit8 == 0)
2598     return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2599   else if (sop == 1 && sopcde == 0 && bit8 == 1)
2600     return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2601   else if (sop == 2 && sopcde == 0 && bit8 == 0)
2602     return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2603   else if (sop == 2 && sopcde == 0 && bit8 == 1)
2604     return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2605   else if (sop == 2 && sopcde == 3 && HLs == 1)
2606     return 0;
2607   else if (sop == 0 && sopcde == 3 && HLs == 0 && bit8 == 0)
2608     return 0;
2609   else if (sop == 0 && sopcde == 3 && HLs == 0 && bit8 == 1)
2610     return 0;
2611   else if (sop == 0 && sopcde == 3 && HLs == 1 && bit8 == 0)
2612     return 0;
2613   else if (sop == 0 && sopcde == 3 && HLs == 1 && bit8 == 1)
2614     return 0;
2615   else if (sop == 1 && sopcde == 3 && HLs == 0)
2616     return 0;
2617   else if (sop == 1 && sopcde == 3 && HLs == 1)
2618     return 0;
2619   else if (sop == 2 && sopcde == 3 && HLs == 0)
2620     return 0;
2621   else if (sop == 1 && sopcde == 1 && bit8 == 0)
2622     return DREG_MASK (dst0);
2623   else if (sop == 1 && sopcde == 1 && bit8 == 1)
2624     return DREG_MASK (dst0);
2625   else if (sop == 2 && sopcde == 1 && bit8 == 1)
2626     return DREG_MASK (dst0);
2627   else if (sop == 2 && sopcde == 1 && bit8 == 0)
2628     return DREG_MASK (dst0);
2629   else if (sop == 0 && sopcde == 1)
2630     return DREG_MASK (dst0);
2631   else if (sop == 1 && sopcde == 2)
2632     return DREG_MASK (dst0);
2633   else if (sop == 2 && sopcde == 2 && bit8 == 1)
2634     return DREG_MASK (dst0);
2635   else if (sop == 2 && sopcde == 2 && bit8 == 0)
2636     return DREG_MASK (dst0);
2637   else if (sop == 3 && sopcde == 2)
2638     return DREG_MASK (dst0);
2639   else if (sop == 0 && sopcde == 2)
2640     return DREG_MASK (dst0);
2641
2642   abort ();
2643 }
2644
2645 int
2646 insn_regmask (int iw0, int iw1)
2647 {
2648   if ((iw0 & 0xf7ff) == 0xc003 && iw1 == 0x1800)
2649     return 0; /* MNOP */
2650   else if ((iw0 & 0xff00) == 0x0000)
2651     return decode_ProgCtrl_0 (iw0);
2652   else if ((iw0 & 0xffc0) == 0x0240)
2653     abort ();
2654   else if ((iw0 & 0xff80) == 0x0100)
2655     abort ();
2656   else if ((iw0 & 0xfe00) == 0x0400)
2657     abort ();
2658   else if ((iw0 & 0xfe00) == 0x0600)
2659     abort ();
2660   else if ((iw0 & 0xf800) == 0x0800)
2661     abort ();
2662   else if ((iw0 & 0xffe0) == 0x0200)
2663     abort ();
2664   else if ((iw0 & 0xff00) == 0x0300)
2665     abort ();
2666   else if ((iw0 & 0xf000) == 0x1000)
2667     abort ();
2668   else if ((iw0 & 0xf000) == 0x2000)
2669     abort ();
2670   else if ((iw0 & 0xf000) == 0x3000)
2671     abort ();
2672   else if ((iw0 & 0xfc00) == 0x4000)
2673     abort ();
2674   else if ((iw0 & 0xfe00) == 0x4400)
2675     abort ();
2676   else if ((iw0 & 0xf800) == 0x4800)
2677     abort ();
2678   else if ((iw0 & 0xf000) == 0x5000)
2679     abort ();
2680   else if ((iw0 & 0xf800) == 0x6000)
2681     abort ();
2682   else if ((iw0 & 0xf800) == 0x6800)
2683     abort ();
2684   else if ((iw0 & 0xf000) == 0x8000)
2685     return decode_LDSTpmod_0 (iw0);
2686   else if ((iw0 & 0xff60) == 0x9e60)
2687     return decode_dagMODim_0 (iw0);
2688   else if ((iw0 & 0xfff0) == 0x9f60)
2689     return decode_dagMODik_0 (iw0);
2690   else if ((iw0 & 0xfc00) == 0x9c00)
2691     return decode_dspLDST_0 (iw0);
2692   else if ((iw0 & 0xf000) == 0x9000)
2693     return decode_LDST_0 (iw0);
2694   else if ((iw0 & 0xfc00) == 0xb800)
2695     return decode_LDSTiiFP_0 (iw0);
2696   else if ((iw0 & 0xe000) == 0xA000)
2697     return decode_LDSTii_0 (iw0);
2698   else if ((iw0 & 0xff80) == 0xe080 && (iw1 & 0x0C00) == 0x0000)
2699     abort ();
2700   else if ((iw0 & 0xff00) == 0xe100 && (iw1 & 0x0000) == 0x0000)
2701     abort ();
2702   else if ((iw0 & 0xfe00) == 0xe200 && (iw1 & 0x0000) == 0x0000)
2703     abort ();
2704   else if ((iw0 & 0xfc00) == 0xe400 && (iw1 & 0x0000) == 0x0000)
2705     abort ();
2706   else if ((iw0 & 0xfffe) == 0xe800 && (iw1 & 0x0000) == 0x0000)
2707     abort ();
2708   else if ((iw0 & 0xf600) == 0xc000 && (iw1 & 0x0000) == 0x0000)
2709     return decode_dsp32mac_0 (iw0, iw1);
2710   else if ((iw0 & 0xf600) == 0xc200 && (iw1 & 0x0000) == 0x0000)
2711     return decode_dsp32mult_0 (iw0, iw1);
2712   else if ((iw0 & 0xf7c0) == 0xc400 && (iw1 & 0x0000) == 0x0000)
2713     return decode_dsp32alu_0 (iw0, iw1);
2714   else if ((iw0 & 0xf780) == 0xc600 && (iw1 & 0x01c0) == 0x0000)
2715     return decode_dsp32shift_0 (iw0, iw1);
2716   else if ((iw0 & 0xf780) == 0xc680 && (iw1 & 0x0000) == 0x0000)
2717     return decode_dsp32shiftimm_0 (iw0, iw1);
2718   else if ((iw0 & 0xff00) == 0xf800)
2719     abort ();
2720   else if ((iw0 & 0xFFC0) == 0xf000 && (iw1 & 0x0000) == 0x0000)
2721     abort ();
2722
2723   abort ();
2724 }