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 
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 
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
skip_past_char(char ** str,char c)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
walk_no_bignums(symbolS * sp)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
my_get_expression(expressionS * ep,char ** str,int prefix_mode)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 *
md_atof(int type,char * litP,int * sizeP)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
md_operand(expressionS * expr)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
immediate_for_directive(int * val)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 *
arm_reg_parse_multi(char ** ccp)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
arm_reg_parse(char ** ccp,enum arm_reg_type type)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
parse_reg_list(char ** strp)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
parse_vfp_reg_list(char ** str,unsigned int * pbase,int dp)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
parse_reloc(char ** str)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
insert_reg_alias(char * str,int number,int type)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
create_register_alias(char * newname,char * p)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
s_req(int a ATTRIBUTE_UNUSED)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
s_unreq(int a ATTRIBUTE_UNUSED)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
mapping_state(enum mstate state)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 *
find_real_start(symbolS * symbolP)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
opcode_select(int width)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
s_arm(int ignore ATTRIBUTE_UNUSED)1478 s_arm (int ignore ATTRIBUTE_UNUSED)
1479 {
1480   opcode_select (32);
1481   demand_empty_rest_of_line ();
1482 }
1483 
1484 static void
s_thumb(int ignore ATTRIBUTE_UNUSED)1485 s_thumb (int ignore ATTRIBUTE_UNUSED)
1486 {
1487   opcode_select (16);
1488   demand_empty_rest_of_line ();
1489 }
1490 
1491 static void
s_code(int unused ATTRIBUTE_UNUSED)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
s_force_thumb(int ignore ATTRIBUTE_UNUSED)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
s_thumb_func(int ignore ATTRIBUTE_UNUSED)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
s_thumb_set(int equiv)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
s_syntax(int unused ATTRIBUTE_UNUSED)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
s_align(int unused ATTRIBUTE_UNUSED)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
s_bss(int ignore ATTRIBUTE_UNUSED)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
s_even(int ignore ATTRIBUTE_UNUSED)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 *
find_literal_pool(void)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 *
find_or_make_literal_pool(void)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
add_to_lit_pool(void)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
symbol_locate(symbolS * symbolP,const char * name,segT segment,valueT valu,fragS * frag)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
s_ltorg(int ignored ATTRIBUTE_UNUSED)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
s_arm_elf_cons(int nbytes)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
s_arm_rel31(int ignored ATTRIBUTE_UNUSED)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
s_arm_unwind_fnstart(int ignored ATTRIBUTE_UNUSED)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
s_arm_unwind_handlerdata(int ignored ATTRIBUTE_UNUSED)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
s_arm_unwind_fnend(int ignored ATTRIBUTE_UNUSED)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
s_arm_unwind_cantunwind(int ignored ATTRIBUTE_UNUSED)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
s_arm_unwind_personalityindex(int ignored ATTRIBUTE_UNUSED)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
s_arm_unwind_personality(int ignored ATTRIBUTE_UNUSED)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
s_arm_unwind_save_core(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
s_arm_unwind_save_fpa(int reg)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
s_arm_unwind_save_vfp(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
s_arm_unwind_save_mmxwr(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
s_arm_unwind_save_mmxwcg(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
s_arm_unwind_save(int ignored ATTRIBUTE_UNUSED)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
s_arm_unwind_movsp(int ignored ATTRIBUTE_UNUSED)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
s_arm_unwind_pad(int ignored ATTRIBUTE_UNUSED)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
s_arm_unwind_setfp(int ignored ATTRIBUTE_UNUSED)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
s_arm_unwind_raw(int ignored ATTRIBUTE_UNUSED)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 
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
parse_immediate(char ** str,int * val,int min,int max,bfd_boolean prefix_opt)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
parse_fpa_immediate(char ** str)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
parse_shift(char ** str,int i,enum parse_shift_mode mode)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
parse_shifter_operand(char ** str,int i)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
parse_address(char ** str,int i)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
parse_psr(char ** str)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
parse_cps_flags(char ** str)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
parse_endian_specifier(char ** str)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
parse_ror(char ** str)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
parse_cond(char ** str)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 /* Matcher codes for parse_operands.  */
3495 enum operand_parse_code
3496 {
3497   OP_stop,	/* end of line */
3498 
3499   OP_RR,	/* ARM register */
3500   OP_RRnpc,	/* ARM register, not r15 */
3501   OP_RRnpcb,	/* ARM register, not r15, in square brackets */
3502   OP_RRw,	/* ARM register, not r15, optional trailing ! */
3503   OP_RCP,	/* Coprocessor number */
3504   OP_RCN,	/* Coprocessor register */
3505   OP_RF,	/* FPA register */
3506   OP_RVS,	/* VFP single precision register */
3507   OP_RVD,	/* VFP double precision register */
3508   OP_RVC,	/* VFP control register */
3509   OP_RMF,	/* Maverick F register */
3510   OP_RMD,	/* Maverick D register */
3511   OP_RMFX,	/* Maverick FX register */
3512   OP_RMDX,	/* Maverick DX register */
3513   OP_RMAX,	/* Maverick AX register */
3514   OP_RMDS,	/* Maverick DSPSC register */
3515   OP_RIWR,	/* iWMMXt wR register */
3516   OP_RIWC,	/* iWMMXt wC register */
3517   OP_RIWG,	/* iWMMXt wCG register */
3518   OP_RXA,	/* XScale accumulator register */
3519 
3520   OP_REGLST,	/* ARM register list */
3521   OP_VRSLST,	/* VFP single-precision register list */
3522   OP_VRDLST,	/* VFP double-precision register list */
3523 
3524   OP_I7,	/* immediate value 0 .. 7 */
3525   OP_I15,	/*		   0 .. 15 */
3526   OP_I16,	/*		   1 .. 16 */
3527   OP_I31,	/*		   0 .. 31 */
3528   OP_I31w,	/*		   0 .. 31, optional trailing ! */
3529   OP_I32,	/*		   1 .. 32 */
3530   OP_I63s,	/*		 -64 .. 63 */
3531   OP_I255,	/*		   0 .. 255 */
3532   OP_Iffff,	/*		   0 .. 65535 */
3533 
3534   OP_I4b,	/* immediate, prefix optional, 1 .. 4 */
3535   OP_I7b,	/*			       0 .. 7 */
3536   OP_I15b,	/*			       0 .. 15 */
3537   OP_I31b,	/*			       0 .. 31 */
3538 
3539   OP_SH,	/* shifter operand */
3540   OP_ADDR,	/* Memory address expression (any mode) */
3541   OP_EXP,	/* arbitrary expression */
3542   OP_EXPi,	/* same, with optional immediate prefix */
3543   OP_EXPr,	/* same, with optional relocation suffix */
3544 
3545   OP_CPSF,	/* CPS flags */
3546   OP_ENDI,	/* Endianness specifier */
3547   OP_PSR,	/* CPSR/SPSR mask for msr */
3548   OP_COND,	/* conditional code */
3549 
3550   OP_RRnpc_I0,	/* ARM register or literal 0 */
3551   OP_RR_EXr,	/* ARM register or expression with opt. reloc suff. */
3552   OP_RR_EXi,	/* ARM register or expression with imm prefix */
3553   OP_RF_IF,	/* FPA register or immediate */
3554   OP_RIWR_RIWC, /* iWMMXt R or C reg */
3555 
3556   /* Optional operands.	 */
3557   OP_oI7b,	 /* immediate, prefix optional, 0 .. 7 */
3558   OP_oI31b,	 /*				0 .. 31 */
3559   OP_oIffffb,	 /*				0 .. 65535 */
3560   OP_oI255c,	 /*	  curly-brace enclosed, 0 .. 255 */
3561 
3562   OP_oRR,	 /* ARM register */
3563   OP_oRRnpc,	 /* ARM register, not the PC */
3564   OP_oSHll,	 /* LSL immediate */
3565   OP_oSHar,	 /* ASR immediate */
3566   OP_oSHllar,	 /* LSL or ASR immediate */
3567   OP_oROR,	 /* ROR 0/8/16/24 */
3568 
3569   OP_FIRST_OPTIONAL = OP_oI7b
3570 };
3571 
3572 /* Generic instruction operand parser.	This does no encoding and no
3573    semantic validation; it merely squirrels values away in the inst
3574    structure.  Returns SUCCESS or FAIL depending on whether the
3575    specified grammar matched.  */
3576 static int
parse_operands(char * str,const unsigned char * pattern)3577 parse_operands (char *str, const unsigned char *pattern)
3578 {
3579   unsigned const char *upat = pattern;
3580   char *backtrack_pos = 0;
3581   const char *backtrack_error = 0;
3582   int i, val, backtrack_index = 0;
3583 
3584 #define po_char_or_fail(chr) do {		\
3585   if (skip_past_char (&str, chr) == FAIL)	\
3586     goto bad_args;				\
3587 } while (0)
3588 
3589 #define po_reg_or_fail(regtype) do {			\
3590   val = arm_reg_parse (&str, regtype);			\
3591   if (val == FAIL)					\
3592     {							\
3593       inst.error = _(reg_expected_msgs[regtype]);	\
3594       goto failure;					\
3595     }							\
3596   inst.operands[i].reg = val;				\
3597   inst.operands[i].isreg = 1;				\
3598 } while (0)
3599 
3600 #define po_reg_or_goto(regtype, label) do {	\
3601   val = arm_reg_parse (&str, regtype);		\
3602   if (val == FAIL)				\
3603     goto label;					\
3604 						\
3605   inst.operands[i].reg = val;			\
3606   inst.operands[i].isreg = 1;			\
3607 } while (0)
3608 
3609 #define po_imm_or_fail(min, max, popt) do {			\
3610   if (parse_immediate (&str, &val, min, max, popt) == FAIL)	\
3611     goto failure;						\
3612   inst.operands[i].imm = val;					\
3613 } while (0)
3614 
3615 #define po_misc_or_fail(expr) do {		\
3616   if (expr)					\
3617     goto failure;				\
3618 } while (0)
3619 
3620   skip_whitespace (str);
3621 
3622   for (i = 0; upat[i] != OP_stop; i++)
3623     {
3624       if (upat[i] >= OP_FIRST_OPTIONAL)
3625 	{
3626 	  /* Remember where we are in case we need to backtrack.  */
3627 	  assert (!backtrack_pos);
3628 	  backtrack_pos = str;
3629 	  backtrack_error = inst.error;
3630 	  backtrack_index = i;
3631 	}
3632 
3633       if (i > 0)
3634 	po_char_or_fail (',');
3635 
3636       switch (upat[i])
3637 	{
3638 	  /* Registers */
3639 	case OP_oRRnpc:
3640 	case OP_RRnpc:
3641 	case OP_oRR:
3642 	case OP_RR:    po_reg_or_fail (REG_TYPE_RN);	  break;
3643 	case OP_RCP:   po_reg_or_fail (REG_TYPE_CP);	  break;
3644 	case OP_RCN:   po_reg_or_fail (REG_TYPE_CN);	  break;
3645 	case OP_RF:    po_reg_or_fail (REG_TYPE_FN);	  break;
3646 	case OP_RVS:   po_reg_or_fail (REG_TYPE_VFS);	  break;
3647 	case OP_RVD:   po_reg_or_fail (REG_TYPE_VFD);	  break;
3648 	case OP_RVC:   po_reg_or_fail (REG_TYPE_VFC);	  break;
3649 	case OP_RMF:   po_reg_or_fail (REG_TYPE_MVF);	  break;
3650 	case OP_RMD:   po_reg_or_fail (REG_TYPE_MVD);	  break;
3651 	case OP_RMFX:  po_reg_or_fail (REG_TYPE_MVFX);	  break;
3652 	case OP_RMDX:  po_reg_or_fail (REG_TYPE_MVDX);	  break;
3653 	case OP_RMAX:  po_reg_or_fail (REG_TYPE_MVAX);	  break;
3654 	case OP_RMDS:  po_reg_or_fail (REG_TYPE_DSPSC);	  break;
3655 	case OP_RIWR:  po_reg_or_fail (REG_TYPE_MMXWR);	  break;
3656 	case OP_RIWC:  po_reg_or_fail (REG_TYPE_MMXWC);	  break;
3657 	case OP_RIWG:  po_reg_or_fail (REG_TYPE_MMXWCG);  break;
3658 	case OP_RXA:   po_reg_or_fail (REG_TYPE_XSCALE);  break;
3659 
3660 	case OP_RRnpcb:
3661 	  po_char_or_fail ('[');
3662 	  po_reg_or_fail  (REG_TYPE_RN);
3663 	  po_char_or_fail (']');
3664 	  break;
3665 
3666 	case OP_RRw:
3667 	  po_reg_or_fail (REG_TYPE_RN);
3668 	  if (skip_past_char (&str, '!') == SUCCESS)
3669 	    inst.operands[i].writeback = 1;
3670 	  break;
3671 
3672 	  /* Immediates */
3673 	case OP_I7:	 po_imm_or_fail (  0,	   7, FALSE);	break;
3674 	case OP_I15:	 po_imm_or_fail (  0,	  15, FALSE);	break;
3675 	case OP_I16:	 po_imm_or_fail (  1,	  16, FALSE);	break;
3676 	case OP_I31:	 po_imm_or_fail (  0,	  31, FALSE);	break;
3677 	case OP_I32:	 po_imm_or_fail (  1,	  32, FALSE);	break;
3678 	case OP_I63s:	 po_imm_or_fail (-64,	  63, FALSE);	break;
3679 	case OP_I255:	 po_imm_or_fail (  0,	 255, FALSE);	break;
3680 	case OP_Iffff:	 po_imm_or_fail (  0, 0xffff, FALSE);	break;
3681 
3682 	case OP_I4b:	 po_imm_or_fail (  1,	   4, TRUE);	break;
3683 	case OP_oI7b:
3684 	case OP_I7b:	 po_imm_or_fail (  0,	   7, TRUE);	break;
3685 	case OP_I15b:	 po_imm_or_fail (  0,	  15, TRUE);	break;
3686 	case OP_oI31b:
3687 	case OP_I31b:	 po_imm_or_fail (  0,	  31, TRUE);	break;
3688 	case OP_oIffffb: po_imm_or_fail (  0, 0xffff, TRUE);	break;
3689 
3690 	  /* Immediate variants */
3691 	case OP_oI255c:
3692 	  po_char_or_fail ('{');
3693 	  po_imm_or_fail (0, 255, TRUE);
3694 	  po_char_or_fail ('}');
3695 	  break;
3696 
3697 	case OP_I31w:
3698 	  /* The expression parser chokes on a trailing !, so we have
3699 	     to find it first and zap it.  */
3700 	  {
3701 	    char *s = str;
3702 	    while (*s && *s != ',')
3703 	      s++;
3704 	    if (s[-1] == '!')
3705 	      {
3706 		s[-1] = '\0';
3707 		inst.operands[i].writeback = 1;
3708 	      }
3709 	    po_imm_or_fail (0, 31, TRUE);
3710 	    if (str == s - 1)
3711 	      str = s;
3712 	  }
3713 	  break;
3714 
3715 	  /* Expressions */
3716 	case OP_EXPi:	EXPi:
3717 	  po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
3718 					      GE_OPT_PREFIX));
3719 	  break;
3720 
3721 	case OP_EXP:
3722 	  po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
3723 					      GE_NO_PREFIX));
3724 	  break;
3725 
3726 	case OP_EXPr:	EXPr:
3727 	  po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
3728 					      GE_NO_PREFIX));
3729 	  if (inst.reloc.exp.X_op == O_symbol)
3730 	    {
3731 	      val = parse_reloc (&str);
3732 	      if (val == -1)
3733 		{
3734 		  inst.error = _("unrecognized relocation suffix");
3735 		  goto failure;
3736 		}
3737 	      else if (val != BFD_RELOC_UNUSED)
3738 		{
3739 		  inst.operands[i].imm = val;
3740 		  inst.operands[i].hasreloc = 1;
3741 		}
3742 	    }
3743 	  break;
3744 
3745 	  /* Register or expression */
3746 	case OP_RR_EXr:	  po_reg_or_goto (REG_TYPE_RN, EXPr); break;
3747 	case OP_RR_EXi:	  po_reg_or_goto (REG_TYPE_RN, EXPi); break;
3748 
3749 	  /* Register or immediate */
3750 	case OP_RRnpc_I0: po_reg_or_goto (REG_TYPE_RN, I0);   break;
3751 	I0:		  po_imm_or_fail (0, 0, FALSE);	      break;
3752 
3753 	case OP_RF_IF:    po_reg_or_goto (REG_TYPE_FN, IF);   break;
3754 	IF:
3755 	  if (!is_immediate_prefix (*str))
3756 	    goto bad_args;
3757 	  str++;
3758 	  val = parse_fpa_immediate (&str);
3759 	  if (val == FAIL)
3760 	    goto failure;
3761 	  /* FPA immediates are encoded as registers 8-15.
3762 	     parse_fpa_immediate has already applied the offset.  */
3763 	  inst.operands[i].reg = val;
3764 	  inst.operands[i].isreg = 1;
3765 	  break;
3766 
3767 	  /* Two kinds of register */
3768 	case OP_RIWR_RIWC:
3769 	  {
3770 	    struct reg_entry *rege = arm_reg_parse_multi (&str);
3771 	    if (rege->type != REG_TYPE_MMXWR
3772 		&& rege->type != REG_TYPE_MMXWC
3773 		&& rege->type != REG_TYPE_MMXWCG)
3774 	      {
3775 		inst.error = _("iWMMXt data or control register expected");
3776 		goto failure;
3777 	      }
3778 	    inst.operands[i].reg = rege->number;
3779 	    inst.operands[i].isreg = (rege->type == REG_TYPE_MMXWR);
3780 	  }
3781 	  break;
3782 
3783 	  /* Misc */
3784 	case OP_CPSF:	 val = parse_cps_flags (&str);		break;
3785 	case OP_ENDI:	 val = parse_endian_specifier (&str);	break;
3786 	case OP_oROR:	 val = parse_ror (&str);		break;
3787 	case OP_PSR:	 val = parse_psr (&str);		break;
3788 	case OP_COND:	 val = parse_cond (&str);		break;
3789 
3790 	  /* Register lists */
3791 	case OP_REGLST:
3792 	  val = parse_reg_list (&str);
3793 	  if (*str == '^')
3794 	    {
3795 	      inst.operands[1].writeback = 1;
3796 	      str++;
3797 	    }
3798 	  break;
3799 
3800 	case OP_VRSLST:
3801 	  val = parse_vfp_reg_list (&str, &inst.operands[i].reg, 0);
3802 	  break;
3803 
3804 	case OP_VRDLST:
3805 	  val = parse_vfp_reg_list (&str, &inst.operands[i].reg, 1);
3806 	  break;
3807 
3808 	  /* Addressing modes */
3809 	case OP_ADDR:
3810 	  po_misc_or_fail (parse_address (&str, i));
3811 	  break;
3812 
3813 	case OP_SH:
3814 	  po_misc_or_fail (parse_shifter_operand (&str, i));
3815 	  break;
3816 
3817 	case OP_oSHll:
3818 	  po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_IMMEDIATE));
3819 	  break;
3820 
3821 	case OP_oSHar:
3822 	  po_misc_or_fail (parse_shift (&str, i, SHIFT_ASR_IMMEDIATE));
3823 	  break;
3824 
3825 	case OP_oSHllar:
3826 	  po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_OR_ASR_IMMEDIATE));
3827 	  break;
3828 
3829 	default:
3830 	  as_fatal ("unhandled operand code %d", upat[i]);
3831 	}
3832 
3833       /* Various value-based sanity checks and shared operations.  We
3834 	 do not signal immediate failures for the register constraints;
3835 	 this allows a syntax error to take precedence.	 */
3836       switch (upat[i])
3837 	{
3838 	case OP_oRRnpc:
3839 	case OP_RRnpc:
3840 	case OP_RRnpcb:
3841 	case OP_RRw:
3842 	case OP_RRnpc_I0:
3843 	  if (inst.operands[i].isreg && inst.operands[i].reg == REG_PC)
3844 	    inst.error = BAD_PC;
3845 	  break;
3846 
3847 	case OP_CPSF:
3848 	case OP_ENDI:
3849 	case OP_oROR:
3850 	case OP_PSR:
3851 	case OP_COND:
3852 	case OP_REGLST:
3853 	case OP_VRSLST:
3854 	case OP_VRDLST:
3855 	  if (val == FAIL)
3856 	    goto failure;
3857 	  inst.operands[i].imm = val;
3858 	  break;
3859 
3860 	default:
3861 	  break;
3862 	}
3863 
3864       /* If we get here, this operand was successfully parsed.	*/
3865       inst.operands[i].present = 1;
3866       continue;
3867 
3868     bad_args:
3869       inst.error = BAD_ARGS;
3870 
3871     failure:
3872       if (!backtrack_pos)
3873 	return FAIL;
3874 
3875       /* Do not backtrack over a trailing optional argument that
3876 	 absorbed some text.  We will only fail again, with the
3877 	 'garbage following instruction' error message, which is
3878 	 probably less helpful than the current one.  */
3879       if (backtrack_index == i && backtrack_pos != str
3880 	  && upat[i+1] == OP_stop)
3881 	return FAIL;
3882 
3883       /* Try again, skipping the optional argument at backtrack_pos.  */
3884       str = backtrack_pos;
3885       inst.error = backtrack_error;
3886       inst.operands[backtrack_index].present = 0;
3887       i = backtrack_index;
3888       backtrack_pos = 0;
3889     }
3890 
3891   /* Check that we have parsed all the arguments.  */
3892   if (*str != '\0' && !inst.error)
3893     inst.error = _("garbage following instruction");
3894 
3895   return inst.error ? FAIL : SUCCESS;
3896 }
3897 
3898 #undef po_char_or_fail
3899 #undef po_reg_or_fail
3900 #undef po_reg_or_goto
3901 #undef po_imm_or_fail
3902 
3903 /* Shorthand macro for instruction encoding functions issuing errors.  */
3904 #define constraint(expr, err) do {		\
3905   if (expr)					\
3906     {						\
3907       inst.error = err;				\
3908       return;					\
3909     }						\
3910 } while (0)
3911 
3912 /* Functions for operand encoding.  ARM, then Thumb.  */
3913 
3914 #define rotate_left(v, n) (v << n | v >> (32 - n))
3915 
3916 /* If VAL can be encoded in the immediate field of an ARM instruction,
3917    return the encoded form.  Otherwise, return FAIL.  */
3918 
3919 static unsigned int
encode_arm_immediate(unsigned int val)3920 encode_arm_immediate (unsigned int val)
3921 {
3922   unsigned int a, i;
3923 
3924   for (i = 0; i < 32; i += 2)
3925     if ((a = rotate_left (val, i)) <= 0xff)
3926       return a | (i << 7); /* 12-bit pack: [shift-cnt,const].  */
3927 
3928   return FAIL;
3929 }
3930 
3931 /* If VAL can be encoded in the immediate field of a Thumb32 instruction,
3932    return the encoded form.  Otherwise, return FAIL.  */
3933 static unsigned int
encode_thumb32_immediate(unsigned int val)3934 encode_thumb32_immediate (unsigned int val)
3935 {
3936   unsigned int a, i;
3937 
3938   if (val <= 255)
3939     return val;
3940 
3941   for (i = 0; i < 32; i++)
3942     {
3943       a = rotate_left (val, i);
3944       if (a >= 128 && a <= 255)
3945 	return (a & 0x7f) | (i << 7);
3946     }
3947 
3948   a = val & 0xff;
3949   if (val == ((a << 16) | a))
3950     return 0x100 | a;
3951   if (val == ((a << 24) | (a << 16) | (a << 8) | a))
3952     return 0x300 | a;
3953 
3954   a = val & 0xff00;
3955   if (val == ((a << 16) | a))
3956     return 0x200 | (a >> 8);
3957 
3958   return FAIL;
3959 }
3960 /* Encode a VFP SP register number into inst.instruction.  */
3961 
3962 static void
encode_arm_vfp_sp_reg(int reg,enum vfp_sp_reg_pos pos)3963 encode_arm_vfp_sp_reg (int reg, enum vfp_sp_reg_pos pos)
3964 {
3965   switch (pos)
3966     {
3967     case VFP_REG_Sd:
3968       inst.instruction |= ((reg >> 1) << 12) | ((reg & 1) << 22);
3969       break;
3970 
3971     case VFP_REG_Sn:
3972       inst.instruction |= ((reg >> 1) << 16) | ((reg & 1) << 7);
3973       break;
3974 
3975     case VFP_REG_Sm:
3976       inst.instruction |= ((reg >> 1) << 0) | ((reg & 1) << 5);
3977       break;
3978 
3979     default:
3980       abort ();
3981     }
3982 }
3983 
3984 /* Encode a <shift> in an ARM-format instruction.  The immediate,
3985    if any, is handled by md_apply_fix.	 */
3986 static void
encode_arm_shift(int i)3987 encode_arm_shift (int i)
3988 {
3989   if (inst.operands[i].shift_kind == SHIFT_RRX)
3990     inst.instruction |= SHIFT_ROR << 5;
3991   else
3992     {
3993       inst.instruction |= inst.operands[i].shift_kind << 5;
3994       if (inst.operands[i].immisreg)
3995 	{
3996 	  inst.instruction |= SHIFT_BY_REG;
3997 	  inst.instruction |= inst.operands[i].imm << 8;
3998 	}
3999       else
4000 	inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
4001     }
4002 }
4003 
4004 static void
encode_arm_shifter_operand(int i)4005 encode_arm_shifter_operand (int i)
4006 {
4007   if (inst.operands[i].isreg)
4008     {
4009       inst.instruction |= inst.operands[i].reg;
4010       encode_arm_shift (i);
4011     }
4012   else
4013     inst.instruction |= INST_IMMEDIATE;
4014 }
4015 
4016 /* Subroutine of encode_arm_addr_mode_2 and encode_arm_addr_mode_3.  */
4017 static void
encode_arm_addr_mode_common(int i,bfd_boolean is_t)4018 encode_arm_addr_mode_common (int i, bfd_boolean is_t)
4019 {
4020   assert (inst.operands[i].isreg);
4021   inst.instruction |= inst.operands[i].reg << 16;
4022 
4023   if (inst.operands[i].preind)
4024     {
4025       if (is_t)
4026 	{
4027 	  inst.error = _("instruction does not accept preindexed addressing");
4028 	  return;
4029 	}
4030       inst.instruction |= PRE_INDEX;
4031       if (inst.operands[i].writeback)
4032 	inst.instruction |= WRITE_BACK;
4033 
4034     }
4035   else if (inst.operands[i].postind)
4036     {
4037       assert (inst.operands[i].writeback);
4038       if (is_t)
4039 	inst.instruction |= WRITE_BACK;
4040     }
4041   else /* unindexed - only for coprocessor */
4042     {
4043       inst.error = _("instruction does not accept unindexed addressing");
4044       return;
4045     }
4046 
4047   if (((inst.instruction & WRITE_BACK) || !(inst.instruction & PRE_INDEX))
4048       && (((inst.instruction & 0x000f0000) >> 16)
4049 	  == ((inst.instruction & 0x0000f000) >> 12)))
4050     as_warn ((inst.instruction & LOAD_BIT)
4051 	     ? _("destination register same as write-back base")
4052 	     : _("source register same as write-back base"));
4053 }
4054 
4055 /* inst.operands[i] was set up by parse_address.  Encode it into an
4056    ARM-format mode 2 load or store instruction.	 If is_t is true,
4057    reject forms that cannot be used with a T instruction (i.e. not
4058    post-indexed).  */
4059 static void
encode_arm_addr_mode_2(int i,bfd_boolean is_t)4060 encode_arm_addr_mode_2 (int i, bfd_boolean is_t)
4061 {
4062   encode_arm_addr_mode_common (i, is_t);
4063 
4064   if (inst.operands[i].immisreg)
4065     {
4066       inst.instruction |= INST_IMMEDIATE;  /* yes, this is backwards */
4067       inst.instruction |= inst.operands[i].imm;
4068       if (!inst.operands[i].negative)
4069 	inst.instruction |= INDEX_UP;
4070       if (inst.operands[i].shifted)
4071 	{
4072 	  if (inst.operands[i].shift_kind == SHIFT_RRX)
4073 	    inst.instruction |= SHIFT_ROR << 5;
4074 	  else
4075 	    {
4076 	      inst.instruction |= inst.operands[i].shift_kind << 5;
4077 	      inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
4078 	    }
4079 	}
4080     }
4081   else /* immediate offset in inst.reloc */
4082     {
4083       if (inst.reloc.type == BFD_RELOC_UNUSED)
4084 	inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
4085     }
4086 }
4087 
4088 /* inst.operands[i] was set up by parse_address.  Encode it into an
4089    ARM-format mode 3 load or store instruction.	 Reject forms that
4090    cannot be used with such instructions.  If is_t is true, reject
4091    forms that cannot be used with a T instruction (i.e. not
4092    post-indexed).  */
4093 static void
encode_arm_addr_mode_3(int i,bfd_boolean is_t)4094 encode_arm_addr_mode_3 (int i, bfd_boolean is_t)
4095 {
4096   if (inst.operands[i].immisreg && inst.operands[i].shifted)
4097     {
4098       inst.error = _("instruction does not accept scaled register index");
4099       return;
4100     }
4101 
4102   encode_arm_addr_mode_common (i, is_t);
4103 
4104   if (inst.operands[i].immisreg)
4105     {
4106       inst.instruction |= inst.operands[i].imm;
4107       if (!inst.operands[i].negative)
4108 	inst.instruction |= INDEX_UP;
4109     }
4110   else /* immediate offset in inst.reloc */
4111     {
4112       inst.instruction |= HWOFFSET_IMM;
4113       if (inst.reloc.type == BFD_RELOC_UNUSED)
4114 	inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
4115     }
4116 }
4117 
4118 /* inst.operands[i] was set up by parse_address.  Encode it into an
4119    ARM-format instruction.  Reject all forms which cannot be encoded
4120    into a coprocessor load/store instruction.  If wb_ok is false,
4121    reject use of writeback; if unind_ok is false, reject use of
4122    unindexed addressing.  If reloc_override is not 0, use it instead
4123    of BFD_ARM_CP_OFF_IMM.  */
4124 
4125 static int
encode_arm_cp_address(int i,int wb_ok,int unind_ok,int reloc_override)4126 encode_arm_cp_address (int i, int wb_ok, int unind_ok, int reloc_override)
4127 {
4128   inst.instruction |= inst.operands[i].reg << 16;
4129 
4130   assert (!(inst.operands[i].preind && inst.operands[i].postind));
4131 
4132   if (!inst.operands[i].preind && !inst.operands[i].postind) /* unindexed */
4133     {
4134       assert (!inst.operands[i].writeback);
4135       if (!unind_ok)
4136 	{
4137 	  inst.error = _("instruction does not support unindexed addressing");
4138 	  return FAIL;
4139 	}
4140       inst.instruction |= inst.operands[i].imm;
4141       inst.instruction |= INDEX_UP;
4142       return SUCCESS;
4143     }
4144 
4145   if (inst.operands[i].preind)
4146     inst.instruction |= PRE_INDEX;
4147 
4148   if (inst.operands[i].writeback)
4149     {
4150       if (inst.operands[i].reg == REG_PC)
4151 	{
4152 	  inst.error = _("pc may not be used with write-back");
4153 	  return FAIL;
4154 	}
4155       if (!wb_ok)
4156 	{
4157 	  inst.error = _("instruction does not support writeback");
4158 	  return FAIL;
4159 	}
4160       inst.instruction |= WRITE_BACK;
4161     }
4162 
4163   if (reloc_override)
4164     inst.reloc.type = reloc_override;
4165   else
4166     inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
4167   return SUCCESS;
4168 }
4169 
4170 /* inst.reloc.exp describes an "=expr" load pseudo-operation.
4171    Determine whether it can be performed with a move instruction; if
4172    it can, convert inst.instruction to that move instruction and
4173    return 1; if it can't, convert inst.instruction to a literal-pool
4174    load and return 0.  If this is not a valid thing to do in the
4175    current context, set inst.error and return 1.
4176 
4177    inst.operands[i] describes the destination register.	 */
4178 
4179 static int
move_or_literal_pool(int i,bfd_boolean thumb_p,bfd_boolean mode_3)4180 move_or_literal_pool (int i, bfd_boolean thumb_p, bfd_boolean mode_3)
4181 {
4182   if ((inst.instruction & (thumb_p ? THUMB_LOAD_BIT : LOAD_BIT)) == 0)
4183     {
4184       inst.error = _("invalid pseudo operation");
4185       return 1;
4186     }
4187   if (inst.reloc.exp.X_op != O_constant && inst.reloc.exp.X_op != O_symbol)
4188     {
4189       inst.error = _("constant expression expected");
4190       return 1;
4191     }
4192   if (inst.reloc.exp.X_op == O_constant)
4193     {
4194       if (thumb_p)
4195 	{
4196 	  if ((inst.reloc.exp.X_add_number & ~0xFF) == 0)
4197 	    {
4198 	      /* This can be done with a mov(1) instruction.  */
4199 	      inst.instruction	= T_OPCODE_MOV_I8 | (inst.operands[i].reg << 8);
4200 	      inst.instruction |= inst.reloc.exp.X_add_number;
4201 	      return 1;
4202 	    }
4203 	}
4204       else
4205 	{
4206 	  int value = encode_arm_immediate (inst.reloc.exp.X_add_number);
4207 	  if (value != FAIL)
4208 	    {
4209 	      /* This can be done with a mov instruction.  */
4210 	      inst.instruction &= LITERAL_MASK;
4211 	      inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
4212 	      inst.instruction |= value & 0xfff;
4213 	      return 1;
4214 	    }
4215 
4216 	  value = encode_arm_immediate (~inst.reloc.exp.X_add_number);
4217 	  if (value != FAIL)
4218 	    {
4219 	      /* This can be done with a mvn instruction.  */
4220 	      inst.instruction &= LITERAL_MASK;
4221 	      inst.instruction |= INST_IMMEDIATE | (OPCODE_MVN << DATA_OP_SHIFT);
4222 	      inst.instruction |= value & 0xfff;
4223 	      return 1;
4224 	    }
4225 	}
4226     }
4227 
4228   if (add_to_lit_pool () == FAIL)
4229     {
4230       inst.error = _("literal pool insertion failed");
4231       return 1;
4232     }
4233   inst.operands[1].reg = REG_PC;
4234   inst.operands[1].isreg = 1;
4235   inst.operands[1].preind = 1;
4236   inst.reloc.pc_rel = 1;
4237   inst.reloc.type = (thumb_p
4238 		     ? BFD_RELOC_ARM_THUMB_OFFSET
4239 		     : (mode_3
4240 			? BFD_RELOC_ARM_HWLITERAL
4241 			: BFD_RELOC_ARM_LITERAL));
4242   return 0;
4243 }
4244 
4245 /* Functions for instruction encoding, sorted by subarchitecture.
4246    First some generics; their names are taken from the conventional
4247    bit positions for register arguments in ARM format instructions.  */
4248 
4249 static void
do_noargs(void)4250 do_noargs (void)
4251 {
4252 }
4253 
4254 static void
do_rd(void)4255 do_rd (void)
4256 {
4257   inst.instruction |= inst.operands[0].reg << 12;
4258 }
4259 
4260 static void
do_rd_rm(void)4261 do_rd_rm (void)
4262 {
4263   inst.instruction |= inst.operands[0].reg << 12;
4264   inst.instruction |= inst.operands[1].reg;
4265 }
4266 
4267 static void
do_rd_rn(void)4268 do_rd_rn (void)
4269 {
4270   inst.instruction |= inst.operands[0].reg << 12;
4271   inst.instruction |= inst.operands[1].reg << 16;
4272 }
4273 
4274 static void
do_rn_rd(void)4275 do_rn_rd (void)
4276 {
4277   inst.instruction |= inst.operands[0].reg << 16;
4278   inst.instruction |= inst.operands[1].reg << 12;
4279 }
4280 
4281 static void
do_rd_rm_rn(void)4282 do_rd_rm_rn (void)
4283 {
4284   inst.instruction |= inst.operands[0].reg << 12;
4285   inst.instruction |= inst.operands[1].reg;
4286   inst.instruction |= inst.operands[2].reg << 16;
4287 }
4288 
4289 static void
do_rd_rn_rm(void)4290 do_rd_rn_rm (void)
4291 {
4292   inst.instruction |= inst.operands[0].reg << 12;
4293   inst.instruction |= inst.operands[1].reg << 16;
4294   inst.instruction |= inst.operands[2].reg;
4295 }
4296 
4297 static void
do_rm_rd_rn(void)4298 do_rm_rd_rn (void)
4299 {
4300   inst.instruction |= inst.operands[0].reg;
4301   inst.instruction |= inst.operands[1].reg << 12;
4302   inst.instruction |= inst.operands[2].reg << 16;
4303 }
4304 
4305 static void
do_imm0(void)4306 do_imm0 (void)
4307 {
4308   inst.instruction |= inst.operands[0].imm;
4309 }
4310 
4311 static void
do_rd_cpaddr(void)4312 do_rd_cpaddr (void)
4313 {
4314   inst.instruction |= inst.operands[0].reg << 12;
4315   encode_arm_cp_address (1, TRUE, TRUE, 0);
4316 }
4317 
4318 /* ARM instructions, in alphabetical order by function name (except
4319    that wrapper functions appear immediately after the function they
4320    wrap).  */
4321 
4322 /* This is a pseudo-op of the form "adr rd, label" to be converted
4323    into a relative address of the form "add rd, pc, #label-.-8".  */
4324 
4325 static void
do_adr(void)4326 do_adr (void)
4327 {
4328   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
4329 
4330   /* Frag hacking will turn this into a sub instruction if the offset turns
4331      out to be negative.  */
4332   inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
4333   inst.reloc.pc_rel = 1;
4334   inst.reloc.exp.X_add_number -= 8;
4335 }
4336 
4337 /* This is a pseudo-op of the form "adrl rd, label" to be converted
4338    into a relative address of the form:
4339    add rd, pc, #low(label-.-8)"
4340    add rd, rd, #high(label-.-8)"  */
4341 
4342 static void
do_adrl(void)4343 do_adrl (void)
4344 {
4345   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
4346 
4347   /* Frag hacking will turn this into a sub instruction if the offset turns
4348      out to be negative.  */
4349   inst.reloc.type	       = BFD_RELOC_ARM_ADRL_IMMEDIATE;
4350   inst.reloc.pc_rel	       = 1;
4351   inst.size		       = INSN_SIZE * 2;
4352   inst.reloc.exp.X_add_number -= 8;
4353 }
4354 
4355 static void
do_arit(void)4356 do_arit (void)
4357 {
4358   if (!inst.operands[1].present)
4359     inst.operands[1].reg = inst.operands[0].reg;
4360   inst.instruction |= inst.operands[0].reg << 12;
4361   inst.instruction |= inst.operands[1].reg << 16;
4362   encode_arm_shifter_operand (2);
4363 }
4364 
4365 static void
do_bfc(void)4366 do_bfc (void)
4367 {
4368   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
4369   constraint (msb > 32, _("bit-field extends past end of register"));
4370   /* The instruction encoding stores the LSB and MSB,
4371      not the LSB and width.  */
4372   inst.instruction |= inst.operands[0].reg << 12;
4373   inst.instruction |= inst.operands[1].imm << 7;
4374   inst.instruction |= (msb - 1) << 16;
4375 }
4376 
4377 static void
do_bfi(void)4378 do_bfi (void)
4379 {
4380   unsigned int msb;
4381 
4382   /* #0 in second position is alternative syntax for bfc, which is
4383      the same instruction but with REG_PC in the Rm field.  */
4384   if (!inst.operands[1].isreg)
4385     inst.operands[1].reg = REG_PC;
4386 
4387   msb = inst.operands[2].imm + inst.operands[3].imm;
4388   constraint (msb > 32, _("bit-field extends past end of register"));
4389   /* The instruction encoding stores the LSB and MSB,
4390      not the LSB and width.  */
4391   inst.instruction |= inst.operands[0].reg << 12;
4392   inst.instruction |= inst.operands[1].reg;
4393   inst.instruction |= inst.operands[2].imm << 7;
4394   inst.instruction |= (msb - 1) << 16;
4395 }
4396 
4397 static void
do_bfx(void)4398 do_bfx (void)
4399 {
4400   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
4401 	      _("bit-field extends past end of register"));
4402   inst.instruction |= inst.operands[0].reg << 12;
4403   inst.instruction |= inst.operands[1].reg;
4404   inst.instruction |= inst.operands[2].imm << 7;
4405   inst.instruction |= (inst.operands[3].imm - 1) << 16;
4406 }
4407 
4408 /* ARM V5 breakpoint instruction (argument parse)
4409      BKPT <16 bit unsigned immediate>
4410      Instruction is not conditional.
4411 	The bit pattern given in insns[] has the COND_ALWAYS condition,
4412 	and it is an error if the caller tried to override that.  */
4413 
4414 static void
do_bkpt(void)4415 do_bkpt (void)
4416 {
4417   /* Top 12 of 16 bits to bits 19:8.  */
4418   inst.instruction |= (inst.operands[0].imm & 0xfff0) << 4;
4419 
4420   /* Bottom 4 of 16 bits to bits 3:0.  */
4421   inst.instruction |= inst.operands[0].imm & 0xf;
4422 }
4423 
4424 static void
encode_branch(int default_reloc)4425 encode_branch (int default_reloc)
4426 {
4427   if (inst.operands[0].hasreloc)
4428     {
4429       constraint (inst.operands[0].imm != BFD_RELOC_ARM_PLT32,
4430 		  _("the only suffix valid here is '(plt)'"));
4431       inst.reloc.type	= BFD_RELOC_ARM_PLT32;
4432     }
4433   else
4434     {
4435       inst.reloc.type = default_reloc;
4436     }
4437   inst.reloc.pc_rel = 1;
4438 }
4439 
4440 static void
do_branch(void)4441 do_branch (void)
4442 {
4443   encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
4444 }
4445 
4446 /* ARM V5 branch-link-exchange instruction (argument parse)
4447      BLX <target_addr>		ie BLX(1)
4448      BLX{<condition>} <Rm>	ie BLX(2)
4449    Unfortunately, there are two different opcodes for this mnemonic.
4450    So, the insns[].value is not used, and the code here zaps values
4451 	into inst.instruction.
4452    Also, the <target_addr> can be 25 bits, hence has its own reloc.  */
4453 
4454 static void
do_blx(void)4455 do_blx (void)
4456 {
4457   if (inst.operands[0].isreg)
4458     {
4459       /* Arg is a register; the opcode provided by insns[] is correct.
4460 	 It is not illegal to do "blx pc", just useless.  */
4461       if (inst.operands[0].reg == REG_PC)
4462 	as_tsktsk (_("use of r15 in blx in ARM mode is not really useful"));
4463 
4464       inst.instruction |= inst.operands[0].reg;
4465     }
4466   else
4467     {
4468       /* Arg is an address; this instruction cannot be executed
4469 	 conditionally, and the opcode must be adjusted.  */
4470       constraint (inst.cond != COND_ALWAYS, BAD_COND);
4471       inst.instruction = 0xfa000000;
4472       encode_branch (BFD_RELOC_ARM_PCREL_BLX);
4473     }
4474 }
4475 
4476 static void
do_bx(void)4477 do_bx (void)
4478 {
4479   if (inst.operands[0].reg == REG_PC)
4480     as_tsktsk (_("use of r15 in bx in ARM mode is not really useful"));
4481 
4482   inst.instruction |= inst.operands[0].reg;
4483 }
4484 
4485 
4486 /* ARM v5TEJ.  Jump to Jazelle code.  */
4487 
4488 static void
do_bxj(void)4489 do_bxj (void)
4490 {
4491   if (inst.operands[0].reg == REG_PC)
4492     as_tsktsk (_("use of r15 in bxj is not really useful"));
4493 
4494   inst.instruction |= inst.operands[0].reg;
4495 }
4496 
4497 /* Co-processor data operation:
4498       CDP{cond} <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}
4499       CDP2	<coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}	 */
4500 static void
do_cdp(void)4501 do_cdp (void)
4502 {
4503   inst.instruction |= inst.operands[0].reg << 8;
4504   inst.instruction |= inst.operands[1].imm << 20;
4505   inst.instruction |= inst.operands[2].reg << 12;
4506   inst.instruction |= inst.operands[3].reg << 16;
4507   inst.instruction |= inst.operands[4].reg;
4508   inst.instruction |= inst.operands[5].imm << 5;
4509 }
4510 
4511 static void
do_cmp(void)4512 do_cmp (void)
4513 {
4514   inst.instruction |= inst.operands[0].reg << 16;
4515   encode_arm_shifter_operand (1);
4516 }
4517 
4518 /* Transfer between coprocessor and ARM registers.
4519    MRC{cond} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
4520    MRC2
4521    MCR{cond}
4522    MCR2
4523 
4524    No special properties.  */
4525 
4526 static void
do_co_reg(void)4527 do_co_reg (void)
4528 {
4529   inst.instruction |= inst.operands[0].reg << 8;
4530   inst.instruction |= inst.operands[1].imm << 21;
4531   inst.instruction |= inst.operands[2].reg << 12;
4532   inst.instruction |= inst.operands[3].reg << 16;
4533   inst.instruction |= inst.operands[4].reg;
4534   inst.instruction |= inst.operands[5].imm << 5;
4535 }
4536 
4537 /* Transfer between coprocessor register and pair of ARM registers.
4538    MCRR{cond} <coproc>, <opcode>, <Rd>, <Rn>, <CRm>.
4539    MCRR2
4540    MRRC{cond}
4541    MRRC2
4542 
4543    Two XScale instructions are special cases of these:
4544 
4545      MAR{cond} acc0, <RdLo>, <RdHi> == MCRR{cond} p0, #0, <RdLo>, <RdHi>, c0
4546      MRA{cond} acc0, <RdLo>, <RdHi> == MRRC{cond} p0, #0, <RdLo>, <RdHi>, c0
4547 
4548    Result unpredicatable if Rd or Rn is R15.  */
4549 
4550 static void
do_co_reg2c(void)4551 do_co_reg2c (void)
4552 {
4553   inst.instruction |= inst.operands[0].reg << 8;
4554   inst.instruction |= inst.operands[1].imm << 4;
4555   inst.instruction |= inst.operands[2].reg << 12;
4556   inst.instruction |= inst.operands[3].reg << 16;
4557   inst.instruction |= inst.operands[4].reg;
4558 }
4559 
4560 static void
do_cpsi(void)4561 do_cpsi (void)
4562 {
4563   inst.instruction |= inst.operands[0].imm << 6;
4564   inst.instruction |= inst.operands[1].imm;
4565 }
4566 
4567 static void
do_it(void)4568 do_it (void)
4569 {
4570   /* There is no IT instruction in ARM mode.  We
4571      process it but do not generate code for it.  */
4572   inst.size = 0;
4573 }
4574 
4575 static void
do_ldmstm(void)4576 do_ldmstm (void)
4577 {
4578   int base_reg = inst.operands[0].reg;
4579   int range = inst.operands[1].imm;
4580 
4581   inst.instruction |= base_reg << 16;
4582   inst.instruction |= range;
4583 
4584   if (inst.operands[1].writeback)
4585     inst.instruction |= LDM_TYPE_2_OR_3;
4586 
4587   if (inst.operands[0].writeback)
4588     {
4589       inst.instruction |= WRITE_BACK;
4590       /* Check for unpredictable uses of writeback.  */
4591       if (inst.instruction & LOAD_BIT)
4592 	{
4593 	  /* Not allowed in LDM type 2.	 */
4594 	  if ((inst.instruction & LDM_TYPE_2_OR_3)
4595 	      && ((range & (1 << REG_PC)) == 0))
4596 	    as_warn (_("writeback of base register is UNPREDICTABLE"));
4597 	  /* Only allowed if base reg not in list for other types.  */
4598 	  else if (range & (1 << base_reg))
4599 	    as_warn (_("writeback of base register when in register list is UNPREDICTABLE"));
4600 	}
4601       else /* STM.  */
4602 	{
4603 	  /* Not allowed for type 2.  */
4604 	  if (inst.instruction & LDM_TYPE_2_OR_3)
4605 	    as_warn (_("writeback of base register is UNPREDICTABLE"));
4606 	  /* Only allowed if base reg not in list, or first in list.  */
4607 	  else if ((range & (1 << base_reg))
4608 		   && (range & ((1 << base_reg) - 1)))
4609 	    as_warn (_("if writeback register is in list, it must be the lowest reg in the list"));
4610 	}
4611     }
4612 }
4613 
4614 /* ARMv5TE load-consecutive (argument parse)
4615    Mode is like LDRH.
4616 
4617      LDRccD R, mode
4618      STRccD R, mode.  */
4619 
4620 static void
do_ldrd(void)4621 do_ldrd (void)
4622 {
4623   constraint (inst.operands[0].reg % 2 != 0,
4624 	      _("first destination register must be even"));
4625   constraint (inst.operands[1].present
4626 	      && inst.operands[1].reg != inst.operands[0].reg + 1,
4627 	      _("can only load two consecutive registers"));
4628   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
4629   constraint (!inst.operands[2].isreg, _("'[' expected"));
4630 
4631   if (!inst.operands[1].present)
4632     inst.operands[1].reg = inst.operands[0].reg + 1;
4633 
4634   if (inst.instruction & LOAD_BIT)
4635     {
4636       /* encode_arm_addr_mode_3 will diagnose overlap between the base
4637 	 register and the first register written; we have to diagnose
4638 	 overlap between the base and the second register written here.	 */
4639 
4640       if (inst.operands[2].reg == inst.operands[1].reg
4641 	  && (inst.operands[2].writeback || inst.operands[2].postind))
4642 	as_warn (_("base register written back, and overlaps "
4643 		   "second destination register"));
4644 
4645       /* For an index-register load, the index register must not overlap the
4646 	 destination (even if not write-back).	*/
4647       else if (inst.operands[2].immisreg
4648 	       && ((unsigned) inst.operands[2].imm == inst.operands[0].reg
4649 		   || (unsigned) inst.operands[2].imm == inst.operands[1].reg))
4650 	as_warn (_("index register overlaps destination register"));
4651     }
4652 
4653   inst.instruction |= inst.operands[0].reg << 12;
4654   encode_arm_addr_mode_3 (2, /*is_t=*/FALSE);
4655 }
4656 
4657 static void
do_ldrex(void)4658 do_ldrex (void)
4659 {
4660   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
4661 	      || inst.operands[1].postind || inst.operands[1].writeback
4662 	      || inst.operands[1].immisreg || inst.operands[1].shifted
4663 	      || inst.operands[1].negative,
4664 	      _("instruction does not accept this addressing mode"));
4665 
4666   constraint (inst.operands[1].reg == REG_PC, BAD_PC);
4667 
4668   constraint (inst.reloc.exp.X_op != O_constant
4669 	      || inst.reloc.exp.X_add_number != 0,
4670 	      _("offset must be zero in ARM encoding"));
4671 
4672   inst.instruction |= inst.operands[0].reg << 12;
4673   inst.instruction |= inst.operands[1].reg << 16;
4674   inst.reloc.type = BFD_RELOC_UNUSED;
4675 }
4676 
4677 static void
do_ldrexd(void)4678 do_ldrexd (void)
4679 {
4680   constraint (inst.operands[0].reg % 2 != 0,
4681 	      _("even register required"));
4682   constraint (inst.operands[1].present
4683 	      && inst.operands[1].reg != inst.operands[0].reg + 1,
4684 	      _("can only load two consecutive registers"));
4685   /* If op 1 were present and equal to PC, this function wouldn't
4686      have been called in the first place.  */
4687   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
4688 
4689   inst.instruction |= inst.operands[0].reg << 12;
4690   inst.instruction |= inst.operands[2].reg << 16;
4691 }
4692 
4693 static void
do_ldst(void)4694 do_ldst (void)
4695 {
4696   inst.instruction |= inst.operands[0].reg << 12;
4697   if (!inst.operands[1].isreg)
4698     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/FALSE))
4699       return;
4700   encode_arm_addr_mode_2 (1, /*is_t=*/FALSE);
4701 }
4702 
4703 static void
do_ldstt(void)4704 do_ldstt (void)
4705 {
4706   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
4707      reject [Rn,...].  */
4708   if (inst.operands[1].preind)
4709     {
4710       constraint (inst.reloc.exp.X_op != O_constant ||
4711 		  inst.reloc.exp.X_add_number != 0,
4712 		  _("this instruction requires a post-indexed address"));
4713 
4714       inst.operands[1].preind = 0;
4715       inst.operands[1].postind = 1;
4716       inst.operands[1].writeback = 1;
4717     }
4718   inst.instruction |= inst.operands[0].reg << 12;
4719   encode_arm_addr_mode_2 (1, /*is_t=*/TRUE);
4720 }
4721 
4722 /* Halfword and signed-byte load/store operations.  */
4723 
4724 static void
do_ldstv4(void)4725 do_ldstv4 (void)
4726 {
4727   inst.instruction |= inst.operands[0].reg << 12;
4728   if (!inst.operands[1].isreg)
4729     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/TRUE))
4730       return;
4731   encode_arm_addr_mode_3 (1, /*is_t=*/FALSE);
4732 }
4733 
4734 static void
do_ldsttv4(void)4735 do_ldsttv4 (void)
4736 {
4737   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
4738      reject [Rn,...].  */
4739   if (inst.operands[1].preind)
4740     {
4741       constraint (inst.reloc.exp.X_op != O_constant ||
4742 		  inst.reloc.exp.X_add_number != 0,
4743 		  _("this instruction requires a post-indexed address"));
4744 
4745       inst.operands[1].preind = 0;
4746       inst.operands[1].postind = 1;
4747       inst.operands[1].writeback = 1;
4748     }
4749   inst.instruction |= inst.operands[0].reg << 12;
4750   encode_arm_addr_mode_3 (1, /*is_t=*/TRUE);
4751 }
4752 
4753 /* Co-processor register load/store.
4754    Format: <LDC|STC>{cond}[L] CP#,CRd,<address>	 */
4755 static void
do_lstc(void)4756 do_lstc (void)
4757 {
4758   inst.instruction |= inst.operands[0].reg << 8;
4759   inst.instruction |= inst.operands[1].reg << 12;
4760   encode_arm_cp_address (2, TRUE, TRUE, 0);
4761 }
4762 
4763 static void
do_mlas(void)4764 do_mlas (void)
4765 {
4766   /* This restriction does not apply to mls (nor to mla in v6, but
4767      that's hard to detect at present).	 */
4768   if (inst.operands[0].reg == inst.operands[1].reg
4769       && !(inst.instruction & 0x00400000))
4770     as_tsktsk (_("rd and rm should be different in mla"));
4771 
4772   inst.instruction |= inst.operands[0].reg << 16;
4773   inst.instruction |= inst.operands[1].reg;
4774   inst.instruction |= inst.operands[2].reg << 8;
4775   inst.instruction |= inst.operands[3].reg << 12;
4776 
4777 }
4778 
4779 static void
do_mov(void)4780 do_mov (void)
4781 {
4782   inst.instruction |= inst.operands[0].reg << 12;
4783   encode_arm_shifter_operand (1);
4784 }
4785 
4786 /* ARM V6T2 16-bit immediate register load: MOV[WT]{cond} Rd, #<imm16>.	 */
4787 static void
do_mov16(void)4788 do_mov16 (void)
4789 {
4790   inst.instruction |= inst.operands[0].reg << 12;
4791   /* The value is in two pieces: 0:11, 16:19.  */
4792   inst.instruction |= (inst.operands[1].imm & 0x00000fff);
4793   inst.instruction |= (inst.operands[1].imm & 0x0000f000) << 4;
4794 }
4795 
4796 static void
do_mrs(void)4797 do_mrs (void)
4798 {
4799   /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all.  */
4800   constraint ((inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f))
4801 	      != (PSR_c|PSR_f),
4802 	      _("'CPSR' or 'SPSR' expected"));
4803   inst.instruction |= inst.operands[0].reg << 12;
4804   inst.instruction |= (inst.operands[1].imm & SPSR_BIT);
4805 }
4806 
4807 /* Two possible forms:
4808       "{C|S}PSR_<field>, Rm",
4809       "{C|S}PSR_f, #expression".  */
4810 
4811 static void
do_msr(void)4812 do_msr (void)
4813 {
4814   inst.instruction |= inst.operands[0].imm;
4815   if (inst.operands[1].isreg)
4816     inst.instruction |= inst.operands[1].reg;
4817   else
4818     {
4819       inst.instruction |= INST_IMMEDIATE;
4820       inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
4821       inst.reloc.pc_rel = 0;
4822     }
4823 }
4824 
4825 static void
do_mul(void)4826 do_mul (void)
4827 {
4828   if (!inst.operands[2].present)
4829     inst.operands[2].reg = inst.operands[0].reg;
4830   inst.instruction |= inst.operands[0].reg << 16;
4831   inst.instruction |= inst.operands[1].reg;
4832   inst.instruction |= inst.operands[2].reg << 8;
4833 
4834   if (inst.operands[0].reg == inst.operands[1].reg)
4835     as_tsktsk (_("rd and rm should be different in mul"));
4836 }
4837 
4838 /* Long Multiply Parser
4839    UMULL RdLo, RdHi, Rm, Rs
4840    SMULL RdLo, RdHi, Rm, Rs
4841    UMLAL RdLo, RdHi, Rm, Rs
4842    SMLAL RdLo, RdHi, Rm, Rs.  */
4843 
4844 static void
do_mull(void)4845 do_mull (void)
4846 {
4847   inst.instruction |= inst.operands[0].reg << 12;
4848   inst.instruction |= inst.operands[1].reg << 16;
4849   inst.instruction |= inst.operands[2].reg;
4850   inst.instruction |= inst.operands[3].reg << 8;
4851 
4852   /* rdhi, rdlo and rm must all be different.  */
4853   if (inst.operands[0].reg == inst.operands[1].reg
4854       || inst.operands[0].reg == inst.operands[2].reg
4855       || inst.operands[1].reg == inst.operands[2].reg)
4856     as_tsktsk (_("rdhi, rdlo and rm must all be different"));
4857 }
4858 
4859 static void
do_nop(void)4860 do_nop (void)
4861 {
4862   if (inst.operands[0].present)
4863     {
4864       /* Architectural NOP hints are CPSR sets with no bits selected.  */
4865       inst.instruction &= 0xf0000000;
4866       inst.instruction |= 0x0320f000 + inst.operands[0].imm;
4867     }
4868 }
4869 
4870 /* ARM V6 Pack Halfword Bottom Top instruction (argument parse).
4871    PKHBT {<cond>} <Rd>, <Rn>, <Rm> {, LSL #<shift_imm>}
4872    Condition defaults to COND_ALWAYS.
4873    Error if Rd, Rn or Rm are R15.  */
4874 
4875 static void
do_pkhbt(void)4876 do_pkhbt (void)
4877 {
4878   inst.instruction |= inst.operands[0].reg << 12;
4879   inst.instruction |= inst.operands[1].reg << 16;
4880   inst.instruction |= inst.operands[2].reg;
4881   if (inst.operands[3].present)
4882     encode_arm_shift (3);
4883 }
4884 
4885 /* ARM V6 PKHTB (Argument Parse).  */
4886 
4887 static void
do_pkhtb(void)4888 do_pkhtb (void)
4889 {
4890   if (!inst.operands[3].present)
4891     {
4892       /* If the shift specifier is omitted, turn the instruction
4893 	 into pkhbt rd, rm, rn. */
4894       inst.instruction &= 0xfff00010;
4895       inst.instruction |= inst.operands[0].reg << 12;
4896       inst.instruction |= inst.operands[1].reg;
4897       inst.instruction |= inst.operands[2].reg << 16;
4898     }
4899   else
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       encode_arm_shift (3);
4905     }
4906 }
4907 
4908 /* ARMv5TE: Preload-Cache
4909 
4910     PLD <addr_mode>
4911 
4912   Syntactically, like LDR with B=1, W=0, L=1.  */
4913 
4914 static void
do_pld(void)4915 do_pld (void)
4916 {
4917   constraint (!inst.operands[0].isreg,
4918 	      _("'[' expected after PLD mnemonic"));
4919   constraint (inst.operands[0].postind,
4920 	      _("post-indexed expression used in preload instruction"));
4921   constraint (inst.operands[0].writeback,
4922 	      _("writeback used in preload instruction"));
4923   constraint (!inst.operands[0].preind,
4924 	      _("unindexed addressing used in preload instruction"));
4925   inst.instruction |= inst.operands[0].reg;
4926   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
4927 }
4928 
4929 static void
do_push_pop(void)4930 do_push_pop (void)
4931 {
4932   inst.operands[1] = inst.operands[0];
4933   memset (&inst.operands[0], 0, sizeof inst.operands[0]);
4934   inst.operands[0].isreg = 1;
4935   inst.operands[0].writeback = 1;
4936   inst.operands[0].reg = REG_SP;
4937   do_ldmstm ();
4938 }
4939 
4940 /* ARM V6 RFE (Return from Exception) loads the PC and CPSR from the
4941    word at the specified address and the following word
4942    respectively.
4943    Unconditionally executed.
4944    Error if Rn is R15.	*/
4945 
4946 static void
do_rfe(void)4947 do_rfe (void)
4948 {
4949   inst.instruction |= inst.operands[0].reg << 16;
4950   if (inst.operands[0].writeback)
4951     inst.instruction |= WRITE_BACK;
4952 }
4953 
4954 /* ARM V6 ssat (argument parse).  */
4955 
4956 static void
do_ssat(void)4957 do_ssat (void)
4958 {
4959   inst.instruction |= inst.operands[0].reg << 12;
4960   inst.instruction |= (inst.operands[1].imm - 1) << 16;
4961   inst.instruction |= inst.operands[2].reg;
4962 
4963   if (inst.operands[3].present)
4964     encode_arm_shift (3);
4965 }
4966 
4967 /* ARM V6 usat (argument parse).  */
4968 
4969 static void
do_usat(void)4970 do_usat (void)
4971 {
4972   inst.instruction |= inst.operands[0].reg << 12;
4973   inst.instruction |= inst.operands[1].imm << 16;
4974   inst.instruction |= inst.operands[2].reg;
4975 
4976   if (inst.operands[3].present)
4977     encode_arm_shift (3);
4978 }
4979 
4980 /* ARM V6 ssat16 (argument parse).  */
4981 
4982 static void
do_ssat16(void)4983 do_ssat16 (void)
4984 {
4985   inst.instruction |= inst.operands[0].reg << 12;
4986   inst.instruction |= ((inst.operands[1].imm - 1) << 16);
4987   inst.instruction |= inst.operands[2].reg;
4988 }
4989 
4990 static void
do_usat16(void)4991 do_usat16 (void)
4992 {
4993   inst.instruction |= inst.operands[0].reg << 12;
4994   inst.instruction |= inst.operands[1].imm << 16;
4995   inst.instruction |= inst.operands[2].reg;
4996 }
4997 
4998 /* ARM V6 SETEND (argument parse).  Sets the E bit in the CPSR while
4999    preserving the other bits.
5000 
5001    setend <endian_specifier>, where <endian_specifier> is either
5002    BE or LE.  */
5003 
5004 static void
do_setend(void)5005 do_setend (void)
5006 {
5007   if (inst.operands[0].imm)
5008     inst.instruction |= 0x200;
5009 }
5010 
5011 static void
do_shift(void)5012 do_shift (void)
5013 {
5014   unsigned int Rm = (inst.operands[1].present
5015 		     ? inst.operands[1].reg
5016 		     : inst.operands[0].reg);
5017 
5018   inst.instruction |= inst.operands[0].reg << 12;
5019   inst.instruction |= Rm;
5020   if (inst.operands[2].isreg)  /* Rd, {Rm,} Rs */
5021     {
5022       constraint (inst.operands[0].reg != Rm,
5023 		  _("source1 and dest must be same register"));
5024       inst.instruction |= inst.operands[2].reg << 8;
5025       inst.instruction |= SHIFT_BY_REG;
5026     }
5027   else
5028     inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
5029 }
5030 
5031 static void
do_smi(void)5032 do_smi (void)
5033 {
5034   inst.reloc.type = BFD_RELOC_ARM_SMI;
5035   inst.reloc.pc_rel = 0;
5036 }
5037 
5038 static void
do_swi(void)5039 do_swi (void)
5040 {
5041   inst.reloc.type = BFD_RELOC_ARM_SWI;
5042   inst.reloc.pc_rel = 0;
5043 }
5044 
5045 /* ARM V5E (El Segundo) signed-multiply-accumulate (argument parse)
5046    SMLAxy{cond} Rd,Rm,Rs,Rn
5047    SMLAWy{cond} Rd,Rm,Rs,Rn
5048    Error if any register is R15.  */
5049 
5050 static void
do_smla(void)5051 do_smla (void)
5052 {
5053   inst.instruction |= inst.operands[0].reg << 16;
5054   inst.instruction |= inst.operands[1].reg;
5055   inst.instruction |= inst.operands[2].reg << 8;
5056   inst.instruction |= inst.operands[3].reg << 12;
5057 }
5058 
5059 /* ARM V5E (El Segundo) signed-multiply-accumulate-long (argument parse)
5060    SMLALxy{cond} Rdlo,Rdhi,Rm,Rs
5061    Error if any register is R15.
5062    Warning if Rdlo == Rdhi.  */
5063 
5064 static void
do_smlal(void)5065 do_smlal (void)
5066 {
5067   inst.instruction |= inst.operands[0].reg << 12;
5068   inst.instruction |= inst.operands[1].reg << 16;
5069   inst.instruction |= inst.operands[2].reg;
5070   inst.instruction |= inst.operands[3].reg << 8;
5071 
5072   if (inst.operands[0].reg == inst.operands[1].reg)
5073     as_tsktsk (_("rdhi and rdlo must be different"));
5074 }
5075 
5076 /* ARM V5E (El Segundo) signed-multiply (argument parse)
5077    SMULxy{cond} Rd,Rm,Rs
5078    Error if any register is R15.  */
5079 
5080 static void
do_smul(void)5081 do_smul (void)
5082 {
5083   inst.instruction |= inst.operands[0].reg << 16;
5084   inst.instruction |= inst.operands[1].reg;
5085   inst.instruction |= inst.operands[2].reg << 8;
5086 }
5087 
5088 /* ARM V6 srs (argument parse).	 */
5089 
5090 static void
do_srs(void)5091 do_srs (void)
5092 {
5093   inst.instruction |= inst.operands[0].imm;
5094   if (inst.operands[0].writeback)
5095     inst.instruction |= WRITE_BACK;
5096 }
5097 
5098 /* ARM V6 strex (argument parse).  */
5099 
5100 static void
do_strex(void)5101 do_strex (void)
5102 {
5103   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
5104 	      || inst.operands[2].postind || inst.operands[2].writeback
5105 	      || inst.operands[2].immisreg || inst.operands[2].shifted
5106 	      || inst.operands[2].negative,
5107 	      _("instruction does not accept this addressing mode"));
5108 
5109   constraint (inst.operands[2].reg == REG_PC, BAD_PC);
5110 
5111   constraint (inst.operands[0].reg == inst.operands[1].reg
5112 	      || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
5113 
5114   constraint (inst.reloc.exp.X_op != O_constant
5115 	      || inst.reloc.exp.X_add_number != 0,
5116 	      _("offset must be zero in ARM encoding"));
5117 
5118   inst.instruction |= inst.operands[0].reg << 12;
5119   inst.instruction |= inst.operands[1].reg;
5120   inst.instruction |= inst.operands[2].reg << 16;
5121   inst.reloc.type = BFD_RELOC_UNUSED;
5122 }
5123 
5124 static void
do_strexd(void)5125 do_strexd (void)
5126 {
5127   constraint (inst.operands[1].reg % 2 != 0,
5128 	      _("even register required"));
5129   constraint (inst.operands[2].present
5130 	      && inst.operands[2].reg != inst.operands[1].reg + 1,
5131 	      _("can only store two consecutive registers"));
5132   /* If op 2 were present and equal to PC, this function wouldn't
5133      have been called in the first place.  */
5134   constraint (inst.operands[1].reg == REG_LR, _("r14 not allowed here"));
5135 
5136   constraint (inst.operands[0].reg == inst.operands[1].reg
5137 	      || inst.operands[0].reg == inst.operands[1].reg + 1
5138 	      || inst.operands[0].reg == inst.operands[3].reg,
5139 	      BAD_OVERLAP);
5140 
5141   inst.instruction |= inst.operands[0].reg << 12;
5142   inst.instruction |= inst.operands[1].reg;
5143   inst.instruction |= inst.operands[3].reg << 16;
5144 }
5145 
5146 /* ARM V6 SXTAH extracts a 16-bit value from a register, sign
5147    extends it to 32-bits, and adds the result to a value in another
5148    register.  You can specify a rotation by 0, 8, 16, or 24 bits
5149    before extracting the 16-bit value.
5150    SXTAH{<cond>} <Rd>, <Rn>, <Rm>{, <rotation>}
5151    Condition defaults to COND_ALWAYS.
5152    Error if any register uses R15.  */
5153 
5154 static void
do_sxtah(void)5155 do_sxtah (void)
5156 {
5157   inst.instruction |= inst.operands[0].reg << 12;
5158   inst.instruction |= inst.operands[1].reg << 16;
5159   inst.instruction |= inst.operands[2].reg;
5160   inst.instruction |= inst.operands[3].imm << 10;
5161 }
5162 
5163 /* ARM V6 SXTH.
5164 
5165    SXTH {<cond>} <Rd>, <Rm>{, <rotation>}
5166    Condition defaults to COND_ALWAYS.
5167    Error if any register uses R15.  */
5168 
5169 static void
do_sxth(void)5170 do_sxth (void)
5171 {
5172   inst.instruction |= inst.operands[0].reg << 12;
5173   inst.instruction |= inst.operands[1].reg;
5174   inst.instruction |= inst.operands[2].imm << 10;
5175 }
5176 
5177 /* VFP instructions.  In a logical order: SP variant first, monad
5178    before dyad, arithmetic then move then load/store.  */
5179 
5180 static void
do_vfp_sp_monadic(void)5181 do_vfp_sp_monadic (void)
5182 {
5183   encode_arm_vfp_sp_reg (inst.operands[0].reg, VFP_REG_Sd);
5184   encode_arm_vfp_sp_reg (inst.operands[1].reg, VFP_REG_Sm);
5185 }
5186 
5187 static void
do_vfp_sp_dyadic(void)5188 do_vfp_sp_dyadic (void)
5189 {
5190   encode_arm_vfp_sp_reg (inst.operands[0].reg, VFP_REG_Sd);
5191   encode_arm_vfp_sp_reg (inst.operands[1].reg, VFP_REG_Sn);
5192   encode_arm_vfp_sp_reg (inst.operands[2].reg, VFP_REG_Sm);
5193 }
5194 
5195 static void
do_vfp_sp_compare_z(void)5196 do_vfp_sp_compare_z (void)
5197 {
5198   encode_arm_vfp_sp_reg (inst.operands[0].reg, VFP_REG_Sd);
5199 }
5200 
5201 static void
do_vfp_dp_sp_cvt(void)5202 do_vfp_dp_sp_cvt (void)
5203 {
5204   inst.instruction |= inst.operands[0].reg << 12;
5205   encode_arm_vfp_sp_reg (inst.operands[1].reg, VFP_REG_Sm);
5206 }
5207 
5208 static void
do_vfp_sp_dp_cvt(void)5209 do_vfp_sp_dp_cvt (void)
5210 {
5211   encode_arm_vfp_sp_reg (inst.operands[0].reg, VFP_REG_Sd);
5212   inst.instruction |= inst.operands[1].reg;
5213 }
5214 
5215 static void
do_vfp_reg_from_sp(void)5216 do_vfp_reg_from_sp (void)
5217 {
5218   inst.instruction |= inst.operands[0].reg << 12;
5219   encode_arm_vfp_sp_reg (inst.operands[1].reg, VFP_REG_Sn);
5220 }
5221 
5222 static void
do_vfp_reg2_from_sp2(void)5223 do_vfp_reg2_from_sp2 (void)
5224 {
5225   constraint (inst.operands[2].imm != 2,
5226 	      _("only two consecutive VFP SP registers allowed here"));
5227   inst.instruction |= inst.operands[0].reg << 12;
5228   inst.instruction |= inst.operands[1].reg << 16;
5229   encode_arm_vfp_sp_reg (inst.operands[2].reg, VFP_REG_Sm);
5230 }
5231 
5232 static void
do_vfp_sp_from_reg(void)5233 do_vfp_sp_from_reg (void)
5234 {
5235   encode_arm_vfp_sp_reg (inst.operands[0].reg, VFP_REG_Sn);
5236   inst.instruction |= inst.operands[1].reg << 12;
5237 }
5238 
5239 static void
do_vfp_sp2_from_reg2(void)5240 do_vfp_sp2_from_reg2 (void)
5241 {
5242   constraint (inst.operands[0].imm != 2,
5243 	      _("only two consecutive VFP SP registers allowed here"));
5244   encode_arm_vfp_sp_reg (inst.operands[0].reg, VFP_REG_Sm);
5245   inst.instruction |= inst.operands[1].reg << 12;
5246   inst.instruction |= inst.operands[2].reg << 16;
5247 }
5248 
5249 static void
do_vfp_sp_ldst(void)5250 do_vfp_sp_ldst (void)
5251 {
5252   encode_arm_vfp_sp_reg (inst.operands[0].reg, VFP_REG_Sd);
5253   encode_arm_cp_address (1, FALSE, TRUE, 0);
5254 }
5255 
5256 static void
do_vfp_dp_ldst(void)5257 do_vfp_dp_ldst (void)
5258 {
5259   inst.instruction |= inst.operands[0].reg << 12;
5260   encode_arm_cp_address (1, FALSE, TRUE, 0);
5261 }
5262 
5263 
5264 static void
vfp_sp_ldstm(enum vfp_ldstm_type ldstm_type)5265 vfp_sp_ldstm (enum vfp_ldstm_type ldstm_type)
5266 {
5267   if (inst.operands[0].writeback)
5268     inst.instruction |= WRITE_BACK;
5269   else
5270     constraint (ldstm_type != VFP_LDSTMIA,
5271 		_("this addressing mode requires base-register writeback"));
5272   inst.instruction |= inst.operands[0].reg << 16;
5273   encode_arm_vfp_sp_reg (inst.operands[1].reg, VFP_REG_Sd);
5274   inst.instruction |= inst.operands[1].imm;
5275 }
5276 
5277 static void
vfp_dp_ldstm(enum vfp_ldstm_type ldstm_type)5278 vfp_dp_ldstm (enum vfp_ldstm_type ldstm_type)
5279 {
5280   int count;
5281 
5282   if (inst.operands[0].writeback)
5283     inst.instruction |= WRITE_BACK;
5284   else
5285     constraint (ldstm_type != VFP_LDSTMIA && ldstm_type != VFP_LDSTMIAX,
5286 		_("this addressing mode requires base-register writeback"));
5287 
5288   inst.instruction |= inst.operands[0].reg << 16;
5289   inst.instruction |= inst.operands[1].reg << 12;
5290 
5291   count = inst.operands[1].imm << 1;
5292   if (ldstm_type == VFP_LDSTMIAX || ldstm_type == VFP_LDSTMDBX)
5293     count += 1;
5294 
5295   inst.instruction |= count;
5296 }
5297 
5298 static void
do_vfp_sp_ldstmia(void)5299 do_vfp_sp_ldstmia (void)
5300 {
5301   vfp_sp_ldstm (VFP_LDSTMIA);
5302 }
5303 
5304 static void
do_vfp_sp_ldstmdb(void)5305 do_vfp_sp_ldstmdb (void)
5306 {
5307   vfp_sp_ldstm (VFP_LDSTMDB);
5308 }
5309 
5310 static void
do_vfp_dp_ldstmia(void)5311 do_vfp_dp_ldstmia (void)
5312 {
5313   vfp_dp_ldstm (VFP_LDSTMIA);
5314 }
5315 
5316 static void
do_vfp_dp_ldstmdb(void)5317 do_vfp_dp_ldstmdb (void)
5318 {
5319   vfp_dp_ldstm (VFP_LDSTMDB);
5320 }
5321 
5322 static void
do_vfp_xp_ldstmia(void)5323 do_vfp_xp_ldstmia (void)
5324 {
5325   vfp_dp_ldstm (VFP_LDSTMIAX);
5326 }
5327 
5328 static void
do_vfp_xp_ldstmdb(void)5329 do_vfp_xp_ldstmdb (void)
5330 {
5331   vfp_dp_ldstm (VFP_LDSTMDBX);
5332 }
5333 
5334 /* FPA instructions.  Also in a logical order.	*/
5335 
5336 static void
do_fpa_cmp(void)5337 do_fpa_cmp (void)
5338 {
5339   inst.instruction |= inst.operands[0].reg << 16;
5340   inst.instruction |= inst.operands[1].reg;
5341 }
5342 
5343 static void
do_fpa_ldmstm(void)5344 do_fpa_ldmstm (void)
5345 {
5346   inst.instruction |= inst.operands[0].reg << 12;
5347   switch (inst.operands[1].imm)
5348     {
5349     case 1: inst.instruction |= CP_T_X;		 break;
5350     case 2: inst.instruction |= CP_T_Y;		 break;
5351     case 3: inst.instruction |= CP_T_Y | CP_T_X; break;
5352     case 4:					 break;
5353     default: abort ();
5354     }
5355 
5356   if (inst.instruction & (PRE_INDEX | INDEX_UP))
5357     {
5358       /* The instruction specified "ea" or "fd", so we can only accept
5359 	 [Rn]{!}.  The instruction does not really support stacking or
5360 	 unstacking, so we have to emulate these by setting appropriate
5361 	 bits and offsets.  */
5362       constraint (inst.reloc.exp.X_op != O_constant
5363 		  || inst.reloc.exp.X_add_number != 0,
5364 		  _("this instruction does not support indexing"));
5365 
5366       if ((inst.instruction & PRE_INDEX) || inst.operands[2].writeback)
5367 	inst.reloc.exp.X_add_number = 12 * inst.operands[1].imm;
5368 
5369       if (!(inst.instruction & INDEX_UP))
5370 	inst.reloc.exp.X_add_number = -inst.reloc.exp.X_add_number;
5371 
5372       if (!(inst.instruction & PRE_INDEX) && inst.operands[2].writeback)
5373 	{
5374 	  inst.operands[2].preind = 0;
5375 	  inst.operands[2].postind = 1;
5376 	}
5377     }
5378 
5379   encode_arm_cp_address (2, TRUE, TRUE, 0);
5380 }
5381 
5382 /* iWMMXt instructions: strictly in alphabetical order.	 */
5383 
5384 static void
do_iwmmxt_tandorc(void)5385 do_iwmmxt_tandorc (void)
5386 {
5387   constraint (inst.operands[0].reg != REG_PC, _("only r15 allowed here"));
5388 }
5389 
5390 static void
do_iwmmxt_textrc(void)5391 do_iwmmxt_textrc (void)
5392 {
5393   inst.instruction |= inst.operands[0].reg << 12;
5394   inst.instruction |= inst.operands[1].imm;
5395 }
5396 
5397 static void
do_iwmmxt_textrm(void)5398 do_iwmmxt_textrm (void)
5399 {
5400   inst.instruction |= inst.operands[0].reg << 12;
5401   inst.instruction |= inst.operands[1].reg << 16;
5402   inst.instruction |= inst.operands[2].imm;
5403 }
5404 
5405 static void
do_iwmmxt_tinsr(void)5406 do_iwmmxt_tinsr (void)
5407 {
5408   inst.instruction |= inst.operands[0].reg << 16;
5409   inst.instruction |= inst.operands[1].reg << 12;
5410   inst.instruction |= inst.operands[2].imm;
5411 }
5412 
5413 static void
do_iwmmxt_tmia(void)5414 do_iwmmxt_tmia (void)
5415 {
5416   inst.instruction |= inst.operands[0].reg << 5;
5417   inst.instruction |= inst.operands[1].reg;
5418   inst.instruction |= inst.operands[2].reg << 12;
5419 }
5420 
5421 static void
do_iwmmxt_waligni(void)5422 do_iwmmxt_waligni (void)
5423 {
5424   inst.instruction |= inst.operands[0].reg << 12;
5425   inst.instruction |= inst.operands[1].reg << 16;
5426   inst.instruction |= inst.operands[2].reg;
5427   inst.instruction |= inst.operands[3].imm << 20;
5428 }
5429 
5430 static void
do_iwmmxt_wmov(void)5431 do_iwmmxt_wmov (void)
5432 {
5433   /* WMOV rD, rN is an alias for WOR rD, rN, rN.  */
5434   inst.instruction |= inst.operands[0].reg << 12;
5435   inst.instruction |= inst.operands[1].reg << 16;
5436   inst.instruction |= inst.operands[1].reg;
5437 }
5438 
5439 static void
do_iwmmxt_wldstbh(void)5440 do_iwmmxt_wldstbh (void)
5441 {
5442   inst.instruction |= inst.operands[0].reg << 12;
5443   inst.reloc.exp.X_add_number *= 4;
5444   encode_arm_cp_address (1, TRUE, FALSE, BFD_RELOC_ARM_CP_OFF_IMM_S2);
5445 }
5446 
5447 static void
do_iwmmxt_wldstw(void)5448 do_iwmmxt_wldstw (void)
5449 {
5450   /* RIWR_RIWC clears .isreg for a control register.  */
5451   if (!inst.operands[0].isreg)
5452     {
5453       constraint (inst.cond != COND_ALWAYS, BAD_COND);
5454       inst.instruction |= 0xf0000000;
5455     }
5456 
5457   inst.instruction |= inst.operands[0].reg << 12;
5458   encode_arm_cp_address (1, TRUE, TRUE, 0);
5459 }
5460 
5461 static void
do_iwmmxt_wldstd(void)5462 do_iwmmxt_wldstd (void)
5463 {
5464   inst.instruction |= inst.operands[0].reg << 12;
5465   encode_arm_cp_address (1, TRUE, FALSE, BFD_RELOC_ARM_CP_OFF_IMM_S2);
5466 }
5467 
5468 static void
do_iwmmxt_wshufh(void)5469 do_iwmmxt_wshufh (void)
5470 {
5471   inst.instruction |= inst.operands[0].reg << 12;
5472   inst.instruction |= inst.operands[1].reg << 16;
5473   inst.instruction |= ((inst.operands[2].imm & 0xf0) << 16);
5474   inst.instruction |= (inst.operands[2].imm & 0x0f);
5475 }
5476 
5477 static void
do_iwmmxt_wzero(void)5478 do_iwmmxt_wzero (void)
5479 {
5480   /* WZERO reg is an alias for WANDN reg, reg, reg.  */
5481   inst.instruction |= inst.operands[0].reg;
5482   inst.instruction |= inst.operands[0].reg << 12;
5483   inst.instruction |= inst.operands[0].reg << 16;
5484 }
5485 
5486 /* Cirrus Maverick instructions.  Simple 2-, 3-, and 4-register
5487    operations first, then control, shift, and load/store.  */
5488 
5489 /* Insns like "foo X,Y,Z".  */
5490 
5491 static void
do_mav_triple(void)5492 do_mav_triple (void)
5493 {
5494   inst.instruction |= inst.operands[0].reg << 16;
5495   inst.instruction |= inst.operands[1].reg;
5496   inst.instruction |= inst.operands[2].reg << 12;
5497 }
5498 
5499 /* Insns like "foo W,X,Y,Z".
5500     where W=MVAX[0:3] and X,Y,Z=MVFX[0:15].  */
5501 
5502 static void
do_mav_quad(void)5503 do_mav_quad (void)
5504 {
5505   inst.instruction |= inst.operands[0].reg << 5;
5506   inst.instruction |= inst.operands[1].reg << 12;
5507   inst.instruction |= inst.operands[2].reg << 16;
5508   inst.instruction |= inst.operands[3].reg;
5509 }
5510 
5511 /* cfmvsc32<cond> DSPSC,MVDX[15:0].  */
5512 static void
do_mav_dspsc(void)5513 do_mav_dspsc (void)
5514 {
5515   inst.instruction |= inst.operands[1].reg << 12;
5516 }
5517 
5518 /* Maverick shift immediate instructions.
5519    cfsh32<cond> MVFX[15:0],MVFX[15:0],Shift[6:0].
5520    cfsh64<cond> MVDX[15:0],MVDX[15:0],Shift[6:0].  */
5521 
5522 static void
do_mav_shift(void)5523 do_mav_shift (void)
5524 {
5525   int imm = inst.operands[2].imm;
5526 
5527   inst.instruction |= inst.operands[0].reg << 12;
5528   inst.instruction |= inst.operands[1].reg << 16;
5529 
5530   /* Bits 0-3 of the insn should have bits 0-3 of the immediate.
5531      Bits 5-7 of the insn should have bits 4-6 of the immediate.
5532      Bit 4 should be 0.	 */
5533   imm = (imm & 0xf) | ((imm & 0x70) << 1);
5534 
5535   inst.instruction |= imm;
5536 }
5537 
5538 /* XScale instructions.	 Also sorted arithmetic before move.  */
5539 
5540 /* Xscale multiply-accumulate (argument parse)
5541      MIAcc   acc0,Rm,Rs
5542      MIAPHcc acc0,Rm,Rs
5543      MIAxycc acc0,Rm,Rs.  */
5544 
5545 static void
do_xsc_mia(void)5546 do_xsc_mia (void)
5547 {
5548   inst.instruction |= inst.operands[1].reg;
5549   inst.instruction |= inst.operands[2].reg << 12;
5550 }
5551 
5552 /* Xscale move-accumulator-register (argument parse)
5553 
5554      MARcc   acc0,RdLo,RdHi.  */
5555 
5556 static void
do_xsc_mar(void)5557 do_xsc_mar (void)
5558 {
5559   inst.instruction |= inst.operands[1].reg << 12;
5560   inst.instruction |= inst.operands[2].reg << 16;
5561 }
5562 
5563 /* Xscale move-register-accumulator (argument parse)
5564 
5565      MRAcc   RdLo,RdHi,acc0.  */
5566 
5567 static void
do_xsc_mra(void)5568 do_xsc_mra (void)
5569 {
5570   constraint (inst.operands[0].reg == inst.operands[1].reg, BAD_OVERLAP);
5571   inst.instruction |= inst.operands[0].reg << 12;
5572   inst.instruction |= inst.operands[1].reg << 16;
5573 }
5574 
5575 /* Encoding functions relevant only to Thumb.  */
5576 
5577 /* inst.operands[i] is a shifted-register operand; encode
5578    it into inst.instruction in the format used by Thumb32.  */
5579 
5580 static void
encode_thumb32_shifted_operand(int i)5581 encode_thumb32_shifted_operand (int i)
5582 {
5583   unsigned int value = inst.reloc.exp.X_add_number;
5584   unsigned int shift = inst.operands[i].shift_kind;
5585 
5586   inst.instruction |= inst.operands[i].reg;
5587   if (shift == SHIFT_RRX)
5588     inst.instruction |= SHIFT_ROR << 4;
5589   else
5590     {
5591       constraint (inst.reloc.exp.X_op != O_constant,
5592 		  _("expression too complex"));
5593 
5594       constraint (value > 32
5595 		  || (value == 32 && (shift == SHIFT_LSL
5596 				      || shift == SHIFT_ROR)),
5597 		  _("shift expression is too large"));
5598 
5599       if (value == 0)
5600 	shift = SHIFT_LSL;
5601       else if (value == 32)
5602 	value = 0;
5603 
5604       inst.instruction |= shift << 4;
5605       inst.instruction |= (value & 0x1c) << 10;
5606       inst.instruction |= (value & 0x03) << 6;
5607     }
5608 }
5609 
5610 
5611 /* inst.operands[i] was set up by parse_address.  Encode it into a
5612    Thumb32 format load or store instruction.  Reject forms that cannot
5613    be used with such instructions.  If is_t is true, reject forms that
5614    cannot be used with a T instruction; if is_d is true, reject forms
5615    that cannot be used with a D instruction.  */
5616 
5617 static void
encode_thumb32_addr_mode(int i,bfd_boolean is_t,bfd_boolean is_d)5618 encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
5619 {
5620   bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
5621 
5622   constraint (!inst.operands[i].isreg,
5623 	      _("Thumb does not support the ldr =N pseudo-operation"));
5624 
5625   inst.instruction |= inst.operands[i].reg << 16;
5626   if (inst.operands[i].immisreg)
5627     {
5628       constraint (is_pc, _("cannot use register index with PC-relative addressing"));
5629       constraint (is_t || is_d, _("cannot use register index with this instruction"));
5630       constraint (inst.operands[i].negative,
5631 		  _("Thumb does not support negative register indexing"));
5632       constraint (inst.operands[i].postind,
5633 		  _("Thumb does not support register post-indexing"));
5634       constraint (inst.operands[i].writeback,
5635 		  _("Thumb does not support register indexing with writeback"));
5636       constraint (inst.operands[i].shifted && inst.operands[i].shift_kind != SHIFT_LSL,
5637 		  _("Thumb supports only LSL in shifted register indexing"));
5638 
5639       inst.instruction |= inst.operands[1].imm;
5640       if (inst.operands[i].shifted)
5641 	{
5642 	  constraint (inst.reloc.exp.X_op != O_constant,
5643 		      _("expression too complex"));
5644 	  constraint (inst.reloc.exp.X_add_number < 0 || inst.reloc.exp.X_add_number > 3,
5645 		      _("shift out of range"));
5646 	  inst.instruction |= inst.reloc.exp.X_op << 4;
5647 	}
5648       inst.reloc.type = BFD_RELOC_UNUSED;
5649     }
5650   else if (inst.operands[i].preind)
5651     {
5652       constraint (is_pc && inst.operands[i].writeback,
5653 		  _("cannot use writeback with PC-relative addressing"));
5654       constraint (is_t && inst.operands[1].writeback,
5655 		  _("cannot use writeback with this instruction"));
5656 
5657       if (is_d)
5658 	{
5659 	  inst.instruction |= 0x01000000;
5660 	  if (inst.operands[i].writeback)
5661 	    inst.instruction |= 0x00200000;
5662 	}
5663       else
5664 	{
5665 	  inst.instruction |= 0x00000c00;
5666 	  if (inst.operands[i].writeback)
5667 	    inst.instruction |= 0x00000100;
5668 	}
5669       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
5670       inst.reloc.pc_rel = is_pc;
5671     }
5672   else if (inst.operands[i].postind)
5673     {
5674       assert (inst.operands[i].writeback);
5675       constraint (is_pc, _("cannot use post-indexing with PC-relative addressing"));
5676       constraint (is_t, _("cannot use post-indexing with this instruction"));
5677 
5678       if (is_d)
5679 	inst.instruction |= 0x00200000;
5680       else
5681 	inst.instruction |= 0x00000900;
5682       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
5683     }
5684   else /* unindexed - only for coprocessor */
5685     inst.error = _("instruction does not accept unindexed addressing");
5686 }
5687 
5688 /* Table of Thumb instructions which exist in both 16- and 32-bit
5689    encodings (the latter only in post-V6T2 cores).  The index is the
5690    value used in the insns table below.  When there is more than one
5691    possible 16-bit encoding for the instruction, this table always
5692    holds variant (1).  */
5693 #define T16_32_TAB				\
5694   X(adc,   4140, eb400000),			\
5695   X(adcs,  4140, eb500000),			\
5696   X(add,   1c00, eb000000),			\
5697   X(adds,  1c00, eb100000),			\
5698   X(and,   4000, ea000000),			\
5699   X(ands,  4000, ea100000),			\
5700   X(asr,   1000, fa40f000),			\
5701   X(asrs,  1000, fa50f000),			\
5702   X(bic,   4380, ea200000),			\
5703   X(bics,  4380, ea300000),			\
5704   X(cmn,   42c0, eb100f00),			\
5705   X(cmp,   2800, ebb00f00),			\
5706   X(cpsie, b660, f3af8400),			\
5707   X(cpsid, b670, f3af8600),			\
5708   X(cpy,   4600, ea4f0000),			\
5709   X(eor,   4040, ea800000),			\
5710   X(eors,  4040, ea900000),			\
5711   X(ldmia, c800, e8900000),			\
5712   X(ldr,   6800, f8500000),			\
5713   X(ldrb,  7800, f8100000),			\
5714   X(ldrh,  8800, f8300000),			\
5715   X(ldrsb, 5600, f9100000),			\
5716   X(ldrsh, 5e00, f9300000),			\
5717   X(lsl,   0000, fa00f000),			\
5718   X(lsls,  0000, fa10f000),			\
5719   X(lsr,   0800, fa20f000),			\
5720   X(lsrs,  0800, fa30f000),			\
5721   X(mov,   2000, ea4f0000),			\
5722   X(movs,  2000, ea5f0000),			\
5723   X(mul,   4340, fb00f000),                     \
5724   X(muls,  4340, ffffffff), /* no 32b muls */	\
5725   X(mvn,   43c0, ea6f0000),			\
5726   X(mvns,  43c0, ea7f0000),			\
5727   X(neg,   4240, f1c00000), /* rsb #0 */	\
5728   X(negs,  4240, f1d00000), /* rsbs #0 */	\
5729   X(orr,   4300, ea400000),			\
5730   X(orrs,  4300, ea500000),			\
5731   X(pop,   bc00, e8ad0000), /* ldmia sp!,... */	\
5732   X(push,  b400, e8bd0000), /* stmia sp!,... */	\
5733   X(rev,   ba00, fa90f080),			\
5734   X(rev16, ba40, fa90f090),			\
5735   X(revsh, bac0, fa90f0b0),			\
5736   X(ror,   41c0, fa60f000),			\
5737   X(rors,  41c0, fa70f000),			\
5738   X(sbc,   4180, eb600000),			\
5739   X(sbcs,  4180, eb700000),			\
5740   X(stmia, c000, e8800000),			\
5741   X(str,   6000, f8400000),			\
5742   X(strb,  7000, f8000000),			\
5743   X(strh,  8000, f8200000),			\
5744   X(sub,   1e00, eba00000),			\
5745   X(subs,  1e00, ebb00000),			\
5746   X(sxtb,  b240, fa4ff080),			\
5747   X(sxth,  b200, fa0ff080),			\
5748   X(tst,   4200, ea100f00),			\
5749   X(uxtb,  b2c0, fa5ff080),			\
5750   X(uxth,  b280, fa1ff080),			\
5751   X(nop,   bf00, f3af8000),			\
5752   X(yield, bf10, f3af8001),			\
5753   X(wfe,   bf20, f3af8002),			\
5754   X(wfi,   bf30, f3af8003),			\
5755   X(sev,   bf40, f3af9004), /* typo, 8004? */
5756 
5757 /* To catch errors in encoding functions, the codes are all offset by
5758    0xF800, putting them in one of the 32-bit prefix ranges, ergo undefined
5759    as 16-bit instructions.  */
5760 #define X(a,b,c) T_MNEM_##a
5761 enum t16_32_codes { T16_32_OFFSET = 0xF7FF, T16_32_TAB };
5762 #undef X
5763 
5764 #define X(a,b,c) 0x##b
5765 static const unsigned short thumb_op16[] = { T16_32_TAB };
5766 #define THUMB_OP16(n) (thumb_op16[(n) - (T16_32_OFFSET + 1)])
5767 #undef X
5768 
5769 #define X(a,b,c) 0x##c
5770 static const unsigned int thumb_op32[] = { T16_32_TAB };
5771 #define THUMB_OP32(n) (thumb_op32[(n) - (T16_32_OFFSET + 1)])
5772 #define THUMB_SETS_FLAGS(n) (THUMB_OP32 (n) & 0x00100000)
5773 #undef X
5774 #undef T16_32_TAB
5775 
5776 /* Thumb instruction encoders, in alphabetical order.  */
5777 
5778 /* Parse an add or subtract instruction.  We get here with inst.instruction
5779    equalling any of THUMB_OPCODE_add, adds, sub, or subs.  */
5780 
5781 static void
do_t_add_sub(void)5782 do_t_add_sub (void)
5783 {
5784   int Rd, Rs, Rn;
5785 
5786   Rd = inst.operands[0].reg;
5787   Rs = (inst.operands[1].present
5788 	? inst.operands[1].reg    /* Rd, Rs, foo */
5789 	: inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
5790 
5791   if (unified_syntax)
5792     {
5793       if (!inst.operands[2].isreg)
5794 	{
5795 	  /* For an immediate, we always generate a 32-bit opcode;
5796 	     section relaxation will shrink it later if possible.  */
5797 	  inst.instruction = THUMB_OP32 (inst.instruction);
5798 	  inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
5799 	  inst.instruction |= inst.operands[0].reg << 8;
5800 	  inst.instruction |= inst.operands[1].reg << 16;
5801 	  inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
5802 	}
5803       else
5804 	{
5805 	  Rn = inst.operands[2].reg;
5806 	  /* See if we can do this with a 16-bit instruction.  */
5807 	  if (!inst.operands[2].shifted && inst.size_req != 4)
5808 	    {
5809 	      if (Rd <= 7 && Rn <= 7 && Rn <= 7
5810 		  && (inst.instruction == T_MNEM_adds
5811 		      || inst.instruction == T_MNEM_subs))
5812 		{
5813 		  inst.instruction = (inst.instruction == T_MNEM_adds
5814 				      ? T_OPCODE_ADD_R3
5815 				      : T_OPCODE_SUB_R3);
5816 		  inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
5817 		  return;
5818 		}
5819 
5820 	      if (inst.instruction == T_MNEM_add)
5821 		{
5822 		  if (Rd == Rs)
5823 		    {
5824 		      inst.instruction = T_OPCODE_ADD_HI;
5825 		      inst.instruction |= (Rd & 8) << 4;
5826 		      inst.instruction |= (Rd & 7);
5827 		      inst.instruction |= Rn << 3;
5828 		      return;
5829 		    }
5830 		  /* ... because addition is commutative! */
5831 		  else if (Rd == Rn)
5832 		    {
5833 		      inst.instruction = T_OPCODE_ADD_HI;
5834 		      inst.instruction |= (Rd & 8) << 4;
5835 		      inst.instruction |= (Rd & 7);
5836 		      inst.instruction |= Rs << 3;
5837 		      return;
5838 		    }
5839 		}
5840 	    }
5841 	  /* If we get here, it can't be done in 16 bits.  */
5842 	  constraint (inst.operands[2].shifted && inst.operands[2].immisreg,
5843 		      _("shift must be constant"));
5844 	  inst.instruction = THUMB_OP32 (inst.instruction);
5845 	  inst.instruction |= Rd << 8;
5846 	  inst.instruction |= Rs << 16;
5847 	  encode_thumb32_shifted_operand (2);
5848 	}
5849     }
5850   else
5851     {
5852       constraint (inst.instruction == T_MNEM_adds
5853 		  || inst.instruction == T_MNEM_subs,
5854 		  BAD_THUMB32);
5855 
5856       if (!inst.operands[2].isreg) /* Rd, Rs, #imm */
5857 	{
5858 	  constraint ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP))
5859 		      || (Rs > 7 && Rs != REG_SP && Rs != REG_PC),
5860 		      BAD_HIREG);
5861 
5862 	  inst.instruction = (inst.instruction == T_MNEM_add
5863 			      ? 0x0000 : 0x8000);
5864 	  inst.instruction |= (Rd << 4) | Rs;
5865 	  inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
5866 	  return;
5867 	}
5868 
5869       Rn = inst.operands[2].reg;
5870       constraint (inst.operands[2].shifted, _("unshifted register required"));
5871 
5872       /* We now have Rd, Rs, and Rn set to registers.  */
5873       if (Rd > 7 || Rs > 7 || Rn > 7)
5874 	{
5875 	  /* Can't do this for SUB.	 */
5876 	  constraint (inst.instruction == T_MNEM_sub, BAD_HIREG);
5877 	  inst.instruction = T_OPCODE_ADD_HI;
5878 	  inst.instruction |= (Rd & 8) << 4;
5879 	  inst.instruction |= (Rd & 7);
5880 	  if (Rs == Rd)
5881 	    inst.instruction |= Rn << 3;
5882 	  else if (Rn == Rd)
5883 	    inst.instruction |= Rs << 3;
5884 	  else
5885 	    constraint (1, _("dest must overlap one source register"));
5886 	}
5887       else
5888 	{
5889 	  inst.instruction = (inst.instruction == T_MNEM_add
5890 			      ? T_OPCODE_ADD_R3 : T_OPCODE_SUB_R3);
5891 	  inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
5892 	}
5893     }
5894 }
5895 
5896 static void
do_t_adr(void)5897 do_t_adr (void)
5898 {
5899   inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
5900   inst.reloc.exp.X_add_number -= 4; /* PC relative adjust.  */
5901   inst.reloc.pc_rel = 1;
5902 
5903   inst.instruction |= inst.operands[0].reg << 4;
5904 }
5905 
5906 /* Arithmetic instructions for which there is just one 16-bit
5907    instruction encoding, and it allows only two low registers.
5908    For maximal compatibility with ARM syntax, we allow three register
5909    operands even when Thumb-32 instructions are not available, as long
5910    as the first two are identical.  For instance, both "sbc r0,r1" and
5911    "sbc r0,r0,r1" are allowed.  */
5912 static void
do_t_arit3(void)5913 do_t_arit3 (void)
5914 {
5915   int Rd, Rs, Rn;
5916 
5917   Rd = inst.operands[0].reg;
5918   Rs = (inst.operands[1].present
5919 	? inst.operands[1].reg    /* Rd, Rs, foo */
5920 	: inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
5921   Rn = inst.operands[2].reg;
5922 
5923   if (unified_syntax)
5924     {
5925       if (!inst.operands[2].isreg)
5926 	{
5927 	  /* For an immediate, we always generate a 32-bit opcode;
5928 	     section relaxation will shrink it later if possible.  */
5929 	  inst.instruction = THUMB_OP32 (inst.instruction);
5930 	  inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
5931 	  inst.instruction |= Rd << 8;
5932 	  inst.instruction |= Rs << 16;
5933 	  inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
5934 	}
5935       else
5936 	{
5937 	  /* See if we can do this with a 16-bit instruction.  */
5938 	  if (THUMB_SETS_FLAGS (inst.instruction)
5939 	      && !inst.operands[2].shifted
5940 	      && inst.size_req != 4
5941 	      && Rd == Rs)
5942 	    {
5943 	      inst.instruction = THUMB_OP16 (inst.instruction);
5944 	      inst.instruction |= Rd;
5945 	      inst.instruction |= Rn << 3;
5946 	      return;
5947 	    }
5948 
5949 	  /* If we get here, it can't be done in 16 bits.  */
5950 	  constraint (inst.operands[2].shifted
5951 		      && inst.operands[2].immisreg,
5952 		      _("shift must be constant"));
5953 	  inst.instruction = THUMB_OP32 (inst.instruction);
5954 	  inst.instruction |= Rd << 8;
5955 	  inst.instruction |= Rs << 16;
5956 	  encode_thumb32_shifted_operand (2);
5957 	}
5958     }
5959   else
5960     {
5961       /* On its face this is a lie - the instruction does set the
5962 	 flags.  However, the only supported mnemonic in this mode
5963 	 says it doesn't.  */
5964       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
5965 
5966       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
5967 		  _("unshifted register required"));
5968       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
5969       constraint (Rd != Rs,
5970 		  _("dest and source1 must be the same register"));
5971 
5972       inst.instruction = THUMB_OP16 (inst.instruction);
5973       inst.instruction |= Rd;
5974       inst.instruction |= Rn << 3;
5975     }
5976 }
5977 
5978 /* Similarly, but for instructions where the arithmetic operation is
5979    commutative, so we can allow either of them to be different from
5980    the destination operand in a 16-bit instruction.  For instance, all
5981    three of "adc r0,r1", "adc r0,r0,r1", and "adc r0,r1,r0" are
5982    accepted.  */
5983 static void
do_t_arit3c(void)5984 do_t_arit3c (void)
5985 {
5986   int Rd, Rs, Rn;
5987 
5988   Rd = inst.operands[0].reg;
5989   Rs = (inst.operands[1].present
5990 	? inst.operands[1].reg    /* Rd, Rs, foo */
5991 	: inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
5992   Rn = inst.operands[2].reg;
5993 
5994   if (unified_syntax)
5995     {
5996       if (!inst.operands[2].isreg)
5997 	{
5998 	  /* For an immediate, we always generate a 32-bit opcode;
5999 	     section relaxation will shrink it later if possible.  */
6000 	  inst.instruction = THUMB_OP32 (inst.instruction);
6001 	  inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
6002 	  inst.instruction |= Rd << 8;
6003 	  inst.instruction |= Rs << 16;
6004 	  inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
6005 	}
6006       else
6007 	{
6008 	  /* See if we can do this with a 16-bit instruction.  */
6009 	  if (THUMB_SETS_FLAGS (inst.instruction)
6010 	      && !inst.operands[2].shifted
6011 	      && inst.size_req != 4)
6012 	    {
6013 	      if (Rd == Rs)
6014 		{
6015 		  inst.instruction = THUMB_OP16 (inst.instruction);
6016 		  inst.instruction |= Rd;
6017 		  inst.instruction |= Rn << 3;
6018 		  return;
6019 		}
6020 	      if (Rd == Rn)
6021 		{
6022 		  inst.instruction = THUMB_OP16 (inst.instruction);
6023 		  inst.instruction |= Rd;
6024 		  inst.instruction |= Rs << 3;
6025 		  return;
6026 		}
6027 	    }
6028 
6029 	  /* If we get here, it can't be done in 16 bits.  */
6030 	  constraint (inst.operands[2].shifted
6031 		      && inst.operands[2].immisreg,
6032 		      _("shift must be constant"));
6033 	  inst.instruction = THUMB_OP32 (inst.instruction);
6034 	  inst.instruction |= Rd << 8;
6035 	  inst.instruction |= Rs << 16;
6036 	  encode_thumb32_shifted_operand (2);
6037 	}
6038     }
6039   else
6040     {
6041       /* On its face this is a lie - the instruction does set the
6042 	 flags.  However, the only supported mnemonic in this mode
6043 	 says it doesn't.  */
6044       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
6045 
6046       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
6047 		  _("unshifted register required"));
6048       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
6049 
6050       inst.instruction = THUMB_OP16 (inst.instruction);
6051       inst.instruction |= Rd;
6052 
6053       if (Rd == Rs)
6054 	inst.instruction |= Rn << 3;
6055       else if (Rd == Rn)
6056 	inst.instruction |= Rs << 3;
6057       else
6058 	constraint (1, _("dest must overlap one source register"));
6059     }
6060 }
6061 
6062 static void
do_t_bfc(void)6063 do_t_bfc (void)
6064 {
6065   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
6066   constraint (msb > 32, _("bit-field extends past end of register"));
6067   /* The instruction encoding stores the LSB and MSB,
6068      not the LSB and width.  */
6069   inst.instruction |= inst.operands[0].reg << 8;
6070   inst.instruction |= (inst.operands[1].imm & 0x1c) << 10;
6071   inst.instruction |= (inst.operands[1].imm & 0x03) << 6;
6072   inst.instruction |= msb - 1;
6073 }
6074 
6075 static void
do_t_bfi(void)6076 do_t_bfi (void)
6077 {
6078   unsigned int msb;
6079 
6080   /* #0 in second position is alternative syntax for bfc, which is
6081      the same instruction but with REG_PC in the Rm field.  */
6082   if (!inst.operands[1].isreg)
6083     inst.operands[1].reg = REG_PC;
6084 
6085   msb = inst.operands[2].imm + inst.operands[3].imm;
6086   constraint (msb > 32, _("bit-field extends past end of register"));
6087   /* The instruction encoding stores the LSB and MSB,
6088      not the LSB and width.  */
6089   inst.instruction |= inst.operands[0].reg << 8;
6090   inst.instruction |= inst.operands[1].reg << 16;
6091   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
6092   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
6093   inst.instruction |= msb - 1;
6094 }
6095 
6096 static void
do_t_bfx(void)6097 do_t_bfx (void)
6098 {
6099   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
6100 	      _("bit-field extends past end of register"));
6101   inst.instruction |= inst.operands[0].reg << 8;
6102   inst.instruction |= inst.operands[1].reg << 16;
6103   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
6104   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
6105   inst.instruction |= inst.operands[3].imm - 1;
6106 }
6107 
6108 /* ARM V5 Thumb BLX (argument parse)
6109 	BLX <target_addr>	which is BLX(1)
6110 	BLX <Rm>		which is BLX(2)
6111    Unfortunately, there are two different opcodes for this mnemonic.
6112    So, the insns[].value is not used, and the code here zaps values
6113 	into inst.instruction.
6114 
6115    ??? How to take advantage of the additional two bits of displacement
6116    available in Thumb32 mode?  Need new relocation?  */
6117 
6118 static void
do_t_blx(void)6119 do_t_blx (void)
6120 {
6121   if (inst.operands[0].isreg)
6122     /* We have a register, so this is BLX(2).  */
6123     inst.instruction |= inst.operands[0].reg << 3;
6124   else
6125     {
6126       /* No register.  This must be BLX(1).  */
6127       inst.instruction = 0xf000e800;
6128       inst.reloc.type	= BFD_RELOC_THUMB_PCREL_BLX;
6129       inst.reloc.pc_rel = 1;
6130     }
6131 }
6132 
6133 static void
do_t_branch(void)6134 do_t_branch (void)
6135 {
6136   if (unified_syntax && inst.size_req != 2)
6137     {
6138       if (inst.cond == COND_ALWAYS)
6139 	{
6140 	  inst.instruction = 0xf000b000;
6141 	  inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH25;
6142 	}
6143       else
6144 	{
6145 	  assert (inst.cond != 0xF);
6146 	  inst.instruction = (inst.cond << 22) | 0xf0008000;
6147 	  inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH20;
6148 	}
6149     }
6150   else
6151     {
6152       if (inst.cond == COND_ALWAYS)
6153 	inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH12;
6154       else
6155 	{
6156 	  inst.instruction = 0xd000 | (inst.cond << 8);
6157 	  inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH9;
6158 	}
6159     }
6160 
6161   inst.reloc.pc_rel = 1;
6162 }
6163 
6164 static void
do_t_bkpt(void)6165 do_t_bkpt (void)
6166 {
6167   if (inst.operands[0].present)
6168     {
6169       constraint (inst.operands[0].imm > 255,
6170 		  _("immediate value out of range"));
6171       inst.instruction |= inst.operands[0].imm;
6172     }
6173 }
6174 
6175 static void
do_t_branch23(void)6176 do_t_branch23 (void)
6177 {
6178   inst.reloc.type   = BFD_RELOC_THUMB_PCREL_BRANCH23;
6179   inst.reloc.pc_rel = 1;
6180 
6181   /* If the destination of the branch is a defined symbol which does not have
6182      the THUMB_FUNC attribute, then we must be calling a function which has
6183      the (interfacearm) attribute.  We look for the Thumb entry point to that
6184      function and change the branch to refer to that function instead.	*/
6185   if (	 inst.reloc.exp.X_op == O_symbol
6186       && inst.reloc.exp.X_add_symbol != NULL
6187       && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
6188       && ! THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
6189     inst.reloc.exp.X_add_symbol =
6190       find_real_start (inst.reloc.exp.X_add_symbol);
6191 }
6192 
6193 static void
do_t_bx(void)6194 do_t_bx (void)
6195 {
6196   inst.instruction |= inst.operands[0].reg << 3;
6197   /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC.	 The reloc
6198      should cause the alignment to be checked once it is known.	 This is
6199      because BX PC only works if the instruction is word aligned.  */
6200 }
6201 
6202 static void
do_t_bxj(void)6203 do_t_bxj (void)
6204 {
6205   if (inst.operands[0].reg == REG_PC)
6206     as_tsktsk (_("use of r15 in bxj is not really useful"));
6207 
6208   inst.instruction |= inst.operands[0].reg << 16;
6209 }
6210 
6211 static void
do_t_clz(void)6212 do_t_clz (void)
6213 {
6214   inst.instruction |= inst.operands[0].reg << 8;
6215   inst.instruction |= inst.operands[1].reg << 16;
6216   inst.instruction |= inst.operands[1].reg;
6217 }
6218 
6219 static void
do_t_cpsi(void)6220 do_t_cpsi (void)
6221 {
6222   if (unified_syntax
6223       && (inst.operands[1].present || inst.size_req == 4))
6224     {
6225       unsigned int imod = (inst.instruction & 0x0030) >> 4;
6226       inst.instruction = 0xf3af8000;
6227       inst.instruction |= imod << 9;
6228       inst.instruction |= inst.operands[0].imm << 5;
6229       if (inst.operands[1].present)
6230 	inst.instruction |= 0x100 | inst.operands[1].imm;
6231     }
6232   else
6233     {
6234       constraint (inst.operands[1].present,
6235 		  _("Thumb does not support the 2-argument "
6236 		    "form of this instruction"));
6237       inst.instruction |= inst.operands[0].imm;
6238     }
6239 }
6240 
6241 /* THUMB CPY instruction (argument parse).  */
6242 
6243 static void
do_t_cpy(void)6244 do_t_cpy (void)
6245 {
6246   if (inst.size_req == 4)
6247     {
6248       inst.instruction = THUMB_OP32 (T_MNEM_mov);
6249       inst.instruction |= inst.operands[0].reg << 8;
6250       inst.instruction |= inst.operands[1].reg;
6251     }
6252   else
6253     {
6254       inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
6255       inst.instruction |= (inst.operands[0].reg & 0x7);
6256       inst.instruction |= inst.operands[1].reg << 3;
6257     }
6258 }
6259 
6260 static void
do_t_czb(void)6261 do_t_czb (void)
6262 {
6263   constraint (inst.operands[0].reg > 7, BAD_HIREG);
6264   inst.instruction |= inst.operands[0].reg;
6265   inst.reloc.pc_rel = 1;
6266   inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH7;
6267 }
6268 
6269 static void
do_t_hint(void)6270 do_t_hint (void)
6271 {
6272   if (unified_syntax && inst.size_req == 4)
6273     inst.instruction = THUMB_OP32 (inst.instruction);
6274   else
6275     inst.instruction = THUMB_OP16 (inst.instruction);
6276 }
6277 
6278 static void
do_t_it(void)6279 do_t_it (void)
6280 {
6281   unsigned int cond = inst.operands[0].imm;
6282   if ((cond & 0x1) == 0x0)
6283     {
6284       unsigned int mask = inst.instruction & 0x000f;
6285       inst.instruction &= 0xfff0;
6286 
6287       if ((mask & 0x7) == 0)
6288 	/* no conversion needed */;
6289       else if ((mask & 0x3) == 0)
6290 	mask = (~(mask & 0x8) & 0x8) | 0x4;
6291       else if ((mask & 1) == 0)
6292 	mask = (~(mask & 0xC) & 0xC) | 0x2;
6293       else
6294 	mask = (~(mask & 0xE) & 0xE) | 0x1;
6295 
6296       inst.instruction |= (mask & 0xF);
6297     }
6298 
6299   inst.instruction |= cond << 4;
6300 }
6301 
6302 static void
do_t_ldmstm(void)6303 do_t_ldmstm (void)
6304 {
6305   /* This really doesn't seem worth it.  */
6306   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
6307 	      _("expression too complex"));
6308   constraint (inst.operands[1].writeback,
6309 	      _("Thumb load/store multiple does not support {reglist}^"));
6310 
6311   if (unified_syntax)
6312     {
6313       /* See if we can use a 16-bit instruction.  */
6314       if (inst.instruction < 0xffff /* not ldmdb/stmdb */
6315 	  && inst.size_req != 4
6316 	  && inst.operands[0].reg <= 7
6317 	  && !(inst.operands[1].imm & ~0xff)
6318 	  && (inst.instruction == T_MNEM_stmia
6319 	      ? inst.operands[0].writeback
6320 	      : (inst.operands[0].writeback
6321 		 == !(inst.operands[1].imm & (1 << inst.operands[0].reg)))))
6322 	{
6323 	  if (inst.instruction == T_MNEM_stmia
6324 	      && (inst.operands[1].imm & (1 << inst.operands[0].reg))
6325 	      && (inst.operands[1].imm & ((1 << inst.operands[0].reg) - 1)))
6326 	    as_warn (_("value stored for r%d is UNPREDICTABLE"),
6327 		     inst.operands[0].reg);
6328 
6329 	  inst.instruction = THUMB_OP16 (inst.instruction);
6330 	  inst.instruction |= inst.operands[0].reg << 8;
6331 	  inst.instruction |= inst.operands[1].imm;
6332 	}
6333       else
6334 	{
6335 	  if (inst.operands[1].imm & (1 << 13))
6336 	    as_warn (_("SP should not be in register list"));
6337 	  if (inst.instruction == T_MNEM_stmia)
6338 	    {
6339 	      if (inst.operands[1].imm & (1 << 15))
6340 		as_warn (_("PC should not be in register list"));
6341 	      if (inst.operands[1].imm & (1 << inst.operands[0].reg))
6342 		as_warn (_("value stored for r%d is UNPREDICTABLE"),
6343 			 inst.operands[0].reg);
6344 	    }
6345 	  else
6346 	    {
6347 	      if (inst.operands[1].imm & (1 << 14)
6348 		  && inst.operands[1].imm & (1 << 15))
6349 		as_warn (_("LR and PC should not both be in register list"));
6350 	      if ((inst.operands[1].imm & (1 << inst.operands[0].reg))
6351 		  && inst.operands[0].writeback)
6352 		as_warn (_("base register should not be in register list "
6353 			   "when written back"));
6354 	    }
6355 	  if (inst.instruction < 0xffff)
6356 	    inst.instruction = THUMB_OP32 (inst.instruction);
6357 	  inst.instruction |= inst.operands[0].reg << 16;
6358 	  inst.instruction |= inst.operands[1].imm;
6359 	  if (inst.operands[0].writeback)
6360 	    inst.instruction |= WRITE_BACK;
6361 	}
6362     }
6363   else
6364     {
6365       constraint (inst.operands[0].reg > 7
6366 		  || (inst.operands[1].imm & ~0xff), BAD_HIREG);
6367       if (inst.instruction == T_MNEM_stmia)
6368 	{
6369 	  if (!inst.operands[0].writeback)
6370 	    as_warn (_("this instruction will write back the base register"));
6371 	  if ((inst.operands[1].imm & (1 << inst.operands[0].reg))
6372 	      && (inst.operands[1].imm & ((1 << inst.operands[0].reg) - 1)))
6373 	    as_warn (_("value stored for r%d is UNPREDICTABLE"),
6374 		     inst.operands[0].reg);
6375 	}
6376       else
6377 	{
6378 	  if (!inst.operands[0].writeback
6379 	      && !(inst.operands[1].imm & (1 << inst.operands[0].reg)))
6380 	    as_warn (_("this instruction will write back the base register"));
6381 	  else if (inst.operands[0].writeback
6382 		   && (inst.operands[1].imm & (1 << inst.operands[0].reg)))
6383 	    as_warn (_("this instruction will not write back the base register"));
6384 	}
6385 
6386       inst.instruction = THUMB_OP16 (inst.instruction);
6387       inst.instruction |= inst.operands[0].reg << 8;
6388       inst.instruction |= inst.operands[1].imm;
6389     }
6390 }
6391 
6392 static void
do_t_ldrex(void)6393 do_t_ldrex (void)
6394 {
6395   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
6396 	      || inst.operands[1].postind || inst.operands[1].writeback
6397 	      || inst.operands[1].immisreg || inst.operands[1].shifted
6398 	      || inst.operands[1].negative,
6399 	      _("instruction does not accept this addressing mode"));
6400 
6401   inst.instruction |= inst.operands[0].reg << 12;
6402   inst.instruction |= inst.operands[1].reg << 16;
6403   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
6404 }
6405 
6406 static void
do_t_ldrexd(void)6407 do_t_ldrexd (void)
6408 {
6409   if (!inst.operands[1].present)
6410     {
6411       constraint (inst.operands[0].reg == REG_LR,
6412 		  _("r14 not allowed as first register "
6413 		    "when second register is omitted"));
6414       inst.operands[1].reg = inst.operands[0].reg + 1;
6415     }
6416   constraint (inst.operands[0].reg == inst.operands[1].reg,
6417 	      BAD_OVERLAP);
6418 
6419   inst.instruction |= inst.operands[0].reg << 12;
6420   inst.instruction |= inst.operands[1].reg << 8;
6421   inst.instruction |= inst.operands[2].reg << 16;
6422 }
6423 
6424 static void
do_t_ldst(void)6425 do_t_ldst (void)
6426 {
6427   if (unified_syntax)
6428     {
6429       /* Generation of 16-bit instructions for anything other than
6430 	 Rd, [Rn, Ri] is deferred to section relaxation time.  */
6431       if (inst.operands[1].isreg && inst.operands[1].immisreg
6432 	  && !inst.operands[1].shifted && !inst.operands[1].postind
6433 	  && !inst.operands[1].negative && inst.operands[0].reg <= 7
6434 	  && inst.operands[1].reg <= 7 && inst.operands[1].imm <= 7
6435 	  && inst.instruction <= 0xffff)
6436 	{
6437 	  inst.instruction = THUMB_OP16 (inst.instruction);
6438 	  goto op16;
6439 	}
6440 
6441       inst.instruction = THUMB_OP32 (inst.instruction);
6442       inst.instruction |= inst.operands[0].reg << 12;
6443       encode_thumb32_addr_mode (1, /*is_t=*/FALSE, /*is_d=*/FALSE);
6444       return;
6445     }
6446 
6447   constraint (inst.operands[0].reg > 7, BAD_HIREG);
6448 
6449   if (inst.instruction == T_MNEM_ldrsh || inst.instruction == T_MNEM_ldrsb)
6450     {
6451       /* Only [Rn,Rm] is acceptable.  */
6452       constraint (inst.operands[1].reg > 7 || inst.operands[1].imm > 7, BAD_HIREG);
6453       constraint (!inst.operands[1].isreg || !inst.operands[1].immisreg
6454 		  || inst.operands[1].postind || inst.operands[1].shifted
6455 		  || inst.operands[1].negative,
6456 		  _("Thumb does not support this addressing mode"));
6457       inst.instruction = THUMB_OP16 (inst.instruction);
6458       goto op16;
6459     }
6460 
6461   inst.instruction = THUMB_OP16 (inst.instruction);
6462   if (!inst.operands[1].isreg)
6463     if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
6464       return;
6465 
6466   constraint (!inst.operands[1].preind
6467 	      || inst.operands[1].shifted
6468 	      || inst.operands[1].writeback,
6469 	      _("Thumb does not support this addressing mode"));
6470   if (inst.operands[1].reg == REG_PC || inst.operands[1].reg == REG_SP)
6471     {
6472       constraint (inst.instruction & 0x0600,
6473 		  _("byte or halfword not valid for base register"));
6474       constraint (inst.operands[1].reg == REG_PC
6475 		  && !(inst.instruction & THUMB_LOAD_BIT),
6476 		  _("r15 based store not allowed"));
6477       constraint (inst.operands[1].immisreg,
6478 		  _("invalid base register for register offset"));
6479 
6480       if (inst.operands[1].reg == REG_PC)
6481 	inst.instruction = T_OPCODE_LDR_PC;
6482       else if (inst.instruction & THUMB_LOAD_BIT)
6483 	inst.instruction = T_OPCODE_LDR_SP;
6484       else
6485 	inst.instruction = T_OPCODE_STR_SP;
6486 
6487       inst.instruction |= inst.operands[0].reg << 8;
6488       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
6489       return;
6490     }
6491 
6492   constraint (inst.operands[1].reg > 7, BAD_HIREG);
6493   if (!inst.operands[1].immisreg)
6494     {
6495       /* Immediate offset.  */
6496       inst.instruction |= inst.operands[0].reg;
6497       inst.instruction |= inst.operands[1].reg << 3;
6498       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
6499       return;
6500     }
6501 
6502   /* Register offset.  */
6503   constraint (inst.operands[1].imm > 7, BAD_HIREG);
6504   constraint (inst.operands[1].negative,
6505 	      _("Thumb does not support this addressing mode"));
6506 
6507  op16:
6508   switch (inst.instruction)
6509     {
6510     case T_OPCODE_STR_IW: inst.instruction = T_OPCODE_STR_RW; break;
6511     case T_OPCODE_STR_IH: inst.instruction = T_OPCODE_STR_RH; break;
6512     case T_OPCODE_STR_IB: inst.instruction = T_OPCODE_STR_RB; break;
6513     case T_OPCODE_LDR_IW: inst.instruction = T_OPCODE_LDR_RW; break;
6514     case T_OPCODE_LDR_IH: inst.instruction = T_OPCODE_LDR_RH; break;
6515     case T_OPCODE_LDR_IB: inst.instruction = T_OPCODE_LDR_RB; break;
6516     case 0x5600 /* ldrsb */:
6517     case 0x5e00 /* ldrsh */: break;
6518     default: abort ();
6519     }
6520 
6521   inst.instruction |= inst.operands[0].reg;
6522   inst.instruction |= inst.operands[1].reg << 3;
6523   inst.instruction |= inst.operands[1].imm << 6;
6524 }
6525 
6526 static void
do_t_ldstd(void)6527 do_t_ldstd (void)
6528 {
6529   if (!inst.operands[1].present)
6530     {
6531       inst.operands[1].reg = inst.operands[0].reg + 1;
6532       constraint (inst.operands[0].reg == REG_LR,
6533 		  _("r14 not allowed here"));
6534     }
6535   inst.instruction |= inst.operands[0].reg << 12;
6536   inst.instruction |= inst.operands[1].reg << 8;
6537   encode_thumb32_addr_mode (2, /*is_t=*/FALSE, /*is_d=*/TRUE);
6538 
6539 }
6540 
6541 static void
do_t_ldstt(void)6542 do_t_ldstt (void)
6543 {
6544   inst.instruction |= inst.operands[0].reg << 12;
6545   encode_thumb32_addr_mode (1, /*is_t=*/TRUE, /*is_d=*/FALSE);
6546 }
6547 
6548 static void
do_t_mla(void)6549 do_t_mla (void)
6550 {
6551   inst.instruction |= inst.operands[0].reg << 8;
6552   inst.instruction |= inst.operands[1].reg << 16;
6553   inst.instruction |= inst.operands[2].reg;
6554   inst.instruction |= inst.operands[3].reg << 12;
6555 }
6556 
6557 static void
do_t_mlal(void)6558 do_t_mlal (void)
6559 {
6560   inst.instruction |= inst.operands[0].reg << 12;
6561   inst.instruction |= inst.operands[1].reg << 8;
6562   inst.instruction |= inst.operands[2].reg << 16;
6563   inst.instruction |= inst.operands[3].reg;
6564 }
6565 
6566 static void
do_t_mov_cmp(void)6567 do_t_mov_cmp (void)
6568 {
6569   if (unified_syntax)
6570     {
6571       int r0off = (inst.instruction == T_MNEM_mov
6572 		   || inst.instruction == T_MNEM_movs) ? 8 : 16;
6573       if (!inst.operands[1].isreg)
6574 	{
6575 	  /* For an immediate, we always generate a 32-bit opcode;
6576 	     section relaxation will shrink it later if possible.  */
6577 	  inst.instruction = THUMB_OP32 (inst.instruction);
6578 	  inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
6579 	  inst.instruction |= inst.operands[0].reg << r0off;
6580 	  inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
6581 	}
6582       else if (inst.size_req == 4
6583 	       || inst.operands[1].shifted
6584 	       || (inst.instruction == T_MNEM_movs
6585 		   && (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)))
6586 	{
6587 	  inst.instruction = THUMB_OP32 (inst.instruction);
6588 	  inst.instruction |= inst.operands[0].reg << r0off;
6589 	  encode_thumb32_shifted_operand (1);
6590 	}
6591       else
6592 	switch (inst.instruction)
6593 	  {
6594 	  case T_MNEM_mov:
6595 	    inst.instruction = T_OPCODE_MOV_HR;
6596 	    inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
6597 	    inst.instruction |= (inst.operands[0].reg & 0x7);
6598 	    inst.instruction |= inst.operands[1].reg << 3;
6599 	    break;
6600 
6601 	  case T_MNEM_movs:
6602 	    /* We know we have low registers at this point.
6603 	       Generate ADD Rd, Rs, #0.  */
6604 	    inst.instruction = T_OPCODE_ADD_I3;
6605 	    inst.instruction |= inst.operands[0].reg;
6606 	    inst.instruction |= inst.operands[1].reg << 3;
6607 	    break;
6608 
6609 	  case T_MNEM_cmp:
6610 	    if (inst.operands[0].reg <= 7 && inst.operands[1].reg <= 7)
6611 	      {
6612 		inst.instruction = T_OPCODE_CMP_LR;
6613 		inst.instruction |= inst.operands[0].reg;
6614 		inst.instruction |= inst.operands[1].reg << 3;
6615 	      }
6616 	    else
6617 	      {
6618 		inst.instruction = T_OPCODE_CMP_HR;
6619 		inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
6620 		inst.instruction |= (inst.operands[0].reg & 0x7);
6621 		inst.instruction |= inst.operands[1].reg << 3;
6622 	      }
6623 	    break;
6624 	  }
6625       return;
6626     }
6627 
6628   inst.instruction = THUMB_OP16 (inst.instruction);
6629   if (inst.operands[1].isreg)
6630     {
6631       if (inst.operands[0].reg < 8 && inst.operands[1].reg < 8)
6632 	{
6633 	  /* A move of two lowregs is encoded as ADD Rd, Rs, #0
6634 	     since a MOV instruction produces unpredictable results.  */
6635 	  if (inst.instruction == T_OPCODE_MOV_I8)
6636 	    inst.instruction = T_OPCODE_ADD_I3;
6637 	  else
6638 	    inst.instruction = T_OPCODE_CMP_LR;
6639 
6640 	  inst.instruction |= inst.operands[0].reg;
6641 	  inst.instruction |= inst.operands[1].reg << 3;
6642 	}
6643       else
6644 	{
6645 	  if (inst.instruction == T_OPCODE_MOV_I8)
6646 	    inst.instruction = T_OPCODE_MOV_HR;
6647 	  else
6648 	    inst.instruction = T_OPCODE_CMP_HR;
6649 	  do_t_cpy ();
6650 	}
6651     }
6652   else
6653     {
6654       constraint (inst.operands[0].reg > 7,
6655 		  _("only lo regs allowed with immediate"));
6656       inst.instruction |= inst.operands[0].reg << 8;
6657       inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
6658     }
6659 }
6660 
6661 static void
do_t_mov16(void)6662 do_t_mov16 (void)
6663 {
6664   inst.instruction |= inst.operands[0].reg << 8;
6665   inst.instruction |= (inst.operands[1].imm & 0xf000) << 4;
6666   inst.instruction |= (inst.operands[1].imm & 0x0800) << 15;
6667   inst.instruction |= (inst.operands[1].imm & 0x0700) << 4;
6668   inst.instruction |= (inst.operands[1].imm & 0x00ff);
6669 }
6670 
6671 static void
do_t_mvn_tst(void)6672 do_t_mvn_tst (void)
6673 {
6674   if (unified_syntax)
6675     {
6676       int r0off = (inst.instruction == T_MNEM_mvn
6677 		   || inst.instruction == T_MNEM_mvns) ? 8 : 16;
6678       if (!inst.operands[1].isreg)
6679 	{
6680 	  /* For an immediate, we always generate a 32-bit opcode;
6681 	     section relaxation will shrink it later if possible.  */
6682 	  if (inst.instruction < 0xffff)
6683 	    inst.instruction = THUMB_OP32 (inst.instruction);
6684 	  inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
6685 	  inst.instruction |= inst.operands[0].reg << r0off;
6686 	  inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
6687 	}
6688       else
6689 	{
6690 	  /* See if we can do this with a 16-bit instruction.  */
6691 	  if (inst.instruction < 0xffff
6692 	      && THUMB_SETS_FLAGS (inst.instruction)
6693 	      && !inst.operands[1].shifted
6694 	      && inst.operands[0].reg <= 7
6695 	      && inst.operands[1].reg <= 7
6696 	      && inst.size_req != 4)
6697 	    {
6698 	      inst.instruction = THUMB_OP16 (inst.instruction);
6699 	      inst.instruction |= inst.operands[0].reg;
6700 	      inst.instruction |= inst.operands[1].reg << 3;
6701 	    }
6702 	  else
6703 	    {
6704 	      constraint (inst.operands[1].shifted
6705 			  && inst.operands[1].immisreg,
6706 			  _("shift must be constant"));
6707 	      if (inst.instruction < 0xffff)
6708 		inst.instruction = THUMB_OP32 (inst.instruction);
6709 	      inst.instruction |= inst.operands[0].reg << r0off;
6710 	      encode_thumb32_shifted_operand (1);
6711 	    }
6712 	}
6713     }
6714   else
6715     {
6716       constraint (inst.instruction > 0xffff
6717 		  || inst.instruction == T_MNEM_mvns, BAD_THUMB32);
6718       constraint (!inst.operands[1].isreg || inst.operands[1].shifted,
6719 		  _("unshifted register required"));
6720       constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
6721 		  BAD_HIREG);
6722 
6723       inst.instruction = THUMB_OP16 (inst.instruction);
6724       inst.instruction |= inst.operands[0].reg;
6725       inst.instruction |= inst.operands[1].reg << 3;
6726     }
6727 }
6728 
6729 static void
do_t_mrs(void)6730 do_t_mrs (void)
6731 {
6732   /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all.  */
6733   constraint ((inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f))
6734 	      != (PSR_c|PSR_f),
6735 	      _("'CPSR' or 'SPSR' expected"));
6736   inst.instruction |= inst.operands[0].reg << 8;
6737   inst.instruction |= (inst.operands[1].imm & SPSR_BIT) >> 2;
6738 }
6739 
6740 static void
do_t_msr(void)6741 do_t_msr (void)
6742 {
6743   constraint (!inst.operands[1].isreg,
6744 	      _("Thumb encoding does not support an immediate here"));
6745   inst.instruction |= (inst.operands[0].imm & SPSR_BIT) >> 2;
6746   inst.instruction |= (inst.operands[0].imm & ~SPSR_BIT) >> 8;
6747   inst.instruction |= inst.operands[1].reg << 16;
6748 }
6749 
6750 static void
do_t_mul(void)6751 do_t_mul (void)
6752 {
6753   if (!inst.operands[2].present)
6754     inst.operands[2].reg = inst.operands[0].reg;
6755 
6756   /* There is no 32-bit MULS and no 16-bit MUL. */
6757   if (unified_syntax && inst.instruction == T_MNEM_mul)
6758     {
6759       inst.instruction = THUMB_OP32 (inst.instruction);
6760       inst.instruction |= inst.operands[0].reg << 8;
6761       inst.instruction |= inst.operands[1].reg << 16;
6762       inst.instruction |= inst.operands[2].reg << 0;
6763     }
6764   else
6765     {
6766       constraint (!unified_syntax
6767 		  && inst.instruction == T_MNEM_muls, BAD_THUMB32);
6768       constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
6769 		  BAD_HIREG);
6770 
6771       inst.instruction = THUMB_OP16 (inst.instruction);
6772       inst.instruction |= inst.operands[0].reg;
6773 
6774       if (inst.operands[0].reg == inst.operands[1].reg)
6775 	inst.instruction |= inst.operands[2].reg << 3;
6776       else if (inst.operands[0].reg == inst.operands[2].reg)
6777 	inst.instruction |= inst.operands[1].reg << 3;
6778       else
6779 	constraint (1, _("dest must overlap one source register"));
6780     }
6781 }
6782 
6783 static void
do_t_mull(void)6784 do_t_mull (void)
6785 {
6786   inst.instruction |= inst.operands[0].reg << 12;
6787   inst.instruction |= inst.operands[1].reg << 8;
6788   inst.instruction |= inst.operands[2].reg << 16;
6789   inst.instruction |= inst.operands[3].reg;
6790 
6791   if (inst.operands[0].reg == inst.operands[1].reg)
6792     as_tsktsk (_("rdhi and rdlo must be different"));
6793 }
6794 
6795 static void
do_t_nop(void)6796 do_t_nop (void)
6797 {
6798   if (unified_syntax)
6799     {
6800       if (inst.size_req == 4 || inst.operands[0].imm > 15)
6801 	{
6802 	  inst.instruction = THUMB_OP32 (inst.instruction);
6803 	  inst.instruction |= inst.operands[0].imm;
6804 	}
6805       else
6806 	{
6807 	  inst.instruction = THUMB_OP16 (inst.instruction);
6808 	  inst.instruction |= inst.operands[0].imm << 4;
6809 	}
6810     }
6811   else
6812     {
6813       constraint (inst.operands[0].present,
6814 		  _("Thumb does not support NOP with hints"));
6815       inst.instruction = 0x46c0;
6816     }
6817 }
6818 
6819 static void
do_t_neg(void)6820 do_t_neg (void)
6821 {
6822   if (unified_syntax)
6823     {
6824       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7
6825 	  || !THUMB_SETS_FLAGS (inst.instruction)
6826 	  || inst.size_req == 4)
6827 	{
6828 	  inst.instruction = THUMB_OP32 (inst.instruction);
6829 	  inst.instruction |= inst.operands[0].reg << 8;
6830 	  inst.instruction |= inst.operands[1].reg << 16;
6831 	}
6832       else
6833 	{
6834 	  inst.instruction = THUMB_OP16 (inst.instruction);
6835 	  inst.instruction |= inst.operands[0].reg;
6836 	  inst.instruction |= inst.operands[1].reg << 3;
6837 	}
6838     }
6839   else
6840     {
6841       constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
6842 		  BAD_HIREG);
6843       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
6844 
6845       inst.instruction = THUMB_OP16 (inst.instruction);
6846       inst.instruction |= inst.operands[0].reg;
6847       inst.instruction |= inst.operands[1].reg << 3;
6848     }
6849 }
6850 
6851 static void
do_t_pkhbt(void)6852 do_t_pkhbt (void)
6853 {
6854   inst.instruction |= inst.operands[0].reg << 8;
6855   inst.instruction |= inst.operands[1].reg << 16;
6856   inst.instruction |= inst.operands[2].reg;
6857   if (inst.operands[3].present)
6858     {
6859       unsigned int val = inst.reloc.exp.X_add_number;
6860       constraint (inst.reloc.exp.X_op != O_constant,
6861 		  _("expression too complex"));
6862       inst.instruction |= (val & 0x1c) << 10;
6863       inst.instruction |= (val & 0x03) << 6;
6864     }
6865 }
6866 
6867 static void
do_t_pkhtb(void)6868 do_t_pkhtb (void)
6869 {
6870   if (!inst.operands[3].present)
6871     inst.instruction &= ~0x00000020;
6872   do_t_pkhbt ();
6873 }
6874 
6875 static void
do_t_pld(void)6876 do_t_pld (void)
6877 {
6878   encode_thumb32_addr_mode (0, /*is_t=*/FALSE, /*is_d=*/FALSE);
6879 }
6880 
6881 static void
do_t_push_pop(void)6882 do_t_push_pop (void)
6883 {
6884   constraint (inst.operands[0].writeback,
6885 	      _("push/pop do not support {reglist}^"));
6886   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
6887 	      _("expression too complex"));
6888 
6889   if ((inst.operands[0].imm & ~0xff) == 0)
6890     inst.instruction = THUMB_OP16 (inst.instruction);
6891   else if ((inst.instruction == T_MNEM_push
6892 	    && (inst.operands[0].imm & ~0xff) == 1 << REG_LR)
6893 	   || (inst.instruction == T_MNEM_pop
6894 	       && (inst.operands[0].imm & ~0xff) == 1 << REG_PC))
6895     {
6896       inst.instruction = THUMB_OP16 (inst.instruction);
6897       inst.instruction |= THUMB_PP_PC_LR;
6898       inst.operands[0].imm &= 0xff;
6899     }
6900   else if (unified_syntax)
6901     {
6902       if (inst.operands[1].imm & (1 << 13))
6903 	as_warn (_("SP should not be in register list"));
6904       if (inst.instruction == T_MNEM_push)
6905 	{
6906 	  if (inst.operands[1].imm & (1 << 15))
6907 	    as_warn (_("PC should not be in register list"));
6908 	}
6909       else
6910 	{
6911 	  if (inst.operands[1].imm & (1 << 14)
6912 	      && inst.operands[1].imm & (1 << 15))
6913 	    as_warn (_("LR and PC should not both be in register list"));
6914 	}
6915 
6916       inst.instruction = THUMB_OP32 (inst.instruction);
6917     }
6918   else
6919     {
6920       inst.error = _("invalid register list to push/pop instruction");
6921       return;
6922     }
6923 
6924   inst.instruction |= inst.operands[0].imm;
6925 }
6926 
6927 static void
do_t_rbit(void)6928 do_t_rbit (void)
6929 {
6930   inst.instruction |= inst.operands[0].reg << 8;
6931   inst.instruction |= inst.operands[1].reg << 16;
6932 }
6933 
6934 static void
do_t_rev(void)6935 do_t_rev (void)
6936 {
6937   if (inst.operands[0].reg <= 7 && inst.operands[1].reg <= 7
6938       && inst.size_req != 4)
6939     {
6940       inst.instruction = THUMB_OP16 (inst.instruction);
6941       inst.instruction |= inst.operands[0].reg;
6942       inst.instruction |= inst.operands[1].reg << 3;
6943     }
6944   else if (unified_syntax)
6945     {
6946       inst.instruction = THUMB_OP32 (inst.instruction);
6947       inst.instruction |= inst.operands[0].reg << 8;
6948       inst.instruction |= inst.operands[1].reg << 16;
6949       inst.instruction |= inst.operands[1].reg;
6950     }
6951   else
6952     inst.error = BAD_HIREG;
6953 }
6954 
6955 static void
do_t_rsb(void)6956 do_t_rsb (void)
6957 {
6958   int Rd, Rs;
6959 
6960   Rd = inst.operands[0].reg;
6961   Rs = (inst.operands[1].present
6962 	? inst.operands[1].reg    /* Rd, Rs, foo */
6963 	: inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
6964 
6965   inst.instruction |= Rd << 8;
6966   inst.instruction |= Rs << 16;
6967   if (!inst.operands[2].isreg)
6968     {
6969       inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
6970       inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
6971     }
6972   else
6973     encode_thumb32_shifted_operand (2);
6974 }
6975 
6976 static void
do_t_setend(void)6977 do_t_setend (void)
6978 {
6979   if (inst.operands[0].imm)
6980     inst.instruction |= 0x8;
6981 }
6982 
6983 static void
do_t_shift(void)6984 do_t_shift (void)
6985 {
6986   if (!inst.operands[1].present)
6987     inst.operands[1].reg = inst.operands[0].reg;
6988 
6989   if (unified_syntax)
6990     {
6991       if (inst.operands[0].reg > 7
6992 	  || inst.operands[1].reg > 7
6993 	  || !THUMB_SETS_FLAGS (inst.instruction)
6994 	  || (!inst.operands[2].isreg && inst.instruction == T_MNEM_rors)
6995 	  || (inst.operands[2].isreg && inst.operands[1].reg != inst.operands[0].reg)
6996 	  || inst.size_req == 4)
6997 	{
6998 	  if (inst.operands[2].isreg)
6999 	    {
7000 	      inst.instruction = THUMB_OP32 (inst.instruction);
7001 	      inst.instruction |= inst.operands[0].reg << 8;
7002 	      inst.instruction |= inst.operands[1].reg << 16;
7003 	      inst.instruction |= inst.operands[2].reg;
7004 	    }
7005 	  else
7006 	    {
7007 	      inst.operands[1].shifted = 1;
7008 	      switch (inst.instruction)
7009 		{
7010 		case T_MNEM_asr:
7011 		case T_MNEM_asrs: inst.operands[1].shift_kind = SHIFT_ASR; break;
7012 		case T_MNEM_lsl:
7013 		case T_MNEM_lsls: inst.operands[1].shift_kind = SHIFT_LSL; break;
7014 		case T_MNEM_lsr:
7015 		case T_MNEM_lsrs: inst.operands[1].shift_kind = SHIFT_LSR; break;
7016 		case T_MNEM_ror:
7017 		case T_MNEM_rors: inst.operands[1].shift_kind = SHIFT_ROR; break;
7018 		default: abort ();
7019 		}
7020 
7021 	      inst.instruction = THUMB_OP32 (THUMB_SETS_FLAGS (inst.instruction)
7022 					     ? T_MNEM_movs : T_MNEM_mov);
7023 	      inst.instruction |= inst.operands[0].reg << 8;
7024 	      encode_thumb32_shifted_operand (1);
7025 	      /* Prevent the incorrect generation of an ARM_IMMEDIATE fixup.  */
7026 	      inst.reloc.type = BFD_RELOC_UNUSED;
7027 	    }
7028 	}
7029       else
7030 	{
7031 	  if (inst.operands[2].isreg)
7032 	    {
7033 	      switch (inst.instruction)
7034 		{
7035 		case T_MNEM_asrs: inst.instruction = T_OPCODE_ASR_R; break;
7036 		case T_MNEM_lsls: inst.instruction = T_OPCODE_LSL_R; break;
7037 		case T_MNEM_lsrs: inst.instruction = T_OPCODE_LSR_R; break;
7038 		case T_MNEM_rors: inst.instruction = T_OPCODE_ROR_R; break;
7039 		default: abort ();
7040 		}
7041 
7042 	      inst.instruction |= inst.operands[0].reg;
7043 	      inst.instruction |= inst.operands[2].reg << 3;
7044 	    }
7045 	  else
7046 	    {
7047 	      switch (inst.instruction)
7048 		{
7049 		case T_MNEM_asrs: inst.instruction = T_OPCODE_ASR_I; break;
7050 		case T_MNEM_lsls: inst.instruction = T_OPCODE_LSL_I; break;
7051 		case T_MNEM_lsrs: inst.instruction = T_OPCODE_LSR_I; break;
7052 		default: abort ();
7053 		}
7054 	      inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
7055 	      inst.instruction |= inst.operands[0].reg;
7056 	      inst.instruction |= inst.operands[1].reg << 3;
7057 	    }
7058 	}
7059     }
7060   else
7061     {
7062       constraint (inst.operands[0].reg > 7
7063 		  || inst.operands[1].reg > 7, BAD_HIREG);
7064       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
7065 
7066       if (inst.operands[2].isreg)  /* Rd, {Rs,} Rn */
7067 	{
7068 	  constraint (inst.operands[2].reg > 7, BAD_HIREG);
7069 	  constraint (inst.operands[0].reg != inst.operands[1].reg,
7070 		      _("source1 and dest must be same register"));
7071 
7072 	  switch (inst.instruction)
7073 	    {
7074 	    case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_R; break;
7075 	    case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_R; break;
7076 	    case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_R; break;
7077 	    case T_MNEM_ror: inst.instruction = T_OPCODE_ROR_R; break;
7078 	    default: abort ();
7079 	    }
7080 
7081 	  inst.instruction |= inst.operands[0].reg;
7082 	  inst.instruction |= inst.operands[2].reg << 3;
7083 	}
7084       else
7085 	{
7086 	  switch (inst.instruction)
7087 	    {
7088 	    case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_I; break;
7089 	    case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_I; break;
7090 	    case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_I; break;
7091 	    case T_MNEM_ror: inst.error = _("ror #imm not supported"); return;
7092 	    default: abort ();
7093 	    }
7094 	  inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
7095 	  inst.instruction |= inst.operands[0].reg;
7096 	  inst.instruction |= inst.operands[1].reg << 3;
7097 	}
7098     }
7099 }
7100 
7101 static void
do_t_simd(void)7102 do_t_simd (void)
7103 {
7104   inst.instruction |= inst.operands[0].reg << 8;
7105   inst.instruction |= inst.operands[1].reg << 16;
7106   inst.instruction |= inst.operands[2].reg;
7107 }
7108 
7109 static void
do_t_smi(void)7110 do_t_smi (void)
7111 {
7112   unsigned int value = inst.reloc.exp.X_add_number;
7113   constraint (inst.reloc.exp.X_op != O_constant,
7114 	      _("expression too complex"));
7115   inst.reloc.type = BFD_RELOC_UNUSED;
7116   inst.instruction |= (value & 0xf000) >> 12;
7117   inst.instruction |= (value & 0x0ff0);
7118   inst.instruction |= (value & 0x000f) << 16;
7119 }
7120 
7121 static void
do_t_ssat(void)7122 do_t_ssat (void)
7123 {
7124   inst.instruction |= inst.operands[0].reg << 8;
7125   inst.instruction |= inst.operands[1].imm - 1;
7126   inst.instruction |= inst.operands[2].reg << 16;
7127 
7128   if (inst.operands[3].present)
7129     {
7130       constraint (inst.reloc.exp.X_op != O_constant,
7131 		  _("expression too complex"));
7132 
7133       if (inst.reloc.exp.X_add_number != 0)
7134 	{
7135 	  if (inst.operands[3].shift_kind == SHIFT_ASR)
7136 	    inst.instruction |= 0x00200000;  /* sh bit */
7137 	  inst.instruction |= (inst.reloc.exp.X_add_number & 0x1c) << 10;
7138 	  inst.instruction |= (inst.reloc.exp.X_add_number & 0x03) << 6;
7139 	}
7140       inst.reloc.type = BFD_RELOC_UNUSED;
7141     }
7142 }
7143 
7144 static void
do_t_ssat16(void)7145 do_t_ssat16 (void)
7146 {
7147   inst.instruction |= inst.operands[0].reg << 8;
7148   inst.instruction |= inst.operands[1].imm - 1;
7149   inst.instruction |= inst.operands[2].reg << 16;
7150 }
7151 
7152 static void
do_t_strex(void)7153 do_t_strex (void)
7154 {
7155   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
7156 	      || inst.operands[2].postind || inst.operands[2].writeback
7157 	      || inst.operands[2].immisreg || inst.operands[2].shifted
7158 	      || inst.operands[2].negative,
7159 	      _("instruction does not accept this addressing mode"));
7160 
7161   inst.instruction |= inst.operands[0].reg << 8;
7162   inst.instruction |= inst.operands[1].reg << 12;
7163   inst.instruction |= inst.operands[2].reg << 16;
7164   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
7165 }
7166 
7167 static void
do_t_strexd(void)7168 do_t_strexd (void)
7169 {
7170   if (!inst.operands[2].present)
7171     inst.operands[2].reg = inst.operands[1].reg + 1;
7172 
7173   constraint (inst.operands[0].reg == inst.operands[1].reg
7174 	      || inst.operands[0].reg == inst.operands[2].reg
7175 	      || inst.operands[0].reg == inst.operands[3].reg
7176 	      || inst.operands[1].reg == inst.operands[2].reg,
7177 	      BAD_OVERLAP);
7178 
7179   inst.instruction |= inst.operands[0].reg;
7180   inst.instruction |= inst.operands[1].reg << 12;
7181   inst.instruction |= inst.operands[2].reg << 8;
7182   inst.instruction |= inst.operands[3].reg << 16;
7183 }
7184 
7185 static void
do_t_sxtah(void)7186 do_t_sxtah (void)
7187 {
7188   inst.instruction |= inst.operands[0].reg << 8;
7189   inst.instruction |= inst.operands[1].reg << 16;
7190   inst.instruction |= inst.operands[2].reg;
7191   inst.instruction |= inst.operands[3].imm << 4;
7192 }
7193 
7194 static void
do_t_sxth(void)7195 do_t_sxth (void)
7196 {
7197   if (inst.instruction <= 0xffff && inst.size_req != 4
7198       && inst.operands[0].reg <= 7 && inst.operands[1].reg <= 7
7199       && (!inst.operands[2].present || inst.operands[2].imm == 0))
7200     {
7201       inst.instruction = THUMB_OP16 (inst.instruction);
7202       inst.instruction |= inst.operands[0].reg;
7203       inst.instruction |= inst.operands[1].reg << 3;
7204     }
7205   else if (unified_syntax)
7206     {
7207       if (inst.instruction <= 0xffff)
7208 	inst.instruction = THUMB_OP32 (inst.instruction);
7209       inst.instruction |= inst.operands[0].reg << 8;
7210       inst.instruction |= inst.operands[1].reg;
7211       inst.instruction |= inst.operands[2].imm << 4;
7212     }
7213   else
7214     {
7215       constraint (inst.operands[2].present && inst.operands[2].imm != 0,
7216 		  _("Thumb encoding does not support rotation"));
7217       constraint (1, BAD_HIREG);
7218     }
7219 }
7220 
7221 static void
do_t_swi(void)7222 do_t_swi (void)
7223 {
7224   inst.reloc.type = BFD_RELOC_ARM_SWI;
7225 }
7226 
7227 static void
do_t_usat(void)7228 do_t_usat (void)
7229 {
7230   inst.instruction |= inst.operands[0].reg << 8;
7231   inst.instruction |= inst.operands[1].imm;
7232   inst.instruction |= inst.operands[2].reg << 16;
7233 
7234   if (inst.operands[3].present)
7235     {
7236       constraint (inst.reloc.exp.X_op != O_constant,
7237 		  _("expression too complex"));
7238       if (inst.reloc.exp.X_add_number != 0)
7239 	{
7240 	  if (inst.operands[3].shift_kind == SHIFT_ASR)
7241 	    inst.instruction |= 0x00200000;  /* sh bit */
7242 
7243 	  inst.instruction |= (inst.reloc.exp.X_add_number & 0x1c) << 10;
7244 	  inst.instruction |= (inst.reloc.exp.X_add_number & 0x03) << 6;
7245 	}
7246       inst.reloc.type = BFD_RELOC_UNUSED;
7247     }
7248 }
7249 
7250 static void
do_t_usat16(void)7251 do_t_usat16 (void)
7252 {
7253   inst.instruction |= inst.operands[0].reg << 8;
7254   inst.instruction |= inst.operands[1].imm;
7255   inst.instruction |= inst.operands[2].reg << 16;
7256 }
7257 
7258 /* Overall per-instruction processing.	*/
7259 
7260 /* We need to be able to fix up arbitrary expressions in some statements.
7261    This is so that we can handle symbols that are an arbitrary distance from
7262    the pc.  The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
7263    which returns part of an address in a form which will be valid for
7264    a data instruction.	We do this by pushing the expression into a symbol
7265    in the expr_section, and creating a fix for that.  */
7266 
7267 static void
fix_new_arm(fragS * frag,int where,short int size,expressionS * exp,int pc_rel,int reloc)7268 fix_new_arm (fragS *	   frag,
7269 	     int	   where,
7270 	     short int	   size,
7271 	     expressionS * exp,
7272 	     int	   pc_rel,
7273 	     int	   reloc)
7274 {
7275   fixS *	   new_fix;
7276 
7277   switch (exp->X_op)
7278     {
7279     case O_constant:
7280     case O_symbol:
7281     case O_add:
7282     case O_subtract:
7283       new_fix = fix_new_exp (frag, where, size, exp, pc_rel, reloc);
7284       break;
7285 
7286     default:
7287       new_fix = fix_new (frag, where, size, make_expr_symbol (exp), 0,
7288 			 pc_rel, reloc);
7289       break;
7290     }
7291 
7292   /* Mark whether the fix is to a THUMB instruction, or an ARM
7293      instruction.  */
7294   new_fix->tc_fix_data = thumb_mode;
7295 }
7296 
7297 static void
output_inst(const char * str)7298 output_inst (const char * str)
7299 {
7300   char * to = NULL;
7301 
7302   if (inst.error)
7303     {
7304       as_bad ("%s -- `%s'", inst.error, str);
7305       return;
7306     }
7307   if (inst.size == 0)
7308     return;
7309 
7310   to = frag_more (inst.size);
7311 
7312   if (thumb_mode && (inst.size > THUMB_SIZE))
7313     {
7314       assert (inst.size == (2 * THUMB_SIZE));
7315       md_number_to_chars (to, inst.instruction >> 16, THUMB_SIZE);
7316       md_number_to_chars (to + THUMB_SIZE, inst.instruction, THUMB_SIZE);
7317     }
7318   else if (inst.size > INSN_SIZE)
7319     {
7320       assert (inst.size == (2 * INSN_SIZE));
7321       md_number_to_chars (to, inst.instruction, INSN_SIZE);
7322       md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE);
7323     }
7324   else
7325     md_number_to_chars (to, inst.instruction, inst.size);
7326 
7327   if (inst.reloc.type != BFD_RELOC_UNUSED)
7328     fix_new_arm (frag_now, to - frag_now->fr_literal,
7329 		 inst.size, & inst.reloc.exp, inst.reloc.pc_rel,
7330 		 inst.reloc.type);
7331 
7332 #ifdef OBJ_ELF
7333   dwarf2_emit_insn (inst.size);
7334 #endif
7335 }
7336 
7337 /* Tag values used in struct asm_opcode's tag field.  */
7338 enum opcode_tag
7339 {
7340   OT_unconditional,	/* Instruction cannot be conditionalized.
7341 			   The ARM condition field is still 0xE.  */
7342   OT_unconditionalF,	/* Instruction cannot be conditionalized
7343 			   and carries 0xF in its ARM condition field.  */
7344   OT_csuffix,		/* Instruction takes a conditional suffix.  */
7345   OT_cinfix3,		/* Instruction takes a conditional infix,
7346 			   beginning at character index 3.  (In
7347 			   unified mode, it becomes a suffix.)  */
7348   OT_csuf_or_in3,	/* Instruction takes either a conditional
7349 			   suffix or an infix at character index 3.
7350 			   (In unified mode, a suffix only.  */
7351   OT_odd_infix_unc,	/* This is the unconditional variant of an
7352 			   instruction that takes a conditional infix
7353 			   at an unusual position.  In unified mode,
7354 			   this variant will accept a suffix.  */
7355   OT_odd_infix_0	/* Values greater than or equal to OT_odd_infix_0
7356 			   are the conditional variants of instructions that
7357 			   take conditional infixes in unusual positions.
7358 			   The infix appears at character index
7359 			   (tag - OT_odd_infix_0).  These are not accepted
7360 			   in unified mode.  */
7361 };
7362 
7363 /* Subroutine of md_assemble, responsible for looking up the primary
7364    opcode from the mnemonic the user wrote.  STR points to the
7365    beginning of the mnemonic.
7366 
7367    This is not simply a hash table lookup, because of conditional
7368    variants.  Most instructions have conditional variants, which are
7369    expressed with a _conditional affix_ to the mnemonic.  If we were
7370    to encode each conditional variant as a literal string in the opcode
7371    table, it would have approximately 20,000 entries.
7372 
7373    Most mnemonics take this affix as a suffix, and in unified syntax,
7374    'most' is upgraded to 'all'.  However, in the divided syntax, some
7375    instructions take the affix as an infix, notably the s-variants of
7376    the arithmetic instructions.  Of those instructions, all but six
7377    have the infix appear after the third character of the mnemonic.
7378 
7379    Accordingly, the algorithm for looking up primary opcodes given
7380    an identifier is:
7381 
7382    1. Look up the identifier in the opcode table.
7383       If we find a match, go to step U.
7384 
7385    2. Look up the last two characters of the identifier in the
7386       conditions table.  If we find a match, look up the first N-2
7387       characters of the identifier in the opcode table.  If we
7388       find a match, go to step CE.
7389 
7390    3. Look up the fourth and fifth characters of the identifier in
7391       the conditions table.  If we find a match, extract those
7392       characters from the identifier, and look up the remaining
7393       characters in the opcode table.  If we find a match, go
7394       to step CM.
7395 
7396    4. Fail.
7397 
7398    U. Examine the tag field of the opcode structure, in case this is
7399       one of the six instructions with its conditional infix in an
7400       unusual place.  If it is, the tag tells us where to find the
7401       infix; look it up in the conditions table and set inst.cond
7402       accordingly.  Otherwise, this is an unconditional instruction.
7403       Again set inst.cond accordingly.  Return the opcode structure.
7404 
7405   CE. Examine the tag field to make sure this is an instruction that
7406       should receive a conditional suffix.  If it is not, fail.
7407       Otherwise, set inst.cond from the suffix we already looked up,
7408       and return the opcode structure.
7409 
7410   CM. Examine the tag field to make sure this is an instruction that
7411       should receive a conditional infix after the third character.
7412       If it is not, fail.  Otherwise, undo the edits to the current
7413       line of input and proceed as for case CE.  */
7414 
7415 static const struct asm_opcode *
opcode_lookup(char ** str)7416 opcode_lookup (char **str)
7417 {
7418   char *end, *base;
7419   char *affix;
7420   const struct asm_opcode *opcode;
7421   const struct asm_cond *cond;
7422 
7423   /* Scan up to the end of the mnemonic, which must end in white space,
7424      '.' (in unified mode only), or end of string.  */
7425   for (base = end = *str; *end != '\0'; end++)
7426     if (*end == ' ' || (unified_syntax && *end == '.'))
7427       break;
7428 
7429   if (end == base)
7430     return 0;
7431 
7432   /* Handle a possible width suffix.  */
7433   if (end[0] == '.')
7434     {
7435       if (end[1] == 'w' && (end[2] == ' ' || end[2] == '\0'))
7436 	inst.size_req = 4;
7437       else if (end[1] == 'n' && (end[2] == ' ' || end[2] == '\0'))
7438 	inst.size_req = 2;
7439       else
7440 	return 0;
7441 
7442       *str = end + 2;
7443     }
7444   else
7445     *str = end;
7446 
7447   /* Look for unaffixed or special-case affixed mnemonic.  */
7448   opcode = hash_find_n (arm_ops_hsh, base, end - base);
7449   if (opcode)
7450     {
7451       /* step U */
7452       if (opcode->tag < OT_odd_infix_0)
7453 	{
7454 	  inst.cond = COND_ALWAYS;
7455 	  return opcode;
7456 	}
7457 
7458       if (unified_syntax)
7459 	as_warn (_("conditional infixes are deprecated in unified syntax"));
7460       affix = base + (opcode->tag - OT_odd_infix_0);
7461       cond = hash_find_n (arm_cond_hsh, affix, 2);
7462       assert (cond);
7463 
7464       inst.cond = cond->value;
7465       return opcode;
7466     }
7467 
7468   /* Cannot have a conditional suffix on a mnemonic of less than two
7469      characters.  */
7470   if (end - base < 3)
7471     return 0;
7472 
7473   /* Look for suffixed mnemonic.  */
7474   affix = end - 2;
7475   cond = hash_find_n (arm_cond_hsh, affix, 2);
7476   opcode = hash_find_n (arm_ops_hsh, base, affix - base);
7477   if (opcode && cond)
7478     {
7479       /* step CE */
7480       switch (opcode->tag)
7481 	{
7482 	case OT_cinfix3:
7483 	case OT_odd_infix_unc:
7484 	  if (!unified_syntax)
7485 	    return 0;
7486 	  /* else fall through */
7487 
7488 	case OT_csuffix:
7489 	case OT_csuf_or_in3:
7490 	  inst.cond = cond->value;
7491 	  return opcode;
7492 
7493 	case OT_unconditional:
7494 	case OT_unconditionalF:
7495 	  /* delayed diagnostic */
7496 	  inst.error = BAD_COND;
7497 	  inst.cond = COND_ALWAYS;
7498 	  return opcode;
7499 
7500 	default:
7501 	  return 0;
7502 	}
7503     }
7504 
7505   /* Cannot have a usual-position infix on a mnemonic of less than
7506      six characters (five would be a suffix).  */
7507   if (end - base < 6)
7508     return 0;
7509 
7510   /* Look for infixed mnemonic in the usual position.  */
7511   affix = base + 3;
7512   cond = hash_find_n (arm_cond_hsh, affix, 2);
7513   if (cond)
7514     {
7515       char save[2];
7516       memcpy (save, affix, 2);
7517       memmove (affix, affix + 2, (end - affix) - 2);
7518       opcode = hash_find_n (arm_ops_hsh, base, (end - base) - 2);
7519       memmove (affix + 2, affix, (end - affix) - 2);
7520       memcpy (affix, save, 2);
7521     }
7522   if (opcode && (opcode->tag == OT_cinfix3 || opcode->tag == OT_csuf_or_in3))
7523     {
7524       /* step CM */
7525       if (unified_syntax)
7526 	as_warn (_("conditional infixes are deprecated in unified syntax"));
7527 
7528       inst.cond = cond->value;
7529       return opcode;
7530     }
7531 
7532   return 0;
7533 }
7534 
7535 void
md_assemble(char * str)7536 md_assemble (char *str)
7537 {
7538   char *p = str;
7539   const struct asm_opcode * opcode;
7540 
7541   /* Align the previous label if needed.  */
7542   if (last_label_seen != NULL)
7543     {
7544       symbol_set_frag (last_label_seen, frag_now);
7545       S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
7546       S_SET_SEGMENT (last_label_seen, now_seg);
7547     }
7548 
7549   memset (&inst, '\0', sizeof (inst));
7550   inst.reloc.type = BFD_RELOC_UNUSED;
7551 
7552   opcode = opcode_lookup (&p);
7553   if (!opcode)
7554     {
7555       /* It wasn't an instruction, but it might be a register alias of
7556 	 the form alias .req reg.  */
7557       if (!create_register_alias (str, p))
7558 	as_bad (_("bad instruction `%s'"), str);
7559 
7560       return;
7561     }
7562 
7563   if (thumb_mode)
7564     {
7565       /* Check that this instruction is supported for this CPU.  */
7566       if (thumb_mode == 1 && (opcode->tvariant & cpu_variant) == 0)
7567 	{
7568 	  as_bad (_("selected processor does not support `%s'"), str);
7569 	  return;
7570 	}
7571       if (inst.cond != COND_ALWAYS && !unified_syntax
7572 	  && opcode->tencode != do_t_branch)
7573 	{
7574 	  as_bad (_("Thumb does not support conditional execution"));
7575 	  return;
7576 	}
7577 
7578       mapping_state (MAP_THUMB);
7579       inst.instruction = opcode->tvalue;
7580 
7581       if (!parse_operands (p, opcode->operands))
7582 	opcode->tencode ();
7583 
7584       if (!inst.error)
7585 	{
7586 	  assert (inst.instruction < 0xe800 || inst.instruction > 0xffff);
7587 	  inst.size = (inst.instruction > 0xffff ? 4 : 2);
7588 	  if (inst.size_req && inst.size_req != inst.size)
7589 	    {
7590 	      as_bad (_("cannot honor width suffix -- `%s'"), str);
7591 	      return;
7592 	    }
7593 	}
7594     }
7595   else
7596     {
7597       /* Check that this instruction is supported for this CPU.  */
7598       if ((opcode->avariant & cpu_variant) == 0)
7599 	{
7600 	  as_bad (_("selected processor does not support `%s'"), str);
7601 	  return;
7602 	}
7603       if (inst.size_req)
7604 	{
7605 	  as_bad (_("width suffixes are invalid in ARM mode -- `%s'"), str);
7606 	  return;
7607 	}
7608 
7609       mapping_state (MAP_ARM);
7610       inst.instruction = opcode->avalue;
7611       if (opcode->tag == OT_unconditionalF)
7612 	inst.instruction |= 0xF << 28;
7613       else
7614 	inst.instruction |= inst.cond << 28;
7615       inst.size = INSN_SIZE;
7616       if (!parse_operands (p, opcode->operands))
7617 	opcode->aencode ();
7618     }
7619   output_inst (str);
7620 }
7621 
7622 /* Various frobbings of labels and their addresses.  */
7623 
7624 void
arm_start_line_hook(void)7625 arm_start_line_hook (void)
7626 {
7627   last_label_seen = NULL;
7628 }
7629 
7630 void
arm_frob_label(symbolS * sym)7631 arm_frob_label (symbolS * sym)
7632 {
7633   last_label_seen = sym;
7634 
7635   ARM_SET_THUMB (sym, thumb_mode);
7636 
7637 #if defined OBJ_COFF || defined OBJ_ELF
7638   ARM_SET_INTERWORK (sym, support_interwork);
7639 #endif
7640 
7641   /* Note - do not allow local symbols (.Lxxx) to be labeled
7642      as Thumb functions.  This is because these labels, whilst
7643      they exist inside Thumb code, are not the entry points for
7644      possible ARM->Thumb calls.	 Also, these labels can be used
7645      as part of a computed goto or switch statement.  eg gcc
7646      can generate code that looks like this:
7647 
7648 		ldr  r2, [pc, .Laaa]
7649 		lsl  r3, r3, #2
7650 		ldr  r2, [r3, r2]
7651 		mov  pc, r2
7652 
7653        .Lbbb:  .word .Lxxx
7654        .Lccc:  .word .Lyyy
7655        ..etc...
7656        .Laaa:	.word Lbbb
7657 
7658      The first instruction loads the address of the jump table.
7659      The second instruction converts a table index into a byte offset.
7660      The third instruction gets the jump address out of the table.
7661      The fourth instruction performs the jump.
7662 
7663      If the address stored at .Laaa is that of a symbol which has the
7664      Thumb_Func bit set, then the linker will arrange for this address
7665      to have the bottom bit set, which in turn would mean that the
7666      address computation performed by the third instruction would end
7667      up with the bottom bit set.  Since the ARM is capable of unaligned
7668      word loads, the instruction would then load the incorrect address
7669      out of the jump table, and chaos would ensue.  */
7670   if (label_is_thumb_function_name
7671       && (S_GET_NAME (sym)[0] != '.' || S_GET_NAME (sym)[1] != 'L')
7672       && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
7673     {
7674       /* When the address of a Thumb function is taken the bottom
7675 	 bit of that address should be set.  This will allow
7676 	 interworking between Arm and Thumb functions to work
7677 	 correctly.  */
7678 
7679       THUMB_SET_FUNC (sym, 1);
7680 
7681       label_is_thumb_function_name = FALSE;
7682     }
7683 }
7684 
7685 int
arm_data_in_code(void)7686 arm_data_in_code (void)
7687 {
7688   if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
7689     {
7690       *input_line_pointer = '/';
7691       input_line_pointer += 5;
7692       *input_line_pointer = 0;
7693       return 1;
7694     }
7695 
7696   return 0;
7697 }
7698 
7699 char *
arm_canonicalize_symbol_name(char * name)7700 arm_canonicalize_symbol_name (char * name)
7701 {
7702   int len;
7703 
7704   if (thumb_mode && (len = strlen (name)) > 5
7705       && streq (name + len - 5, "/data"))
7706     *(name + len - 5) = 0;
7707 
7708   return name;
7709 }
7710 
7711 /* Table of all register names defined by default.  The user can
7712    define additional names with .req.  Note that all register names
7713    should appear in both upper and lowercase variants.	Some registers
7714    also have mixed-case names.	*/
7715 
7716 #define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE }
7717 #define REGNUM(p,n,t) REGDEF(p##n, n, t)
7718 #define REGSET(p,t) \
7719   REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
7720   REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
7721   REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
7722   REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
7723 
7724 static const struct reg_entry reg_names[] =
7725 {
7726   /* ARM integer registers.  */
7727   REGSET(r, RN), REGSET(R, RN),
7728 
7729   /* ATPCS synonyms.  */
7730   REGDEF(a1,0,RN), REGDEF(a2,1,RN), REGDEF(a3, 2,RN), REGDEF(a4, 3,RN),
7731   REGDEF(v1,4,RN), REGDEF(v2,5,RN), REGDEF(v3, 6,RN), REGDEF(v4, 7,RN),
7732   REGDEF(v5,8,RN), REGDEF(v6,9,RN), REGDEF(v7,10,RN), REGDEF(v8,11,RN),
7733 
7734   REGDEF(A1,0,RN), REGDEF(A2,1,RN), REGDEF(A3, 2,RN), REGDEF(A4, 3,RN),
7735   REGDEF(V1,4,RN), REGDEF(V2,5,RN), REGDEF(V3, 6,RN), REGDEF(V4, 7,RN),
7736   REGDEF(V5,8,RN), REGDEF(V6,9,RN), REGDEF(V7,10,RN), REGDEF(V8,11,RN),
7737 
7738   /* Well-known aliases.  */
7739   REGDEF(wr, 7,RN), REGDEF(sb, 9,RN), REGDEF(sl,10,RN), REGDEF(fp,11,RN),
7740   REGDEF(ip,12,RN), REGDEF(sp,13,RN), REGDEF(lr,14,RN), REGDEF(pc,15,RN),
7741 
7742   REGDEF(WR, 7,RN), REGDEF(SB, 9,RN), REGDEF(SL,10,RN), REGDEF(FP,11,RN),
7743   REGDEF(IP,12,RN), REGDEF(SP,13,RN), REGDEF(LR,14,RN), REGDEF(PC,15,RN),
7744 
7745   /* Coprocessor numbers.  */
7746   REGSET(p, CP), REGSET(P, CP),
7747 
7748   /* Coprocessor register numbers.  The "cr" variants are for backward
7749      compatibility.  */
7750   REGSET(c,  CN), REGSET(C, CN),
7751   REGSET(cr, CN), REGSET(CR, CN),
7752 
7753   /* FPA registers.  */
7754   REGNUM(f,0,FN), REGNUM(f,1,FN), REGNUM(f,2,FN), REGNUM(f,3,FN),
7755   REGNUM(f,4,FN), REGNUM(f,5,FN), REGNUM(f,6,FN), REGNUM(f,7, FN),
7756 
7757   REGNUM(F,0,FN), REGNUM(F,1,FN), REGNUM(F,2,FN), REGNUM(F,3,FN),
7758   REGNUM(F,4,FN), REGNUM(F,5,FN), REGNUM(F,6,FN), REGNUM(F,7, FN),
7759 
7760   /* VFP SP registers.	*/
7761   REGSET(s,VFS),
7762   REGNUM(s,16,VFS), REGNUM(s,17,VFS), REGNUM(s,18,VFS), REGNUM(s,19,VFS),
7763   REGNUM(s,20,VFS), REGNUM(s,21,VFS), REGNUM(s,22,VFS), REGNUM(s,23,VFS),
7764   REGNUM(s,24,VFS), REGNUM(s,25,VFS), REGNUM(s,26,VFS), REGNUM(s,27,VFS),
7765   REGNUM(s,28,VFS), REGNUM(s,29,VFS), REGNUM(s,30,VFS), REGNUM(s,31,VFS),
7766 
7767   REGSET(S,VFS),
7768   REGNUM(S,16,VFS), REGNUM(S,17,VFS), REGNUM(S,18,VFS), REGNUM(S,19,VFS),
7769   REGNUM(S,20,VFS), REGNUM(S,21,VFS), REGNUM(S,22,VFS), REGNUM(S,23,VFS),
7770   REGNUM(S,24,VFS), REGNUM(S,25,VFS), REGNUM(S,26,VFS), REGNUM(S,27,VFS),
7771   REGNUM(S,28,VFS), REGNUM(S,29,VFS), REGNUM(S,30,VFS), REGNUM(S,31,VFS),
7772 
7773   /* VFP DP Registers.	*/
7774   REGSET(d,VFD), REGSET(D,VFS),
7775 
7776   /* VFP control registers.  */
7777   REGDEF(fpsid,0,VFC), REGDEF(fpscr,1,VFC), REGDEF(fpexc,8,VFC),
7778   REGDEF(FPSID,0,VFC), REGDEF(FPSCR,1,VFC), REGDEF(FPEXC,8,VFC),
7779 
7780   /* Maverick DSP coprocessor registers.  */
7781   REGSET(mvf,MVF),  REGSET(mvd,MVD),  REGSET(mvfx,MVFX),  REGSET(mvdx,MVDX),
7782   REGSET(MVF,MVF),  REGSET(MVD,MVD),  REGSET(MVFX,MVFX),  REGSET(MVDX,MVDX),
7783 
7784   REGNUM(mvax,0,MVAX), REGNUM(mvax,1,MVAX),
7785   REGNUM(mvax,2,MVAX), REGNUM(mvax,3,MVAX),
7786   REGDEF(dspsc,0,DSPSC),
7787 
7788   REGNUM(MVAX,0,MVAX), REGNUM(MVAX,1,MVAX),
7789   REGNUM(MVAX,2,MVAX), REGNUM(MVAX,3,MVAX),
7790   REGDEF(DSPSC,0,DSPSC),
7791 
7792   /* iWMMXt data registers - p0, c0-15.	 */
7793   REGSET(wr,MMXWR), REGSET(wR,MMXWR), REGSET(WR, MMXWR),
7794 
7795   /* iWMMXt control registers - p1, c0-3.  */
7796   REGDEF(wcid,	0,MMXWC),  REGDEF(wCID,	 0,MMXWC),  REGDEF(WCID,  0,MMXWC),
7797   REGDEF(wcon,	1,MMXWC),  REGDEF(wCon,	 1,MMXWC),  REGDEF(WCON,  1,MMXWC),
7798   REGDEF(wcssf, 2,MMXWC),  REGDEF(wCSSF, 2,MMXWC),  REGDEF(WCSSF, 2,MMXWC),
7799   REGDEF(wcasf, 3,MMXWC),  REGDEF(wCASF, 3,MMXWC),  REGDEF(WCASF, 3,MMXWC),
7800 
7801   /* iWMMXt scalar (constant/offset) registers - p1, c8-11.  */
7802   REGDEF(wcgr0, 8,MMXWCG),  REGDEF(wCGR0, 8,MMXWCG),  REGDEF(WCGR0, 8,MMXWCG),
7803   REGDEF(wcgr1, 9,MMXWCG),  REGDEF(wCGR1, 9,MMXWCG),  REGDEF(WCGR1, 9,MMXWCG),
7804   REGDEF(wcgr2,10,MMXWCG),  REGDEF(wCGR2,10,MMXWCG),  REGDEF(WCGR2,10,MMXWCG),
7805   REGDEF(wcgr3,11,MMXWCG),  REGDEF(wCGR3,11,MMXWCG),  REGDEF(WCGR3,11,MMXWCG),
7806 
7807   /* XScale accumulator registers.  */
7808   REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE),
7809 };
7810 #undef REGDEF
7811 #undef REGNUM
7812 #undef REGSET
7813 
7814 /* Table of all PSR suffixes.  Bare "CPSR" and "SPSR" are handled
7815    within psr_required_here.  */
7816 static const struct asm_psr psrs[] =
7817 {
7818   /* Backward compatibility notation.  Note that "all" is no longer
7819      truly all possible PSR bits.  */
7820   {"all",  PSR_c | PSR_f},
7821   {"flg",  PSR_f},
7822   {"ctl",  PSR_c},
7823 
7824   /* Individual flags.	*/
7825   {"f",	   PSR_f},
7826   {"c",	   PSR_c},
7827   {"x",	   PSR_x},
7828   {"s",	   PSR_s},
7829   /* Combinations of flags.  */
7830   {"fs",   PSR_f | PSR_s},
7831   {"fx",   PSR_f | PSR_x},
7832   {"fc",   PSR_f | PSR_c},
7833   {"sf",   PSR_s | PSR_f},
7834   {"sx",   PSR_s | PSR_x},
7835   {"sc",   PSR_s | PSR_c},
7836   {"xf",   PSR_x | PSR_f},
7837   {"xs",   PSR_x | PSR_s},
7838   {"xc",   PSR_x | PSR_c},
7839   {"cf",   PSR_c | PSR_f},
7840   {"cs",   PSR_c | PSR_s},
7841   {"cx",   PSR_c | PSR_x},
7842   {"fsx",  PSR_f | PSR_s | PSR_x},
7843   {"fsc",  PSR_f | PSR_s | PSR_c},
7844   {"fxs",  PSR_f | PSR_x | PSR_s},
7845   {"fxc",  PSR_f | PSR_x | PSR_c},
7846   {"fcs",  PSR_f | PSR_c | PSR_s},
7847   {"fcx",  PSR_f | PSR_c | PSR_x},
7848   {"sfx",  PSR_s | PSR_f | PSR_x},
7849   {"sfc",  PSR_s | PSR_f | PSR_c},
7850   {"sxf",  PSR_s | PSR_x | PSR_f},
7851   {"sxc",  PSR_s | PSR_x | PSR_c},
7852   {"scf",  PSR_s | PSR_c | PSR_f},
7853   {"scx",  PSR_s | PSR_c | PSR_x},
7854   {"xfs",  PSR_x | PSR_f | PSR_s},
7855   {"xfc",  PSR_x | PSR_f | PSR_c},
7856   {"xsf",  PSR_x | PSR_s | PSR_f},
7857   {"xsc",  PSR_x | PSR_s | PSR_c},
7858   {"xcf",  PSR_x | PSR_c | PSR_f},
7859   {"xcs",  PSR_x | PSR_c | PSR_s},
7860   {"cfs",  PSR_c | PSR_f | PSR_s},
7861   {"cfx",  PSR_c | PSR_f | PSR_x},
7862   {"csf",  PSR_c | PSR_s | PSR_f},
7863   {"csx",  PSR_c | PSR_s | PSR_x},
7864   {"cxf",  PSR_c | PSR_x | PSR_f},
7865   {"cxs",  PSR_c | PSR_x | PSR_s},
7866   {"fsxc", PSR_f | PSR_s | PSR_x | PSR_c},
7867   {"fscx", PSR_f | PSR_s | PSR_c | PSR_x},
7868   {"fxsc", PSR_f | PSR_x | PSR_s | PSR_c},
7869   {"fxcs", PSR_f | PSR_x | PSR_c | PSR_s},
7870   {"fcsx", PSR_f | PSR_c | PSR_s | PSR_x},
7871   {"fcxs", PSR_f | PSR_c | PSR_x | PSR_s},
7872   {"sfxc", PSR_s | PSR_f | PSR_x | PSR_c},
7873   {"sfcx", PSR_s | PSR_f | PSR_c | PSR_x},
7874   {"sxfc", PSR_s | PSR_x | PSR_f | PSR_c},
7875   {"sxcf", PSR_s | PSR_x | PSR_c | PSR_f},
7876   {"scfx", PSR_s | PSR_c | PSR_f | PSR_x},
7877   {"scxf", PSR_s | PSR_c | PSR_x | PSR_f},
7878   {"xfsc", PSR_x | PSR_f | PSR_s | PSR_c},
7879   {"xfcs", PSR_x | PSR_f | PSR_c | PSR_s},
7880   {"xsfc", PSR_x | PSR_s | PSR_f | PSR_c},
7881   {"xscf", PSR_x | PSR_s | PSR_c | PSR_f},
7882   {"xcfs", PSR_x | PSR_c | PSR_f | PSR_s},
7883   {"xcsf", PSR_x | PSR_c | PSR_s | PSR_f},
7884   {"cfsx", PSR_c | PSR_f | PSR_s | PSR_x},
7885   {"cfxs", PSR_c | PSR_f | PSR_x | PSR_s},
7886   {"csfx", PSR_c | PSR_s | PSR_f | PSR_x},
7887   {"csxf", PSR_c | PSR_s | PSR_x | PSR_f},
7888   {"cxfs", PSR_c | PSR_x | PSR_f | PSR_s},
7889   {"cxsf", PSR_c | PSR_x | PSR_s | PSR_f},
7890 };
7891 
7892 /* Table of all shift-in-operand names.	 */
7893 static const struct asm_shift_name shift_names [] =
7894 {
7895   { "asl", SHIFT_LSL },	 { "ASL", SHIFT_LSL },
7896   { "lsl", SHIFT_LSL },	 { "LSL", SHIFT_LSL },
7897   { "lsr", SHIFT_LSR },	 { "LSR", SHIFT_LSR },
7898   { "asr", SHIFT_ASR },	 { "ASR", SHIFT_ASR },
7899   { "ror", SHIFT_ROR },	 { "ROR", SHIFT_ROR },
7900   { "rrx", SHIFT_RRX },	 { "RRX", SHIFT_RRX }
7901 };
7902 
7903 /* Table of all explicit relocation names.  */
7904 #ifdef OBJ_ELF
7905 static struct reloc_entry reloc_names[] =
7906 {
7907   { "got",     BFD_RELOC_ARM_GOT32   },	 { "GOT",     BFD_RELOC_ARM_GOT32   },
7908   { "gotoff",  BFD_RELOC_ARM_GOTOFF  },	 { "GOTOFF",  BFD_RELOC_ARM_GOTOFF  },
7909   { "plt",     BFD_RELOC_ARM_PLT32   },	 { "PLT",     BFD_RELOC_ARM_PLT32   },
7910   { "target1", BFD_RELOC_ARM_TARGET1 },	 { "TARGET1", BFD_RELOC_ARM_TARGET1 },
7911   { "target2", BFD_RELOC_ARM_TARGET2 },	 { "TARGET2", BFD_RELOC_ARM_TARGET2 },
7912   { "sbrel",   BFD_RELOC_ARM_SBREL32 },	 { "SBREL",   BFD_RELOC_ARM_SBREL32 },
7913   { "tlsgd",   BFD_RELOC_ARM_TLS_GD32},  { "TLSGD",   BFD_RELOC_ARM_TLS_GD32},
7914   { "tlsldm",  BFD_RELOC_ARM_TLS_LDM32}, { "TLSLDM",  BFD_RELOC_ARM_TLS_LDM32},
7915   { "tlsldo",  BFD_RELOC_ARM_TLS_LDO32}, { "TLSLDO",  BFD_RELOC_ARM_TLS_LDO32},
7916   { "gottpoff",BFD_RELOC_ARM_TLS_IE32},  { "GOTTPOFF",BFD_RELOC_ARM_TLS_IE32},
7917   { "tpoff",   BFD_RELOC_ARM_TLS_LE32},  { "TPOFF",   BFD_RELOC_ARM_TLS_LE32}
7918 };
7919 #endif
7920 
7921 /* Table of all conditional affixes.  0xF is not defined as a condition code.  */
7922 static const struct asm_cond conds[] =
7923 {
7924   {"eq", 0x0},
7925   {"ne", 0x1},
7926   {"cs", 0x2}, {"hs", 0x2},
7927   {"cc", 0x3}, {"ul", 0x3}, {"lo", 0x3},
7928   {"mi", 0x4},
7929   {"pl", 0x5},
7930   {"vs", 0x6},
7931   {"vc", 0x7},
7932   {"hi", 0x8},
7933   {"ls", 0x9},
7934   {"ge", 0xa},
7935   {"lt", 0xb},
7936   {"gt", 0xc},
7937   {"le", 0xd},
7938   {"al", 0xe}
7939 };
7940 
7941 /* Table of ARM-format instructions.	*/
7942 
7943 /* Macros for gluing together operand strings.  N.B. In all cases
7944    other than OPS0, the trailing OP_stop comes from default
7945    zero-initialization of the unspecified elements of the array.  */
7946 #define OPS0()		  { OP_stop, }
7947 #define OPS1(a)		  { OP_##a, }
7948 #define OPS2(a,b)	  { OP_##a,OP_##b, }
7949 #define OPS3(a,b,c)	  { OP_##a,OP_##b,OP_##c, }
7950 #define OPS4(a,b,c,d)	  { OP_##a,OP_##b,OP_##c,OP_##d, }
7951 #define OPS5(a,b,c,d,e)	  { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e, }
7952 #define OPS6(a,b,c,d,e,f) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e,OP_##f, }
7953 
7954 /* These macros abstract out the exact format of the mnemonic table and
7955    save some repeated characters.  */
7956 
7957 /* The normal sort of mnemonic; has a Thumb variant; takes a conditional suffix.  */
7958 #define TxCE(mnem, op, top, nops, ops, ae, te) \
7959   { #mnem, OPS##nops ops, OT_csuffix, 0x##op, top, ARM_VARIANT, \
7960     THUMB_VARIANT, do_##ae, do_##te }
7961 
7962 /* Two variants of the above - TCE for a numeric Thumb opcode, tCE for
7963    a T_MNEM_xyz enumerator.  */
7964 #define TCE(mnem, aop, top, nops, ops, ae, te) \
7965        TxCE(mnem, aop, 0x##top, nops, ops, ae, te)
7966 #define tCE(mnem, aop, top, nops, ops, ae, te) \
7967        TxCE(mnem, aop, T_MNEM_##top, nops, ops, ae, te)
7968 
7969 /* Second most common sort of mnemonic: has a Thumb variant, takes a conditional
7970    infix after the third character.  */
7971 #define TxC3(mnem, op, top, nops, ops, ae, te) \
7972   { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, top, ARM_VARIANT, \
7973     THUMB_VARIANT, do_##ae, do_##te }
7974 #define TC3(mnem, aop, top, nops, ops, ae, te) \
7975        TxC3(mnem, aop, 0x##top, nops, ops, ae, te)
7976 #define tC3(mnem, aop, top, nops, ops, ae, te) \
7977        TxC3(mnem, aop, T_MNEM_##top, nops, ops, ae, te)
7978 
7979 /* Mnemonic with a conditional infix in an unusual place.  Each and every variant has to
7980    appear in the condition table.  */
7981 #define TxCM_(m1, m2, m3, op, top, nops, ops, ae, te)	\
7982   { #m1 #m2 #m3, OPS##nops ops, sizeof(#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof(#m1) - 1, \
7983     0x##op, top, ARM_VARIANT, THUMB_VARIANT, do_##ae, do_##te }
7984 
7985 #define TxCM(m1, m2, op, top, nops, ops, ae, te)	\
7986   TxCM_(m1,   , m2, op, top, nops, ops, ae, te),	\
7987   TxCM_(m1, eq, m2, op, top, nops, ops, ae, te),	\
7988   TxCM_(m1, ne, m2, op, top, nops, ops, ae, te),	\
7989   TxCM_(m1, cs, m2, op, top, nops, ops, ae, te),	\
7990   TxCM_(m1, hs, m2, op, top, nops, ops, ae, te),	\
7991   TxCM_(m1, cc, m2, op, top, nops, ops, ae, te),	\
7992   TxCM_(m1, ul, m2, op, top, nops, ops, ae, te),	\
7993   TxCM_(m1, lo, m2, op, top, nops, ops, ae, te),	\
7994   TxCM_(m1, mi, m2, op, top, nops, ops, ae, te),	\
7995   TxCM_(m1, pl, m2, op, top, nops, ops, ae, te),	\
7996   TxCM_(m1, vs, m2, op, top, nops, ops, ae, te),	\
7997   TxCM_(m1, vc, m2, op, top, nops, ops, ae, te),	\
7998   TxCM_(m1, hi, m2, op, top, nops, ops, ae, te),	\
7999   TxCM_(m1, ls, m2, op, top, nops, ops, ae, te),	\
8000   TxCM_(m1, ge, m2, op, top, nops, ops, ae, te),	\
8001   TxCM_(m1, lt, m2, op, top, nops, ops, ae, te),	\
8002   TxCM_(m1, gt, m2, op, top, nops, ops, ae, te),	\
8003   TxCM_(m1, le, m2, op, top, nops, ops, ae, te),	\
8004   TxCM_(m1, al, m2, op, top, nops, ops, ae, te)
8005 
8006 #define TCM(m1,m2, aop, top, nops, ops, ae, te)		\
8007        TxCM(m1,m2, aop, 0x##top, nops, ops, ae, te)
8008 #define tCM(m1,m2, aop, top, nops, ops, ae, te)			\
8009        TxCM(m1,m2, aop, T_MNEM_##top, nops, ops, ae, te)
8010 
8011 /* Mnemonic that cannot be conditionalized.  The ARM condition-code
8012    field is still 0xE.  */
8013 #define TUE(mnem, op, top, nops, ops, ae, te)				\
8014   { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
8015     THUMB_VARIANT, do_##ae, do_##te }
8016 
8017 /* Mnemonic that cannot be conditionalized, and bears 0xF in its ARM
8018    condition code field.  */
8019 #define TUF(mnem, op, top, nops, ops, ae, te)				\
8020   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##top, ARM_VARIANT, \
8021     THUMB_VARIANT, do_##ae, do_##te }
8022 
8023 /* ARM-only variants of all the above.  */
8024 #define CE(mnem,  op, nops, ops, ae)	\
8025   { #mnem, OPS##nops ops, OT_csuffix, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
8026 
8027 #define C3(mnem, op, nops, ops, ae)	\
8028   { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
8029 
8030 #define xCM_(m1, m2, m3, op, nops, ops, ae)	\
8031   { #m1 #m2 #m3, OPS##nops ops, \
8032     sizeof(#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof(#m1) - 1, \
8033     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
8034 
8035 #define CM(m1, m2, op, nops, ops, ae)	\
8036   xCM_(m1,   , m2, op, nops, ops, ae),	\
8037   xCM_(m1, eq, m2, op, nops, ops, ae),	\
8038   xCM_(m1, ne, m2, op, nops, ops, ae),	\
8039   xCM_(m1, cs, m2, op, nops, ops, ae),	\
8040   xCM_(m1, hs, m2, op, nops, ops, ae),	\
8041   xCM_(m1, cc, m2, op, nops, ops, ae),	\
8042   xCM_(m1, ul, m2, op, nops, ops, ae),	\
8043   xCM_(m1, lo, m2, op, nops, ops, ae),	\
8044   xCM_(m1, mi, m2, op, nops, ops, ae),	\
8045   xCM_(m1, pl, m2, op, nops, ops, ae),	\
8046   xCM_(m1, vs, m2, op, nops, ops, ae),	\
8047   xCM_(m1, vc, m2, op, nops, ops, ae),	\
8048   xCM_(m1, hi, m2, op, nops, ops, ae),	\
8049   xCM_(m1, ls, m2, op, nops, ops, ae),	\
8050   xCM_(m1, ge, m2, op, nops, ops, ae),	\
8051   xCM_(m1, lt, m2, op, nops, ops, ae),	\
8052   xCM_(m1, gt, m2, op, nops, ops, ae),	\
8053   xCM_(m1, le, m2, op, nops, ops, ae),	\
8054   xCM_(m1, al, m2, op, nops, ops, ae)
8055 
8056 #define UE(mnem, op, nops, ops, ae)	\
8057   { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
8058 
8059 #define UF(mnem, op, nops, ops, ae)	\
8060   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
8061 
8062 #define do_0 0
8063 
8064 /* Thumb-only, unconditional.  */
8065 #define UT(mnem,  op, nops, ops, te) TUE(mnem,  0, op, nops, ops, 0, te)
8066 
8067 /* ARM-only, takes either a suffix or a position-3 infix
8068    (for an FPA corner case). */
8069 #define C3E(mnem, op, nops, ops, ae) \
8070   { #mnem, OPS##nops ops, OT_csuf_or_in3, 0x##op, 0, ARM_VARIANT, 0, do_##ae, 0 }
8071 
8072 static const struct asm_opcode insns[] =
8073 {
8074 #define ARM_VARIANT ARM_EXT_V1 /* Core ARM Instructions.  */
8075 #define THUMB_VARIANT ARM_EXT_V4T
8076  tCE(and,	0000000, and,      3, (RR, oRR, SH), arit, t_arit3c),
8077  tC3(ands,	0100000, ands,	   3, (RR, oRR, SH), arit, t_arit3c),
8078  tCE(eor,	0200000, eor,	   3, (RR, oRR, SH), arit, t_arit3c),
8079  tC3(eors,	0300000, eors,	   3, (RR, oRR, SH), arit, t_arit3c),
8080  tCE(sub,	0400000, sub,	   3, (RR, oRR, SH), arit, t_add_sub),
8081  tC3(subs,	0500000, subs,	   3, (RR, oRR, SH), arit, t_add_sub),
8082  tCE(add,	0800000, add,	   3, (RR, oRR, SH), arit, t_add_sub),
8083  tC3(adds,	0900000, adds,	   3, (RR, oRR, SH), arit, t_add_sub),
8084  tCE(adc,	0a00000, adc,	   3, (RR, oRR, SH), arit, t_arit3c),
8085  tC3(adcs,	0b00000, adcs,	   3, (RR, oRR, SH), arit, t_arit3c),
8086  tCE(sbc,	0c00000, sbc,	   3, (RR, oRR, SH), arit, t_arit3),
8087  tC3(sbcs,	0d00000, sbcs,	   3, (RR, oRR, SH), arit, t_arit3),
8088  tCE(orr,	1800000, orr,	   3, (RR, oRR, SH), arit, t_arit3c),
8089  tC3(orrs,	1900000, orrs,	   3, (RR, oRR, SH), arit, t_arit3c),
8090  tCE(bic,	1c00000, bic,	   3, (RR, oRR, SH), arit, t_arit3),
8091  tC3(bics,	1d00000, bics,	   3, (RR, oRR, SH), arit, t_arit3),
8092 
8093  /* The p-variants of tst/cmp/cmn/teq (below) are the pre-V6 mechanism
8094     for setting PSR flag bits.  They are obsolete in V6 and do not
8095     have Thumb equivalents. */
8096  tCE(tst,	1100000, tst,	   2, (RR, SH),      cmp,  t_mvn_tst),
8097  tC3(tsts,	1100000, tst,	   2, (RR, SH),      cmp,  t_mvn_tst),
8098   C3(tstp,	110f000,     	   2, (RR, SH),      cmp),
8099  tCE(cmp,	1500000, cmp,	   2, (RR, SH),      cmp,  t_mov_cmp),
8100  tC3(cmps,	1500000, cmp,	   2, (RR, SH),      cmp,  t_mov_cmp),
8101   C3(cmpp,	150f000,     	   2, (RR, SH),      cmp),
8102  tCE(cmn,	1700000, cmn,	   2, (RR, SH),      cmp,  t_mvn_tst),
8103  tC3(cmns,	1700000, cmn,	   2, (RR, SH),      cmp,  t_mvn_tst),
8104   C3(cmnp,	170f000,     	   2, (RR, SH),      cmp),
8105 
8106  tCE(mov,	1a00000, mov,	   2, (RR, SH),      mov,  t_mov_cmp),
8107  tC3(movs,	1b00000, movs,	   2, (RR, SH),      mov,  t_mov_cmp),
8108  tCE(mvn,	1e00000, mvn,	   2, (RR, SH),      mov,  t_mvn_tst),
8109  tC3(mvns,	1f00000, mvns,	   2, (RR, SH),      mov,  t_mvn_tst),
8110 
8111  tCE(ldr,	4100000, ldr,	   2, (RR, ADDR),    ldst, t_ldst),
8112  tC3(ldrb,	4500000, ldrb,	   2, (RR, ADDR),    ldst, t_ldst),
8113  tCE(str,	4000000, str,	   2, (RR, ADDR),    ldst, t_ldst),
8114  tC3(strb,	4400000, strb,	   2, (RR, ADDR),    ldst, t_ldst),
8115 
8116  tC3(stmia,	8800000, stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
8117  tC3(stmea,	8800000, stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
8118  tC3(ldmia,	8900000, ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
8119  tC3(ldmfd,	8900000, ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
8120 
8121  TCE(swi,	f000000, df00,     1, (EXPi),        swi, t_swi),
8122  TCE(b,		a000000, e000,	   1, (EXPr),	     branch, t_branch),
8123  TCE(bl,	b000000, f000f800, 1, (EXPr),	     branch, t_branch23),
8124 
8125   /* Pseudo ops.  */
8126  TCE(adr,	28f0000, 000f,	   2, (RR, EXP),     adr,  t_adr),
8127   C3(adrl,	28f0000,           2, (RR, EXP),     adrl),
8128  tCE(nop,	1a00000, nop,	   1, (oI255c),	     nop,  t_nop),
8129 
8130   /* Thumb-compatibility pseudo ops.  */
8131  tCE(lsl,	1a00000, lsl,	   3, (RR, oRR, SH), shift, t_shift),
8132  tC3(lsls,	1b00000, lsls,	   3, (RR, oRR, SH), shift, t_shift),
8133  tCE(lsr,	1a00020, lsr,	   3, (RR, oRR, SH), shift, t_shift),
8134  tC3(lsrs,	1b00020, lsrs,	   3, (RR, oRR, SH), shift, t_shift),
8135  tCE(asr,	1a00040, asr,	   3, (RR, oRR, SH), shift, t_shift),
8136  tC3(asrs,      1b00040, asrs,     3, (RR, oRR, SH), shift, t_shift),
8137  tCE(ror,	1a00060, ror,	   3, (RR, oRR, SH), shift, t_shift),
8138  tC3(rors,	1b00060, rors,	   3, (RR, oRR, SH), shift, t_shift),
8139  tCE(neg,	2600000, neg,	   2, (RR, RR),      rd_rn, t_neg),
8140  tC3(negs,	2700000, negs,	   2, (RR, RR),      rd_rn, t_neg),
8141  tCE(push,	92d0000, push,     1, (REGLST),	     push_pop, t_push_pop),
8142  tCE(pop,	8bd0000, pop,	   1, (REGLST),	     push_pop, t_push_pop),
8143 
8144 #undef THUMB_VARIANT
8145 #define THUMB_VARIANT ARM_EXT_V6
8146  TCE(cpy,       1a00000, 4600,     2, (RR, RR),      rd_rm, t_cpy),
8147 
8148  /* V1 instructions with no Thumb analogue prior to V6T2.  */
8149 #undef THUMB_VARIANT
8150 #define THUMB_VARIANT ARM_EXT_V6T2
8151  TCE(rsb,	0600000, ebc00000, 3, (RR, oRR, SH), arit, t_rsb),
8152  TC3(rsbs,	0700000, ebd00000, 3, (RR, oRR, SH), arit, t_rsb),
8153  TCE(teq,	1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
8154  TC3(teqs,	1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
8155   C3(teqp,	130f000,           2, (RR, SH),      cmp),
8156 
8157  TC3(ldrt,	4300000, f8500e00, 2, (RR, ADDR),    ldstt, t_ldstt),
8158  TC3(ldrbt,	4700000, f8300e00, 2, (RR, ADDR),    ldstt, t_ldstt),
8159  TC3(strt,	4200000, f8400e00, 2, (RR, ADDR),    ldstt, t_ldstt),
8160  TC3(strbt,	4600000, f8200e00, 2, (RR, ADDR),    ldstt, t_ldstt),
8161 
8162  TC3(stmdb,	9000000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
8163  TC3(stmfd,     9000000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
8164 
8165  TC3(ldmdb,	9100000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
8166  TC3(ldmea,	9100000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
8167 
8168  /* V1 instructions with no Thumb analogue at all.  */
8169   CE(rsc,	0e00000,	   3, (RR, oRR, SH), arit),
8170   C3(rscs,	0f00000,	   3, (RR, oRR, SH), arit),
8171 
8172   C3(stmib,	9800000,	   2, (RRw, REGLST), ldmstm),
8173   C3(stmfa,	9800000,	   2, (RRw, REGLST), ldmstm),
8174   C3(stmda,	8000000,	   2, (RRw, REGLST), ldmstm),
8175   C3(stmed,	8000000,	   2, (RRw, REGLST), ldmstm),
8176   C3(ldmib,	9900000,	   2, (RRw, REGLST), ldmstm),
8177   C3(ldmed,	9900000,	   2, (RRw, REGLST), ldmstm),
8178   C3(ldmda,	8100000,	   2, (RRw, REGLST), ldmstm),
8179   C3(ldmfa,	8100000,	   2, (RRw, REGLST), ldmstm),
8180 
8181 #undef ARM_VARIANT
8182 #define ARM_VARIANT ARM_EXT_V2	/* ARM 2 - multiplies.	*/
8183 #undef THUMB_VARIANT
8184 #define THUMB_VARIANT ARM_EXT_V4T
8185  tCE(mul,	0000090, mul,	   3, (RRnpc, RRnpc, oRR), mul, t_mul),
8186  tC3(muls,	0100090, muls,	   3, (RRnpc, RRnpc, oRR), mul, t_mul),
8187 
8188 #undef THUMB_VARIANT
8189 #define THUMB_VARIANT ARM_EXT_V6T2
8190  TCE(mla,	0200090, fb000000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
8191   C3(mlas,	0300090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas),
8192 
8193   /* Generic coprocessor instructions.	*/
8194  TCE(cdp,	e000000, ee000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
8195  TCE(ldc,	c100000, ec100000, 3, (RCP, RCN, ADDR),		        lstc,   lstc),
8196  TC3(ldcl,	c500000, ec500000, 3, (RCP, RCN, ADDR),		        lstc,   lstc),
8197  TCE(stc,	c000000, ec000000, 3, (RCP, RCN, ADDR),		        lstc,   lstc),
8198  TC3(stcl,	c400000, ec400000, 3, (RCP, RCN, ADDR),		        lstc,   lstc),
8199  TCE(mcr,	e000010, ee000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
8200  TCE(mrc,	e100010, ee100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
8201 
8202 #undef ARM_VARIANT
8203 #define ARM_VARIANT ARM_EXT_V2S /* ARM 3 - swp instructions.  */
8204   CE(swp,	1000090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
8205   C3(swpb,	1400090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
8206 
8207 #undef ARM_VARIANT
8208 #define ARM_VARIANT ARM_EXT_V3	/* ARM 6 Status register instructions.	*/
8209  TCE(mrs,	10f0000, f3ef8000, 2, (RR, PSR),     mrs, t_mrs),
8210  TCE(msr,	120f000, f3808000, 2, (PSR, RR_EXi), msr, t_msr),
8211 
8212 #undef ARM_VARIANT
8213 #define ARM_VARIANT ARM_EXT_V3M	 /* ARM 7M long multiplies.  */
8214  TCE(smull,	0c00090, fb800000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
8215   CM(smull,s,	0d00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
8216  TCE(umull,	0800090, fba00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
8217   CM(umull,s,	0900090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
8218  TCE(smlal,	0e00090, fbc00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
8219   CM(smlal,s,	0f00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
8220  TCE(umlal,	0a00090, fbe00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
8221   CM(umlal,s,	0b00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
8222 
8223 #undef ARM_VARIANT
8224 #define ARM_VARIANT ARM_EXT_V4	/* ARM Architecture 4.	*/
8225 #undef THUMB_VARIANT
8226 #define THUMB_VARIANT ARM_EXT_V4T
8227  tC3(ldrh,	01000b0, ldrh,     2, (RR, ADDR), ldstv4, t_ldst),
8228  tC3(strh,	00000b0, strh,     2, (RR, ADDR), ldstv4, t_ldst),
8229  tC3(ldrsh,	01000f0, ldrsh,    2, (RR, ADDR), ldstv4, t_ldst),
8230  tC3(ldrsb,	01000d0, ldrsb,    2, (RR, ADDR), ldstv4, t_ldst),
8231  tCM(ld,sh,	01000f0, ldrsh,    2, (RR, ADDR), ldstv4, t_ldst),
8232  tCM(ld,sb,	01000d0, ldrsb,    2, (RR, ADDR), ldstv4, t_ldst),
8233 
8234 #undef ARM_VARIANT
8235 #define ARM_VARIANT ARM_EXT_V4T|ARM_EXT_V5
8236   /* ARM Architecture 4T.  */
8237   /* Note: bx (and blx) are required on V5, even if the processor does
8238      not support Thumb.	 */
8239  TCE(bx,	12fff10, 4700, 1, (RR),	bx, t_bx),
8240 
8241 #undef ARM_VARIANT
8242 #define ARM_VARIANT ARM_EXT_V5 /*  ARM Architecture 5T.	 */
8243 #undef THUMB_VARIANT
8244 #define THUMB_VARIANT ARM_EXT_V5T
8245   /* Note: blx has 2 variants; the .value coded here is for
8246      BLX(2).  Only this variant has conditional execution.  */
8247  TCE(blx,	12fff30, 4780, 1, (RR_EXr),			    blx,  t_blx),
8248  TUE(bkpt,	1200070, be00, 1, (oIffffb),			    bkpt, t_bkpt),
8249 
8250 #undef THUMB_VARIANT
8251 #define THUMB_VARIANT ARM_EXT_V6T2
8252  TCE(clz,	16f0f10, fab0f080, 2, (RRnpc, RRnpc),		        rd_rm,  t_clz),
8253  TUF(ldc2,	c100000, fc100000, 3, (RCP, RCN, ADDR),		        lstc,	lstc),
8254  TUF(ldc2l,	c500000, fc500000, 3, (RCP, RCN, ADDR),		        lstc,	lstc),
8255  TUF(stc2,	c000000, fc000000, 3, (RCP, RCN, ADDR),		        lstc,	lstc),
8256  TUF(stc2l,	c400000, fc400000, 3, (RCP, RCN, ADDR),		        lstc,	lstc),
8257  TUF(cdp2,	e000000, fe000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
8258  TUF(mcr2,	e000010, fe000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
8259  TUF(mrc2,	e100010, fe100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
8260 
8261 #undef ARM_VARIANT
8262 #define ARM_VARIANT ARM_EXT_V5ExP /*  ARM Architecture 5TExP.  */
8263  TCE(smlabb,	1000080, fb100000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
8264  TCE(smlatb,	10000a0, fb100020, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
8265  TCE(smlabt,	10000c0, fb100010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
8266  TCE(smlatt,	10000e0, fb100030, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
8267 
8268  TCE(smlawb,	1200080, fb300000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
8269  TCE(smlawt,	12000c0, fb300010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
8270 
8271  TCE(smlalbb,	1400080, fbc00080, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
8272  TCE(smlaltb,	14000a0, fbc000a0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
8273  TCE(smlalbt,	14000c0, fbc00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
8274  TCE(smlaltt,	14000e0, fbc000b0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
8275 
8276  TCE(smulbb,	1600080, fb10f000, 3, (RRnpc, RRnpc, RRnpc),	    smul, t_simd),
8277  TCE(smultb,	16000a0, fb10f020, 3, (RRnpc, RRnpc, RRnpc),	    smul, t_simd),
8278  TCE(smulbt,	16000c0, fb10f010, 3, (RRnpc, RRnpc, RRnpc),	    smul, t_simd),
8279  TCE(smultt,	16000e0, fb10f030, 3, (RRnpc, RRnpc, RRnpc),	    smul, t_simd),
8280 
8281  TCE(smulwb,	12000a0, fb30f000, 3, (RRnpc, RRnpc, RRnpc),	    smul, t_simd),
8282  TCE(smulwt,	12000e0, fb30f010, 3, (RRnpc, RRnpc, RRnpc),	    smul, t_simd),
8283 
8284  TCE(qadd,	1000050, fa80f080, 3, (RRnpc, RRnpc, RRnpc),	    rd_rm_rn, rd_rm_rn),
8285  TCE(qdadd,	1400050, fa80f090, 3, (RRnpc, RRnpc, RRnpc),	    rd_rm_rn, rd_rm_rn),
8286  TCE(qsub,	1200050, fa80f0a0, 3, (RRnpc, RRnpc, RRnpc),	    rd_rm_rn, rd_rm_rn),
8287  TCE(qdsub,	1600050, fa80f0b0, 3, (RRnpc, RRnpc, RRnpc),	    rd_rm_rn, rd_rm_rn),
8288 
8289 #undef ARM_VARIANT
8290 #define ARM_VARIANT ARM_EXT_V5E /*  ARM Architecture 5TE.  */
8291  TUF(pld,	450f000, f810f000, 1, (ADDR),		     pld,  t_pld),
8292  TC3(ldrd,	00000d0, e9500000, 3, (RRnpc, oRRnpc, ADDR), ldrd, t_ldstd),
8293  TC3(strd,	00000f0, e9400000, 3, (RRnpc, oRRnpc, ADDR), ldrd, t_ldstd),
8294 
8295  TCE(mcrr,	c400000, ec400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
8296  TCE(mrrc,	c500000, ec500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
8297 
8298 #undef ARM_VARIANT
8299 #define ARM_VARIANT ARM_EXT_V5J /*  ARM Architecture 5TEJ.  */
8300  TCE(bxj,	12fff20, f3c08f00, 1, (RR),			  bxj, t_bxj),
8301 
8302 #undef ARM_VARIANT
8303 #define ARM_VARIANT ARM_EXT_V6 /*  ARM V6.  */
8304 #undef THUMB_VARIANT
8305 #define THUMB_VARIANT ARM_EXT_V6
8306  TUF(cpsie,     1080000, b660,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
8307  TUF(cpsid,     10c0000, b670,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
8308  tCE(rev,       6bf0f30, rev,      2, (RRnpc, RRnpc),             rd_rm,  t_rev),
8309  tCE(rev16,     6bf0fb0, rev16,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
8310  tCE(revsh,     6ff0fb0, revsh,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
8311  tCE(sxth,      6bf0070, sxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
8312  tCE(uxth,      6ff0070, uxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
8313  tCE(sxtb,      6af0070, sxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
8314  tCE(uxtb,      6ef0070, uxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
8315  TUF(setend,    1010000, b650,     1, (ENDI),                     setend, t_setend),
8316 
8317 #undef THUMB_VARIANT
8318 #define THUMB_VARIANT ARM_EXT_V6T2
8319  TUF(cps,	1020000, f3af8100, 1, (I31b),			  imm0, imm0),
8320  TCE(ldrex,	1900f9f, e8500f00, 2, (RRnpc, ADDR),		  ldrex, t_ldrex),
8321  TUF(mcrr2,	c400000, fc400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
8322  TUF(mrrc2,	c500000, fc500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
8323  TCE(pkhbt,	6800010, eac00000, 4, (RRnpc, RRnpc, RRnpc, oSHll),   pkhbt, t_pkhbt),
8324  TCE(pkhtb,	6800050, eac00020, 4, (RRnpc, RRnpc, RRnpc, oSHar),   pkhtb, t_pkhtb),
8325  TCE(qadd16,	6200f10, fa90f010, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8326  TCE(qadd8,	6200f90, fa80f010, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8327  TCE(qaddsubx,	6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8328  TCE(qsub16,	6200f70, fad0f010, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8329  TCE(qsub8,	6200ff0, fac0f010, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8330  TCE(qsubaddx,	6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8331  TCE(sadd16,	6100f10, fa90f000, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8332  TCE(sadd8,	6100f90, fa80f000, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8333  TCE(saddsubx,	6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8334  TCE(shadd16,	6300f10, fa90f020, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8335  TCE(shadd8,	6300f90, fa80f020, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8336  TCE(shaddsubx, 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8337  TCE(shsub16,	6300f70, fad0f020, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8338  TCE(shsub8,	6300ff0, fac0f020, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8339  TCE(shsubaddx, 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8340  TCE(ssub16,	6100f70, fad0f000, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8341  TCE(ssub8,	6100ff0, fac0f000, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8342  TCE(ssubaddx,	6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8343  TCE(uadd16,	6500f10, fa90f040, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8344  TCE(uadd8,	6500f90, fa80f040, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8345  TCE(uaddsubx,	6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8346  TCE(uhadd16,	6700f10, fa90f060, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8347  TCE(uhadd8,	6700f90, fa80f060, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8348  TCE(uhaddsubx, 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8349  TCE(uhsub16,	6700f70, fad0f060, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8350  TCE(uhsub8,	6700ff0, fac0f060, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8351  TCE(uhsubaddx, 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8352  TCE(uqadd16,	6600f10, fa90f050, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8353  TCE(uqadd8,	6600f90, fa80f050, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8354  TCE(uqaddsubx, 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8355  TCE(uqsub16,	6600f70, fad0f050, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8356  TCE(uqsub8,	6600ff0, fac0f050, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8357  TCE(uqsubaddx, 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8358  TCE(usub16,	6500f70, fad0f040, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8359  TCE(usub8,	6500ff0, fac0f040, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8360  TCE(usubaddx,	6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8361  TUF(rfeia,	8900a00, e990c000, 1, (RRw),			   rfe, rfe),
8362   UF(rfeib,	9900a00,           1, (RRw),			   rfe),
8363   UF(rfeda,	8100a00,           1, (RRw),			   rfe),
8364  TUF(rfedb,	9100a00, e810c000, 1, (RRw),			   rfe, rfe),
8365  TUF(rfefd,	8900a00, e990c000, 1, (RRw),			   rfe, rfe),
8366   UF(rfefa,	9900a00,           1, (RRw),			   rfe),
8367   UF(rfeea,	8100a00,           1, (RRw),			   rfe),
8368  TUF(rfeed,	9100a00, e810c000, 1, (RRw),			   rfe, rfe),
8369  TCE(sxtah,	6b00070, fa00f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
8370  TCE(sxtab16,	6800070, fa20f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
8371  TCE(sxtab,	6a00070, fa40f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
8372  TCE(sxtb16,	68f0070, fa2ff080, 3, (RRnpc, RRnpc, oROR),	   sxth,  t_sxth),
8373  TCE(uxtah,	6f00070, fa10f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
8374  TCE(uxtab16,	6c00070, fa30f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
8375  TCE(uxtab,	6e00070, fa50f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
8376  TCE(uxtb16,	6cf0070, fa3ff080, 3, (RRnpc, RRnpc, oROR),	   sxth,  t_sxth),
8377  TCE(sel,	68000b0, faa0f080, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
8378  TCE(smlad,	7000010, fb200000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
8379  TCE(smladx,	7000030, fb200010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
8380  TCE(smlald,	7400010, fbc000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
8381  TCE(smlaldx,	7400030, fbc000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
8382  TCE(smlsd,	7000050, fb400000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
8383  TCE(smlsdx,	7000070, fb400010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
8384  TCE(smlsld,	7400050, fbd000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
8385  TCE(smlsldx,	7400070, fbd000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
8386  TCE(smmla,	7500010, fb500000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
8387  TCE(smmlar,	7500030, fb500010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
8388  TCE(smmls,	75000d0, fb600000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
8389  TCE(smmlsr,	75000f0, fb600010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
8390  TCE(smmul,	750f010, fb50f000, 3, (RRnpc, RRnpc, RRnpc),	   smul, t_simd),
8391  TCE(smmulr,	750f030, fb50f010, 3, (RRnpc, RRnpc, RRnpc),	   smul, t_simd),
8392  TCE(smuad,	700f010, fb20f000, 3, (RRnpc, RRnpc, RRnpc),	   smul, t_simd),
8393  TCE(smuadx,	700f030, fb20f010, 3, (RRnpc, RRnpc, RRnpc),	   smul, t_simd),
8394  TCE(smusd,	700f050, fb40f000, 3, (RRnpc, RRnpc, RRnpc),	   smul, t_simd),
8395  TCE(smusdx,	700f070, fb40f010, 3, (RRnpc, RRnpc, RRnpc),	   smul, t_simd),
8396  TUF(srsia,	8cd0500, e980c000, 1, (I31w),			   srs,  srs),
8397   UF(srsib,	9cd0500,           1, (I31w),			   srs),
8398   UF(srsda,	84d0500,	   1, (I31w),			   srs),
8399  TUF(srsdb,	94d0500, e800c000, 1, (I31w),			   srs,  srs),
8400  TCE(ssat,	6a00010, f3000000, 4, (RRnpc, I32, RRnpc, oSHllar),ssat,   t_ssat),
8401  TCE(ssat16,	6a00f30, f3200000, 3, (RRnpc, I16, RRnpc),	   ssat16, t_ssat16),
8402  TCE(strex,	1800f90, e8400000, 3, (RRnpc, RRnpc, ADDR),	   strex,  t_strex),
8403  TCE(umaal,	0400090, fbe00060, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,  t_mlal),
8404  TCE(usad8,	780f010, fb70f000, 3, (RRnpc, RRnpc, RRnpc),	   smul,   t_simd),
8405  TCE(usada8,	7800010, fb700000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla,   t_mla),
8406  TCE(usat,	6e00010, f3800000, 4, (RRnpc, I31, RRnpc, oSHllar),usat,   t_usat),
8407  TCE(usat16,	6e00f30, f3a00000, 3, (RRnpc, I15, RRnpc),	   usat16, t_usat16),
8408 
8409 #undef ARM_VARIANT
8410 #define ARM_VARIANT ARM_EXT_V6K
8411 #undef THUMB_VARIANT
8412 #define THUMB_VARIANT ARM_EXT_V6K
8413  tCE(yield,	320f001, yield,    0, (), noargs, t_hint),
8414  tCE(wfe,	320f002, wfe,      0, (), noargs, t_hint),
8415  tCE(wfi,	320f003, wfi,      0, (), noargs, t_hint),
8416  tCE(sev,	320f004, sev,      0, (), noargs, t_hint),
8417 
8418 #undef THUMB_VARIANT
8419 #define THUMB_VARIANT ARM_EXT_V6T2
8420  TCE(ldrexb,	1d00f9f, e8d00f4f, 2, (RRnpc, RRnpcb),	              rd_rn,  rd_rn),
8421  TCE(ldrexh,	1f00f9f, e8d00f5f, 2, (RRnpc, RRnpcb),	              rd_rn,  rd_rn),
8422  TCE(ldrexd,	1b00f9f, e8d0007f, 3, (RRnpc, oRRnpc, RRnpcb),        ldrexd, t_ldrexd),
8423  TCE(strexb,	1c00f90, e8c00f40, 3, (RRnpc, RRnpc, ADDR),           strex,  rm_rd_rn),
8424  TCE(strexh,	1e00f90, e8c00f50, 3, (RRnpc, RRnpc, ADDR),           strex,  rm_rd_rn),
8425  TCE(strexd,	1a00f90, e8c00070, 4, (RRnpc, RRnpc, oRRnpc, RRnpcb), strexd, t_strexd),
8426  TUF(clrex,	57ff01f, f3bf8f2f, 0, (),			      noargs, noargs),
8427 
8428 #undef ARM_VARIANT
8429 #define ARM_VARIANT ARM_EXT_V6Z
8430  TCE(smi,	1600070, f7f08000, 1, (EXPi), smi, t_smi),
8431 
8432 #undef ARM_VARIANT
8433 #define ARM_VARIANT ARM_EXT_V6T2
8434  TCE(bfc,	7c0001f, f36f0000, 3, (RRnpc, I31, I32),	   bfc, t_bfc),
8435  TCE(bfi,	7c00010, f3600000, 4, (RRnpc, RRnpc_I0, I31, I32), bfi, t_bfi),
8436  TCE(sbfx,	7a00050, f3400000, 4, (RR, RR, I31, I32),	   bfx, t_bfx),
8437  TCE(ubfx,	7e00050, f3c00000, 4, (RR, RR, I31, I32),	   bfx, t_bfx),
8438 
8439  TCE(mls,	0600090, fb000010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
8440  TCE(movw,	3000000, f2400000, 2, (RRnpc, Iffff),		    mov16, t_mov16),
8441  TCE(movt,	3400000, f2c00000, 2, (RRnpc, Iffff),		    mov16, t_mov16),
8442  TCE(rbit,	3ff0f30, fa90f0a0, 2, (RR, RR),			    rd_rm, t_rbit),
8443 
8444  TC3(ldrht,	03000b0, f8300e00, 2, (RR, ADDR), ldsttv4, t_ldstt),
8445  TC3(ldrsht,	03000f0, f9300e00, 2, (RR, ADDR), ldsttv4, t_ldstt),
8446  TC3(ldrsbt,	03000d0, f9100e00, 2, (RR, ADDR), ldsttv4, t_ldstt),
8447  TC3(strht,	02000b0, f8200e00, 2, (RR, ADDR), ldsttv4, t_ldstt),
8448 
8449   UT(cbnz,      b900,    2, (RR, EXP), t_czb),
8450   UT(cbz,       b100,    2, (RR, EXP), t_czb),
8451  /* ARM does not really have an IT instruction.  */
8452  TUE(it,        0, bf08, 1, (COND),    it, t_it),
8453  TUE(itt,       0, bf0c, 1, (COND),    it, t_it),
8454  TUE(ite,       0, bf04, 1, (COND),    it, t_it),
8455  TUE(ittt,      0, bf0e, 1, (COND),    it, t_it),
8456  TUE(itet,      0, bf06, 1, (COND),    it, t_it),
8457  TUE(itte,      0, bf0a, 1, (COND),    it, t_it),
8458  TUE(itee,      0, bf02, 1, (COND),    it, t_it),
8459  TUE(itttt,     0, bf0f, 1, (COND),    it, t_it),
8460  TUE(itett,     0, bf07, 1, (COND),    it, t_it),
8461  TUE(ittet,     0, bf0b, 1, (COND),    it, t_it),
8462  TUE(iteet,     0, bf03, 1, (COND),    it, t_it),
8463  TUE(ittte,     0, bf0d, 1, (COND),    it, t_it),
8464  TUE(itete,     0, bf05, 1, (COND),    it, t_it),
8465  TUE(ittee,     0, bf09, 1, (COND),    it, t_it),
8466  TUE(iteee,     0, bf01, 1, (COND),    it, t_it),
8467 
8468 #undef ARM_VARIANT
8469 #define ARM_VARIANT FPU_FPA_EXT_V1  /* Core FPA instruction set (V1).  */
8470   CE(wfs,	e200110, 1, (RR),	     rd),
8471   CE(rfs,	e300110, 1, (RR),	     rd),
8472   CE(wfc,	e400110, 1, (RR),	     rd),
8473   CE(rfc,	e500110, 1, (RR),	     rd),
8474 
8475   C3(ldfs,	c100100, 2, (RF, ADDR),	     rd_cpaddr),
8476   C3(ldfd,	c108100, 2, (RF, ADDR),	     rd_cpaddr),
8477   C3(ldfe,	c500100, 2, (RF, ADDR),	     rd_cpaddr),
8478   C3(ldfp,	c508100, 2, (RF, ADDR),	     rd_cpaddr),
8479 
8480   C3(stfs,	c000100, 2, (RF, ADDR),	     rd_cpaddr),
8481   C3(stfd,	c008100, 2, (RF, ADDR),	     rd_cpaddr),
8482   C3(stfe,	c400100, 2, (RF, ADDR),	     rd_cpaddr),
8483   C3(stfp,	c408100, 2, (RF, ADDR),	     rd_cpaddr),
8484 
8485   C3(mvfs,	e008100, 2, (RF, RF_IF),     rd_rm),
8486   C3(mvfsp,	e008120, 2, (RF, RF_IF),     rd_rm),
8487   C3(mvfsm,	e008140, 2, (RF, RF_IF),     rd_rm),
8488   C3(mvfsz,	e008160, 2, (RF, RF_IF),     rd_rm),
8489   C3(mvfd,	e008180, 2, (RF, RF_IF),     rd_rm),
8490   C3(mvfdp,	e0081a0, 2, (RF, RF_IF),     rd_rm),
8491   C3(mvfdm,	e0081c0, 2, (RF, RF_IF),     rd_rm),
8492   C3(mvfdz,	e0081e0, 2, (RF, RF_IF),     rd_rm),
8493   C3(mvfe,	e088100, 2, (RF, RF_IF),     rd_rm),
8494   C3(mvfep,	e088120, 2, (RF, RF_IF),     rd_rm),
8495   C3(mvfem,	e088140, 2, (RF, RF_IF),     rd_rm),
8496   C3(mvfez,	e088160, 2, (RF, RF_IF),     rd_rm),
8497 
8498   C3(mnfs,	e108100, 2, (RF, RF_IF),     rd_rm),
8499   C3(mnfsp,	e108120, 2, (RF, RF_IF),     rd_rm),
8500   C3(mnfsm,	e108140, 2, (RF, RF_IF),     rd_rm),
8501   C3(mnfsz,	e108160, 2, (RF, RF_IF),     rd_rm),
8502   C3(mnfd,	e108180, 2, (RF, RF_IF),     rd_rm),
8503   C3(mnfdp,	e1081a0, 2, (RF, RF_IF),     rd_rm),
8504   C3(mnfdm,	e1081c0, 2, (RF, RF_IF),     rd_rm),
8505   C3(mnfdz,	e1081e0, 2, (RF, RF_IF),     rd_rm),
8506   C3(mnfe,	e188100, 2, (RF, RF_IF),     rd_rm),
8507   C3(mnfep,	e188120, 2, (RF, RF_IF),     rd_rm),
8508   C3(mnfem,	e188140, 2, (RF, RF_IF),     rd_rm),
8509   C3(mnfez,	e188160, 2, (RF, RF_IF),     rd_rm),
8510 
8511   C3(abss,	e208100, 2, (RF, RF_IF),     rd_rm),
8512   C3(abssp,	e208120, 2, (RF, RF_IF),     rd_rm),
8513   C3(abssm,	e208140, 2, (RF, RF_IF),     rd_rm),
8514   C3(abssz,	e208160, 2, (RF, RF_IF),     rd_rm),
8515   C3(absd,	e208180, 2, (RF, RF_IF),     rd_rm),
8516   C3(absdp,	e2081a0, 2, (RF, RF_IF),     rd_rm),
8517   C3(absdm,	e2081c0, 2, (RF, RF_IF),     rd_rm),
8518   C3(absdz,	e2081e0, 2, (RF, RF_IF),     rd_rm),
8519   C3(abse,	e288100, 2, (RF, RF_IF),     rd_rm),
8520   C3(absep,	e288120, 2, (RF, RF_IF),     rd_rm),
8521   C3(absem,	e288140, 2, (RF, RF_IF),     rd_rm),
8522   C3(absez,	e288160, 2, (RF, RF_IF),     rd_rm),
8523 
8524   C3(rnds,	e308100, 2, (RF, RF_IF),     rd_rm),
8525   C3(rndsp,	e308120, 2, (RF, RF_IF),     rd_rm),
8526   C3(rndsm,	e308140, 2, (RF, RF_IF),     rd_rm),
8527   C3(rndsz,	e308160, 2, (RF, RF_IF),     rd_rm),
8528   C3(rndd,	e308180, 2, (RF, RF_IF),     rd_rm),
8529   C3(rnddp,	e3081a0, 2, (RF, RF_IF),     rd_rm),
8530   C3(rnddm,	e3081c0, 2, (RF, RF_IF),     rd_rm),
8531   C3(rnddz,	e3081e0, 2, (RF, RF_IF),     rd_rm),
8532   C3(rnde,	e388100, 2, (RF, RF_IF),     rd_rm),
8533   C3(rndep,	e388120, 2, (RF, RF_IF),     rd_rm),
8534   C3(rndem,	e388140, 2, (RF, RF_IF),     rd_rm),
8535   C3(rndez,	e388160, 2, (RF, RF_IF),     rd_rm),
8536 
8537   C3(sqts,	e408100, 2, (RF, RF_IF),     rd_rm),
8538   C3(sqtsp,	e408120, 2, (RF, RF_IF),     rd_rm),
8539   C3(sqtsm,	e408140, 2, (RF, RF_IF),     rd_rm),
8540   C3(sqtsz,	e408160, 2, (RF, RF_IF),     rd_rm),
8541   C3(sqtd,	e408180, 2, (RF, RF_IF),     rd_rm),
8542   C3(sqtdp,	e4081a0, 2, (RF, RF_IF),     rd_rm),
8543   C3(sqtdm,	e4081c0, 2, (RF, RF_IF),     rd_rm),
8544   C3(sqtdz,	e4081e0, 2, (RF, RF_IF),     rd_rm),
8545   C3(sqte,	e488100, 2, (RF, RF_IF),     rd_rm),
8546   C3(sqtep,	e488120, 2, (RF, RF_IF),     rd_rm),
8547   C3(sqtem,	e488140, 2, (RF, RF_IF),     rd_rm),
8548   C3(sqtez,	e488160, 2, (RF, RF_IF),     rd_rm),
8549 
8550   C3(logs,	e508100, 2, (RF, RF_IF),     rd_rm),
8551   C3(logsp,	e508120, 2, (RF, RF_IF),     rd_rm),
8552   C3(logsm,	e508140, 2, (RF, RF_IF),     rd_rm),
8553   C3(logsz,	e508160, 2, (RF, RF_IF),     rd_rm),
8554   C3(logd,	e508180, 2, (RF, RF_IF),     rd_rm),
8555   C3(logdp,	e5081a0, 2, (RF, RF_IF),     rd_rm),
8556   C3(logdm,	e5081c0, 2, (RF, RF_IF),     rd_rm),
8557   C3(logdz,	e5081e0, 2, (RF, RF_IF),     rd_rm),
8558   C3(loge,	e588100, 2, (RF, RF_IF),     rd_rm),
8559   C3(logep,	e588120, 2, (RF, RF_IF),     rd_rm),
8560   C3(logem,	e588140, 2, (RF, RF_IF),     rd_rm),
8561   C3(logez,	e588160, 2, (RF, RF_IF),     rd_rm),
8562 
8563   C3(lgns,	e608100, 2, (RF, RF_IF),     rd_rm),
8564   C3(lgnsp,	e608120, 2, (RF, RF_IF),     rd_rm),
8565   C3(lgnsm,	e608140, 2, (RF, RF_IF),     rd_rm),
8566   C3(lgnsz,	e608160, 2, (RF, RF_IF),     rd_rm),
8567   C3(lgnd,	e608180, 2, (RF, RF_IF),     rd_rm),
8568   C3(lgndp,	e6081a0, 2, (RF, RF_IF),     rd_rm),
8569   C3(lgndm,	e6081c0, 2, (RF, RF_IF),     rd_rm),
8570   C3(lgndz,	e6081e0, 2, (RF, RF_IF),     rd_rm),
8571   C3(lgne,	e688100, 2, (RF, RF_IF),     rd_rm),
8572   C3(lgnep,	e688120, 2, (RF, RF_IF),     rd_rm),
8573   C3(lgnem,	e688140, 2, (RF, RF_IF),     rd_rm),
8574   C3(lgnez,	e688160, 2, (RF, RF_IF),     rd_rm),
8575 
8576   C3(exps,	e708100, 2, (RF, RF_IF),     rd_rm),
8577   C3(expsp,	e708120, 2, (RF, RF_IF),     rd_rm),
8578   C3(expsm,	e708140, 2, (RF, RF_IF),     rd_rm),
8579   C3(expsz,	e708160, 2, (RF, RF_IF),     rd_rm),
8580   C3(expd,	e708180, 2, (RF, RF_IF),     rd_rm),
8581   C3(expdp,	e7081a0, 2, (RF, RF_IF),     rd_rm),
8582   C3(expdm,	e7081c0, 2, (RF, RF_IF),     rd_rm),
8583   C3(expdz,	e7081e0, 2, (RF, RF_IF),     rd_rm),
8584   C3(expe,	e788100, 2, (RF, RF_IF),     rd_rm),
8585   C3(expep,	e788120, 2, (RF, RF_IF),     rd_rm),
8586   C3(expem,	e788140, 2, (RF, RF_IF),     rd_rm),
8587   C3(expdz,	e788160, 2, (RF, RF_IF),     rd_rm),
8588 
8589   C3(sins,	e808100, 2, (RF, RF_IF),     rd_rm),
8590   C3(sinsp,	e808120, 2, (RF, RF_IF),     rd_rm),
8591   C3(sinsm,	e808140, 2, (RF, RF_IF),     rd_rm),
8592   C3(sinsz,	e808160, 2, (RF, RF_IF),     rd_rm),
8593   C3(sind,	e808180, 2, (RF, RF_IF),     rd_rm),
8594   C3(sindp,	e8081a0, 2, (RF, RF_IF),     rd_rm),
8595   C3(sindm,	e8081c0, 2, (RF, RF_IF),     rd_rm),
8596   C3(sindz,	e8081e0, 2, (RF, RF_IF),     rd_rm),
8597   C3(sine,	e888100, 2, (RF, RF_IF),     rd_rm),
8598   C3(sinep,	e888120, 2, (RF, RF_IF),     rd_rm),
8599   C3(sinem,	e888140, 2, (RF, RF_IF),     rd_rm),
8600   C3(sinez,	e888160, 2, (RF, RF_IF),     rd_rm),
8601 
8602   C3(coss,	e908100, 2, (RF, RF_IF),     rd_rm),
8603   C3(cossp,	e908120, 2, (RF, RF_IF),     rd_rm),
8604   C3(cossm,	e908140, 2, (RF, RF_IF),     rd_rm),
8605   C3(cossz,	e908160, 2, (RF, RF_IF),     rd_rm),
8606   C3(cosd,	e908180, 2, (RF, RF_IF),     rd_rm),
8607   C3(cosdp,	e9081a0, 2, (RF, RF_IF),     rd_rm),
8608   C3(cosdm,	e9081c0, 2, (RF, RF_IF),     rd_rm),
8609   C3(cosdz,	e9081e0, 2, (RF, RF_IF),     rd_rm),
8610   C3(cose,	e988100, 2, (RF, RF_IF),     rd_rm),
8611   C3(cosep,	e988120, 2, (RF, RF_IF),     rd_rm),
8612   C3(cosem,	e988140, 2, (RF, RF_IF),     rd_rm),
8613   C3(cosez,	e988160, 2, (RF, RF_IF),     rd_rm),
8614 
8615   C3(tans,	ea08100, 2, (RF, RF_IF),     rd_rm),
8616   C3(tansp,	ea08120, 2, (RF, RF_IF),     rd_rm),
8617   C3(tansm,	ea08140, 2, (RF, RF_IF),     rd_rm),
8618   C3(tansz,	ea08160, 2, (RF, RF_IF),     rd_rm),
8619   C3(tand,	ea08180, 2, (RF, RF_IF),     rd_rm),
8620   C3(tandp,	ea081a0, 2, (RF, RF_IF),     rd_rm),
8621   C3(tandm,	ea081c0, 2, (RF, RF_IF),     rd_rm),
8622   C3(tandz,	ea081e0, 2, (RF, RF_IF),     rd_rm),
8623   C3(tane,	ea88100, 2, (RF, RF_IF),     rd_rm),
8624   C3(tanep,	ea88120, 2, (RF, RF_IF),     rd_rm),
8625   C3(tanem,	ea88140, 2, (RF, RF_IF),     rd_rm),
8626   C3(tanez,	ea88160, 2, (RF, RF_IF),     rd_rm),
8627 
8628   C3(asns,	eb08100, 2, (RF, RF_IF),     rd_rm),
8629   C3(asnsp,	eb08120, 2, (RF, RF_IF),     rd_rm),
8630   C3(asnsm,	eb08140, 2, (RF, RF_IF),     rd_rm),
8631   C3(asnsz,	eb08160, 2, (RF, RF_IF),     rd_rm),
8632   C3(asnd,	eb08180, 2, (RF, RF_IF),     rd_rm),
8633   C3(asndp,	eb081a0, 2, (RF, RF_IF),     rd_rm),
8634   C3(asndm,	eb081c0, 2, (RF, RF_IF),     rd_rm),
8635   C3(asndz,	eb081e0, 2, (RF, RF_IF),     rd_rm),
8636   C3(asne,	eb88100, 2, (RF, RF_IF),     rd_rm),
8637   C3(asnep,	eb88120, 2, (RF, RF_IF),     rd_rm),
8638   C3(asnem,	eb88140, 2, (RF, RF_IF),     rd_rm),
8639   C3(asnez,	eb88160, 2, (RF, RF_IF),     rd_rm),
8640 
8641   C3(acss,	ec08100, 2, (RF, RF_IF),     rd_rm),
8642   C3(acssp,	ec08120, 2, (RF, RF_IF),     rd_rm),
8643   C3(acssm,	ec08140, 2, (RF, RF_IF),     rd_rm),
8644   C3(acssz,	ec08160, 2, (RF, RF_IF),     rd_rm),
8645   C3(acsd,	ec08180, 2, (RF, RF_IF),     rd_rm),
8646   C3(acsdp,	ec081a0, 2, (RF, RF_IF),     rd_rm),
8647   C3(acsdm,	ec081c0, 2, (RF, RF_IF),     rd_rm),
8648   C3(acsdz,	ec081e0, 2, (RF, RF_IF),     rd_rm),
8649   C3(acse,	ec88100, 2, (RF, RF_IF),     rd_rm),
8650   C3(acsep,	ec88120, 2, (RF, RF_IF),     rd_rm),
8651   C3(acsem,	ec88140, 2, (RF, RF_IF),     rd_rm),
8652   C3(acsez,	ec88160, 2, (RF, RF_IF),     rd_rm),
8653 
8654   C3(atns,	ed08100, 2, (RF, RF_IF),     rd_rm),
8655   C3(atnsp,	ed08120, 2, (RF, RF_IF),     rd_rm),
8656   C3(atnsm,	ed08140, 2, (RF, RF_IF),     rd_rm),
8657   C3(atnsz,	ed08160, 2, (RF, RF_IF),     rd_rm),
8658   C3(atnd,	ed08180, 2, (RF, RF_IF),     rd_rm),
8659   C3(atndp,	ed081a0, 2, (RF, RF_IF),     rd_rm),
8660   C3(atndm,	ed081c0, 2, (RF, RF_IF),     rd_rm),
8661   C3(atndz,	ed081e0, 2, (RF, RF_IF),     rd_rm),
8662   C3(atne,	ed88100, 2, (RF, RF_IF),     rd_rm),
8663   C3(atnep,	ed88120, 2, (RF, RF_IF),     rd_rm),
8664   C3(atnem,	ed88140, 2, (RF, RF_IF),     rd_rm),
8665   C3(atnez,	ed88160, 2, (RF, RF_IF),     rd_rm),
8666 
8667   C3(urds,	ee08100, 2, (RF, RF_IF),     rd_rm),
8668   C3(urdsp,	ee08120, 2, (RF, RF_IF),     rd_rm),
8669   C3(urdsm,	ee08140, 2, (RF, RF_IF),     rd_rm),
8670   C3(urdsz,	ee08160, 2, (RF, RF_IF),     rd_rm),
8671   C3(urdd,	ee08180, 2, (RF, RF_IF),     rd_rm),
8672   C3(urddp,	ee081a0, 2, (RF, RF_IF),     rd_rm),
8673   C3(urddm,	ee081c0, 2, (RF, RF_IF),     rd_rm),
8674   C3(urddz,	ee081e0, 2, (RF, RF_IF),     rd_rm),
8675   C3(urde,	ee88100, 2, (RF, RF_IF),     rd_rm),
8676   C3(urdep,	ee88120, 2, (RF, RF_IF),     rd_rm),
8677   C3(urdem,	ee88140, 2, (RF, RF_IF),     rd_rm),
8678   C3(urdez,	ee88160, 2, (RF, RF_IF),     rd_rm),
8679 
8680   C3(nrms,	ef08100, 2, (RF, RF_IF),     rd_rm),
8681   C3(nrmsp,	ef08120, 2, (RF, RF_IF),     rd_rm),
8682   C3(nrmsm,	ef08140, 2, (RF, RF_IF),     rd_rm),
8683   C3(nrmsz,	ef08160, 2, (RF, RF_IF),     rd_rm),
8684   C3(nrmd,	ef08180, 2, (RF, RF_IF),     rd_rm),
8685   C3(nrmdp,	ef081a0, 2, (RF, RF_IF),     rd_rm),
8686   C3(nrmdm,	ef081c0, 2, (RF, RF_IF),     rd_rm),
8687   C3(nrmdz,	ef081e0, 2, (RF, RF_IF),     rd_rm),
8688   C3(nrme,	ef88100, 2, (RF, RF_IF),     rd_rm),
8689   C3(nrmep,	ef88120, 2, (RF, RF_IF),     rd_rm),
8690   C3(nrmem,	ef88140, 2, (RF, RF_IF),     rd_rm),
8691   C3(nrmez,	ef88160, 2, (RF, RF_IF),     rd_rm),
8692 
8693   C3(adfs,	e000100, 3, (RF, RF, RF_IF), rd_rn_rm),
8694   C3(adfsp,	e000120, 3, (RF, RF, RF_IF), rd_rn_rm),
8695   C3(adfsm,	e000140, 3, (RF, RF, RF_IF), rd_rn_rm),
8696   C3(adfsz,	e000160, 3, (RF, RF, RF_IF), rd_rn_rm),
8697   C3(adfd,	e000180, 3, (RF, RF, RF_IF), rd_rn_rm),
8698   C3(adfdp,	e0001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8699   C3(adfdm,	e0001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8700   C3(adfdz,	e0001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8701   C3(adfe,	e080100, 3, (RF, RF, RF_IF), rd_rn_rm),
8702   C3(adfep,	e080120, 3, (RF, RF, RF_IF), rd_rn_rm),
8703   C3(adfem,	e080140, 3, (RF, RF, RF_IF), rd_rn_rm),
8704   C3(adfez,	e080160, 3, (RF, RF, RF_IF), rd_rn_rm),
8705 
8706   C3(sufs,	e200100, 3, (RF, RF, RF_IF), rd_rn_rm),
8707   C3(sufsp,	e200120, 3, (RF, RF, RF_IF), rd_rn_rm),
8708   C3(sufsm,	e200140, 3, (RF, RF, RF_IF), rd_rn_rm),
8709   C3(sufsz,	e200160, 3, (RF, RF, RF_IF), rd_rn_rm),
8710   C3(sufd,	e200180, 3, (RF, RF, RF_IF), rd_rn_rm),
8711   C3(sufdp,	e2001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8712   C3(sufdm,	e2001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8713   C3(sufdz,	e2001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8714   C3(sufe,	e280100, 3, (RF, RF, RF_IF), rd_rn_rm),
8715   C3(sufep,	e280120, 3, (RF, RF, RF_IF), rd_rn_rm),
8716   C3(sufem,	e280140, 3, (RF, RF, RF_IF), rd_rn_rm),
8717   C3(sufez,	e280160, 3, (RF, RF, RF_IF), rd_rn_rm),
8718 
8719   C3(rsfs,	e300100, 3, (RF, RF, RF_IF), rd_rn_rm),
8720   C3(rsfsp,	e300120, 3, (RF, RF, RF_IF), rd_rn_rm),
8721   C3(rsfsm,	e300140, 3, (RF, RF, RF_IF), rd_rn_rm),
8722   C3(rsfsz,	e300160, 3, (RF, RF, RF_IF), rd_rn_rm),
8723   C3(rsfd,	e300180, 3, (RF, RF, RF_IF), rd_rn_rm),
8724   C3(rsfdp,	e3001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8725   C3(rsfdm,	e3001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8726   C3(rsfdz,	e3001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8727   C3(rsfe,	e380100, 3, (RF, RF, RF_IF), rd_rn_rm),
8728   C3(rsfep,	e380120, 3, (RF, RF, RF_IF), rd_rn_rm),
8729   C3(rsfem,	e380140, 3, (RF, RF, RF_IF), rd_rn_rm),
8730   C3(rsfez,	e380160, 3, (RF, RF, RF_IF), rd_rn_rm),
8731 
8732   C3(mufs,	e100100, 3, (RF, RF, RF_IF), rd_rn_rm),
8733   C3(mufsp,	e100120, 3, (RF, RF, RF_IF), rd_rn_rm),
8734   C3(mufsm,	e100140, 3, (RF, RF, RF_IF), rd_rn_rm),
8735   C3(mufsz,	e100160, 3, (RF, RF, RF_IF), rd_rn_rm),
8736   C3(mufd,	e100180, 3, (RF, RF, RF_IF), rd_rn_rm),
8737   C3(mufdp,	e1001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8738   C3(mufdm,	e1001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8739   C3(mufdz,	e1001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8740   C3(mufe,	e180100, 3, (RF, RF, RF_IF), rd_rn_rm),
8741   C3(mufep,	e180120, 3, (RF, RF, RF_IF), rd_rn_rm),
8742   C3(mufem,	e180140, 3, (RF, RF, RF_IF), rd_rn_rm),
8743   C3(mufez,	e180160, 3, (RF, RF, RF_IF), rd_rn_rm),
8744 
8745   C3(dvfs,	e400100, 3, (RF, RF, RF_IF), rd_rn_rm),
8746   C3(dvfsp,	e400120, 3, (RF, RF, RF_IF), rd_rn_rm),
8747   C3(dvfsm,	e400140, 3, (RF, RF, RF_IF), rd_rn_rm),
8748   C3(dvfsz,	e400160, 3, (RF, RF, RF_IF), rd_rn_rm),
8749   C3(dvfd,	e400180, 3, (RF, RF, RF_IF), rd_rn_rm),
8750   C3(dvfdp,	e4001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8751   C3(dvfdm,	e4001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8752   C3(dvfdz,	e4001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8753   C3(dvfe,	e480100, 3, (RF, RF, RF_IF), rd_rn_rm),
8754   C3(dvfep,	e480120, 3, (RF, RF, RF_IF), rd_rn_rm),
8755   C3(dvfem,	e480140, 3, (RF, RF, RF_IF), rd_rn_rm),
8756   C3(dvfez,	e480160, 3, (RF, RF, RF_IF), rd_rn_rm),
8757 
8758   C3(rdfs,	e500100, 3, (RF, RF, RF_IF), rd_rn_rm),
8759   C3(rdfsp,	e500120, 3, (RF, RF, RF_IF), rd_rn_rm),
8760   C3(rdfsm,	e500140, 3, (RF, RF, RF_IF), rd_rn_rm),
8761   C3(rdfsz,	e500160, 3, (RF, RF, RF_IF), rd_rn_rm),
8762   C3(rdfd,	e500180, 3, (RF, RF, RF_IF), rd_rn_rm),
8763   C3(rdfdp,	e5001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8764   C3(rdfdm,	e5001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8765   C3(rdfdz,	e5001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8766   C3(rdfe,	e580100, 3, (RF, RF, RF_IF), rd_rn_rm),
8767   C3(rdfep,	e580120, 3, (RF, RF, RF_IF), rd_rn_rm),
8768   C3(rdfem,	e580140, 3, (RF, RF, RF_IF), rd_rn_rm),
8769   C3(rdfez,	e580160, 3, (RF, RF, RF_IF), rd_rn_rm),
8770 
8771   C3(pows,	e600100, 3, (RF, RF, RF_IF), rd_rn_rm),
8772   C3(powsp,	e600120, 3, (RF, RF, RF_IF), rd_rn_rm),
8773   C3(powsm,	e600140, 3, (RF, RF, RF_IF), rd_rn_rm),
8774   C3(powsz,	e600160, 3, (RF, RF, RF_IF), rd_rn_rm),
8775   C3(powd,	e600180, 3, (RF, RF, RF_IF), rd_rn_rm),
8776   C3(powdp,	e6001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8777   C3(powdm,	e6001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8778   C3(powdz,	e6001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8779   C3(powe,	e680100, 3, (RF, RF, RF_IF), rd_rn_rm),
8780   C3(powep,	e680120, 3, (RF, RF, RF_IF), rd_rn_rm),
8781   C3(powem,	e680140, 3, (RF, RF, RF_IF), rd_rn_rm),
8782   C3(powez,	e680160, 3, (RF, RF, RF_IF), rd_rn_rm),
8783 
8784   C3(rpws,	e700100, 3, (RF, RF, RF_IF), rd_rn_rm),
8785   C3(rpwsp,	e700120, 3, (RF, RF, RF_IF), rd_rn_rm),
8786   C3(rpwsm,	e700140, 3, (RF, RF, RF_IF), rd_rn_rm),
8787   C3(rpwsz,	e700160, 3, (RF, RF, RF_IF), rd_rn_rm),
8788   C3(rpwd,	e700180, 3, (RF, RF, RF_IF), rd_rn_rm),
8789   C3(rpwdp,	e7001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8790   C3(rpwdm,	e7001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8791   C3(rpwdz,	e7001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8792   C3(rpwe,	e780100, 3, (RF, RF, RF_IF), rd_rn_rm),
8793   C3(rpwep,	e780120, 3, (RF, RF, RF_IF), rd_rn_rm),
8794   C3(rpwem,	e780140, 3, (RF, RF, RF_IF), rd_rn_rm),
8795   C3(rpwez,	e780160, 3, (RF, RF, RF_IF), rd_rn_rm),
8796 
8797   C3(rmfs,	e800100, 3, (RF, RF, RF_IF), rd_rn_rm),
8798   C3(rmfsp,	e800120, 3, (RF, RF, RF_IF), rd_rn_rm),
8799   C3(rmfsm,	e800140, 3, (RF, RF, RF_IF), rd_rn_rm),
8800   C3(rmfsz,	e800160, 3, (RF, RF, RF_IF), rd_rn_rm),
8801   C3(rmfd,	e800180, 3, (RF, RF, RF_IF), rd_rn_rm),
8802   C3(rmfdp,	e8001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8803   C3(rmfdm,	e8001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8804   C3(rmfdz,	e8001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8805   C3(rmfe,	e880100, 3, (RF, RF, RF_IF), rd_rn_rm),
8806   C3(rmfep,	e880120, 3, (RF, RF, RF_IF), rd_rn_rm),
8807   C3(rmfem,	e880140, 3, (RF, RF, RF_IF), rd_rn_rm),
8808   C3(rmfez,	e880160, 3, (RF, RF, RF_IF), rd_rn_rm),
8809 
8810   C3(fmls,	e900100, 3, (RF, RF, RF_IF), rd_rn_rm),
8811   C3(fmlsp,	e900120, 3, (RF, RF, RF_IF), rd_rn_rm),
8812   C3(fmlsm,	e900140, 3, (RF, RF, RF_IF), rd_rn_rm),
8813   C3(fmlsz,	e900160, 3, (RF, RF, RF_IF), rd_rn_rm),
8814   C3(fmld,	e900180, 3, (RF, RF, RF_IF), rd_rn_rm),
8815   C3(fmldp,	e9001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8816   C3(fmldm,	e9001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8817   C3(fmldz,	e9001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8818   C3(fmle,	e980100, 3, (RF, RF, RF_IF), rd_rn_rm),
8819   C3(fmlep,	e980120, 3, (RF, RF, RF_IF), rd_rn_rm),
8820   C3(fmlem,	e980140, 3, (RF, RF, RF_IF), rd_rn_rm),
8821   C3(fmlez,	e980160, 3, (RF, RF, RF_IF), rd_rn_rm),
8822 
8823   C3(fdvs,	ea00100, 3, (RF, RF, RF_IF), rd_rn_rm),
8824   C3(fdvsp,	ea00120, 3, (RF, RF, RF_IF), rd_rn_rm),
8825   C3(fdvsm,	ea00140, 3, (RF, RF, RF_IF), rd_rn_rm),
8826   C3(fdvsz,	ea00160, 3, (RF, RF, RF_IF), rd_rn_rm),
8827   C3(fdvd,	ea00180, 3, (RF, RF, RF_IF), rd_rn_rm),
8828   C3(fdvdp,	ea001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8829   C3(fdvdm,	ea001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8830   C3(fdvdz,	ea001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8831   C3(fdve,	ea80100, 3, (RF, RF, RF_IF), rd_rn_rm),
8832   C3(fdvep,	ea80120, 3, (RF, RF, RF_IF), rd_rn_rm),
8833   C3(fdvem,	ea80140, 3, (RF, RF, RF_IF), rd_rn_rm),
8834   C3(fdvez,	ea80160, 3, (RF, RF, RF_IF), rd_rn_rm),
8835 
8836   C3(frds,	eb00100, 3, (RF, RF, RF_IF), rd_rn_rm),
8837   C3(frdsp,	eb00120, 3, (RF, RF, RF_IF), rd_rn_rm),
8838   C3(frdsm,	eb00140, 3, (RF, RF, RF_IF), rd_rn_rm),
8839   C3(frdsz,	eb00160, 3, (RF, RF, RF_IF), rd_rn_rm),
8840   C3(frdd,	eb00180, 3, (RF, RF, RF_IF), rd_rn_rm),
8841   C3(frddp,	eb001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8842   C3(frddm,	eb001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8843   C3(frddz,	eb001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8844   C3(frde,	eb80100, 3, (RF, RF, RF_IF), rd_rn_rm),
8845   C3(frdep,	eb80120, 3, (RF, RF, RF_IF), rd_rn_rm),
8846   C3(frdem,	eb80140, 3, (RF, RF, RF_IF), rd_rn_rm),
8847   C3(frdez,	eb80160, 3, (RF, RF, RF_IF), rd_rn_rm),
8848 
8849   C3(pols,	ec00100, 3, (RF, RF, RF_IF), rd_rn_rm),
8850   C3(polsp,	ec00120, 3, (RF, RF, RF_IF), rd_rn_rm),
8851   C3(polsm,	ec00140, 3, (RF, RF, RF_IF), rd_rn_rm),
8852   C3(polsz,	ec00160, 3, (RF, RF, RF_IF), rd_rn_rm),
8853   C3(pold,	ec00180, 3, (RF, RF, RF_IF), rd_rn_rm),
8854   C3(poldp,	ec001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
8855   C3(poldm,	ec001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
8856   C3(poldz,	ec001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
8857   C3(pole,	ec80100, 3, (RF, RF, RF_IF), rd_rn_rm),
8858   C3(polep,	ec80120, 3, (RF, RF, RF_IF), rd_rn_rm),
8859   C3(polem,	ec80140, 3, (RF, RF, RF_IF), rd_rn_rm),
8860   C3(polez,	ec80160, 3, (RF, RF, RF_IF), rd_rn_rm),
8861 
8862   CE(cmf,	e90f110, 2, (RF, RF_IF),     fpa_cmp),
8863  C3E(cmfe,	ed0f110, 2, (RF, RF_IF),     fpa_cmp),
8864   CE(cnf,	eb0f110, 2, (RF, RF_IF),     fpa_cmp),
8865  C3E(cnfe,	ef0f110, 2, (RF, RF_IF),     fpa_cmp),
8866 
8867   C3(flts,	e000110, 2, (RF, RR),	     rn_rd),
8868   C3(fltsp,	e000130, 2, (RF, RR),	     rn_rd),
8869   C3(fltsm,	e000150, 2, (RF, RR),	     rn_rd),
8870   C3(fltsz,	e000170, 2, (RF, RR),	     rn_rd),
8871   C3(fltd,	e000190, 2, (RF, RR),	     rn_rd),
8872   C3(fltdp,	e0001b0, 2, (RF, RR),	     rn_rd),
8873   C3(fltdm,	e0001d0, 2, (RF, RR),	     rn_rd),
8874   C3(fltdz,	e0001f0, 2, (RF, RR),	     rn_rd),
8875   C3(flte,	e080110, 2, (RF, RR),	     rn_rd),
8876   C3(fltep,	e080130, 2, (RF, RR),	     rn_rd),
8877   C3(fltem,	e080150, 2, (RF, RR),	     rn_rd),
8878   C3(fltez,	e080170, 2, (RF, RR),	     rn_rd),
8879 
8880   /* The implementation of the FIX instruction is broken on some
8881      assemblers, in that it accepts a precision specifier as well as a
8882      rounding specifier, despite the fact that this is meaningless.
8883      To be more compatible, we accept it as well, though of course it
8884      does not set any bits.  */
8885   CE(fix,	e100110, 2, (RR, RF),	     rd_rm),
8886   C3(fixp,	e100130, 2, (RR, RF),	     rd_rm),
8887   C3(fixm,	e100150, 2, (RR, RF),	     rd_rm),
8888   C3(fixz,	e100170, 2, (RR, RF),	     rd_rm),
8889   C3(fixsp,	e100130, 2, (RR, RF),	     rd_rm),
8890   C3(fixsm,	e100150, 2, (RR, RF),	     rd_rm),
8891   C3(fixsz,	e100170, 2, (RR, RF),	     rd_rm),
8892   C3(fixdp,	e100130, 2, (RR, RF),	     rd_rm),
8893   C3(fixdm,	e100150, 2, (RR, RF),	     rd_rm),
8894   C3(fixdz,	e100170, 2, (RR, RF),	     rd_rm),
8895   C3(fixep,	e100130, 2, (RR, RF),	     rd_rm),
8896   C3(fixem,	e100150, 2, (RR, RF),	     rd_rm),
8897   C3(fixez,	e100170, 2, (RR, RF),	     rd_rm),
8898 
8899   /* Instructions that were new with the real FPA, call them V2.  */
8900 #undef ARM_VARIANT
8901 #define ARM_VARIANT FPU_FPA_EXT_V2
8902   CE(lfm,	c100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
8903   C3(lfmfd,	c900200, 3, (RF, I4b, ADDR), fpa_ldmstm),
8904   C3(lfmea,	d100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
8905   CE(sfm,	c000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
8906   C3(sfmfd,	d000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
8907   C3(sfmea,	c800200, 3, (RF, I4b, ADDR), fpa_ldmstm),
8908 
8909 #undef ARM_VARIANT
8910 #define ARM_VARIANT FPU_VFP_EXT_V1xD  /* VFP V1xD (single precision).  */
8911   /* Moves and type conversions.  */
8912   CE(fcpys,	eb00a40, 2, (RVS, RVS),	      vfp_sp_monadic),
8913   CE(fmrs,	e100a10, 2, (RR, RVS),	      vfp_reg_from_sp),
8914   CE(fmsr,	e000a10, 2, (RVS, RR),	      vfp_sp_from_reg),
8915   CE(fmstat,	ef1fa10, 0, (),		      noargs),
8916   CE(fsitos,	eb80ac0, 2, (RVS, RVS),	      vfp_sp_monadic),
8917   CE(fuitos,	eb80a40, 2, (RVS, RVS),	      vfp_sp_monadic),
8918   CE(ftosis,	ebd0a40, 2, (RVS, RVS),	      vfp_sp_monadic),
8919   CE(ftosizs,	ebd0ac0, 2, (RVS, RVS),	      vfp_sp_monadic),
8920   CE(ftouis,	ebc0a40, 2, (RVS, RVS),	      vfp_sp_monadic),
8921   CE(ftouizs,	ebc0ac0, 2, (RVS, RVS),	      vfp_sp_monadic),
8922   CE(fmrx,	ef00a10, 2, (RR, RVC),	      rd_rn),
8923   CE(fmxr,	ee00a10, 2, (RVC, RR),	      rn_rd),
8924 
8925   /* Memory operations.	 */
8926   CE(flds,	d100a00, 2, (RVS, ADDR),      vfp_sp_ldst),
8927   CE(fsts,	d000a00, 2, (RVS, ADDR),      vfp_sp_ldst),
8928   CE(fldmias,	c900a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
8929   CE(fldmfds,	c900a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
8930   CE(fldmdbs,	d300a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
8931   CE(fldmeas,	d300a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
8932   CE(fldmiax,	c900b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
8933   CE(fldmfdx,	c900b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
8934   CE(fldmdbx,	d300b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
8935   CE(fldmeax,	d300b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
8936   CE(fstmias,	c800a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
8937   CE(fstmeas,	c800a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
8938   CE(fstmdbs,	d200a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
8939   CE(fstmfds,	d200a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
8940   CE(fstmiax,	c800b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
8941   CE(fstmeax,	c800b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
8942   CE(fstmdbx,	d200b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
8943   CE(fstmfdx,	d200b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
8944 
8945   /* Monadic operations.  */
8946   CE(fabss,	eb00ac0, 2, (RVS, RVS),	      vfp_sp_monadic),
8947   CE(fnegs,	eb10a40, 2, (RVS, RVS),	      vfp_sp_monadic),
8948   CE(fsqrts,	eb10ac0, 2, (RVS, RVS),	      vfp_sp_monadic),
8949 
8950   /* Dyadic operations.	 */
8951   CE(fadds,	e300a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
8952   CE(fsubs,	e300a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
8953   CE(fmuls,	e200a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
8954   CE(fdivs,	e800a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
8955   CE(fmacs,	e000a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
8956   CE(fmscs,	e100a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
8957   CE(fnmuls,	e200a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
8958   CE(fnmacs,	e000a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
8959   CE(fnmscs,	e100a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
8960 
8961   /* Comparisons.  */
8962   CE(fcmps,	eb40a40, 2, (RVS, RVS),	      vfp_sp_monadic),
8963   CE(fcmpzs,	eb50a40, 1, (RVS),	      vfp_sp_compare_z),
8964   CE(fcmpes,	eb40ac0, 2, (RVS, RVS),	      vfp_sp_monadic),
8965   CE(fcmpezs,	eb50ac0, 1, (RVS),	      vfp_sp_compare_z),
8966 
8967 #undef ARM_VARIANT
8968 #define ARM_VARIANT FPU_VFP_EXT_V1 /* VFP V1 (Double precision).  */
8969   /* Moves and type conversions.  */
8970   CE(fcpyd,	eb00b40, 2, (RVD, RVD),	      rd_rm),
8971   CE(fcvtds,	eb70ac0, 2, (RVD, RVS),	      vfp_dp_sp_cvt),
8972   CE(fcvtsd,	eb70bc0, 2, (RVS, RVD),	      vfp_sp_dp_cvt),
8973   CE(fmdhr,	e200b10, 2, (RVD, RR),	      rn_rd),
8974   CE(fmdlr,	e000b10, 2, (RVD, RR),	      rn_rd),
8975   CE(fmrdh,	e300b10, 2, (RR, RVD),	      rd_rn),
8976   CE(fmrdl,	e100b10, 2, (RR, RVD),	      rd_rn),
8977   CE(fsitod,	eb80bc0, 2, (RVD, RVS),	      vfp_dp_sp_cvt),
8978   CE(fuitod,	eb80b40, 2, (RVD, RVS),	      vfp_dp_sp_cvt),
8979   CE(ftosid,	ebd0b40, 2, (RVS, RVD),	      vfp_sp_dp_cvt),
8980   CE(ftosizd,	ebd0bc0, 2, (RVS, RVD),	      vfp_sp_dp_cvt),
8981   CE(ftouid,	ebc0b40, 2, (RVS, RVD),	      vfp_sp_dp_cvt),
8982   CE(ftouizd,	ebc0bc0, 2, (RVS, RVD),	      vfp_sp_dp_cvt),
8983 
8984   /* Memory operations.	 */
8985   CE(fldd,	d100b00, 2, (RVD, ADDR),      vfp_dp_ldst),
8986   CE(fstd,	d000b00, 2, (RVD, ADDR),      vfp_dp_ldst),
8987   CE(fldmiad,	c900b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
8988   CE(fldmfdd,	c900b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
8989   CE(fldmdbd,	d300b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
8990   CE(fldmead,	d300b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
8991   CE(fstmiad,	c800b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
8992   CE(fstmead,	c800b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
8993   CE(fstmdbd,	d200b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
8994   CE(fstmfdd,	d200b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
8995 
8996   /* Monadic operations.  */
8997   CE(fabsd,	eb00bc0, 2, (RVD, RVD),	      rd_rm),
8998   CE(fnegd,	eb10b40, 2, (RVD, RVD),	      rd_rm),
8999   CE(fsqrtd,	eb10bc0, 2, (RVD, RVD),	      rd_rm),
9000 
9001   /* Dyadic operations.	 */
9002   CE(faddd,	e300b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
9003   CE(fsubd,	e300b40, 3, (RVD, RVD, RVD),  rd_rn_rm),
9004   CE(fmuld,	e200b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
9005   CE(fdivd,	e800b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
9006   CE(fmacd,	e000b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
9007   CE(fmscd,	e100b00, 3, (RVD, RVD, RVD),  rd_rn_rm),
9008   CE(fnmuld,	e200b40, 3, (RVD, RVD, RVD),  rd_rn_rm),
9009   CE(fnmacd,	e000b40, 3, (RVD, RVD, RVD),  rd_rn_rm),
9010   CE(fnmscd,	e100b40, 3, (RVD, RVD, RVD),  rd_rn_rm),
9011 
9012   /* Comparisons.  */
9013   CE(fcmpd,	eb40b40, 2, (RVD, RVD),	      rd_rm),
9014   CE(fcmpzd,	eb50b40, 1, (RVD),	      rd),
9015   CE(fcmped,	eb40bc0, 2, (RVD, RVD),	      rd_rm),
9016   CE(fcmpezd,	eb50bc0, 1, (RVD),	      rd),
9017 
9018 #undef ARM_VARIANT
9019 #define ARM_VARIANT FPU_VFP_EXT_V2
9020   CE(fmsrr,	c400a10, 3, (VRSLST, RR, RR), vfp_sp2_from_reg2),
9021   CE(fmrrs,	c500a10, 3, (RR, RR, VRSLST), vfp_reg2_from_sp2),
9022   CE(fmdrr,	c400b10, 3, (RVD, RR, RR),    rm_rd_rn),
9023   CE(fmrrd,	c500b10, 3, (RR, RR, RVD),    rd_rn_rm),
9024 
9025 #undef ARM_VARIANT
9026 #define ARM_VARIANT ARM_CEXT_XSCALE /* Intel XScale extensions.	 */
9027   CE(mia,	e200010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
9028   CE(miaph,	e280010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
9029   CE(miabb,	e2c0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
9030   CE(miabt,	e2d0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
9031   CE(miatb,	e2e0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
9032   CE(miatt,	e2f0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
9033   CE(mar,	c400000, 3, (RXA, RRnpc, RRnpc), xsc_mar),
9034   CE(mra,	c500000, 3, (RRnpc, RRnpc, RXA), xsc_mra),
9035 
9036 #undef ARM_VARIANT
9037 #define ARM_VARIANT ARM_CEXT_IWMMXT /* Intel Wireless MMX technology.  */
9038   CE(tandcb,	e13f130, 1, (RR),		    iwmmxt_tandorc),
9039   CE(tandch,	e53f130, 1, (RR),		    iwmmxt_tandorc),
9040   CE(tandcw,	e93f130, 1, (RR),		    iwmmxt_tandorc),
9041   CE(tbcstb,	e400010, 2, (RIWR, RR),		    rn_rd),
9042   CE(tbcsth,	e400050, 2, (RIWR, RR),		    rn_rd),
9043   CE(tbcstw,	e400090, 2, (RIWR, RR),		    rn_rd),
9044   CE(textrcb,	e130170, 2, (RR, I7),		    iwmmxt_textrc),
9045   CE(textrch,	e530170, 2, (RR, I7),		    iwmmxt_textrc),
9046   CE(textrcw,	e930170, 2, (RR, I7),		    iwmmxt_textrc),
9047   CE(textrmub,	e100070, 3, (RR, RIWR, I7),	    iwmmxt_textrm),
9048   CE(textrmuh,	e500070, 3, (RR, RIWR, I7),	    iwmmxt_textrm),
9049   CE(textrmuw,	e900070, 3, (RR, RIWR, I7),	    iwmmxt_textrm),
9050   CE(textrmsb,	e100078, 3, (RR, RIWR, I7),	    iwmmxt_textrm),
9051   CE(textrmsh,	e500078, 3, (RR, RIWR, I7),	    iwmmxt_textrm),
9052   CE(textrmsw,	e900078, 3, (RR, RIWR, I7),	    iwmmxt_textrm),
9053   CE(tinsrb,	e600010, 3, (RIWR, RR, I7),	    iwmmxt_tinsr),
9054   CE(tinsrh,	e600050, 3, (RIWR, RR, I7),	    iwmmxt_tinsr),
9055   CE(tinsrw,	e600090, 3, (RIWR, RR, I7),	    iwmmxt_tinsr),
9056   CE(tmcr,	e000110, 2, (RIWC, RR),		    rn_rd),
9057   CE(tmcrr,	c400000, 3, (RIWR, RR, RR),	    rm_rd_rn),
9058   CE(tmia,	e200010, 3, (RIWR, RR, RR),	    iwmmxt_tmia),
9059   CE(tmiaph,	e280010, 3, (RIWR, RR, RR),	    iwmmxt_tmia),
9060   CE(tmiabb,	e2c0010, 3, (RIWR, RR, RR),	    iwmmxt_tmia),
9061   CE(tmiabt,	e2d0010, 3, (RIWR, RR, RR),	    iwmmxt_tmia),
9062   CE(tmiatb,	e2e0010, 3, (RIWR, RR, RR),	    iwmmxt_tmia),
9063   CE(tmiatt,	e2f0010, 3, (RIWR, RR, RR),	    iwmmxt_tmia),
9064   CE(tmovmskb,	e100030, 2, (RR, RIWR),		    rd_rn),
9065   CE(tmovmskh,	e500030, 2, (RR, RIWR),		    rd_rn),
9066   CE(tmovmskw,	e900030, 2, (RR, RIWR),		    rd_rn),
9067   CE(tmrc,	e100110, 2, (RR, RIWC),		    rd_rn),
9068   CE(tmrrc,	c500000, 3, (RR, RR, RIWR),	    rd_rn_rm),
9069   CE(torcb,	e13f150, 1, (RR),		    iwmmxt_tandorc),
9070   CE(torch,	e53f150, 1, (RR),		    iwmmxt_tandorc),
9071   CE(torcw,	e93f150, 1, (RR),		    iwmmxt_tandorc),
9072   CE(waccb,	e0001c0, 2, (RIWR, RIWR),	    rd_rn),
9073   CE(wacch,	e4001c0, 2, (RIWR, RIWR),	    rd_rn),
9074   CE(waccw,	e8001c0, 2, (RIWR, RIWR),	    rd_rn),
9075   CE(waddbss,	e300180, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9076   CE(waddb,	e000180, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9077   CE(waddbus,	e100180, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9078   CE(waddhss,	e700180, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9079   CE(waddh,	e400180, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9080   CE(waddhus,	e500180, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9081   CE(waddwss,	eb00180, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9082   CE(waddw,	e800180, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9083   CE(waddwus,	e900180, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9084   CE(waligni,	e000020, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_waligni),
9085   CE(walignr0,	e800020, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9086   CE(walignr1,	e900020, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9087   CE(walignr2,	ea00020, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9088   CE(walignr3,	eb00020, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9089   CE(wand,	e200000, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9090   CE(wandn,	e300000, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9091   CE(wavg2b,	e800000, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9092   CE(wavg2br,	e900000, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9093   CE(wavg2h,	ec00000, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9094   CE(wavg2hr,	ed00000, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9095   CE(wcmpeqb,	e000060, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9096   CE(wcmpeqh,	e400060, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9097   CE(wcmpeqw,	e800060, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9098   CE(wcmpgtub,	e100060, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9099   CE(wcmpgtuh,	e500060, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9100   CE(wcmpgtuw,	e900060, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9101   CE(wcmpgtsb,	e300060, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9102   CE(wcmpgtsh,	e700060, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9103   CE(wcmpgtsw,	eb00060, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9104   CE(wldrb,	c100000, 2, (RIWR, ADDR),	    iwmmxt_wldstbh),
9105   CE(wldrh,	c500000, 2, (RIWR, ADDR),	    iwmmxt_wldstbh),
9106   CE(wldrw,	c100100, 2, (RIWR_RIWC, ADDR),	    iwmmxt_wldstw),
9107   CE(wldrd,	c500100, 2, (RIWR, ADDR),	    iwmmxt_wldstd),
9108   CE(wmacs,	e600100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9109   CE(wmacsz,	e700100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9110   CE(wmacu,	e400100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9111   CE(wmacuz,	e500100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9112   CE(wmadds,	ea00100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9113   CE(wmaddu,	e800100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9114   CE(wmaxsb,	e200160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9115   CE(wmaxsh,	e600160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9116   CE(wmaxsw,	ea00160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9117   CE(wmaxub,	e000160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9118   CE(wmaxuh,	e400160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9119   CE(wmaxuw,	e800160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9120   CE(wminsb,	e300160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9121   CE(wminsh,	e700160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9122   CE(wminsw,	eb00160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9123   CE(wminub,	e100160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9124   CE(wminuh,	e500160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9125   CE(wminuw,	e900160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9126   CE(wmov,	e000000, 2, (RIWR, RIWR),	    iwmmxt_wmov),
9127   CE(wmulsm,	e300100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9128   CE(wmulsl,	e200100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9129   CE(wmulum,	e100100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9130   CE(wmulul,	e000100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9131   CE(wor,	e000000, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9132   CE(wpackhss,	e700080, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9133   CE(wpackhus,	e500080, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9134   CE(wpackwss,	eb00080, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9135   CE(wpackwus,	e900080, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9136   CE(wpackdss,	ef00080, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9137   CE(wpackdus,	ed00080, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9138   CE(wrorh,	e700040, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9139   CE(wrorhg,	e700148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
9140   CE(wrorw,	eb00040, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9141   CE(wrorwg,	eb00148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
9142   CE(wrord,	ef00040, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9143   CE(wrordg,	ef00148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
9144   CE(wsadb,	e000120, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9145   CE(wsadbz,	e100120, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9146   CE(wsadh,	e400120, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9147   CE(wsadhz,	e500120, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9148   CE(wshufh,	e0001e0, 3, (RIWR, RIWR, I255),	    iwmmxt_wshufh),
9149   CE(wsllh,	e500040, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9150   CE(wsllhg,	e500148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
9151   CE(wsllw,	e900040, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9152   CE(wsllwg,	e900148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
9153   CE(wslld,	ed00040, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9154   CE(wslldg,	ed00148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
9155   CE(wsrah,	e400040, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9156   CE(wsrahg,	e400148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
9157   CE(wsraw,	e800040, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9158   CE(wsrawg,	e800148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
9159   CE(wsrad,	ec00040, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9160   CE(wsradg,	ec00148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
9161   CE(wsrlh,	e600040, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9162   CE(wsrlhg,	e600148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
9163   CE(wsrlw,	ea00040, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9164   CE(wsrlwg,	ea00148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
9165   CE(wsrld,	ee00040, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9166   CE(wsrldg,	ee00148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
9167   CE(wstrb,	c000000, 2, (RIWR, ADDR),	    iwmmxt_wldstbh),
9168   CE(wstrh,	c400000, 2, (RIWR, ADDR),	    iwmmxt_wldstbh),
9169   CE(wstrw,	c000100, 2, (RIWR_RIWC, ADDR),	    iwmmxt_wldstw),
9170   CE(wstrd,	c400100, 2, (RIWR, ADDR),	    iwmmxt_wldstd),
9171   CE(wsubbss,	e3001a0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9172   CE(wsubb,	e0001a0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9173   CE(wsubbus,	e1001a0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9174   CE(wsubhss,	e7001a0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9175   CE(wsubh,	e4001a0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9176   CE(wsubhus,	e5001a0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9177   CE(wsubwss,	eb001a0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9178   CE(wsubw,	e8001a0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9179   CE(wsubwus,	e9001a0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9180   CE(wunpckehub,e0000c0, 2, (RIWR, RIWR),	    rd_rn),
9181   CE(wunpckehuh,e4000c0, 2, (RIWR, RIWR),	    rd_rn),
9182   CE(wunpckehuw,e8000c0, 2, (RIWR, RIWR),	    rd_rn),
9183   CE(wunpckehsb,e2000c0, 2, (RIWR, RIWR),	    rd_rn),
9184   CE(wunpckehsh,e6000c0, 2, (RIWR, RIWR),	    rd_rn),
9185   CE(wunpckehsw,ea000c0, 2, (RIWR, RIWR),	    rd_rn),
9186   CE(wunpckihb, e1000c0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9187   CE(wunpckihh, e5000c0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9188   CE(wunpckihw, e9000c0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9189   CE(wunpckelub,e0000e0, 2, (RIWR, RIWR),	    rd_rn),
9190   CE(wunpckeluh,e4000e0, 2, (RIWR, RIWR),	    rd_rn),
9191   CE(wunpckeluw,e8000e0, 2, (RIWR, RIWR),	    rd_rn),
9192   CE(wunpckelsb,e2000e0, 2, (RIWR, RIWR),	    rd_rn),
9193   CE(wunpckelsh,e6000e0, 2, (RIWR, RIWR),	    rd_rn),
9194   CE(wunpckelsw,ea000e0, 2, (RIWR, RIWR),	    rd_rn),
9195   CE(wunpckilb, e1000e0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9196   CE(wunpckilh, e5000e0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9197   CE(wunpckilw, e9000e0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9198   CE(wxor,	e100000, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
9199   CE(wzero,	e300000, 1, (RIWR),		    iwmmxt_wzero),
9200 
9201 #undef ARM_VARIANT
9202 #define ARM_VARIANT ARM_CEXT_MAVERICK /* Cirrus Maverick instructions.	*/
9203   CE(cfldrs,	c100400, 2, (RMF, ADDR),	      rd_cpaddr),
9204   CE(cfldrd,	c500400, 2, (RMD, ADDR),	      rd_cpaddr),
9205   CE(cfldr32,	c100500, 2, (RMFX, ADDR),	      rd_cpaddr),
9206   CE(cfldr64,	c500500, 2, (RMDX, ADDR),	      rd_cpaddr),
9207   CE(cfstrs,	c000400, 2, (RMF, ADDR),	      rd_cpaddr),
9208   CE(cfstrd,	c400400, 2, (RMD, ADDR),	      rd_cpaddr),
9209   CE(cfstr32,	c000500, 2, (RMFX, ADDR),	      rd_cpaddr),
9210   CE(cfstr64,	c400500, 2, (RMDX, ADDR),	      rd_cpaddr),
9211   CE(cfmvsr,	e000450, 2, (RMF, RR),		      rn_rd),
9212   CE(cfmvrs,	e100450, 2, (RR, RMF),		      rd_rn),
9213   CE(cfmvdlr,	e000410, 2, (RMD, RR),		      rn_rd),
9214   CE(cfmvrdl,	e100410, 2, (RR, RMD),		      rd_rn),
9215   CE(cfmvdhr,	e000430, 2, (RMD, RR),		      rn_rd),
9216   CE(cfmvrdh,	e100430, 2, (RR, RMD),		      rd_rn),
9217   CE(cfmv64lr,	e000510, 2, (RMDX, RR),		      rn_rd),
9218   CE(cfmvr64l,	e100510, 2, (RR, RMDX),		      rd_rn),
9219   CE(cfmv64hr,	e000530, 2, (RMDX, RR),		      rn_rd),
9220   CE(cfmvr64h,	e100530, 2, (RR, RMDX),		      rd_rn),
9221   CE(cfmval32,	e200440, 2, (RMAX, RMFX),	      rd_rn),
9222   CE(cfmv32al,	e100440, 2, (RMFX, RMAX),	      rd_rn),
9223   CE(cfmvam32,	e200460, 2, (RMAX, RMFX),	      rd_rn),
9224   CE(cfmv32am,	e100460, 2, (RMFX, RMAX),	      rd_rn),
9225   CE(cfmvah32,	e200480, 2, (RMAX, RMFX),	      rd_rn),
9226   CE(cfmv32ah,	e100480, 2, (RMFX, RMAX),	      rd_rn),
9227   CE(cfmva32,	e2004a0, 2, (RMAX, RMFX),	      rd_rn),
9228   CE(cfmv32a,	e1004a0, 2, (RMFX, RMAX),	      rd_rn),
9229   CE(cfmva64,	e2004c0, 2, (RMAX, RMDX),	      rd_rn),
9230   CE(cfmv64a,	e1004c0, 2, (RMDX, RMAX),	      rd_rn),
9231   CE(cfmvsc32,	e2004e0, 2, (RMDS, RMDX),	      mav_dspsc),
9232   CE(cfmv32sc,	e1004e0, 2, (RMDX, RMDS),	      rd),
9233   CE(cfcpys,	e000400, 2, (RMF, RMF),		      rd_rn),
9234   CE(cfcpyd,	e000420, 2, (RMD, RMD),		      rd_rn),
9235   CE(cfcvtsd,	e000460, 2, (RMD, RMF),		      rd_rn),
9236   CE(cfcvtds,	e000440, 2, (RMF, RMD),		      rd_rn),
9237   CE(cfcvt32s,	e000480, 2, (RMF, RMFX),	      rd_rn),
9238   CE(cfcvt32d,	e0004a0, 2, (RMD, RMFX),	      rd_rn),
9239   CE(cfcvt64s,	e0004c0, 2, (RMF, RMDX),	      rd_rn),
9240   CE(cfcvt64d,	e0004e0, 2, (RMD, RMDX),	      rd_rn),
9241   CE(cfcvts32,	e100580, 2, (RMFX, RMF),	      rd_rn),
9242   CE(cfcvtd32,	e1005a0, 2, (RMFX, RMD),	      rd_rn),
9243   CE(cftruncs32,e1005c0, 2, (RMFX, RMF),	      rd_rn),
9244   CE(cftruncd32,e1005e0, 2, (RMFX, RMD),	      rd_rn),
9245   CE(cfrshl32,	e000550, 3, (RMFX, RMFX, RR),	      mav_triple),
9246   CE(cfrshl64,	e000570, 3, (RMDX, RMDX, RR),	      mav_triple),
9247   CE(cfsh32,	e000500, 3, (RMFX, RMFX, I63s),	      mav_shift),
9248   CE(cfsh64,	e200500, 3, (RMDX, RMDX, I63s),	      mav_shift),
9249   CE(cfcmps,	e100490, 3, (RR, RMF, RMF),	      rd_rn_rm),
9250   CE(cfcmpd,	e1004b0, 3, (RR, RMD, RMD),	      rd_rn_rm),
9251   CE(cfcmp32,	e100590, 3, (RR, RMFX, RMFX),	      rd_rn_rm),
9252   CE(cfcmp64,	e1005b0, 3, (RR, RMDX, RMDX),	      rd_rn_rm),
9253   CE(cfabss,	e300400, 2, (RMF, RMF),		      rd_rn),
9254   CE(cfabsd,	e300420, 2, (RMD, RMD),		      rd_rn),
9255   CE(cfnegs,	e300440, 2, (RMF, RMF),		      rd_rn),
9256   CE(cfnegd,	e300460, 2, (RMD, RMD),		      rd_rn),
9257   CE(cfadds,	e300480, 3, (RMF, RMF, RMF),	      rd_rn_rm),
9258   CE(cfaddd,	e3004a0, 3, (RMD, RMD, RMD),	      rd_rn_rm),
9259   CE(cfsubs,	e3004c0, 3, (RMF, RMF, RMF),	      rd_rn_rm),
9260   CE(cfsubd,	e3004e0, 3, (RMD, RMD, RMD),	      rd_rn_rm),
9261   CE(cfmuls,	e100400, 3, (RMF, RMF, RMF),	      rd_rn_rm),
9262   CE(cfmuld,	e100420, 3, (RMD, RMD, RMD),	      rd_rn_rm),
9263   CE(cfabs32,	e300500, 2, (RMFX, RMFX),	      rd_rn),
9264   CE(cfabs64,	e300520, 2, (RMDX, RMDX),	      rd_rn),
9265   CE(cfneg32,	e300540, 2, (RMFX, RMFX),	      rd_rn),
9266   CE(cfneg64,	e300560, 2, (RMDX, RMDX),	      rd_rn),
9267   CE(cfadd32,	e300580, 3, (RMFX, RMFX, RMFX),	      rd_rn_rm),
9268   CE(cfadd64,	e3005a0, 3, (RMDX, RMDX, RMDX),	      rd_rn_rm),
9269   CE(cfsub32,	e3005c0, 3, (RMFX, RMFX, RMFX),	      rd_rn_rm),
9270   CE(cfsub64,	e3005e0, 3, (RMDX, RMDX, RMDX),	      rd_rn_rm),
9271   CE(cfmul32,	e100500, 3, (RMFX, RMFX, RMFX),	      rd_rn_rm),
9272   CE(cfmul64,	e100520, 3, (RMDX, RMDX, RMDX),	      rd_rn_rm),
9273   CE(cfmac32,	e100540, 3, (RMFX, RMFX, RMFX),	      rd_rn_rm),
9274   CE(cfmsc32,	e100560, 3, (RMFX, RMFX, RMFX),	      rd_rn_rm),
9275   CE(cfmadd32,	e000600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
9276   CE(cfmsub32,	e100600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
9277   CE(cfmadda32, e200600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
9278   CE(cfmsuba32, e300600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
9279 };
9280 #undef ARM_VARIANT
9281 #undef THUMB_VARIANT
9282 #undef TCE
9283 #undef TCM
9284 #undef TUE
9285 #undef TUF
9286 #undef TCC
9287 #undef CE
9288 #undef CM
9289 #undef UE
9290 #undef UF
9291 #undef UT
9292 #undef OPS0
9293 #undef OPS1
9294 #undef OPS2
9295 #undef OPS3
9296 #undef OPS4
9297 #undef OPS5
9298 #undef OPS6
9299 #undef do_0
9300 
9301 /* MD interface: bits in the object file.  */
9302 
9303 /* Turn an integer of n bytes (in val) into a stream of bytes appropriate
9304    for use in the a.out file, and stores them in the array pointed to by buf.
9305    This knows about the endian-ness of the target machine and does
9306    THE RIGHT THING, whatever it is.  Possible values for n are 1 (byte)
9307    2 (short) and 4 (long)  Floating numbers are put out as a series of
9308    LITTLENUMS (shorts, here at least).	*/
9309 
9310 void
md_number_to_chars(char * buf,valueT val,int n)9311 md_number_to_chars (char * buf, valueT val, int n)
9312 {
9313   if (target_big_endian)
9314     number_to_chars_bigendian (buf, val, n);
9315   else
9316     number_to_chars_littleendian (buf, val, n);
9317 }
9318 
9319 static valueT
md_chars_to_number(char * buf,int n)9320 md_chars_to_number (char * buf, int n)
9321 {
9322   valueT result = 0;
9323   unsigned char * where = (unsigned char *) buf;
9324 
9325   if (target_big_endian)
9326     {
9327       while (n--)
9328 	{
9329 	  result <<= 8;
9330 	  result |= (*where++ & 255);
9331 	}
9332     }
9333   else
9334     {
9335       while (n--)
9336 	{
9337 	  result <<= 8;
9338 	  result |= (where[n] & 255);
9339 	}
9340     }
9341 
9342   return result;
9343 }
9344 
9345 /* MD interface: Sections.  */
9346 
9347 int
md_estimate_size_before_relax(fragS * fragP ATTRIBUTE_UNUSED,segT segtype ATTRIBUTE_UNUSED)9348 md_estimate_size_before_relax (fragS * fragP ATTRIBUTE_UNUSED,
9349 			       segT    segtype ATTRIBUTE_UNUSED)
9350 {
9351   as_fatal (_("md_estimate_size_before_relax\n"));
9352   return 1;
9353 }
9354 
9355 /* Round up a section size to the appropriate boundary.	 */
9356 
9357 valueT
md_section_align(segT segment ATTRIBUTE_UNUSED,valueT size)9358 md_section_align (segT	 segment ATTRIBUTE_UNUSED,
9359 		  valueT size)
9360 {
9361 #ifdef OBJ_ELF
9362   return size;
9363 #else
9364   /* Round all sects to multiple of 4.	*/
9365   return (size + 3) & ~3;
9366 #endif
9367 }
9368 
9369 /* This is called from HANDLE_ALIGN in write.c.	 Fill in the contents
9370    of an rs_align_code fragment.  */
9371 
9372 void
arm_handle_align(fragS * fragP)9373 arm_handle_align (fragS * fragP)
9374 {
9375   static char const arm_noop[4] = { 0x00, 0x00, 0xa0, 0xe1 };
9376   static char const thumb_noop[2] = { 0xc0, 0x46 };
9377   static char const arm_bigend_noop[4] = { 0xe1, 0xa0, 0x00, 0x00 };
9378   static char const thumb_bigend_noop[2] = { 0x46, 0xc0 };
9379 
9380   int bytes, fix, noop_size;
9381   char * p;
9382   const char * noop;
9383 
9384   if (fragP->fr_type != rs_align_code)
9385     return;
9386 
9387   bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
9388   p = fragP->fr_literal + fragP->fr_fix;
9389   fix = 0;
9390 
9391   if (bytes > MAX_MEM_FOR_RS_ALIGN_CODE)
9392     bytes &= MAX_MEM_FOR_RS_ALIGN_CODE;
9393 
9394   if (fragP->tc_frag_data)
9395     {
9396       if (target_big_endian)
9397 	noop = thumb_bigend_noop;
9398       else
9399 	noop = thumb_noop;
9400       noop_size = sizeof (thumb_noop);
9401     }
9402   else
9403     {
9404       if (target_big_endian)
9405 	noop = arm_bigend_noop;
9406       else
9407 	noop = arm_noop;
9408       noop_size = sizeof (arm_noop);
9409     }
9410 
9411   if (bytes & (noop_size - 1))
9412     {
9413       fix = bytes & (noop_size - 1);
9414       memset (p, 0, fix);
9415       p += fix;
9416       bytes -= fix;
9417     }
9418 
9419   while (bytes >= noop_size)
9420     {
9421       memcpy (p, noop, noop_size);
9422       p += noop_size;
9423       bytes -= noop_size;
9424       fix += noop_size;
9425     }
9426 
9427   fragP->fr_fix += fix;
9428   fragP->fr_var = noop_size;
9429 }
9430 
9431 /* Called from md_do_align.  Used to create an alignment
9432    frag in a code section.  */
9433 
9434 void
arm_frag_align_code(int n,int max)9435 arm_frag_align_code (int n, int max)
9436 {
9437   char * p;
9438 
9439   /* We assume that there will never be a requirement
9440      to support alignments greater than 32 bytes.  */
9441   if (max > MAX_MEM_FOR_RS_ALIGN_CODE)
9442     as_fatal (_("alignments greater than 32 bytes not supported in .text sections."));
9443 
9444   p = frag_var (rs_align_code,
9445 		MAX_MEM_FOR_RS_ALIGN_CODE,
9446 		1,
9447 		(relax_substateT) max,
9448 		(symbolS *) NULL,
9449 		(offsetT) n,
9450 		(char *) NULL);
9451   *p = 0;
9452 }
9453 
9454 /* Perform target specific initialisation of a frag.  */
9455 
9456 void
arm_init_frag(fragS * fragP)9457 arm_init_frag (fragS * fragP)
9458 {
9459   /* Record whether this frag is in an ARM or a THUMB area.  */
9460   fragP->tc_frag_data = thumb_mode;
9461 }
9462 
9463 #ifdef OBJ_ELF
9464 /* When we change sections we need to issue a new mapping symbol.  */
9465 
9466 void
arm_elf_change_section(void)9467 arm_elf_change_section (void)
9468 {
9469   flagword flags;
9470   segment_info_type *seginfo;
9471 
9472   /* Link an unlinked unwind index table section to the .text section.	*/
9473   if (elf_section_type (now_seg) == SHT_ARM_EXIDX
9474       && elf_linked_to_section (now_seg) == NULL)
9475     elf_linked_to_section (now_seg) = text_section;
9476 
9477   if (!SEG_NORMAL (now_seg))
9478     return;
9479 
9480   flags = bfd_get_section_flags (stdoutput, now_seg);
9481 
9482   /* We can ignore sections that only contain debug info.  */
9483   if ((flags & SEC_ALLOC) == 0)
9484     return;
9485 
9486   seginfo = seg_info (now_seg);
9487   mapstate = seginfo->tc_segment_info_data.mapstate;
9488   marked_pr_dependency = seginfo->tc_segment_info_data.marked_pr_dependency;
9489 }
9490 
9491 int
arm_elf_section_type(const char * str,size_t len)9492 arm_elf_section_type (const char * str, size_t len)
9493 {
9494   if (len == 5 && strncmp (str, "exidx", 5) == 0)
9495     return SHT_ARM_EXIDX;
9496 
9497   return -1;
9498 }
9499 
9500 /* Code to deal with unwinding tables.	*/
9501 
9502 static void add_unwind_adjustsp (offsetT);
9503 
9504 /* Cenerate and deferred unwind frame offset.  */
9505 
9506 static void
flush_pending_unwind(void)9507 flush_pending_unwind (void)
9508 {
9509   offsetT offset;
9510 
9511   offset = unwind.pending_offset;
9512   unwind.pending_offset = 0;
9513   if (offset != 0)
9514     add_unwind_adjustsp (offset);
9515 }
9516 
9517 /* Add an opcode to this list for this function.  Two-byte opcodes should
9518    be passed as op[0] << 8 | op[1].  The list of opcodes is built in reverse
9519    order.  */
9520 
9521 static void
add_unwind_opcode(valueT op,int length)9522 add_unwind_opcode (valueT op, int length)
9523 {
9524   /* Add any deferred stack adjustment.	 */
9525   if (unwind.pending_offset)
9526     flush_pending_unwind ();
9527 
9528   unwind.sp_restored = 0;
9529 
9530   if (unwind.opcode_count + length > unwind.opcode_alloc)
9531     {
9532       unwind.opcode_alloc += ARM_OPCODE_CHUNK_SIZE;
9533       if (unwind.opcodes)
9534 	unwind.opcodes = xrealloc (unwind.opcodes,
9535 				   unwind.opcode_alloc);
9536       else
9537 	unwind.opcodes = xmalloc (unwind.opcode_alloc);
9538     }
9539   while (length > 0)
9540     {
9541       length--;
9542       unwind.opcodes[unwind.opcode_count] = op & 0xff;
9543       op >>= 8;
9544       unwind.opcode_count++;
9545     }
9546 }
9547 
9548 /* Add unwind opcodes to adjust the stack pointer.  */
9549 
9550 static void
add_unwind_adjustsp(offsetT offset)9551 add_unwind_adjustsp (offsetT offset)
9552 {
9553   valueT op;
9554 
9555   if (offset > 0x200)
9556     {
9557       /* We need at most 5 bytes to hold a 32-bit value in a uleb128.  */
9558       char bytes[5];
9559       int n;
9560       valueT o;
9561 
9562       /* Long form: 0xb2, uleb128.  */
9563       /* This might not fit in a word so add the individual bytes,
9564 	 remembering the list is built in reverse order.  */
9565       o = (valueT) ((offset - 0x204) >> 2);
9566       if (o == 0)
9567 	add_unwind_opcode (0, 1);
9568 
9569       /* Calculate the uleb128 encoding of the offset.	*/
9570       n = 0;
9571       while (o)
9572 	{
9573 	  bytes[n] = o & 0x7f;
9574 	  o >>= 7;
9575 	  if (o)
9576 	    bytes[n] |= 0x80;
9577 	  n++;
9578 	}
9579       /* Add the insn.	*/
9580       for (; n; n--)
9581 	add_unwind_opcode (bytes[n - 1], 1);
9582       add_unwind_opcode (0xb2, 1);
9583     }
9584   else if (offset > 0x100)
9585     {
9586       /* Two short opcodes.  */
9587       add_unwind_opcode (0x3f, 1);
9588       op = (offset - 0x104) >> 2;
9589       add_unwind_opcode (op, 1);
9590     }
9591   else if (offset > 0)
9592     {
9593       /* Short opcode.	*/
9594       op = (offset - 4) >> 2;
9595       add_unwind_opcode (op, 1);
9596     }
9597   else if (offset < 0)
9598     {
9599       offset = -offset;
9600       while (offset > 0x100)
9601 	{
9602 	  add_unwind_opcode (0x7f, 1);
9603 	  offset -= 0x100;
9604 	}
9605       op = ((offset - 4) >> 2) | 0x40;
9606       add_unwind_opcode (op, 1);
9607     }
9608 }
9609 
9610 /* Finish the list of unwind opcodes for this function.	 */
9611 static void
finish_unwind_opcodes(void)9612 finish_unwind_opcodes (void)
9613 {
9614   valueT op;
9615 
9616   if (unwind.fp_used)
9617     {
9618       /* Adjust sp as neccessary.  */
9619       unwind.pending_offset += unwind.fp_offset - unwind.frame_size;
9620       flush_pending_unwind ();
9621 
9622       /* After restoring sp from the frame pointer.  */
9623       op = 0x90 | unwind.fp_reg;
9624       add_unwind_opcode (op, 1);
9625     }
9626   else
9627     flush_pending_unwind ();
9628 }
9629 
9630 
9631 /* Start an exception table entry.  If idx is nonzero this is an index table
9632    entry.  */
9633 
9634 static void
start_unwind_section(const segT text_seg,int idx)9635 start_unwind_section (const segT text_seg, int idx)
9636 {
9637   const char * text_name;
9638   const char * prefix;
9639   const char * prefix_once;
9640   const char * group_name;
9641   size_t prefix_len;
9642   size_t text_len;
9643   char * sec_name;
9644   size_t sec_name_len;
9645   int type;
9646   int flags;
9647   int linkonce;
9648 
9649   if (idx)
9650     {
9651       prefix = ELF_STRING_ARM_unwind;
9652       prefix_once = ELF_STRING_ARM_unwind_once;
9653       type = SHT_ARM_EXIDX;
9654     }
9655   else
9656     {
9657       prefix = ELF_STRING_ARM_unwind_info;
9658       prefix_once = ELF_STRING_ARM_unwind_info_once;
9659       type = SHT_PROGBITS;
9660     }
9661 
9662   text_name = segment_name (text_seg);
9663   if (streq (text_name, ".text"))
9664     text_name = "";
9665 
9666   if (strncmp (text_name, ".gnu.linkonce.t.",
9667 	       strlen (".gnu.linkonce.t.")) == 0)
9668     {
9669       prefix = prefix_once;
9670       text_name += strlen (".gnu.linkonce.t.");
9671     }
9672 
9673   prefix_len = strlen (prefix);
9674   text_len = strlen (text_name);
9675   sec_name_len = prefix_len + text_len;
9676   sec_name = xmalloc (sec_name_len + 1);
9677   memcpy (sec_name, prefix, prefix_len);
9678   memcpy (sec_name + prefix_len, text_name, text_len);
9679   sec_name[prefix_len + text_len] = '\0';
9680 
9681   flags = SHF_ALLOC;
9682   linkonce = 0;
9683   group_name = 0;
9684 
9685   /* Handle COMDAT group.  */
9686   if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
9687     {
9688       group_name = elf_group_name (text_seg);
9689       if (group_name == NULL)
9690 	{
9691 	  as_bad ("Group section `%s' has no group signature",
9692 		  segment_name (text_seg));
9693 	  ignore_rest_of_line ();
9694 	  return;
9695 	}
9696       flags |= SHF_GROUP;
9697       linkonce = 1;
9698     }
9699 
9700   obj_elf_change_section (sec_name, type, flags, 0, group_name, linkonce, 0);
9701 
9702   /* Set the setion link for index tables.  */
9703   if (idx)
9704     elf_linked_to_section (now_seg) = text_seg;
9705 }
9706 
9707 
9708 /* Start an unwind table entry.	 HAVE_DATA is nonzero if we have additional
9709    personality routine data.  Returns zero, or the index table value for
9710    and inline entry.  */
9711 
9712 static valueT
create_unwind_entry(int have_data)9713 create_unwind_entry (int have_data)
9714 {
9715   int size;
9716   addressT where;
9717   char *ptr;
9718   /* The current word of data.	*/
9719   valueT data;
9720   /* The number of bytes left in this word.  */
9721   int n;
9722 
9723   finish_unwind_opcodes ();
9724 
9725   /* Remember the current text section.	 */
9726   unwind.saved_seg = now_seg;
9727   unwind.saved_subseg = now_subseg;
9728 
9729   start_unwind_section (now_seg, 0);
9730 
9731   if (unwind.personality_routine == NULL)
9732     {
9733       if (unwind.personality_index == -2)
9734 	{
9735 	  if (have_data)
9736 	    as_bad (_("handerdata in cantunwind frame"));
9737 	  return 1; /* EXIDX_CANTUNWIND.  */
9738 	}
9739 
9740       /* Use a default personality routine if none is specified.  */
9741       if (unwind.personality_index == -1)
9742 	{
9743 	  if (unwind.opcode_count > 3)
9744 	    unwind.personality_index = 1;
9745 	  else
9746 	    unwind.personality_index = 0;
9747 	}
9748 
9749       /* Space for the personality routine entry.  */
9750       if (unwind.personality_index == 0)
9751 	{
9752 	  if (unwind.opcode_count > 3)
9753 	    as_bad (_("too many unwind opcodes for personality routine 0"));
9754 
9755 	  if (!have_data)
9756 	    {
9757 	      /* All the data is inline in the index table.  */
9758 	      data = 0x80;
9759 	      n = 3;
9760 	      while (unwind.opcode_count > 0)
9761 		{
9762 		  unwind.opcode_count--;
9763 		  data = (data << 8) | unwind.opcodes[unwind.opcode_count];
9764 		  n--;
9765 		}
9766 
9767 	      /* Pad with "finish" opcodes.  */
9768 	      while (n--)
9769 		data = (data << 8) | 0xb0;
9770 
9771 	      return data;
9772 	    }
9773 	  size = 0;
9774 	}
9775       else
9776 	/* We get two opcodes "free" in the first word.	 */
9777 	size = unwind.opcode_count - 2;
9778     }
9779   else
9780     /* An extra byte is required for the opcode count.	*/
9781     size = unwind.opcode_count + 1;
9782 
9783   size = (size + 3) >> 2;
9784   if (size > 0xff)
9785     as_bad (_("too many unwind opcodes"));
9786 
9787   frag_align (2, 0, 0);
9788   record_alignment (now_seg, 2);
9789   unwind.table_entry = expr_build_dot ();
9790 
9791   /* Allocate the table entry.	*/
9792   ptr = frag_more ((size << 2) + 4);
9793   where = frag_now_fix () - ((size << 2) + 4);
9794 
9795   switch (unwind.personality_index)
9796     {
9797     case -1:
9798       /* ??? Should this be a PLT generating relocation?  */
9799       /* Custom personality routine.  */
9800       fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
9801 	       BFD_RELOC_ARM_PREL31);
9802 
9803       where += 4;
9804       ptr += 4;
9805 
9806       /* Set the first byte to the number of additional words.	*/
9807       data = size - 1;
9808       n = 3;
9809       break;
9810 
9811     /* ABI defined personality routines.  */
9812     case 0:
9813       /* Three opcodes bytes are packed into the first word.  */
9814       data = 0x80;
9815       n = 3;
9816       break;
9817 
9818     case 1:
9819     case 2:
9820       /* The size and first two opcode bytes go in the first word.  */
9821       data = ((0x80 + unwind.personality_index) << 8) | size;
9822       n = 2;
9823       break;
9824 
9825     default:
9826       /* Should never happen.  */
9827       abort ();
9828     }
9829 
9830   /* Pack the opcodes into words (MSB first), reversing the list at the same
9831      time.  */
9832   while (unwind.opcode_count > 0)
9833     {
9834       if (n == 0)
9835 	{
9836 	  md_number_to_chars (ptr, data, 4);
9837 	  ptr += 4;
9838 	  n = 4;
9839 	  data = 0;
9840 	}
9841       unwind.opcode_count--;
9842       n--;
9843       data = (data << 8) | unwind.opcodes[unwind.opcode_count];
9844     }
9845 
9846   /* Finish off the last word.	*/
9847   if (n < 4)
9848     {
9849       /* Pad with "finish" opcodes.  */
9850       while (n--)
9851 	data = (data << 8) | 0xb0;
9852 
9853       md_number_to_chars (ptr, data, 4);
9854     }
9855 
9856   if (!have_data)
9857     {
9858       /* Add an empty descriptor if there is no user-specified data.   */
9859       ptr = frag_more (4);
9860       md_number_to_chars (ptr, 0, 4);
9861     }
9862 
9863   return 0;
9864 }
9865 
9866 /* Convert REGNAME to a DWARF-2 register number.  */
9867 
9868 int
tc_arm_regname_to_dw2regnum(const char * regname)9869 tc_arm_regname_to_dw2regnum (const char *regname)
9870 {
9871   int reg = arm_reg_parse ((char **) &regname, REG_TYPE_RN);
9872 
9873   if (reg == FAIL)
9874     return -1;
9875 
9876   return reg;
9877 }
9878 
9879 /* Initialize the DWARF-2 unwind information for this procedure.  */
9880 
9881 void
tc_arm_frame_initial_instructions(void)9882 tc_arm_frame_initial_instructions (void)
9883 {
9884   cfi_add_CFA_def_cfa (REG_SP, 0);
9885 }
9886 #endif /* OBJ_ELF */
9887 
9888 
9889 /* MD interface: Symbol and relocation handling.  */
9890 
9891 /* Return the address within the segment that a PC-relative fixup is
9892    relative to.  For ARM, PC-relative fixups applied to instructions
9893    are generally relative to the location of the fixup plus 8 bytes.
9894    Thumb branches are offset by 4, and Thumb loads relative to PC
9895    require special handling.  */
9896 
9897 long
md_pcrel_from_section(fixS * fixP,segT seg)9898 md_pcrel_from_section (fixS * fixP, segT seg)
9899 {
9900   offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
9901 
9902   /* If this is pc-relative and we are going to emit a relocation
9903      then we just want to put out any pipeline compensation that the linker
9904      will need.  Otherwise we want to use the calculated base.  */
9905   if (fixP->fx_pcrel
9906       && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
9907 	  || arm_force_relocation (fixP)))
9908     base = 0;
9909 
9910   switch (fixP->fx_r_type)
9911     {
9912       /* PC relative addressing on the Thumb is slightly odd as the
9913 	 bottom two bits of the PC are forced to zero for the
9914 	 calculation.  This happens *after* application of the
9915 	 pipeline offset.  However, Thumb adrl already adjusts for
9916 	 this, so we need not do it again.  */
9917     case BFD_RELOC_ARM_THUMB_ADD:
9918       return base & ~3;
9919 
9920     case BFD_RELOC_ARM_THUMB_OFFSET:
9921     case BFD_RELOC_ARM_T32_OFFSET_IMM:
9922       return (base + 4) & ~3;
9923 
9924       /* Thumb branches are simply offset by +4.  */
9925     case BFD_RELOC_THUMB_PCREL_BRANCH7:
9926     case BFD_RELOC_THUMB_PCREL_BRANCH9:
9927     case BFD_RELOC_THUMB_PCREL_BRANCH12:
9928     case BFD_RELOC_THUMB_PCREL_BRANCH20:
9929     case BFD_RELOC_THUMB_PCREL_BRANCH23:
9930     case BFD_RELOC_THUMB_PCREL_BRANCH25:
9931     case BFD_RELOC_THUMB_PCREL_BLX:
9932       return base + 4;
9933 
9934       /* ARM mode branches are offset by +8.  However, the Windows CE
9935 	 loader expects the relocation not to take this into account.  */
9936     case BFD_RELOC_ARM_PCREL_BRANCH:
9937     case BFD_RELOC_ARM_PCREL_BLX:
9938     case BFD_RELOC_ARM_PLT32:
9939 #ifdef TE_WINCE
9940       return base;
9941 #else
9942       return base + 8;
9943 #endif
9944 
9945       /* ARM mode loads relative to PC are also offset by +8.  Unlike
9946 	 branches, the Windows CE loader *does* expect the relocation
9947 	 to take this into account.  */
9948     case BFD_RELOC_ARM_OFFSET_IMM:
9949     case BFD_RELOC_ARM_OFFSET_IMM8:
9950     case BFD_RELOC_ARM_HWLITERAL:
9951     case BFD_RELOC_ARM_LITERAL:
9952     case BFD_RELOC_ARM_CP_OFF_IMM:
9953       return base + 8;
9954 
9955 
9956       /* Other PC-relative relocations are un-offset.  */
9957     default:
9958       return base;
9959     }
9960 }
9961 
9962 /* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
9963    Otherwise we have no need to default values of symbols.  */
9964 
9965 symbolS *
md_undefined_symbol(char * name ATTRIBUTE_UNUSED)9966 md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
9967 {
9968 #ifdef OBJ_ELF
9969   if (name[0] == '_' && name[1] == 'G'
9970       && streq (name, GLOBAL_OFFSET_TABLE_NAME))
9971     {
9972       if (!GOT_symbol)
9973 	{
9974 	  if (symbol_find (name))
9975 	    as_bad ("GOT already in the symbol table");
9976 
9977 	  GOT_symbol = symbol_new (name, undefined_section,
9978 				   (valueT) 0, & zero_address_frag);
9979 	}
9980 
9981       return GOT_symbol;
9982     }
9983 #endif
9984 
9985   return 0;
9986 }
9987 
9988 /* Subroutine of md_apply_fix.	 Check to see if an immediate can be
9989    computed as two separate immediate values, added together.  We
9990    already know that this value cannot be computed by just one ARM
9991    instruction.	 */
9992 
9993 static unsigned int
validate_immediate_twopart(unsigned int val,unsigned int * highpart)9994 validate_immediate_twopart (unsigned int   val,
9995 			    unsigned int * highpart)
9996 {
9997   unsigned int a;
9998   unsigned int i;
9999 
10000   for (i = 0; i < 32; i += 2)
10001     if (((a = rotate_left (val, i)) & 0xff) != 0)
10002       {
10003 	if (a & 0xff00)
10004 	  {
10005 	    if (a & ~ 0xffff)
10006 	      continue;
10007 	    * highpart = (a  >> 8) | ((i + 24) << 7);
10008 	  }
10009 	else if (a & 0xff0000)
10010 	  {
10011 	    if (a & 0xff000000)
10012 	      continue;
10013 	    * highpart = (a >> 16) | ((i + 16) << 7);
10014 	  }
10015 	else
10016 	  {
10017 	    assert (a & 0xff000000);
10018 	    * highpart = (a >> 24) | ((i + 8) << 7);
10019 	  }
10020 
10021 	return (a & 0xff) | (i << 7);
10022       }
10023 
10024   return FAIL;
10025 }
10026 
10027 static int
validate_offset_imm(unsigned int val,int hwse)10028 validate_offset_imm (unsigned int val, int hwse)
10029 {
10030   if ((hwse && val > 255) || val > 4095)
10031     return FAIL;
10032   return val;
10033 }
10034 
10035 /* Subroutine of md_apply_fix.	 Do those data_ops which can take a
10036    negative immediate constant by altering the instruction.  A bit of
10037    a hack really.
10038 	MOV <-> MVN
10039 	AND <-> BIC
10040 	ADC <-> SBC
10041 	by inverting the second operand, and
10042 	ADD <-> SUB
10043 	CMP <-> CMN
10044 	by negating the second operand.	 */
10045 
10046 static int
negate_data_op(unsigned long * instruction,unsigned long value)10047 negate_data_op (unsigned long * instruction,
10048 		unsigned long	value)
10049 {
10050   int op, new_inst;
10051   unsigned long negated, inverted;
10052 
10053   negated = encode_arm_immediate (-value);
10054   inverted = encode_arm_immediate (~value);
10055 
10056   op = (*instruction >> DATA_OP_SHIFT) & 0xf;
10057   switch (op)
10058     {
10059       /* First negates.	 */
10060     case OPCODE_SUB:		 /* ADD <-> SUB	 */
10061       new_inst = OPCODE_ADD;
10062       value = negated;
10063       break;
10064 
10065     case OPCODE_ADD:
10066       new_inst = OPCODE_SUB;
10067       value = negated;
10068       break;
10069 
10070     case OPCODE_CMP:		 /* CMP <-> CMN	 */
10071       new_inst = OPCODE_CMN;
10072       value = negated;
10073       break;
10074 
10075     case OPCODE_CMN:
10076       new_inst = OPCODE_CMP;
10077       value = negated;
10078       break;
10079 
10080       /* Now Inverted ops.  */
10081     case OPCODE_MOV:		 /* MOV <-> MVN	 */
10082       new_inst = OPCODE_MVN;
10083       value = inverted;
10084       break;
10085 
10086     case OPCODE_MVN:
10087       new_inst = OPCODE_MOV;
10088       value = inverted;
10089       break;
10090 
10091     case OPCODE_AND:		 /* AND <-> BIC	 */
10092       new_inst = OPCODE_BIC;
10093       value = inverted;
10094       break;
10095 
10096     case OPCODE_BIC:
10097       new_inst = OPCODE_AND;
10098       value = inverted;
10099       break;
10100 
10101     case OPCODE_ADC:		  /* ADC <-> SBC  */
10102       new_inst = OPCODE_SBC;
10103       value = inverted;
10104       break;
10105 
10106     case OPCODE_SBC:
10107       new_inst = OPCODE_ADC;
10108       value = inverted;
10109       break;
10110 
10111       /* We cannot do anything.	 */
10112     default:
10113       return FAIL;
10114     }
10115 
10116   if (value == (unsigned) FAIL)
10117     return FAIL;
10118 
10119   *instruction &= OPCODE_MASK;
10120   *instruction |= new_inst << DATA_OP_SHIFT;
10121   return value;
10122 }
10123 
10124 void
md_apply_fix(fixS * fixP,valueT * valP,segT seg)10125 md_apply_fix (fixS *	fixP,
10126 	       valueT * valP,
10127 	       segT	seg)
10128 {
10129   offsetT	 value = * valP;
10130   offsetT	 newval;
10131   unsigned int	 newimm;
10132   unsigned long	 temp;
10133   int		 sign;
10134   char *	 buf = fixP->fx_where + fixP->fx_frag->fr_literal;
10135 
10136   assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
10137 
10138   /* Note whether this will delete the relocation.  */
10139   if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
10140     fixP->fx_done = 1;
10141 
10142   /* On a 64-bit host, silently truncate 'value' to 32 bits for
10143      consistency with the behavior on 32-bit hosts.  Remember value
10144      for emit_reloc.  */
10145   value &= 0xffffffff;
10146   value ^= 0x80000000;
10147   value -= 0x80000000;
10148 
10149   *valP = value;
10150   fixP->fx_addnumber = value;
10151 
10152   /* Same treatment for fixP->fx_offset.  */
10153   fixP->fx_offset &= 0xffffffff;
10154   fixP->fx_offset ^= 0x80000000;
10155   fixP->fx_offset -= 0x80000000;
10156 
10157   switch (fixP->fx_r_type)
10158     {
10159     case BFD_RELOC_NONE:
10160       /* This will need to go in the object file.  */
10161       fixP->fx_done = 0;
10162       break;
10163 
10164     case BFD_RELOC_ARM_IMMEDIATE:
10165       /* We claim that this fixup has been processed here,
10166 	 even if in fact we generate an error because we do
10167 	 not have a reloc for it, so tc_gen_reloc will reject it.  */
10168       fixP->fx_done = 1;
10169 
10170       if (fixP->fx_addsy
10171 	  && ! S_IS_DEFINED (fixP->fx_addsy))
10172 	{
10173 	  as_bad_where (fixP->fx_file, fixP->fx_line,
10174 			_("undefined symbol %s used as an immediate value"),
10175 			S_GET_NAME (fixP->fx_addsy));
10176 	  break;
10177 	}
10178 
10179       newimm = encode_arm_immediate (value);
10180       temp = md_chars_to_number (buf, INSN_SIZE);
10181 
10182       /* If the instruction will fail, see if we can fix things up by
10183 	 changing the opcode.  */
10184       if (newimm == (unsigned int) FAIL
10185 	  && (newimm = negate_data_op (&temp, value)) == (unsigned int) FAIL)
10186 	{
10187 	  as_bad_where (fixP->fx_file, fixP->fx_line,
10188 			_("invalid constant (%lx) after fixup"),
10189 			(unsigned long) value);
10190 	  break;
10191 	}
10192 
10193       newimm |= (temp & 0xfffff000);
10194       md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
10195       break;
10196 
10197     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
10198       {
10199 	unsigned int highpart = 0;
10200 	unsigned int newinsn  = 0xe1a00000; /* nop.  */
10201 
10202 	newimm = encode_arm_immediate (value);
10203 	temp = md_chars_to_number (buf, INSN_SIZE);
10204 
10205 	/* If the instruction will fail, see if we can fix things up by
10206 	   changing the opcode.	 */
10207 	if (newimm == (unsigned int) FAIL
10208 	    && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
10209 	  {
10210 	    /* No ?  OK - try using two ADD instructions to generate
10211 	       the value.  */
10212 	    newimm = validate_immediate_twopart (value, & highpart);
10213 
10214 	    /* Yes - then make sure that the second instruction is
10215 	       also an add.  */
10216 	    if (newimm != (unsigned int) FAIL)
10217 	      newinsn = temp;
10218 	    /* Still No ?  Try using a negated value.  */
10219 	    else if ((newimm = validate_immediate_twopart (- value, & highpart)) != (unsigned int) FAIL)
10220 	      temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
10221 	    /* Otherwise - give up.  */
10222 	    else
10223 	      {
10224 		as_bad_where (fixP->fx_file, fixP->fx_line,
10225 			      _("unable to compute ADRL instructions for PC offset of 0x%lx"),
10226 			      (long) value);
10227 		break;
10228 	      }
10229 
10230 	    /* Replace the first operand in the 2nd instruction (which
10231 	       is the PC) with the destination register.  We have
10232 	       already added in the PC in the first instruction and we
10233 	       do not want to do it again.  */
10234 	    newinsn &= ~ 0xf0000;
10235 	    newinsn |= ((newinsn & 0x0f000) << 4);
10236 	  }
10237 
10238 	newimm |= (temp & 0xfffff000);
10239 	md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
10240 
10241 	highpart |= (newinsn & 0xfffff000);
10242 	md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
10243       }
10244       break;
10245 
10246     case BFD_RELOC_ARM_OFFSET_IMM:
10247     case BFD_RELOC_ARM_LITERAL:
10248       sign = value >= 0;
10249 
10250       if (value < 0)
10251 	value = - value;
10252 
10253       if (validate_offset_imm (value, 0) == FAIL)
10254 	{
10255 	  if (fixP->fx_r_type == BFD_RELOC_ARM_LITERAL)
10256 	    as_bad_where (fixP->fx_file, fixP->fx_line,
10257 			  _("invalid literal constant: pool needs to be closer"));
10258 	  else
10259 	    as_bad_where (fixP->fx_file, fixP->fx_line,
10260 			  _("bad immediate value for offset (%ld)"),
10261 			  (long) value);
10262 	  break;
10263 	}
10264 
10265       newval = md_chars_to_number (buf, INSN_SIZE);
10266       newval &= 0xff7ff000;
10267       newval |= value | (sign ? INDEX_UP : 0);
10268       md_number_to_chars (buf, newval, INSN_SIZE);
10269       break;
10270 
10271     case BFD_RELOC_ARM_OFFSET_IMM8:
10272     case BFD_RELOC_ARM_HWLITERAL:
10273       sign = value >= 0;
10274 
10275       if (value < 0)
10276 	value = - value;
10277 
10278       if (validate_offset_imm (value, 1) == FAIL)
10279 	{
10280 	  if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
10281 	    as_bad_where (fixP->fx_file, fixP->fx_line,
10282 			  _("invalid literal constant: pool needs to be closer"));
10283 	  else
10284 	    as_bad (_("bad immediate value for half-word offset (%ld)"),
10285 		    (long) value);
10286 	  break;
10287 	}
10288 
10289       newval = md_chars_to_number (buf, INSN_SIZE);
10290       newval &= 0xff7ff0f0;
10291       newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
10292       md_number_to_chars (buf, newval, INSN_SIZE);
10293       break;
10294 
10295     case BFD_RELOC_ARM_T32_OFFSET_U8:
10296       if (value < 0 || value > 1020 || value % 4 != 0)
10297 	as_bad_where (fixP->fx_file, fixP->fx_line,
10298 		      _("bad immediate value for offset (%ld)"), (long) value);
10299       value /= 4;
10300 
10301       newval = md_chars_to_number (buf+2, THUMB_SIZE);
10302       newval |= value;
10303       md_number_to_chars (buf+2, newval, THUMB_SIZE);
10304       break;
10305 
10306     case BFD_RELOC_ARM_T32_OFFSET_IMM:
10307       /* This is a complicated relocation used for all varieties of Thumb32
10308 	 load/store instruction with immediate offset:
10309 
10310 	 1110 100P u1WL NNNN XXXX YYYY iiii iiii - +/-(U) pre/post(P) 8-bit,
10311 	                                           *4, optional writeback(W)
10312 						   (doubleword load/store)
10313 
10314 	 1111 100S uTTL 1111 XXXX iiii iiii iiii - +/-(U) 12-bit PC-rel
10315 	 1111 100S 0TTL NNNN XXXX 1Pu1 iiii iiii - +/-(U) pre/post(P) 8-bit
10316 	 1111 100S 0TTL NNNN XXXX 1110 iiii iiii - positive 8-bit (T instruction)
10317 	 1111 100S 1TTL NNNN XXXX iiii iiii iiii - positive 12-bit
10318 	 1111 100S 0TTL NNNN XXXX 1100 iiii iiii - negative 8-bit
10319 
10320 	 Uppercase letters indicate bits that are already encoded at
10321 	 this point.  Lowercase letters are our problem.  For the
10322 	 second block of instructions, the secondary opcode nybble
10323 	 (bits 8..11) is present, and bit 23 is zero, even if this is
10324 	 a PC-relative operation.  */
10325       newval = md_chars_to_number (buf, THUMB_SIZE);
10326       newval <<= 16;
10327       newval |= md_chars_to_number (buf+THUMB_SIZE, THUMB_SIZE);
10328 
10329       if ((newval & 0xf0000000) == 0xe0000000)
10330 	{
10331 	  /* Doubleword load/store: 8-bit offset, scaled by 4.  */
10332 	  if (value >= 0)
10333 	    newval |= (1 << 23);
10334 	  else
10335 	    value = -value;
10336 	  if (value % 4 != 0)
10337 	    {
10338 	      as_bad_where (fixP->fx_file, fixP->fx_line,
10339 			    _("offset not a multiple of 4"));
10340 	      break;
10341 	    }
10342 	  value /= 4;
10343 	  if (value >= 0xff)
10344 	    {
10345 	      as_bad_where (fixP->fx_file, fixP->fx_line,
10346 			    _("offset out of range"));
10347 	      break;
10348 	    }
10349 	  newval &= ~0xff;
10350 	}
10351       else if ((newval & 0x000f0000) == 0x000f0000)
10352 	{
10353 	  /* PC-relative, 12-bit offset.  */
10354 	  if (value >= 0)
10355 	    newval |= (1 << 23);
10356 	  else
10357 	    value = -value;
10358 	  if (value >= 0xfff)
10359 	    {
10360 	      as_bad_where (fixP->fx_file, fixP->fx_line,
10361 			    _("offset out of range"));
10362 	      break;
10363 	    }
10364 	  newval &= ~0xfff;
10365 	}
10366       else if ((newval & 0x00000100) == 0x00000100)
10367 	{
10368 	  /* Writeback: 8-bit, +/- offset.  */
10369 	  if (value >= 0)
10370 	    newval |= (1 << 9);
10371 	  else
10372 	    value = -value;
10373 	  if (value >= 0xff)
10374 	    {
10375 	      as_bad_where (fixP->fx_file, fixP->fx_line,
10376 			    _("offset out of range"));
10377 	      break;
10378 	    }
10379 	  newval &= ~0xff;
10380 	}
10381       else if ((newval & 0x00000f00) == 0x00000e00)
10382 	{
10383 	  /* T-instruction: positive 8-bit offset.  */
10384 	  if (value < 0 || value >= 0xff)
10385 	    {
10386 	      as_bad_where (fixP->fx_file, fixP->fx_line,
10387 			    _("offset out of range"));
10388 	      break;
10389 	    }
10390 	  newval &= ~0xff;
10391 	  newval |= value;
10392 	}
10393       else
10394 	{
10395 	  /* Positive 12-bit or negative 8-bit offset.  */
10396 	  int limit;
10397 	  if (value >= 0)
10398 	    {
10399 	      newval |= (1 << 23);
10400 	      limit = 0xfff;
10401 	    }
10402 	  else
10403 	    {
10404 	      value = -value;
10405 	      limit = 0xff;
10406 	    }
10407 	  if (value > limit)
10408 	    {
10409 	      as_bad_where (fixP->fx_file, fixP->fx_line,
10410 			    _("offset out of range"));
10411 	      break;
10412 	    }
10413 	  newval &= ~limit;
10414 	}
10415 
10416       newval |= value;
10417       md_number_to_chars (buf, (newval >> 16) & 0xffff, THUMB_SIZE);
10418       md_number_to_chars (buf + THUMB_SIZE, newval & 0xffff, THUMB_SIZE);
10419       break;
10420 
10421     case BFD_RELOC_ARM_SHIFT_IMM:
10422       newval = md_chars_to_number (buf, INSN_SIZE);
10423       if (((unsigned long) value) > 32
10424 	  || (value == 32
10425 	      && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
10426 	{
10427 	  as_bad_where (fixP->fx_file, fixP->fx_line,
10428 			_("shift expression is too large"));
10429 	  break;
10430 	}
10431 
10432       if (value == 0)
10433 	/* Shifts of zero must be done as lsl.	*/
10434 	newval &= ~0x60;
10435       else if (value == 32)
10436 	value = 0;
10437       newval &= 0xfffff07f;
10438       newval |= (value & 0x1f) << 7;
10439       md_number_to_chars (buf, newval, INSN_SIZE);
10440       break;
10441 
10442     case BFD_RELOC_ARM_T32_IMMEDIATE:
10443       /* We claim that this fixup has been processed here,
10444 	 even if in fact we generate an error because we do
10445 	 not have a reloc for it, so tc_gen_reloc will reject it.  */
10446       fixP->fx_done = 1;
10447 
10448       if (fixP->fx_addsy
10449 	  && ! S_IS_DEFINED (fixP->fx_addsy))
10450 	{
10451 	  as_bad_where (fixP->fx_file, fixP->fx_line,
10452 			_("undefined symbol %s used as an immediate value"),
10453 			S_GET_NAME (fixP->fx_addsy));
10454 	  break;
10455 	}
10456 
10457       newval = md_chars_to_number (buf, THUMB_SIZE);
10458       newval <<= 16;
10459       newval |= md_chars_to_number (buf+2, THUMB_SIZE);
10460 
10461       newimm = encode_thumb32_immediate (value);
10462 
10463       /* FUTURE: Implement analogue of negate_data_op for T32.  */
10464       if (newimm == (unsigned int)FAIL)
10465 	{
10466 	  as_bad_where (fixP->fx_file, fixP->fx_line,
10467 			_("invalid constant (%lx) after fixup"),
10468 			(unsigned long) value);
10469 	  break;
10470 	}
10471 
10472       newval |= (newimm & 0x800) << 15;
10473       newval |= (newimm & 0x700) << 4;
10474       newval |= (newimm & 0x0ff);
10475 
10476       md_number_to_chars (buf,   (valueT) ((newval >> 16) & 0xffff), THUMB_SIZE);
10477       md_number_to_chars (buf+2, (valueT) (newval & 0xffff), THUMB_SIZE);
10478       break;
10479 
10480     case BFD_RELOC_ARM_SMI:
10481       if (((unsigned long) value) > 0xffff)
10482 	as_bad_where (fixP->fx_file, fixP->fx_line,
10483 		      _("invalid smi expression"));
10484       newval = md_chars_to_number (buf, INSN_SIZE);
10485       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
10486       md_number_to_chars (buf, newval, INSN_SIZE);
10487       break;
10488 
10489     case BFD_RELOC_ARM_SWI:
10490       if (fixP->tc_fix_data != 0)
10491 	{
10492 	  if (((unsigned long) value) > 0xff)
10493 	    as_bad_where (fixP->fx_file, fixP->fx_line,
10494 			  _("invalid swi expression"));
10495 	  newval = md_chars_to_number (buf, THUMB_SIZE);
10496 	  newval |= value;
10497 	  md_number_to_chars (buf, newval, THUMB_SIZE);
10498 	}
10499       else
10500 	{
10501 	  if (((unsigned long) value) > 0x00ffffff)
10502 	    as_bad_where (fixP->fx_file, fixP->fx_line,
10503 			  _("invalid swi expression"));
10504 	  newval = md_chars_to_number (buf, INSN_SIZE);
10505 	  newval |= value;
10506 	  md_number_to_chars (buf, newval, INSN_SIZE);
10507 	}
10508       break;
10509 
10510     case BFD_RELOC_ARM_MULTI:
10511       if (((unsigned long) value) > 0xffff)
10512 	as_bad_where (fixP->fx_file, fixP->fx_line,
10513 		      _("invalid expression in load/store multiple"));
10514       newval = value | md_chars_to_number (buf, INSN_SIZE);
10515       md_number_to_chars (buf, newval, INSN_SIZE);
10516       break;
10517 
10518     case BFD_RELOC_ARM_PCREL_BRANCH:
10519 #ifdef OBJ_ELF
10520     case BFD_RELOC_ARM_PLT32:
10521 #endif
10522 
10523       /* We are going to store value (shifted right by two) in the
10524 	 instruction, in a 24 bit, signed field.  Bits 0 and 1 must be
10525 	 clear, and bits 26 through 32 either all clear or all set. */
10526       if (value & 0x00000003)
10527 	as_bad_where (fixP->fx_file, fixP->fx_line,
10528 		      _("misaligned branch destination"));
10529       if ((value & (offsetT)0xfe000000) != (offsetT)0
10530 	  && (value & (offsetT)0xfe000000) != (offsetT)0xfe000000)
10531 	as_bad_where (fixP->fx_file, fixP->fx_line,
10532 		      _("branch out of range"));
10533 
10534       if (fixP->fx_done || !seg->use_rela_p)
10535 	{
10536 	  newval = md_chars_to_number (buf, INSN_SIZE);
10537 	  newval |= (value >> 2) & 0x00ffffff;
10538 	  md_number_to_chars (buf, newval, INSN_SIZE);
10539 	}
10540       break;
10541 
10542     case BFD_RELOC_ARM_PCREL_BLX:
10543       /* BLX allows bit 1 to be set in the branch destination, since
10544 	 it targets a Thumb instruction which is only required to be
10545 	 aligned modulo 2.  Other constraints are as for B/BL.  */
10546       if (value & 0x00000001)
10547 	as_bad_where (fixP->fx_file, fixP->fx_line,
10548 		      _("misaligned BLX destination"));
10549       if ((value & (offsetT)0xfe000000) != (offsetT)0
10550 	  && (value & (offsetT)0xfe000000) != (offsetT)0xfe000000)
10551 	as_bad_where (fixP->fx_file, fixP->fx_line,
10552 		      _("branch out of range"));
10553 
10554       if (fixP->fx_done || !seg->use_rela_p)
10555 	{
10556 	  offsetT hbit;
10557 	  hbit   = (value >> 1) & 1;
10558 	  value  = (value >> 2) & 0x00ffffff;
10559 
10560 	  newval = md_chars_to_number (buf, INSN_SIZE);
10561 	  newval |= value | hbit << 24;
10562 	  md_number_to_chars (buf, newval, INSN_SIZE);
10563 	}
10564       break;
10565 
10566     case BFD_RELOC_THUMB_PCREL_BRANCH7: /* CZB */
10567       /* CZB can only branch forward.  */
10568       if (value & ~0x7e)
10569 	as_bad_where (fixP->fx_file, fixP->fx_line,
10570 		      _("branch out of range"));
10571 
10572       if (fixP->fx_done || !seg->use_rela_p)
10573 	{
10574 	  newval = md_chars_to_number (buf, THUMB_SIZE);
10575 	  newval |= ((value & 0x2e) << 2) | ((value & 0x40) << 3);
10576 	  md_number_to_chars (buf, newval, THUMB_SIZE);
10577 	}
10578       break;
10579 
10580     case BFD_RELOC_THUMB_PCREL_BRANCH9: /* Conditional branch.	*/
10581       if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
10582 	as_bad_where (fixP->fx_file, fixP->fx_line,
10583 		      _("branch out of range"));
10584 
10585       if (fixP->fx_done || !seg->use_rela_p)
10586 	{
10587 	  newval = md_chars_to_number (buf, THUMB_SIZE);
10588 	  newval |= (value & 0x1ff) >> 1;
10589 	  md_number_to_chars (buf, newval, THUMB_SIZE);
10590 	}
10591       break;
10592 
10593     case BFD_RELOC_THUMB_PCREL_BRANCH12: /* Unconditional branch.  */
10594       if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
10595 	as_bad_where (fixP->fx_file, fixP->fx_line,
10596 		      _("branch out of range"));
10597 
10598       if (fixP->fx_done || !seg->use_rela_p)
10599 	{
10600 	  newval = md_chars_to_number (buf, THUMB_SIZE);
10601 	  newval |= (value & 0xfff) >> 1;
10602 	  md_number_to_chars (buf, newval, THUMB_SIZE);
10603 	}
10604       break;
10605 
10606     case BFD_RELOC_THUMB_PCREL_BRANCH20:
10607       if ((value & ~0x1fffff) && ((value & ~0x1fffff) != ~0x1fffff))
10608 	as_bad_where (fixP->fx_file, fixP->fx_line,
10609 		      _("conditional branch out of range"));
10610 
10611       if (fixP->fx_done || !seg->use_rela_p)
10612 	{
10613 	  offsetT newval2;
10614 	  addressT S, J1, J2, lo, hi;
10615 
10616 	  S  = (value & 0x00100000) >> 20;
10617 	  J2 = (value & 0x00080000) >> 19;
10618 	  J1 = (value & 0x00040000) >> 18;
10619 	  hi = (value & 0x0003f000) >> 12;
10620 	  lo = (value & 0x00000ffe) >> 1;
10621 
10622 	  newval   = md_chars_to_number (buf, THUMB_SIZE);
10623 	  newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
10624 	  newval  |= (S << 10) | hi;
10625 	  newval2 |= (J1 << 13) | (J2 << 11) | lo;
10626 	  md_number_to_chars (buf, newval, THUMB_SIZE);
10627 	  md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
10628 	}
10629       break;
10630 
10631     case BFD_RELOC_THUMB_PCREL_BLX:
10632     case BFD_RELOC_THUMB_PCREL_BRANCH23:
10633       if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
10634 	as_bad_where (fixP->fx_file, fixP->fx_line,
10635 		      _("branch out of range"));
10636 
10637       if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
10638 	/* For a BLX instruction, make sure that the relocation is rounded up
10639 	   to a word boundary.  This follows the semantics of the instruction
10640 	   which specifies that bit 1 of the target address will come from bit
10641 	   1 of the base address.  */
10642 	value = (value + 1) & ~ 1;
10643 
10644       if (fixP->fx_done || !seg->use_rela_p)
10645 	{
10646 	  offsetT newval2;
10647 
10648 	  newval   = md_chars_to_number (buf, THUMB_SIZE);
10649 	  newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
10650 	  newval  |= (value & 0x7fffff) >> 12;
10651 	  newval2 |= (value & 0xfff) >> 1;
10652 	  md_number_to_chars (buf, newval, THUMB_SIZE);
10653 	  md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
10654 	}
10655       break;
10656 
10657     case BFD_RELOC_THUMB_PCREL_BRANCH25:
10658       if ((value & ~0x1ffffff) && ((value & ~0x1ffffff) != ~0x1ffffff))
10659 	as_bad_where (fixP->fx_file, fixP->fx_line,
10660 		      _("branch out of range"));
10661 
10662       if (fixP->fx_done || !seg->use_rela_p)
10663 	{
10664 	  offsetT newval2;
10665 	  addressT S, I1, I2, lo, hi;
10666 
10667 	  S  = (value & 0x01000000) >> 24;
10668 	  I1 = (value & 0x00800000) >> 23;
10669 	  I2 = (value & 0x00400000) >> 22;
10670 	  hi = (value & 0x003ff000) >> 12;
10671 	  lo = (value & 0x00000ffe) >> 1;
10672 
10673 	  I1 = !(I1 ^ S);
10674 	  I2 = !(I2 ^ S);
10675 
10676 	  newval   = md_chars_to_number (buf, THUMB_SIZE);
10677 	  newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
10678 	  newval  |= (S << 10) | hi;
10679 	  newval2 |= (I1 << 13) | (I2 << 11) | lo;
10680 	  md_number_to_chars (buf, newval, THUMB_SIZE);
10681 	  md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
10682 	}
10683       break;
10684 
10685     case BFD_RELOC_8:
10686       if (fixP->fx_done || !seg->use_rela_p)
10687 	md_number_to_chars (buf, value, 1);
10688       break;
10689 
10690     case BFD_RELOC_16:
10691       if (fixP->fx_done || !seg->use_rela_p)
10692 	md_number_to_chars (buf, value, 2);
10693       break;
10694 
10695 #ifdef OBJ_ELF
10696     case BFD_RELOC_ARM_TLS_GD32:
10697     case BFD_RELOC_ARM_TLS_LE32:
10698     case BFD_RELOC_ARM_TLS_IE32:
10699     case BFD_RELOC_ARM_TLS_LDM32:
10700     case BFD_RELOC_ARM_TLS_LDO32:
10701       S_SET_THREAD_LOCAL (fixP->fx_addsy);
10702       /* fall through */
10703 
10704     case BFD_RELOC_ARM_GOT32:
10705     case BFD_RELOC_ARM_GOTOFF:
10706     case BFD_RELOC_ARM_TARGET2:
10707       if (fixP->fx_done || !seg->use_rela_p)
10708 	md_number_to_chars (buf, 0, 4);
10709       break;
10710 #endif
10711 
10712     case BFD_RELOC_RVA:
10713     case BFD_RELOC_32:
10714     case BFD_RELOC_ARM_TARGET1:
10715     case BFD_RELOC_ARM_ROSEGREL32:
10716     case BFD_RELOC_ARM_SBREL32:
10717     case BFD_RELOC_32_PCREL:
10718       if (fixP->fx_done || !seg->use_rela_p)
10719 	md_number_to_chars (buf, value, 4);
10720       break;
10721 
10722 #ifdef OBJ_ELF
10723     case BFD_RELOC_ARM_PREL31:
10724       if (fixP->fx_done || !seg->use_rela_p)
10725 	{
10726 	  newval = md_chars_to_number (buf, 4) & 0x80000000;
10727 	  if ((value ^ (value >> 1)) & 0x40000000)
10728 	    {
10729 	      as_bad_where (fixP->fx_file, fixP->fx_line,
10730 			    _("rel31 relocation overflow"));
10731 	    }
10732 	  newval |= value & 0x7fffffff;
10733 	  md_number_to_chars (buf, newval, 4);
10734 	}
10735       break;
10736 #endif
10737 
10738     case BFD_RELOC_ARM_CP_OFF_IMM:
10739       if (value < -1023 || value > 1023 || (value & 3))
10740 	as_bad_where (fixP->fx_file, fixP->fx_line,
10741 		      _("co-processor offset out of range"));
10742     cp_off_common:
10743       sign = value >= 0;
10744       if (value < 0)
10745 	value = -value;
10746       newval = md_chars_to_number (buf, INSN_SIZE) & 0xff7fff00;
10747       newval |= (value >> 2) | (sign ? INDEX_UP : 0);
10748       if (value == 0)
10749 	newval &= ~WRITE_BACK;
10750       md_number_to_chars (buf, newval, INSN_SIZE);
10751       break;
10752 
10753     case BFD_RELOC_ARM_CP_OFF_IMM_S2:
10754       if (value < -255 || value > 255)
10755 	as_bad_where (fixP->fx_file, fixP->fx_line,
10756 		      _("co-processor offset out of range"));
10757       goto cp_off_common;
10758 
10759     case BFD_RELOC_ARM_THUMB_OFFSET:
10760       newval = md_chars_to_number (buf, THUMB_SIZE);
10761       /* Exactly what ranges, and where the offset is inserted depends
10762 	 on the type of instruction, we can establish this from the
10763 	 top 4 bits.  */
10764       switch (newval >> 12)
10765 	{
10766 	case 4: /* PC load.  */
10767 	  /* Thumb PC loads are somewhat odd, bit 1 of the PC is
10768 	     forced to zero for these loads; md_pcrel_from has already
10769 	     compensated for this.  */
10770 	  if (value & 3)
10771 	    as_bad_where (fixP->fx_file, fixP->fx_line,
10772 			  _("invalid offset, target not word aligned (0x%08lX)"),
10773 			  (((unsigned int) fixP->fx_frag->fr_address
10774 			    + (unsigned int) fixP->fx_where) & ~3) + value);
10775 
10776 	  if (value & ~0x3fc)
10777 	    as_bad_where (fixP->fx_file, fixP->fx_line,
10778 			  _("invalid offset, value too big (0x%08lX)"),
10779 			  (long) value);
10780 
10781 	  newval |= value >> 2;
10782 	  break;
10783 
10784 	case 9: /* SP load/store.  */
10785 	  if (value & ~0x3fc)
10786 	    as_bad_where (fixP->fx_file, fixP->fx_line,
10787 			  _("invalid offset, value too big (0x%08lX)"),
10788 			  (long) value);
10789 	  newval |= value >> 2;
10790 	  break;
10791 
10792 	case 6: /* Word load/store.  */
10793 	  if (value & ~0x7c)
10794 	    as_bad_where (fixP->fx_file, fixP->fx_line,
10795 			  _("invalid offset, value too big (0x%08lX)"),
10796 			  (long) value);
10797 	  newval |= value << 4; /* 6 - 2.  */
10798 	  break;
10799 
10800 	case 7: /* Byte load/store.  */
10801 	  if (value & ~0x1f)
10802 	    as_bad_where (fixP->fx_file, fixP->fx_line,
10803 			  _("invalid offset, value too big (0x%08lX)"),
10804 			  (long) value);
10805 	  newval |= value << 6;
10806 	  break;
10807 
10808 	case 8: /* Halfword load/store.	 */
10809 	  if (value & ~0x3e)
10810 	    as_bad_where (fixP->fx_file, fixP->fx_line,
10811 			  _("invalid offset, value too big (0x%08lX)"),
10812 			  (long) value);
10813 	  newval |= value << 5; /* 6 - 1.  */
10814 	  break;
10815 
10816 	default:
10817 	  as_bad_where (fixP->fx_file, fixP->fx_line,
10818 			"Unable to process relocation for thumb opcode: %lx",
10819 			(unsigned long) newval);
10820 	  break;
10821 	}
10822       md_number_to_chars (buf, newval, THUMB_SIZE);
10823       break;
10824 
10825     case BFD_RELOC_ARM_THUMB_ADD:
10826       /* This is a complicated relocation, since we use it for all of
10827 	 the following immediate relocations:
10828 
10829 	    3bit ADD/SUB
10830 	    8bit ADD/SUB
10831 	    9bit ADD/SUB SP word-aligned
10832 	   10bit ADD PC/SP word-aligned
10833 
10834 	 The type of instruction being processed is encoded in the
10835 	 instruction field:
10836 
10837 	   0x8000  SUB
10838 	   0x00F0  Rd
10839 	   0x000F  Rs
10840       */
10841       newval = md_chars_to_number (buf, THUMB_SIZE);
10842       {
10843 	int rd = (newval >> 4) & 0xf;
10844 	int rs = newval & 0xf;
10845 	int subtract = !!(newval & 0x8000);
10846 
10847 	/* Check for HI regs, only very restricted cases allowed:
10848 	   Adjusting SP, and using PC or SP to get an address.	*/
10849 	if ((rd > 7 && (rd != REG_SP || rs != REG_SP))
10850 	    || (rs > 7 && rs != REG_SP && rs != REG_PC))
10851 	  as_bad_where (fixP->fx_file, fixP->fx_line,
10852 			_("invalid Hi register with immediate"));
10853 
10854 	/* If value is negative, choose the opposite instruction.  */
10855 	if (value < 0)
10856 	  {
10857 	    value = -value;
10858 	    subtract = !subtract;
10859 	    if (value < 0)
10860 	      as_bad_where (fixP->fx_file, fixP->fx_line,
10861 			    _("immediate value out of range"));
10862 	  }
10863 
10864 	if (rd == REG_SP)
10865 	  {
10866 	    if (value & ~0x1fc)
10867 	      as_bad_where (fixP->fx_file, fixP->fx_line,
10868 			    _("invalid immediate for stack address calculation"));
10869 	    newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
10870 	    newval |= value >> 2;
10871 	  }
10872 	else if (rs == REG_PC || rs == REG_SP)
10873 	  {
10874 	    if (subtract || value & ~0x3fc)
10875 	      as_bad_where (fixP->fx_file, fixP->fx_line,
10876 			    _("invalid immediate for address calculation (value = 0x%08lX)"),
10877 			    (unsigned long) value);
10878 	    newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
10879 	    newval |= rd << 8;
10880 	    newval |= value >> 2;
10881 	  }
10882 	else if (rs == rd)
10883 	  {
10884 	    if (value & ~0xff)
10885 	      as_bad_where (fixP->fx_file, fixP->fx_line,
10886 			    _("immediate value out of range"));
10887 	    newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
10888 	    newval |= (rd << 8) | value;
10889 	  }
10890 	else
10891 	  {
10892 	    if (value & ~0x7)
10893 	      as_bad_where (fixP->fx_file, fixP->fx_line,
10894 			    _("immediate value out of range"));
10895 	    newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
10896 	    newval |= rd | (rs << 3) | (value << 6);
10897 	  }
10898       }
10899       md_number_to_chars (buf, newval, THUMB_SIZE);
10900       break;
10901 
10902     case BFD_RELOC_ARM_THUMB_IMM:
10903       newval = md_chars_to_number (buf, THUMB_SIZE);
10904       if (value < 0 || value > 255)
10905 	as_bad_where (fixP->fx_file, fixP->fx_line,
10906 		      _("invalid immediate: %ld is too large"),
10907 		      (long) value);
10908       newval |= value;
10909       md_number_to_chars (buf, newval, THUMB_SIZE);
10910       break;
10911 
10912     case BFD_RELOC_ARM_THUMB_SHIFT:
10913       /* 5bit shift value (0..32).  LSL cannot take 32.	 */
10914       newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf83f;
10915       temp = newval & 0xf800;
10916       if (value < 0 || value > 32 || (value == 32 && temp == T_OPCODE_LSL_I))
10917 	as_bad_where (fixP->fx_file, fixP->fx_line,
10918 		      _("invalid shift value: %ld"), (long) value);
10919       /* Shifts of zero must be encoded as LSL.	 */
10920       if (value == 0)
10921 	newval = (newval & 0x003f) | T_OPCODE_LSL_I;
10922       /* Shifts of 32 are encoded as zero.  */
10923       else if (value == 32)
10924 	value = 0;
10925       newval |= value << 6;
10926       md_number_to_chars (buf, newval, THUMB_SIZE);
10927       break;
10928 
10929     case BFD_RELOC_VTABLE_INHERIT:
10930     case BFD_RELOC_VTABLE_ENTRY:
10931       fixP->fx_done = 0;
10932       return;
10933 
10934     case BFD_RELOC_UNUSED:
10935     default:
10936       as_bad_where (fixP->fx_file, fixP->fx_line,
10937 		    _("bad relocation fixup type (%d)"), fixP->fx_r_type);
10938     }
10939 }
10940 
10941 /* Translate internal representation of relocation info to BFD target
10942    format.  */
10943 
10944 arelent *
tc_gen_reloc(asection * section ATTRIBUTE_UNUSED,fixS * fixp)10945 tc_gen_reloc (asection * section ATTRIBUTE_UNUSED,
10946 	      fixS *	 fixp)
10947 {
10948   arelent * reloc;
10949   bfd_reloc_code_real_type code;
10950 
10951   reloc = xmalloc (sizeof (arelent));
10952 
10953   reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
10954   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
10955   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
10956 
10957   if (fixp->fx_pcrel)
10958     fixp->fx_offset = reloc->address;
10959   reloc->addend = fixp->fx_offset;
10960 
10961   switch (fixp->fx_r_type)
10962     {
10963     case BFD_RELOC_8:
10964       if (fixp->fx_pcrel)
10965 	{
10966 	  code = BFD_RELOC_8_PCREL;
10967 	  break;
10968 	}
10969 
10970     case BFD_RELOC_16:
10971       if (fixp->fx_pcrel)
10972 	{
10973 	  code = BFD_RELOC_16_PCREL;
10974 	  break;
10975 	}
10976 
10977     case BFD_RELOC_32:
10978       if (fixp->fx_pcrel)
10979 	{
10980 	  code = BFD_RELOC_32_PCREL;
10981 	  break;
10982 	}
10983 
10984     case BFD_RELOC_NONE:
10985     case BFD_RELOC_ARM_PCREL_BRANCH:
10986     case BFD_RELOC_ARM_PCREL_BLX:
10987     case BFD_RELOC_RVA:
10988     case BFD_RELOC_THUMB_PCREL_BRANCH7:
10989     case BFD_RELOC_THUMB_PCREL_BRANCH9:
10990     case BFD_RELOC_THUMB_PCREL_BRANCH12:
10991     case BFD_RELOC_THUMB_PCREL_BRANCH20:
10992     case BFD_RELOC_THUMB_PCREL_BRANCH23:
10993     case BFD_RELOC_THUMB_PCREL_BRANCH25:
10994     case BFD_RELOC_THUMB_PCREL_BLX:
10995     case BFD_RELOC_VTABLE_ENTRY:
10996     case BFD_RELOC_VTABLE_INHERIT:
10997       code = fixp->fx_r_type;
10998       break;
10999 
11000     case BFD_RELOC_ARM_LITERAL:
11001     case BFD_RELOC_ARM_HWLITERAL:
11002       /* If this is called then the a literal has
11003 	 been referenced across a section boundary.  */
11004       as_bad_where (fixp->fx_file, fixp->fx_line,
11005 		    _("literal referenced across section boundary"));
11006       return NULL;
11007 
11008 #ifdef OBJ_ELF
11009     case BFD_RELOC_ARM_GOT32:
11010     case BFD_RELOC_ARM_GOTOFF:
11011     case BFD_RELOC_ARM_PLT32:
11012     case BFD_RELOC_ARM_TARGET1:
11013     case BFD_RELOC_ARM_ROSEGREL32:
11014     case BFD_RELOC_ARM_SBREL32:
11015     case BFD_RELOC_ARM_PREL31:
11016     case BFD_RELOC_ARM_TARGET2:
11017     case BFD_RELOC_ARM_TLS_LE32:
11018     case BFD_RELOC_ARM_TLS_LDO32:
11019       code = fixp->fx_r_type;
11020       break;
11021 
11022     case BFD_RELOC_ARM_TLS_GD32:
11023     case BFD_RELOC_ARM_TLS_IE32:
11024     case BFD_RELOC_ARM_TLS_LDM32:
11025       /* BFD will include the symbol's address in the addend.
11026 	 But we don't want that, so subtract it out again here.  */
11027       if (!S_IS_COMMON (fixp->fx_addsy))
11028 	reloc->addend -= (*reloc->sym_ptr_ptr)->value;
11029       code = fixp->fx_r_type;
11030       break;
11031 #endif
11032 
11033     case BFD_RELOC_ARM_IMMEDIATE:
11034       as_bad_where (fixp->fx_file, fixp->fx_line,
11035 		    _("internal relocation (type: IMMEDIATE) not fixed up"));
11036       return NULL;
11037 
11038     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
11039       as_bad_where (fixp->fx_file, fixp->fx_line,
11040 		    _("ADRL used for a symbol not defined in the same file"));
11041       return NULL;
11042 
11043     case BFD_RELOC_ARM_OFFSET_IMM:
11044       if (fixp->fx_addsy != NULL
11045 	  && !S_IS_DEFINED (fixp->fx_addsy)
11046 	  && S_IS_LOCAL (fixp->fx_addsy))
11047 	{
11048 	  as_bad_where (fixp->fx_file, fixp->fx_line,
11049 			_("undefined local label `%s'"),
11050 			S_GET_NAME (fixp->fx_addsy));
11051 	  return NULL;
11052 	}
11053 
11054       as_bad_where (fixp->fx_file, fixp->fx_line,
11055 		    _("internal_relocation (type: OFFSET_IMM) not fixed up"));
11056       return NULL;
11057 
11058     default:
11059       {
11060 	char * type;
11061 
11062 	switch (fixp->fx_r_type)
11063 	  {
11064 	  case BFD_RELOC_NONE:		   type = "NONE";	  break;
11065 	  case BFD_RELOC_ARM_OFFSET_IMM8:  type = "OFFSET_IMM8";  break;
11066 	  case BFD_RELOC_ARM_SHIFT_IMM:	   type = "SHIFT_IMM";	  break;
11067 	  case BFD_RELOC_ARM_SMI:	   type = "SMI";	  break;
11068 	  case BFD_RELOC_ARM_SWI:	   type = "SWI";	  break;
11069 	  case BFD_RELOC_ARM_MULTI:	   type = "MULTI";	  break;
11070 	  case BFD_RELOC_ARM_CP_OFF_IMM:   type = "CP_OFF_IMM";	  break;
11071 	  case BFD_RELOC_ARM_THUMB_ADD:	   type = "THUMB_ADD";	  break;
11072 	  case BFD_RELOC_ARM_THUMB_SHIFT:  type = "THUMB_SHIFT";  break;
11073 	  case BFD_RELOC_ARM_THUMB_IMM:	   type = "THUMB_IMM";	  break;
11074 	  case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
11075 	  default:			   type = _("<unknown>"); break;
11076 	  }
11077 	as_bad_where (fixp->fx_file, fixp->fx_line,
11078 		      _("cannot represent %s relocation in this object file format"),
11079 		      type);
11080 	return NULL;
11081       }
11082     }
11083 
11084 #ifdef OBJ_ELF
11085   if ((code == BFD_RELOC_32_PCREL || code == BFD_RELOC_32)
11086       && GOT_symbol
11087       && fixp->fx_addsy == GOT_symbol)
11088     {
11089       code = BFD_RELOC_ARM_GOTPC;
11090       reloc->addend = fixp->fx_offset = reloc->address;
11091     }
11092 #endif
11093 
11094   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
11095 
11096   if (reloc->howto == NULL)
11097     {
11098       as_bad_where (fixp->fx_file, fixp->fx_line,
11099 		    _("cannot represent %s relocation in this object file format"),
11100 		    bfd_get_reloc_code_name (code));
11101       return NULL;
11102     }
11103 
11104   /* HACK: Since arm ELF uses Rel instead of Rela, encode the
11105      vtable entry to be used in the relocation's section offset.  */
11106   if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
11107     reloc->address = fixp->fx_offset;
11108 
11109   return reloc;
11110 }
11111 
11112 /* This fix_new is called by cons via TC_CONS_FIX_NEW.	*/
11113 
11114 void
cons_fix_new_arm(fragS * frag,int where,int size,expressionS * exp)11115 cons_fix_new_arm (fragS *	frag,
11116 		  int		where,
11117 		  int		size,
11118 		  expressionS * exp)
11119 {
11120   bfd_reloc_code_real_type type;
11121   int pcrel = 0;
11122 
11123   /* Pick a reloc.
11124      FIXME: @@ Should look at CPU word size.  */
11125   switch (size)
11126     {
11127     case 1:
11128       type = BFD_RELOC_8;
11129       break;
11130     case 2:
11131       type = BFD_RELOC_16;
11132       break;
11133     case 4:
11134     default:
11135       type = BFD_RELOC_32;
11136       break;
11137     case 8:
11138       type = BFD_RELOC_64;
11139       break;
11140     }
11141 
11142   fix_new_exp (frag, where, (int) size, exp, pcrel, type);
11143 }
11144 
11145 #if defined OBJ_COFF || defined OBJ_ELF
11146 void
arm_validate_fix(fixS * fixP)11147 arm_validate_fix (fixS * fixP)
11148 {
11149   /* If the destination of the branch is a defined symbol which does not have
11150      the THUMB_FUNC attribute, then we must be calling a function which has
11151      the (interfacearm) attribute.  We look for the Thumb entry point to that
11152      function and change the branch to refer to that function instead.	*/
11153   if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
11154       && fixP->fx_addsy != NULL
11155       && S_IS_DEFINED (fixP->fx_addsy)
11156       && ! THUMB_IS_FUNC (fixP->fx_addsy))
11157     {
11158       fixP->fx_addsy = find_real_start (fixP->fx_addsy);
11159     }
11160 }
11161 #endif
11162 
11163 int
arm_force_relocation(struct fix * fixp)11164 arm_force_relocation (struct fix * fixp)
11165 {
11166 #if defined (OBJ_COFF) && defined (TE_PE)
11167   if (fixp->fx_r_type == BFD_RELOC_RVA)
11168     return 1;
11169 #endif
11170 
11171   /* Resolve these relocations even if the symbol is extern or weak.  */
11172   if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
11173       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM
11174       || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE)
11175     return 0;
11176 
11177   return generic_force_reloc (fixp);
11178 }
11179 
11180 #ifdef OBJ_COFF
11181 /* This is a little hack to help the gas/arm/adrl.s test.  It prevents
11182    local labels from being added to the output symbol table when they
11183    are used with the ADRL pseudo op.  The ADRL relocation should always
11184    be resolved before the binbary is emitted, so it is safe to say that
11185    it is adjustable.  */
11186 
11187 bfd_boolean
arm_fix_adjustable(fixS * fixP)11188 arm_fix_adjustable (fixS * fixP)
11189 {
11190   if (fixP->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE)
11191     return 1;
11192   return 0;
11193 }
11194 #endif
11195 
11196 #ifdef OBJ_ELF
11197 /* Relocations against Thumb function names must be left unadjusted,
11198    so that the linker can use this information to correctly set the
11199    bottom bit of their addresses.  The MIPS version of this function
11200    also prevents relocations that are mips-16 specific, but I do not
11201    know why it does this.
11202 
11203    FIXME:
11204    There is one other problem that ought to be addressed here, but
11205    which currently is not:  Taking the address of a label (rather
11206    than a function) and then later jumping to that address.  Such
11207    addresses also ought to have their bottom bit set (assuming that
11208    they reside in Thumb code), but at the moment they will not.	 */
11209 
11210 bfd_boolean
arm_fix_adjustable(fixS * fixP)11211 arm_fix_adjustable (fixS * fixP)
11212 {
11213   if (fixP->fx_addsy == NULL)
11214     return 1;
11215 
11216   if (THUMB_IS_FUNC (fixP->fx_addsy)
11217       && fixP->fx_subsy == NULL)
11218     return 0;
11219 
11220   /* We need the symbol name for the VTABLE entries.  */
11221   if (	 fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
11222       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
11223     return 0;
11224 
11225   /* Don't allow symbols to be discarded on GOT related relocs.	 */
11226   if (fixP->fx_r_type == BFD_RELOC_ARM_PLT32
11227       || fixP->fx_r_type == BFD_RELOC_ARM_GOT32
11228       || fixP->fx_r_type == BFD_RELOC_ARM_GOTOFF
11229       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32
11230       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LE32
11231       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32
11232       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32
11233       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDO32
11234       || fixP->fx_r_type == BFD_RELOC_ARM_TARGET2)
11235     return 0;
11236 
11237   return 1;
11238 }
11239 
11240 const char *
elf32_arm_target_format(void)11241 elf32_arm_target_format (void)
11242 {
11243 #ifdef TE_SYMBIAN
11244   return (target_big_endian
11245 	  ? "elf32-bigarm-symbian"
11246 	  : "elf32-littlearm-symbian");
11247 #elif defined (TE_VXWORKS)
11248   return (target_big_endian
11249 	  ? "elf32-bigarm-vxworks"
11250 	  : "elf32-littlearm-vxworks");
11251 #else
11252   if (target_big_endian)
11253     return "elf32-bigarm";
11254   else
11255     return "elf32-littlearm";
11256 #endif
11257 }
11258 
11259 void
armelf_frob_symbol(symbolS * symp,int * puntp)11260 armelf_frob_symbol (symbolS * symp,
11261 		    int *     puntp)
11262 {
11263   elf_frob_symbol (symp, puntp);
11264 }
11265 #endif
11266 
11267 /* MD interface: Finalization.	*/
11268 
11269 /* A good place to do this, although this was probably not intended
11270    for this kind of use.  We need to dump the literal pool before
11271    references are made to a null symbol pointer.  */
11272 
11273 void
arm_cleanup(void)11274 arm_cleanup (void)
11275 {
11276   literal_pool * pool;
11277 
11278   for (pool = list_of_pools; pool; pool = pool->next)
11279     {
11280       /* Put it at the end of the relevent section.  */
11281       subseg_set (pool->section, pool->sub_section);
11282 #ifdef OBJ_ELF
11283       arm_elf_change_section ();
11284 #endif
11285       s_ltorg (0);
11286     }
11287 }
11288 
11289 /* Adjust the symbol table.  This marks Thumb symbols as distinct from
11290    ARM ones.  */
11291 
11292 void
arm_adjust_symtab(void)11293 arm_adjust_symtab (void)
11294 {
11295 #ifdef OBJ_COFF
11296   symbolS * sym;
11297 
11298   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
11299     {
11300       if (ARM_IS_THUMB (sym))
11301 	{
11302 	  if (THUMB_IS_FUNC (sym))
11303 	    {
11304 	      /* Mark the symbol as a Thumb function.  */
11305 	      if (   S_GET_STORAGE_CLASS (sym) == C_STAT
11306 		  || S_GET_STORAGE_CLASS (sym) == C_LABEL)  /* This can happen!	 */
11307 		S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
11308 
11309 	      else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
11310 		S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
11311 	      else
11312 		as_bad (_("%s: unexpected function type: %d"),
11313 			S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
11314 	    }
11315 	  else switch (S_GET_STORAGE_CLASS (sym))
11316 	    {
11317 	    case C_EXT:
11318 	      S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
11319 	      break;
11320 	    case C_STAT:
11321 	      S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
11322 	      break;
11323 	    case C_LABEL:
11324 	      S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
11325 	      break;
11326 	    default:
11327 	      /* Do nothing.  */
11328 	      break;
11329 	    }
11330 	}
11331 
11332       if (ARM_IS_INTERWORK (sym))
11333 	coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
11334     }
11335 #endif
11336 #ifdef OBJ_ELF
11337   symbolS * sym;
11338   char	    bind;
11339 
11340   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
11341     {
11342       if (ARM_IS_THUMB (sym))
11343 	{
11344 	  elf_symbol_type * elf_sym;
11345 
11346 	  elf_sym = elf_symbol (symbol_get_bfdsym (sym));
11347 	  bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
11348 
11349 	  if (! bfd_is_arm_mapping_symbol_name (elf_sym->symbol.name))
11350 	    {
11351 	      /* If it's a .thumb_func, declare it as so,
11352 		 otherwise tag label as .code 16.  */
11353 	      if (THUMB_IS_FUNC (sym))
11354 		elf_sym->internal_elf_sym.st_info =
11355 		  ELF_ST_INFO (bind, STT_ARM_TFUNC);
11356 	      else
11357 		elf_sym->internal_elf_sym.st_info =
11358 		  ELF_ST_INFO (bind, STT_ARM_16BIT);
11359 	    }
11360 	}
11361     }
11362 #endif
11363 }
11364 
11365 /* MD interface: Initialization.  */
11366 
11367 static void
set_constant_flonums(void)11368 set_constant_flonums (void)
11369 {
11370   int i;
11371 
11372   for (i = 0; i < NUM_FLOAT_VALS; i++)
11373     if (atof_ieee ((char *) fp_const[i], 'x', fp_values[i]) == NULL)
11374       abort ();
11375 }
11376 
11377 void
md_begin(void)11378 md_begin (void)
11379 {
11380   unsigned mach;
11381   unsigned int i;
11382 
11383   if (	 (arm_ops_hsh = hash_new ()) == NULL
11384       || (arm_cond_hsh = hash_new ()) == NULL
11385       || (arm_shift_hsh = hash_new ()) == NULL
11386       || (arm_psr_hsh = hash_new ()) == NULL
11387       || (arm_reg_hsh = hash_new ()) == NULL
11388       || (arm_reloc_hsh = hash_new ()) == NULL)
11389     as_fatal (_("virtual memory exhausted"));
11390 
11391   for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
11392     hash_insert (arm_ops_hsh, insns[i].template, (PTR) (insns + i));
11393   for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
11394     hash_insert (arm_cond_hsh, conds[i].template, (PTR) (conds + i));
11395   for (i = 0; i < sizeof (shift_names) / sizeof (struct asm_shift_name); i++)
11396     hash_insert (arm_shift_hsh, shift_names[i].name, (PTR) (shift_names + i));
11397   for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
11398     hash_insert (arm_psr_hsh, psrs[i].template, (PTR) (psrs + i));
11399   for (i = 0; i < sizeof (reg_names) / sizeof (struct reg_entry); i++)
11400     hash_insert (arm_reg_hsh, reg_names[i].name, (PTR) (reg_names + i));
11401 #ifdef OBJ_ELF
11402   for (i = 0; i < sizeof (reloc_names) / sizeof (struct reloc_entry); i++)
11403     hash_insert (arm_reloc_hsh, reloc_names[i].name, (PTR) (reloc_names + i));
11404 #endif
11405 
11406   set_constant_flonums ();
11407 
11408   /* Set the cpu variant based on the command-line options.  We prefer
11409      -mcpu= over -march= if both are set (as for GCC); and we prefer
11410      -mfpu= over any other way of setting the floating point unit.
11411      Use of legacy options with new options are faulted.  */
11412   if (legacy_cpu != -1)
11413     {
11414       if (mcpu_cpu_opt != -1 || march_cpu_opt != -1)
11415 	as_bad (_("use of old and new-style options to set CPU type"));
11416 
11417       mcpu_cpu_opt = legacy_cpu;
11418     }
11419   else if (mcpu_cpu_opt == -1)
11420     mcpu_cpu_opt = march_cpu_opt;
11421 
11422   if (legacy_fpu != -1)
11423     {
11424       if (mfpu_opt != -1)
11425 	as_bad (_("use of old and new-style options to set FPU type"));
11426 
11427       mfpu_opt = legacy_fpu;
11428     }
11429   else if (mfpu_opt == -1)
11430     {
11431 #if !(defined (TE_LINUX) || defined (TE_NetBSD) || defined (TE_VXWORKS))
11432       /* Some environments specify a default FPU.  If they don't, infer it
11433 	 from the processor.  */
11434       if (mcpu_fpu_opt != -1)
11435 	mfpu_opt = mcpu_fpu_opt;
11436       else
11437 	mfpu_opt = march_fpu_opt;
11438 #else
11439       mfpu_opt = FPU_DEFAULT;
11440 #endif
11441     }
11442 
11443   if (mfpu_opt == -1)
11444     {
11445       if (mcpu_cpu_opt == -1)
11446 	mfpu_opt = FPU_DEFAULT;
11447       else if (mcpu_cpu_opt & ARM_EXT_V5)
11448 	mfpu_opt = FPU_ARCH_VFP_V2;
11449       else
11450 	mfpu_opt = FPU_ARCH_FPA;
11451     }
11452 
11453   if (mcpu_cpu_opt == -1)
11454     mcpu_cpu_opt = CPU_DEFAULT;
11455 
11456   cpu_variant = mcpu_cpu_opt | mfpu_opt;
11457 
11458 #if defined OBJ_COFF || defined OBJ_ELF
11459   {
11460     unsigned int flags = 0;
11461 
11462 #if defined OBJ_ELF
11463     flags = meabi_flags;
11464 
11465     switch (meabi_flags)
11466       {
11467       case EF_ARM_EABI_UNKNOWN:
11468 #endif
11469 	/* Set the flags in the private structure.  */
11470 	if (uses_apcs_26)      flags |= F_APCS26;
11471 	if (support_interwork) flags |= F_INTERWORK;
11472 	if (uses_apcs_float)   flags |= F_APCS_FLOAT;
11473 	if (pic_code)	       flags |= F_PIC;
11474 	if ((cpu_variant & FPU_ANY) == FPU_NONE
11475 	     || (cpu_variant & FPU_ANY) == FPU_ARCH_VFP) /* VFP layout only.  */
11476 	  flags |= F_SOFT_FLOAT;
11477 
11478 	switch (mfloat_abi_opt)
11479 	  {
11480 	  case ARM_FLOAT_ABI_SOFT:
11481 	  case ARM_FLOAT_ABI_SOFTFP:
11482 	    flags |= F_SOFT_FLOAT;
11483 	    break;
11484 
11485 	  case ARM_FLOAT_ABI_HARD:
11486 	    if (flags & F_SOFT_FLOAT)
11487 	      as_bad (_("hard-float conflicts with specified fpu"));
11488 	    break;
11489 	  }
11490 
11491 	/* Using VFP conventions (even if soft-float).	*/
11492 	if (cpu_variant & FPU_VFP_EXT_NONE)
11493 	  flags |= F_VFP_FLOAT;
11494 
11495 #if defined OBJ_ELF
11496 	if (cpu_variant & FPU_ARCH_MAVERICK)
11497 	    flags |= EF_ARM_MAVERICK_FLOAT;
11498 	break;
11499 
11500       case EF_ARM_EABI_VER4:
11501 	/* No additional flags to set.	*/
11502 	break;
11503 
11504       default:
11505 	abort ();
11506       }
11507 #endif
11508     bfd_set_private_flags (stdoutput, flags);
11509 
11510     /* We have run out flags in the COFF header to encode the
11511        status of ATPCS support, so instead we create a dummy,
11512        empty, debug section called .arm.atpcs.	*/
11513     if (atpcs)
11514       {
11515 	asection * sec;
11516 
11517 	sec = bfd_make_section (stdoutput, ".arm.atpcs");
11518 
11519 	if (sec != NULL)
11520 	  {
11521 	    bfd_set_section_flags
11522 	      (stdoutput, sec, SEC_READONLY | SEC_DEBUGGING /* | SEC_HAS_CONTENTS */);
11523 	    bfd_set_section_size (stdoutput, sec, 0);
11524 	    bfd_set_section_contents (stdoutput, sec, NULL, 0, 0);
11525 	  }
11526       }
11527   }
11528 #endif
11529 
11530   /* Record the CPU type as well.  */
11531   switch (cpu_variant & ARM_CPU_MASK)
11532     {
11533     case ARM_2:
11534       mach = bfd_mach_arm_2;
11535       break;
11536 
11537     case ARM_3:			/* Also ARM_250.  */
11538       mach = bfd_mach_arm_2a;
11539       break;
11540 
11541     case ARM_6:			/* Also ARM_7.	*/
11542       mach = bfd_mach_arm_3;
11543       break;
11544 
11545     default:
11546       mach = bfd_mach_arm_unknown;
11547       break;
11548     }
11549 
11550   /* Catch special cases.  */
11551   if (cpu_variant & ARM_CEXT_IWMMXT)
11552     mach = bfd_mach_arm_iWMMXt;
11553   else if (cpu_variant & ARM_CEXT_XSCALE)
11554     mach = bfd_mach_arm_XScale;
11555   else if (cpu_variant & ARM_CEXT_MAVERICK)
11556     mach = bfd_mach_arm_ep9312;
11557   else if (cpu_variant & ARM_EXT_V5E)
11558     mach = bfd_mach_arm_5TE;
11559   else if (cpu_variant & ARM_EXT_V5)
11560     {
11561       if (cpu_variant & ARM_EXT_V4T)
11562 	mach = bfd_mach_arm_5T;
11563       else
11564 	mach = bfd_mach_arm_5;
11565     }
11566   else if (cpu_variant & ARM_EXT_V4)
11567     {
11568       if (cpu_variant & ARM_EXT_V4T)
11569 	mach = bfd_mach_arm_4T;
11570       else
11571 	mach = bfd_mach_arm_4;
11572     }
11573   else if (cpu_variant & ARM_EXT_V3M)
11574     mach = bfd_mach_arm_3M;
11575 
11576   bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
11577 }
11578 
11579 /* Command line processing.  */
11580 
11581 /* md_parse_option
11582       Invocation line includes a switch not recognized by the base assembler.
11583       See if it's a processor-specific option.
11584 
11585       This routine is somewhat complicated by the need for backwards
11586       compatibility (since older releases of gcc can't be changed).
11587       The new options try to make the interface as compatible as
11588       possible with GCC.
11589 
11590       New options (supported) are:
11591 
11592 	      -mcpu=<cpu name>		 Assemble for selected processor
11593 	      -march=<architecture name> Assemble for selected architecture
11594 	      -mfpu=<fpu architecture>	 Assemble for selected FPU.
11595 	      -EB/-mbig-endian		 Big-endian
11596 	      -EL/-mlittle-endian	 Little-endian
11597 	      -k			 Generate PIC code
11598 	      -mthumb			 Start in Thumb mode
11599 	      -mthumb-interwork		 Code supports ARM/Thumb interworking
11600 
11601       For now we will also provide support for:
11602 
11603 	      -mapcs-32			 32-bit Program counter
11604 	      -mapcs-26			 26-bit Program counter
11605 	      -macps-float		 Floats passed in FP registers
11606 	      -mapcs-reentrant		 Reentrant code
11607 	      -matpcs
11608       (sometime these will probably be replaced with -mapcs=<list of options>
11609       and -matpcs=<list of options>)
11610 
11611       The remaining options are only supported for back-wards compatibility.
11612       Cpu variants, the arm part is optional:
11613 	      -m[arm]1		      Currently not supported.
11614 	      -m[arm]2, -m[arm]250    Arm 2 and Arm 250 processor
11615 	      -m[arm]3		      Arm 3 processor
11616 	      -m[arm]6[xx],	      Arm 6 processors
11617 	      -m[arm]7[xx][t][[d]m]   Arm 7 processors
11618 	      -m[arm]8[10]	      Arm 8 processors
11619 	      -m[arm]9[20][tdmi]      Arm 9 processors
11620 	      -mstrongarm[110[0]]     StrongARM processors
11621 	      -mxscale		      XScale processors
11622 	      -m[arm]v[2345[t[e]]]    Arm architectures
11623 	      -mall		      All (except the ARM1)
11624       FP variants:
11625 	      -mfpa10, -mfpa11	      FPA10 and 11 co-processor instructions
11626 	      -mfpe-old		      (No float load/store multiples)
11627 	      -mvfpxd		      VFP Single precision
11628 	      -mvfp		      All VFP
11629 	      -mno-fpu		      Disable all floating point instructions
11630 
11631       The following CPU names are recognized:
11632 	      arm1, arm2, arm250, arm3, arm6, arm600, arm610, arm620,
11633 	      arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi, arm70, arm700,
11634 	      arm700i, arm710 arm710t, arm720, arm720t, arm740t, arm710c,
11635 	      arm7100, arm7500, arm7500fe, arm7tdmi, arm8, arm810, arm9,
11636 	      arm920, arm920t, arm940t, arm946, arm966, arm9tdmi, arm9e,
11637 	      arm10t arm10e, arm1020t, arm1020e, arm10200e,
11638 	      strongarm, strongarm110, strongarm1100, strongarm1110, xscale.
11639 
11640       */
11641 
11642 const char * md_shortopts = "m:k";
11643 
11644 #ifdef ARM_BI_ENDIAN
11645 #define OPTION_EB (OPTION_MD_BASE + 0)
11646 #define OPTION_EL (OPTION_MD_BASE + 1)
11647 #else
11648 #if TARGET_BYTES_BIG_ENDIAN
11649 #define OPTION_EB (OPTION_MD_BASE + 0)
11650 #else
11651 #define OPTION_EL (OPTION_MD_BASE + 1)
11652 #endif
11653 #endif
11654 
11655 struct option md_longopts[] =
11656 {
11657 #ifdef OPTION_EB
11658   {"EB", no_argument, NULL, OPTION_EB},
11659 #endif
11660 #ifdef OPTION_EL
11661   {"EL", no_argument, NULL, OPTION_EL},
11662 #endif
11663   {NULL, no_argument, NULL, 0}
11664 };
11665 
11666 size_t md_longopts_size = sizeof (md_longopts);
11667 
11668 struct arm_option_table
11669 {
11670   char *option;		/* Option name to match.  */
11671   char *help;		/* Help information.  */
11672   int  *var;		/* Variable to change.	*/
11673   int	value;		/* What to change it to.  */
11674   char *deprecated;	/* If non-null, print this message.  */
11675 };
11676 
11677 struct arm_option_table arm_opts[] =
11678 {
11679   {"k",	     N_("generate PIC code"),	   &pic_code,	 1, NULL},
11680   {"mthumb", N_("assemble Thumb code"),	   &thumb_mode,	 1, NULL},
11681   {"mthumb-interwork", N_("support ARM/Thumb interworking"),
11682    &support_interwork, 1, NULL},
11683   {"mapcs-32", N_("code uses 32-bit program counter"), &uses_apcs_26, 0, NULL},
11684   {"mapcs-26", N_("code uses 26-bit program counter"), &uses_apcs_26, 1, NULL},
11685   {"mapcs-float", N_("floating point args are in fp regs"), &uses_apcs_float,
11686    1, NULL},
11687   {"mapcs-reentrant", N_("re-entrant code"), &pic_code, 1, NULL},
11688   {"matpcs", N_("code is ATPCS conformant"), &atpcs, 1, NULL},
11689   {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
11690   {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
11691    NULL},
11692 
11693   /* These are recognized by the assembler, but have no affect on code.	 */
11694   {"mapcs-frame", N_("use frame pointer"), NULL, 0, NULL},
11695   {"mapcs-stack-check", N_("use stack size checking"), NULL, 0, NULL},
11696 
11697   /* DON'T add any new processors to this list -- we want the whole list
11698      to go away...  Add them to the processors table instead.  */
11699   {"marm1",	 NULL, &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
11700   {"m1",	 NULL, &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
11701   {"marm2",	 NULL, &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
11702   {"m2",	 NULL, &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
11703   {"marm250",	 NULL, &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
11704   {"m250",	 NULL, &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
11705   {"marm3",	 NULL, &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
11706   {"m3",	 NULL, &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
11707   {"marm6",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
11708   {"m6",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
11709   {"marm600",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
11710   {"m600",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
11711   {"marm610",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
11712   {"m610",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
11713   {"marm620",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
11714   {"m620",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
11715   {"marm7",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
11716   {"m7",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
11717   {"marm70",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
11718   {"m70",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
11719   {"marm700",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
11720   {"m700",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
11721   {"marm700i",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
11722   {"m700i",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
11723   {"marm710",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
11724   {"m710",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
11725   {"marm710c",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
11726   {"m710c",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
11727   {"marm720",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
11728   {"m720",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
11729   {"marm7d",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
11730   {"m7d",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
11731   {"marm7di",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
11732   {"m7di",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
11733   {"marm7m",	 NULL, &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
11734   {"m7m",	 NULL, &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
11735   {"marm7dm",	 NULL, &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
11736   {"m7dm",	 NULL, &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
11737   {"marm7dmi",	 NULL, &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
11738   {"m7dmi",	 NULL, &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
11739   {"marm7100",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
11740   {"m7100",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
11741   {"marm7500",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
11742   {"m7500",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
11743   {"marm7500fe", NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
11744   {"m7500fe",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
11745   {"marm7t",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
11746   {"m7t",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
11747   {"marm7tdmi",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
11748   {"m7tdmi",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
11749   {"marm710t",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
11750   {"m710t",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
11751   {"marm720t",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
11752   {"m720t",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
11753   {"marm740t",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
11754   {"m740t",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
11755   {"marm8",	 NULL, &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
11756   {"m8",	 NULL, &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
11757   {"marm810",	 NULL, &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
11758   {"m810",	 NULL, &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
11759   {"marm9",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
11760   {"m9",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
11761   {"marm9tdmi",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
11762   {"m9tdmi",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
11763   {"marm920",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
11764   {"m920",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
11765   {"marm940",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
11766   {"m940",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
11767   {"mstrongarm", NULL, &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=strongarm")},
11768   {"mstrongarm110", NULL, &legacy_cpu, ARM_ARCH_V4,
11769    N_("use -mcpu=strongarm110")},
11770   {"mstrongarm1100", NULL, &legacy_cpu, ARM_ARCH_V4,
11771    N_("use -mcpu=strongarm1100")},
11772   {"mstrongarm1110", NULL, &legacy_cpu, ARM_ARCH_V4,
11773    N_("use -mcpu=strongarm1110")},
11774   {"mxscale",	 NULL, &legacy_cpu, ARM_ARCH_XSCALE, N_("use -mcpu=xscale")},
11775   {"miwmmxt",	 NULL, &legacy_cpu, ARM_ARCH_IWMMXT, N_("use -mcpu=iwmmxt")},
11776   {"mall",	 NULL, &legacy_cpu, ARM_ANY,	  N_("use -mcpu=all")},
11777 
11778   /* Architecture variants -- don't add any more to this list either.  */
11779   {"mv2",	 NULL, &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
11780   {"marmv2",	 NULL, &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
11781   {"mv2a",	 NULL, &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
11782   {"marmv2a",	 NULL, &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
11783   {"mv3",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
11784   {"marmv3",	 NULL, &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
11785   {"mv3m",	 NULL, &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
11786   {"marmv3m",	 NULL, &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
11787   {"mv4",	 NULL, &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
11788   {"marmv4",	 NULL, &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
11789   {"mv4t",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
11790   {"marmv4t",	 NULL, &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
11791   {"mv5",	 NULL, &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
11792   {"marmv5",	 NULL, &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
11793   {"mv5t",	 NULL, &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
11794   {"marmv5t",	 NULL, &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
11795   {"mv5e",	 NULL, &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
11796   {"marmv5e",	 NULL, &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
11797 
11798   /* Floating point variants -- don't add any more to this list either.	 */
11799   {"mfpe-old", NULL, &legacy_fpu, FPU_ARCH_FPE, N_("use -mfpu=fpe")},
11800   {"mfpa10",   NULL, &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa10")},
11801   {"mfpa11",   NULL, &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa11")},
11802   {"mno-fpu",  NULL, &legacy_fpu, 0,
11803    N_("use either -mfpu=softfpa or -mfpu=softvfp")},
11804 
11805   {NULL, NULL, NULL, 0, NULL}
11806 };
11807 
11808 struct arm_cpu_option_table
11809 {
11810   char *name;
11811   int	value;
11812   /* For some CPUs we assume an FPU unless the user explicitly sets
11813      -mfpu=...	*/
11814   int	default_fpu;
11815 };
11816 
11817 /* This list should, at a minimum, contain all the cpu names
11818    recognized by GCC.  */
11819 static struct arm_cpu_option_table arm_cpus[] =
11820 {
11821   {"all",		ARM_ANY,	 FPU_ARCH_FPA},
11822   {"arm1",		ARM_ARCH_V1,	 FPU_ARCH_FPA},
11823   {"arm2",		ARM_ARCH_V2,	 FPU_ARCH_FPA},
11824   {"arm250",		ARM_ARCH_V2S,	 FPU_ARCH_FPA},
11825   {"arm3",		ARM_ARCH_V2S,	 FPU_ARCH_FPA},
11826   {"arm6",		ARM_ARCH_V3,	 FPU_ARCH_FPA},
11827   {"arm60",		ARM_ARCH_V3,	 FPU_ARCH_FPA},
11828   {"arm600",		ARM_ARCH_V3,	 FPU_ARCH_FPA},
11829   {"arm610",		ARM_ARCH_V3,	 FPU_ARCH_FPA},
11830   {"arm620",		ARM_ARCH_V3,	 FPU_ARCH_FPA},
11831   {"arm7",		ARM_ARCH_V3,	 FPU_ARCH_FPA},
11832   {"arm7m",		ARM_ARCH_V3M,	 FPU_ARCH_FPA},
11833   {"arm7d",		ARM_ARCH_V3,	 FPU_ARCH_FPA},
11834   {"arm7dm",		ARM_ARCH_V3M,	 FPU_ARCH_FPA},
11835   {"arm7di",		ARM_ARCH_V3,	 FPU_ARCH_FPA},
11836   {"arm7dmi",		ARM_ARCH_V3M,	 FPU_ARCH_FPA},
11837   {"arm70",		ARM_ARCH_V3,	 FPU_ARCH_FPA},
11838   {"arm700",		ARM_ARCH_V3,	 FPU_ARCH_FPA},
11839   {"arm700i",		ARM_ARCH_V3,	 FPU_ARCH_FPA},
11840   {"arm710",		ARM_ARCH_V3,	 FPU_ARCH_FPA},
11841   {"arm710t",		ARM_ARCH_V4T,	 FPU_ARCH_FPA},
11842   {"arm720",		ARM_ARCH_V3,	 FPU_ARCH_FPA},
11843   {"arm720t",		ARM_ARCH_V4T,	 FPU_ARCH_FPA},
11844   {"arm740t",		ARM_ARCH_V4T,	 FPU_ARCH_FPA},
11845   {"arm710c",		ARM_ARCH_V3,	 FPU_ARCH_FPA},
11846   {"arm7100",		ARM_ARCH_V3,	 FPU_ARCH_FPA},
11847   {"arm7500",		ARM_ARCH_V3,	 FPU_ARCH_FPA},
11848   {"arm7500fe",		ARM_ARCH_V3,	 FPU_ARCH_FPA},
11849   {"arm7t",		ARM_ARCH_V4T,	 FPU_ARCH_FPA},
11850   {"arm7tdmi",		ARM_ARCH_V4T,	 FPU_ARCH_FPA},
11851   {"arm7tdmi-s",	ARM_ARCH_V4T,	 FPU_ARCH_FPA},
11852   {"arm8",		ARM_ARCH_V4,	 FPU_ARCH_FPA},
11853   {"arm810",		ARM_ARCH_V4,	 FPU_ARCH_FPA},
11854   {"strongarm",		ARM_ARCH_V4,	 FPU_ARCH_FPA},
11855   {"strongarm1",	ARM_ARCH_V4,	 FPU_ARCH_FPA},
11856   {"strongarm110",	ARM_ARCH_V4,	 FPU_ARCH_FPA},
11857   {"strongarm1100",	ARM_ARCH_V4,	 FPU_ARCH_FPA},
11858   {"strongarm1110",	ARM_ARCH_V4,	 FPU_ARCH_FPA},
11859   {"arm9",		ARM_ARCH_V4T,	 FPU_ARCH_FPA},
11860   {"arm920",		ARM_ARCH_V4T,	 FPU_ARCH_FPA},
11861   {"arm920t",		ARM_ARCH_V4T,	 FPU_ARCH_FPA},
11862   {"arm922t",		ARM_ARCH_V4T,	 FPU_ARCH_FPA},
11863   {"arm940t",		ARM_ARCH_V4T,	 FPU_ARCH_FPA},
11864   {"arm9tdmi",		ARM_ARCH_V4T,	 FPU_ARCH_FPA},
11865   /* For V5 or later processors we default to using VFP; but the user
11866      should really set the FPU type explicitly.	 */
11867   {"arm9e-r0",		ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2},
11868   {"arm9e",		ARM_ARCH_V5TE,	 FPU_ARCH_VFP_V2},
11869   {"arm926ej",		ARM_ARCH_V5TEJ,	 FPU_ARCH_VFP_V2},
11870   {"arm926ejs",		ARM_ARCH_V5TEJ,	 FPU_ARCH_VFP_V2},
11871   {"arm926ej-s",	ARM_ARCH_V5TEJ,	 FPU_ARCH_VFP_V2},
11872   {"arm946e-r0",	ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2},
11873   {"arm946e",		ARM_ARCH_V5TE,	 FPU_ARCH_VFP_V2},
11874   {"arm966e-r0",	ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2},
11875   {"arm966e",		ARM_ARCH_V5TE,	 FPU_ARCH_VFP_V2},
11876   {"arm10t",		ARM_ARCH_V5T,	 FPU_ARCH_VFP_V1},
11877   {"arm10e",		ARM_ARCH_V5TE,	 FPU_ARCH_VFP_V2},
11878   {"arm1020",		ARM_ARCH_V5TE,	 FPU_ARCH_VFP_V2},
11879   {"arm1020t",		ARM_ARCH_V5T,	 FPU_ARCH_VFP_V1},
11880   {"arm1020e",		ARM_ARCH_V5TE,	 FPU_ARCH_VFP_V2},
11881   {"arm1026ejs",	ARM_ARCH_V5TEJ,	 FPU_ARCH_VFP_V2},
11882   {"arm1026ej-s",	ARM_ARCH_V5TEJ,	 FPU_ARCH_VFP_V2},
11883   {"arm1136js",		ARM_ARCH_V6,	 FPU_NONE},
11884   {"arm1136j-s",	ARM_ARCH_V6,	 FPU_NONE},
11885   {"arm1136jfs",	ARM_ARCH_V6,	 FPU_ARCH_VFP_V2},
11886   {"arm1136jf-s",	ARM_ARCH_V6,	 FPU_ARCH_VFP_V2},
11887   {"mpcore",		ARM_ARCH_V6K,	 FPU_ARCH_VFP_V2},
11888   {"mpcorenovfp",	ARM_ARCH_V6K,	 FPU_NONE},
11889   {"arm1176jz-s",	ARM_ARCH_V6ZK,	 FPU_NONE},
11890   {"arm1176jzf-s",	ARM_ARCH_V6ZK,	 FPU_ARCH_VFP_V2},
11891   /* ??? XSCALE is really an architecture.  */
11892   {"xscale",		ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2},
11893   /* ??? iwmmxt is not a processor.  */
11894   {"iwmmxt",		ARM_ARCH_IWMMXT, FPU_ARCH_VFP_V2},
11895   {"i80200",		ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2},
11896   /* Maverick */
11897   {"ep9312",		ARM_ARCH_V4T | ARM_CEXT_MAVERICK, FPU_ARCH_MAVERICK},
11898   {NULL, 0, 0}
11899 };
11900 
11901 struct arm_arch_option_table
11902 {
11903   char *name;
11904   int	value;
11905   int	default_fpu;
11906 };
11907 
11908 /* This list should, at a minimum, contain all the architecture names
11909    recognized by GCC.  */
11910 static struct arm_arch_option_table arm_archs[] =
11911 {
11912   {"all",		ARM_ANY,	 FPU_ARCH_FPA},
11913   {"armv1",		ARM_ARCH_V1,	 FPU_ARCH_FPA},
11914   {"armv2",		ARM_ARCH_V2,	 FPU_ARCH_FPA},
11915   {"armv2a",		ARM_ARCH_V2S,	 FPU_ARCH_FPA},
11916   {"armv2s",		ARM_ARCH_V2S,	 FPU_ARCH_FPA},
11917   {"armv3",		ARM_ARCH_V3,	 FPU_ARCH_FPA},
11918   {"armv3m",		ARM_ARCH_V3M,	 FPU_ARCH_FPA},
11919   {"armv4",		ARM_ARCH_V4,	 FPU_ARCH_FPA},
11920   {"armv4xm",		ARM_ARCH_V4xM,	 FPU_ARCH_FPA},
11921   {"armv4t",		ARM_ARCH_V4T,	 FPU_ARCH_FPA},
11922   {"armv4txm",		ARM_ARCH_V4TxM,	 FPU_ARCH_FPA},
11923   {"armv5",		ARM_ARCH_V5,	 FPU_ARCH_VFP},
11924   {"armv5t",		ARM_ARCH_V5T,	 FPU_ARCH_VFP},
11925   {"armv5txm",		ARM_ARCH_V5TxM,	 FPU_ARCH_VFP},
11926   {"armv5te",		ARM_ARCH_V5TE,	 FPU_ARCH_VFP},
11927   {"armv5texp",		ARM_ARCH_V5TExP, FPU_ARCH_VFP},
11928   {"armv5tej",		ARM_ARCH_V5TEJ,	 FPU_ARCH_VFP},
11929   {"armv6",		ARM_ARCH_V6,	 FPU_ARCH_VFP},
11930   {"armv6j",		ARM_ARCH_V6,	 FPU_ARCH_VFP},
11931   {"armv6k",		ARM_ARCH_V6K,	 FPU_ARCH_VFP},
11932   {"armv6z",		ARM_ARCH_V6Z,	 FPU_ARCH_VFP},
11933   {"armv6zk",		ARM_ARCH_V6ZK,	 FPU_ARCH_VFP},
11934   {"armv6t2",		ARM_ARCH_V6T2,	 FPU_ARCH_VFP},
11935   {"armv6kt2",		ARM_ARCH_V6KT2,	 FPU_ARCH_VFP},
11936   {"armv6zt2",		ARM_ARCH_V6ZT2,	 FPU_ARCH_VFP},
11937   {"armv6zkt2",		ARM_ARCH_V6ZKT2, FPU_ARCH_VFP},
11938   {"xscale",		ARM_ARCH_XSCALE, FPU_ARCH_VFP},
11939   {"iwmmxt",		ARM_ARCH_IWMMXT, FPU_ARCH_VFP},
11940   {NULL, 0, 0}
11941 };
11942 
11943 /* ISA extensions in the co-processor space.  */
11944 struct arm_option_value_table
11945 {
11946   char *name;
11947   int value;
11948 };
11949 
11950 static struct arm_option_value_table arm_extensions[] =
11951 {
11952   {"maverick",		ARM_CEXT_MAVERICK},
11953   {"xscale",		ARM_CEXT_XSCALE},
11954   {"iwmmxt",		ARM_CEXT_IWMMXT},
11955   {NULL,		0}
11956 };
11957 
11958 /* This list should, at a minimum, contain all the fpu names
11959    recognized by GCC.  */
11960 static struct arm_option_value_table arm_fpus[] =
11961 {
11962   {"softfpa",		FPU_NONE},
11963   {"fpe",		FPU_ARCH_FPE},
11964   {"fpe2",		FPU_ARCH_FPE},
11965   {"fpe3",		FPU_ARCH_FPA},	/* Third release supports LFM/SFM.  */
11966   {"fpa",		FPU_ARCH_FPA},
11967   {"fpa10",		FPU_ARCH_FPA},
11968   {"fpa11",		FPU_ARCH_FPA},
11969   {"arm7500fe",		FPU_ARCH_FPA},
11970   {"softvfp",		FPU_ARCH_VFP},
11971   {"softvfp+vfp",	FPU_ARCH_VFP_V2},
11972   {"vfp",		FPU_ARCH_VFP_V2},
11973   {"vfp9",		FPU_ARCH_VFP_V2},
11974   {"vfp10",		FPU_ARCH_VFP_V2},
11975   {"vfp10-r0",		FPU_ARCH_VFP_V1},
11976   {"vfpxd",		FPU_ARCH_VFP_V1xD},
11977   {"arm1020t",		FPU_ARCH_VFP_V1},
11978   {"arm1020e",		FPU_ARCH_VFP_V2},
11979   {"arm1136jfs",	FPU_ARCH_VFP_V2},
11980   {"arm1136jf-s",	FPU_ARCH_VFP_V2},
11981   {"maverick",		FPU_ARCH_MAVERICK},
11982   {NULL, 0}
11983 };
11984 
11985 static struct arm_option_value_table arm_float_abis[] =
11986 {
11987   {"hard",	ARM_FLOAT_ABI_HARD},
11988   {"softfp",	ARM_FLOAT_ABI_SOFTFP},
11989   {"soft",	ARM_FLOAT_ABI_SOFT},
11990   {NULL, 0}
11991 };
11992 
11993 #ifdef OBJ_ELF
11994 /* We only know how to output GNU and ver 4 (AAELF) formats.  */
11995 static struct arm_option_value_table arm_eabis[] =
11996 {
11997   {"gnu",	EF_ARM_EABI_UNKNOWN},
11998   {"4",		EF_ARM_EABI_VER4},
11999   {NULL, 0}
12000 };
12001 #endif
12002 
12003 struct arm_long_option_table
12004 {
12005   char * option;		/* Substring to match.	*/
12006   char * help;			/* Help information.  */
12007   int (* func) (char * subopt);	/* Function to decode sub-option.  */
12008   char * deprecated;		/* If non-null, print this message.  */
12009 };
12010 
12011 static int
arm_parse_extension(char * str,int * opt_p)12012 arm_parse_extension (char * str, int * opt_p)
12013 {
12014   while (str != NULL && *str != 0)
12015     {
12016       struct arm_option_value_table * opt;
12017       char * ext;
12018       int optlen;
12019 
12020       if (*str != '+')
12021 	{
12022 	  as_bad (_("invalid architectural extension"));
12023 	  return 0;
12024 	}
12025 
12026       str++;
12027       ext = strchr (str, '+');
12028 
12029       if (ext != NULL)
12030 	optlen = ext - str;
12031       else
12032 	optlen = strlen (str);
12033 
12034       if (optlen == 0)
12035 	{
12036 	  as_bad (_("missing architectural extension"));
12037 	  return 0;
12038 	}
12039 
12040       for (opt = arm_extensions; opt->name != NULL; opt++)
12041 	if (strncmp (opt->name, str, optlen) == 0)
12042 	  {
12043 	    *opt_p |= opt->value;
12044 	    break;
12045 	  }
12046 
12047       if (opt->name == NULL)
12048 	{
12049 	  as_bad (_("unknown architectural extnsion `%s'"), str);
12050 	  return 0;
12051 	}
12052 
12053       str = ext;
12054     };
12055 
12056   return 1;
12057 }
12058 
12059 static int
arm_parse_cpu(char * str)12060 arm_parse_cpu (char * str)
12061 {
12062   struct arm_cpu_option_table * opt;
12063   char * ext = strchr (str, '+');
12064   int optlen;
12065 
12066   if (ext != NULL)
12067     optlen = ext - str;
12068   else
12069     optlen = strlen (str);
12070 
12071   if (optlen == 0)
12072     {
12073       as_bad (_("missing cpu name `%s'"), str);
12074       return 0;
12075     }
12076 
12077   for (opt = arm_cpus; opt->name != NULL; opt++)
12078     if (strncmp (opt->name, str, optlen) == 0)
12079       {
12080 	mcpu_cpu_opt = opt->value;
12081 	mcpu_fpu_opt = opt->default_fpu;
12082 
12083 	if (ext != NULL)
12084 	  return arm_parse_extension (ext, &mcpu_cpu_opt);
12085 
12086 	return 1;
12087       }
12088 
12089   as_bad (_("unknown cpu `%s'"), str);
12090   return 0;
12091 }
12092 
12093 static int
arm_parse_arch(char * str)12094 arm_parse_arch (char * str)
12095 {
12096   struct arm_arch_option_table *opt;
12097   char *ext = strchr (str, '+');
12098   int optlen;
12099 
12100   if (ext != NULL)
12101     optlen = ext - str;
12102   else
12103     optlen = strlen (str);
12104 
12105   if (optlen == 0)
12106     {
12107       as_bad (_("missing architecture name `%s'"), str);
12108       return 0;
12109     }
12110 
12111 
12112   for (opt = arm_archs; opt->name != NULL; opt++)
12113     if (streq (opt->name, str))
12114       {
12115 	march_cpu_opt = opt->value;
12116 	march_fpu_opt = opt->default_fpu;
12117 
12118 	if (ext != NULL)
12119 	  return arm_parse_extension (ext, &march_cpu_opt);
12120 
12121 	return 1;
12122       }
12123 
12124   as_bad (_("unknown architecture `%s'\n"), str);
12125   return 0;
12126 }
12127 
12128 static int
arm_parse_fpu(char * str)12129 arm_parse_fpu (char * str)
12130 {
12131   struct arm_option_value_table * opt;
12132 
12133   for (opt = arm_fpus; opt->name != NULL; opt++)
12134     if (streq (opt->name, str))
12135       {
12136 	mfpu_opt = opt->value;
12137 	return 1;
12138       }
12139 
12140   as_bad (_("unknown floating point format `%s'\n"), str);
12141   return 0;
12142 }
12143 
12144 static int
arm_parse_float_abi(char * str)12145 arm_parse_float_abi (char * str)
12146 {
12147   struct arm_option_value_table * opt;
12148 
12149   for (opt = arm_float_abis; opt->name != NULL; opt++)
12150     if (streq (opt->name, str))
12151       {
12152 	mfloat_abi_opt = opt->value;
12153 	return 1;
12154       }
12155 
12156   as_bad (_("unknown floating point abi `%s'\n"), str);
12157   return 0;
12158 }
12159 
12160 #ifdef OBJ_ELF
12161 static int
arm_parse_eabi(char * str)12162 arm_parse_eabi (char * str)
12163 {
12164   struct arm_option_value_table *opt;
12165 
12166   for (opt = arm_eabis; opt->name != NULL; opt++)
12167     if (streq (opt->name, str))
12168       {
12169 	meabi_flags = opt->value;
12170 	return 1;
12171       }
12172   as_bad (_("unknown EABI `%s'\n"), str);
12173   return 0;
12174 }
12175 #endif
12176 
12177 struct arm_long_option_table arm_long_opts[] =
12178 {
12179   {"mcpu=", N_("<cpu name>\t  assemble for CPU <cpu name>"),
12180    arm_parse_cpu, NULL},
12181   {"march=", N_("<arch name>\t  assemble for architecture <arch name>"),
12182    arm_parse_arch, NULL},
12183   {"mfpu=", N_("<fpu name>\t  assemble for FPU architecture <fpu name>"),
12184    arm_parse_fpu, NULL},
12185   {"mfloat-abi=", N_("<abi>\t  assemble for floating point ABI <abi>"),
12186    arm_parse_float_abi, NULL},
12187 #ifdef OBJ_ELF
12188   {"meabi=", N_("<ver>\t  assemble for eabi version <ver>"),
12189    arm_parse_eabi, NULL},
12190 #endif
12191   {NULL, NULL, 0, NULL}
12192 };
12193 
12194 int
md_parse_option(int c,char * arg)12195 md_parse_option (int c, char * arg)
12196 {
12197   struct arm_option_table *opt;
12198   struct arm_long_option_table *lopt;
12199 
12200   switch (c)
12201     {
12202 #ifdef OPTION_EB
12203     case OPTION_EB:
12204       target_big_endian = 1;
12205       break;
12206 #endif
12207 
12208 #ifdef OPTION_EL
12209     case OPTION_EL:
12210       target_big_endian = 0;
12211       break;
12212 #endif
12213 
12214     case 'a':
12215       /* Listing option.  Just ignore these, we don't support additional
12216 	 ones.	*/
12217       return 0;
12218 
12219     default:
12220       for (opt = arm_opts; opt->option != NULL; opt++)
12221 	{
12222 	  if (c == opt->option[0]
12223 	      && ((arg == NULL && opt->option[1] == 0)
12224 		  || streq (arg, opt->option + 1)))
12225 	    {
12226 #if WARN_DEPRECATED
12227 	      /* If the option is deprecated, tell the user.  */
12228 	      if (opt->deprecated != NULL)
12229 		as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
12230 			   arg ? arg : "", _(opt->deprecated));
12231 #endif
12232 
12233 	      if (opt->var != NULL)
12234 		*opt->var = opt->value;
12235 
12236 	      return 1;
12237 	    }
12238 	}
12239 
12240       for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
12241 	{
12242 	  /* These options are expected to have an argument.  */
12243 	  if (c == lopt->option[0]
12244 	      && arg != NULL
12245 	      && strncmp (arg, lopt->option + 1,
12246 			  strlen (lopt->option + 1)) == 0)
12247 	    {
12248 #if WARN_DEPRECATED
12249 	      /* If the option is deprecated, tell the user.  */
12250 	      if (lopt->deprecated != NULL)
12251 		as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
12252 			   _(lopt->deprecated));
12253 #endif
12254 
12255 	      /* Call the sup-option parser.  */
12256 	      return lopt->func (arg + strlen (lopt->option) - 1);
12257 	    }
12258 	}
12259 
12260       return 0;
12261     }
12262 
12263   return 1;
12264 }
12265 
12266 void
md_show_usage(FILE * fp)12267 md_show_usage (FILE * fp)
12268 {
12269   struct arm_option_table *opt;
12270   struct arm_long_option_table *lopt;
12271 
12272   fprintf (fp, _(" ARM-specific assembler options:\n"));
12273 
12274   for (opt = arm_opts; opt->option != NULL; opt++)
12275     if (opt->help != NULL)
12276       fprintf (fp, "  -%-23s%s\n", opt->option, _(opt->help));
12277 
12278   for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
12279     if (lopt->help != NULL)
12280       fprintf (fp, "  -%s%s\n", lopt->option, _(lopt->help));
12281 
12282 #ifdef OPTION_EB
12283   fprintf (fp, _("\
12284   -EB                     assemble code for a big-endian cpu\n"));
12285 #endif
12286 
12287 #ifdef OPTION_EL
12288   fprintf (fp, _("\
12289   -EL                     assemble code for a little-endian cpu\n"));
12290 #endif
12291 }
12292