2002-12-12 Alexandre Oliva <aoliva@redhat.com>
[deliverable/binutils-gdb.git] / gas / config / tc-mn10300.c
CommitLineData
252b5132 1/* tc-mn10300.c -- Assembler code for the Matsushita 10300
ae6063d4 2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
f7e42eb4 3 Free Software Foundation, Inc.
252b5132
RH
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
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22#include <stdio.h>
252b5132 23#include "as.h"
3882b010 24#include "safe-ctype.h"
87271fa6 25#include "subsegs.h"
252b5132 26#include "opcode/mn10300.h"
e8b1cae5 27#include "dwarf2dbg.h"
252b5132
RH
28\f
29/* Structure to hold information about predefined registers. */
30struct reg_name
31{
32 const char *name;
33 int value;
34};
35
87271fa6
NC
36/* Generic assembler global variables which must be defined by all
37 targets. */
252b5132 38
87271fa6 39/* Characters which always start a comment. */
252b5132
RH
40const char comment_chars[] = "#";
41
42/* Characters which start a comment at the beginning of a line. */
43const char line_comment_chars[] = ";#";
44
87271fa6 45/* Characters which may be used to separate multiple commands on a
252b5132
RH
46 single line. */
47const char line_separator_chars[] = ";";
48
87271fa6 49/* Characters which are used to indicate an exponent in a floating
252b5132
RH
50 point number. */
51const char EXP_CHARS[] = "eE";
52
87271fa6 53/* Characters which mean that a number is a floating point constant,
252b5132
RH
54 as in 0d1.0. */
55const char FLT_CHARS[] = "dD";
56\f
252b5132 57const relax_typeS md_relax_table[] = {
87271fa6 58 /* bCC relaxing */
252b5132
RH
59 {0x7f, -0x80, 2, 1},
60 {0x7fff, -0x8000, 5, 2},
61 {0x7fffffff, -0x80000000, 7, 0},
62
87271fa6 63 /* bCC relaxing (uncommon cases) */
252b5132
RH
64 {0x7f, -0x80, 3, 4},
65 {0x7fff, -0x8000, 6, 5},
66 {0x7fffffff, -0x80000000, 8, 0},
67
87271fa6 68 /* call relaxing */
252b5132
RH
69 {0x7fff, -0x8000, 5, 7},
70 {0x7fffffff, -0x80000000, 7, 0},
71
87271fa6 72 /* calls relaxing */
252b5132
RH
73 {0x7fff, -0x8000, 4, 9},
74 {0x7fffffff, -0x80000000, 6, 0},
75
87271fa6 76 /* jmp relaxing */
252b5132
RH
77 {0x7f, -0x80, 2, 11},
78 {0x7fff, -0x8000, 3, 12},
79 {0x7fffffff, -0x80000000, 5, 0},
80
e7b71525
AO
81 /* fbCC relaxing */
82 {0x7f, -0x80, 3, 14},
83 {0x7fff, -0x8000, 6, 15},
84 {0x7fffffff, -0x80000000, 8, 0},
85
252b5132
RH
86};
87
87271fa6 88/* Local functions. */
252b5132
RH
89static void mn10300_insert_operand PARAMS ((unsigned long *, unsigned long *,
90 const struct mn10300_operand *,
91 offsetT, char *, unsigned,
92 unsigned));
93static unsigned long check_operand PARAMS ((unsigned long,
94 const struct mn10300_operand *,
95 offsetT));
96static int reg_name_search PARAMS ((const struct reg_name *, int, const char *));
b34976b6
AM
97static bfd_boolean data_register_name PARAMS ((expressionS *expressionP));
98static bfd_boolean address_register_name PARAMS ((expressionS *expressionP));
99static bfd_boolean other_register_name PARAMS ((expressionS *expressionP));
497f322d
AO
100static bfd_boolean r_register_name PARAMS ((expressionS *expressionP));
101static bfd_boolean xr_register_name PARAMS ((expressionS *expressionP));
102static void set_arch_mach PARAMS ((int));
252b5132 103
1485d400
EC
104/* Set linkrelax here to avoid fixups in most sections. */
105int linkrelax = 1;
106
252b5132
RH
107static int current_machine;
108
87271fa6 109/* Fixups. */
252b5132
RH
110#define MAX_INSN_FIXUPS (5)
111struct mn10300_fixup
112{
113 expressionS exp;
114 int opindex;
115 bfd_reloc_code_real_type reloc;
116};
117struct mn10300_fixup fixups[MAX_INSN_FIXUPS];
118static int fc;
119
120/* We must store the value of each register operand so that we can
121 verify that certain registers do not match. */
122int mn10300_reg_operands[MN10300_MAX_OPERANDS];
123\f
124const char *md_shortopts = "";
125struct option md_longopts[] = {
126 {NULL, no_argument, NULL, 0}
127};
87271fa6 128size_t md_longopts_size = sizeof (md_longopts);
252b5132
RH
129
130/* The target specific pseudo-ops which we support. */
131const pseudo_typeS md_pseudo_table[] =
132{
0a727238
AO
133 { "am30", set_arch_mach, AM30 },
134 { "am33", set_arch_mach, AM33 },
e7b71525 135 { "am33_2", (void (*) PARAMS ((int))) set_arch_mach, AM33_2 },
0a727238 136 { "mn10300", set_arch_mach, MN103 },
252b5132
RH
137 {NULL, 0, 0}
138};
139
e7b71525
AO
140#define HAVE_AM33_2 (current_machine == AM33_2)
141#define HAVE_AM33 (current_machine == AM33 || HAVE_AM33_2)
aa15f6f7 142#define HAVE_AM30 (current_machine == AM30)
0a727238 143
252b5132
RH
144/* Opcode hash table. */
145static struct hash_control *mn10300_hash;
146
87271fa6 147/* This table is sorted. Suitable for searching by a binary search. */
252b5132
RH
148static const struct reg_name data_registers[] =
149{
150 { "d0", 0 },
151 { "d1", 1 },
152 { "d2", 2 },
153 { "d3", 3 },
154};
87271fa6
NC
155#define DATA_REG_NAME_CNT \
156 (sizeof (data_registers) / sizeof (struct reg_name))
252b5132
RH
157
158static const struct reg_name address_registers[] =
159{
160 { "a0", 0 },
161 { "a1", 1 },
162 { "a2", 2 },
163 { "a3", 3 },
164};
87271fa6
NC
165
166#define ADDRESS_REG_NAME_CNT \
167 (sizeof (address_registers) / sizeof (struct reg_name))
252b5132 168
85cb2cf9
JL
169static const struct reg_name r_registers[] =
170{
171 { "a0", 8 },
172 { "a1", 9 },
173 { "a2", 10 },
174 { "a3", 11 },
175 { "d0", 12 },
176 { "d1", 13 },
177 { "d2", 14 },
178 { "d3", 15 },
179 { "e0", 0 },
180 { "e1", 1 },
181 { "e10", 10 },
182 { "e11", 11 },
183 { "e12", 12 },
184 { "e13", 13 },
185 { "e14", 14 },
186 { "e15", 15 },
187 { "e2", 2 },
188 { "e3", 3 },
189 { "e4", 4 },
190 { "e5", 5 },
191 { "e6", 6 },
192 { "e7", 7 },
193 { "e8", 8 },
194 { "e9", 9 },
195 { "r0", 0 },
196 { "r1", 1 },
197 { "r10", 10 },
198 { "r11", 11 },
199 { "r12", 12 },
200 { "r13", 13 },
201 { "r14", 14 },
202 { "r15", 15 },
203 { "r2", 2 },
204 { "r3", 3 },
205 { "r4", 4 },
206 { "r5", 5 },
207 { "r6", 6 },
208 { "r7", 7 },
209 { "r8", 8 },
210 { "r9", 9 },
211};
87271fa6
NC
212
213#define R_REG_NAME_CNT \
214 (sizeof (r_registers) / sizeof (struct reg_name))
85cb2cf9
JL
215
216static const struct reg_name xr_registers[] =
217{
218 { "mcrh", 2 },
219 { "mcrl", 3 },
220 { "mcvf", 4 },
221 { "mdrq", 1 },
222 { "sp", 0 },
223 { "xr0", 0 },
224 { "xr1", 1 },
225 { "xr10", 10 },
226 { "xr11", 11 },
227 { "xr12", 12 },
228 { "xr13", 13 },
229 { "xr14", 14 },
230 { "xr15", 15 },
231 { "xr2", 2 },
232 { "xr3", 3 },
233 { "xr4", 4 },
234 { "xr5", 5 },
235 { "xr6", 6 },
236 { "xr7", 7 },
237 { "xr8", 8 },
238 { "xr9", 9 },
239};
85cb2cf9 240
87271fa6
NC
241#define XR_REG_NAME_CNT \
242 (sizeof (xr_registers) / sizeof (struct reg_name))
252b5132 243
913572ec
AO
244/* We abuse the `value' field, that would be otherwise unused, to
245 encode the architecture on which (access to) the register was
246 introduced. FIXME: we should probably warn when we encounter a
247 register name when assembling for an architecture that doesn't
248 support it, before parsing it as a symbol name. */
252b5132
RH
249static const struct reg_name other_registers[] =
250{
913572ec 251 { "epsw", AM33 },
252b5132 252 { "mdr", 0 },
913572ec 253 { "pc", AM33 },
252b5132
RH
254 { "psw", 0 },
255 { "sp", 0 },
256};
87271fa6
NC
257
258#define OTHER_REG_NAME_CNT \
259 (sizeof (other_registers) / sizeof (struct reg_name))
252b5132 260
e7b71525
AO
261static const struct reg_name float_registers[] =
262{
263 { "fs0", 0 },
264 { "fs1", 1 },
265 { "fs10", 10 },
266 { "fs11", 11 },
267 { "fs12", 12 },
268 { "fs13", 13 },
269 { "fs14", 14 },
270 { "fs15", 15 },
271 { "fs16", 16 },
272 { "fs17", 17 },
273 { "fs18", 18 },
274 { "fs19", 19 },
275 { "fs2", 2 },
276 { "fs20", 20 },
277 { "fs21", 21 },
278 { "fs22", 22 },
279 { "fs23", 23 },
280 { "fs24", 24 },
281 { "fs25", 25 },
282 { "fs26", 26 },
283 { "fs27", 27 },
284 { "fs28", 28 },
285 { "fs29", 29 },
286 { "fs3", 3 },
287 { "fs30", 30 },
288 { "fs31", 31 },
289 { "fs4", 4 },
290 { "fs5", 5 },
291 { "fs6", 6 },
292 { "fs7", 7 },
293 { "fs8", 8 },
294 { "fs9", 9 },
295};
296
297#define FLOAT_REG_NAME_CNT \
298 (sizeof (float_registers) / sizeof (struct reg_name))
299
300static const struct reg_name double_registers[] =
301{
302 { "fd0", 0 },
303 { "fd10", 10 },
304 { "fd12", 12 },
305 { "fd14", 14 },
306 { "fd16", 16 },
307 { "fd18", 18 },
308 { "fd2", 2 },
309 { "fd20", 20 },
310 { "fd22", 22 },
311 { "fd24", 24 },
312 { "fd26", 26 },
313 { "fd28", 28 },
314 { "fd30", 30 },
315 { "fd4", 4 },
316 { "fd6", 6 },
317 { "fd8", 8 },
318};
319
320#define DOUBLE_REG_NAME_CNT \
321 (sizeof (double_registers) / sizeof (struct reg_name))
322
323
252b5132
RH
324/* reg_name_search does a binary search of the given register table
325 to see if "name" is a valid regiter name. Returns the register
87271fa6 326 number from the array on success, or -1 on failure. */
252b5132
RH
327
328static int
329reg_name_search (regs, regcount, name)
330 const struct reg_name *regs;
331 int regcount;
332 const char *name;
333{
334 int middle, low, high;
335 int cmp;
336
337 low = 0;
338 high = regcount - 1;
339
340 do
341 {
342 middle = (low + high) / 2;
343 cmp = strcasecmp (name, regs[middle].name);
344 if (cmp < 0)
345 high = middle - 1;
346 else if (cmp > 0)
347 low = middle + 1;
87271fa6
NC
348 else
349 return regs[middle].value;
252b5132
RH
350 }
351 while (low <= high);
352 return -1;
353}
354
85cb2cf9
JL
355/* Summary of register_name().
356 *
357 * in: Input_line_pointer points to 1st char of operand.
358 *
b6ff326e 359 * out: An expressionS.
85cb2cf9
JL
360 * The operand may have been a register: in this case, X_op == O_register,
361 * X_add_number is set to the register number, and truth is returned.
362 * Input_line_pointer->(next non-blank) char after operand, or is in
363 * its original state.
364 */
87271fa6 365
b34976b6 366static bfd_boolean
85cb2cf9
JL
367r_register_name (expressionP)
368 expressionS *expressionP;
369{
370 int reg_number;
371 char *name;
372 char *start;
373 char c;
374
87271fa6 375 /* Find the spelling of the operand. */
85cb2cf9
JL
376 start = name = input_line_pointer;
377
378 c = get_symbol_end ();
379 reg_number = reg_name_search (r_registers, R_REG_NAME_CNT, name);
380
468cced8
AM
381 /* Put back the delimiting char. */
382 *input_line_pointer = c;
383
87271fa6
NC
384 /* Look to see if it's in the register table. */
385 if (reg_number >= 0)
85cb2cf9
JL
386 {
387 expressionP->X_op = O_register;
388 expressionP->X_add_number = reg_number;
389
87271fa6 390 /* Make the rest nice. */
85cb2cf9
JL
391 expressionP->X_add_symbol = NULL;
392 expressionP->X_op_symbol = NULL;
87271fa6 393
b34976b6 394 return TRUE;
85cb2cf9 395 }
87271fa6 396
468cced8
AM
397 /* Reset the line as if we had not done anything. */
398 input_line_pointer = start;
b34976b6 399 return FALSE;
85cb2cf9
JL
400}
401
402/* Summary of register_name().
403 *
404 * in: Input_line_pointer points to 1st char of operand.
405 *
b6ff326e 406 * out: An expressionS.
85cb2cf9
JL
407 * The operand may have been a register: in this case, X_op == O_register,
408 * X_add_number is set to the register number, and truth is returned.
409 * Input_line_pointer->(next non-blank) char after operand, or is in
410 * its original state.
411 */
87271fa6 412
b34976b6 413static bfd_boolean
85cb2cf9
JL
414xr_register_name (expressionP)
415 expressionS *expressionP;
416{
417 int reg_number;
418 char *name;
419 char *start;
420 char c;
421
87271fa6 422 /* Find the spelling of the operand. */
85cb2cf9
JL
423 start = name = input_line_pointer;
424
425 c = get_symbol_end ();
426 reg_number = reg_name_search (xr_registers, XR_REG_NAME_CNT, name);
427
468cced8
AM
428 /* Put back the delimiting char. */
429 *input_line_pointer = c;
430
87271fa6
NC
431 /* Look to see if it's in the register table. */
432 if (reg_number >= 0)
85cb2cf9
JL
433 {
434 expressionP->X_op = O_register;
435 expressionP->X_add_number = reg_number;
436
87271fa6 437 /* Make the rest nice. */
85cb2cf9
JL
438 expressionP->X_add_symbol = NULL;
439 expressionP->X_op_symbol = NULL;
87271fa6 440
b34976b6 441 return TRUE;
85cb2cf9 442 }
87271fa6 443
468cced8
AM
444 /* Reset the line as if we had not done anything. */
445 input_line_pointer = start;
b34976b6 446 return FALSE;
85cb2cf9 447}
252b5132
RH
448
449/* Summary of register_name().
450 *
451 * in: Input_line_pointer points to 1st char of operand.
452 *
b6ff326e 453 * out: An expressionS.
252b5132
RH
454 * The operand may have been a register: in this case, X_op == O_register,
455 * X_add_number is set to the register number, and truth is returned.
456 * Input_line_pointer->(next non-blank) char after operand, or is in
457 * its original state.
458 */
87271fa6 459
b34976b6 460static bfd_boolean
252b5132
RH
461data_register_name (expressionP)
462 expressionS *expressionP;
463{
464 int reg_number;
465 char *name;
466 char *start;
467 char c;
468
87271fa6 469 /* Find the spelling of the operand. */
252b5132
RH
470 start = name = input_line_pointer;
471
472 c = get_symbol_end ();
473 reg_number = reg_name_search (data_registers, DATA_REG_NAME_CNT, name);
474
468cced8
AM
475 /* Put back the delimiting char. */
476 *input_line_pointer = c;
477
87271fa6
NC
478 /* Look to see if it's in the register table. */
479 if (reg_number >= 0)
252b5132
RH
480 {
481 expressionP->X_op = O_register;
482 expressionP->X_add_number = reg_number;
483
87271fa6 484 /* Make the rest nice. */
252b5132
RH
485 expressionP->X_add_symbol = NULL;
486 expressionP->X_op_symbol = NULL;
87271fa6 487
b34976b6 488 return TRUE;
252b5132 489 }
87271fa6 490
468cced8
AM
491 /* Reset the line as if we had not done anything. */
492 input_line_pointer = start;
b34976b6 493 return FALSE;
252b5132
RH
494}
495
496/* Summary of register_name().
497 *
498 * in: Input_line_pointer points to 1st char of operand.
499 *
b6ff326e 500 * out: An expressionS.
252b5132
RH
501 * The operand may have been a register: in this case, X_op == O_register,
502 * X_add_number is set to the register number, and truth is returned.
503 * Input_line_pointer->(next non-blank) char after operand, or is in
504 * its original state.
505 */
87271fa6 506
b34976b6 507static bfd_boolean
252b5132
RH
508address_register_name (expressionP)
509 expressionS *expressionP;
510{
511 int reg_number;
512 char *name;
513 char *start;
514 char c;
515
87271fa6 516 /* Find the spelling of the operand. */
252b5132
RH
517 start = name = input_line_pointer;
518
519 c = get_symbol_end ();
520 reg_number = reg_name_search (address_registers, ADDRESS_REG_NAME_CNT, name);
521
468cced8
AM
522 /* Put back the delimiting char. */
523 *input_line_pointer = c;
524
87271fa6
NC
525 /* Look to see if it's in the register table. */
526 if (reg_number >= 0)
252b5132
RH
527 {
528 expressionP->X_op = O_register;
529 expressionP->X_add_number = reg_number;
530
87271fa6 531 /* Make the rest nice. */
252b5132
RH
532 expressionP->X_add_symbol = NULL;
533 expressionP->X_op_symbol = NULL;
87271fa6 534
b34976b6 535 return TRUE;
252b5132 536 }
87271fa6 537
468cced8
AM
538 /* Reset the line as if we had not done anything. */
539 input_line_pointer = start;
b34976b6 540 return FALSE;
252b5132
RH
541}
542
543/* Summary of register_name().
544 *
545 * in: Input_line_pointer points to 1st char of operand.
546 *
b6ff326e 547 * out: An expressionS.
252b5132
RH
548 * The operand may have been a register: in this case, X_op == O_register,
549 * X_add_number is set to the register number, and truth is returned.
550 * Input_line_pointer->(next non-blank) char after operand, or is in
551 * its original state.
552 */
87271fa6 553
b34976b6 554static bfd_boolean
252b5132
RH
555other_register_name (expressionP)
556 expressionS *expressionP;
557{
558 int reg_number;
559 char *name;
560 char *start;
561 char c;
562
87271fa6 563 /* Find the spelling of the operand. */
252b5132
RH
564 start = name = input_line_pointer;
565
566 c = get_symbol_end ();
567 reg_number = reg_name_search (other_registers, OTHER_REG_NAME_CNT, name);
568
468cced8
AM
569 /* Put back the delimiting char. */
570 *input_line_pointer = c;
571
87271fa6 572 /* Look to see if it's in the register table. */
913572ec
AO
573 if (reg_number == 0
574 || (reg_number == AM33 && HAVE_AM33))
252b5132
RH
575 {
576 expressionP->X_op = O_register;
913572ec 577 expressionP->X_add_number = 0;
252b5132 578
87271fa6 579 /* Make the rest nice. */
252b5132
RH
580 expressionP->X_add_symbol = NULL;
581 expressionP->X_op_symbol = NULL;
87271fa6 582
b34976b6 583 return TRUE;
252b5132 584 }
87271fa6 585
468cced8
AM
586 /* Reset the line as if we had not done anything. */
587 input_line_pointer = start;
b34976b6 588 return FALSE;
252b5132
RH
589}
590
e7b71525
AO
591static bfd_boolean double_register_name PARAMS ((expressionS *));
592static bfd_boolean float_register_name PARAMS ((expressionS *));
593
594/* Summary of float_register_name:
595
596 in: Input_line_pointer points to 1st char of operand.
597
598 out: A expressionS.
599 The operand may have been a register: in this case, X_op == O_register,
600 X_add_number is set to the register number, and truth is returned.
601 Input_line_pointer->(next non-blank) char after operand, or is in
602 its original state. */
603
604static bfd_boolean
605float_register_name (expressionP)
606 expressionS *expressionP;
607{
608 int reg_number;
609 char *name;
610 char *start;
611 char c;
612
613 /* Find the spelling of the operand. */
614 start = name = input_line_pointer;
615
616 c = get_symbol_end ();
617 reg_number = reg_name_search (float_registers, FLOAT_REG_NAME_CNT, name);
618
619 /* Put back the delimiting char. */
620 * input_line_pointer = c;
621
622 /* Look to see if it's in the register table. */
623 if (reg_number >= 0)
624 {
625 expressionP->X_op = O_register;
626 expressionP->X_add_number = reg_number;
627
628 /* Make the rest nice. */
629 expressionP->X_add_symbol = NULL;
630 expressionP->X_op_symbol = NULL;
631
632 return TRUE;
633 }
634
635 /* Reset the line as if we had not done anything. */
636 input_line_pointer = start;
637 return FALSE;
638}
639
640/* Summary of double_register_name:
641
642 in: Input_line_pointer points to 1st char of operand.
643
644 out: A expressionS.
645 The operand may have been a register: in this case, X_op == O_register,
646 X_add_number is set to the register number, and truth is returned.
647 Input_line_pointer->(next non-blank) char after operand, or is in
648 its original state. */
649
650static bfd_boolean
651double_register_name (expressionP)
652 expressionS *expressionP;
653{
654 int reg_number;
655 char *name;
656 char *start;
657 char c;
658
659 /* Find the spelling of the operand. */
660 start = name = input_line_pointer;
661
662 c = get_symbol_end ();
663 reg_number = reg_name_search (double_registers, DOUBLE_REG_NAME_CNT, name);
664
665 /* Put back the delimiting char. */
666 * input_line_pointer = c;
667
668 /* Look to see if it's in the register table. */
669 if (reg_number >= 0)
670 {
671 expressionP->X_op = O_register;
672 expressionP->X_add_number = reg_number;
673
674 /* Make the rest nice. */
675 expressionP->X_add_symbol = NULL;
676 expressionP->X_op_symbol = NULL;
677
678 return TRUE;
679 }
680
681 /* Reset the line as if we had not done anything. */
682 input_line_pointer = start;
683 return FALSE;
684}
685
252b5132
RH
686void
687md_show_usage (stream)
87271fa6 688 FILE *stream;
252b5132 689{
87271fa6 690 fprintf (stream, _("MN10300 options:\n\
252b5132 691none yet\n"));
87271fa6 692}
252b5132
RH
693
694int
695md_parse_option (c, arg)
b4c1ea07
EC
696 int c ATTRIBUTE_UNUSED;
697 char *arg ATTRIBUTE_UNUSED;
252b5132
RH
698{
699 return 0;
700}
701
702symbolS *
703md_undefined_symbol (name)
b4c1ea07 704 char *name ATTRIBUTE_UNUSED;
252b5132
RH
705{
706 return 0;
707}
708
709char *
710md_atof (type, litp, sizep)
87271fa6
NC
711 int type;
712 char *litp;
713 int *sizep;
252b5132
RH
714{
715 int prec;
716 LITTLENUM_TYPE words[4];
717 char *t;
718 int i;
719
720 switch (type)
721 {
722 case 'f':
723 prec = 2;
724 break;
725
726 case 'd':
727 prec = 4;
728 break;
729
730 default:
731 *sizep = 0;
732 return "bad call to md_atof";
733 }
87271fa6 734
252b5132
RH
735 t = atof_ieee (input_line_pointer, type, words);
736 if (t)
737 input_line_pointer = t;
738
739 *sizep = prec * 2;
740
741 for (i = prec - 1; i >= 0; i--)
742 {
743 md_number_to_chars (litp, (valueT) words[i], 2);
744 litp += 2;
745 }
746
747 return NULL;
748}
749
252b5132
RH
750void
751md_convert_frag (abfd, sec, fragP)
b4c1ea07 752 bfd *abfd ATTRIBUTE_UNUSED;
87271fa6
NC
753 asection *sec;
754 fragS *fragP;
252b5132
RH
755{
756 static unsigned long label_count = 0;
757 char buf[40];
758
759 subseg_change (sec, 0);
760 if (fragP->fr_subtype == 0)
761 {
762 fix_new (fragP, fragP->fr_fix + 1, 1, fragP->fr_symbol,
763 fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
764 fragP->fr_var = 0;
765 fragP->fr_fix += 2;
766 }
767 else if (fragP->fr_subtype == 1)
768 {
769 /* Reverse the condition of the first branch. */
770 int offset = fragP->fr_fix;
771 int opcode = fragP->fr_literal[offset] & 0xff;
772
773 switch (opcode)
774 {
775 case 0xc8:
776 opcode = 0xc9;
777 break;
778 case 0xc9:
779 opcode = 0xc8;
780 break;
781 case 0xc0:
782 opcode = 0xc2;
783 break;
784 case 0xc2:
785 opcode = 0xc0;
786 break;
787 case 0xc3:
788 opcode = 0xc1;
789 break;
790 case 0xc1:
791 opcode = 0xc3;
792 break;
793 case 0xc4:
794 opcode = 0xc6;
795 break;
796 case 0xc6:
797 opcode = 0xc4;
798 break;
799 case 0xc7:
800 opcode = 0xc5;
801 break;
802 case 0xc5:
803 opcode = 0xc7;
804 break;
805 default:
806 abort ();
807 }
808 fragP->fr_literal[offset] = opcode;
809
810 /* Create a fixup for the reversed conditional branch. */
0aa529cb 811 sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
252b5132
RH
812 fix_new (fragP, fragP->fr_fix + 1, 1,
813 symbol_new (buf, sec, 0, fragP->fr_next),
814 fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
815
816 /* Now create the unconditional branch + fixup to the
817 final target. */
818 fragP->fr_literal[offset + 2] = 0xcc;
819 fix_new (fragP, fragP->fr_fix + 3, 2, fragP->fr_symbol,
820 fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
821 fragP->fr_var = 0;
822 fragP->fr_fix += 5;
823 }
824 else if (fragP->fr_subtype == 2)
825 {
826 /* Reverse the condition of the first branch. */
827 int offset = fragP->fr_fix;
828 int opcode = fragP->fr_literal[offset] & 0xff;
829
830 switch (opcode)
831 {
832 case 0xc8:
833 opcode = 0xc9;
834 break;
835 case 0xc9:
836 opcode = 0xc8;
837 break;
838 case 0xc0:
839 opcode = 0xc2;
840 break;
841 case 0xc2:
842 opcode = 0xc0;
843 break;
844 case 0xc3:
845 opcode = 0xc1;
846 break;
847 case 0xc1:
848 opcode = 0xc3;
849 break;
850 case 0xc4:
851 opcode = 0xc6;
852 break;
853 case 0xc6:
854 opcode = 0xc4;
855 break;
856 case 0xc7:
857 opcode = 0xc5;
858 break;
859 case 0xc5:
860 opcode = 0xc7;
861 break;
862 default:
863 abort ();
864 }
865 fragP->fr_literal[offset] = opcode;
866
867 /* Create a fixup for the reversed conditional branch. */
0aa529cb 868 sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
252b5132
RH
869 fix_new (fragP, fragP->fr_fix + 1, 1,
870 symbol_new (buf, sec, 0, fragP->fr_next),
871 fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
872
873 /* Now create the unconditional branch + fixup to the
874 final target. */
875 fragP->fr_literal[offset + 2] = 0xdc;
876 fix_new (fragP, fragP->fr_fix + 3, 4, fragP->fr_symbol,
877 fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
878 fragP->fr_var = 0;
879 fragP->fr_fix += 7;
880 }
881 else if (fragP->fr_subtype == 3)
882 {
883 fix_new (fragP, fragP->fr_fix + 2, 1, fragP->fr_symbol,
884 fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
885 fragP->fr_var = 0;
886 fragP->fr_fix += 3;
887 }
888 else if (fragP->fr_subtype == 4)
889 {
890 /* Reverse the condition of the first branch. */
891 int offset = fragP->fr_fix;
892 int opcode = fragP->fr_literal[offset + 1] & 0xff;
893
894 switch (opcode)
895 {
896 case 0xe8:
897 opcode = 0xe9;
898 break;
899 case 0xe9:
900 opcode = 0xe8;
901 break;
902 case 0xea:
903 opcode = 0xeb;
904 break;
905 case 0xeb:
906 opcode = 0xea;
907 break;
908 default:
909 abort ();
910 }
911 fragP->fr_literal[offset + 1] = opcode;
912
913 /* Create a fixup for the reversed conditional branch. */
0aa529cb 914 sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
252b5132
RH
915 fix_new (fragP, fragP->fr_fix + 2, 1,
916 symbol_new (buf, sec, 0, fragP->fr_next),
917 fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
918
919 /* Now create the unconditional branch + fixup to the
920 final target. */
921 fragP->fr_literal[offset + 3] = 0xcc;
922 fix_new (fragP, fragP->fr_fix + 4, 2, fragP->fr_symbol,
923 fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
924 fragP->fr_var = 0;
925 fragP->fr_fix += 6;
926 }
927 else if (fragP->fr_subtype == 5)
928 {
929 /* Reverse the condition of the first branch. */
930 int offset = fragP->fr_fix;
931 int opcode = fragP->fr_literal[offset + 1] & 0xff;
932
933 switch (opcode)
934 {
935 case 0xe8:
936 opcode = 0xe9;
937 break;
938 case 0xea:
939 opcode = 0xeb;
940 break;
941 case 0xeb:
942 opcode = 0xea;
943 break;
944 default:
945 abort ();
946 }
947 fragP->fr_literal[offset + 1] = opcode;
948
949 /* Create a fixup for the reversed conditional branch. */
0aa529cb 950 sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
252b5132
RH
951 fix_new (fragP, fragP->fr_fix + 2, 1,
952 symbol_new (buf, sec, 0, fragP->fr_next),
953 fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
954
955 /* Now create the unconditional branch + fixup to the
956 final target. */
957 fragP->fr_literal[offset + 3] = 0xdc;
958 fix_new (fragP, fragP->fr_fix + 4, 4, fragP->fr_symbol,
959 fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
960 fragP->fr_var = 0;
961 fragP->fr_fix += 8;
962 }
963 else if (fragP->fr_subtype == 6)
964 {
965 int offset = fragP->fr_fix;
966 fragP->fr_literal[offset] = 0xcd;
967 fix_new (fragP, fragP->fr_fix + 1, 2, fragP->fr_symbol,
968 fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
969 fragP->fr_var = 0;
970 fragP->fr_fix += 5;
971 }
972 else if (fragP->fr_subtype == 7)
973 {
974 int offset = fragP->fr_fix;
975 fragP->fr_literal[offset] = 0xdd;
976 fragP->fr_literal[offset + 5] = fragP->fr_literal[offset + 3];
977 fragP->fr_literal[offset + 6] = fragP->fr_literal[offset + 4];
978
979 fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
980 fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
981 fragP->fr_var = 0;
982 fragP->fr_fix += 7;
983 }
984 else if (fragP->fr_subtype == 8)
985 {
986 int offset = fragP->fr_fix;
987 fragP->fr_literal[offset] = 0xfa;
988 fragP->fr_literal[offset + 1] = 0xff;
989 fix_new (fragP, fragP->fr_fix + 2, 2, fragP->fr_symbol,
990 fragP->fr_offset + 2, 1, BFD_RELOC_16_PCREL);
991 fragP->fr_var = 0;
992 fragP->fr_fix += 4;
993 }
994 else if (fragP->fr_subtype == 9)
995 {
996 int offset = fragP->fr_fix;
997 fragP->fr_literal[offset] = 0xfc;
998 fragP->fr_literal[offset + 1] = 0xff;
999
1000 fix_new (fragP, fragP->fr_fix + 2, 4, fragP->fr_symbol,
1001 fragP->fr_offset + 2, 1, BFD_RELOC_32_PCREL);
1002 fragP->fr_var = 0;
1003 fragP->fr_fix += 6;
1004 }
1005 else if (fragP->fr_subtype == 10)
1006 {
1007 fragP->fr_literal[fragP->fr_fix] = 0xca;
1008 fix_new (fragP, fragP->fr_fix + 1, 1, fragP->fr_symbol,
1009 fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
1010 fragP->fr_var = 0;
1011 fragP->fr_fix += 2;
1012 }
1013 else if (fragP->fr_subtype == 11)
1014 {
1015 int offset = fragP->fr_fix;
1016 fragP->fr_literal[offset] = 0xcc;
1017
1018 fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
1019 fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
1020 fragP->fr_var = 0;
1021 fragP->fr_fix += 3;
1022 }
1023 else if (fragP->fr_subtype == 12)
1024 {
1025 int offset = fragP->fr_fix;
1026 fragP->fr_literal[offset] = 0xdc;
1027
1028 fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
1029 fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
1030 fragP->fr_var = 0;
1031 fragP->fr_fix += 5;
1032 }
e7b71525
AO
1033 else if (fragP->fr_subtype == 13)
1034 {
1035 fix_new (fragP, fragP->fr_fix + 2, 1, fragP->fr_symbol,
1036 fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
1037 fragP->fr_var = 0;
1038 fragP->fr_fix += 3;
1039 }
1040 else if (fragP->fr_subtype == 14)
1041 {
1042 /* Reverse the condition of the first branch. */
1043 int offset = fragP->fr_fix;
1044 int opcode = fragP->fr_literal[offset + 1] & 0xff;
1045
1046 switch (opcode)
1047 {
1048 case 0xd0:
1049 opcode = 0xd1;
1050 break;
1051 case 0xd1:
1052 opcode = 0xd0;
1053 break;
1054 case 0xd2:
1055 opcode = 0xdc;
1056 break;
1057 case 0xd3:
1058 opcode = 0xdb;
1059 break;
1060 case 0xd4:
1061 opcode = 0xda;
1062 break;
1063 case 0xd5:
1064 opcode = 0xd9;
1065 break;
1066 case 0xd6:
1067 opcode = 0xd8;
1068 break;
1069 case 0xd7:
1070 opcode = 0xdd;
1071 break;
1072 case 0xd8:
1073 opcode = 0xd6;
1074 break;
1075 case 0xd9:
1076 opcode = 0xd5;
1077 break;
1078 case 0xda:
1079 opcode = 0xd4;
1080 break;
1081 case 0xdb:
1082 opcode = 0xd3;
1083 break;
1084 case 0xdc:
1085 opcode = 0xd2;
1086 break;
1087 case 0xdd:
1088 opcode = 0xd7;
1089 break;
1090 default:
1091 abort ();
1092 }
1093 fragP->fr_literal[offset + 1] = opcode;
1094
1095 /* Create a fixup for the reversed conditional branch. */
1096 sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
1097 fix_new (fragP, fragP->fr_fix + 2, 1,
1098 symbol_new (buf, sec, 0, fragP->fr_next),
1099 fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
1100
1101 /* Now create the unconditional branch + fixup to the
1102 final target. */
1103 fragP->fr_literal[offset + 3] = 0xcc;
1104 fix_new (fragP, fragP->fr_fix + 4, 2, fragP->fr_symbol,
1105 fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
1106 fragP->fr_var = 0;
1107 fragP->fr_fix += 6;
1108 }
1109 else if (fragP->fr_subtype == 15)
1110 {
1111 /* Reverse the condition of the first branch. */
1112 int offset = fragP->fr_fix;
1113 int opcode = fragP->fr_literal[offset + 1] & 0xff;
1114
1115 switch (opcode)
1116 {
1117 case 0xd0:
1118 opcode = 0xd1;
1119 break;
1120 case 0xd1:
1121 opcode = 0xd0;
1122 break;
1123 case 0xd2:
1124 opcode = 0xdc;
1125 break;
1126 case 0xd3:
1127 opcode = 0xdb;
1128 break;
1129 case 0xd4:
1130 opcode = 0xda;
1131 break;
1132 case 0xd5:
1133 opcode = 0xd9;
1134 break;
1135 case 0xd6:
1136 opcode = 0xd8;
1137 break;
1138 case 0xd7:
1139 opcode = 0xdd;
1140 break;
1141 case 0xd8:
1142 opcode = 0xd6;
1143 break;
1144 case 0xd9:
1145 opcode = 0xd5;
1146 break;
1147 case 0xda:
1148 opcode = 0xd4;
1149 break;
1150 case 0xdb:
1151 opcode = 0xd3;
1152 break;
1153 case 0xdc:
1154 opcode = 0xd2;
1155 break;
1156 case 0xdd:
1157 opcode = 0xd7;
1158 break;
1159 default:
1160 abort ();
1161 }
1162 fragP->fr_literal[offset + 1] = opcode;
1163
1164 /* Create a fixup for the reversed conditional branch. */
1165 sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
1166 fix_new (fragP, fragP->fr_fix + 2, 1,
1167 symbol_new (buf, sec, 0, fragP->fr_next),
1168 fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
1169
1170 /* Now create the unconditional branch + fixup to the
1171 final target. */
1172 fragP->fr_literal[offset + 3] = 0xdc;
1173 fix_new (fragP, fragP->fr_fix + 4, 4, fragP->fr_symbol,
1174 fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
1175 fragP->fr_var = 0;
1176 fragP->fr_fix += 8;
1177 }
252b5132
RH
1178 else
1179 abort ();
1180}
1181
1182valueT
1183md_section_align (seg, addr)
1184 asection *seg;
1185 valueT addr;
1186{
1187 int align = bfd_get_section_alignment (stdoutput, seg);
1188 return ((addr + (1 << align) - 1) & (-1 << align));
1189}
1190
1191void
1192md_begin ()
1193{
1194 char *prev_name = "";
1195 register const struct mn10300_opcode *op;
1196
87271fa6 1197 mn10300_hash = hash_new ();
252b5132
RH
1198
1199 /* Insert unique names into hash table. The MN10300 instruction set
1200 has many identical opcode names that have different opcodes based
1201 on the operands. This hash table then provides a quick index to
1202 the first opcode with a particular name in the opcode table. */
1203
1204 op = mn10300_opcodes;
1205 while (op->name)
1206 {
87271fa6 1207 if (strcmp (prev_name, op->name))
252b5132
RH
1208 {
1209 prev_name = (char *) op->name;
1210 hash_insert (mn10300_hash, op->name, (char *) op);
1211 }
1212 op++;
1213 }
1214
252b5132 1215 /* Set the default machine type. */
0a727238 1216 if (!bfd_set_arch_mach (stdoutput, bfd_arch_mn10300, MN103))
252b5132
RH
1217 as_warn (_("could not set architecture and machine"));
1218
0a727238 1219 current_machine = MN103;
252b5132
RH
1220}
1221
1222void
87271fa6 1223md_assemble (str)
252b5132
RH
1224 char *str;
1225{
1226 char *s;
1227 struct mn10300_opcode *opcode;
1228 struct mn10300_opcode *next_opcode;
1229 const unsigned char *opindex_ptr;
1230 int next_opindex, relaxable;
eb0dfd58 1231 unsigned long insn, extension, size = 0;
252b5132
RH
1232 char *f;
1233 int i;
1234 int match;
1235
1236 /* Get the opcode. */
3882b010 1237 for (s = str; *s != '\0' && !ISSPACE (*s); s++)
252b5132
RH
1238 ;
1239 if (*s != '\0')
1240 *s++ = '\0';
1241
87271fa6
NC
1242 /* Find the first opcode with the proper name. */
1243 opcode = (struct mn10300_opcode *) hash_find (mn10300_hash, str);
252b5132
RH
1244 if (opcode == NULL)
1245 {
1246 as_bad (_("Unrecognized opcode: `%s'"), str);
1247 return;
1248 }
1249
1250 str = s;
3882b010 1251 while (ISSPACE (*str))
252b5132
RH
1252 ++str;
1253
1254 input_line_pointer = str;
1255
87271fa6 1256 for (;;)
252b5132
RH
1257 {
1258 const char *errmsg;
1259 int op_idx;
1260 char *hold;
1261 int extra_shift = 0;
1262
252b5132
RH
1263 errmsg = _("Invalid opcode/operands");
1264
1265 /* Reset the array of register operands. */
1266 memset (mn10300_reg_operands, -1, sizeof (mn10300_reg_operands));
1267
1268 relaxable = 0;
1269 fc = 0;
1270 match = 0;
1271 next_opindex = 0;
1272 insn = opcode->opcode;
1273 extension = 0;
1274
1275 /* If the instruction is not available on the current machine
1276 then it can not possibly match. */
1277 if (opcode->machine
e7b71525 1278 && !(opcode->machine == AM33_2 && HAVE_AM33_2)
aa15f6f7
AO
1279 && !(opcode->machine == AM33 && HAVE_AM33)
1280 && !(opcode->machine == AM30 && HAVE_AM30))
252b5132
RH
1281 goto error;
1282
1283 for (op_idx = 1, opindex_ptr = opcode->operands;
1284 *opindex_ptr != 0;
1285 opindex_ptr++, op_idx++)
1286 {
1287 const struct mn10300_operand *operand;
1288 expressionS ex;
1289
1290 if (next_opindex == 0)
1291 {
1292 operand = &mn10300_operands[*opindex_ptr];
1293 }
1294 else
1295 {
1296 operand = &mn10300_operands[next_opindex];
1297 next_opindex = 0;
1298 }
1299
1300 while (*str == ' ' || *str == ',')
1301 ++str;
1302
1303 if (operand->flags & MN10300_OPERAND_RELAX)
1304 relaxable = 1;
1305
87271fa6 1306 /* Gather the operand. */
252b5132
RH
1307 hold = input_line_pointer;
1308 input_line_pointer = str;
1309
1310 if (operand->flags & MN10300_OPERAND_PAREN)
1311 {
1312 if (*input_line_pointer != ')' && *input_line_pointer != '(')
1313 {
1314 input_line_pointer = hold;
1315 str = hold;
1316 goto error;
1317 }
1318 input_line_pointer++;
1319 goto keep_going;
1320 }
1321 /* See if we can match the operands. */
1322 else if (operand->flags & MN10300_OPERAND_DREG)
1323 {
1324 if (!data_register_name (&ex))
1325 {
1326 input_line_pointer = hold;
1327 str = hold;
1328 goto error;
1329 }
1330 }
1331 else if (operand->flags & MN10300_OPERAND_AREG)
1332 {
1333 if (!address_register_name (&ex))
1334 {
1335 input_line_pointer = hold;
1336 str = hold;
1337 goto error;
1338 }
1339 }
1340 else if (operand->flags & MN10300_OPERAND_SP)
1341 {
1342 char *start = input_line_pointer;
1343 char c = get_symbol_end ();
1344
1345 if (strcasecmp (start, "sp") != 0)
1346 {
1347 *input_line_pointer = c;
1348 input_line_pointer = hold;
1349 str = hold;
1350 goto error;
1351 }
1352 *input_line_pointer = c;
1353 goto keep_going;
1354 }
85cb2cf9
JL
1355 else if (operand->flags & MN10300_OPERAND_RREG)
1356 {
1357 if (!r_register_name (&ex))
1358 {
1359 input_line_pointer = hold;
1360 str = hold;
1361 goto error;
1362 }
1363 }
1364 else if (operand->flags & MN10300_OPERAND_XRREG)
1365 {
1366 if (!xr_register_name (&ex))
1367 {
1368 input_line_pointer = hold;
1369 str = hold;
1370 goto error;
1371 }
1372 }
e7b71525
AO
1373 else if (operand->flags & MN10300_OPERAND_FSREG)
1374 {
1375 if (!float_register_name (&ex))
1376 {
1377 input_line_pointer = hold;
1378 str = hold;
1379 goto error;
1380 }
1381 }
1382 else if (operand->flags & MN10300_OPERAND_FDREG)
1383 {
1384 if (!double_register_name (&ex))
1385 {
1386 input_line_pointer = hold;
1387 str = hold;
1388 goto error;
1389 }
1390 }
1391 else if (operand->flags & MN10300_OPERAND_FPCR)
1392 {
1393 char *start = input_line_pointer;
1394 char c = get_symbol_end ();
1395
1396 if (strcasecmp (start, "fpcr") != 0)
1397 {
1398 *input_line_pointer = c;
1399 input_line_pointer = hold;
1400 str = hold;
1401 goto error;
1402 }
1403 *input_line_pointer = c;
1404 goto keep_going;
1405 }
85cb2cf9
JL
1406 else if (operand->flags & MN10300_OPERAND_USP)
1407 {
1408 char *start = input_line_pointer;
1409 char c = get_symbol_end ();
1410
1411 if (strcasecmp (start, "usp") != 0)
1412 {
1413 *input_line_pointer = c;
1414 input_line_pointer = hold;
1415 str = hold;
1416 goto error;
1417 }
1418 *input_line_pointer = c;
1419 goto keep_going;
1420 }
1421 else if (operand->flags & MN10300_OPERAND_SSP)
1422 {
1423 char *start = input_line_pointer;
1424 char c = get_symbol_end ();
1425
1426 if (strcasecmp (start, "ssp") != 0)
1427 {
1428 *input_line_pointer = c;
1429 input_line_pointer = hold;
1430 str = hold;
1431 goto error;
1432 }
1433 *input_line_pointer = c;
1434 goto keep_going;
1435 }
1436 else if (operand->flags & MN10300_OPERAND_MSP)
1437 {
1438 char *start = input_line_pointer;
1439 char c = get_symbol_end ();
1440
1441 if (strcasecmp (start, "msp") != 0)
1442 {
1443 *input_line_pointer = c;
1444 input_line_pointer = hold;
1445 str = hold;
1446 goto error;
1447 }
1448 *input_line_pointer = c;
1449 goto keep_going;
1450 }
1451 else if (operand->flags & MN10300_OPERAND_PC)
1452 {
1453 char *start = input_line_pointer;
1454 char c = get_symbol_end ();
1455
1456 if (strcasecmp (start, "pc") != 0)
1457 {
1458 *input_line_pointer = c;
1459 input_line_pointer = hold;
1460 str = hold;
1461 goto error;
1462 }
1463 *input_line_pointer = c;
1464 goto keep_going;
1465 }
1466 else if (operand->flags & MN10300_OPERAND_EPSW)
1467 {
1468 char *start = input_line_pointer;
1469 char c = get_symbol_end ();
1470
1471 if (strcasecmp (start, "epsw") != 0)
1472 {
1473 *input_line_pointer = c;
1474 input_line_pointer = hold;
1475 str = hold;
1476 goto error;
1477 }
1478 *input_line_pointer = c;
1479 goto keep_going;
1480 }
1481 else if (operand->flags & MN10300_OPERAND_PLUS)
1482 {
1483 if (*input_line_pointer != '+')
1484 {
1485 input_line_pointer = hold;
1486 str = hold;
1487 goto error;
1488 }
1489 input_line_pointer++;
1490 goto keep_going;
1491 }
252b5132
RH
1492 else if (operand->flags & MN10300_OPERAND_PSW)
1493 {
1494 char *start = input_line_pointer;
1495 char c = get_symbol_end ();
1496
1497 if (strcasecmp (start, "psw") != 0)
1498 {
1499 *input_line_pointer = c;
1500 input_line_pointer = hold;
1501 str = hold;
1502 goto error;
1503 }
1504 *input_line_pointer = c;
1505 goto keep_going;
1506 }
1507 else if (operand->flags & MN10300_OPERAND_MDR)
1508 {
1509 char *start = input_line_pointer;
1510 char c = get_symbol_end ();
1511
1512 if (strcasecmp (start, "mdr") != 0)
1513 {
1514 *input_line_pointer = c;
1515 input_line_pointer = hold;
1516 str = hold;
1517 goto error;
1518 }
1519 *input_line_pointer = c;
1520 goto keep_going;
1521 }
1522 else if (operand->flags & MN10300_OPERAND_REG_LIST)
1523 {
1524 unsigned int value = 0;
1525 if (*input_line_pointer != '[')
1526 {
1527 input_line_pointer = hold;
1528 str = hold;
1529 goto error;
1530 }
1531
1532 /* Eat the '['. */
1533 input_line_pointer++;
87271fa6 1534
252b5132 1535 /* We used to reject a null register list here; however,
87271fa6
NC
1536 we accept it now so the compiler can emit "call"
1537 instructions for all calls to named functions.
252b5132
RH
1538
1539 The linker can then fill in the appropriate bits for the
1540 register list and stack size or change the instruction
1541 into a "calls" if using "call" is not profitable. */
1542 while (*input_line_pointer != ']')
1543 {
1544 char *start;
1545 char c;
1546
1547 if (*input_line_pointer == ',')
1548 input_line_pointer++;
1549
1550 start = input_line_pointer;
1551 c = get_symbol_end ();
1552
1553 if (strcasecmp (start, "d2") == 0)
1554 {
1555 value |= 0x80;
1556 *input_line_pointer = c;
1557 }
1558 else if (strcasecmp (start, "d3") == 0)
1559 {
1560 value |= 0x40;
1561 *input_line_pointer = c;
1562 }
1563 else if (strcasecmp (start, "a2") == 0)
1564 {
1565 value |= 0x20;
1566 *input_line_pointer = c;
1567 }
1568 else if (strcasecmp (start, "a3") == 0)
1569 {
1570 value |= 0x10;
1571 *input_line_pointer = c;
1572 }
1573 else if (strcasecmp (start, "other") == 0)
1574 {
1575 value |= 0x08;
1576 *input_line_pointer = c;
1577 }
0a727238 1578 else if (HAVE_AM33
85cb2cf9
JL
1579 && strcasecmp (start, "exreg0") == 0)
1580 {
1581 value |= 0x04;
1582 *input_line_pointer = c;
1583 }
0a727238 1584 else if (HAVE_AM33
85cb2cf9
JL
1585 && strcasecmp (start, "exreg1") == 0)
1586 {
1587 value |= 0x02;
1588 *input_line_pointer = c;
1589 }
0a727238 1590 else if (HAVE_AM33
85cb2cf9
JL
1591 && strcasecmp (start, "exother") == 0)
1592 {
1593 value |= 0x01;
1594 *input_line_pointer = c;
1595 }
0a727238 1596 else if (HAVE_AM33
85cb2cf9
JL
1597 && strcasecmp (start, "all") == 0)
1598 {
1599 value |= 0xff;
1600 *input_line_pointer = c;
1601 }
252b5132
RH
1602 else
1603 {
1604 input_line_pointer = hold;
1605 str = hold;
1606 goto error;
1607 }
1608 }
1609 input_line_pointer++;
1610 mn10300_insert_operand (&insn, &extension, operand,
1611 value, (char *) NULL, 0, 0);
1612 goto keep_going;
1613
1614 }
1615 else if (data_register_name (&ex))
1616 {
1617 input_line_pointer = hold;
1618 str = hold;
1619 goto error;
1620 }
1621 else if (address_register_name (&ex))
1622 {
1623 input_line_pointer = hold;
1624 str = hold;
1625 goto error;
1626 }
1627 else if (other_register_name (&ex))
1628 {
1629 input_line_pointer = hold;
1630 str = hold;
1631 goto error;
1632 }
0a727238 1633 else if (HAVE_AM33 && r_register_name (&ex))
85cb2cf9
JL
1634 {
1635 input_line_pointer = hold;
1636 str = hold;
1637 goto error;
1638 }
0a727238 1639 else if (HAVE_AM33 && xr_register_name (&ex))
85cb2cf9
JL
1640 {
1641 input_line_pointer = hold;
1642 str = hold;
1643 goto error;
1644 }
e7b71525
AO
1645 else if (HAVE_AM33_2 && float_register_name (&ex))
1646 {
1647 input_line_pointer = hold;
1648 str = hold;
1649 goto error;
1650 }
1651 else if (HAVE_AM33_2 && double_register_name (&ex))
1652 {
1653 input_line_pointer = hold;
1654 str = hold;
1655 goto error;
1656 }
252b5132
RH
1657 else if (*str == ')' || *str == '(')
1658 {
1659 input_line_pointer = hold;
1660 str = hold;
1661 goto error;
1662 }
1663 else
1664 {
1665 expression (&ex);
1666 }
1667
87271fa6 1668 switch (ex.X_op)
252b5132
RH
1669 {
1670 case O_illegal:
1671 errmsg = _("illegal operand");
1672 goto error;
1673 case O_absent:
1674 errmsg = _("missing operand");
1675 goto error;
1676 case O_register:
1677 {
1678 int mask;
1679
1680 mask = MN10300_OPERAND_DREG | MN10300_OPERAND_AREG;
0a727238
AO
1681 if (HAVE_AM33)
1682 mask |= MN10300_OPERAND_RREG | MN10300_OPERAND_XRREG;
e7b71525
AO
1683 if (HAVE_AM33_2)
1684 mask |= MN10300_OPERAND_FSREG | MN10300_OPERAND_FDREG;
252b5132
RH
1685 if ((operand->flags & mask) == 0)
1686 {
1687 input_line_pointer = hold;
1688 str = hold;
1689 goto error;
1690 }
87271fa6 1691
252b5132
RH
1692 if (opcode->format == FMT_D1 || opcode->format == FMT_S1)
1693 extra_shift = 8;
1694 else if (opcode->format == FMT_D2
1695 || opcode->format == FMT_D4
1696 || opcode->format == FMT_S2
1697 || opcode->format == FMT_S4
1698 || opcode->format == FMT_S6
1699 || opcode->format == FMT_D5)
1700 extra_shift = 16;
85cb2cf9
JL
1701 else if (opcode->format == FMT_D7)
1702 extra_shift = 8;
1703 else if (opcode->format == FMT_D8 || opcode->format == FMT_D9)
1704 extra_shift = 8;
252b5132
RH
1705 else
1706 extra_shift = 0;
87271fa6 1707
252b5132
RH
1708 mn10300_insert_operand (&insn, &extension, operand,
1709 ex.X_add_number, (char *) NULL,
1710 0, extra_shift);
1711
252b5132
RH
1712 /* And note the register number in the register array. */
1713 mn10300_reg_operands[op_idx - 1] = ex.X_add_number;
1714 break;
1715 }
1716
1717 case O_constant:
1718 /* If this operand can be promoted, and it doesn't
1719 fit into the allocated bitfield for this insn,
1720 then promote it (ie this opcode does not match). */
1721 if (operand->flags
1722 & (MN10300_OPERAND_PROMOTE | MN10300_OPERAND_RELAX)
87271fa6 1723 && !check_operand (insn, operand, ex.X_add_number))
252b5132
RH
1724 {
1725 input_line_pointer = hold;
1726 str = hold;
1727 goto error;
1728 }
1729
1730 mn10300_insert_operand (&insn, &extension, operand,
1731 ex.X_add_number, (char *) NULL,
1732 0, 0);
1733 break;
1734
1735 default:
1736 /* If this operand can be promoted, then this opcode didn't
1737 match since we can't know if it needed promotion! */
1738 if (operand->flags & MN10300_OPERAND_PROMOTE)
1739 {
1740 input_line_pointer = hold;
1741 str = hold;
1742 goto error;
1743 }
1744
1745 /* We need to generate a fixup for this expression. */
1746 if (fc >= MAX_INSN_FIXUPS)
1747 as_fatal (_("too many fixups"));
1748 fixups[fc].exp = ex;
1749 fixups[fc].opindex = *opindex_ptr;
1750 fixups[fc].reloc = BFD_RELOC_UNUSED;
1751 ++fc;
1752 break;
1753 }
1754
1755keep_going:
1756 str = input_line_pointer;
1757 input_line_pointer = hold;
1758
1759 while (*str == ' ' || *str == ',')
1760 ++str;
1761
1762 }
1763
1764 /* Make sure we used all the operands! */
1765 if (*str != ',')
1766 match = 1;
1767
1768 /* If this instruction has registers that must not match, verify
1769 that they do indeed not match. */
1770 if (opcode->no_match_operands)
1771 {
1772 int i;
1773
1774 /* Look at each operand to see if it's marked. */
1775 for (i = 0; i < MN10300_MAX_OPERANDS; i++)
1776 {
1777 if ((1 << i) & opcode->no_match_operands)
1778 {
1779 int j;
1780
1781 /* operand I is marked. Check that it does not match any
1782 operands > I which are marked. */
1783 for (j = i + 1; j < MN10300_MAX_OPERANDS; j++)
1784 {
1785 if (((1 << j) & opcode->no_match_operands)
1786 && mn10300_reg_operands[i] == mn10300_reg_operands[j])
1787 {
1788 errmsg = _("Invalid register specification.");
1789 match = 0;
1790 goto error;
1791 }
1792 }
1793 }
1794 }
1795 }
1796
1797 error:
1798 if (match == 0)
87271fa6 1799 {
252b5132 1800 next_opcode = opcode + 1;
87271fa6 1801 if (!strcmp (next_opcode->name, opcode->name))
252b5132
RH
1802 {
1803 opcode = next_opcode;
1804 continue;
1805 }
87271fa6 1806
252b5132
RH
1807 as_bad ("%s", errmsg);
1808 return;
87271fa6 1809 }
252b5132
RH
1810 break;
1811 }
87271fa6 1812
3882b010 1813 while (ISSPACE (*str))
252b5132
RH
1814 ++str;
1815
1816 if (*str != '\0')
1817 as_bad (_("junk at end of line: `%s'"), str);
1818
1819 input_line_pointer = str;
1820
1821 /* Determine the size of the instruction. */
1822 if (opcode->format == FMT_S0)
1823 size = 1;
1824
1825 if (opcode->format == FMT_S1 || opcode->format == FMT_D0)
1826 size = 2;
1827
1828 if (opcode->format == FMT_S2 || opcode->format == FMT_D1)
1829 size = 3;
1830
85cb2cf9
JL
1831 if (opcode->format == FMT_D6)
1832 size = 3;
1833
1834 if (opcode->format == FMT_D7 || opcode->format == FMT_D10)
1835 size = 4;
1836
1837 if (opcode->format == FMT_D8)
1838 size = 6;
1839
1840 if (opcode->format == FMT_D9)
1841 size = 7;
252b5132
RH
1842
1843 if (opcode->format == FMT_S4)
1844 size = 5;
1845
1846 if (opcode->format == FMT_S6 || opcode->format == FMT_D5)
1847 size = 7;
1848
1849 if (opcode->format == FMT_D2)
1850 size = 4;
1851
e7b71525
AO
1852 if (opcode->format == FMT_D3)
1853 size = 5;
1854
252b5132
RH
1855 if (opcode->format == FMT_D4)
1856 size = 6;
1857
1858 if (relaxable && fc > 0)
1859 {
1860 int type;
1861
076dc439
AO
1862 /* We want to anchor the line info to the previous frag (if
1863 there isn't one, create it), so that, when the insn is
1864 resized, we still get the right address for the beginning of
1865 the region. */
1866 f = frag_more (0);
1867 dwarf2_emit_insn (0);
1868
87271fa6 1869 /* bCC */
252b5132
RH
1870 if (size == 2)
1871 {
1872 /* Handle bra specially. Basically treat it like jmp so
1873 that we automatically handle 8, 16 and 32 bit offsets
1874 correctly as well as jumps to an undefined address.
1875
1876 It is also important to not treat it like other bCC
1877 instructions since the long forms of bra is different
1878 from other bCC instructions. */
1879 if (opcode->opcode == 0xca00)
1880 type = 10;
1881 else
1882 type = 0;
1883 }
87271fa6 1884 /* call */
252b5132 1885 else if (size == 5)
87271fa6
NC
1886 type = 6;
1887 /* calls */
252b5132
RH
1888 else if (size == 4)
1889 type = 8;
87271fa6 1890 /* jmp */
252b5132
RH
1891 else if (size == 3 && opcode->opcode == 0xcc0000)
1892 type = 10;
e7b71525
AO
1893 else if (size == 3 && (opcode->opcode & 0xfff000) == 0xf8d000)
1894 type = 13;
87271fa6 1895 /* bCC (uncommon cases) */
252b5132
RH
1896 else
1897 type = 3;
1898
1899 f = frag_var (rs_machine_dependent, 8, 8 - size, type,
1900 fixups[0].exp.X_add_symbol,
1901 fixups[0].exp.X_add_number,
1902 (char *)fixups[0].opindex);
87271fa6 1903
252b5132
RH
1904 /* This is pretty hokey. We basically just care about the
1905 opcode, so we have to write out the first word big endian.
1906
1907 The exception is "call", which has two operands that we
1908 care about.
1909
1910 The first operand (the register list) happens to be in the
1911 first instruction word, and will be in the right place if
1912 we output the first word in big endian mode.
1913
1914 The second operand (stack size) is in the extension word,
1915 and we want it to appear as the first character in the extension
1916 word (as it appears in memory). Luckily, writing the extension
1917 word in big endian format will do what we want. */
1918 number_to_chars_bigendian (f, insn, size > 4 ? 4 : size);
1919 if (size > 8)
1920 {
1921 number_to_chars_bigendian (f + 4, extension, 4);
1922 number_to_chars_bigendian (f + 8, 0, size - 8);
1923 }
1924 else if (size > 4)
1925 number_to_chars_bigendian (f + 4, extension, size - 4);
1926 }
1927 else
1928 {
1929 /* Allocate space for the instruction. */
1930 f = frag_more (size);
1931
1932 /* Fill in bytes for the instruction. Note that opcode fields
1933 are written big-endian, 16 & 32bit immediates are written
1934 little endian. Egad. */
1935 if (opcode->format == FMT_S0
1936 || opcode->format == FMT_S1
1937 || opcode->format == FMT_D0
85cb2cf9
JL
1938 || opcode->format == FMT_D6
1939 || opcode->format == FMT_D7
1940 || opcode->format == FMT_D10
252b5132
RH
1941 || opcode->format == FMT_D1)
1942 {
1943 number_to_chars_bigendian (f, insn, size);
1944 }
1945 else if (opcode->format == FMT_S2
1946 && opcode->opcode != 0xdf0000
1947 && opcode->opcode != 0xde0000)
1948 {
1949 /* A format S2 instruction that is _not_ "ret" and "retf". */
1950 number_to_chars_bigendian (f, (insn >> 16) & 0xff, 1);
1951 number_to_chars_littleendian (f + 1, insn & 0xffff, 2);
1952 }
1953 else if (opcode->format == FMT_S2)
1954 {
1955 /* This must be a ret or retf, which is written entirely in
1956 big-endian format. */
1957 number_to_chars_bigendian (f, insn, 3);
1958 }
1959 else if (opcode->format == FMT_S4
1960 && opcode->opcode != 0xdc000000)
1961 {
1962 /* This must be a format S4 "call" instruction. What a pain. */
1963 unsigned long temp = (insn >> 8) & 0xffff;
1964 number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1);
1965 number_to_chars_littleendian (f + 1, temp, 2);
1966 number_to_chars_bigendian (f + 3, insn & 0xff, 1);
1967 number_to_chars_bigendian (f + 4, extension & 0xff, 1);
1968 }
1969 else if (opcode->format == FMT_S4)
1970 {
1971 /* This must be a format S4 "jmp" instruction. */
1972 unsigned long temp = ((insn & 0xffffff) << 8) | (extension & 0xff);
1973 number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1);
1974 number_to_chars_littleendian (f + 1, temp, 4);
1975 }
1976 else if (opcode->format == FMT_S6)
1977 {
1978 unsigned long temp = ((insn & 0xffffff) << 8)
1979 | ((extension >> 16) & 0xff);
1980 number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1);
1981 number_to_chars_littleendian (f + 1, temp, 4);
1982 number_to_chars_bigendian (f + 5, (extension >> 8) & 0xff, 1);
1983 number_to_chars_bigendian (f + 6, extension & 0xff, 1);
1984 }
1985 else if (opcode->format == FMT_D2
1986 && opcode->opcode != 0xfaf80000
1987 && opcode->opcode != 0xfaf00000
1988 && opcode->opcode != 0xfaf40000)
1989 {
1990 /* A format D2 instruction where the 16bit immediate is
1991 really a single 16bit value, not two 8bit values. */
1992 number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
1993 number_to_chars_littleendian (f + 2, insn & 0xffff, 2);
1994 }
1995 else if (opcode->format == FMT_D2)
1996 {
1997 /* A format D2 instruction where the 16bit immediate
1998 is really two 8bit immediates. */
1999 number_to_chars_bigendian (f, insn, 4);
2000 }
e7b71525
AO
2001 else if (opcode->format == FMT_D3)
2002 {
2003 number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
2004 number_to_chars_littleendian (f + 2, insn & 0xffff, 2);
2005 number_to_chars_bigendian (f + 4, extension & 0xff, 1);
2006 }
252b5132
RH
2007 else if (opcode->format == FMT_D4)
2008 {
2009 unsigned long temp = ((insn & 0xffff) << 16) | (extension & 0xffff);
87271fa6 2010
252b5132
RH
2011 number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
2012 number_to_chars_littleendian (f + 2, temp, 4);
2013 }
2014 else if (opcode->format == FMT_D5)
2015 {
87271fa6
NC
2016 unsigned long temp = (((insn & 0xffff) << 16)
2017 | ((extension >> 8) & 0xffff));
2018
252b5132
RH
2019 number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
2020 number_to_chars_littleendian (f + 2, temp, 4);
2021 number_to_chars_bigendian (f + 6, extension & 0xff, 1);
2022 }
85cb2cf9
JL
2023 else if (opcode->format == FMT_D8)
2024 {
87271fa6
NC
2025 unsigned long temp = ((insn & 0xff) << 16) | (extension & 0xffff);
2026
2027 number_to_chars_bigendian (f, (insn >> 8) & 0xffffff, 3);
2028 number_to_chars_bigendian (f + 3, (temp & 0xff), 1);
2029 number_to_chars_littleendian (f + 4, temp >> 8, 2);
85cb2cf9
JL
2030 }
2031 else if (opcode->format == FMT_D9)
2032 {
87271fa6
NC
2033 unsigned long temp = ((insn & 0xff) << 24) | (extension & 0xffffff);
2034
2035 number_to_chars_bigendian (f, (insn >> 8) & 0xffffff, 3);
2036 number_to_chars_littleendian (f + 3, temp, 4);
85cb2cf9 2037 }
252b5132
RH
2038
2039 /* Create any fixups. */
2040 for (i = 0; i < fc; i++)
2041 {
2042 const struct mn10300_operand *operand;
2043
2044 operand = &mn10300_operands[fixups[i].opindex];
2045 if (fixups[i].reloc != BFD_RELOC_UNUSED)
2046 {
2047 reloc_howto_type *reloc_howto;
2048 int size;
2049 int offset;
2050 fixS *fixP;
2051
87271fa6
NC
2052 reloc_howto = bfd_reloc_type_lookup (stdoutput,
2053 fixups[i].reloc);
252b5132
RH
2054
2055 if (!reloc_howto)
87271fa6
NC
2056 abort ();
2057
252b5132
RH
2058 size = bfd_get_reloc_size (reloc_howto);
2059
2060 if (size < 1 || size > 4)
87271fa6 2061 abort ();
252b5132
RH
2062
2063 offset = 4 - size;
2064 fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset,
2065 size, &fixups[i].exp,
2066 reloc_howto->pc_relative,
2067 fixups[i].reloc);
2068 }
2069 else
2070 {
2071 int reloc, pcrel, reloc_size, offset;
2072 fixS *fixP;
2073
2074 reloc = BFD_RELOC_NONE;
2075 /* How big is the reloc? Remember SPLIT relocs are
2076 implicitly 32bits. */
2077 if ((operand->flags & MN10300_OPERAND_SPLIT) != 0)
2078 reloc_size = 32;
85cb2cf9
JL
2079 else if ((operand->flags & MN10300_OPERAND_24BIT) != 0)
2080 reloc_size = 24;
252b5132
RH
2081 else
2082 reloc_size = operand->bits;
2083
2084 /* Is the reloc pc-relative? */
2085 pcrel = (operand->flags & MN10300_OPERAND_PCREL) != 0;
2086
a7c92dae 2087 offset = size - (reloc_size + operand->shift) / 8;
eb0dfd58 2088
252b5132
RH
2089 /* Choose a proper BFD relocation type. */
2090 if (pcrel)
2091 {
2092 if (reloc_size == 32)
2093 reloc = BFD_RELOC_32_PCREL;
2094 else if (reloc_size == 16)
2095 reloc = BFD_RELOC_16_PCREL;
2096 else if (reloc_size == 8)
2097 reloc = BFD_RELOC_8_PCREL;
2098 else
2099 abort ();
2100 }
2101 else
2102 {
2103 if (reloc_size == 32)
2104 reloc = BFD_RELOC_32;
2105 else if (reloc_size == 16)
2106 reloc = BFD_RELOC_16;
2107 else if (reloc_size == 8)
2108 reloc = BFD_RELOC_8;
2109 else
2110 abort ();
2111 }
2112
2113 /* Convert the size of the reloc into what fix_new_exp wants. */
2114 reloc_size = reloc_size / 8;
2115 if (reloc_size == 8)
2116 reloc_size = 0;
2117 else if (reloc_size == 16)
2118 reloc_size = 1;
2119 else if (reloc_size == 32)
2120 reloc_size = 2;
2121
2122 fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset,
2123 reloc_size, &fixups[i].exp, pcrel,
2124 ((bfd_reloc_code_real_type) reloc));
2125
2126 if (pcrel)
2127 fixP->fx_offset += offset;
2128 }
2129 }
e8b1cae5 2130
076dc439
AO
2131 dwarf2_emit_insn (size);
2132 }
252b5132
RH
2133}
2134
87271fa6
NC
2135/* If while processing a fixup, a reloc really needs to be created
2136 then it is done here. */
252b5132 2137
252b5132
RH
2138arelent *
2139tc_gen_reloc (seg, fixp)
b4c1ea07 2140 asection *seg ATTRIBUTE_UNUSED;
252b5132
RH
2141 fixS *fixp;
2142{
2143 arelent *reloc;
2144 reloc = (arelent *) xmalloc (sizeof (arelent));
2145
2146 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
2147 if (reloc->howto == (reloc_howto_type *) NULL)
2148 {
2149 as_bad_where (fixp->fx_file, fixp->fx_line,
87271fa6
NC
2150 _("reloc %d not supported by object file format"),
2151 (int) fixp->fx_r_type);
252b5132
RH
2152 return NULL;
2153 }
2154 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2155
2156 if (fixp->fx_addsy && fixp->fx_subsy)
2157 {
7dc8f5ce
AO
2158 reloc->sym_ptr_ptr = NULL;
2159
4e75439a
AO
2160 /* If we got a difference between two symbols, and the
2161 subtracted symbol is in the current section, use a
2162 PC-relative relocation. If both symbols are in the same
2163 section, the difference would have already been simplified
2164 to a constant. */
2165 if (S_GET_SEGMENT (fixp->fx_subsy) == seg)
2166 {
2167 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2168 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2169 reloc->addend = (reloc->address - S_GET_VALUE (fixp->fx_subsy)
2170 + fixp->fx_offset);
2171
2172 switch (fixp->fx_r_type)
2173 {
2174 case BFD_RELOC_8:
2175 reloc->howto = bfd_reloc_type_lookup (stdoutput,
2176 BFD_RELOC_8_PCREL);
2177 return reloc;
5d6255fe 2178
4e75439a
AO
2179 case BFD_RELOC_16:
2180 reloc->howto = bfd_reloc_type_lookup (stdoutput,
2181 BFD_RELOC_16_PCREL);
2182 return reloc;
2183
2184 case BFD_RELOC_24:
2185 reloc->howto = bfd_reloc_type_lookup (stdoutput,
2186 BFD_RELOC_24_PCREL);
2187 return reloc;
2188
2189 case BFD_RELOC_32:
2190 reloc->howto = bfd_reloc_type_lookup (stdoutput,
2191 BFD_RELOC_32_PCREL);
2192 return reloc;
2193
2194 default:
2195 /* Try to compute the absolute value below. */
2196 break;
2197 }
2198 }
87271fa6 2199
252b5132
RH
2200 if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy))
2201 || S_GET_SEGMENT (fixp->fx_addsy) == undefined_section)
2202 {
2203 as_bad_where (fixp->fx_file, fixp->fx_line,
2204 "Difference of symbols in different sections is not supported");
252b5132 2205 }
6e22e505
AO
2206 else
2207 {
2208 char *fixpos = fixp->fx_where + fixp->fx_frag->fr_literal;
2209
2210 reloc->addend = (S_GET_VALUE (fixp->fx_addsy)
2211 - S_GET_VALUE (fixp->fx_subsy) + fixp->fx_offset);
2212
2213 switch (fixp->fx_r_type)
2214 {
2215 case BFD_RELOC_8:
2216 md_number_to_chars (fixpos, reloc->addend, 1);
2217 break;
5d6255fe 2218
6e22e505
AO
2219 case BFD_RELOC_16:
2220 md_number_to_chars (fixpos, reloc->addend, 2);
2221 break;
252b5132 2222
6e22e505
AO
2223 case BFD_RELOC_24:
2224 md_number_to_chars (fixpos, reloc->addend, 3);
2225 break;
2226
2227 case BFD_RELOC_32:
2228 md_number_to_chars (fixpos, reloc->addend, 4);
2229 break;
2230
2231 default:
2232 reloc->sym_ptr_ptr = (asymbol **) &bfd_abs_symbol;
2233 return reloc;
2234 }
2235 }
2236
7dc8f5ce
AO
2237 if (reloc->sym_ptr_ptr)
2238 free (reloc->sym_ptr_ptr);
6e22e505
AO
2239 free (reloc);
2240 return NULL;
252b5132 2241 }
87271fa6 2242 else
252b5132 2243 {
87271fa6 2244 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
310b5aa2 2245 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
2246 reloc->addend = fixp->fx_offset;
2247 }
2248 return reloc;
2249}
2250
2251int
2252md_estimate_size_before_relax (fragp, seg)
2253 fragS *fragp;
2254 asection *seg;
2255{
93c2a809
AM
2256 if (fragp->fr_subtype == 6
2257 && (!S_IS_DEFINED (fragp->fr_symbol)
2258 || seg != S_GET_SEGMENT (fragp->fr_symbol)))
2259 fragp->fr_subtype = 7;
2260 else if (fragp->fr_subtype == 8
2261 && (!S_IS_DEFINED (fragp->fr_symbol)
2262 || seg != S_GET_SEGMENT (fragp->fr_symbol)))
2263 fragp->fr_subtype = 9;
2264 else if (fragp->fr_subtype == 10
2265 && (!S_IS_DEFINED (fragp->fr_symbol)
2266 || seg != S_GET_SEGMENT (fragp->fr_symbol)))
2267 fragp->fr_subtype = 12;
2268
e7b71525
AO
2269 if (fragp->fr_subtype == 13)
2270 return 3;
93c2a809
AM
2271 if (fragp->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0]))
2272 abort ();
2273
2274 return md_relax_table[fragp->fr_subtype].rlx_length;
87271fa6 2275}
252b5132
RH
2276
2277long
2278md_pcrel_from (fixp)
2279 fixS *fixp;
2280{
87271fa6 2281 if (fixp->fx_addsy != (symbolS *) NULL && !S_IS_DEFINED (fixp->fx_addsy))
252b5132
RH
2282 {
2283 /* The symbol is undefined. Let the linker figure it out. */
2284 return 0;
2285 }
2286 return fixp->fx_frag->fr_address + fixp->fx_where;
252b5132
RH
2287}
2288
94f592af
NC
2289void
2290md_apply_fix3 (fixP, valP, seg)
2291 fixS * fixP;
2292 valueT * valP;
252b5132
RH
2293 segT seg;
2294{
94f592af 2295 char * fixpos = fixP->fx_where + fixP->fx_frag->fr_literal;
58a77e41 2296 int size = 0;
94f592af 2297 int value = (int) * valP;
58a77e41 2298
94f592af 2299 assert (fixP->fx_r_type < BFD_RELOC_UNUSED);
58a77e41
EC
2300
2301 /* This should never happen. */
2302 if (seg->flags & SEC_ALLOC)
94f592af 2303 abort ();
58a77e41 2304
c51ce5f0
EC
2305 /* The value we are passed in *valuep includes the symbol values.
2306 Since we are using BFD_ASSEMBLER, if we are doing this relocation
2307 the code in write.c is going to call bfd_install_relocation, which
2308 is also going to use the symbol value. That means that if the
2309 reloc is fully resolved we want to use *valuep since
2310 bfd_install_relocation is not being used.
2311
2312 However, if the reloc is not fully resolved we do not want to use
2313 *valuep, and must use fx_offset instead. However, if the reloc
2314 is PC relative, we do want to use *valuep since it includes the
2315 result of md_pcrel_from. */
94f592af
NC
2316 if (fixP->fx_addsy != (symbolS *) NULL && ! fixP->fx_pcrel)
2317 value = fixP->fx_offset;
c51ce5f0 2318
58a77e41
EC
2319 /* If the fix is relative to a symbol which is not defined, or not
2320 in the same segment as the fix, we cannot resolve it here. */
94f592af
NC
2321 if (fixP->fx_addsy != NULL
2322 && (! S_IS_DEFINED (fixP->fx_addsy)
2323 || (S_GET_SEGMENT (fixP->fx_addsy) != seg)))
58a77e41 2324 {
94f592af
NC
2325 fixP->fx_done = 0;
2326 return;
58a77e41
EC
2327 }
2328
94f592af 2329 switch (fixP->fx_r_type)
58a77e41
EC
2330 {
2331 case BFD_RELOC_8:
96f37af6 2332 case BFD_RELOC_8_PCREL:
58a77e41
EC
2333 size = 1;
2334 break;
2335
2336 case BFD_RELOC_16:
96f37af6 2337 case BFD_RELOC_16_PCREL:
58a77e41
EC
2338 size = 2;
2339 break;
2340
2341 case BFD_RELOC_32:
96f37af6 2342 case BFD_RELOC_32_PCREL:
58a77e41
EC
2343 size = 4;
2344 break;
2345
2346 case BFD_RELOC_VTABLE_INHERIT:
2347 case BFD_RELOC_VTABLE_ENTRY:
94f592af
NC
2348 fixP->fx_done = 0;
2349 return;
58a77e41
EC
2350
2351 case BFD_RELOC_NONE:
2352 default:
94f592af
NC
2353 as_bad_where (fixP->fx_file, fixP->fx_line,
2354 _("Bad relocation fixup type (%d)"), fixP->fx_r_type);
58a77e41
EC
2355 }
2356
c51ce5f0 2357 md_number_to_chars (fixpos, value, size);
58a77e41 2358
b653e7f9 2359 /* If a symbol remains, pass the fixup, as a reloc, onto the linker. */
94f592af
NC
2360 if (fixP->fx_addsy == NULL)
2361 fixP->fx_done = 1;
58a77e41
EC
2362}
2363
58a77e41
EC
2364/* Return zero if the fixup in fixp should be left alone and not
2365 adjusted. */
2366
b34976b6 2367bfd_boolean
58a77e41
EC
2368mn10300_fix_adjustable (fixp)
2369 struct fix *fixp;
2370{
58a77e41
EC
2371 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2372 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2373 return 0;
2374
7e8f4100
AO
2375 /* Do not adjust relocations involving symbols in code sections,
2376 because it breaks linker relaxations. This could be fixed in the
2377 linker, but this fix is simpler, and it pretty much only affects
2378 object size a little bit. */
2379 if (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_CODE)
2380 return 0;
2381
58a77e41 2382 return 1;
252b5132
RH
2383}
2384
2385/* Insert an operand value into an instruction. */
2386
2387static void
2388mn10300_insert_operand (insnp, extensionp, operand, val, file, line, shift)
2389 unsigned long *insnp;
2390 unsigned long *extensionp;
2391 const struct mn10300_operand *operand;
2392 offsetT val;
2393 char *file;
2394 unsigned int line;
2395 unsigned int shift;
2396{
2397 /* No need to check 32bit operands for a bit. Note that
2398 MN10300_OPERAND_SPLIT is an implicit 32bit operand. */
2399 if (operand->bits != 32
2400 && (operand->flags & MN10300_OPERAND_SPLIT) == 0)
2401 {
2402 long min, max;
2403 offsetT test;
2404 int bits;
2405
2406 bits = operand->bits;
85cb2cf9
JL
2407 if (operand->flags & MN10300_OPERAND_24BIT)
2408 bits = 24;
252b5132
RH
2409
2410 if ((operand->flags & MN10300_OPERAND_SIGNED) != 0)
2411 {
2412 max = (1 << (bits - 1)) - 1;
2413 min = - (1 << (bits - 1));
2414 }
2415 else
87271fa6
NC
2416 {
2417 max = (1 << bits) - 1;
2418 min = 0;
2419 }
252b5132
RH
2420
2421 test = val;
2422
252b5132 2423 if (test < (offsetT) min || test > (offsetT) max)
87271fa6
NC
2424 {
2425 const char *err =
2426 _("operand out of range (%s not between %ld and %ld)");
2427 char buf[100];
2428
2429 sprint_value (buf, test);
2430 if (file == (char *) NULL)
2431 as_warn (err, buf, min, max);
2432 else
2433 as_warn_where (file, line, err, buf, min, max);
2434 }
252b5132
RH
2435 }
2436
2437 if ((operand->flags & MN10300_OPERAND_SPLIT) != 0)
2438 {
2439 *insnp |= (val >> (32 - operand->bits)) & ((1 << operand->bits) - 1);
2440 *extensionp |= ((val & ((1 << (32 - operand->bits)) - 1))
2441 << operand->shift);
2442 }
85cb2cf9
JL
2443 else if ((operand->flags & MN10300_OPERAND_24BIT) != 0)
2444 {
2445 *insnp |= (val >> (24 - operand->bits)) & ((1 << operand->bits) - 1);
2446 *extensionp |= ((val & ((1 << (24 - operand->bits)) - 1))
2447 << operand->shift);
2448 }
e7b71525
AO
2449 else if ((operand->flags & (MN10300_OPERAND_FSREG | MN10300_OPERAND_FDREG)))
2450 {
2451 /* See devo/opcodes/m10300-opc.c just before #define FSM0 for an
2452 explanation of these variables. Note that FMT-implied shifts
2453 are not taken into account for FP registers. */
2454 unsigned long mask_low, mask_high;
2455 int shl_low, shr_high, shl_high;
2456
2457 switch (operand->bits)
2458 {
2459 case 5:
2460 /* Handle regular FP registers. */
2461 if (operand->shift >= 0)
2462 {
2463 /* This is an `m' register. */
2464 shl_low = operand->shift;
2465 shl_high = 8 + (8 & shl_low) + (shl_low & 4) / 4;
2466 }
2467 else
2468 {
2469 /* This is an `n' register. */
2470 shl_low = -operand->shift;
2471 shl_high = shl_low / 4;
2472 }
2473
2474 mask_low = 0x0f;
2475 mask_high = 0x10;
2476 shr_high = 4;
2477 break;
2478
2479 case 3:
2480 /* Handle accumulators. */
2481 shl_low = -operand->shift;
2482 shl_high = 0;
2483 mask_low = 0x03;
2484 mask_high = 0x04;
2485 shr_high = 2;
2486 break;
2487
2488 default:
2489 abort ();
2490 }
2491 *insnp |= ((((val & mask_high) >> shr_high) << shl_high)
2492 | ((val & mask_low) << shl_low));
2493 }
252b5132
RH
2494 else if ((operand->flags & MN10300_OPERAND_EXTENDED) == 0)
2495 {
2496 *insnp |= (((long) val & ((1 << operand->bits) - 1))
2497 << (operand->shift + shift));
2498
2499 if ((operand->flags & MN10300_OPERAND_REPEATED) != 0)
2500 *insnp |= (((long) val & ((1 << operand->bits) - 1))
2501 << (operand->shift + shift + operand->bits));
2502 }
2503 else
2504 {
2505 *extensionp |= (((long) val & ((1 << operand->bits) - 1))
2506 << (operand->shift + shift));
2507
2508 if ((operand->flags & MN10300_OPERAND_REPEATED) != 0)
2509 *extensionp |= (((long) val & ((1 << operand->bits) - 1))
2510 << (operand->shift + shift + operand->bits));
2511 }
2512}
2513
2514static unsigned long
2515check_operand (insn, operand, val)
b4c1ea07 2516 unsigned long insn ATTRIBUTE_UNUSED;
252b5132
RH
2517 const struct mn10300_operand *operand;
2518 offsetT val;
2519{
2520 /* No need to check 32bit operands for a bit. Note that
2521 MN10300_OPERAND_SPLIT is an implicit 32bit operand. */
2522 if (operand->bits != 32
2523 && (operand->flags & MN10300_OPERAND_SPLIT) == 0)
2524 {
2525 long min, max;
2526 offsetT test;
2527 int bits;
2528
2529 bits = operand->bits;
85cb2cf9
JL
2530 if (operand->flags & MN10300_OPERAND_24BIT)
2531 bits = 24;
252b5132
RH
2532
2533 if ((operand->flags & MN10300_OPERAND_SIGNED) != 0)
2534 {
2535 max = (1 << (bits - 1)) - 1;
2536 min = - (1 << (bits - 1));
2537 }
2538 else
87271fa6
NC
2539 {
2540 max = (1 << bits) - 1;
2541 min = 0;
2542 }
252b5132
RH
2543
2544 test = val;
2545
252b5132
RH
2546 if (test < (offsetT) min || test > (offsetT) max)
2547 return 0;
2548 else
2549 return 1;
2550 }
2551 return 1;
2552}
2553
2554static void
2555set_arch_mach (mach)
497f322d 2556 int mach;
252b5132
RH
2557{
2558 if (!bfd_set_arch_mach (stdoutput, bfd_arch_mn10300, mach))
2559 as_warn (_("could not set architecture and machine"));
2560
2561 current_machine = mach;
2562}
This page took 0.364347 seconds and 4 git commands to generate.