OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [gas/] [config/] [tc-bfin.c] - Blame information for rev 146

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.