OSDN Git Service

2005-07-29 Paul Brook <paul@codesourcery.com>
[pf3gnuchains/pf3gnuchains4x.git] / gas / config / tc-arm.c
1 /* tc-arm.c -- Assemble for the ARM
2    Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3    2004, 2005
4    Free Software Foundation, Inc.
5    Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
6         Modified by David Taylor (dtaylor@armltd.co.uk)
7         Cirrus coprocessor mods by Aldy Hernandez (aldyh@redhat.com)
8         Cirrus coprocessor fixes by Petko Manolov (petkan@nucleusys.com)
9         Cirrus coprocessor fixes by Vladimir Ivanov (vladitx@nucleusys.com)
10
11    This file is part of GAS, the GNU Assembler.
12
13    GAS is free software; you can redistribute it and/or modify
14    it under the terms of the GNU General Public License as published by
15    the Free Software Foundation; either version 2, or (at your option)
16    any later version.
17
18    GAS is distributed in the hope that it will be useful,
19    but WITHOUT ANY WARRANTY; without even the implied warranty of
20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21    GNU General Public License for more details.
22
23    You should have received a copy of the GNU General Public License
24    along with GAS; see the file COPYING.  If not, write to the Free
25    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
26    02110-1301, USA.  */
27
28 #include <string.h>
29 #define  NO_RELOC 0
30 #include "as.h"
31 #include "safe-ctype.h"
32
33 /* Need TARGET_CPU.  */
34 #include "config.h"
35 #include "subsegs.h"
36 #include "obstack.h"
37 #include "symbols.h"
38 #include "listing.h"
39
40 #include "opcode/arm.h"
41
42 #ifdef OBJ_ELF
43 #include "elf/arm.h"
44 #include "dwarf2dbg.h"
45 #include "dw2gencfi.h"
46 #endif
47
48 /* XXX Set this to 1 after the next binutils release.  */
49 #define WARN_DEPRECATED 0
50
51 #ifdef OBJ_ELF
52 /* Must be at least the size of the largest unwind opcode (currently two).  */
53 #define ARM_OPCODE_CHUNK_SIZE 8
54
55 /* This structure holds the unwinding state.  */
56
57 static struct
58 {
59   symbolS *       proc_start;
60   symbolS *       table_entry;
61   symbolS *       personality_routine;
62   int             personality_index;
63   /* The segment containing the function.  */
64   segT            saved_seg;
65   subsegT         saved_subseg;
66   /* Opcodes generated from this function.  */
67   unsigned char * opcodes;
68   int             opcode_count;
69   int             opcode_alloc;
70   /* The number of bytes pushed to the stack.  */
71   offsetT         frame_size;
72   /* We don't add stack adjustment opcodes immediately so that we can merge
73      multiple adjustments.  We can also omit the final adjustment
74      when using a frame pointer.  */
75   offsetT         pending_offset;
76   /* These two fields are set by both unwind_movsp and unwind_setfp.  They
77      hold the reg+offset to use when restoring sp from a frame pointer.  */
78   offsetT         fp_offset;
79   int             fp_reg;
80   /* Nonzero if an unwind_setfp directive has been seen.  */
81   unsigned        fp_used:1;
82   /* Nonzero if the last opcode restores sp from fp_reg.  */
83   unsigned        sp_restored:1;
84 } unwind;
85
86 /* Bit N indicates that an R_ARM_NONE relocation has been output for
87    __aeabi_unwind_cpp_prN already if set. This enables dependencies to be
88    emitted only once per section, to save unnecessary bloat.  */
89 static unsigned int marked_pr_dependency = 0;
90
91 #endif /* OBJ_ELF */
92
93 enum arm_float_abi
94 {
95   ARM_FLOAT_ABI_HARD,
96   ARM_FLOAT_ABI_SOFTFP,
97   ARM_FLOAT_ABI_SOFT
98 };
99
100 /* Types of processor to assemble for.  */
101 #define ARM_1           ARM_ARCH_V1
102 #define ARM_2           ARM_ARCH_V2
103 #define ARM_3           ARM_ARCH_V2S
104 #define ARM_250         ARM_ARCH_V2S
105 #define ARM_6           ARM_ARCH_V3
106 #define ARM_7           ARM_ARCH_V3
107 #define ARM_8           ARM_ARCH_V4
108 #define ARM_9           ARM_ARCH_V4T
109 #define ARM_STRONG      ARM_ARCH_V4
110 #define ARM_CPU_MASK    0x0000000f              /* XXX? */
111
112 #ifndef CPU_DEFAULT
113 #if defined __XSCALE__
114 #define CPU_DEFAULT     (ARM_ARCH_XSCALE)
115 #else
116 #if defined __thumb__
117 #define CPU_DEFAULT     (ARM_ARCH_V5T)
118 #else
119 #define CPU_DEFAULT     ARM_ANY
120 #endif
121 #endif
122 #endif
123
124 #ifndef FPU_DEFAULT
125 # ifdef TE_LINUX
126 #  define FPU_DEFAULT FPU_ARCH_FPA
127 # elif defined (TE_NetBSD)
128 #  ifdef OBJ_ELF
129 #   define FPU_DEFAULT FPU_ARCH_VFP     /* Soft-float, but VFP order.  */
130 #  else
131     /* Legacy a.out format.  */
132 #   define FPU_DEFAULT FPU_ARCH_FPA     /* Soft-float, but FPA order.  */
133 #  endif
134 # elif defined (TE_VXWORKS)
135 #  define FPU_DEFAULT FPU_ARCH_VFP      /* Soft-float, VFP order.  */
136 # else
137    /* For backwards compatibility, default to FPA.  */
138 #  define FPU_DEFAULT FPU_ARCH_FPA
139 # endif
140 #endif /* ifndef FPU_DEFAULT */
141
142 #define streq(a, b)           (strcmp (a, b) == 0)
143
144 static unsigned long cpu_variant;
145
146 /* Flags stored in private area of BFD structure.  */
147 static int uses_apcs_26      = FALSE;
148 static int atpcs             = FALSE;
149 static int support_interwork = FALSE;
150 static int uses_apcs_float   = FALSE;
151 static int pic_code          = FALSE;
152
153 /* Variables that we set while parsing command-line options.  Once all
154    options have been read we re-process these values to set the real
155    assembly flags.  */
156 static int legacy_cpu = -1;
157 static int legacy_fpu = -1;
158
159 static int mcpu_cpu_opt = -1;
160 static int mcpu_fpu_opt = -1;
161 static int march_cpu_opt = -1;
162 static int march_fpu_opt = -1;
163 static int mfpu_opt = -1;
164 static int mfloat_abi_opt = -1;
165 #ifdef OBJ_ELF
166 # ifdef EABI_DEFAULT
167 static int meabi_flags = EABI_DEFAULT;
168 # else
169 static int meabi_flags = EF_ARM_EABI_UNKNOWN;
170 # endif
171 #endif
172
173 #ifdef OBJ_ELF
174 /* Pre-defined "_GLOBAL_OFFSET_TABLE_"  */
175 symbolS * GOT_symbol;
176 #endif
177
178 /* Size of relocation record.  */
179 const int md_reloc_size = 8;
180
181 /* 0: assemble for ARM,
182    1: assemble for Thumb,
183    2: assemble for Thumb even though target CPU does not support thumb
184       instructions.  */
185 static int thumb_mode = 0;
186
187 /* If unified_syntax is true, we are processing the new unified
188    ARM/Thumb syntax.  Important differences from the old ARM mode:
189
190      - Immediate operands do not require a # prefix.
191      - Conditional affixes always appear at the end of the
192        instruction.  (For backward compatibility, those instructions
193        that formerly had them in the middle, continue to accept them
194        there.)
195      - The IT instruction may appear, and if it does is validated
196        against subsequent conditional affixes.  It does not generate
197        machine code.
198
199    Important differences from the old Thumb mode:
200
201      - Immediate operands do not require a # prefix.
202      - Most of the V6T2 instructions are only available in unified mode.
203      - The .N and .W suffixes are recognized and honored (it is an error
204        if they cannot be honored).
205      - All instructions set the flags if and only if they have an 's' affix.
206      - Conditional affixes may be used.  They are validated against
207        preceding IT instructions.  Unlike ARM mode, you cannot use a
208        conditional affix except in the scope of an IT instruction.  */
209
210 static bfd_boolean unified_syntax = FALSE;
211
212 struct arm_it
213 {
214   const char *  error;
215   unsigned long instruction;
216   int           size;
217   int           size_req;
218   int           cond;
219   struct
220   {
221     bfd_reloc_code_real_type type;
222     expressionS              exp;
223     int                      pc_rel;
224   } reloc;
225
226   struct
227   {
228     unsigned reg;
229     signed int imm;
230     unsigned present    : 1;  /* Operand present.  */
231     unsigned isreg      : 1;  /* Operand was a register.  */
232     unsigned immisreg   : 1;  /* .imm field is a second register.  */
233     unsigned hasreloc   : 1;  /* Operand has relocation suffix.  */
234     unsigned writeback  : 1;  /* Operand has trailing !  */
235     unsigned preind     : 1;  /* Preindexed address.  */
236     unsigned postind    : 1;  /* Postindexed address.  */
237     unsigned negative   : 1;  /* Index register was negated.  */
238     unsigned shifted    : 1;  /* Shift applied to operation.  */
239     unsigned shift_kind : 3;  /* Shift operation (enum shift_kind).  */
240   } operands[6];
241 };
242
243 static struct arm_it inst;
244
245 #define NUM_FLOAT_VALS 8
246
247 const char * fp_const[] =
248 {
249   "0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0", 0
250 };
251
252 /* Number of littlenums required to hold an extended precision number.  */
253 #define MAX_LITTLENUMS 6
254
255 LITTLENUM_TYPE fp_values[NUM_FLOAT_VALS][MAX_LITTLENUMS];
256
257 #define FAIL    (-1)
258 #define SUCCESS (0)
259
260 #define SUFF_S 1
261 #define SUFF_D 2
262 #define SUFF_E 3
263 #define SUFF_P 4
264
265 #define CP_T_X   0x00008000
266 #define CP_T_Y   0x00400000
267
268 #define CONDS_BIT        0x00100000
269 #define LOAD_BIT         0x00100000
270
271 #define DOUBLE_LOAD_FLAG 0x00000001
272
273 struct asm_cond
274 {
275   const char *  template;
276   unsigned long value;
277 };
278
279 #define COND_ALWAYS 0xE
280
281 struct asm_psr
282 {
283   const char *template;
284   unsigned long field;
285 };
286
287 /* The bit that distinguishes CPSR and SPSR.  */
288 #define SPSR_BIT   (1 << 22)
289
290 /* The individual PSR flag bits.  */
291 #define PSR_c   (1 << 16)
292 #define PSR_x   (1 << 17)
293 #define PSR_s   (1 << 18)
294 #define PSR_f   (1 << 19)
295
296 struct reloc_entry
297 {
298   char *name;
299   bfd_reloc_code_real_type reloc;
300 };
301
302 enum vfp_sp_reg_pos
303 {
304   VFP_REG_Sd, VFP_REG_Sm, VFP_REG_Sn
305 };
306
307 enum vfp_ldstm_type
308 {
309   VFP_LDSTMIA, VFP_LDSTMDB, VFP_LDSTMIAX, VFP_LDSTMDBX
310 };
311
312 /* ARM register categories.  This includes coprocessor numbers and various
313    architecture extensions' registers.  */
314 enum arm_reg_type
315 {
316   REG_TYPE_RN,
317   REG_TYPE_CP,
318   REG_TYPE_CN,
319   REG_TYPE_FN,
320   REG_TYPE_VFS,
321   REG_TYPE_VFD,
322   REG_TYPE_VFC,
323   REG_TYPE_MVF,
324   REG_TYPE_MVD,
325   REG_TYPE_MVFX,
326   REG_TYPE_MVDX,
327   REG_TYPE_MVAX,
328   REG_TYPE_DSPSC,
329   REG_TYPE_MMXWR,
330   REG_TYPE_MMXWC,
331   REG_TYPE_MMXWCG,
332   REG_TYPE_XSCALE,
333 };
334
335 /* Structure for a hash table entry for a register.  */
336 struct reg_entry
337 {
338   const char   *name;
339   unsigned char number;
340   unsigned char type;
341   unsigned char builtin;
342 };
343
344 /* Diagnostics used when we don't get a register of the expected type.  */
345 const char *const reg_expected_msgs[] =
346 {
347   N_("ARM register expected"),
348   N_("bad or missing co-processor number"),
349   N_("co-processor register expected"),
350   N_("FPA register expected"),
351   N_("VFP single precision register expected"),
352   N_("VFP double precision register expected"),
353   N_("VFP system register expected"),
354   N_("Maverick MVF register expected"),
355   N_("Maverick MVD register expected"),
356   N_("Maverick MVFX register expected"),
357   N_("Maverick MVDX register expected"),
358   N_("Maverick MVAX register expected"),
359   N_("Maverick DSPSC register expected"),
360   N_("iWMMXt data register expected"),
361   N_("iWMMXt control register expected"),
362   N_("iWMMXt scalar register expected"),
363   N_("XScale accumulator register expected"),
364 };
365
366 /* Some well known registers that we refer to directly elsewhere.  */
367 #define REG_SP  13
368 #define REG_LR  14
369 #define REG_PC  15
370
371 /* ARM instructions take 4bytes in the object file, Thumb instructions
372    take 2:  */
373 #define INSN_SIZE       4
374
375 struct asm_opcode
376 {
377   /* Basic string to match.  */
378   const char *template;
379
380   /* Parameters to instruction.  */
381   unsigned char operands[8];
382
383   /* Conditional tag - see opcode_lookup.  */
384   unsigned int tag : 4;
385
386   /* Basic instruction code.  */
387   unsigned int avalue : 28;
388
389   /* Thumb-format instruction code.  */
390   unsigned int tvalue;
391
392   /* Which architecture variant provides this instruction.  */
393   unsigned long avariant;
394   unsigned long tvariant;
395
396   /* Function to call to encode instruction in ARM format.  */
397   void (* aencode) (void);
398
399   /* Function to call to encode instruction in Thumb format.  */
400   void (* tencode) (void);
401 };
402
403 /* Defines for various bits that we will want to toggle.  */
404 #define INST_IMMEDIATE  0x02000000
405 #define OFFSET_REG      0x02000000
406 #define HWOFFSET_IMM    0x00400000
407 #define SHIFT_BY_REG    0x00000010
408 #define PRE_INDEX       0x01000000
409 #define INDEX_UP        0x00800000
410 #define WRITE_BACK      0x00200000
411 #define LDM_TYPE_2_OR_3 0x00400000
412
413 #define LITERAL_MASK    0xf000f000
414 #define OPCODE_MASK     0xfe1fffff
415 #define V4_STR_BIT      0x00000020
416
417 #define DATA_OP_SHIFT   21
418
419 /* Codes to distinguish the arithmetic instructions.  */
420 #define OPCODE_AND      0
421 #define OPCODE_EOR      1
422 #define OPCODE_SUB      2
423 #define OPCODE_RSB      3
424 #define OPCODE_ADD      4
425 #define OPCODE_ADC      5
426 #define OPCODE_SBC      6
427 #define OPCODE_RSC      7
428 #define OPCODE_TST      8
429 #define OPCODE_TEQ      9
430 #define OPCODE_CMP      10
431 #define OPCODE_CMN      11
432 #define OPCODE_ORR      12
433 #define OPCODE_MOV      13
434 #define OPCODE_BIC      14
435 #define OPCODE_MVN      15
436
437 #define T_OPCODE_MUL 0x4340
438 #define T_OPCODE_TST 0x4200
439 #define T_OPCODE_CMN 0x42c0
440 #define T_OPCODE_NEG 0x4240
441 #define T_OPCODE_MVN 0x43c0
442
443 #define T_OPCODE_ADD_R3 0x1800
444 #define T_OPCODE_SUB_R3 0x1a00
445 #define T_OPCODE_ADD_HI 0x4400
446 #define T_OPCODE_ADD_ST 0xb000
447 #define T_OPCODE_SUB_ST 0xb080
448 #define T_OPCODE_ADD_SP 0xa800
449 #define T_OPCODE_ADD_PC 0xa000
450 #define T_OPCODE_ADD_I8 0x3000
451 #define T_OPCODE_SUB_I8 0x3800
452 #define T_OPCODE_ADD_I3 0x1c00
453 #define T_OPCODE_SUB_I3 0x1e00
454
455 #define T_OPCODE_ASR_R  0x4100
456 #define T_OPCODE_LSL_R  0x4080
457 #define T_OPCODE_LSR_R  0x40c0
458 #define T_OPCODE_ROR_R  0x41c0
459 #define T_OPCODE_ASR_I  0x1000
460 #define T_OPCODE_LSL_I  0x0000
461 #define T_OPCODE_LSR_I  0x0800
462
463 #define T_OPCODE_MOV_I8 0x2000
464 #define T_OPCODE_CMP_I8 0x2800
465 #define T_OPCODE_CMP_LR 0x4280
466 #define T_OPCODE_MOV_HR 0x4600
467 #define T_OPCODE_CMP_HR 0x4500
468
469 #define T_OPCODE_LDR_PC 0x4800
470 #define T_OPCODE_LDR_SP 0x9800
471 #define T_OPCODE_STR_SP 0x9000
472 #define T_OPCODE_LDR_IW 0x6800
473 #define T_OPCODE_STR_IW 0x6000
474 #define T_OPCODE_LDR_IH 0x8800
475 #define T_OPCODE_STR_IH 0x8000
476 #define T_OPCODE_LDR_IB 0x7800
477 #define T_OPCODE_STR_IB 0x7000
478 #define T_OPCODE_LDR_RW 0x5800
479 #define T_OPCODE_STR_RW 0x5000
480 #define T_OPCODE_LDR_RH 0x5a00
481 #define T_OPCODE_STR_RH 0x5200
482 #define T_OPCODE_LDR_RB 0x5c00
483 #define T_OPCODE_STR_RB 0x5400
484
485 #define T_OPCODE_PUSH   0xb400
486 #define T_OPCODE_POP    0xbc00
487
488 #define T_OPCODE_BRANCH 0xe000
489
490 #define THUMB_SIZE      2       /* Size of thumb instruction.  */
491 #define THUMB_PP_PC_LR 0x0100
492 #define THUMB_LOAD_BIT 0x0800
493
494 #define BAD_ARGS        _("bad arguments to instruction")
495 #define BAD_PC          _("r15 not allowed here")
496 #define BAD_COND        _("instruction cannot be conditional")
497 #define BAD_OVERLAP     _("registers may not be the same")
498 #define BAD_HIREG       _("lo register required")
499 #define BAD_THUMB32     _("instruction not supported in Thumb16 mode")
500
501 static struct hash_control *arm_ops_hsh;
502 static struct hash_control *arm_cond_hsh;
503 static struct hash_control *arm_shift_hsh;
504 static struct hash_control *arm_psr_hsh;
505 static struct hash_control *arm_reg_hsh;
506 static struct hash_control *arm_reloc_hsh;
507
508 /* Stuff needed to resolve the label ambiguity
509    As:
510      ...
511      label:   <insn>
512    may differ from:
513      ...
514      label:
515               <insn>
516 */
517
518 symbolS *  last_label_seen;
519 static int label_is_thumb_function_name = FALSE;
520 \f
521 /* Literal pool structure.  Held on a per-section
522    and per-sub-section basis.  */
523
524 #define MAX_LITERAL_POOL_SIZE 1024
525 typedef struct literal_pool
526 {
527   expressionS    literals [MAX_LITERAL_POOL_SIZE];
528   unsigned int   next_free_entry;
529   unsigned int   id;
530   symbolS *      symbol;
531   segT           section;
532   subsegT        sub_section;
533   struct literal_pool * next;
534 } literal_pool;
535
536 /* Pointer to a linked list of literal pools.  */
537 literal_pool * list_of_pools = NULL;
538 \f
539 /* Pure syntax.  */
540
541 /* This array holds the chars that always start a comment.  If the
542    pre-processor is disabled, these aren't very useful.  */
543 const char comment_chars[] = "@";
544
545 /* This array holds the chars that only start a comment at the beginning of
546    a line.  If the line seems to have the form '# 123 filename'
547    .line and .file directives will appear in the pre-processed output.  */
548 /* Note that input_file.c hand checks for '#' at the beginning of the
549    first line of the input file.  This is because the compiler outputs
550    #NO_APP at the beginning of its output.  */
551 /* Also note that comments like this one will always work.  */
552 const char line_comment_chars[] = "#";
553
554 const char line_separator_chars[] = ";";
555
556 /* Chars that can be used to separate mant
557    from exp in floating point numbers.  */
558 const char EXP_CHARS[] = "eE";
559
560 /* Chars that mean this number is a floating point constant.  */
561 /* As in 0f12.456  */
562 /* or    0d1.2345e12  */
563
564 const char FLT_CHARS[] = "rRsSfFdDxXeEpP";
565
566 /* Prefix characters that indicate the start of an immediate
567    value.  */
568 #define is_immediate_prefix(C) ((C) == '#' || (C) == '$')
569
570 /* Separator character handling.  */
571
572 #define skip_whitespace(str)  do { if (*(str) == ' ') ++(str); } while (0)
573
574 static inline int
575 skip_past_char (char ** str, char c)
576 {
577   if (**str == c)
578     {
579       (*str)++;
580       return SUCCESS;
581     }
582   else
583     return FAIL;
584 }
585 #define skip_past_comma(str) skip_past_char (str, ',')
586
587 /* Arithmetic expressions (possibly involving symbols).  */
588
589 /* Return TRUE if anything in the expression is a bignum.  */
590
591 static int
592 walk_no_bignums (symbolS * sp)
593 {
594   if (symbol_get_value_expression (sp)->X_op == O_big)
595     return 1;
596
597   if (symbol_get_value_expression (sp)->X_add_symbol)
598     {
599       return (walk_no_bignums (symbol_get_value_expression (sp)->X_add_symbol)
600               || (symbol_get_value_expression (sp)->X_op_symbol
601                   && walk_no_bignums (symbol_get_value_expression (sp)->X_op_symbol)));
602     }
603
604   return 0;
605 }
606
607 static int in_my_get_expression = 0;
608
609 /* Third argument to my_get_expression.  */
610 #define GE_NO_PREFIX 0
611 #define GE_IMM_PREFIX 1
612 #define GE_OPT_PREFIX 2
613
614 static int
615 my_get_expression (expressionS * ep, char ** str, int prefix_mode)
616 {
617   char * save_in;
618   segT   seg;
619
620   /* In unified syntax, all prefixes are optional.  */
621   if (unified_syntax)
622     prefix_mode = GE_OPT_PREFIX;
623
624   switch (prefix_mode)
625     {
626     case GE_NO_PREFIX: break;
627     case GE_IMM_PREFIX:
628       if (!is_immediate_prefix (**str))
629         {
630           inst.error = _("immediate expression requires a # prefix");
631           return FAIL;
632         }
633       (*str)++;
634       break;
635     case GE_OPT_PREFIX:
636       if (is_immediate_prefix (**str))
637         (*str)++;
638       break;
639     default: abort ();
640     }
641
642   memset (ep, 0, sizeof (expressionS));
643
644   save_in = input_line_pointer;
645   input_line_pointer = *str;
646   in_my_get_expression = 1;
647   seg = expression (ep);
648   in_my_get_expression = 0;
649
650   if (ep->X_op == O_illegal)
651     {
652       /* We found a bad expression in md_operand().  */
653       *str = input_line_pointer;
654       input_line_pointer = save_in;
655       if (inst.error == NULL)
656         inst.error = _("bad expression");
657       return 1;
658     }
659
660 #ifdef OBJ_AOUT
661   if (seg != absolute_section
662       && seg != text_section
663       && seg != data_section
664       && seg != bss_section
665       && seg != undefined_section)
666     {
667       inst.error = _("bad segment");
668       *str = input_line_pointer;
669       input_line_pointer = save_in;
670       return 1;
671     }
672 #endif
673
674   /* Get rid of any bignums now, so that we don't generate an error for which
675      we can't establish a line number later on.  Big numbers are never valid
676      in instructions, which is where this routine is always called.  */
677   if (ep->X_op == O_big
678       || (ep->X_add_symbol
679           && (walk_no_bignums (ep->X_add_symbol)
680               || (ep->X_op_symbol
681                   && walk_no_bignums (ep->X_op_symbol)))))
682     {
683       inst.error = _("invalid constant");
684       *str = input_line_pointer;
685       input_line_pointer = save_in;
686       return 1;
687     }
688
689   *str = input_line_pointer;
690   input_line_pointer = save_in;
691   return 0;
692 }
693
694 /* Turn a string in input_line_pointer into a floating point constant
695    of type TYPE, and store the appropriate bytes in *LITP.  The number
696    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
697    returned, or NULL on OK.
698
699    Note that fp constants aren't represent in the normal way on the ARM.
700    In big endian mode, things are as expected.  However, in little endian
701    mode fp constants are big-endian word-wise, and little-endian byte-wise
702    within the words.  For example, (double) 1.1 in big endian mode is
703    the byte sequence 3f f1 99 99 99 99 99 9a, and in little endian mode is
704    the byte sequence 99 99 f1 3f 9a 99 99 99.
705
706    ??? The format of 12 byte floats is uncertain according to gcc's arm.h.  */
707
708 char *
709 md_atof (int type, char * litP, int * sizeP)
710 {
711   int prec;
712   LITTLENUM_TYPE words[MAX_LITTLENUMS];
713   char *t;
714   int i;
715
716   switch (type)
717     {
718     case 'f':
719     case 'F':
720     case 's':
721     case 'S':
722       prec = 2;
723       break;
724
725     case 'd':
726     case 'D':
727     case 'r':
728     case 'R':
729       prec = 4;
730       break;
731
732     case 'x':
733     case 'X':
734       prec = 6;
735       break;
736
737     case 'p':
738     case 'P':
739       prec = 6;
740       break;
741
742     default:
743       *sizeP = 0;
744       return _("bad call to MD_ATOF()");
745     }
746
747   t = atof_ieee (input_line_pointer, type, words);
748   if (t)
749     input_line_pointer = t;
750   *sizeP = prec * 2;
751
752   if (target_big_endian)
753     {
754       for (i = 0; i < prec; i++)
755         {
756           md_number_to_chars (litP, (valueT) words[i], 2);
757           litP += 2;
758         }
759     }
760   else
761     {
762       if (cpu_variant & FPU_ARCH_VFP)
763         for (i = prec - 1; i >= 0; i--)
764           {
765             md_number_to_chars (litP, (valueT) words[i], 2);
766             litP += 2;
767           }
768       else
769         /* For a 4 byte float the order of elements in `words' is 1 0.
770            For an 8 byte float the order is 1 0 3 2.  */
771         for (i = 0; i < prec; i += 2)
772           {
773             md_number_to_chars (litP, (valueT) words[i + 1], 2);
774             md_number_to_chars (litP + 2, (valueT) words[i], 2);
775             litP += 4;
776           }
777     }
778
779   return 0;
780 }
781
782 /* We handle all bad expressions here, so that we can report the faulty
783    instruction in the error message.  */
784 void
785 md_operand (expressionS * expr)
786 {
787   if (in_my_get_expression)
788     expr->X_op = O_illegal;
789 }
790
791 /* Immediate values.  */
792
793 /* Generic immediate-value read function for use in directives.
794    Accepts anything that 'expression' can fold to a constant.
795    *val receives the number.  */
796 #ifdef OBJ_ELF
797 static int
798 immediate_for_directive (int *val)
799 {
800   expressionS exp;
801   exp.X_op = O_illegal;
802
803   if (is_immediate_prefix (*input_line_pointer))
804     {
805       input_line_pointer++;
806       expression (&exp);
807     }
808
809   if (exp.X_op != O_constant)
810     {
811       as_bad (_("expected #constant"));
812       ignore_rest_of_line ();
813       return FAIL;
814     }
815   *val = exp.X_add_number;
816   return SUCCESS;
817 }
818 #endif
819
820 /* Register parsing.  */
821
822 /* Generic register parser.  CCP points to what should be the
823    beginning of a register name.  If it is indeed a valid register
824    name, advance CCP over it and return the reg_entry structure;
825    otherwise return NULL.  Does not issue diagnostics.  */
826
827 static struct reg_entry *
828 arm_reg_parse_multi (char **ccp)
829 {
830   char *start = *ccp;
831   char *p;
832   struct reg_entry *reg;
833
834 #ifdef REGISTER_PREFIX
835   if (*start != REGISTER_PREFIX)
836     return FAIL;
837   start++;
838 #endif
839 #ifdef OPTIONAL_REGISTER_PREFIX
840   if (*start == OPTIONAL_REGISTER_PREFIX)
841     start++;
842 #endif
843
844   p = start;
845   if (!ISALPHA (*p) || !is_name_beginner (*p))
846     return NULL;
847
848   do
849     p++;
850   while (ISALPHA (*p) || ISDIGIT (*p) || *p == '_');
851
852   reg = (struct reg_entry *) hash_find_n (arm_reg_hsh, start, p - start);
853
854   if (!reg)
855     return NULL;
856
857   *ccp = p;
858   return reg;
859 }
860
861 /* As above, but the register must be of type TYPE, and the return
862    value is the register number or NULL.  */
863
864 static int
865 arm_reg_parse (char **ccp, enum arm_reg_type type)
866 {
867   char *start = *ccp;
868   struct reg_entry *reg = arm_reg_parse_multi (ccp);
869
870   if (reg && reg->type == type)
871     return reg->number;
872
873   /* Alternative syntaxes are accepted for a few register classes.  */
874   switch (type)
875     {
876     case REG_TYPE_MVF:
877     case REG_TYPE_MVD:
878     case REG_TYPE_MVFX:
879     case REG_TYPE_MVDX:
880       /* Generic coprocessor register names are allowed for these.  */
881       if (reg->type == REG_TYPE_CN)
882         return reg->number;
883       break;
884
885     case REG_TYPE_CP:
886       /* For backward compatibility, a bare number is valid here.  */
887       {
888         unsigned long processor = strtoul (start, ccp, 10);
889         if (*ccp != start && processor <= 15)
890           return processor;
891       }
892
893     case REG_TYPE_MMXWC:
894       /* WC includes WCG.  ??? I'm not sure this is true for all
895          instructions that take WC registers.  */
896       if (reg->type == REG_TYPE_MMXWCG)
897         return reg->number;
898       break;
899
900     default:
901       break;
902     }
903
904   *ccp = start;
905   return FAIL;
906 }
907
908 /* Parse an ARM register list.  Returns the bitmask, or FAIL.  */
909 static long
910 parse_reg_list (char ** strp)
911 {
912   char * str = * strp;
913   long   range = 0;
914   int    another_range;
915
916   /* We come back here if we get ranges concatenated by '+' or '|'.  */
917   do
918     {
919       another_range = 0;
920
921       if (*str == '{')
922         {
923           int in_range = 0;
924           int cur_reg = -1;
925
926           str++;
927           do
928             {
929               int reg;
930
931               if ((reg = arm_reg_parse (&str, REG_TYPE_RN)) == FAIL)
932                 {
933                   inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
934                   return FAIL;
935                 }
936
937               if (in_range)
938                 {
939                   int i;
940
941                   if (reg <= cur_reg)
942                     {
943                       inst.error = _("bad range in register list");
944                       return FAIL;
945                     }
946
947                   for (i = cur_reg + 1; i < reg; i++)
948                     {
949                       if (range & (1 << i))
950                         as_tsktsk
951                           (_("Warning: duplicated register (r%d) in register list"),
952                            i);
953                       else
954                         range |= 1 << i;
955                     }
956                   in_range = 0;
957                 }
958
959               if (range & (1 << reg))
960                 as_tsktsk (_("Warning: duplicated register (r%d) in register list"),
961                            reg);
962               else if (reg <= cur_reg)
963                 as_tsktsk (_("Warning: register range not in ascending order"));
964
965               range |= 1 << reg;
966               cur_reg = reg;
967             }
968           while (skip_past_comma (&str) != FAIL
969                  || (in_range = 1, *str++ == '-'));
970           str--;
971
972           if (*str++ != '}')
973             {
974               inst.error = _("missing `}'");
975               return FAIL;
976             }
977         }
978       else
979         {
980           expressionS expr;
981
982           if (my_get_expression (&expr, &str, GE_NO_PREFIX))
983             return FAIL;
984
985           if (expr.X_op == O_constant)
986             {
987               if (expr.X_add_number
988                   != (expr.X_add_number & 0x0000ffff))
989                 {
990                   inst.error = _("invalid register mask");
991                   return FAIL;
992                 }
993
994               if ((range & expr.X_add_number) != 0)
995                 {
996                   int regno = range & expr.X_add_number;
997
998                   regno &= -regno;
999                   regno = (1 << regno) - 1;
1000                   as_tsktsk
1001                     (_("Warning: duplicated register (r%d) in register list"),
1002                      regno);
1003                 }
1004
1005               range |= expr.X_add_number;
1006             }
1007           else
1008             {
1009               if (inst.reloc.type != 0)
1010                 {
1011                   inst.error = _("expression too complex");
1012                   return FAIL;
1013                 }
1014
1015               memcpy (&inst.reloc.exp, &expr, sizeof (expressionS));
1016               inst.reloc.type = BFD_RELOC_ARM_MULTI;
1017               inst.reloc.pc_rel = 0;
1018             }
1019         }
1020
1021       if (*str == '|' || *str == '+')
1022         {
1023           str++;
1024           another_range = 1;
1025         }
1026     }
1027   while (another_range);
1028
1029   *strp = str;
1030   return range;
1031 }
1032
1033 /* Parse a VFP register list.  If the string is invalid return FAIL.
1034    Otherwise return the number of registers, and set PBASE to the first
1035    register.  Double precision registers are matched if DP is nonzero.  */
1036
1037 static int
1038 parse_vfp_reg_list (char **str, unsigned int *pbase, int dp)
1039 {
1040   int base_reg;
1041   int new_base;
1042   int regtype;
1043   int max_regs;
1044   int count = 0;
1045   int warned = 0;
1046   unsigned long mask = 0;
1047   int i;
1048
1049   if (**str != '{')
1050     return FAIL;
1051
1052   (*str)++;
1053
1054   if (dp)
1055     {
1056       regtype = REG_TYPE_VFD;
1057       max_regs = 16;
1058     }
1059   else
1060     {
1061       regtype = REG_TYPE_VFS;
1062       max_regs = 32;
1063     }
1064
1065   base_reg = max_regs;
1066
1067   do
1068     {
1069       new_base = arm_reg_parse (str, regtype);
1070       if (new_base == FAIL)
1071         {
1072           inst.error = gettext (reg_expected_msgs[regtype]);
1073           return FAIL;
1074         }
1075
1076       if (new_base < base_reg)
1077         base_reg = new_base;
1078
1079       if (mask & (1 << new_base))
1080         {
1081           inst.error = _("invalid register list");
1082           return FAIL;
1083         }
1084
1085       if ((mask >> new_base) != 0 && ! warned)
1086         {
1087           as_tsktsk (_("register list not in ascending order"));
1088           warned = 1;
1089         }
1090
1091       mask |= 1 << new_base;
1092       count++;
1093
1094       if (**str == '-') /* We have the start of a range expression */
1095         {
1096           int high_range;
1097
1098           (*str)++;
1099
1100           if ((high_range = arm_reg_parse (str, regtype)) == FAIL)
1101             {
1102               inst.error = gettext (reg_expected_msgs[regtype]);
1103               return FAIL;
1104             }
1105
1106           if (high_range <= new_base)
1107             {
1108               inst.error = _("register range not in ascending order");
1109               return FAIL;
1110             }
1111
1112           for (new_base++; new_base <= high_range; new_base++)
1113             {
1114               if (mask & (1 << new_base))
1115                 {
1116                   inst.error = _("invalid register list");
1117                   return FAIL;
1118                 }
1119
1120               mask |= 1 << new_base;
1121               count++;
1122             }
1123         }
1124     }
1125   while (skip_past_comma (str) != FAIL);
1126
1127   (*str)++;
1128
1129   /* Sanity check -- should have raised a parse error above.  */
1130   if (count == 0 || count > max_regs)
1131     abort ();
1132
1133   *pbase = base_reg;
1134
1135   /* Final test -- the registers must be consecutive.  */
1136   mask >>= base_reg;
1137   for (i = 0; i < count; i++)
1138     {
1139       if ((mask & (1u << i)) == 0)
1140         {
1141           inst.error = _("non-contiguous register range");
1142           return FAIL;
1143         }
1144     }
1145
1146   return count;
1147 }
1148
1149 /* Parse an explicit relocation suffix on an expression.  This is
1150    either nothing, or a word in parentheses.  Note that if !OBJ_ELF,
1151    arm_reloc_hsh contains no entries, so this function can only
1152    succeed if there is no () after the word.  Returns -1 on error,
1153    BFD_RELOC_UNUSED if there wasn't any suffix.  */
1154 static int
1155 parse_reloc (char **str)
1156 {
1157   struct reloc_entry *r;
1158   char *p, *q;
1159
1160   if (**str != '(')
1161     return BFD_RELOC_UNUSED;
1162
1163   p = *str + 1;
1164   q = p;
1165
1166   while (*q && *q != ')' && *q != ',')
1167     q++;
1168   if (*q != ')')
1169     return -1;
1170
1171   if ((r = hash_find_n (arm_reloc_hsh, p, q - p)) == NULL)
1172     return -1;
1173
1174   *str = q + 1;
1175   return r->reloc;
1176 }
1177
1178 /* Directives: register aliases.  */
1179
1180 static void
1181 insert_reg_alias (char *str, int number, int type)
1182 {
1183   struct reg_entry *new;
1184   const char *name;
1185
1186   if ((new = hash_find (arm_reg_hsh, str)) != 0)
1187     {
1188       if (new->builtin)
1189         as_warn (_("ignoring attempt to redefine built-in register '%s'"), str);
1190
1191       /* Only warn about a redefinition if it's not defined as the
1192          same register.  */
1193       else if (new->number != number || new->type != type)
1194         as_warn (_("ignoring redefinition of register alias '%s'"), str);
1195
1196       return;
1197     }
1198
1199   name = xstrdup (str);
1200   new = xmalloc (sizeof (struct reg_entry));
1201
1202   new->name = name;
1203   new->number = number;
1204   new->type = type;
1205   new->builtin = FALSE;
1206
1207   if (hash_insert (arm_reg_hsh, name, (PTR) new))
1208     abort ();
1209 }
1210
1211 /* Look for the .req directive.  This is of the form:
1212
1213         new_register_name .req existing_register_name
1214
1215    If we find one, or if it looks sufficiently like one that we want to
1216    handle any error here, return non-zero.  Otherwise return zero.  */
1217
1218 static int
1219 create_register_alias (char * newname, char *p)
1220 {
1221   struct reg_entry *old;
1222   char *oldname, *nbuf;
1223   size_t nlen;
1224
1225   /* The input scrubber ensures that whitespace after the mnemonic is
1226      collapsed to single spaces.  */
1227   oldname = p;
1228   if (strncmp (oldname, " .req ", 6) != 0)
1229     return 0;
1230
1231   oldname += 6;
1232   if (*oldname == '\0')
1233     return 0;
1234
1235   old = hash_find (arm_reg_hsh, oldname);
1236   if (!old)
1237     {
1238       as_warn (_("unknown register '%s' -- .req ignored"), oldname);
1239       return 1;
1240     }
1241
1242   /* If TC_CASE_SENSITIVE is defined, then newname already points to
1243      the desired alias name, and p points to its end.  If not, then
1244      the desired alias name is in the global original_case_string.  */
1245 #ifdef TC_CASE_SENSITIVE
1246   nlen = p - newname;
1247 #else
1248   newname = original_case_string;
1249   nlen = strlen (newname);
1250 #endif
1251
1252   nbuf = alloca (nlen + 1);
1253   memcpy (nbuf, newname, nlen);
1254   nbuf[nlen] = '\0';
1255
1256   /* Create aliases under the new name as stated; an all-lowercase
1257      version of the new name; and an all-uppercase version of the new
1258      name.  */
1259   insert_reg_alias (nbuf, old->number, old->type);
1260
1261   for (p = nbuf; *p; p++)
1262     *p = TOUPPER (*p);
1263
1264   if (strncmp (nbuf, newname, nlen))
1265     insert_reg_alias (nbuf, old->number, old->type);
1266
1267   for (p = nbuf; *p; p++)
1268     *p = TOLOWER (*p);
1269
1270   if (strncmp (nbuf, newname, nlen))
1271     insert_reg_alias (nbuf, old->number, old->type);
1272
1273   return 1;
1274 }
1275
1276 /* Should never be called, as .req goes between the alias and the
1277    register name, not at the beginning of the line.  */
1278 static void
1279 s_req (int a ATTRIBUTE_UNUSED)
1280 {
1281   as_bad (_("invalid syntax for .req directive"));
1282 }
1283
1284 /* The .unreq directive deletes an alias which was previously defined
1285    by .req.  For example:
1286
1287        my_alias .req r11
1288        .unreq my_alias    */
1289
1290 static void
1291 s_unreq (int a ATTRIBUTE_UNUSED)
1292 {
1293   char * name;
1294   char saved_char;
1295
1296   name = input_line_pointer;
1297
1298   while (*input_line_pointer != 0
1299          && *input_line_pointer != ' '
1300          && *input_line_pointer != '\n')
1301     ++input_line_pointer;
1302
1303   saved_char = *input_line_pointer;
1304   *input_line_pointer = 0;
1305
1306   if (!*name)
1307     as_bad (_("invalid syntax for .unreq directive"));
1308   else
1309     {
1310       struct reg_entry *reg = hash_find (arm_reg_hsh, name);
1311
1312       if (!reg)
1313         as_bad (_("unknown register alias '%s'"), name);
1314       else if (reg->builtin)
1315         as_warn (_("ignoring attempt to undefine built-in register '%s'"),
1316                  name);
1317       else
1318         {
1319           hash_delete (arm_reg_hsh, name);
1320           free ((char *) reg->name);
1321           free (reg);
1322         }
1323     }
1324
1325   *input_line_pointer = saved_char;
1326   demand_empty_rest_of_line ();
1327 }
1328
1329 /* Directives: Instruction set selection.  */
1330
1331 #ifdef OBJ_ELF
1332 /* This code is to handle mapping symbols as defined in the ARM ELF spec.
1333    (See "Mapping symbols", section 4.5.5, ARM AAELF version 1.0).
1334    Note that previously, $a and $t has type STT_FUNC (BSF_OBJECT flag),
1335    and $d has type STT_OBJECT (BSF_OBJECT flag). Now all three are untyped.  */
1336
1337 static enum mstate mapstate = MAP_UNDEFINED;
1338
1339 static void
1340 mapping_state (enum mstate state)
1341 {
1342   symbolS * symbolP;
1343   const char * symname;
1344   int type;
1345
1346   if (mapstate == state)
1347     /* The mapping symbol has already been emitted.
1348        There is nothing else to do.  */
1349     return;
1350
1351   mapstate = state;
1352
1353   switch (state)
1354     {
1355     case MAP_DATA:
1356       symname = "$d";
1357       type = BSF_NO_FLAGS;
1358       break;
1359     case MAP_ARM:
1360       symname = "$a";
1361       type = BSF_NO_FLAGS;
1362       break;
1363     case MAP_THUMB:
1364       symname = "$t";
1365       type = BSF_NO_FLAGS;
1366       break;
1367     case MAP_UNDEFINED:
1368       return;
1369     default:
1370       abort ();
1371     }
1372
1373   seg_info (now_seg)->tc_segment_info_data.mapstate = state;
1374
1375   symbolP = symbol_new (symname, now_seg, (valueT) frag_now_fix (), frag_now);
1376   symbol_table_insert (symbolP);
1377   symbol_get_bfdsym (symbolP)->flags |= type | BSF_LOCAL;
1378
1379   switch (state)
1380     {
1381     case MAP_ARM:
1382       THUMB_SET_FUNC (symbolP, 0);
1383       ARM_SET_THUMB (symbolP, 0);
1384       ARM_SET_INTERWORK (symbolP, support_interwork);
1385       break;
1386
1387     case MAP_THUMB:
1388       THUMB_SET_FUNC (symbolP, 1);
1389       ARM_SET_THUMB (symbolP, 1);
1390       ARM_SET_INTERWORK (symbolP, support_interwork);
1391       break;
1392
1393     case MAP_DATA:
1394     default:
1395       return;
1396     }
1397 }
1398 #else
1399 #define mapping_state(x) /* nothing */
1400 #endif
1401
1402 /* Find the real, Thumb encoded start of a Thumb function.  */
1403
1404 static symbolS *
1405 find_real_start (symbolS * symbolP)
1406 {
1407   char *       real_start;
1408   const char * name = S_GET_NAME (symbolP);
1409   symbolS *    new_target;
1410
1411   /* This definition must agree with the one in gcc/config/arm/thumb.c.  */
1412 #define STUB_NAME ".real_start_of"
1413
1414   if (name == NULL)
1415     abort ();
1416
1417   /* The compiler may generate BL instructions to local labels because
1418      it needs to perform a branch to a far away location. These labels
1419      do not have a corresponding ".real_start_of" label.  We check
1420      both for S_IS_LOCAL and for a leading dot, to give a way to bypass
1421      the ".real_start_of" convention for nonlocal branches.  */
1422   if (S_IS_LOCAL (symbolP) || name[0] == '.')
1423     return symbolP;
1424
1425   real_start = ACONCAT ((STUB_NAME, name, NULL));
1426   new_target = symbol_find (real_start);
1427
1428   if (new_target == NULL)
1429     {
1430       as_warn ("Failed to find real start of function: %s\n", name);
1431       new_target = symbolP;
1432     }
1433
1434   return new_target;
1435 }
1436
1437 static void
1438 opcode_select (int width)
1439 {
1440   switch (width)
1441     {
1442     case 16:
1443       if (! thumb_mode)
1444         {
1445           if (! (cpu_variant & ARM_EXT_V4T))
1446             as_bad (_("selected processor does not support THUMB opcodes"));
1447
1448           thumb_mode = 1;
1449           /* No need to force the alignment, since we will have been
1450              coming from ARM mode, which is word-aligned.  */
1451           record_alignment (now_seg, 1);
1452         }
1453       mapping_state (MAP_THUMB);
1454       break;
1455
1456     case 32:
1457       if (thumb_mode)
1458         {
1459           if ((cpu_variant & ARM_ALL) == ARM_EXT_V4T)
1460             as_bad (_("selected processor does not support ARM opcodes"));
1461
1462           thumb_mode = 0;
1463
1464           if (!need_pass_2)
1465             frag_align (2, 0, 0);
1466
1467           record_alignment (now_seg, 1);
1468         }
1469       mapping_state (MAP_ARM);
1470       break;
1471
1472     default:
1473       as_bad (_("invalid instruction size selected (%d)"), width);
1474     }
1475 }
1476
1477 static void
1478 s_arm (int ignore ATTRIBUTE_UNUSED)
1479 {
1480   opcode_select (32);
1481   demand_empty_rest_of_line ();
1482 }
1483
1484 static void
1485 s_thumb (int ignore ATTRIBUTE_UNUSED)
1486 {
1487   opcode_select (16);
1488   demand_empty_rest_of_line ();
1489 }
1490
1491 static void
1492 s_code (int unused ATTRIBUTE_UNUSED)
1493 {
1494   int temp;
1495
1496   temp = get_absolute_expression ();
1497   switch (temp)
1498     {
1499     case 16:
1500     case 32:
1501       opcode_select (temp);
1502       break;
1503
1504     default:
1505       as_bad (_("invalid operand to .code directive (%d) (expecting 16 or 32)"), temp);
1506     }
1507 }
1508
1509 static void
1510 s_force_thumb (int ignore ATTRIBUTE_UNUSED)
1511 {
1512   /* If we are not already in thumb mode go into it, EVEN if
1513      the target processor does not support thumb instructions.
1514      This is used by gcc/config/arm/lib1funcs.asm for example
1515      to compile interworking support functions even if the
1516      target processor should not support interworking.  */
1517   if (! thumb_mode)
1518     {
1519       thumb_mode = 2;
1520       record_alignment (now_seg, 1);
1521     }
1522
1523   demand_empty_rest_of_line ();
1524 }
1525
1526 static void
1527 s_thumb_func (int ignore ATTRIBUTE_UNUSED)
1528 {
1529   s_thumb (0);
1530
1531   /* The following label is the name/address of the start of a Thumb function.
1532      We need to know this for the interworking support.  */
1533   label_is_thumb_function_name = TRUE;
1534 }
1535
1536 /* Perform a .set directive, but also mark the alias as
1537    being a thumb function.  */
1538
1539 static void
1540 s_thumb_set (int equiv)
1541 {
1542   /* XXX the following is a duplicate of the code for s_set() in read.c
1543      We cannot just call that code as we need to get at the symbol that
1544      is created.  */
1545   char *    name;
1546   char      delim;
1547   char *    end_name;
1548   symbolS * symbolP;
1549
1550   /* Especial apologies for the random logic:
1551      This just grew, and could be parsed much more simply!
1552      Dean - in haste.  */
1553   name      = input_line_pointer;
1554   delim     = get_symbol_end ();
1555   end_name  = input_line_pointer;
1556   *end_name = delim;
1557
1558   if (*input_line_pointer != ',')
1559     {
1560       *end_name = 0;
1561       as_bad (_("expected comma after name \"%s\""), name);
1562       *end_name = delim;
1563       ignore_rest_of_line ();
1564       return;
1565     }
1566
1567   input_line_pointer++;
1568   *end_name = 0;
1569
1570   if (name[0] == '.' && name[1] == '\0')
1571     {
1572       /* XXX - this should not happen to .thumb_set.  */
1573       abort ();
1574     }
1575
1576   if ((symbolP = symbol_find (name)) == NULL
1577       && (symbolP = md_undefined_symbol (name)) == NULL)
1578     {
1579 #ifndef NO_LISTING
1580       /* When doing symbol listings, play games with dummy fragments living
1581          outside the normal fragment chain to record the file and line info
1582          for this symbol.  */
1583       if (listing & LISTING_SYMBOLS)
1584         {
1585           extern struct list_info_struct * listing_tail;
1586           fragS * dummy_frag = xmalloc (sizeof (fragS));
1587
1588           memset (dummy_frag, 0, sizeof (fragS));
1589           dummy_frag->fr_type = rs_fill;
1590           dummy_frag->line = listing_tail;
1591           symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
1592           dummy_frag->fr_symbol = symbolP;
1593         }
1594       else
1595 #endif
1596         symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
1597
1598 #ifdef OBJ_COFF
1599       /* "set" symbols are local unless otherwise specified.  */
1600       SF_SET_LOCAL (symbolP);
1601 #endif /* OBJ_COFF  */
1602     }                           /* Make a new symbol.  */
1603
1604   symbol_table_insert (symbolP);
1605
1606   * end_name = delim;
1607
1608   if (equiv
1609       && S_IS_DEFINED (symbolP)
1610       && S_GET_SEGMENT (symbolP) != reg_section)
1611     as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
1612
1613   pseudo_set (symbolP);
1614
1615   demand_empty_rest_of_line ();
1616
1617   /* XXX Now we come to the Thumb specific bit of code.  */
1618
1619   THUMB_SET_FUNC (symbolP, 1);
1620   ARM_SET_THUMB (symbolP, 1);
1621 #if defined OBJ_ELF || defined OBJ_COFF
1622   ARM_SET_INTERWORK (symbolP, support_interwork);
1623 #endif
1624 }
1625
1626 /* Directives: Mode selection.  */
1627
1628 /* .syntax [unified|divided] - choose the new unified syntax
1629    (same for Arm and Thumb encoding, modulo slight differences in what
1630    can be represented) or the old divergent syntax for each mode.  */
1631 static void
1632 s_syntax (int unused ATTRIBUTE_UNUSED)
1633 {
1634   char *name, delim;
1635
1636   name = input_line_pointer;
1637   delim = get_symbol_end ();
1638
1639   if (!strcasecmp (name, "unified"))
1640     unified_syntax = TRUE;
1641   else if (!strcasecmp (name, "divided"))
1642     unified_syntax = FALSE;
1643   else
1644     {
1645       as_bad (_("unrecognized syntax mode \"%s\""), name);
1646       return;
1647     }
1648   *input_line_pointer = delim;
1649   demand_empty_rest_of_line ();
1650 }
1651
1652 /* Directives: sectioning and alignment.  */
1653
1654 /* Same as s_align_ptwo but align 0 => align 2.  */
1655
1656 static void
1657 s_align (int unused ATTRIBUTE_UNUSED)
1658 {
1659   int temp;
1660   long temp_fill;
1661   long max_alignment = 15;
1662
1663   temp = get_absolute_expression ();
1664   if (temp > max_alignment)
1665     as_bad (_("alignment too large: %d assumed"), temp = max_alignment);
1666   else if (temp < 0)
1667     {
1668       as_bad (_("alignment negative. 0 assumed."));
1669       temp = 0;
1670     }
1671
1672   if (*input_line_pointer == ',')
1673     {
1674       input_line_pointer++;
1675       temp_fill = get_absolute_expression ();
1676     }
1677   else
1678     temp_fill = 0;
1679
1680   if (!temp)
1681     temp = 2;
1682
1683   /* Only make a frag if we HAVE to.  */
1684   if (temp && !need_pass_2)
1685     frag_align (temp, (int) temp_fill, 0);
1686   demand_empty_rest_of_line ();
1687
1688   record_alignment (now_seg, temp);
1689 }
1690
1691 static void
1692 s_bss (int ignore ATTRIBUTE_UNUSED)
1693 {
1694   /* We don't support putting frags in the BSS segment, we fake it by
1695      marking in_bss, then looking at s_skip for clues.  */
1696   subseg_set (bss_section, 0);
1697   demand_empty_rest_of_line ();
1698   mapping_state (MAP_DATA);
1699 }
1700
1701 static void
1702 s_even (int ignore ATTRIBUTE_UNUSED)
1703 {
1704   /* Never make frag if expect extra pass.  */
1705   if (!need_pass_2)
1706     frag_align (1, 0, 0);
1707
1708   record_alignment (now_seg, 1);
1709
1710   demand_empty_rest_of_line ();
1711 }
1712
1713 /* Directives: Literal pools.  */
1714
1715 static literal_pool *
1716 find_literal_pool (void)
1717 {
1718   literal_pool * pool;
1719
1720   for (pool = list_of_pools; pool != NULL; pool = pool->next)
1721     {
1722       if (pool->section == now_seg
1723           && pool->sub_section == now_subseg)
1724         break;
1725     }
1726
1727   return pool;
1728 }
1729
1730 static literal_pool *
1731 find_or_make_literal_pool (void)
1732 {
1733   /* Next literal pool ID number.  */
1734   static unsigned int latest_pool_num = 1;
1735   literal_pool *      pool;
1736
1737   pool = find_literal_pool ();
1738
1739   if (pool == NULL)
1740     {
1741       /* Create a new pool.  */
1742       pool = xmalloc (sizeof (* pool));
1743       if (! pool)
1744         return NULL;
1745
1746       pool->next_free_entry = 0;
1747       pool->section         = now_seg;
1748       pool->sub_section     = now_subseg;
1749       pool->next            = list_of_pools;
1750       pool->symbol          = NULL;
1751
1752       /* Add it to the list.  */
1753       list_of_pools = pool;
1754     }
1755
1756   /* New pools, and emptied pools, will have a NULL symbol.  */
1757   if (pool->symbol == NULL)
1758     {
1759       pool->symbol = symbol_create (FAKE_LABEL_NAME, undefined_section,
1760                                     (valueT) 0, &zero_address_frag);
1761       pool->id = latest_pool_num ++;
1762     }
1763
1764   /* Done.  */
1765   return pool;
1766 }
1767
1768 /* Add the literal in the global 'inst'
1769    structure to the relevent literal pool.  */
1770
1771 static int
1772 add_to_lit_pool (void)
1773 {
1774   literal_pool * pool;
1775   unsigned int entry;
1776
1777   pool = find_or_make_literal_pool ();
1778
1779   /* Check if this literal value is already in the pool.  */
1780   for (entry = 0; entry < pool->next_free_entry; entry ++)
1781     {
1782       if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
1783           && (inst.reloc.exp.X_op == O_constant)
1784           && (pool->literals[entry].X_add_number
1785               == inst.reloc.exp.X_add_number)
1786           && (pool->literals[entry].X_unsigned
1787               == inst.reloc.exp.X_unsigned))
1788         break;
1789
1790       if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
1791           && (inst.reloc.exp.X_op == O_symbol)
1792           && (pool->literals[entry].X_add_number
1793               == inst.reloc.exp.X_add_number)
1794           && (pool->literals[entry].X_add_symbol
1795               == inst.reloc.exp.X_add_symbol)
1796           && (pool->literals[entry].X_op_symbol
1797               == inst.reloc.exp.X_op_symbol))
1798         break;
1799     }
1800
1801   /* Do we need to create a new entry?  */
1802   if (entry == pool->next_free_entry)
1803     {
1804       if (entry >= MAX_LITERAL_POOL_SIZE)
1805         {
1806           inst.error = _("literal pool overflow");
1807           return FAIL;
1808         }
1809
1810       pool->literals[entry] = inst.reloc.exp;
1811       pool->next_free_entry += 1;
1812     }
1813
1814   inst.reloc.exp.X_op         = O_symbol;
1815   inst.reloc.exp.X_add_number = ((int) entry) * 4;
1816   inst.reloc.exp.X_add_symbol = pool->symbol;
1817
1818   return SUCCESS;
1819 }
1820
1821 /* Can't use symbol_new here, so have to create a symbol and then at
1822    a later date assign it a value. Thats what these functions do.  */
1823
1824 static void
1825 symbol_locate (symbolS *    symbolP,
1826                const char * name,       /* It is copied, the caller can modify.  */
1827                segT         segment,    /* Segment identifier (SEG_<something>).  */
1828                valueT       valu,       /* Symbol value.  */
1829                fragS *      frag)       /* Associated fragment.  */
1830 {
1831   unsigned int name_length;
1832   char * preserved_copy_of_name;
1833
1834   name_length = strlen (name) + 1;   /* +1 for \0.  */
1835   obstack_grow (&notes, name, name_length);
1836   preserved_copy_of_name = obstack_finish (&notes);
1837
1838 #ifdef tc_canonicalize_symbol_name
1839   preserved_copy_of_name =
1840     tc_canonicalize_symbol_name (preserved_copy_of_name);
1841 #endif
1842
1843   S_SET_NAME (symbolP, preserved_copy_of_name);
1844
1845   S_SET_SEGMENT (symbolP, segment);
1846   S_SET_VALUE (symbolP, valu);
1847   symbol_clear_list_pointers (symbolP);
1848
1849   symbol_set_frag (symbolP, frag);
1850
1851   /* Link to end of symbol chain.  */
1852   {
1853     extern int symbol_table_frozen;
1854
1855     if (symbol_table_frozen)
1856       abort ();
1857   }
1858
1859   symbol_append (symbolP, symbol_lastP, & symbol_rootP, & symbol_lastP);
1860
1861   obj_symbol_new_hook (symbolP);
1862
1863 #ifdef tc_symbol_new_hook
1864   tc_symbol_new_hook (symbolP);
1865 #endif
1866
1867 #ifdef DEBUG_SYMS
1868   verify_symbol_chain (symbol_rootP, symbol_lastP);
1869 #endif /* DEBUG_SYMS  */
1870 }
1871
1872
1873 static void
1874 s_ltorg (int ignored ATTRIBUTE_UNUSED)
1875 {
1876   unsigned int entry;
1877   literal_pool * pool;
1878   char sym_name[20];
1879
1880   pool = find_literal_pool ();
1881   if (pool == NULL
1882       || pool->symbol == NULL
1883       || pool->next_free_entry == 0)
1884     return;
1885
1886   mapping_state (MAP_DATA);
1887
1888   /* Align pool as you have word accesses.
1889      Only make a frag if we have to.  */
1890   if (!need_pass_2)
1891     frag_align (2, 0, 0);
1892
1893   record_alignment (now_seg, 2);
1894
1895   sprintf (sym_name, "$$lit_\002%x", pool->id);
1896
1897   symbol_locate (pool->symbol, sym_name, now_seg,
1898                  (valueT) frag_now_fix (), frag_now);
1899   symbol_table_insert (pool->symbol);
1900
1901   ARM_SET_THUMB (pool->symbol, thumb_mode);
1902
1903 #if defined OBJ_COFF || defined OBJ_ELF
1904   ARM_SET_INTERWORK (pool->symbol, support_interwork);
1905 #endif
1906
1907   for (entry = 0; entry < pool->next_free_entry; entry ++)
1908     /* First output the expression in the instruction to the pool.  */
1909     emit_expr (&(pool->literals[entry]), 4); /* .word  */
1910
1911   /* Mark the pool as empty.  */
1912   pool->next_free_entry = 0;
1913   pool->symbol = NULL;
1914 }
1915
1916 #ifdef OBJ_ELF
1917 /* Forward declarations for functions below, in the MD interface
1918    section.  */
1919 static void fix_new_arm (fragS *, int, short, expressionS *, int, int);
1920 static valueT create_unwind_entry (int);
1921 static void start_unwind_section (const segT, int);
1922 static void add_unwind_opcode (valueT, int);
1923 static void flush_pending_unwind (void);
1924
1925 /* Directives: Data.  */
1926
1927 static void
1928 s_arm_elf_cons (int nbytes)
1929 {
1930   expressionS exp;
1931
1932 #ifdef md_flush_pending_output
1933   md_flush_pending_output ();
1934 #endif
1935
1936   if (is_it_end_of_statement ())
1937     {
1938       demand_empty_rest_of_line ();
1939       return;
1940     }
1941
1942 #ifdef md_cons_align
1943   md_cons_align (nbytes);
1944 #endif
1945
1946   mapping_state (MAP_DATA);
1947   do
1948     {
1949       int reloc;
1950       char *base = input_line_pointer;
1951
1952       expression (& exp);
1953
1954       if (exp.X_op != O_symbol)
1955         emit_expr (&exp, (unsigned int) nbytes);
1956       else
1957         {
1958           char *before_reloc = input_line_pointer;
1959           reloc = parse_reloc (&input_line_pointer);
1960           if (reloc == -1)
1961             {
1962               as_bad (_("unrecognized relocation suffix"));
1963               ignore_rest_of_line ();
1964               return;
1965             }
1966           else if (reloc == BFD_RELOC_UNUSED)
1967             emit_expr (&exp, (unsigned int) nbytes);
1968           else
1969             {
1970               reloc_howto_type *howto = bfd_reloc_type_lookup (stdoutput, reloc);
1971               int size = bfd_get_reloc_size (howto);
1972
1973               if (reloc == BFD_RELOC_ARM_PLT32)
1974                 {
1975                   as_bad (_("(plt) is only valid on branch targets"));
1976                   reloc = BFD_RELOC_UNUSED;
1977                   size = 0;
1978                 }
1979
1980               if (size > nbytes)
1981                 as_bad (_("%s relocations do not fit in %d bytes"),
1982                         howto->name, nbytes);
1983               else
1984                 {
1985                   /* We've parsed an expression stopping at O_symbol.
1986                      But there may be more expression left now that we
1987                      have parsed the relocation marker.  Parse it again.
1988                      XXX Surely there is a cleaner way to do this.  */
1989                   char *p = input_line_pointer;
1990                   int offset;
1991                   char *save_buf = alloca (input_line_pointer - base);
1992                   memcpy (save_buf, base, input_line_pointer - base);
1993                   memmove (base + (input_line_pointer - before_reloc),
1994                            base, before_reloc - base);
1995
1996                   input_line_pointer = base + (input_line_pointer-before_reloc);
1997                   expression (&exp);
1998                   memcpy (base, save_buf, p - base);
1999
2000                   offset = nbytes - size;
2001                   p = frag_more ((int) nbytes);
2002                   fix_new_exp (frag_now, p - frag_now->fr_literal + offset,
2003                                size, &exp, 0, reloc);
2004                 }
2005             }
2006         }
2007     }
2008   while (*input_line_pointer++ == ',');
2009
2010   /* Put terminator back into stream.  */
2011   input_line_pointer --;
2012   demand_empty_rest_of_line ();
2013 }
2014
2015
2016 /* Parse a .rel31 directive.  */
2017
2018 static void
2019 s_arm_rel31 (int ignored ATTRIBUTE_UNUSED)
2020 {
2021   expressionS exp;
2022   char *p;
2023   valueT highbit;
2024
2025   highbit = 0;
2026   if (*input_line_pointer == '1')
2027     highbit = 0x80000000;
2028   else if (*input_line_pointer != '0')
2029     as_bad (_("expected 0 or 1"));
2030
2031   input_line_pointer++;
2032   if (*input_line_pointer != ',')
2033     as_bad (_("missing comma"));
2034   input_line_pointer++;
2035
2036 #ifdef md_flush_pending_output
2037   md_flush_pending_output ();
2038 #endif
2039
2040 #ifdef md_cons_align
2041   md_cons_align (4);
2042 #endif
2043
2044   mapping_state (MAP_DATA);
2045
2046   expression (&exp);
2047
2048   p = frag_more (4);
2049   md_number_to_chars (p, highbit, 4);
2050   fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 1,
2051                BFD_RELOC_ARM_PREL31);
2052
2053   demand_empty_rest_of_line ();
2054 }
2055
2056 /* Directives: AEABI stack-unwind tables.  */
2057
2058 /* Parse an unwind_fnstart directive.  Simply records the current location.  */
2059
2060 static void
2061 s_arm_unwind_fnstart (int ignored ATTRIBUTE_UNUSED)
2062 {
2063   demand_empty_rest_of_line ();
2064   /* Mark the start of the function.  */
2065   unwind.proc_start = expr_build_dot ();
2066
2067   /* Reset the rest of the unwind info.  */
2068   unwind.opcode_count = 0;
2069   unwind.table_entry = NULL;
2070   unwind.personality_routine = NULL;
2071   unwind.personality_index = -1;
2072   unwind.frame_size = 0;
2073   unwind.fp_offset = 0;
2074   unwind.fp_reg = 13;
2075   unwind.fp_used = 0;
2076   unwind.sp_restored = 0;
2077 }
2078
2079
2080 /* Parse a handlerdata directive.  Creates the exception handling table entry
2081    for the function.  */
2082
2083 static void
2084 s_arm_unwind_handlerdata (int ignored ATTRIBUTE_UNUSED)
2085 {
2086   demand_empty_rest_of_line ();
2087   if (unwind.table_entry)
2088     as_bad (_("dupicate .handlerdata directive"));
2089
2090   create_unwind_entry (1);
2091 }
2092
2093 /* Parse an unwind_fnend directive.  Generates the index table entry.  */
2094
2095 static void
2096 s_arm_unwind_fnend (int ignored ATTRIBUTE_UNUSED)
2097 {
2098   long where;
2099   char *ptr;
2100   valueT val;
2101
2102   demand_empty_rest_of_line ();
2103
2104   /* Add eh table entry.  */
2105   if (unwind.table_entry == NULL)
2106     val = create_unwind_entry (0);
2107   else
2108     val = 0;
2109
2110   /* Add index table entry.  This is two words.  */
2111   start_unwind_section (unwind.saved_seg, 1);
2112   frag_align (2, 0, 0);
2113   record_alignment (now_seg, 2);
2114
2115   ptr = frag_more (8);
2116   where = frag_now_fix () - 8;
2117
2118   /* Self relative offset of the function start.  */
2119   fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
2120            BFD_RELOC_ARM_PREL31);
2121
2122   /* Indicate dependency on EHABI-defined personality routines to the
2123      linker, if it hasn't been done already.  */
2124   if (unwind.personality_index >= 0 && unwind.personality_index < 3
2125       && !(marked_pr_dependency & (1 << unwind.personality_index)))
2126     {
2127       static const char *const name[] = {
2128         "__aeabi_unwind_cpp_pr0",
2129         "__aeabi_unwind_cpp_pr1",
2130         "__aeabi_unwind_cpp_pr2"
2131       };
2132       symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
2133       fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
2134       marked_pr_dependency |= 1 << unwind.personality_index;
2135       seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
2136         = marked_pr_dependency;
2137     }
2138
2139   if (val)
2140     /* Inline exception table entry.  */
2141     md_number_to_chars (ptr + 4, val, 4);
2142   else
2143     /* Self relative offset of the table entry.  */
2144     fix_new (frag_now, where + 4, 4, unwind.table_entry, 0, 1,
2145              BFD_RELOC_ARM_PREL31);
2146
2147   /* Restore the original section.  */
2148   subseg_set (unwind.saved_seg, unwind.saved_subseg);
2149 }
2150
2151
2152 /* Parse an unwind_cantunwind directive.  */
2153
2154 static void
2155 s_arm_unwind_cantunwind (int ignored ATTRIBUTE_UNUSED)
2156 {
2157   demand_empty_rest_of_line ();
2158   if (unwind.personality_routine || unwind.personality_index != -1)
2159     as_bad (_("personality routine specified for cantunwind frame"));
2160
2161   unwind.personality_index = -2;
2162 }
2163
2164
2165 /* Parse a personalityindex directive.  */
2166
2167 static void
2168 s_arm_unwind_personalityindex (int ignored ATTRIBUTE_UNUSED)
2169 {
2170   expressionS exp;
2171
2172   if (unwind.personality_routine || unwind.personality_index != -1)
2173     as_bad (_("duplicate .personalityindex directive"));
2174
2175   expression (&exp);
2176
2177   if (exp.X_op != O_constant
2178       || exp.X_add_number < 0 || exp.X_add_number > 15)
2179     {
2180       as_bad (_("bad personality routine number"));
2181       ignore_rest_of_line ();
2182       return;
2183     }
2184
2185   unwind.personality_index = exp.X_add_number;
2186
2187   demand_empty_rest_of_line ();
2188 }
2189
2190
2191 /* Parse a personality directive.  */
2192
2193 static void
2194 s_arm_unwind_personality (int ignored ATTRIBUTE_UNUSED)
2195 {
2196   char *name, *p, c;
2197
2198   if (unwind.personality_routine || unwind.personality_index != -1)
2199     as_bad (_("duplicate .personality directive"));
2200
2201   name = input_line_pointer;
2202   c = get_symbol_end ();
2203   p = input_line_pointer;
2204   unwind.personality_routine = symbol_find_or_make (name);
2205   *p = c;
2206   demand_empty_rest_of_line ();
2207 }
2208
2209
2210 /* Parse a directive saving core registers.  */
2211
2212 static void
2213 s_arm_unwind_save_core (void)
2214 {
2215   valueT op;
2216   long range;
2217   int n;
2218
2219   range = parse_reg_list (&input_line_pointer);
2220   if (range == FAIL)
2221     {
2222       as_bad (_("expected register list"));
2223       ignore_rest_of_line ();
2224       return;
2225     }
2226
2227   demand_empty_rest_of_line ();
2228
2229   /* Turn .unwind_movsp ip followed by .unwind_save {..., ip, ...}
2230      into .unwind_save {..., sp...}.  We aren't bothered about the value of
2231      ip because it is clobbered by calls.  */
2232   if (unwind.sp_restored && unwind.fp_reg == 12
2233       && (range & 0x3000) == 0x1000)
2234     {
2235       unwind.opcode_count--;
2236       unwind.sp_restored = 0;
2237       range = (range | 0x2000) & ~0x1000;
2238       unwind.pending_offset = 0;
2239     }
2240
2241   /* See if we can use the short opcodes.  These pop a block of upto 8
2242      registers starting with r4, plus maybe r14.  */
2243   for (n = 0; n < 8; n++)
2244     {
2245       /* Break at the first non-saved register.  */
2246       if ((range & (1 << (n + 4))) == 0)
2247         break;
2248     }
2249   /* See if there are any other bits set.  */
2250   if (n == 0 || (range & (0xfff0 << n) & 0xbff0) != 0)
2251     {
2252       /* Use the long form.  */
2253       op = 0x8000 | ((range >> 4) & 0xfff);
2254       add_unwind_opcode (op, 2);
2255     }
2256   else
2257     {
2258       /* Use the short form.  */
2259       if (range & 0x4000)
2260         op = 0xa8; /* Pop r14.  */
2261       else
2262         op = 0xa0; /* Do not pop r14.  */
2263       op |= (n - 1);
2264       add_unwind_opcode (op, 1);
2265     }
2266
2267   /* Pop r0-r3.  */
2268   if (range & 0xf)
2269     {
2270       op = 0xb100 | (range & 0xf);
2271       add_unwind_opcode (op, 2);
2272     }
2273
2274   /* Record the number of bytes pushed.  */
2275   for (n = 0; n < 16; n++)
2276     {
2277       if (range & (1 << n))
2278         unwind.frame_size += 4;
2279     }
2280 }
2281
2282
2283 /* Parse a directive saving FPA registers.  */
2284
2285 static void
2286 s_arm_unwind_save_fpa (int reg)
2287 {
2288   expressionS exp;
2289   int num_regs;
2290   valueT op;
2291
2292   /* Get Number of registers to transfer.  */
2293   if (skip_past_comma (&input_line_pointer) != FAIL)
2294     expression (&exp);
2295   else
2296     exp.X_op = O_illegal;
2297
2298   if (exp.X_op != O_constant)
2299     {
2300       as_bad (_("expected , <constant>"));
2301       ignore_rest_of_line ();
2302       return;
2303     }
2304
2305   num_regs = exp.X_add_number;
2306
2307   if (num_regs < 1 || num_regs > 4)
2308     {
2309       as_bad (_("number of registers must be in the range [1:4]"));
2310       ignore_rest_of_line ();
2311       return;
2312     }
2313
2314   demand_empty_rest_of_line ();
2315
2316   if (reg == 4)
2317     {
2318       /* Short form.  */
2319       op = 0xb4 | (num_regs - 1);
2320       add_unwind_opcode (op, 1);
2321     }
2322   else
2323     {
2324       /* Long form.  */
2325       op = 0xc800 | (reg << 4) | (num_regs - 1);
2326       add_unwind_opcode (op, 2);
2327     }
2328   unwind.frame_size += num_regs * 12;
2329 }
2330
2331
2332 /* Parse a directive saving VFP registers.  */
2333
2334 static void
2335 s_arm_unwind_save_vfp (void)
2336 {
2337   int count;
2338   unsigned int reg;
2339   valueT op;
2340
2341   count = parse_vfp_reg_list (&input_line_pointer, &reg, 1);
2342   if (count == FAIL)
2343     {
2344       as_bad (_("expected register list"));
2345       ignore_rest_of_line ();
2346       return;
2347     }
2348
2349   demand_empty_rest_of_line ();
2350
2351   if (reg == 8)
2352     {
2353       /* Short form.  */
2354       op = 0xb8 | (count - 1);
2355       add_unwind_opcode (op, 1);
2356     }
2357   else
2358     {
2359       /* Long form.  */
2360       op = 0xb300 | (reg << 4) | (count - 1);
2361       add_unwind_opcode (op, 2);
2362     }
2363   unwind.frame_size += count * 8 + 4;
2364 }
2365
2366
2367 /* Parse a directive saving iWMMXt data registers.  */
2368
2369 static void
2370 s_arm_unwind_save_mmxwr (void)
2371 {
2372   int reg;
2373   int hi_reg;
2374   int i;
2375   unsigned mask = 0;
2376   valueT op;
2377
2378   if (*input_line_pointer == '{')
2379     input_line_pointer++;
2380
2381   do
2382     {
2383       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
2384
2385       if (reg == FAIL)
2386         {
2387           as_bad (_(reg_expected_msgs[REG_TYPE_MMXWR]));
2388           goto error;
2389         }
2390
2391       if (mask >> reg)
2392         as_tsktsk (_("register list not in ascending order"));
2393       mask |= 1 << reg;
2394
2395       if (*input_line_pointer == '-')
2396         {
2397           input_line_pointer++;
2398           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
2399           if (hi_reg == FAIL)
2400             {
2401               as_bad (_(reg_expected_msgs[REG_TYPE_MMXWR]));
2402               goto error;
2403             }
2404           else if (reg >= hi_reg)
2405             {
2406               as_bad (_("bad register range"));
2407               goto error;
2408             }
2409           for (; reg < hi_reg; reg++)
2410             mask |= 1 << reg;
2411         }
2412     }
2413   while (skip_past_comma (&input_line_pointer) != FAIL);
2414
2415   if (*input_line_pointer == '}')
2416     input_line_pointer++;
2417
2418   demand_empty_rest_of_line ();
2419
2420   /* Generate any deferred opcodes becuuse we're going to be looking at
2421      the list.  */
2422   flush_pending_unwind ();
2423
2424   for (i = 0; i < 16; i++)
2425     {
2426       if (mask & (1 << i))
2427         unwind.frame_size += 8;
2428     }
2429
2430   /* Attempt to combine with a previous opcode.  We do this because gcc
2431      likes to output separate unwind directives for a single block of
2432      registers.  */
2433   if (unwind.opcode_count > 0)
2434     {
2435       i = unwind.opcodes[unwind.opcode_count - 1];
2436       if ((i & 0xf8) == 0xc0)
2437         {
2438           i &= 7;
2439           /* Only merge if the blocks are contiguous.  */
2440           if (i < 6)
2441             {
2442               if ((mask & 0xfe00) == (1 << 9))
2443                 {
2444                   mask |= ((1 << (i + 11)) - 1) & 0xfc00;
2445                   unwind.opcode_count--;
2446                 }
2447             }
2448           else if (i == 6 && unwind.opcode_count >= 2)
2449             {
2450               i = unwind.opcodes[unwind.opcode_count - 2];
2451               reg = i >> 4;
2452               i &= 0xf;
2453
2454               op = 0xffff << (reg - 1);
2455               if (reg > 0
2456                   || ((mask & op) == (1u << (reg - 1))))
2457                 {
2458                   op = (1 << (reg + i + 1)) - 1;
2459                   op &= ~((1 << reg) - 1);
2460                   mask |= op;
2461                   unwind.opcode_count -= 2;
2462                 }
2463             }
2464         }
2465     }
2466
2467   hi_reg = 15;
2468   /* We want to generate opcodes in the order the registers have been
2469      saved, ie. descending order.  */
2470   for (reg = 15; reg >= -1; reg--)
2471     {
2472       /* Save registers in blocks.  */
2473       if (reg < 0
2474           || !(mask & (1 << reg)))
2475         {
2476           /* We found an unsaved reg.  Generate opcodes to save the
2477              preceeding block.  */
2478           if (reg != hi_reg)
2479             {
2480               if (reg == 9)
2481                 {
2482                   /* Short form.  */
2483                   op = 0xc0 | (hi_reg - 10);
2484                   add_unwind_opcode (op, 1);
2485                 }
2486               else
2487                 {
2488                   /* Long form.  */
2489                   op = 0xc600 | ((reg + 1) << 4) | ((hi_reg - reg) - 1);
2490                   add_unwind_opcode (op, 2);
2491                 }
2492             }
2493           hi_reg = reg - 1;
2494         }
2495     }
2496
2497   return;
2498 error:
2499   ignore_rest_of_line ();
2500 }
2501
2502 static void
2503 s_arm_unwind_save_mmxwcg (void)
2504 {
2505   int reg;
2506   int hi_reg;
2507   unsigned mask = 0;
2508   valueT op;
2509
2510   if (*input_line_pointer == '{')
2511     input_line_pointer++;
2512
2513   do
2514     {
2515       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
2516
2517       if (reg == FAIL)
2518         {
2519           as_bad (_(reg_expected_msgs[REG_TYPE_MMXWCG]));
2520           goto error;
2521         }
2522
2523       reg -= 8;
2524       if (mask >> reg)
2525         as_tsktsk (_("register list not in ascending order"));
2526       mask |= 1 << reg;
2527
2528       if (*input_line_pointer == '-')
2529         {
2530           input_line_pointer++;
2531           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
2532           if (hi_reg == FAIL)
2533             {
2534               as_bad (_(reg_expected_msgs[REG_TYPE_MMXWCG]));
2535               goto error;
2536             }
2537           else if (reg >= hi_reg)
2538             {
2539               as_bad (_("bad register range"));
2540               goto error;
2541             }
2542           for (; reg < hi_reg; reg++)
2543             mask |= 1 << reg;
2544         }
2545     }
2546   while (skip_past_comma (&input_line_pointer) != FAIL);
2547
2548   if (*input_line_pointer == '}')
2549     input_line_pointer++;
2550
2551   demand_empty_rest_of_line ();
2552
2553   /* Generate any deferred opcodes becuuse we're going to be looking at
2554      the list.  */
2555   flush_pending_unwind ();
2556
2557   for (reg = 0; reg < 16; reg++)
2558     {
2559       if (mask & (1 << reg))
2560         unwind.frame_size += 4;
2561     }
2562   op = 0xc700 | mask;
2563   add_unwind_opcode (op, 2);
2564   return;
2565 error:
2566   ignore_rest_of_line ();
2567 }
2568
2569
2570 /* Parse an unwind_save directive.  */
2571
2572 static void
2573 s_arm_unwind_save (int ignored ATTRIBUTE_UNUSED)
2574 {
2575   char *peek;
2576   struct reg_entry *reg;
2577   bfd_boolean had_brace = FALSE;
2578
2579   /* Figure out what sort of save we have.  */
2580   peek = input_line_pointer;
2581
2582   if (*peek == '{')
2583     {
2584       had_brace = TRUE;
2585       peek++;
2586     }
2587
2588   reg = arm_reg_parse_multi (&peek);
2589
2590   if (!reg)
2591     {
2592       as_bad (_("register expected"));
2593       ignore_rest_of_line ();
2594       return;
2595     }
2596
2597   switch (reg->type)
2598     {
2599     case REG_TYPE_FN:
2600       if (had_brace)
2601         {
2602           as_bad (_("FPA .unwind_save does not take a register list"));
2603           ignore_rest_of_line ();
2604           return;
2605         }
2606       s_arm_unwind_save_fpa (reg->number);
2607       return;
2608
2609     case REG_TYPE_RN:     s_arm_unwind_save_core ();   return;
2610     case REG_TYPE_VFD:     s_arm_unwind_save_vfp ();    return;
2611     case REG_TYPE_MMXWR:  s_arm_unwind_save_mmxwr ();  return;
2612     case REG_TYPE_MMXWCG: s_arm_unwind_save_mmxwcg (); return;
2613
2614     default:
2615       as_bad (_(".unwind_save does not support this kind of register"));
2616       ignore_rest_of_line ();
2617     }
2618 }
2619
2620
2621 /* Parse an unwind_movsp directive.  */
2622
2623 static void
2624 s_arm_unwind_movsp (int ignored ATTRIBUTE_UNUSED)
2625 {
2626   int reg;
2627   valueT op;
2628
2629   reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
2630   if (reg == FAIL)
2631     {
2632       as_bad (_(reg_expected_msgs[REG_TYPE_RN]));
2633       ignore_rest_of_line ();
2634       return;
2635     }
2636   demand_empty_rest_of_line ();
2637
2638   if (reg == REG_SP || reg == REG_PC)
2639     {
2640       as_bad (_("SP and PC not permitted in .unwind_movsp directive"));
2641       return;
2642     }
2643
2644   if (unwind.fp_reg != REG_SP)
2645     as_bad (_("unexpected .unwind_movsp directive"));
2646
2647   /* Generate opcode to restore the value.  */
2648   op = 0x90 | reg;
2649   add_unwind_opcode (op, 1);
2650
2651   /* Record the information for later.  */
2652   unwind.fp_reg = reg;
2653   unwind.fp_offset = unwind.frame_size;
2654   unwind.sp_restored = 1;
2655 }
2656
2657 /* Parse an unwind_pad directive.  */
2658
2659 static void
2660 s_arm_unwind_pad (int ignored ATTRIBUTE_UNUSED)
2661 {
2662   int offset;
2663
2664   if (immediate_for_directive (&offset) == FAIL)
2665     return;
2666
2667   if (offset & 3)
2668     {
2669       as_bad (_("stack increment must be multiple of 4"));
2670       ignore_rest_of_line ();
2671       return;
2672     }
2673
2674   /* Don't generate any opcodes, just record the details for later.  */
2675   unwind.frame_size += offset;
2676   unwind.pending_offset += offset;
2677
2678   demand_empty_rest_of_line ();
2679 }
2680
2681 /* Parse an unwind_setfp directive.  */
2682
2683 static void
2684 s_arm_unwind_setfp (int ignored ATTRIBUTE_UNUSED)
2685 {
2686   int sp_reg;
2687   int fp_reg;
2688   int offset;
2689
2690   fp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
2691   if (skip_past_comma (&input_line_pointer) == FAIL)
2692     sp_reg = FAIL;
2693   else
2694     sp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
2695
2696   if (fp_reg == FAIL || sp_reg == FAIL)
2697     {
2698       as_bad (_("expected <reg>, <reg>"));
2699       ignore_rest_of_line ();
2700       return;
2701     }
2702
2703   /* Optional constant.  */
2704   if (skip_past_comma (&input_line_pointer) != FAIL)
2705     {
2706       if (immediate_for_directive (&offset) == FAIL)
2707         return;
2708     }
2709   else
2710     offset = 0;
2711
2712   demand_empty_rest_of_line ();
2713
2714   if (sp_reg != 13 && sp_reg != unwind.fp_reg)
2715     {
2716       as_bad (_("register must be either sp or set by a previous"
2717                 "unwind_movsp directive"));
2718       return;
2719     }
2720
2721   /* Don't generate any opcodes, just record the information for later.  */
2722   unwind.fp_reg = fp_reg;
2723   unwind.fp_used = 1;
2724   if (sp_reg == 13)
2725     unwind.fp_offset = unwind.frame_size - offset;
2726   else
2727     unwind.fp_offset -= offset;
2728 }
2729
2730 /* Parse an unwind_raw directive.  */
2731
2732 static void
2733 s_arm_unwind_raw (int ignored ATTRIBUTE_UNUSED)
2734 {
2735   expressionS exp;
2736   /* This is an arbitary limit.  */
2737   unsigned char op[16];
2738   int count;
2739
2740   expression (&exp);
2741   if (exp.X_op == O_constant
2742       && skip_past_comma (&input_line_pointer) != FAIL)
2743     {
2744       unwind.frame_size += exp.X_add_number;
2745       expression (&exp);
2746     }
2747   else
2748     exp.X_op = O_illegal;
2749
2750   if (exp.X_op != O_constant)
2751     {
2752       as_bad (_("expected <offset>, <opcode>"));
2753       ignore_rest_of_line ();
2754       return;
2755     }
2756
2757   count = 0;
2758
2759   /* Parse the opcode.  */
2760   for (;;)
2761     {
2762       if (count >= 16)
2763         {
2764           as_bad (_("unwind opcode too long"));
2765           ignore_rest_of_line ();
2766         }
2767       if (exp.X_op != O_constant || exp.X_add_number & ~0xff)
2768         {
2769           as_bad (_("invalid unwind opcode"));
2770           ignore_rest_of_line ();
2771           return;
2772         }
2773       op[count++] = exp.X_add_number;
2774
2775       /* Parse the next byte.  */
2776       if (skip_past_comma (&input_line_pointer) == FAIL)
2777         break;
2778
2779       expression (&exp);
2780     }
2781
2782   /* Add the opcode bytes in reverse order.  */
2783   while (count--)
2784     add_unwind_opcode (op[count], 1);
2785
2786   demand_empty_rest_of_line ();
2787 }
2788 #endif /* OBJ_ELF */
2789
2790 /* This table describes all the machine specific pseudo-ops the assembler
2791    has to support.  The fields are:
2792      pseudo-op name without dot
2793      function to call to execute this pseudo-op
2794      Integer arg to pass to the function.  */
2795
2796 const pseudo_typeS md_pseudo_table[] =
2797 {
2798   /* Never called because '.req' does not start a line.  */
2799   { "req",         s_req,         0 },
2800   { "unreq",       s_unreq,       0 },
2801   { "bss",         s_bss,         0 },
2802   { "align",       s_align,       0 },
2803   { "arm",         s_arm,         0 },
2804   { "thumb",       s_thumb,       0 },
2805   { "code",        s_code,        0 },
2806   { "force_thumb", s_force_thumb, 0 },
2807   { "thumb_func",  s_thumb_func,  0 },
2808   { "thumb_set",   s_thumb_set,   0 },
2809   { "even",        s_even,        0 },
2810   { "ltorg",       s_ltorg,       0 },
2811   { "pool",        s_ltorg,       0 },
2812   { "syntax",      s_syntax,      0 },
2813 #ifdef OBJ_ELF
2814   { "word",        s_arm_elf_cons, 4 },
2815   { "long",        s_arm_elf_cons, 4 },
2816   { "rel31",       s_arm_rel31,   0 },
2817   { "fnstart",          s_arm_unwind_fnstart,   0 },
2818   { "fnend",            s_arm_unwind_fnend,     0 },
2819   { "cantunwind",       s_arm_unwind_cantunwind, 0 },
2820   { "personality",      s_arm_unwind_personality, 0 },
2821   { "personalityindex", s_arm_unwind_personalityindex, 0 },
2822   { "handlerdata",      s_arm_unwind_handlerdata, 0 },
2823   { "save",             s_arm_unwind_save,      0 },
2824   { "movsp",            s_arm_unwind_movsp,     0 },
2825   { "pad",              s_arm_unwind_pad,       0 },
2826   { "setfp",            s_arm_unwind_setfp,     0 },
2827   { "unwind_raw",       s_arm_unwind_raw,       0 },
2828 #else
2829   { "word",        cons, 4},
2830 #endif
2831   { "extend",      float_cons, 'x' },
2832   { "ldouble",     float_cons, 'x' },
2833   { "packed",      float_cons, 'p' },
2834   { 0, 0, 0 }
2835 };
2836 \f
2837 /* Parser functions used exclusively in instruction operands.  */
2838
2839 /* Generic immediate-value read function for use in insn parsing.
2840    STR points to the beginning of the immediate (the leading #);
2841    VAL receives the value; if the value is outside [MIN, MAX]
2842    issue an error.  PREFIX_OPT is true if the immediate prefix is
2843    optional.  */
2844
2845 static int
2846 parse_immediate (char **str, int *val, int min, int max,
2847                  bfd_boolean prefix_opt)
2848 {
2849   expressionS exp;
2850   my_get_expression (&exp, str, prefix_opt ? GE_OPT_PREFIX : GE_IMM_PREFIX);
2851   if (exp.X_op != O_constant)
2852     {
2853       inst.error = _("constant expression required");
2854       return FAIL;
2855     }
2856
2857   if (exp.X_add_number < min || exp.X_add_number > max)
2858     {
2859       inst.error = _("immediate value out of range");
2860       return FAIL;
2861     }
2862
2863   *val = exp.X_add_number;
2864   return SUCCESS;
2865 }
2866
2867 /* Returns the pseudo-register number of an FPA immediate constant,
2868    or FAIL if there isn't a valid constant here.  */
2869
2870 static int
2871 parse_fpa_immediate (char ** str)
2872 {
2873   LITTLENUM_TYPE words[MAX_LITTLENUMS];
2874   char *         save_in;
2875   expressionS    exp;
2876   int            i;
2877   int            j;
2878
2879   /* First try and match exact strings, this is to guarantee
2880      that some formats will work even for cross assembly.  */
2881
2882   for (i = 0; fp_const[i]; i++)
2883     {
2884       if (strncmp (*str, fp_const[i], strlen (fp_const[i])) == 0)
2885         {
2886           char *start = *str;
2887
2888           *str += strlen (fp_const[i]);
2889           if (is_end_of_line[(unsigned char) **str])
2890             return i + 8;
2891           *str = start;
2892         }
2893     }
2894
2895   /* Just because we didn't get a match doesn't mean that the constant
2896      isn't valid, just that it is in a format that we don't
2897      automatically recognize.  Try parsing it with the standard
2898      expression routines.  */
2899
2900   memset (words, 0, MAX_LITTLENUMS * sizeof (LITTLENUM_TYPE));
2901
2902   /* Look for a raw floating point number.  */
2903   if ((save_in = atof_ieee (*str, 'x', words)) != NULL
2904       && is_end_of_line[(unsigned char) *save_in])
2905     {
2906       for (i = 0; i < NUM_FLOAT_VALS; i++)
2907         {
2908           for (j = 0; j < MAX_LITTLENUMS; j++)
2909             {
2910               if (words[j] != fp_values[i][j])
2911                 break;
2912             }
2913
2914           if (j == MAX_LITTLENUMS)
2915             {
2916               *str = save_in;
2917               return i + 8;
2918             }
2919         }
2920     }
2921
2922   /* Try and parse a more complex expression, this will probably fail
2923      unless the code uses a floating point prefix (eg "0f").  */
2924   save_in = input_line_pointer;
2925   input_line_pointer = *str;
2926   if (expression (&exp) == absolute_section
2927       && exp.X_op == O_big
2928       && exp.X_add_number < 0)
2929     {
2930       /* FIXME: 5 = X_PRECISION, should be #define'd where we can use it.
2931          Ditto for 15.  */
2932       if (gen_to_words (words, 5, (long) 15) == 0)
2933         {
2934           for (i = 0; i < NUM_FLOAT_VALS; i++)
2935             {
2936               for (j = 0; j < MAX_LITTLENUMS; j++)
2937                 {
2938                   if (words[j] != fp_values[i][j])
2939                     break;
2940                 }
2941
2942               if (j == MAX_LITTLENUMS)
2943                 {
2944                   *str = input_line_pointer;
2945                   input_line_pointer = save_in;
2946                   return i + 8;
2947                 }
2948             }
2949         }
2950     }
2951
2952   *str = input_line_pointer;
2953   input_line_pointer = save_in;
2954   inst.error = _("invalid FPA immediate expression");
2955   return FAIL;
2956 }
2957
2958 /* Shift operands.  */
2959 enum shift_kind
2960 {
2961   SHIFT_LSL, SHIFT_LSR, SHIFT_ASR, SHIFT_ROR, SHIFT_RRX
2962 };
2963
2964 struct asm_shift_name
2965 {
2966   const char      *name;
2967   enum shift_kind  kind;
2968 };
2969
2970 /* Third argument to parse_shift.  */
2971 enum parse_shift_mode
2972 {
2973   NO_SHIFT_RESTRICT,            /* Any kind of shift is accepted.  */
2974   SHIFT_IMMEDIATE,              /* Shift operand must be an immediate.  */
2975   SHIFT_LSL_OR_ASR_IMMEDIATE,   /* Shift must be LSL or ASR immediate.  */
2976   SHIFT_ASR_IMMEDIATE,          /* Shift must be ASR immediate.  */
2977   SHIFT_LSL_IMMEDIATE,          /* Shift must be LSL immediate.  */
2978 };
2979
2980 /* Parse a <shift> specifier on an ARM data processing instruction.
2981    This has three forms:
2982
2983      (LSL|LSR|ASL|ASR|ROR) Rs
2984      (LSL|LSR|ASL|ASR|ROR) #imm
2985      RRX
2986
2987    Note that ASL is assimilated to LSL in the instruction encoding, and
2988    RRX to ROR #0 (which cannot be written as such).  */
2989
2990 static int
2991 parse_shift (char **str, int i, enum parse_shift_mode mode)
2992 {
2993   const struct asm_shift_name *shift_name;
2994   enum shift_kind shift;
2995   char *s = *str;
2996   char *p = s;
2997   int reg;
2998
2999   for (p = *str; ISALPHA (*p); p++)
3000     ;
3001
3002   if (p == *str)
3003     {
3004       inst.error = _("shift expression expected");
3005       return FAIL;
3006     }
3007
3008   shift_name = hash_find_n (arm_shift_hsh, *str, p - *str);
3009
3010   if (shift_name == NULL)
3011     {
3012       inst.error = _("shift expression expected");
3013       return FAIL;
3014     }
3015
3016   shift = shift_name->kind;
3017
3018   switch (mode)
3019     {
3020     case NO_SHIFT_RESTRICT:
3021     case SHIFT_IMMEDIATE:   break;
3022
3023     case SHIFT_LSL_OR_ASR_IMMEDIATE:
3024       if (shift != SHIFT_LSL && shift != SHIFT_ASR)
3025         {
3026           inst.error = _("'LSL' or 'ASR' required");
3027           return FAIL;
3028         }
3029       break;
3030
3031     case SHIFT_LSL_IMMEDIATE:
3032       if (shift != SHIFT_LSL)
3033         {
3034           inst.error = _("'LSL' required");
3035           return FAIL;
3036         }
3037       break;
3038
3039     case SHIFT_ASR_IMMEDIATE:
3040       if (shift != SHIFT_ASR)
3041         {
3042           inst.error = _("'ASR' required");
3043           return FAIL;
3044         }
3045       break;
3046
3047     default: abort ();
3048     }
3049
3050   if (shift != SHIFT_RRX)
3051     {
3052       /* Whitespace can appear here if the next thing is a bare digit.  */
3053       skip_whitespace (p);
3054
3055       if (mode == NO_SHIFT_RESTRICT
3056           && (reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
3057         {
3058           inst.operands[i].imm = reg;
3059           inst.operands[i].immisreg = 1;
3060         }
3061       else if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
3062         return FAIL;
3063     }
3064   inst.operands[i].shift_kind = shift;
3065   inst.operands[i].shifted = 1;
3066   *str = p;
3067   return SUCCESS;
3068 }
3069
3070 /* Parse a <shifter_operand> for an ARM data processing instruction:
3071
3072       #<immediate>
3073       #<immediate>, <rotate>
3074       <Rm>
3075       <Rm>, <shift>
3076
3077    where <shift> is defined by parse_shift above, and <rotate> is a
3078    multiple of 2 between 0 and 30.  Validation of immediate operands
3079    is deferred to md_apply_fix.  */
3080
3081 static int
3082 parse_shifter_operand (char **str, int i)
3083 {
3084   int value;
3085   expressionS expr;
3086
3087   if ((value = arm_reg_parse (str, REG_TYPE_RN)) != FAIL)
3088     {
3089       inst.operands[i].reg = value;
3090       inst.operands[i].isreg = 1;
3091
3092       /* parse_shift will override this if appropriate */
3093       inst.reloc.exp.X_op = O_constant;
3094       inst.reloc.exp.X_add_number = 0;
3095
3096       if (skip_past_comma (str) == FAIL)
3097         return SUCCESS;
3098
3099       /* Shift operation on register.  */
3100       return parse_shift (str, i, NO_SHIFT_RESTRICT);
3101     }
3102
3103   if (my_get_expression (&inst.reloc.exp, str, GE_IMM_PREFIX))
3104     return FAIL;
3105
3106   if (skip_past_comma (str) == SUCCESS)
3107     {
3108       /* #x, y -- ie explicit rotation by Y.  */
3109       if (my_get_expression (&expr, str, GE_NO_PREFIX))
3110         return FAIL;
3111
3112       if (expr.X_op != O_constant || inst.reloc.exp.X_op != O_constant)
3113         {
3114           inst.error = _("constant expression expected");
3115           return FAIL;
3116         }
3117
3118       value = expr.X_add_number;
3119       if (value < 0 || value > 30 || value % 2 != 0)
3120         {
3121           inst.error = _("invalid rotation");
3122           return FAIL;
3123         }
3124       if (inst.reloc.exp.X_add_number < 0 || inst.reloc.exp.X_add_number > 255)
3125         {
3126           inst.error = _("invalid constant");
3127           return FAIL;
3128         }
3129
3130       /* Convert to decoded value.  md_apply_fix will put it back.  */
3131       inst.reloc.exp.X_add_number
3132         = (((inst.reloc.exp.X_add_number << (32 - value))
3133             | (inst.reloc.exp.X_add_number >> value)) & 0xffffffff);
3134     }
3135
3136   inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
3137   inst.reloc.pc_rel = 0;
3138   return SUCCESS;
3139 }
3140
3141 /* Parse all forms of an ARM address expression.  Information is written
3142    to inst.operands[i] and/or inst.reloc.
3143
3144    Preindexed addressing (.preind=1):
3145
3146    [Rn, #offset]       .reg=Rn .reloc.exp=offset
3147    [Rn, +/-Rm]         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
3148    [Rn, +/-Rm, shift]  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
3149                        .shift_kind=shift .reloc.exp=shift_imm
3150
3151    These three may have a trailing ! which causes .writeback to be set also.
3152
3153    Postindexed addressing (.postind=1, .writeback=1):
3154
3155    [Rn], #offset       .reg=Rn .reloc.exp=offset
3156    [Rn], +/-Rm         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
3157    [Rn], +/-Rm, shift  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
3158                        .shift_kind=shift .reloc.exp=shift_imm
3159
3160    Unindexed addressing (.preind=0, .postind=0):
3161
3162    [Rn], {option}      .reg=Rn .imm=option .immisreg=0
3163
3164    Other:
3165
3166    [Rn]{!}             shorthand for [Rn,#0]{!}
3167    =immediate          .isreg=0 .reloc.exp=immediate
3168    label               .reg=PC .reloc.pc_rel=1 .reloc.exp=label
3169
3170   It is the caller's responsibility to check for addressing modes not
3171   supported by the instruction, and to set inst.reloc.type.  */
3172
3173 static int
3174 parse_address (char **str, int i)
3175 {
3176   char *p = *str;
3177   int reg;
3178
3179   if (skip_past_char (&p, '[') == FAIL)
3180     {
3181       if (skip_past_char (&p, '=') == FAIL)
3182         {
3183           /* bare address - translate to PC-relative offset */
3184           inst.reloc.pc_rel = 1;
3185           inst.operands[i].reg = REG_PC;
3186           inst.operands[i].isreg = 1;
3187           inst.operands[i].preind = 1;
3188         }
3189       /* else a load-constant pseudo op, no special treatment needed here */
3190
3191       if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
3192         return FAIL;
3193
3194       *str = p;
3195       return SUCCESS;
3196     }
3197
3198   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
3199     {
3200       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
3201       return FAIL;
3202     }
3203   inst.operands[i].reg = reg;
3204   inst.operands[i].isreg = 1;
3205
3206   if (skip_past_comma (&p) == SUCCESS)
3207     {
3208       inst.operands[i].preind = 1;
3209
3210       if (*p == '+') p++;
3211       else if (*p == '-') p++, inst.operands[i].negative = 1;
3212
3213       if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
3214         {
3215           inst.operands[i].imm = reg;
3216           inst.operands[i].immisreg = 1;
3217
3218           if (skip_past_comma (&p) == SUCCESS)
3219             if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
3220               return FAIL;
3221         }
3222       else
3223         {
3224           if (inst.operands[i].negative)
3225             {
3226               inst.operands[i].negative = 0;
3227               p--;
3228             }
3229           if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
3230             return FAIL;
3231         }
3232     }
3233
3234   if (skip_past_char (&p, ']') == FAIL)
3235     {
3236       inst.error = _("']' expected");
3237       return FAIL;
3238     }
3239
3240   if (skip_past_char (&p, '!') == SUCCESS)
3241     inst.operands[i].writeback = 1;
3242
3243   else if (skip_past_comma (&p) == SUCCESS)
3244     {
3245       if (skip_past_char (&p, '{') == SUCCESS)
3246         {
3247           /* [Rn], {expr} - unindexed, with option */
3248           if (parse_immediate (&p, &inst.operands[i].imm,
3249                                0, 255, TRUE) == FAIL)
3250             return FAIL;
3251
3252           if (skip_past_char (&p, '}') == FAIL)
3253             {
3254               inst.error = _("'}' expected at end of 'option' field");
3255               return FAIL;
3256             }
3257           if (inst.operands[i].preind)
3258             {
3259               inst.error = _("cannot combine index with option");
3260               return FAIL;
3261             }
3262           *str = p;
3263           return SUCCESS;
3264         }
3265       else
3266         {
3267           inst.operands[i].postind = 1;
3268           inst.operands[i].writeback = 1;
3269
3270           if (inst.operands[i].preind)
3271             {
3272               inst.error = _("cannot combine pre- and post-indexing");
3273               return FAIL;
3274             }
3275
3276           if (*p == '+') p++;
3277           else if (*p == '-') p++, inst.operands[i].negative = 1;
3278
3279           if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
3280             {
3281               inst.operands[i].imm = reg;
3282               inst.operands[i].immisreg = 1;
3283
3284               if (skip_past_comma (&p) == SUCCESS)
3285                 if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
3286                   return FAIL;
3287             }
3288           else
3289             {
3290               if (inst.operands[i].negative)
3291                 {
3292                   inst.operands[i].negative = 0;
3293                   p--;
3294                 }
3295               if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
3296                 return FAIL;
3297             }
3298         }
3299     }
3300
3301   /* If at this point neither .preind nor .postind is set, we have a
3302      bare [Rn]{!}, which is shorthand for [Rn,#0]{!}.  */
3303   if (inst.operands[i].preind == 0 && inst.operands[i].postind == 0)
3304     {
3305       inst.operands[i].preind = 1;
3306       inst.reloc.exp.X_op = O_constant;
3307       inst.reloc.exp.X_add_number = 0;
3308     }
3309   *str = p;
3310   return SUCCESS;
3311 }
3312
3313 /* Miscellaneous. */
3314
3315 /* Parse a PSR flag operand.  The value returned is FAIL on syntax error,
3316    or a bitmask suitable to be or-ed into the ARM msr instruction.  */
3317 static int
3318 parse_psr (char **str)
3319 {
3320   char *p;
3321   unsigned long psr_field;
3322
3323   /* CPSR's and SPSR's can now be lowercase.  This is just a convenience
3324      feature for ease of use and backwards compatibility.  */
3325   p = *str;
3326   if (*p == 's' || *p == 'S')
3327     psr_field = SPSR_BIT;
3328   else if (*p == 'c' || *p == 'C')
3329     psr_field = 0;
3330   else
3331     goto error;
3332
3333   p++;
3334   if (strncasecmp (p, "PSR", 3) != 0)
3335     goto error;
3336   p += 3;
3337
3338   if (*p == '_')
3339     {
3340       /* A suffix follows.  */
3341       const struct asm_psr *psr;
3342       char *start;
3343
3344       p++;
3345       start = p;
3346
3347       do
3348         p++;
3349       while (ISALNUM (*p) || *p == '_');
3350
3351       psr = hash_find_n (arm_psr_hsh, start, p - start);
3352       if (!psr)
3353         goto error;
3354
3355       psr_field |= psr->field;
3356     }
3357   else
3358     {
3359       if (ISALNUM (*p))
3360         goto error;    /* Garbage after "[CS]PSR".  */
3361
3362       psr_field |= (PSR_c | PSR_f);
3363     }
3364   *str = p;
3365   return psr_field;
3366
3367  error:
3368   inst.error = _("flag for {c}psr instruction expected");
3369   return FAIL;
3370 }
3371
3372 /* Parse the flags argument to CPSI[ED].  Returns FAIL on error, or a
3373    value suitable for splatting into the AIF field of the instruction.  */
3374
3375 static int
3376 parse_cps_flags (char **str)
3377 {
3378   int val = 0;
3379   int saw_a_flag = 0;
3380   char *s = *str;
3381
3382   for (;;)
3383     switch (*s++)
3384       {
3385       case '\0': case ',':
3386         goto done;
3387
3388       case 'a': case 'A': saw_a_flag = 1; val |= 0x4; break;
3389       case 'i': case 'I': saw_a_flag = 1; val |= 0x2; break;
3390       case 'f': case 'F': saw_a_flag = 1; val |= 0x1; break;
3391
3392       default:
3393         inst.error = _("unrecognized CPS flag");
3394         return FAIL;
3395       }
3396
3397  done:
3398   if (saw_a_flag == 0)
3399     {
3400       inst.error = _("missing CPS flags");
3401       return FAIL;
3402     }
3403
3404   *str = s - 1;
3405   return val;
3406 }
3407
3408 /* Parse an endian specifier ("BE" or "LE", case insensitive);
3409    returns 0 for big-endian, 1 for little-endian, FAIL for an error.  */
3410
3411 static int
3412 parse_endian_specifier (char **str)
3413 {
3414   int little_endian;
3415   char *s = *str;
3416
3417   if (strncasecmp (s, "BE", 2))
3418     little_endian = 0;
3419   else if (strncasecmp (s, "LE", 2))
3420     little_endian = 1;
3421   else
3422     {
3423       inst.error = _("valid endian specifiers are be or le");
3424       return FAIL;
3425     }
3426
3427   if (ISALNUM (s[2]) || s[2] == '_')
3428     {
3429       inst.error = _("valid endian specifiers are be or le");
3430       return FAIL;
3431     }
3432
3433   *str = s + 2;
3434   return little_endian;
3435 }
3436
3437 /* Parse a rotation specifier: ROR #0, #8, #16, #24.  *val receives a
3438    value suitable for poking into the rotate field of an sxt or sxta
3439    instruction, or FAIL on error.  */
3440
3441 static int
3442 parse_ror (char **str)
3443 {
3444   int rot;
3445   char *s = *str;
3446
3447   if (strncasecmp (s, "ROR", 3) == 0)
3448     s += 3;
3449   else
3450     {
3451       inst.error = _("missing rotation field after comma");
3452       return FAIL;
3453     }
3454
3455   if (parse_immediate (&s, &rot, 0, 24, FALSE) == FAIL)
3456     return FAIL;
3457
3458   switch (rot)
3459     {
3460     case  0: *str = s; return 0x0;
3461     case  8: *str = s; return 0x1;
3462     case 16: *str = s; return 0x2;
3463     case 24: *str = s; return 0x3;
3464
3465     default:
3466       inst.error = _("rotation can only be 0, 8, 16, or 24");
3467       return FAIL;
3468     }
3469 }
3470
3471 /* Parse a conditional code (from conds[] below).  The value returned is in the
3472    range 0 .. 14, or FAIL.  */
3473 static int
3474 parse_cond (char **str)
3475 {
3476   char *p, *q;
3477   const struct asm_cond *c;
3478
3479   p = q = *str;
3480   while (ISALPHA (*q))
3481     q++;
3482
3483   c = hash_find_n (arm_cond_hsh, p, q - p);
3484   if (!c)
3485     {
3486       inst.error = _("condition required");
3487       return FAIL;
3488     }
3489
3490   *str = q;
3491   return c->value;
3492 }
3493
3494 /* Parse the operands of a table branch instruction.  Similar to a memory
3495    operand.  */
3496 static int
3497 parse_tb (char **str)
3498 {
3499   char * p = *str;
3500   int reg;
3501
3502   if (skip_past_char (&p, '[') == FAIL)
3503     return FAIL;
3504
3505   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
3506     {
3507       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
3508       return FAIL;
3509     }
3510   inst.operands[0].reg = reg;
3511
3512   if (skip_past_comma (&p) == FAIL)
3513     return FAIL;
3514   
3515   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
3516     {
3517       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
3518       return FAIL;
3519     }
3520   inst.operands[0].imm = reg;
3521
3522   if (skip_past_comma (&p) == SUCCESS)
3523     {
3524       if (parse_shift (&p, 0, SHIFT_LSL_IMMEDIATE) == FAIL)
3525         return FAIL;
3526       if (inst.reloc.exp.X_add_number != 1)
3527         {
3528           inst.error = _("invalid shift");
3529           return FAIL;
3530         }
3531       inst.operands[0].shifted = 1;
3532     }
3533
3534   if (skip_past_char (&p, ']') == FAIL)
3535     {
3536       inst.error = _("']' expected");
3537       return FAIL;
3538     }
3539   *str = p;
3540   return SUCCESS;
3541 }
3542
3543 /* Matcher codes for parse_operands.  */
3544 enum operand_parse_code
3545 {
3546   OP_stop,      /* end of line */
3547
3548   OP_RR,        /* ARM register */
3549   OP_RRnpc,     /* ARM register, not r15 */
3550   OP_RRnpcb,    /* ARM register, not r15, in square brackets */
3551   OP_RRw,       /* ARM register, not r15, optional trailing ! */
3552   OP_RCP,       /* Coprocessor number */
3553   OP_RCN,       /* Coprocessor register */
3554   OP_RF,        /* FPA register */
3555   OP_RVS,       /* VFP single precision register */
3556   OP_RVD,       /* VFP double precision register */
3557   OP_RVC,       /* VFP control register */
3558   OP_RMF,       /* Maverick F register */
3559   OP_RMD,       /* Maverick D register */
3560   OP_RMFX,      /* Maverick FX register */
3561   OP_RMDX,      /* Maverick DX register */
3562   OP_RMAX,      /* Maverick AX register */
3563   OP_RMDS,      /* Maverick DSPSC register */
3564   OP_RIWR,      /* iWMMXt wR register */
3565   OP_RIWC,      /* iWMMXt wC register */
3566   OP_RIWG,      /* iWMMXt wCG register */
3567   OP_RXA,       /* XScale accumulator register */
3568
3569   OP_REGLST,    /* ARM register list */
3570   OP_VRSLST,    /* VFP single-precision register list */
3571   OP_VRDLST,    /* VFP double-precision register list */
3572
3573   OP_I7,        /* immediate value 0 .. 7 */
3574   OP_I15,       /*                 0 .. 15 */
3575   OP_I16,       /*                 1 .. 16 */
3576   OP_I31,       /*                 0 .. 31 */
3577   OP_I31w,      /*                 0 .. 31, optional trailing ! */
3578   OP_I32,       /*                 1 .. 32 */
3579   OP_I63s,      /*               -64 .. 63 */
3580   OP_I255,      /*                 0 .. 255 */
3581   OP_Iffff,     /*                 0 .. 65535 */
3582
3583   OP_I4b,       /* immediate, prefix optional, 1 .. 4 */
3584   OP_I7b,       /*                             0 .. 7 */
3585   OP_I15b,      /*                             0 .. 15 */
3586   OP_I31b,      /*                             0 .. 31 */
3587
3588   OP_SH,        /* shifter operand */
3589   OP_ADDR,      /* Memory address expression (any mode) */
3590   OP_EXP,       /* arbitrary expression */
3591   OP_EXPi,      /* same, with optional immediate prefix */
3592   OP_EXPr,      /* same, with optional relocation suffix */
3593
3594   OP_CPSF,      /* CPS flags */
3595   OP_ENDI,      /* Endianness specifier */
3596   OP_PSR,       /* CPSR/SPSR mask for msr */
3597   OP_COND,      /* conditional code */
3598   OP_TB,        /* Table branch.  */
3599
3600   OP_RRnpc_I0,  /* ARM register or literal 0 */
3601   OP_RR_EXr,    /* ARM register or expression with opt. reloc suff. */
3602   OP_RR_EXi,    /* ARM register or expression with imm prefix */
3603   OP_RF_IF,     /* FPA register or immediate */
3604   OP_RIWR_RIWC, /* iWMMXt R or C reg */
3605
3606   /* Optional operands.  */
3607   OP_oI7b,       /* immediate, prefix optional, 0 .. 7 */
3608   OP_oI31b,      /*                             0 .. 31 */
3609   OP_oIffffb,    /*                             0 .. 65535 */
3610   OP_oI255c,     /*       curly-brace enclosed, 0 .. 255 */
3611
3612   OP_oRR,        /* ARM register */
3613   OP_oRRnpc,     /* ARM register, not the PC */
3614   OP_oSHll,      /* LSL immediate */
3615   OP_oSHar,      /* ASR immediate */
3616   OP_oSHllar,    /* LSL or ASR immediate */
3617   OP_oROR,       /* ROR 0/8/16/24 */
3618
3619   OP_FIRST_OPTIONAL = OP_oI7b
3620 };
3621
3622 /* Generic instruction operand parser.  This does no encoding and no
3623    semantic validation; it merely squirrels values away in the inst
3624    structure.  Returns SUCCESS or FAIL depending on whether the
3625    specified grammar matched.  */
3626 static int
3627 parse_operands (char *str, const unsigned char *pattern)
3628 {
3629   unsigned const char *upat = pattern;
3630   char *backtrack_pos = 0;
3631   const char *backtrack_error = 0;
3632   int i, val, backtrack_index = 0;
3633
3634 #define po_char_or_fail(chr) do {               \
3635   if (skip_past_char (&str, chr) == FAIL)       \
3636     goto bad_args;                              \
3637 } while (0)
3638
3639 #define po_reg_or_fail(regtype) do {                    \
3640   val = arm_reg_parse (&str, regtype);                  \
3641   if (val == FAIL)                                      \
3642     {                                                   \
3643       inst.error = _(reg_expected_msgs[regtype]);       \
3644       goto failure;                                     \
3645     }                                                   \
3646   inst.operands[i].reg = val;                           \
3647   inst.operands[i].isreg = 1;                           \
3648 } while (0)
3649
3650 #define po_reg_or_goto(regtype, label) do {     \
3651   val = arm_reg_parse (&str, regtype);          \
3652   if (val == FAIL)                              \
3653     goto label;                                 \
3654                                                 \
3655   inst.operands[i].reg = val;                   \
3656   inst.operands[i].isreg = 1;                   \
3657 } while (0)
3658
3659 #define po_imm_or_fail(min, max, popt) do {                     \
3660   if (parse_immediate (&str, &val, min, max, popt) == FAIL)     \
3661     goto failure;                                               \
3662   inst.operands[i].imm = val;                                   \
3663 } while (0)
3664
3665 #define po_misc_or_fail(expr) do {              \
3666   if (expr)                                     \
3667     goto failure;                               \
3668 } while (0)
3669
3670   skip_whitespace (str);
3671
3672   for (i = 0; upat[i] != OP_stop; i++)
3673     {
3674       if (upat[i] >= OP_FIRST_OPTIONAL)
3675         {
3676           /* Remember where we are in case we need to backtrack.  */
3677           assert (!backtrack_pos);
3678           backtrack_pos = str;
3679           backtrack_error = inst.error;
3680           backtrack_index = i;
3681         }
3682
3683       if (i > 0)
3684         po_char_or_fail (',');
3685
3686       switch (upat[i])
3687         {
3688           /* Registers */
3689         case OP_oRRnpc:
3690         case OP_RRnpc:
3691         case OP_oRR:
3692         case OP_RR:    po_reg_or_fail (REG_TYPE_RN);      break;
3693         case OP_RCP:   po_reg_or_fail (REG_TYPE_CP);      break;
3694         case OP_RCN:   po_reg_or_fail (REG_TYPE_CN);      break;
3695         case OP_RF:    po_reg_or_fail (REG_TYPE_FN);      break;
3696         case OP_RVS:   po_reg_or_fail (REG_TYPE_VFS);     break;
3697         case OP_RVD:   po_reg_or_fail (REG_TYPE_VFD);     break;
3698         case OP_RVC:   po_reg_or_fail (REG_TYPE_VFC);     break;
3699         case OP_RMF:   po_reg_or_fail (REG_TYPE_MVF);     break;
3700         case OP_RMD:   po_reg_or_fail (REG_TYPE_MVD);     break;
3701         case OP_RMFX:  po_reg_or_fail (REG_TYPE_MVFX);    break;
3702         case OP_RMDX:  po_reg_or_fail (REG_TYPE_MVDX);    break;
3703         case OP_RMAX:  po_reg_or_fail (REG_TYPE_MVAX);    break;
3704         case OP_RMDS:  po_reg_or_fail (REG_TYPE_DSPSC);   break;
3705         case OP_RIWR:  po_reg_or_fail (REG_TYPE_MMXWR);   break;
3706         case OP_RIWC:  po_reg_or_fail (REG_TYPE_MMXWC);   break;
3707         case OP_RIWG:  po_reg_or_fail (REG_TYPE_MMXWCG);  break;
3708         case OP_RXA:   po_reg_or_fail (REG_TYPE_XSCALE);  break;
3709
3710         case OP_RRnpcb:
3711           po_char_or_fail ('[');
3712           po_reg_or_fail  (REG_TYPE_RN);
3713           po_char_or_fail (']');
3714           break;
3715
3716         case OP_RRw:
3717           po_reg_or_fail (REG_TYPE_RN);
3718           if (skip_past_char (&str, '!') == SUCCESS)
3719             inst.operands[i].writeback = 1;
3720           break;
3721
3722           /* Immediates */
3723         case OP_I7:      po_imm_or_fail (  0,      7, FALSE);   break;
3724         case OP_I15:     po_imm_or_fail (  0,     15, FALSE);   break;
3725         case OP_I16:     po_imm_or_fail (  1,     16, FALSE);   break;
3726         case OP_I31:     po_imm_or_fail (  0,     31, FALSE);   break;
3727         case OP_I32:     po_imm_or_fail (  1,     32, FALSE);   break;
3728         case OP_I63s:    po_imm_or_fail (-64,     63, FALSE);   break;
3729         case OP_I255:    po_imm_or_fail (  0,    255, FALSE);   break;
3730         case OP_Iffff:   po_imm_or_fail (  0, 0xffff, FALSE);   break;
3731
3732         case OP_I4b:     po_imm_or_fail (  1,      4, TRUE);    break;
3733         case OP_oI7b:
3734         case OP_I7b:     po_imm_or_fail (  0,      7, TRUE);    break;
3735         case OP_I15b:    po_imm_or_fail (  0,     15, TRUE);    break;
3736         case OP_oI31b:
3737         case OP_I31b:    po_imm_or_fail (  0,     31, TRUE);    break;
3738         case OP_oIffffb: po_imm_or_fail (  0, 0xffff, TRUE);    break;
3739
3740           /* Immediate variants */
3741         case OP_oI255c:
3742           po_char_or_fail ('{');
3743           po_imm_or_fail (0, 255, TRUE);
3744           po_char_or_fail ('}');
3745           break;
3746
3747         case OP_I31w:
3748           /* The expression parser chokes on a trailing !, so we have
3749              to find it first and zap it.  */
3750           {
3751             char *s = str;
3752             while (*s && *s != ',')
3753               s++;
3754             if (s[-1] == '!')
3755               {
3756                 s[-1] = '\0';
3757                 inst.operands[i].writeback = 1;
3758               }
3759             po_imm_or_fail (0, 31, TRUE);
3760             if (str == s - 1)
3761               str = s;
3762           }
3763           break;
3764
3765           /* Expressions */
3766         case OP_EXPi:   EXPi:
3767           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
3768                                               GE_OPT_PREFIX));
3769           break;
3770
3771         case OP_EXP:
3772           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
3773                                               GE_NO_PREFIX));
3774           break;
3775
3776         case OP_EXPr:   EXPr:
3777           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
3778                                               GE_NO_PREFIX));
3779           if (inst.reloc.exp.X_op == O_symbol)
3780             {
3781               val = parse_reloc (&str);
3782               if (val == -1)
3783                 {
3784                   inst.error = _("unrecognized relocation suffix");
3785                   goto failure;
3786                 }
3787               else if (val != BFD_RELOC_UNUSED)
3788                 {
3789                   inst.operands[i].imm = val;
3790                   inst.operands[i].hasreloc = 1;
3791                 }
3792             }
3793           break;
3794
3795           /* Register or expression */
3796         case OP_RR_EXr:   po_reg_or_goto (REG_TYPE_RN, EXPr); break;
3797         case OP_RR_EXi:   po_reg_or_goto (REG_TYPE_RN, EXPi); break;
3798
3799           /* Register or immediate */
3800         case OP_RRnpc_I0: po_reg_or_goto (REG_TYPE_RN, I0);   break;
3801         I0:               po_imm_or_fail (0, 0, FALSE);       break;
3802
3803         case OP_RF_IF:    po_reg_or_goto (REG_TYPE_FN, IF);   break;
3804         IF:
3805           if (!is_immediate_prefix (*str))
3806             goto bad_args;
3807           str++;
3808           val = parse_fpa_immediate (&str);
3809           if (val == FAIL)
3810             goto failure;
3811           /* FPA immediates are encoded as registers 8-15.
3812              parse_fpa_immediate has already applied the offset.  */
3813           inst.operands[i].reg = val;
3814           inst.operands[i].isreg = 1;
3815           break;
3816
3817           /* Two kinds of register */
3818         case OP_RIWR_RIWC:
3819           {
3820             struct reg_entry *rege = arm_reg_parse_multi (&str);
3821             if (rege->type != REG_TYPE_MMXWR
3822                 && rege->type != REG_TYPE_MMXWC
3823                 && rege->type != REG_TYPE_MMXWCG)
3824               {
3825                 inst.error = _("iWMMXt data or control register expected");
3826                 goto failure;
3827               }
3828             inst.operands[i].reg = rege->number;
3829             inst.operands[i].isreg = (rege->type == REG_TYPE_MMXWR);
3830           }
3831           break;
3832
3833           /* Misc */
3834         case OP_CPSF:    val = parse_cps_flags (&str);          break;
3835         case OP_ENDI:    val = parse_endian_specifier (&str);   break;
3836         case OP_oROR:    val = parse_ror (&str);                break;
3837         case OP_PSR:     val = parse_psr (&str);                break;
3838         case OP_COND:    val = parse_cond (&str);               break;
3839
3840         case OP_TB:
3841           po_misc_or_fail (parse_tb (&str));
3842           break;
3843
3844           /* Register lists */
3845         case OP_REGLST:
3846           val = parse_reg_list (&str);
3847           if (*str == '^')
3848             {
3849               inst.operands[1].writeback = 1;
3850               str++;
3851             }
3852           break;
3853
3854         case OP_VRSLST:
3855           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, 0);
3856           break;
3857
3858         case OP_VRDLST:
3859           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, 1);
3860           break;
3861
3862           /* Addressing modes */
3863         case OP_ADDR:
3864           po_misc_or_fail (parse_address (&str, i));
3865           break;
3866
3867         case OP_SH:
3868           po_misc_or_fail (parse_shifter_operand (&str, i));
3869           break;
3870
3871         case OP_oSHll:
3872           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_IMMEDIATE));
3873           break;
3874
3875         case OP_oSHar:
3876           po_misc_or_fail (parse_shift (&str, i, SHIFT_ASR_IMMEDIATE));
3877           break;
3878
3879         case OP_oSHllar:
3880           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_OR_ASR_IMMEDIATE));
3881           break;
3882
3883         default:
3884           as_fatal ("unhandled operand code %d", upat[i]);
3885         }
3886
3887       /* Various value-based sanity checks and shared operations.  We
3888          do not signal immediate failures for the register constraints;
3889          this allows a syntax error to take precedence.  */
3890       switch (upat[i])
3891         {
3892         case OP_oRRnpc:
3893         case OP_RRnpc:
3894         case OP_RRnpcb:
3895         case OP_RRw:
3896         case OP_RRnpc_I0:
3897           if (inst.operands[i].isreg && inst.operands[i].reg == REG_PC)
3898             inst.error = BAD_PC;
3899           break;
3900
3901         case OP_CPSF:
3902         case OP_ENDI:
3903         case OP_oROR:
3904         case OP_PSR:
3905         case OP_COND:
3906         case OP_REGLST:
3907         case OP_VRSLST:
3908         case OP_VRDLST:
3909           if (val == FAIL)
3910             goto failure;
3911           inst.operands[i].imm = val;
3912           break;
3913
3914         default:
3915           break;
3916         }
3917
3918       /* If we get here, this operand was successfully parsed.  */
3919       inst.operands[i].present = 1;
3920       continue;
3921
3922     bad_args:
3923       inst.error = BAD_ARGS;
3924
3925     failure:
3926       if (!backtrack_pos)
3927         return FAIL;
3928
3929       /* Do not backtrack over a trailing optional argument that
3930          absorbed some text.  We will only fail again, with the
3931          'garbage following instruction' error message, which is
3932          probably less helpful than the current one.  */
3933       if (backtrack_index == i && backtrack_pos != str
3934           && upat[i+1] == OP_stop)
3935         return FAIL;
3936
3937       /* Try again, skipping the optional argument at backtrack_pos.  */
3938       str = backtrack_pos;
3939       inst.error = backtrack_error;
3940       inst.operands[backtrack_index].present = 0;
3941       i = backtrack_index;
3942       backtrack_pos = 0;
3943     }
3944
3945   /* Check that we have parsed all the arguments.  */
3946   if (*str != '\0' && !inst.error)
3947     inst.error = _("garbage following instruction");
3948
3949   return inst.error ? FAIL : SUCCESS;
3950 }
3951
3952 #undef po_char_or_fail
3953 #undef po_reg_or_fail
3954 #undef po_reg_or_goto
3955 #undef po_imm_or_fail
3956 \f
3957 /* Shorthand macro for instruction encoding functions issuing errors.  */
3958 #define constraint(expr, err) do {              \
3959   if (expr)                                     \
3960     {                                           \
3961       inst.error = err;                         \
3962       return;                                   \
3963     }                                           \
3964 } while (0)
3965
3966 /* Functions for operand encoding.  ARM, then Thumb.  */
3967
3968 #define rotate_left(v, n) (v << n | v >> (32 - n))
3969
3970 /* If VAL can be encoded in the immediate field of an ARM instruction,
3971    return the encoded form.  Otherwise, return FAIL.  */
3972
3973 static unsigned int
3974 encode_arm_immediate (unsigned int val)
3975 {
3976   unsigned int a, i;
3977
3978   for (i = 0; i < 32; i += 2)
3979     if ((a = rotate_left (val, i)) <= 0xff)
3980       return a | (i << 7); /* 12-bit pack: [shift-cnt,const].  */
3981
3982   return FAIL;
3983 }
3984
3985 /* If VAL can be encoded in the immediate field of a Thumb32 instruction,
3986    return the encoded form.  Otherwise, return FAIL.  */
3987 static unsigned int
3988 encode_thumb32_immediate (unsigned int val)
3989 {
3990   unsigned int a, i;
3991
3992   if (val <= 255)
3993     return val;
3994
3995   for (i = 0; i < 32; i++)
3996     {
3997       a = rotate_left (val, i);
3998       if (a >= 128 && a <= 255)
3999         return (a & 0x7f) | (i << 7);
4000     }
4001
4002   a = val & 0xff;
4003   if (val == ((a << 16) | a))
4004     return 0x100 | a;
4005   if (val == ((a << 24) | (a << 16) | (a << 8) | a))
4006     return 0x300 | a;
4007
4008   a = val & 0xff00;
4009   if (val == ((a << 16) | a))
4010     return 0x200 | (a >> 8);
4011
4012   return FAIL;
4013 }
4014 /* Encode a VFP SP register number into inst.instruction.  */
4015
4016 static void
4017 encode_arm_vfp_sp_reg (int reg, enum vfp_sp_reg_pos pos)
4018 {
4019   switch (pos)
4020     {
4021     case VFP_REG_Sd:
4022       inst.instruction |= ((reg >> 1) << 12) | ((reg & 1) << 22);
4023       break;
4024
4025     case VFP_REG_Sn:
4026       inst.instruction |= ((reg >> 1) << 16) | ((reg & 1) << 7);
4027       break;
4028
4029     case VFP_REG_Sm:
4030       inst.instruction |= ((reg >> 1) << 0) | ((reg & 1) << 5);
4031       break;
4032
4033     default:
4034       abort ();
4035     }
4036 }
4037
4038 /* Encode a <shift> in an ARM-format instruction.  The immediate,
4039    if any, is handled by md_apply_fix.   */
4040 static void
4041 encode_arm_shift (int i)
4042 {
4043   if (inst.operands[i].shift_kind == SHIFT_RRX)
4044     inst.instruction |= SHIFT_ROR << 5;
4045   else
4046     {
4047       inst.instruction |= inst.operands[i].shift_kind << 5;
4048       if (inst.operands[i].immisreg)
4049         {
4050           inst.instruction |= SHIFT_BY_REG;
4051           inst.instruction |= inst.operands[i].imm << 8;
4052         }
4053       else
4054         inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
4055     }
4056 }
4057
4058 static void
4059 encode_arm_shifter_operand (int i)
4060 {
4061   if (inst.operands[i].isreg)
4062     {
4063       inst.instruction |= inst.operands[i].reg;
4064       encode_arm_shift (i);
4065     }
4066   else
4067     inst.instruction |= INST_IMMEDIATE;
4068 }
4069
4070 /* Subroutine of encode_arm_addr_mode_2 and encode_arm_addr_mode_3.  */
4071 static void
4072 encode_arm_addr_mode_common (int i, bfd_boolean is_t)
4073 {
4074   assert (inst.operands[i].isreg);
4075   inst.instruction |= inst.operands[i].reg << 16;
4076
4077   if (inst.operands[i].preind)
4078     {
4079       if (is_t)
4080         {
4081           inst.error = _("instruction does not accept preindexed addressing");
4082           return;
4083         }
4084       inst.instruction |= PRE_INDEX;
4085       if (inst.operands[i].writeback)
4086         inst.instruction |= WRITE_BACK;
4087
4088     }
4089   else if (inst.operands[i].postind)
4090     {
4091       assert (inst.operands[i].writeback);
4092       if (is_t)
4093         inst.instruction |= WRITE_BACK;
4094     }
4095   else /* unindexed - only for coprocessor */
4096     {
4097       inst.error = _("instruction does not accept unindexed addressing");
4098       return;
4099     }
4100
4101   if (((inst.instruction & WRITE_BACK) || !(inst.instruction & PRE_INDEX))
4102       && (((inst.instruction & 0x000f0000) >> 16)
4103           == ((inst.instruction & 0x0000f000) >> 12)))
4104     as_warn ((inst.instruction & LOAD_BIT)
4105              ? _("destination register same as write-back base")
4106              : _("source register same as write-back base"));
4107 }
4108
4109 /* inst.operands[i] was set up by parse_address.  Encode it into an
4110    ARM-format mode 2 load or store instruction.  If is_t is true,
4111    reject forms that cannot be used with a T instruction (i.e. not
4112    post-indexed).  */
4113 static void
4114 encode_arm_addr_mode_2 (int i, bfd_boolean is_t)
4115 {
4116   encode_arm_addr_mode_common (i, is_t);
4117
4118   if (inst.operands[i].immisreg)
4119     {
4120       inst.instruction |= INST_IMMEDIATE;  /* yes, this is backwards */
4121       inst.instruction |= inst.operands[i].imm;
4122       if (!inst.operands[i].negative)
4123         inst.instruction |= INDEX_UP;
4124       if (inst.operands[i].shifted)
4125         {
4126           if (inst.operands[i].shift_kind == SHIFT_RRX)
4127             inst.instruction |= SHIFT_ROR << 5;
4128           else
4129             {
4130               inst.instruction |= inst.operands[i].shift_kind << 5;
4131               inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
4132             }
4133         }
4134     }
4135   else /* immediate offset in inst.reloc */
4136     {
4137       if (inst.reloc.type == BFD_RELOC_UNUSED)
4138         inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
4139     }
4140 }
4141
4142 /* inst.operands[i] was set up by parse_address.  Encode it into an
4143    ARM-format mode 3 load or store instruction.  Reject forms that
4144    cannot be used with such instructions.  If is_t is true, reject
4145    forms that cannot be used with a T instruction (i.e. not
4146    post-indexed).  */
4147 static void
4148 encode_arm_addr_mode_3 (int i, bfd_boolean is_t)
4149 {
4150   if (inst.operands[i].immisreg && inst.operands[i].shifted)
4151     {
4152       inst.error = _("instruction does not accept scaled register index");
4153       return;
4154     }
4155
4156   encode_arm_addr_mode_common (i, is_t);
4157
4158   if (inst.operands[i].immisreg)
4159     {
4160       inst.instruction |= inst.operands[i].imm;
4161       if (!inst.operands[i].negative)
4162         inst.instruction |= INDEX_UP;
4163     }
4164   else /* immediate offset in inst.reloc */
4165     {
4166       inst.instruction |= HWOFFSET_IMM;
4167       if (inst.reloc.type == BFD_RELOC_UNUSED)
4168         inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
4169     }
4170 }
4171
4172 /* inst.operands[i] was set up by parse_address.  Encode it into an
4173    ARM-format instruction.  Reject all forms which cannot be encoded
4174    into a coprocessor load/store instruction.  If wb_ok is false,
4175    reject use of writeback; if unind_ok is false, reject use of
4176    unindexed addressing.  If reloc_override is not 0, use it instead
4177    of BFD_ARM_CP_OFF_IMM.  */
4178
4179 static int
4180 encode_arm_cp_address (int i, int wb_ok, int unind_ok, int reloc_override)
4181 {
4182   inst.instruction |= inst.operands[i].reg << 16;
4183
4184   assert (!(inst.operands[i].preind && inst.operands[i].postind));
4185
4186   if (!inst.operands[i].preind && !inst.operands[i].postind) /* unindexed */
4187     {
4188       assert (!inst.operands[i].writeback);
4189       if (!unind_ok)
4190         {
4191           inst.error = _("instruction does not support unindexed addressing");
4192           return FAIL;
4193         }
4194       inst.instruction |= inst.operands[i].imm;
4195       inst.instruction |= INDEX_UP;
4196       return SUCCESS;
4197     }
4198
4199   if (inst.operands[i].preind)
4200     inst.instruction |= PRE_INDEX;
4201
4202   if (inst.operands[i].writeback)
4203     {
4204       if (inst.operands[i].reg == REG_PC)
4205         {
4206           inst.error = _("pc may not be used with write-back");
4207           return FAIL;
4208         }
4209       if (!wb_ok)
4210         {
4211           inst.error = _("instruction does not support writeback");
4212           return FAIL;
4213         }
4214       inst.instruction |= WRITE_BACK;
4215     }
4216
4217   if (reloc_override)
4218     inst.reloc.type = reloc_override;
4219   else
4220     inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
4221   return SUCCESS;
4222 }
4223
4224 /* inst.reloc.exp describes an "=expr" load pseudo-operation.
4225    Determine whether it can be performed with a move instruction; if
4226    it can, convert inst.instruction to that move instruction and
4227    return 1; if it can't, convert inst.instruction to a literal-pool
4228    load and return 0.  If this is not a valid thing to do in the
4229    current context, set inst.error and return 1.
4230
4231    inst.operands[i] describes the destination register.  */
4232
4233 static int
4234 move_or_literal_pool (int i, bfd_boolean thumb_p, bfd_boolean mode_3)
4235 {
4236   if ((inst.instruction & (thumb_p ? THUMB_LOAD_BIT : LOAD_BIT)) == 0)
4237     {
4238       inst.error = _("invalid pseudo operation");
4239       return 1;
4240     }
4241   if (inst.reloc.exp.X_op != O_constant && inst.reloc.exp.X_op != O_symbol)
4242     {
4243       inst.error = _("constant expression expected");
4244       return 1;
4245     }
4246   if (inst.reloc.exp.X_op == O_constant)
4247     {
4248       if (thumb_p)
4249         {
4250           if ((inst.reloc.exp.X_add_number & ~0xFF) == 0)
4251             {
4252               /* This can be done with a mov(1) instruction.  */
4253               inst.instruction  = T_OPCODE_MOV_I8 | (inst.operands[i].reg << 8);
4254               inst.instruction |= inst.reloc.exp.X_add_number;
4255               return 1;
4256             }
4257         }
4258       else
4259         {
4260           int value = encode_arm_immediate (inst.reloc.exp.X_add_number);
4261           if (value != FAIL)
4262             {
4263               /* This can be done with a mov instruction.  */
4264               inst.instruction &= LITERAL_MASK;
4265               inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
4266               inst.instruction |= value & 0xfff;
4267               return 1;
4268             }
4269
4270           value = encode_arm_immediate (~inst.reloc.exp.X_add_number);
4271           if (value != FAIL)
4272             {
4273               /* This can be done with a mvn instruction.  */
4274               inst.instruction &= LITERAL_MASK;
4275               inst.instruction |= INST_IMMEDIATE | (OPCODE_MVN << DATA_OP_SHIFT);
4276               inst.instruction |= value & 0xfff;
4277               return 1;
4278             }
4279         }
4280     }
4281
4282   if (add_to_lit_pool () == FAIL)
4283     {
4284       inst.error = _("literal pool insertion failed");
4285       return 1;
4286     }
4287   inst.operands[1].reg = REG_PC;
4288   inst.operands[1].isreg = 1;
4289   inst.operands[1].preind = 1;
4290   inst.reloc.pc_rel = 1;
4291   inst.reloc.type = (thumb_p
4292                      ? BFD_RELOC_ARM_THUMB_OFFSET
4293                      : (mode_3
4294                         ? BFD_RELOC_ARM_HWLITERAL
4295                         : BFD_RELOC_ARM_LITERAL));
4296   return 0;
4297 }
4298
4299 /* Functions for instruction encoding, sorted by subarchitecture.
4300    First some generics; their names are taken from the conventional
4301    bit positions for register arguments in ARM format instructions.  */
4302
4303 static void
4304 do_noargs (void)
4305 {
4306 }
4307
4308 static void
4309 do_rd (void)
4310 {
4311   inst.instruction |= inst.operands[0].reg << 12;
4312 }
4313
4314 static void
4315 do_rd_rm (void)
4316 {
4317   inst.instruction |= inst.operands[0].reg << 12;
4318   inst.instruction |= inst.operands[1].reg;
4319 }
4320
4321 static void
4322 do_rd_rn (void)
4323 {
4324   inst.instruction |= inst.operands[0].reg << 12;
4325   inst.instruction |= inst.operands[1].reg << 16;
4326 }
4327
4328 static void
4329 do_rn_rd (void)
4330 {
4331   inst.instruction |= inst.operands[0].reg << 16;
4332   inst.instruction |= inst.operands[1].reg << 12;
4333 }
4334
4335 static void
4336 do_rd_rm_rn (void)
4337 {
4338   inst.instruction |= inst.operands[0].reg << 12;
4339   inst.instruction |= inst.operands[1].reg;
4340   inst.instruction |= inst.operands[2].reg << 16;
4341 }
4342
4343 static void
4344 do_rd_rn_rm (void)
4345 {
4346   inst.instruction |= inst.operands[0].reg << 12;
4347   inst.instruction |= inst.operands[1].reg << 16;
4348   inst.instruction |= inst.operands[2].reg;
4349 }
4350
4351 static void
4352 do_rm_rd_rn (void)
4353 {
4354   inst.instruction |= inst.operands[0].reg;
4355   inst.instruction |= inst.operands[1].reg << 12;
4356   inst.instruction |= inst.operands[2].reg << 16;
4357 }
4358
4359 static void
4360 do_imm0 (void)
4361 {
4362   inst.instruction |= inst.operands[0].imm;
4363 }
4364
4365 static void
4366 do_rd_cpaddr (void)
4367 {
4368   inst.instruction |= inst.operands[0].reg << 12;
4369   encode_arm_cp_address (1, TRUE, TRUE, 0);
4370 }
4371
4372 /* ARM instructions, in alphabetical order by function name (except
4373    that wrapper functions appear immediately after the function they
4374    wrap).  */
4375
4376 /* This is a pseudo-op of the form "adr rd, label" to be converted
4377    into a relative address of the form "add rd, pc, #label-.-8".  */
4378
4379 static void
4380 do_adr (void)
4381 {
4382   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
4383
4384   /* Frag hacking will turn this into a sub instruction if the offset turns
4385      out to be negative.  */
4386   inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
4387   inst.reloc.pc_rel = 1;
4388   inst.reloc.exp.X_add_number -= 8;
4389 }
4390
4391 /* This is a pseudo-op of the form "adrl rd, label" to be converted
4392    into a relative address of the form:
4393    add rd, pc, #low(label-.-8)"
4394    add rd, rd, #high(label-.-8)"  */
4395
4396 static void
4397 do_adrl (void)
4398 {
4399   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
4400
4401   /* Frag hacking will turn this into a sub instruction if the offset turns
4402      out to be negative.  */
4403   inst.reloc.type              = BFD_RELOC_ARM_ADRL_IMMEDIATE;
4404   inst.reloc.pc_rel            = 1;
4405   inst.size                    = INSN_SIZE * 2;
4406   inst.reloc.exp.X_add_number -= 8;
4407 }
4408
4409 static void
4410 do_arit (void)
4411 {
4412   if (!inst.operands[1].present)
4413     inst.operands[1].reg = inst.operands[0].reg;
4414   inst.instruction |= inst.operands[0].reg << 12;
4415   inst.instruction |= inst.operands[1].reg << 16;
4416   encode_arm_shifter_operand (2);
4417 }
4418
4419 static void
4420 do_bfc (void)
4421 {
4422   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
4423   constraint (msb > 32, _("bit-field extends past end of register"));
4424   /* The instruction encoding stores the LSB and MSB,
4425      not the LSB and width.  */
4426   inst.instruction |= inst.operands[0].reg << 12;
4427   inst.instruction |= inst.operands[1].imm << 7;
4428   inst.instruction |= (msb - 1) << 16;
4429 }
4430
4431 static void
4432 do_bfi (void)
4433 {
4434   unsigned int msb;
4435
4436   /* #0 in second position is alternative syntax for bfc, which is
4437      the same instruction but with REG_PC in the Rm field.  */
4438   if (!inst.operands[1].isreg)
4439     inst.operands[1].reg = REG_PC;
4440
4441   msb = inst.operands[2].imm + inst.operands[3].imm;
4442   constraint (msb > 32, _("bit-field extends past end of register"));
4443   /* The instruction encoding stores the LSB and MSB,
4444      not the LSB and width.  */
4445   inst.instruction |= inst.operands[0].reg << 12;
4446   inst.instruction |= inst.operands[1].reg;
4447   inst.instruction |= inst.operands[2].imm << 7;
4448   inst.instruction |= (msb - 1) << 16;
4449 }
4450
4451 static void
4452 do_bfx (void)
4453 {
4454   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
4455               _("bit-field extends past end of register"));
4456   inst.instruction |= inst.operands[0].reg << 12;
4457   inst.instruction |= inst.operands[1].reg;
4458   inst.instruction |= inst.operands[2].imm << 7;
4459   inst.instruction |= (inst.operands[3].imm - 1) << 16;
4460 }
4461
4462 /* ARM V5 breakpoint instruction (argument parse)
4463      BKPT <16 bit unsigned immediate>
4464      Instruction is not conditional.
4465         The bit pattern given in insns[] has the COND_ALWAYS condition,
4466         and it is an error if the caller tried to override that.  */
4467
4468 static void
4469 do_bkpt (void)
4470 {
4471   /* Top 12 of 16 bits to bits 19:8.  */
4472   inst.instruction |= (inst.operands[0].imm & 0xfff0) << 4;
4473
4474   /* Bottom 4 of 16 bits to bits 3:0.  */
4475   inst.instruction |= inst.operands[0].imm & 0xf;
4476 }
4477
4478 static void
4479 encode_branch (int default_reloc)
4480 {
4481   if (inst.operands[0].hasreloc)
4482     {
4483       constraint (inst.operands[0].imm != BFD_RELOC_ARM_PLT32,
4484                   _("the only suffix valid here is '(plt)'"));
4485       inst.reloc.type   = BFD_RELOC_ARM_PLT32;
4486     }
4487   else
4488     {
4489       inst.reloc.type = default_reloc;
4490     }
4491   inst.reloc.pc_rel = 1;
4492 }
4493
4494 static void
4495 do_branch (void)
4496 {
4497   encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
4498 }
4499
4500 /* ARM V5 branch-link-exchange instruction (argument parse)
4501      BLX <target_addr>          ie BLX(1)
4502      BLX{<condition>} <Rm>      ie BLX(2)
4503    Unfortunately, there are two different opcodes for this mnemonic.
4504    So, the insns[].value is not used, and the code here zaps values
4505         into inst.instruction.
4506    Also, the <target_addr> can be 25 bits, hence has its own reloc.  */
4507
4508 static void
4509 do_blx (void)
4510 {
4511   if (inst.operands[0].isreg)
4512     {
4513       /* Arg is a register; the opcode provided by insns[] is correct.
4514          It is not illegal to do "blx pc", just useless.  */
4515       if (inst.operands[0].reg == REG_PC)
4516         as_tsktsk (_("use of r15 in blx in ARM mode is not really useful"));
4517
4518       inst.instruction |= inst.operands[0].reg;
4519     }
4520   else
4521     {
4522       /* Arg is an address; this instruction cannot be executed
4523          conditionally, and the opcode must be adjusted.  */
4524       constraint (inst.cond != COND_ALWAYS, BAD_COND);
4525       inst.instruction = 0xfa000000;
4526       encode_branch (BFD_RELOC_ARM_PCREL_BLX);
4527     }
4528 }
4529
4530 static void
4531 do_bx (void)
4532 {
4533   if (inst.operands[0].reg == REG_PC)
4534     as_tsktsk (_("use of r15 in bx in ARM mode is not really useful"));
4535
4536   inst.instruction |= inst.operands[0].reg;
4537 }
4538
4539
4540 /* ARM v5TEJ.  Jump to Jazelle code.  */
4541
4542 static void
4543 do_bxj (void)
4544 {
4545   if (inst.operands[0].reg == REG_PC)
4546     as_tsktsk (_("use of r15 in bxj is not really useful"));
4547
4548   inst.instruction |= inst.operands[0].reg;
4549 }
4550
4551 /* Co-processor data operation:
4552       CDP{cond} <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}
4553       CDP2      <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}  */
4554 static void
4555 do_cdp (void)
4556 {
4557   inst.instruction |= inst.operands[0].reg << 8;
4558   inst.instruction |= inst.operands[1].imm << 20;
4559   inst.instruction |= inst.operands[2].reg << 12;
4560   inst.instruction |= inst.operands[3].reg << 16;
4561   inst.instruction |= inst.operands[4].reg;
4562   inst.instruction |= inst.operands[5].imm << 5;
4563 }
4564
4565 static void
4566 do_cmp (void)
4567 {
4568   inst.instruction |= inst.operands[0].reg << 16;
4569   encode_arm_shifter_operand (1);
4570 }
4571
4572 /* Transfer between coprocessor and ARM registers.
4573    MRC{cond} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
4574    MRC2
4575    MCR{cond}
4576    MCR2
4577
4578    No special properties.  */
4579
4580 static void
4581 do_co_reg (void)
4582 {
4583   inst.instruction |= inst.operands[0].reg << 8;
4584   inst.instruction |= inst.operands[1].imm << 21;
4585   inst.instruction |= inst.operands[2].reg << 12;
4586   inst.instruction |= inst.operands[3].reg << 16;
4587   inst.instruction |= inst.operands[4].reg;
4588   inst.instruction |= inst.operands[5].imm << 5;
4589 }
4590
4591 /* Transfer between coprocessor register and pair of ARM registers.
4592    MCRR{cond} <coproc>, <opcode>, <Rd>, <Rn>, <CRm>.
4593    MCRR2
4594    MRRC{cond}
4595    MRRC2
4596
4597    Two XScale instructions are special cases of these:
4598
4599      MAR{cond} acc0, <RdLo>, <RdHi> == MCRR{cond} p0, #0, <RdLo>, <RdHi>, c0
4600      MRA{cond} acc0, <RdLo>, <RdHi> == MRRC{cond} p0, #0, <RdLo>, <RdHi>, c0
4601
4602    Result unpredicatable if Rd or Rn is R15.  */
4603
4604 static void
4605 do_co_reg2c (void)
4606 {
4607   inst.instruction |= inst.operands[0].reg << 8;
4608   inst.instruction |= inst.operands[1].imm << 4;
4609   inst.instruction |= inst.operands[2].reg << 12;
4610   inst.instruction |= inst.operands[3].reg << 16;
4611   inst.instruction |= inst.operands[4].reg;
4612 }
4613
4614 static void
4615 do_cpsi (void)
4616 {
4617   inst.instruction |= inst.operands[0].imm << 6;
4618   inst.instruction |= inst.operands[1].imm;
4619 }
4620
4621 static void
4622 do_it (void)
4623 {
4624   /* There is no IT instruction in ARM mode.  We
4625      process it but do not generate code for it.  */
4626   inst.size = 0;
4627 }
4628
4629 static void
4630 do_ldmstm (void)
4631 {
4632   int base_reg = inst.operands[0].reg;
4633   int range = inst.operands[1].imm;
4634
4635   inst.instruction |= base_reg << 16;
4636   inst.instruction |= range;
4637
4638   if (inst.operands[1].writeback)
4639     inst.instruction |= LDM_TYPE_2_OR_3;
4640
4641   if (inst.operands[0].writeback)
4642     {
4643       inst.instruction |= WRITE_BACK;
4644       /* Check for unpredictable uses of writeback.  */
4645       if (inst.instruction & LOAD_BIT)
4646         {
4647           /* Not allowed in LDM type 2.  */
4648           if ((inst.instruction & LDM_TYPE_2_OR_3)
4649               && ((range & (1 << REG_PC)) == 0))
4650             as_warn (_("writeback of base register is UNPREDICTABLE"));
4651           /* Only allowed if base reg not in list for other types.  */
4652           else if (range & (1 << base_reg))
4653             as_warn (_("writeback of base register when in register list is UNPREDICTABLE"));
4654         }
4655       else /* STM.  */
4656         {
4657           /* Not allowed for type 2.  */
4658           if (inst.instruction & LDM_TYPE_2_OR_3)
4659             as_warn (_("writeback of base register is UNPREDICTABLE"));
4660           /* Only allowed if base reg not in list, or first in list.  */
4661           else if ((range & (1 << base_reg))
4662                    && (range & ((1 << base_reg) - 1)))
4663             as_warn (_("if writeback register is in list, it must be the lowest reg in the list"));
4664         }
4665     }
4666 }
4667
4668 /* ARMv5TE load-consecutive (argument parse)
4669    Mode is like LDRH.
4670
4671      LDRccD R, mode
4672      STRccD R, mode.  */
4673
4674 static void
4675 do_ldrd (void)
4676 {
4677   constraint (inst.operands[0].reg % 2 != 0,
4678               _("first destination register must be even"));
4679   constraint (inst.operands[1].present
4680               && inst.operands[1].reg != inst.operands[0].reg + 1,
4681               _("can only load two consecutive registers"));
4682   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
4683   constraint (!inst.operands[2].isreg, _("'[' expected"));
4684
4685   if (!inst.operands[1].present)
4686     inst.operands[1].reg = inst.operands[0].reg + 1;
4687   
4688   if (inst.instruction & LOAD_BIT)
4689     {
4690       /* encode_arm_addr_mode_3 will diagnose overlap between the base
4691          register and the first register written; we have to diagnose
4692          overlap between the base and the second register written here.  */
4693
4694       if (inst.operands[2].reg == inst.operands[1].reg
4695           && (inst.operands[2].writeback || inst.operands[2].postind))
4696         as_warn (_("base register written back, and overlaps "
4697                    "second destination register"));
4698
4699       /* For an index-register load, the index register must not overlap the
4700          destination (even if not write-back).  */
4701       else if (inst.operands[2].immisreg
4702                && ((unsigned) inst.operands[2].imm == inst.operands[0].reg
4703                    || (unsigned) inst.operands[2].imm == inst.operands[1].reg))
4704         as_warn (_("index register overlaps destination register"));
4705     }
4706
4707   inst.instruction |= inst.operands[0].reg << 12;
4708   encode_arm_addr_mode_3 (2, /*is_t=*/FALSE);
4709 }
4710
4711 static void
4712 do_ldrex (void)
4713 {
4714   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
4715               || inst.operands[1].postind || inst.operands[1].writeback
4716               || inst.operands[1].immisreg || inst.operands[1].shifted
4717               || inst.operands[1].negative,
4718               _("instruction does not accept this addressing mode"));
4719
4720   constraint (inst.operands[1].reg == REG_PC, BAD_PC);
4721
4722   constraint (inst.reloc.exp.X_op != O_constant
4723               || inst.reloc.exp.X_add_number != 0,
4724               _("offset must be zero in ARM encoding"));
4725
4726   inst.instruction |= inst.operands[0].reg << 12;
4727   inst.instruction |= inst.operands[1].reg << 16;
4728   inst.reloc.type = BFD_RELOC_UNUSED;
4729 }
4730
4731 static void
4732 do_ldrexd (void)
4733 {
4734   constraint (inst.operands[0].reg % 2 != 0,
4735               _("even register required"));
4736   constraint (inst.operands[1].present
4737               && inst.operands[1].reg != inst.operands[0].reg + 1,
4738               _("can only load two consecutive registers"));
4739   /* If op 1 were present and equal to PC, this function wouldn't
4740      have been called in the first place.  */
4741   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
4742
4743   inst.instruction |= inst.operands[0].reg << 12;
4744   inst.instruction |= inst.operands[2].reg << 16;
4745 }
4746
4747 static void
4748 do_ldst (void)
4749 {
4750   inst.instruction |= inst.operands[0].reg << 12;
4751   if (!inst.operands[1].isreg)
4752     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/FALSE))
4753       return;
4754   encode_arm_addr_mode_2 (1, /*is_t=*/FALSE);
4755 }
4756
4757 static void
4758 do_ldstt (void)
4759 {
4760   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
4761      reject [Rn,...].  */
4762   if (inst.operands[1].preind)
4763     {
4764       constraint (inst.reloc.exp.X_op != O_constant ||
4765                   inst.reloc.exp.X_add_number != 0,
4766                   _("this instruction requires a post-indexed address"));
4767
4768       inst.operands[1].preind = 0;
4769       inst.operands[1].postind = 1;
4770       inst.operands[1].writeback = 1;
4771     }
4772   inst.instruction |= inst.operands[0].reg << 12;
4773   encode_arm_addr_mode_2 (1, /*is_t=*/TRUE);
4774 }
4775
4776 /* Halfword and signed-byte load/store operations.  */
4777
4778 static void
4779 do_ldstv4 (void)
4780 {
4781   inst.instruction |= inst.operands[0].reg << 12;
4782   if (!inst.operands[1].isreg)
4783     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/TRUE))
4784       return;
4785   encode_arm_addr_mode_3 (1, /*is_t=*/FALSE);
4786 }
4787
4788 static void
4789 do_ldsttv4 (void)
4790 {
4791   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
4792      reject [Rn,...].  */
4793   if (inst.operands[1].preind)
4794     {
4795       constraint (inst.reloc.exp.X_op != O_constant ||
4796                   inst.reloc.exp.X_add_number != 0,
4797                   _("this instruction requires a post-indexed address"));
4798
4799       inst.operands[1].preind = 0;
4800       inst.operands[1].postind = 1;
4801       inst.operands[1].writeback = 1;
4802     }
4803   inst.instruction |= inst.operands[0].reg << 12;
4804   encode_arm_addr_mode_3 (1, /*is_t=*/TRUE);
4805 }
4806
4807 /* Co-processor register load/store.
4808    Format: <LDC|STC>{cond}[L] CP#,CRd,<address>  */
4809 static void
4810 do_lstc (void)
4811 {
4812   inst.instruction |= inst.operands[0].reg << 8;
4813   inst.instruction |= inst.operands[1].reg << 12;
4814   encode_arm_cp_address (2, TRUE, TRUE, 0);
4815 }
4816
4817 static void
4818 do_mlas (void)
4819 {
4820   /* This restriction does not apply to mls (nor to mla in v6, but
4821      that's hard to detect at present).  */
4822   if (inst.operands[0].reg == inst.operands[1].reg
4823       && !(inst.instruction & 0x00400000))
4824     as_tsktsk (_("rd and rm should be different in mla"));
4825
4826   inst.instruction |= inst.operands[0].reg << 16;
4827   inst.instruction |= inst.operands[1].reg;
4828   inst.instruction |= inst.operands[2].reg << 8;
4829   inst.instruction |= inst.operands[3].reg << 12;
4830
4831 }
4832
4833 static void
4834 do_mov (void)
4835 {
4836   inst.instruction |= inst.operands[0].reg << 12;
4837   encode_arm_shifter_operand (1);
4838 }
4839
4840 /* ARM V6T2 16-bit immediate register load: MOV[WT]{cond} Rd, #<imm16>.  */
4841 static void
4842 do_mov16 (void)
4843 {
4844   inst.instruction |= inst.operands[0].reg << 12;
4845   /* The value is in two pieces: 0:11, 16:19.  */
4846   inst.instruction |= (inst.operands[1].imm & 0x00000fff);
4847   inst.instruction |= (inst.operands[1].imm & 0x0000f000) << 4;
4848 }
4849
4850 static void
4851 do_mrs (void)
4852 {
4853   /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all.  */
4854   constraint ((inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f))
4855               != (PSR_c|PSR_f),
4856               _("'CPSR' or 'SPSR' expected"));
4857   inst.instruction |= inst.operands[0].reg << 12;
4858   inst.instruction |= (inst.operands[1].imm & SPSR_BIT);
4859 }
4860
4861 /* Two possible forms:
4862       "{C|S}PSR_<field>, Rm",
4863       "{C|S}PSR_f, #expression".  */
4864
4865 static void
4866 do_msr (void)
4867 {
4868   inst.instruction |= inst.operands[0].imm;
4869   if (inst.operands[1].isreg)
4870     inst.instruction |= inst.operands[1].reg;
4871   else
4872     {
4873       inst.instruction |= INST_IMMEDIATE;
4874       inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
4875       inst.reloc.pc_rel = 0;
4876     }
4877 }
4878
4879 static void
4880 do_mul (void)
4881 {
4882   if (!inst.operands[2].present)
4883     inst.operands[2].reg = inst.operands[0].reg;
4884   inst.instruction |= inst.operands[0].reg << 16;
4885   inst.instruction |= inst.operands[1].reg;
4886   inst.instruction |= inst.operands[2].reg << 8;
4887
4888   if (inst.operands[0].reg == inst.operands[1].reg)
4889     as_tsktsk (_("rd and rm should be different in mul"));
4890 }
4891
4892 /* Long Multiply Parser
4893    UMULL RdLo, RdHi, Rm, Rs
4894    SMULL RdLo, RdHi, Rm, Rs
4895    UMLAL RdLo, RdHi, Rm, Rs
4896    SMLAL RdLo, RdHi, Rm, Rs.  */
4897
4898 static void
4899 do_mull (void)
4900 {
4901   inst.instruction |= inst.operands[0].reg << 12;
4902   inst.instruction |= inst.operands[1].reg << 16;
4903   inst.instruction |= inst.operands[2].reg;
4904   inst.instruction |= inst.operands[3].reg << 8;
4905
4906   /* rdhi, rdlo and rm must all be different.  */
4907   if (inst.operands[0].reg == inst.operands[1].reg
4908       || inst.operands[0].reg == inst.operands[2].reg
4909       || inst.operands[1].reg == inst.operands[2].reg)
4910     as_tsktsk (_("rdhi, rdlo and rm must all be different"));
4911 }
4912
4913 static void
4914 do_nop (void)
4915 {
4916   if (inst.operands[0].present)
4917     {
4918       /* Architectural NOP hints are CPSR sets with no bits selected.  */
4919       inst.instruction &= 0xf0000000;
4920       inst.instruction |= 0x0320f000 + inst.operands[0].imm;
4921     }
4922 }
4923
4924 /* ARM V6 Pack Halfword Bottom Top instruction (argument parse).
4925    PKHBT {<cond>} <Rd>, <Rn>, <Rm> {, LSL #<shift_imm>}
4926    Condition defaults to COND_ALWAYS.
4927    Error if Rd, Rn or Rm are R15.  */
4928
4929 static void
4930 do_pkhbt (void)
4931 {
4932   inst.instruction |= inst.operands[0].reg << 12;
4933   inst.instruction |= inst.operands[1].reg << 16;
4934   inst.instruction |= inst.operands[2].reg;
4935   if (inst.operands[3].present)
4936     encode_arm_shift (3);
4937 }
4938
4939 /* ARM V6 PKHTB (Argument Parse).  */
4940
4941 static void
4942 do_pkhtb (void)
4943 {
4944   if (!inst.operands[3].present)
4945     {
4946       /* If the shift specifier is omitted, turn the instruction
4947          into pkhbt rd, rm, rn. */
4948       inst.instruction &= 0xfff00010;
4949       inst.instruction |= inst.operands[0].reg << 12;
4950       inst.instruction |= inst.operands[1].reg;
4951       inst.instruction |= inst.operands[2].reg << 16;
4952     }
4953   else
4954     {
4955       inst.instruction |= inst.operands[0].reg << 12;
4956       inst.instruction |= inst.operands[1].reg << 16;
4957       inst.instruction |= inst.operands[2].reg;
4958       encode_arm_shift (3);
4959     }
4960 }
4961
4962 /* ARMv5TE: Preload-Cache
4963
4964     PLD <addr_mode>
4965
4966   Syntactically, like LDR with B=1, W=0, L=1.  */
4967
4968 static void
4969 do_pld (void)
4970 {
4971   constraint (!inst.operands[0].isreg,
4972               _("'[' expected after PLD mnemonic"));
4973   constraint (inst.operands[0].postind,
4974               _("post-indexed expression used in preload instruction"));
4975   constraint (inst.operands[0].writeback,
4976               _("writeback used in preload instruction"));
4977   constraint (!inst.operands[0].preind,
4978               _("unindexed addressing used in preload instruction"));
4979   inst.instruction |= inst.operands[0].reg;
4980   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
4981 }
4982
4983 static void
4984 do_push_pop (void)
4985 {
4986   inst.operands[1] = inst.operands[0];
4987   memset (&inst.operands[0], 0, sizeof inst.operands[0]);
4988   inst.operands[0].isreg = 1;
4989   inst.operands[0].writeback = 1;
4990   inst.operands[0].reg = REG_SP;
4991   do_ldmstm ();
4992 }
4993
4994 /* ARM V6 RFE (Return from Exception) loads the PC and CPSR from the
4995    word at the specified address and the following word
4996    respectively.
4997    Unconditionally executed.
4998    Error if Rn is R15.  */
4999
5000 static void
5001 do_rfe (void)
5002 {
5003   inst.instruction |= inst.operands[0].reg << 16;
5004   if (inst.operands[0].writeback)
5005     inst.instruction |= WRITE_BACK;
5006 }
5007
5008 /* ARM V6 ssat (argument parse).  */
5009
5010 static void
5011 do_ssat (void)
5012 {
5013   inst.instruction |= inst.operands[0].reg << 12;
5014   inst.instruction |= (inst.operands[1].imm - 1) << 16;
5015   inst.instruction |= inst.operands[2].reg;
5016
5017   if (inst.operands[3].present)
5018     encode_arm_shift (3);
5019 }
5020
5021 /* ARM V6 usat (argument parse).  */
5022
5023 static void
5024 do_usat (void)
5025 {
5026   inst.instruction |= inst.operands[0].reg << 12;
5027   inst.instruction |= inst.operands[1].imm << 16;
5028   inst.instruction |= inst.operands[2].reg;
5029
5030   if (inst.operands[3].present)
5031     encode_arm_shift (3);
5032 }
5033
5034 /* ARM V6 ssat16 (argument parse).  */
5035
5036 static void
5037 do_ssat16 (void)
5038 {
5039   inst.instruction |= inst.operands[0].reg << 12;
5040   inst.instruction |= ((inst.operands[1].imm - 1) << 16);
5041   inst.instruction |= inst.operands[2].reg;
5042 }
5043
5044 static void
5045 do_usat16 (void)
5046 {
5047   inst.instruction |= inst.operands[0].reg << 12;
5048   inst.instruction |= inst.operands[1].imm << 16;
5049   inst.instruction |= inst.operands[2].reg;
5050 }
5051
5052 /* ARM V6 SETEND (argument parse).  Sets the E bit in the CPSR while
5053    preserving the other bits.
5054
5055    setend <endian_specifier>, where <endian_specifier> is either
5056    BE or LE.  */
5057
5058 static void
5059 do_setend (void)
5060 {
5061   if (inst.operands[0].imm)
5062     inst.instruction |= 0x200;
5063 }
5064
5065 static void
5066 do_shift (void)
5067 {
5068   unsigned int Rm = (inst.operands[1].present
5069                      ? inst.operands[1].reg
5070                      : inst.operands[0].reg);
5071
5072   inst.instruction |= inst.operands[0].reg << 12;
5073   inst.instruction |= Rm;
5074   if (inst.operands[2].isreg)  /* Rd, {Rm,} Rs */
5075     {
5076       constraint (inst.operands[0].reg != Rm,
5077                   _("source1 and dest must be same register"));
5078       inst.instruction |= inst.operands[2].reg << 8;
5079       inst.instruction |= SHIFT_BY_REG;
5080     }
5081   else
5082     inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
5083 }
5084
5085 static void
5086 do_smi (void)
5087 {
5088   inst.reloc.type = BFD_RELOC_ARM_SMI;
5089   inst.reloc.pc_rel = 0;
5090 }
5091
5092 static void
5093 do_swi (void)
5094 {
5095   inst.reloc.type = BFD_RELOC_ARM_SWI;
5096   inst.reloc.pc_rel = 0;
5097 }
5098
5099 /* ARM V5E (El Segundo) signed-multiply-accumulate (argument parse)
5100    SMLAxy{cond} Rd,Rm,Rs,Rn
5101    SMLAWy{cond} Rd,Rm,Rs,Rn
5102    Error if any register is R15.  */
5103
5104 static void
5105 do_smla (void)
5106 {
5107   inst.instruction |= inst.operands[0].reg << 16;
5108   inst.instruction |= inst.operands[1].reg;
5109   inst.instruction |= inst.operands[2].reg << 8;
5110   inst.instruction |= inst.operands[3].reg << 12;
5111 }
5112
5113 /* ARM V5E (El Segundo) signed-multiply-accumulate-long (argument parse)
5114    SMLALxy{cond} Rdlo,Rdhi,Rm,Rs
5115    Error if any register is R15.
5116    Warning if Rdlo == Rdhi.  */
5117
5118 static void
5119 do_smlal (void)
5120 {
5121   inst.instruction |= inst.operands[0].reg << 12;
5122   inst.instruction |= inst.operands[1].reg << 16;
5123   inst.instruction |= inst.operands[2].reg;
5124   inst.instruction |= inst.operands[3].reg << 8;
5125
5126   if (inst.operands[0].reg == inst.operands[1].reg)
5127     as_tsktsk (_("rdhi and rdlo must be different"));
5128 }
5129
5130 /* ARM V5E (El Segundo) signed-multiply (argument parse)
5131    SMULxy{cond} Rd,Rm,Rs
5132    Error if any register is R15.  */
5133
5134 static void
5135 do_smul (void)
5136 {
5137   inst.instruction |= inst.operands[0].reg << 16;
5138   inst.instruction |= inst.operands[1].reg;
5139   inst.instruction |= inst.operands[2].reg << 8;
5140 }
5141
5142 /* ARM V6 srs (argument parse).  */
5143
5144 static void
5145 do_srs (void)
5146 {
5147   inst.instruction |= inst.operands[0].imm;
5148   if (inst.operands[0].writeback)
5149     inst.instruction |= WRITE_BACK;
5150 }
5151
5152 /* ARM V6 strex (argument parse).  */
5153
5154 static void
5155 do_strex (void)
5156 {
5157   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
5158               || inst.operands[2].postind || inst.operands[2].writeback
5159               || inst.operands[2].immisreg || inst.operands[2].shifted
5160               || inst.operands[2].negative,
5161               _("instruction does not accept this addressing mode"));
5162
5163   constraint (inst.operands[2].reg == REG_PC, BAD_PC);
5164
5165   constraint (inst.operands[0].reg == inst.operands[1].reg
5166               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
5167
5168   constraint (inst.reloc.exp.X_op != O_constant
5169               || inst.reloc.exp.X_add_number != 0,
5170               _("offset must be zero in ARM encoding"));
5171
5172   inst.instruction |= inst.operands[0].reg << 12;
5173   inst.instruction |= inst.operands[1].reg;
5174   inst.instruction |= inst.operands[2].reg << 16;
5175   inst.reloc.type = BFD_RELOC_UNUSED;
5176 }
5177
5178 static void
5179 do_strexd (void)
5180 {
5181   constraint (inst.operands[1].reg % 2 != 0,
5182               _("even register required"));
5183   constraint (inst.operands[2].present
5184               && inst.operands[2].reg != inst.operands[1].reg + 1,
5185               _("can only store two consecutive registers"));
5186   /* If op 2 were present and equal to PC, this function wouldn't
5187      have been called in the first place.  */
5188   constraint (inst.operands[1].reg == REG_LR, _("r14 not allowed here"));
5189
5190   constraint (inst.operands[0].reg == inst.operands[1].reg
5191               || inst.operands[0].reg == inst.operands[1].reg + 1
5192               || inst.operands[0].reg == inst.operands[3].reg,
5193               BAD_OVERLAP);
5194
5195   inst.instruction |= inst.operands[0].reg << 12;
5196   inst.instruction |= inst.operands[1].reg;
5197   inst.instruction |= inst.operands[3].reg << 16;
5198 }
5199
5200 /* ARM V6 SXTAH extracts a 16-bit value from a register, sign
5201    extends it to 32-bits, and adds the result to a value in another
5202    register.  You can specify a rotation by 0, 8, 16, or 24 bits
5203    before extracting the 16-bit value.
5204    SXTAH{<cond>} <Rd>, <Rn>, <Rm>{, <rotation>}
5205    Condition defaults to COND_ALWAYS.
5206    Error if any register uses R15.  */
5207
5208 static void
5209 do_sxtah (void)
5210 {
5211   inst.instruction |= inst.operands[0].reg << 12;
5212   inst.instruction |= inst.operands[1].reg << 16;
5213   inst.instruction |= inst.operands[2].reg;
5214   inst.instruction |= inst.operands[3].imm << 10;
5215 }
5216
5217 /* ARM V6 SXTH.
5218
5219    SXTH {<cond>} <Rd>, <Rm>{, <rotation>}
5220    Condition defaults to COND_ALWAYS.
5221    Error if any register uses R15.  */
5222
5223 static void
5224 do_sxth (void)
5225 {
5226   inst.instruction |= inst.operands[0].reg << 12;
5227   inst.instruction |= inst.operands[1].reg;
5228   inst.instruction |= inst.operands[2].imm << 10;
5229 }
5230 \f
5231 /* VFP instructions.  In a logical order: SP variant first, monad
5232    before dyad, arithmetic then move then load/store.  */
5233
5234 static void
5235 do_vfp_sp_monadic (void)
5236 {
5237   encode_arm_vfp_sp_reg (inst.operands[0].reg, VFP_REG_Sd);
5238   encode_arm_vfp_sp_reg (inst.operands[1].reg, VFP_REG_Sm);
5239 }
5240
5241 static void
5242 do_vfp_sp_dyadic (void)
5243 {
5244   encode_arm_vfp_sp_reg (inst.operands[0].reg, VFP_REG_Sd);
5245   encode_arm_vfp_sp_reg (inst.operands[1].reg, VFP_REG_Sn);
5246   encode_arm_vfp_sp_reg (inst.operands[2].reg, VFP_REG_Sm);
5247 }
5248
5249 static void
5250 do_vfp_sp_compare_z (void)
5251 {
5252   encode_arm_vfp_sp_reg (inst.operands[0].reg, VFP_REG_Sd);
5253 }
5254
5255 static void
5256 do_vfp_dp_sp_cvt (void)
5257 {
5258   inst.instruction |= inst.operands[0].reg << 12;
5259   encode_arm_vfp_sp_reg (inst.operands[1].reg, VFP_REG_Sm);
5260 }
5261
5262 static void
5263 do_vfp_sp_dp_cvt (void)
5264 {
5265   encode_arm_vfp_sp_reg (inst.operands[0].reg, VFP_REG_Sd);
5266   inst.instruction |= inst.operands[1].reg;
5267 }
5268
5269 static void
5270 do_vfp_reg_from_sp (void)
5271 {
5272   inst.instruction |= inst.operands[0].reg << 12;
5273   encode_arm_vfp_sp_reg (inst.operands[1].reg, VFP_REG_Sn);
5274 }
5275
5276 static void
5277 do_vfp_reg2_from_sp2 (void)
5278 {
5279   constraint (inst.operands[2].imm != 2,
5280               _("only two consecutive VFP SP registers allowed here"));
5281   inst.instruction |= inst.operands[0].reg << 12;
5282   inst.instruction |= inst.operands[1].reg << 16;
5283   encode_arm_vfp_sp_reg (inst.operands[2].reg, VFP_REG_Sm);
5284 }
5285
5286 static void
5287 do_vfp_sp_from_reg (void)
5288 {
5289   encode_arm_vfp_sp_reg (inst.operands[0].reg, VFP_REG_Sn);
5290   inst.instruction |= inst.operands[1].reg << 12;
5291 }
5292
5293 static void
5294 do_vfp_sp2_from_reg2 (void)
5295 {
5296   constraint (inst.operands[0].imm != 2,
5297               _("only two consecutive VFP SP registers allowed here"));
5298   encode_arm_vfp_sp_reg (inst.operands[0].reg, VFP_REG_Sm);
5299   inst.instruction |= inst.operands[1].reg << 12;
5300   inst.instruction |= inst.operands[2].reg << 16;
5301 }
5302
5303 static void
5304 do_vfp_sp_ldst (void)
5305 {
5306   encode_arm_vfp_sp_reg (inst.operands[0].reg, VFP_REG_Sd);
5307   encode_arm_cp_address (1, FALSE, TRUE, 0);
5308 }
5309
5310 static void
5311 do_vfp_dp_ldst (void)
5312 {
5313   inst.instruction |= inst.operands[0].reg << 12;
5314   encode_arm_cp_address (1, FALSE, TRUE, 0);
5315 }
5316
5317
5318 static void
5319 vfp_sp_ldstm (enum vfp_ldstm_type ldstm_type)
5320 {
5321   if (inst.operands[0].writeback)
5322     inst.instruction |= WRITE_BACK;
5323   else
5324     constraint (ldstm_type != VFP_LDSTMIA,
5325                 _("this addressing mode requires base-register writeback"));
5326   inst.instruction |= inst.operands[0].reg << 16;
5327   encode_arm_vfp_sp_reg (inst.operands[1].reg, VFP_REG_Sd);
5328   inst.instruction |= inst.operands[1].imm;
5329 }
5330
5331 static void
5332 vfp_dp_ldstm (enum vfp_ldstm_type ldstm_type)
5333 {
5334   int count;
5335
5336   if (inst.operands[0].writeback)
5337     inst.instruction |= WRITE_BACK;
5338   else
5339     constraint (ldstm_type != VFP_LDSTMIA && ldstm_type != VFP_LDSTMIAX,
5340                 _("this addressing mode requires base-register writeback"));
5341
5342   inst.instruction |= inst.operands[0].reg << 16;
5343   inst.instruction |= inst.operands[1].reg << 12;
5344
5345   count = inst.operands[1].imm << 1;
5346   if (ldstm_type == VFP_LDSTMIAX || ldstm_type == VFP_LDSTMDBX)
5347     count += 1;
5348
5349   inst.instruction |= count;
5350 }
5351
5352 static void
5353 do_vfp_sp_ldstmia (void)
5354 {
5355   vfp_sp_ldstm (VFP_LDSTMIA);
5356 }
5357
5358 static void
5359 do_vfp_sp_ldstmdb (void)
5360 {
5361   vfp_sp_ldstm (VFP_LDSTMDB);
5362 }
5363
5364 static void
5365 do_vfp_dp_ldstmia (void)
5366 {
5367   vfp_dp_ldstm (VFP_LDSTMIA);
5368 }
5369
5370 static void
5371 do_vfp_dp_ldstmdb (void)
5372 {
5373   vfp_dp_ldstm (VFP_LDSTMDB);
5374 }
5375
5376 static void
5377 do_vfp_xp_ldstmia (void)
5378 {
5379   vfp_dp_ldstm (VFP_LDSTMIAX);
5380 }
5381
5382 static void
5383 do_vfp_xp_ldstmdb (void)
5384 {
5385   vfp_dp_ldstm (VFP_LDSTMDBX);
5386 }
5387 \f
5388 /* FPA instructions.  Also in a logical order.  */
5389
5390 static void
5391 do_fpa_cmp (void)
5392 {
5393   inst.instruction |= inst.operands[0].reg << 16;
5394   inst.instruction |= inst.operands[1].reg;
5395 }
5396
5397 static void
5398 do_fpa_ldmstm (void)
5399 {
5400   inst.instruction |= inst.operands[0].reg << 12;
5401   switch (inst.operands[1].imm)
5402     {
5403     case 1: inst.instruction |= CP_T_X;          break;
5404     case 2: inst.instruction |= CP_T_Y;          break;
5405     case 3: inst.instruction |= CP_T_Y | CP_T_X; break;
5406     case 4:                                      break;
5407     default: abort ();
5408     }
5409
5410   if (inst.instruction & (PRE_INDEX | INDEX_UP))
5411     {
5412       /* The instruction specified "ea" or "fd", so we can only accept
5413          [Rn]{!}.  The instruction does not really support stacking or
5414          unstacking, so we have to emulate these by setting appropriate
5415          bits and offsets.  */
5416       constraint (inst.reloc.exp.X_op != O_constant
5417                   || inst.reloc.exp.X_add_number != 0,
5418                   _("this instruction does not support indexing"));
5419
5420       if ((inst.instruction & PRE_INDEX) || inst.operands[2].writeback)
5421         inst.reloc.exp.X_add_number = 12 * inst.operands[1].imm;
5422
5423       if (!(inst.instruction & INDEX_UP))
5424         inst.reloc.exp.X_add_number = -inst.reloc.exp.X_add_number;
5425
5426       if (!(inst.instruction & PRE_INDEX) && inst.operands[2].writeback)
5427         {
5428           inst.operands[2].preind = 0;
5429           inst.operands[2].postind = 1;
5430         }
5431     }
5432
5433   encode_arm_cp_address (2, TRUE, TRUE, 0);
5434 }
5435 \f
5436 /* iWMMXt instructions: strictly in alphabetical order.  */
5437
5438 static void
5439 do_iwmmxt_tandorc (void)
5440 {
5441   constraint (inst.operands[0].reg != REG_PC, _("only r15 allowed here"));
5442 }
5443
5444 static void
5445 do_iwmmxt_textrc (void)
5446 {
5447   inst.instruction |= inst.operands[0].reg << 12;
5448   inst.instruction |= inst.operands[1].imm;
5449 }
5450
5451 static void
5452 do_iwmmxt_textrm (void)
5453 {
5454   inst.instruction |= inst.operands[0].reg << 12;
5455   inst.instruction |= inst.operands[1].reg << 16;
5456   inst.instruction |= inst.operands[2].imm;
5457 }
5458
5459 static void
5460 do_iwmmxt_tinsr (void)
5461 {
5462   inst.instruction |= inst.operands[0].reg << 16;
5463   inst.instruction |= inst.operands[1].reg << 12;
5464   inst.instruction |= inst.operands[2].imm;
5465 }
5466
5467 static void
5468 do_iwmmxt_tmia (void)
5469 {
5470   inst.instruction |= inst.operands[0].reg << 5;
5471   inst.instruction |= inst.operands[1].reg;
5472   inst.instruction |= inst.operands[2].reg << 12;
5473 }
5474
5475 static void
5476 do_iwmmxt_waligni (void)
5477 {
5478   inst.instruction |= inst.operands[0].reg << 12;
5479   inst.instruction |= inst.operands[1].reg << 16;
5480   inst.instruction |= inst.operands[2].reg;
5481   inst.instruction |= inst.operands[3].imm << 20;
5482 }
5483
5484 static void
5485 do_iwmmxt_wmov (void)
5486 {
5487   /* WMOV rD, rN is an alias for WOR rD, rN, rN.  */
5488   inst.instruction |= inst.operands[0].reg << 12;
5489   inst.instruction |= inst.operands[1].reg << 16;
5490   inst.instruction |= inst.operands[1].reg;
5491 }
5492
5493 static void
5494 do_iwmmxt_wldstbh (void)
5495 {
5496   inst.instruction |= inst.operands[0].reg << 12;
5497   inst.reloc.exp.X_add_number *= 4;
5498   encode_arm_cp_address (1, TRUE, FALSE, BFD_RELOC_ARM_CP_OFF_IMM_S2);
5499 }
5500
5501 static void
5502 do_iwmmxt_wldstw (void)
5503 {
5504   /* RIWR_RIWC clears .isreg for a control register.  */
5505   if (!inst.operands[0].isreg)
5506     {
5507       constraint (inst.cond != COND_ALWAYS, BAD_COND);
5508       inst.instruction |= 0xf0000000;
5509     }
5510
5511   inst.instruction |= inst.operands[0].reg << 12;
5512   encode_arm_cp_address (1, TRUE, TRUE, 0);
5513 }
5514
5515 static void
5516 do_iwmmxt_wldstd (void)
5517 {
5518   inst.instruction |= inst.operands[0].reg << 12;
5519   encode_arm_cp_address (1, TRUE, FALSE, BFD_RELOC_ARM_CP_OFF_IMM_S2);
5520 }
5521
5522 static void
5523 do_iwmmxt_wshufh (void)
5524 {
5525   inst.instruction |= inst.operands[0].reg << 12;
5526   inst.instruction |= inst.operands[1].reg << 16;
5527   inst.instruction |= ((inst.operands[2].imm & 0xf0) << 16);
5528   inst.instruction |= (inst.operands[2].imm & 0x0f);
5529 }
5530
5531 static void
5532 do_iwmmxt_wzero (void)
5533 {
5534   /* WZERO reg is an alias for WANDN reg, reg, reg.  */
5535   inst.instruction |= inst.operands[0].reg;
5536   inst.instruction |= inst.operands[0].reg << 12;
5537   inst.instruction |= inst.operands[0].reg << 16;
5538 }
5539 \f
5540 /* Cirrus Maverick instructions.  Simple 2-, 3-, and 4-register
5541    operations first, then control, shift, and load/store.  */
5542
5543 /* Insns like "foo X,Y,Z".  */
5544
5545 static void
5546 do_mav_triple (void)
5547 {
5548   inst.instruction |= inst.operands[0].reg << 16;
5549   inst.instruction |= inst.operands[1].reg;
5550   inst.instruction |= inst.operands[2].reg << 12;
5551 }
5552
5553 /* Insns like "foo W,X,Y,Z".
5554     where W=MVAX[0:3] and X,Y,Z=MVFX[0:15].  */
5555
5556 static void
5557 do_mav_quad (void)
5558 {
5559   inst.instruction |= inst.operands[0].reg << 5;
5560   inst.instruction |= inst.operands[1].reg << 12;
5561   inst.instruction |= inst.operands[2].reg << 16;
5562   inst.instruction |= inst.operands[3].reg;
5563 }
5564
5565 /* cfmvsc32<cond> DSPSC,MVDX[15:0].  */
5566 static void
5567 do_mav_dspsc (void)
5568 {
5569   inst.instruction |= inst.operands[1].reg << 12;
5570 }
5571
5572 /* Maverick shift immediate instructions.
5573    cfsh32<cond> MVFX[15:0],MVFX[15:0],Shift[6:0].
5574    cfsh64<cond> MVDX[15:0],MVDX[15:0],Shift[6:0].  */
5575
5576 static void
5577 do_mav_shift (void)
5578 {
5579   int imm = inst.operands[2].imm;
5580
5581   inst.instruction |= inst.operands[0].reg << 12;
5582   inst.instruction |= inst.operands[1].reg << 16;
5583
5584   /* Bits 0-3 of the insn should have bits 0-3 of the immediate.
5585      Bits 5-7 of the insn should have bits 4-6 of the immediate.
5586      Bit 4 should be 0.  */
5587   imm = (imm & 0xf) | ((imm & 0x70) << 1);
5588
5589   inst.instruction |= imm;
5590 }
5591 \f
5592 /* XScale instructions.  Also sorted arithmetic before move.  */
5593
5594 /* Xscale multiply-accumulate (argument parse)
5595      MIAcc   acc0,Rm,Rs
5596      MIAPHcc acc0,Rm,Rs
5597      MIAxycc acc0,Rm,Rs.  */
5598
5599 static void
5600 do_xsc_mia (void)
5601 {
5602   inst.instruction |= inst.operands[1].reg;
5603   inst.instruction |= inst.operands[2].reg << 12;
5604 }
5605
5606 /* Xscale move-accumulator-register (argument parse)
5607
5608      MARcc   acc0,RdLo,RdHi.  */
5609
5610 static void
5611 do_xsc_mar (void)
5612 {
5613   inst.instruction |= inst.operands[1].reg << 12;
5614   inst.instruction |= inst.operands[2].reg << 16;
5615 }
5616
5617 /* Xscale move-register-accumulator (argument parse)
5618
5619      MRAcc   RdLo,RdHi,acc0.  */
5620
5621 static void
5622 do_xsc_mra (void)
5623 {
5624   constraint (inst.operands[0].reg == inst.operands[1].reg, BAD_OVERLAP);
5625   inst.instruction |= inst.operands[0].reg << 12;
5626   inst.instruction |= inst.operands[1].reg << 16;
5627 }
5628 \f
5629 /* Encoding functions relevant only to Thumb.  */
5630
5631 /* inst.operands[i] is a shifted-register operand; encode
5632    it into inst.instruction in the format used by Thumb32.  */
5633
5634 static void
5635 encode_thumb32_shifted_operand (int i)
5636 {
5637   unsigned int value = inst.reloc.exp.X_add_number;
5638   unsigned int shift = inst.operands[i].shift_kind;
5639
5640   inst.instruction |= inst.operands[i].reg;
5641   if (shift == SHIFT_RRX)
5642     inst.instruction |= SHIFT_ROR << 4;
5643   else
5644     {
5645       constraint (inst.reloc.exp.X_op != O_constant,
5646                   _("expression too complex"));
5647
5648       constraint (value > 32
5649                   || (value == 32 && (shift == SHIFT_LSL
5650                                       || shift == SHIFT_ROR)),
5651                   _("shift expression is too large"));
5652
5653       if (value == 0)
5654         shift = SHIFT_LSL;
5655       else if (value == 32)
5656         value = 0;
5657
5658       inst.instruction |= shift << 4;
5659       inst.instruction |= (value & 0x1c) << 10;
5660       inst.instruction |= (value & 0x03) << 6;
5661     }
5662 }
5663
5664
5665 /* inst.operands[i] was set up by parse_address.  Encode it into a
5666    Thumb32 format load or store instruction.  Reject forms that cannot
5667    be used with such instructions.  If is_t is true, reject forms that
5668    cannot be used with a T instruction; if is_d is true, reject forms
5669    that cannot be used with a D instruction.  */
5670
5671 static void
5672 encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
5673 {
5674   bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
5675
5676   constraint (!inst.operands[i].isreg,
5677               _("Thumb does not support the ldr =N pseudo-operation"));
5678
5679   inst.instruction |= inst.operands[i].reg << 16;
5680   if (inst.operands[i].immisreg)
5681     {
5682       constraint (is_pc, _("cannot use register index with PC-relative addressing"));
5683       constraint (is_t || is_d, _("cannot use register index with this instruction"));
5684       constraint (inst.operands[i].negative,
5685                   _("Thumb does not support negative register indexing"));
5686       constraint (inst.operands[i].postind,
5687                   _("Thumb does not support register post-indexing"));
5688       constraint (inst.operands[i].writeback,
5689                   _("Thumb does not support register indexing with writeback"));
5690       constraint (inst.operands[i].shifted && inst.operands[i].shift_kind != SHIFT_LSL,
5691                   _("Thumb supports only LSL in shifted register indexing"));
5692
5693       inst.instruction |= inst.operands[1].imm;
5694       if (inst.operands[i].shifted)
5695         {
5696           constraint (inst.reloc.exp.X_op != O_constant,
5697                       _("expression too complex"));
5698           constraint (inst.reloc.exp.X_add_number < 0 || inst.reloc.exp.X_add_number > 3,
5699                       _("shift out of range"));
5700           inst.instruction |= inst.reloc.exp.X_op << 4;
5701         }
5702       inst.reloc.type = BFD_RELOC_UNUSED;
5703     }
5704   else if (inst.operands[i].preind)
5705     {
5706       constraint (is_pc && inst.operands[i].writeback,
5707                   _("cannot use writeback with PC-relative addressing"));
5708       constraint (is_t && inst.operands[1].writeback,
5709                   _("cannot use writeback with this instruction"));
5710
5711       if (is_d)
5712         {
5713           inst.instruction |= 0x01000000;
5714           if (inst.operands[i].writeback)
5715             inst.instruction |= 0x00200000;
5716         }
5717       else
5718         {
5719           inst.instruction |= 0x00000c00;
5720           if (inst.operands[i].writeback)
5721             inst.instruction |= 0x00000100;
5722         }
5723       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
5724     }
5725   else if (inst.operands[i].postind)
5726     {
5727       assert (inst.operands[i].writeback);
5728       constraint (is_pc, _("cannot use post-indexing with PC-relative addressing"));
5729       constraint (is_t, _("cannot use post-indexing with this instruction"));
5730
5731       if (is_d)
5732         inst.instruction |= 0x00200000;
5733       else
5734         inst.instruction |= 0x00000900;
5735       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
5736     }
5737   else /* unindexed - only for coprocessor */
5738     inst.error = _("instruction does not accept unindexed addressing");
5739 }
5740
5741 /* Table of Thumb instructions which exist in both 16- and 32-bit
5742    encodings (the latter only in post-V6T2 cores).  The index is the
5743    value used in the insns table below.  When there is more than one
5744    possible 16-bit encoding for the instruction, this table always
5745    holds variant (1).  */
5746 #define T16_32_TAB                              \
5747   X(adc,   4140, eb400000),                     \
5748   X(adcs,  4140, eb500000),                     \
5749   X(add,   1c00, eb000000),                     \
5750   X(adds,  1c00, eb100000),                     \
5751   X(and,   4000, ea000000),                     \
5752   X(ands,  4000, ea100000),                     \
5753   X(asr,   1000, fa40f000),                     \
5754   X(asrs,  1000, fa50f000),                     \
5755   X(bic,   4380, ea200000),                     \
5756   X(bics,  4380, ea300000),                     \
5757   X(cmn,   42c0, eb100f00),                     \
5758   X(cmp,   2800, ebb00f00),                     \
5759   X(cpsie, b660, f3af8400),                     \
5760   X(cpsid, b670, f3af8600),                     \
5761   X(cpy,   4600, ea4f0000),                     \
5762   X(eor,   4040, ea800000),                     \
5763   X(eors,  4040, ea900000),                     \
5764   X(ldmia, c800, e8900000),                     \
5765   X(ldr,   6800, f8500000),                     \
5766   X(ldrb,  7800, f8100000),                     \
5767   X(ldrh,  8800, f8300000),                     \
5768   X(ldrsb, 5600, f9100000),                     \
5769   X(ldrsh, 5e00, f9300000),                     \
5770   X(lsl,   0000, fa00f000),                     \
5771   X(lsls,  0000, fa10f000),                     \
5772   X(lsr,   0800, fa20f000),                     \
5773   X(lsrs,  0800, fa30f000),                     \
5774   X(mov,   2000, ea4f0000),                     \
5775   X(movs,  2000, ea5f0000),                     \
5776   X(mul,   4340, fb00f000),                     \
5777   X(muls,  4340, ffffffff), /* no 32b muls */   \
5778   X(mvn,   43c0, ea6f0000),                     \
5779   X(mvns,  43c0, ea7f0000),                     \
5780   X(neg,   4240, f1c00000), /* rsb #0 */        \
5781   X(negs,  4240, f1d00000), /* rsbs #0 */       \
5782   X(orr,   4300, ea400000),                     \
5783   X(orrs,  4300, ea500000),                     \
5784   X(pop,   bc00, e8ad0000), /* ldmia sp!,... */ \
5785   X(push,  b400, e8bd0000), /* stmia sp!,... */ \
5786   X(rev,   ba00, fa90f080),                     \
5787   X(rev16, ba40, fa90f090),                     \
5788   X(revsh, bac0, fa90f0b0),                     \
5789   X(ror,   41c0, fa60f000),                     \
5790   X(rors,  41c0, fa70f000),                     \
5791   X(sbc,   4180, eb600000),                     \
5792   X(sbcs,  4180, eb700000),                     \
5793   X(stmia, c000, e8800000),                     \
5794   X(str,   6000, f8400000),                     \
5795   X(strb,  7000, f8000000),                     \
5796   X(strh,  8000, f8200000),                     \
5797   X(sub,   1e00, eba00000),                     \
5798   X(subs,  1e00, ebb00000),                     \
5799   X(sxtb,  b240, fa4ff080),                     \
5800   X(sxth,  b200, fa0ff080),                     \
5801   X(tst,   4200, ea100f00),                     \
5802   X(uxtb,  b2c0, fa5ff080),                     \
5803   X(uxth,  b280, fa1ff080),                     \
5804   X(nop,   bf00, f3af8000),                     \
5805   X(yield, bf10, f3af8001),                     \
5806   X(wfe,   bf20, f3af8002),                     \
5807   X(wfi,   bf30, f3af8003),                     \
5808   X(sev,   bf40, f3af9004), /* typo, 8004? */
5809
5810 /* To catch errors in encoding functions, the codes are all offset by
5811    0xF800, putting them in one of the 32-bit prefix ranges, ergo undefined
5812    as 16-bit instructions.  */
5813 #define X(a,b,c) T_MNEM_##a
5814 enum t16_32_codes { T16_32_OFFSET = 0xF7FF, T16_32_TAB };
5815 #undef X
5816
5817 #define X(a,b,c) 0x##b
5818 static const unsigned short thumb_op16[] = { T16_32_TAB };
5819 #define THUMB_OP16(n) (thumb_op16[(n) - (T16_32_OFFSET + 1)])
5820 #undef X
5821
5822 #define X(a,b,c) 0x##c
5823 static const unsigned int thumb_op32[] = { T16_32_TAB };
5824 #define THUMB_OP32(n) (thumb_op32[(n) - (T16_32_OFFSET + 1)])
5825 #define THUMB_SETS_FLAGS(n) (THUMB_OP32 (n) & 0x00100000)
5826 #undef X
5827 #undef T16_32_TAB
5828
5829 /* Thumb instruction encoders, in alphabetical order.  */
5830
5831 /* ADDW or SUBW.  */
5832 static void
5833 do_t_add_sub_w (void)
5834 {
5835   int Rd, Rn;
5836
5837   Rd = inst.operands[0].reg;
5838   Rn = inst.operands[1].reg;
5839
5840   constraint (Rd == 15, _("PC not allowed as destination"));
5841   inst.instruction |= (Rn << 16) | (Rd << 8);
5842   inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
5843 }
5844
5845 /* Parse an add or subtract instruction.  We get here with inst.instruction
5846    equalling any of THUMB_OPCODE_add, adds, sub, or subs.  */
5847
5848 static void
5849 do_t_add_sub (void)
5850 {
5851   int Rd, Rs, Rn;
5852
5853   Rd = inst.operands[0].reg;
5854   Rs = (inst.operands[1].present
5855         ? inst.operands[1].reg    /* Rd, Rs, foo */
5856         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
5857
5858   if (unified_syntax)
5859     {
5860       if (!inst.operands[2].isreg)
5861         {
5862           /* For an immediate, we always generate a 32-bit opcode;
5863              section relaxation will shrink it later if possible.  */
5864           inst.instruction = THUMB_OP32 (inst.instruction);
5865           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
5866           inst.instruction |= inst.operands[0].reg << 8;
5867           inst.instruction |= inst.operands[1].reg << 16;
5868           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
5869         }
5870       else
5871         {
5872           Rn = inst.operands[2].reg;
5873           /* See if we can do this with a 16-bit instruction.  */
5874           if (!inst.operands[2].shifted && inst.size_req != 4)
5875             {
5876               if (Rd <= 7 && Rn <= 7 && Rn <= 7
5877                   && (inst.instruction == T_MNEM_adds
5878                       || inst.instruction == T_MNEM_subs))
5879                 {
5880                   inst.instruction = (inst.instruction == T_MNEM_adds
5881                                       ? T_OPCODE_ADD_R3
5882                                       : T_OPCODE_SUB_R3);
5883                   inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
5884                   return;
5885                 }
5886
5887               if (inst.instruction == T_MNEM_add)
5888                 {
5889                   if (Rd == Rs)
5890                     {
5891                       inst.instruction = T_OPCODE_ADD_HI;
5892                       inst.instruction |= (Rd & 8) << 4;
5893                       inst.instruction |= (Rd & 7);
5894                       inst.instruction |= Rn << 3;
5895                       return;
5896                     }
5897                   /* ... because addition is commutative! */
5898                   else if (Rd == Rn)
5899                     {
5900                       inst.instruction = T_OPCODE_ADD_HI;
5901                       inst.instruction |= (Rd & 8) << 4;
5902                       inst.instruction |= (Rd & 7);
5903                       inst.instruction |= Rs << 3;
5904                       return;
5905                     }
5906                 }
5907             }
5908           /* If we get here, it can't be done in 16 bits.  */
5909           constraint (inst.operands[2].shifted && inst.operands[2].immisreg,
5910                       _("shift must be constant"));
5911           inst.instruction = THUMB_OP32 (inst.instruction);
5912           inst.instruction |= Rd << 8;
5913           inst.instruction |= Rs << 16;
5914           encode_thumb32_shifted_operand (2);
5915         }
5916     }
5917   else
5918     {
5919       constraint (inst.instruction == T_MNEM_adds
5920                   || inst.instruction == T_MNEM_subs,
5921                   BAD_THUMB32);
5922
5923       if (!inst.operands[2].isreg) /* Rd, Rs, #imm */
5924         {
5925           constraint ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP))
5926                       || (Rs > 7 && Rs != REG_SP && Rs != REG_PC),
5927                       BAD_HIREG);
5928
5929           inst.instruction = (inst.instruction == T_MNEM_add
5930                               ? 0x0000 : 0x8000);
5931           inst.instruction |= (Rd << 4) | Rs;
5932           inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
5933           return;
5934         }
5935
5936       Rn = inst.operands[2].reg;
5937       constraint (inst.operands[2].shifted, _("unshifted register required"));
5938
5939       /* We now have Rd, Rs, and Rn set to registers.  */
5940       if (Rd > 7 || Rs > 7 || Rn > 7)
5941         {
5942           /* Can't do this for SUB.      */
5943           constraint (inst.instruction == T_MNEM_sub, BAD_HIREG);
5944           inst.instruction = T_OPCODE_ADD_HI;
5945           inst.instruction |= (Rd & 8) << 4;
5946           inst.instruction |= (Rd & 7);
5947           if (Rs == Rd)
5948             inst.instruction |= Rn << 3;
5949           else if (Rn == Rd)
5950             inst.instruction |= Rs << 3;
5951           else
5952             constraint (1, _("dest must overlap one source register"));
5953         }
5954       else
5955         {
5956           inst.instruction = (inst.instruction == T_MNEM_add
5957                               ? T_OPCODE_ADD_R3 : T_OPCODE_SUB_R3);
5958           inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
5959         }
5960     }
5961 }
5962
5963 static void
5964 do_t_adr (void)
5965 {
5966   inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
5967   inst.reloc.exp.X_add_number -= 4; /* PC relative adjust.  */
5968   inst.reloc.pc_rel = 1;
5969
5970   inst.instruction |= inst.operands[0].reg << 4;
5971 }
5972
5973 /* Arithmetic instructions for which there is just one 16-bit
5974    instruction encoding, and it allows only two low registers.
5975    For maximal compatibility with ARM syntax, we allow three register
5976    operands even when Thumb-32 instructions are not available, as long
5977    as the first two are identical.  For instance, both "sbc r0,r1" and
5978    "sbc r0,r0,r1" are allowed.  */
5979 static void
5980 do_t_arit3 (void)
5981 {
5982   int Rd, Rs, Rn;
5983
5984   Rd = inst.operands[0].reg;
5985   Rs = (inst.operands[1].present
5986         ? inst.operands[1].reg    /* Rd, Rs, foo */
5987         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
5988   Rn = inst.operands[2].reg;
5989
5990   if (unified_syntax)
5991     {
5992       if (!inst.operands[2].isreg)
5993         {
5994           /* For an immediate, we always generate a 32-bit opcode;
5995              section relaxation will shrink it later if possible.  */
5996           inst.instruction = THUMB_OP32 (inst.instruction);
5997           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
5998           inst.instruction |= Rd << 8;
5999           inst.instruction |= Rs << 16;
6000           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
6001         }
6002       else
6003         {
6004           /* See if we can do this with a 16-bit instruction.  */
6005           if (THUMB_SETS_FLAGS (inst.instruction)
6006               && !inst.operands[2].shifted
6007               && inst.size_req != 4
6008               && Rd == Rs)
6009             {
6010               inst.instruction = THUMB_OP16 (inst.instruction);
6011               inst.instruction |= Rd;
6012               inst.instruction |= Rn << 3;
6013               return;
6014             }
6015
6016           /* If we get here, it can't be done in 16 bits.  */
6017           constraint (inst.operands[2].shifted
6018                       && inst.operands[2].immisreg,
6019                       _("shift must be constant"));
6020           inst.instruction = THUMB_OP32 (inst.instruction);
6021           inst.instruction |= Rd << 8;
6022           inst.instruction |= Rs << 16;
6023           encode_thumb32_shifted_operand (2);
6024         }
6025     }
6026   else
6027     {
6028       /* On its face this is a lie - the instruction does set the
6029          flags.  However, the only supported mnemonic in this mode
6030          says it doesn't.  */
6031       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
6032
6033       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
6034                   _("unshifted register required"));
6035       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
6036       constraint (Rd != Rs,
6037                   _("dest and source1 must be the same register"));
6038
6039       inst.instruction = THUMB_OP16 (inst.instruction);
6040       inst.instruction |= Rd;
6041       inst.instruction |= Rn << 3;
6042     }
6043 }
6044
6045 /* Similarly, but for instructions where the arithmetic operation is
6046    commutative, so we can allow either of them to be different from
6047    the destination operand in a 16-bit instruction.  For instance, all
6048    three of "adc r0,r1", "adc r0,r0,r1", and "adc r0,r1,r0" are
6049    accepted.  */
6050 static void
6051 do_t_arit3c (void)
6052 {
6053   int Rd, Rs, Rn;
6054
6055   Rd = inst.operands[0].reg;
6056   Rs = (inst.operands[1].present
6057         ? inst.operands[1].reg    /* Rd, Rs, foo */
6058         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
6059   Rn = inst.operands[2].reg;
6060
6061   if (unified_syntax)
6062     {
6063       if (!inst.operands[2].isreg)
6064         {
6065           /* For an immediate, we always generate a 32-bit opcode;
6066              section relaxation will shrink it later if possible.  */
6067           inst.instruction = THUMB_OP32 (inst.instruction);
6068           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
6069           inst.instruction |= Rd << 8;
6070           inst.instruction |= Rs << 16;
6071           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
6072         }
6073       else
6074         {
6075           /* See if we can do this with a 16-bit instruction.  */
6076           if (THUMB_SETS_FLAGS (inst.instruction)
6077               && !inst.operands[2].shifted
6078               && inst.size_req != 4)
6079             {
6080               if (Rd == Rs)
6081                 {
6082                   inst.instruction = THUMB_OP16 (inst.instruction);
6083                   inst.instruction |= Rd;
6084                   inst.instruction |= Rn << 3;
6085                   return;
6086                 }
6087               if (Rd == Rn)
6088                 {
6089                   inst.instruction = THUMB_OP16 (inst.instruction);
6090                   inst.instruction |= Rd;
6091                   inst.instruction |= Rs << 3;
6092                   return;
6093                 }
6094             }
6095
6096           /* If we get here, it can't be done in 16 bits.  */
6097           constraint (inst.operands[2].shifted
6098                       && inst.operands[2].immisreg,
6099                       _("shift must be constant"));
6100           inst.instruction = THUMB_OP32 (inst.instruction);
6101           inst.instruction |= Rd << 8;
6102           inst.instruction |= Rs << 16;
6103           encode_thumb32_shifted_operand (2);
6104         }
6105     }
6106   else
6107     {
6108       /* On its face this is a lie - the instruction does set the
6109          flags.  However, the only supported mnemonic in this mode
6110          says it doesn't.  */
6111       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
6112
6113       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
6114                   _("unshifted register required"));
6115       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
6116
6117       inst.instruction = THUMB_OP16 (inst.instruction);
6118       inst.instruction |= Rd;
6119
6120       if (Rd == Rs)
6121         inst.instruction |= Rn << 3;
6122       else if (Rd == Rn)
6123         inst.instruction |= Rs << 3;
6124       else
6125         constraint (1, _("dest must overlap one source register"));
6126     }
6127 }
6128
6129 static void
6130 do_t_bfc (void)
6131 {
6132   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
6133   constraint (msb > 32, _("bit-field extends past end of register"));
6134   /* The instruction encoding stores the LSB and MSB,
6135      not the LSB and width.  */
6136   inst.instruction |= inst.operands[0].reg << 8;
6137   inst.instruction |= (inst.operands[1].imm & 0x1c) << 10;
6138   inst.instruction |= (inst.operands[1].imm & 0x03) << 6;
6139   inst.instruction |= msb - 1;
6140 }
6141
6142 static void
6143 do_t_bfi (void)
6144 {
6145   unsigned int msb;
6146
6147   /* #0 in second position is alternative syntax for bfc, which is
6148      the same instruction but with REG_PC in the Rm field.  */
6149   if (!inst.operands[1].isreg)
6150     inst.operands[1].reg = REG_PC;
6151
6152   msb = inst.operands[2].imm + inst.operands[3].imm;
6153   constraint (msb > 32, _("bit-field extends past end of register"));
6154   /* The instruction encoding stores the LSB and MSB,
6155      not the LSB and width.  */
6156   inst.instruction |= inst.operands[0].reg << 8;
6157   inst.instruction |= inst.operands[1].reg << 16;
6158   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
6159   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
6160   inst.instruction |= msb - 1;
6161 }
6162
6163 static void
6164 do_t_bfx (void)
6165 {
6166   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
6167               _("bit-field extends past end of register"));
6168   inst.instruction |= inst.operands[0].reg << 8;
6169   inst.instruction |= inst.operands[1].reg << 16;
6170   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
6171   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
6172   inst.instruction |= inst.operands[3].imm - 1;
6173 }
6174
6175 /* ARM V5 Thumb BLX (argument parse)
6176         BLX <target_addr>       which is BLX(1)
6177         BLX <Rm>                which is BLX(2)
6178    Unfortunately, there are two different opcodes for this mnemonic.
6179    So, the insns[].value is not used, and the code here zaps values
6180         into inst.instruction.
6181
6182    ??? How to take advantage of the additional two bits of displacement
6183    available in Thumb32 mode?  Need new relocation?  */
6184
6185 static void
6186 do_t_blx (void)
6187 {
6188   if (inst.operands[0].isreg)
6189     /* We have a register, so this is BLX(2).  */
6190     inst.instruction |= inst.operands[0].reg << 3;
6191   else
6192     {
6193       /* No register.  This must be BLX(1).  */
6194       inst.instruction = 0xf000e800;
6195       inst.reloc.type   = BFD_RELOC_THUMB_PCREL_BLX;
6196       inst.reloc.pc_rel = 1;
6197     }
6198 }
6199
6200 static void
6201 do_t_branch (void)
6202 {
6203   if (unified_syntax && inst.size_req != 2)
6204     {
6205       if (inst.cond == COND_ALWAYS)
6206         {
6207           inst.instruction = 0xf000b000;
6208           inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH25;
6209         }
6210       else
6211         {
6212           assert (inst.cond != 0xF);
6213           inst.instruction = (inst.cond << 22) | 0xf0008000;
6214           inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH20;
6215         }
6216     }
6217   else
6218     {
6219       if (inst.cond == COND_ALWAYS)
6220         inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH12;
6221       else
6222         {
6223           inst.instruction = 0xd000 | (inst.cond << 8);
6224           inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH9;
6225         }
6226     }
6227
6228   inst.reloc.pc_rel = 1;
6229 }
6230
6231 static void
6232 do_t_bkpt (void)
6233 {
6234   if (inst.operands[0].present)
6235     {
6236       constraint (inst.operands[0].imm > 255,
6237                   _("immediate value out of range"));
6238       inst.instruction |= inst.operands[0].imm;
6239     }
6240 }
6241
6242 static void
6243 do_t_branch23 (void)
6244 {
6245   inst.reloc.type   = BFD_RELOC_THUMB_PCREL_BRANCH23;
6246   inst.reloc.pc_rel = 1;
6247
6248   /* If the destination of the branch is a defined symbol which does not have
6249      the THUMB_FUNC attribute, then we must be calling a function which has
6250      the (interfacearm) attribute.  We look for the Thumb entry point to that
6251      function and change the branch to refer to that function instead.  */
6252   if (   inst.reloc.exp.X_op == O_symbol
6253       && inst.reloc.exp.X_add_symbol != NULL
6254       && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
6255       && ! THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
6256     inst.reloc.exp.X_add_symbol =
6257       find_real_start (inst.reloc.exp.X_add_symbol);
6258 }
6259
6260 static void
6261 do_t_bx (void)
6262 {
6263   inst.instruction |= inst.operands[0].reg << 3;
6264   /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC.  The reloc
6265      should cause the alignment to be checked once it is known.  This is
6266      because BX PC only works if the instruction is word aligned.  */
6267 }
6268
6269 static void
6270 do_t_bxj (void)
6271 {
6272   if (inst.operands[0].reg == REG_PC)
6273     as_tsktsk (_("use of r15 in bxj is not really useful"));
6274
6275   inst.instruction |= inst.operands[0].reg << 16;
6276 }
6277
6278 static void
6279 do_t_clz (void)
6280 {
6281   inst.instruction |= inst.operands[0].reg << 8;
6282   inst.instruction |= inst.operands[1].reg << 16;
6283   inst.instruction |= inst.operands[1].reg;
6284 }
6285
6286 static void
6287 do_t_cpsi (void)
6288 {
6289   if (unified_syntax
6290       && (inst.operands[1].present || inst.size_req == 4))
6291     {
6292       unsigned int imod = (inst.instruction & 0x0030) >> 4;
6293       inst.instruction = 0xf3af8000;
6294       inst.instruction |= imod << 9;
6295       inst.instruction |= inst.operands[0].imm << 5;
6296       if (inst.operands[1].present)
6297         inst.instruction |= 0x100 | inst.operands[1].imm;
6298     }
6299   else
6300     {
6301       constraint (inst.operands[1].present,
6302                   _("Thumb does not support the 2-argument "
6303                     "form of this instruction"));
6304       inst.instruction |= inst.operands[0].imm;
6305     }
6306 }
6307
6308 /* THUMB CPY instruction (argument parse).  */
6309
6310 static void
6311 do_t_cpy (void)
6312 {
6313   if (inst.size_req == 4)
6314     {
6315       inst.instruction = THUMB_OP32 (T_MNEM_mov);
6316       inst.instruction |= inst.operands[0].reg << 8;
6317       inst.instruction |= inst.operands[1].reg;
6318     }
6319   else
6320     {
6321       inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
6322       inst.instruction |= (inst.operands[0].reg & 0x7);
6323       inst.instruction |= inst.operands[1].reg << 3;
6324     }
6325 }
6326
6327 static void
6328 do_t_czb (void)
6329 {
6330   constraint (inst.operands[0].reg > 7, BAD_HIREG);
6331   inst.instruction |= inst.operands[0].reg;
6332   inst.reloc.pc_rel = 1;
6333   inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH7;
6334 }
6335
6336 static void
6337 do_t_hint (void)
6338 {
6339   if (unified_syntax && inst.size_req == 4)
6340     inst.instruction = THUMB_OP32 (inst.instruction);
6341   else
6342     inst.instruction = THUMB_OP16 (inst.instruction);
6343 }
6344
6345 static void
6346 do_t_it (void)
6347 {
6348   unsigned int cond = inst.operands[0].imm;
6349   if ((cond & 0x1) == 0x0)
6350     {
6351       unsigned int mask = inst.instruction & 0x000f;
6352       inst.instruction &= 0xfff0;
6353
6354       if ((mask & 0x7) == 0)
6355         /* no conversion needed */;
6356       else if ((mask & 0x3) == 0)
6357         mask = (~(mask & 0x8) & 0x8) | 0x4;
6358       else if ((mask & 1) == 0)
6359         mask = (~(mask & 0xC) & 0xC) | 0x2;
6360       else
6361         mask = (~(mask & 0xE) & 0xE) | 0x1;
6362
6363       inst.instruction |= (mask & 0xF);
6364     }
6365
6366   inst.instruction |= cond << 4;
6367 }
6368
6369 static void
6370 do_t_ldmstm (void)
6371 {
6372   /* This really doesn't seem worth it.  */
6373   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
6374               _("expression too complex"));
6375   constraint (inst.operands[1].writeback,
6376               _("Thumb load/store multiple does not support {reglist}^"));
6377
6378   if (unified_syntax)
6379     {
6380       /* See if we can use a 16-bit instruction.  */
6381       if (inst.instruction < 0xffff /* not ldmdb/stmdb */
6382           && inst.size_req != 4
6383           && inst.operands[0].reg <= 7
6384           && !(inst.operands[1].imm & ~0xff)
6385           && (inst.instruction == T_MNEM_stmia
6386               ? inst.operands[0].writeback
6387               : (inst.operands[0].writeback
6388                  == !(inst.operands[1].imm & (1 << inst.operands[0].reg)))))
6389         {
6390           if (inst.instruction == T_MNEM_stmia
6391               && (inst.operands[1].imm & (1 << inst.operands[0].reg))
6392               && (inst.operands[1].imm & ((1 << inst.operands[0].reg) - 1)))
6393             as_warn (_("value stored for r%d is UNPREDICTABLE"),
6394                      inst.operands[0].reg);
6395
6396           inst.instruction = THUMB_OP16 (inst.instruction);
6397           inst.instruction |= inst.operands[0].reg << 8;
6398           inst.instruction |= inst.operands[1].imm;
6399         }
6400       else
6401         {
6402           if (inst.operands[1].imm & (1 << 13))
6403             as_warn (_("SP should not be in register list"));
6404           if (inst.instruction == T_MNEM_stmia)
6405             {
6406               if (inst.operands[1].imm & (1 << 15))
6407                 as_warn (_("PC should not be in register list"));
6408               if (inst.operands[1].imm & (1 << inst.operands[0].reg))
6409                 as_warn (_("value stored for r%d is UNPREDICTABLE"),
6410                          inst.operands[0].reg);
6411             }
6412           else
6413             {
6414               if (inst.operands[1].imm & (1 << 14)
6415                   && inst.operands[1].imm & (1 << 15))
6416                 as_warn (_("LR and PC should not both be in register list"));
6417               if ((inst.operands[1].imm & (1 << inst.operands[0].reg))
6418                   && inst.operands[0].writeback)
6419                 as_warn (_("base register should not be in register list "
6420                            "when written back"));
6421             }
6422           if (inst.instruction < 0xffff)
6423             inst.instruction = THUMB_OP32 (inst.instruction);
6424           inst.instruction |= inst.operands[0].reg << 16;
6425           inst.instruction |= inst.operands[1].imm;
6426           if (inst.operands[0].writeback)
6427             inst.instruction |= WRITE_BACK;
6428         }
6429     }
6430   else
6431     {
6432       constraint (inst.operands[0].reg > 7
6433                   || (inst.operands[1].imm & ~0xff), BAD_HIREG);
6434       if (inst.instruction == T_MNEM_stmia)
6435         {
6436           if (!inst.operands[0].writeback)
6437             as_warn (_("this instruction will write back the base register"));
6438           if ((inst.operands[1].imm & (1 << inst.operands[0].reg))
6439               && (inst.operands[1].imm & ((1 << inst.operands[0].reg) - 1)))
6440             as_warn (_("value stored for r%d is UNPREDICTABLE"),
6441                      inst.operands[0].reg);
6442         }
6443       else
6444         {
6445           if (!inst.operands[0].writeback
6446               && !(inst.operands[1].imm & (1 << inst.operands[0].reg)))
6447             as_warn (_("this instruction will write back the base register"));
6448           else if (inst.operands[0].writeback
6449                    && (inst.operands[1].imm & (1 << inst.operands[0].reg)))
6450             as_warn (_("this instruction will not write back the base register"));
6451         }
6452
6453       inst.instruction = THUMB_OP16 (inst.instruction);
6454       inst.instruction |= inst.operands[0].reg << 8;
6455       inst.instruction |= inst.operands[1].imm;
6456     }
6457 }
6458
6459 static void
6460 do_t_ldrex (void)
6461 {
6462   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
6463               || inst.operands[1].postind || inst.operands[1].writeback
6464               || inst.operands[1].immisreg || inst.operands[1].shifted
6465               || inst.operands[1].negative,
6466               _("instruction does not accept this addressing mode"));
6467
6468   inst.instruction |= inst.operands[0].reg << 12;
6469   inst.instruction |= inst.operands[1].reg << 16;
6470   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
6471 }
6472
6473 static void
6474 do_t_ldrexd (void)
6475 {
6476   if (!inst.operands[1].present)
6477     {
6478       constraint (inst.operands[0].reg == REG_LR,
6479                   _("r14 not allowed as first register "
6480                     "when second register is omitted"));
6481       inst.operands[1].reg = inst.operands[0].reg + 1;
6482     }
6483   constraint (inst.operands[0].reg == inst.operands[1].reg,
6484               BAD_OVERLAP);
6485
6486   inst.instruction |= inst.operands[0].reg << 12;
6487   inst.instruction |= inst.operands[1].reg << 8;
6488   inst.instruction |= inst.operands[2].reg << 16;
6489 }
6490
6491 static void
6492 do_t_ldst (void)
6493 {
6494   if (unified_syntax)
6495     {
6496       /* Generation of 16-bit instructions for anything other than
6497          Rd, [Rn, Ri] is deferred to section relaxation time.  */
6498       if (inst.operands[1].isreg && inst.operands[1].immisreg
6499           && !inst.operands[1].shifted && !inst.operands[1].postind
6500           && !inst.operands[1].negative && inst.operands[0].reg <= 7
6501           && inst.operands[1].reg <= 7 && inst.operands[1].imm <= 7
6502           && inst.instruction <= 0xffff)
6503         {
6504           inst.instruction = THUMB_OP16 (inst.instruction);
6505           goto op16;
6506         }
6507
6508       inst.instruction = THUMB_OP32 (inst.instruction);
6509       inst.instruction |= inst.operands[0].reg << 12;
6510       encode_thumb32_addr_mode (1, /*is_t=*/FALSE, /*is_d=*/FALSE);
6511       return;
6512     }
6513
6514   constraint (inst.operands[0].reg > 7, BAD_HIREG);
6515
6516   if (inst.instruction == T_MNEM_ldrsh || inst.instruction == T_MNEM_ldrsb)
6517     {
6518       /* Only [Rn,Rm] is acceptable.  */
6519       constraint (inst.operands[1].reg > 7 || inst.operands[1].imm > 7, BAD_HIREG);
6520       constraint (!inst.operands[1].isreg || !inst.operands[1].immisreg
6521                   || inst.operands[1].postind || inst.operands[1].shifted
6522                   || inst.operands[1].negative,
6523                   _("Thumb does not support this addressing mode"));
6524       inst.instruction = THUMB_OP16 (inst.instruction);
6525       goto op16;
6526     }
6527      
6528   inst.instruction = THUMB_OP16 (inst.instruction);
6529   if (!inst.operands[1].isreg)
6530     if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
6531       return;
6532
6533   constraint (!inst.operands[1].preind
6534               || inst.operands[1].shifted
6535               || inst.operands[1].writeback,
6536               _("Thumb does not support this addressing mode"));
6537   if (inst.operands[1].reg == REG_PC || inst.operands[1].reg == REG_SP)
6538     {
6539       constraint (inst.instruction & 0x0600,
6540                   _("byte or halfword not valid for base register"));
6541       constraint (inst.operands[1].reg == REG_PC
6542                   && !(inst.instruction & THUMB_LOAD_BIT),
6543                   _("r15 based store not allowed"));
6544       constraint (inst.operands[1].immisreg,
6545                   _("invalid base register for register offset"));
6546
6547       if (inst.operands[1].reg == REG_PC)
6548         inst.instruction = T_OPCODE_LDR_PC;
6549       else if (inst.instruction & THUMB_LOAD_BIT)
6550         inst.instruction = T_OPCODE_LDR_SP;
6551       else
6552         inst.instruction = T_OPCODE_STR_SP;
6553
6554       inst.instruction |= inst.operands[0].reg << 8;
6555       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
6556       return;
6557     }
6558
6559   constraint (inst.operands[1].reg > 7, BAD_HIREG);
6560   if (!inst.operands[1].immisreg)
6561     {
6562       /* Immediate offset.  */
6563       inst.instruction |= inst.operands[0].reg;
6564       inst.instruction |= inst.operands[1].reg << 3;
6565       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
6566       return;
6567     }
6568
6569   /* Register offset.  */
6570   constraint (inst.operands[1].imm > 7, BAD_HIREG);
6571   constraint (inst.operands[1].negative,
6572               _("Thumb does not support this addressing mode"));
6573
6574  op16:
6575   switch (inst.instruction)
6576     {
6577     case T_OPCODE_STR_IW: inst.instruction = T_OPCODE_STR_RW; break;
6578     case T_OPCODE_STR_IH: inst.instruction = T_OPCODE_STR_RH; break;
6579     case T_OPCODE_STR_IB: inst.instruction = T_OPCODE_STR_RB; break;
6580     case T_OPCODE_LDR_IW: inst.instruction = T_OPCODE_LDR_RW; break;
6581     case T_OPCODE_LDR_IH: inst.instruction = T_OPCODE_LDR_RH; break;
6582     case T_OPCODE_LDR_IB: inst.instruction = T_OPCODE_LDR_RB; break;
6583     case 0x5600 /* ldrsb */:
6584     case 0x5e00 /* ldrsh */: break;
6585     default: abort ();
6586     }
6587
6588   inst.instruction |= inst.operands[0].reg;
6589   inst.instruction |= inst.operands[1].reg << 3;
6590   inst.instruction |= inst.operands[1].imm << 6;
6591 }
6592
6593 static void
6594 do_t_ldstd (void)
6595 {
6596   if (!inst.operands[1].present)
6597     {
6598       inst.operands[1].reg = inst.operands[0].reg + 1;
6599       constraint (inst.operands[0].reg == REG_LR,
6600                   _("r14 not allowed here"));
6601     }
6602   inst.instruction |= inst.operands[0].reg << 12;
6603   inst.instruction |= inst.operands[1].reg << 8;
6604   encode_thumb32_addr_mode (2, /*is_t=*/FALSE, /*is_d=*/TRUE);
6605                             
6606 }
6607
6608 static void
6609 do_t_ldstt (void)
6610 {
6611   inst.instruction |= inst.operands[0].reg << 12;
6612   encode_thumb32_addr_mode (1, /*is_t=*/TRUE, /*is_d=*/FALSE);
6613 }
6614
6615 static void
6616 do_t_mla (void)
6617 {
6618   inst.instruction |= inst.operands[0].reg << 8;
6619   inst.instruction |= inst.operands[1].reg << 16;
6620   inst.instruction |= inst.operands[2].reg;
6621   inst.instruction |= inst.operands[3].reg << 12;
6622 }
6623
6624 static void
6625 do_t_mlal (void)
6626 {
6627   inst.instruction |= inst.operands[0].reg << 12;
6628   inst.instruction |= inst.operands[1].reg << 8;
6629   inst.instruction |= inst.operands[2].reg << 16;
6630   inst.instruction |= inst.operands[3].reg;
6631 }
6632
6633 static void
6634 do_t_mov_cmp (void)
6635 {
6636   if (unified_syntax)
6637     {
6638       int r0off = (inst.instruction == T_MNEM_mov
6639                    || inst.instruction == T_MNEM_movs) ? 8 : 16;
6640       if (!inst.operands[1].isreg)
6641         {
6642           /* For an immediate, we always generate a 32-bit opcode;
6643              section relaxation will shrink it later if possible.  */
6644           inst.instruction = THUMB_OP32 (inst.instruction);
6645           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
6646           inst.instruction |= inst.operands[0].reg << r0off;
6647           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
6648         }
6649       else if (inst.size_req == 4
6650                || inst.operands[1].shifted
6651                || (inst.instruction == T_MNEM_movs
6652                    && (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)))
6653         {
6654           inst.instruction = THUMB_OP32 (inst.instruction);
6655           inst.instruction |= inst.operands[0].reg << r0off;
6656           encode_thumb32_shifted_operand (1);
6657         }
6658       else
6659         switch (inst.instruction)
6660           {
6661           case T_MNEM_mov:
6662             inst.instruction = T_OPCODE_MOV_HR;
6663             inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
6664             inst.instruction |= (inst.operands[0].reg & 0x7);
6665             inst.instruction |= inst.operands[1].reg << 3;
6666             break;
6667
6668           case T_MNEM_movs:
6669             /* We know we have low registers at this point.
6670                Generate ADD Rd, Rs, #0.  */
6671             inst.instruction = T_OPCODE_ADD_I3;
6672             inst.instruction |= inst.operands[0].reg;
6673             inst.instruction |= inst.operands[1].reg << 3;
6674             break;
6675
6676           case T_MNEM_cmp:
6677             if (inst.operands[0].reg <= 7 && inst.operands[1].reg <= 7)
6678               {
6679                 inst.instruction = T_OPCODE_CMP_LR;
6680                 inst.instruction |= inst.operands[0].reg;
6681                 inst.instruction |= inst.operands[1].reg << 3;
6682               }
6683             else
6684               {
6685                 inst.instruction = T_OPCODE_CMP_HR;
6686                 inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
6687                 inst.instruction |= (inst.operands[0].reg & 0x7);
6688                 inst.instruction |= inst.operands[1].reg << 3;
6689               }
6690             break;
6691           }
6692       return;
6693     }
6694
6695   inst.instruction = THUMB_OP16 (inst.instruction);
6696   if (inst.operands[1].isreg)
6697     {
6698       if (inst.operands[0].reg < 8 && inst.operands[1].reg < 8)
6699         {
6700           /* A move of two lowregs is encoded as ADD Rd, Rs, #0
6701              since a MOV instruction produces unpredictable results.  */
6702           if (inst.instruction == T_OPCODE_MOV_I8)
6703             inst.instruction = T_OPCODE_ADD_I3;
6704           else
6705             inst.instruction = T_OPCODE_CMP_LR;
6706
6707           inst.instruction |= inst.operands[0].reg;
6708           inst.instruction |= inst.operands[1].reg << 3;
6709         }
6710       else
6711         {
6712           if (inst.instruction == T_OPCODE_MOV_I8)
6713             inst.instruction = T_OPCODE_MOV_HR;
6714           else
6715             inst.instruction = T_OPCODE_CMP_HR;
6716           do_t_cpy ();
6717         }
6718     }
6719   else
6720     {
6721       constraint (inst.operands[0].reg > 7,
6722                   _("only lo regs allowed with immediate"));
6723       inst.instruction |= inst.operands[0].reg << 8;
6724       inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
6725     }
6726 }
6727
6728 static void
6729 do_t_mov16 (void)
6730 {
6731   inst.instruction |= inst.operands[0].reg << 8;
6732   inst.instruction |= (inst.operands[1].imm & 0xf000) << 4;
6733   inst.instruction |= (inst.operands[1].imm & 0x0800) << 15;
6734   inst.instruction |= (inst.operands[1].imm & 0x0700) << 4;
6735   inst.instruction |= (inst.operands[1].imm & 0x00ff);
6736 }
6737
6738 static void
6739 do_t_mvn_tst (void)
6740 {
6741   if (unified_syntax)
6742     {
6743       int r0off = (inst.instruction == T_MNEM_mvn
6744                    || inst.instruction == T_MNEM_mvns) ? 8 : 16;
6745       if (!inst.operands[1].isreg)
6746         {
6747           /* For an immediate, we always generate a 32-bit opcode;
6748              section relaxation will shrink it later if possible.  */
6749           if (inst.instruction < 0xffff)
6750             inst.instruction = THUMB_OP32 (inst.instruction);
6751           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
6752           inst.instruction |= inst.operands[0].reg << r0off;
6753           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
6754         }
6755       else
6756         {
6757           /* See if we can do this with a 16-bit instruction.  */
6758           if (inst.instruction < 0xffff
6759               && THUMB_SETS_FLAGS (inst.instruction)
6760               && !inst.operands[1].shifted
6761               && inst.operands[0].reg <= 7
6762               && inst.operands[1].reg <= 7
6763               && inst.size_req != 4)
6764             {
6765               inst.instruction = THUMB_OP16 (inst.instruction);
6766               inst.instruction |= inst.operands[0].reg;
6767               inst.instruction |= inst.operands[1].reg << 3;
6768             }
6769           else
6770             {
6771               constraint (inst.operands[1].shifted
6772                           && inst.operands[1].immisreg,
6773                           _("shift must be constant"));
6774               if (inst.instruction < 0xffff)
6775                 inst.instruction = THUMB_OP32 (inst.instruction);
6776               inst.instruction |= inst.operands[0].reg << r0off;
6777               encode_thumb32_shifted_operand (1);
6778             }
6779         }
6780     }
6781   else
6782     {
6783       constraint (inst.instruction > 0xffff
6784                   || inst.instruction == T_MNEM_mvns, BAD_THUMB32);
6785       constraint (!inst.operands[1].isreg || inst.operands[1].shifted,
6786                   _("unshifted register required"));
6787       constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
6788                   BAD_HIREG);
6789
6790       inst.instruction = THUMB_OP16 (inst.instruction);
6791       inst.instruction |= inst.operands[0].reg;
6792       inst.instruction |= inst.operands[1].reg << 3;
6793     }
6794 }
6795
6796 static void
6797 do_t_mrs (void)
6798 {
6799   /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all.  */
6800   constraint ((inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f))
6801               != (PSR_c|PSR_f),
6802               _("'CPSR' or 'SPSR' expected"));
6803   inst.instruction |= inst.operands[0].reg << 8;
6804   inst.instruction |= (inst.operands[1].imm & SPSR_BIT) >> 2;
6805 }
6806
6807 static void
6808 do_t_msr (void)
6809 {
6810   constraint (!inst.operands[1].isreg,
6811               _("Thumb encoding does not support an immediate here"));
6812   inst.instruction |= (inst.operands[0].imm & SPSR_BIT) >> 2;
6813   inst.instruction |= (inst.operands[0].imm & ~SPSR_BIT) >> 8;
6814   inst.instruction |= inst.operands[1].reg << 16;
6815 }
6816
6817 static void
6818 do_t_mul (void)
6819 {
6820   if (!inst.operands[2].present)
6821     inst.operands[2].reg = inst.operands[0].reg;
6822
6823   /* There is no 32-bit MULS and no 16-bit MUL. */
6824   if (unified_syntax && inst.instruction == T_MNEM_mul)
6825     {
6826       inst.instruction = THUMB_OP32 (inst.instruction);
6827       inst.instruction |= inst.operands[0].reg << 8;
6828       inst.instruction |= inst.operands[1].reg << 16;
6829       inst.instruction |= inst.operands[2].reg << 0;
6830     }
6831   else
6832     {
6833       constraint (!unified_syntax
6834                   && inst.instruction == T_MNEM_muls, BAD_THUMB32);
6835       constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
6836                   BAD_HIREG);
6837
6838       inst.instruction = THUMB_OP16 (inst.instruction);
6839       inst.instruction |= inst.operands[0].reg;
6840
6841       if (inst.operands[0].reg == inst.operands[1].reg)
6842         inst.instruction |= inst.operands[2].reg << 3;
6843       else if (inst.operands[0].reg == inst.operands[2].reg)
6844         inst.instruction |= inst.operands[1].reg << 3;
6845       else
6846         constraint (1, _("dest must overlap one source register"));
6847     }
6848 }
6849
6850 static void
6851 do_t_mull (void)
6852 {
6853   inst.instruction |= inst.operands[0].reg << 12;
6854   inst.instruction |= inst.operands[1].reg << 8;
6855   inst.instruction |= inst.operands[2].reg << 16;
6856   inst.instruction |= inst.operands[3].reg;
6857
6858   if (inst.operands[0].reg == inst.operands[1].reg)
6859     as_tsktsk (_("rdhi and rdlo must be different"));
6860 }
6861
6862 static void
6863 do_t_nop (void)
6864 {
6865   if (unified_syntax)
6866     {
6867       if (inst.size_req == 4 || inst.operands[0].imm > 15)
6868         {
6869           inst.instruction = THUMB_OP32 (inst.instruction);
6870           inst.instruction |= inst.operands[0].imm;
6871         }
6872       else
6873         {
6874           inst.instruction = THUMB_OP16 (inst.instruction);
6875           inst.instruction |= inst.operands[0].imm << 4;
6876         }
6877     }
6878   else
6879     {
6880       constraint (inst.operands[0].present,
6881                   _("Thumb does not support NOP with hints"));
6882       inst.instruction = 0x46c0;
6883     }
6884 }
6885
6886 static void
6887 do_t_neg (void)
6888 {
6889   if (unified_syntax)
6890     {
6891       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7
6892           || !THUMB_SETS_FLAGS (inst.instruction)
6893           || inst.size_req == 4)
6894         {
6895           inst.instruction = THUMB_OP32 (inst.instruction);
6896           inst.instruction |= inst.operands[0].reg << 8;
6897           inst.instruction |= inst.operands[1].reg << 16;
6898         }
6899       else
6900         {
6901           inst.instruction = THUMB_OP16 (inst.instruction);
6902           inst.instruction |= inst.operands[0].reg;
6903           inst.instruction |= inst.operands[1].reg << 3;
6904         }
6905     }
6906   else
6907     {
6908       constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
6909                   BAD_HIREG);
6910       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
6911
6912       inst.instruction = THUMB_OP16 (inst.instruction);
6913       inst.instruction |= inst.operands[0].reg;
6914       inst.instruction |= inst.operands[1].reg << 3;
6915     }
6916 }
6917
6918 static void
6919 do_t_pkhbt (void)
6920 {
6921   inst.instruction |= inst.operands[0].reg << 8;
6922   inst.instruction |= inst.operands[1].reg << 16;
6923   inst.instruction |= inst.operands[2].reg;
6924   if (inst.operands[3].present)
6925     {
6926       unsigned int val = inst.reloc.exp.X_add_number;
6927       constraint (inst.reloc.exp.X_op != O_constant,
6928                   _("expression too complex"));
6929       inst.instruction |= (val & 0x1c) << 10;
6930       inst.instruction |= (val & 0x03) << 6;
6931     }
6932 }
6933
6934 static void
6935 do_t_pkhtb (void)
6936 {
6937   if (!inst.operands[3].present)
6938     inst.instruction &= ~0x00000020;
6939   do_t_pkhbt ();
6940 }
6941
6942 static void
6943 do_t_pld (void)
6944 {
6945   encode_thumb32_addr_mode (0, /*is_t=*/FALSE, /*is_d=*/FALSE);
6946 }
6947
6948 static void
6949 do_t_push_pop (void)
6950 {
6951   constraint (inst.operands[0].writeback,
6952               _("push/pop do not support {reglist}^"));
6953   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
6954               _("expression too complex"));
6955
6956   if ((inst.operands[0].imm & ~0xff) == 0)
6957     inst.instruction = THUMB_OP16 (inst.instruction);
6958   else if ((inst.instruction == T_MNEM_push
6959             && (inst.operands[0].imm & ~0xff) == 1 << REG_LR)
6960            || (inst.instruction == T_MNEM_pop
6961                && (inst.operands[0].imm & ~0xff) == 1 << REG_PC))
6962     {
6963       inst.instruction = THUMB_OP16 (inst.instruction);
6964       inst.instruction |= THUMB_PP_PC_LR;
6965       inst.operands[0].imm &= 0xff;
6966     }
6967   else if (unified_syntax)
6968     {
6969       if (inst.operands[1].imm & (1 << 13))
6970         as_warn (_("SP should not be in register list"));
6971       if (inst.instruction == T_MNEM_push)
6972         {
6973           if (inst.operands[1].imm & (1 << 15))
6974             as_warn (_("PC should not be in register list"));
6975         }
6976       else
6977         {
6978           if (inst.operands[1].imm & (1 << 14)
6979               && inst.operands[1].imm & (1 << 15))
6980             as_warn (_("LR and PC should not both be in register list"));
6981         }
6982
6983       inst.instruction = THUMB_OP32 (inst.instruction);
6984     }
6985   else
6986     {
6987       inst.error = _("invalid register list to push/pop instruction");
6988       return;
6989     }
6990
6991   inst.instruction |= inst.operands[0].imm;
6992 }
6993
6994 static void
6995 do_t_rbit (void)
6996 {
6997   inst.instruction |= inst.operands[0].reg << 8;
6998   inst.instruction |= inst.operands[1].reg << 16;
6999 }
7000
7001 static void
7002 do_t_rev (void)
7003 {
7004   if (inst.operands[0].reg <= 7 && inst.operands[1].reg <= 7
7005       && inst.size_req != 4)
7006     {
7007       inst.instruction = THUMB_OP16 (inst.instruction);
7008       inst.instruction |= inst.operands[0].reg;
7009       inst.instruction |= inst.operands[1].reg << 3;
7010     }
7011   else if (unified_syntax)
7012     {
7013       inst.instruction = THUMB_OP32 (inst.instruction);
7014       inst.instruction |= inst.operands[0].reg << 8;
7015       inst.instruction |= inst.operands[1].reg << 16;
7016       inst.instruction |= inst.operands[1].reg;
7017     }
7018   else
7019     inst.error = BAD_HIREG;
7020 }
7021
7022 static void
7023 do_t_rsb (void)
7024 {
7025   int Rd, Rs;
7026
7027   Rd = inst.operands[0].reg;
7028   Rs = (inst.operands[1].present
7029         ? inst.operands[1].reg    /* Rd, Rs, foo */
7030         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
7031
7032   inst.instruction |= Rd << 8;
7033   inst.instruction |= Rs << 16;
7034   if (!inst.operands[2].isreg)
7035     {
7036       inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
7037       inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
7038     }
7039   else
7040     encode_thumb32_shifted_operand (2);
7041 }
7042
7043 static void
7044 do_t_setend (void)
7045 {
7046   if (inst.operands[0].imm)
7047     inst.instruction |= 0x8;
7048 }
7049
7050 static void
7051 do_t_shift (void)
7052 {
7053   if (!inst.operands[1].present)
7054     inst.operands[1].reg = inst.operands[0].reg;
7055
7056   if (unified_syntax)
7057     {
7058       if (inst.operands[0].reg > 7
7059           || inst.operands[1].reg > 7
7060           || !THUMB_SETS_FLAGS (inst.instruction)
7061           || (!inst.operands[2].isreg && inst.instruction == T_MNEM_rors)
7062           || (inst.operands[2].isreg && inst.operands[1].reg != inst.operands[0].reg)
7063           || inst.size_req == 4)
7064         {
7065           if (inst.operands[2].isreg)
7066             {
7067               inst.instruction = THUMB_OP32 (inst.instruction);
7068               inst.instruction |= inst.operands[0].reg << 8;
7069               inst.instruction |= inst.operands[1].reg << 16;
7070               inst.instruction |= inst.operands[2].reg;
7071             }
7072           else
7073             {
7074               inst.operands[1].shifted = 1;
7075               switch (inst.instruction)
7076                 {
7077                 case T_MNEM_asr:
7078                 case T_MNEM_asrs: inst.operands[1].shift_kind = SHIFT_ASR; break;
7079                 case T_MNEM_lsl:
7080                 case T_MNEM_lsls: inst.operands[1].shift_kind = SHIFT_LSL; break;
7081                 case T_MNEM_lsr:
7082                 case T_MNEM_lsrs: inst.operands[1].shift_kind = SHIFT_LSR; break;
7083                 case T_MNEM_ror:
7084                 case T_MNEM_rors: inst.operands[1].shift_kind = SHIFT_ROR; break;
7085                 default: abort ();
7086                 }
7087               
7088               inst.instruction = THUMB_OP32 (THUMB_SETS_FLAGS (inst.instruction)
7089                                              ? T_MNEM_movs : T_MNEM_mov);
7090               inst.instruction |= inst.operands[0].reg << 8;
7091               encode_thumb32_shifted_operand (1);
7092               /* Prevent the incorrect generation of an ARM_IMMEDIATE fixup.  */
7093               inst.reloc.type = BFD_RELOC_UNUSED;
7094             }
7095         }
7096       else
7097         {
7098           if (inst.operands[2].isreg)
7099             {
7100               switch (inst.instruction)
7101                 {
7102                 case T_MNEM_asrs: inst.instruction = T_OPCODE_ASR_R; break;
7103                 case T_MNEM_lsls: inst.instruction = T_OPCODE_LSL_R; break;
7104                 case T_MNEM_lsrs: inst.instruction = T_OPCODE_LSR_R; break;
7105                 case T_MNEM_rors: inst.instruction = T_OPCODE_ROR_R; break;
7106                 default: abort ();
7107                 }
7108           
7109               inst.instruction |= inst.operands[0].reg;
7110               inst.instruction |= inst.operands[2].reg << 3;
7111             }
7112           else
7113             {
7114               switch (inst.instruction)
7115                 {
7116                 case T_MNEM_asrs: inst.instruction = T_OPCODE_ASR_I; break;
7117                 case T_MNEM_lsls: inst.instruction = T_OPCODE_LSL_I; break;
7118                 case T_MNEM_lsrs: inst.instruction = T_OPCODE_LSR_I; break;
7119                 default: abort ();
7120                 }
7121               inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
7122               inst.instruction |= inst.operands[0].reg;
7123               inst.instruction |= inst.operands[1].reg << 3;
7124             }
7125         }
7126     }
7127   else
7128     {
7129       constraint (inst.operands[0].reg > 7
7130                   || inst.operands[1].reg > 7, BAD_HIREG);
7131       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
7132
7133       if (inst.operands[2].isreg)  /* Rd, {Rs,} Rn */
7134         {
7135           constraint (inst.operands[2].reg > 7, BAD_HIREG);
7136           constraint (inst.operands[0].reg != inst.operands[1].reg,
7137                       _("source1 and dest must be same register"));
7138
7139           switch (inst.instruction)
7140             {
7141             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_R; break;
7142             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_R; break;
7143             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_R; break;
7144             case T_MNEM_ror: inst.instruction = T_OPCODE_ROR_R; break;
7145             default: abort ();
7146             }
7147           
7148           inst.instruction |= inst.operands[0].reg;
7149           inst.instruction |= inst.operands[2].reg << 3;
7150         }
7151       else
7152         {
7153           switch (inst.instruction)
7154             {
7155             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_I; break;
7156             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_I; break;
7157             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_I; break;
7158             case T_MNEM_ror: inst.error = _("ror #imm not supported"); return;
7159             default: abort ();
7160             }
7161           inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
7162           inst.instruction |= inst.operands[0].reg;
7163           inst.instruction |= inst.operands[1].reg << 3;
7164         }
7165     }
7166 }
7167
7168 static void
7169 do_t_simd (void)
7170 {
7171   inst.instruction |= inst.operands[0].reg << 8;
7172   inst.instruction |= inst.operands[1].reg << 16;
7173   inst.instruction |= inst.operands[2].reg;
7174 }
7175
7176 static void
7177 do_t_smi (void)
7178 {
7179   unsigned int value = inst.reloc.exp.X_add_number;
7180   constraint (inst.reloc.exp.X_op != O_constant,
7181               _("expression too complex"));
7182   inst.reloc.type = BFD_RELOC_UNUSED;
7183   inst.instruction |= (value & 0xf000) >> 12;
7184   inst.instruction |= (value & 0x0ff0);
7185   inst.instruction |= (value & 0x000f) << 16;
7186 }
7187
7188 static void
7189 do_t_ssat (void)
7190 {
7191   inst.instruction |= inst.operands[0].reg << 8;
7192   inst.instruction |= inst.operands[1].imm - 1;
7193   inst.instruction |= inst.operands[2].reg << 16;
7194
7195   if (inst.operands[3].present)
7196     {
7197       constraint (inst.reloc.exp.X_op != O_constant,
7198                   _("expression too complex"));
7199
7200       if (inst.reloc.exp.X_add_number != 0)
7201         {
7202           if (inst.operands[3].shift_kind == SHIFT_ASR)
7203             inst.instruction |= 0x00200000;  /* sh bit */
7204           inst.instruction |= (inst.reloc.exp.X_add_number & 0x1c) << 10;
7205           inst.instruction |= (inst.reloc.exp.X_add_number & 0x03) << 6;
7206         }
7207       inst.reloc.type = BFD_RELOC_UNUSED;
7208     }
7209 }
7210
7211 static void
7212 do_t_ssat16 (void)
7213 {
7214   inst.instruction |= inst.operands[0].reg << 8;
7215   inst.instruction |= inst.operands[1].imm - 1;
7216   inst.instruction |= inst.operands[2].reg << 16;
7217 }
7218
7219 static void
7220 do_t_strex (void)
7221 {
7222   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
7223               || inst.operands[2].postind || inst.operands[2].writeback
7224               || inst.operands[2].immisreg || inst.operands[2].shifted
7225               || inst.operands[2].negative,
7226               _("instruction does not accept this addressing mode"));
7227
7228   inst.instruction |= inst.operands[0].reg << 8;
7229   inst.instruction |= inst.operands[1].reg << 12;
7230   inst.instruction |= inst.operands[2].reg << 16;
7231   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
7232 }
7233
7234 static void
7235 do_t_strexd (void)
7236 {
7237   if (!inst.operands[2].present)
7238     inst.operands[2].reg = inst.operands[1].reg + 1;
7239
7240   constraint (inst.operands[0].reg == inst.operands[1].reg
7241               || inst.operands[0].reg == inst.operands[2].reg
7242               || inst.operands[0].reg == inst.operands[3].reg
7243               || inst.operands[1].reg == inst.operands[2].reg,
7244               BAD_OVERLAP);
7245
7246   inst.instruction |= inst.operands[0].reg;
7247   inst.instruction |= inst.operands[1].reg << 12;
7248   inst.instruction |= inst.operands[2].reg << 8;
7249   inst.instruction |= inst.operands[3].reg << 16;
7250 }
7251
7252 static void
7253 do_t_sxtah (void)
7254 {
7255   inst.instruction |= inst.operands[0].reg << 8;
7256   inst.instruction |= inst.operands[1].reg << 16;
7257   inst.instruction |= inst.operands[2].reg;
7258   inst.instruction |= inst.operands[3].imm << 4;
7259 }
7260
7261 static void
7262 do_t_sxth (void)
7263 {
7264   if (inst.instruction <= 0xffff && inst.size_req != 4
7265       && inst.operands[0].reg <= 7 && inst.operands[1].reg <= 7
7266       && (!inst.operands[2].present || inst.operands[2].imm == 0))
7267     {
7268       inst.instruction = THUMB_OP16 (inst.instruction);
7269       inst.instruction |= inst.operands[0].reg;
7270       inst.instruction |= inst.operands[1].reg << 3;
7271     }
7272   else if (unified_syntax)
7273     {
7274       if (inst.instruction <= 0xffff)
7275         inst.instruction = THUMB_OP32 (inst.instruction);
7276       inst.instruction |= inst.operands[0].reg << 8;
7277       inst.instruction |= inst.operands[1].reg;
7278       inst.instruction |= inst.operands[2].imm << 4;
7279     }
7280   else
7281     {
7282       constraint (inst.operands[2].present && inst.operands[2].imm != 0,
7283                   _("Thumb encoding does not support rotation"));
7284       constraint (1, BAD_HIREG);
7285     }
7286 }
7287
7288 static void
7289 do_t_swi (void)
7290 {
7291   inst.reloc.type = BFD_RELOC_ARM_SWI;
7292 }
7293
7294 static void
7295 do_t_tb (void)
7296 {
7297   int half;
7298
7299   half = (inst.instruction & 0x10) != 0;
7300   constraint (inst.operands[0].imm == 15,
7301               _("PC is not a valid index register"));
7302   constraint (!half && inst.operands[0].shifted,
7303               _("instruction does not allow shifted index"));
7304   constraint (half && !inst.operands[0].shifted,
7305               _("instruction requires shifted index"));
7306   inst.instruction |= (inst.operands[0].reg << 16) | inst.operands[0].imm;
7307 }
7308
7309 static void
7310 do_t_usat (void)
7311 {
7312   inst.instruction |= inst.operands[0].reg << 8;
7313   inst.instruction |= inst.operands[1].imm;
7314   inst.instruction |= inst.operands[2].reg << 16;
7315
7316   if (inst.operands[3].present)
7317     {
7318       constraint (inst.reloc.exp.X_op != O_constant,
7319                   _("expression too complex"));
7320       if (inst.reloc.exp.X_add_number != 0)
7321         {
7322           if (inst.operands[3].shift_kind == SHIFT_ASR)
7323             inst.instruction |= 0x00200000;  /* sh bit */
7324
7325           inst.instruction |= (inst.reloc.exp.X_add_number & 0x1c) << 10;
7326           inst.instruction |= (inst.reloc.exp.X_add_number & 0x03) << 6;
7327         }
7328       inst.reloc.type = BFD_RELOC_UNUSED;
7329     }
7330 }
7331
7332 static void
7333 do_t_usat16 (void)
7334 {
7335   inst.instruction |= inst.operands[0].reg << 8;
7336   inst.instruction |= inst.operands[1].imm;
7337   inst.instruction |= inst.operands[2].reg << 16;
7338 }
7339 \f
7340 /* Overall per-instruction processing.  */
7341
7342 /* We need to be able to fix up arbitrary expressions in some statements.
7343    This is so that we can handle symbols that are an arbitrary distance from
7344    the pc.  The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
7345    which returns part of an address in a form which will be valid for
7346    a data instruction.  We do this by pushing the expression into a symbol
7347    in the expr_section, and creating a fix for that.  */
7348
7349 static void
7350 fix_new_arm (fragS *       frag,
7351              int           where,
7352              short int     size,
7353              expressionS * exp,
7354              int           pc_rel,
7355              int           reloc)
7356 {
7357   fixS *           new_fix;
7358
7359   switch (exp->X_op)
7360     {
7361     case O_constant:
7362     case O_symbol:
7363     case O_add:
7364     case O_subtract:
7365       new_fix = fix_new_exp (frag, where, size, exp, pc_rel, reloc);
7366       break;
7367
7368     default:
7369       new_fix = fix_new (frag, where, size, make_expr_symbol (exp), 0,
7370                          pc_rel, reloc);
7371       break;
7372     }
7373
7374   /* Mark whether the fix is to a THUMB instruction, or an ARM
7375      instruction.  */
7376   new_fix->tc_fix_data = thumb_mode;
7377 }
7378
7379 static void
7380 output_inst (const char * str)
7381 {
7382   char * to = NULL;
7383
7384   if (inst.error)
7385     {
7386       as_bad ("%s -- `%s'", inst.error, str);
7387       return;
7388     }
7389   if (inst.size == 0)
7390     return;
7391
7392   to = frag_more (inst.size);
7393
7394   if (thumb_mode && (inst.size > THUMB_SIZE))
7395     {
7396       assert (inst.size == (2 * THUMB_SIZE));
7397       md_number_to_chars (to, inst.instruction >> 16, THUMB_SIZE);
7398       md_number_to_chars (to + THUMB_SIZE, inst.instruction, THUMB_SIZE);
7399     }
7400   else if (inst.size > INSN_SIZE)
7401     {
7402       assert (inst.size == (2 * INSN_SIZE));
7403       md_number_to_chars (to, inst.instruction, INSN_SIZE);
7404       md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE);
7405     }
7406   else
7407     md_number_to_chars (to, inst.instruction, inst.size);
7408
7409   if (inst.reloc.type != BFD_RELOC_UNUSED)
7410     fix_new_arm (frag_now, to - frag_now->fr_literal,
7411                  inst.size, & inst.reloc.exp, inst.reloc.pc_rel,
7412                  inst.reloc.type);
7413
7414 #ifdef OBJ_ELF
7415   dwarf2_emit_insn (inst.size);
7416 #endif
7417 }
7418
7419 /* Tag values used in struct asm_opcode's tag field.  */
7420 enum opcode_tag
7421 {
7422   OT_unconditional,     /* Instruction cannot be conditionalized.
7423                            The ARM condition field is still 0xE.  */
7424   OT_unconditionalF,    /* Instruction cannot be conditionalized
7425                            and carries 0xF in its ARM condition field.  */
7426   OT_csuffix,           /* Instruction takes a conditional suffix.  */
7427   OT_cinfix3,           /* Instruction takes a conditional infix,
7428                            beginning at character index 3.  (In
7429                            unified mode, it becomes a suffix.)  */
7430   OT_csuf_or_in3,       /* Instruction takes either a conditional
7431                            suffix or an infix at character index 3.
7432                            (In unified mode, a suffix only.  */
7433   OT_odd_infix_unc,     /* This is the unconditional variant of an
7434                            instruction that takes a conditional infix
7435                            at an unusual position.  In unified mode,
7436                            this variant will accept a suffix.  */
7437   OT_odd_infix_0        /* Values greater than or equal to OT_odd_infix_0
7438                            are the conditional variants of instructions that
7439                            take conditional infixes in unusual positions.
7440                            The infix appears at character index
7441                            (tag - OT_odd_infix_0).  These are not accepted
7442                            in unified mode.  */
7443 };
7444
7445 /* Subroutine of md_assemble, responsible for looking up the primary
7446    opcode from the mnemonic the user wrote.  STR points to the
7447    beginning of the mnemonic.
7448
7449    This is not simply a hash table lookup, because of conditional
7450    variants.  Most instructions have conditional variants, which are
7451    expressed with a _conditional affix_ to the mnemonic.  If we were
7452    to encode each conditional variant as a literal string in the opcode
7453    table, it would have approximately 20,000 entries.
7454
7455    Most mnemonics take this affix as a suffix, and in unified syntax,
7456    'most' is upgraded to 'all'.  However, in the divided syntax, some
7457    instructions take the affix as an infix, notably the s-variants of
7458    the arithmetic instructions.  Of those instructions, all but six
7459    have the infix appear after the third character of the mnemonic.
7460
7461    Accordingly, the algorithm for looking up primary opcodes given
7462    an identifier is:
7463
7464    1. Look up the identifier in the opcode table.
7465       If we find a match, go to step U.
7466
7467    2. Look up the last two characters of the identifier in the
7468       conditions table.  If we find a match, look up the first N-2
7469       characters of the identifier in the opcode table.  If we
7470       find a match, go to step CE.
7471
7472    3. Look up the fourth and fifth characters of the identifier in
7473       the conditions table.  If we find a match, extract those
7474       characters from the identifier, and look up the remaining
7475       characters in the opcode table.  If we find a match, go
7476       to step CM.
7477
7478    4. Fail.
7479
7480    U. Examine the tag field of the opcode structure, in case this is
7481       one of the six instructions with its conditional infix in an
7482       unusual place.  If it is, the tag tells us where to find the
7483       infix; look it up in the conditions table and set inst.cond
7484       accordingly.  Otherwise, this is an unconditional instruction.
7485       Again set inst.cond accordingly.  Return the opcode structure.
7486
7487   CE. Examine the tag field to make sure this is an instruction that
7488       should receive a conditional suffix.  If it is not, fail.
7489       Otherwise, set inst.cond from the suffix we already looked up,
7490       and return the opcode structure.
7491
7492   CM. Examine the tag field to make sure this is an instruction that
7493       should receive a conditional infix after the third character.
7494       If it is not, fail.  Otherwise, undo the edits to the current
7495       line of input and proceed as for case CE.  */
7496
7497 static const struct asm_opcode *
7498 opcode_lookup (char **str)
7499 {
7500   char *end, *base;
7501   char *affix;
7502   const struct asm_opcode *opcode;
7503   const struct asm_cond *cond;
7504
7505   /* Scan up to the end of the mnemonic, which must end in white space,
7506      '.' (in unified mode only), or end of string.  */
7507   for (base = end = *str; *end != '\0'; end++)
7508     if (*end == ' ' || (unified_syntax && *end == '.'))
7509       break;
7510
7511   if (end == base)
7512     return 0;
7513
7514   /* Handle a possible width suffix.  */
7515   if (end[0] == '.')
7516     {
7517       if (end[1] == 'w' && (end[2] == ' ' || end[2] == '\0'))
7518         inst.size_req = 4;
7519       else if (end[1] == 'n' && (end[2] == ' ' || end[2] == '\0'))
7520         inst.size_req = 2;
7521       else
7522         return 0;
7523
7524       *str = end + 2;
7525     }
7526   else
7527     *str = end;
7528
7529   /* Look for unaffixed or special-case affixed mnemonic.  */
7530   opcode = hash_find_n (arm_ops_hsh, base, end - base);
7531   if (opcode)
7532     {
7533       /* step U */
7534       if (opcode->tag < OT_odd_infix_0)
7535         {
7536           inst.cond = COND_ALWAYS;
7537           return opcode;
7538         }
7539
7540       if (unified_syntax)
7541         as_warn (_("conditional infixes are deprecated in unified syntax"));
7542       affix = base + (opcode->tag - OT_odd_infix_0);
7543       cond = hash_find_n (arm_cond_hsh, affix, 2);
7544       assert (cond);
7545
7546       inst.cond = cond->value;
7547       return opcode;
7548     }
7549
7550   /* Cannot have a conditional suffix on a mnemonic of less than two
7551      characters.  */
7552   if (end - base < 3)
7553     return 0;
7554
7555   /* Look for suffixed mnemonic.  */
7556   affix = end - 2;
7557   cond = hash_find_n (arm_cond_hsh, affix, 2);
7558   opcode = hash_find_n (arm_ops_hsh, base, affix - base);
7559   if (opcode && cond)
7560     {
7561       /* step CE */
7562       switch (opcode->tag)
7563         {
7564         case OT_cinfix3:
7565         case OT_odd_infix_unc:
7566           if (!unified_syntax)
7567             return 0;
7568           /* else fall through */
7569
7570         case OT_csuffix:
7571         case OT_csuf_or_in3:
7572           inst.cond = cond->value;
7573           return opcode;
7574
7575         case OT_unconditional:
7576         case OT_unconditionalF:
7577           /* delayed diagnostic */
7578           inst.error = BAD_COND;
7579           inst.cond = COND_ALWAYS;
7580           return opcode;
7581
7582         default:
7583           return 0;
7584         }
7585     }
7586
7587   /* Cannot have a usual-position infix on a mnemonic of less than
7588      six characters (five would be a suffix).  */
7589   if (end - base < 6)
7590     return 0;
7591
7592   /* Look for infixed mnemonic in the usual position.  */
7593   affix = base + 3;
7594   cond = hash_find_n (arm_cond_hsh, affix, 2);
7595   if (cond)
7596     {
7597       char save[2];
7598       memcpy (save, affix, 2);
7599       memmove (affix, affix + 2, (end - affix) - 2);
7600       opcode = hash_find_n (arm_ops_hsh, base, (end - base) - 2);
7601       memmove (affix + 2, affix, (end - affix) - 2);
7602       memcpy (affix, save, 2);
7603     }
7604   if (opcode && (opcode->tag == OT_cinfix3 || opcode->tag == OT_csuf_or_in3))
7605     {
7606       /* step CM */
7607       if (unified_syntax)
7608         as_warn (_("conditional infixes are deprecated in unified syntax"));
7609
7610       inst.cond = cond->value;
7611       return opcode;
7612     }
7613
7614   return 0;
7615 }
7616
7617 void
7618 md_assemble (char *str)
7619 {
7620   char *p = str;
7621   const struct asm_opcode * opcode;
7622
7623   /* Align the previous label if needed.  */
7624   if (last_label_seen != NULL)
7625     {
7626       symbol_set_frag (last_label_seen, frag_now);
7627       S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
7628       S_SET_SEGMENT (last_label_seen, now_seg);
7629     }
7630
7631   memset (&inst, '\0', sizeof (inst));
7632   inst.reloc.type = BFD_RELOC_UNUSED;
7633
7634   opcode = opcode_lookup (&p);
7635   if (!opcode)
7636     {
7637       /* It wasn't an instruction, but it might be a register alias of
7638          the form alias .req reg.  */
7639       if (!create_register_alias (str, p))
7640         as_bad (_("bad instruction `%s'"), str);
7641
7642       return;
7643     }
7644
7645   if (thumb_mode)
7646     {
7647       /* Check that this instruction is supported for this CPU.  */
7648       if (thumb_mode == 1 && (opcode->tvariant & cpu_variant) == 0)
7649         {
7650           as_bad (_("selected processor does not support `%s'"), str);
7651           return;
7652         }
7653       if (inst.cond != COND_ALWAYS && !unified_syntax
7654           && opcode->tencode != do_t_branch)
7655         {
7656           as_bad (_("Thumb does not support conditional execution"));
7657           return;
7658         }
7659
7660       mapping_state (MAP_THUMB);
7661       inst.instruction = opcode->tvalue;
7662
7663       if (!parse_operands (p, opcode->operands))
7664         opcode->tencode ();
7665
7666       if (!inst.error)
7667         {
7668           assert (inst.instruction < 0xe800 || inst.instruction > 0xffff);
7669           inst.size = (inst.instruction > 0xffff ? 4 : 2);
7670           if (inst.size_req && inst.size_req != inst.size)
7671             {
7672               as_bad (_("cannot honor width suffix -- `%s'"), str);
7673               return;
7674             }
7675         }
7676     }
7677   else
7678     {
7679       /* Check that this instruction is supported for this CPU.  */
7680       if ((opcode->avariant & cpu_variant) == 0)
7681         {
7682           as_bad (_("selected processor does not support `%s'"), str);
7683           return;
7684         }
7685       if (inst.size_req)
7686         {
7687           as_bad (_("width suffixes are invalid in ARM mode -- `%s'"), str);
7688           return;
7689         }
7690
7691       mapping_state (MAP_ARM);
7692       inst.instruction = opcode->avalue;
7693       if (opcode->tag == OT_unconditionalF)
7694         inst.instruction |= 0xF << 28;
7695       else
7696         inst.instruction |= inst.cond << 28;
7697       inst.size = INSN_SIZE;
7698       if (!parse_operands (p, opcode->operands))
7699         opcode->aencode ();
7700     }
7701   output_inst (str);
7702 }
7703
7704 /* Various frobbings of labels and their addresses.  */
7705
7706 void
7707 arm_start_line_hook (void)
7708 {
7709   last_label_seen = NULL;
7710 }
7711
7712 void
7713 arm_frob_label (symbolS * sym)
7714 {
7715   last_label_seen = sym;
7716
7717   ARM_SET_THUMB (sym, thumb_mode);
7718
7719 #if defined OBJ_COFF || defined OBJ_ELF
7720   ARM_SET_INTERWORK (sym, support_interwork);
7721 #endif
7722
7723   /* Note - do not allow local symbols (.Lxxx) to be labeled
7724      as Thumb functions.  This is because these labels, whilst
7725      they exist inside Thumb code, are not the entry points for
7726      possible ARM->Thumb calls.  Also, these labels can be used
7727      as part of a computed goto or switch statement.  eg gcc
7728      can generate code that looks like this:
7729
7730                 ldr  r2, [pc, .Laaa]
7731                 lsl  r3, r3, #2
7732                 ldr  r2, [r3, r2]
7733                 mov  pc, r2
7734
7735        .Lbbb:  .word .Lxxx
7736        .Lccc:  .word .Lyyy
7737        ..etc...
7738        .Laaa:   .word Lbbb
7739
7740      The first instruction loads the address of the jump table.
7741      The second instruction converts a table index into a byte offset.
7742      The third instruction gets the jump address out of the table.
7743      The fourth instruction performs the jump.
7744
7745      If the address stored at .Laaa is that of a symbol which has the
7746      Thumb_Func bit set, then the linker will arrange for this address
7747      to have the bottom bit set, which in turn would mean that the
7748      address computation performed by the third instruction would end
7749      up with the bottom bit set.  Since the ARM is capable of unaligned
7750      word loads, the instruction would then load the incorrect address
7751      out of the jump table, and chaos would ensue.  */
7752   if (label_is_thumb_function_name
7753       && (S_GET_NAME (sym)[0] != '.' || S_GET_NAME (sym)[1] != 'L')
7754       && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
7755     {
7756       /* When the address of a Thumb function is taken the bottom
7757          bit of that address should be set.  This will allow
7758          interworking between Arm and Thumb functions to work
7759          correctly.  */
7760
7761       THUMB_SET_FUNC (sym, 1);
7762
7763       label_is_thumb_function_name = FALSE;
7764     }
7765 }
7766
7767 int
7768 arm_data_in_code (void)
7769 {
7770   if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
7771     {
7772       *input_line_pointer = '/';
7773       input_line_pointer += 5;
7774       *input_line_pointer = 0;
7775       return 1;
7776     }
7777
7778   return 0;
7779 }
7780
7781 char *
7782 arm_canonicalize_symbol_name (char * name)
7783 {
7784   int len;
7785
7786   if (thumb_mode && (len = strlen (name)) > 5
7787       && streq (name + len - 5, "/data"))
7788     *(name + len - 5) = 0;
7789
7790   return name;
7791 }
7792 \f
7793 /* Table of all register names defined by default.  The user can
7794    define additional names with .req.  Note that all register names
7795    should appear in both upper and lowercase variants.  Some registers
7796    also have mixed-case names.  */
7797
7798 #define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE }
7799 #define REGNUM(p,n,t) REGDEF(p##n, n, t)
7800 #define REGSET(p,t) \
7801   REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
7802   REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
7803   REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
7804   REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
7805
7806 static const struct reg_entry reg_names[] =
7807 {
7808   /* ARM integer registers.  */
7809   REGSET(r, RN), REGSET(R, RN),
7810
7811   /* ATPCS synonyms.  */
7812   REGDEF(a1,0,RN), REGDEF(a2,1,RN), REGDEF(a3, 2,RN), REGDEF(a4, 3,RN),
7813   REGDEF(v1,4,RN), REGDEF(v2,5,RN), REGDEF(v3, 6,RN), REGDEF(v4, 7,RN),
7814   REGDEF(v5,8,RN), REGDEF(v6,9,RN), REGDEF(v7,10,RN), REGDEF(v8,11,RN),
7815
7816   REGDEF(A1,0,RN), REGDEF(A2,1,RN), REGDEF(A3, 2,RN), REGDEF(A4, 3,RN),
7817   REGDEF(V1,4,RN), REGDEF(V2,5,RN), REGDEF(V3, 6,RN), REGDEF(V4, 7,RN),
7818   REGDEF(V5,8,RN), REGDEF(V6,9,RN), REGDEF(V7,10,RN), REGDEF(V8,11,RN),
7819
7820   /* Well-known aliases.  */
7821   REGDEF(wr, 7,RN), REGDEF(sb, 9,RN), REGDEF(sl,10,RN), REGDEF(fp,11,RN),
7822   REGDEF(ip,12,RN), REGDEF(sp,13,RN), REGDEF(lr,14,RN), REGDEF(pc,15,RN),
7823
7824   REGDEF(WR, 7,RN), REGDEF(SB, 9,RN), REGDEF(SL,10,RN), REGDEF(FP,11,RN),
7825   REGDEF(IP,12,RN), REGDEF(SP,13,RN), REGDEF(LR,14,RN), REGDEF(PC,15,RN),
7826
7827   /* Coprocessor numbers.  */
7828   REGSET(p, CP), REGSET(P, CP),
7829
7830   /* Coprocessor register numbers.  The "cr" variants are for backward
7831      compatibility.  */
7832   REGSET(c,  CN), REGSET(C, CN),
7833   REGSET(cr, CN), REGSET(CR, CN),
7834
7835   /* FPA registers.  */
7836   REGNUM(f,0,FN), REGNUM(f,1,FN), REGNUM(f,2,FN), REGNUM(f,3,FN),
7837   REGNUM(f,4,FN), REGNUM(f,5,FN), REGNUM(f,6,FN), REGNUM(f,7, FN),
7838
7839   REGNUM(F,0,FN), REGNUM(F,1,FN), REGNUM(F,2,FN), REGNUM(F,3,FN),
7840   REGNUM(F,4,FN), REGNUM(F,5,FN), REGNUM(F,6,FN), REGNUM(F,7, FN),
7841
7842   /* VFP SP registers.  */
7843   REGSET(s,VFS),
7844   REGNUM(s,16,VFS), REGNUM(s,17,VFS), REGNUM(s,18,VFS), REGNUM(s,19,VFS),
7845   REGNUM(s,20,VFS), REGNUM(s,21,VFS), REGNUM(s,22,VFS), REGNUM(s,23,VFS),
7846   REGNUM(s,24,VFS), REGNUM(s,25,VFS), REGNUM(s,26,VFS), REGNUM(s,27,VFS),
7847   REGNUM(s,28,VFS), REGNUM(s,29,VFS), REGNUM(s,30,VFS), REGNUM(s,31,VFS),
7848
7849   REGSET(S,VFS),
7850   REGNUM(S,16,VFS), REGNUM(S,17,VFS), REGNUM(S,18,VFS), REGNUM(S,19,VFS),
7851   REGNUM(S,20,VFS), REGNUM(S,21,VFS), REGNUM(S,22,VFS), REGNUM(S,23,VFS),
7852   REGNUM(S,24,VFS), REGNUM(S,25,VFS), REGNUM(S,26,VFS), REGNUM(S,27,VFS),
7853   REGNUM(S,28,VFS), REGNUM(S,29,VFS), REGNUM(S,30,VFS), REGNUM(S,31,VFS),
7854
7855   /* VFP DP Registers.  */
7856   REGSET(d,VFD), REGSET(D,VFS),
7857
7858   /* VFP control registers.  */
7859   REGDEF(fpsid,0,VFC), REGDEF(fpscr,1,VFC), REGDEF(fpexc,8,VFC),
7860   REGDEF(FPSID,0,VFC), REGDEF(FPSCR,1,VFC), REGDEF(FPEXC,8,VFC),
7861
7862   /* Maverick DSP coprocessor registers.  */
7863   REGSET(mvf,MVF),  REGSET(mvd,MVD),  REGSET(mvfx,MVFX),  REGSET(mvdx,MVDX),
7864   REGSET(MVF,MVF),  REGSET(MVD,MVD),  REGSET(MVFX,MVFX),  REGSET(MVDX,MVDX),
7865
7866   REGNUM(mvax,0,MVAX), REGNUM(mvax,1,MVAX),
7867   REGNUM(mvax,2,MVAX), REGNUM(mvax,3,MVAX),
7868   REGDEF(dspsc,0,DSPSC),
7869
7870   REGNUM(MVAX,0,MVAX), REGNUM(MVAX,1,MVAX),
7871   REGNUM(MVAX,2,MVAX), REGNUM(MVAX,3,MVAX),
7872   REGDEF(DSPSC,0,DSPSC),
7873
7874   /* iWMMXt data registers - p0, c0-15.  */
7875   REGSET(wr,MMXWR), REGSET(wR,MMXWR), REGSET(WR, MMXWR),
7876
7877   /* iWMMXt control registers - p1, c0-3.  */
7878   REGDEF(wcid,  0,MMXWC),  REGDEF(wCID,  0,MMXWC),  REGDEF(WCID,  0,MMXWC),
7879   REGDEF(wcon,  1,MMXWC),  REGDEF(wCon,  1,MMXWC),  REGDEF(WCON,  1,MMXWC),
7880   REGDEF(wcssf, 2,MMXWC),  REGDEF(wCSSF, 2,MMXWC),  REGDEF(WCSSF, 2,MMXWC),
7881   REGDEF(wcasf, 3,MMXWC),  REGDEF(wCASF, 3,MMXWC),  REGDEF(WCASF, 3,MMXWC),
7882
7883   /* iWMMXt scalar (constant/offset) registers - p1, c8-11.  */
7884   REGDEF(wcgr0, 8,MMXWCG),  REGDEF(wCGR0, 8,MMXWCG),  REGDEF(WCGR0, 8,MMXWCG),
7885   REGDEF(wcgr1, 9,MMXWCG),  REGDEF(wCGR1, 9,MMXWCG),  REGDEF(WCGR1, 9,MMXWCG),
7886   REGDEF(wcgr2,10,MMXWCG),  REGDEF(wCGR2,10,MMXWCG),  REGDEF(WCGR2,10,MMXWCG),
7887   REGDEF(wcgr3,11,MMXWCG),  REGDEF(wCGR3,11,MMXWCG),  REGDEF(WCGR3,11,MMXWCG),
7888
7889   /* XScale accumulator registers.  */
7890   REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE),
7891 };
7892 #undef REGDEF
7893 #undef REGNUM
7894 #undef REGSET
7895
7896 /* Table of all PSR suffixes.  Bare "CPSR" and "SPSR" are handled
7897    within psr_required_here.  */
7898 static const struct asm_psr psrs[] =
7899 {
7900   /* Backward compatibility notation.  Note that "all" is no longer
7901      truly all possible PSR bits.  */
7902   {"all",  PSR_c | PSR_f},
7903   {"flg",  PSR_f},
7904   {"ctl",  PSR_c},
7905
7906   /* Individual flags.  */
7907   {"f",    PSR_f},
7908   {"c",    PSR_c},
7909   {"x",    PSR_x},
7910   {"s",    PSR_s},
7911   /* Combinations of flags.  */
7912   {"fs",   PSR_f | PSR_s},
7913   {"fx",   PSR_f | PSR_x},
7914   {"fc",   PSR_f | PSR_c},
7915   {"sf",   PSR_s | PSR_f},
7916   {"sx",   PSR_s | PSR_x},
7917   {"sc",   PSR_s | PSR_c},
7918   {"xf",   PSR_x | PSR_f},
7919   {"xs",   PSR_x | PSR_s},
7920   {"xc",   PSR_x | PSR_c},
7921   {"cf",   PSR_c | PSR_f},
7922   {"cs",   PSR_c | PSR_s},
7923   {"cx",   PSR_c | PSR_x},
7924   {"fsx",  PSR_f | PSR_s | PSR_x},
7925   {"fsc",  PSR_f | PSR_s | PSR_c},
7926   {"fxs",  PSR_f | PSR_x | PSR_s},
7927   {"fxc",  PSR_f | PSR_x | PSR_c},
7928   {"fcs",  PSR_f | PSR_c | PSR_s},
7929   {"fcx",  PSR_f | PSR_c | PSR_x},
7930   {"sfx",  PSR_s | PSR_f | PSR_x},
7931   {"sfc",  PSR_s | PSR_f | PSR_c},
7932   {"sxf",  PSR_s | PSR_x | PSR_f},
7933   {"sxc",  PSR_s | PSR_x | PSR_c},
7934   {"scf",  PSR_s | PSR_c | PSR_f},
7935   {"scx",  PSR_s | PSR_c | PSR_x},
7936   {"xfs",  PSR_x | PSR_f | PSR_s},
7937   {"xfc",  PSR_x | PSR_f | PSR_c},
7938   {"xsf",  PSR_x | PSR_s | PSR_f},
7939   {"xsc",  PSR_x | PSR_s | PSR_c},
7940   {"xcf",  PSR_x | PSR_c | PSR_f},
7941   {"xcs",  PSR_x | PSR_c | PSR_s},
7942   {"cfs",  PSR_c | PSR_f | PSR_s},
7943   {"cfx",  PSR_c | PSR_f | PSR_x},
7944   {"csf",  PSR_c | PSR_s | PSR_f},
7945   {"csx",  PSR_c | PSR_s | PSR_x},
7946   {"cxf",  PSR_c | PSR_x | PSR_f},
7947   {"cxs",  PSR_c | PSR_x | PSR_s},
7948   {"fsxc", PSR_f | PSR_s | PSR_x | PSR_c},
7949   {"fscx", PSR_f | PSR_s | PSR_c | PSR_x},
7950   {"fxsc", PSR_f | PSR_x | PSR_s | PSR_c},
7951   {"fxcs", PSR_f | PSR_x | PSR_c | PSR_s},
7952   {"fcsx", PSR_f | PSR_c | PSR_s | PSR_x},
7953   {"fcxs", PSR_f | PSR_c | PSR_x | PSR_s},
7954   {"sfxc", PSR_s | PSR_f | PSR_x | PSR_c},
7955   {"sfcx", PSR_s | PSR_f | PSR_c | PSR_x},
7956   {"sxfc", PSR_s | PSR_x | PSR_f | PSR_c},
7957   {"sxcf", PSR_s | PSR_x | PSR_c | PSR_f},
7958   {"scfx", PSR_s | PSR_c | PSR_f | PSR_x},
7959   {"scxf", PSR_s | PSR_c | PSR_x | PSR_f},
7960   {"xfsc", PSR_x | PSR_f | PSR_s | PSR_c},
7961   {"xfcs", PSR_x | PSR_f | PSR_c | PSR_s},
7962   {"xsfc", PSR_x | PSR_s | PSR_f | PSR_c},
7963   {"xscf", PSR_x | PSR_s | PSR_c | PSR_f},
7964   {"xcfs", PSR_x | PSR_c | PSR_f | PSR_s},
7965   {"xcsf", PSR_x | PSR_c | PSR_s | PSR_f},
7966   {"cfsx", PSR_c | PSR_f | PSR_s | PSR_x},
7967   {"cfxs", PSR_c | PSR_f | PSR_x | PSR_s},
7968   {"csfx", PSR_c | PSR_s | PSR_f | PSR_x},
7969   {"csxf", PSR_c | PSR_s | PSR_x | PSR_f},
7970   {"cxfs", PSR_c | PSR_x | PSR_f | PSR_s},
7971   {"cxsf", PSR_c | PSR_x | PSR_s | PSR_f},
7972 };
7973
7974 /* Table of all shift-in-operand names.  */
7975 static const struct asm_shift_name shift_names [] =
7976 {
7977   { "asl", SHIFT_LSL },  { "ASL", SHIFT_LSL },
7978   { "lsl", SHIFT_LSL },  { "LSL", SHIFT_LSL },
7979   { "lsr", SHIFT_LSR },  { "LSR", SHIFT_LSR },
7980   { "asr", SHIFT_ASR },  { "ASR", SHIFT_ASR },
7981   { "ror", SHIFT_ROR },  { "ROR", SHIFT_ROR },
7982   { "rrx", SHIFT_RRX },  { "RRX", SHIFT_RRX }
7983 };
7984
7985 /* Table of all explicit relocation names.  */
7986 #ifdef OBJ_ELF
7987 static struct reloc_entry reloc_names[] =
7988 {
7989   { "got",     BFD_RELOC_ARM_GOT32   },  { "GOT",     BFD_RELOC_ARM_GOT32   },
7990   { "gotoff",  BFD_RELOC_ARM_GOTOFF  },  { "GOTOFF",  BFD_RELOC_ARM_GOTOFF  },
7991   { "plt",     BFD_RELOC_ARM_PLT32   },  { "PLT",     BFD_RELOC_ARM_PLT32   },
7992   { "target1", BFD_RELOC_ARM_TARGET1 },  { "TARGET1", BFD_RELOC_ARM_TARGET1 },
7993   { "target2", BFD_RELOC_ARM_TARGET2 },  { "TARGET2", BFD_RELOC_ARM_TARGET2 },
7994   { "sbrel",   BFD_RELOC_ARM_SBREL32 },  { "SBREL",   BFD_RELOC_ARM_SBREL32 },
7995   { "tlsgd",   BFD_RELOC_ARM_TLS_GD32},  { "TLSGD",   BFD_RELOC_ARM_TLS_GD32},
7996   { "tlsldm",  BFD_RELOC_ARM_TLS_LDM32}, { "TLSLDM",  BFD_RELOC_ARM_TLS_LDM32},
7997   { "tlsldo",  BFD_RELOC_ARM_TLS_LDO32}, { "TLSLDO",  BFD_RELOC_ARM_TLS_LDO32},
7998   { "gottpoff",BFD_RELOC_ARM_TLS_IE32},  { "GOTTPOFF",BFD_RELOC_ARM_TLS_IE32},
7999   { "tpoff",   BFD_RELOC_ARM_TLS_LE32},  { "TPOFF",   BFD_RELOC_ARM_TLS_LE32}
8000 };
8001 #endif
8002
8003 /* Table of all conditional affixes.  0xF is not defined as a condition code.  */
8004 static const struct asm_cond conds[] =
8005 {
8006   {"eq", 0x0},
8007   {"ne", 0x1},
8008   {"cs", 0x2}, {"hs", 0x2},
8009   {"cc", 0x3}, {"ul", 0x3}, {"lo", 0x3},
8010   {"mi", 0x4},
8011   {"pl", 0x5},
8012   {"vs", 0x6},
8013   {"vc", 0x7},
8014   {"hi", 0x8},
8015   {"ls", 0x9},
8016   {"ge", 0xa},
8017   {"lt", 0xb},
8018   {"gt", 0xc},
8019   {"le", 0xd},
8020   {"al", 0xe}
8021 };
8022
8023 /* Table of ARM-format instructions.    */
8024
8025 /* Macros for gluing together operand strings.  N.B. In all cases
8026    other than OPS0, the trailing OP_stop comes from default
8027    zero-initialization of the unspecified elements of the array.  */
8028 #define OPS0()            { OP_stop, }
8029 #define OPS1(a)           { OP_##a, }
8030 #define OPS2(a,b)         { OP_##a,OP_##b, }
8031 #define OPS3(a,b,c)       { OP_##a,OP_##b,OP_##c, }
8032 #define OPS4(a,b,c,d)     { OP_##a,OP_##b,OP_##c,OP_##d, }
8033 #define OPS5(a,b,c,d,e)   { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e, }
8034 #define OPS6(a,b,c,d,e,f) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e,OP_##f, }
8035
8036 /* These macros abstract out the exact format of the mnemonic table and
8037    save some repeated characters.  */
8038
8039 /* The normal sort of mnemonic; has a Thumb variant; takes a conditional suffix.  */
8040 #define TxCE(mnem, op, top, nops, ops, ae, te) \
8041   { #mnem, OPS##nops ops, OT_csuffix, 0x##op, top, ARM_VARIANT, \
8042     THUMB_VARIANT, do_##ae, do_##te }
8043
8044 /* Two variants of the above - TCE for a numeric Thumb opcode, tCE for
8045    a T_MNEM_xyz enumerator.  */
8046 #define TCE(mnem, aop, top, nops, ops, ae, te) \
8047        TxCE(mnem, aop, 0x##top, nops, ops, ae, te)
8048 #define tCE(mnem, aop, top, nops, ops, ae, te) \
8049        TxCE(mnem, aop, T_MNEM_##top, nops, ops, ae, te)
8050
8051 /* Second most common sort of mnemonic: has a Thumb variant, takes a conditional
8052    infix after the third character.  */
8053 #define TxC3(mnem, op, top, nops, ops, ae, te) \
8054   { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, top, ARM_VARIANT, \
8055     THUMB_VARIANT, do_##ae, do_##te }
8056 #define TC3(mnem, aop, top, nops, ops, ae, te) \
8057        TxC3(mnem, aop, 0x##top, nops, ops, ae, te)
8058 #define tC3(mnem, aop, top, nops, ops, ae, te) \
8059        TxC3(mnem, aop, T_MNEM_##top, nops, ops, ae, te)
8060
8061 /* Mnemonic with a conditional infix in an unusual place.  Each and every variant has to
8062    appear in the condition table.  */
8063 #define TxCM_(m1, m2, m3, op, top, nops, ops, ae, te)   \
8064   { #m1 #m2 #m3, OPS##nops ops, sizeof(#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof(#m1) - 1, \
8065     0x##op, top, ARM_VARIANT, THUMB_VARIANT, do_##ae, do_##te }
8066
8067 #define TxCM(m1, m2, op, top, nops, ops, ae, te)        \
8068   TxCM_(m1,   , m2, op, top, nops, ops, ae, te),        \
8069   TxCM_(m1, eq, m2, op, top, nops, ops, ae, te),        \
8070   TxCM_(m1, ne, m2, op, top, nops, ops, ae, te),        \
8071   TxCM_(m1, cs, m2, op, top, nops, ops, ae, te),        \
8072   TxCM_(m1, hs, m2, op, top, nops, ops, ae, te),        \
8073   TxCM_(m1, cc, m2, op, top, nops, ops, ae, te),        \
8074   TxCM_(m1, ul, m2, op, top, nops, ops, ae, te),        \
8075   TxCM_(m1, lo, m2, op, top, nops, ops, ae, te),        \
8076   TxCM_(m1, mi, m2, op, top, nops, ops, ae, te),        \
8077   TxCM_(m1, pl, m2, op, top, nops, ops, ae, te),        \
8078   TxCM_(m1, vs, m2, op, top, nops, ops, ae, te),        \
8079   TxCM_(m1, vc, m2, op, top, nops, ops, ae, te),        \
8080   TxCM_(m1, hi, m2, op, top, nops, ops, ae, te),        \
8081   TxCM_(m1, ls, m2, op, top, nops, ops, ae, te),        \
8082   TxCM_(m1, ge, m2, op, top, nops, ops, ae, te),        \
8083   TxCM_(m1, lt, m2, op, top, nops, ops, ae, te),        \
8084   TxCM_(m1, gt, m2, op, top, nops, ops, ae, te),        \
8085   TxCM_(m1, le, m2, op, top, nops, ops, ae, te),        \
8086   TxCM_(m1, al, m2, op, top, nops, ops, ae, te)
8087
8088 #define TCM(m1,m2, aop, top, nops, ops, ae, te)         \
8089        TxCM(m1,m2, aop, 0x##top, nops, ops, ae, te)
8090 #define tCM(m1,m2, aop, top, nops, ops, ae, te)                 \
8091        TxCM(m1,m2, aop, T_MNEM_##top, nops, ops, ae, te)
8092
8093 /* Mnemonic that cannot be conditionalized.  The ARM condition-code
8094    field is still 0xE.  */
8095 #define TUE(mnem, op, top, nops, ops, ae, te)                           \
8096   { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
8097     THUMB_VARIANT, do_##ae, do_##te }
8098
8099 /* Mnemonic that cannot be conditionalized, and bears 0xF in its ARM
8100    condition code field.  */
8101 #define TUF(mnem, op, top, nops, ops, ae, te)                           \
8102   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##top, ARM_VARIANT, \
8103     THUMB_VARIANT, do_##ae, do_##te }
8104
8105 /* ARM-only variants of all the above.  */
8106 #define CE(mnem,  op, nops, ops, ae)    \
8107   { #mnem, OPS##nops ops, OT_csuffix, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
8108
8109 #define C3(mnem, op, nops, ops, ae)     \
8110   { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
8111
8112 #define xCM_(m1, m2, m3, op, nops, ops, ae)     \
8113   { #m1 #m2 #m3, OPS##nops ops, \
8114     sizeof(#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof(#m1) - 1, \
8115     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
8116
8117 #define CM(m1, m2, op, nops, ops, ae)   \
8118   xCM_(m1,   , m2, op, nops, ops, ae),  \
8119   xCM_(m1, eq, m2, op, nops, ops, ae),  \
8120   xCM_(m1, ne, m2, op, nops, ops, ae),  \
8121   xCM_(m1, cs, m2, op, nops, ops, ae),  \
8122   xCM_(m1, hs, m2, op, nops, ops, ae),  \
8123   xCM_(m1, cc, m2, op, nops, ops, ae),  \
8124   xCM_(m1, ul, m2, op, nops, ops, ae),  \
8125   xCM_(m1, lo, m2, op, nops, ops, ae),  \
8126   xCM_(m1, mi, m2, op, nops, ops, ae),  \
8127   xCM_(m1, pl, m2, op, nops, ops, ae),  \
8128   xCM_(m1, vs, m2, op, nops, ops, ae),  \
8129   xCM_(m1, vc, m2, op, nops, ops, ae),  \
8130   xCM_(m1, hi, m2, op, nops, ops, ae),  \
8131   xCM_(m1, ls, m2, op, nops, ops, ae),  \
8132   xCM_(m1, ge, m2, op, nops, ops, ae),  \
8133   xCM_(m1, lt, m2, op, nops, ops, ae),  \
8134   xCM_(m1, gt, m2, op, nops, ops, ae),  \
8135   xCM_(m1, le, m2, op, nops, ops, ae),  \
8136   xCM_(m1, al, m2, op, nops, ops, ae)
8137
8138 #define UE(mnem, op, nops, ops, ae)     \
8139   { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
8140
8141 #define UF(mnem, op, nops, ops, ae)     \
8142   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
8143
8144 #define do_0 0
8145
8146 /* Thumb-only, unconditional.  */
8147 #define UT(mnem,  op, nops, ops, te) TUE(mnem,  0, op, nops, ops, 0, te)
8148
8149 /* ARM-only, takes either a suffix or a position-3 infix
8150    (for an FPA corner case). */
8151 #define C3E(mnem, op, nops, ops, ae) \
8152   { #mnem, OPS##nops ops, OT_csuf_or_in3, 0x##op, 0, ARM_VARIANT, 0, do_##ae, 0 }
8153
8154 static const struct asm_opcode insns[] =
8155 {
8156 #define ARM_VARIANT ARM_EXT_V1 /* Core ARM Instructions.  */
8157 #define THUMB_VARIANT ARM_EXT_V4T
8158  tCE(and,       0000000, and,      3, (RR, oRR, SH), arit, t_arit3c),
8159  tC3(ands,      0100000, ands,     3, (RR, oRR, SH), arit, t_arit3c),
8160  tCE(eor,       0200000, eor,      3, (RR, oRR, SH), arit, t_arit3c),
8161  tC3(eors,      0300000, eors,     3, (RR, oRR, SH), arit, t_arit3c),
8162  tCE(sub,       0400000, sub,      3, (RR, oRR, SH), arit, t_add_sub),
8163  tC3(subs,      0500000, subs,     3, (RR, oRR, SH), arit, t_add_sub),
8164  tCE(add,       0800000, add,      3, (RR, oRR, SH), arit, t_add_sub),
8165  tC3(adds,      0900000, adds,     3, (RR, oRR, SH), arit, t_add_sub),
8166  tCE(adc,       0a00000, adc,      3, (RR, oRR, SH), arit, t_arit3c),
8167  tC3(adcs,      0b00000, adcs,     3, (RR, oRR, SH), arit, t_arit3c),
8168  tCE(sbc,       0c00000, sbc,      3, (RR, oRR, SH), arit, t_arit3),
8169  tC3(sbcs,      0d00000, sbcs,     3, (RR, oRR, SH), arit, t_arit3),
8170  tCE(orr,       1800000, orr,      3, (RR, oRR, SH), arit, t_arit3c),
8171  tC3(orrs,      1900000, orrs,     3, (RR, oRR, SH), arit, t_arit3c),
8172  tCE(bic,       1c00000, bic,      3, (RR, oRR, SH), arit, t_arit3),
8173  tC3(bics,      1d00000, bics,     3, (RR, oRR, SH), arit, t_arit3),
8174
8175  /* The p-variants of tst/cmp/cmn/teq (below) are the pre-V6 mechanism
8176     for setting PSR flag bits.  They are obsolete in V6 and do not
8177     have Thumb equivalents. */
8178  tCE(tst,       1100000, tst,      2, (RR, SH),      cmp,  t_mvn_tst),
8179  tC3(tsts,      1100000, tst,      2, (RR, SH),      cmp,  t_mvn_tst),
8180   C3(tstp,      110f000,           2, (RR, SH),      cmp),
8181  tCE(cmp,       1500000, cmp,      2, (RR, SH),      cmp,  t_mov_cmp),
8182  tC3(cmps,      1500000, cmp,      2, (RR, SH),      cmp,  t_mov_cmp),
8183   C3(cmpp,      150f000,           2, (RR, SH),      cmp),
8184  tCE(cmn,       1700000, cmn,      2, (RR, SH),      cmp,  t_mvn_tst),
8185  tC3(cmns,      1700000, cmn,      2, (RR, SH),      cmp,  t_mvn_tst),
8186   C3(cmnp,      170f000,           2, (RR, SH),      cmp),
8187
8188  tCE(mov,       1a00000, mov,      2, (RR, SH),      mov,  t_mov_cmp),
8189  tC3(movs,      1b00000, movs,     2, (RR, SH),      mov,  t_mov_cmp),
8190  tCE(mvn,       1e00000, mvn,      2, (RR, SH),      mov,  t_mvn_tst),
8191  tC3(mvns,      1f00000, mvns,     2, (RR, SH),      mov,  t_mvn_tst),
8192
8193  tCE(ldr,       4100000, ldr,      2, (RR, ADDR),    ldst, t_ldst),
8194  tC3(ldrb,      4500000, ldrb,     2, (RR, ADDR),    ldst, t_ldst),
8195  tCE(str,       4000000, str,      2, (RR, ADDR),    ldst, t_ldst),
8196  tC3(strb,      4400000, strb,     2, (RR, ADDR),    ldst, t_ldst),
8197
8198  tC3(stmia,     8800000, stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
8199  tC3(stmea,     8800000, stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
8200  tC3(ldmia,     8900000, ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
8201  tC3(ldmfd,     8900000, ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
8202
8203  TCE(swi,       f000000, df00,     1, (EXPi),        swi, t_swi),
8204  TCE(b,         a000000, e000,     1, (EXPr),        branch, t_branch),
8205  TCE(bl,        b000000, f000f800, 1, (EXPr),        branch, t_branch23),
8206
8207   /* Pseudo ops.  */
8208  TCE(adr,       28f0000, 000f,     2, (RR, EXP),     adr,  t_adr),
8209   C3(adrl,      28f0000,           2, (RR, EXP),     adrl),
8210  tCE(nop,       1a00000, nop,      1, (oI255c),      nop,  t_nop),
8211
8212   /* Thumb-compatibility pseudo ops.  */
8213  tCE(lsl,       1a00000, lsl,      3, (RR, oRR, SH), shift, t_shift),
8214  tC3(lsls,      1b00000, lsls,     3, (RR, oRR, SH), shift, t_shift),
8215  tCE(lsr,       1a00020, lsr,      3, (RR, oRR, SH), shift, t_shift),
8216  tC3(lsrs,      1b00020, lsrs,     3, (RR, oRR, SH), shift, t_shift),
8217  tCE(asr,       1a00040, asr,      3, (RR, oRR, SH), shift, t_shift),
8218  tC3(asrs,      1b00040, asrs,     3, (RR, oRR, SH), shift, t_shift),
8219  tCE(ror,       1a00060, ror,      3, (RR, oRR, SH), shift, t_shift),
8220  tC3(rors,      1b00060, rors,     3, (RR, oRR, SH), shift, t_shift),
8221  tCE(neg,       2600000, neg,      2, (RR, RR),      rd_rn, t_neg),
8222  tC3(negs,      2700000, negs,     2, (RR, RR),      rd_rn, t_neg),
8223  tCE(push,      92d0000, push,     1, (REGLST),      push_pop, t_push_pop),
8224  tCE(pop,       8bd0000, pop,      1, (REGLST),      push_pop, t_push_pop),
8225
8226 #undef THUMB_VARIANT
8227 #define THUMB_VARIANT ARM_EXT_V6
8228  TCE(cpy,       1a00000, 4600,     2, (RR, RR),      rd_rm, t_cpy),
8229
8230  /* V1 instructions with no Thumb analogue prior to V6T2.  */
8231 #undef THUMB_VARIANT
8232 #define THUMB_VARIANT ARM_EXT_V6T2
8233  TCE(rsb,       0600000, ebc00000, 3, (RR, oRR, SH), arit, t_rsb),
8234  TC3(rsbs,      0700000, ebd00000, 3, (RR, oRR, SH), arit, t_rsb),
8235  TCE(teq,       1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
8236  TC3(teqs,      1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
8237   C3(teqp,      130f000,           2, (RR, SH),      cmp),
8238
8239  TC3(ldrt,      4300000, f8500e00, 2, (RR, ADDR),    ldstt, t_ldstt),
8240  TC3(ldrbt,     4700000, f8300e00, 2, (RR, ADDR),    ldstt, t_ldstt),
8241  TC3(strt,      4200000, f8400e00, 2, (RR, ADDR),    ldstt, t_ldstt),
8242  TC3(strbt,     4600000, f8200e00, 2, (RR, ADDR),    ldstt, t_ldstt),
8243
8244  TC3(stmdb,     9000000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
8245  TC3(stmfd,     9000000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
8246
8247  TC3(ldmdb,     9100000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
8248  TC3(ldmea,     9100000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
8249
8250  /* V1 instructions with no Thumb analogue at all.  */
8251   CE(rsc,       0e00000,           3, (RR, oRR, SH), arit),
8252   C3(rscs,      0f00000,           3, (RR, oRR, SH), arit),
8253
8254   C3(stmib,     9800000,           2, (RRw, REGLST), ldmstm),
8255   C3(stmfa,     9800000,           2, (RRw, REGLST), ldmstm),
8256   C3(stmda,     8000000,           2, (RRw, REGLST), ldmstm),
8257   C3(stmed,     8000000,           2, (RRw, REGLST), ldmstm),
8258   C3(ldmib,     9900000,           2, (RRw, REGLST), ldmstm),
8259   C3(ldmed,     9900000,           2, (RRw, REGLST), ldmstm),
8260   C3(ldmda,     8100000,           2, (RRw, REGLST), ldmstm),
8261   C3(ldmfa,     8100000,           2, (RRw, REGLST), ldmstm),
8262
8263 #undef ARM_VARIANT
8264 #define ARM_VARIANT ARM_EXT_V2  /* ARM 2 - multiplies.  */
8265 #undef THUMB_VARIANT
8266 #define THUMB_VARIANT ARM_EXT_V4T
8267  tCE(mul,       0000090, mul,      3, (RRnpc, RRnpc, oRR), mul, t_mul),
8268  tC3(muls,      0100090, muls,     3, (RRnpc, RRnpc, oRR), mul, t_mul),
8269
8270 #undef THUMB_VARIANT
8271 #define THUMB_VARIANT ARM_EXT_V6T2
8272  TCE(mla,       0200090, fb000000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
8273   C3(mlas,      0300090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas),
8274
8275   /* Generic coprocessor instructions.  */
8276  TCE(cdp,       e000000, ee000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
8277  TCE(ldc,       c100000, ec100000, 3, (RCP, RCN, ADDR),                 lstc,   lstc),
8278  TC3(ldcl,      c500000, ec500000, 3, (RCP, RCN, ADDR),                 lstc,   lstc),
8279  TCE(stc,       c000000, ec000000, 3, (RCP, RCN, ADDR),                 lstc,   lstc),
8280  TC3(stcl,      c400000, ec400000, 3, (RCP, RCN, ADDR),                 lstc,   lstc),
8281  TCE(mcr,       e000010, ee000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
8282  TCE(mrc,       e100010, ee100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
8283
8284 #undef ARM_VARIANT
8285 #define ARM_VARIANT ARM_EXT_V2S /* ARM 3 - swp instructions.  */
8286   CE(swp,       1000090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
8287   C3(swpb,      1400090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
8288
8289 #undef ARM_VARIANT
8290 #define ARM_VARIANT ARM_EXT_V3  /* ARM 6 Status register instructions.  */
8291  TCE(mrs,       10f0000, f3ef8000, 2, (RR, PSR),     mrs, t_mrs),
8292  TCE(msr,       120f000, f3808000, 2, (PSR, RR_EXi), msr, t_msr),
8293
8294 #undef ARM_VARIANT
8295 #define ARM_VARIANT ARM_EXT_V3M  /* ARM 7M long multiplies.  */
8296  TCE(smull,     0c00090, fb800000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
8297   CM(smull,s,   0d00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
8298  TCE(umull,     0800090, fba00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
8299   CM(umull,s,   0900090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
8300  TCE(smlal,     0e00090, fbc00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
8301   CM(smlal,s,   0f00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
8302  TCE(umlal,     0a00090, fbe00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
8303   CM(umlal,s,   0b00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
8304
8305 #undef ARM_VARIANT
8306 #define ARM_VARIANT ARM_EXT_V4  /* ARM Architecture 4.  */
8307 #undef THUMB_VARIANT
8308 #define THUMB_VARIANT ARM_EXT_V4T
8309  tC3(ldrh,      01000b0, ldrh,     2, (RR, ADDR), ldstv4, t_ldst),
8310  tC3(strh,      00000b0, strh,     2, (RR, ADDR), ldstv4, t_ldst),
8311  tC3(ldrsh,     01000f0, ldrsh,    2, (RR, ADDR), ldstv4, t_ldst),
8312  tC3(ldrsb,     01000d0, ldrsb,    2, (RR, ADDR), ldstv4, t_ldst),
8313  tCM(ld,sh,     01000f0, ldrsh,    2, (RR, ADDR), ldstv4, t_ldst),
8314  tCM(ld,sb,     01000d0, ldrsb,    2, (RR, ADDR), ldstv4, t_ldst),
8315
8316 #undef ARM_VARIANT
8317 #define ARM_VARIANT ARM_EXT_V4T|ARM_EXT_V5
8318   /* ARM Architecture 4T.  */
8319   /* Note: bx (and blx) are required on V5, even if the processor does
8320      not support Thumb.  */
8321  TCE(bx,        12fff10, 4700, 1, (RR), bx, t_bx),
8322
8323 #undef ARM_VARIANT
8324 #define ARM_VARIANT ARM_EXT_V5 /*  ARM Architecture 5T.  */
8325 #undef THUMB_VARIANT
8326 #define THUMB_VARIANT ARM_EXT_V5T
8327   /* Note: blx has 2 variants; the .value coded here is for
8328      BLX(2).  Only this variant has conditional execution.  */
8329  TCE(blx,       12fff30, 4780, 1, (RR_EXr),                         blx,  t_blx),
8330  TUE(bkpt,      1200070, be00, 1, (oIffffb),                        bkpt, t_bkpt),
8331
8332 #undef THUMB_VARIANT
8333 #define THUMB_VARIANT ARM_EXT_V6T2
8334  TCE(clz,       16f0f10, fab0f080, 2, (RRnpc, RRnpc),                   rd_rm,  t_clz),
8335  TUF(ldc2,      c100000, fc100000, 3, (RCP, RCN, ADDR),                 lstc,   lstc),
8336  TUF(ldc2l,     c500000, fc500000, 3, (RCP, RCN, ADDR),                 lstc,   lstc),
8337  TUF(stc2,      c000000, fc000000, 3, (RCP, RCN, ADDR),                 lstc,   lstc),
8338  TUF(stc2l,     c400000, fc400000, 3, (RCP, RCN, ADDR),                 lstc,   lstc),
8339  TUF(cdp2,      e000000, fe000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
8340  TUF(mcr2,      e000010, fe000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
8341  TUF(mrc2,      e100010, fe100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
8342
8343 #undef ARM_VARIANT
8344 #define ARM_VARIANT ARM_EXT_V5ExP /*  ARM Architecture 5TExP.  */
8345  TCE(smlabb,    1000080, fb100000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
8346  TCE(smlatb,    10000a0, fb100020, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
8347  TCE(smlabt,    10000c0, fb100010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
8348  TCE(smlatt,    10000e0, fb100030, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
8349
8350  TCE(smlawb,    1200080, fb300000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
8351  TCE(smlawt,    12000c0, fb300010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
8352
8353  TCE(smlalbb,   1400080, fbc00080, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
8354  TCE(smlaltb,   14000a0, fbc000a0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
8355  TCE(smlalbt,   14000c0, fbc00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
8356  TCE(smlaltt,   14000e0, fbc000b0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
8357
8358  TCE(smulbb,    1600080, fb10f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
8359  TCE(smultb,    16000a0, fb10f020, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
8360  TCE(smulbt,    16000c0, fb10f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
8361  TCE(smultt,    16000e0, fb10f030, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
8362
8363  TCE(smulwb,    12000a0, fb30f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
8364  TCE(smulwt,    12000e0, fb30f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
8365
8366  TCE(qadd,      1000050, fa80f080, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, rd_rm_rn),
8367  TCE(qdadd,     1400050, fa80f090, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, rd_rm_rn),
8368  TCE(qsub,      1200050, fa80f0a0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, rd_rm_rn),
8369  TCE(qdsub,     1600050, fa80f0b0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, rd_rm_rn),
8370
8371 #undef ARM_VARIANT
8372 #define ARM_VARIANT ARM_EXT_V5E /*  ARM Architecture 5TE.  */
8373  TUF(pld,       450f000, f810f000, 1, (ADDR),                pld,  t_pld),
8374  TC3(ldrd,      00000d0, e9500000, 3, (RRnpc, oRRnpc, ADDR), ldrd, t_ldstd),
8375  TC3(strd,      00000f0, e9400000, 3, (RRnpc, oRRnpc, ADDR), ldrd, t_ldstd),
8376
8377  TCE(mcrr,      c400000, ec400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
8378  TCE(mrrc,      c500000, ec500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
8379
8380 #undef ARM_VARIANT
8381 #define ARM_VARIANT ARM_EXT_V5J /*  ARM Architecture 5TEJ.  */
8382  TCE(bxj,       12fff20, f3c08f00, 1, (RR),                       bxj, t_bxj),
8383
8384 #undef ARM_VARIANT
8385 #define ARM_VARIANT ARM_EXT_V6 /*  ARM V6.  */
8386 #undef THUMB_VARIANT
8387 #define THUMB_VARIANT ARM_EXT_V6
8388  TUF(cpsie,     1080000, b660,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
8389  TUF(cpsid,     10c0000, b670,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
8390  tCE(rev,       6bf0f30, rev,      2, (RRnpc, RRnpc),             rd_rm,  t_rev),
8391  tCE(rev16,     6bf0fb0, rev16,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
8392  tCE(revsh,     6ff0fb0, revsh,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
8393  tCE(sxth,      6bf0070, sxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
8394  tCE(uxth,      6ff0070, uxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
8395  tCE(sxtb,      6af0070, sxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
8396  tCE(uxtb,      6ef0070, uxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
8397  TUF(setend,    1010000, b650,     1, (ENDI),                     setend, t_setend),
8398
8399 #undef THUMB_VARIANT
8400 #define THUMB_VARIANT ARM_EXT_V6T2
8401  TUF(cps,       1020000, f3af8100, 1, (I31b),                     imm0, imm0),
8402  TCE(ldrex,     1900f9f, e8500f00, 2, (RRnpc, ADDR),              ldrex, t_ldrex),
8403  TUF(mcrr2,     c400000, fc400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
8404  TUF(mrrc2,     c500000, fc500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
8405  TCE(pkhbt,     6800010, eac00000, 4, (RRnpc, RRnpc, RRnpc, oSHll),   pkhbt, t_pkhbt),
8406  TCE(pkhtb,     6800050, eac00020, 4, (RRnpc, RRnpc, RRnpc, oSHar),   pkhtb, t_pkhtb),
8407  TCE(qadd16,    6200f10, fa90f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8408  TCE(qadd8,     6200f90, fa80f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8409  TCE(qaddsubx,  6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8410  TCE(qsub16,    6200f70, fad0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8411  TCE(qsub8,     6200ff0, fac0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8412  TCE(qsubaddx,  6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8413  TCE(sadd16,    6100f10, fa90f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8414  TCE(sadd8,     6100f90, fa80f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8415  TCE(saddsubx,  6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8416  TCE(shadd16,   6300f10, fa90f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8417  TCE(shadd8,    6300f90, fa80f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8418  TCE(shaddsubx, 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8419  TCE(shsub16,   6300f70, fad0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8420  TCE(shsub8,    6300ff0, fac0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8421  TCE(shsubaddx, 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8422  TCE(ssub16,    6100f70, fad0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8423  TCE(ssub8,     6100ff0, fac0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8424  TCE(ssubaddx,  6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8425  TCE(uadd16,    6500f10, fa90f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8426  TCE(uadd8,     6500f90, fa80f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8427  TCE(uaddsubx,  6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8428  TCE(uhadd16,   6700f10, fa90f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8429  TCE(uhadd8,    6700f90, fa80f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8430  TCE(uhaddsubx, 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8431  TCE(uhsub16,   6700f70, fad0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8432  TCE(uhsub8,    6700ff0, fac0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8433  TCE(uhsubaddx, 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8434  TCE(uqadd16,   6600f10, fa90f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8435  TCE(uqadd8,    6600f90, fa80f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8436  TCE(uqaddsubx, 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8437  TCE(uqsub16,   6600f70, fad0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8438  TCE(uqsub8,    6600ff0, fac0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8439  TCE(uqsubaddx, 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8440  TCE(usub16,    6500f70, fad0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8441  TCE(usub8,     6500ff0, fac0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8442  TCE(usubaddx,  6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8443  TUF(rfeia,     8900a00, e990c000, 1, (RRw),                       rfe, rfe),
8444   UF(rfeib,     9900a00,           1, (RRw),                       rfe),
8445   UF(rfeda,     8100a00,           1, (RRw),                       rfe),
8446  TUF(rfedb,     9100a00, e810c000, 1, (RRw),                       rfe, rfe),
8447  TUF(rfefd,     8900a00, e990c000, 1, (RRw),                       rfe, rfe),
8448   UF(rfefa,     9900a00,           1, (RRw),                       rfe),
8449   UF(rfeea,     8100a00,           1, (RRw),                       rfe),
8450  TUF(rfeed,     9100a00, e810c000, 1, (RRw),                       rfe, rfe),
8451  TCE(sxtah,     6b00070, fa00f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
8452  TCE(sxtab16,   6800070, fa20f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
8453  TCE(sxtab,     6a00070, fa40f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
8454  TCE(sxtb16,    68f0070, fa2ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
8455  TCE(uxtah,     6f00070, fa10f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
8456  TCE(uxtab16,   6c00070, fa30f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
8457  TCE(uxtab,     6e00070, fa50f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
8458  TCE(uxtb16,    6cf0070, fa3ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
8459  TCE(sel,       68000b0, faa0f080, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
8460  TCE(smlad,     7000010, fb200000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
8461  TCE(smladx,    7000030, fb200010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
8462  TCE(smlald,    7400010, fbc000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
8463  TCE(smlaldx,   7400030, fbc000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
8464  TCE(smlsd,     7000050, fb400000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
8465  TCE(smlsdx,    7000070, fb400010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
8466  TCE(smlsld,    7400050, fbd000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
8467  TCE(smlsldx,   7400070, fbd000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
8468  TCE(smmla,     7500010, fb500000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
8469  TCE(smmlar,    7500030, fb500010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
8470  TCE(smmls,     75000d0, fb600000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
8471  TCE(smmlsr,    75000f0, fb600010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
8472  TCE(smmul,     750f010, fb50f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
8473  TCE(smmulr,    750f030, fb50f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
8474  TCE(smuad,     700f010, fb20f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
8475  TCE(smuadx,    700f030, fb20f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
8476  TCE(smusd,     700f050, fb40f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
8477  TCE(smusdx,    700f070, fb40f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
8478  TUF(srsia,     8cd0500, e980c000, 1, (I31w),                      srs,  srs),
8479   UF(srsib,     9cd0500,           1, (I31w),                      srs),
8480   UF(srsda,     84d0500,           1, (I31w),                      srs),
8481  TUF(srsdb,     94d0500, e800c000, 1, (I31w),                      srs,  srs),
8482  TCE(ssat,      6a00010, f3000000, 4, (RRnpc, I32, RRnpc, oSHllar),ssat,   t_ssat),
8483  TCE(ssat16,    6a00f30, f3200000, 3, (RRnpc, I16, RRnpc),         ssat16, t_ssat16),
8484  TCE(strex,     1800f90, e8400000, 3, (RRnpc, RRnpc, ADDR),        strex,  t_strex),
8485  TCE(umaal,     0400090, fbe00060, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,  t_mlal),
8486  TCE(usad8,     780f010, fb70f000, 3, (RRnpc, RRnpc, RRnpc),       smul,   t_simd),
8487  TCE(usada8,    7800010, fb700000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla,   t_mla),
8488  TCE(usat,      6e00010, f3800000, 4, (RRnpc, I31, RRnpc, oSHllar),usat,   t_usat),
8489  TCE(usat16,    6e00f30, f3a00000, 3, (RRnpc, I15, RRnpc),         usat16, t_usat16),
8490
8491 #undef ARM_VARIANT
8492 #define ARM_VARIANT ARM_EXT_V6K
8493 #undef THUMB_VARIANT
8494 #define THUMB_VARIANT ARM_EXT_V6K
8495  tCE(yield,     320f001, yield,    0, (), noargs, t_hint),
8496  tCE(wfe,       320f002, wfe,      0, (), noargs, t_hint),
8497  tCE(wfi,       320f003, wfi,      0, (), noargs, t_hint),
8498  tCE(sev,       320f004, sev,      0, (), noargs, t_hint),
8499
8500 #undef THUMB_VARIANT
8501 #define THUMB_VARIANT ARM_EXT_V6T2
8502  TCE(ldrexb,    1d00f9f, e8d00f4f, 2, (RRnpc, RRnpcb),                rd_rn,  rd_rn),
8503  TCE(ldrexh,    1f00f9f, e8d00f5f, 2, (RRnpc, RRnpcb),                rd_rn,  rd_rn),
8504  TCE(ldrexd,    1b00f9f, e8d0007f, 3, (RRnpc, oRRnpc, RRnpcb),        ldrexd, t_ldrexd),
8505  TCE(strexb,    1c00f90, e8c00f40, 3, (RRnpc, RRnpc, ADDR),           strex,  rm_rd_rn),
8506  TCE(strexh,    1e00f90, e8c00f50, 3, (RRnpc, RRnpc, ADDR),           strex,  rm_rd_rn),
8507  TCE(strexd,    1a00f90, e8c00070, 4, (RRnpc, RRnpc, oRRnpc, RRnpcb), strexd, t_strexd),
8508  TUF(clrex,     57ff01f, f3bf8f2f, 0, (),                             noargs, noargs),
8509
8510 #undef ARM_VARIANT
8511 #define ARM_VARIANT ARM_EXT_V6Z
8512  TCE(smi,       1600070, f7f08000, 1, (EXPi), smi, t_smi),
8513
8514 #undef ARM_VARIANT
8515 #define ARM_VARIANT ARM_EXT_V6T2
8516  TCE(bfc,       7c0001f, f36f0000, 3, (RRnpc, I31, I32),           bfc, t_bfc),
8517  TCE(bfi,       7c00010, f3600000, 4, (RRnpc, RRnpc_I0, I31, I32), bfi, t_bfi),
8518  TCE(sbfx,      7a00050, f3400000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
8519  TCE(ubfx,      7e00050, f3c00000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
8520
8521  TCE(mls,       0600090, fb000010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
8522  TCE(movw,      3000000, f2400000, 2, (RRnpc, Iffff),               mov16, t_mov16),
8523  TCE(movt,      3400000, f2c00000, 2, (RRnpc, Iffff),               mov16, t_mov16),
8524  TCE(rbit,      3ff0f30, fa90f0a0, 2, (RR, RR),                     rd_rm, t_rbit),
8525
8526  TC3(ldrht,     03000b0, f8300e00, 2, (RR, ADDR), ldsttv4, t_ldstt),
8527  TC3(ldrsht,    03000f0, f9300e00, 2, (RR, ADDR), ldsttv4, t_ldstt),
8528  TC3(ldrsbt,    03000d0, f9100e00, 2, (RR, ADDR), ldsttv4, t_ldstt),
8529  TC3(strht,     02000b0, f8200e00, 2, (RR, ADDR), ldsttv4, t_ldstt),
8530
8531   UT(cbnz,      b900,    2, (RR, EXP), t_czb),
8532   UT(cbz,       b100,    2, (RR, EXP), t_czb),
8533  /* ARM does not really have an IT instruction.  */
8534  TUE(it,        0, bf08, 1, (COND),    it, t_it),
8535  TUE(itt,       0, bf0c, 1, (COND),    it, t_it),
8536  TUE(ite,       0, bf04, 1, (COND),    it, t_it),
8537  TUE(ittt,      0, bf0e, 1, (COND),    it, t_it),
8538  TUE(itet,      0, bf06, 1, (COND),    it, t_it),
8539  TUE(itte,      0, bf0a, 1, (COND),    it, t_it),
8540  TUE(itee,      0, bf02, 1, (COND),    it, t_it),
8541  TUE(itttt,     0, bf0f, 1, (COND),    it, t_it),
8542  TUE(itett,     0, bf07, 1, (COND),    it, t_it),
8543  TUE(ittet,     0, bf0b, 1, (COND),    it, t_it),
8544  TUE(iteet,     0, bf03, 1, (COND),    it, t_it),
8545  TUE(ittte,     0, bf0d, 1, (COND),    it, t_it),
8546  TUE(itete,     0, bf05, 1, (COND),    it, t_it),
8547  TUE(ittee,     0, bf09, 1, (COND),    it, t_it),
8548  TUE(iteee,     0, bf01, 1, (COND),    it, t_it),
8549
8550  /* Thumb2 only instructions.  */
8551 #undef ARM_VARIANT
8552 #define ARM_VARIANT 0
8553
8554  TCE(addw,      0, f2000000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
8555  TCE(subw,      0, f2a00000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
8556  TCE(tbb,       0, e8d0f000, 1, (TB), 0, t_tb),
8557  TCE(tbh,       0, e8d0f010, 1, (TB), 0, t_tb),
8558
8559 #undef ARM_VARIANT
8560 #define ARM_VARIANT FPU_FPA_EXT_V1  /* Core FPA instruction set (V1).  */
8561   CE(wfs,       e200110, 1, (RR),            rd),
8562   CE(rfs,       e300110, 1, (RR),            rd),
8563   CE(wfc,       e400110, 1, (RR),            rd),
8564   CE(rfc,       e500110, 1, (RR),            rd),
8565
8566   C3(ldfs,      c100100, 2, (RF, ADDR),      rd_cpaddr),
8567   C3(ldfd,      c108100, 2, (RF, ADDR),      rd_cpaddr),
8568   C3(ldfe,      c500100, 2, (RF, ADDR),      rd_cpaddr),
8569   C3(ldfp,      c508100, 2, (RF, ADDR),      rd_cpaddr),
8570
8571   C3(stfs,      c000100, 2, (RF, ADDR),      rd_cpaddr),
8572   C3(stfd,      c008100, 2, (RF, ADDR),      rd_cpaddr),
8573   C3(stfe,      c400100, 2, (RF, ADDR),      rd_cpaddr),
8574   C3(stfp,      c408100, 2, (RF, ADDR),      rd_cpaddr),
8575
8576   C3(mvfs,      e008100, 2, (RF, RF_IF),     rd_rm),
8577   C3(mvfsp,     e008120, 2, (RF, RF_IF),     rd_rm),
8578   C3(mvfsm,     e008140, 2, (RF, RF_IF),     rd_rm),
8579   C3(mvfsz,     e008160, 2, (RF, RF_IF),     rd_rm),
8580   C3(mvfd,      e008180, 2, (RF, RF_IF),     rd_rm),
8581   C3(mvfdp,     e0081a0, 2, (RF, RF_IF),     rd_rm),
8582   C3(mvfdm,     e0081c0, 2, (RF, RF_IF),     rd_rm),
8583   C3(mvfdz,     e0081e0, 2, (RF, RF_IF),     rd_rm),
8584   C3(mvfe,      e088100, 2, (RF, RF_IF),     rd_rm),
8585   C3(mvfep,     e088120, 2, (RF, RF_IF),     rd_rm),
8586   C3(mvfem,     e088140, 2, (RF, RF_IF),     rd_rm),
8587   C3(mvfez,     e088160, 2, (RF, RF_IF),     rd_rm),
8588
8589   C3(mnfs,      e108100, 2, (RF, RF_IF),     rd_rm),
8590   C3(mnfsp,     e108120, 2, (RF, RF_IF),     rd_rm),
8591   C3(mnfsm,     e108140, 2, (RF, RF_IF),     rd_rm),
8592   C3(mnfsz,     e108160, 2, (RF, RF_IF),     rd_rm),
8593   C3(mnfd,      e108180, 2, (RF, RF_IF),     rd_rm),
8594   C3(mnfdp,     e1081a0, 2, (RF, RF_IF),     rd_rm),
8595   C3(mnfdm,     e1081c0, 2, (RF, RF_IF),     rd_rm),
8596   C3(mnfdz,     e1081e0, 2, (RF, RF_IF),     rd_rm),
8597   C3(mnfe,      e188100, 2, (RF, RF_IF),     rd_rm),
8598   C3(mnfep,     e188120, 2, (RF, RF_IF),     rd_rm),
8599   C3(mnfem,     e188140, 2, (RF, RF_IF),     rd_rm),
8600   C3(mnfez,     e188160, 2, (RF, RF_IF),     rd_rm),
8601
8602   C3(abss,      e208100, 2, (RF, RF_IF),     rd_rm),
8603   C3(abssp,     e208120, 2, (RF, RF_IF),     rd_rm),
8604   C3(abssm,     e208140, 2, (RF, RF_IF),     rd_rm),
8605   C3(abssz,     e208160, 2, (RF, RF_IF),     rd_rm),
8606   C3(absd,      e208180, 2, (RF, RF_IF),     rd_rm),
8607   C3(absdp,     e2081a0, 2, (RF, RF_IF),     rd_rm),
8608   C3(absdm,     e2081c0, 2, (RF, RF_IF),     rd_rm),
8609   C3(absdz,     e2081e0, 2, (RF, RF_IF),     rd_rm),
8610   C3(abse,      e288100, 2, (RF, RF_IF),     rd_rm),
8611   C3(absep,     e288120, 2, (RF, RF_IF),     rd_rm),
8612   C3(absem,     e288140, 2, (RF, RF_IF),     rd_rm),
8613   C3(absez,     e288160, 2, (RF, RF_IF),     rd_rm),
8614
8615   C3(rnds,      e308100, 2, (RF, RF_IF),     rd_rm),
8616   C3(rndsp,     e308120, 2, (RF, RF_IF),     rd_rm),
8617   C3(rndsm,     e308140, 2, (RF, RF_IF),     rd_rm),
8618   C3(rndsz,     e308160, 2, (RF, RF_IF),     rd_rm),
8619   C3(rndd,      e308180, 2, (RF, RF_IF),     rd_rm),
8620   C3(rnddp,     e3081a0, 2, (RF, RF_IF),     rd_rm),
8621   C3(rnddm,     e3081c0, 2, (RF, RF_IF),     rd_rm),
8622   C3(rnddz,     e3081e0, 2, (RF, RF_IF),     rd_rm),
8623   C3(rnde,      e388100, 2, (RF, RF_IF),     rd_rm),
8624   C3(rndep,     e388120, 2, (RF, RF_IF),     rd_rm),
8625   C3(rndem,     e388140, 2, (RF, RF_IF),     rd_rm),
8626   C3(rndez,     e388160, 2, (RF, RF_IF),     rd_rm),
8627
8628   C3(sqts,      e408100, 2, (RF, RF_IF),     rd_rm),
8629   C3(sqtsp,     e408120, 2, (RF, RF_IF),     rd_rm),
8630   C3(sqtsm,     e408140, 2, (RF, RF_IF),     rd_rm),
8631   C3(sqtsz,     e408160, 2, (RF, RF_IF),     rd_rm),
8632   C3(sqtd,      e408180, 2, (RF, RF_IF),     rd_rm),
8633   C3(sqtdp,     e4081a0, 2, (RF, RF_IF),     rd_rm),
8634   C3(sqtdm,     e4081c0, 2, (RF, RF_IF),     rd_rm),
8635   C3(sqtdz,     e4081e0, 2, (RF, RF_IF),     rd_rm),
8636   C3(sqte,      e488100, 2, (RF, RF_IF),     rd_rm),
8637   C3(sqtep,     e488120, 2, (RF, RF_IF),     rd_rm),
8638   C3(sqtem,     e488140, 2, (RF, RF_IF),     rd_rm),
8639   C3(sqtez,     e488160, 2, (RF, RF_IF),     rd_rm),
8640
8641   C3(logs,      e508100, 2, (RF, RF_IF),     rd_rm),
8642   C3(logsp,     e508120, 2, (RF, RF_IF),     rd_rm),
8643   C3(logsm,     e508140, 2, (RF, RF_IF),     rd_rm),
8644   C3(logsz,     e508160, 2, (RF, RF_IF),     rd_rm),
8645   C3(logd,      e508180, 2, (RF, RF_IF),     rd_rm),
8646   C3(logdp,     e5081a0, 2, (RF, RF_IF),     rd_rm),
8647   C3(logdm,     e5081c0, 2, (RF, RF_IF),     rd_rm),
8648   C3(logdz,     e5081e0, 2, (RF, RF_IF),     rd_rm),
8649   C3(loge,      e588100, 2, (RF, RF_IF),     rd_rm),
8650   C3(logep,     e588120, 2, (RF, RF_IF),     rd_rm),
8651   C3(logem,     e588140, 2, (RF, RF_IF),     rd_rm),
8652   C3(logez,     e588160, 2, (RF, RF_IF),     rd_rm),
8653
8654   C3(lgns,      e608100, 2, (RF, RF_IF),     rd_rm),
8655   C3(lgnsp,     e608120, 2, (RF, RF_IF),     rd_rm),
8656   C3(lgnsm,     e608140, 2, (RF, RF_IF),     rd_rm),
8657   C3(lgnsz,     e608160, 2, (RF, RF_IF),     rd_rm),
8658   C3(lgnd,      e608180, 2, (RF, RF_IF),     rd_rm),
8659   C3(lgndp,     e6081a0, 2, (RF, RF_IF),     rd_rm),
8660   C3(lgndm,     e6081c0, 2, (RF, RF_IF),     rd_rm),
8661   C3(lgndz,     e6081e0, 2, (RF, RF_IF),     rd_rm),
8662   C3(lgne,      e688100, 2, (RF, RF_IF),     rd_rm),
8663   C3(lgnep,     e688120, 2, (RF, RF_IF),     rd_rm),
8664   C3(lgnem,     e688140, 2, (RF, RF_IF),     rd_rm),
8665   C3(lgnez,     e688160, 2, (RF, RF_IF),     rd_rm),
8666
8667   C3(exps,      e708100, 2, (RF, RF_IF),     rd_rm),
8668   C3(expsp,     e708120, 2, (RF, RF_IF),     rd_rm),
8669   C3(expsm,     e708140, 2, (RF, RF_IF),     rd_rm),
8670   C3(expsz,     e708160, 2, (RF, RF_IF),     rd_rm),
8671   C3(expd,      e708180, 2, (RF, RF_IF),     rd_rm),
8672   C3(expdp,     e7081a0, 2, (RF, RF_IF),     rd_rm),
8673   C3(expdm,     e7081c0, 2, (RF, RF_IF),     rd_rm),
8674   C3(expdz,     e7081e0, 2, (RF, RF_IF),     rd_rm),
8675   C3(expe,      e788100, 2, (RF, RF_IF),     rd_rm),
8676   C3(expep,     e788120, 2, (RF, RF_IF),     rd_rm),
8677   C3(expem,     e788140, 2, (RF, RF_IF),     rd_rm),
8678   C3(expdz,     e788160, 2, (RF, RF_IF),     rd_rm),
8679
8680   C3(sins,      e808100, 2, (RF, RF_IF),     rd_rm),
8681   C3(sinsp,     e808120, 2, (RF, RF_IF),     rd_rm),
8682   C3(sinsm,     e808140, 2, (RF, RF_IF),     rd_rm),
8683   C3(sinsz,     e808160, 2, (RF, RF_IF),     rd_rm),
8684   C3(sind,      e808180, 2, (RF, RF_IF),     rd_rm),
8685   C3(sindp,     e8081a0, 2, (RF, RF_IF),     rd_rm),
8686   C3(sindm,     e8081c0, 2, (RF, RF_IF),     rd_rm),
8687   C3(sindz,     e8081e0, 2, (RF, RF_IF),     rd_rm),
8688   C3(sine,      e888100, 2, (RF, RF_IF),     rd_rm),
8689   C3(sinep,     e888120, 2, (RF, RF_IF),     rd_rm),
8690   C3(sinem,     e888140, 2, (RF, RF_IF),     rd_rm),
8691   C3(sinez,     e888160, 2, (RF, RF_IF),     rd_rm),
8692
8693   C3(coss,      e908100, 2, (RF, RF_IF),     rd_rm),
8694   C3(cossp,     e908120, 2, (RF, RF_IF),     rd_rm),
8695   C3(cossm,     e908140, 2, (RF, RF_IF),     rd_rm),
8696   C3(cossz,     e908160, 2, (RF, RF_IF),     rd_rm),
8697   C3(cosd,      e908180, 2, (RF, RF_IF),     rd_rm),
8698   C3(cosdp,     e9081a0, 2, (RF, RF_IF),     rd_rm),
8699   C3(cosdm,     e9081c0, 2, (RF, RF_IF),     rd_rm),
8700   C3(cosdz,     e9081e0, 2, (RF, RF_IF),     rd_rm),
8701   C3(cose,      e988100, 2, (RF, RF_IF),     rd_rm),
8702   C3(cosep,     e988120, 2, (RF, RF_IF),     rd_rm),
8703   C3(cosem,     e988140, 2, (RF, RF_IF),     rd_rm),
8704   C3(cosez,     e988160, 2, (RF, RF_IF),     rd_rm),
8705
8706   C3(tans,      ea08100, 2, (RF, RF_IF),     rd_rm),
8707   C3(tansp,     ea08120, 2, (RF, RF_IF),     rd_rm),
8708   C3(tansm,     ea08140, 2, (RF, RF_IF),     rd_rm),
8709   C3(tansz,     ea08160, 2, (RF, RF_IF),     rd_rm),
8710   C3(tand,      ea08180, 2, (RF, RF_IF),     rd_rm),
8711   C3(tandp,     ea081a0, 2, (RF, RF_IF),     rd_rm),
8712   C3(tandm,     ea081c0, 2, (RF, RF_IF),     rd_rm),
8713   C3(tandz,     ea081e0, 2, (RF, RF_IF),     rd_rm),
8714   C3(tane,      ea88100, 2, (RF, RF_IF),     rd_rm),
8715   C3(tanep,     ea88120, 2, (RF, RF_IF),     rd_rm),
8716   C3(tanem,     ea88140, 2, (RF, RF_IF),     rd_rm),
8717   C3(tanez,     ea88160, 2, (RF, RF_IF),     rd_rm),
8718
8719   C3(asns,      eb08100, 2, (RF, RF_IF),     rd_rm),
8720   C3(asnsp,     eb08120, 2, (RF, RF_IF),     rd_rm),
8721   C3(asnsm,     eb08140, 2, (RF, RF_IF),     rd_rm),
8722   C3(asnsz,     eb08160, 2, (RF, RF_IF),     rd_rm),
8723   C3(asnd,      eb08180, 2, (RF, RF_IF),     rd_rm),
8724   C3(asndp,     eb081a0, 2, (RF, RF_IF),     rd_rm),
8725   C3(asndm,     eb081c0, 2, (RF, RF_IF),     rd_rm),
8726   C3(asndz,     eb081e0, 2, (RF, RF_IF),     rd_rm),
8727   C3(asne,      eb88100, 2, (RF, RF_IF),     rd_rm),
8728   C3(asnep,     eb88120, 2, (RF, RF_IF),     rd_rm),
8729   C3(asnem,     eb88140, 2, (RF, RF_IF),     rd_rm),
8730   C3(asnez,     eb88160, 2, (RF, RF_IF),     rd_rm),
8731
8732   C3(acss,      ec08100, 2, (RF, RF_IF),     rd_rm),
8733   C3(acssp,     ec08120, 2, (RF, RF_IF),     rd_rm),
8734   C3(acssm,     ec08140, 2, (RF, RF_IF),     rd_rm),
8735   C3(acssz,     ec08160, 2, (RF, RF_IF),     rd_rm),
8736   C3(acsd,      ec08180, 2, (RF, RF_IF),     rd_rm),
8737   C3(acsdp,     ec081a0, 2, (RF, RF_IF),     rd_rm),
8738   C3(acsdm,     ec081c0, 2, (RF, RF_IF),     rd_rm),
8739   C3(acsdz,     ec081e0, 2, (RF, RF_IF),     rd_rm),
8740   C3(acse,      ec88100, 2, (RF, RF_IF),     rd_rm),
8741   C3(acsep,     ec88120, 2, (RF, RF_IF),     rd_rm),
8742   C3(acsem,     ec88140, 2, (RF, RF_IF),     rd_rm),
8743   C3(acsez,     ec88160, 2, (RF, RF_IF),     rd_rm),
8744
8745   C3(atns,      ed08100, 2, (RF, RF_IF),     rd_rm),
8746   C3(atnsp,     ed08120, 2, (RF, RF_IF),     rd_rm),
8747   C3(atnsm,     ed08140, 2, (RF, RF_IF),     rd_rm),
8748   C3(atnsz,     ed08160, 2, (RF, RF_IF),     rd_rm),
8749   C3(atnd,      ed08180, 2, (RF, RF_IF),     rd_rm),
8750   C3(atndp,     ed081a0, 2, (RF, RF_IF),     rd_rm),
8751   C3(atndm,     ed081c0, 2, (RF, RF_IF),     rd_rm),
8752   C3(atndz,     ed081e0, 2, (RF, RF_IF),     rd_rm),
8753   C3(atne,      ed88100, 2, (RF, RF_IF),     rd_rm),
8754   C3(atnep,     ed88120, 2, (RF, RF_IF),     rd_rm),
8755   C3(atnem,     ed88140, 2, (RF, RF_IF),     rd_rm),
8756   C3(atnez,     ed88160, 2, (RF, RF_IF),     rd_rm),
8757
8758   C3(urds,      ee08100, 2, (RF, RF_IF),     rd_rm),
8759   C3(urdsp,     ee08120, 2, (RF, RF_IF),     rd_rm),
8760   C3(urdsm,     ee08140, 2, (RF, RF_IF),     rd_rm),
8761   C3(urdsz,     ee08160, 2, (RF, RF_IF),     rd_rm),
8762   C3(urdd,      ee08180, 2, (RF, RF_IF),     rd_rm),
8763   C3(urddp,     ee081a0, 2, (RF, RF_IF),     rd_rm),
8764   C3(urddm,     ee081c0, 2, (RF, RF_IF),     rd_rm),
8765   C3(urddz,     ee081e0, 2, (RF, RF_IF),     rd_rm),
8766   C3(urde,      ee88100, 2, (RF, RF_IF),     rd_rm),
8767   C3(urdep,     ee88120, 2, (RF, RF_IF),     rd_rm),
8768   C3(urdem,     ee88140, 2, (RF, RF_IF),     rd_rm),
8769   C3(urdez,     ee88160, 2, (RF, RF_IF),     rd_rm),
8770
8771   C3(nrms,      ef08100, 2, (RF, RF_IF),     rd_rm),
8772   C3(nrmsp,     ef08120, 2, (RF, RF_IF),     rd_rm),
8773   C3(nrmsm,     ef08140, 2, (RF, RF_IF),     rd_rm),
8774   C3(nrmsz,     ef08160, 2, (RF, RF_IF),     rd_rm),
8775   C3(nrmd,      ef08180, 2, (RF, RF_IF),     rd_rm),
8776   C3(nrmdp,     ef081a0, 2, (RF, RF_IF),     rd_rm),
8777   C3(nrmdm,     ef081c0, 2, (RF, RF_IF),     rd_rm),
8778   C3(nrmdz,     ef081e0, 2, (RF, RF_IF),     rd_rm),
8779   C3(nrme,      ef88100, 2, (RF, RF_IF),     rd_rm),
8780   C3(nrmep,     ef88120, 2, (RF, RF_IF),     rd_rm),
8781   C3(nrmem,     ef88140, 2, (RF, RF_IF),     rd_rm),
8782   C3(nrmez,     ef88160, 2, (RF, RF_IF),     rd_rm),
8783
8784   C3(adfs,      e000100, 3, (RF, RF, RF_IF), rd_rn_rm),
8785   C3(adfsp,     e000120, 3, (RF, RF, RF_IF), rd_rn_rm),
8786   C3(adfsm,     e000140, 3, (RF, RF, RF_IF), rd_rn_rm),
8787   C3(adfsz,     e000160, 3, (RF, RF, RF_IF), rd_rn_rm),
8788   C3(adfd,      e000180, 3, (RF, RF, RF_IF), rd_rn_rm),
8789   C3(adfdp,     e0001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8790   C3(adfdm,     e0001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8791   C3(adfdz,     e0001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8792   C3(adfe,      e080100, 3, (RF, RF, RF_IF), rd_rn_rm),
8793   C3(adfep,     e080120, 3, (RF, RF, RF_IF), rd_rn_rm),
8794   C3(adfem,     e080140, 3, (RF, RF, RF_IF), rd_rn_rm),
8795   C3(adfez,     e080160, 3, (RF, RF, RF_IF), rd_rn_rm),
8796
8797   C3(sufs,      e200100, 3, (RF, RF, RF_IF), rd_rn_rm),
8798   C3(sufsp,     e200120, 3, (RF, RF, RF_IF), rd_rn_rm),
8799   C3(sufsm,     e200140, 3, (RF, RF, RF_IF), rd_rn_rm),
8800   C3(sufsz,     e200160, 3, (RF, RF, RF_IF), rd_rn_rm),
8801   C3(sufd,      e200180, 3, (RF, RF, RF_IF), rd_rn_rm),
8802   C3(sufdp,     e2001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8803   C3(sufdm,     e2001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8804   C3(sufdz,     e2001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8805   C3(sufe,      e280100, 3, (RF, RF, RF_IF), rd_rn_rm),
8806   C3(sufep,     e280120, 3, (RF, RF, RF_IF), rd_rn_rm),
8807   C3(sufem,     e280140, 3, (RF, RF, RF_IF), rd_rn_rm),
8808   C3(sufez,     e280160, 3, (RF, RF, RF_IF), rd_rn_rm),
8809
8810   C3(rsfs,      e300100, 3, (RF, RF, RF_IF), rd_rn_rm),
8811   C3(rsfsp,     e300120, 3, (RF, RF, RF_IF), rd_rn_rm),
8812   C3(rsfsm,     e300140, 3, (RF, RF, RF_IF), rd_rn_rm),
8813   C3(rsfsz,     e300160, 3, (RF, RF, RF_IF), rd_rn_rm),
8814   C3(rsfd,      e300180, 3, (RF, RF, RF_IF), rd_rn_rm),
8815   C3(rsfdp,     e3001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8816   C3(rsfdm,     e3001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8817   C3(rsfdz,     e3001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8818   C3(rsfe,      e380100, 3, (RF, RF, RF_IF), rd_rn_rm),
8819   C3(rsfep,     e380120, 3, (RF, RF, RF_IF), rd_rn_rm),
8820   C3(rsfem,     e380140, 3, (RF, RF, RF_IF), rd_rn_rm),
8821   C3(rsfez,     e380160, 3, (RF, RF, RF_IF), rd_rn_rm),
8822
8823   C3(mufs,      e100100, 3, (RF, RF, RF_IF), rd_rn_rm),
8824   C3(mufsp,     e100120, 3, (RF, RF, RF_IF), rd_rn_rm),
8825   C3(mufsm,     e100140, 3, (RF, RF, RF_IF), rd_rn_rm),
8826   C3(mufsz,     e100160, 3, (RF, RF, RF_IF), rd_rn_rm),
8827   C3(mufd,      e100180, 3, (RF, RF, RF_IF), rd_rn_rm),
8828   C3(mufdp,     e1001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8829   C3(mufdm,     e1001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8830   C3(mufdz,     e1001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8831   C3(mufe,      e180100, 3, (RF, RF, RF_IF), rd_rn_rm),
8832   C3(mufep,     e180120, 3, (RF, RF, RF_IF), rd_rn_rm),
8833   C3(mufem,     e180140, 3, (RF, RF, RF_IF), rd_rn_rm),
8834   C3(mufez,     e180160, 3, (RF, RF, RF_IF), rd_rn_rm),
8835
8836   C3(dvfs,      e400100, 3, (RF, RF, RF_IF), rd_rn_rm),
8837   C3(dvfsp,     e400120, 3, (RF, RF, RF_IF), rd_rn_rm),
8838   C3(dvfsm,     e400140, 3, (RF, RF, RF_IF), rd_rn_rm),
8839   C3(dvfsz,     e400160, 3, (RF, RF, RF_IF), rd_rn_rm),
8840   C3(dvfd,      e400180, 3, (RF, RF, RF_IF), rd_rn_rm),
8841   C3(dvfdp,     e4001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8842   C3(dvfdm,     e4001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8843   C3(dvfdz,     e4001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8844   C3(dvfe,      e480100, 3, (RF, RF, RF_IF), rd_rn_rm),
8845   C3(dvfep,     e480120, 3, (RF, RF, RF_IF), rd_rn_rm),
8846   C3(dvfem,     e480140, 3, (RF, RF, RF_IF), rd_rn_rm),
8847   C3(dvfez,     e480160, 3, (RF, RF, RF_IF), rd_rn_rm),
8848
8849   C3(rdfs,      e500100, 3, (RF, RF, RF_IF), rd_rn_rm),
8850   C3(rdfsp,     e500120, 3, (RF, RF, RF_IF), rd_rn_rm),
8851   C3(rdfsm,     e500140, 3, (RF, RF, RF_IF), rd_rn_rm),
8852   C3(rdfsz,     e500160, 3, (RF, RF, RF_IF), rd_rn_rm),
8853   C3(rdfd,      e500180, 3, (RF, RF, RF_IF), rd_rn_rm),
8854   C3(rdfdp,     e5001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8855   C3(rdfdm,     e5001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8856   C3(rdfdz,     e5001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8857   C3(rdfe,      e580100, 3, (RF, RF, RF_IF), rd_rn_rm),
8858   C3(rdfep,     e580120, 3, (RF, RF, RF_IF), rd_rn_rm),
8859   C3(rdfem,     e580140, 3, (RF, RF, RF_IF), rd_rn_rm),
8860   C3(rdfez,     e580160, 3, (RF, RF, RF_IF), rd_rn_rm),
8861
8862   C3(pows,      e600100, 3, (RF, RF, RF_IF), rd_rn_rm),
8863   C3(powsp,     e600120, 3, (RF, RF, RF_IF), rd_rn_rm),
8864   C3(powsm,     e600140, 3, (RF, RF, RF_IF), rd_rn_rm),
8865   C3(powsz,     e600160, 3, (RF, RF, RF_IF), rd_rn_rm),
8866   C3(powd,      e600180, 3, (RF, RF, RF_IF), rd_rn_rm),
8867   C3(powdp,     e6001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8868   C3(powdm,     e6001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8869   C3(powdz,     e6001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8870   C3(powe,      e680100, 3, (RF, RF, RF_IF), rd_rn_rm),
8871   C3(powep,     e680120, 3, (RF, RF, RF_IF), rd_rn_rm),
8872   C3(powem,     e680140, 3, (RF, RF, RF_IF), rd_rn_rm),
8873   C3(powez,     e680160, 3, (RF, RF, RF_IF), rd_rn_rm),
8874
8875   C3(rpws,      e700100, 3, (RF, RF, RF_IF), rd_rn_rm),
8876   C3(rpwsp,     e700120, 3, (RF, RF, RF_IF), rd_rn_rm),
8877   C3(rpwsm,     e700140, 3, (RF, RF, RF_IF), rd_rn_rm),
8878   C3(rpwsz,     e700160, 3, (RF, RF, RF_IF), rd_rn_rm),
8879   C3(rpwd,      e700180, 3, (RF, RF, RF_IF), rd_rn_rm),
8880   C3(rpwdp,     e7001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8881   C3(rpwdm,     e7001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8882   C3(rpwdz,     e7001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8883   C3(rpwe,      e780100, 3, (RF, RF, RF_IF), rd_rn_rm),
8884   C3(rpwep,     e780120, 3, (RF, RF, RF_IF), rd_rn_rm),
8885   C3(rpwem,     e780140, 3, (RF, RF, RF_IF), rd_rn_rm),
8886   C3(rpwez,     e780160, 3, (RF, RF, RF_IF), rd_rn_rm),
8887
8888   C3(rmfs,      e800100, 3, (RF, RF, RF_IF), rd_rn_rm),
8889   C3(rmfsp,     e800120, 3, (RF, RF, RF_IF), rd_rn_rm),
8890   C3(rmfsm,     e800140, 3, (RF, RF, RF_IF), rd_rn_rm),
8891   C3(rmfsz,     e800160, 3, (RF, RF, RF_IF), rd_rn_rm),
8892   C3(rmfd,      e800180, 3, (RF, RF, RF_IF), rd_rn_rm),
8893   C3(rmfdp,     e8001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8894   C3(rmfdm,     e8001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8895   C3(rmfdz,     e8001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8896   C3(rmfe,      e880100, 3, (RF, RF, RF_IF), rd_rn_rm),
8897   C3(rmfep,     e880120, 3, (RF, RF, RF_IF), rd_rn_rm),
8898   C3(rmfem,     e880140, 3, (RF, RF, RF_IF), rd_rn_rm),
8899   C3(rmfez,     e880160, 3, (RF, RF, RF_IF), rd_rn_rm),
8900
8901   C3(fmls,      e900100, 3, (RF, RF, RF_IF), rd_rn_rm),
8902   C3(fmlsp,     e900120, 3, (RF, RF, RF_IF), rd_rn_rm),
8903   C3(fmlsm,     e900140, 3, (RF, RF, RF_IF), rd_rn_rm),
8904   C3(fmlsz,     e900160, 3, (RF, RF, RF_IF), rd_rn_rm),
8905   C3(fmld,      e900180, 3, (RF, RF, RF_IF), rd_rn_rm),
8906   C3(fmldp,     e9001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8907   C3(fmldm,     e9001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8908   C3(fmldz,     e9001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8909   C3(fmle,      e980100, 3, (RF, RF, RF_IF), rd_rn_rm),
8910   C3(fmlep,     e980120, 3, (RF, RF, RF_IF), rd_rn_rm),
8911   C3(fmlem,     e980140, 3, (RF, RF, RF_IF), rd_rn_rm),
8912   C3(fmlez,     e980160, 3, (RF, RF, RF_IF), rd_rn_rm),
8913
8914   C3(fdvs,      ea00100, 3, (RF, RF, RF_IF), rd_rn_rm),
8915   C3(fdvsp,     ea00120, 3, (RF, RF, RF_IF), rd_rn_rm),
8916   C3(fdvsm,     ea00140, 3, (RF, RF, RF_IF), rd_rn_rm),
8917   C3(fdvsz,     ea00160, 3, (RF, RF, RF_IF), rd_rn_rm),
8918   C3(fdvd,      ea00180, 3, (RF, RF, RF_IF), rd_rn_rm),
8919   C3(fdvdp,     ea001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8920   C3(fdvdm,     ea001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8921   C3(fdvdz,     ea001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8922   C3(fdve,      ea80100, 3, (RF, RF, RF_IF), rd_rn_rm),
8923   C3(fdvep,     ea80120, 3, (RF, RF, RF_IF), rd_rn_rm),
8924   C3(fdvem,     ea80140, 3, (RF, RF, RF_IF), rd_rn_rm),
8925   C3(fdvez,     ea80160, 3, (RF, RF, RF_IF), rd_rn_rm),
8926
8927   C3(frds,      eb00100, 3, (RF, RF, RF_IF), rd_rn_rm),
8928   C3(frdsp,     eb00120, 3, (RF, RF, RF_IF), rd_rn_rm),
8929   C3(frdsm,     eb00140, 3, (RF, RF, RF_IF), rd_rn_rm),
8930   C3(frdsz,     eb00160, 3, (RF, RF, RF_IF), rd_rn_rm),
8931   C3(frdd,      eb00180, 3, (RF, RF, RF_IF), rd_rn_rm),
8932   C3(frddp,     eb001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8933   C3(frddm,     eb001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8934   C3(frddz,     eb001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8935   C3(frde,      eb80100, 3, (RF, RF, RF_IF), rd_rn_rm),
8936   C3(frdep,     eb80120, 3, (RF, RF, RF_IF), rd_rn_rm),
8937   C3(frdem,     eb80140, 3, (RF, RF, RF_IF), rd_rn_rm),
8938   C3(frdez,     eb80160, 3, (RF, RF, RF_IF), rd_rn_rm),
8939
8940   C3(pols,      ec00100, 3, (RF, RF, RF_IF), rd_rn_rm),
8941   C3(polsp,     ec00120, 3, (RF, RF, RF_IF), rd_rn_rm),
8942   C3(polsm,     ec00140, 3, (RF, RF, RF_IF), rd_rn_rm),
8943   C3(polsz,     ec00160, 3, (RF, RF, RF_IF), rd_rn_rm),
8944   C3(pold,      ec00180, 3, (RF, RF, RF_IF), rd_rn_rm),
8945   C3(poldp,     ec001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8946   C3(poldm,     ec001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8947   C3(poldz,     ec001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8948   C3(pole,      ec80100, 3, (RF, RF, RF_IF), rd_rn_rm),
8949   C3(polep,     ec80120, 3, (RF, RF, RF_IF), rd_rn_rm),
8950   C3(polem,     ec80140, 3, (RF, RF, RF_IF), rd_rn_rm),
8951   C3(polez,     ec80160, 3, (RF, RF, RF_IF), rd_rn_rm),
8952
8953   CE(cmf,       e90f110, 2, (RF, RF_IF),     fpa_cmp),
8954  C3E(cmfe,      ed0f110, 2, (RF, RF_IF),     fpa_cmp),
8955   CE(cnf,       eb0f110, 2, (RF, RF_IF),     fpa_cmp),
8956  C3E(cnfe,      ef0f110, 2, (RF, RF_IF),     fpa_cmp),
8957
8958   C3(flts,      e000110, 2, (RF, RR),        rn_rd),
8959   C3(fltsp,     e000130, 2, (RF, RR),        rn_rd),
8960   C3(fltsm,     e000150, 2, (RF, RR),        rn_rd),
8961   C3(fltsz,     e000170, 2, (RF, RR),        rn_rd),
8962   C3(fltd,      e000190, 2, (RF, RR),        rn_rd),
8963   C3(fltdp,     e0001b0, 2, (RF, RR),        rn_rd),
8964   C3(fltdm,     e0001d0, 2, (RF, RR),        rn_rd),
8965   C3(fltdz,     e0001f0, 2, (RF, RR),        rn_rd),
8966   C3(flte,      e080110, 2, (RF, RR),        rn_rd),
8967   C3(fltep,     e080130, 2, (RF, RR),        rn_rd),
8968   C3(fltem,     e080150, 2, (RF, RR),        rn_rd),
8969   C3(fltez,     e080170, 2, (RF, RR),        rn_rd),
8970
8971   /* The implementation of the FIX instruction is broken on some
8972      assemblers, in that it accepts a precision specifier as well as a
8973      rounding specifier, despite the fact that this is meaningless.
8974      To be more compatible, we accept it as well, though of course it
8975      does not set any bits.  */
8976   CE(fix,       e100110, 2, (RR, RF),        rd_rm),
8977   C3(fixp,      e100130, 2, (RR, RF),        rd_rm),
8978   C3(fixm,      e100150, 2, (RR, RF),        rd_rm),
8979   C3(fixz,      e100170, 2, (RR, RF),        rd_rm),
8980   C3(fixsp,     e100130, 2, (RR, RF),        rd_rm),
8981   C3(fixsm,     e100150, 2, (RR, RF),        rd_rm),
8982   C3(fixsz,     e100170, 2, (RR, RF),        rd_rm),
8983   C3(fixdp,     e100130, 2, (RR, RF),        rd_rm),
8984   C3(fixdm,     e100150, 2, (RR, RF),        rd_rm),
8985   C3(fixdz,     e100170, 2, (RR, RF),        rd_rm),
8986   C3(fixep,     e100130, 2, (RR, RF),        rd_rm),
8987   C3(fixem,     e100150, 2, (RR, RF),        rd_rm),
8988   C3(fixez,     e100170, 2, (RR, RF),        rd_rm),
8989
8990   /* Instructions that were new with the real FPA, call them V2.  */
8991 #undef ARM_VARIANT
8992 #define ARM_VARIANT FPU_FPA_EXT_V2
8993   CE(lfm,       c100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
8994   C3(lfmfd,     c900200, 3, (RF, I4b, ADDR), fpa_ldmstm),
8995   C3(lfmea,     d100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
8996   CE(sfm,       c000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
8997   C3(sfmfd,     d000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
8998   C3(sfmea,     c800200, 3, (RF, I4b, ADDR), fpa_ldmstm),
8999
9000 #undef ARM_VARIANT
9001 #define ARM_VARIANT FPU_VFP_EXT_V1xD  /* VFP V1xD (single precision).  */
9002   /* Moves and type conversions.  */
9003   CE(fcpys,     eb00a40, 2, (RVS, RVS),       vfp_sp_monadic),
9004   CE(fmrs,      e100a10, 2, (RR, RVS),        vfp_reg_from_sp),
9005   CE(fmsr,      e000a10, 2, (RVS, RR),        vfp_sp_from_reg),
9006   CE(fmstat,    ef1fa10, 0, (),               noargs),
9007   CE(fsitos,    eb80ac0, 2, (RVS, RVS),       vfp_sp_monadic),
9008   CE(fuitos,    eb80a40, 2, (RVS, RVS),       vfp_sp_monadic),
9009   CE(ftosis,    ebd0a40, 2, (RVS, RVS),       vfp_sp_monadic),
9010   CE(ftosizs,   ebd0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
9011   CE(ftouis,    ebc0a40, 2, (RVS, RVS),       vfp_sp_monadic),
9012   CE(ftouizs,   ebc0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
9013   CE(fmrx,      ef00a10, 2, (RR, RVC),        rd_rn),
9014   CE(fmxr,      ee00a10, 2, (RVC, RR),        rn_rd),
9015
9016   /* Memory operations.  */
9017   CE(flds,      d100a00, 2, (RVS, ADDR),      vfp_sp_ldst),
9018   CE(fsts,      d000a00, 2, (RVS, ADDR),      vfp_sp_ldst),
9019   CE(fldmias,   c900a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
9020   CE(fldmfds,   c900a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
9021   CE(fldmdbs,   d300a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
9022   CE(fldmeas,   d300a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
9023   CE(fldmiax,   c900b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
9024   CE(fldmfdx,   c900b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
9025   CE(fldmdbx,   d300b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
9026   CE(fldmeax,   d300b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
9027   CE(fstmias,   c800a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
9028   CE(fstmeas,   c800a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
9029   CE(fstmdbs,   d200a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
9030   CE(fstmfds,   d200a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
9031   CE(fstmiax,   c800b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
9032   CE(fstmeax,   c800b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
9033   CE(fstmdbx,   d200b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
9034   CE(fstmfdx,   d200b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
9035
9036   /* Monadic operations.  */
9037   CE(fabss,     eb00ac0, 2, (RVS, RVS),       vfp_sp_monadic),
9038   CE(fnegs,     eb10a40, 2, (RVS, RVS),       vfp_sp_monadic),
9039   CE(fsqrts,    eb10ac0, 2, (RVS, RVS),       vfp_sp_monadic),
9040
9041   /* Dyadic operations.  */
9042   CE(fadds,     e300a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
9043   CE(fsubs,     e300a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
9044   CE(fmuls,     e200a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
9045   CE(fdivs,     e800a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
9046   CE(fmacs,     e000a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
9047   CE(fmscs,     e100a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
9048   CE(fnmuls,    e200a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
9049   CE(fnmacs,    e000a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
9050   CE(fnmscs,    e100a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
9051
9052   /* Comparisons.  */
9053   CE(fcmps,     eb40a40, 2, (RVS, RVS),       vfp_sp_monadic),
9054   CE(fcmpzs,    eb50a40, 1, (RVS),            vfp_sp_compare_z),
9055   CE(fcmpes,    eb40ac0, 2, (RVS, RVS),       vfp_sp_monadic),
9056   CE(fcmpezs,   eb50ac0, 1, (RVS),            vfp_sp_compare_z),
9057
9058 #undef ARM_VARIANT
9059 #define ARM_VARIANT FPU_VFP_EXT_V1 /* VFP V1 (Double precision).  */
9060   /* Moves and type conversions.  */
9061   CE(fcpyd,     eb00b40, 2, (RVD, RVD),       rd_rm),
9062   CE(fcvtds,    eb70ac0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
9063   CE(fcvtsd,    eb70bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
9064   CE(fmdhr,     e200b10, 2, (RVD, RR),        rn_rd),
9065   CE(fmdlr,     e000b10, 2, (RVD, RR),        rn_rd),
9066   CE(fmrdh,     e300b10, 2, (RR, RVD),        rd_rn),
9067   CE(fmrdl,     e100b10, 2, (RR, RVD),        rd_rn),
9068   CE(fsitod,    eb80bc0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
9069   CE(fuitod,    eb80b40, 2, (RVD, RVS),       vfp_dp_sp_cvt),
9070   CE(ftosid,    ebd0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
9071   CE(ftosizd,   ebd0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
9072   CE(ftouid,    ebc0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
9073   CE(ftouizd,   ebc0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
9074
9075   /* Memory operations.  */
9076   CE(fldd,      d100b00, 2, (RVD, ADDR),      vfp_dp_ldst),
9077   CE(fstd,      d000b00, 2, (RVD, ADDR),      vfp_dp_ldst),
9078   CE(fldmiad,   c900b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
9079   CE(fldmfdd,   c900b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
9080   CE(fldmdbd,   d300b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
9081   CE(fldmead,   d300b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
9082   CE(fstmiad,   c800b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
9083   CE(fstmead,   c800b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
9084   CE(fstmdbd,   d200b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
9085   CE(fstmfdd,   d200b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
9086
9087   /* Monadic operations.  */
9088   CE(fabsd,     eb00bc0, 2, (RVD, RVD),       rd_rm),
9089   CE(fnegd,     eb10b40, 2, (RVD, RVD),       rd_rm),
9090   CE(fsqrtd,    eb10bc0, 2, (RVD, RVD),       rd_rm),
9091
9092   /* Dyadic operations.  */
9093   CE(faddd,     e300b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
9094   CE(fsubd,     e300b40, 3, (RVD, RVD, RVD),  rd_rn_rm),
9095   CE(fmuld,     e200b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
9096   CE(fdivd,     e800b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
9097   CE(fmacd,     e000b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
9098   CE(fmscd,     e100b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
9099   CE(fnmuld,    e200b40, 3, (RVD, RVD, RVD),  rd_rn_rm),
9100   CE(fnmacd,    e000b40, 3, (RVD, RVD, RVD),  rd_rn_rm),
9101   CE(fnmscd,    e100b40, 3, (RVD, RVD, RVD),  rd_rn_rm),
9102
9103   /* Comparisons.  */
9104   CE(fcmpd,     eb40b40, 2, (RVD, RVD),       rd_rm),
9105   CE(fcmpzd,    eb50b40, 1, (RVD),            rd),
9106   CE(fcmped,    eb40bc0, 2, (RVD, RVD),       rd_rm),
9107   CE(fcmpezd,   eb50bc0, 1, (RVD),            rd),
9108
9109 #undef ARM_VARIANT
9110 #define ARM_VARIANT FPU_VFP_EXT_V2
9111   CE(fmsrr,     c400a10, 3, (VRSLST, RR, RR), vfp_sp2_from_reg2),
9112   CE(fmrrs,     c500a10, 3, (RR, RR, VRSLST), vfp_reg2_from_sp2),
9113   CE(fmdrr,     c400b10, 3, (RVD, RR, RR),    rm_rd_rn),
9114   CE(fmrrd,     c500b10, 3, (RR, RR, RVD),    rd_rn_rm),
9115
9116 #undef ARM_VARIANT
9117 #define ARM_VARIANT ARM_CEXT_XSCALE /* Intel XScale extensions.  */
9118   CE(mia,       e200010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
9119   CE(miaph,     e280010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
9120   CE(miabb,     e2c0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
9121   CE(miabt,     e2d0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
9122   CE(miatb,     e2e0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
9123   CE(miatt,     e2f0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
9124   CE(mar,       c400000, 3, (RXA, RRnpc, RRnpc), xsc_mar),
9125   CE(mra,       c500000, 3, (RRnpc, RRnpc, RXA), xsc_mra),
9126
9127 #undef ARM_VARIANT
9128 #define ARM_VARIANT ARM_CEXT_IWMMXT /* Intel Wireless MMX technology.  */
9129   CE(tandcb,    e13f130, 1, (RR),                   iwmmxt_tandorc),
9130   CE(tandch,    e53f130, 1, (RR),                   iwmmxt_tandorc),
9131   CE(tandcw,    e93f130, 1, (RR),                   iwmmxt_tandorc),
9132   CE(tbcstb,    e400010, 2, (RIWR, RR),             rn_rd),
9133   CE(tbcsth,    e400050, 2, (RIWR, RR),             rn_rd),
9134   CE(tbcstw,    e400090, 2, (RIWR, RR),             rn_rd),
9135   CE(textrcb,   e130170, 2, (RR, I7),               iwmmxt_textrc),
9136   CE(textrch,   e530170, 2, (RR, I7),               iwmmxt_textrc),
9137   CE(textrcw,   e930170, 2, (RR, I7),               iwmmxt_textrc),
9138   CE(textrmub,  e100070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
9139   CE(textrmuh,  e500070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
9140   CE(textrmuw,  e900070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
9141   CE(textrmsb,  e100078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
9142   CE(textrmsh,  e500078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
9143   CE(textrmsw,  e900078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
9144   CE(tinsrb,    e600010, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
9145   CE(tinsrh,    e600050, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
9146   CE(tinsrw,    e600090, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
9147   CE(tmcr,      e000110, 2, (RIWC, RR),             rn_rd),
9148   CE(tmcrr,     c400000, 3, (RIWR, RR, RR),         rm_rd_rn),
9149   CE(tmia,      e200010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
9150   CE(tmiaph,    e280010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
9151   CE(tmiabb,    e2c0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
9152   CE(tmiabt,    e2d0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
9153   CE(tmiatb,    e2e0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
9154   CE(tmiatt,    e2f0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
9155   CE(tmovmskb,  e100030, 2, (RR, RIWR),             rd_rn),
9156   CE(tmovmskh,  e500030, 2, (RR, RIWR),             rd_rn),
9157   CE(tmovmskw,  e900030, 2, (RR, RIWR),             rd_rn),
9158   CE(tmrc,      e100110, 2, (RR, RIWC),             rd_rn),
9159   CE(tmrrc,     c500000, 3, (RR, RR, RIWR),         rd_rn_rm),
9160   CE(torcb,     e13f150, 1, (RR),                   iwmmxt_tandorc),
9161   CE(torch,     e53f150, 1, (RR),                   iwmmxt_tandorc),
9162   CE(torcw,     e93f150, 1, (RR),                   iwmmxt_tandorc),
9163   CE(waccb,     e0001c0, 2, (RIWR, RIWR),           rd_rn),
9164   CE(wacch,     e4001c0, 2, (RIWR, RIWR),           rd_rn),
9165   CE(waccw,     e8001c0, 2, (RIWR, RIWR),           rd_rn),
9166   CE(waddbss,   e300180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9167   CE(waddb,     e000180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9168   CE(waddbus,   e100180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9169   CE(waddhss,   e700180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9170   CE(waddh,     e400180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9171   CE(waddhus,   e500180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9172   CE(waddwss,   eb00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9173   CE(waddw,     e800180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9174   CE(waddwus,   e900180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9175   CE(waligni,   e000020, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_waligni),
9176   CE(walignr0,  e800020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9177   CE(walignr1,  e900020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9178   CE(walignr2,  ea00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9179   CE(walignr3,  eb00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9180   CE(wand,      e200000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9181   CE(wandn,     e300000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9182   CE(wavg2b,    e800000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9183   CE(wavg2br,   e900000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9184   CE(wavg2h,    ec00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9185   CE(wavg2hr,   ed00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9186   CE(wcmpeqb,   e000060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9187   CE(wcmpeqh,   e400060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9188   CE(wcmpeqw,   e800060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9189   CE(wcmpgtub,  e100060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9190   CE(wcmpgtuh,  e500060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9191   CE(wcmpgtuw,  e900060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9192   CE(wcmpgtsb,  e300060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9193   CE(wcmpgtsh,  e700060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9194   CE(wcmpgtsw,  eb00060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9195   CE(wldrb,     c100000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
9196   CE(wldrh,     c500000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
9197   CE(wldrw,     c100100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
9198   CE(wldrd,     c500100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
9199   CE(wmacs,     e600100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9200   CE(wmacsz,    e700100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9201   CE(wmacu,     e400100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9202   CE(wmacuz,    e500100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9203   CE(wmadds,    ea00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9204   CE(wmaddu,    e800100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9205   CE(wmaxsb,    e200160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9206   CE(wmaxsh,    e600160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9207   CE(wmaxsw,    ea00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9208   CE(wmaxub,    e000160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9209   CE(wmaxuh,    e400160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9210   CE(wmaxuw,    e800160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9211   CE(wminsb,    e300160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9212   CE(wminsh,    e700160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9213   CE(wminsw,    eb00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9214   CE(wminub,    e100160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9215   CE(wminuh,    e500160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9216   CE(wminuw,    e900160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9217   CE(wmov,      e000000, 2, (RIWR, RIWR),           iwmmxt_wmov),
9218   CE(wmulsm,    e300100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9219   CE(wmulsl,    e200100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9220   CE(wmulum,    e100100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9221   CE(wmulul,    e000100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9222   CE(wor,       e000000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9223   CE(wpackhss,  e700080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9224   CE(wpackhus,  e500080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9225   CE(wpackwss,  eb00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9226   CE(wpackwus,  e900080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9227   CE(wpackdss,  ef00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9228   CE(wpackdus,  ed00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9229   CE(wrorh,     e700040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9230   CE(wrorhg,    e700148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
9231   CE(wrorw,     eb00040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9232   CE(wrorwg,    eb00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
9233   CE(wrord,     ef00040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9234   CE(wrordg,    ef00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
9235   CE(wsadb,     e000120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9236   CE(wsadbz,    e100120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9237   CE(wsadh,     e400120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9238   CE(wsadhz,    e500120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9239   CE(wshufh,    e0001e0, 3, (RIWR, RIWR, I255),     iwmmxt_wshufh),
9240   CE(wsllh,     e500040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9241   CE(wsllhg,    e500148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
9242   CE(wsllw,     e900040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9243   CE(wsllwg,    e900148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
9244   CE(wslld,     ed00040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9245   CE(wslldg,    ed00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
9246   CE(wsrah,     e400040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9247   CE(wsrahg,    e400148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
9248   CE(wsraw,     e800040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9249   CE(wsrawg,    e800148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
9250   CE(wsrad,     ec00040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9251   CE(wsradg,    ec00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
9252   CE(wsrlh,     e600040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9253   CE(wsrlhg,    e600148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
9254   CE(wsrlw,     ea00040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9255   CE(wsrlwg,    ea00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
9256   CE(wsrld,     ee00040, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9257   CE(wsrldg,    ee00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
9258   CE(wstrb,     c000000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
9259   CE(wstrh,     c400000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
9260   CE(wstrw,     c000100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
9261   CE(wstrd,     c400100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
9262   CE(wsubbss,   e3001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9263   CE(wsubb,     e0001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9264   CE(wsubbus,   e1001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9265   CE(wsubhss,   e7001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9266   CE(wsubh,     e4001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9267   CE(wsubhus,   e5001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9268   CE(wsubwss,   eb001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9269   CE(wsubw,     e8001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9270   CE(wsubwus,   e9001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9271   CE(wunpckehub,e0000c0, 2, (RIWR, RIWR),           rd_rn),
9272   CE(wunpckehuh,e4000c0, 2, (RIWR, RIWR),           rd_rn),
9273   CE(wunpckehuw,e8000c0, 2, (RIWR, RIWR),           rd_rn),
9274   CE(wunpckehsb,e2000c0, 2, (RIWR, RIWR),           rd_rn),
9275   CE(wunpckehsh,e6000c0, 2, (RIWR, RIWR),           rd_rn),
9276   CE(wunpckehsw,ea000c0, 2, (RIWR, RIWR),           rd_rn),
9277   CE(wunpckihb, e1000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9278   CE(wunpckihh, e5000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9279   CE(wunpckihw, e9000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9280   CE(wunpckelub,e0000e0, 2, (RIWR, RIWR),           rd_rn),
9281   CE(wunpckeluh,e4000e0, 2, (RIWR, RIWR),           rd_rn),
9282   CE(wunpckeluw,e8000e0, 2, (RIWR, RIWR),           rd_rn),
9283   CE(wunpckelsb,e2000e0, 2, (RIWR, RIWR),           rd_rn),
9284   CE(wunpckelsh,e6000e0, 2, (RIWR, RIWR),           rd_rn),
9285   CE(wunpckelsw,ea000e0, 2, (RIWR, RIWR),           rd_rn),
9286   CE(wunpckilb, e1000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9287   CE(wunpckilh, e5000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9288   CE(wunpckilw, e9000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9289   CE(wxor,      e100000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
9290   CE(wzero,     e300000, 1, (RIWR),                 iwmmxt_wzero),
9291
9292 #undef ARM_VARIANT
9293 #define ARM_VARIANT ARM_CEXT_MAVERICK /* Cirrus Maverick instructions.  */
9294   CE(cfldrs,    c100400, 2, (RMF, ADDR),              rd_cpaddr),
9295   CE(cfldrd,    c500400, 2, (RMD, ADDR),              rd_cpaddr),
9296   CE(cfldr32,   c100500, 2, (RMFX, ADDR),             rd_cpaddr),
9297   CE(cfldr64,   c500500, 2, (RMDX, ADDR),             rd_cpaddr),
9298   CE(cfstrs,    c000400, 2, (RMF, ADDR),              rd_cpaddr),
9299   CE(cfstrd,    c400400, 2, (RMD, ADDR),              rd_cpaddr),
9300   CE(cfstr32,   c000500, 2, (RMFX, ADDR),             rd_cpaddr),
9301   CE(cfstr64,   c400500, 2, (RMDX, ADDR),             rd_cpaddr),
9302   CE(cfmvsr,    e000450, 2, (RMF, RR),                rn_rd),
9303   CE(cfmvrs,    e100450, 2, (RR, RMF),                rd_rn),
9304   CE(cfmvdlr,   e000410, 2, (RMD, RR),                rn_rd),
9305   CE(cfmvrdl,   e100410, 2, (RR, RMD),                rd_rn),
9306   CE(cfmvdhr,   e000430, 2, (RMD, RR),                rn_rd),
9307   CE(cfmvrdh,   e100430, 2, (RR, RMD),                rd_rn),
9308   CE(cfmv64lr,  e000510, 2, (RMDX, RR),               rn_rd),
9309   CE(cfmvr64l,  e100510, 2, (RR, RMDX),               rd_rn),
9310   CE(cfmv64hr,  e000530, 2, (RMDX, RR),               rn_rd),
9311   CE(cfmvr64h,  e100530, 2, (RR, RMDX),               rd_rn),
9312   CE(cfmval32,  e200440, 2, (RMAX, RMFX),             rd_rn),
9313   CE(cfmv32al,  e100440, 2, (RMFX, RMAX),             rd_rn),
9314   CE(cfmvam32,  e200460, 2, (RMAX, RMFX),             rd_rn),
9315   CE(cfmv32am,  e100460, 2, (RMFX, RMAX),             rd_rn),
9316   CE(cfmvah32,  e200480, 2, (RMAX, RMFX),             rd_rn),
9317   CE(cfmv32ah,  e100480, 2, (RMFX, RMAX),             rd_rn),
9318   CE(cfmva32,   e2004a0, 2, (RMAX, RMFX),             rd_rn),
9319   CE(cfmv32a,   e1004a0, 2, (RMFX, RMAX),             rd_rn),
9320   CE(cfmva64,   e2004c0, 2, (RMAX, RMDX),             rd_rn),
9321   CE(cfmv64a,   e1004c0, 2, (RMDX, RMAX),             rd_rn),
9322   CE(cfmvsc32,  e2004e0, 2, (RMDS, RMDX),             mav_dspsc),
9323   CE(cfmv32sc,  e1004e0, 2, (RMDX, RMDS),             rd),
9324   CE(cfcpys,    e000400, 2, (RMF, RMF),               rd_rn),
9325   CE(cfcpyd,    e000420, 2, (RMD, RMD),               rd_rn),
9326   CE(cfcvtsd,   e000460, 2, (RMD, RMF),               rd_rn),
9327   CE(cfcvtds,   e000440, 2, (RMF, RMD),               rd_rn),
9328   CE(cfcvt32s,  e000480, 2, (RMF, RMFX),              rd_rn),
9329   CE(cfcvt32d,  e0004a0, 2, (RMD, RMFX),              rd_rn),
9330   CE(cfcvt64s,  e0004c0, 2, (RMF, RMDX),              rd_rn),
9331   CE(cfcvt64d,  e0004e0, 2, (RMD, RMDX),              rd_rn),
9332   CE(cfcvts32,  e100580, 2, (RMFX, RMF),              rd_rn),
9333   CE(cfcvtd32,  e1005a0, 2, (RMFX, RMD),              rd_rn),
9334   CE(cftruncs32,e1005c0, 2, (RMFX, RMF),              rd_rn),
9335   CE(cftruncd32,e1005e0, 2, (RMFX, RMD),              rd_rn),
9336   CE(cfrshl32,  e000550, 3, (RMFX, RMFX, RR),         mav_triple),
9337   CE(cfrshl64,  e000570, 3, (RMDX, RMDX, RR),         mav_triple),
9338   CE(cfsh32,    e000500, 3, (RMFX, RMFX, I63s),       mav_shift),
9339   CE(cfsh64,    e200500, 3, (RMDX, RMDX, I63s),       mav_shift),
9340   CE(cfcmps,    e100490, 3, (RR, RMF, RMF),           rd_rn_rm),
9341   CE(cfcmpd,    e1004b0, 3, (RR, RMD, RMD),           rd_rn_rm),
9342   CE(cfcmp32,   e100590, 3, (RR, RMFX, RMFX),         rd_rn_rm),
9343   CE(cfcmp64,   e1005b0, 3, (RR, RMDX, RMDX),         rd_rn_rm),
9344   CE(cfabss,    e300400, 2, (RMF, RMF),               rd_rn),
9345   CE(cfabsd,    e300420, 2, (RMD, RMD),               rd_rn),
9346   CE(cfnegs,    e300440, 2, (RMF, RMF),               rd_rn),
9347   CE(cfnegd,    e300460, 2, (RMD, RMD),               rd_rn),
9348   CE(cfadds,    e300480, 3, (RMF, RMF, RMF),          rd_rn_rm),
9349   CE(cfaddd,    e3004a0, 3, (RMD, RMD, RMD),          rd_rn_rm),
9350   CE(cfsubs,    e3004c0, 3, (RMF, RMF, RMF),          rd_rn_rm),
9351   CE(cfsubd,    e3004e0, 3, (RMD, RMD, RMD),          rd_rn_rm),
9352   CE(cfmuls,    e100400, 3, (RMF, RMF, RMF),          rd_rn_rm),
9353   CE(cfmuld,    e100420, 3, (RMD, RMD, RMD),          rd_rn_rm),
9354   CE(cfabs32,   e300500, 2, (RMFX, RMFX),             rd_rn),
9355   CE(cfabs64,   e300520, 2, (RMDX, RMDX),             rd_rn),
9356   CE(cfneg32,   e300540, 2, (RMFX, RMFX),             rd_rn),
9357   CE(cfneg64,   e300560, 2, (RMDX, RMDX),             rd_rn),
9358   CE(cfadd32,   e300580, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
9359   CE(cfadd64,   e3005a0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
9360   CE(cfsub32,   e3005c0, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
9361   CE(cfsub64,   e3005e0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
9362   CE(cfmul32,   e100500, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
9363   CE(cfmul64,   e100520, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
9364   CE(cfmac32,   e100540, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
9365   CE(cfmsc32,   e100560, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
9366   CE(cfmadd32,  e000600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
9367   CE(cfmsub32,  e100600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
9368   CE(cfmadda32, e200600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
9369   CE(cfmsuba32, e300600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
9370 };
9371 #undef ARM_VARIANT
9372 #undef THUMB_VARIANT
9373 #undef TCE
9374 #undef TCM
9375 #undef TUE
9376 #undef TUF
9377 #undef TCC
9378 #undef CE
9379 #undef CM
9380 #undef UE
9381 #undef UF
9382 #undef UT
9383 #undef OPS0
9384 #undef OPS1
9385 #undef OPS2
9386 #undef OPS3
9387 #undef OPS4
9388 #undef OPS5
9389 #undef OPS6
9390 #undef do_0
9391 \f
9392 /* MD interface: bits in the object file.  */
9393
9394 /* Turn an integer of n bytes (in val) into a stream of bytes appropriate
9395    for use in the a.out file, and stores them in the array pointed to by buf.
9396    This knows about the endian-ness of the target machine and does
9397    THE RIGHT THING, whatever it is.  Possible values for n are 1 (byte)
9398    2 (short) and 4 (long)  Floating numbers are put out as a series of
9399    LITTLENUMS (shorts, here at least).  */
9400
9401 void
9402 md_number_to_chars (char * buf, valueT val, int n)
9403 {
9404   if (target_big_endian)
9405     number_to_chars_bigendian (buf, val, n);
9406   else
9407     number_to_chars_littleendian (buf, val, n);
9408 }
9409
9410 static valueT
9411 md_chars_to_number (char * buf, int n)
9412 {
9413   valueT result = 0;
9414   unsigned char * where = (unsigned char *) buf;
9415
9416   if (target_big_endian)
9417     {
9418       while (n--)
9419         {
9420           result <<= 8;
9421           result |= (*where++ & 255);
9422         }
9423     }
9424   else
9425     {
9426       while (n--)
9427         {
9428           result <<= 8;
9429           result |= (where[n] & 255);
9430         }
9431     }
9432
9433   return result;
9434 }
9435
9436 /* MD interface: Sections.  */
9437
9438 int
9439 md_estimate_size_before_relax (fragS * fragP ATTRIBUTE_UNUSED,
9440                                segT    segtype ATTRIBUTE_UNUSED)
9441 {
9442   as_fatal (_("md_estimate_size_before_relax\n"));
9443   return 1;
9444 }
9445
9446 /* Round up a section size to the appropriate boundary.  */
9447
9448 valueT
9449 md_section_align (segT   segment ATTRIBUTE_UNUSED,
9450                   valueT size)
9451 {
9452 #ifdef OBJ_ELF
9453   return size;
9454 #else
9455   /* Round all sects to multiple of 4.  */
9456   return (size + 3) & ~3;
9457 #endif
9458 }
9459
9460 /* This is called from HANDLE_ALIGN in write.c.  Fill in the contents
9461    of an rs_align_code fragment.  */
9462
9463 void
9464 arm_handle_align (fragS * fragP)
9465 {
9466   static char const arm_noop[4] = { 0x00, 0x00, 0xa0, 0xe1 };
9467   static char const thumb_noop[2] = { 0xc0, 0x46 };
9468   static char const arm_bigend_noop[4] = { 0xe1, 0xa0, 0x00, 0x00 };
9469   static char const thumb_bigend_noop[2] = { 0x46, 0xc0 };
9470
9471   int bytes, fix, noop_size;
9472   char * p;
9473   const char * noop;
9474
9475   if (fragP->fr_type != rs_align_code)
9476     return;
9477
9478   bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
9479   p = fragP->fr_literal + fragP->fr_fix;
9480   fix = 0;
9481
9482   if (bytes > MAX_MEM_FOR_RS_ALIGN_CODE)
9483     bytes &= MAX_MEM_FOR_RS_ALIGN_CODE;
9484
9485   if (fragP->tc_frag_data)
9486     {
9487       if (target_big_endian)
9488         noop = thumb_bigend_noop;
9489       else
9490         noop = thumb_noop;
9491       noop_size = sizeof (thumb_noop);
9492     }
9493   else
9494     {
9495       if (target_big_endian)
9496         noop = arm_bigend_noop;
9497       else
9498         noop = arm_noop;
9499       noop_size = sizeof (arm_noop);
9500     }
9501
9502   if (bytes & (noop_size - 1))
9503     {
9504       fix = bytes & (noop_size - 1);
9505       memset (p, 0, fix);
9506       p += fix;
9507       bytes -= fix;
9508     }
9509
9510   while (bytes >= noop_size)
9511     {
9512       memcpy (p, noop, noop_size);
9513       p += noop_size;
9514       bytes -= noop_size;
9515       fix += noop_size;
9516     }
9517
9518   fragP->fr_fix += fix;
9519   fragP->fr_var = noop_size;
9520 }
9521
9522 /* Called from md_do_align.  Used to create an alignment
9523    frag in a code section.  */
9524
9525 void
9526 arm_frag_align_code (int n, int max)
9527 {
9528   char * p;
9529
9530   /* We assume that there will never be a requirement
9531      to support alignments greater than 32 bytes.  */
9532   if (max > MAX_MEM_FOR_RS_ALIGN_CODE)
9533     as_fatal (_("alignments greater than 32 bytes not supported in .text sections."));
9534
9535   p = frag_var (rs_align_code,
9536                 MAX_MEM_FOR_RS_ALIGN_CODE,
9537                 1,
9538                 (relax_substateT) max,
9539                 (symbolS *) NULL,
9540                 (offsetT) n,
9541                 (char *) NULL);
9542   *p = 0;
9543 }
9544
9545 /* Perform target specific initialisation of a frag.  */
9546
9547 void
9548 arm_init_frag (fragS * fragP)
9549 {
9550   /* Record whether this frag is in an ARM or a THUMB area.  */
9551   fragP->tc_frag_data = thumb_mode;
9552 }
9553
9554 #ifdef OBJ_ELF
9555 /* When we change sections we need to issue a new mapping symbol.  */
9556
9557 void
9558 arm_elf_change_section (void)
9559 {
9560   flagword flags;
9561   segment_info_type *seginfo;
9562
9563   /* Link an unlinked unwind index table section to the .text section.  */
9564   if (elf_section_type (now_seg) == SHT_ARM_EXIDX
9565       && elf_linked_to_section (now_seg) == NULL)
9566     elf_linked_to_section (now_seg) = text_section;
9567
9568   if (!SEG_NORMAL (now_seg))
9569     return;
9570
9571   flags = bfd_get_section_flags (stdoutput, now_seg);
9572
9573   /* We can ignore sections that only contain debug info.  */
9574   if ((flags & SEC_ALLOC) == 0)
9575     return;
9576
9577   seginfo = seg_info (now_seg);
9578   mapstate = seginfo->tc_segment_info_data.mapstate;
9579   marked_pr_dependency = seginfo->tc_segment_info_data.marked_pr_dependency;
9580 }
9581
9582 int
9583 arm_elf_section_type (const char * str, size_t len)
9584 {
9585   if (len == 5 && strncmp (str, "exidx", 5) == 0)
9586     return SHT_ARM_EXIDX;
9587
9588   return -1;
9589 }
9590 \f
9591 /* Code to deal with unwinding tables.  */
9592
9593 static void add_unwind_adjustsp (offsetT);
9594
9595 /* Cenerate and deferred unwind frame offset.  */
9596
9597 static void
9598 flush_pending_unwind (void)
9599 {
9600   offsetT offset;
9601
9602   offset = unwind.pending_offset;
9603   unwind.pending_offset = 0;
9604   if (offset != 0)
9605     add_unwind_adjustsp (offset);
9606 }
9607
9608 /* Add an opcode to this list for this function.  Two-byte opcodes should
9609    be passed as op[0] << 8 | op[1].  The list of opcodes is built in reverse
9610    order.  */
9611
9612 static void
9613 add_unwind_opcode (valueT op, int length)
9614 {
9615   /* Add any deferred stack adjustment.  */
9616   if (unwind.pending_offset)
9617     flush_pending_unwind ();
9618
9619   unwind.sp_restored = 0;
9620
9621   if (unwind.opcode_count + length > unwind.opcode_alloc)
9622     {
9623       unwind.opcode_alloc += ARM_OPCODE_CHUNK_SIZE;
9624       if (unwind.opcodes)
9625         unwind.opcodes = xrealloc (unwind.opcodes,
9626                                    unwind.opcode_alloc);
9627       else
9628         unwind.opcodes = xmalloc (unwind.opcode_alloc);
9629     }
9630   while (length > 0)
9631     {
9632       length--;
9633       unwind.opcodes[unwind.opcode_count] = op & 0xff;
9634       op >>= 8;
9635       unwind.opcode_count++;
9636     }
9637 }
9638
9639 /* Add unwind opcodes to adjust the stack pointer.  */
9640
9641 static void
9642 add_unwind_adjustsp (offsetT offset)
9643 {
9644   valueT op;
9645
9646   if (offset > 0x200)
9647     {
9648       /* We need at most 5 bytes to hold a 32-bit value in a uleb128.  */
9649       char bytes[5];
9650       int n;
9651       valueT o;
9652
9653       /* Long form: 0xb2, uleb128.  */
9654       /* This might not fit in a word so add the individual bytes,
9655          remembering the list is built in reverse order.  */
9656       o = (valueT) ((offset - 0x204) >> 2);
9657       if (o == 0)
9658         add_unwind_opcode (0, 1);
9659
9660       /* Calculate the uleb128 encoding of the offset.  */
9661       n = 0;
9662       while (o)
9663         {
9664           bytes[n] = o & 0x7f;
9665           o >>= 7;
9666           if (o)
9667             bytes[n] |= 0x80;
9668           n++;
9669         }
9670       /* Add the insn.  */
9671       for (; n; n--)
9672         add_unwind_opcode (bytes[n - 1], 1);
9673       add_unwind_opcode (0xb2, 1);
9674     }
9675   else if (offset > 0x100)
9676     {
9677       /* Two short opcodes.  */
9678       add_unwind_opcode (0x3f, 1);
9679       op = (offset - 0x104) >> 2;
9680       add_unwind_opcode (op, 1);
9681     }
9682   else if (offset > 0)
9683     {
9684       /* Short opcode.  */
9685       op = (offset - 4) >> 2;
9686       add_unwind_opcode (op, 1);
9687     }
9688   else if (offset < 0)
9689     {
9690       offset = -offset;
9691       while (offset > 0x100)
9692         {
9693           add_unwind_opcode (0x7f, 1);
9694           offset -= 0x100;
9695         }
9696       op = ((offset - 4) >> 2) | 0x40;
9697       add_unwind_opcode (op, 1);
9698     }
9699 }
9700
9701 /* Finish the list of unwind opcodes for this function.  */
9702 static void
9703 finish_unwind_opcodes (void)
9704 {
9705   valueT op;
9706
9707   if (unwind.fp_used)
9708     {
9709       /* Adjust sp as neccessary.  */
9710       unwind.pending_offset += unwind.fp_offset - unwind.frame_size;
9711       flush_pending_unwind ();
9712
9713       /* After restoring sp from the frame pointer.  */
9714       op = 0x90 | unwind.fp_reg;
9715       add_unwind_opcode (op, 1);
9716     }
9717   else
9718     flush_pending_unwind ();
9719 }
9720
9721
9722 /* Start an exception table entry.  If idx is nonzero this is an index table
9723    entry.  */
9724
9725 static void
9726 start_unwind_section (const segT text_seg, int idx)
9727 {
9728   const char * text_name;
9729   const char * prefix;
9730   const char * prefix_once;
9731   const char * group_name;
9732   size_t prefix_len;
9733   size_t text_len;
9734   char * sec_name;
9735   size_t sec_name_len;
9736   int type;
9737   int flags;
9738   int linkonce;
9739
9740   if (idx)
9741     {
9742       prefix = ELF_STRING_ARM_unwind;
9743       prefix_once = ELF_STRING_ARM_unwind_once;
9744       type = SHT_ARM_EXIDX;
9745     }
9746   else
9747     {
9748       prefix = ELF_STRING_ARM_unwind_info;
9749       prefix_once = ELF_STRING_ARM_unwind_info_once;
9750       type = SHT_PROGBITS;
9751     }
9752
9753   text_name = segment_name (text_seg);
9754   if (streq (text_name, ".text"))
9755     text_name = "";
9756
9757   if (strncmp (text_name, ".gnu.linkonce.t.",
9758                strlen (".gnu.linkonce.t.")) == 0)
9759     {
9760       prefix = prefix_once;
9761       text_name += strlen (".gnu.linkonce.t.");
9762     }
9763
9764   prefix_len = strlen (prefix);
9765   text_len = strlen (text_name);
9766   sec_name_len = prefix_len + text_len;
9767   sec_name = xmalloc (sec_name_len + 1);
9768   memcpy (sec_name, prefix, prefix_len);
9769   memcpy (sec_name + prefix_len, text_name, text_len);
9770   sec_name[prefix_len + text_len] = '\0';
9771
9772   flags = SHF_ALLOC;
9773   linkonce = 0;
9774   group_name = 0;
9775
9776   /* Handle COMDAT group.  */
9777   if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
9778     {
9779       group_name = elf_group_name (text_seg);
9780       if (group_name == NULL)
9781         {
9782           as_bad ("Group section `%s' has no group signature",
9783                   segment_name (text_seg));
9784           ignore_rest_of_line ();
9785           return;
9786         }
9787       flags |= SHF_GROUP;
9788       linkonce = 1;
9789     }
9790
9791   obj_elf_change_section (sec_name, type, flags, 0, group_name, linkonce, 0);
9792
9793   /* Set the setion link for index tables.  */
9794   if (idx)
9795     elf_linked_to_section (now_seg) = text_seg;
9796 }
9797
9798
9799 /* Start an unwind table entry.  HAVE_DATA is nonzero if we have additional
9800    personality routine data.  Returns zero, or the index table value for
9801    and inline entry.  */
9802
9803 static valueT
9804 create_unwind_entry (int have_data)
9805 {
9806   int size;
9807   addressT where;
9808   char *ptr;
9809   /* The current word of data.  */
9810   valueT data;
9811   /* The number of bytes left in this word.  */
9812   int n;
9813
9814   finish_unwind_opcodes ();
9815
9816   /* Remember the current text section.  */
9817   unwind.saved_seg = now_seg;
9818   unwind.saved_subseg = now_subseg;
9819
9820   start_unwind_section (now_seg, 0);
9821
9822   if (unwind.personality_routine == NULL)
9823     {
9824       if (unwind.personality_index == -2)
9825         {
9826           if (have_data)
9827             as_bad (_("handerdata in cantunwind frame"));
9828           return 1; /* EXIDX_CANTUNWIND.  */
9829         }
9830
9831       /* Use a default personality routine if none is specified.  */
9832       if (unwind.personality_index == -1)
9833         {
9834           if (unwind.opcode_count > 3)
9835             unwind.personality_index = 1;
9836           else
9837             unwind.personality_index = 0;
9838         }
9839
9840       /* Space for the personality routine entry.  */
9841       if (unwind.personality_index == 0)
9842         {
9843           if (unwind.opcode_count > 3)
9844             as_bad (_("too many unwind opcodes for personality routine 0"));
9845
9846           if (!have_data)
9847             {
9848               /* All the data is inline in the index table.  */
9849               data = 0x80;
9850               n = 3;
9851               while (unwind.opcode_count > 0)
9852                 {
9853                   unwind.opcode_count--;
9854                   data = (data << 8) | unwind.opcodes[unwind.opcode_count];
9855                   n--;
9856                 }
9857
9858               /* Pad with "finish" opcodes.  */
9859               while (n--)
9860                 data = (data << 8) | 0xb0;
9861
9862               return data;
9863             }
9864           size = 0;
9865         }
9866       else
9867         /* We get two opcodes "free" in the first word.  */
9868         size = unwind.opcode_count - 2;
9869     }
9870   else
9871     /* An extra byte is required for the opcode count.  */
9872     size = unwind.opcode_count + 1;
9873
9874   size = (size + 3) >> 2;
9875   if (size > 0xff)
9876     as_bad (_("too many unwind opcodes"));
9877
9878   frag_align (2, 0, 0);
9879   record_alignment (now_seg, 2);
9880   unwind.table_entry = expr_build_dot ();
9881
9882   /* Allocate the table entry.  */
9883   ptr = frag_more ((size << 2) + 4);
9884   where = frag_now_fix () - ((size << 2) + 4);
9885
9886   switch (unwind.personality_index)
9887     {
9888     case -1:
9889       /* ??? Should this be a PLT generating relocation?  */
9890       /* Custom personality routine.  */
9891       fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
9892                BFD_RELOC_ARM_PREL31);
9893
9894       where += 4;
9895       ptr += 4;
9896
9897       /* Set the first byte to the number of additional words.  */
9898       data = size - 1;
9899       n = 3;
9900       break;
9901
9902     /* ABI defined personality routines.  */
9903     case 0:
9904       /* Three opcodes bytes are packed into the first word.  */
9905       data = 0x80;
9906       n = 3;
9907       break;
9908
9909     case 1:
9910     case 2:
9911       /* The size and first two opcode bytes go in the first word.  */
9912       data = ((0x80 + unwind.personality_index) << 8) | size;
9913       n = 2;
9914       break;
9915
9916     default:
9917       /* Should never happen.  */
9918       abort ();
9919     }
9920
9921   /* Pack the opcodes into words (MSB first), reversing the list at the same
9922      time.  */
9923   while (unwind.opcode_count > 0)
9924     {
9925       if (n == 0)
9926         {
9927           md_number_to_chars (ptr, data, 4);
9928           ptr += 4;
9929           n = 4;
9930           data = 0;
9931         }
9932       unwind.opcode_count--;
9933       n--;
9934       data = (data << 8) | unwind.opcodes[unwind.opcode_count];
9935     }
9936
9937   /* Finish off the last word.  */
9938   if (n < 4)
9939     {
9940       /* Pad with "finish" opcodes.  */
9941       while (n--)
9942         data = (data << 8) | 0xb0;
9943
9944       md_number_to_chars (ptr, data, 4);
9945     }
9946
9947   if (!have_data)
9948     {
9949       /* Add an empty descriptor if there is no user-specified data.   */
9950       ptr = frag_more (4);
9951       md_number_to_chars (ptr, 0, 4);
9952     }
9953
9954   return 0;
9955 }
9956
9957 /* Convert REGNAME to a DWARF-2 register number.  */
9958
9959 int
9960 tc_arm_regname_to_dw2regnum (const char *regname)
9961 {
9962   int reg = arm_reg_parse ((char **) &regname, REG_TYPE_RN);
9963
9964   if (reg == FAIL)
9965     return -1;
9966
9967   return reg;
9968 }
9969
9970 /* Initialize the DWARF-2 unwind information for this procedure.  */
9971
9972 void
9973 tc_arm_frame_initial_instructions (void)
9974 {
9975   cfi_add_CFA_def_cfa (REG_SP, 0);
9976 }
9977 #endif /* OBJ_ELF */
9978
9979
9980 /* MD interface: Symbol and relocation handling.  */
9981
9982 /* Return the address within the segment that a PC-relative fixup is
9983    relative to.  For ARM, PC-relative fixups applied to instructions
9984    are generally relative to the location of the fixup plus 8 bytes.
9985    Thumb branches are offset by 4, and Thumb loads relative to PC
9986    require special handling.  */
9987
9988 long
9989 md_pcrel_from_section (fixS * fixP, segT seg)
9990 {
9991   offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
9992
9993   /* If this is pc-relative and we are going to emit a relocation
9994      then we just want to put out any pipeline compensation that the linker
9995      will need.  Otherwise we want to use the calculated base.  */
9996   if (fixP->fx_pcrel 
9997       && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
9998           || arm_force_relocation (fixP)))
9999     base = 0;
10000
10001   switch (fixP->fx_r_type)
10002     {
10003       /* PC relative addressing on the Thumb is slightly odd as the
10004          bottom two bits of the PC are forced to zero for the
10005          calculation.  This happens *after* application of the
10006          pipeline offset.  However, Thumb adrl already adjusts for
10007          this, so we need not do it again.  */
10008     case BFD_RELOC_ARM_THUMB_ADD:
10009       return base & ~3;
10010
10011     case BFD_RELOC_ARM_THUMB_OFFSET:
10012     case BFD_RELOC_ARM_T32_OFFSET_IMM:
10013       return (base + 4) & ~3;
10014
10015       /* Thumb branches are simply offset by +4.  */
10016     case BFD_RELOC_THUMB_PCREL_BRANCH7:
10017     case BFD_RELOC_THUMB_PCREL_BRANCH9:
10018     case BFD_RELOC_THUMB_PCREL_BRANCH12:
10019     case BFD_RELOC_THUMB_PCREL_BRANCH20:
10020     case BFD_RELOC_THUMB_PCREL_BRANCH23:
10021     case BFD_RELOC_THUMB_PCREL_BRANCH25:
10022     case BFD_RELOC_THUMB_PCREL_BLX:
10023       return base + 4;
10024
10025       /* ARM mode branches are offset by +8.  However, the Windows CE
10026          loader expects the relocation not to take this into account.  */
10027     case BFD_RELOC_ARM_PCREL_BRANCH:
10028     case BFD_RELOC_ARM_PCREL_BLX:
10029     case BFD_RELOC_ARM_PLT32:
10030 #ifdef TE_WINCE
10031       return base;
10032 #else
10033       return base + 8;
10034 #endif
10035
10036       /* ARM mode loads relative to PC are also offset by +8.  Unlike
10037          branches, the Windows CE loader *does* expect the relocation
10038          to take this into account.  */
10039     case BFD_RELOC_ARM_OFFSET_IMM:
10040     case BFD_RELOC_ARM_OFFSET_IMM8:
10041     case BFD_RELOC_ARM_HWLITERAL:
10042     case BFD_RELOC_ARM_LITERAL:
10043     case BFD_RELOC_ARM_CP_OFF_IMM:
10044       return base + 8;
10045
10046
10047       /* Other PC-relative relocations are un-offset.  */
10048     default:
10049       return base;
10050     }
10051 }
10052
10053 /* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
10054    Otherwise we have no need to default values of symbols.  */
10055
10056 symbolS *
10057 md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
10058 {
10059 #ifdef OBJ_ELF
10060   if (name[0] == '_' && name[1] == 'G'
10061       && streq (name, GLOBAL_OFFSET_TABLE_NAME))
10062     {
10063       if (!GOT_symbol)
10064         {
10065           if (symbol_find (name))
10066             as_bad ("GOT already in the symbol table");
10067
10068           GOT_symbol = symbol_new (name, undefined_section,
10069                                    (valueT) 0, & zero_address_frag);
10070         }
10071
10072       return GOT_symbol;
10073     }
10074 #endif
10075
10076   return 0;
10077 }
10078
10079 /* Subroutine of md_apply_fix.   Check to see if an immediate can be
10080    computed as two separate immediate values, added together.  We
10081    already know that this value cannot be computed by just one ARM
10082    instruction.  */
10083
10084 static unsigned int
10085 validate_immediate_twopart (unsigned int   val,
10086                             unsigned int * highpart)
10087 {
10088   unsigned int a;
10089   unsigned int i;
10090
10091   for (i = 0; i < 32; i += 2)
10092     if (((a = rotate_left (val, i)) & 0xff) != 0)
10093       {
10094         if (a & 0xff00)
10095           {
10096             if (a & ~ 0xffff)
10097               continue;
10098             * highpart = (a  >> 8) | ((i + 24) << 7);
10099           }
10100         else if (a & 0xff0000)
10101           {
10102             if (a & 0xff000000)
10103               continue;
10104             * highpart = (a >> 16) | ((i + 16) << 7);
10105           }
10106         else
10107           {
10108             assert (a & 0xff000000);
10109             * highpart = (a >> 24) | ((i + 8) << 7);
10110           }
10111
10112         return (a & 0xff) | (i << 7);
10113       }
10114
10115   return FAIL;
10116 }
10117
10118 static int
10119 validate_offset_imm (unsigned int val, int hwse)
10120 {
10121   if ((hwse && val > 255) || val > 4095)
10122     return FAIL;
10123   return val;
10124 }
10125
10126 /* Subroutine of md_apply_fix.   Do those data_ops which can take a
10127    negative immediate constant by altering the instruction.  A bit of
10128    a hack really.
10129         MOV <-> MVN
10130         AND <-> BIC
10131         ADC <-> SBC
10132         by inverting the second operand, and
10133         ADD <-> SUB
10134         CMP <-> CMN
10135         by negating the second operand.  */
10136
10137 static int
10138 negate_data_op (unsigned long * instruction,
10139                 unsigned long   value)
10140 {
10141   int op, new_inst;
10142   unsigned long negated, inverted;
10143
10144   negated = encode_arm_immediate (-value);
10145   inverted = encode_arm_immediate (~value);
10146
10147   op = (*instruction >> DATA_OP_SHIFT) & 0xf;
10148   switch (op)
10149     {
10150       /* First negates.  */
10151     case OPCODE_SUB:             /* ADD <-> SUB  */
10152       new_inst = OPCODE_ADD;
10153       value = negated;
10154       break;
10155
10156     case OPCODE_ADD:
10157       new_inst = OPCODE_SUB;
10158       value = negated;
10159       break;
10160
10161     case OPCODE_CMP:             /* CMP <-> CMN  */
10162       new_inst = OPCODE_CMN;
10163       value = negated;
10164       break;
10165
10166     case OPCODE_CMN:
10167       new_inst = OPCODE_CMP;
10168       value = negated;
10169       break;
10170
10171       /* Now Inverted ops.  */
10172     case OPCODE_MOV:             /* MOV <-> MVN  */
10173       new_inst = OPCODE_MVN;
10174       value = inverted;
10175       break;
10176
10177     case OPCODE_MVN:
10178       new_inst = OPCODE_MOV;
10179       value = inverted;
10180       break;
10181
10182     case OPCODE_AND:             /* AND <-> BIC  */
10183       new_inst = OPCODE_BIC;
10184       value = inverted;
10185       break;
10186
10187     case OPCODE_BIC:
10188       new_inst = OPCODE_AND;
10189       value = inverted;
10190       break;
10191
10192     case OPCODE_ADC:              /* ADC <-> SBC  */
10193       new_inst = OPCODE_SBC;
10194       value = inverted;
10195       break;
10196
10197     case OPCODE_SBC:
10198       new_inst = OPCODE_ADC;
10199       value = inverted;
10200       break;
10201
10202       /* We cannot do anything.  */
10203     default:
10204       return FAIL;
10205     }
10206
10207   if (value == (unsigned) FAIL)
10208     return FAIL;
10209
10210   *instruction &= OPCODE_MASK;
10211   *instruction |= new_inst << DATA_OP_SHIFT;
10212   return value;
10213 }
10214
10215 void
10216 md_apply_fix (fixS *    fixP,
10217                valueT * valP,
10218                segT     seg)
10219 {
10220   offsetT        value = * valP;
10221   offsetT        newval;
10222   unsigned int   newimm;
10223   unsigned long  temp;
10224   int            sign;
10225   char *         buf = fixP->fx_where + fixP->fx_frag->fr_literal;
10226
10227   assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
10228
10229   /* Note whether this will delete the relocation.  */
10230   if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
10231     fixP->fx_done = 1;
10232
10233   /* On a 64-bit host, silently truncate 'value' to 32 bits for
10234      consistency with the behavior on 32-bit hosts.  Remember value
10235      for emit_reloc.  */
10236   value &= 0xffffffff;
10237   value ^= 0x80000000;
10238   value -= 0x80000000; 
10239
10240   *valP = value;
10241   fixP->fx_addnumber = value;
10242
10243   /* Same treatment for fixP->fx_offset.  */
10244   fixP->fx_offset &= 0xffffffff;
10245   fixP->fx_offset ^= 0x80000000;
10246   fixP->fx_offset -= 0x80000000;
10247
10248   switch (fixP->fx_r_type)
10249     {
10250     case BFD_RELOC_NONE:
10251       /* This will need to go in the object file.  */
10252       fixP->fx_done = 0;
10253       break;
10254
10255     case BFD_RELOC_ARM_IMMEDIATE:
10256       /* We claim that this fixup has been processed here,
10257          even if in fact we generate an error because we do
10258          not have a reloc for it, so tc_gen_reloc will reject it.  */
10259       fixP->fx_done = 1;
10260
10261       if (fixP->fx_addsy
10262           && ! S_IS_DEFINED (fixP->fx_addsy))
10263         {
10264           as_bad_where (fixP->fx_file, fixP->fx_line,
10265                         _("undefined symbol %s used as an immediate value"),
10266                         S_GET_NAME (fixP->fx_addsy));
10267           break;
10268         }
10269
10270       newimm = encode_arm_immediate (value);
10271       temp = md_chars_to_number (buf, INSN_SIZE);
10272
10273       /* If the instruction will fail, see if we can fix things up by
10274          changing the opcode.  */
10275       if (newimm == (unsigned int) FAIL
10276           && (newimm = negate_data_op (&temp, value)) == (unsigned int) FAIL)
10277         {
10278           as_bad_where (fixP->fx_file, fixP->fx_line,
10279                         _("invalid constant (%lx) after fixup"),
10280                         (unsigned long) value);
10281           break;
10282         }
10283
10284       newimm |= (temp & 0xfffff000);
10285       md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
10286       break;
10287
10288     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
10289       {
10290         unsigned int highpart = 0;
10291         unsigned int newinsn  = 0xe1a00000; /* nop.  */
10292
10293         newimm = encode_arm_immediate (value);
10294         temp = md_chars_to_number (buf, INSN_SIZE);
10295
10296         /* If the instruction will fail, see if we can fix things up by
10297            changing the opcode.  */
10298         if (newimm == (unsigned int) FAIL
10299             && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
10300           {
10301             /* No ?  OK - try using two ADD instructions to generate
10302                the value.  */
10303             newimm = validate_immediate_twopart (value, & highpart);
10304
10305             /* Yes - then make sure that the second instruction is
10306                also an add.  */
10307             if (newimm != (unsigned int) FAIL)
10308               newinsn = temp;
10309             /* Still No ?  Try using a negated value.  */
10310             else if ((newimm = validate_immediate_twopart (- value, & highpart)) != (unsigned int) FAIL)
10311               temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
10312             /* Otherwise - give up.  */
10313             else
10314               {
10315                 as_bad_where (fixP->fx_file, fixP->fx_line,
10316                               _("unable to compute ADRL instructions for PC offset of 0x%lx"),
10317                               (long) value);
10318                 break;
10319               }
10320
10321             /* Replace the first operand in the 2nd instruction (which
10322                is the PC) with the destination register.  We have
10323                already added in the PC in the first instruction and we
10324                do not want to do it again.  */
10325             newinsn &= ~ 0xf0000;
10326             newinsn |= ((newinsn & 0x0f000) << 4);
10327           }
10328
10329         newimm |= (temp & 0xfffff000);
10330         md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
10331
10332         highpart |= (newinsn & 0xfffff000);
10333         md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
10334       }
10335       break;
10336
10337     case BFD_RELOC_ARM_OFFSET_IMM:
10338     case BFD_RELOC_ARM_LITERAL:
10339       sign = value >= 0;
10340
10341       if (value < 0)
10342         value = - value;
10343
10344       if (validate_offset_imm (value, 0) == FAIL)
10345         {
10346           if (fixP->fx_r_type == BFD_RELOC_ARM_LITERAL)
10347             as_bad_where (fixP->fx_file, fixP->fx_line,
10348                           _("invalid literal constant: pool needs to be closer"));
10349           else
10350             as_bad_where (fixP->fx_file, fixP->fx_line,
10351                           _("bad immediate value for offset (%ld)"),
10352                           (long) value);
10353           break;
10354         }
10355
10356       newval = md_chars_to_number (buf, INSN_SIZE);
10357       newval &= 0xff7ff000;
10358       newval |= value | (sign ? INDEX_UP : 0);
10359       md_number_to_chars (buf, newval, INSN_SIZE);
10360       break;
10361
10362     case BFD_RELOC_ARM_OFFSET_IMM8:
10363     case BFD_RELOC_ARM_HWLITERAL:
10364       sign = value >= 0;
10365
10366       if (value < 0)
10367         value = - value;
10368
10369       if (validate_offset_imm (value, 1) == FAIL)
10370         {
10371           if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
10372             as_bad_where (fixP->fx_file, fixP->fx_line,
10373                           _("invalid literal constant: pool needs to be closer"));
10374           else
10375             as_bad (_("bad immediate value for half-word offset (%ld)"),
10376                     (long) value);
10377           break;
10378         }
10379
10380       newval = md_chars_to_number (buf, INSN_SIZE);
10381       newval &= 0xff7ff0f0;
10382       newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
10383       md_number_to_chars (buf, newval, INSN_SIZE);
10384       break;
10385
10386     case BFD_RELOC_ARM_T32_OFFSET_U8:
10387       if (value < 0 || value > 1020 || value % 4 != 0)
10388         as_bad_where (fixP->fx_file, fixP->fx_line,
10389                       _("bad immediate value for offset (%ld)"), (long) value);
10390       value /= 4;
10391
10392       newval = md_chars_to_number (buf+2, THUMB_SIZE);
10393       newval |= value;
10394       md_number_to_chars (buf+2, newval, THUMB_SIZE);
10395       break;
10396
10397     case BFD_RELOC_ARM_T32_OFFSET_IMM:
10398       /* This is a complicated relocation used for all varieties of Thumb32
10399          load/store instruction with immediate offset:
10400
10401          1110 100P u1WL NNNN XXXX YYYY iiii iiii - +/-(U) pre/post(P) 8-bit,
10402                                                    *4, optional writeback(W)
10403                                                    (doubleword load/store)
10404
10405          1111 100S uTTL 1111 XXXX iiii iiii iiii - +/-(U) 12-bit PC-rel
10406          1111 100S 0TTL NNNN XXXX 1Pu1 iiii iiii - +/-(U) pre/post(P) 8-bit
10407          1111 100S 0TTL NNNN XXXX 1110 iiii iiii - positive 8-bit (T instruction)
10408          1111 100S 1TTL NNNN XXXX iiii iiii iiii - positive 12-bit
10409          1111 100S 0TTL NNNN XXXX 1100 iiii iiii - negative 8-bit
10410
10411          Uppercase letters indicate bits that are already encoded at
10412          this point.  Lowercase letters are our problem.  For the
10413          second block of instructions, the secondary opcode nybble
10414          (bits 8..11) is present, and bit 23 is zero, even if this is
10415          a PC-relative operation.  */
10416       newval = md_chars_to_number (buf, THUMB_SIZE);
10417       newval <<= 16;
10418       newval |= md_chars_to_number (buf+THUMB_SIZE, THUMB_SIZE);
10419
10420       if ((newval & 0xf0000000) == 0xe0000000)
10421         {
10422           /* Doubleword load/store: 8-bit offset, scaled by 4.  */
10423           if (value >= 0)
10424             newval |= (1 << 23);
10425           else
10426             value = -value;
10427           if (value % 4 != 0)
10428             {
10429               as_bad_where (fixP->fx_file, fixP->fx_line,
10430                             _("offset not a multiple of 4"));
10431               break;
10432             }
10433           value /= 4;
10434           if (value >= 0xff)
10435             {
10436               as_bad_where (fixP->fx_file, fixP->fx_line,
10437                             _("offset out of range"));
10438               break;
10439             }
10440           newval &= ~0xff;
10441         }
10442       else if ((newval & 0x000f0000) == 0x000f0000)
10443         {
10444           /* PC-relative, 12-bit offset.  */
10445           if (value >= 0)
10446             newval |= (1 << 23);
10447           else
10448             value = -value;
10449           if (value >= 0xfff)
10450             {
10451               as_bad_where (fixP->fx_file, fixP->fx_line,
10452                             _("offset out of range"));
10453               break;
10454             }
10455           newval &= ~0xfff;
10456         }
10457       else if ((newval & 0x00000100) == 0x00000100)
10458         {
10459           /* Writeback: 8-bit, +/- offset.  */
10460           if (value >= 0)
10461             newval |= (1 << 9);
10462           else
10463             value = -value;
10464           if (value >= 0xff)
10465             {
10466               as_bad_where (fixP->fx_file, fixP->fx_line,
10467                             _("offset out of range"));
10468               break;
10469             }
10470           newval &= ~0xff;
10471         }
10472       else if ((newval & 0x00000f00) == 0x00000e00)
10473         {
10474           /* T-instruction: positive 8-bit offset.  */
10475           if (value < 0 || value >= 0xff)
10476             {
10477               as_bad_where (fixP->fx_file, fixP->fx_line,
10478                             _("offset out of range"));
10479               break;
10480             }
10481           newval &= ~0xff;
10482           newval |= value;
10483         }
10484       else
10485         {
10486           /* Positive 12-bit or negative 8-bit offset.  */
10487           int limit;
10488           if (value >= 0)
10489             {
10490               newval |= (1 << 23);
10491               limit = 0xfff;
10492             }
10493           else
10494             {
10495               value = -value;
10496               limit = 0xff;
10497             }
10498           if (value > limit)
10499             {
10500               as_bad_where (fixP->fx_file, fixP->fx_line,
10501                             _("offset out of range"));
10502               break;
10503             }
10504           newval &= ~limit;
10505         }
10506
10507       newval |= value;
10508       md_number_to_chars (buf, (newval >> 16) & 0xffff, THUMB_SIZE);
10509       md_number_to_chars (buf + THUMB_SIZE, newval & 0xffff, THUMB_SIZE);
10510       break;
10511
10512     case BFD_RELOC_ARM_SHIFT_IMM:
10513       newval = md_chars_to_number (buf, INSN_SIZE);
10514       if (((unsigned long) value) > 32
10515           || (value == 32
10516               && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
10517         {
10518           as_bad_where (fixP->fx_file, fixP->fx_line,
10519                         _("shift expression is too large"));
10520           break;
10521         }
10522
10523       if (value == 0)
10524         /* Shifts of zero must be done as lsl.  */
10525         newval &= ~0x60;
10526       else if (value == 32)
10527         value = 0;
10528       newval &= 0xfffff07f;
10529       newval |= (value & 0x1f) << 7;
10530       md_number_to_chars (buf, newval, INSN_SIZE);
10531       break;
10532
10533     case BFD_RELOC_ARM_T32_IMMEDIATE:
10534     case BFD_RELOC_ARM_T32_IMM12:
10535       /* We claim that this fixup has been processed here,
10536          even if in fact we generate an error because we do
10537          not have a reloc for it, so tc_gen_reloc will reject it.  */
10538       fixP->fx_done = 1;
10539
10540       if (fixP->fx_addsy
10541           && ! S_IS_DEFINED (fixP->fx_addsy))
10542         {
10543           as_bad_where (fixP->fx_file, fixP->fx_line,
10544                         _("undefined symbol %s used as an immediate value"),
10545                         S_GET_NAME (fixP->fx_addsy));
10546           break;
10547         }
10548
10549       newval = md_chars_to_number (buf, THUMB_SIZE);
10550       newval <<= 16;
10551       newval |= md_chars_to_number (buf+2, THUMB_SIZE);
10552
10553       if (fixP->fx_r_type == BFD_RELOC_ARM_T32_IMM12)
10554         {
10555           if (value > 0xfff)
10556             newimm = (unsigned int) FAIL;
10557           else
10558             newimm = value;
10559         }
10560       else
10561         newimm = encode_thumb32_immediate (value);
10562
10563       /* FUTURE: Implement analogue of negate_data_op for T32.  */
10564       if (newimm == (unsigned int)FAIL)
10565         {
10566           as_bad_where (fixP->fx_file, fixP->fx_line,
10567                         _("invalid constant (%lx) after fixup"),
10568                         (unsigned long) value);
10569           break;
10570         }
10571
10572       newval |= (newimm & 0x800) << 15;
10573       newval |= (newimm & 0x700) << 4;
10574       newval |= (newimm & 0x0ff);
10575
10576       md_number_to_chars (buf,   (valueT) ((newval >> 16) & 0xffff), THUMB_SIZE);
10577       md_number_to_chars (buf+2, (valueT) (newval & 0xffff), THUMB_SIZE);
10578       break;
10579
10580     case BFD_RELOC_ARM_SMI:
10581       if (((unsigned long) value) > 0xffff)
10582         as_bad_where (fixP->fx_file, fixP->fx_line,
10583                       _("invalid smi expression"));
10584       newval = md_chars_to_number (buf, INSN_SIZE);
10585       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
10586       md_number_to_chars (buf, newval, INSN_SIZE);
10587       break;
10588
10589     case BFD_RELOC_ARM_SWI:
10590       if (fixP->tc_fix_data != 0)
10591         {
10592           if (((unsigned long) value) > 0xff)
10593             as_bad_where (fixP->fx_file, fixP->fx_line,
10594                           _("invalid swi expression"));
10595           newval = md_chars_to_number (buf, THUMB_SIZE);
10596           newval |= value;
10597           md_number_to_chars (buf, newval, THUMB_SIZE);
10598         }
10599       else
10600         {
10601           if (((unsigned long) value) > 0x00ffffff)
10602             as_bad_where (fixP->fx_file, fixP->fx_line,
10603                           _("invalid swi expression"));
10604           newval = md_chars_to_number (buf, INSN_SIZE);
10605           newval |= value;
10606           md_number_to_chars (buf, newval, INSN_SIZE);
10607         }
10608       break;
10609
10610     case BFD_RELOC_ARM_MULTI:
10611       if (((unsigned long) value) > 0xffff)
10612         as_bad_where (fixP->fx_file, fixP->fx_line,
10613                       _("invalid expression in load/store multiple"));
10614       newval = value | md_chars_to_number (buf, INSN_SIZE);
10615       md_number_to_chars (buf, newval, INSN_SIZE);
10616       break;
10617
10618     case BFD_RELOC_ARM_PCREL_BRANCH:
10619 #ifdef OBJ_ELF
10620     case BFD_RELOC_ARM_PLT32:
10621 #endif
10622
10623       /* We are going to store value (shifted right by two) in the
10624          instruction, in a 24 bit, signed field.  Bits 0 and 1 must be
10625          clear, and bits 26 through 32 either all clear or all set. */
10626       if (value & 0x00000003)
10627         as_bad_where (fixP->fx_file, fixP->fx_line,
10628                       _("misaligned branch destination"));
10629       if ((value & (offsetT)0xfe000000) != (offsetT)0
10630           && (value & (offsetT)0xfe000000) != (offsetT)0xfe000000)
10631         as_bad_where (fixP->fx_file, fixP->fx_line,
10632                       _("branch out of range"));
10633
10634       if (fixP->fx_done || !seg->use_rela_p)
10635         {
10636           newval = md_chars_to_number (buf, INSN_SIZE);
10637           newval |= (value >> 2) & 0x00ffffff;
10638           md_number_to_chars (buf, newval, INSN_SIZE);
10639         }
10640       break;
10641
10642     case BFD_RELOC_ARM_PCREL_BLX:
10643       /* BLX allows bit 1 to be set in the branch destination, since
10644          it targets a Thumb instruction which is only required to be
10645          aligned modulo 2.  Other constraints are as for B/BL.  */
10646       if (value & 0x00000001)
10647         as_bad_where (fixP->fx_file, fixP->fx_line,
10648                       _("misaligned BLX destination"));
10649       if ((value & (offsetT)0xfe000000) != (offsetT)0
10650           && (value & (offsetT)0xfe000000) != (offsetT)0xfe000000)
10651         as_bad_where (fixP->fx_file, fixP->fx_line,
10652                       _("branch out of range"));
10653
10654       if (fixP->fx_done || !seg->use_rela_p)
10655         {
10656           offsetT hbit;
10657           hbit   = (value >> 1) & 1;
10658           value  = (value >> 2) & 0x00ffffff;
10659
10660           newval = md_chars_to_number (buf, INSN_SIZE);
10661           newval |= value | hbit << 24;
10662           md_number_to_chars (buf, newval, INSN_SIZE);
10663         }
10664       break;
10665
10666     case BFD_RELOC_THUMB_PCREL_BRANCH7: /* CZB */
10667       /* CZB can only branch forward.  */
10668       if (value & ~0x7e)
10669         as_bad_where (fixP->fx_file, fixP->fx_line,
10670                       _("branch out of range"));
10671
10672       if (fixP->fx_done || !seg->use_rela_p)
10673         {
10674           newval = md_chars_to_number (buf, THUMB_SIZE);
10675           newval |= ((value & 0x2e) << 2) | ((value & 0x40) << 3);
10676           md_number_to_chars (buf, newval, THUMB_SIZE);
10677         }
10678       break;
10679
10680     case BFD_RELOC_THUMB_PCREL_BRANCH9: /* Conditional branch.  */
10681       if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
10682         as_bad_where (fixP->fx_file, fixP->fx_line,
10683                       _("branch out of range"));
10684
10685       if (fixP->fx_done || !seg->use_rela_p)
10686         {
10687           newval = md_chars_to_number (buf, THUMB_SIZE);
10688           newval |= (value & 0x1ff) >> 1;
10689           md_number_to_chars (buf, newval, THUMB_SIZE);
10690         }
10691       break;
10692
10693     case BFD_RELOC_THUMB_PCREL_BRANCH12: /* Unconditional branch.  */
10694       if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
10695         as_bad_where (fixP->fx_file, fixP->fx_line,
10696                       _("branch out of range"));
10697
10698       if (fixP->fx_done || !seg->use_rela_p)
10699         {
10700           newval = md_chars_to_number (buf, THUMB_SIZE);
10701           newval |= (value & 0xfff) >> 1;
10702           md_number_to_chars (buf, newval, THUMB_SIZE);
10703         }
10704       break;
10705
10706     case BFD_RELOC_THUMB_PCREL_BRANCH20:
10707       if ((value & ~0x1fffff) && ((value & ~0x1fffff) != ~0x1fffff))
10708         as_bad_where (fixP->fx_file, fixP->fx_line,
10709                       _("conditional branch out of range"));
10710
10711       if (fixP->fx_done || !seg->use_rela_p)
10712         {
10713           offsetT newval2;
10714           addressT S, J1, J2, lo, hi;
10715
10716           S  = (value & 0x00100000) >> 20;
10717           J2 = (value & 0x00080000) >> 19;
10718           J1 = (value & 0x00040000) >> 18;
10719           hi = (value & 0x0003f000) >> 12;
10720           lo = (value & 0x00000ffe) >> 1;
10721
10722           newval   = md_chars_to_number (buf, THUMB_SIZE);
10723           newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
10724           newval  |= (S << 10) | hi;
10725           newval2 |= (J1 << 13) | (J2 << 11) | lo;
10726           md_number_to_chars (buf, newval, THUMB_SIZE);
10727           md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
10728         }
10729       break;
10730
10731     case BFD_RELOC_THUMB_PCREL_BLX:
10732     case BFD_RELOC_THUMB_PCREL_BRANCH23:
10733       if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
10734         as_bad_where (fixP->fx_file, fixP->fx_line,
10735                       _("branch out of range"));
10736
10737       if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
10738         /* For a BLX instruction, make sure that the relocation is rounded up
10739            to a word boundary.  This follows the semantics of the instruction
10740            which specifies that bit 1 of the target address will come from bit
10741            1 of the base address.  */
10742         value = (value + 1) & ~ 1;
10743
10744       if (fixP->fx_done || !seg->use_rela_p)
10745         {
10746           offsetT newval2;
10747
10748           newval   = md_chars_to_number (buf, THUMB_SIZE);
10749           newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
10750           newval  |= (value & 0x7fffff) >> 12;
10751           newval2 |= (value & 0xfff) >> 1;
10752           md_number_to_chars (buf, newval, THUMB_SIZE);
10753           md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
10754         }
10755       break;
10756
10757     case BFD_RELOC_THUMB_PCREL_BRANCH25:
10758       if ((value & ~0x1ffffff) && ((value & ~0x1ffffff) != ~0x1ffffff))
10759         as_bad_where (fixP->fx_file, fixP->fx_line,
10760                       _("branch out of range"));
10761
10762       if (fixP->fx_done || !seg->use_rela_p)
10763         {
10764           offsetT newval2;
10765           addressT S, I1, I2, lo, hi;
10766
10767           S  = (value & 0x01000000) >> 24;
10768           I1 = (value & 0x00800000) >> 23;
10769           I2 = (value & 0x00400000) >> 22;
10770           hi = (value & 0x003ff000) >> 12;
10771           lo = (value & 0x00000ffe) >> 1;
10772
10773           I1 = !(I1 ^ S);
10774           I2 = !(I2 ^ S);
10775
10776           newval   = md_chars_to_number (buf, THUMB_SIZE);
10777           newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
10778           newval  |= (S << 10) | hi;
10779           newval2 |= (I1 << 13) | (I2 << 11) | lo;
10780           md_number_to_chars (buf, newval, THUMB_SIZE);
10781           md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
10782         }
10783       break;
10784
10785     case BFD_RELOC_8:
10786       if (fixP->fx_done || !seg->use_rela_p)
10787         md_number_to_chars (buf, value, 1);
10788       break;
10789
10790     case BFD_RELOC_16:
10791       if (fixP->fx_done || !seg->use_rela_p)
10792         md_number_to_chars (buf, value, 2);
10793       break;
10794
10795 #ifdef OBJ_ELF
10796     case BFD_RELOC_ARM_TLS_GD32:
10797     case BFD_RELOC_ARM_TLS_LE32:
10798     case BFD_RELOC_ARM_TLS_IE32:
10799     case BFD_RELOC_ARM_TLS_LDM32:
10800     case BFD_RELOC_ARM_TLS_LDO32:
10801       S_SET_THREAD_LOCAL (fixP->fx_addsy);
10802       /* fall through */
10803
10804     case BFD_RELOC_ARM_GOT32:
10805     case BFD_RELOC_ARM_GOTOFF:
10806     case BFD_RELOC_ARM_TARGET2:
10807       if (fixP->fx_done || !seg->use_rela_p)
10808         md_number_to_chars (buf, 0, 4);
10809       break;
10810 #endif
10811
10812     case BFD_RELOC_RVA:
10813     case BFD_RELOC_32:
10814     case BFD_RELOC_ARM_TARGET1:
10815     case BFD_RELOC_ARM_ROSEGREL32:
10816     case BFD_RELOC_ARM_SBREL32:
10817     case BFD_RELOC_32_PCREL:
10818       if (fixP->fx_done || !seg->use_rela_p)
10819         md_number_to_chars (buf, value, 4);
10820       break;
10821
10822 #ifdef OBJ_ELF
10823     case BFD_RELOC_ARM_PREL31:
10824       if (fixP->fx_done || !seg->use_rela_p)
10825         {
10826           newval = md_chars_to_number (buf, 4) & 0x80000000;
10827           if ((value ^ (value >> 1)) & 0x40000000)
10828             {
10829               as_bad_where (fixP->fx_file, fixP->fx_line,
10830                             _("rel31 relocation overflow"));
10831             }
10832           newval |= value & 0x7fffffff;
10833           md_number_to_chars (buf, newval, 4);
10834         }
10835       break;
10836 #endif
10837
10838     case BFD_RELOC_ARM_CP_OFF_IMM:
10839       if (value < -1023 || value > 1023 || (value & 3))
10840         as_bad_where (fixP->fx_file, fixP->fx_line,
10841                       _("co-processor offset out of range"));
10842     cp_off_common:
10843       sign = value >= 0;
10844       if (value < 0)
10845         value = -value;
10846       newval = md_chars_to_number (buf, INSN_SIZE) & 0xff7fff00;
10847       newval |= (value >> 2) | (sign ? INDEX_UP : 0);
10848       if (value == 0)
10849         newval &= ~WRITE_BACK;
10850       md_number_to_chars (buf, newval, INSN_SIZE);
10851       break;
10852
10853     case BFD_RELOC_ARM_CP_OFF_IMM_S2:
10854       if (value < -255 || value > 255)
10855         as_bad_where (fixP->fx_file, fixP->fx_line,
10856                       _("co-processor offset out of range"));
10857       goto cp_off_common;
10858
10859     case BFD_RELOC_ARM_THUMB_OFFSET:
10860       newval = md_chars_to_number (buf, THUMB_SIZE);
10861       /* Exactly what ranges, and where the offset is inserted depends
10862          on the type of instruction, we can establish this from the
10863          top 4 bits.  */
10864       switch (newval >> 12)
10865         {
10866         case 4: /* PC load.  */
10867           /* Thumb PC loads are somewhat odd, bit 1 of the PC is
10868              forced to zero for these loads; md_pcrel_from has already
10869              compensated for this.  */
10870           if (value & 3)
10871             as_bad_where (fixP->fx_file, fixP->fx_line,
10872                           _("invalid offset, target not word aligned (0x%08lX)"),
10873                           (((unsigned int) fixP->fx_frag->fr_address
10874                             + (unsigned int) fixP->fx_where) & ~3) + value);
10875
10876           if (value & ~0x3fc)
10877             as_bad_where (fixP->fx_file, fixP->fx_line,
10878                           _("invalid offset, value too big (0x%08lX)"),
10879                           (long) value);
10880
10881           newval |= value >> 2;
10882           break;
10883
10884         case 9: /* SP load/store.  */
10885           if (value & ~0x3fc)
10886             as_bad_where (fixP->fx_file, fixP->fx_line,
10887                           _("invalid offset, value too big (0x%08lX)"),
10888                           (long) value);
10889           newval |= value >> 2;
10890           break;
10891
10892         case 6: /* Word load/store.  */
10893           if (value & ~0x7c)
10894             as_bad_where (fixP->fx_file, fixP->fx_line,
10895                           _("invalid offset, value too big (0x%08lX)"),
10896                           (long) value);
10897           newval |= value << 4; /* 6 - 2.  */
10898           break;
10899
10900         case 7: /* Byte load/store.  */
10901           if (value & ~0x1f)
10902             as_bad_where (fixP->fx_file, fixP->fx_line,
10903                           _("invalid offset, value too big (0x%08lX)"),
10904                           (long) value);
10905           newval |= value << 6;
10906           break;
10907
10908         case 8: /* Halfword load/store.  */
10909           if (value & ~0x3e)
10910             as_bad_where (fixP->fx_file, fixP->fx_line,
10911                           _("invalid offset, value too big (0x%08lX)"),
10912                           (long) value);
10913           newval |= value << 5; /* 6 - 1.  */
10914           break;
10915
10916         default:
10917           as_bad_where (fixP->fx_file, fixP->fx_line,
10918                         "Unable to process relocation for thumb opcode: %lx",
10919                         (unsigned long) newval);
10920           break;
10921         }
10922       md_number_to_chars (buf, newval, THUMB_SIZE);
10923       break;
10924
10925     case BFD_RELOC_ARM_THUMB_ADD:
10926       /* This is a complicated relocation, since we use it for all of
10927          the following immediate relocations:
10928
10929             3bit ADD/SUB
10930             8bit ADD/SUB
10931             9bit ADD/SUB SP word-aligned
10932            10bit ADD PC/SP word-aligned
10933
10934          The type of instruction being processed is encoded in the
10935          instruction field:
10936
10937            0x8000  SUB
10938            0x00F0  Rd
10939            0x000F  Rs
10940       */
10941       newval = md_chars_to_number (buf, THUMB_SIZE);
10942       {
10943         int rd = (newval >> 4) & 0xf;
10944         int rs = newval & 0xf;
10945         int subtract = !!(newval & 0x8000);
10946
10947         /* Check for HI regs, only very restricted cases allowed:
10948            Adjusting SP, and using PC or SP to get an address.  */
10949         if ((rd > 7 && (rd != REG_SP || rs != REG_SP))
10950             || (rs > 7 && rs != REG_SP && rs != REG_PC))
10951           as_bad_where (fixP->fx_file, fixP->fx_line,
10952                         _("invalid Hi register with immediate"));
10953
10954         /* If value is negative, choose the opposite instruction.  */
10955         if (value < 0)
10956           {
10957             value = -value;
10958             subtract = !subtract;
10959             if (value < 0)
10960               as_bad_where (fixP->fx_file, fixP->fx_line,
10961                             _("immediate value out of range"));
10962           }
10963
10964         if (rd == REG_SP)
10965           {
10966             if (value & ~0x1fc)
10967               as_bad_where (fixP->fx_file, fixP->fx_line,
10968                             _("invalid immediate for stack address calculation"));
10969             newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
10970             newval |= value >> 2;
10971           }
10972         else if (rs == REG_PC || rs == REG_SP)
10973           {
10974             if (subtract || value & ~0x3fc)
10975               as_bad_where (fixP->fx_file, fixP->fx_line,
10976                             _("invalid immediate for address calculation (value = 0x%08lX)"),
10977                             (unsigned long) value);
10978             newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
10979             newval |= rd << 8;
10980             newval |= value >> 2;
10981           }
10982         else if (rs == rd)
10983           {
10984             if (value & ~0xff)
10985               as_bad_where (fixP->fx_file, fixP->fx_line,
10986                             _("immediate value out of range"));
10987             newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
10988             newval |= (rd << 8) | value;
10989           }
10990         else
10991           {
10992             if (value & ~0x7)
10993               as_bad_where (fixP->fx_file, fixP->fx_line,
10994                             _("immediate value out of range"));
10995             newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
10996             newval |= rd | (rs << 3) | (value << 6);
10997           }
10998       }
10999       md_number_to_chars (buf, newval, THUMB_SIZE);
11000       break;
11001
11002     case BFD_RELOC_ARM_THUMB_IMM:
11003       newval = md_chars_to_number (buf, THUMB_SIZE);
11004       if (value < 0 || value > 255)
11005         as_bad_where (fixP->fx_file, fixP->fx_line,
11006                       _("invalid immediate: %ld is too large"),
11007                       (long) value);
11008       newval |= value;
11009       md_number_to_chars (buf, newval, THUMB_SIZE);
11010       break;
11011
11012     case BFD_RELOC_ARM_THUMB_SHIFT:
11013       /* 5bit shift value (0..32).  LSL cannot take 32.  */
11014       newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf83f;
11015       temp = newval & 0xf800;
11016       if (value < 0 || value > 32 || (value == 32 && temp == T_OPCODE_LSL_I))
11017         as_bad_where (fixP->fx_file, fixP->fx_line,
11018                       _("invalid shift value: %ld"), (long) value);
11019       /* Shifts of zero must be encoded as LSL.  */
11020       if (value == 0)
11021         newval = (newval & 0x003f) | T_OPCODE_LSL_I;
11022       /* Shifts of 32 are encoded as zero.  */
11023       else if (value == 32)
11024         value = 0;
11025       newval |= value << 6;
11026       md_number_to_chars (buf, newval, THUMB_SIZE);
11027       break;
11028
11029     case BFD_RELOC_VTABLE_INHERIT:
11030     case BFD_RELOC_VTABLE_ENTRY:
11031       fixP->fx_done = 0;
11032       return;
11033
11034     case BFD_RELOC_UNUSED:
11035     default:
11036       as_bad_where (fixP->fx_file, fixP->fx_line,
11037                     _("bad relocation fixup type (%d)"), fixP->fx_r_type);
11038     }
11039 }
11040
11041 /* Translate internal representation of relocation info to BFD target
11042    format.  */
11043
11044 arelent *
11045 tc_gen_reloc (asection * section ATTRIBUTE_UNUSED,
11046               fixS *     fixp)
11047 {
11048   arelent * reloc;
11049   bfd_reloc_code_real_type code;
11050
11051   reloc = xmalloc (sizeof (arelent));
11052
11053   reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
11054   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
11055   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
11056
11057   if (fixp->fx_pcrel)
11058     fixp->fx_offset = reloc->address;
11059   reloc->addend = fixp->fx_offset;
11060
11061   switch (fixp->fx_r_type)
11062     {
11063     case BFD_RELOC_8:
11064       if (fixp->fx_pcrel)
11065         {
11066           code = BFD_RELOC_8_PCREL;
11067           break;
11068         }
11069
11070     case BFD_RELOC_16:
11071       if (fixp->fx_pcrel)
11072         {
11073           code = BFD_RELOC_16_PCREL;
11074           break;
11075         }
11076
11077     case BFD_RELOC_32:
11078       if (fixp->fx_pcrel)
11079         {
11080           code = BFD_RELOC_32_PCREL;
11081           break;
11082         }
11083
11084     case BFD_RELOC_NONE:
11085     case BFD_RELOC_ARM_PCREL_BRANCH:
11086     case BFD_RELOC_ARM_PCREL_BLX:
11087     case BFD_RELOC_RVA:
11088     case BFD_RELOC_THUMB_PCREL_BRANCH7:
11089     case BFD_RELOC_THUMB_PCREL_BRANCH9:
11090     case BFD_RELOC_THUMB_PCREL_BRANCH12:
11091     case BFD_RELOC_THUMB_PCREL_BRANCH20:
11092     case BFD_RELOC_THUMB_PCREL_BRANCH23:
11093     case BFD_RELOC_THUMB_PCREL_BRANCH25:
11094     case BFD_RELOC_THUMB_PCREL_BLX:
11095     case BFD_RELOC_VTABLE_ENTRY:
11096     case BFD_RELOC_VTABLE_INHERIT:
11097       code = fixp->fx_r_type;
11098       break;
11099
11100     case BFD_RELOC_ARM_LITERAL:
11101     case BFD_RELOC_ARM_HWLITERAL:
11102       /* If this is called then the a literal has
11103          been referenced across a section boundary.  */
11104       as_bad_where (fixp->fx_file, fixp->fx_line,
11105                     _("literal referenced across section boundary"));
11106       return NULL;
11107
11108 #ifdef OBJ_ELF
11109     case BFD_RELOC_ARM_GOT32:
11110     case BFD_RELOC_ARM_GOTOFF:
11111     case BFD_RELOC_ARM_PLT32:
11112     case BFD_RELOC_ARM_TARGET1:
11113     case BFD_RELOC_ARM_ROSEGREL32:
11114     case BFD_RELOC_ARM_SBREL32:
11115     case BFD_RELOC_ARM_PREL31:
11116     case BFD_RELOC_ARM_TARGET2:
11117     case BFD_RELOC_ARM_TLS_LE32:
11118     case BFD_RELOC_ARM_TLS_LDO32:
11119       code = fixp->fx_r_type;
11120       break;
11121
11122     case BFD_RELOC_ARM_TLS_GD32:
11123     case BFD_RELOC_ARM_TLS_IE32:
11124     case BFD_RELOC_ARM_TLS_LDM32:
11125       /* BFD will include the symbol's address in the addend.
11126          But we don't want that, so subtract it out again here.  */
11127       if (!S_IS_COMMON (fixp->fx_addsy))
11128         reloc->addend -= (*reloc->sym_ptr_ptr)->value;
11129       code = fixp->fx_r_type;
11130       break;
11131 #endif
11132
11133     case BFD_RELOC_ARM_IMMEDIATE:
11134       as_bad_where (fixp->fx_file, fixp->fx_line,
11135                     _("internal relocation (type: IMMEDIATE) not fixed up"));
11136       return NULL;
11137
11138     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
11139       as_bad_where (fixp->fx_file, fixp->fx_line,
11140                     _("ADRL used for a symbol not defined in the same file"));
11141       return NULL;
11142
11143     case BFD_RELOC_ARM_OFFSET_IMM:
11144       if (fixp->fx_addsy != NULL
11145           && !S_IS_DEFINED (fixp->fx_addsy)
11146           && S_IS_LOCAL (fixp->fx_addsy))
11147         {
11148           as_bad_where (fixp->fx_file, fixp->fx_line,
11149                         _("undefined local label `%s'"),
11150                         S_GET_NAME (fixp->fx_addsy));
11151           return NULL;
11152         }
11153
11154       as_bad_where (fixp->fx_file, fixp->fx_line,
11155                     _("internal_relocation (type: OFFSET_IMM) not fixed up"));
11156       return NULL;
11157
11158     default:
11159       {
11160         char * type;
11161
11162         switch (fixp->fx_r_type)
11163           {
11164           case BFD_RELOC_NONE:             type = "NONE";         break;
11165           case BFD_RELOC_ARM_OFFSET_IMM8:  type = "OFFSET_IMM8";  break;
11166           case BFD_RELOC_ARM_SHIFT_IMM:    type = "SHIFT_IMM";    break;
11167           case BFD_RELOC_ARM_SMI:          type = "SMI";          break;
11168           case BFD_RELOC_ARM_SWI:          type = "SWI";          break;
11169           case BFD_RELOC_ARM_MULTI:        type = "MULTI";        break;
11170           case BFD_RELOC_ARM_CP_OFF_IMM:   type = "CP_OFF_IMM";   break;
11171           case BFD_RELOC_ARM_THUMB_ADD:    type = "THUMB_ADD";    break;
11172           case BFD_RELOC_ARM_THUMB_SHIFT:  type = "THUMB_SHIFT";  break;
11173           case BFD_RELOC_ARM_THUMB_IMM:    type = "THUMB_IMM";    break;
11174           case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
11175           default:                         type = _("<unknown>"); break;
11176           }
11177         as_bad_where (fixp->fx_file, fixp->fx_line,
11178                       _("cannot represent %s relocation in this object file format"),
11179                       type);
11180         return NULL;
11181       }
11182     }
11183
11184 #ifdef OBJ_ELF
11185   if ((code == BFD_RELOC_32_PCREL || code == BFD_RELOC_32)
11186       && GOT_symbol
11187       && fixp->fx_addsy == GOT_symbol)
11188     {
11189       code = BFD_RELOC_ARM_GOTPC;
11190       reloc->addend = fixp->fx_offset = reloc->address;
11191     }
11192 #endif
11193
11194   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
11195
11196   if (reloc->howto == NULL)
11197     {
11198       as_bad_where (fixp->fx_file, fixp->fx_line,
11199                     _("cannot represent %s relocation in this object file format"),
11200                     bfd_get_reloc_code_name (code));
11201       return NULL;
11202     }
11203
11204   /* HACK: Since arm ELF uses Rel instead of Rela, encode the
11205      vtable entry to be used in the relocation's section offset.  */
11206   if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
11207     reloc->address = fixp->fx_offset;
11208
11209   return reloc;
11210 }
11211
11212 /* This fix_new is called by cons via TC_CONS_FIX_NEW.  */
11213
11214 void
11215 cons_fix_new_arm (fragS *       frag,
11216                   int           where,
11217                   int           size,
11218                   expressionS * exp)
11219 {
11220   bfd_reloc_code_real_type type;
11221   int pcrel = 0;
11222
11223   /* Pick a reloc.
11224      FIXME: @@ Should look at CPU word size.  */
11225   switch (size)
11226     {
11227     case 1:
11228       type = BFD_RELOC_8;
11229       break;
11230     case 2:
11231       type = BFD_RELOC_16;
11232       break;
11233     case 4:
11234     default:
11235       type = BFD_RELOC_32;
11236       break;
11237     case 8:
11238       type = BFD_RELOC_64;
11239       break;
11240     }
11241
11242   fix_new_exp (frag, where, (int) size, exp, pcrel, type);
11243 }
11244
11245 #if defined OBJ_COFF || defined OBJ_ELF
11246 void
11247 arm_validate_fix (fixS * fixP)
11248 {
11249   /* If the destination of the branch is a defined symbol which does not have
11250      the THUMB_FUNC attribute, then we must be calling a function which has
11251      the (interfacearm) attribute.  We look for the Thumb entry point to that
11252      function and change the branch to refer to that function instead.  */
11253   if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
11254       && fixP->fx_addsy != NULL
11255       && S_IS_DEFINED (fixP->fx_addsy)
11256       && ! THUMB_IS_FUNC (fixP->fx_addsy))
11257     {
11258       fixP->fx_addsy = find_real_start (fixP->fx_addsy);
11259     }
11260 }
11261 #endif
11262
11263 int
11264 arm_force_relocation (struct fix * fixp)
11265 {
11266 #if defined (OBJ_COFF) && defined (TE_PE)
11267   if (fixp->fx_r_type == BFD_RELOC_RVA)
11268     return 1;
11269 #endif
11270
11271   /* Resolve these relocations even if the symbol is extern or weak.  */
11272   if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
11273       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM
11274       || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE)
11275     return 0;
11276
11277   return generic_force_reloc (fixp);
11278 }
11279
11280 #ifdef OBJ_COFF
11281 /* This is a little hack to help the gas/arm/adrl.s test.  It prevents
11282    local labels from being added to the output symbol table when they
11283    are used with the ADRL pseudo op.  The ADRL relocation should always
11284    be resolved before the binbary is emitted, so it is safe to say that
11285    it is adjustable.  */
11286
11287 bfd_boolean
11288 arm_fix_adjustable (fixS * fixP)
11289 {
11290   if (fixP->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE)
11291     return 1;
11292   return 0;
11293 }
11294 #endif
11295
11296 #ifdef OBJ_ELF
11297 /* Relocations against Thumb function names must be left unadjusted,
11298    so that the linker can use this information to correctly set the
11299    bottom bit of their addresses.  The MIPS version of this function
11300    also prevents relocations that are mips-16 specific, but I do not
11301    know why it does this.
11302
11303    FIXME:
11304    There is one other problem that ought to be addressed here, but
11305    which currently is not:  Taking the address of a label (rather
11306    than a function) and then later jumping to that address.  Such
11307    addresses also ought to have their bottom bit set (assuming that
11308    they reside in Thumb code), but at the moment they will not.  */
11309
11310 bfd_boolean
11311 arm_fix_adjustable (fixS * fixP)
11312 {
11313   if (fixP->fx_addsy == NULL)
11314     return 1;
11315
11316   if (THUMB_IS_FUNC (fixP->fx_addsy)
11317       && fixP->fx_subsy == NULL)
11318     return 0;
11319
11320   /* We need the symbol name for the VTABLE entries.  */
11321   if (   fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
11322       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
11323     return 0;
11324
11325   /* Don't allow symbols to be discarded on GOT related relocs.  */
11326   if (fixP->fx_r_type == BFD_RELOC_ARM_PLT32
11327       || fixP->fx_r_type == BFD_RELOC_ARM_GOT32
11328       || fixP->fx_r_type == BFD_RELOC_ARM_GOTOFF
11329       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32
11330       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LE32
11331       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32
11332       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32
11333       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDO32
11334       || fixP->fx_r_type == BFD_RELOC_ARM_TARGET2)
11335     return 0;
11336
11337   return 1;
11338 }
11339
11340 const char *
11341 elf32_arm_target_format (void)
11342 {
11343 #ifdef TE_SYMBIAN
11344   return (target_big_endian
11345           ? "elf32-bigarm-symbian"
11346           : "elf32-littlearm-symbian");
11347 #elif defined (TE_VXWORKS)
11348   return (target_big_endian
11349           ? "elf32-bigarm-vxworks"
11350           : "elf32-littlearm-vxworks");
11351 #else
11352   if (target_big_endian)
11353     return "elf32-bigarm";
11354   else
11355     return "elf32-littlearm";
11356 #endif
11357 }
11358
11359 void
11360 armelf_frob_symbol (symbolS * symp,
11361                     int *     puntp)
11362 {
11363   elf_frob_symbol (symp, puntp);
11364 }
11365 #endif
11366
11367 /* MD interface: Finalization.  */
11368
11369 /* A good place to do this, although this was probably not intended
11370    for this kind of use.  We need to dump the literal pool before
11371    references are made to a null symbol pointer.  */
11372
11373 void
11374 arm_cleanup (void)
11375 {
11376   literal_pool * pool;
11377
11378   for (pool = list_of_pools; pool; pool = pool->next)
11379     {
11380       /* Put it at the end of the relevent section.  */
11381       subseg_set (pool->section, pool->sub_section);
11382 #ifdef OBJ_ELF
11383       arm_elf_change_section ();
11384 #endif
11385       s_ltorg (0);
11386     }
11387 }
11388
11389 /* Adjust the symbol table.  This marks Thumb symbols as distinct from
11390    ARM ones.  */
11391
11392 void
11393 arm_adjust_symtab (void)
11394 {
11395 #ifdef OBJ_COFF
11396   symbolS * sym;
11397
11398   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
11399     {
11400       if (ARM_IS_THUMB (sym))
11401         {
11402           if (THUMB_IS_FUNC (sym))
11403             {
11404               /* Mark the symbol as a Thumb function.  */
11405               if (   S_GET_STORAGE_CLASS (sym) == C_STAT
11406                   || S_GET_STORAGE_CLASS (sym) == C_LABEL)  /* This can happen!  */
11407                 S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
11408
11409               else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
11410                 S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
11411               else
11412                 as_bad (_("%s: unexpected function type: %d"),
11413                         S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
11414             }
11415           else switch (S_GET_STORAGE_CLASS (sym))
11416             {
11417             case C_EXT:
11418               S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
11419               break;
11420             case C_STAT:
11421               S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
11422               break;
11423             case C_LABEL:
11424               S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
11425               break;
11426             default:
11427               /* Do nothing.  */
11428               break;
11429             }
11430         }
11431
11432       if (ARM_IS_INTERWORK (sym))
11433         coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
11434     }
11435 #endif
11436 #ifdef OBJ_ELF
11437   symbolS * sym;
11438   char      bind;
11439
11440   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
11441     {
11442       if (ARM_IS_THUMB (sym))
11443         {
11444           elf_symbol_type * elf_sym;
11445
11446           elf_sym = elf_symbol (symbol_get_bfdsym (sym));
11447           bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
11448
11449           if (! bfd_is_arm_mapping_symbol_name (elf_sym->symbol.name))
11450             {
11451               /* If it's a .thumb_func, declare it as so,
11452                  otherwise tag label as .code 16.  */
11453               if (THUMB_IS_FUNC (sym))
11454                 elf_sym->internal_elf_sym.st_info =
11455                   ELF_ST_INFO (bind, STT_ARM_TFUNC);
11456               else
11457                 elf_sym->internal_elf_sym.st_info =
11458                   ELF_ST_INFO (bind, STT_ARM_16BIT);
11459             }
11460         }
11461     }
11462 #endif
11463 }
11464
11465 /* MD interface: Initialization.  */
11466
11467 static void
11468 set_constant_flonums (void)
11469 {
11470   int i;
11471
11472   for (i = 0; i < NUM_FLOAT_VALS; i++)
11473     if (atof_ieee ((char *) fp_const[i], 'x', fp_values[i]) == NULL)
11474       abort ();
11475 }
11476
11477 void
11478 md_begin (void)
11479 {
11480   unsigned mach;
11481   unsigned int i;
11482
11483   if (   (arm_ops_hsh = hash_new ()) == NULL
11484       || (arm_cond_hsh = hash_new ()) == NULL
11485       || (arm_shift_hsh = hash_new ()) == NULL
11486       || (arm_psr_hsh = hash_new ()) == NULL
11487       || (arm_reg_hsh = hash_new ()) == NULL
11488       || (arm_reloc_hsh = hash_new ()) == NULL)
11489     as_fatal (_("virtual memory exhausted"));
11490
11491   for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
11492     hash_insert (arm_ops_hsh, insns[i].template, (PTR) (insns + i));
11493   for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
11494     hash_insert (arm_cond_hsh, conds[i].template, (PTR) (conds + i));
11495   for (i = 0; i < sizeof (shift_names) / sizeof (struct asm_shift_name); i++)
11496     hash_insert (arm_shift_hsh, shift_names[i].name, (PTR) (shift_names + i));
11497   for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
11498     hash_insert (arm_psr_hsh, psrs[i].template, (PTR) (psrs + i));
11499   for (i = 0; i < sizeof (reg_names) / sizeof (struct reg_entry); i++)
11500     hash_insert (arm_reg_hsh, reg_names[i].name, (PTR) (reg_names + i));
11501 #ifdef OBJ_ELF
11502   for (i = 0; i < sizeof (reloc_names) / sizeof (struct reloc_entry); i++)
11503     hash_insert (arm_reloc_hsh, reloc_names[i].name, (PTR) (reloc_names + i));
11504 #endif
11505
11506   set_constant_flonums ();
11507
11508   /* Set the cpu variant based on the command-line options.  We prefer
11509      -mcpu= over -march= if both are set (as for GCC); and we prefer
11510      -mfpu= over any other way of setting the floating point unit.
11511      Use of legacy options with new options are faulted.  */
11512   if (legacy_cpu != -1)
11513     {
11514       if (mcpu_cpu_opt != -1 || march_cpu_opt != -1)
11515         as_bad (_("use of old and new-style options to set CPU type"));
11516
11517       mcpu_cpu_opt = legacy_cpu;
11518     }
11519   else if (mcpu_cpu_opt == -1)
11520     mcpu_cpu_opt = march_cpu_opt;
11521
11522   if (legacy_fpu != -1)
11523     {
11524       if (mfpu_opt != -1)
11525         as_bad (_("use of old and new-style options to set FPU type"));
11526
11527       mfpu_opt = legacy_fpu;
11528     }
11529   else if (mfpu_opt == -1)
11530     {
11531 #if !(defined (TE_LINUX) || defined (TE_NetBSD) || defined (TE_VXWORKS))
11532       /* Some environments specify a default FPU.  If they don't, infer it
11533          from the processor.  */
11534       if (mcpu_fpu_opt != -1)
11535         mfpu_opt = mcpu_fpu_opt;
11536       else
11537         mfpu_opt = march_fpu_opt;
11538 #else
11539       mfpu_opt = FPU_DEFAULT;
11540 #endif
11541     }
11542
11543   if (mfpu_opt == -1)
11544     {
11545       if (mcpu_cpu_opt == -1)
11546         mfpu_opt = FPU_DEFAULT;
11547       else if (mcpu_cpu_opt & ARM_EXT_V5)
11548         mfpu_opt = FPU_ARCH_VFP_V2;
11549       else
11550         mfpu_opt = FPU_ARCH_FPA;
11551     }
11552
11553   if (mcpu_cpu_opt == -1)
11554     mcpu_cpu_opt = CPU_DEFAULT;
11555
11556   cpu_variant = mcpu_cpu_opt | mfpu_opt;
11557
11558 #if defined OBJ_COFF || defined OBJ_ELF
11559   {
11560     unsigned int flags = 0;
11561
11562 #if defined OBJ_ELF
11563     flags = meabi_flags;
11564
11565     switch (meabi_flags)
11566       {
11567       case EF_ARM_EABI_UNKNOWN:
11568 #endif
11569         /* Set the flags in the private structure.  */
11570         if (uses_apcs_26)      flags |= F_APCS26;
11571         if (support_interwork) flags |= F_INTERWORK;
11572         if (uses_apcs_float)   flags |= F_APCS_FLOAT;
11573         if (pic_code)          flags |= F_PIC;
11574         if ((cpu_variant & FPU_ANY) == FPU_NONE
11575              || (cpu_variant & FPU_ANY) == FPU_ARCH_VFP) /* VFP layout only.  */
11576           flags |= F_SOFT_FLOAT;
11577
11578         switch (mfloat_abi_opt)
11579           {
11580           case ARM_FLOAT_ABI_SOFT:
11581           case ARM_FLOAT_ABI_SOFTFP:
11582             flags |= F_SOFT_FLOAT;
11583             break;
11584
11585           case ARM_FLOAT_ABI_HARD:
11586             if (flags & F_SOFT_FLOAT)
11587               as_bad (_("hard-float conflicts with specified fpu"));
11588             break;
11589           }
11590
11591         /* Using VFP conventions (even if soft-float).  */
11592         if (cpu_variant & FPU_VFP_EXT_NONE)
11593           flags |= F_VFP_FLOAT;
11594
11595 #if defined OBJ_ELF
11596         if (cpu_variant & FPU_ARCH_MAVERICK)
11597             flags |= EF_ARM_MAVERICK_FLOAT;
11598         break;
11599
11600       case EF_ARM_EABI_VER4:
11601         /* No additional flags to set.  */
11602         break;
11603
11604       default:
11605         abort ();
11606       }
11607 #endif
11608     bfd_set_private_flags (stdoutput, flags);
11609
11610     /* We have run out flags in the COFF header to encode the
11611        status of ATPCS support, so instead we create a dummy,
11612        empty, debug section called .arm.atpcs.  */
11613     if (atpcs)
11614       {
11615         asection * sec;
11616
11617         sec = bfd_make_section (stdoutput, ".arm.atpcs");
11618
11619         if (sec != NULL)
11620           {
11621             bfd_set_section_flags
11622               (stdoutput, sec, SEC_READONLY | SEC_DEBUGGING /* | SEC_HAS_CONTENTS */);
11623             bfd_set_section_size (stdoutput, sec, 0);
11624             bfd_set_section_contents (stdoutput, sec, NULL, 0, 0);
11625           }
11626       }
11627   }
11628 #endif
11629
11630   /* Record the CPU type as well.  */
11631   switch (cpu_variant & ARM_CPU_MASK)
11632     {
11633     case ARM_2:
11634       mach = bfd_mach_arm_2;
11635       break;
11636
11637     case ARM_3:                 /* Also ARM_250.  */
11638       mach = bfd_mach_arm_2a;
11639       break;
11640
11641     case ARM_6:                 /* Also ARM_7.  */
11642       mach = bfd_mach_arm_3;
11643       break;
11644
11645     default:
11646       mach = bfd_mach_arm_unknown;
11647       break;
11648     }
11649
11650   /* Catch special cases.  */
11651   if (cpu_variant & ARM_CEXT_IWMMXT)
11652     mach = bfd_mach_arm_iWMMXt;
11653   else if (cpu_variant & ARM_CEXT_XSCALE)
11654     mach = bfd_mach_arm_XScale;
11655   else if (cpu_variant & ARM_CEXT_MAVERICK)
11656     mach = bfd_mach_arm_ep9312;
11657   else if (cpu_variant & ARM_EXT_V5E)
11658     mach = bfd_mach_arm_5TE;
11659   else if (cpu_variant & ARM_EXT_V5)
11660     {
11661       if (cpu_variant & ARM_EXT_V4T)
11662         mach = bfd_mach_arm_5T;
11663       else
11664         mach = bfd_mach_arm_5;
11665     }
11666   else if (cpu_variant & ARM_EXT_V4)
11667     {
11668       if (cpu_variant & ARM_EXT_V4T)
11669         mach = bfd_mach_arm_4T;
11670       else
11671         mach = bfd_mach_arm_4;
11672     }
11673   else if (cpu_variant & ARM_EXT_V3M)
11674     mach = bfd_mach_arm_3M;
11675
11676   bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
11677 }
11678
11679 /* Command line processing.  */
11680
11681 /* md_parse_option
11682       Invocation line includes a switch not recognized by the base assembler.
11683       See if it's a processor-specific option.
11684
11685       This routine is somewhat complicated by the need for backwards
11686       compatibility (since older releases of gcc can't be changed).
11687       The new options try to make the interface as compatible as
11688       possible with GCC.
11689
11690       New options (supported) are:
11691
11692               -mcpu=<cpu name>           Assemble for selected processor
11693               -march=<architecture name> Assemble for selected architecture
11694               -mfpu=<fpu architecture>   Assemble for selected FPU.
11695               -EB/-mbig-endian           Big-endian
11696               -EL/-mlittle-endian        Little-endian
11697               -k                         Generate PIC code
11698               -mthumb                    Start in Thumb mode
11699               -mthumb-interwork          Code supports ARM/Thumb interworking
11700
11701       For now we will also provide support for:
11702
11703               -mapcs-32                  32-bit Program counter
11704               -mapcs-26                  26-bit Program counter
11705               -macps-float               Floats passed in FP registers
11706               -mapcs-reentrant           Reentrant code
11707               -matpcs
11708       (sometime these will probably be replaced with -mapcs=<list of options>
11709       and -matpcs=<list of options>)
11710
11711       The remaining options are only supported for back-wards compatibility.
11712       Cpu variants, the arm part is optional:
11713               -m[arm]1                Currently not supported.
11714               -m[arm]2, -m[arm]250    Arm 2 and Arm 250 processor
11715               -m[arm]3                Arm 3 processor
11716               -m[arm]6[xx],           Arm 6 processors
11717               -m[arm]7[xx][t][[d]m]   Arm 7 processors
11718               -m[arm]8[10]            Arm 8 processors
11719               -m[arm]9[20][tdmi]      Arm 9 processors
11720               -mstrongarm[110[0]]     StrongARM processors
11721               -mxscale                XScale processors
11722               -m[arm]v[2345[t[e]]]    Arm architectures
11723               -mall                   All (except the ARM1)
11724       FP variants:
11725               -mfpa10, -mfpa11        FPA10 and 11 co-processor instructions
11726               -mfpe-old               (No float load/store multiples)
11727               -mvfpxd                 VFP Single precision
11728               -mvfp                   All VFP
11729               -mno-fpu                Disable all floating point instructions
11730
11731       The following CPU names are recognized:
11732               arm1, arm2, arm250, arm3, arm6, arm600, arm610, arm620,
11733               arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi, arm70, arm700,
11734               arm700i, arm710 arm710t, arm720, arm720t, arm740t, arm710c,
11735               arm7100, arm7500, arm7500fe, arm7tdmi, arm8, arm810, arm9,
11736               arm920, arm920t, arm940t, arm946, arm966, arm9tdmi, arm9e,
11737               arm10t arm10e, arm1020t, arm1020e, arm10200e,
11738               strongarm, strongarm110, strongarm1100, strongarm1110, xscale.
11739
11740       */
11741
11742 const char * md_shortopts = "m:k";
11743
11744 #ifdef ARM_BI_ENDIAN
11745 #define OPTION_EB (OPTION_MD_BASE + 0)
11746 #define OPTION_EL (OPTION_MD_BASE + 1)
11747 #else
11748 #if TARGET_BYTES_BIG_ENDIAN
11749 #define OPTION_EB (OPTION_MD_BASE + 0)
11750 #else
11751 #define OPTION_EL (OPTION_MD_BASE + 1)
11752 #endif
11753 #endif
11754
11755 struct option md_longopts[] =
11756 {
11757 #ifdef OPTION_EB
11758   {"EB", no_argument, NULL, OPTION_EB},
11759 #endif
11760 #ifdef OPTION_EL
11761   {"EL", no_argument, NULL, OPTION_EL},
11762 #endif
11763   {NULL, no_argument, NULL, 0}
11764 };
11765
11766 size_t md_longopts_size = sizeof (md_longopts);
11767
11768 struct arm_option_table
11769 {
11770   char *option;         /* Option name to match.  */
11771   char *help;           /* Help information.  */
11772   int  *var;            /* Variable to change.  */
11773   int   value;          /* What to change it to.  */
11774   char *deprecated;     /* If non-null, print this message.  */
11775 };
11776
11777 struct arm_option_table arm_opts[] =
11778 {
11779   {"k",      N_("generate PIC code"),      &pic_code,    1, NULL},
11780   {"mthumb", N_("assemble Thumb code"),    &thumb_mode,  1, NULL},
11781   {"mthumb-interwork", N_("support ARM/Thumb interworking"),
11782    &support_interwork, 1, NULL},
11783   {"mapcs-32", N_("code uses 32-bit program counter"), &uses_apcs_26, 0, NULL},
11784   {"mapcs-26", N_("code uses 26-bit program counter"), &uses_apcs_26, 1, NULL},
11785   {"mapcs-float", N_("floating point args are in fp regs"), &uses_apcs_float,
11786    1, NULL},
11787   {"mapcs-reentrant", N_("re-entrant code"), &pic_code, 1, NULL},
11788   {"matpcs", N_("code is ATPCS conformant"), &atpcs, 1, NULL},
11789   {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
11790   {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
11791    NULL},
11792
11793   /* These are recognized by the assembler, but have no affect on code.  */
11794   {"mapcs-frame", N_("use frame pointer"), NULL, 0, NULL},
11795   {"mapcs-stack-check", N_("use stack size checking"), NULL, 0, NULL},
11796
11797   /* DON'T add any new processors to this list -- we want the whole list
11798      to go away...  Add them to the processors table instead.  */
11799   {"marm1",      NULL, &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
11800   {"m1",         NULL, &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
11801   {"marm2",      NULL, &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
11802   {"m2",         NULL, &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
11803   {"marm250",    NULL, &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
11804   {"m250",       NULL, &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
11805   {"marm3",      NULL, &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
11806   {"m3",         NULL, &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
11807   {"marm6",      NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
11808   {"m6",         NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
11809   {"marm600",    NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
11810   {"m600",       NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
11811   {"marm610",    NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
11812   {"m610",       NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
11813   {"marm620",    NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
11814   {"m620",       NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
11815   {"marm7",      NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
11816   {"m7",         NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
11817   {"marm70",     NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
11818   {"m70",        NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
11819   {"marm700",    NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
11820   {"m700",       NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
11821   {"marm700i",   NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
11822   {"m700i",      NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
11823   {"marm710",    NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
11824   {"m710",       NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
11825   {"marm710c",   NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
11826   {"m710c",      NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
11827   {"marm720",    NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
11828   {"m720",       NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
11829   {"marm7d",     NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
11830   {"m7d",        NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
11831   {"marm7di",    NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
11832   {"m7di",       NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
11833   {"marm7m",     NULL, &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
11834   {"m7m",        NULL, &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
11835   {"marm7dm",    NULL, &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
11836   {"m7dm",       NULL, &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
11837   {"marm7dmi",   NULL, &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
11838   {"m7dmi",      NULL, &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
11839   {"marm7100",   NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
11840   {"m7100",      NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
11841   {"marm7500",   NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
11842   {"m7500",      NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
11843   {"marm7500fe", NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
11844   {"m7500fe",    NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
11845   {"marm7t",     NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
11846   {"m7t",        NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
11847   {"marm7tdmi",  NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
11848   {"m7tdmi",     NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
11849   {"marm710t",   NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
11850   {"m710t",      NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
11851   {"marm720t",   NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
11852   {"m720t",      NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
11853   {"marm740t",   NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
11854   {"m740t",      NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
11855   {"marm8",      NULL, &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
11856   {"m8",         NULL, &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
11857   {"marm810",    NULL, &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
11858   {"m810",       NULL, &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
11859   {"marm9",      NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
11860   {"m9",         NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
11861   {"marm9tdmi",  NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
11862   {"m9tdmi",     NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
11863   {"marm920",    NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
11864   {"m920",       NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
11865   {"marm940",    NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
11866   {"m940",       NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
11867   {"mstrongarm", NULL, &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=strongarm")},
11868   {"mstrongarm110", NULL, &legacy_cpu, ARM_ARCH_V4,
11869    N_("use -mcpu=strongarm110")},
11870   {"mstrongarm1100", NULL, &legacy_cpu, ARM_ARCH_V4,
11871    N_("use -mcpu=strongarm1100")},
11872   {"mstrongarm1110", NULL, &legacy_cpu, ARM_ARCH_V4,
11873    N_("use -mcpu=strongarm1110")},
11874   {"mxscale",    NULL, &legacy_cpu, ARM_ARCH_XSCALE, N_("use -mcpu=xscale")},
11875   {"miwmmxt",    NULL, &legacy_cpu, ARM_ARCH_IWMMXT, N_("use -mcpu=iwmmxt")},
11876   {"mall",       NULL, &legacy_cpu, ARM_ANY,      N_("use -mcpu=all")},
11877
11878   /* Architecture variants -- don't add any more to this list either.  */
11879   {"mv2",        NULL, &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
11880   {"marmv2",     NULL, &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
11881   {"mv2a",       NULL, &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
11882   {"marmv2a",    NULL, &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
11883   {"mv3",        NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
11884   {"marmv3",     NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
11885   {"mv3m",       NULL, &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
11886   {"marmv3m",    NULL, &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
11887   {"mv4",        NULL, &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
11888   {"marmv4",     NULL, &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
11889   {"mv4t",       NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
11890   {"marmv4t",    NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
11891   {"mv5",        NULL, &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
11892   {"marmv5",     NULL, &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
11893   {"mv5t",       NULL, &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
11894   {"marmv5t",    NULL, &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
11895   {"mv5e",       NULL, &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
11896   {"marmv5e",    NULL, &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
11897
11898   /* Floating point variants -- don't add any more to this list either.  */
11899   {"mfpe-old", NULL, &legacy_fpu, FPU_ARCH_FPE, N_("use -mfpu=fpe")},
11900   {"mfpa10",   NULL, &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa10")},
11901   {"mfpa11",   NULL, &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa11")},
11902   {"mno-fpu",  NULL, &legacy_fpu, 0,
11903    N_("use either -mfpu=softfpa or -mfpu=softvfp")},
11904
11905   {NULL, NULL, NULL, 0, NULL}
11906 };
11907
11908 struct arm_cpu_option_table
11909 {
11910   char *name;
11911   int   value;
11912   /* For some CPUs we assume an FPU unless the user explicitly sets
11913      -mfpu=...  */
11914   int   default_fpu;
11915 };
11916
11917 /* This list should, at a minimum, contain all the cpu names
11918    recognized by GCC.  */
11919 static struct arm_cpu_option_table arm_cpus[] =
11920 {
11921   {"all",               ARM_ANY,         FPU_ARCH_FPA},
11922   {"arm1",              ARM_ARCH_V1,     FPU_ARCH_FPA},
11923   {"arm2",              ARM_ARCH_V2,     FPU_ARCH_FPA},
11924   {"arm250",            ARM_ARCH_V2S,    FPU_ARCH_FPA},
11925   {"arm3",              ARM_ARCH_V2S,    FPU_ARCH_FPA},
11926   {"arm6",              ARM_ARCH_V3,     FPU_ARCH_FPA},
11927   {"arm60",             ARM_ARCH_V3,     FPU_ARCH_FPA},
11928   {"arm600",            ARM_ARCH_V3,     FPU_ARCH_FPA},
11929   {"arm610",            ARM_ARCH_V3,     FPU_ARCH_FPA},
11930   {"arm620",            ARM_ARCH_V3,     FPU_ARCH_FPA},
11931   {"arm7",              ARM_ARCH_V3,     FPU_ARCH_FPA},
11932   {"arm7m",             ARM_ARCH_V3M,    FPU_ARCH_FPA},
11933   {"arm7d",             ARM_ARCH_V3,     FPU_ARCH_FPA},
11934   {"arm7dm",            ARM_ARCH_V3M,    FPU_ARCH_FPA},
11935   {"arm7di",            ARM_ARCH_V3,     FPU_ARCH_FPA},
11936   {"arm7dmi",           ARM_ARCH_V3M,    FPU_ARCH_FPA},
11937   {"arm70",             ARM_ARCH_V3,     FPU_ARCH_FPA},
11938   {"arm700",            ARM_ARCH_V3,     FPU_ARCH_FPA},
11939   {"arm700i",           ARM_ARCH_V3,     FPU_ARCH_FPA},
11940   {"arm710",            ARM_ARCH_V3,     FPU_ARCH_FPA},
11941   {"arm710t",           ARM_ARCH_V4T,    FPU_ARCH_FPA},
11942   {"arm720",            ARM_ARCH_V3,     FPU_ARCH_FPA},
11943   {"arm720t",           ARM_ARCH_V4T,    FPU_ARCH_FPA},
11944   {"arm740t",           ARM_ARCH_V4T,    FPU_ARCH_FPA},
11945   {"arm710c",           ARM_ARCH_V3,     FPU_ARCH_FPA},
11946   {"arm7100",           ARM_ARCH_V3,     FPU_ARCH_FPA},
11947   {"arm7500",           ARM_ARCH_V3,     FPU_ARCH_FPA},
11948   {"arm7500fe",         ARM_ARCH_V3,     FPU_ARCH_FPA},
11949   {"arm7t",             ARM_ARCH_V4T,    FPU_ARCH_FPA},
11950   {"arm7tdmi",          ARM_ARCH_V4T,    FPU_ARCH_FPA},
11951   {"arm7tdmi-s",        ARM_ARCH_V4T,    FPU_ARCH_FPA},
11952   {"arm8",              ARM_ARCH_V4,     FPU_ARCH_FPA},
11953   {"arm810",            ARM_ARCH_V4,     FPU_ARCH_FPA},
11954   {"strongarm",         ARM_ARCH_V4,     FPU_ARCH_FPA},
11955   {"strongarm1",        ARM_ARCH_V4,     FPU_ARCH_FPA},
11956   {"strongarm110",      ARM_ARCH_V4,     FPU_ARCH_FPA},
11957   {"strongarm1100",     ARM_ARCH_V4,     FPU_ARCH_FPA},
11958   {"strongarm1110",     ARM_ARCH_V4,     FPU_ARCH_FPA},
11959   {"arm9",              ARM_ARCH_V4T,    FPU_ARCH_FPA},
11960   {"arm920",            ARM_ARCH_V4T,    FPU_ARCH_FPA},
11961   {"arm920t",           ARM_ARCH_V4T,    FPU_ARCH_FPA},
11962   {"arm922t",           ARM_ARCH_V4T,    FPU_ARCH_FPA},
11963   {"arm940t",           ARM_ARCH_V4T,    FPU_ARCH_FPA},
11964   {"arm9tdmi",          ARM_ARCH_V4T,    FPU_ARCH_FPA},
11965   /* For V5 or later processors we default to using VFP; but the user
11966      should really set the FPU type explicitly.  */
11967   {"arm9e-r0",          ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2},
11968   {"arm9e",             ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2},
11969   {"arm926ej",          ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2},
11970   {"arm926ejs",         ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2},
11971   {"arm926ej-s",        ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2},
11972   {"arm946e-r0",        ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2},
11973   {"arm946e",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2},
11974   {"arm966e-r0",        ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2},
11975   {"arm966e",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2},
11976   {"arm10t",            ARM_ARCH_V5T,    FPU_ARCH_VFP_V1},
11977   {"arm10e",            ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2},
11978   {"arm1020",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2},
11979   {"arm1020t",          ARM_ARCH_V5T,    FPU_ARCH_VFP_V1},
11980   {"arm1020e",          ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2},
11981   {"arm1026ejs",        ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2},
11982   {"arm1026ej-s",       ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2},
11983   {"arm1136js",         ARM_ARCH_V6,     FPU_NONE},
11984   {"arm1136j-s",        ARM_ARCH_V6,     FPU_NONE},
11985   {"arm1136jfs",        ARM_ARCH_V6,     FPU_ARCH_VFP_V2},
11986   {"arm1136jf-s",       ARM_ARCH_V6,     FPU_ARCH_VFP_V2},
11987   {"mpcore",            ARM_ARCH_V6K,    FPU_ARCH_VFP_V2},
11988   {"mpcorenovfp",       ARM_ARCH_V6K,    FPU_NONE},
11989   {"arm1176jz-s",       ARM_ARCH_V6ZK,   FPU_NONE},
11990   {"arm1176jzf-s",      ARM_ARCH_V6ZK,   FPU_ARCH_VFP_V2},
11991   /* ??? XSCALE is really an architecture.  */
11992   {"xscale",            ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2},
11993   /* ??? iwmmxt is not a processor.  */
11994   {"iwmmxt",            ARM_ARCH_IWMMXT, FPU_ARCH_VFP_V2},
11995   {"i80200",            ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2},
11996   /* Maverick */
11997   {"ep9312",            ARM_ARCH_V4T | ARM_CEXT_MAVERICK, FPU_ARCH_MAVERICK},
11998   {NULL, 0, 0}
11999 };
12000
12001 struct arm_arch_option_table
12002 {
12003   char *name;
12004   int   value;
12005   int   default_fpu;
12006 };
12007
12008 /* This list should, at a minimum, contain all the architecture names
12009    recognized by GCC.  */
12010 static struct arm_arch_option_table arm_archs[] =
12011 {
12012   {"all",               ARM_ANY,         FPU_ARCH_FPA},
12013   {"armv1",             ARM_ARCH_V1,     FPU_ARCH_FPA},
12014   {"armv2",             ARM_ARCH_V2,     FPU_ARCH_FPA},
12015   {"armv2a",            ARM_ARCH_V2S,    FPU_ARCH_FPA},
12016   {"armv2s",            ARM_ARCH_V2S,    FPU_ARCH_FPA},
12017   {"armv3",             ARM_ARCH_V3,     FPU_ARCH_FPA},
12018   {"armv3m",            ARM_ARCH_V3M,    FPU_ARCH_FPA},
12019   {"armv4",             ARM_ARCH_V4,     FPU_ARCH_FPA},
12020   {"armv4xm",           ARM_ARCH_V4xM,   FPU_ARCH_FPA},
12021   {"armv4t",            ARM_ARCH_V4T,    FPU_ARCH_FPA},
12022   {"armv4txm",          ARM_ARCH_V4TxM,  FPU_ARCH_FPA},
12023   {"armv5",             ARM_ARCH_V5,     FPU_ARCH_VFP},
12024   {"armv5t",            ARM_ARCH_V5T,    FPU_ARCH_VFP},
12025   {"armv5txm",          ARM_ARCH_V5TxM,  FPU_ARCH_VFP},
12026   {"armv5te",           ARM_ARCH_V5TE,   FPU_ARCH_VFP},
12027   {"armv5texp",         ARM_ARCH_V5TExP, FPU_ARCH_VFP},
12028   {"armv5tej",          ARM_ARCH_V5TEJ,  FPU_ARCH_VFP},
12029   {"armv6",             ARM_ARCH_V6,     FPU_ARCH_VFP},
12030   {"armv6j",            ARM_ARCH_V6,     FPU_ARCH_VFP},
12031   {"armv6k",            ARM_ARCH_V6K,    FPU_ARCH_VFP},
12032   {"armv6z",            ARM_ARCH_V6Z,    FPU_ARCH_VFP},
12033   {"armv6zk",           ARM_ARCH_V6ZK,   FPU_ARCH_VFP},
12034   {"armv6t2",           ARM_ARCH_V6T2,   FPU_ARCH_VFP},
12035   {"armv6kt2",          ARM_ARCH_V6KT2,  FPU_ARCH_VFP},
12036   {"armv6zt2",          ARM_ARCH_V6ZT2,  FPU_ARCH_VFP},
12037   {"armv6zkt2",         ARM_ARCH_V6ZKT2, FPU_ARCH_VFP},
12038   {"xscale",            ARM_ARCH_XSCALE, FPU_ARCH_VFP},
12039   {"iwmmxt",            ARM_ARCH_IWMMXT, FPU_ARCH_VFP},
12040   {NULL, 0, 0}
12041 };
12042
12043 /* ISA extensions in the co-processor space.  */
12044 struct arm_option_value_table
12045 {
12046   char *name;
12047   int value;
12048 };
12049
12050 static struct arm_option_value_table arm_extensions[] =
12051 {
12052   {"maverick",          ARM_CEXT_MAVERICK},
12053   {"xscale",            ARM_CEXT_XSCALE},
12054   {"iwmmxt",            ARM_CEXT_IWMMXT},
12055   {NULL,                0}
12056 };
12057
12058 /* This list should, at a minimum, contain all the fpu names
12059    recognized by GCC.  */
12060 static struct arm_option_value_table arm_fpus[] =
12061 {
12062   {"softfpa",           FPU_NONE},
12063   {"fpe",               FPU_ARCH_FPE},
12064   {"fpe2",              FPU_ARCH_FPE},
12065   {"fpe3",              FPU_ARCH_FPA},  /* Third release supports LFM/SFM.  */
12066   {"fpa",               FPU_ARCH_FPA},
12067   {"fpa10",             FPU_ARCH_FPA},
12068   {"fpa11",             FPU_ARCH_FPA},
12069   {"arm7500fe",         FPU_ARCH_FPA},
12070   {"softvfp",           FPU_ARCH_VFP},
12071   {"softvfp+vfp",       FPU_ARCH_VFP_V2},
12072   {"vfp",               FPU_ARCH_VFP_V2},
12073   {"vfp9",              FPU_ARCH_VFP_V2},
12074   {"vfp10",             FPU_ARCH_VFP_V2},
12075   {"vfp10-r0",          FPU_ARCH_VFP_V1},
12076   {"vfpxd",             FPU_ARCH_VFP_V1xD},
12077   {"arm1020t",          FPU_ARCH_VFP_V1},
12078   {"arm1020e",          FPU_ARCH_VFP_V2},
12079   {"arm1136jfs",        FPU_ARCH_VFP_V2},
12080   {"arm1136jf-s",       FPU_ARCH_VFP_V2},
12081   {"maverick",          FPU_ARCH_MAVERICK},
12082   {NULL, 0}
12083 };
12084
12085 static struct arm_option_value_table arm_float_abis[] =
12086 {
12087   {"hard",      ARM_FLOAT_ABI_HARD},
12088   {"softfp",    ARM_FLOAT_ABI_SOFTFP},
12089   {"soft",      ARM_FLOAT_ABI_SOFT},
12090   {NULL, 0}
12091 };
12092
12093 #ifdef OBJ_ELF
12094 /* We only know how to output GNU and ver 4 (AAELF) formats.  */
12095 static struct arm_option_value_table arm_eabis[] =
12096 {
12097   {"gnu",       EF_ARM_EABI_UNKNOWN},
12098   {"4",         EF_ARM_EABI_VER4},
12099   {NULL, 0}
12100 };
12101 #endif
12102
12103 struct arm_long_option_table
12104 {
12105   char * option;                /* Substring to match.  */
12106   char * help;                  /* Help information.  */
12107   int (* func) (char * subopt); /* Function to decode sub-option.  */
12108   char * deprecated;            /* If non-null, print this message.  */
12109 };
12110
12111 static int
12112 arm_parse_extension (char * str, int * opt_p)
12113 {
12114   while (str != NULL && *str != 0)
12115     {
12116       struct arm_option_value_table * opt;
12117       char * ext;
12118       int optlen;
12119
12120       if (*str != '+')
12121         {
12122           as_bad (_("invalid architectural extension"));
12123           return 0;
12124         }
12125
12126       str++;
12127       ext = strchr (str, '+');
12128
12129       if (ext != NULL)
12130         optlen = ext - str;
12131       else
12132         optlen = strlen (str);
12133
12134       if (optlen == 0)
12135         {
12136           as_bad (_("missing architectural extension"));
12137           return 0;
12138         }
12139
12140       for (opt = arm_extensions; opt->name != NULL; opt++)
12141         if (strncmp (opt->name, str, optlen) == 0)
12142           {
12143             *opt_p |= opt->value;
12144             break;
12145           }
12146
12147       if (opt->name == NULL)
12148         {
12149           as_bad (_("unknown architectural extnsion `%s'"), str);
12150           return 0;
12151         }
12152
12153       str = ext;
12154     };
12155
12156   return 1;
12157 }
12158
12159 static int
12160 arm_parse_cpu (char * str)
12161 {
12162   struct arm_cpu_option_table * opt;
12163   char * ext = strchr (str, '+');
12164   int optlen;
12165
12166   if (ext != NULL)
12167     optlen = ext - str;
12168   else
12169     optlen = strlen (str);
12170
12171   if (optlen == 0)
12172     {
12173       as_bad (_("missing cpu name `%s'"), str);
12174       return 0;
12175     }
12176
12177   for (opt = arm_cpus; opt->name != NULL; opt++)
12178     if (strncmp (opt->name, str, optlen) == 0)
12179       {
12180         mcpu_cpu_opt = opt->value;
12181         mcpu_fpu_opt = opt->default_fpu;
12182
12183         if (ext != NULL)
12184           return arm_parse_extension (ext, &mcpu_cpu_opt);
12185
12186         return 1;
12187       }
12188
12189   as_bad (_("unknown cpu `%s'"), str);
12190   return 0;
12191 }
12192
12193 static int
12194 arm_parse_arch (char * str)
12195 {
12196   struct arm_arch_option_table *opt;
12197   char *ext = strchr (str, '+');
12198   int optlen;
12199
12200   if (ext != NULL)
12201     optlen = ext - str;
12202   else
12203     optlen = strlen (str);
12204
12205   if (optlen == 0)
12206     {
12207       as_bad (_("missing architecture name `%s'"), str);
12208       return 0;
12209     }
12210
12211
12212   for (opt = arm_archs; opt->name != NULL; opt++)
12213     if (streq (opt->name, str))
12214       {
12215         march_cpu_opt = opt->value;
12216         march_fpu_opt = opt->default_fpu;
12217
12218         if (ext != NULL)
12219           return arm_parse_extension (ext, &march_cpu_opt);
12220
12221         return 1;
12222       }
12223
12224   as_bad (_("unknown architecture `%s'\n"), str);
12225   return 0;
12226 }
12227
12228 static int
12229 arm_parse_fpu (char * str)
12230 {
12231   struct arm_option_value_table * opt;
12232
12233   for (opt = arm_fpus; opt->name != NULL; opt++)
12234     if (streq (opt->name, str))
12235       {
12236         mfpu_opt = opt->value;
12237         return 1;
12238       }
12239
12240   as_bad (_("unknown floating point format `%s'\n"), str);
12241   return 0;
12242 }
12243
12244 static int
12245 arm_parse_float_abi (char * str)
12246 {
12247   struct arm_option_value_table * opt;
12248
12249   for (opt = arm_float_abis; opt->name != NULL; opt++)
12250     if (streq (opt->name, str))
12251       {
12252         mfloat_abi_opt = opt->value;
12253         return 1;
12254       }
12255
12256   as_bad (_("unknown floating point abi `%s'\n"), str);
12257   return 0;
12258 }
12259
12260 #ifdef OBJ_ELF
12261 static int
12262 arm_parse_eabi (char * str)
12263 {
12264   struct arm_option_value_table *opt;
12265
12266   for (opt = arm_eabis; opt->name != NULL; opt++)
12267     if (streq (opt->name, str))
12268       {
12269         meabi_flags = opt->value;
12270         return 1;
12271       }
12272   as_bad (_("unknown EABI `%s'\n"), str);
12273   return 0;
12274 }
12275 #endif
12276
12277 struct arm_long_option_table arm_long_opts[] =
12278 {
12279   {"mcpu=", N_("<cpu name>\t  assemble for CPU <cpu name>"),
12280    arm_parse_cpu, NULL},
12281   {"march=", N_("<arch name>\t  assemble for architecture <arch name>"),
12282    arm_parse_arch, NULL},
12283   {"mfpu=", N_("<fpu name>\t  assemble for FPU architecture <fpu name>"),
12284    arm_parse_fpu, NULL},
12285   {"mfloat-abi=", N_("<abi>\t  assemble for floating point ABI <abi>"),
12286    arm_parse_float_abi, NULL},
12287 #ifdef OBJ_ELF
12288   {"meabi=", N_("<ver>\t  assemble for eabi version <ver>"),
12289    arm_parse_eabi, NULL},
12290 #endif
12291   {NULL, NULL, 0, NULL}
12292 };
12293
12294 int
12295 md_parse_option (int c, char * arg)
12296 {
12297   struct arm_option_table *opt;
12298   struct arm_long_option_table *lopt;
12299
12300   switch (c)
12301     {
12302 #ifdef OPTION_EB
12303     case OPTION_EB:
12304       target_big_endian = 1;
12305       break;
12306 #endif
12307
12308 #ifdef OPTION_EL
12309     case OPTION_EL:
12310       target_big_endian = 0;
12311       break;
12312 #endif
12313
12314     case 'a':
12315       /* Listing option.  Just ignore these, we don't support additional
12316          ones.  */
12317       return 0;
12318
12319     default:
12320       for (opt = arm_opts; opt->option != NULL; opt++)
12321         {
12322           if (c == opt->option[0]
12323               && ((arg == NULL && opt->option[1] == 0)
12324                   || streq (arg, opt->option + 1)))
12325             {
12326 #if WARN_DEPRECATED
12327               /* If the option is deprecated, tell the user.  */
12328               if (opt->deprecated != NULL)
12329                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
12330                            arg ? arg : "", _(opt->deprecated));
12331 #endif
12332
12333               if (opt->var != NULL)
12334                 *opt->var = opt->value;
12335
12336               return 1;
12337             }
12338         }
12339
12340       for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
12341         {
12342           /* These options are expected to have an argument.  */
12343           if (c == lopt->option[0]
12344               && arg != NULL
12345               && strncmp (arg, lopt->option + 1,
12346                           strlen (lopt->option + 1)) == 0)
12347             {
12348 #if WARN_DEPRECATED
12349               /* If the option is deprecated, tell the user.  */
12350               if (lopt->deprecated != NULL)
12351                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
12352                            _(lopt->deprecated));
12353 #endif
12354
12355               /* Call the sup-option parser.  */
12356               return lopt->func (arg + strlen (lopt->option) - 1);
12357             }
12358         }
12359
12360       return 0;
12361     }
12362
12363   return 1;
12364 }
12365
12366 void
12367 md_show_usage (FILE * fp)
12368 {
12369   struct arm_option_table *opt;
12370   struct arm_long_option_table *lopt;
12371
12372   fprintf (fp, _(" ARM-specific assembler options:\n"));
12373
12374   for (opt = arm_opts; opt->option != NULL; opt++)
12375     if (opt->help != NULL)
12376       fprintf (fp, "  -%-23s%s\n", opt->option, _(opt->help));
12377
12378   for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
12379     if (lopt->help != NULL)
12380       fprintf (fp, "  -%s%s\n", lopt->option, _(lopt->help));
12381
12382 #ifdef OPTION_EB
12383   fprintf (fp, _("\
12384   -EB                     assemble code for a big-endian cpu\n"));
12385 #endif
12386
12387 #ifdef OPTION_EL
12388   fprintf (fp, _("\
12389   -EL                     assemble code for a little-endian cpu\n"));
12390 #endif
12391 }