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