1 /* tc-mcore.c -- Assemble code for M*Core
2    Copyright 1999, 2000, 2001, 2002, 2003, 2005
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 2, 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 <stdio.h>
23 #include "as.h"
24 #include "bfd.h"
25 #include "subsegs.h"
26 #define DEFINE_TABLE
27 #include "../opcodes/mcore-opc.h"
28 #include "safe-ctype.h"
29 #include <string.h>
30 
31 #ifdef OBJ_ELF
32 #include "elf/mcore.h"
33 #endif
34 
35 #ifndef streq
36 #define streq(a,b) (strcmp (a, b) == 0)
37 #endif
38 
39 /* Forward declarations for dumb compilers.  */
40 
41 /* Several places in this file insert raw instructions into the
42    object. They should use MCORE_INST_XXX macros to get the opcodes
43    and then use these two macros to crack the MCORE_INST value into
44    the appropriate byte values.  */
45 #define	INST_BYTE0(x)  (target_big_endian ? (((x) >> 8) & 0xFF) : ((x) & 0xFF))
46 #define	INST_BYTE1(x)  (target_big_endian ? ((x) & 0xFF) : (((x) >> 8) & 0xFF))
47 
48 const char comment_chars[] = "#/";
49 const char line_separator_chars[] = ";";
50 const char line_comment_chars[] = "#/";
51 
52 static int do_jsri2bsr = 0;	/* Change here from 1 by Cruess 19 August 97.  */
53 static int sifilter_mode = 0;
54 
55 const char EXP_CHARS[] = "eE";
56 
57 /* Chars that mean this number is a floating point constant
58     As in 0f12.456
59     or    0d1.2345e12  */
60 const char FLT_CHARS[] = "rRsSfFdDxXpP";
61 
62 #define C(what,length) (((what) << 2) + (length))
63 #define GET_WHAT(x)    ((x >> 2))
64 
65 /* These are the two types of relaxable instruction.  */
66 #define COND_JUMP  1
67 #define UNCD_JUMP  2
68 
69 #define UNDEF_DISP      0
70 #define DISP12          1
71 #define DISP32          2
72 #define UNDEF_WORD_DISP 3
73 
74 #define C12_LEN	        2
75 #define C32_LEN	       10	/* Allow for align.  */
76 #define U12_LEN	        2
77 #define U32_LEN	        8	/* Allow for align.  */
78 
79 typedef enum
80 {
81   M210,
82   M340
83 }
84 cpu_type;
85 
86 cpu_type cpu = M340;
87 
88 /* Initialize the relax table.  */
89 const relax_typeS md_relax_table[] =
90 {
91   {    0,     0, 0,	  0 },
92   {    0,     0, 0,	  0 },
93   {    0,     0, 0,	  0 },
94   {    0,     0, 0,	  0 },
95 
96   /* COND_JUMP */
97   {    0,     0, 0,	  0 },			  /* UNDEF_DISP */
98   { 2048, -2046, C12_LEN, C(COND_JUMP, DISP32) }, /* DISP12 */
99   {    0,     0, C32_LEN, 0 },			  /* DISP32 */
100   {    0,     0, C32_LEN, 0 },			  /* UNDEF_WORD_DISP */
101 
102   /* UNCD_JUMP */
103   {    0,     0, 0,	  0 },			  /* UNDEF_DISP */
104   { 2048, -2046, U12_LEN, C(UNCD_JUMP, DISP32) }, /* DISP12 */
105   {    0,     0, U32_LEN, 0 },			  /* DISP32 */
106   {    0,     0, U32_LEN, 0 }			  /* UNDEF_WORD_DISP */
107 
108 };
109 
110 /* Literal pool data structures.  */
111 struct literal
112 {
113   unsigned short  refcnt;
114   unsigned char	  ispcrel;
115   unsigned char	  unused;
116   expressionS	  e;
117 };
118 
119 #define MAX_POOL_SIZE	(1024/4)
120 static struct literal litpool [MAX_POOL_SIZE];
121 static unsigned poolsize;
122 static unsigned poolnumber;
123 static unsigned long poolspan;
124 
125 /* SPANPANIC: the point at which we get too scared and force a dump
126    of the literal pool, and perhaps put a branch in place.
127    Calculated as:
128   		 1024	span of lrw/jmpi/jsri insn (actually span+1)
129   		-2	possible alignment at the insn.
130   		-2	possible alignment to get the table aligned.
131   		-2	an inserted branch around the table.
132   	     == 1018
133    at 1018, we might be in trouble.
134    -- so we have to be smaller than 1018 and since we deal with 2-byte
135    instructions, the next good choice is 1016.
136    -- Note we have a test case that fails when we've got 1018 here.  */
137 #define SPANPANIC	(1016)		/* 1024 - 1 entry - 2 byte rounding.  */
138 #define SPANCLOSE	(900)
139 #define SPANEXIT	(600)
140 static symbolS * poolsym;		/* Label for current pool.  */
141 static char poolname[8];
142 static struct hash_control * opcode_hash_control;	/* Opcode mnemonics.  */
143 
144 #define POOL_END_LABEL   ".LE"
145 #define POOL_START_LABEL ".LS"
146 
147 static void
make_name(char * s,char * p,int n)148 make_name (char * s, char * p, int n)
149 {
150   static const char hex[] = "0123456789ABCDEF";
151 
152   s[0] = p[0];
153   s[1] = p[1];
154   s[2] = p[2];
155   s[3] = hex[(n >> 12) & 0xF];
156   s[4] = hex[(n >>  8) & 0xF];
157   s[5] = hex[(n >>  4) & 0xF];
158   s[6] = hex[(n)       & 0xF];
159   s[7] = 0;
160 }
161 
162 static void
dump_literals(int isforce)163 dump_literals (int isforce)
164 {
165   unsigned int i;
166   struct literal * p;
167   symbolS * brarsym = NULL;
168 
169   if (poolsize == 0)
170     return;
171 
172   /* Must we branch around the literal table?  */
173   if (isforce)
174     {
175       char * output;
176       char brarname[8];
177 
178       make_name (brarname, POOL_END_LABEL, poolnumber);
179 
180       brarsym = symbol_make (brarname);
181 
182       symbol_table_insert (brarsym);
183 
184       output = frag_var (rs_machine_dependent,
185 			 md_relax_table[C (UNCD_JUMP, DISP32)].rlx_length,
186 			 md_relax_table[C (UNCD_JUMP, DISP12)].rlx_length,
187 			 C (UNCD_JUMP, 0), brarsym, 0, 0);
188       output[0] = INST_BYTE0 (MCORE_INST_BR);	/* br .+xxx */
189       output[1] = INST_BYTE1 (MCORE_INST_BR);
190     }
191 
192   /* Make sure that the section is sufficiently aligned and that
193      the literal table is aligned within it.  */
194   record_alignment (now_seg, 2);
195   frag_align (2, 0, 0);
196 
197   colon (S_GET_NAME (poolsym));
198 
199   for (i = 0, p = litpool; i < poolsize; i++, p++)
200     emit_expr (& p->e, 4);
201 
202   if (brarsym != NULL)
203     colon (S_GET_NAME (brarsym));
204 
205    poolsize = 0;
206 }
207 
208 static void
mcore_s_literals(int ignore ATTRIBUTE_UNUSED)209 mcore_s_literals (int ignore ATTRIBUTE_UNUSED)
210 {
211   dump_literals (0);
212   demand_empty_rest_of_line ();
213 }
214 
215 /* Perform FUNC (ARG), and track number of bytes added to frag.  */
216 
217 static void
mcore_pool_count(void (* func)(int),int arg)218 mcore_pool_count (void (*func) (int), int arg)
219 {
220   const fragS *curr_frag = frag_now;
221   offsetT added = -frag_now_fix_octets ();
222 
223   (*func) (arg);
224 
225   while (curr_frag != frag_now)
226     {
227       added += curr_frag->fr_fix;
228       curr_frag = curr_frag->fr_next;
229     }
230 
231   added += frag_now_fix_octets ();
232   poolspan += added;
233 }
234 
235 static void
check_literals(int kind,int offset)236 check_literals (int kind, int offset)
237 {
238   poolspan += offset;
239 
240   /* SPANCLOSE and SPANEXIT are smaller numbers than SPANPANIC.
241      SPANPANIC means that we must dump now.
242      kind == 0 is any old instruction.
243      kind  > 0 means we just had a control transfer instruction.
244      kind == 1 means within a function
245      kind == 2 means we just left a function
246 
247      The dump_literals (1) call inserts a branch around the table, so
248      we first look to see if its a situation where we won't have to
249      insert a branch (e.g., the previous instruction was an unconditional
250      branch).
251 
252      SPANPANIC is the point where we must dump a single-entry pool.
253      it accounts for alignments and an inserted branch.
254      the 'poolsize*2' accounts for the scenario where we do:
255        lrw r1,lit1; lrw r2,lit2; lrw r3,lit3
256      Note that the 'lit2' reference is 2 bytes further along
257      but the literal it references will be 4 bytes further along,
258      so we must consider the poolsize into this equation.
259      This is slightly over-cautious, but guarantees that we won't
260      panic because a relocation is too distant.  */
261 
262   if (poolspan > SPANCLOSE && kind > 0)
263     dump_literals (0);
264   else if (poolspan > SPANEXIT && kind > 1)
265     dump_literals (0);
266   else if (poolspan >= (SPANPANIC - poolsize * 2))
267     dump_literals (1);
268 }
269 
270 static void
mcore_cons(int nbytes)271 mcore_cons (int nbytes)
272 {
273   if (now_seg == text_section)
274     mcore_pool_count (cons, nbytes);
275   else
276     cons (nbytes);
277 
278   /* In theory we ought to call check_literals (2,0) here in case
279      we need to dump the literal table.  We cannot do this however,
280      as the directives that we are intercepting may be being used
281      to build a switch table, and we must not interfere with its
282      contents.  Instead we cross our fingers and pray...  */
283 }
284 
285 static void
mcore_float_cons(int float_type)286 mcore_float_cons (int float_type)
287 {
288   if (now_seg == text_section)
289     mcore_pool_count (float_cons, float_type);
290   else
291     float_cons (float_type);
292 
293   /* See the comment in mcore_cons () about calling check_literals.
294      It is unlikely that a switch table will be constructed using
295      floating point values, but it is still likely that an indexed
296      table of floating point constants is being created by these
297      directives, so again we must not interfere with their placement.  */
298 }
299 
300 static void
mcore_stringer(int append_zero)301 mcore_stringer (int append_zero)
302 {
303   if (now_seg == text_section)
304     mcore_pool_count (stringer, append_zero);
305   else
306     stringer (append_zero);
307 
308   /* We call check_literals here in case a large number of strings are
309      being placed into the text section with a sequence of stringer
310      directives.  In theory we could be upsetting something if these
311      strings are actually in an indexed table instead of referenced by
312      individual labels.  Let us hope that that never happens.  */
313   check_literals (2, 0);
314 }
315 
316 static void
mcore_fill(int unused)317 mcore_fill (int unused)
318 {
319   if (now_seg == text_section)
320     mcore_pool_count (s_fill, unused);
321   else
322     s_fill (unused);
323 
324   check_literals (2, 0);
325 }
326 
327 /* Handle the section changing pseudo-ops.  These call through to the
328    normal implementations, but they dump the literal pool first.  */
329 
330 static void
mcore_s_text(int ignore)331 mcore_s_text (int ignore)
332 {
333   dump_literals (0);
334 
335 #ifdef OBJ_ELF
336   obj_elf_text (ignore);
337 #else
338   s_text (ignore);
339 #endif
340 }
341 
342 static void
mcore_s_data(int ignore)343 mcore_s_data (int ignore)
344 {
345   dump_literals (0);
346 
347 #ifdef OBJ_ELF
348   obj_elf_data (ignore);
349 #else
350   s_data (ignore);
351 #endif
352 }
353 
354 static void
mcore_s_section(int ignore)355 mcore_s_section (int ignore)
356 {
357   /* Scan forwards to find the name of the section.  If the section
358      being switched to is ".line" then this is a DWARF1 debug section
359      which is arbitrarily placed inside generated code.  In this case
360      do not dump the literal pool because it is a) inefficient and
361      b) would require the generation of extra code to jump around the
362      pool.  */
363   char * ilp = input_line_pointer;
364 
365   while (*ilp != 0 && ISSPACE (*ilp))
366     ++ ilp;
367 
368   if (strncmp (ilp, ".line", 5) == 0
369       && (ISSPACE (ilp[5]) || *ilp == '\n' || *ilp == '\r'))
370     ;
371   else
372     dump_literals (0);
373 
374 #ifdef OBJ_ELF
375   obj_elf_section (ignore);
376 #endif
377 #ifdef OBJ_COFF
378   obj_coff_section (ignore);
379 #endif
380 }
381 
382 static void
mcore_s_bss(int needs_align)383 mcore_s_bss (int needs_align)
384 {
385   dump_literals (0);
386 
387   s_lcomm_bytes (needs_align);
388 }
389 
390 #ifdef OBJ_ELF
391 static void
mcore_s_comm(int needs_align)392 mcore_s_comm (int needs_align)
393 {
394   dump_literals (0);
395 
396   obj_elf_common (needs_align);
397 }
398 #endif
399 
400 /* This table describes all the machine specific pseudo-ops the assembler
401    has to support.  The fields are:
402      Pseudo-op name without dot
403      Function to call to execute this pseudo-op
404      Integer arg to pass to the function.   */
405 const pseudo_typeS md_pseudo_table[] =
406 {
407   { "export",   s_globl,          0 },
408   { "import",   s_ignore,         0 },
409   { "literals", mcore_s_literals, 0 },
410   { "page",     listing_eject,    0 },
411 
412   /* The following are to intercept the placement of data into the text
413      section (eg addresses for a switch table), so that the space they
414      occupy can be taken into account when deciding whether or not to
415      dump the current literal pool.
416      XXX - currently we do not cope with the .space and .dcb.d directives.  */
417   { "ascii",    mcore_stringer,       0 },
418   { "asciz",    mcore_stringer,       1 },
419   { "byte",     mcore_cons,           1 },
420   { "dc",       mcore_cons,           2 },
421   { "dc.b",     mcore_cons,           1 },
422   { "dc.d",     mcore_float_cons,    'd'},
423   { "dc.l",     mcore_cons,           4 },
424   { "dc.s",     mcore_float_cons,    'f'},
425   { "dc.w",     mcore_cons,           2 },
426   { "dc.x",     mcore_float_cons,    'x'},
427   { "double",   mcore_float_cons,    'd'},
428   { "float",    mcore_float_cons,    'f'},
429   { "hword",    mcore_cons,           2 },
430   { "int",      mcore_cons,           4 },
431   { "long",     mcore_cons,           4 },
432   { "octa",     mcore_cons,          16 },
433   { "quad",     mcore_cons,           8 },
434   { "short",    mcore_cons,           2 },
435   { "single",   mcore_float_cons,    'f'},
436   { "string",   mcore_stringer,       1 },
437   { "word",     mcore_cons,           2 },
438   { "fill",     mcore_fill,           0 },
439 
440   /* Allow for the effect of section changes.  */
441   { "text",      mcore_s_text,    0 },
442   { "data",      mcore_s_data,    0 },
443   { "bss",       mcore_s_bss,     1 },
444 #ifdef OBJ_ELF
445   { "comm",      mcore_s_comm,    0 },
446 #endif
447   { "section",   mcore_s_section, 0 },
448   { "section.s", mcore_s_section, 0 },
449   { "sect",      mcore_s_section, 0 },
450   { "sect.s",    mcore_s_section, 0 },
451 
452   { 0,          0,                0 }
453 };
454 
455 /* This function is called once, at assembler startup time.  This should
456    set up all the tables, etc that the MD part of the assembler needs.  */
457 
458 void
md_begin(void)459 md_begin (void)
460 {
461   const mcore_opcode_info * opcode;
462   char * prev_name = "";
463 
464   opcode_hash_control = hash_new ();
465 
466   /* Insert unique names into hash table.  */
467   for (opcode = mcore_table; opcode->name; opcode ++)
468     {
469       if (! streq (prev_name, opcode->name))
470 	{
471 	  prev_name = opcode->name;
472 	  hash_insert (opcode_hash_control, opcode->name, (char *) opcode);
473 	}
474     }
475 }
476 
477 /* Get a log2(val).  */
478 
479 static int
mylog2(unsigned int val)480 mylog2 (unsigned int val)
481 {
482   int log = -1;
483 
484   while (val != 0)
485       {
486 	log ++;
487 	val >>= 1;
488       }
489 
490   return log;
491 }
492 
493 /* Try to parse a reg name.  */
494 
495 static char *
parse_reg(char * s,unsigned * reg)496 parse_reg (char * s, unsigned * reg)
497 {
498   /* Strip leading whitespace.  */
499   while (ISSPACE (* s))
500     ++ s;
501 
502   if (TOLOWER (s[0]) == 'r')
503     {
504       if (s[1] == '1' && s[2] >= '0' && s[2] <= '5')
505 	{
506 	  *reg = 10 + s[2] - '0';
507 	  return s + 3;
508 	}
509 
510       if (s[1] >= '0' && s[1] <= '9')
511 	{
512 	  *reg = s[1] - '0';
513 	  return s + 2;
514 	}
515     }
516   else if (   TOLOWER (s[0]) == 's'
517 	   && TOLOWER (s[1]) == 'p'
518 	   && ! ISALNUM (s[2]))
519     {
520       * reg = 0;
521       return s + 2;
522     }
523 
524   as_bad (_("register expected, but saw '%.6s'"), s);
525   return s;
526 }
527 
528 static struct Cregs
529 {
530   char * name;
531   unsigned int crnum;
532 }
533 cregs[] =
534 {
535   { "psr",	 0},
536   { "vbr",	 1},
537   { "epsr",	 2},
538   { "fpsr",	 3},
539   { "epc",	 4},
540   { "fpc",	 5},
541   { "ss0",	 6},
542   { "ss1",	 7},
543   { "ss2",	 8},
544   { "ss3",	 9},
545   { "ss4",	10},
546   { "gcr",	11},
547   { "gsr",	12},
548   { "",		 0}
549 };
550 
551 static char *
parse_creg(char * s,unsigned * reg)552 parse_creg (char * s, unsigned * reg)
553 {
554   int i;
555 
556   /* Strip leading whitespace.  */
557   while (ISSPACE (* s))
558     ++s;
559 
560   if ((TOLOWER (s[0]) == 'c' && TOLOWER (s[1]) == 'r'))
561     {
562       if (s[2] == '3' && s[3] >= '0' && s[3] <= '1')
563 	{
564 	  *reg = 30 + s[3] - '0';
565 	  return s + 4;
566 	}
567 
568       if (s[2] == '2' && s[3] >= '0' && s[3] <= '9')
569 	{
570 	  *reg = 20 + s[3] - '0';
571 	  return s + 4;
572 	}
573 
574       if (s[2] == '1' && s[3] >= '0' && s[3] <= '9')
575 	{
576 	  *reg = 10 + s[3] - '0';
577 	  return s + 4;
578 	}
579 
580       if (s[2] >= '0' && s[2] <= '9')
581 	{
582 	  *reg = s[2] - '0';
583 	  return s + 3;
584 	}
585     }
586 
587   /* Look at alternate creg names before giving error.  */
588   for (i = 0; cregs[i].name[0] != '\0'; i++)
589     {
590       char buf [10];
591       int  length;
592       int  j;
593 
594       length = strlen (cregs[i].name);
595 
596       for (j = 0; j < length; j++)
597 	buf[j] = TOLOWER (s[j]);
598 
599       if (strncmp (cregs[i].name, buf, length) == 0)
600 	{
601 	  *reg = cregs[i].crnum;
602 	  return s + length;
603 	}
604     }
605 
606   as_bad (_("control register expected, but saw '%.6s'"), s);
607 
608   return s;
609 }
610 
611 static char *
parse_psrmod(char * s,unsigned * reg)612 parse_psrmod (char * s, unsigned * reg)
613 {
614   int  i;
615   char buf[10];
616   static struct psrmods
617   {
618     char *       name;
619     unsigned int value;
620   }
621   psrmods[] =
622   {
623     { "ie", 1 },
624     { "fe", 2 },
625     { "ee", 4 },
626     { "af", 8 }	/* Really 0 and non-combinable.  */
627   };
628 
629   for (i = 0; i < 2; i++)
630     buf[i] = TOLOWER (s[i]);
631 
632   for (i = sizeof (psrmods) / sizeof (psrmods[0]); i--;)
633     {
634       if (! strncmp (psrmods[i].name, buf, 2))
635 	{
636 	  * reg = psrmods[i].value;
637 
638 	  return s + 2;
639 	}
640     }
641 
642   as_bad (_("bad/missing psr specifier"));
643 
644   * reg = 0;
645 
646   return s;
647 }
648 
649 static char *
parse_exp(char * s,expressionS * e)650 parse_exp (char * s, expressionS * e)
651 {
652   char * save;
653   char * new;
654 
655   /* Skip whitespace.  */
656   while (ISSPACE (* s))
657     ++ s;
658 
659   save = input_line_pointer;
660   input_line_pointer = s;
661 
662   expression (e);
663 
664   if (e->X_op == O_absent)
665     as_bad (_("missing operand"));
666 
667   new = input_line_pointer;
668   input_line_pointer = save;
669 
670   return new;
671 }
672 
673 static int
enter_literal(expressionS * e,int ispcrel)674 enter_literal (expressionS * e, int ispcrel)
675 {
676   unsigned int i;
677   struct literal * p;
678 
679   if (poolsize >= MAX_POOL_SIZE - 2)
680     /* The literal pool is as full as we can handle. We have
681        to be 2 entries shy of the 1024/4=256 entries because we
682        have to allow for the branch (2 bytes) and the alignment
683        (2 bytes before the first insn referencing the pool and
684        2 bytes before the pool itself) == 6 bytes, rounds up
685        to 2 entries.  */
686     dump_literals (1);
687 
688   if (poolsize == 0)
689     {
690       /* Create new literal pool.  */
691       if (++ poolnumber > 0xFFFF)
692 	as_fatal (_("more than 65K literal pools"));
693 
694       make_name (poolname, POOL_START_LABEL, poolnumber);
695       poolsym = symbol_make (poolname);
696       symbol_table_insert (poolsym);
697       poolspan = 0;
698     }
699 
700   /* Search pool for value so we don't have duplicates.  */
701   for (p = litpool, i = 0; i < poolsize; i++, p++)
702     {
703       if (e->X_op == p->e.X_op
704 	  && e->X_add_symbol == p->e.X_add_symbol
705 	  && e->X_add_number == p->e.X_add_number
706 	  && ispcrel == p->ispcrel)
707 	{
708 	  p->refcnt ++;
709 	  return i;
710 	}
711     }
712 
713   p->refcnt  = 1;
714   p->ispcrel = ispcrel;
715   p->e       = * e;
716 
717   poolsize ++;
718 
719   return i;
720 }
721 
722 /* Parse a literal specification. -- either new or old syntax.
723    old syntax: the user supplies the label and places the literal.
724    new syntax: we put it into the literal pool.  */
725 
726 static char *
parse_rt(char * s,char ** outputp,int ispcrel,expressionS * ep)727 parse_rt (char * s,
728 	  char ** outputp,
729 	  int ispcrel,
730 	  expressionS * ep)
731 {
732   expressionS e;
733   int n;
734 
735   if (ep)
736     /* Indicate nothing there.  */
737     ep->X_op = O_absent;
738 
739   if (*s == '[')
740     {
741       s = parse_exp (s + 1, & e);
742 
743       if (*s == ']')
744 	s++;
745       else
746 	as_bad (_("missing ']'"));
747     }
748   else
749     {
750       s = parse_exp (s, & e);
751 
752       n = enter_literal (& e, ispcrel);
753 
754       if (ep)
755 	*ep = e;
756 
757       /* Create a reference to pool entry.  */
758       e.X_op         = O_symbol;
759       e.X_add_symbol = poolsym;
760       e.X_add_number = n << 2;
761     }
762 
763   * outputp = frag_more (2);
764 
765   fix_new_exp (frag_now, (*outputp) - frag_now->fr_literal, 2, & e, 1,
766 	       BFD_RELOC_MCORE_PCREL_IMM8BY4);
767 
768   return s;
769 }
770 
771 static char *
parse_imm(char * s,unsigned * val,unsigned min,unsigned max)772 parse_imm (char * s,
773 	   unsigned * val,
774 	   unsigned min,
775 	   unsigned max)
776 {
777   char * new;
778   expressionS e;
779 
780   new = parse_exp (s, & e);
781 
782   if (e.X_op == O_absent)
783     ; /* An error message has already been emitted.  */
784   else if (e.X_op != O_constant)
785     as_bad (_("operand must be a constant"));
786   else if ((addressT) e.X_add_number < min || (addressT) e.X_add_number > max)
787     as_bad (_("operand must be absolute in range %u..%u, not %ld"),
788 	    min, max, (long) e.X_add_number);
789 
790   * val = e.X_add_number;
791 
792   return new;
793 }
794 
795 static char *
parse_mem(char * s,unsigned * reg,unsigned * off,unsigned siz)796 parse_mem (char * s,
797 	   unsigned * reg,
798 	   unsigned * off,
799 	   unsigned siz)
800 {
801   * off = 0;
802 
803   while (ISSPACE (* s))
804     ++ s;
805 
806   if (* s == '(')
807     {
808       s = parse_reg (s + 1, reg);
809 
810       while (ISSPACE (* s))
811 	++ s;
812 
813       if (* s == ',')
814 	{
815 	  s = parse_imm (s + 1, off, 0, 63);
816 
817 	  if (siz > 1)
818 	    {
819 	      if (siz > 2)
820 		{
821 		  if (* off & 0x3)
822 		    as_bad (_("operand must be a multiple of 4"));
823 
824 		  * off >>= 2;
825 		}
826 	      else
827 		{
828 		  if (* off & 0x1)
829 		    as_bad (_("operand must be a multiple of 2"));
830 
831 		  * off >>= 1;
832 		}
833 	    }
834 	}
835 
836       while (ISSPACE (* s))
837 	++ s;
838 
839       if (* s == ')')
840 	s ++;
841     }
842   else
843     as_bad (_("base register expected"));
844 
845   return s;
846 }
847 
848 /* This is the guts of the machine-dependent assembler.  STR points to a
849    machine dependent instruction.  This function is supposed to emit
850    the frags/bytes it assembles to.  */
851 
852 void
md_assemble(char * str)853 md_assemble (char * str)
854 {
855   char * op_start;
856   char * op_end;
857   mcore_opcode_info * opcode;
858   char * output;
859   int nlen = 0;
860   unsigned short inst;
861   unsigned reg;
862   unsigned off;
863   unsigned isize;
864   expressionS e;
865   char name[20];
866 
867   /* Drop leading whitespace.  */
868   while (ISSPACE (* str))
869     str ++;
870 
871   /* Find the op code end.  */
872   for (op_start = op_end = str;
873        nlen < 20 && !is_end_of_line [(unsigned char) *op_end] && *op_end != ' ';
874        op_end++)
875     {
876       name[nlen] = op_start[nlen];
877       nlen++;
878     }
879 
880   name [nlen] = 0;
881 
882   if (nlen == 0)
883     {
884       as_bad (_("can't find opcode "));
885       return;
886     }
887 
888   opcode = (mcore_opcode_info *) hash_find (opcode_hash_control, name);
889   if (opcode == NULL)
890     {
891       as_bad (_("unknown opcode \"%s\""), name);
892       return;
893     }
894 
895   inst = opcode->inst;
896   isize = 2;
897 
898   switch (opcode->opclass)
899     {
900     case O0:
901       output = frag_more (2);
902       break;
903 
904     case OT:
905       op_end = parse_imm (op_end + 1, & reg, 0, 3);
906       inst |= reg;
907       output = frag_more (2);
908       break;
909 
910     case O1:
911       op_end = parse_reg (op_end + 1, & reg);
912       inst |= reg;
913       output = frag_more (2);
914       break;
915 
916     case JMP:
917       op_end = parse_reg (op_end + 1, & reg);
918       inst |= reg;
919       output = frag_more (2);
920       /* In a sifilter mode, we emit this insn 2 times,
921 	 fixes problem of an interrupt during a jmp..  */
922       if (sifilter_mode)
923 	{
924 	  output[0] = INST_BYTE0 (inst);
925 	  output[1] = INST_BYTE1 (inst);
926 	  output = frag_more (2);
927 	}
928       break;
929 
930     case JSR:
931       op_end = parse_reg (op_end + 1, & reg);
932 
933       if (reg == 15)
934 	as_bad (_("invalid register: r15 illegal"));
935 
936       inst |= reg;
937       output = frag_more (2);
938 
939       if (sifilter_mode)
940 	{
941 	  /* Replace with:  bsr .+2 ; addi r15,6; jmp rx ; jmp rx.  */
942 	  inst = MCORE_INST_BSR;	/* With 0 displacement.  */
943 	  output[0] = INST_BYTE0 (inst);
944 	  output[1] = INST_BYTE1 (inst);
945 
946 	  output = frag_more (2);
947 	  inst = MCORE_INST_ADDI;
948 	  inst |= 15;			/* addi r15,6  */
949 	  inst |= (6 - 1) << 4;		/* Over the jmp's.  */
950 	  output[0] = INST_BYTE0 (inst);
951 	  output[1] = INST_BYTE1 (inst);
952 
953 	  output = frag_more (2);
954 	  inst = MCORE_INST_JMP | reg;
955 	  output[0] = INST_BYTE0 (inst);
956 	  output[1] = INST_BYTE1 (inst);
957 
958 	  /* 2nd emitted in fallthrough.  */
959 	  output = frag_more (2);
960 	}
961       break;
962 
963     case OC:
964       op_end = parse_reg (op_end + 1, & reg);
965       inst |= reg;
966 
967       /* Skip whitespace.  */
968       while (ISSPACE (* op_end))
969 	++ op_end;
970 
971       if (*op_end == ',')
972 	{
973 	  op_end = parse_creg (op_end + 1, & reg);
974 	  inst |= reg << 4;
975 	}
976 
977       output = frag_more (2);
978       break;
979 
980     case MULSH:
981       if (cpu == M210)
982 	{
983 	  as_bad (_("M340 specific opcode used when assembling for M210"));
984 	  break;
985 	}
986       /* drop through...  */
987     case O2:
988       op_end = parse_reg (op_end + 1, & reg);
989       inst |= reg;
990 
991       /* Skip whitespace.  */
992       while (ISSPACE (* op_end))
993 	++ op_end;
994 
995       if (* op_end == ',')
996 	{
997 	  op_end = parse_reg (op_end + 1, & reg);
998 	  inst |= reg << 4;
999 	}
1000       else
1001 	as_bad (_("second operand missing"));
1002 
1003       output = frag_more (2);
1004       break;
1005 
1006     case X1:
1007       /* Handle both syntax-> xtrb- r1,rx OR xtrb- rx.  */
1008       op_end = parse_reg (op_end + 1, & reg);
1009 
1010       /* Skip whitespace.  */
1011       while (ISSPACE (* op_end))
1012 	++ op_end;
1013 
1014       if (* op_end == ',')	/* xtrb- r1,rx.  */
1015 	{
1016 	  if (reg != 1)
1017 	    as_bad (_("destination register must be r1"));
1018 
1019 	  op_end = parse_reg (op_end + 1, & reg);
1020 	}
1021 
1022       inst |= reg;
1023       output = frag_more (2);
1024       break;
1025 
1026     case O1R1:  /* div- rx,r1.  */
1027       op_end = parse_reg (op_end + 1, & reg);
1028       inst |= reg;
1029 
1030       /* Skip whitespace.  */
1031       while (ISSPACE (* op_end))
1032 	++ op_end;
1033 
1034       if (* op_end == ',')
1035 	{
1036 	  op_end = parse_reg (op_end + 1, & reg);
1037 	  if (reg != 1)
1038 	    as_bad (_("source register must be r1"));
1039 	}
1040       else
1041 	as_bad (_("second operand missing"));
1042 
1043       output = frag_more (2);
1044       break;
1045 
1046     case OI:
1047       op_end = parse_reg (op_end + 1, & reg);
1048       inst |= reg;
1049 
1050       /* Skip whitespace.  */
1051       while (ISSPACE (* op_end))
1052 	++ op_end;
1053 
1054       if (* op_end == ',')
1055 	{
1056 	  op_end = parse_imm (op_end + 1, & reg, 1, 32);
1057 	  inst |= (reg - 1) << 4;
1058 	}
1059       else
1060 	as_bad (_("second operand missing"));
1061 
1062       output = frag_more (2);
1063       break;
1064 
1065     case OB:
1066       op_end = parse_reg (op_end + 1, & reg);
1067       inst |= reg;
1068 
1069       /* Skip whitespace.  */
1070       while (ISSPACE (* op_end))
1071 	++ op_end;
1072 
1073       if (* op_end == ',')
1074 	{
1075 	  op_end = parse_imm (op_end + 1, & reg, 0, 31);
1076 	  inst |= reg << 4;
1077 	}
1078       else
1079 	as_bad (_("second operand missing"));
1080 
1081       output = frag_more (2);
1082       break;
1083 
1084     case OB2:
1085       /* Like OB, but arg is 2^n instead of n.  */
1086       op_end = parse_reg (op_end + 1, & reg);
1087       inst |= reg;
1088 
1089       /* Skip whitespace.  */
1090       while (ISSPACE (* op_end))
1091 	++ op_end;
1092 
1093       if (* op_end == ',')
1094 	{
1095 	  op_end = parse_imm (op_end + 1, & reg, 1, 1 << 31);
1096 	  /* Further restrict the immediate to a power of two.  */
1097 	  if ((reg & (reg - 1)) == 0)
1098 	    reg = mylog2 (reg);
1099 	  else
1100 	    {
1101 	      reg = 0;
1102 	      as_bad (_("immediate is not a power of two"));
1103 	    }
1104 	  inst |= (reg) << 4;
1105 	}
1106       else
1107 	as_bad (_("second operand missing"));
1108 
1109       output = frag_more (2);
1110       break;
1111 
1112     case OBRa:	/* Specific for bgeni: imm of 0->6 translate to movi.  */
1113     case OBRb:
1114     case OBRc:
1115       op_end = parse_reg (op_end + 1, & reg);
1116       inst |= reg;
1117 
1118       /* Skip whitespace.  */
1119       while (ISSPACE (* op_end))
1120 	++ op_end;
1121 
1122       if (* op_end == ',')
1123 	{
1124 	  op_end = parse_imm (op_end + 1, & reg, 0, 31);
1125 	  /* Immediate values of 0 -> 6 translate to movi.  */
1126 	  if (reg <= 6)
1127 	    {
1128 	      inst = (inst & 0xF) | MCORE_INST_BGENI_ALT;
1129 	      reg = 0x1 << reg;
1130 	      as_warn (_("translating bgeni to movi"));
1131 	    }
1132 	  inst &= ~ 0x01f0;
1133 	  inst |= reg << 4;
1134 	}
1135       else
1136 	as_bad (_("second operand missing"));
1137 
1138       output = frag_more (2);
1139       break;
1140 
1141     case OBR2:	/* Like OBR, but arg is 2^n instead of n.  */
1142       op_end = parse_reg (op_end + 1, & reg);
1143       inst |= reg;
1144 
1145       /* Skip whitespace.  */
1146       while (ISSPACE (* op_end))
1147 	++ op_end;
1148 
1149       if (* op_end == ',')
1150 	{
1151 	  op_end = parse_imm (op_end + 1, & reg, 1, 1 << 31);
1152 
1153 	  /* Further restrict the immediate to a power of two.  */
1154 	  if ((reg & (reg - 1)) == 0)
1155 	    reg = mylog2 (reg);
1156 	  else
1157 	    {
1158 	      reg = 0;
1159 	      as_bad (_("immediate is not a power of two"));
1160 	    }
1161 
1162 	  /* Immediate values of 0 -> 6 translate to movi.  */
1163 	  if (reg <= 6)
1164 	    {
1165 	      inst = (inst & 0xF) | MCORE_INST_BGENI_ALT;
1166 	      reg = 0x1 << reg;
1167 	      as_warn (_("translating mgeni to movi"));
1168 	    }
1169 
1170 	  inst |= reg << 4;
1171 	}
1172       else
1173 	as_bad (_("second operand missing"));
1174 
1175       output = frag_more (2);
1176       break;
1177 
1178     case OMa:	/* Specific for bmaski: imm 1->7 translate to movi.  */
1179     case OMb:
1180     case OMc:
1181       op_end = parse_reg (op_end + 1, & reg);
1182       inst |= reg;
1183 
1184       /* Skip whitespace.  */
1185       while (ISSPACE (* op_end))
1186 	++ op_end;
1187 
1188       if (* op_end == ',')
1189 	{
1190 	  op_end = parse_imm (op_end + 1, & reg, 1, 32);
1191 
1192 	  /* Immediate values of 1 -> 7 translate to movi.  */
1193 	  if (reg <= 7)
1194 	    {
1195 	      inst = (inst & 0xF) | MCORE_INST_BMASKI_ALT;
1196 	      reg = (0x1 << reg) - 1;
1197 	      inst |= reg << 4;
1198 
1199 	      as_warn (_("translating bmaski to movi"));
1200 	    }
1201 	  else
1202 	    {
1203 	      inst &= ~ 0x01F0;
1204 	      inst |= (reg & 0x1F) << 4;
1205 	    }
1206 	}
1207       else
1208 	as_bad (_("second operand missing"));
1209 
1210       output = frag_more (2);
1211       break;
1212 
1213     case SI:
1214       op_end = parse_reg (op_end + 1, & reg);
1215       inst |= reg;
1216 
1217       /* Skip whitespace.  */
1218       while (ISSPACE (* op_end))
1219 	++ op_end;
1220 
1221       if (* op_end == ',')
1222 	{
1223 	  op_end = parse_imm (op_end + 1, & reg, 1, 31);
1224 	  inst |= reg << 4;
1225 	}
1226       else
1227 	as_bad (_("second operand missing"));
1228 
1229       output = frag_more (2);
1230       break;
1231 
1232     case I7:
1233       op_end = parse_reg (op_end + 1, & reg);
1234       inst |= reg;
1235 
1236       /* Skip whitespace.  */
1237       while (ISSPACE (* op_end))
1238 	++ op_end;
1239 
1240       if (* op_end == ',')
1241 	{
1242 	  op_end = parse_imm (op_end + 1, & reg, 0, 0x7F);
1243 	  inst |= reg << 4;
1244 	}
1245       else
1246 	as_bad (_("second operand missing"));
1247 
1248       output = frag_more (2);
1249       break;
1250 
1251     case LS:
1252       op_end = parse_reg (op_end + 1, & reg);
1253       inst |= reg << 8;
1254 
1255       /* Skip whitespace.  */
1256       while (ISSPACE (* op_end))
1257 	++ op_end;
1258 
1259       if (* op_end == ',')
1260 	{
1261 	  int size;
1262 
1263 	  if ((inst & 0x6000) == 0)
1264 	    size = 4;
1265 	  else if ((inst & 0x6000) == 0x4000)
1266 	    size = 2;
1267 	  else if ((inst & 0x6000) == 0x2000)
1268 	    size = 1;
1269 	  else
1270 	    abort ();
1271 
1272 	  op_end = parse_mem (op_end + 1, & reg, & off, size);
1273 
1274 	  if (off > 16)
1275 	    as_bad (_("displacement too large (%d)"), off);
1276 	  else
1277 	    inst |= (reg) | (off << 4);
1278 	}
1279       else
1280 	as_bad (_("second operand missing"));
1281 
1282       output = frag_more (2);
1283       break;
1284 
1285     case LR:
1286       op_end = parse_reg (op_end + 1, & reg);
1287 
1288       if (reg == 0 || reg == 15)
1289 	as_bad (_("Invalid register: r0 and r15 illegal"));
1290 
1291       inst |= (reg << 8);
1292 
1293       /* Skip whitespace.  */
1294       while (ISSPACE (* op_end))
1295 	++ op_end;
1296 
1297       if (* op_end == ',')
1298 	{
1299 	  /* parse_rt calls frag_more() for us.  */
1300 	  input_line_pointer = parse_rt (op_end + 1, & output, 0, 0);
1301 	  op_end = input_line_pointer;
1302 	}
1303       else
1304 	{
1305 	  as_bad (_("second operand missing"));
1306 	  output = frag_more (2);		/* save its space */
1307 	}
1308       break;
1309 
1310     case LJ:
1311       input_line_pointer = parse_rt (op_end + 1, & output, 1, 0);
1312       /* parse_rt() calls frag_more() for us.  */
1313       op_end = input_line_pointer;
1314       break;
1315 
1316     case RM:
1317       op_end = parse_reg (op_end + 1, & reg);
1318 
1319       if (reg == 0 || reg == 15)
1320 	as_bad (_("bad starting register: r0 and r15 invalid"));
1321 
1322       inst |= reg;
1323 
1324       /* Skip whitespace.  */
1325       while (ISSPACE (* op_end))
1326 	++ op_end;
1327 
1328       if (* op_end == '-')
1329 	{
1330 	  op_end = parse_reg (op_end + 1, & reg);
1331 
1332 	  if (reg != 15)
1333 	    as_bad (_("ending register must be r15"));
1334 
1335 	  /* Skip whitespace.  */
1336 	  while (ISSPACE (* op_end))
1337 	    ++ op_end;
1338 	}
1339 
1340       if (* op_end == ',')
1341 	{
1342 	  op_end ++;
1343 
1344 	  /* Skip whitespace.  */
1345 	  while (ISSPACE (* op_end))
1346 	    ++ op_end;
1347 
1348 	  if (* op_end == '(')
1349 	    {
1350 	      op_end = parse_reg (op_end + 1, & reg);
1351 
1352 	      if (reg != 0)
1353 		as_bad (_("bad base register: must be r0"));
1354 
1355 	      if (* op_end == ')')
1356 		op_end ++;
1357 	    }
1358 	  else
1359 	    as_bad (_("base register expected"));
1360 	}
1361       else
1362 	as_bad (_("second operand missing"));
1363 
1364       output = frag_more (2);
1365       break;
1366 
1367     case RQ:
1368       op_end = parse_reg (op_end + 1, & reg);
1369 
1370       if (reg != 4)
1371 	as_fatal (_("first register must be r4"));
1372 
1373       /* Skip whitespace.  */
1374       while (ISSPACE (* op_end))
1375 	++ op_end;
1376 
1377       if (* op_end == '-')
1378 	{
1379 	  op_end = parse_reg (op_end + 1, & reg);
1380 
1381 	  if (reg != 7)
1382 	    as_fatal (_("last register must be r7"));
1383 
1384 	  /* Skip whitespace.  */
1385 	  while (ISSPACE (* op_end))
1386 	    ++ op_end;
1387 
1388 	  if (* op_end == ',')
1389 	    {
1390 	      op_end ++;
1391 
1392 	      /* Skip whitespace.  */
1393 	      while (ISSPACE (* op_end))
1394 		++ op_end;
1395 
1396 	      if (* op_end == '(')
1397 		{
1398 		  op_end = parse_reg (op_end + 1, & reg);
1399 
1400 		  if (reg >= 4 && reg <= 7)
1401 		    as_fatal ("base register cannot be r4, r5, r6, or r7");
1402 
1403 		  inst |= reg;
1404 
1405 		  /* Skip whitespace.  */
1406 		  while (ISSPACE (* op_end))
1407 		    ++ op_end;
1408 
1409 		  if (* op_end == ')')
1410 		    op_end ++;
1411 		}
1412 	      else
1413 		as_bad (_("base register expected"));
1414 	    }
1415 	  else
1416 	    as_bad (_("second operand missing"));
1417 	}
1418       else
1419 	as_bad (_("reg-reg expected"));
1420 
1421       output = frag_more (2);
1422       break;
1423 
1424     case BR:
1425       input_line_pointer = parse_exp (op_end + 1, & e);
1426       op_end = input_line_pointer;
1427 
1428       output = frag_more (2);
1429 
1430       fix_new_exp (frag_now, output-frag_now->fr_literal,
1431 		   2, & e, 1, BFD_RELOC_MCORE_PCREL_IMM11BY2);
1432       break;
1433 
1434     case BL:
1435       op_end = parse_reg (op_end + 1, & reg);
1436       inst |= reg << 4;
1437 
1438       /* Skip whitespace.  */
1439       while (ISSPACE (* op_end))
1440 	++ op_end;
1441 
1442       if (* op_end == ',')
1443 	{
1444 	  op_end = parse_exp (op_end + 1, & e);
1445 	  output = frag_more (2);
1446 
1447 	  fix_new_exp (frag_now, output-frag_now->fr_literal,
1448 		       2, & e, 1, BFD_RELOC_MCORE_PCREL_IMM4BY2);
1449 	}
1450       else
1451 	{
1452 	  as_bad (_("second operand missing"));
1453 	  output = frag_more (2);
1454 	}
1455       break;
1456 
1457     case JC:
1458       input_line_pointer = parse_exp (op_end + 1, & e);
1459       op_end = input_line_pointer;
1460 
1461       output = frag_var (rs_machine_dependent,
1462 			 md_relax_table[C (COND_JUMP, DISP32)].rlx_length,
1463 			 md_relax_table[C (COND_JUMP, DISP12)].rlx_length,
1464 			 C (COND_JUMP, 0), e.X_add_symbol, e.X_add_number, 0);
1465       isize = C32_LEN;
1466       break;
1467 
1468     case JU:
1469       input_line_pointer = parse_exp (op_end + 1, & e);
1470       op_end = input_line_pointer;
1471 
1472       output = frag_var (rs_machine_dependent,
1473 			 md_relax_table[C (UNCD_JUMP, DISP32)].rlx_length,
1474 			 md_relax_table[C (UNCD_JUMP, DISP12)].rlx_length,
1475 			 C (UNCD_JUMP, 0), e.X_add_symbol, e.X_add_number, 0);
1476       isize = U32_LEN;
1477       break;
1478 
1479     case JL:
1480       inst = MCORE_INST_JSRI;		/* jsri */
1481       input_line_pointer = parse_rt (op_end + 1, & output, 1, & e);
1482       /* parse_rt() calls frag_more for us.  */
1483       op_end = input_line_pointer;
1484 
1485       /* Only do this if we know how to do it ...  */
1486       if (e.X_op != O_absent && do_jsri2bsr)
1487 	{
1488 	  /* Look at adding the R_PCREL_JSRIMM11BY2.  */
1489 	  fix_new_exp (frag_now, output-frag_now->fr_literal,
1490 		       2, & e, 1, BFD_RELOC_MCORE_PCREL_JSR_IMM11BY2);
1491 	}
1492       break;
1493 
1494     case RSI:
1495       /* SI, but imm becomes 32-imm.  */
1496       op_end = parse_reg (op_end + 1, & reg);
1497       inst |= reg;
1498 
1499       /* Skip whitespace.  */
1500       while (ISSPACE (* op_end))
1501 	++ op_end;
1502 
1503       if (* op_end == ',')
1504 	{
1505 	  op_end = parse_imm (op_end + 1, & reg, 1, 31);
1506 
1507 	  reg = 32 - reg;
1508 	  inst |= reg << 4;
1509 	}
1510       else
1511 	as_bad (_("second operand missing"));
1512 
1513       output = frag_more (2);
1514       break;
1515 
1516     case DO21:			/* O2, dup rd, lit must be 1 */
1517       op_end = parse_reg (op_end + 1, & reg);
1518       inst |= reg;
1519       inst |= reg << 4;
1520 
1521       /* Skip whitespace.  */
1522       while (ISSPACE (* op_end))
1523 	++ op_end;
1524 
1525       if (* op_end == ',')
1526 	{
1527 	  op_end = parse_imm (op_end + 1, & reg, 1, 31);
1528 
1529 	  if (reg != 1)
1530 	    as_bad (_("second operand must be 1"));
1531 	}
1532       else
1533 	as_bad (_("second operand missing"));
1534 
1535       output = frag_more (2);
1536       break;
1537 
1538     case SIa:
1539       op_end = parse_reg (op_end + 1, & reg);
1540       inst |= reg;
1541 
1542       /* Skip whitespace.  */
1543       while (ISSPACE (* op_end))
1544 	++ op_end;
1545 
1546       if (* op_end == ',')
1547 	{
1548 	  op_end = parse_imm (op_end + 1, & reg, 1, 31);
1549 
1550 	  if (reg == 0)
1551 	    as_bad (_("zero used as immediate value"));
1552 
1553 	  inst |= reg << 4;
1554 	}
1555       else
1556 	as_bad (_("second operand missing"));
1557 
1558       output = frag_more (2);
1559       break;
1560 
1561     case OPSR:
1562       if (cpu == M210)
1563 	{
1564 	  as_bad (_("M340 specific opcode used when assembling for M210"));
1565 	  break;
1566 	}
1567 
1568       op_end = parse_psrmod (op_end + 1, & reg);
1569 
1570       /* Look for further selectors.  */
1571       while (* op_end == ',')
1572 	{
1573 	  unsigned value;
1574 
1575 	  op_end = parse_psrmod (op_end + 1, & value);
1576 
1577 	  if (value & reg)
1578 	    as_bad (_("duplicated psr bit specifier"));
1579 
1580 	  reg |= value;
1581 	}
1582 
1583       if (reg > 8)
1584 	as_bad (_("`af' must appear alone"));
1585 
1586       inst |= (reg & 0x7);
1587       output = frag_more (2);
1588       break;
1589 
1590     default:
1591       as_bad (_("unimplemented opcode \"%s\""), name);
1592     }
1593 
1594   /* Drop whitespace after all the operands have been parsed.  */
1595   while (ISSPACE (* op_end))
1596     op_end ++;
1597 
1598   /* Give warning message if the insn has more operands than required.  */
1599   if (strcmp (op_end, opcode->name) && strcmp (op_end, ""))
1600     as_warn (_("ignoring operands: %s "), op_end);
1601 
1602   output[0] = INST_BYTE0 (inst);
1603   output[1] = INST_BYTE1 (inst);
1604 
1605   check_literals (opcode->transfer, isize);
1606 }
1607 
1608 symbolS *
md_undefined_symbol(char * name ATTRIBUTE_UNUSED)1609 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
1610 {
1611   return 0;
1612 }
1613 
1614 void
md_mcore_end(void)1615 md_mcore_end (void)
1616 {
1617   dump_literals (0);
1618   subseg_set (text_section, 0);
1619 }
1620 
1621 /* Various routines to kill one day.  */
1622 /* Equal to MAX_PRECISION in atof-ieee.c.  */
1623 #define MAX_LITTLENUMS 6
1624 
1625 /* Turn a string in input_line_pointer into a floating point constant of type
1626    type, and store the appropriate bytes in *litP.  The number of LITTLENUMS
1627    emitted is stored in *sizeP.  An error message is returned, or NULL on OK.  */
1628 
1629 char *
md_atof(int type,char * litP,int * sizeP)1630 md_atof (int type,  char * litP, int * sizeP)
1631 {
1632   int prec;
1633   LITTLENUM_TYPE words[MAX_LITTLENUMS];
1634   int    i;
1635   char * t;
1636 
1637   switch (type)
1638     {
1639     case 'f':
1640     case 'F':
1641     case 's':
1642     case 'S':
1643       prec = 2;
1644       break;
1645 
1646     case 'd':
1647     case 'D':
1648     case 'r':
1649     case 'R':
1650       prec = 4;
1651       break;
1652 
1653     case 'x':
1654     case 'X':
1655       prec = 6;
1656       break;
1657 
1658     case 'p':
1659     case 'P':
1660       prec = 6;
1661       break;
1662 
1663     default:
1664       *sizeP = 0;
1665       return _("Bad call to MD_NTOF()");
1666     }
1667 
1668   t = atof_ieee (input_line_pointer, type, words);
1669 
1670   if (t)
1671     input_line_pointer = t;
1672 
1673   *sizeP = prec * sizeof (LITTLENUM_TYPE);
1674 
1675   if (! target_big_endian)
1676     {
1677       for (i = prec - 1; i >= 0; i--)
1678 	{
1679 	  md_number_to_chars (litP, (valueT) words[i],
1680 			      sizeof (LITTLENUM_TYPE));
1681 	  litP += sizeof (LITTLENUM_TYPE);
1682 	}
1683     }
1684   else
1685     for (i = 0; i < prec; i++)
1686       {
1687 	md_number_to_chars (litP, (valueT) words[i],
1688 			    sizeof (LITTLENUM_TYPE));
1689 	litP += sizeof (LITTLENUM_TYPE);
1690       }
1691 
1692   return 0;
1693 }
1694 
1695 const char * md_shortopts = "";
1696 
1697 enum options
1698 {
1699   OPTION_JSRI2BSR_ON = OPTION_MD_BASE,
1700   OPTION_JSRI2BSR_OFF,
1701   OPTION_SIFILTER_ON,
1702   OPTION_SIFILTER_OFF,
1703   OPTION_CPU,
1704   OPTION_EB,
1705   OPTION_EL,
1706 };
1707 
1708 struct option md_longopts[] =
1709 {
1710   { "no-jsri2bsr", no_argument, NULL, OPTION_JSRI2BSR_OFF},
1711   { "jsri2bsr",    no_argument, NULL, OPTION_JSRI2BSR_ON},
1712   { "sifilter",    no_argument, NULL, OPTION_SIFILTER_ON},
1713   { "no-sifilter", no_argument, NULL, OPTION_SIFILTER_OFF},
1714   { "cpu",         required_argument, NULL, OPTION_CPU},
1715   { "EB",          no_argument, NULL, OPTION_EB},
1716   { "EL",          no_argument, NULL, OPTION_EL},
1717   { NULL,          no_argument, NULL, 0}
1718 };
1719 
1720 size_t md_longopts_size = sizeof (md_longopts);
1721 
1722 int
md_parse_option(int c,char * arg)1723 md_parse_option (int c, char * arg)
1724 {
1725   switch (c)
1726     {
1727     case OPTION_CPU:
1728       if (streq (arg, "210"))
1729 	{
1730 	  cpu = M210;
1731 	  target_big_endian = 1;
1732 	}
1733       else if (streq (arg, "340"))
1734 	cpu = M340;
1735       else
1736 	as_warn (_("unrecognised cpu type '%s'"), arg);
1737       break;
1738 
1739     case OPTION_EB: target_big_endian = 1; break;
1740     case OPTION_EL: target_big_endian = 0; cpu = M340; break;
1741     case OPTION_JSRI2BSR_ON:  do_jsri2bsr = 1;   break;
1742     case OPTION_JSRI2BSR_OFF: do_jsri2bsr = 0;   break;
1743     case OPTION_SIFILTER_ON:  sifilter_mode = 1; break;
1744     case OPTION_SIFILTER_OFF: sifilter_mode = 0; break;
1745     default:                  return 0;
1746     }
1747 
1748   return 1;
1749 }
1750 
1751 void
md_show_usage(FILE * stream)1752 md_show_usage (FILE * stream)
1753 {
1754   fprintf (stream, _("\
1755 MCORE specific options:\n\
1756   -{no-}jsri2bsr	  {dis}able jsri to bsr transformation (def: dis)\n\
1757   -{no-}sifilter	  {dis}able silicon filter behavior (def: dis)\n\
1758   -cpu=[210|340]          select CPU type\n\
1759   -EB                     assemble for a big endian system (default)\n\
1760   -EL                     assemble for a little endian system\n"));
1761 }
1762 
1763 int md_short_jump_size;
1764 
1765 void
md_create_short_jump(char * ptr ATTRIBUTE_UNUSED,addressT from_Nddr ATTRIBUTE_UNUSED,addressT to_Nddr ATTRIBUTE_UNUSED,fragS * frag ATTRIBUTE_UNUSED,symbolS * to_symbol ATTRIBUTE_UNUSED)1766 md_create_short_jump (char * ptr ATTRIBUTE_UNUSED,
1767 		      addressT from_Nddr ATTRIBUTE_UNUSED,
1768 		      addressT to_Nddr ATTRIBUTE_UNUSED,
1769 		      fragS * frag ATTRIBUTE_UNUSED,
1770 		      symbolS * to_symbol ATTRIBUTE_UNUSED)
1771 {
1772   as_fatal (_("failed sanity check: short_jump"));
1773 }
1774 
1775 void
md_create_long_jump(char * ptr ATTRIBUTE_UNUSED,addressT from_Nddr ATTRIBUTE_UNUSED,addressT to_Nddr ATTRIBUTE_UNUSED,fragS * frag ATTRIBUTE_UNUSED,symbolS * to_symbol ATTRIBUTE_UNUSED)1776 md_create_long_jump (char * ptr ATTRIBUTE_UNUSED,
1777 		     addressT from_Nddr ATTRIBUTE_UNUSED,
1778 		     addressT to_Nddr ATTRIBUTE_UNUSED,
1779 		     fragS * frag ATTRIBUTE_UNUSED,
1780 		     symbolS * to_symbol ATTRIBUTE_UNUSED)
1781 {
1782   as_fatal (_("failed sanity check: long_jump"));
1783 }
1784 
1785 /* Called after relaxing, change the frags so they know how big they are.  */
1786 
1787 void
md_convert_frag(bfd * abfd ATTRIBUTE_UNUSED,segT sec ATTRIBUTE_UNUSED,fragS * fragP)1788 md_convert_frag (bfd * abfd ATTRIBUTE_UNUSED,
1789 		 segT sec ATTRIBUTE_UNUSED,
1790 		 fragS * fragP)
1791 {
1792   char *buffer;
1793   int targ_addr = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
1794 
1795   buffer = fragP->fr_fix + fragP->fr_literal;
1796 
1797   switch (fragP->fr_subtype)
1798     {
1799     case C (COND_JUMP, DISP12):
1800     case C (UNCD_JUMP, DISP12):
1801       {
1802 	/* Get the address of the end of the instruction.  */
1803 	int next_inst = fragP->fr_fix + fragP->fr_address + 2;
1804 	unsigned char t0;
1805 	int disp = targ_addr - next_inst;
1806 
1807 	if (disp & 1)
1808 	  as_bad (_("odd displacement at %x"), next_inst - 2);
1809 
1810 	disp >>= 1;
1811 
1812 	if (! target_big_endian)
1813 	  {
1814 	    t0 = buffer[1] & 0xF8;
1815 
1816 	    md_number_to_chars (buffer, disp, 2);
1817 
1818 	    buffer[1] = (buffer[1] & 0x07) | t0;
1819 	  }
1820 	else
1821 	  {
1822 	    t0 = buffer[0] & 0xF8;
1823 
1824 	    md_number_to_chars (buffer, disp, 2);
1825 
1826 	    buffer[0] = (buffer[0] & 0x07) | t0;
1827 	  }
1828 
1829 	fragP->fr_fix += 2;
1830       }
1831       break;
1832 
1833     case C (COND_JUMP, DISP32):
1834     case C (COND_JUMP, UNDEF_WORD_DISP):
1835       {
1836 	/* A conditional branch wont fit into 12 bits so:
1837 	  	b!cond	1f
1838 	  	jmpi	0f
1839 	  	.align 2
1840 	   0:	.long disp
1841 	   1:
1842 
1843 	   If the b!cond is 4 byte aligned, the literal which would
1844 	   go at x+4 will also be aligned.  */
1845 	int first_inst = fragP->fr_fix + fragP->fr_address;
1846 	int needpad = (first_inst & 3);
1847 
1848 	if (! target_big_endian)
1849 	  buffer[1] ^= 0x08;
1850 	else
1851 	  buffer[0] ^= 0x08;	/* Toggle T/F bit.  */
1852 
1853 	buffer[2] = INST_BYTE0 (MCORE_INST_JMPI);	/* Build jmpi.  */
1854 	buffer[3] = INST_BYTE1 (MCORE_INST_JMPI);
1855 
1856 	if (needpad)
1857 	  {
1858 	    if (! target_big_endian)
1859 	      {
1860 		buffer[0] = 4;	/* Branch over jmpi, pad, and ptr.  */
1861 		buffer[2] = 1;	/* Jmpi offset of 1 gets the pointer.  */
1862 	      }
1863 	    else
1864 	      {
1865 		buffer[1] = 4;	/* Branch over jmpi, pad, and ptr.  */
1866 		buffer[3] = 1;	/* Jmpi offset of 1 gets the pointer.  */
1867 	      }
1868 
1869 	    buffer[4] = 0;	/* Alignment/pad.  */
1870 	    buffer[5] = 0;
1871 	    buffer[6] = 0;	/* Space for 32 bit address.  */
1872 	    buffer[7] = 0;
1873 	    buffer[8] = 0;
1874 	    buffer[9] = 0;
1875 
1876 	    /* Make reloc for the long disp.  */
1877 	    fix_new (fragP, fragP->fr_fix + 6, 4,
1878 		     fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_32);
1879 
1880 	    fragP->fr_fix += C32_LEN;
1881 	  }
1882 	else
1883 	  {
1884 	    /* See comment below about this given gas' limitations for
1885 	       shrinking the fragment. '3' is the amount of code that
1886 	       we inserted here, but '4' is right for the space we reserved
1887 	       for this fragment.  */
1888 	    if (! target_big_endian)
1889 	      {
1890 		buffer[0] = 3;	/* Branch over jmpi, and ptr.  */
1891 		buffer[2] = 0;	/* Jmpi offset of 0 gets the pointer.  */
1892 	      }
1893 	    else
1894 	      {
1895 		buffer[1] = 3;	/* Branch over jmpi, and ptr.  */
1896 		buffer[3] = 0;	/* Jmpi offset of 0 gets the pointer.  */
1897 	      }
1898 
1899 	    buffer[4] = 0;	/* Space for 32 bit address.  */
1900 	    buffer[5] = 0;
1901 	    buffer[6] = 0;
1902 	    buffer[7] = 0;
1903 
1904 	    /* Make reloc for the long disp.  */
1905 	    fix_new (fragP, fragP->fr_fix + 4, 4,
1906 		     fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_32);
1907 	    fragP->fr_fix += C32_LEN;
1908 
1909 	    /* Frag is actually shorter (see the other side of this ifdef)
1910 	       but gas isn't prepared for that.  We have to re-adjust
1911 	       the branch displacement so that it goes beyond the
1912 	       full length of the fragment, not just what we actually
1913 	       filled in.  */
1914 	    if (! target_big_endian)
1915 	      buffer[0] = 4;	/* Jmpi, ptr, and the 'tail pad'.  */
1916 	    else
1917 	      buffer[1] = 4;	/* Jmpi, ptr, and the 'tail pad'.  */
1918 	  }
1919       }
1920       break;
1921 
1922     case C (UNCD_JUMP, DISP32):
1923     case C (UNCD_JUMP, UNDEF_WORD_DISP):
1924       {
1925 	/* An unconditional branch will not fit in 12 bits, make code which
1926 	   looks like:
1927 	  	jmpi	0f
1928 	  	.align 2
1929 	     0:	.long disp
1930 	   we need a pad if "first_inst" is 4 byte aligned.
1931 	   [because the natural literal place is x + 2].  */
1932 	int first_inst = fragP->fr_fix + fragP->fr_address;
1933 	int needpad = !(first_inst & 3);
1934 
1935 	buffer[0] = INST_BYTE0 (MCORE_INST_JMPI);	/* Build jmpi.  */
1936 	buffer[1] = INST_BYTE1 (MCORE_INST_JMPI);
1937 
1938 	if (needpad)
1939 	  {
1940 	    if (! target_big_endian)
1941 	      buffer[0] = 1;	/* Jmpi offset of 1 since padded.  */
1942 	    else
1943 	      buffer[1] = 1;	/* Jmpi offset of 1 since padded.  */
1944 	    buffer[2] = 0;	/* Alignment.  */
1945 	    buffer[3] = 0;
1946 	    buffer[4] = 0;	/* Space for 32 bit address.  */
1947 	    buffer[5] = 0;
1948 	    buffer[6] = 0;
1949 	    buffer[7] = 0;
1950 
1951 	    /* Make reloc for the long disp.  */
1952 	    fix_new (fragP, fragP->fr_fix + 4, 4,
1953 		     fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_32);
1954 
1955 	    fragP->fr_fix += U32_LEN;
1956 	  }
1957 	else
1958 	  {
1959 	    if (! target_big_endian)
1960 	      buffer[0] = 0;	/* Jmpi offset of 0 if no pad.  */
1961 	    else
1962 	      buffer[1] = 0;	/* Jmpi offset of 0 if no pad.  */
1963 	    buffer[2] = 0;	/* Space for 32 bit address.  */
1964 	    buffer[3] = 0;
1965 	    buffer[4] = 0;
1966 	    buffer[5] = 0;
1967 
1968 	    /* Make reloc for the long disp.  */
1969 	    fix_new (fragP, fragP->fr_fix + 2, 4,
1970 		     fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_32);
1971 	    fragP->fr_fix += U32_LEN;
1972 	  }
1973       }
1974       break;
1975 
1976     default:
1977       abort ();
1978     }
1979 }
1980 
1981 /* Applies the desired value to the specified location.
1982    Also sets up addends for 'rela' type relocations.  */
1983 
1984 void
md_apply_fix(fixS * fixP,valueT * valP,segT segment ATTRIBUTE_UNUSED)1985 md_apply_fix (fixS *   fixP,
1986 	       valueT * valP,
1987 	       segT     segment ATTRIBUTE_UNUSED)
1988 {
1989   char *       buf  = fixP->fx_where + fixP->fx_frag->fr_literal;
1990   char *       file = fixP->fx_file ? fixP->fx_file : _("unknown");
1991   const char * symname;
1992   /* Note: use offsetT because it is signed, valueT is unsigned.  */
1993   offsetT      val  = *valP;
1994 
1995   symname = fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : _("<unknown>");
1996   /* Save this for the addend in the relocation record.  */
1997   fixP->fx_addnumber = val;
1998 
1999   if (fixP->fx_addsy != NULL)
2000     {
2001 #ifdef OBJ_ELF
2002       /* For ELF we can just return and let the reloc that will be generated
2003 	 take care of everything.  For COFF we still have to insert 'val'
2004 	 into the insn since the addend field will be ignored.  */
2005       return;
2006 #endif
2007     }
2008   else
2009     fixP->fx_done = 1;
2010 
2011   switch (fixP->fx_r_type)
2012     {
2013       /* Second byte of 2 byte opcode.  */
2014     case BFD_RELOC_MCORE_PCREL_IMM11BY2:
2015       if ((val & 1) != 0)
2016 	as_bad_where (file, fixP->fx_line,
2017 		      _("odd distance branch (0x%lx bytes)"), (long) val);
2018       val /= 2;
2019       if (((val & ~0x3ff) != 0) && ((val | 0x3ff) != -1))
2020 	as_bad_where (file, fixP->fx_line,
2021 		      _("pcrel for branch to %s too far (0x%lx)"),
2022 		      symname, (long) val);
2023       if (target_big_endian)
2024 	{
2025 	  buf[0] |= ((val >> 8) & 0x7);
2026 	  buf[1] |= (val & 0xff);
2027 	}
2028       else
2029 	{
2030 	  buf[1] |= ((val >> 8) & 0x7);
2031 	  buf[0] |= (val & 0xff);
2032 	}
2033       break;
2034 
2035       /* Lower 8 bits of 2 byte opcode.  */
2036     case BFD_RELOC_MCORE_PCREL_IMM8BY4:
2037       val += 3;
2038       val /= 4;
2039       if (val & ~0xff)
2040 	as_bad_where (file, fixP->fx_line,
2041 		      _("pcrel for lrw/jmpi/jsri to %s too far (0x%lx)"),
2042 		      symname, (long) val);
2043       else if (! target_big_endian)
2044 	buf[0] |= (val & 0xff);
2045       else
2046 	buf[1] |= (val & 0xff);
2047       break;
2048 
2049       /* Loopt instruction.  */
2050     case BFD_RELOC_MCORE_PCREL_IMM4BY2:
2051       if ((val < -32) || (val > -2))
2052 	as_bad_where (file, fixP->fx_line,
2053 		      _("pcrel for loopt too far (0x%lx)"), (long) val);
2054       val /= 2;
2055       if (! target_big_endian)
2056 	buf[0] |= (val & 0xf);
2057       else
2058 	buf[1] |= (val & 0xf);
2059       break;
2060 
2061     case BFD_RELOC_MCORE_PCREL_JSR_IMM11BY2:
2062       /* Conditional linker map jsri to bsr.  */
2063       /* If its a local target and close enough, fix it.
2064 	 NB: >= -2k for backwards bsr; < 2k for forwards...  */
2065       if (fixP->fx_addsy == 0 && val >= -2048  && val < 2048)
2066 	{
2067 	  long nval = (val / 2) & 0x7ff;
2068 	  nval |= MCORE_INST_BSR;
2069 
2070 	  /* REPLACE the instruction, don't just modify it.  */
2071 	  buf[0] = INST_BYTE0 (nval);
2072 	  buf[1] = INST_BYTE1 (nval);
2073 	}
2074       else
2075 	fixP->fx_done = 0;
2076       break;
2077 
2078     case BFD_RELOC_MCORE_PCREL_32:
2079     case BFD_RELOC_VTABLE_INHERIT:
2080     case BFD_RELOC_VTABLE_ENTRY:
2081       fixP->fx_done = 0;
2082       break;
2083 
2084     default:
2085       if (fixP->fx_addsy != NULL)
2086 	{
2087 	  /* If the fix is an absolute reloc based on a symbol's
2088 	     address, then it cannot be resolved until the final link.  */
2089 	  fixP->fx_done = 0;
2090 	}
2091 #ifdef OBJ_ELF
2092       else
2093 #endif
2094 	{
2095 	  if (fixP->fx_size == 4)
2096 	    ;
2097 	  else if (fixP->fx_size == 2 && val >= -32768 && val <= 32767)
2098 	    ;
2099 	  else if (fixP->fx_size == 1 && val >= -256 && val <= 255)
2100 	    ;
2101 	  else
2102 	    abort ();
2103 	  md_number_to_chars (buf, val, fixP->fx_size);
2104 	}
2105       break;
2106     }
2107 }
2108 
2109 void
md_operand(expressionS * expressionP)2110 md_operand (expressionS * expressionP)
2111 {
2112   /* Ignore leading hash symbol, if poresent.  */
2113   if (* input_line_pointer == '#')
2114     {
2115       input_line_pointer ++;
2116       expression (expressionP);
2117     }
2118 }
2119 
2120 int md_long_jump_size;
2121 
2122 /* Called just before address relaxation, return the length
2123    by which a fragment must grow to reach it's destination.  */
2124 int
md_estimate_size_before_relax(fragS * fragP,segT segment_type)2125 md_estimate_size_before_relax (fragS * fragP, segT segment_type)
2126 {
2127   switch (fragP->fr_subtype)
2128     {
2129     default:
2130       abort ();
2131 
2132     case C (UNCD_JUMP, UNDEF_DISP):
2133       /* Used to be a branch to somewhere which was unknown.  */
2134       if (!fragP->fr_symbol)
2135 	fragP->fr_subtype = C (UNCD_JUMP, DISP12);
2136       else if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
2137 	fragP->fr_subtype = C (UNCD_JUMP, DISP12);
2138       else
2139 	fragP->fr_subtype = C (UNCD_JUMP, UNDEF_WORD_DISP);
2140       break;
2141 
2142     case C (COND_JUMP, UNDEF_DISP):
2143       /* Used to be a branch to somewhere which was unknown.  */
2144       if (fragP->fr_symbol
2145 	  && S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
2146 	/* Got a symbol and it's defined in this segment, become byte
2147 	   sized - maybe it will fix up */
2148 	fragP->fr_subtype = C (COND_JUMP, DISP12);
2149       else if (fragP->fr_symbol)
2150 	/* Its got a segment, but its not ours, so it will always be long.  */
2151 	fragP->fr_subtype = C (COND_JUMP, UNDEF_WORD_DISP);
2152       else
2153 	/* We know the abs value.  */
2154 	fragP->fr_subtype = C (COND_JUMP, DISP12);
2155       break;
2156 
2157     case C (UNCD_JUMP, DISP12):
2158     case C (UNCD_JUMP, DISP32):
2159     case C (UNCD_JUMP, UNDEF_WORD_DISP):
2160     case C (COND_JUMP, DISP12):
2161     case C (COND_JUMP, DISP32):
2162     case C (COND_JUMP, UNDEF_WORD_DISP):
2163       /* When relaxing a section for the second time, we don't need to
2164 	 do anything besides return the current size.  */
2165       break;
2166     }
2167 
2168   return md_relax_table[fragP->fr_subtype].rlx_length;
2169 }
2170 
2171 /* Put number into target byte order.  */
2172 
2173 void
md_number_to_chars(char * ptr,valueT use,int nbytes)2174 md_number_to_chars (char * ptr, valueT use, int nbytes)
2175 {
2176   if (! target_big_endian)
2177     switch (nbytes)
2178       {
2179       case 4: ptr[3] = (use >> 24) & 0xff; /* Fall through.  */
2180       case 3: ptr[2] = (use >> 16) & 0xff; /* Fall through.  */
2181       case 2: ptr[1] = (use >>  8) & 0xff; /* Fall through.  */
2182       case 1: ptr[0] = (use >>  0) & 0xff;    break;
2183       default: abort ();
2184       }
2185   else
2186     switch (nbytes)
2187       {
2188       case 4: *ptr++ = (use >> 24) & 0xff; /* Fall through.  */
2189       case 3: *ptr++ = (use >> 16) & 0xff; /* Fall through.  */
2190       case 2: *ptr++ = (use >>  8) & 0xff; /* Fall through.  */
2191       case 1: *ptr++ = (use >>  0) & 0xff;    break;
2192       default: abort ();
2193       }
2194 }
2195 
2196 /* Round up a section size to the appropriate boundary.  */
2197 
2198 valueT
md_section_align(segT segment ATTRIBUTE_UNUSED,valueT size)2199 md_section_align (segT segment ATTRIBUTE_UNUSED,
2200 		  valueT size)
2201 {
2202   /* Byte alignment is fine.  */
2203   return size;
2204 }
2205 
2206 /* The location from which a PC relative jump should be calculated,
2207    given a PC relative reloc.  */
2208 
2209 long
md_pcrel_from_section(fixS * fixp,segT sec ATTRIBUTE_UNUSED)2210 md_pcrel_from_section (fixS * fixp, segT sec ATTRIBUTE_UNUSED)
2211 {
2212 #ifdef OBJ_ELF
2213   /* If the symbol is undefined or defined in another section
2214      we leave the add number alone for the linker to fix it later.
2215      Only account for the PC pre-bump (which is 2 bytes on the MCore).  */
2216   if (fixp->fx_addsy != (symbolS *) NULL
2217       && (! S_IS_DEFINED (fixp->fx_addsy)
2218 	  || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
2219 
2220   {
2221     assert (fixp->fx_size == 2);	/* must be an insn */
2222     return fixp->fx_size;
2223   }
2224 #endif
2225 
2226   /* The case where we are going to resolve things...  */
2227   return  fixp->fx_size + fixp->fx_where + fixp->fx_frag->fr_address;
2228 }
2229 
2230 #define F(SZ,PCREL)		(((SZ) << 1) + (PCREL))
2231 #define MAP(SZ,PCREL,TYPE)	case F (SZ, PCREL): code = (TYPE); break
2232 
2233 arelent *
tc_gen_reloc(asection * section ATTRIBUTE_UNUSED,fixS * fixp)2234 tc_gen_reloc (asection * section ATTRIBUTE_UNUSED, fixS * fixp)
2235 {
2236   arelent * rel;
2237   bfd_reloc_code_real_type code;
2238 
2239   switch (fixp->fx_r_type)
2240     {
2241       /* These confuse the size/pcrel macro approach.  */
2242     case BFD_RELOC_VTABLE_INHERIT:
2243     case BFD_RELOC_VTABLE_ENTRY:
2244     case BFD_RELOC_MCORE_PCREL_IMM4BY2:
2245     case BFD_RELOC_MCORE_PCREL_IMM8BY4:
2246     case BFD_RELOC_MCORE_PCREL_IMM11BY2:
2247     case BFD_RELOC_MCORE_PCREL_JSR_IMM11BY2:
2248     case BFD_RELOC_RVA:
2249       code = fixp->fx_r_type;
2250       break;
2251 
2252     default:
2253       switch (F (fixp->fx_size, fixp->fx_pcrel))
2254 	{
2255 	  MAP (1, 0, BFD_RELOC_8);
2256 	  MAP (2, 0, BFD_RELOC_16);
2257 	  MAP (4, 0, BFD_RELOC_32);
2258 	  MAP (1, 1, BFD_RELOC_8_PCREL);
2259 	  MAP (2, 1, BFD_RELOC_16_PCREL);
2260 	  MAP (4, 1, BFD_RELOC_32_PCREL);
2261 	default:
2262 	  code = fixp->fx_r_type;
2263 	  as_bad (_("Can not do %d byte %srelocation"),
2264 		  fixp->fx_size,
2265 		  fixp->fx_pcrel ? _("pc-relative") : "");
2266 	}
2267       break;
2268   }
2269 
2270   rel = xmalloc (sizeof (arelent));
2271   rel->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
2272   *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2273   rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
2274   /* Always pass the addend along!  */
2275   rel->addend = fixp->fx_addnumber;
2276 
2277   rel->howto = bfd_reloc_type_lookup (stdoutput, code);
2278 
2279   if (rel->howto == NULL)
2280     {
2281       as_bad_where (fixp->fx_file, fixp->fx_line,
2282 		    _("Cannot represent relocation type %s"),
2283 		    bfd_get_reloc_code_name (code));
2284 
2285       /* Set howto to a garbage value so that we can keep going.  */
2286       rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
2287       assert (rel->howto != NULL);
2288     }
2289 
2290   return rel;
2291 }
2292 
2293 #ifdef OBJ_ELF
2294 /* See whether we need to force a relocation into the output file.
2295    This is used to force out switch and PC relative relocations when
2296    relaxing.  */
2297 int
mcore_force_relocation(fixS * fix)2298 mcore_force_relocation (fixS * fix)
2299 {
2300   if (fix->fx_r_type == BFD_RELOC_RVA)
2301     return 1;
2302 
2303   return generic_force_reloc (fix);
2304 }
2305 
2306 /* Return true if the fix can be handled by GAS, false if it must
2307    be passed through to the linker.  */
2308 
2309 bfd_boolean
mcore_fix_adjustable(fixS * fixP)2310 mcore_fix_adjustable (fixS * fixP)
2311 {
2312   /* We need the symbol name for the VTABLE entries.  */
2313   if (   fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2314       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2315     return 0;
2316 
2317   return 1;
2318 }
2319 #endif /* OBJ_ELF */
2320