OSDN Git Service

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