Home | History | Annotate | Download | only in config
      1 /* tc-avr.c -- Assembler code for the ATMEL AVR
      2 
      3    Copyright (C) 1999-2014 Free Software Foundation, Inc.
      4    Contributed by Denis Chertykov <denisc (at) 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 3, 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, 51 Franklin Street - Fifth Floor,
     21    Boston, MA 02110-1301, USA.  */
     22 
     23 #include "as.h"
     24 #include "safe-ctype.h"
     25 #include "subsegs.h"
     26 #include "dwarf2dbg.h"
     27 #include "dw2gencfi.h"
     28 
     29 
     30 struct avr_opcodes_s
     31 {
     32   char *        name;
     33   char *        constraints;
     34   char *        opcode;
     35   int           insn_size;		/* In words.  */
     36   int           isa;
     37   unsigned int  bin_opcode;
     38 };
     39 
     40 #define AVR_INSN(NAME, CONSTR, OPCODE, SIZE, ISA, BIN) \
     41 {#NAME, CONSTR, OPCODE, SIZE, ISA, BIN},
     42 
     43 struct avr_opcodes_s avr_opcodes[] =
     44 {
     45   #include "opcode/avr.h"
     46   {NULL, NULL, NULL, 0, 0, 0}
     47 };
     48 
     49 const char comment_chars[] = ";";
     50 const char line_comment_chars[] = "#";
     51 const char line_separator_chars[] = "$";
     52 
     53 const char *md_shortopts = "m:";
     54 struct mcu_type_s
     55 {
     56   char *name;
     57   int isa;
     58   int mach;
     59 };
     60 
     61 /* XXX - devices that don't seem to exist (renamed, replaced with larger
     62    ones, or planned but never produced), left here for compatibility.  */
     63 
     64 static struct mcu_type_s mcu_types[] =
     65 {
     66   {"avr1",       AVR_ISA_AVR1,    bfd_mach_avr1},
     67 /* TODO: insruction set for avr2 architecture should be AVR_ISA_AVR2,
     68  but set to AVR_ISA_AVR25 for some following version
     69  of GCC (from 4.3) for backward compatibility.  */
     70   {"avr2",       AVR_ISA_AVR25,   bfd_mach_avr2},
     71   {"avr25",      AVR_ISA_AVR25,   bfd_mach_avr25},
     72 /* TODO: insruction set for avr3 architecture should be AVR_ISA_AVR3,
     73  but set to AVR_ISA_AVR3_ALL for some following version
     74  of GCC (from 4.3) for backward compatibility.  */
     75   {"avr3",       AVR_ISA_AVR3_ALL, bfd_mach_avr3},
     76   {"avr31",      AVR_ISA_AVR31,   bfd_mach_avr31},
     77   {"avr35",      AVR_ISA_AVR35,   bfd_mach_avr35},
     78   {"avr4",       AVR_ISA_AVR4,    bfd_mach_avr4},
     79 /* TODO: insruction set for avr5 architecture should be AVR_ISA_AVR5,
     80  but set to AVR_ISA_AVR51 for some following version
     81  of GCC (from 4.3) for backward compatibility.  */
     82   {"avr5",       AVR_ISA_AVR51,   bfd_mach_avr5},
     83   {"avr51",      AVR_ISA_AVR51,   bfd_mach_avr51},
     84   {"avr6",       AVR_ISA_AVR6,    bfd_mach_avr6},
     85   {"avrxmega1",  AVR_ISA_XMEGA,   bfd_mach_avrxmega1},
     86   {"avrxmega2",  AVR_ISA_XMEGA,   bfd_mach_avrxmega2},
     87   {"avrxmega3",  AVR_ISA_XMEGA,   bfd_mach_avrxmega3},
     88   {"avrxmega4",  AVR_ISA_XMEGA,   bfd_mach_avrxmega4},
     89   {"avrxmega5",  AVR_ISA_XMEGA,   bfd_mach_avrxmega5},
     90   {"avrxmega6",  AVR_ISA_XMEGA,   bfd_mach_avrxmega6},
     91   {"avrxmega7",  AVR_ISA_XMEGA,   bfd_mach_avrxmega7},
     92   {"avrtiny",    AVR_ISA_AVRTINY, bfd_mach_avrtiny},
     93   {"at90s1200",  AVR_ISA_1200,    bfd_mach_avr1},
     94   {"attiny11",   AVR_ISA_AVR1,    bfd_mach_avr1},
     95   {"attiny12",   AVR_ISA_AVR1,    bfd_mach_avr1},
     96   {"attiny15",   AVR_ISA_AVR1,    bfd_mach_avr1},
     97   {"attiny28",   AVR_ISA_AVR1,    bfd_mach_avr1},
     98   {"at90s2313",  AVR_ISA_AVR2,    bfd_mach_avr2},
     99   {"at90s2323",  AVR_ISA_AVR2,    bfd_mach_avr2},
    100   {"at90s2333",  AVR_ISA_AVR2,    bfd_mach_avr2}, /* XXX -> 4433 */
    101   {"at90s2343",  AVR_ISA_AVR2,    bfd_mach_avr2},
    102   {"attiny22",   AVR_ISA_AVR2,    bfd_mach_avr2}, /* XXX -> 2343 */
    103   {"attiny26",   AVR_ISA_2xxe,    bfd_mach_avr2},
    104   {"at90s4414",  AVR_ISA_AVR2,    bfd_mach_avr2}, /* XXX -> 8515 */
    105   {"at90s4433",  AVR_ISA_AVR2,    bfd_mach_avr2},
    106   {"at90s4434",  AVR_ISA_AVR2,    bfd_mach_avr2}, /* XXX -> 8535 */
    107   {"at90s8515",  AVR_ISA_AVR2,    bfd_mach_avr2},
    108   {"at90c8534",  AVR_ISA_AVR2,    bfd_mach_avr2},
    109   {"at90s8535",  AVR_ISA_AVR2,    bfd_mach_avr2},
    110   {"ata5272",    AVR_ISA_AVR25,   bfd_mach_avr25},
    111   {"attiny13",   AVR_ISA_AVR25,   bfd_mach_avr25},
    112   {"attiny13a",  AVR_ISA_AVR25,   bfd_mach_avr25},
    113   {"attiny2313", AVR_ISA_AVR25,   bfd_mach_avr25},
    114   {"attiny2313a",AVR_ISA_AVR25,   bfd_mach_avr25},
    115   {"attiny24",   AVR_ISA_AVR25,   bfd_mach_avr25},
    116   {"attiny24a",  AVR_ISA_AVR25,   bfd_mach_avr25},
    117   {"attiny4313", AVR_ISA_AVR25,   bfd_mach_avr25},
    118   {"attiny44",   AVR_ISA_AVR25,   bfd_mach_avr25},
    119   {"attiny44a",  AVR_ISA_AVR25,   bfd_mach_avr25},
    120   {"attiny84",   AVR_ISA_AVR25,   bfd_mach_avr25},
    121   {"attiny84a",  AVR_ISA_AVR25,   bfd_mach_avr25},
    122   {"attiny25",   AVR_ISA_AVR25,   bfd_mach_avr25},
    123   {"attiny45",   AVR_ISA_AVR25,   bfd_mach_avr25},
    124   {"attiny85",   AVR_ISA_AVR25,   bfd_mach_avr25},
    125   {"attiny261",  AVR_ISA_AVR25,   bfd_mach_avr25},
    126   {"attiny261a", AVR_ISA_AVR25,   bfd_mach_avr25},
    127   {"attiny461",  AVR_ISA_AVR25,   bfd_mach_avr25},
    128   {"attiny461a", AVR_ISA_AVR25,   bfd_mach_avr25},
    129   {"attiny861",  AVR_ISA_AVR25,   bfd_mach_avr25},
    130   {"attiny861a", AVR_ISA_AVR25,   bfd_mach_avr25},
    131   {"attiny87",   AVR_ISA_AVR25,   bfd_mach_avr25},
    132   {"attiny43u",  AVR_ISA_AVR25,   bfd_mach_avr25},
    133   {"attiny48",   AVR_ISA_AVR25,   bfd_mach_avr25},
    134   {"attiny88",   AVR_ISA_AVR25,   bfd_mach_avr25},
    135   {"attiny828",  AVR_ISA_AVR25,   bfd_mach_avr25},
    136   {"at86rf401",  AVR_ISA_RF401,   bfd_mach_avr25},
    137   {"at43usb355", AVR_ISA_AVR3,    bfd_mach_avr3},
    138   {"at76c711",   AVR_ISA_AVR3,    bfd_mach_avr3},
    139   {"atmega103",  AVR_ISA_AVR31,   bfd_mach_avr31},
    140   {"at43usb320", AVR_ISA_AVR31,   bfd_mach_avr31},
    141   {"attiny167",  AVR_ISA_AVR35,   bfd_mach_avr35},
    142   {"at90usb82",  AVR_ISA_AVR35,   bfd_mach_avr35},
    143   {"at90usb162", AVR_ISA_AVR35,   bfd_mach_avr35},
    144   {"ata5505",    AVR_ISA_AVR35,   bfd_mach_avr35},
    145   {"atmega8u2",  AVR_ISA_AVR35,   bfd_mach_avr35},
    146   {"atmega16u2", AVR_ISA_AVR35,   bfd_mach_avr35},
    147   {"atmega32u2", AVR_ISA_AVR35,   bfd_mach_avr35},
    148   {"attiny1634", AVR_ISA_AVR35,   bfd_mach_avr35},
    149   {"atmega8",    AVR_ISA_M8,      bfd_mach_avr4},
    150   {"ata6289",    AVR_ISA_AVR4,    bfd_mach_avr4},
    151   {"atmega8a",   AVR_ISA_M8,      bfd_mach_avr4},
    152   {"ata6285",    AVR_ISA_AVR4,    bfd_mach_avr4},
    153   {"ata6286",    AVR_ISA_AVR4,    bfd_mach_avr4},
    154   {"atmega48",   AVR_ISA_AVR4,    bfd_mach_avr4},
    155   {"atmega48a",  AVR_ISA_AVR4,    bfd_mach_avr4},
    156   {"atmega48pa", AVR_ISA_AVR4,    bfd_mach_avr4},
    157   {"atmega48p",  AVR_ISA_AVR4,    bfd_mach_avr4},
    158   {"atmega88",   AVR_ISA_AVR4,    bfd_mach_avr4},
    159   {"atmega88a",  AVR_ISA_AVR4,    bfd_mach_avr4},
    160   {"atmega88p",  AVR_ISA_AVR4,    bfd_mach_avr4},
    161   {"atmega88pa", AVR_ISA_AVR4,    bfd_mach_avr4},
    162   {"atmega8515", AVR_ISA_M8,      bfd_mach_avr4},
    163   {"atmega8535", AVR_ISA_M8,      bfd_mach_avr4},
    164   {"atmega8hva", AVR_ISA_AVR4,    bfd_mach_avr4},
    165   {"at90pwm1",   AVR_ISA_AVR4,    bfd_mach_avr4},
    166   {"at90pwm2",   AVR_ISA_AVR4,    bfd_mach_avr4},
    167   {"at90pwm2b",  AVR_ISA_AVR4,    bfd_mach_avr4},
    168   {"at90pwm3",   AVR_ISA_AVR4,    bfd_mach_avr4},
    169   {"at90pwm3b",  AVR_ISA_AVR4,    bfd_mach_avr4},
    170   {"at90pwm81",  AVR_ISA_AVR4,    bfd_mach_avr4},
    171   {"at90pwm161", AVR_ISA_AVR5,    bfd_mach_avr5},
    172   {"ata5790",    AVR_ISA_AVR5,    bfd_mach_avr5},
    173   {"ata5795",    AVR_ISA_AVR5,    bfd_mach_avr5},
    174   {"atmega16",   AVR_ISA_AVR5,    bfd_mach_avr5},
    175   {"atmega16a",  AVR_ISA_AVR5,    bfd_mach_avr5},
    176   {"atmega161",  AVR_ISA_M161,    bfd_mach_avr5},
    177   {"atmega162",  AVR_ISA_AVR5,    bfd_mach_avr5},
    178   {"atmega163",  AVR_ISA_M161,    bfd_mach_avr5},
    179   {"atmega164a", AVR_ISA_AVR5,    bfd_mach_avr5},
    180   {"atmega164p", AVR_ISA_AVR5,    bfd_mach_avr5},
    181   {"atmega164pa",AVR_ISA_AVR5,    bfd_mach_avr5},
    182   {"atmega165",  AVR_ISA_AVR5,    bfd_mach_avr5},
    183   {"atmega165a", AVR_ISA_AVR5,    bfd_mach_avr5},
    184   {"atmega165p", AVR_ISA_AVR5,    bfd_mach_avr5},
    185   {"atmega165pa",AVR_ISA_AVR5,    bfd_mach_avr5},
    186   {"atmega168",  AVR_ISA_AVR5,    bfd_mach_avr5},
    187   {"atmega168a", AVR_ISA_AVR5,    bfd_mach_avr5},
    188   {"atmega168p", AVR_ISA_AVR5,    bfd_mach_avr5},
    189   {"atmega168pa",AVR_ISA_AVR5,    bfd_mach_avr5},
    190   {"atmega169",  AVR_ISA_AVR5,    bfd_mach_avr5},
    191   {"atmega169a", AVR_ISA_AVR5,    bfd_mach_avr5},
    192   {"atmega169p", AVR_ISA_AVR5,    bfd_mach_avr5},
    193   {"atmega169pa",AVR_ISA_AVR5,    bfd_mach_avr5},
    194   {"atmega32",   AVR_ISA_AVR5,    bfd_mach_avr5},
    195   {"atmega32a",  AVR_ISA_AVR5,    bfd_mach_avr5},
    196   {"atmega323",  AVR_ISA_AVR5,    bfd_mach_avr5},
    197   {"atmega324a", AVR_ISA_AVR5,    bfd_mach_avr5},
    198   {"atmega324p", AVR_ISA_AVR5,    bfd_mach_avr5},
    199   {"atmega324pa",AVR_ISA_AVR5,    bfd_mach_avr5},
    200   {"atmega325",  AVR_ISA_AVR5,    bfd_mach_avr5},
    201   {"atmega325a", AVR_ISA_AVR5,    bfd_mach_avr5},
    202   {"atmega325p", AVR_ISA_AVR5,    bfd_mach_avr5},
    203   {"atmega325pa",AVR_ISA_AVR5,    bfd_mach_avr5},
    204   {"atmega3250", AVR_ISA_AVR5,    bfd_mach_avr5},
    205   {"atmega3250a",AVR_ISA_AVR5,    bfd_mach_avr5},
    206   {"atmega3250p",AVR_ISA_AVR5,    bfd_mach_avr5},
    207   {"atmega3250pa",AVR_ISA_AVR5,   bfd_mach_avr5},
    208   {"atmega328",  AVR_ISA_AVR5,    bfd_mach_avr5},
    209   {"atmega328p", AVR_ISA_AVR5,    bfd_mach_avr5},
    210   {"atmega329",  AVR_ISA_AVR5,    bfd_mach_avr5},
    211   {"atmega329a", AVR_ISA_AVR5,    bfd_mach_avr5},
    212   {"atmega329p", AVR_ISA_AVR5,    bfd_mach_avr5},
    213   {"atmega329pa",AVR_ISA_AVR5,    bfd_mach_avr5},
    214   {"atmega3290", AVR_ISA_AVR5,    bfd_mach_avr5},
    215   {"atmega3290a",AVR_ISA_AVR5,    bfd_mach_avr5},
    216   {"atmega3290p",AVR_ISA_AVR5,    bfd_mach_avr5},
    217   {"atmega3290pa",AVR_ISA_AVR5,   bfd_mach_avr5},
    218   {"atmega406",  AVR_ISA_AVR5,    bfd_mach_avr5},
    219   {"atmega64rfr2", AVR_ISA_AVR5,  bfd_mach_avr5},
    220   {"atmega644rfr2",AVR_ISA_AVR5,  bfd_mach_avr5},
    221   {"atmega64",   AVR_ISA_AVR5,    bfd_mach_avr5},
    222   {"atmega64a",  AVR_ISA_AVR5,    bfd_mach_avr5},
    223   {"atmega640",  AVR_ISA_AVR5,    bfd_mach_avr5},
    224   {"atmega644",  AVR_ISA_AVR5,    bfd_mach_avr5},
    225   {"atmega644a", AVR_ISA_AVR5,    bfd_mach_avr5},
    226   {"atmega644p", AVR_ISA_AVR5,    bfd_mach_avr5},
    227   {"atmega644pa",AVR_ISA_AVR5,    bfd_mach_avr5},
    228   {"atmega645",  AVR_ISA_AVR5,    bfd_mach_avr5},
    229   {"atmega645a", AVR_ISA_AVR5,    bfd_mach_avr5},
    230   {"atmega645p", AVR_ISA_AVR5,    bfd_mach_avr5},
    231   {"atmega649",  AVR_ISA_AVR5,    bfd_mach_avr5},
    232   {"atmega649a", AVR_ISA_AVR5,    bfd_mach_avr5},
    233   {"atmega649p", AVR_ISA_AVR5,    bfd_mach_avr5},
    234   {"atmega6450", AVR_ISA_AVR5,    bfd_mach_avr5},
    235   {"atmega6450a",AVR_ISA_AVR5,    bfd_mach_avr5},
    236   {"atmega6450p",AVR_ISA_AVR5,    bfd_mach_avr5},
    237   {"atmega6490", AVR_ISA_AVR5,    bfd_mach_avr5},
    238   {"atmega6490a",AVR_ISA_AVR5,    bfd_mach_avr5},
    239   {"atmega6490p",AVR_ISA_AVR5,    bfd_mach_avr5},
    240   {"atmega64rfr2",AVR_ISA_AVR5,   bfd_mach_avr5},
    241   {"atmega644rfr2",AVR_ISA_AVR5,  bfd_mach_avr5},
    242   {"atmega16hva",AVR_ISA_AVR5,    bfd_mach_avr5},
    243   {"atmega16hva2",AVR_ISA_AVR5,   bfd_mach_avr5},
    244   {"atmega16hvb",AVR_ISA_AVR5,    bfd_mach_avr5},
    245   {"atmega16hvbrevb",AVR_ISA_AVR5,bfd_mach_avr5},
    246   {"atmega32hvb",AVR_ISA_AVR5,    bfd_mach_avr5},
    247   {"atmega32hvbrevb",AVR_ISA_AVR5,bfd_mach_avr5},
    248   {"atmega64hve",AVR_ISA_AVR5,    bfd_mach_avr5},
    249   {"at90can32" , AVR_ISA_AVR5,    bfd_mach_avr5},
    250   {"at90can64" , AVR_ISA_AVR5,    bfd_mach_avr5},
    251   {"at90pwm161", AVR_ISA_AVR5,    bfd_mach_avr5},
    252   {"at90pwm216", AVR_ISA_AVR5,    bfd_mach_avr5},
    253   {"at90pwm316", AVR_ISA_AVR5,    bfd_mach_avr5},
    254   {"atmega32c1", AVR_ISA_AVR5,    bfd_mach_avr5},
    255   {"atmega64c1", AVR_ISA_AVR5,    bfd_mach_avr5},
    256   {"atmega16m1", AVR_ISA_AVR5,    bfd_mach_avr5},
    257   {"atmega32m1", AVR_ISA_AVR5,    bfd_mach_avr5},
    258   {"atmega64m1", AVR_ISA_AVR5,    bfd_mach_avr5},
    259   {"atmega16u4", AVR_ISA_AVR5,    bfd_mach_avr5},
    260   {"atmega32u4", AVR_ISA_AVR5,    bfd_mach_avr5},
    261   {"atmega32u6", AVR_ISA_AVR5,    bfd_mach_avr5},
    262   {"at90usb646", AVR_ISA_AVR5,    bfd_mach_avr5},
    263   {"at90usb647", AVR_ISA_AVR5,    bfd_mach_avr5},
    264   {"at90scr100", AVR_ISA_AVR5,    bfd_mach_avr5},
    265   {"at94k",      AVR_ISA_94K,     bfd_mach_avr5},
    266   {"m3000",      AVR_ISA_AVR5,    bfd_mach_avr5},
    267   {"atmega128",  AVR_ISA_AVR51,   bfd_mach_avr51},
    268   {"atmega128a", AVR_ISA_AVR51,   bfd_mach_avr51},
    269   {"atmega1280", AVR_ISA_AVR51,   bfd_mach_avr51},
    270   {"atmega1281", AVR_ISA_AVR51,   bfd_mach_avr51},
    271   {"atmega1284", AVR_ISA_AVR51,   bfd_mach_avr51},
    272   {"atmega1284p",AVR_ISA_AVR51,   bfd_mach_avr51},
    273   {"atmega128rfa1",AVR_ISA_AVR51, bfd_mach_avr51},
    274   {"atmega128rfr2",AVR_ISA_AVR51, bfd_mach_avr51},
    275   {"atmega1284rfr2",AVR_ISA_AVR51, bfd_mach_avr51},
    276   {"at90can128", AVR_ISA_AVR51,   bfd_mach_avr51},
    277   {"at90usb1286",AVR_ISA_AVR51,   bfd_mach_avr51},
    278   {"at90usb1287",AVR_ISA_AVR51,   bfd_mach_avr51},
    279   {"atmega2560", AVR_ISA_AVR6,    bfd_mach_avr6},
    280   {"atmega2561", AVR_ISA_AVR6,    bfd_mach_avr6},
    281   {"atmega256rfr2", AVR_ISA_AVR6, bfd_mach_avr6},
    282   {"atmega2564rfr2", AVR_ISA_AVR6, bfd_mach_avr6},
    283   {"atxmega16a4", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
    284   {"atxmega16a4u",AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
    285   {"atxmega16c4", AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
    286   {"atxmega16d4", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
    287   {"atxmega32a4", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
    288   {"atxmega32a4u",AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
    289   {"atxmega32c4", AVR_ISA_XMEGAU, bfd_mach_avrxmega2},
    290   {"atxmega32d4", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
    291   {"atxmega32e5", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
    292   {"atxmega16e5", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
    293   {"atxmega8e5",  AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
    294   {"atxmega32x1", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
    295   {"atxmega64a3", AVR_ISA_XMEGA,  bfd_mach_avrxmega4},
    296   {"atxmega64a3u",AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
    297   {"atxmega64a4u",AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
    298   {"atxmega64b1", AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
    299   {"atxmega64b3", AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
    300   {"atxmega64c3", AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
    301   {"atxmega64d3", AVR_ISA_XMEGA,  bfd_mach_avrxmega4},
    302   {"atxmega64d4", AVR_ISA_XMEGA,  bfd_mach_avrxmega4},
    303   {"atxmega64a1", AVR_ISA_XMEGA,  bfd_mach_avrxmega5},
    304   {"atxmega64a1u",AVR_ISA_XMEGAU, bfd_mach_avrxmega5},
    305   {"atxmega128a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
    306   {"atxmega128a3u",AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
    307   {"atxmega128b1", AVR_ISA_XMEGAU, bfd_mach_avrxmega6},
    308   {"atxmega128b3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
    309   {"atxmega128c3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
    310   {"atxmega128d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
    311   {"atxmega128d4", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
    312   {"atxmega192a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
    313   {"atxmega192a3u",AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
    314   {"atxmega192c3", AVR_ISA_XMEGAU, bfd_mach_avrxmega6},
    315   {"atxmega192d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
    316   {"atxmega256a3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
    317   {"atxmega256a3u",AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
    318   {"atxmega256a3b",AVR_ISA_XMEGA, bfd_mach_avrxmega6},
    319   {"atxmega256a3bu",AVR_ISA_XMEGAU, bfd_mach_avrxmega6},
    320   {"atxmega256c3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
    321   {"atxmega256d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
    322   {"atxmega384c3", AVR_ISA_XMEGAU,bfd_mach_avrxmega6},
    323   {"atxmega384d3", AVR_ISA_XMEGA, bfd_mach_avrxmega6},
    324   {"atxmega128a1", AVR_ISA_XMEGA, bfd_mach_avrxmega7},
    325   {"atxmega128a1u", AVR_ISA_XMEGAU, bfd_mach_avrxmega7},
    326   {"atxmega128a4u", AVR_ISA_XMEGAU, bfd_mach_avrxmega7},
    327   {"attiny4",      AVR_ISA_AVRTINY, bfd_mach_avrtiny},
    328   {"attiny5",      AVR_ISA_AVRTINY, bfd_mach_avrtiny},
    329   {"attiny9",      AVR_ISA_AVRTINY, bfd_mach_avrtiny},
    330   {"attiny10",     AVR_ISA_AVRTINY, bfd_mach_avrtiny},
    331   {"attiny20",     AVR_ISA_AVRTINY, bfd_mach_avrtiny},
    332   {"attiny40",     AVR_ISA_AVRTINY, bfd_mach_avrtiny},
    333   {NULL, 0, 0}
    334 };
    335 
    336 
    337 /* Current MCU type.  */
    338 static struct mcu_type_s   default_mcu = {"avr2", AVR_ISA_AVR2, bfd_mach_avr2};
    339 static struct mcu_type_s   specified_mcu;
    340 static struct mcu_type_s * avr_mcu = & default_mcu;
    341 
    342 /* AVR target-specific switches.  */
    343 struct avr_opt_s
    344 {
    345   int all_opcodes;  /* -mall-opcodes: accept all known AVR opcodes.  */
    346   int no_skip_bug;  /* -mno-skip-bug: no warnings for skipping 2-word insns.  */
    347   int no_wrap;      /* -mno-wrap: reject rjmp/rcall with 8K wrap-around.  */
    348   int link_relax;   /* -mlink-relax: generate relocations for linker
    349                        relaxation.  */
    350 };
    351 
    352 static struct avr_opt_s avr_opt = { 0, 0, 0, 0 };
    353 
    354 const char EXP_CHARS[] = "eE";
    355 const char FLT_CHARS[] = "dD";
    356 
    357 static void avr_set_arch (int);
    358 
    359 /* The target specific pseudo-ops which we support.  */
    360 const pseudo_typeS md_pseudo_table[] =
    361 {
    362   {"arch", avr_set_arch,	0},
    363   { NULL,	NULL,		0}
    364 };
    365 
    366 #define LDI_IMMEDIATE(x) (((x) & 0xf) | (((x) << 4) & 0xf00))
    367 
    368 #define EXP_MOD_NAME(i)       exp_mod[i].name
    369 #define EXP_MOD_RELOC(i)      exp_mod[i].reloc
    370 #define EXP_MOD_NEG_RELOC(i)  exp_mod[i].neg_reloc
    371 #define HAVE_PM_P(i)          exp_mod[i].have_pm
    372 
    373 struct exp_mod_s
    374 {
    375   char *                    name;
    376   bfd_reloc_code_real_type  reloc;
    377   bfd_reloc_code_real_type  neg_reloc;
    378   int                       have_pm;
    379 };
    380 
    381 static struct exp_mod_s exp_mod[] =
    382 {
    383   {"hh8",    BFD_RELOC_AVR_HH8_LDI,    BFD_RELOC_AVR_HH8_LDI_NEG,    1},
    384   {"pm_hh8", BFD_RELOC_AVR_HH8_LDI_PM, BFD_RELOC_AVR_HH8_LDI_PM_NEG, 0},
    385   {"hi8",    BFD_RELOC_AVR_HI8_LDI,    BFD_RELOC_AVR_HI8_LDI_NEG,    1},
    386   {"pm_hi8", BFD_RELOC_AVR_HI8_LDI_PM, BFD_RELOC_AVR_HI8_LDI_PM_NEG, 0},
    387   {"lo8",    BFD_RELOC_AVR_LO8_LDI,    BFD_RELOC_AVR_LO8_LDI_NEG,    1},
    388   {"pm_lo8", BFD_RELOC_AVR_LO8_LDI_PM, BFD_RELOC_AVR_LO8_LDI_PM_NEG, 0},
    389   {"hlo8",   BFD_RELOC_AVR_HH8_LDI,    BFD_RELOC_AVR_HH8_LDI_NEG,    0},
    390   {"hhi8",   BFD_RELOC_AVR_MS8_LDI,    BFD_RELOC_AVR_MS8_LDI_NEG,    0},
    391 };
    392 
    393 /* A union used to store indicies into the exp_mod[] array
    394    in a hash table which expects void * data types.  */
    395 typedef union
    396 {
    397   void * ptr;
    398   int    index;
    399 } mod_index;
    400 
    401 /* Opcode hash table.  */
    402 static struct hash_control *avr_hash;
    403 
    404 /* Reloc modifiers hash control (hh8,hi8,lo8,pm_xx).  */
    405 static struct hash_control *avr_mod_hash;
    406 
    407 #define OPTION_MMCU 'm'
    408 enum options
    409 {
    410   OPTION_ALL_OPCODES = OPTION_MD_BASE + 1,
    411   OPTION_NO_SKIP_BUG,
    412   OPTION_NO_WRAP,
    413   OPTION_ISA_RMW,
    414   OPTION_LINK_RELAX
    415 };
    416 
    417 struct option md_longopts[] =
    418 {
    419   { "mmcu",   required_argument, NULL, OPTION_MMCU        },
    420   { "mall-opcodes", no_argument, NULL, OPTION_ALL_OPCODES },
    421   { "mno-skip-bug", no_argument, NULL, OPTION_NO_SKIP_BUG },
    422   { "mno-wrap",     no_argument, NULL, OPTION_NO_WRAP     },
    423   { "mrmw",         no_argument, NULL, OPTION_ISA_RMW     },
    424   { "mlink-relax",  no_argument, NULL, OPTION_LINK_RELAX  },
    425   { NULL, no_argument, NULL, 0 }
    426 };
    427 
    428 size_t md_longopts_size = sizeof (md_longopts);
    429 
    430 /* Display nicely formatted list of known MCU names.  */
    431 
    432 static void
    433 show_mcu_list (FILE *stream)
    434 {
    435   int i, x;
    436 
    437   fprintf (stream, _("Known MCU names:"));
    438   x = 1000;
    439 
    440   for (i = 0; mcu_types[i].name; i++)
    441     {
    442       int len = strlen (mcu_types[i].name);
    443 
    444       x += len + 1;
    445 
    446       if (x < 75)
    447 	fprintf (stream, " %s", mcu_types[i].name);
    448       else
    449 	{
    450 	  fprintf (stream, "\n  %s", mcu_types[i].name);
    451 	  x = len + 2;
    452 	}
    453     }
    454 
    455   fprintf (stream, "\n");
    456 }
    457 
    458 static inline char *
    459 skip_space (char *s)
    460 {
    461   while (*s == ' ' || *s == '\t')
    462     ++s;
    463   return s;
    464 }
    465 
    466 /* Extract one word from FROM and copy it to TO.  */
    467 
    468 static char *
    469 extract_word (char *from, char *to, int limit)
    470 {
    471   char *op_end;
    472   int size = 0;
    473 
    474   /* Drop leading whitespace.  */
    475   from = skip_space (from);
    476   *to = 0;
    477 
    478   /* Find the op code end.  */
    479   for (op_end = from; *op_end != 0 && is_part_of_name (*op_end);)
    480     {
    481       to[size++] = *op_end++;
    482       if (size + 1 >= limit)
    483 	break;
    484     }
    485 
    486   to[size] = 0;
    487   return op_end;
    488 }
    489 
    490 int
    491 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
    492 			       asection *seg ATTRIBUTE_UNUSED)
    493 {
    494   abort ();
    495   return 0;
    496 }
    497 
    498 void
    499 md_show_usage (FILE *stream)
    500 {
    501   fprintf (stream,
    502       _("AVR Assembler options:\n"
    503 	"  -mmcu=[avr-name] select microcontroller variant\n"
    504 	"                   [avr-name] can be:\n"
    505 	"                   avr1  - classic AVR core without data RAM\n"
    506 	"                   avr2  - classic AVR core with up to 8K program memory\n"
    507 	"                   avr25 - classic AVR core with up to 8K program memory\n"
    508 	"                           plus the MOVW instruction\n"
    509 	"                   avr3  - classic AVR core with up to 64K program memory\n"
    510 	"                   avr31 - classic AVR core with up to 128K program memory\n"
    511 	"                   avr35 - classic AVR core with up to 64K program memory\n"
    512 	"                           plus the MOVW instruction\n"
    513 	"                   avr4  - enhanced AVR core with up to 8K program memory\n"
    514 	"                   avr5  - enhanced AVR core with up to 64K program memory\n"
    515 	"                   avr51 - enhanced AVR core with up to 128K program memory\n"
    516 	"                   avr6  - enhanced AVR core with up to 256K program memory\n"
    517 	"                   avrxmega2 - XMEGA, > 8K, < 64K FLASH, < 64K RAM\n"
    518 	"                   avrxmega3 - XMEGA, > 8K, <= 64K FLASH, > 64K RAM\n"
    519 	"                   avrxmega4 - XMEGA, > 64K, <= 128K FLASH, <= 64K RAM\n"
    520 	"                   avrxmega5 - XMEGA, > 64K, <= 128K FLASH, > 64K RAM\n"
    521 	"                   avrxmega6 - XMEGA, > 128K, <= 256K FLASH, <= 64K RAM\n"
    522 	"                   avrxmega7 - XMEGA, > 128K, <= 256K FLASH, > 64K RAM\n"
    523 	"                   avrtiny   - AVR Tiny core with 16 gp registers\n"));
    524   fprintf (stream,
    525       _("  -mall-opcodes    accept all AVR opcodes, even if not supported by MCU\n"
    526 	"  -mno-skip-bug    disable warnings for skipping two-word instructions\n"
    527 	"                   (default for avr4, avr5)\n"
    528 	"  -mno-wrap        reject rjmp/rcall instructions with 8K wrap-around\n"
    529 	"                   (default for avr3, avr5)\n"
    530 	"  -mrmw            accept Read-Modify-Write instructions\n"
    531     "  -mlink-relax     generate relocations for linker relaxation\n"
    532     ));
    533   show_mcu_list (stream);
    534 }
    535 
    536 static void
    537 avr_set_arch (int dummy ATTRIBUTE_UNUSED)
    538 {
    539   char str[20];
    540 
    541   input_line_pointer = extract_word (input_line_pointer, str, 20);
    542   md_parse_option (OPTION_MMCU, str);
    543   bfd_set_arch_mach (stdoutput, TARGET_ARCH, avr_mcu->mach);
    544 }
    545 
    546 int
    547 md_parse_option (int c, char *arg)
    548 {
    549   switch (c)
    550     {
    551     case OPTION_MMCU:
    552       {
    553 	int i;
    554 	char *s = alloca (strlen (arg) + 1);
    555 
    556 	{
    557 	  char *t = s;
    558 	  char *arg1 = arg;
    559 
    560 	  do
    561 	    *t = TOLOWER (*arg1++);
    562 	  while (*t++);
    563 	}
    564 
    565 	for (i = 0; mcu_types[i].name; ++i)
    566 	  if (strcmp (mcu_types[i].name, s) == 0)
    567 	    break;
    568 
    569 	if (!mcu_types[i].name)
    570 	  {
    571 	    show_mcu_list (stderr);
    572 	    as_fatal (_("unknown MCU: %s\n"), arg);
    573 	  }
    574 
    575 	/* It is OK to redefine mcu type within the same avr[1-5] bfd machine
    576 	   type - this for allows passing -mmcu=... via gcc ASM_SPEC as well
    577 	   as .arch ... in the asm output at the same time.  */
    578 	if (avr_mcu == &default_mcu || avr_mcu->mach == mcu_types[i].mach)
    579       {
    580         specified_mcu.name = mcu_types[i].name;
    581         specified_mcu.isa  |= mcu_types[i].isa;
    582         specified_mcu.mach = mcu_types[i].mach;
    583         avr_mcu = &specified_mcu;
    584       }
    585 	else
    586 	  as_fatal (_("redefinition of mcu type `%s' to `%s'"),
    587 		    avr_mcu->name, mcu_types[i].name);
    588 	return 1;
    589       }
    590     case OPTION_ALL_OPCODES:
    591       avr_opt.all_opcodes = 1;
    592       return 1;
    593     case OPTION_NO_SKIP_BUG:
    594       avr_opt.no_skip_bug = 1;
    595       return 1;
    596     case OPTION_NO_WRAP:
    597       avr_opt.no_wrap = 1;
    598       return 1;
    599     case OPTION_ISA_RMW:
    600       specified_mcu.isa |= AVR_ISA_RMW;
    601       return 1;
    602     case OPTION_LINK_RELAX:
    603       avr_opt.link_relax = 1;
    604       return 1;
    605     }
    606 
    607   return 0;
    608 }
    609 
    610 symbolS *
    611 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
    612 {
    613   return NULL;
    614 }
    615 
    616 char *
    617 md_atof (int type, char *litP, int *sizeP)
    618 {
    619   return ieee_md_atof (type, litP, sizeP, FALSE);
    620 }
    621 
    622 void
    623 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
    624 		 asection *sec ATTRIBUTE_UNUSED,
    625 		 fragS *fragP ATTRIBUTE_UNUSED)
    626 {
    627   abort ();
    628 }
    629 
    630 void
    631 md_begin (void)
    632 {
    633   unsigned int i;
    634   struct avr_opcodes_s *opcode;
    635 
    636   avr_hash = hash_new ();
    637 
    638   /* Insert unique names into hash table.  This hash table then provides a
    639      quick index to the first opcode with a particular name in the opcode
    640      table.  */
    641   for (opcode = avr_opcodes; opcode->name; opcode++)
    642     hash_insert (avr_hash, opcode->name, (char *) opcode);
    643 
    644   avr_mod_hash = hash_new ();
    645 
    646   for (i = 0; i < ARRAY_SIZE (exp_mod); ++i)
    647     {
    648       mod_index m;
    649 
    650       m.index = i + 10;
    651       hash_insert (avr_mod_hash, EXP_MOD_NAME (i), m.ptr);
    652     }
    653 
    654   bfd_set_arch_mach (stdoutput, TARGET_ARCH, avr_mcu->mach);
    655   linkrelax = avr_opt.link_relax;
    656 }
    657 
    658 /* Resolve STR as a constant expression and return the result.
    659    If result greater than MAX then error.  */
    660 
    661 static unsigned int
    662 avr_get_constant (char *str, int max)
    663 {
    664   expressionS ex;
    665 
    666   str = skip_space (str);
    667   input_line_pointer = str;
    668   expression (& ex);
    669 
    670   if (ex.X_op != O_constant)
    671     as_bad (_("constant value required"));
    672 
    673   if (ex.X_add_number > max || ex.X_add_number < 0)
    674     as_bad (_("number must be positive and less than %d"), max + 1);
    675 
    676   return ex.X_add_number;
    677 }
    678 
    679 /* Parse for ldd/std offset.  */
    680 
    681 static void
    682 avr_offset_expression (expressionS *exp)
    683 {
    684   char *str = input_line_pointer;
    685   char *tmp;
    686   char op[8];
    687 
    688   tmp = str;
    689   str = extract_word (str, op, sizeof (op));
    690 
    691   input_line_pointer = tmp;
    692   expression (exp);
    693 
    694   /* Warn about expressions that fail to use lo8 ().  */
    695   if (exp->X_op == O_constant)
    696     {
    697       int x = exp->X_add_number;
    698 
    699       if (x < -255 || x > 255)
    700 	as_warn (_("constant out of 8-bit range: %d"), x);
    701     }
    702 }
    703 
    704 /* Parse ordinary expression.  */
    705 
    706 static char *
    707 parse_exp (char *s, expressionS *op)
    708 {
    709   input_line_pointer = s;
    710   expression (op);
    711   if (op->X_op == O_absent)
    712     as_bad (_("missing operand"));
    713   return input_line_pointer;
    714 }
    715 
    716 /* Parse special expressions (needed for LDI command):
    717    xx8 (address)
    718    xx8 (-address)
    719    pm_xx8 (address)
    720    pm_xx8 (-address)
    721    where xx is: hh, hi, lo.  */
    722 
    723 static bfd_reloc_code_real_type
    724 avr_ldi_expression (expressionS *exp)
    725 {
    726   char *str = input_line_pointer;
    727   char *tmp;
    728   char op[8];
    729   int mod;
    730   int linker_stubs_should_be_generated = 0;
    731 
    732   tmp = str;
    733 
    734   str = extract_word (str, op, sizeof (op));
    735 
    736   if (op[0])
    737     {
    738       mod_index m;
    739 
    740       m.ptr = hash_find (avr_mod_hash, op);
    741       mod = m.index;
    742 
    743       if (mod)
    744 	{
    745 	  int closes = 0;
    746 
    747 	  mod -= 10;
    748 	  str = skip_space (str);
    749 
    750 	  if (*str == '(')
    751 	    {
    752 	      bfd_reloc_code_real_type  reloc_to_return;
    753 	      int neg_p = 0;
    754 
    755 	      ++str;
    756 
    757 	      if (strncmp ("pm(", str, 3) == 0
    758                   || strncmp ("gs(",str,3) == 0
    759                   || strncmp ("-(gs(",str,5) == 0
    760 		  || strncmp ("-(pm(", str, 5) == 0)
    761 		{
    762 		  if (HAVE_PM_P (mod))
    763 		    {
    764 		      ++mod;
    765 		      ++closes;
    766 		    }
    767 		  else
    768 		    as_bad (_("illegal expression"));
    769 
    770                   if (str[0] == 'g' || str[2] == 'g')
    771                     linker_stubs_should_be_generated = 1;
    772 
    773 		  if (*str == '-')
    774 		    {
    775 		      neg_p = 1;
    776 		      ++closes;
    777 		      str += 5;
    778 		    }
    779 		  else
    780 		    str += 3;
    781 		}
    782 
    783 	      if (*str == '-' && *(str + 1) == '(')
    784 		{
    785 		  neg_p ^= 1;
    786 		  ++closes;
    787 		  str += 2;
    788 		}
    789 
    790 	      input_line_pointer = str;
    791 	      expression (exp);
    792 
    793 	      do
    794 		{
    795 		  if (*input_line_pointer != ')')
    796 		    {
    797 		      as_bad (_("`)' required"));
    798 		      break;
    799 		    }
    800 		  input_line_pointer++;
    801 		}
    802 	      while (closes--);
    803 
    804 	      reloc_to_return =
    805 		neg_p ? EXP_MOD_NEG_RELOC (mod) : EXP_MOD_RELOC (mod);
    806 	      if (linker_stubs_should_be_generated)
    807 		{
    808 		  switch (reloc_to_return)
    809 		    {
    810 		    case BFD_RELOC_AVR_LO8_LDI_PM:
    811 		      reloc_to_return = BFD_RELOC_AVR_LO8_LDI_GS;
    812 		      break;
    813 		    case BFD_RELOC_AVR_HI8_LDI_PM:
    814 		      reloc_to_return = BFD_RELOC_AVR_HI8_LDI_GS;
    815 		      break;
    816 
    817 		    default:
    818 		      /* PR 5523: Do not generate a warning here,
    819 			 legitimate code can trigger this case.  */
    820 		      break;
    821 		    }
    822 		}
    823 	      return reloc_to_return;
    824 	    }
    825 	}
    826     }
    827 
    828   input_line_pointer = tmp;
    829   expression (exp);
    830 
    831   /* Warn about expressions that fail to use lo8 ().  */
    832   if (exp->X_op == O_constant)
    833     {
    834       int x = exp->X_add_number;
    835 
    836       if (x < -255 || x > 255)
    837 	as_warn (_("constant out of 8-bit range: %d"), x);
    838     }
    839 
    840   return BFD_RELOC_AVR_LDI;
    841 }
    842 
    843 /* Parse one instruction operand.
    844    Return operand bitmask.  Also fixups can be generated.  */
    845 
    846 static unsigned int
    847 avr_operand (struct avr_opcodes_s *opcode,
    848 	     int where,
    849 	     char *op,
    850 	     char **line)
    851 {
    852   expressionS op_expr;
    853   unsigned int op_mask = 0;
    854   char *str = skip_space (*line);
    855 
    856   switch (*op)
    857     {
    858       /* Any register operand.  */
    859     case 'w':
    860     case 'd':
    861     case 'r':
    862     case 'a':
    863     case 'v':
    864       {
    865         char * old_str = str;
    866         char *lower;
    867         char r_name[20];
    868 
    869         str = extract_word (str, r_name, sizeof (r_name));
    870         for (lower = r_name; *lower; ++lower)
    871 	  {
    872 	    if (*lower >= 'A' && *lower <= 'Z')
    873 	      *lower += 'a' - 'A';
    874           }
    875 
    876         if (r_name[0] == 'r' && ISDIGIT (r_name[1]) && r_name[2] == 0)
    877           /* Single-digit register number, ie r0-r9.  */
    878           op_mask = r_name[1] - '0';
    879         else if (r_name[0] == 'r' && ISDIGIT (r_name[1])
    880 		 && ISDIGIT (r_name[2]) && r_name[3] == 0)
    881           /* Double-digit register number, ie r10 - r32.  */
    882           op_mask = (r_name[1] - '0') * 10 + r_name[2] - '0';
    883         else if (r_name[0] >= 'x' && r_name[0] <= 'z'
    884 		 && (r_name[1] == 'l' || r_name[1] == 'h') && r_name[2] == 0)
    885           /* Registers r26-r31 referred to by name, ie xl, xh, yl, yh, zl, zh.  */
    886           op_mask = (r_name[0] - 'x') * 2 + (r_name[1] == 'h') + 26;
    887         else if ((*op == 'v' || *op == 'w')
    888 		 && r_name[0] >= 'x' && r_name[0] <= 'z' && r_name[1] == 0)
    889           /* For the movw and addiw instructions, refer to registers x, y and z by name.  */
    890           op_mask = (r_name[0] - 'x') * 2 + 26;
    891         else
    892           {
    893             /* Numeric or symbolic constant register number.  */
    894             op_mask = avr_get_constant (old_str, 31);
    895             str = input_line_pointer;
    896           }
    897       }
    898 
    899       if (avr_mcu->mach == bfd_mach_avrtiny)
    900         {
    901           if (op_mask < 16 || op_mask > 31)
    902             {
    903               as_bad (_("register name or number from 16 to 31 required"));
    904               break;
    905             }
    906         }
    907       else if (op_mask > 31)
    908         {
    909           as_bad (_("register name or number from 0 to 31 required"));
    910           break;
    911         }
    912 
    913 	  switch (*op)
    914 	    {
    915 	    case 'a':
    916 	      if (op_mask < 16 || op_mask > 23)
    917 		as_bad (_("register r16-r23 required"));
    918 	      op_mask -= 16;
    919 	      break;
    920 
    921 	    case 'd':
    922 	      if (op_mask < 16)
    923 		as_bad (_("register number above 15 required"));
    924 	      op_mask -= 16;
    925 	      break;
    926 
    927 	    case 'v':
    928 	      if (op_mask & 1)
    929 		as_bad (_("even register number required"));
    930 	      op_mask >>= 1;
    931 	      break;
    932 
    933 	    case 'w':
    934 	      if ((op_mask & 1) || op_mask < 24)
    935 		as_bad (_("register r24, r26, r28 or r30 required"));
    936 	      op_mask = (op_mask - 24) >> 1;
    937 	      break;
    938 	    }
    939 	  break;
    940 
    941     case 'e':
    942       {
    943 	char c;
    944 
    945 	if (*str == '-')
    946 	  {
    947 	    str = skip_space (str + 1);
    948 	    op_mask = 0x1002;
    949 	  }
    950 	c = TOLOWER (*str);
    951 	if (c == 'x')
    952 	  op_mask |= 0x100c;
    953 	else if (c == 'y')
    954 	  op_mask |= 0x8;
    955 	else if (c != 'z')
    956 	  as_bad (_("pointer register (X, Y or Z) required"));
    957 
    958 	str = skip_space (str + 1);
    959 	if (*str == '+')
    960 	  {
    961 	    ++str;
    962 	    if (op_mask & 2)
    963 	      as_bad (_("cannot both predecrement and postincrement"));
    964 	    op_mask |= 0x1001;
    965 	  }
    966 
    967 	/* avr1 can do "ld r,Z" and "st Z,r" but no other pointer
    968 	   registers, no predecrement, no postincrement.  */
    969 	if (!avr_opt.all_opcodes && (op_mask & 0x100F)
    970 	    && !(avr_mcu->isa & AVR_ISA_SRAM))
    971 	  as_bad (_("addressing mode not supported"));
    972       }
    973       break;
    974 
    975     case 'z':
    976       if (*str == '-')
    977 	as_bad (_("can't predecrement"));
    978 
    979       if (! (*str == 'z' || *str == 'Z'))
    980 	as_bad (_("pointer register Z required"));
    981 
    982       str = skip_space (str + 1);
    983 
    984       if (*str == '+')
    985 	{
    986 	  ++str;
    987           char *s;
    988           for (s = opcode->opcode; *s; ++s)
    989             {
    990               if (*s == '+')
    991                 op_mask |= (1 << (15 - (s - opcode->opcode)));
    992             }
    993 	}
    994 
    995       /* attiny26 can do "lpm" and "lpm r,Z" but not "lpm r,Z+".  */
    996       if (!avr_opt.all_opcodes
    997 	  && (op_mask & 0x0001)
    998 	  && !(avr_mcu->isa & AVR_ISA_MOVW))
    999 	as_bad (_("postincrement not supported"));
   1000       break;
   1001 
   1002     case 'b':
   1003       {
   1004 	char c = TOLOWER (*str++);
   1005 
   1006 	if (c == 'y')
   1007 	  op_mask |= 0x8;
   1008 	else if (c != 'z')
   1009 	  as_bad (_("pointer register (Y or Z) required"));
   1010 	str = skip_space (str);
   1011 	if (*str++ == '+')
   1012 	  {
   1013 	    input_line_pointer = str;
   1014 	    avr_offset_expression (& op_expr);
   1015 	    str = input_line_pointer;
   1016 	    fix_new_exp (frag_now, where, 3,
   1017 			 &op_expr, FALSE, BFD_RELOC_AVR_6);
   1018 	  }
   1019       }
   1020       break;
   1021 
   1022     case 'h':
   1023       str = parse_exp (str, &op_expr);
   1024       fix_new_exp (frag_now, where, opcode->insn_size * 2,
   1025 		   &op_expr, FALSE, BFD_RELOC_AVR_CALL);
   1026       break;
   1027 
   1028     case 'L':
   1029       str = parse_exp (str, &op_expr);
   1030       fix_new_exp (frag_now, where, opcode->insn_size * 2,
   1031 		   &op_expr, TRUE, BFD_RELOC_AVR_13_PCREL);
   1032       break;
   1033 
   1034     case 'l':
   1035       str = parse_exp (str, &op_expr);
   1036       fix_new_exp (frag_now, where, opcode->insn_size * 2,
   1037 		   &op_expr, TRUE, BFD_RELOC_AVR_7_PCREL);
   1038       break;
   1039 
   1040     case 'i':
   1041       str = parse_exp (str, &op_expr);
   1042       fix_new_exp (frag_now, where + 2, opcode->insn_size * 2,
   1043 		   &op_expr, FALSE, BFD_RELOC_16);
   1044       break;
   1045 
   1046     case 'j':
   1047       str = parse_exp (str, &op_expr);
   1048       fix_new_exp (frag_now, where, opcode->insn_size * 2,
   1049 		   &op_expr, FALSE, BFD_RELOC_AVR_LDS_STS_16);
   1050       break;
   1051 
   1052     case 'M':
   1053       {
   1054 	bfd_reloc_code_real_type r_type;
   1055 
   1056 	input_line_pointer = str;
   1057 	r_type = avr_ldi_expression (&op_expr);
   1058 	str = input_line_pointer;
   1059 	fix_new_exp (frag_now, where, 3,
   1060 		     &op_expr, FALSE, r_type);
   1061       }
   1062       break;
   1063 
   1064     case 'n':
   1065       {
   1066 	unsigned int x;
   1067 
   1068 	x = ~avr_get_constant (str, 255);
   1069 	str = input_line_pointer;
   1070 	op_mask |= (x & 0xf) | ((x << 4) & 0xf00);
   1071       }
   1072       break;
   1073 
   1074     case 'K':
   1075       input_line_pointer = str;
   1076       avr_offset_expression (& op_expr);
   1077       str = input_line_pointer;
   1078       fix_new_exp (frag_now, where, 3,
   1079 		   & op_expr, FALSE, BFD_RELOC_AVR_6_ADIW);
   1080       break;
   1081 
   1082     case 'S':
   1083     case 's':
   1084       {
   1085 	unsigned int x;
   1086 
   1087 	x = avr_get_constant (str, 7);
   1088 	str = input_line_pointer;
   1089 	if (*op == 'S')
   1090 	  x <<= 4;
   1091 	op_mask |= x;
   1092       }
   1093       break;
   1094 
   1095     case 'P':
   1096       str = parse_exp (str, &op_expr);
   1097       fix_new_exp (frag_now, where, opcode->insn_size * 2,
   1098 		     &op_expr, FALSE, BFD_RELOC_AVR_PORT6);
   1099       break;
   1100 
   1101     case 'p':
   1102       str = parse_exp (str, &op_expr);
   1103       fix_new_exp (frag_now, where, opcode->insn_size * 2,
   1104 		     &op_expr, FALSE, BFD_RELOC_AVR_PORT5);
   1105       break;
   1106 
   1107     case 'E':
   1108       {
   1109 	unsigned int x;
   1110 
   1111 	x = avr_get_constant (str, 15);
   1112 	str = input_line_pointer;
   1113 	op_mask |= (x << 4);
   1114       }
   1115       break;
   1116 
   1117     case '?':
   1118       break;
   1119 
   1120     default:
   1121       as_bad (_("unknown constraint `%c'"), *op);
   1122     }
   1123 
   1124   *line = str;
   1125   return op_mask;
   1126 }
   1127 
   1128 /* Parse instruction operands.
   1129    Return binary opcode.  */
   1130 
   1131 static unsigned int
   1132 avr_operands (struct avr_opcodes_s *opcode, char **line)
   1133 {
   1134   char *op = opcode->constraints;
   1135   unsigned int bin = opcode->bin_opcode;
   1136   char *frag = frag_more (opcode->insn_size * 2);
   1137   char *str = *line;
   1138   int where = frag - frag_now->fr_literal;
   1139   static unsigned int prev = 0;  /* Previous opcode.  */
   1140 
   1141   /* Opcode have operands.  */
   1142   if (*op)
   1143     {
   1144       unsigned int reg1 = 0;
   1145       unsigned int reg2 = 0;
   1146       int reg1_present = 0;
   1147       int reg2_present = 0;
   1148 
   1149       /* Parse first operand.  */
   1150       if (REGISTER_P (*op))
   1151 	reg1_present = 1;
   1152       reg1 = avr_operand (opcode, where, op, &str);
   1153       ++op;
   1154 
   1155       /* Parse second operand.  */
   1156       if (*op)
   1157 	{
   1158 	  if (*op == ',')
   1159 	    ++op;
   1160 
   1161 	  if (*op == '=')
   1162 	    {
   1163 	      reg2 = reg1;
   1164 	      reg2_present = 1;
   1165 	    }
   1166 	  else
   1167 	    {
   1168 	      if (REGISTER_P (*op))
   1169 		reg2_present = 1;
   1170 
   1171 	      str = skip_space (str);
   1172 	      if (*str++ != ',')
   1173 		as_bad (_("`,' required"));
   1174 	      str = skip_space (str);
   1175 
   1176 	      reg2 = avr_operand (opcode, where, op, &str);
   1177 	    }
   1178 
   1179 	  if (reg1_present && reg2_present)
   1180 	    reg2 = (reg2 & 0xf) | ((reg2 << 5) & 0x200);
   1181 	  else if (reg2_present)
   1182 	    reg2 <<= 4;
   1183 	}
   1184       if (reg1_present)
   1185 	reg1 <<= 4;
   1186       bin |= reg1 | reg2;
   1187     }
   1188 
   1189   /* Detect undefined combinations (like ld r31,Z+).  */
   1190   if (!avr_opt.all_opcodes && AVR_UNDEF_P (bin))
   1191     as_warn (_("undefined combination of operands"));
   1192 
   1193   if (opcode->insn_size == 2)
   1194     {
   1195       /* Warn if the previous opcode was cpse/sbic/sbis/sbrc/sbrs
   1196          (AVR core bug, fixed in the newer devices).  */
   1197       if (!(avr_opt.no_skip_bug ||
   1198             (avr_mcu->isa & (AVR_ISA_MUL | AVR_ISA_MOVW)))
   1199 	  && AVR_SKIP_P (prev))
   1200 	as_warn (_("skipping two-word instruction"));
   1201 
   1202       bfd_putl32 ((bfd_vma) bin, frag);
   1203     }
   1204   else
   1205     bfd_putl16 ((bfd_vma) bin, frag);
   1206 
   1207   prev = bin;
   1208   *line = str;
   1209   return bin;
   1210 }
   1211 
   1212 /* GAS will call this function for each section at the end of the assembly,
   1213    to permit the CPU backend to adjust the alignment of a section.  */
   1214 
   1215 valueT
   1216 md_section_align (asection *seg, valueT addr)
   1217 {
   1218   int align = bfd_get_section_alignment (stdoutput, seg);
   1219   return ((addr + (1 << align) - 1) & (-1 << align));
   1220 }
   1221 
   1222 /* If you define this macro, it should return the offset between the
   1223    address of a PC relative fixup and the position from which the PC
   1224    relative adjustment should be made.  On many processors, the base
   1225    of a PC relative instruction is the next instruction, so this
   1226    macro would return the length of an instruction.  */
   1227 
   1228 long
   1229 md_pcrel_from_section (fixS *fixp, segT sec)
   1230 {
   1231   if (fixp->fx_addsy != (symbolS *) NULL
   1232       && (!S_IS_DEFINED (fixp->fx_addsy)
   1233 	  || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
   1234     return 0;
   1235 
   1236   return fixp->fx_frag->fr_address + fixp->fx_where;
   1237 }
   1238 
   1239 static bfd_boolean
   1240 relaxable_section (asection *sec)
   1241 {
   1242   return (sec->flags & SEC_DEBUGGING) == 0;
   1243 }
   1244 
   1245 /* Does whatever the xtensa port does.  */
   1246 int
   1247 avr_validate_fix_sub (fixS *fix)
   1248 {
   1249   segT add_symbol_segment, sub_symbol_segment;
   1250 
   1251   /* The difference of two symbols should be resolved by the assembler when
   1252      linkrelax is not set.  If the linker may relax the section containing
   1253      the symbols, then an Xtensa DIFF relocation must be generated so that
   1254      the linker knows to adjust the difference value.  */
   1255   if (!linkrelax || fix->fx_addsy == NULL)
   1256     return 0;
   1257 
   1258   /* Make sure both symbols are in the same segment, and that segment is
   1259      "normal" and relaxable.  If the segment is not "normal", then the
   1260      fix is not valid.  If the segment is not "relaxable", then the fix
   1261      should have been handled earlier.  */
   1262   add_symbol_segment = S_GET_SEGMENT (fix->fx_addsy);
   1263   if (! SEG_NORMAL (add_symbol_segment) ||
   1264       ! relaxable_section (add_symbol_segment))
   1265     return 0;
   1266 
   1267   sub_symbol_segment = S_GET_SEGMENT (fix->fx_subsy);
   1268   return (sub_symbol_segment == add_symbol_segment);
   1269 }
   1270 
   1271 /* TC_FORCE_RELOCATION hook */
   1272 
   1273 /* If linkrelax is turned on, and the symbol to relocate
   1274    against is in a relaxable segment, don't compute the value -
   1275    generate a relocation instead.  */
   1276 int
   1277 avr_force_relocation (fixS *fix)
   1278 {
   1279   if (linkrelax && fix->fx_addsy
   1280       && relaxable_section (S_GET_SEGMENT (fix->fx_addsy)))
   1281     return 1;
   1282 
   1283   return generic_force_reloc (fix);
   1284 }
   1285 
   1286 /* GAS will call this for each fixup.  It should store the correct
   1287    value in the object file.  */
   1288 
   1289 void
   1290 md_apply_fix (fixS *fixP, valueT * valP, segT seg)
   1291 {
   1292   unsigned char *where;
   1293   unsigned long insn;
   1294   long value = *valP;
   1295 
   1296   if (fixP->fx_addsy == (symbolS *) NULL)
   1297     fixP->fx_done = 1;
   1298 
   1299   else if (fixP->fx_pcrel)
   1300     {
   1301       segT s = S_GET_SEGMENT (fixP->fx_addsy);
   1302 
   1303       if (s == seg || s == absolute_section)
   1304 	{
   1305 	  value += S_GET_VALUE (fixP->fx_addsy);
   1306 	  fixP->fx_done = 1;
   1307 	}
   1308     }
   1309   else if (linkrelax && fixP->fx_subsy)
   1310     {
   1311       /* For a subtraction relocation expression, generate one
   1312          of the DIFF relocs, with the value being the difference.
   1313          Note that a sym1 - sym2 expression is adjusted into a
   1314          section_start_sym + sym4_offset_from_section_start - sym1
   1315          expression. fixP->fx_addsy holds the section start symbol,
   1316          fixP->fx_offset holds sym2's offset, and fixP->fx_subsy
   1317          holds sym1. Calculate the current difference and write value,
   1318          but leave fx_offset as is - during relaxation,
   1319          fx_offset - value gives sym1's value.  */
   1320 
   1321        switch (fixP->fx_r_type)
   1322          {
   1323            case BFD_RELOC_8:
   1324              fixP->fx_r_type = BFD_RELOC_AVR_DIFF8;
   1325              break;
   1326            case BFD_RELOC_16:
   1327              fixP->fx_r_type = BFD_RELOC_AVR_DIFF16;
   1328              break;
   1329            case BFD_RELOC_32:
   1330              fixP->fx_r_type = BFD_RELOC_AVR_DIFF32;
   1331              break;
   1332            default:
   1333              as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
   1334              break;
   1335          }
   1336 
   1337       value = S_GET_VALUE (fixP->fx_addsy) +
   1338           fixP->fx_offset - S_GET_VALUE (fixP->fx_subsy);
   1339 
   1340       fixP->fx_subsy = NULL;
   1341   }
   1342   /* We don't actually support subtracting a symbol.  */
   1343   if (fixP->fx_subsy != (symbolS *) NULL)
   1344     as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
   1345 
   1346   /* For the DIFF relocs, write the value into the object file while still
   1347      keeping fx_done FALSE, as both the difference (recorded in the object file)
   1348      and the sym offset (part of fixP) are needed at link relax time.  */
   1349   where = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
   1350   switch (fixP->fx_r_type)
   1351     {
   1352     default:
   1353       fixP->fx_no_overflow = 1;
   1354       break;
   1355     case BFD_RELOC_AVR_7_PCREL:
   1356     case BFD_RELOC_AVR_13_PCREL:
   1357     case BFD_RELOC_32:
   1358     case BFD_RELOC_16:
   1359       break;
   1360     case BFD_RELOC_AVR_DIFF8:
   1361       *where = value;
   1362 	  break;
   1363     case BFD_RELOC_AVR_DIFF16:
   1364       bfd_putl16 ((bfd_vma) value, where);
   1365       break;
   1366     case BFD_RELOC_AVR_DIFF32:
   1367       bfd_putl32 ((bfd_vma) value, where);
   1368       break;
   1369     case BFD_RELOC_AVR_CALL:
   1370       break;
   1371     }
   1372 
   1373   if (fixP->fx_done)
   1374     {
   1375       /* Fetch the instruction, insert the fully resolved operand
   1376 	 value, and stuff the instruction back again.  */
   1377       where = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
   1378       insn = bfd_getl16 (where);
   1379 
   1380       switch (fixP->fx_r_type)
   1381 	{
   1382 	case BFD_RELOC_AVR_7_PCREL:
   1383 	  if (value & 1)
   1384 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   1385 			  _("odd address operand: %ld"), value);
   1386 
   1387 	  /* Instruction addresses are always right-shifted by 1.  */
   1388 	  value >>= 1;
   1389 	  --value;			/* Correct PC.  */
   1390 
   1391 	  if (value < -64 || value > 63)
   1392 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   1393 			  _("operand out of range: %ld"), value);
   1394 	  value = (value << 3) & 0x3f8;
   1395 	  bfd_putl16 ((bfd_vma) (value | insn), where);
   1396 	  break;
   1397 
   1398 	case BFD_RELOC_AVR_13_PCREL:
   1399 	  if (value & 1)
   1400 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   1401 			  _("odd address operand: %ld"), value);
   1402 
   1403 	  /* Instruction addresses are always right-shifted by 1.  */
   1404 	  value >>= 1;
   1405 	  --value;			/* Correct PC.  */
   1406 
   1407 	  if (value < -2048 || value > 2047)
   1408 	    {
   1409 	      /* No wrap for devices with >8K of program memory.  */
   1410 	      if ((avr_mcu->isa & AVR_ISA_MEGA) || avr_opt.no_wrap)
   1411 		as_bad_where (fixP->fx_file, fixP->fx_line,
   1412 			      _("operand out of range: %ld"), value);
   1413 	    }
   1414 
   1415 	  value &= 0xfff;
   1416 	  bfd_putl16 ((bfd_vma) (value | insn), where);
   1417 	  break;
   1418 
   1419 	case BFD_RELOC_32:
   1420 	  bfd_putl32 ((bfd_vma) value, where);
   1421 	  break;
   1422 
   1423 	case BFD_RELOC_16:
   1424 	  bfd_putl16 ((bfd_vma) value, where);
   1425 	  break;
   1426 
   1427 	case BFD_RELOC_8:
   1428           if (value > 255 || value < -128)
   1429 	    as_warn_where (fixP->fx_file, fixP->fx_line,
   1430                            _("operand out of range: %ld"), value);
   1431           *where = value;
   1432 	  break;
   1433 
   1434 	case BFD_RELOC_AVR_16_PM:
   1435 	  bfd_putl16 ((bfd_vma) (value >> 1), where);
   1436 	  break;
   1437 
   1438 	case BFD_RELOC_AVR_LDI:
   1439 	  if (value > 255)
   1440 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   1441 			  _("operand out of range: %ld"), value);
   1442 	  bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value), where);
   1443 	  break;
   1444 
   1445 	case BFD_RELOC_AVR_LDS_STS_16:
   1446 	  if ((value < 0x40) || (value > 0xBF))
   1447 	    as_warn_where (fixP->fx_file, fixP->fx_line,
   1448 			   _("operand out of range: 0x%lx"),
   1449 			   (unsigned long)value);
   1450 	  insn |= ((value & 0xF) | ((value & 0x30) << 5) | ((value & 0x40) << 2));
   1451 	  bfd_putl16 ((bfd_vma) insn, where);
   1452 	  break;
   1453 
   1454 	case BFD_RELOC_AVR_6:
   1455 	  if ((value > 63) || (value < 0))
   1456 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   1457 			  _("operand out of range: %ld"), value);
   1458 	  bfd_putl16 ((bfd_vma) insn | ((value & 7) | ((value & (3 << 3)) << 7)
   1459 					| ((value & (1 << 5)) << 8)), where);
   1460 	  break;
   1461 
   1462 	case BFD_RELOC_AVR_6_ADIW:
   1463 	  if ((value > 63) || (value < 0))
   1464 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   1465 			  _("operand out of range: %ld"), value);
   1466 	  bfd_putl16 ((bfd_vma) insn | (value & 0xf) | ((value & 0x30) << 2), where);
   1467 	  break;
   1468 
   1469 	case BFD_RELOC_AVR_LO8_LDI:
   1470 	  bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value), where);
   1471 	  break;
   1472 
   1473 	case BFD_RELOC_AVR_HI8_LDI:
   1474 	  bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 8), where);
   1475 	  break;
   1476 
   1477 	case BFD_RELOC_AVR_MS8_LDI:
   1478 	  bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 24), where);
   1479 	  break;
   1480 
   1481 	case BFD_RELOC_AVR_HH8_LDI:
   1482 	  bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 16), where);
   1483 	  break;
   1484 
   1485 	case BFD_RELOC_AVR_LO8_LDI_NEG:
   1486 	  bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value), where);
   1487 	  break;
   1488 
   1489 	case BFD_RELOC_AVR_HI8_LDI_NEG:
   1490 	  bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 8), where);
   1491 	  break;
   1492 
   1493 	case BFD_RELOC_AVR_MS8_LDI_NEG:
   1494 	  bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 24), where);
   1495 	  break;
   1496 
   1497 	case BFD_RELOC_AVR_HH8_LDI_NEG:
   1498 	  bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 16), where);
   1499 	  break;
   1500 
   1501 	case BFD_RELOC_AVR_LO8_LDI_PM:
   1502 	  bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 1), where);
   1503 	  break;
   1504 
   1505 	case BFD_RELOC_AVR_HI8_LDI_PM:
   1506 	  bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 9), where);
   1507 	  break;
   1508 
   1509 	case BFD_RELOC_AVR_HH8_LDI_PM:
   1510 	  bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (value >> 17), where);
   1511 	  break;
   1512 
   1513 	case BFD_RELOC_AVR_LO8_LDI_PM_NEG:
   1514 	  bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 1), where);
   1515 	  break;
   1516 
   1517 	case BFD_RELOC_AVR_HI8_LDI_PM_NEG:
   1518 	  bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 9), where);
   1519 	  break;
   1520 
   1521 	case BFD_RELOC_AVR_HH8_LDI_PM_NEG:
   1522 	  bfd_putl16 ((bfd_vma) insn | LDI_IMMEDIATE (-value >> 17), where);
   1523 	  break;
   1524 
   1525 	case BFD_RELOC_AVR_CALL:
   1526 	  {
   1527 	    unsigned long x;
   1528 
   1529 	    x = bfd_getl16 (where);
   1530 	    if (value & 1)
   1531 	      as_bad_where (fixP->fx_file, fixP->fx_line,
   1532 			    _("odd address operand: %ld"), value);
   1533 	    value >>= 1;
   1534 	    x |= ((value & 0x10000) | ((value << 3) & 0x1f00000)) >> 16;
   1535 	    bfd_putl16 ((bfd_vma) x, where);
   1536 	    bfd_putl16 ((bfd_vma) (value & 0xffff), where + 2);
   1537 	  }
   1538 	  break;
   1539 
   1540         case BFD_RELOC_AVR_8_LO:
   1541           *where = 0xff & value;
   1542           break;
   1543 
   1544         case BFD_RELOC_AVR_8_HI:
   1545           *where = 0xff & (value >> 8);
   1546           break;
   1547 
   1548         case BFD_RELOC_AVR_8_HLO:
   1549           *where = 0xff & (value >> 16);
   1550           break;
   1551 
   1552         default:
   1553 	  as_fatal (_("line %d: unknown relocation type: 0x%x"),
   1554 		    fixP->fx_line, fixP->fx_r_type);
   1555 	  break;
   1556 
   1557 	case BFD_RELOC_AVR_PORT6:
   1558 	  if (value > 63)
   1559 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   1560 			  _("operand out of range: %ld"), value);
   1561 	  bfd_putl16 ((bfd_vma) insn | ((value & 0x30) << 5) | (value & 0x0f), where);
   1562 	  break;
   1563 
   1564 	case BFD_RELOC_AVR_PORT5:
   1565 	  if (value > 31)
   1566 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   1567 			  _("operand out of range: %ld"), value);
   1568 	  bfd_putl16 ((bfd_vma) insn | ((value & 0x1f) << 3), where);
   1569 	  break;
   1570 	}
   1571     }
   1572   else
   1573     {
   1574       switch ((int) fixP->fx_r_type)
   1575 	{
   1576 	case -BFD_RELOC_AVR_HI8_LDI_NEG:
   1577 	case -BFD_RELOC_AVR_HI8_LDI:
   1578 	case -BFD_RELOC_AVR_LO8_LDI_NEG:
   1579 	case -BFD_RELOC_AVR_LO8_LDI:
   1580 	  as_bad_where (fixP->fx_file, fixP->fx_line,
   1581 			_("only constant expression allowed"));
   1582 	  fixP->fx_done = 1;
   1583 	  break;
   1584 	default:
   1585 	  break;
   1586 	}
   1587     }
   1588 }
   1589 
   1590 /* GAS will call this to generate a reloc, passing the resulting reloc
   1591    to `bfd_install_relocation'.  This currently works poorly, as
   1592    `bfd_install_relocation' often does the wrong thing, and instances of
   1593    `tc_gen_reloc' have been written to work around the problems, which
   1594    in turns makes it difficult to fix `bfd_install_relocation'.  */
   1595 
   1596 /* If while processing a fixup, a reloc really needs to be created
   1597    then it is done here.  */
   1598 
   1599 arelent *
   1600 tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED,
   1601 	      fixS *fixp)
   1602 {
   1603   arelent *reloc;
   1604 
   1605   if (fixp->fx_subsy != NULL)
   1606     {
   1607       as_bad_where (fixp->fx_file, fixp->fx_line, _("expression too complex"));
   1608       return NULL;
   1609     }
   1610 
   1611   reloc = xmalloc (sizeof (arelent));
   1612 
   1613   reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
   1614   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   1615 
   1616   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1617   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
   1618   if (reloc->howto == (reloc_howto_type *) NULL)
   1619     {
   1620       as_bad_where (fixp->fx_file, fixp->fx_line,
   1621 		    _("reloc %d not supported by object file format"),
   1622 		    (int) fixp->fx_r_type);
   1623       return NULL;
   1624     }
   1625 
   1626   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
   1627       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
   1628     reloc->address = fixp->fx_offset;
   1629 
   1630   reloc->addend = fixp->fx_offset;
   1631 
   1632   return reloc;
   1633 }
   1634 
   1635 void
   1636 md_assemble (char *str)
   1637 {
   1638   struct avr_opcodes_s *opcode;
   1639   char op[11];
   1640 
   1641   str = skip_space (extract_word (str, op, sizeof (op)));
   1642 
   1643   if (!op[0])
   1644     as_bad (_("can't find opcode "));
   1645 
   1646   opcode = (struct avr_opcodes_s *) hash_find (avr_hash, op);
   1647 
   1648   if (opcode && !avr_opt.all_opcodes)
   1649     {
   1650       /* Check if the instruction's ISA bit is ON in the ISA bits of the part
   1651          specified by the user.  If not look for other instructions
   1652 	 specifications with same mnemonic who's ISA bits matches.
   1653 
   1654          This requires include/opcode/avr.h to have the instructions with
   1655          same mnenomic to be specified in sequence.  */
   1656 
   1657       while ((opcode->isa & avr_mcu->isa) != opcode->isa)
   1658         {
   1659           opcode++;
   1660 
   1661           if (opcode->name && strcmp(op, opcode->name))
   1662             {
   1663               as_bad (_("illegal opcode %s for mcu %s"),
   1664                       opcode->name, avr_mcu->name);
   1665               return;
   1666             }
   1667         }
   1668     }
   1669 
   1670   if (opcode == NULL)
   1671     {
   1672       as_bad (_("unknown opcode `%s'"), op);
   1673       return;
   1674     }
   1675 
   1676   /* Special case for opcodes with optional operands (lpm, elpm) -
   1677      version with operands exists in avr_opcodes[] in the next entry.  */
   1678 
   1679   if (*str && *opcode->constraints == '?')
   1680     ++opcode;
   1681 
   1682   dwarf2_emit_insn (0);
   1683 
   1684   /* We used to set input_line_pointer to the result of get_operands,
   1685      but that is wrong.  Our caller assumes we don't change it.  */
   1686   {
   1687     char *t = input_line_pointer;
   1688 
   1689     avr_operands (opcode, &str);
   1690     if (*skip_space (str))
   1691       as_bad (_("garbage at end of line"));
   1692     input_line_pointer = t;
   1693   }
   1694 }
   1695 
   1696 const exp_mod_data_t exp_mod_data[] =
   1697 {
   1698   /* Default, must be first.  */
   1699   { "", 0, BFD_RELOC_16, "" },
   1700   /* Divides by 2 to get word address.  Generate Stub.  */
   1701   { "gs", 2, BFD_RELOC_AVR_16_PM, "`gs' " },
   1702   { "pm", 2, BFD_RELOC_AVR_16_PM, "`pm' " },
   1703   /* The following are used together with avr-gcc's __memx address space
   1704      in order to initialize a 24-bit pointer variable with a 24-bit address.
   1705      For address in flash, hlo8 will contain the flash segment if the
   1706      symbol is located in flash. If the symbol is located in RAM; hlo8
   1707      will contain 0x80 which matches avr-gcc's notion of how 24-bit RAM/flash
   1708      addresses linearize address space.  */
   1709   { "lo8",  1, BFD_RELOC_AVR_8_LO,  "`lo8' "  },
   1710   { "hi8",  1, BFD_RELOC_AVR_8_HI,  "`hi8' "  },
   1711   { "hlo8", 1, BFD_RELOC_AVR_8_HLO, "`hlo8' " },
   1712   { "hh8",  1, BFD_RELOC_AVR_8_HLO, "`hh8' "  },
   1713   /* End of list.  */
   1714   { NULL, 0, 0, NULL }
   1715 };
   1716 
   1717 /* Parse special CONS expression: pm (expression) or alternatively
   1718    gs (expression).  These are used for addressing program memory.  Moreover,
   1719    define lo8 (expression), hi8 (expression) and hlo8 (expression).  */
   1720 
   1721 const exp_mod_data_t *
   1722 avr_parse_cons_expression (expressionS *exp, int nbytes)
   1723 {
   1724   const exp_mod_data_t *pexp = &exp_mod_data[0];
   1725   char *tmp;
   1726 
   1727   tmp = input_line_pointer = skip_space (input_line_pointer);
   1728 
   1729   /* The first entry of exp_mod_data[] contains an entry if no
   1730      expression modifier is present.  Skip it.  */
   1731 
   1732   for (pexp++; pexp->name; pexp++)
   1733     {
   1734       int len = strlen (pexp->name);
   1735 
   1736       if (nbytes == pexp->nbytes
   1737           && strncasecmp (input_line_pointer, pexp->name, len) == 0)
   1738 	{
   1739 	  input_line_pointer = skip_space (input_line_pointer + len);
   1740 
   1741 	  if (*input_line_pointer == '(')
   1742 	    {
   1743 	      input_line_pointer = skip_space (input_line_pointer + 1);
   1744 	      expression (exp);
   1745 
   1746 	      if (*input_line_pointer == ')')
   1747 		{
   1748 		  ++input_line_pointer;
   1749 		  return pexp;
   1750 		}
   1751 	      else
   1752 		{
   1753 		  as_bad (_("`)' required"));
   1754 		  return &exp_mod_data[0];
   1755 		}
   1756 	    }
   1757 
   1758 	  input_line_pointer = tmp;
   1759 
   1760           break;
   1761 	}
   1762     }
   1763 
   1764   expression (exp);
   1765   return &exp_mod_data[0];
   1766 }
   1767 
   1768 void
   1769 avr_cons_fix_new (fragS *frag,
   1770 		  int where,
   1771 		  int nbytes,
   1772 		  expressionS *exp,
   1773 		  const exp_mod_data_t *pexp_mod_data)
   1774 {
   1775   int bad = 0;
   1776 
   1777   switch (pexp_mod_data->reloc)
   1778     {
   1779     default:
   1780       if (nbytes == 1)
   1781 	fix_new_exp (frag, where, nbytes, exp, FALSE, BFD_RELOC_8);
   1782       else if (nbytes == 2)
   1783 	fix_new_exp (frag, where, nbytes, exp, FALSE, BFD_RELOC_16);
   1784       else if (nbytes == 4)
   1785 	fix_new_exp (frag, where, nbytes, exp, FALSE, BFD_RELOC_32);
   1786       else
   1787 	bad = 1;
   1788       break;
   1789 
   1790     case BFD_RELOC_AVR_16_PM:
   1791     case BFD_RELOC_AVR_8_LO:
   1792     case BFD_RELOC_AVR_8_HI:
   1793     case BFD_RELOC_AVR_8_HLO:
   1794       if (nbytes == pexp_mod_data->nbytes)
   1795         fix_new_exp (frag, where, nbytes, exp, FALSE, pexp_mod_data->reloc);
   1796       else
   1797         bad = 1;
   1798       break;
   1799     }
   1800 
   1801   if (bad)
   1802     as_bad (_("illegal %srelocation size: %d"), pexp_mod_data->error, nbytes);
   1803 }
   1804 
   1805 static bfd_boolean
   1806 mcu_has_3_byte_pc (void)
   1807 {
   1808   int mach = avr_mcu->mach;
   1809 
   1810   return mach == bfd_mach_avr6
   1811     || mach == bfd_mach_avrxmega6
   1812     || mach == bfd_mach_avrxmega7;
   1813 }
   1814 
   1815 void
   1816 tc_cfi_frame_initial_instructions (void)
   1817 {
   1818   /* AVR6 pushes 3 bytes for calls.  */
   1819   int return_size = (mcu_has_3_byte_pc () ? 3 : 2);
   1820 
   1821   /* The CFA is the caller's stack location before the call insn.  */
   1822   /* Note that the stack pointer is dwarf register number 32.  */
   1823   cfi_add_CFA_def_cfa (32, return_size);
   1824 
   1825   /* Note that AVR consistently uses post-decrement, which means that things
   1826      do not line up the same way as for targers that use pre-decrement.  */
   1827   cfi_add_CFA_offset (DWARF2_DEFAULT_RETURN_COLUMN, 1-return_size);
   1828 }
   1829 
   1830 bfd_boolean
   1831 avr_allow_local_subtract (expressionS * left,
   1832 			     expressionS * right,
   1833 			     segT section)
   1834 {
   1835   /* If we are not in relaxation mode, subtraction is OK.  */
   1836   if (!linkrelax)
   1837     return TRUE;
   1838 
   1839   /* If the symbols are not in a code section then they are OK.  */
   1840   if ((section->flags & SEC_CODE) == 0)
   1841     return TRUE;
   1842 
   1843   if (left->X_add_symbol == right->X_add_symbol)
   1844     return TRUE;
   1845 
   1846   /* We have to assume that there may be instructions between the
   1847      two symbols and that relaxation may increase the distance between
   1848      them.  */
   1849   return FALSE;
   1850 }
   1851