Add AVR architectures avr25, avr31, avr35, and avr51 to match GCC.
[deliverable/binutils-gdb.git] / gas / config / tc-avr.c
CommitLineData
adde6300
AM
1/* tc-avr.c -- Assembler code for the ATMEL AVR
2
d669d37f 3 Copyright 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008
2132e3a3 4 Free Software Foundation, Inc.
adde6300
AM
5 Contributed by Denis Chertykov <denisc@overta.ru>
6
7 This file is part of GAS, the GNU Assembler.
8
9 GAS is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
ec2655a6 11 the Free Software Foundation; either version 3, or (at your option)
adde6300
AM
12 any later version.
13
14 GAS is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GAS; see the file COPYING. If not, write to
4b4da160
NC
21 the Free Software Foundation, 51 Franklin Street - Fifth Floor,
22 Boston, MA 02110-1301, USA. */
adde6300 23
adde6300 24#include "as.h"
3882b010 25#include "safe-ctype.h"
adde6300
AM
26#include "subsegs.h"
27
1188e082
DC
28struct avr_opcodes_s
29{
dc191a8f
NC
30 char * name;
31 char * constraints;
32 int insn_size; /* In words. */
33 int isa;
34 unsigned int bin_opcode;
1188e082
DC
35};
36
37#define AVR_INSN(NAME, CONSTR, OPCODE, SIZE, ISA, BIN) \
38{#NAME, CONSTR, SIZE, ISA, BIN},
39
40struct avr_opcodes_s avr_opcodes[] =
41{
42 #include "opcode/avr.h"
43 {NULL, NULL, 0, 0, 0}
44};
45
adde6300
AM
46const char comment_chars[] = ";";
47const char line_comment_chars[] = "#";
48const char line_separator_chars[] = "$";
49
adde6300
AM
50const char *md_shortopts = "m:";
51struct mcu_type_s
52{
53 char *name;
54 int isa;
55 int mach;
56};
57
1f8ae5e6 58/* XXX - devices that don't seem to exist (renamed, replaced with larger
7b21ac3f 59 ones, or planned but never produced), left here for compatibility. */
1f8ae5e6 60
adde6300
AM
61static struct mcu_type_s mcu_types[] =
62{
7b21ac3f
EW
63 {"avr1", AVR_ISA_AVR1, bfd_mach_avr1},
64/* TODO: insruction set for avr2 architecture should be AVR_ISA_AVR2,
65 but set to AVR_ISA_AVR25 for some following version
66 of GCC (from 4.3) for backward compatibility. */
67 {"avr2", AVR_ISA_AVR25, bfd_mach_avr2},
68 {"avr25", AVR_ISA_AVR25, bfd_mach_avr25},
69/* TODO: insruction set for avr3 architecture should be AVR_ISA_AVR3,
70 but set to AVR_ISA_AVR3_ALL for some following version
71 of GCC (from 4.3) for backward compatibility. */
72 {"avr3", AVR_ISA_AVR3_ALL, bfd_mach_avr3},
73 {"avr31", AVR_ISA_AVR31, bfd_mach_avr31},
74 {"avr35", AVR_ISA_AVR35, bfd_mach_avr35},
75 {"avr4", AVR_ISA_AVR4, bfd_mach_avr4},
76/* TODO: insruction set for avr5 architecture should be AVR_ISA_AVR5,
77 but set to AVR_ISA_AVR51 for some following version
78 of GCC (from 4.3) for backward compatibility. */
79 {"avr5", AVR_ISA_AVR51, bfd_mach_avr5},
80 {"avr51", AVR_ISA_AVR51, bfd_mach_avr51},
81 {"avr6", AVR_ISA_AVR6, bfd_mach_avr6},
28c9d252 82 {"at90s1200", AVR_ISA_1200, bfd_mach_avr1},
7b21ac3f
EW
83 {"attiny11", AVR_ISA_AVR1, bfd_mach_avr1},
84 {"attiny12", AVR_ISA_AVR1, bfd_mach_avr1},
85 {"attiny15", AVR_ISA_AVR1, bfd_mach_avr1},
86 {"attiny28", AVR_ISA_AVR1, bfd_mach_avr1},
87 {"at90s2313", AVR_ISA_AVR2, bfd_mach_avr2},
88 {"at90s2323", AVR_ISA_AVR2, bfd_mach_avr2},
89 {"at90s2333", AVR_ISA_AVR2, bfd_mach_avr2}, /* XXX -> 4433 */
90 {"at90s2343", AVR_ISA_AVR2, bfd_mach_avr2},
91 {"attiny22", AVR_ISA_AVR2, bfd_mach_avr2}, /* XXX -> 2343 */
d669d37f 92 {"attiny26", AVR_ISA_2xxe, bfd_mach_avr2},
7b21ac3f
EW
93 {"at90s4414", AVR_ISA_AVR2, bfd_mach_avr2}, /* XXX -> 8515 */
94 {"at90s4433", AVR_ISA_AVR2, bfd_mach_avr2},
95 {"at90s4434", AVR_ISA_AVR2, bfd_mach_avr2}, /* XXX -> 8535 */
96 {"at90s8515", AVR_ISA_AVR2, bfd_mach_avr2},
97 {"at90c8534", AVR_ISA_AVR2, bfd_mach_avr2},
98 {"at90s8535", AVR_ISA_AVR2, bfd_mach_avr2},
99 {"attiny13", AVR_ISA_AVR25, bfd_mach_avr25},
100 {"attiny13a", AVR_ISA_AVR25, bfd_mach_avr25},
101 {"attiny2313", AVR_ISA_AVR25, bfd_mach_avr25},
102 {"attiny24", AVR_ISA_AVR25, bfd_mach_avr25},
103 {"attiny44", AVR_ISA_AVR25, bfd_mach_avr25},
104 {"attiny84", AVR_ISA_AVR25, bfd_mach_avr25},
105 {"attiny25", AVR_ISA_AVR25, bfd_mach_avr25},
106 {"attiny45", AVR_ISA_AVR25, bfd_mach_avr25},
107 {"attiny85", AVR_ISA_AVR25, bfd_mach_avr25},
108 {"attiny261", AVR_ISA_AVR25, bfd_mach_avr25},
109 {"attiny461", AVR_ISA_AVR25, bfd_mach_avr25},
110 {"attiny861", AVR_ISA_AVR25, bfd_mach_avr25},
111 {"attiny43u", AVR_ISA_AVR25, bfd_mach_avr25},
112 {"attiny48", AVR_ISA_AVR25, bfd_mach_avr25},
113 {"attiny88", AVR_ISA_AVR25, bfd_mach_avr25},
114 {"at86rf401", AVR_ISA_RF401, bfd_mach_avr25},
115 {"at43usb355", AVR_ISA_AVR3, bfd_mach_avr3},
116 {"at76c711", AVR_ISA_AVR3, bfd_mach_avr3},
117 {"atmega103", AVR_ISA_AVR31, bfd_mach_avr31},
118 {"at43usb320", AVR_ISA_AVR31, bfd_mach_avr31},
119 {"attiny167", AVR_ISA_AVR35, bfd_mach_avr35},
120 {"at90usb82", AVR_ISA_AVR35, bfd_mach_avr35},
121 {"at90usb162", AVR_ISA_AVR35, bfd_mach_avr35},
28c9d252 122 {"atmega8", AVR_ISA_M8, bfd_mach_avr4},
7b21ac3f
EW
123 {"atmega48", AVR_ISA_AVR4, bfd_mach_avr4},
124 {"atmega48p", AVR_ISA_AVR4, bfd_mach_avr4},
125 {"atmega88", AVR_ISA_AVR4, bfd_mach_avr4},
126 {"atmega88p", AVR_ISA_AVR4, bfd_mach_avr4},
28c9d252
NC
127 {"atmega8515", AVR_ISA_M8, bfd_mach_avr4},
128 {"atmega8535", AVR_ISA_M8, bfd_mach_avr4},
7b21ac3f
EW
129 {"atmega8hva", AVR_ISA_AVR4, bfd_mach_avr4},
130 {"at90pwm1", AVR_ISA_AVR4, bfd_mach_avr4},
131 {"at90pwm2", AVR_ISA_AVR4, bfd_mach_avr4},
132 {"at90pwm2b", AVR_ISA_AVR4, bfd_mach_avr4},
133 {"at90pwm3", AVR_ISA_AVR4, bfd_mach_avr4},
134 {"at90pwm3b", AVR_ISA_AVR4, bfd_mach_avr4},
135 {"atmega16", AVR_ISA_AVR5, bfd_mach_avr5},
28c9d252 136 {"atmega161", AVR_ISA_M161, bfd_mach_avr5},
7b21ac3f 137 {"atmega162", AVR_ISA_AVR5, bfd_mach_avr5},
28c9d252 138 {"atmega163", AVR_ISA_M161, bfd_mach_avr5},
7b21ac3f
EW
139 {"atmega164p", AVR_ISA_AVR5, bfd_mach_avr5},
140 {"atmega165", AVR_ISA_AVR5, bfd_mach_avr5},
141 {"atmega165p", AVR_ISA_AVR5, bfd_mach_avr5},
142 {"atmega168", AVR_ISA_AVR5, bfd_mach_avr5},
143 {"atmega168p", AVR_ISA_AVR5, bfd_mach_avr5},
144 {"atmega169", AVR_ISA_AVR5, bfd_mach_avr5},
145 {"atmega169p", AVR_ISA_AVR5, bfd_mach_avr5},
146 {"atmega32", AVR_ISA_AVR5, bfd_mach_avr5},
147 {"atmega323", AVR_ISA_AVR5, bfd_mach_avr5},
148 {"atmega324p", AVR_ISA_AVR5, bfd_mach_avr5},
149 {"atmega325", AVR_ISA_AVR5, bfd_mach_avr5},
150 {"atmega325p", AVR_ISA_AVR5, bfd_mach_avr5},
151 {"atmega3250", AVR_ISA_AVR5, bfd_mach_avr5},
152 {"atmega3250p",AVR_ISA_AVR5, bfd_mach_avr5},
153 {"atmega328p", AVR_ISA_AVR5, bfd_mach_avr5},
154 {"atmega329", AVR_ISA_AVR5, bfd_mach_avr5},
155 {"atmega329p", AVR_ISA_AVR5, bfd_mach_avr5},
156 {"atmega3290", AVR_ISA_AVR5, bfd_mach_avr5},
157 {"atmega3290p",AVR_ISA_AVR5, bfd_mach_avr5},
158 {"atmega406", AVR_ISA_AVR5, bfd_mach_avr5},
159 {"atmega64", AVR_ISA_AVR5, bfd_mach_avr5},
160 {"atmega640", AVR_ISA_AVR5, bfd_mach_avr5},
161 {"atmega644", AVR_ISA_AVR5, bfd_mach_avr5},
162 {"atmega644p", AVR_ISA_AVR5, bfd_mach_avr5},
163 {"atmega645", AVR_ISA_AVR5, bfd_mach_avr5},
164 {"atmega649", AVR_ISA_AVR5, bfd_mach_avr5},
165 {"atmega6450", AVR_ISA_AVR5, bfd_mach_avr5},
166 {"atmega6490", AVR_ISA_AVR5, bfd_mach_avr5},
167 {"atmega16hva",AVR_ISA_AVR5, bfd_mach_avr5},
168 {"at90can32" , AVR_ISA_AVR5, bfd_mach_avr5},
169 {"at90can64" , AVR_ISA_AVR5, bfd_mach_avr5},
170 {"at90pwm216", AVR_ISA_AVR5, bfd_mach_avr5},
171 {"at90pwm316", AVR_ISA_AVR5, bfd_mach_avr5},
172 {"atmega32c1", AVR_ISA_AVR5, bfd_mach_avr5},
173 {"atmega32m1", AVR_ISA_AVR5, bfd_mach_avr5},
174 {"atmega32u4", AVR_ISA_AVR5, bfd_mach_avr5},
175 {"at90usb646", AVR_ISA_AVR5, bfd_mach_avr5},
176 {"at90usb647", AVR_ISA_AVR5, bfd_mach_avr5},
28c9d252 177 {"at94k", AVR_ISA_94K, bfd_mach_avr5},
7b21ac3f
EW
178 {"atmega128", AVR_ISA_AVR51, bfd_mach_avr51},
179 {"atmega1280", AVR_ISA_AVR51, bfd_mach_avr51},
180 {"atmega1281", AVR_ISA_AVR51, bfd_mach_avr51},
181 {"atmega1284p",AVR_ISA_AVR51, bfd_mach_avr51},
182 {"at90can128", AVR_ISA_AVR51, bfd_mach_avr51},
183 {"at90usb1286",AVR_ISA_AVR51, bfd_mach_avr51},
184 {"at90usb1287",AVR_ISA_AVR51, bfd_mach_avr51},
185 {"atmega2560", AVR_ISA_AVR6, bfd_mach_avr6},
186 {"atmega2561", AVR_ISA_AVR6, bfd_mach_avr6},
adde6300
AM
187 {NULL, 0, 0}
188};
189
adde6300 190/* Current MCU type. */
7b21ac3f 191static struct mcu_type_s default_mcu = {"avr2", AVR_ISA_AVR2, bfd_mach_avr2};
dc191a8f 192static struct mcu_type_s * avr_mcu = & default_mcu;
adde6300 193
00d2865b
NC
194/* AVR target-specific switches. */
195struct avr_opt_s
196{
dc191a8f
NC
197 int all_opcodes; /* -mall-opcodes: accept all known AVR opcodes. */
198 int no_skip_bug; /* -mno-skip-bug: no warnings for skipping 2-word insns. */
199 int no_wrap; /* -mno-wrap: reject rjmp/rcall with 8K wrap-around. */
00d2865b
NC
200};
201
202static struct avr_opt_s avr_opt = { 0, 0, 0 };
203
adde6300
AM
204const char EXP_CHARS[] = "eE";
205const char FLT_CHARS[] = "dD";
dc191a8f
NC
206
207static void avr_set_arch (int);
adde6300
AM
208
209/* The target specific pseudo-ops which we support. */
210const pseudo_typeS md_pseudo_table[] =
211{
212 {"arch", avr_set_arch, 0},
213 { NULL, NULL, 0}
214};
215
216#define LDI_IMMEDIATE(x) (((x) & 0xf) | (((x) << 4) & 0xf00))
adde6300 217
dc191a8f
NC
218#define EXP_MOD_NAME(i) exp_mod[i].name
219#define EXP_MOD_RELOC(i) exp_mod[i].reloc
220#define EXP_MOD_NEG_RELOC(i) exp_mod[i].neg_reloc
221#define HAVE_PM_P(i) exp_mod[i].have_pm
adde6300
AM
222
223struct exp_mod_s
224{
dc191a8f
NC
225 char * name;
226 bfd_reloc_code_real_type reloc;
227 bfd_reloc_code_real_type neg_reloc;
228 int have_pm;
adde6300
AM
229};
230
c6a7ab1f
NC
231static struct exp_mod_s exp_mod[] =
232{
adde6300
AM
233 {"hh8", BFD_RELOC_AVR_HH8_LDI, BFD_RELOC_AVR_HH8_LDI_NEG, 1},
234 {"pm_hh8", BFD_RELOC_AVR_HH8_LDI_PM, BFD_RELOC_AVR_HH8_LDI_PM_NEG, 0},
235 {"hi8", BFD_RELOC_AVR_HI8_LDI, BFD_RELOC_AVR_HI8_LDI_NEG, 1},
236 {"pm_hi8", BFD_RELOC_AVR_HI8_LDI_PM, BFD_RELOC_AVR_HI8_LDI_PM_NEG, 0},
237 {"lo8", BFD_RELOC_AVR_LO8_LDI, BFD_RELOC_AVR_LO8_LDI_NEG, 1},
238 {"pm_lo8", BFD_RELOC_AVR_LO8_LDI_PM, BFD_RELOC_AVR_LO8_LDI_PM_NEG, 0},
df406460
NC
239 {"hlo8", BFD_RELOC_AVR_HH8_LDI, BFD_RELOC_AVR_HH8_LDI_NEG, 0},
240 {"hhi8", BFD_RELOC_AVR_MS8_LDI, BFD_RELOC_AVR_MS8_LDI_NEG, 0},
adde6300
AM
241};
242
8ad7c533
NC
243/* A union used to store indicies into the exp_mod[] array
244 in a hash table which expects void * data types. */
245typedef union
246{
247 void * ptr;
248 int index;
249} mod_index;
250
adde6300
AM
251/* Opcode hash table. */
252static struct hash_control *avr_hash;
253
254/* Reloc modifiers hash control (hh8,hi8,lo8,pm_xx). */
255static struct hash_control *avr_mod_hash;
256
00d2865b 257#define OPTION_MMCU 'm'
dc191a8f
NC
258enum options
259{
260 OPTION_ALL_OPCODES = OPTION_MD_BASE + 1,
261 OPTION_NO_SKIP_BUG,
262 OPTION_NO_WRAP
263};
adde6300 264
c6a7ab1f
NC
265struct option md_longopts[] =
266{
00d2865b
NC
267 { "mmcu", required_argument, NULL, OPTION_MMCU },
268 { "mall-opcodes", no_argument, NULL, OPTION_ALL_OPCODES },
269 { "mno-skip-bug", no_argument, NULL, OPTION_NO_SKIP_BUG },
270 { "mno-wrap", no_argument, NULL, OPTION_NO_WRAP },
271 { NULL, no_argument, NULL, 0 }
adde6300 272};
adde6300 273
c6a7ab1f 274size_t md_longopts_size = sizeof (md_longopts);
00d2865b
NC
275
276/* Display nicely formatted list of known MCU names. */
c6a7ab1f 277
00d2865b 278static void
dc191a8f 279show_mcu_list (FILE *stream)
00d2865b
NC
280{
281 int i, x;
282
283 fprintf (stream, _("Known MCU names:"));
284 x = 1000;
1dab94dd 285
00d2865b
NC
286 for (i = 0; mcu_types[i].name; i++)
287 {
288 int len = strlen (mcu_types[i].name);
1dab94dd 289
00d2865b 290 x += len + 1;
1dab94dd 291
00d2865b 292 if (x < 75)
c6a7ab1f 293 fprintf (stream, " %s", mcu_types[i].name);
00d2865b
NC
294 else
295 {
296 fprintf (stream, "\n %s", mcu_types[i].name);
297 x = len + 2;
298 }
299 }
1dab94dd 300
c6a7ab1f 301 fprintf (stream, "\n");
00d2865b
NC
302}
303
adde6300 304static inline char *
dc191a8f 305skip_space (char *s)
adde6300
AM
306{
307 while (*s == ' ' || *s == '\t')
308 ++s;
309 return s;
310}
311
312/* Extract one word from FROM and copy it to TO. */
c6a7ab1f 313
adde6300
AM
314static char *
315extract_word (char *from, char *to, int limit)
316{
317 char *op_start;
318 char *op_end;
319 int size = 0;
320
321 /* Drop leading whitespace. */
322 from = skip_space (from);
323 *to = 0;
c6a7ab1f 324
adde6300 325 /* Find the op code end. */
c6a7ab1f 326 for (op_start = op_end = from; *op_end != 0 && is_part_of_name (*op_end);)
adde6300
AM
327 {
328 to[size++] = *op_end++;
329 if (size + 1 >= limit)
330 break;
331 }
1dab94dd 332
adde6300
AM
333 to[size] = 0;
334 return op_end;
335}
336
337int
dc191a8f
NC
338md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
339 asection *seg ATTRIBUTE_UNUSED)
adde6300
AM
340{
341 abort ();
342 return 0;
343}
344
345void
dc191a8f 346md_show_usage (FILE *stream)
adde6300 347{
00d2865b
NC
348 fprintf (stream,
349 _("AVR options:\n"
adde6300
AM
350 " -mmcu=[avr-name] select microcontroller variant\n"
351 " [avr-name] can be:\n"
7b21ac3f
EW
352 " avr1 - classic AVR core without data RAM\n"
353 " avr2 - classic AVR core with up to 8K program memory\n"
354 " avr25 - classic AVR core with up to 8K program memory\n"
355 " plus the MOVW instruction\n"
356 " avr3 - classic AVR core with up to 64K program memory\n"
357 " avr31 - classic AVR core with up to 128K program memory\n"
358 " avr35 - classic AVR core with up to 64K program memory\n"
359 " plus the MOVW instruction\n"
360 " avr4 - enhanced AVR core with up to 8K program memory\n"
361 " avr5 - enhanced AVR core with up to 64K program memory\n"
362 " avr51 - enhanced AVR core with up to 128K program memory\n"
363 " avr6 - enhanced AVR core with up to 256K program memory\n"
adde6300 364 " or immediate microcontroller name.\n"));
00d2865b
NC
365 fprintf (stream,
366 _(" -mall-opcodes accept all AVR opcodes, even if not supported by MCU\n"
367 " -mno-skip-bug disable warnings for skipping two-word instructions\n"
368 " (default for avr4, avr5)\n"
369 " -mno-wrap reject rjmp/rcall instructions with 8K wrap-around\n"
370 " (default for avr3, avr5)\n"));
371 show_mcu_list (stream);
adde6300
AM
372}
373
374static void
dc191a8f 375avr_set_arch (int dummy ATTRIBUTE_UNUSED)
adde6300 376{
dc191a8f 377 char str[20];
1dab94dd 378
adde6300 379 input_line_pointer = extract_word (input_line_pointer, str, 20);
00d2865b 380 md_parse_option (OPTION_MMCU, str);
adde6300
AM
381 bfd_set_arch_mach (stdoutput, TARGET_ARCH, avr_mcu->mach);
382}
383
384int
dc191a8f 385md_parse_option (int c, char *arg)
adde6300 386{
00d2865b 387 switch (c)
adde6300 388 {
00d2865b
NC
389 case OPTION_MMCU:
390 {
391 int i;
392 char *s = alloca (strlen (arg) + 1);
adde6300 393
00d2865b
NC
394 {
395 char *t = s;
396 char *arg1 = arg;
397
398 do
3882b010 399 *t = TOLOWER (*arg1++);
00d2865b
NC
400 while (*t++);
401 }
402
403 for (i = 0; mcu_types[i].name; ++i)
404 if (strcmp (mcu_types[i].name, s) == 0)
405 break;
adde6300 406
00d2865b
NC
407 if (!mcu_types[i].name)
408 {
409 show_mcu_list (stderr);
410 as_fatal (_("unknown MCU: %s\n"), arg);
411 }
65aa24b6 412
00d2865b
NC
413 /* It is OK to redefine mcu type within the same avr[1-5] bfd machine
414 type - this for allows passing -mmcu=... via gcc ASM_SPEC as well
415 as .arch ... in the asm output at the same time. */
00d2865b
NC
416 if (avr_mcu == &default_mcu || avr_mcu->mach == mcu_types[i].mach)
417 avr_mcu = &mcu_types[i];
418 else
419 as_fatal (_("redefinition of mcu type `%s' to `%s'"),
420 avr_mcu->name, mcu_types[i].name);
421 return 1;
422 }
423 case OPTION_ALL_OPCODES:
424 avr_opt.all_opcodes = 1;
425 return 1;
426 case OPTION_NO_SKIP_BUG:
427 avr_opt.no_skip_bug = 1;
428 return 1;
429 case OPTION_NO_WRAP:
430 avr_opt.no_wrap = 1;
adde6300
AM
431 return 1;
432 }
1dab94dd 433
adde6300
AM
434 return 0;
435}
436
437symbolS *
dc191a8f 438md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
adde6300 439{
dc191a8f 440 return NULL;
adde6300
AM
441}
442
adde6300 443char *
dc191a8f 444md_atof (int type, char *litP, int *sizeP)
adde6300 445{
499ac353 446 return ieee_md_atof (type, litP, sizeP, FALSE);
adde6300
AM
447}
448
449void
dc191a8f
NC
450md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
451 asection *sec ATTRIBUTE_UNUSED,
452 fragS *fragP ATTRIBUTE_UNUSED)
adde6300
AM
453{
454 abort ();
455}
456
adde6300 457void
dc191a8f 458md_begin (void)
adde6300 459{
df136245 460 unsigned int i;
adde6300 461 struct avr_opcodes_s *opcode;
dc191a8f 462
c6a7ab1f 463 avr_hash = hash_new ();
adde6300
AM
464
465 /* Insert unique names into hash table. This hash table then provides a
466 quick index to the first opcode with a particular name in the opcode
467 table. */
adde6300
AM
468 for (opcode = avr_opcodes; opcode->name; opcode++)
469 hash_insert (avr_hash, opcode->name, (char *) opcode);
470
471 avr_mod_hash = hash_new ();
472
dc191a8f 473 for (i = 0; i < ARRAY_SIZE (exp_mod); ++i)
8ad7c533
NC
474 {
475 mod_index m;
476
477 m.index = i + 10;
478 hash_insert (avr_mod_hash, EXP_MOD_NAME (i), m.ptr);
479 }
c6a7ab1f 480
adde6300
AM
481 bfd_set_arch_mach (stdoutput, TARGET_ARCH, avr_mcu->mach);
482}
483
df136245 484/* Resolve STR as a constant expression and return the result.
c6a7ab1f 485 If result greater than MAX then error. */
df136245
DC
486
487static unsigned int
dc191a8f 488avr_get_constant (char *str, int max)
df136245
DC
489{
490 expressionS ex;
dc191a8f 491
df136245
DC
492 str = skip_space (str);
493 input_line_pointer = str;
dc191a8f 494 expression (& ex);
df136245
DC
495
496 if (ex.X_op != O_constant)
497 as_bad (_("constant value required"));
498
499 if (ex.X_add_number > max || ex.X_add_number < 0)
73f4d86e 500 as_bad (_("number must be positive and less than %d"), max + 1);
1dab94dd 501
df136245
DC
502 return ex.X_add_number;
503}
504
dc191a8f 505/* Parse for ldd/std offset. */
df136245 506
dc191a8f
NC
507static void
508avr_offset_expression (expressionS *exp)
adde6300 509{
dc191a8f
NC
510 char *str = input_line_pointer;
511 char *tmp;
512 char op[8];
adde6300 513
dc191a8f
NC
514 tmp = str;
515 str = extract_word (str, op, sizeof (op));
516
517 input_line_pointer = tmp;
518 expression (exp);
519
520 /* Warn about expressions that fail to use lo8 (). */
521 if (exp->X_op == O_constant)
adde6300 522 {
dc191a8f 523 int x = exp->X_add_number;
28c9d252 524
dc191a8f
NC
525 if (x < -255 || x > 255)
526 as_warn (_("constant out of 8-bit range: %d"), x);
527 }
528}
adde6300 529
dc191a8f 530/* Parse ordinary expression. */
adde6300 531
dc191a8f
NC
532static char *
533parse_exp (char *s, expressionS *op)
534{
535 input_line_pointer = s;
536 expression (op);
537 if (op->X_op == O_absent)
538 as_bad (_("missing operand"));
539 return input_line_pointer;
540}
1dab94dd 541
dc191a8f
NC
542/* Parse special expressions (needed for LDI command):
543 xx8 (address)
544 xx8 (-address)
545 pm_xx8 (address)
546 pm_xx8 (-address)
547 where xx is: hh, hi, lo. */
adde6300 548
dc191a8f
NC
549static bfd_reloc_code_real_type
550avr_ldi_expression (expressionS *exp)
551{
552 char *str = input_line_pointer;
553 char *tmp;
554 char op[8];
555 int mod;
28c9d252
NC
556 int linker_stubs_should_be_generated = 0;
557
dc191a8f 558 tmp = str;
adde6300 559
dc191a8f 560 str = extract_word (str, op, sizeof (op));
adde6300 561
dc191a8f
NC
562 if (op[0])
563 {
8ad7c533 564 mod_index m;
28c9d252 565
8ad7c533
NC
566 m.ptr = hash_find (avr_mod_hash, op);
567 mod = m.index;
1dab94dd 568
dc191a8f
NC
569 if (mod)
570 {
571 int closes = 0;
b170af93 572
dc191a8f
NC
573 mod -= 10;
574 str = skip_space (str);
00d2865b 575
dc191a8f
NC
576 if (*str == '(')
577 {
28c9d252 578 bfd_reloc_code_real_type reloc_to_return;
dc191a8f 579 int neg_p = 0;
00d2865b 580
dc191a8f 581 ++str;
00d2865b 582
dc191a8f 583 if (strncmp ("pm(", str, 3) == 0
28c9d252
NC
584 || strncmp ("gs(",str,3) == 0
585 || strncmp ("-(gs(",str,5) == 0
dc191a8f
NC
586 || strncmp ("-(pm(", str, 5) == 0)
587 {
588 if (HAVE_PM_P (mod))
589 {
590 ++mod;
591 ++closes;
592 }
593 else
594 as_bad (_("illegal expression"));
b170af93 595
28c9d252
NC
596 if (str[0] == 'g' || str[2] == 'g')
597 linker_stubs_should_be_generated = 1;
598
dc191a8f
NC
599 if (*str == '-')
600 {
601 neg_p = 1;
602 ++closes;
603 str += 5;
604 }
605 else
606 str += 3;
607 }
adde6300 608
dc191a8f
NC
609 if (*str == '-' && *(str + 1) == '(')
610 {
611 neg_p ^= 1;
612 ++closes;
613 str += 2;
614 }
750bce0e 615
dc191a8f
NC
616 input_line_pointer = str;
617 expression (exp);
750bce0e 618
dc191a8f
NC
619 do
620 {
621 if (*input_line_pointer != ')')
622 {
623 as_bad (_("`)' required"));
624 break;
625 }
626 input_line_pointer++;
627 }
628 while (closes--);
629
28c9d252
NC
630 reloc_to_return =
631 neg_p ? EXP_MOD_NEG_RELOC (mod) : EXP_MOD_RELOC (mod);
632 if (linker_stubs_should_be_generated)
633 {
634 switch (reloc_to_return)
635 {
636 case BFD_RELOC_AVR_LO8_LDI_PM:
637 reloc_to_return = BFD_RELOC_AVR_LO8_LDI_GS;
638 break;
639 case BFD_RELOC_AVR_HI8_LDI_PM:
640 reloc_to_return = BFD_RELOC_AVR_HI8_LDI_GS;
641 break;
642
643 default:
0a903bab
NC
644 /* PR 5523: Do not generate a warning here,
645 legitimate code can trigger this case. */
646 break;
28c9d252
NC
647 }
648 }
649 return reloc_to_return;
dc191a8f
NC
650 }
651 }
652 }
750bce0e
NC
653
654 input_line_pointer = tmp;
655 expression (exp);
656
657 /* Warn about expressions that fail to use lo8 (). */
658 if (exp->X_op == O_constant)
659 {
660 int x = exp->X_add_number;
dc191a8f 661
750bce0e
NC
662 if (x < -255 || x > 255)
663 as_warn (_("constant out of 8-bit range: %d"), x);
664 }
dc191a8f
NC
665
666 return BFD_RELOC_AVR_LDI;
750bce0e
NC
667}
668
df136245 669/* Parse one instruction operand.
c6a7ab1f
NC
670 Return operand bitmask. Also fixups can be generated. */
671
adde6300 672static unsigned int
dc191a8f
NC
673avr_operand (struct avr_opcodes_s *opcode,
674 int where,
675 char *op,
676 char **line)
adde6300 677{
adde6300 678 expressionS op_expr;
df136245
DC
679 unsigned int op_mask = 0;
680 char *str = skip_space (*line);
adde6300 681
adde6300
AM
682 switch (*op)
683 {
684 /* Any register operand. */
685 case 'w':
686 case 'd':
687 case 'r':
b170af93
DC
688 case 'a':
689 case 'v':
c6a7ab1f
NC
690 if (*str == 'r' || *str == 'R')
691 {
692 char r_name[20];
1dab94dd 693
c6a7ab1f 694 str = extract_word (str, r_name, sizeof (r_name));
65b1d096 695 op_mask = 0xff;
3882b010 696 if (ISDIGIT (r_name[1]))
c6a7ab1f
NC
697 {
698 if (r_name[2] == '\0')
699 op_mask = r_name[1] - '0';
700 else if (r_name[1] != '0'
3882b010 701 && ISDIGIT (r_name[2])
c6a7ab1f
NC
702 && r_name[3] == '\0')
703 op_mask = (r_name[1] - '0') * 10 + r_name[2] - '0';
704 }
705 }
706 else
707 {
708 op_mask = avr_get_constant (str, 31);
709 str = input_line_pointer;
710 }
1dab94dd 711
c6a7ab1f
NC
712 if (op_mask <= 31)
713 {
714 switch (*op)
715 {
716 case 'a':
717 if (op_mask < 16 || op_mask > 23)
718 as_bad (_("register r16-r23 required"));
719 op_mask -= 16;
720 break;
1dab94dd 721
c6a7ab1f
NC
722 case 'd':
723 if (op_mask < 16)
724 as_bad (_("register number above 15 required"));
725 op_mask -= 16;
726 break;
1dab94dd 727
c6a7ab1f
NC
728 case 'v':
729 if (op_mask & 1)
730 as_bad (_("even register number required"));
731 op_mask >>= 1;
732 break;
1dab94dd 733
c6a7ab1f 734 case 'w':
65b1d096 735 if ((op_mask & 1) || op_mask < 24)
c6a7ab1f 736 as_bad (_("register r24, r26, r28 or r30 required"));
65b1d096 737 op_mask = (op_mask - 24) >> 1;
c6a7ab1f
NC
738 break;
739 }
740 break;
741 }
742 as_bad (_("register name or number from 0 to 31 required"));
adde6300
AM
743 break;
744
745 case 'e':
746 {
747 char c;
1dab94dd 748
adde6300
AM
749 if (*str == '-')
750 {
c6a7ab1f 751 str = skip_space (str + 1);
adde6300
AM
752 op_mask = 0x1002;
753 }
3882b010 754 c = TOLOWER (*str);
adde6300
AM
755 if (c == 'x')
756 op_mask |= 0x100c;
757 else if (c == 'y')
758 op_mask |= 0x8;
759 else if (c != 'z')
00d2865b 760 as_bad (_("pointer register (X, Y or Z) required"));
adde6300 761
c6a7ab1f 762 str = skip_space (str + 1);
adde6300
AM
763 if (*str == '+')
764 {
765 ++str;
766 if (op_mask & 2)
00d2865b 767 as_bad (_("cannot both predecrement and postincrement"));
adde6300
AM
768 op_mask |= 0x1001;
769 }
e38c9cc2 770
1188e082 771 /* avr1 can do "ld r,Z" and "st Z,r" but no other pointer
e38c9cc2 772 registers, no predecrement, no postincrement. */
00d2865b
NC
773 if (!avr_opt.all_opcodes && (op_mask & 0x100F)
774 && !(avr_mcu->isa & AVR_ISA_SRAM))
775 as_bad (_("addressing mode not supported"));
adde6300
AM
776 }
777 break;
778
b170af93 779 case 'z':
c6a7ab1f
NC
780 if (*str == '-')
781 as_bad (_("can't predecrement"));
1dab94dd 782
c6a7ab1f
NC
783 if (! (*str == 'z' || *str == 'Z'))
784 as_bad (_("pointer register Z required"));
1dab94dd 785
c6a7ab1f
NC
786 str = skip_space (str + 1);
787
788 if (*str == '+')
789 {
790 ++str;
791 op_mask |= 1;
792 }
d669d37f
NC
793
794 /* attiny26 can do "lpm" and "lpm r,Z" but not "lpm r,Z+". */
795 if (!avr_opt.all_opcodes
796 && (op_mask & 0x0001)
797 && !(avr_mcu->isa & AVR_ISA_MOVW))
798 as_bad (_("postincrement not supported"));
b170af93
DC
799 break;
800
adde6300
AM
801 case 'b':
802 {
3882b010 803 char c = TOLOWER (*str++);
1dab94dd 804
adde6300
AM
805 if (c == 'y')
806 op_mask |= 0x8;
807 else if (c != 'z')
00d2865b 808 as_bad (_("pointer register (Y or Z) required"));
adde6300
AM
809 str = skip_space (str);
810 if (*str++ == '+')
811 {
750bce0e
NC
812 input_line_pointer = str;
813 avr_offset_expression (& op_expr);
adde6300 814 str = input_line_pointer;
750bce0e
NC
815 fix_new_exp (frag_now, where, 3,
816 &op_expr, FALSE, BFD_RELOC_AVR_6);
adde6300
AM
817 }
818 }
819 break;
820
821 case 'h':
c6a7ab1f
NC
822 str = parse_exp (str, &op_expr);
823 fix_new_exp (frag_now, where, opcode->insn_size * 2,
b34976b6 824 &op_expr, FALSE, BFD_RELOC_AVR_CALL);
adde6300
AM
825 break;
826
827 case 'L':
c6a7ab1f
NC
828 str = parse_exp (str, &op_expr);
829 fix_new_exp (frag_now, where, opcode->insn_size * 2,
b34976b6 830 &op_expr, TRUE, BFD_RELOC_AVR_13_PCREL);
adde6300
AM
831 break;
832
833 case 'l':
c6a7ab1f
NC
834 str = parse_exp (str, &op_expr);
835 fix_new_exp (frag_now, where, opcode->insn_size * 2,
b34976b6 836 &op_expr, TRUE, BFD_RELOC_AVR_7_PCREL);
adde6300
AM
837 break;
838
839 case 'i':
c6a7ab1f
NC
840 str = parse_exp (str, &op_expr);
841 fix_new_exp (frag_now, where + 2, opcode->insn_size * 2,
b34976b6 842 &op_expr, FALSE, BFD_RELOC_16);
adde6300
AM
843 break;
844
845 case 'M':
846 {
847 bfd_reloc_code_real_type r_type;
1dab94dd 848
c6a7ab1f
NC
849 input_line_pointer = str;
850 r_type = avr_ldi_expression (&op_expr);
851 str = input_line_pointer;
adde6300 852 fix_new_exp (frag_now, where, 3,
b34976b6 853 &op_expr, FALSE, r_type);
adde6300
AM
854 }
855 break;
856
857 case 'n':
858 {
859 unsigned int x;
1dab94dd 860
adde6300
AM
861 x = ~avr_get_constant (str, 255);
862 str = input_line_pointer;
863 op_mask |= (x & 0xf) | ((x << 4) & 0xf00);
864 }
865 break;
866
867 case 'K':
750bce0e
NC
868 input_line_pointer = str;
869 avr_offset_expression (& op_expr);
870 str = input_line_pointer;
871 fix_new_exp (frag_now, where, 3,
872 & op_expr, FALSE, BFD_RELOC_AVR_6_ADIW);
adde6300
AM
873 break;
874
875 case 'S':
876 case 's':
877 {
878 unsigned int x;
1dab94dd 879
adde6300
AM
880 x = avr_get_constant (str, 7);
881 str = input_line_pointer;
882 if (*op == 'S')
883 x <<= 4;
884 op_mask |= x;
885 }
886 break;
887
888 case 'P':
889 {
890 unsigned int x;
1dab94dd 891
adde6300
AM
892 x = avr_get_constant (str, 63);
893 str = input_line_pointer;
894 op_mask |= (x & 0xf) | ((x & 0x30) << 5);
895 }
896 break;
897
898 case 'p':
899 {
900 unsigned int x;
1dab94dd 901
adde6300
AM
902 x = avr_get_constant (str, 31);
903 str = input_line_pointer;
904 op_mask |= x << 3;
905 }
906 break;
1dab94dd 907
1188e082
DC
908 case '?':
909 break;
1dab94dd 910
adde6300 911 default:
00d2865b 912 as_bad (_("unknown constraint `%c'"), *op);
adde6300 913 }
1dab94dd 914
adde6300
AM
915 *line = str;
916 return op_mask;
917}
918
dc191a8f
NC
919/* Parse instruction operands.
920 Return binary opcode. */
921
922static unsigned int
923avr_operands (struct avr_opcodes_s *opcode, char **line)
924{
925 char *op = opcode->constraints;
926 unsigned int bin = opcode->bin_opcode;
927 char *frag = frag_more (opcode->insn_size * 2);
928 char *str = *line;
929 int where = frag - frag_now->fr_literal;
930 static unsigned int prev = 0; /* Previous opcode. */
931
932 /* Opcode have operands. */
933 if (*op)
934 {
935 unsigned int reg1 = 0;
936 unsigned int reg2 = 0;
937 int reg1_present = 0;
938 int reg2_present = 0;
939
940 /* Parse first operand. */
941 if (REGISTER_P (*op))
942 reg1_present = 1;
943 reg1 = avr_operand (opcode, where, op, &str);
944 ++op;
945
946 /* Parse second operand. */
947 if (*op)
948 {
949 if (*op == ',')
950 ++op;
951
952 if (*op == '=')
953 {
954 reg2 = reg1;
955 reg2_present = 1;
956 }
957 else
958 {
959 if (REGISTER_P (*op))
960 reg2_present = 1;
961
962 str = skip_space (str);
963 if (*str++ != ',')
964 as_bad (_("`,' required"));
965 str = skip_space (str);
966
967 reg2 = avr_operand (opcode, where, op, &str);
968 }
969
970 if (reg1_present && reg2_present)
971 reg2 = (reg2 & 0xf) | ((reg2 << 5) & 0x200);
972 else if (reg2_present)
973 reg2 <<= 4;
974 }
975 if (reg1_present)
976 reg1 <<= 4;
977 bin |= reg1 | reg2;
978 }
979
980 /* Detect undefined combinations (like ld r31,Z+). */
981 if (!avr_opt.all_opcodes && AVR_UNDEF_P (bin))
982 as_warn (_("undefined combination of operands"));
983
984 if (opcode->insn_size == 2)
985 {
986 /* Warn if the previous opcode was cpse/sbic/sbis/sbrc/sbrs
987 (AVR core bug, fixed in the newer devices). */
988 if (!(avr_opt.no_skip_bug ||
989 (avr_mcu->isa & (AVR_ISA_MUL | AVR_ISA_MOVW)))
990 && AVR_SKIP_P (prev))
991 as_warn (_("skipping two-word instruction"));
992
993 bfd_putl32 ((bfd_vma) bin, frag);
994 }
995 else
996 bfd_putl16 ((bfd_vma) bin, frag);
997
998 prev = bin;
999 *line = str;
1000 return bin;
1001}
1002
adde6300
AM
1003/* GAS will call this function for each section at the end of the assembly,
1004 to permit the CPU backend to adjust the alignment of a section. */
c6a7ab1f 1005
adde6300 1006valueT
dc191a8f 1007md_section_align (asection *seg, valueT addr)
adde6300
AM
1008{
1009 int align = bfd_get_section_alignment (stdoutput, seg);
1010 return ((addr + (1 << align) - 1) & (-1 << align));
1011}
1012
1013/* If you define this macro, it should return the offset between the
1014 address of a PC relative fixup and the position from which the PC
1015 relative adjustment should be made. On many processors, the base
1016 of a PC relative instruction is the next instruction, so this
1017 macro would return the length of an instruction. */
c6a7ab1f 1018
adde6300 1019long
dc191a8f 1020md_pcrel_from_section (fixS *fixp, segT sec)
adde6300 1021{
c6a7ab1f 1022 if (fixp->fx_addsy != (symbolS *) NULL
adde6300
AM
1023 && (!S_IS_DEFINED (fixp->fx_addsy)
1024 || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
1025 return 0;
1dab94dd 1026
adde6300
AM
1027 return fixp->fx_frag->fr_address + fixp->fx_where;
1028}
1029
1030/* GAS will call this for each fixup. It should store the correct
c6a7ab1f
NC
1031 value in the object file. */
1032
94f592af 1033void
dc191a8f 1034md_apply_fix (fixS *fixP, valueT * valP, segT seg)
adde6300
AM
1035{
1036 unsigned char *where;
1037 unsigned long insn;
a161fe53 1038 long value = *valP;
adde6300 1039
94f592af
NC
1040 if (fixP->fx_addsy == (symbolS *) NULL)
1041 fixP->fx_done = 1;
1042
87733541
AM
1043 else if (fixP->fx_pcrel)
1044 {
1045 segT s = S_GET_SEGMENT (fixP->fx_addsy);
1046
1047 if (s == seg || s == absolute_section)
1048 {
1049 value += S_GET_VALUE (fixP->fx_addsy);
1050 fixP->fx_done = 1;
1051 }
1052 }
1053
a161fe53
AM
1054 /* We don't actually support subtracting a symbol. */
1055 if (fixP->fx_subsy != (symbolS *) NULL)
1056 as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1dab94dd 1057
94f592af 1058 switch (fixP->fx_r_type)
adde6300
AM
1059 {
1060 default:
94f592af 1061 fixP->fx_no_overflow = 1;
adde6300
AM
1062 break;
1063 case BFD_RELOC_AVR_7_PCREL:
1064 case BFD_RELOC_AVR_13_PCREL:
1065 case BFD_RELOC_32:
1066 case BFD_RELOC_16:
1067 case BFD_RELOC_AVR_CALL:
1068 break;
1069 }
1070
94f592af 1071 if (fixP->fx_done)
adde6300
AM
1072 {
1073 /* Fetch the instruction, insert the fully resolved operand
1074 value, and stuff the instruction back again. */
2132e3a3 1075 where = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
adde6300
AM
1076 insn = bfd_getl16 (where);
1077
94f592af 1078 switch (fixP->fx_r_type)
adde6300
AM
1079 {
1080 case BFD_RELOC_AVR_7_PCREL:
1081 if (value & 1)
94f592af 1082 as_bad_where (fixP->fx_file, fixP->fx_line,
adde6300 1083 _("odd address operand: %ld"), value);
1dab94dd 1084
adde6300
AM
1085 /* Instruction addresses are always right-shifted by 1. */
1086 value >>= 1;
1087 --value; /* Correct PC. */
1dab94dd 1088
adde6300 1089 if (value < -64 || value > 63)
94f592af 1090 as_bad_where (fixP->fx_file, fixP->fx_line,
adde6300
AM
1091 _("operand out of range: %ld"), value);
1092 value = (value << 3) & 0x3f8;
1093 bfd_putl16 ((bfd_vma) (value | insn), where);
1094 break;
1095
1096 case BFD_RELOC_AVR_13_PCREL:
1097 if (value & 1)
94f592af 1098 as_bad_where (fixP->fx_file, fixP->fx_line,
adde6300 1099 _("odd address operand: %ld"), value);
1dab94dd 1100
adde6300
AM
1101 /* Instruction addresses are always right-shifted by 1. */
1102 value >>= 1;
1103 --value; /* Correct PC. */
adde6300
AM
1104
1105 if (value < -2048 || value > 2047)
1106 {
65aa24b6 1107 /* No wrap for devices with >8K of program memory. */
00d2865b 1108 if ((avr_mcu->isa & AVR_ISA_MEGA) || avr_opt.no_wrap)
94f592af 1109 as_bad_where (fixP->fx_file, fixP->fx_line,
adde6300
AM
1110 _("operand out of range: %ld"), value);
1111 }
1112
1113 value &= 0xfff;
1114 bfd_putl16 ((bfd_vma) (value | insn), where);
1115 break;
1116
1117 case BFD_RELOC_32:
1118 bfd_putl16 ((bfd_vma) value, where);
1119 break;
1120
1121 case BFD_RELOC_16:
1122 bfd_putl16 ((bfd_vma) value, where);
1123 break;
1124
1125 case BFD_RELOC_AVR_16_PM:
c6a7ab1f 1126 bfd_putl16 ((bfd_vma) (value >> 1), where);
adde6300
AM
1127 break;
1128
750bce0e
NC
1129 case BFD_RELOC_AVR_LDI:
1130 if (value > 255)
1131 as_bad_where (fixP->fx_file, fixP->fx_line,
1132 _("operand out of range: %ld"), value);
1133 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value), where);
1134 break;
1135
1136 case BFD_RELOC_AVR_6:
1137 if ((value > 63) || (value < 0))
1138 as_bad_where (fixP->fx_file, fixP->fx_line,
1139 _("operand out of range: %ld"), value);
1140 bfd_putl16 ((bfd_vma) insn | ((value & 7) | ((value & (3 << 3)) << 7) | ((value & (1 << 5)) << 8)), where);
1141 break;
1142
1143 case BFD_RELOC_AVR_6_ADIW:
1144 if ((value > 63) || (value < 0))
1145 as_bad_where (fixP->fx_file, fixP->fx_line,
1146 _("operand out of range: %ld"), value);
1147 bfd_putl16 ((bfd_vma) insn | (value & 0xf) | ((value & 0x30) << 2), where);
1148 break;
1149
adde6300
AM
1150 case BFD_RELOC_AVR_LO8_LDI:
1151 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value), where);
1152 break;
1153
adde6300
AM
1154 case BFD_RELOC_AVR_HI8_LDI:
1155 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 8), where);
1156 break;
1157
df406460 1158 case BFD_RELOC_AVR_MS8_LDI:
adde6300
AM
1159 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 24), where);
1160 break;
1161
1162 case BFD_RELOC_AVR_HH8_LDI:
1163 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 16), where);
1164 break;
1165
1166 case BFD_RELOC_AVR_LO8_LDI_NEG:
1167 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value), where);
1168 break;
1169
adde6300
AM
1170 case BFD_RELOC_AVR_HI8_LDI_NEG:
1171 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 8), where);
1172 break;
1173
df406460 1174 case BFD_RELOC_AVR_MS8_LDI_NEG:
adde6300
AM
1175 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 24), where);
1176 break;
1177
1178 case BFD_RELOC_AVR_HH8_LDI_NEG:
1179 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 16), where);
1180 break;
1181
1182 case BFD_RELOC_AVR_LO8_LDI_PM:
1183 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 1), where);
1184 break;
1185
1186 case BFD_RELOC_AVR_HI8_LDI_PM:
1187 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 9), where);
1188 break;
1189
1190 case BFD_RELOC_AVR_HH8_LDI_PM:
1191 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 17), where);
1192 break;
1193
1194 case BFD_RELOC_AVR_LO8_LDI_PM_NEG:
1195 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 1), where);
1196 break;
1197
1198 case BFD_RELOC_AVR_HI8_LDI_PM_NEG:
1199 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 9), where);
1200 break;
1201
1202 case BFD_RELOC_AVR_HH8_LDI_PM_NEG:
1203 bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 17), where);
1204 break;
1205
1206 case BFD_RELOC_AVR_CALL:
1207 {
1208 unsigned long x;
1dab94dd 1209
adde6300
AM
1210 x = bfd_getl16 (where);
1211 if (value & 1)
94f592af 1212 as_bad_where (fixP->fx_file, fixP->fx_line,
adde6300
AM
1213 _("odd address operand: %ld"), value);
1214 value >>= 1;
1215 x |= ((value & 0x10000) | ((value << 3) & 0x1f00000)) >> 16;
1216 bfd_putl16 ((bfd_vma) x, where);
c6a7ab1f 1217 bfd_putl16 ((bfd_vma) (value & 0xffff), where + 2);
adde6300
AM
1218 }
1219 break;
1220
1221 default:
c6a7ab1f 1222 as_fatal (_("line %d: unknown relocation type: 0x%x"),
94f592af 1223 fixP->fx_line, fixP->fx_r_type);
adde6300
AM
1224 break;
1225 }
1226 }
1227 else
1228 {
94f592af 1229 switch (fixP->fx_r_type)
adde6300
AM
1230 {
1231 case -BFD_RELOC_AVR_HI8_LDI_NEG:
1232 case -BFD_RELOC_AVR_HI8_LDI:
1233 case -BFD_RELOC_AVR_LO8_LDI_NEG:
1234 case -BFD_RELOC_AVR_LO8_LDI:
94f592af 1235 as_bad_where (fixP->fx_file, fixP->fx_line,
adde6300 1236 _("only constant expression allowed"));
94f592af 1237 fixP->fx_done = 1;
adde6300
AM
1238 break;
1239 default:
1240 break;
1241 }
adde6300 1242 }
adde6300
AM
1243}
1244
7be1c489
AM
1245/* GAS will call this to generate a reloc, passing the resulting reloc
1246 to `bfd_install_relocation'. This currently works poorly, as
1247 `bfd_install_relocation' often does the wrong thing, and instances of
1248 `tc_gen_reloc' have been written to work around the problems, which
1249 in turns makes it difficult to fix `bfd_install_relocation'. */
adde6300
AM
1250
1251/* If while processing a fixup, a reloc really needs to be created
1252 then it is done here. */
1253
1254arelent *
dc191a8f
NC
1255tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED,
1256 fixS *fixp)
adde6300
AM
1257{
1258 arelent *reloc;
1259
df406460
NC
1260 if (fixp->fx_addsy && fixp->fx_subsy)
1261 {
1262 long value = 0;
1263
1264 if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy))
1265 || S_GET_SEGMENT (fixp->fx_addsy) == undefined_section)
1266 {
1267 as_bad_where (fixp->fx_file, fixp->fx_line,
1268 "Difference of symbols in different sections is not supported");
1269 return NULL;
1270 }
1271
28c9d252 1272 /* We are dealing with two symbols defined in the same section.
df406460
NC
1273 Let us fix-up them here. */
1274 value += S_GET_VALUE (fixp->fx_addsy);
1275 value -= S_GET_VALUE (fixp->fx_subsy);
1276
1277 /* When fx_addsy and fx_subsy both are zero, md_apply_fix
1278 only takes it's second operands for the fixup value. */
1279 fixp->fx_addsy = NULL;
1280 fixp->fx_subsy = NULL;
1281 md_apply_fix (fixp, (valueT *) &value, NULL);
1282
1283 return NULL;
1284 }
1285
dc191a8f 1286 reloc = xmalloc (sizeof (arelent));
adde6300 1287
dc191a8f 1288 reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
adde6300
AM
1289 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1290
1291 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1292 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1293 if (reloc->howto == (reloc_howto_type *) NULL)
1294 {
1295 as_bad_where (fixp->fx_file, fixp->fx_line,
c6a7ab1f
NC
1296 _("reloc %d not supported by object file format"),
1297 (int) fixp->fx_r_type);
adde6300
AM
1298 return NULL;
1299 }
1300
1301 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1302 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1303 reloc->address = fixp->fx_offset;
1304
1305 reloc->addend = fixp->fx_offset;
1306
1307 return reloc;
1308}
1309
adde6300 1310void
dc191a8f 1311md_assemble (char *str)
adde6300 1312{
c6a7ab1f 1313 struct avr_opcodes_s *opcode;
adde6300
AM
1314 char op[11];
1315
c6a7ab1f 1316 str = skip_space (extract_word (str, op, sizeof (op)));
adde6300
AM
1317
1318 if (!op[0])
00d2865b 1319 as_bad (_("can't find opcode "));
adde6300
AM
1320
1321 opcode = (struct avr_opcodes_s *) hash_find (avr_hash, op);
1322
1323 if (opcode == NULL)
1324 {
00d2865b 1325 as_bad (_("unknown opcode `%s'"), op);
adde6300
AM
1326 return;
1327 }
1328
b170af93 1329 /* Special case for opcodes with optional operands (lpm, elpm) -
1188e082 1330 version with operands exists in avr_opcodes[] in the next entry. */
c6a7ab1f 1331
1188e082
DC
1332 if (*str && *opcode->constraints == '?')
1333 ++opcode;
b170af93 1334
00d2865b
NC
1335 if (!avr_opt.all_opcodes && (opcode->isa & avr_mcu->isa) != opcode->isa)
1336 as_bad (_("illegal opcode %s for mcu %s"), opcode->name, avr_mcu->name);
adde6300
AM
1337
1338 /* We used to set input_line_pointer to the result of get_operands,
1339 but that is wrong. Our caller assumes we don't change it. */
1340 {
1341 char *t = input_line_pointer;
dc191a8f 1342
adde6300 1343 avr_operands (opcode, &str);
b170af93 1344 if (*skip_space (str))
00d2865b 1345 as_bad (_("garbage at end of line"));
adde6300
AM
1346 input_line_pointer = t;
1347 }
1348}
1349
adde6300 1350/* Flag to pass `pm' mode between `avr_parse_cons_expression' and
c6a7ab1f 1351 `avr_cons_fix_new'. */
adde6300
AM
1352static int exp_mod_pm = 0;
1353
1354/* Parse special CONS expression: pm (expression)
28c9d252
NC
1355 or alternatively: gs (expression).
1356 These are used for addressing program memory.
c6a7ab1f
NC
1357 Relocation: BFD_RELOC_AVR_16_PM. */
1358
adde6300 1359void
dc191a8f 1360avr_parse_cons_expression (expressionS *exp, int nbytes)
adde6300 1361{
c6a7ab1f 1362 char *tmp;
adde6300
AM
1363
1364 exp_mod_pm = 0;
1365
1366 tmp = input_line_pointer = skip_space (input_line_pointer);
1367
1368 if (nbytes == 2)
1369 {
28c9d252
NC
1370 char *pm_name1 = "pm";
1371 char *pm_name2 = "gs";
1372 int len = strlen (pm_name1);
1373 /* len must be the same for both pm identifiers. */
1dab94dd 1374
28c9d252
NC
1375 if (strncasecmp (input_line_pointer, pm_name1, len) == 0
1376 || strncasecmp (input_line_pointer, pm_name2, len) == 0)
adde6300
AM
1377 {
1378 input_line_pointer = skip_space (input_line_pointer + len);
1dab94dd 1379
adde6300
AM
1380 if (*input_line_pointer == '(')
1381 {
1382 input_line_pointer = skip_space (input_line_pointer + 1);
1383 exp_mod_pm = 1;
1384 expression (exp);
1dab94dd 1385
adde6300
AM
1386 if (*input_line_pointer == ')')
1387 ++input_line_pointer;
1388 else
1389 {
00d2865b 1390 as_bad (_("`)' required"));
adde6300
AM
1391 exp_mod_pm = 0;
1392 }
1dab94dd 1393
adde6300
AM
1394 return;
1395 }
1dab94dd 1396
adde6300
AM
1397 input_line_pointer = tmp;
1398 }
1399 }
1dab94dd 1400
adde6300
AM
1401 expression (exp);
1402}
1403
1404void
dc191a8f
NC
1405avr_cons_fix_new (fragS *frag,
1406 int where,
1407 int nbytes,
1408 expressionS *exp)
adde6300
AM
1409{
1410 if (exp_mod_pm == 0)
1411 {
1412 if (nbytes == 2)
b34976b6 1413 fix_new_exp (frag, where, nbytes, exp, FALSE, BFD_RELOC_16);
adde6300 1414 else if (nbytes == 4)
b34976b6 1415 fix_new_exp (frag, where, nbytes, exp, FALSE, BFD_RELOC_32);
adde6300 1416 else
00d2865b 1417 as_bad (_("illegal %srelocation size: %d"), "", nbytes);
adde6300
AM
1418 }
1419 else
1420 {
1421 if (nbytes == 2)
b34976b6 1422 fix_new_exp (frag, where, nbytes, exp, FALSE, BFD_RELOC_AVR_16_PM);
adde6300 1423 else
00d2865b 1424 as_bad (_("illegal %srelocation size: %d"), "`pm' ", nbytes);
adde6300
AM
1425 exp_mod_pm = 0;
1426 }
1427}
This page took 0.48275 seconds and 4 git commands to generate.