1 /* tc-mn10300.c -- Assembler code for the Matsushita 10300
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
5 This file is part of GAS, the GNU Assembler.
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)
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.
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. */
24 #include "safe-ctype.h"
26 #include "opcode/mn10300.h"
27 #include "dwarf2dbg.h"
29 /* Structure to hold information about predefined registers. */
36 /* Generic assembler global variables which must be defined by all
39 /* Characters which always start a comment. */
40 const char comment_chars
[] = "#";
42 /* Characters which start a comment at the beginning of a line. */
43 const char line_comment_chars
[] = ";#";
45 /* Characters which may be used to separate multiple commands on a
47 const char line_separator_chars
[] = ";";
49 /* Characters which are used to indicate an exponent in a floating
51 const char EXP_CHARS
[] = "eE";
53 /* Characters which mean that a number is a floating point constant,
55 const char FLT_CHARS
[] = "dD";
57 const relax_typeS md_relax_table
[] = {
60 {0x7fff, -0x8000, 5, 2},
61 {0x7fffffff, -0x80000000, 7, 0},
63 /* bCC relaxing (uncommon cases) */
65 {0x7fff, -0x8000, 6, 5},
66 {0x7fffffff, -0x80000000, 8, 0},
69 {0x7fff, -0x8000, 5, 7},
70 {0x7fffffff, -0x80000000, 7, 0},
73 {0x7fff, -0x8000, 4, 9},
74 {0x7fffffff, -0x80000000, 6, 0},
78 {0x7fff, -0x8000, 3, 12},
79 {0x7fffffff, -0x80000000, 5, 0},
83 /* Local functions. */
84 static void mn10300_insert_operand
PARAMS ((unsigned long *, unsigned long *,
85 const struct mn10300_operand
*,
86 offsetT
, char *, unsigned,
88 static unsigned long check_operand
PARAMS ((unsigned long,
89 const struct mn10300_operand
*,
91 static int reg_name_search
PARAMS ((const struct reg_name
*, int, const char *));
92 static boolean data_register_name
PARAMS ((expressionS
*expressionP
));
93 static boolean address_register_name
PARAMS ((expressionS
*expressionP
));
94 static boolean other_register_name
PARAMS ((expressionS
*expressionP
));
95 static void set_arch_mach
PARAMS ((unsigned int));
97 /* Set linkrelax here to avoid fixups in most sections. */
100 static int current_machine
;
103 #define MAX_INSN_FIXUPS (5)
108 bfd_reloc_code_real_type reloc
;
110 struct mn10300_fixup fixups
[MAX_INSN_FIXUPS
];
113 /* We must store the value of each register operand so that we can
114 verify that certain registers do not match. */
115 int mn10300_reg_operands
[MN10300_MAX_OPERANDS
];
117 const char *md_shortopts
= "";
118 struct option md_longopts
[] = {
119 {NULL
, no_argument
, NULL
, 0}
121 size_t md_longopts_size
= sizeof (md_longopts
);
123 /* The target specific pseudo-ops which we support. */
124 const pseudo_typeS md_pseudo_table
[] =
126 { "file", dwarf2_directive_file
, 0 },
127 { "loc", dwarf2_directive_loc
, 0 },
128 { "am30", set_arch_mach
, AM30
},
129 { "am33", set_arch_mach
, AM33
},
130 { "mn10300", set_arch_mach
, MN103
},
134 #define HAVE_AM33 (current_machine == AM33)
135 #define HAVE_AM30 (current_machine == AM30)
137 /* Opcode hash table. */
138 static struct hash_control
*mn10300_hash
;
140 /* This table is sorted. Suitable for searching by a binary search. */
141 static const struct reg_name data_registers
[] =
148 #define DATA_REG_NAME_CNT \
149 (sizeof (data_registers) / sizeof (struct reg_name))
151 static const struct reg_name address_registers
[] =
159 #define ADDRESS_REG_NAME_CNT \
160 (sizeof (address_registers) / sizeof (struct reg_name))
162 static const struct reg_name r_registers
[] =
206 #define R_REG_NAME_CNT \
207 (sizeof (r_registers) / sizeof (struct reg_name))
209 static const struct reg_name xr_registers
[] =
235 #define XR_REG_NAME_CNT \
236 (sizeof (xr_registers) / sizeof (struct reg_name))
238 static const struct reg_name other_registers
[] =
245 #define OTHER_REG_NAME_CNT \
246 (sizeof (other_registers) / sizeof (struct reg_name))
248 /* reg_name_search does a binary search of the given register table
249 to see if "name" is a valid regiter name. Returns the register
250 number from the array on success, or -1 on failure. */
253 reg_name_search (regs
, regcount
, name
)
254 const struct reg_name
*regs
;
258 int middle
, low
, high
;
266 middle
= (low
+ high
) / 2;
267 cmp
= strcasecmp (name
, regs
[middle
].name
);
273 return regs
[middle
].value
;
279 /* Summary of register_name().
281 * in: Input_line_pointer points to 1st char of operand.
283 * out: An expressionS.
284 * The operand may have been a register: in this case, X_op == O_register,
285 * X_add_number is set to the register number, and truth is returned.
286 * Input_line_pointer->(next non-blank) char after operand, or is in
287 * its original state.
291 r_register_name (expressionP
)
292 expressionS
*expressionP
;
299 /* Find the spelling of the operand. */
300 start
= name
= input_line_pointer
;
302 c
= get_symbol_end ();
303 reg_number
= reg_name_search (r_registers
, R_REG_NAME_CNT
, name
);
305 /* Put back the delimiting char. */
306 *input_line_pointer
= c
;
308 /* Look to see if it's in the register table. */
311 expressionP
->X_op
= O_register
;
312 expressionP
->X_add_number
= reg_number
;
314 /* Make the rest nice. */
315 expressionP
->X_add_symbol
= NULL
;
316 expressionP
->X_op_symbol
= NULL
;
321 /* Reset the line as if we had not done anything. */
322 input_line_pointer
= start
;
326 /* Summary of register_name().
328 * in: Input_line_pointer points to 1st char of operand.
330 * out: An expressionS.
331 * The operand may have been a register: in this case, X_op == O_register,
332 * X_add_number is set to the register number, and truth is returned.
333 * Input_line_pointer->(next non-blank) char after operand, or is in
334 * its original state.
338 xr_register_name (expressionP
)
339 expressionS
*expressionP
;
346 /* Find the spelling of the operand. */
347 start
= name
= input_line_pointer
;
349 c
= get_symbol_end ();
350 reg_number
= reg_name_search (xr_registers
, XR_REG_NAME_CNT
, name
);
352 /* Put back the delimiting char. */
353 *input_line_pointer
= c
;
355 /* Look to see if it's in the register table. */
358 expressionP
->X_op
= O_register
;
359 expressionP
->X_add_number
= reg_number
;
361 /* Make the rest nice. */
362 expressionP
->X_add_symbol
= NULL
;
363 expressionP
->X_op_symbol
= NULL
;
368 /* Reset the line as if we had not done anything. */
369 input_line_pointer
= start
;
373 /* Summary of register_name().
375 * in: Input_line_pointer points to 1st char of operand.
377 * out: An expressionS.
378 * The operand may have been a register: in this case, X_op == O_register,
379 * X_add_number is set to the register number, and truth is returned.
380 * Input_line_pointer->(next non-blank) char after operand, or is in
381 * its original state.
385 data_register_name (expressionP
)
386 expressionS
*expressionP
;
393 /* Find the spelling of the operand. */
394 start
= name
= input_line_pointer
;
396 c
= get_symbol_end ();
397 reg_number
= reg_name_search (data_registers
, DATA_REG_NAME_CNT
, name
);
399 /* Put back the delimiting char. */
400 *input_line_pointer
= c
;
402 /* Look to see if it's in the register table. */
405 expressionP
->X_op
= O_register
;
406 expressionP
->X_add_number
= reg_number
;
408 /* Make the rest nice. */
409 expressionP
->X_add_symbol
= NULL
;
410 expressionP
->X_op_symbol
= NULL
;
415 /* Reset the line as if we had not done anything. */
416 input_line_pointer
= start
;
420 /* Summary of register_name().
422 * in: Input_line_pointer points to 1st char of operand.
424 * out: An expressionS.
425 * The operand may have been a register: in this case, X_op == O_register,
426 * X_add_number is set to the register number, and truth is returned.
427 * Input_line_pointer->(next non-blank) char after operand, or is in
428 * its original state.
432 address_register_name (expressionP
)
433 expressionS
*expressionP
;
440 /* Find the spelling of the operand. */
441 start
= name
= input_line_pointer
;
443 c
= get_symbol_end ();
444 reg_number
= reg_name_search (address_registers
, ADDRESS_REG_NAME_CNT
, name
);
446 /* Put back the delimiting char. */
447 *input_line_pointer
= c
;
449 /* Look to see if it's in the register table. */
452 expressionP
->X_op
= O_register
;
453 expressionP
->X_add_number
= reg_number
;
455 /* Make the rest nice. */
456 expressionP
->X_add_symbol
= NULL
;
457 expressionP
->X_op_symbol
= NULL
;
462 /* Reset the line as if we had not done anything. */
463 input_line_pointer
= start
;
467 /* Summary of register_name().
469 * in: Input_line_pointer points to 1st char of operand.
471 * out: An expressionS.
472 * The operand may have been a register: in this case, X_op == O_register,
473 * X_add_number is set to the register number, and truth is returned.
474 * Input_line_pointer->(next non-blank) char after operand, or is in
475 * its original state.
479 other_register_name (expressionP
)
480 expressionS
*expressionP
;
487 /* Find the spelling of the operand. */
488 start
= name
= input_line_pointer
;
490 c
= get_symbol_end ();
491 reg_number
= reg_name_search (other_registers
, OTHER_REG_NAME_CNT
, name
);
493 /* Put back the delimiting char. */
494 *input_line_pointer
= c
;
496 /* Look to see if it's in the register table. */
499 expressionP
->X_op
= O_register
;
500 expressionP
->X_add_number
= reg_number
;
502 /* Make the rest nice. */
503 expressionP
->X_add_symbol
= NULL
;
504 expressionP
->X_op_symbol
= NULL
;
509 /* Reset the line as if we had not done anything. */
510 input_line_pointer
= start
;
515 md_show_usage (stream
)
518 fprintf (stream
, _("MN10300 options:\n\
523 md_parse_option (c
, arg
)
524 int c ATTRIBUTE_UNUSED
;
525 char *arg ATTRIBUTE_UNUSED
;
531 md_undefined_symbol (name
)
532 char *name ATTRIBUTE_UNUSED
;
538 md_atof (type
, litp
, sizep
)
544 LITTLENUM_TYPE words
[4];
560 return "bad call to md_atof";
563 t
= atof_ieee (input_line_pointer
, type
, words
);
565 input_line_pointer
= t
;
569 for (i
= prec
- 1; i
>= 0; i
--)
571 md_number_to_chars (litp
, (valueT
) words
[i
], 2);
579 md_convert_frag (abfd
, sec
, fragP
)
580 bfd
*abfd ATTRIBUTE_UNUSED
;
584 static unsigned long label_count
= 0;
587 subseg_change (sec
, 0);
588 if (fragP
->fr_subtype
== 0)
590 fix_new (fragP
, fragP
->fr_fix
+ 1, 1, fragP
->fr_symbol
,
591 fragP
->fr_offset
+ 1, 1, BFD_RELOC_8_PCREL
);
595 else if (fragP
->fr_subtype
== 1)
597 /* Reverse the condition of the first branch. */
598 int offset
= fragP
->fr_fix
;
599 int opcode
= fragP
->fr_literal
[offset
] & 0xff;
636 fragP
->fr_literal
[offset
] = opcode
;
638 /* Create a fixup for the reversed conditional branch. */
639 sprintf (buf
, ".%s_%ld", FAKE_LABEL_NAME
, label_count
++);
640 fix_new (fragP
, fragP
->fr_fix
+ 1, 1,
641 symbol_new (buf
, sec
, 0, fragP
->fr_next
),
642 fragP
->fr_offset
+ 1, 1, BFD_RELOC_8_PCREL
);
644 /* Now create the unconditional branch + fixup to the
646 fragP
->fr_literal
[offset
+ 2] = 0xcc;
647 fix_new (fragP
, fragP
->fr_fix
+ 3, 2, fragP
->fr_symbol
,
648 fragP
->fr_offset
+ 1, 1, BFD_RELOC_16_PCREL
);
652 else if (fragP
->fr_subtype
== 2)
654 /* Reverse the condition of the first branch. */
655 int offset
= fragP
->fr_fix
;
656 int opcode
= fragP
->fr_literal
[offset
] & 0xff;
693 fragP
->fr_literal
[offset
] = opcode
;
695 /* Create a fixup for the reversed conditional branch. */
696 sprintf (buf
, ".%s_%ld", FAKE_LABEL_NAME
, label_count
++);
697 fix_new (fragP
, fragP
->fr_fix
+ 1, 1,
698 symbol_new (buf
, sec
, 0, fragP
->fr_next
),
699 fragP
->fr_offset
+ 1, 1, BFD_RELOC_8_PCREL
);
701 /* Now create the unconditional branch + fixup to the
703 fragP
->fr_literal
[offset
+ 2] = 0xdc;
704 fix_new (fragP
, fragP
->fr_fix
+ 3, 4, fragP
->fr_symbol
,
705 fragP
->fr_offset
+ 1, 1, BFD_RELOC_32_PCREL
);
709 else if (fragP
->fr_subtype
== 3)
711 fix_new (fragP
, fragP
->fr_fix
+ 2, 1, fragP
->fr_symbol
,
712 fragP
->fr_offset
+ 2, 1, BFD_RELOC_8_PCREL
);
716 else if (fragP
->fr_subtype
== 4)
718 /* Reverse the condition of the first branch. */
719 int offset
= fragP
->fr_fix
;
720 int opcode
= fragP
->fr_literal
[offset
+ 1] & 0xff;
739 fragP
->fr_literal
[offset
+ 1] = opcode
;
741 /* Create a fixup for the reversed conditional branch. */
742 sprintf (buf
, ".%s_%ld", FAKE_LABEL_NAME
, label_count
++);
743 fix_new (fragP
, fragP
->fr_fix
+ 2, 1,
744 symbol_new (buf
, sec
, 0, fragP
->fr_next
),
745 fragP
->fr_offset
+ 2, 1, BFD_RELOC_8_PCREL
);
747 /* Now create the unconditional branch + fixup to the
749 fragP
->fr_literal
[offset
+ 3] = 0xcc;
750 fix_new (fragP
, fragP
->fr_fix
+ 4, 2, fragP
->fr_symbol
,
751 fragP
->fr_offset
+ 1, 1, BFD_RELOC_16_PCREL
);
755 else if (fragP
->fr_subtype
== 5)
757 /* Reverse the condition of the first branch. */
758 int offset
= fragP
->fr_fix
;
759 int opcode
= fragP
->fr_literal
[offset
+ 1] & 0xff;
775 fragP
->fr_literal
[offset
+ 1] = opcode
;
777 /* Create a fixup for the reversed conditional branch. */
778 sprintf (buf
, ".%s_%ld", FAKE_LABEL_NAME
, label_count
++);
779 fix_new (fragP
, fragP
->fr_fix
+ 2, 1,
780 symbol_new (buf
, sec
, 0, fragP
->fr_next
),
781 fragP
->fr_offset
+ 2, 1, BFD_RELOC_8_PCREL
);
783 /* Now create the unconditional branch + fixup to the
785 fragP
->fr_literal
[offset
+ 3] = 0xdc;
786 fix_new (fragP
, fragP
->fr_fix
+ 4, 4, fragP
->fr_symbol
,
787 fragP
->fr_offset
+ 1, 1, BFD_RELOC_32_PCREL
);
791 else if (fragP
->fr_subtype
== 6)
793 int offset
= fragP
->fr_fix
;
794 fragP
->fr_literal
[offset
] = 0xcd;
795 fix_new (fragP
, fragP
->fr_fix
+ 1, 2, fragP
->fr_symbol
,
796 fragP
->fr_offset
+ 1, 1, BFD_RELOC_16_PCREL
);
800 else if (fragP
->fr_subtype
== 7)
802 int offset
= fragP
->fr_fix
;
803 fragP
->fr_literal
[offset
] = 0xdd;
804 fragP
->fr_literal
[offset
+ 5] = fragP
->fr_literal
[offset
+ 3];
805 fragP
->fr_literal
[offset
+ 6] = fragP
->fr_literal
[offset
+ 4];
807 fix_new (fragP
, fragP
->fr_fix
+ 1, 4, fragP
->fr_symbol
,
808 fragP
->fr_offset
+ 1, 1, BFD_RELOC_32_PCREL
);
812 else if (fragP
->fr_subtype
== 8)
814 int offset
= fragP
->fr_fix
;
815 fragP
->fr_literal
[offset
] = 0xfa;
816 fragP
->fr_literal
[offset
+ 1] = 0xff;
817 fix_new (fragP
, fragP
->fr_fix
+ 2, 2, fragP
->fr_symbol
,
818 fragP
->fr_offset
+ 2, 1, BFD_RELOC_16_PCREL
);
822 else if (fragP
->fr_subtype
== 9)
824 int offset
= fragP
->fr_fix
;
825 fragP
->fr_literal
[offset
] = 0xfc;
826 fragP
->fr_literal
[offset
+ 1] = 0xff;
828 fix_new (fragP
, fragP
->fr_fix
+ 2, 4, fragP
->fr_symbol
,
829 fragP
->fr_offset
+ 2, 1, BFD_RELOC_32_PCREL
);
833 else if (fragP
->fr_subtype
== 10)
835 fragP
->fr_literal
[fragP
->fr_fix
] = 0xca;
836 fix_new (fragP
, fragP
->fr_fix
+ 1, 1, fragP
->fr_symbol
,
837 fragP
->fr_offset
+ 1, 1, BFD_RELOC_8_PCREL
);
841 else if (fragP
->fr_subtype
== 11)
843 int offset
= fragP
->fr_fix
;
844 fragP
->fr_literal
[offset
] = 0xcc;
846 fix_new (fragP
, fragP
->fr_fix
+ 1, 4, fragP
->fr_symbol
,
847 fragP
->fr_offset
+ 1, 1, BFD_RELOC_16_PCREL
);
851 else if (fragP
->fr_subtype
== 12)
853 int offset
= fragP
->fr_fix
;
854 fragP
->fr_literal
[offset
] = 0xdc;
856 fix_new (fragP
, fragP
->fr_fix
+ 1, 4, fragP
->fr_symbol
,
857 fragP
->fr_offset
+ 1, 1, BFD_RELOC_32_PCREL
);
866 md_section_align (seg
, addr
)
870 int align
= bfd_get_section_alignment (stdoutput
, seg
);
871 return ((addr
+ (1 << align
) - 1) & (-1 << align
));
877 char *prev_name
= "";
878 register const struct mn10300_opcode
*op
;
880 mn10300_hash
= hash_new ();
882 /* Insert unique names into hash table. The MN10300 instruction set
883 has many identical opcode names that have different opcodes based
884 on the operands. This hash table then provides a quick index to
885 the first opcode with a particular name in the opcode table. */
887 op
= mn10300_opcodes
;
890 if (strcmp (prev_name
, op
->name
))
892 prev_name
= (char *) op
->name
;
893 hash_insert (mn10300_hash
, op
->name
, (char *) op
);
898 /* Set the default machine type. */
899 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_mn10300
, MN103
))
900 as_warn (_("could not set architecture and machine"));
902 current_machine
= MN103
;
910 struct mn10300_opcode
*opcode
;
911 struct mn10300_opcode
*next_opcode
;
912 const unsigned char *opindex_ptr
;
913 int next_opindex
, relaxable
;
914 unsigned long insn
, extension
, size
= 0;
919 /* Get the opcode. */
920 for (s
= str
; *s
!= '\0' && !ISSPACE (*s
); s
++)
925 /* Find the first opcode with the proper name. */
926 opcode
= (struct mn10300_opcode
*) hash_find (mn10300_hash
, str
);
929 as_bad (_("Unrecognized opcode: `%s'"), str
);
934 while (ISSPACE (*str
))
937 input_line_pointer
= str
;
946 errmsg
= _("Invalid opcode/operands");
948 /* Reset the array of register operands. */
949 memset (mn10300_reg_operands
, -1, sizeof (mn10300_reg_operands
));
955 insn
= opcode
->opcode
;
958 /* If the instruction is not available on the current machine
959 then it can not possibly match. */
961 && !(opcode
->machine
== AM33
&& HAVE_AM33
)
962 && !(opcode
->machine
== AM30
&& HAVE_AM30
))
965 for (op_idx
= 1, opindex_ptr
= opcode
->operands
;
967 opindex_ptr
++, op_idx
++)
969 const struct mn10300_operand
*operand
;
972 if (next_opindex
== 0)
974 operand
= &mn10300_operands
[*opindex_ptr
];
978 operand
= &mn10300_operands
[next_opindex
];
982 while (*str
== ' ' || *str
== ',')
985 if (operand
->flags
& MN10300_OPERAND_RELAX
)
988 /* Gather the operand. */
989 hold
= input_line_pointer
;
990 input_line_pointer
= str
;
992 if (operand
->flags
& MN10300_OPERAND_PAREN
)
994 if (*input_line_pointer
!= ')' && *input_line_pointer
!= '(')
996 input_line_pointer
= hold
;
1000 input_line_pointer
++;
1003 /* See if we can match the operands. */
1004 else if (operand
->flags
& MN10300_OPERAND_DREG
)
1006 if (!data_register_name (&ex
))
1008 input_line_pointer
= hold
;
1013 else if (operand
->flags
& MN10300_OPERAND_AREG
)
1015 if (!address_register_name (&ex
))
1017 input_line_pointer
= hold
;
1022 else if (operand
->flags
& MN10300_OPERAND_SP
)
1024 char *start
= input_line_pointer
;
1025 char c
= get_symbol_end ();
1027 if (strcasecmp (start
, "sp") != 0)
1029 *input_line_pointer
= c
;
1030 input_line_pointer
= hold
;
1034 *input_line_pointer
= c
;
1037 else if (operand
->flags
& MN10300_OPERAND_RREG
)
1039 if (!r_register_name (&ex
))
1041 input_line_pointer
= hold
;
1046 else if (operand
->flags
& MN10300_OPERAND_XRREG
)
1048 if (!xr_register_name (&ex
))
1050 input_line_pointer
= hold
;
1055 else if (operand
->flags
& MN10300_OPERAND_USP
)
1057 char *start
= input_line_pointer
;
1058 char c
= get_symbol_end ();
1060 if (strcasecmp (start
, "usp") != 0)
1062 *input_line_pointer
= c
;
1063 input_line_pointer
= hold
;
1067 *input_line_pointer
= c
;
1070 else if (operand
->flags
& MN10300_OPERAND_SSP
)
1072 char *start
= input_line_pointer
;
1073 char c
= get_symbol_end ();
1075 if (strcasecmp (start
, "ssp") != 0)
1077 *input_line_pointer
= c
;
1078 input_line_pointer
= hold
;
1082 *input_line_pointer
= c
;
1085 else if (operand
->flags
& MN10300_OPERAND_MSP
)
1087 char *start
= input_line_pointer
;
1088 char c
= get_symbol_end ();
1090 if (strcasecmp (start
, "msp") != 0)
1092 *input_line_pointer
= c
;
1093 input_line_pointer
= hold
;
1097 *input_line_pointer
= c
;
1100 else if (operand
->flags
& MN10300_OPERAND_PC
)
1102 char *start
= input_line_pointer
;
1103 char c
= get_symbol_end ();
1105 if (strcasecmp (start
, "pc") != 0)
1107 *input_line_pointer
= c
;
1108 input_line_pointer
= hold
;
1112 *input_line_pointer
= c
;
1115 else if (operand
->flags
& MN10300_OPERAND_EPSW
)
1117 char *start
= input_line_pointer
;
1118 char c
= get_symbol_end ();
1120 if (strcasecmp (start
, "epsw") != 0)
1122 *input_line_pointer
= c
;
1123 input_line_pointer
= hold
;
1127 *input_line_pointer
= c
;
1130 else if (operand
->flags
& MN10300_OPERAND_PLUS
)
1132 if (*input_line_pointer
!= '+')
1134 input_line_pointer
= hold
;
1138 input_line_pointer
++;
1141 else if (operand
->flags
& MN10300_OPERAND_PSW
)
1143 char *start
= input_line_pointer
;
1144 char c
= get_symbol_end ();
1146 if (strcasecmp (start
, "psw") != 0)
1148 *input_line_pointer
= c
;
1149 input_line_pointer
= hold
;
1153 *input_line_pointer
= c
;
1156 else if (operand
->flags
& MN10300_OPERAND_MDR
)
1158 char *start
= input_line_pointer
;
1159 char c
= get_symbol_end ();
1161 if (strcasecmp (start
, "mdr") != 0)
1163 *input_line_pointer
= c
;
1164 input_line_pointer
= hold
;
1168 *input_line_pointer
= c
;
1171 else if (operand
->flags
& MN10300_OPERAND_REG_LIST
)
1173 unsigned int value
= 0;
1174 if (*input_line_pointer
!= '[')
1176 input_line_pointer
= hold
;
1182 input_line_pointer
++;
1184 /* We used to reject a null register list here; however,
1185 we accept it now so the compiler can emit "call"
1186 instructions for all calls to named functions.
1188 The linker can then fill in the appropriate bits for the
1189 register list and stack size or change the instruction
1190 into a "calls" if using "call" is not profitable. */
1191 while (*input_line_pointer
!= ']')
1196 if (*input_line_pointer
== ',')
1197 input_line_pointer
++;
1199 start
= input_line_pointer
;
1200 c
= get_symbol_end ();
1202 if (strcasecmp (start
, "d2") == 0)
1205 *input_line_pointer
= c
;
1207 else if (strcasecmp (start
, "d3") == 0)
1210 *input_line_pointer
= c
;
1212 else if (strcasecmp (start
, "a2") == 0)
1215 *input_line_pointer
= c
;
1217 else if (strcasecmp (start
, "a3") == 0)
1220 *input_line_pointer
= c
;
1222 else if (strcasecmp (start
, "other") == 0)
1225 *input_line_pointer
= c
;
1228 && strcasecmp (start
, "exreg0") == 0)
1231 *input_line_pointer
= c
;
1234 && strcasecmp (start
, "exreg1") == 0)
1237 *input_line_pointer
= c
;
1240 && strcasecmp (start
, "exother") == 0)
1243 *input_line_pointer
= c
;
1246 && strcasecmp (start
, "all") == 0)
1249 *input_line_pointer
= c
;
1253 input_line_pointer
= hold
;
1258 input_line_pointer
++;
1259 mn10300_insert_operand (&insn
, &extension
, operand
,
1260 value
, (char *) NULL
, 0, 0);
1264 else if (data_register_name (&ex
))
1266 input_line_pointer
= hold
;
1270 else if (address_register_name (&ex
))
1272 input_line_pointer
= hold
;
1276 else if (other_register_name (&ex
))
1278 input_line_pointer
= hold
;
1282 else if (HAVE_AM33
&& r_register_name (&ex
))
1284 input_line_pointer
= hold
;
1288 else if (HAVE_AM33
&& xr_register_name (&ex
))
1290 input_line_pointer
= hold
;
1294 else if (*str
== ')' || *str
== '(')
1296 input_line_pointer
= hold
;
1308 errmsg
= _("illegal operand");
1311 errmsg
= _("missing operand");
1317 mask
= MN10300_OPERAND_DREG
| MN10300_OPERAND_AREG
;
1319 mask
|= MN10300_OPERAND_RREG
| MN10300_OPERAND_XRREG
;
1320 if ((operand
->flags
& mask
) == 0)
1322 input_line_pointer
= hold
;
1327 if (opcode
->format
== FMT_D1
|| opcode
->format
== FMT_S1
)
1329 else if (opcode
->format
== FMT_D2
1330 || opcode
->format
== FMT_D4
1331 || opcode
->format
== FMT_S2
1332 || opcode
->format
== FMT_S4
1333 || opcode
->format
== FMT_S6
1334 || opcode
->format
== FMT_D5
)
1336 else if (opcode
->format
== FMT_D7
)
1338 else if (opcode
->format
== FMT_D8
|| opcode
->format
== FMT_D9
)
1343 mn10300_insert_operand (&insn
, &extension
, operand
,
1344 ex
.X_add_number
, (char *) NULL
,
1347 /* And note the register number in the register array. */
1348 mn10300_reg_operands
[op_idx
- 1] = ex
.X_add_number
;
1353 /* If this operand can be promoted, and it doesn't
1354 fit into the allocated bitfield for this insn,
1355 then promote it (ie this opcode does not match). */
1357 & (MN10300_OPERAND_PROMOTE
| MN10300_OPERAND_RELAX
)
1358 && !check_operand (insn
, operand
, ex
.X_add_number
))
1360 input_line_pointer
= hold
;
1365 mn10300_insert_operand (&insn
, &extension
, operand
,
1366 ex
.X_add_number
, (char *) NULL
,
1371 /* If this operand can be promoted, then this opcode didn't
1372 match since we can't know if it needed promotion! */
1373 if (operand
->flags
& MN10300_OPERAND_PROMOTE
)
1375 input_line_pointer
= hold
;
1380 /* We need to generate a fixup for this expression. */
1381 if (fc
>= MAX_INSN_FIXUPS
)
1382 as_fatal (_("too many fixups"));
1383 fixups
[fc
].exp
= ex
;
1384 fixups
[fc
].opindex
= *opindex_ptr
;
1385 fixups
[fc
].reloc
= BFD_RELOC_UNUSED
;
1391 str
= input_line_pointer
;
1392 input_line_pointer
= hold
;
1394 while (*str
== ' ' || *str
== ',')
1399 /* Make sure we used all the operands! */
1403 /* If this instruction has registers that must not match, verify
1404 that they do indeed not match. */
1405 if (opcode
->no_match_operands
)
1409 /* Look at each operand to see if it's marked. */
1410 for (i
= 0; i
< MN10300_MAX_OPERANDS
; i
++)
1412 if ((1 << i
) & opcode
->no_match_operands
)
1416 /* operand I is marked. Check that it does not match any
1417 operands > I which are marked. */
1418 for (j
= i
+ 1; j
< MN10300_MAX_OPERANDS
; j
++)
1420 if (((1 << j
) & opcode
->no_match_operands
)
1421 && mn10300_reg_operands
[i
] == mn10300_reg_operands
[j
])
1423 errmsg
= _("Invalid register specification.");
1435 next_opcode
= opcode
+ 1;
1436 if (!strcmp (next_opcode
->name
, opcode
->name
))
1438 opcode
= next_opcode
;
1442 as_bad ("%s", errmsg
);
1448 while (ISSPACE (*str
))
1452 as_bad (_("junk at end of line: `%s'"), str
);
1454 input_line_pointer
= str
;
1456 /* Determine the size of the instruction. */
1457 if (opcode
->format
== FMT_S0
)
1460 if (opcode
->format
== FMT_S1
|| opcode
->format
== FMT_D0
)
1463 if (opcode
->format
== FMT_S2
|| opcode
->format
== FMT_D1
)
1466 if (opcode
->format
== FMT_D6
)
1469 if (opcode
->format
== FMT_D7
|| opcode
->format
== FMT_D10
)
1472 if (opcode
->format
== FMT_D8
)
1475 if (opcode
->format
== FMT_D9
)
1478 if (opcode
->format
== FMT_S4
)
1481 if (opcode
->format
== FMT_S6
|| opcode
->format
== FMT_D5
)
1484 if (opcode
->format
== FMT_D2
)
1487 if (opcode
->format
== FMT_D4
)
1490 if (relaxable
&& fc
> 0)
1494 /* We want to anchor the line info to the previous frag (if
1495 there isn't one, create it), so that, when the insn is
1496 resized, we still get the right address for the beginning of
1499 dwarf2_emit_insn (0);
1504 /* Handle bra specially. Basically treat it like jmp so
1505 that we automatically handle 8, 16 and 32 bit offsets
1506 correctly as well as jumps to an undefined address.
1508 It is also important to not treat it like other bCC
1509 instructions since the long forms of bra is different
1510 from other bCC instructions. */
1511 if (opcode
->opcode
== 0xca00)
1523 else if (size
== 3 && opcode
->opcode
== 0xcc0000)
1525 /* bCC (uncommon cases) */
1529 f
= frag_var (rs_machine_dependent
, 8, 8 - size
, type
,
1530 fixups
[0].exp
.X_add_symbol
,
1531 fixups
[0].exp
.X_add_number
,
1532 (char *)fixups
[0].opindex
);
1534 /* This is pretty hokey. We basically just care about the
1535 opcode, so we have to write out the first word big endian.
1537 The exception is "call", which has two operands that we
1540 The first operand (the register list) happens to be in the
1541 first instruction word, and will be in the right place if
1542 we output the first word in big endian mode.
1544 The second operand (stack size) is in the extension word,
1545 and we want it to appear as the first character in the extension
1546 word (as it appears in memory). Luckily, writing the extension
1547 word in big endian format will do what we want. */
1548 number_to_chars_bigendian (f
, insn
, size
> 4 ? 4 : size
);
1551 number_to_chars_bigendian (f
+ 4, extension
, 4);
1552 number_to_chars_bigendian (f
+ 8, 0, size
- 8);
1555 number_to_chars_bigendian (f
+ 4, extension
, size
- 4);
1559 /* Allocate space for the instruction. */
1560 f
= frag_more (size
);
1562 /* Fill in bytes for the instruction. Note that opcode fields
1563 are written big-endian, 16 & 32bit immediates are written
1564 little endian. Egad. */
1565 if (opcode
->format
== FMT_S0
1566 || opcode
->format
== FMT_S1
1567 || opcode
->format
== FMT_D0
1568 || opcode
->format
== FMT_D6
1569 || opcode
->format
== FMT_D7
1570 || opcode
->format
== FMT_D10
1571 || opcode
->format
== FMT_D1
)
1573 number_to_chars_bigendian (f
, insn
, size
);
1575 else if (opcode
->format
== FMT_S2
1576 && opcode
->opcode
!= 0xdf0000
1577 && opcode
->opcode
!= 0xde0000)
1579 /* A format S2 instruction that is _not_ "ret" and "retf". */
1580 number_to_chars_bigendian (f
, (insn
>> 16) & 0xff, 1);
1581 number_to_chars_littleendian (f
+ 1, insn
& 0xffff, 2);
1583 else if (opcode
->format
== FMT_S2
)
1585 /* This must be a ret or retf, which is written entirely in
1586 big-endian format. */
1587 number_to_chars_bigendian (f
, insn
, 3);
1589 else if (opcode
->format
== FMT_S4
1590 && opcode
->opcode
!= 0xdc000000)
1592 /* This must be a format S4 "call" instruction. What a pain. */
1593 unsigned long temp
= (insn
>> 8) & 0xffff;
1594 number_to_chars_bigendian (f
, (insn
>> 24) & 0xff, 1);
1595 number_to_chars_littleendian (f
+ 1, temp
, 2);
1596 number_to_chars_bigendian (f
+ 3, insn
& 0xff, 1);
1597 number_to_chars_bigendian (f
+ 4, extension
& 0xff, 1);
1599 else if (opcode
->format
== FMT_S4
)
1601 /* This must be a format S4 "jmp" instruction. */
1602 unsigned long temp
= ((insn
& 0xffffff) << 8) | (extension
& 0xff);
1603 number_to_chars_bigendian (f
, (insn
>> 24) & 0xff, 1);
1604 number_to_chars_littleendian (f
+ 1, temp
, 4);
1606 else if (opcode
->format
== FMT_S6
)
1608 unsigned long temp
= ((insn
& 0xffffff) << 8)
1609 | ((extension
>> 16) & 0xff);
1610 number_to_chars_bigendian (f
, (insn
>> 24) & 0xff, 1);
1611 number_to_chars_littleendian (f
+ 1, temp
, 4);
1612 number_to_chars_bigendian (f
+ 5, (extension
>> 8) & 0xff, 1);
1613 number_to_chars_bigendian (f
+ 6, extension
& 0xff, 1);
1615 else if (opcode
->format
== FMT_D2
1616 && opcode
->opcode
!= 0xfaf80000
1617 && opcode
->opcode
!= 0xfaf00000
1618 && opcode
->opcode
!= 0xfaf40000)
1620 /* A format D2 instruction where the 16bit immediate is
1621 really a single 16bit value, not two 8bit values. */
1622 number_to_chars_bigendian (f
, (insn
>> 16) & 0xffff, 2);
1623 number_to_chars_littleendian (f
+ 2, insn
& 0xffff, 2);
1625 else if (opcode
->format
== FMT_D2
)
1627 /* A format D2 instruction where the 16bit immediate
1628 is really two 8bit immediates. */
1629 number_to_chars_bigendian (f
, insn
, 4);
1631 else if (opcode
->format
== FMT_D4
)
1633 unsigned long temp
= ((insn
& 0xffff) << 16) | (extension
& 0xffff);
1635 number_to_chars_bigendian (f
, (insn
>> 16) & 0xffff, 2);
1636 number_to_chars_littleendian (f
+ 2, temp
, 4);
1638 else if (opcode
->format
== FMT_D5
)
1640 unsigned long temp
= (((insn
& 0xffff) << 16)
1641 | ((extension
>> 8) & 0xffff));
1643 number_to_chars_bigendian (f
, (insn
>> 16) & 0xffff, 2);
1644 number_to_chars_littleendian (f
+ 2, temp
, 4);
1645 number_to_chars_bigendian (f
+ 6, extension
& 0xff, 1);
1647 else if (opcode
->format
== FMT_D8
)
1649 unsigned long temp
= ((insn
& 0xff) << 16) | (extension
& 0xffff);
1651 number_to_chars_bigendian (f
, (insn
>> 8) & 0xffffff, 3);
1652 number_to_chars_bigendian (f
+ 3, (temp
& 0xff), 1);
1653 number_to_chars_littleendian (f
+ 4, temp
>> 8, 2);
1655 else if (opcode
->format
== FMT_D9
)
1657 unsigned long temp
= ((insn
& 0xff) << 24) | (extension
& 0xffffff);
1659 number_to_chars_bigendian (f
, (insn
>> 8) & 0xffffff, 3);
1660 number_to_chars_littleendian (f
+ 3, temp
, 4);
1663 /* Create any fixups. */
1664 for (i
= 0; i
< fc
; i
++)
1666 const struct mn10300_operand
*operand
;
1668 operand
= &mn10300_operands
[fixups
[i
].opindex
];
1669 if (fixups
[i
].reloc
!= BFD_RELOC_UNUSED
)
1671 reloc_howto_type
*reloc_howto
;
1676 reloc_howto
= bfd_reloc_type_lookup (stdoutput
,
1682 size
= bfd_get_reloc_size (reloc_howto
);
1684 if (size
< 1 || size
> 4)
1688 fixP
= fix_new_exp (frag_now
, f
- frag_now
->fr_literal
+ offset
,
1689 size
, &fixups
[i
].exp
,
1690 reloc_howto
->pc_relative
,
1695 int reloc
, pcrel
, reloc_size
, offset
;
1698 reloc
= BFD_RELOC_NONE
;
1699 /* How big is the reloc? Remember SPLIT relocs are
1700 implicitly 32bits. */
1701 if ((operand
->flags
& MN10300_OPERAND_SPLIT
) != 0)
1703 else if ((operand
->flags
& MN10300_OPERAND_24BIT
) != 0)
1706 reloc_size
= operand
->bits
;
1708 /* Is the reloc pc-relative? */
1709 pcrel
= (operand
->flags
& MN10300_OPERAND_PCREL
) != 0;
1711 offset
= size
- (reloc_size
+ operand
->shift
) / 8;
1713 /* Choose a proper BFD relocation type. */
1716 if (reloc_size
== 32)
1717 reloc
= BFD_RELOC_32_PCREL
;
1718 else if (reloc_size
== 16)
1719 reloc
= BFD_RELOC_16_PCREL
;
1720 else if (reloc_size
== 8)
1721 reloc
= BFD_RELOC_8_PCREL
;
1727 if (reloc_size
== 32)
1728 reloc
= BFD_RELOC_32
;
1729 else if (reloc_size
== 16)
1730 reloc
= BFD_RELOC_16
;
1731 else if (reloc_size
== 8)
1732 reloc
= BFD_RELOC_8
;
1737 /* Convert the size of the reloc into what fix_new_exp wants. */
1738 reloc_size
= reloc_size
/ 8;
1739 if (reloc_size
== 8)
1741 else if (reloc_size
== 16)
1743 else if (reloc_size
== 32)
1746 fixP
= fix_new_exp (frag_now
, f
- frag_now
->fr_literal
+ offset
,
1747 reloc_size
, &fixups
[i
].exp
, pcrel
,
1748 ((bfd_reloc_code_real_type
) reloc
));
1751 fixP
->fx_offset
+= offset
;
1755 dwarf2_emit_insn (size
);
1759 /* If while processing a fixup, a reloc really needs to be created
1760 then it is done here. */
1763 tc_gen_reloc (seg
, fixp
)
1764 asection
*seg ATTRIBUTE_UNUSED
;
1768 reloc
= (arelent
*) xmalloc (sizeof (arelent
));
1770 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixp
->fx_r_type
);
1771 if (reloc
->howto
== (reloc_howto_type
*) NULL
)
1773 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
1774 _("reloc %d not supported by object file format"),
1775 (int) fixp
->fx_r_type
);
1778 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1780 if (fixp
->fx_addsy
&& fixp
->fx_subsy
)
1782 reloc
->sym_ptr_ptr
= NULL
;
1784 /* If we got a difference between two symbols, and the
1785 subtracted symbol is in the current section, use a
1786 PC-relative relocation. If both symbols are in the same
1787 section, the difference would have already been simplified
1789 if (S_GET_SEGMENT (fixp
->fx_subsy
) == seg
)
1791 reloc
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
1792 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1793 reloc
->addend
= (reloc
->address
- S_GET_VALUE (fixp
->fx_subsy
)
1796 switch (fixp
->fx_r_type
)
1799 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
,
1804 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
,
1805 BFD_RELOC_16_PCREL
);
1809 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
,
1810 BFD_RELOC_24_PCREL
);
1814 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
,
1815 BFD_RELOC_32_PCREL
);
1819 /* Try to compute the absolute value below. */
1824 if ((S_GET_SEGMENT (fixp
->fx_addsy
) != S_GET_SEGMENT (fixp
->fx_subsy
))
1825 || S_GET_SEGMENT (fixp
->fx_addsy
) == undefined_section
)
1827 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
1828 "Difference of symbols in different sections is not supported");
1832 char *fixpos
= fixp
->fx_where
+ fixp
->fx_frag
->fr_literal
;
1834 reloc
->addend
= (S_GET_VALUE (fixp
->fx_addsy
)
1835 - S_GET_VALUE (fixp
->fx_subsy
) + fixp
->fx_offset
);
1837 switch (fixp
->fx_r_type
)
1840 md_number_to_chars (fixpos
, reloc
->addend
, 1);
1844 md_number_to_chars (fixpos
, reloc
->addend
, 2);
1848 md_number_to_chars (fixpos
, reloc
->addend
, 3);
1852 md_number_to_chars (fixpos
, reloc
->addend
, 4);
1856 reloc
->sym_ptr_ptr
= (asymbol
**) &bfd_abs_symbol
;
1861 if (reloc
->sym_ptr_ptr
)
1862 free (reloc
->sym_ptr_ptr
);
1868 reloc
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
1869 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1870 reloc
->addend
= fixp
->fx_offset
;
1876 md_estimate_size_before_relax (fragp
, seg
)
1880 if (fragp
->fr_subtype
== 6
1881 && (!S_IS_DEFINED (fragp
->fr_symbol
)
1882 || seg
!= S_GET_SEGMENT (fragp
->fr_symbol
)))
1883 fragp
->fr_subtype
= 7;
1884 else if (fragp
->fr_subtype
== 8
1885 && (!S_IS_DEFINED (fragp
->fr_symbol
)
1886 || seg
!= S_GET_SEGMENT (fragp
->fr_symbol
)))
1887 fragp
->fr_subtype
= 9;
1888 else if (fragp
->fr_subtype
== 10
1889 && (!S_IS_DEFINED (fragp
->fr_symbol
)
1890 || seg
!= S_GET_SEGMENT (fragp
->fr_symbol
)))
1891 fragp
->fr_subtype
= 12;
1893 if (fragp
->fr_subtype
>= sizeof (md_relax_table
) / sizeof (md_relax_table
[0]))
1896 return md_relax_table
[fragp
->fr_subtype
].rlx_length
;
1900 md_pcrel_from (fixp
)
1903 if (fixp
->fx_addsy
!= (symbolS
*) NULL
&& !S_IS_DEFINED (fixp
->fx_addsy
))
1905 /* The symbol is undefined. Let the linker figure it out. */
1908 return fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1912 md_apply_fix3 (fixP
, valP
, seg
)
1917 char * fixpos
= fixP
->fx_where
+ fixP
->fx_frag
->fr_literal
;
1919 int value
= (int) * valP
;
1921 assert (fixP
->fx_r_type
< BFD_RELOC_UNUSED
);
1923 /* This should never happen. */
1924 if (seg
->flags
& SEC_ALLOC
)
1927 /* The value we are passed in *valuep includes the symbol values.
1928 Since we are using BFD_ASSEMBLER, if we are doing this relocation
1929 the code in write.c is going to call bfd_install_relocation, which
1930 is also going to use the symbol value. That means that if the
1931 reloc is fully resolved we want to use *valuep since
1932 bfd_install_relocation is not being used.
1934 However, if the reloc is not fully resolved we do not want to use
1935 *valuep, and must use fx_offset instead. However, if the reloc
1936 is PC relative, we do want to use *valuep since it includes the
1937 result of md_pcrel_from. */
1938 if (fixP
->fx_addsy
!= (symbolS
*) NULL
&& ! fixP
->fx_pcrel
)
1939 value
= fixP
->fx_offset
;
1941 /* If the fix is relative to a symbol which is not defined, or not
1942 in the same segment as the fix, we cannot resolve it here. */
1943 if (fixP
->fx_addsy
!= NULL
1944 && (! S_IS_DEFINED (fixP
->fx_addsy
)
1945 || (S_GET_SEGMENT (fixP
->fx_addsy
) != seg
)))
1951 switch (fixP
->fx_r_type
)
1954 case BFD_RELOC_8_PCREL
:
1959 case BFD_RELOC_16_PCREL
:
1964 case BFD_RELOC_32_PCREL
:
1968 case BFD_RELOC_VTABLE_INHERIT
:
1969 case BFD_RELOC_VTABLE_ENTRY
:
1973 case BFD_RELOC_NONE
:
1975 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1976 _("Bad relocation fixup type (%d)"), fixP
->fx_r_type
);
1979 md_number_to_chars (fixpos
, value
, size
);
1981 /* If a symbol remains, pass the fixup, as a reloc, onto the linker. */
1982 if (fixP
->fx_addsy
== NULL
)
1986 /* Return nonzero if the fixup in FIXP will require a relocation,
1987 even it if appears that the fixup could be completely handled
1991 mn10300_force_relocation (fixp
)
1994 if (fixp
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
1995 || fixp
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
1998 /* Do not adjust relocations involving symbols in code sections,
1999 because it breaks linker relaxations. This could be fixed in the
2000 linker, but this fix is simpler, and it pretty much only affects
2001 object size a little bit. */
2002 if ((S_GET_SEGMENT (fixp
->fx_addsy
)->flags
& SEC_CODE
)
2004 && S_GET_SEGMENT (fixp
->fx_addsy
) == S_GET_SEGMENT (fixp
->fx_subsy
))
2010 /* Return zero if the fixup in fixp should be left alone and not
2014 mn10300_fix_adjustable (fixp
)
2017 /* Prevent all adjustments to global symbols. */
2018 if (S_IS_EXTERN (fixp
->fx_addsy
) || S_IS_WEAK (fixp
->fx_addsy
))
2021 if (fixp
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
2022 || fixp
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
2025 /* Do not adjust relocations involving symbols in code sections,
2026 because it breaks linker relaxations. This could be fixed in the
2027 linker, but this fix is simpler, and it pretty much only affects
2028 object size a little bit. */
2029 if (S_GET_SEGMENT (fixp
->fx_addsy
)->flags
& SEC_CODE
)
2035 /* Insert an operand value into an instruction. */
2038 mn10300_insert_operand (insnp
, extensionp
, operand
, val
, file
, line
, shift
)
2039 unsigned long *insnp
;
2040 unsigned long *extensionp
;
2041 const struct mn10300_operand
*operand
;
2047 /* No need to check 32bit operands for a bit. Note that
2048 MN10300_OPERAND_SPLIT is an implicit 32bit operand. */
2049 if (operand
->bits
!= 32
2050 && (operand
->flags
& MN10300_OPERAND_SPLIT
) == 0)
2056 bits
= operand
->bits
;
2057 if (operand
->flags
& MN10300_OPERAND_24BIT
)
2060 if ((operand
->flags
& MN10300_OPERAND_SIGNED
) != 0)
2062 max
= (1 << (bits
- 1)) - 1;
2063 min
= - (1 << (bits
- 1));
2067 max
= (1 << bits
) - 1;
2073 if (test
< (offsetT
) min
|| test
> (offsetT
) max
)
2076 _("operand out of range (%s not between %ld and %ld)");
2079 sprint_value (buf
, test
);
2080 if (file
== (char *) NULL
)
2081 as_warn (err
, buf
, min
, max
);
2083 as_warn_where (file
, line
, err
, buf
, min
, max
);
2087 if ((operand
->flags
& MN10300_OPERAND_SPLIT
) != 0)
2089 *insnp
|= (val
>> (32 - operand
->bits
)) & ((1 << operand
->bits
) - 1);
2090 *extensionp
|= ((val
& ((1 << (32 - operand
->bits
)) - 1))
2093 else if ((operand
->flags
& MN10300_OPERAND_24BIT
) != 0)
2095 *insnp
|= (val
>> (24 - operand
->bits
)) & ((1 << operand
->bits
) - 1);
2096 *extensionp
|= ((val
& ((1 << (24 - operand
->bits
)) - 1))
2099 else if ((operand
->flags
& MN10300_OPERAND_EXTENDED
) == 0)
2101 *insnp
|= (((long) val
& ((1 << operand
->bits
) - 1))
2102 << (operand
->shift
+ shift
));
2104 if ((operand
->flags
& MN10300_OPERAND_REPEATED
) != 0)
2105 *insnp
|= (((long) val
& ((1 << operand
->bits
) - 1))
2106 << (operand
->shift
+ shift
+ operand
->bits
));
2110 *extensionp
|= (((long) val
& ((1 << operand
->bits
) - 1))
2111 << (operand
->shift
+ shift
));
2113 if ((operand
->flags
& MN10300_OPERAND_REPEATED
) != 0)
2114 *extensionp
|= (((long) val
& ((1 << operand
->bits
) - 1))
2115 << (operand
->shift
+ shift
+ operand
->bits
));
2119 static unsigned long
2120 check_operand (insn
, operand
, val
)
2121 unsigned long insn ATTRIBUTE_UNUSED
;
2122 const struct mn10300_operand
*operand
;
2125 /* No need to check 32bit operands for a bit. Note that
2126 MN10300_OPERAND_SPLIT is an implicit 32bit operand. */
2127 if (operand
->bits
!= 32
2128 && (operand
->flags
& MN10300_OPERAND_SPLIT
) == 0)
2134 bits
= operand
->bits
;
2135 if (operand
->flags
& MN10300_OPERAND_24BIT
)
2138 if ((operand
->flags
& MN10300_OPERAND_SIGNED
) != 0)
2140 max
= (1 << (bits
- 1)) - 1;
2141 min
= - (1 << (bits
- 1));
2145 max
= (1 << bits
) - 1;
2151 if (test
< (offsetT
) min
|| test
> (offsetT
) max
)
2160 set_arch_mach (mach
)
2163 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_mn10300
, mach
))
2164 as_warn (_("could not set architecture and machine"));
2166 current_machine
= mach
;