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