is_end_of_line fixes.
[deliverable/binutils-gdb.git] / gas / config / tc-arm.c
1 /* tc-arm.c -- Assemble for the ARM
2 Copyright (C) 1994, 95, 96, 97, 98, 1999, 2000 Free Software Foundation, Inc.
3 Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
4 Modified by David Taylor (dtaylor@armltd.co.uk)
5
6 This file is part of GAS, the GNU Assembler.
7
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA. */
22
23 #include <ctype.h>
24 #include <string.h>
25 #define NO_RELOC 0
26 #include "as.h"
27
28 /* need TARGET_CPU */
29 #include "config.h"
30 #include "subsegs.h"
31 #include "obstack.h"
32 #include "symbols.h"
33 #include "listing.h"
34
35 #ifdef OBJ_ELF
36 #include "elf/arm.h"
37 #endif
38
39 /* Types of processor to assemble for. */
40 #define ARM_1 0x00000001
41 #define ARM_2 0x00000002
42 #define ARM_3 0x00000004
43 #define ARM_250 ARM_3
44 #define ARM_6 0x00000008
45 #define ARM_7 ARM_6 /* same core instruction set */
46 #define ARM_8 ARM_6 /* same core instruction set */
47 #define ARM_9 ARM_6 /* same core instruction set */
48 #define ARM_CPU_MASK 0x0000000f
49
50 /* The following bitmasks control CPU extensions (ARM7 onwards): */
51 #define ARM_LONGMUL 0x00000010 /* allow long multiplies */
52 #define ARM_HALFWORD 0x00000020 /* allow half word loads */
53 #define ARM_THUMB 0x00000040 /* allow BX instruction */
54 #define ARM_EXT_V5 0x00000080 /* allow CLZ etc */
55
56 /* Architectures are the sum of the base and extensions. */
57 #define ARM_ARCH_V4 (ARM_7 | ARM_LONGMUL | ARM_HALFWORD)
58 #define ARM_ARCH_V4T (ARM_ARCH_V4 | ARM_THUMB)
59 #define ARM_ARCH_V5 (ARM_ARCH_V4 | ARM_EXT_V5)
60 #define ARM_ARCH_V5T (ARM_ARCH_V5 | ARM_THUMB)
61
62 /* Some useful combinations: */
63 #define ARM_ANY 0x00ffffff
64 #define ARM_2UP (ARM_ANY - ARM_1)
65 #define ARM_ALL ARM_2UP /* Not arm1 only */
66 #define ARM_3UP 0x00fffffc
67 #define ARM_6UP 0x00fffff8 /* Includes ARM7 */
68
69 #define FPU_CORE 0x80000000
70 #define FPU_FPA10 0x40000000
71 #define FPU_FPA11 0x40000000
72 #define FPU_NONE 0
73
74 /* Some useful combinations */
75 #define FPU_ALL 0xff000000 /* Note this is ~ARM_ANY */
76 #define FPU_MEMMULTI 0x7f000000 /* Not fpu_core */
77
78
79 #ifndef CPU_DEFAULT
80 #if defined __thumb__
81 #define CPU_DEFAULT (ARM_ARCH_V4 | ARM_THUMB)
82 #else
83 #define CPU_DEFAULT ARM_ALL
84 #endif
85 #endif
86
87 #ifndef FPU_DEFAULT
88 #define FPU_DEFAULT FPU_ALL
89 #endif
90
91 #define streq(a, b) (strcmp (a, b) == 0)
92 #define skip_whitespace(str) while (* (str) == ' ') ++ (str)
93
94 static unsigned long cpu_variant = CPU_DEFAULT | FPU_DEFAULT;
95 static int target_oabi = 0;
96
97 #if defined OBJ_COFF || defined OBJ_ELF
98 /* Flags stored in private area of BFD structure */
99 static boolean uses_apcs_26 = false;
100 static boolean support_interwork = false;
101 static boolean uses_apcs_float = false;
102 static boolean pic_code = false;
103 #endif
104
105 /* This array holds the chars that always start a comment. If the
106 pre-processor is disabled, these aren't very useful. */
107 CONST char comment_chars[] = "@";
108
109 /* This array holds the chars that only start a comment at the beginning of
110 a line. If the line seems to have the form '# 123 filename'
111 .line and .file directives will appear in the pre-processed output. */
112 /* Note that input_file.c hand checks for '#' at the beginning of the
113 first line of the input file. This is because the compiler outputs
114 #NO_APP at the beginning of its output. */
115 /* Also note that comments like this one will always work. */
116 CONST char line_comment_chars[] = "#";
117
118 #ifdef TE_LINUX
119 CONST char line_separator_chars[] = ";";
120 #else
121 CONST char line_separator_chars[] = "";
122 #endif
123
124 /* Chars that can be used to separate mant
125 from exp in floating point numbers. */
126 CONST char EXP_CHARS[] = "eE";
127
128 /* Chars that mean this number is a floating point constant */
129 /* As in 0f12.456 */
130 /* or 0d1.2345e12 */
131
132 CONST char FLT_CHARS[] = "rRsSfFdDxXeEpP";
133
134 /* Prefix characters that indicate the start of an immediate
135 value. */
136 #define is_immediate_prefix(C) ((C) == '#' || (C) == '$')
137
138 #ifdef OBJ_ELF
139 symbolS * GOT_symbol; /* Pre-defined "_GLOBAL_OFFSET_TABLE_" */
140 #endif
141
142 CONST int md_reloc_size = 8; /* Size of relocation record */
143
144 static int thumb_mode = 0; /* 0: assemble for ARM, 1: assemble for Thumb,
145 2: assemble for Thumb even though target cpu
146 does not support thumb instructions. */
147 typedef struct arm_fix
148 {
149 int thumb_mode;
150 } arm_fix_data;
151
152 struct arm_it
153 {
154 CONST char * error;
155 unsigned long instruction;
156 int suffix;
157 int size;
158 struct
159 {
160 bfd_reloc_code_real_type type;
161 expressionS exp;
162 int pc_rel;
163 } reloc;
164 };
165
166 struct arm_it inst;
167
168 struct asm_shift
169 {
170 CONST char * template;
171 unsigned long value;
172 };
173
174 static CONST struct asm_shift shift[] =
175 {
176 {"asl", 0},
177 {"lsl", 0},
178 {"lsr", 0x00000020},
179 {"asr", 0x00000040},
180 {"ror", 0x00000060},
181 {"rrx", 0x00000060},
182 {"ASL", 0},
183 {"LSL", 0},
184 {"LSR", 0x00000020},
185 {"ASR", 0x00000040},
186 {"ROR", 0x00000060},
187 {"RRX", 0x00000060}
188 };
189
190 #define NO_SHIFT_RESTRICT 1
191 #define SHIFT_RESTRICT 0
192
193 #define NUM_FLOAT_VALS 8
194
195 CONST char * fp_const[] =
196 {
197 "0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0", 0
198 };
199
200 /* Number of littlenums required to hold an extended precision number. */
201 #define MAX_LITTLENUMS 6
202
203 LITTLENUM_TYPE fp_values[NUM_FLOAT_VALS][MAX_LITTLENUMS];
204
205 #define FAIL (-1)
206 #define SUCCESS (0)
207
208 #define SUFF_S 1
209 #define SUFF_D 2
210 #define SUFF_E 3
211 #define SUFF_P 4
212
213 #define CP_T_X 0x00008000
214 #define CP_T_Y 0x00400000
215 #define CP_T_Pre 0x01000000
216 #define CP_T_UD 0x00800000
217 #define CP_T_WB 0x00200000
218
219 #define CONDS_BIT (0x00100000)
220 #define LOAD_BIT (0x00100000)
221 #define TRANS_BIT (0x00200000)
222
223 struct asm_cond
224 {
225 CONST char * template;
226 unsigned long value;
227 };
228
229 /* This is to save a hash look-up in the common case. */
230 #define COND_ALWAYS 0xe0000000
231
232 static CONST struct asm_cond conds[] =
233 {
234 {"eq", 0x00000000},
235 {"ne", 0x10000000},
236 {"cs", 0x20000000}, {"hs", 0x20000000},
237 {"cc", 0x30000000}, {"ul", 0x30000000}, {"lo", 0x30000000},
238 {"mi", 0x40000000},
239 {"pl", 0x50000000},
240 {"vs", 0x60000000},
241 {"vc", 0x70000000},
242 {"hi", 0x80000000},
243 {"ls", 0x90000000},
244 {"ge", 0xa0000000},
245 {"lt", 0xb0000000},
246 {"gt", 0xc0000000},
247 {"le", 0xd0000000},
248 {"al", 0xe0000000},
249 {"nv", 0xf0000000}
250 };
251
252 /* Warning: If the top bit of the set_bits is set, then the standard
253 instruction bitmask is ignored, and the new bitmask is taken from
254 the set_bits: */
255 struct asm_flg
256 {
257 CONST char * template; /* Basic flag string */
258 unsigned long set_bits; /* Bits to set */
259 };
260
261 static CONST struct asm_flg s_flag[] =
262 {
263 {"s", CONDS_BIT},
264 {NULL, 0}
265 };
266
267 static CONST struct asm_flg ldr_flags[] =
268 {
269 {"b", 0x00400000},
270 {"t", TRANS_BIT},
271 {"bt", 0x00400000 | TRANS_BIT},
272 {"h", 0x801000b0},
273 {"sh", 0x801000f0},
274 {"sb", 0x801000d0},
275 {NULL, 0}
276 };
277
278 static CONST struct asm_flg str_flags[] =
279 {
280 {"b", 0x00400000},
281 {"t", TRANS_BIT},
282 {"bt", 0x00400000 | TRANS_BIT},
283 {"h", 0x800000b0},
284 {NULL, 0}
285 };
286
287 static CONST struct asm_flg byte_flag[] =
288 {
289 {"b", 0x00400000},
290 {NULL, 0}
291 };
292
293 static CONST struct asm_flg cmp_flags[] =
294 {
295 {"s", CONDS_BIT},
296 {"p", 0x0010f000},
297 {NULL, 0}
298 };
299
300 static CONST struct asm_flg ldm_flags[] =
301 {
302 {"ed", 0x01800000},
303 {"fd", 0x00800000},
304 {"ea", 0x01000000},
305 {"fa", 0x08000000},
306 {"ib", 0x01800000},
307 {"ia", 0x00800000},
308 {"db", 0x01000000},
309 {"da", 0x08000000},
310 {NULL, 0}
311 };
312
313 static CONST struct asm_flg stm_flags[] =
314 {
315 {"ed", 0x08000000},
316 {"fd", 0x01000000},
317 {"ea", 0x00800000},
318 {"fa", 0x01800000},
319 {"ib", 0x01800000},
320 {"ia", 0x00800000},
321 {"db", 0x01000000},
322 {"da", 0x08000000},
323 {NULL, 0}
324 };
325
326 static CONST struct asm_flg lfm_flags[] =
327 {
328 {"fd", 0x00800000},
329 {"ea", 0x01000000},
330 {NULL, 0}
331 };
332
333 static CONST struct asm_flg sfm_flags[] =
334 {
335 {"fd", 0x01000000},
336 {"ea", 0x00800000},
337 {NULL, 0}
338 };
339
340 static CONST struct asm_flg round_flags[] =
341 {
342 {"p", 0x00000020},
343 {"m", 0x00000040},
344 {"z", 0x00000060},
345 {NULL, 0}
346 };
347
348 /* The implementation of the FIX instruction is broken on some assemblers,
349 in that it accepts a precision specifier as well as a rounding specifier,
350 despite the fact that this is meaningless. To be more compatible, we
351 accept it as well, though of course it does not set any bits. */
352 static CONST struct asm_flg fix_flags[] =
353 {
354 {"p", 0x00000020},
355 {"m", 0x00000040},
356 {"z", 0x00000060},
357 {"sp", 0x00000020},
358 {"sm", 0x00000040},
359 {"sz", 0x00000060},
360 {"dp", 0x00000020},
361 {"dm", 0x00000040},
362 {"dz", 0x00000060},
363 {"ep", 0x00000020},
364 {"em", 0x00000040},
365 {"ez", 0x00000060},
366 {NULL, 0}
367 };
368
369 static CONST struct asm_flg except_flag[] =
370 {
371 {"e", 0x00400000},
372 {NULL, 0}
373 };
374
375 static CONST struct asm_flg cplong_flag[] =
376 {
377 {"l", 0x00400000},
378 {NULL, 0}
379 };
380
381 struct asm_psr
382 {
383 CONST char * template;
384 boolean cpsr;
385 unsigned long field;
386 };
387
388 #define SPSR_BIT (1 << 22) /* The bit that distnguishes CPSR and SPSR. */
389 #define PSR_SHIFT 16 /* How many bits to shift the PSR_xxx bits up by. */
390
391 #define PSR_c (1 << 0)
392 #define PSR_x (1 << 1)
393 #define PSR_s (1 << 2)
394 #define PSR_f (1 << 3)
395
396 static CONST struct asm_psr psrs[] =
397 {
398 {"CPSR", true, PSR_c | PSR_f},
399 {"CPSR_all", true, PSR_c | PSR_f},
400 {"SPSR", false, PSR_c | PSR_f},
401 {"SPSR_all", false, PSR_c | PSR_f},
402 {"CPSR_flg", true, PSR_f},
403 {"CPSR_f", true, PSR_f},
404 {"SPSR_flg", false, PSR_f},
405 {"SPSR_f", false, PSR_f},
406 {"CPSR_c", true, PSR_c},
407 {"CPSR_ctl", true, PSR_c},
408 {"SPSR_c", false, PSR_c},
409 {"SPSR_ctl", false, PSR_c},
410 {"CPSR_x", true, PSR_x},
411 {"CPSR_s", true, PSR_s},
412 {"SPSR_x", false, PSR_x},
413 {"SPSR_s", false, PSR_s},
414 /* For backwards compatability with older toolchain we also
415 support lower case versions of some of these flags. */
416 {"cpsr", true, PSR_c | PSR_f},
417 {"cpsr_all", true, PSR_c | PSR_f},
418 {"spsr", false, PSR_c | PSR_f},
419 {"spsr_all", false, PSR_c | PSR_f},
420 {"cpsr_flg", true, PSR_f},
421 {"cpsr_f", true, PSR_f},
422 {"spsr_flg", false, PSR_f},
423 {"spsr_f", false, PSR_f},
424 {"cpsr_c", true, PSR_c},
425 {"cpsr_ctl", true, PSR_c},
426 {"spsr_c", false, PSR_c},
427 {"spsr_ctl", false, PSR_c}
428 };
429
430 /* Functions called by parser. */
431 /* ARM instructions */
432 static void do_arit PARAMS ((char *, unsigned long));
433 static void do_cmp PARAMS ((char *, unsigned long));
434 static void do_mov PARAMS ((char *, unsigned long));
435 static void do_ldst PARAMS ((char *, unsigned long));
436 static void do_ldmstm PARAMS ((char *, unsigned long));
437 static void do_branch PARAMS ((char *, unsigned long));
438 static void do_swi PARAMS ((char *, unsigned long));
439 /* Pseudo Op codes */
440 static void do_adr PARAMS ((char *, unsigned long));
441 static void do_adrl PARAMS ((char *, unsigned long));
442 static void do_nop PARAMS ((char *, unsigned long));
443 /* ARM 2 */
444 static void do_mul PARAMS ((char *, unsigned long));
445 static void do_mla PARAMS ((char *, unsigned long));
446 /* ARM 3 */
447 static void do_swap PARAMS ((char *, unsigned long));
448 /* ARM 6 */
449 static void do_msr PARAMS ((char *, unsigned long));
450 static void do_mrs PARAMS ((char *, unsigned long));
451 /* ARM 7M */
452 static void do_mull PARAMS ((char *, unsigned long));
453 /* ARM THUMB */
454 static void do_bx PARAMS ((char *, unsigned long));
455
456
457 /* Coprocessor Instructions */
458 static void do_cdp PARAMS ((char *, unsigned long));
459 static void do_lstc PARAMS ((char *, unsigned long));
460 static void do_co_reg PARAMS ((char *, unsigned long));
461 static void do_fp_ctrl PARAMS ((char *, unsigned long));
462 static void do_fp_ldst PARAMS ((char *, unsigned long));
463 static void do_fp_ldmstm PARAMS ((char *, unsigned long));
464 static void do_fp_dyadic PARAMS ((char *, unsigned long));
465 static void do_fp_monadic PARAMS ((char *, unsigned long));
466 static void do_fp_cmp PARAMS ((char *, unsigned long));
467 static void do_fp_from_reg PARAMS ((char *, unsigned long));
468 static void do_fp_to_reg PARAMS ((char *, unsigned long));
469
470 static void fix_new_arm PARAMS ((fragS *, int, short, expressionS *, int, int));
471 static int arm_reg_parse PARAMS ((char **));
472 static CONST struct asm_psr * arm_psr_parse PARAMS ((char **));
473 static void symbol_locate PARAMS ((symbolS *, CONST char *, segT, valueT, fragS *));
474 static int add_to_lit_pool PARAMS ((void));
475 static unsigned validate_immediate PARAMS ((unsigned));
476 static unsigned validate_immediate_twopart PARAMS ((unsigned int, unsigned int *));
477 static int validate_offset_imm PARAMS ((unsigned int, int));
478 static void opcode_select PARAMS ((int));
479 static void end_of_line PARAMS ((char *));
480 static int reg_required_here PARAMS ((char **, int));
481 static int psr_required_here PARAMS ((char **));
482 static int co_proc_number PARAMS ((char **));
483 static int cp_opc_expr PARAMS ((char **, int, int));
484 static int cp_reg_required_here PARAMS ((char **, int));
485 static int fp_reg_required_here PARAMS ((char **, int));
486 static int cp_address_offset PARAMS ((char **));
487 static int cp_address_required_here PARAMS ((char **));
488 static int my_get_float_expression PARAMS ((char **));
489 static int skip_past_comma PARAMS ((char **));
490 static int walk_no_bignums PARAMS ((symbolS *));
491 static int negate_data_op PARAMS ((unsigned long *, unsigned long));
492 static int data_op2 PARAMS ((char **));
493 static int fp_op2 PARAMS ((char **));
494 static long reg_list PARAMS ((char **));
495 static void thumb_load_store PARAMS ((char *, int, int));
496 static int decode_shift PARAMS ((char **, int));
497 static int ldst_extend PARAMS ((char **, int));
498 static void thumb_add_sub PARAMS ((char *, int));
499 static void insert_reg PARAMS ((int));
500 static void thumb_shift PARAMS ((char *, int));
501 static void thumb_mov_compare PARAMS ((char *, int));
502 static void set_constant_flonums PARAMS ((void));
503 static valueT md_chars_to_number PARAMS ((char *, int));
504 static void insert_reg_alias PARAMS ((char *, int));
505 static void output_inst PARAMS ((void));
506 #ifdef OBJ_ELF
507 static bfd_reloc_code_real_type arm_parse_reloc PARAMS ((void));
508 #endif
509
510 /* ARM instructions take 4bytes in the object file, Thumb instructions
511 take 2: */
512 #define INSN_SIZE 4
513
514 /* LONGEST_INST is the longest basic instruction name without conditions or
515 flags. ARM7M has 4 of length 5. */
516
517 #define LONGEST_INST 5
518
519
520 struct asm_opcode
521 {
522 CONST char * template; /* Basic string to match */
523 unsigned long value; /* Basic instruction code */
524
525 /* Compulsory suffix that must follow conds. If "", then the
526 instruction is not conditional and must have no suffix. */
527 CONST char * comp_suffix;
528
529 CONST struct asm_flg * flags; /* Bits to toggle if flag 'n' set */
530 unsigned long variants; /* Which CPU variants this exists for */
531 /* Function to call to parse args */
532 void (* parms) PARAMS ((char *, unsigned long));
533 };
534
535 static CONST struct asm_opcode insns[] =
536 {
537 /* ARM Instructions */
538 {"and", 0x00000000, NULL, s_flag, ARM_ANY, do_arit},
539 {"eor", 0x00200000, NULL, s_flag, ARM_ANY, do_arit},
540 {"sub", 0x00400000, NULL, s_flag, ARM_ANY, do_arit},
541 {"rsb", 0x00600000, NULL, s_flag, ARM_ANY, do_arit},
542 {"add", 0x00800000, NULL, s_flag, ARM_ANY, do_arit},
543 {"adc", 0x00a00000, NULL, s_flag, ARM_ANY, do_arit},
544 {"sbc", 0x00c00000, NULL, s_flag, ARM_ANY, do_arit},
545 {"rsc", 0x00e00000, NULL, s_flag, ARM_ANY, do_arit},
546 {"orr", 0x01800000, NULL, s_flag, ARM_ANY, do_arit},
547 {"bic", 0x01c00000, NULL, s_flag, ARM_ANY, do_arit},
548 {"tst", 0x01000000, NULL, cmp_flags, ARM_ANY, do_cmp},
549 {"teq", 0x01200000, NULL, cmp_flags, ARM_ANY, do_cmp},
550 {"cmp", 0x01400000, NULL, cmp_flags, ARM_ANY, do_cmp},
551 {"cmn", 0x01600000, NULL, cmp_flags, ARM_ANY, do_cmp},
552 {"mov", 0x01a00000, NULL, s_flag, ARM_ANY, do_mov},
553 {"mvn", 0x01e00000, NULL, s_flag, ARM_ANY, do_mov},
554 {"str", 0x04000000, NULL, str_flags, ARM_ANY, do_ldst},
555 {"ldr", 0x04100000, NULL, ldr_flags, ARM_ANY, do_ldst},
556 {"stm", 0x08000000, NULL, stm_flags, ARM_ANY, do_ldmstm},
557 {"ldm", 0x08100000, NULL, ldm_flags, ARM_ANY, do_ldmstm},
558 {"swi", 0x0f000000, NULL, NULL, ARM_ANY, do_swi},
559 #ifdef TE_WINCE
560 {"bl", 0x0b000000, NULL, NULL, ARM_ANY, do_branch},
561 {"b", 0x0a000000, NULL, NULL, ARM_ANY, do_branch},
562 #else
563 {"bl", 0x0bfffffe, NULL, NULL, ARM_ANY, do_branch},
564 {"b", 0x0afffffe, NULL, NULL, ARM_ANY, do_branch},
565 #endif
566
567 /* Pseudo ops */
568 {"adr", 0x028f0000, NULL, NULL, ARM_ANY, do_adr},
569 {"adrl", 0x028f0000, NULL, NULL, ARM_ANY, do_adrl},
570 {"nop", 0x01a00000, NULL, NULL, ARM_ANY, do_nop},
571
572 /* ARM 2 multiplies */
573 {"mul", 0x00000090, NULL, s_flag, ARM_2UP, do_mul},
574 {"mla", 0x00200090, NULL, s_flag, ARM_2UP, do_mla},
575
576 /* ARM 3 - swp instructions */
577 {"swp", 0x01000090, NULL, byte_flag, ARM_3UP, do_swap},
578
579 /* ARM 6 Coprocessor instructions */
580 {"mrs", 0x010f0000, NULL, NULL, ARM_6UP, do_mrs},
581 {"msr", 0x0120f000, NULL, NULL, ARM_6UP, do_msr},
582 /* ScottB: our code uses 0x0128f000 for msr.
583 NickC: but this is wrong because the bits 16 through 19 are
584 handled by the PSR_xxx defines above. */
585
586 /* ARM 7M long multiplies - need signed/unsigned flags! */
587 {"smull", 0x00c00090, NULL, s_flag, ARM_LONGMUL, do_mull},
588 {"umull", 0x00800090, NULL, s_flag, ARM_LONGMUL, do_mull},
589 {"smlal", 0x00e00090, NULL, s_flag, ARM_LONGMUL, do_mull},
590 {"umlal", 0x00a00090, NULL, s_flag, ARM_LONGMUL, do_mull},
591
592 /* ARM THUMB interworking */
593 {"bx", 0x012fff10, NULL, NULL, ARM_THUMB, do_bx},
594
595 /* Floating point instructions */
596 {"wfs", 0x0e200110, NULL, NULL, FPU_ALL, do_fp_ctrl},
597 {"rfs", 0x0e300110, NULL, NULL, FPU_ALL, do_fp_ctrl},
598 {"wfc", 0x0e400110, NULL, NULL, FPU_ALL, do_fp_ctrl},
599 {"rfc", 0x0e500110, NULL, NULL, FPU_ALL, do_fp_ctrl},
600 {"ldf", 0x0c100100, "sdep", NULL, FPU_ALL, do_fp_ldst},
601 {"stf", 0x0c000100, "sdep", NULL, FPU_ALL, do_fp_ldst},
602 {"lfm", 0x0c100200, NULL, lfm_flags, FPU_MEMMULTI, do_fp_ldmstm},
603 {"sfm", 0x0c000200, NULL, sfm_flags, FPU_MEMMULTI, do_fp_ldmstm},
604 {"mvf", 0x0e008100, "sde", round_flags, FPU_ALL, do_fp_monadic},
605 {"mnf", 0x0e108100, "sde", round_flags, FPU_ALL, do_fp_monadic},
606 {"abs", 0x0e208100, "sde", round_flags, FPU_ALL, do_fp_monadic},
607 {"rnd", 0x0e308100, "sde", round_flags, FPU_ALL, do_fp_monadic},
608 {"sqt", 0x0e408100, "sde", round_flags, FPU_ALL, do_fp_monadic},
609 {"log", 0x0e508100, "sde", round_flags, FPU_ALL, do_fp_monadic},
610 {"lgn", 0x0e608100, "sde", round_flags, FPU_ALL, do_fp_monadic},
611 {"exp", 0x0e708100, "sde", round_flags, FPU_ALL, do_fp_monadic},
612 {"sin", 0x0e808100, "sde", round_flags, FPU_ALL, do_fp_monadic},
613 {"cos", 0x0e908100, "sde", round_flags, FPU_ALL, do_fp_monadic},
614 {"tan", 0x0ea08100, "sde", round_flags, FPU_ALL, do_fp_monadic},
615 {"asn", 0x0eb08100, "sde", round_flags, FPU_ALL, do_fp_monadic},
616 {"acs", 0x0ec08100, "sde", round_flags, FPU_ALL, do_fp_monadic},
617 {"atn", 0x0ed08100, "sde", round_flags, FPU_ALL, do_fp_monadic},
618 {"urd", 0x0ee08100, "sde", round_flags, FPU_ALL, do_fp_monadic},
619 {"nrm", 0x0ef08100, "sde", round_flags, FPU_ALL, do_fp_monadic},
620 {"adf", 0x0e000100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
621 {"suf", 0x0e200100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
622 {"rsf", 0x0e300100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
623 {"muf", 0x0e100100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
624 {"dvf", 0x0e400100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
625 {"rdf", 0x0e500100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
626 {"pow", 0x0e600100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
627 {"rpw", 0x0e700100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
628 {"rmf", 0x0e800100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
629 {"fml", 0x0e900100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
630 {"fdv", 0x0ea00100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
631 {"frd", 0x0eb00100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
632 {"pol", 0x0ec00100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
633 {"cmf", 0x0e90f110, NULL, except_flag, FPU_ALL, do_fp_cmp},
634 {"cnf", 0x0eb0f110, NULL, except_flag, FPU_ALL, do_fp_cmp},
635 /* The FPA10 data sheet suggests that the 'E' of cmfe/cnfe should not
636 be an optional suffix, but part of the instruction. To be compatible,
637 we accept either. */
638 {"cmfe", 0x0ed0f110, NULL, NULL, FPU_ALL, do_fp_cmp},
639 {"cnfe", 0x0ef0f110, NULL, NULL, FPU_ALL, do_fp_cmp},
640 {"flt", 0x0e000110, "sde", round_flags, FPU_ALL, do_fp_from_reg},
641 {"fix", 0x0e100110, NULL, fix_flags, FPU_ALL, do_fp_to_reg},
642
643 /* Generic copressor instructions. */
644 {"cdp", 0x0e000000, NULL, NULL, ARM_2UP, do_cdp},
645 {"ldc", 0x0c100000, NULL, cplong_flag, ARM_2UP, do_lstc},
646 {"stc", 0x0c000000, NULL, cplong_flag, ARM_2UP, do_lstc},
647 {"mcr", 0x0e000010, NULL, NULL, ARM_2UP, do_co_reg},
648 {"mrc", 0x0e100010, NULL, NULL, ARM_2UP, do_co_reg},
649 };
650
651 /* Defines for various bits that we will want to toggle. */
652 #define INST_IMMEDIATE 0x02000000
653 #define OFFSET_REG 0x02000000
654 #define HWOFFSET_IMM 0x00400000
655 #define SHIFT_BY_REG 0x00000010
656 #define PRE_INDEX 0x01000000
657 #define INDEX_UP 0x00800000
658 #define WRITE_BACK 0x00200000
659 #define LDM_TYPE_2_OR_3 0x00400000
660
661 #define LITERAL_MASK 0xf000f000
662 #define COND_MASK 0xf0000000
663 #define OPCODE_MASK 0xfe1fffff
664 #define DATA_OP_SHIFT 21
665
666 /* Codes to distinguish the arithmetic instructions. */
667 #define OPCODE_AND 0
668 #define OPCODE_EOR 1
669 #define OPCODE_SUB 2
670 #define OPCODE_RSB 3
671 #define OPCODE_ADD 4
672 #define OPCODE_ADC 5
673 #define OPCODE_SBC 6
674 #define OPCODE_RSC 7
675 #define OPCODE_TST 8
676 #define OPCODE_TEQ 9
677 #define OPCODE_CMP 10
678 #define OPCODE_CMN 11
679 #define OPCODE_ORR 12
680 #define OPCODE_MOV 13
681 #define OPCODE_BIC 14
682 #define OPCODE_MVN 15
683
684 static void do_t_nop PARAMS ((char *));
685 static void do_t_arit PARAMS ((char *));
686 static void do_t_add PARAMS ((char *));
687 static void do_t_asr PARAMS ((char *));
688 static void do_t_branch9 PARAMS ((char *));
689 static void do_t_branch12 PARAMS ((char *));
690 static void do_t_branch23 PARAMS ((char *));
691 static void do_t_bx PARAMS ((char *));
692 static void do_t_compare PARAMS ((char *));
693 static void do_t_ldmstm PARAMS ((char *));
694 static void do_t_ldr PARAMS ((char *));
695 static void do_t_ldrb PARAMS ((char *));
696 static void do_t_ldrh PARAMS ((char *));
697 static void do_t_lds PARAMS ((char *));
698 static void do_t_lsl PARAMS ((char *));
699 static void do_t_lsr PARAMS ((char *));
700 static void do_t_mov PARAMS ((char *));
701 static void do_t_push_pop PARAMS ((char *));
702 static void do_t_str PARAMS ((char *));
703 static void do_t_strb PARAMS ((char *));
704 static void do_t_strh PARAMS ((char *));
705 static void do_t_sub PARAMS ((char *));
706 static void do_t_swi PARAMS ((char *));
707 static void do_t_adr PARAMS ((char *));
708
709 #define T_OPCODE_MUL 0x4340
710 #define T_OPCODE_TST 0x4200
711 #define T_OPCODE_CMN 0x42c0
712 #define T_OPCODE_NEG 0x4240
713 #define T_OPCODE_MVN 0x43c0
714
715 #define T_OPCODE_ADD_R3 0x1800
716 #define T_OPCODE_SUB_R3 0x1a00
717 #define T_OPCODE_ADD_HI 0x4400
718 #define T_OPCODE_ADD_ST 0xb000
719 #define T_OPCODE_SUB_ST 0xb080
720 #define T_OPCODE_ADD_SP 0xa800
721 #define T_OPCODE_ADD_PC 0xa000
722 #define T_OPCODE_ADD_I8 0x3000
723 #define T_OPCODE_SUB_I8 0x3800
724 #define T_OPCODE_ADD_I3 0x1c00
725 #define T_OPCODE_SUB_I3 0x1e00
726
727 #define T_OPCODE_ASR_R 0x4100
728 #define T_OPCODE_LSL_R 0x4080
729 #define T_OPCODE_LSR_R 0x40c0
730 #define T_OPCODE_ASR_I 0x1000
731 #define T_OPCODE_LSL_I 0x0000
732 #define T_OPCODE_LSR_I 0x0800
733
734 #define T_OPCODE_MOV_I8 0x2000
735 #define T_OPCODE_CMP_I8 0x2800
736 #define T_OPCODE_CMP_LR 0x4280
737 #define T_OPCODE_MOV_HR 0x4600
738 #define T_OPCODE_CMP_HR 0x4500
739
740 #define T_OPCODE_LDR_PC 0x4800
741 #define T_OPCODE_LDR_SP 0x9800
742 #define T_OPCODE_STR_SP 0x9000
743 #define T_OPCODE_LDR_IW 0x6800
744 #define T_OPCODE_STR_IW 0x6000
745 #define T_OPCODE_LDR_IH 0x8800
746 #define T_OPCODE_STR_IH 0x8000
747 #define T_OPCODE_LDR_IB 0x7800
748 #define T_OPCODE_STR_IB 0x7000
749 #define T_OPCODE_LDR_RW 0x5800
750 #define T_OPCODE_STR_RW 0x5000
751 #define T_OPCODE_LDR_RH 0x5a00
752 #define T_OPCODE_STR_RH 0x5200
753 #define T_OPCODE_LDR_RB 0x5c00
754 #define T_OPCODE_STR_RB 0x5400
755
756 #define T_OPCODE_PUSH 0xb400
757 #define T_OPCODE_POP 0xbc00
758
759 #define T_OPCODE_BRANCH 0xe7fe
760
761 static int thumb_reg PARAMS ((char ** str, int hi_lo));
762
763 #define THUMB_SIZE 2 /* Size of thumb instruction. */
764 #define THUMB_REG_LO 0x1
765 #define THUMB_REG_HI 0x2
766 #define THUMB_REG_ANY 0x3
767
768 #define THUMB_H1 0x0080
769 #define THUMB_H2 0x0040
770
771 #define THUMB_ASR 0
772 #define THUMB_LSL 1
773 #define THUMB_LSR 2
774
775 #define THUMB_MOVE 0
776 #define THUMB_COMPARE 1
777
778 #define THUMB_LOAD 0
779 #define THUMB_STORE 1
780
781 #define THUMB_PP_PC_LR 0x0100
782
783 /* These three are used for immediate shifts, do not alter. */
784 #define THUMB_WORD 2
785 #define THUMB_HALFWORD 1
786 #define THUMB_BYTE 0
787
788 struct thumb_opcode
789 {
790 CONST char * template; /* Basic string to match */
791 unsigned long value; /* Basic instruction code */
792 int size;
793 unsigned long variants; /* Which CPU variants this exists for */
794 void (* parms) PARAMS ((char *)); /* Function to call to parse args */
795 };
796
797 static CONST struct thumb_opcode tinsns[] =
798 {
799 {"adc", 0x4140, 2, ARM_THUMB, do_t_arit},
800 {"add", 0x0000, 2, ARM_THUMB, do_t_add},
801 {"and", 0x4000, 2, ARM_THUMB, do_t_arit},
802 {"asr", 0x0000, 2, ARM_THUMB, do_t_asr},
803 {"b", T_OPCODE_BRANCH, 2, ARM_THUMB, do_t_branch12},
804 {"beq", 0xd0fe, 2, ARM_THUMB, do_t_branch9},
805 {"bne", 0xd1fe, 2, ARM_THUMB, do_t_branch9},
806 {"bcs", 0xd2fe, 2, ARM_THUMB, do_t_branch9},
807 {"bhs", 0xd2fe, 2, ARM_THUMB, do_t_branch9},
808 {"bcc", 0xd3fe, 2, ARM_THUMB, do_t_branch9},
809 {"bul", 0xd3fe, 2, ARM_THUMB, do_t_branch9},
810 {"blo", 0xd3fe, 2, ARM_THUMB, do_t_branch9},
811 {"bmi", 0xd4fe, 2, ARM_THUMB, do_t_branch9},
812 {"bpl", 0xd5fe, 2, ARM_THUMB, do_t_branch9},
813 {"bvs", 0xd6fe, 2, ARM_THUMB, do_t_branch9},
814 {"bvc", 0xd7fe, 2, ARM_THUMB, do_t_branch9},
815 {"bhi", 0xd8fe, 2, ARM_THUMB, do_t_branch9},
816 {"bls", 0xd9fe, 2, ARM_THUMB, do_t_branch9},
817 {"bge", 0xdafe, 2, ARM_THUMB, do_t_branch9},
818 {"blt", 0xdbfe, 2, ARM_THUMB, do_t_branch9},
819 {"bgt", 0xdcfe, 2, ARM_THUMB, do_t_branch9},
820 {"ble", 0xddfe, 2, ARM_THUMB, do_t_branch9},
821 {"bal", 0xdefe, 2, ARM_THUMB, do_t_branch9},
822 {"bic", 0x4380, 2, ARM_THUMB, do_t_arit},
823 {"bl", 0xf7fffffe, 4, ARM_THUMB, do_t_branch23},
824 {"bx", 0x4700, 2, ARM_THUMB, do_t_bx},
825 {"cmn", T_OPCODE_CMN, 2, ARM_THUMB, do_t_arit},
826 {"cmp", 0x0000, 2, ARM_THUMB, do_t_compare},
827 {"eor", 0x4040, 2, ARM_THUMB, do_t_arit},
828 {"ldmia", 0xc800, 2, ARM_THUMB, do_t_ldmstm},
829 {"ldr", 0x0000, 2, ARM_THUMB, do_t_ldr},
830 {"ldrb", 0x0000, 2, ARM_THUMB, do_t_ldrb},
831 {"ldrh", 0x0000, 2, ARM_THUMB, do_t_ldrh},
832 {"ldrsb", 0x5600, 2, ARM_THUMB, do_t_lds},
833 {"ldrsh", 0x5e00, 2, ARM_THUMB, do_t_lds},
834 {"ldsb", 0x5600, 2, ARM_THUMB, do_t_lds},
835 {"ldsh", 0x5e00, 2, ARM_THUMB, do_t_lds},
836 {"lsl", 0x0000, 2, ARM_THUMB, do_t_lsl},
837 {"lsr", 0x0000, 2, ARM_THUMB, do_t_lsr},
838 {"mov", 0x0000, 2, ARM_THUMB, do_t_mov},
839 {"mul", T_OPCODE_MUL, 2, ARM_THUMB, do_t_arit},
840 {"mvn", T_OPCODE_MVN, 2, ARM_THUMB, do_t_arit},
841 {"neg", T_OPCODE_NEG, 2, ARM_THUMB, do_t_arit},
842 {"orr", 0x4300, 2, ARM_THUMB, do_t_arit},
843 {"pop", 0xbc00, 2, ARM_THUMB, do_t_push_pop},
844 {"push", 0xb400, 2, ARM_THUMB, do_t_push_pop},
845 {"ror", 0x41c0, 2, ARM_THUMB, do_t_arit},
846 {"sbc", 0x4180, 2, ARM_THUMB, do_t_arit},
847 {"stmia", 0xc000, 2, ARM_THUMB, do_t_ldmstm},
848 {"str", 0x0000, 2, ARM_THUMB, do_t_str},
849 {"strb", 0x0000, 2, ARM_THUMB, do_t_strb},
850 {"strh", 0x0000, 2, ARM_THUMB, do_t_strh},
851 {"swi", 0xdf00, 2, ARM_THUMB, do_t_swi},
852 {"sub", 0x0000, 2, ARM_THUMB, do_t_sub},
853 {"tst", T_OPCODE_TST, 2, ARM_THUMB, do_t_arit},
854 /* Pseudo ops: */
855 {"adr", 0x0000, 2, ARM_THUMB, do_t_adr},
856 {"nop", 0x46C0, 2, ARM_THUMB, do_t_nop}, /* mov r8,r8 */
857 };
858
859 struct reg_entry
860 {
861 CONST char * name;
862 int number;
863 };
864
865 #define int_register(reg) ((reg) >= 0 && (reg) <= 15)
866 #define cp_register(reg) ((reg) >= 32 && (reg) <= 47)
867 #define fp_register(reg) ((reg) >= 16 && (reg) <= 23)
868
869 #define REG_PC 15
870 #define REG_LR 14
871 #define REG_SP 13
872
873 /* These are the standard names. Users can add aliases with .req */
874 static CONST struct reg_entry reg_table[] =
875 {
876 /* Processor Register Numbers. */
877 {"r0", 0}, {"r1", 1}, {"r2", 2}, {"r3", 3},
878 {"r4", 4}, {"r5", 5}, {"r6", 6}, {"r7", 7},
879 {"r8", 8}, {"r9", 9}, {"r10", 10}, {"r11", 11},
880 {"r12", 12}, {"r13", REG_SP},{"r14", REG_LR},{"r15", REG_PC},
881 /* APCS conventions. */
882 {"a1", 0}, {"a2", 1}, {"a3", 2}, {"a4", 3},
883 {"v1", 4}, {"v2", 5}, {"v3", 6}, {"v4", 7}, {"v5", 8},
884 {"v6", 9}, {"sb", 9}, {"v7", 10}, {"sl", 10},
885 {"fp", 11}, {"ip", 12}, {"sp", REG_SP},{"lr", REG_LR},{"pc", REG_PC},
886 /* ATPCS additions to APCS conventions. */
887 {"wr", 7}, {"v8", 11},
888 /* FP Registers. */
889 {"f0", 16}, {"f1", 17}, {"f2", 18}, {"f3", 19},
890 {"f4", 20}, {"f5", 21}, {"f6", 22}, {"f7", 23},
891 {"c0", 32}, {"c1", 33}, {"c2", 34}, {"c3", 35},
892 {"c4", 36}, {"c5", 37}, {"c6", 38}, {"c7", 39},
893 {"c8", 40}, {"c9", 41}, {"c10", 42}, {"c11", 43},
894 {"c12", 44}, {"c13", 45}, {"c14", 46}, {"c15", 47},
895 {"cr0", 32}, {"cr1", 33}, {"cr2", 34}, {"cr3", 35},
896 {"cr4", 36}, {"cr5", 37}, {"cr6", 38}, {"cr7", 39},
897 {"cr8", 40}, {"cr9", 41}, {"cr10", 42}, {"cr11", 43},
898 {"cr12", 44}, {"cr13", 45}, {"cr14", 46}, {"cr15", 47},
899 /* ATPCS additions to float register names. */
900 {"s0",16}, {"s1",17}, {"s2",18}, {"s3",19},
901 {"s4",20}, {"s5",21}, {"s6",22}, {"s7",23},
902 {"d0",16}, {"d1",17}, {"d2",18}, {"d3",19},
903 {"d4",20}, {"d5",21}, {"d6",22}, {"d7",23},
904 /* FIXME: At some point we need to add VFP register names. */
905 /* Array terminator. */
906 {NULL, 0}
907 };
908
909 #define BAD_ARGS _("Bad arguments to instruction")
910 #define BAD_PC _("r15 not allowed here")
911 #define BAD_FLAGS _("Instruction should not have flags")
912 #define BAD_COND _("Instruction is not conditional")
913
914 static struct hash_control * arm_ops_hsh = NULL;
915 static struct hash_control * arm_tops_hsh = NULL;
916 static struct hash_control * arm_cond_hsh = NULL;
917 static struct hash_control * arm_shift_hsh = NULL;
918 static struct hash_control * arm_reg_hsh = NULL;
919 static struct hash_control * arm_psr_hsh = NULL;
920
921 /* This table describes all the machine specific pseudo-ops the assembler
922 has to support. The fields are:
923 pseudo-op name without dot
924 function to call to execute this pseudo-op
925 Integer arg to pass to the function. */
926
927 static void s_req PARAMS ((int));
928 static void s_align PARAMS ((int));
929 static void s_bss PARAMS ((int));
930 static void s_even PARAMS ((int));
931 static void s_ltorg PARAMS ((int));
932 static void s_arm PARAMS ((int));
933 static void s_thumb PARAMS ((int));
934 static void s_code PARAMS ((int));
935 static void s_force_thumb PARAMS ((int));
936 static void s_thumb_func PARAMS ((int));
937 static void s_thumb_set PARAMS ((int));
938 static void arm_s_text PARAMS ((int));
939 static void arm_s_data PARAMS ((int));
940 #ifdef OBJ_ELF
941 static void arm_s_section PARAMS ((int));
942 static void s_arm_elf_cons PARAMS ((int));
943 #endif
944
945 static int my_get_expression PARAMS ((expressionS *, char **));
946
947 CONST pseudo_typeS md_pseudo_table[] =
948 {
949 { "req", s_req, 0 }, /* Never called becasue '.req' does not start line */
950 { "bss", s_bss, 0 },
951 { "align", s_align, 0 },
952 { "arm", s_arm, 0 },
953 { "thumb", s_thumb, 0 },
954 { "code", s_code, 0 },
955 { "force_thumb", s_force_thumb, 0 },
956 { "thumb_func", s_thumb_func, 0 },
957 { "thumb_set", s_thumb_set, 0 },
958 { "even", s_even, 0 },
959 { "ltorg", s_ltorg, 0 },
960 { "pool", s_ltorg, 0 },
961 /* Allow for the effect of section changes. */
962 { "text", arm_s_text, 0 },
963 { "data", arm_s_data, 0 },
964 #ifdef OBJ_ELF
965 { "section", arm_s_section, 0 },
966 { "section.s", arm_s_section, 0 },
967 { "sect", arm_s_section, 0 },
968 { "sect.s", arm_s_section, 0 },
969 { "word", s_arm_elf_cons, 4 },
970 { "long", s_arm_elf_cons, 4 },
971 #else
972 { "word", cons, 4},
973 #endif
974 { "extend", float_cons, 'x' },
975 { "ldouble", float_cons, 'x' },
976 { "packed", float_cons, 'p' },
977 { 0, 0, 0 }
978 };
979
980 /* Stuff needed to resolve the label ambiguity
981 As:
982 ...
983 label: <insn>
984 may differ from:
985 ...
986 label:
987 <insn>
988 */
989
990 symbolS * last_label_seen;
991 static int label_is_thumb_function_name = false;
992
993 /* Literal stuff */
994
995 #define MAX_LITERAL_POOL_SIZE 1024
996
997 typedef struct literalS
998 {
999 struct expressionS exp;
1000 struct arm_it * inst;
1001 } literalT;
1002
1003 literalT literals[MAX_LITERAL_POOL_SIZE];
1004 int next_literal_pool_place = 0; /* Next free entry in the pool */
1005 int lit_pool_num = 1; /* Next literal pool number */
1006 symbolS * current_poolP = NULL;
1007
1008 static int
1009 add_to_lit_pool ()
1010 {
1011 int lit_count = 0;
1012
1013 if (current_poolP == NULL)
1014 current_poolP = symbol_create (FAKE_LABEL_NAME, undefined_section,
1015 (valueT) 0, &zero_address_frag);
1016
1017 /* Check if this literal value is already in the pool: */
1018 while (lit_count < next_literal_pool_place)
1019 {
1020 if (literals[lit_count].exp.X_op == inst.reloc.exp.X_op
1021 && inst.reloc.exp.X_op == O_constant
1022 && literals[lit_count].exp.X_add_number
1023 == inst.reloc.exp.X_add_number
1024 && literals[lit_count].exp.X_unsigned == inst.reloc.exp.X_unsigned)
1025 break;
1026 lit_count++;
1027 }
1028
1029 if (lit_count == next_literal_pool_place) /* new entry */
1030 {
1031 if (next_literal_pool_place > MAX_LITERAL_POOL_SIZE)
1032 {
1033 inst.error = _("Literal Pool Overflow");
1034 return FAIL;
1035 }
1036
1037 literals[next_literal_pool_place].exp = inst.reloc.exp;
1038 lit_count = next_literal_pool_place++;
1039 }
1040
1041 inst.reloc.exp.X_op = O_symbol;
1042 inst.reloc.exp.X_add_number = (lit_count) * 4 - 8;
1043 inst.reloc.exp.X_add_symbol = current_poolP;
1044
1045 return SUCCESS;
1046 }
1047
1048 /* Can't use symbol_new here, so have to create a symbol and then at
1049 a later date assign it a value. Thats what these functions do. */
1050 static void
1051 symbol_locate (symbolP, name, segment, valu, frag)
1052 symbolS * symbolP;
1053 CONST char * name; /* It is copied, the caller can modify */
1054 segT segment; /* Segment identifier (SEG_<something>) */
1055 valueT valu; /* Symbol value */
1056 fragS * frag; /* Associated fragment */
1057 {
1058 unsigned int name_length;
1059 char * preserved_copy_of_name;
1060
1061 name_length = strlen (name) + 1; /* +1 for \0 */
1062 obstack_grow (&notes, name, name_length);
1063 preserved_copy_of_name = obstack_finish (&notes);
1064 #ifdef STRIP_UNDERSCORE
1065 if (preserved_copy_of_name[0] == '_')
1066 preserved_copy_of_name++;
1067 #endif
1068
1069 #ifdef tc_canonicalize_symbol_name
1070 preserved_copy_of_name =
1071 tc_canonicalize_symbol_name (preserved_copy_of_name);
1072 #endif
1073
1074 S_SET_NAME (symbolP, preserved_copy_of_name);
1075
1076 S_SET_SEGMENT (symbolP, segment);
1077 S_SET_VALUE (symbolP, valu);
1078 symbol_clear_list_pointers(symbolP);
1079
1080 symbol_set_frag (symbolP, frag);
1081
1082 /* Link to end of symbol chain. */
1083 {
1084 extern int symbol_table_frozen;
1085 if (symbol_table_frozen)
1086 abort ();
1087 }
1088
1089 symbol_append (symbolP, symbol_lastP, & symbol_rootP, & symbol_lastP);
1090
1091 obj_symbol_new_hook (symbolP);
1092
1093 #ifdef tc_symbol_new_hook
1094 tc_symbol_new_hook (symbolP);
1095 #endif
1096
1097 #ifdef DEBUG_SYMS
1098 verify_symbol_chain (symbol_rootP, symbol_lastP);
1099 #endif /* DEBUG_SYMS */
1100 }
1101
1102 /* Check that an immediate is valid, and if so,
1103 convert it to the right format. */
1104 static unsigned int
1105 validate_immediate (val)
1106 unsigned int val;
1107 {
1108 unsigned int a;
1109 unsigned int i;
1110
1111 #define rotate_left(v, n) (v << n | v >> (32 - n))
1112
1113 for (i = 0; i < 32; i += 2)
1114 if ((a = rotate_left (val, i)) <= 0xff)
1115 return a | (i << 7); /* 12-bit pack: [shift-cnt,const] */
1116
1117 return FAIL;
1118 }
1119
1120 /* Check to see if an immediate can be computed as two seperate immediate
1121 values, added together. We already know that this value cannot be
1122 computed by just one ARM instruction. */
1123 static unsigned int
1124 validate_immediate_twopart (val, highpart)
1125 unsigned int val;
1126 unsigned int * highpart;
1127 {
1128 unsigned int a;
1129 unsigned int i;
1130
1131 for (i = 0; i < 32; i += 2)
1132 if (((a = rotate_left (val, i)) & 0xff) != 0)
1133 {
1134 if (a & 0xff00)
1135 {
1136 if (a & ~ 0xffff)
1137 continue;
1138 * highpart = (a >> 8) | ((i + 24) << 7);
1139 }
1140 else if (a & 0xff0000)
1141 {
1142 if (a & 0xff000000)
1143 continue;
1144
1145 * highpart = (a >> 16) | ((i + 16) << 7);
1146 }
1147 else
1148 {
1149 assert (a & 0xff000000);
1150
1151 * highpart = (a >> 24) | ((i + 8) << 7);
1152 }
1153
1154 return (a & 0xff) | (i << 7);
1155 }
1156
1157 return FAIL;
1158 }
1159
1160 static int
1161 validate_offset_imm (val, hwse)
1162 unsigned int val;
1163 int hwse;
1164 {
1165 if ((hwse && val > 255) || val > 4095)
1166 return FAIL;
1167 return val;
1168 }
1169
1170
1171 static void
1172 s_req (a)
1173 int a ATTRIBUTE_UNUSED;
1174 {
1175 as_bad (_("Invalid syntax for .req directive."));
1176 }
1177
1178 static void
1179 s_bss (ignore)
1180 int ignore ATTRIBUTE_UNUSED;
1181 {
1182 /* We don't support putting frags in the BSS segment, we fake it by
1183 marking in_bss, then looking at s_skip for clues?.. */
1184 subseg_set (bss_section, 0);
1185 demand_empty_rest_of_line ();
1186 }
1187
1188 static void
1189 s_even (ignore)
1190 int ignore ATTRIBUTE_UNUSED;
1191 {
1192 if (!need_pass_2) /* Never make frag if expect extra pass. */
1193 frag_align (1, 0, 0);
1194
1195 record_alignment (now_seg, 1);
1196
1197 demand_empty_rest_of_line ();
1198 }
1199
1200 static void
1201 s_ltorg (ignored)
1202 int ignored ATTRIBUTE_UNUSED;
1203 {
1204 int lit_count = 0;
1205 char sym_name[20];
1206
1207 if (current_poolP == NULL)
1208 return;
1209
1210 /* Align pool as you have word accesses */
1211 /* Only make a frag if we have to ... */
1212 if (!need_pass_2)
1213 frag_align (2, 0, 0);
1214
1215 record_alignment (now_seg, 2);
1216
1217 sprintf (sym_name, "$$lit_\002%x", lit_pool_num++);
1218
1219 symbol_locate (current_poolP, sym_name, now_seg,
1220 (valueT) frag_now_fix (), frag_now);
1221 symbol_table_insert (current_poolP);
1222
1223 ARM_SET_THUMB (current_poolP, thumb_mode);
1224
1225 #if defined OBJ_COFF || defined OBJ_ELF
1226 ARM_SET_INTERWORK (current_poolP, support_interwork);
1227 #endif
1228
1229 while (lit_count < next_literal_pool_place)
1230 /* First output the expression in the instruction to the pool. */
1231 emit_expr (&(literals[lit_count++].exp), 4); /* .word */
1232
1233 next_literal_pool_place = 0;
1234 current_poolP = NULL;
1235 }
1236
1237 static void
1238 s_align (unused) /* Same as s_align_ptwo but align 0 => align 2 */
1239 int unused ATTRIBUTE_UNUSED;
1240 {
1241 register int temp;
1242 register long temp_fill;
1243 long max_alignment = 15;
1244
1245 temp = get_absolute_expression ();
1246 if (temp > max_alignment)
1247 as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
1248 else if (temp < 0)
1249 {
1250 as_bad (_("Alignment negative. 0 assumed."));
1251 temp = 0;
1252 }
1253
1254 if (*input_line_pointer == ',')
1255 {
1256 input_line_pointer++;
1257 temp_fill = get_absolute_expression ();
1258 }
1259 else
1260 temp_fill = 0;
1261
1262 if (!temp)
1263 temp = 2;
1264
1265 /* Only make a frag if we HAVE to. . . */
1266 if (temp && !need_pass_2)
1267 frag_align (temp, (int) temp_fill, 0);
1268 demand_empty_rest_of_line ();
1269
1270 record_alignment (now_seg, temp);
1271 }
1272
1273 static void
1274 s_force_thumb (ignore)
1275 int ignore ATTRIBUTE_UNUSED;
1276 {
1277 /* If we are not already in thumb mode go into it, EVEN if
1278 the target processor does not support thumb instructions.
1279 This is used by gcc/config/arm/lib1funcs.asm for example
1280 to compile interworking support functions even if the
1281 target processor should not support interworking. */
1282
1283 if (! thumb_mode)
1284 {
1285 thumb_mode = 2;
1286
1287 record_alignment (now_seg, 1);
1288 }
1289
1290 demand_empty_rest_of_line ();
1291 }
1292
1293 static void
1294 s_thumb_func (ignore)
1295 int ignore ATTRIBUTE_UNUSED;
1296 {
1297 /* The following label is the name/address of the start of a Thumb function.
1298 We need to know this for the interworking support. */
1299
1300 label_is_thumb_function_name = true;
1301
1302 demand_empty_rest_of_line ();
1303 }
1304
1305 /* Perform a .set directive, but also mark the alias as
1306 being a thumb function. */
1307
1308 static void
1309 s_thumb_set (equiv)
1310 int equiv;
1311 {
1312 /* XXX the following is a duplicate of the code for s_set() in read.c
1313 We cannot just call that code as we need to get at the symbol that
1314 is created. */
1315 register char * name;
1316 register char delim;
1317 register char * end_name;
1318 register symbolS * symbolP;
1319
1320 /*
1321 * Especial apologies for the random logic:
1322 * this just grew, and could be parsed much more simply!
1323 * Dean in haste.
1324 */
1325 name = input_line_pointer;
1326 delim = get_symbol_end ();
1327 end_name = input_line_pointer;
1328 *end_name = delim;
1329
1330 SKIP_WHITESPACE ();
1331
1332 if (*input_line_pointer != ',')
1333 {
1334 *end_name = 0;
1335 as_bad (_("Expected comma after name \"%s\""), name);
1336 *end_name = delim;
1337 ignore_rest_of_line ();
1338 return;
1339 }
1340
1341 input_line_pointer++;
1342 *end_name = 0;
1343
1344 if (name[0] == '.' && name[1] == '\0')
1345 {
1346 /* XXX - this should not happen to .thumb_set */
1347 abort ();
1348 }
1349
1350 if ((symbolP = symbol_find (name)) == NULL
1351 && (symbolP = md_undefined_symbol (name)) == NULL)
1352 {
1353 #ifndef NO_LISTING
1354 /* When doing symbol listings, play games with dummy fragments living
1355 outside the normal fragment chain to record the file and line info
1356 for this symbol. */
1357 if (listing & LISTING_SYMBOLS)
1358 {
1359 extern struct list_info_struct * listing_tail;
1360 fragS * dummy_frag = (fragS *) xmalloc (sizeof(fragS));
1361 memset (dummy_frag, 0, sizeof(fragS));
1362 dummy_frag->fr_type = rs_fill;
1363 dummy_frag->line = listing_tail;
1364 symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
1365 dummy_frag->fr_symbol = symbolP;
1366 }
1367 else
1368 #endif
1369 symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
1370
1371 #ifdef OBJ_COFF
1372 /* "set" symbols are local unless otherwise specified. */
1373 SF_SET_LOCAL (symbolP);
1374 #endif /* OBJ_COFF */
1375 } /* make a new symbol */
1376
1377 symbol_table_insert (symbolP);
1378
1379 * end_name = delim;
1380
1381 if (equiv
1382 && S_IS_DEFINED (symbolP)
1383 && S_GET_SEGMENT (symbolP) != reg_section)
1384 as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
1385
1386 pseudo_set (symbolP);
1387
1388 demand_empty_rest_of_line ();
1389
1390 /* XXX Now we come to the Thumb specific bit of code. */
1391
1392 THUMB_SET_FUNC (symbolP, 1);
1393 ARM_SET_THUMB (symbolP, 1);
1394 #if defined OBJ_ELF || defined OBJ_COFF
1395 ARM_SET_INTERWORK (symbolP, support_interwork);
1396 #endif
1397 }
1398
1399 /* If we change section we must dump the literal pool first. */
1400 static void
1401 arm_s_text (ignore)
1402 int ignore;
1403 {
1404 if (now_seg != text_section)
1405 s_ltorg (0);
1406
1407 #ifdef OBJ_ELF
1408 obj_elf_text (ignore);
1409 #else
1410 s_text (ignore);
1411 #endif
1412 }
1413
1414 static void
1415 arm_s_data (ignore)
1416 int ignore;
1417 {
1418 if (flag_readonly_data_in_text)
1419 {
1420 if (now_seg != text_section)
1421 s_ltorg (0);
1422 }
1423 else if (now_seg != data_section)
1424 s_ltorg (0);
1425
1426 #ifdef OBJ_ELF
1427 obj_elf_data (ignore);
1428 #else
1429 s_data (ignore);
1430 #endif
1431 }
1432
1433 #ifdef OBJ_ELF
1434 static void
1435 arm_s_section (ignore)
1436 int ignore;
1437 {
1438 s_ltorg (0);
1439
1440 obj_elf_section (ignore);
1441 }
1442 #endif
1443
1444 static void
1445 opcode_select (width)
1446 int width;
1447 {
1448 switch (width)
1449 {
1450 case 16:
1451 if (! thumb_mode)
1452 {
1453 if (! (cpu_variant & ARM_THUMB))
1454 as_bad (_("selected processor does not support THUMB opcodes"));
1455 thumb_mode = 1;
1456 /* No need to force the alignment, since we will have been
1457 coming from ARM mode, which is word-aligned. */
1458 record_alignment (now_seg, 1);
1459 }
1460 break;
1461
1462 case 32:
1463 if (thumb_mode)
1464 {
1465 if ((cpu_variant & ARM_ANY) == ARM_THUMB)
1466 as_bad (_("selected processor does not support ARM opcodes"));
1467 thumb_mode = 0;
1468 if (!need_pass_2)
1469 frag_align (2, 0, 0);
1470 record_alignment (now_seg, 1);
1471 }
1472 break;
1473
1474 default:
1475 as_bad (_("invalid instruction size selected (%d)"), width);
1476 }
1477 }
1478
1479 static void
1480 s_arm (ignore)
1481 int ignore ATTRIBUTE_UNUSED;
1482 {
1483 opcode_select (32);
1484 demand_empty_rest_of_line ();
1485 }
1486
1487 static void
1488 s_thumb (ignore)
1489 int ignore ATTRIBUTE_UNUSED;
1490 {
1491 opcode_select (16);
1492 demand_empty_rest_of_line ();
1493 }
1494
1495 static void
1496 s_code (unused)
1497 int unused ATTRIBUTE_UNUSED;
1498 {
1499 register int temp;
1500
1501 temp = get_absolute_expression ();
1502 switch (temp)
1503 {
1504 case 16:
1505 case 32:
1506 opcode_select (temp);
1507 break;
1508
1509 default:
1510 as_bad (_("invalid operand to .code directive (%d) (expecting 16 or 32)"), temp);
1511 }
1512 }
1513
1514 static void
1515 end_of_line (str)
1516 char * str;
1517 {
1518 skip_whitespace (str);
1519
1520 if (* str != '\0')
1521 inst.error = _("Garbage following instruction");
1522 }
1523
1524 static int
1525 skip_past_comma (str)
1526 char ** str;
1527 {
1528 char *p = *str, c;
1529 int comma = 0;
1530
1531 while ((c = *p) == ' ' || c == ',')
1532 {
1533 p++;
1534 if (c == ',' && comma++)
1535 return FAIL;
1536 }
1537
1538 if (c == '\0')
1539 return FAIL;
1540
1541 *str = p;
1542 return comma ? SUCCESS : FAIL;
1543 }
1544
1545 /* A standard register must be given at this point.
1546 Shift is the place to put it in inst.instruction.
1547 Restores input start point on err.
1548 Returns the reg#, or FAIL. */
1549 static int
1550 reg_required_here (str, shift)
1551 char ** str;
1552 int shift;
1553 {
1554 static char buff [128]; /* XXX */
1555 int reg;
1556 char * start = *str;
1557
1558 if ((reg = arm_reg_parse (str)) != FAIL && int_register (reg))
1559 {
1560 if (shift >= 0)
1561 inst.instruction |= reg << shift;
1562 return reg;
1563 }
1564
1565 /* Restore the start point, we may have got a reg of the wrong class. */
1566 *str = start;
1567
1568 /* In the few cases where we might be able to accept something else
1569 this error can be overridden. */
1570 sprintf (buff, _("Register expected, not '%.100s'"), start);
1571 inst.error = buff;
1572
1573 return FAIL;
1574 }
1575
1576 static CONST struct asm_psr *
1577 arm_psr_parse (ccp)
1578 register char ** ccp;
1579 {
1580 char * start = * ccp;
1581 char c;
1582 char * p;
1583 CONST struct asm_psr * psr;
1584
1585 p = start;
1586
1587 /* Skip to the end of the next word in the input stream. */
1588 do
1589 {
1590 c = *p++;
1591 }
1592 while (isalpha (c) || c == '_');
1593
1594 /* Terminate the word. */
1595 *--p = 0;
1596
1597 /* Now locate the word in the psr hash table. */
1598 psr = (CONST struct asm_psr *) hash_find (arm_psr_hsh, start);
1599
1600 /* Restore the input stream. */
1601 *p = c;
1602
1603 /* If we found a valid match, advance the
1604 stream pointer past the end of the word. */
1605 *ccp = p;
1606
1607 return psr;
1608 }
1609
1610 /* Parse the input looking for a PSR flag. */
1611 static int
1612 psr_required_here (str)
1613 char ** str;
1614 {
1615 char * start = *str;
1616 CONST struct asm_psr * psr;
1617
1618 psr = arm_psr_parse (str);
1619
1620 if (psr)
1621 {
1622 /* If this is the SPSR that is being modified, set the R bit. */
1623 if (! psr->cpsr)
1624 inst.instruction |= SPSR_BIT;
1625
1626 /* Set the psr flags in the MSR instruction. */
1627 inst.instruction |= psr->field << PSR_SHIFT;
1628
1629 return SUCCESS;
1630 }
1631
1632 /* In the few cases where we might be able to accept
1633 something else this error can be overridden. */
1634 inst.error = _("flag for {c}psr instruction expected");
1635
1636 /* Restore the start point. */
1637 *str = start;
1638 return FAIL;
1639 }
1640
1641 static int
1642 co_proc_number (str)
1643 char ** str;
1644 {
1645 int processor, pchar;
1646
1647 skip_whitespace (* str);
1648
1649 /* The data sheet seems to imply that just a number on its own is valid
1650 here, but the RISC iX assembler seems to accept a prefix 'p'. We will
1651 accept either. */
1652 if (**str == 'p' || **str == 'P')
1653 (*str)++;
1654
1655 pchar = *(*str)++;
1656 if (pchar >= '0' && pchar <= '9')
1657 {
1658 processor = pchar - '0';
1659 if (**str >= '0' && **str <= '9')
1660 {
1661 processor = processor * 10 + *(*str)++ - '0';
1662 if (processor > 15)
1663 {
1664 inst.error = _("Illegal co-processor number");
1665 return FAIL;
1666 }
1667 }
1668 }
1669 else
1670 {
1671 inst.error = _("Bad or missing co-processor number");
1672 return FAIL;
1673 }
1674
1675 inst.instruction |= processor << 8;
1676 return SUCCESS;
1677 }
1678
1679 static int
1680 cp_opc_expr (str, where, length)
1681 char ** str;
1682 int where;
1683 int length;
1684 {
1685 expressionS expr;
1686
1687 skip_whitespace (* str);
1688
1689 memset (&expr, '\0', sizeof (expr));
1690
1691 if (my_get_expression (&expr, str))
1692 return FAIL;
1693 if (expr.X_op != O_constant)
1694 {
1695 inst.error = _("bad or missing expression");
1696 return FAIL;
1697 }
1698
1699 if ((expr.X_add_number & ((1 << length) - 1)) != expr.X_add_number)
1700 {
1701 inst.error = _("immediate co-processor expression too large");
1702 return FAIL;
1703 }
1704
1705 inst.instruction |= expr.X_add_number << where;
1706 return SUCCESS;
1707 }
1708
1709 static int
1710 cp_reg_required_here (str, where)
1711 char ** str;
1712 int where;
1713 {
1714 int reg;
1715 char * start = *str;
1716
1717 if ((reg = arm_reg_parse (str)) != FAIL && cp_register (reg))
1718 {
1719 reg &= 15;
1720 inst.instruction |= reg << where;
1721 return reg;
1722 }
1723
1724 /* In the few cases where we might be able to accept something else
1725 this error can be overridden. */
1726 inst.error = _("Co-processor register expected");
1727
1728 /* Restore the start point. */
1729 *str = start;
1730 return FAIL;
1731 }
1732
1733 static int
1734 fp_reg_required_here (str, where)
1735 char ** str;
1736 int where;
1737 {
1738 int reg;
1739 char * start = *str;
1740
1741 if ((reg = arm_reg_parse (str)) != FAIL && fp_register (reg))
1742 {
1743 reg &= 7;
1744 inst.instruction |= reg << where;
1745 return reg;
1746 }
1747
1748 /* In the few cases where we might be able to accept something else
1749 this error can be overridden. */
1750 inst.error = _("Floating point register expected");
1751
1752 /* Restore the start point. */
1753 *str = start;
1754 return FAIL;
1755 }
1756
1757 static int
1758 cp_address_offset (str)
1759 char ** str;
1760 {
1761 int offset;
1762
1763 skip_whitespace (* str);
1764
1765 if (! is_immediate_prefix (**str))
1766 {
1767 inst.error = _("immediate expression expected");
1768 return FAIL;
1769 }
1770
1771 (*str)++;
1772
1773 if (my_get_expression (& inst.reloc.exp, str))
1774 return FAIL;
1775
1776 if (inst.reloc.exp.X_op == O_constant)
1777 {
1778 offset = inst.reloc.exp.X_add_number;
1779
1780 if (offset & 3)
1781 {
1782 inst.error = _("co-processor address must be word aligned");
1783 return FAIL;
1784 }
1785
1786 if (offset > 1023 || offset < -1023)
1787 {
1788 inst.error = _("offset too large");
1789 return FAIL;
1790 }
1791
1792 if (offset >= 0)
1793 inst.instruction |= INDEX_UP;
1794 else
1795 offset = -offset;
1796
1797 inst.instruction |= offset >> 2;
1798 }
1799 else
1800 inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
1801
1802 return SUCCESS;
1803 }
1804
1805 static int
1806 cp_address_required_here (str)
1807 char ** str;
1808 {
1809 char * p = * str;
1810 int pre_inc = 0;
1811 int write_back = 0;
1812
1813 if (*p == '[')
1814 {
1815 int reg;
1816
1817 p++;
1818 skip_whitespace (p);
1819
1820 if ((reg = reg_required_here (& p, 16)) == FAIL)
1821 return FAIL;
1822
1823 skip_whitespace (p);
1824
1825 if (*p == ']')
1826 {
1827 p++;
1828
1829 if (skip_past_comma (& p) == SUCCESS)
1830 {
1831 /* [Rn], #expr */
1832 write_back = WRITE_BACK;
1833
1834 if (reg == REG_PC)
1835 {
1836 inst.error = _("pc may not be used in post-increment");
1837 return FAIL;
1838 }
1839
1840 if (cp_address_offset (& p) == FAIL)
1841 return FAIL;
1842 }
1843 else
1844 pre_inc = PRE_INDEX | INDEX_UP;
1845 }
1846 else
1847 {
1848 /* '['Rn, #expr']'[!] */
1849
1850 if (skip_past_comma (& p) == FAIL)
1851 {
1852 inst.error = _("pre-indexed expression expected");
1853 return FAIL;
1854 }
1855
1856 pre_inc = PRE_INDEX;
1857
1858 if (cp_address_offset (& p) == FAIL)
1859 return FAIL;
1860
1861 skip_whitespace (p);
1862
1863 if (*p++ != ']')
1864 {
1865 inst.error = _("missing ]");
1866 return FAIL;
1867 }
1868
1869 skip_whitespace (p);
1870
1871 if (*p == '!')
1872 {
1873 if (reg == REG_PC)
1874 {
1875 inst.error = _("pc may not be used with write-back");
1876 return FAIL;
1877 }
1878
1879 p++;
1880 write_back = WRITE_BACK;
1881 }
1882 }
1883 }
1884 else
1885 {
1886 if (my_get_expression (&inst.reloc.exp, &p))
1887 return FAIL;
1888
1889 inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
1890 inst.reloc.exp.X_add_number -= 8; /* PC rel adjust */
1891 inst.reloc.pc_rel = 1;
1892 inst.instruction |= (REG_PC << 16);
1893 pre_inc = PRE_INDEX;
1894 }
1895
1896 inst.instruction |= write_back | pre_inc;
1897 *str = p;
1898 return SUCCESS;
1899 }
1900
1901 static void
1902 do_nop (str, flags)
1903 char * str;
1904 unsigned long flags;
1905 {
1906 /* Do nothing really. */
1907 inst.instruction |= flags; /* This is pointless. */
1908 end_of_line (str);
1909 return;
1910 }
1911
1912 static void
1913 do_mrs (str, flags)
1914 char *str;
1915 unsigned long flags;
1916 {
1917 int skip = 0;
1918
1919 /* Only one syntax. */
1920 skip_whitespace (str);
1921
1922 if (reg_required_here (&str, 12) == FAIL)
1923 {
1924 inst.error = BAD_ARGS;
1925 return;
1926 }
1927
1928 if (skip_past_comma (&str) == FAIL)
1929 {
1930 inst.error = _("comma expected after register name");
1931 return;
1932 }
1933
1934 skip_whitespace (str);
1935
1936 if ( strcmp (str, "CPSR") == 0
1937 || strcmp (str, "SPSR") == 0
1938 /* Lower case versions for backwards compatability. */
1939 || strcmp (str, "cpsr") == 0
1940 || strcmp (str, "spsr") == 0)
1941 skip = 4;
1942 /* This is for backwards compatability with older toolchains. */
1943 else if (strcmp (str, "cpsr_all") == 0
1944 || strcmp (str, "spsr_all") == 0)
1945 skip = 7;
1946 else
1947 {
1948 inst.error = _("{C|S}PSR expected");
1949 return;
1950 }
1951
1952 if (* str == 's' || * str == 'S')
1953 inst.instruction |= SPSR_BIT;
1954 str += skip;
1955
1956 inst.instruction |= flags;
1957 end_of_line (str);
1958 }
1959
1960 /* Two possible forms:
1961 "{C|S}PSR_<field>, Rm",
1962 "{C|S}PSR_f, #expression". */
1963 static void
1964 do_msr (str, flags)
1965 char * str;
1966 unsigned long flags;
1967 {
1968 skip_whitespace (str);
1969
1970 if (psr_required_here (& str) == FAIL)
1971 return;
1972
1973 if (skip_past_comma (& str) == FAIL)
1974 {
1975 inst.error = _("comma missing after psr flags");
1976 return;
1977 }
1978
1979 skip_whitespace (str);
1980
1981 if (reg_required_here (& str, 0) != FAIL)
1982 {
1983 inst.error = NULL;
1984 inst.instruction |= flags;
1985 end_of_line (str);
1986 return;
1987 }
1988
1989 if (! is_immediate_prefix (* str))
1990 {
1991 inst.error = _("only a register or immediate value can follow a psr flag");
1992 return;
1993 }
1994
1995 str ++;
1996 inst.error = NULL;
1997
1998 if (my_get_expression (& inst.reloc.exp, & str))
1999 {
2000 inst.error = _("only a register or immediate value can follow a psr flag");
2001 return;
2002 }
2003
2004 if (inst.instruction & ((PSR_c | PSR_x | PSR_s) << PSR_SHIFT))
2005 {
2006 inst.error = _("can only set flag field with immediate value");
2007 return;
2008 }
2009
2010 flags |= INST_IMMEDIATE;
2011
2012 if (inst.reloc.exp.X_add_symbol)
2013 {
2014 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
2015 inst.reloc.pc_rel = 0;
2016 }
2017 else
2018 {
2019 unsigned value = validate_immediate (inst.reloc.exp.X_add_number);
2020
2021 if (value == (unsigned) FAIL)
2022 {
2023 inst.error = _("Invalid constant");
2024 return;
2025 }
2026
2027 inst.instruction |= value;
2028 }
2029
2030 inst.error = NULL;
2031 inst.instruction |= flags;
2032 end_of_line (str);
2033 }
2034
2035 /* Long Multiply Parser
2036 UMULL RdLo, RdHi, Rm, Rs
2037 SMULL RdLo, RdHi, Rm, Rs
2038 UMLAL RdLo, RdHi, Rm, Rs
2039 SMLAL RdLo, RdHi, Rm, Rs
2040 */
2041 static void
2042 do_mull (str, flags)
2043 char * str;
2044 unsigned long flags;
2045 {
2046 int rdlo, rdhi, rm, rs;
2047
2048 /* Only one format "rdlo, rdhi, rm, rs" */
2049 skip_whitespace (str);
2050
2051 if ((rdlo = reg_required_here (&str, 12)) == FAIL)
2052 {
2053 inst.error = BAD_ARGS;
2054 return;
2055 }
2056
2057 if (skip_past_comma (&str) == FAIL
2058 || (rdhi = reg_required_here (&str, 16)) == FAIL)
2059 {
2060 inst.error = BAD_ARGS;
2061 return;
2062 }
2063
2064 if (skip_past_comma (&str) == FAIL
2065 || (rm = reg_required_here (&str, 0)) == FAIL)
2066 {
2067 inst.error = BAD_ARGS;
2068 return;
2069 }
2070
2071 /* rdhi, rdlo and rm must all be different */
2072 if (rdlo == rdhi || rdlo == rm || rdhi == rm)
2073 as_tsktsk (_("rdhi, rdlo and rm must all be different"));
2074
2075 if (skip_past_comma (&str) == FAIL
2076 || (rs = reg_required_here (&str, 8)) == FAIL)
2077 {
2078 inst.error = BAD_ARGS;
2079 return;
2080 }
2081
2082 if (rdhi == REG_PC || rdhi == REG_PC || rdhi == REG_PC || rdhi == REG_PC)
2083 {
2084 inst.error = BAD_PC;
2085 return;
2086 }
2087
2088 inst.instruction |= flags;
2089 end_of_line (str);
2090 return;
2091 }
2092
2093 static void
2094 do_mul (str, flags)
2095 char * str;
2096 unsigned long flags;
2097 {
2098 int rd, rm;
2099
2100 /* Only one format "rd, rm, rs" */
2101 skip_whitespace (str);
2102
2103 if ((rd = reg_required_here (&str, 16)) == FAIL)
2104 {
2105 inst.error = BAD_ARGS;
2106 return;
2107 }
2108
2109 if (rd == REG_PC)
2110 {
2111 inst.error = BAD_PC;
2112 return;
2113 }
2114
2115 if (skip_past_comma (&str) == FAIL
2116 || (rm = reg_required_here (&str, 0)) == FAIL)
2117 {
2118 inst.error = BAD_ARGS;
2119 return;
2120 }
2121
2122 if (rm == REG_PC)
2123 {
2124 inst.error = BAD_PC;
2125 return;
2126 }
2127
2128 if (rm == rd)
2129 as_tsktsk (_("rd and rm should be different in mul"));
2130
2131 if (skip_past_comma (&str) == FAIL
2132 || (rm = reg_required_here (&str, 8)) == FAIL)
2133 {
2134 inst.error = BAD_ARGS;
2135 return;
2136 }
2137
2138 if (rm == REG_PC)
2139 {
2140 inst.error = BAD_PC;
2141 return;
2142 }
2143
2144 inst.instruction |= flags;
2145 end_of_line (str);
2146 return;
2147 }
2148
2149 static void
2150 do_mla (str, flags)
2151 char * str;
2152 unsigned long flags;
2153 {
2154 int rd, rm;
2155
2156 /* Only one format "rd, rm, rs, rn" */
2157 skip_whitespace (str);
2158
2159 if ((rd = reg_required_here (&str, 16)) == FAIL)
2160 {
2161 inst.error = BAD_ARGS;
2162 return;
2163 }
2164
2165 if (rd == REG_PC)
2166 {
2167 inst.error = BAD_PC;
2168 return;
2169 }
2170
2171 if (skip_past_comma (&str) == FAIL
2172 || (rm = reg_required_here (&str, 0)) == FAIL)
2173 {
2174 inst.error = BAD_ARGS;
2175 return;
2176 }
2177
2178 if (rm == REG_PC)
2179 {
2180 inst.error = BAD_PC;
2181 return;
2182 }
2183
2184 if (rm == rd)
2185 as_tsktsk (_("rd and rm should be different in mla"));
2186
2187 if (skip_past_comma (&str) == FAIL
2188 || (rd = reg_required_here (&str, 8)) == FAIL
2189 || skip_past_comma (&str) == FAIL
2190 || (rm = reg_required_here (&str, 12)) == FAIL)
2191 {
2192 inst.error = BAD_ARGS;
2193 return;
2194 }
2195
2196 if (rd == REG_PC || rm == REG_PC)
2197 {
2198 inst.error = BAD_PC;
2199 return;
2200 }
2201
2202 inst.instruction |= flags;
2203 end_of_line (str);
2204 return;
2205 }
2206
2207 /* Returns the index into fp_values of a floating point number, or -1 if
2208 not in the table. */
2209 static int
2210 my_get_float_expression (str)
2211 char ** str;
2212 {
2213 LITTLENUM_TYPE words[MAX_LITTLENUMS];
2214 char * save_in;
2215 expressionS exp;
2216 int i;
2217 int j;
2218
2219 memset (words, 0, MAX_LITTLENUMS * sizeof (LITTLENUM_TYPE));
2220 /* Look for a raw floating point number */
2221 if ((save_in = atof_ieee (*str, 'x', words)) != NULL
2222 && is_end_of_line [(unsigned char) *save_in])
2223 {
2224 for (i = 0; i < NUM_FLOAT_VALS; i++)
2225 {
2226 for (j = 0; j < MAX_LITTLENUMS; j++)
2227 {
2228 if (words[j] != fp_values[i][j])
2229 break;
2230 }
2231
2232 if (j == MAX_LITTLENUMS)
2233 {
2234 *str = save_in;
2235 return i;
2236 }
2237 }
2238 }
2239
2240 /* Try and parse a more complex expression, this will probably fail
2241 unless the code uses a floating point prefix (eg "0f") */
2242 save_in = input_line_pointer;
2243 input_line_pointer = *str;
2244 if (expression (&exp) == absolute_section
2245 && exp.X_op == O_big
2246 && exp.X_add_number < 0)
2247 {
2248 /* FIXME: 5 = X_PRECISION, should be #define'd where we can use it.
2249 Ditto for 15. */
2250 if (gen_to_words (words, 5, (long)15) == 0)
2251 {
2252 for (i = 0; i < NUM_FLOAT_VALS; i++)
2253 {
2254 for (j = 0; j < MAX_LITTLENUMS; j++)
2255 {
2256 if (words[j] != fp_values[i][j])
2257 break;
2258 }
2259
2260 if (j == MAX_LITTLENUMS)
2261 {
2262 *str = input_line_pointer;
2263 input_line_pointer = save_in;
2264 return i;
2265 }
2266 }
2267 }
2268 }
2269
2270 *str = input_line_pointer;
2271 input_line_pointer = save_in;
2272 return -1;
2273 }
2274
2275 /* Return true if anything in the expression is a bignum */
2276 static int
2277 walk_no_bignums (sp)
2278 symbolS * sp;
2279 {
2280 if (symbol_get_value_expression (sp)->X_op == O_big)
2281 return 1;
2282
2283 if (symbol_get_value_expression (sp)->X_add_symbol)
2284 {
2285 return (walk_no_bignums (symbol_get_value_expression (sp)->X_add_symbol)
2286 || (symbol_get_value_expression (sp)->X_op_symbol
2287 && walk_no_bignums (symbol_get_value_expression (sp)->X_op_symbol)));
2288 }
2289
2290 return 0;
2291 }
2292
2293 static int
2294 my_get_expression (ep, str)
2295 expressionS * ep;
2296 char ** str;
2297 {
2298 char * save_in;
2299 segT seg;
2300
2301 save_in = input_line_pointer;
2302 input_line_pointer = *str;
2303 seg = expression (ep);
2304
2305 #ifdef OBJ_AOUT
2306 if (seg != absolute_section
2307 && seg != text_section
2308 && seg != data_section
2309 && seg != bss_section
2310 && seg != undefined_section)
2311 {
2312 inst.error = _("bad_segment");
2313 *str = input_line_pointer;
2314 input_line_pointer = save_in;
2315 return 1;
2316 }
2317 #endif
2318
2319 /* Get rid of any bignums now, so that we don't generate an error for which
2320 we can't establish a line number later on. Big numbers are never valid
2321 in instructions, which is where this routine is always called. */
2322 if (ep->X_op == O_big
2323 || (ep->X_add_symbol
2324 && (walk_no_bignums (ep->X_add_symbol)
2325 || (ep->X_op_symbol
2326 && walk_no_bignums (ep->X_op_symbol)))))
2327 {
2328 inst.error = _("Invalid constant");
2329 *str = input_line_pointer;
2330 input_line_pointer = save_in;
2331 return 1;
2332 }
2333
2334 *str = input_line_pointer;
2335 input_line_pointer = save_in;
2336 return 0;
2337 }
2338
2339 /* unrestrict should be one if <shift> <register> is permitted for this
2340 instruction */
2341
2342 static int
2343 decode_shift (str, unrestrict)
2344 char ** str;
2345 int unrestrict;
2346 {
2347 struct asm_shift * shft;
2348 char * p;
2349 char c;
2350
2351 skip_whitespace (* str);
2352
2353 for (p = *str; isalpha (*p); p++)
2354 ;
2355
2356 if (p == *str)
2357 {
2358 inst.error = _("Shift expression expected");
2359 return FAIL;
2360 }
2361
2362 c = *p;
2363 *p = '\0';
2364 shft = (struct asm_shift *) hash_find (arm_shift_hsh, *str);
2365 *p = c;
2366 if (shft)
2367 {
2368 if (!strncmp (*str, "rrx", 3)
2369 || !strncmp (*str, "RRX", 3))
2370 {
2371 *str = p;
2372 inst.instruction |= shft->value;
2373 return SUCCESS;
2374 }
2375
2376 skip_whitespace (p);
2377
2378 if (unrestrict && reg_required_here (&p, 8) != FAIL)
2379 {
2380 inst.instruction |= shft->value | SHIFT_BY_REG;
2381 *str = p;
2382 return SUCCESS;
2383 }
2384 else if (is_immediate_prefix (* p))
2385 {
2386 inst.error = NULL;
2387 p++;
2388 if (my_get_expression (&inst.reloc.exp, &p))
2389 return FAIL;
2390
2391 /* Validate some simple #expressions */
2392 if (inst.reloc.exp.X_op == O_constant)
2393 {
2394 unsigned num = inst.reloc.exp.X_add_number;
2395
2396 /* Reject operations greater than 32, or lsl #32 */
2397 if (num > 32 || (num == 32 && shft->value == 0))
2398 {
2399 inst.error = _("Invalid immediate shift");
2400 return FAIL;
2401 }
2402
2403 /* Shifts of zero should be converted to lsl (which is zero)*/
2404 if (num == 0)
2405 {
2406 *str = p;
2407 return SUCCESS;
2408 }
2409
2410 /* Shifts of 32 are encoded as 0, for those shifts that
2411 support it. */
2412 if (num == 32)
2413 num = 0;
2414
2415 inst.instruction |= (num << 7) | shft->value;
2416 *str = p;
2417 return SUCCESS;
2418 }
2419
2420 inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
2421 inst.reloc.pc_rel = 0;
2422 inst.instruction |= shft->value;
2423 *str = p;
2424 return SUCCESS;
2425 }
2426 else
2427 {
2428 inst.error = unrestrict ? _("shift requires register or #expression")
2429 : _("shift requires #expression");
2430 *str = p;
2431 return FAIL;
2432 }
2433 }
2434
2435 inst.error = _("Shift expression expected");
2436 return FAIL;
2437 }
2438
2439 /* Do those data_ops which can take a negative immediate constant */
2440 /* by altering the instuction. A bit of a hack really */
2441 /* MOV <-> MVN
2442 AND <-> BIC
2443 ADC <-> SBC
2444 by inverting the second operand, and
2445 ADD <-> SUB
2446 CMP <-> CMN
2447 by negating the second operand.
2448 */
2449 static int
2450 negate_data_op (instruction, value)
2451 unsigned long * instruction;
2452 unsigned long value;
2453 {
2454 int op, new_inst;
2455 unsigned long negated, inverted;
2456
2457 negated = validate_immediate (-value);
2458 inverted = validate_immediate (~value);
2459
2460 op = (*instruction >> DATA_OP_SHIFT) & 0xf;
2461 switch (op)
2462 {
2463 /* First negates */
2464 case OPCODE_SUB: /* ADD <-> SUB */
2465 new_inst = OPCODE_ADD;
2466 value = negated;
2467 break;
2468
2469 case OPCODE_ADD:
2470 new_inst = OPCODE_SUB;
2471 value = negated;
2472 break;
2473
2474 case OPCODE_CMP: /* CMP <-> CMN */
2475 new_inst = OPCODE_CMN;
2476 value = negated;
2477 break;
2478
2479 case OPCODE_CMN:
2480 new_inst = OPCODE_CMP;
2481 value = negated;
2482 break;
2483
2484 /* Now Inverted ops */
2485 case OPCODE_MOV: /* MOV <-> MVN */
2486 new_inst = OPCODE_MVN;
2487 value = inverted;
2488 break;
2489
2490 case OPCODE_MVN:
2491 new_inst = OPCODE_MOV;
2492 value = inverted;
2493 break;
2494
2495 case OPCODE_AND: /* AND <-> BIC */
2496 new_inst = OPCODE_BIC;
2497 value = inverted;
2498 break;
2499
2500 case OPCODE_BIC:
2501 new_inst = OPCODE_AND;
2502 value = inverted;
2503 break;
2504
2505 case OPCODE_ADC: /* ADC <-> SBC */
2506 new_inst = OPCODE_SBC;
2507 value = inverted;
2508 break;
2509
2510 case OPCODE_SBC:
2511 new_inst = OPCODE_ADC;
2512 value = inverted;
2513 break;
2514
2515 /* We cannot do anything */
2516 default:
2517 return FAIL;
2518 }
2519
2520 if (value == (unsigned) FAIL)
2521 return FAIL;
2522
2523 *instruction &= OPCODE_MASK;
2524 *instruction |= new_inst << DATA_OP_SHIFT;
2525 return value;
2526 }
2527
2528 static int
2529 data_op2 (str)
2530 char ** str;
2531 {
2532 int value;
2533 expressionS expr;
2534
2535 skip_whitespace (* str);
2536
2537 if (reg_required_here (str, 0) != FAIL)
2538 {
2539 if (skip_past_comma (str) == SUCCESS)
2540 /* Shift operation on register. */
2541 return decode_shift (str, NO_SHIFT_RESTRICT);
2542
2543 return SUCCESS;
2544 }
2545 else
2546 {
2547 /* Immediate expression */
2548 if (is_immediate_prefix (**str))
2549 {
2550 (*str)++;
2551 inst.error = NULL;
2552
2553 if (my_get_expression (&inst.reloc.exp, str))
2554 return FAIL;
2555
2556 if (inst.reloc.exp.X_add_symbol)
2557 {
2558 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
2559 inst.reloc.pc_rel = 0;
2560 }
2561 else
2562 {
2563 if (skip_past_comma (str) == SUCCESS)
2564 {
2565 /* #x, y -- ie explicit rotation by Y */
2566 if (my_get_expression (&expr, str))
2567 return FAIL;
2568
2569 if (expr.X_op != O_constant)
2570 {
2571 inst.error = _("Constant expression expected");
2572 return FAIL;
2573 }
2574
2575 /* Rotate must be a multiple of 2 */
2576 if (((unsigned) expr.X_add_number) > 30
2577 || (expr.X_add_number & 1) != 0
2578 || ((unsigned) inst.reloc.exp.X_add_number) > 255)
2579 {
2580 inst.error = _("Invalid constant");
2581 return FAIL;
2582 }
2583 inst.instruction |= INST_IMMEDIATE;
2584 inst.instruction |= inst.reloc.exp.X_add_number;
2585 inst.instruction |= expr.X_add_number << 7;
2586 return SUCCESS;
2587 }
2588
2589 /* Implicit rotation, select a suitable one */
2590 value = validate_immediate (inst.reloc.exp.X_add_number);
2591
2592 if (value == FAIL)
2593 {
2594 /* Can't be done, perhaps the code reads something like
2595 "add Rd, Rn, #-n", where "sub Rd, Rn, #n" would be ok */
2596 if ((value = negate_data_op (&inst.instruction,
2597 inst.reloc.exp.X_add_number))
2598 == FAIL)
2599 {
2600 inst.error = _("Invalid constant");
2601 return FAIL;
2602 }
2603 }
2604
2605 inst.instruction |= value;
2606 }
2607
2608 inst.instruction |= INST_IMMEDIATE;
2609 return SUCCESS;
2610 }
2611
2612 (*str)++;
2613 inst.error = _("Register or shift expression expected");
2614 return FAIL;
2615 }
2616 }
2617
2618 static int
2619 fp_op2 (str)
2620 char ** str;
2621 {
2622 skip_whitespace (* str);
2623
2624 if (fp_reg_required_here (str, 0) != FAIL)
2625 return SUCCESS;
2626 else
2627 {
2628 /* Immediate expression */
2629 if (*((*str)++) == '#')
2630 {
2631 int i;
2632
2633 inst.error = NULL;
2634
2635 skip_whitespace (* str);
2636
2637 /* First try and match exact strings, this is to guarantee that
2638 some formats will work even for cross assembly */
2639
2640 for (i = 0; fp_const[i]; i++)
2641 {
2642 if (strncmp (*str, fp_const[i], strlen (fp_const[i])) == 0)
2643 {
2644 char *start = *str;
2645
2646 *str += strlen (fp_const[i]);
2647 if (is_end_of_line[(unsigned char) **str])
2648 {
2649 inst.instruction |= i + 8;
2650 return SUCCESS;
2651 }
2652 *str = start;
2653 }
2654 }
2655
2656 /* Just because we didn't get a match doesn't mean that the
2657 constant isn't valid, just that it is in a format that we
2658 don't automatically recognize. Try parsing it with
2659 the standard expression routines. */
2660 if ((i = my_get_float_expression (str)) >= 0)
2661 {
2662 inst.instruction |= i + 8;
2663 return SUCCESS;
2664 }
2665
2666 inst.error = _("Invalid floating point immediate expression");
2667 return FAIL;
2668 }
2669 inst.error = _("Floating point register or immediate expression expected");
2670 return FAIL;
2671 }
2672 }
2673
2674 static void
2675 do_arit (str, flags)
2676 char * str;
2677 unsigned long flags;
2678 {
2679 skip_whitespace (str);
2680
2681 if (reg_required_here (&str, 12) == FAIL
2682 || skip_past_comma (&str) == FAIL
2683 || reg_required_here (&str, 16) == FAIL
2684 || skip_past_comma (&str) == FAIL
2685 || data_op2 (&str) == FAIL)
2686 {
2687 if (!inst.error)
2688 inst.error = BAD_ARGS;
2689 return;
2690 }
2691
2692 inst.instruction |= flags;
2693 end_of_line (str);
2694 return;
2695 }
2696
2697 static void
2698 do_adr (str, flags)
2699 char * str;
2700 unsigned long flags;
2701 {
2702 /* This is a pseudo-op of the form "adr rd, label" to be converted
2703 into a relative address of the form "add rd, pc, #label-.-8". */
2704 skip_whitespace (str);
2705
2706 if (reg_required_here (&str, 12) == FAIL
2707 || skip_past_comma (&str) == FAIL
2708 || my_get_expression (&inst.reloc.exp, &str))
2709 {
2710 if (!inst.error)
2711 inst.error = BAD_ARGS;
2712 return;
2713 }
2714
2715 /* Frag hacking will turn this into a sub instruction if the offset turns
2716 out to be negative. */
2717 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
2718 inst.reloc.exp.X_add_number -= 8; /* PC relative adjust. */
2719 inst.reloc.pc_rel = 1;
2720 inst.instruction |= flags;
2721
2722 end_of_line (str);
2723 }
2724
2725 static void
2726 do_adrl (str, flags)
2727 char * str;
2728 unsigned long flags;
2729 {
2730 /* This is a pseudo-op of the form "adrl rd, label" to be converted
2731 into a relative address of the form:
2732 add rd, pc, #low(label-.-8)"
2733 add rd, rd, #high(label-.-8)" */
2734
2735 skip_whitespace (str);
2736
2737 if (reg_required_here (& str, 12) == FAIL
2738 || skip_past_comma (& str) == FAIL
2739 || my_get_expression (& inst.reloc.exp, & str))
2740 {
2741 if (!inst.error)
2742 inst.error = BAD_ARGS;
2743 return;
2744 }
2745
2746 end_of_line (str);
2747
2748 /* Frag hacking will turn this into a sub instruction if the offset turns
2749 out to be negative. */
2750 inst.reloc.type = BFD_RELOC_ARM_ADRL_IMMEDIATE;
2751 inst.reloc.exp.X_add_number -= 8; /* PC relative adjust */
2752 inst.reloc.pc_rel = 1;
2753 inst.instruction |= flags;
2754 inst.size = INSN_SIZE * 2;
2755
2756 return;
2757 }
2758
2759 static void
2760 do_cmp (str, flags)
2761 char * str;
2762 unsigned long flags;
2763 {
2764 skip_whitespace (str);
2765
2766 if (reg_required_here (&str, 16) == FAIL)
2767 {
2768 if (!inst.error)
2769 inst.error = BAD_ARGS;
2770 return;
2771 }
2772
2773 if (skip_past_comma (&str) == FAIL
2774 || data_op2 (&str) == FAIL)
2775 {
2776 if (!inst.error)
2777 inst.error = BAD_ARGS;
2778 return;
2779 }
2780
2781 inst.instruction |= flags;
2782 if ((flags & 0x0000f000) == 0)
2783 inst.instruction |= CONDS_BIT;
2784
2785 end_of_line (str);
2786 return;
2787 }
2788
2789 static void
2790 do_mov (str, flags)
2791 char * str;
2792 unsigned long flags;
2793 {
2794 skip_whitespace (str);
2795
2796 if (reg_required_here (&str, 12) == FAIL)
2797 {
2798 if (!inst.error)
2799 inst.error = BAD_ARGS;
2800 return;
2801 }
2802
2803 if (skip_past_comma (&str) == FAIL
2804 || data_op2 (&str) == FAIL)
2805 {
2806 if (!inst.error)
2807 inst.error = BAD_ARGS;
2808 return;
2809 }
2810
2811 inst.instruction |= flags;
2812 end_of_line (str);
2813 return;
2814 }
2815
2816 static int
2817 ldst_extend (str, hwse)
2818 char ** str;
2819 int hwse;
2820 {
2821 int add = INDEX_UP;
2822
2823 switch (**str)
2824 {
2825 case '#':
2826 case '$':
2827 (*str)++;
2828 if (my_get_expression (& inst.reloc.exp, str))
2829 return FAIL;
2830
2831 if (inst.reloc.exp.X_op == O_constant)
2832 {
2833 int value = inst.reloc.exp.X_add_number;
2834
2835 if ((hwse && (value < -255 || value > 255))
2836 || (value < -4095 || value > 4095))
2837 {
2838 inst.error = _("address offset too large");
2839 return FAIL;
2840 }
2841
2842 if (value < 0)
2843 {
2844 value = -value;
2845 add = 0;
2846 }
2847
2848 /* Halfword and signextension instructions have the
2849 immediate value split across bits 11..8 and bits 3..0 */
2850 if (hwse)
2851 inst.instruction |= add | HWOFFSET_IMM | ((value >> 4) << 8) | (value & 0xF);
2852 else
2853 inst.instruction |= add | value;
2854 }
2855 else
2856 {
2857 if (hwse)
2858 {
2859 inst.instruction |= HWOFFSET_IMM;
2860 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
2861 }
2862 else
2863 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
2864 inst.reloc.pc_rel = 0;
2865 }
2866 return SUCCESS;
2867
2868 case '-':
2869 add = 0; /* and fall through */
2870 case '+':
2871 (*str)++; /* and fall through */
2872 default:
2873 if (reg_required_here (str, 0) == FAIL)
2874 return FAIL;
2875
2876 if (hwse)
2877 inst.instruction |= add;
2878 else
2879 {
2880 inst.instruction |= add | OFFSET_REG;
2881 if (skip_past_comma (str) == SUCCESS)
2882 return decode_shift (str, SHIFT_RESTRICT);
2883 }
2884
2885 return SUCCESS;
2886 }
2887 }
2888
2889 static void
2890 do_ldst (str, flags)
2891 char * str;
2892 unsigned long flags;
2893 {
2894 int halfword = 0;
2895 int pre_inc = 0;
2896 int conflict_reg;
2897 int value;
2898
2899 /* This is not ideal, but it is the simplest way of dealing with the
2900 ARM7T halfword instructions (since they use a different
2901 encoding, but the same mnemonic): */
2902 halfword = (flags & 0x80000000) != 0;
2903 if (halfword)
2904 {
2905 /* This is actually a load/store of a halfword, or a
2906 signed-extension load */
2907 if ((cpu_variant & ARM_HALFWORD) == 0)
2908 {
2909 inst.error
2910 = _("Processor does not support halfwords or signed bytes");
2911 return;
2912 }
2913
2914 inst.instruction = (inst.instruction & COND_MASK)
2915 | (flags & ~COND_MASK);
2916
2917 flags = 0;
2918 }
2919
2920 skip_whitespace (str);
2921
2922 if ((conflict_reg = reg_required_here (& str, 12)) == FAIL)
2923 {
2924 if (!inst.error)
2925 inst.error = BAD_ARGS;
2926 return;
2927 }
2928
2929 if (skip_past_comma (& str) == FAIL)
2930 {
2931 inst.error = _("Address expected");
2932 return;
2933 }
2934
2935 if (*str == '[')
2936 {
2937 int reg;
2938
2939 str++;
2940
2941 skip_whitespace (str);
2942
2943 if ((reg = reg_required_here (&str, 16)) == FAIL)
2944 return;
2945
2946 /* Conflicts can occur on stores as well as loads. */
2947 conflict_reg = (conflict_reg == reg);
2948
2949 skip_whitespace (str);
2950
2951 if (*str == ']')
2952 {
2953 str ++;
2954
2955 if (skip_past_comma (&str) == SUCCESS)
2956 {
2957 /* [Rn],... (post inc) */
2958 if (ldst_extend (&str, halfword) == FAIL)
2959 return;
2960 if (conflict_reg)
2961 as_warn (_("%s register same as write-back base"),
2962 (inst.instruction & LOAD_BIT) ? _("destination") : _("source") );
2963 }
2964 else
2965 {
2966 /* [Rn] */
2967 if (halfword)
2968 inst.instruction |= HWOFFSET_IMM;
2969
2970 skip_whitespace (str);
2971
2972 if (*str == '!')
2973 {
2974 if (conflict_reg)
2975 as_warn (_("%s register same as write-back base"),
2976 (inst.instruction & LOAD_BIT) ? _("destination") : _("source") );
2977 str++;
2978 inst.instruction |= WRITE_BACK;
2979 }
2980
2981 flags |= INDEX_UP;
2982 if (! (flags & TRANS_BIT))
2983 pre_inc = 1;
2984 }
2985 }
2986 else
2987 {
2988 /* [Rn,...] */
2989 if (skip_past_comma (&str) == FAIL)
2990 {
2991 inst.error = _("pre-indexed expression expected");
2992 return;
2993 }
2994
2995 pre_inc = 1;
2996 if (ldst_extend (&str, halfword) == FAIL)
2997 return;
2998
2999 skip_whitespace (str);
3000
3001 if (*str++ != ']')
3002 {
3003 inst.error = _("missing ]");
3004 return;
3005 }
3006
3007 skip_whitespace (str);
3008
3009 if (*str == '!')
3010 {
3011 if (conflict_reg)
3012 as_warn (_("%s register same as write-back base"),
3013 (inst.instruction & LOAD_BIT) ? _("destination") : _("source") );
3014 str++;
3015 inst.instruction |= WRITE_BACK;
3016 }
3017 }
3018 }
3019 else if (*str == '=')
3020 {
3021 /* Parse an "ldr Rd, =expr" instruction; this is another pseudo op */
3022 str++;
3023
3024 skip_whitespace (str);
3025
3026 if (my_get_expression (&inst.reloc.exp, &str))
3027 return;
3028
3029 if (inst.reloc.exp.X_op != O_constant
3030 && inst.reloc.exp.X_op != O_symbol)
3031 {
3032 inst.error = _("Constant expression expected");
3033 return;
3034 }
3035
3036 if (inst.reloc.exp.X_op == O_constant
3037 && (value = validate_immediate(inst.reloc.exp.X_add_number)) != FAIL)
3038 {
3039 /* This can be done with a mov instruction */
3040 inst.instruction &= LITERAL_MASK;
3041 inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
3042 inst.instruction |= (flags & COND_MASK) | (value & 0xfff);
3043 end_of_line(str);
3044 return;
3045 }
3046 else
3047 {
3048 /* Insert into literal pool */
3049 if (add_to_lit_pool () == FAIL)
3050 {
3051 if (!inst.error)
3052 inst.error = _("literal pool insertion failed");
3053 return;
3054 }
3055
3056 /* Change the instruction exp to point to the pool */
3057 if (halfword)
3058 {
3059 inst.instruction |= HWOFFSET_IMM;
3060 inst.reloc.type = BFD_RELOC_ARM_HWLITERAL;
3061 }
3062 else
3063 inst.reloc.type = BFD_RELOC_ARM_LITERAL;
3064 inst.reloc.pc_rel = 1;
3065 inst.instruction |= (REG_PC << 16);
3066 pre_inc = 1;
3067 }
3068 }
3069 else
3070 {
3071 if (my_get_expression (&inst.reloc.exp, &str))
3072 return;
3073
3074 if (halfword)
3075 {
3076 inst.instruction |= HWOFFSET_IMM;
3077 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
3078 }
3079 else
3080 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
3081 #ifndef TE_WINCE
3082 inst.reloc.exp.X_add_number -= 8; /* PC rel adjust */
3083 #endif
3084 inst.reloc.pc_rel = 1;
3085 inst.instruction |= (REG_PC << 16);
3086 pre_inc = 1;
3087 }
3088
3089 if (pre_inc && (flags & TRANS_BIT))
3090 inst.error = _("Pre-increment instruction with translate");
3091
3092 inst.instruction |= flags | (pre_inc ? PRE_INDEX : 0);
3093 end_of_line (str);
3094 return;
3095 }
3096
3097 static long
3098 reg_list (strp)
3099 char ** strp;
3100 {
3101 char * str = *strp;
3102 long range = 0;
3103 int another_range;
3104
3105 /* We come back here if we get ranges concatenated by '+' or '|' */
3106 do
3107 {
3108 another_range = 0;
3109
3110 if (*str == '{')
3111 {
3112 int in_range = 0;
3113 int cur_reg = -1;
3114
3115 str++;
3116 do
3117 {
3118 int reg;
3119
3120 skip_whitespace (str);
3121
3122 if ((reg = reg_required_here (& str, -1)) == FAIL)
3123 return FAIL;
3124
3125 if (in_range)
3126 {
3127 int i;
3128
3129 if (reg <= cur_reg)
3130 {
3131 inst.error = _("Bad range in register list");
3132 return FAIL;
3133 }
3134
3135 for (i = cur_reg + 1; i < reg; i++)
3136 {
3137 if (range & (1 << i))
3138 as_tsktsk
3139 (_("Warning: Duplicated register (r%d) in register list"),
3140 i);
3141 else
3142 range |= 1 << i;
3143 }
3144 in_range = 0;
3145 }
3146
3147 if (range & (1 << reg))
3148 as_tsktsk (_("Warning: Duplicated register (r%d) in register list"),
3149 reg);
3150 else if (reg <= cur_reg)
3151 as_tsktsk (_("Warning: Register range not in ascending order"));
3152
3153 range |= 1 << reg;
3154 cur_reg = reg;
3155 } while (skip_past_comma (&str) != FAIL
3156 || (in_range = 1, *str++ == '-'));
3157 str--;
3158 skip_whitespace (str);
3159
3160 if (*str++ != '}')
3161 {
3162 inst.error = _("Missing `}'");
3163 return FAIL;
3164 }
3165 }
3166 else
3167 {
3168 expressionS expr;
3169
3170 if (my_get_expression (&expr, &str))
3171 return FAIL;
3172
3173 if (expr.X_op == O_constant)
3174 {
3175 if (expr.X_add_number
3176 != (expr.X_add_number & 0x0000ffff))
3177 {
3178 inst.error = _("invalid register mask");
3179 return FAIL;
3180 }
3181
3182 if ((range & expr.X_add_number) != 0)
3183 {
3184 int regno = range & expr.X_add_number;
3185
3186 regno &= -regno;
3187 regno = (1 << regno) - 1;
3188 as_tsktsk
3189 (_("Warning: Duplicated register (r%d) in register list"),
3190 regno);
3191 }
3192
3193 range |= expr.X_add_number;
3194 }
3195 else
3196 {
3197 if (inst.reloc.type != 0)
3198 {
3199 inst.error = _("expression too complex");
3200 return FAIL;
3201 }
3202
3203 memcpy (&inst.reloc.exp, &expr, sizeof (expressionS));
3204 inst.reloc.type = BFD_RELOC_ARM_MULTI;
3205 inst.reloc.pc_rel = 0;
3206 }
3207 }
3208
3209 skip_whitespace (str);
3210
3211 if (*str == '|' || *str == '+')
3212 {
3213 str++;
3214 another_range = 1;
3215 }
3216 } while (another_range);
3217
3218 *strp = str;
3219 return range;
3220 }
3221
3222 static void
3223 do_ldmstm (str, flags)
3224 char * str;
3225 unsigned long flags;
3226 {
3227 int base_reg;
3228 long range;
3229
3230 skip_whitespace (str);
3231
3232 if ((base_reg = reg_required_here (&str, 16)) == FAIL)
3233 return;
3234
3235 if (base_reg == REG_PC)
3236 {
3237 inst.error = _("r15 not allowed as base register");
3238 return;
3239 }
3240
3241 skip_whitespace (str);
3242
3243 if (*str == '!')
3244 {
3245 flags |= WRITE_BACK;
3246 str++;
3247 }
3248
3249 if (skip_past_comma (&str) == FAIL
3250 || (range = reg_list (&str)) == FAIL)
3251 {
3252 if (! inst.error)
3253 inst.error = BAD_ARGS;
3254 return;
3255 }
3256
3257 if (*str == '^')
3258 {
3259 str++;
3260 flags |= LDM_TYPE_2_OR_3;
3261 }
3262
3263 inst.instruction |= flags | range;
3264 end_of_line (str);
3265 return;
3266 }
3267
3268 static void
3269 do_swi (str, flags)
3270 char * str;
3271 unsigned long flags;
3272 {
3273 skip_whitespace (str);
3274
3275 /* Allow optional leading '#'. */
3276 if (is_immediate_prefix (*str))
3277 str++;
3278
3279 if (my_get_expression (& inst.reloc.exp, & str))
3280 return;
3281
3282 inst.reloc.type = BFD_RELOC_ARM_SWI;
3283 inst.reloc.pc_rel = 0;
3284 inst.instruction |= flags;
3285
3286 end_of_line (str);
3287
3288 return;
3289 }
3290
3291 static void
3292 do_swap (str, flags)
3293 char * str;
3294 unsigned long flags;
3295 {
3296 int reg;
3297
3298 skip_whitespace (str);
3299
3300 if ((reg = reg_required_here (&str, 12)) == FAIL)
3301 return;
3302
3303 if (reg == REG_PC)
3304 {
3305 inst.error = _("r15 not allowed in swap");
3306 return;
3307 }
3308
3309 if (skip_past_comma (&str) == FAIL
3310 || (reg = reg_required_here (&str, 0)) == FAIL)
3311 {
3312 if (!inst.error)
3313 inst.error = BAD_ARGS;
3314 return;
3315 }
3316
3317 if (reg == REG_PC)
3318 {
3319 inst.error = _("r15 not allowed in swap");
3320 return;
3321 }
3322
3323 if (skip_past_comma (&str) == FAIL
3324 || *str++ != '[')
3325 {
3326 inst.error = BAD_ARGS;
3327 return;
3328 }
3329
3330 skip_whitespace (str);
3331
3332 if ((reg = reg_required_here (&str, 16)) == FAIL)
3333 return;
3334
3335 if (reg == REG_PC)
3336 {
3337 inst.error = BAD_PC;
3338 return;
3339 }
3340
3341 skip_whitespace (str);
3342
3343 if (*str++ != ']')
3344 {
3345 inst.error = _("missing ]");
3346 return;
3347 }
3348
3349 inst.instruction |= flags;
3350 end_of_line (str);
3351 return;
3352 }
3353
3354 static void
3355 do_branch (str, flags)
3356 char * str;
3357 unsigned long flags ATTRIBUTE_UNUSED;
3358 {
3359 if (my_get_expression (&inst.reloc.exp, &str))
3360 return;
3361
3362 #ifdef OBJ_ELF
3363 {
3364 char * save_in;
3365
3366 /* ScottB: February 5, 1998 */
3367 /* Check to see of PLT32 reloc required for the instruction. */
3368
3369 /* arm_parse_reloc() works on input_line_pointer.
3370 We actually want to parse the operands to the branch instruction
3371 passed in 'str'. Save the input pointer and restore it later. */
3372 save_in = input_line_pointer;
3373 input_line_pointer = str;
3374 if (inst.reloc.exp.X_op == O_symbol
3375 && *str == '('
3376 && arm_parse_reloc () == BFD_RELOC_ARM_PLT32)
3377 {
3378 inst.reloc.type = BFD_RELOC_ARM_PLT32;
3379 inst.reloc.pc_rel = 0;
3380 /* Modify str to point to after parsed operands, otherwise
3381 end_of_line() will complain about the (PLT) left in str. */
3382 str = input_line_pointer;
3383 }
3384 else
3385 {
3386 inst.reloc.type = BFD_RELOC_ARM_PCREL_BRANCH;
3387 inst.reloc.pc_rel = 1;
3388 }
3389 input_line_pointer = save_in;
3390 }
3391 #else
3392 inst.reloc.type = BFD_RELOC_ARM_PCREL_BRANCH;
3393 inst.reloc.pc_rel = 1;
3394 #endif /* OBJ_ELF */
3395
3396 end_of_line (str);
3397 return;
3398 }
3399
3400 static void
3401 do_bx (str, flags)
3402 char * str;
3403 unsigned long flags ATTRIBUTE_UNUSED;
3404 {
3405 int reg;
3406
3407 skip_whitespace (str);
3408
3409 if ((reg = reg_required_here (&str, 0)) == FAIL)
3410 {
3411 inst.error = BAD_ARGS;
3412 return;
3413 }
3414
3415 if (reg == REG_PC)
3416 inst.error = BAD_PC;
3417
3418 end_of_line (str);
3419 }
3420
3421 static void
3422 do_cdp (str, flags)
3423 char * str;
3424 unsigned long flags ATTRIBUTE_UNUSED;
3425 {
3426 /* Co-processor data operation.
3427 Format: CDP{cond} CP#,<expr>,CRd,CRn,CRm{,<expr>} */
3428 skip_whitespace (str);
3429
3430 if (co_proc_number (&str) == FAIL)
3431 {
3432 if (!inst.error)
3433 inst.error = BAD_ARGS;
3434 return;
3435 }
3436
3437 if (skip_past_comma (&str) == FAIL
3438 || cp_opc_expr (&str, 20,4) == FAIL)
3439 {
3440 if (!inst.error)
3441 inst.error = BAD_ARGS;
3442 return;
3443 }
3444
3445 if (skip_past_comma (&str) == FAIL
3446 || cp_reg_required_here (&str, 12) == FAIL)
3447 {
3448 if (!inst.error)
3449 inst.error = BAD_ARGS;
3450 return;
3451 }
3452
3453 if (skip_past_comma (&str) == FAIL
3454 || cp_reg_required_here (&str, 16) == FAIL)
3455 {
3456 if (!inst.error)
3457 inst.error = BAD_ARGS;
3458 return;
3459 }
3460
3461 if (skip_past_comma (&str) == FAIL
3462 || cp_reg_required_here (&str, 0) == FAIL)
3463 {
3464 if (!inst.error)
3465 inst.error = BAD_ARGS;
3466 return;
3467 }
3468
3469 if (skip_past_comma (&str) == SUCCESS)
3470 {
3471 if (cp_opc_expr (&str, 5, 3) == FAIL)
3472 {
3473 if (!inst.error)
3474 inst.error = BAD_ARGS;
3475 return;
3476 }
3477 }
3478
3479 end_of_line (str);
3480 return;
3481 }
3482
3483 static void
3484 do_lstc (str, flags)
3485 char * str;
3486 unsigned long flags;
3487 {
3488 /* Co-processor register load/store.
3489 Format: <LDC|STC{cond}[L] CP#,CRd,<address> */
3490
3491 skip_whitespace (str);
3492
3493 if (co_proc_number (&str) == FAIL)
3494 {
3495 if (!inst.error)
3496 inst.error = BAD_ARGS;
3497 return;
3498 }
3499
3500 if (skip_past_comma (&str) == FAIL
3501 || cp_reg_required_here (&str, 12) == FAIL)
3502 {
3503 if (!inst.error)
3504 inst.error = BAD_ARGS;
3505 return;
3506 }
3507
3508 if (skip_past_comma (&str) == FAIL
3509 || cp_address_required_here (&str) == FAIL)
3510 {
3511 if (! inst.error)
3512 inst.error = BAD_ARGS;
3513 return;
3514 }
3515
3516 inst.instruction |= flags;
3517 end_of_line (str);
3518 return;
3519 }
3520
3521 static void
3522 do_co_reg (str, flags)
3523 char * str;
3524 unsigned long flags;
3525 {
3526 /* Co-processor register transfer.
3527 Format: <MCR|MRC>{cond} CP#,<expr1>,Rd,CRn,CRm{,<expr2>} */
3528
3529 skip_whitespace (str);
3530
3531 if (co_proc_number (&str) == FAIL)
3532 {
3533 if (!inst.error)
3534 inst.error = BAD_ARGS;
3535 return;
3536 }
3537
3538 if (skip_past_comma (&str) == FAIL
3539 || cp_opc_expr (&str, 21, 3) == FAIL)
3540 {
3541 if (!inst.error)
3542 inst.error = BAD_ARGS;
3543 return;
3544 }
3545
3546 if (skip_past_comma (&str) == FAIL
3547 || reg_required_here (&str, 12) == FAIL)
3548 {
3549 if (!inst.error)
3550 inst.error = BAD_ARGS;
3551 return;
3552 }
3553
3554 if (skip_past_comma (&str) == FAIL
3555 || cp_reg_required_here (&str, 16) == FAIL)
3556 {
3557 if (!inst.error)
3558 inst.error = BAD_ARGS;
3559 return;
3560 }
3561
3562 if (skip_past_comma (&str) == FAIL
3563 || cp_reg_required_here (&str, 0) == FAIL)
3564 {
3565 if (!inst.error)
3566 inst.error = BAD_ARGS;
3567 return;
3568 }
3569
3570 if (skip_past_comma (&str) == SUCCESS)
3571 {
3572 if (cp_opc_expr (&str, 5, 3) == FAIL)
3573 {
3574 if (!inst.error)
3575 inst.error = BAD_ARGS;
3576 return;
3577 }
3578 }
3579 if (flags)
3580 {
3581 inst.error = BAD_COND;
3582 }
3583
3584 end_of_line (str);
3585 return;
3586 }
3587
3588 static void
3589 do_fp_ctrl (str, flags)
3590 char * str;
3591 unsigned long flags ATTRIBUTE_UNUSED;
3592 {
3593 /* FP control registers.
3594 Format: <WFS|RFS|WFC|RFC>{cond} Rn */
3595
3596 skip_whitespace (str);
3597
3598 if (reg_required_here (&str, 12) == FAIL)
3599 {
3600 if (!inst.error)
3601 inst.error = BAD_ARGS;
3602 return;
3603 }
3604
3605 end_of_line (str);
3606 return;
3607 }
3608
3609 static void
3610 do_fp_ldst (str, flags)
3611 char * str;
3612 unsigned long flags ATTRIBUTE_UNUSED;
3613 {
3614 skip_whitespace (str);
3615
3616 switch (inst.suffix)
3617 {
3618 case SUFF_S:
3619 break;
3620 case SUFF_D:
3621 inst.instruction |= CP_T_X;
3622 break;
3623 case SUFF_E:
3624 inst.instruction |= CP_T_Y;
3625 break;
3626 case SUFF_P:
3627 inst.instruction |= CP_T_X | CP_T_Y;
3628 break;
3629 default:
3630 abort ();
3631 }
3632
3633 if (fp_reg_required_here (&str, 12) == FAIL)
3634 {
3635 if (!inst.error)
3636 inst.error = BAD_ARGS;
3637 return;
3638 }
3639
3640 if (skip_past_comma (&str) == FAIL
3641 || cp_address_required_here (&str) == FAIL)
3642 {
3643 if (!inst.error)
3644 inst.error = BAD_ARGS;
3645 return;
3646 }
3647
3648 end_of_line (str);
3649 }
3650
3651 static void
3652 do_fp_ldmstm (str, flags)
3653 char * str;
3654 unsigned long flags;
3655 {
3656 int num_regs;
3657
3658 skip_whitespace (str);
3659
3660 if (fp_reg_required_here (&str, 12) == FAIL)
3661 {
3662 if (! inst.error)
3663 inst.error = BAD_ARGS;
3664 return;
3665 }
3666
3667 /* Get Number of registers to transfer */
3668 if (skip_past_comma (&str) == FAIL
3669 || my_get_expression (&inst.reloc.exp, &str))
3670 {
3671 if (! inst.error)
3672 inst.error = _("constant expression expected");
3673 return;
3674 }
3675
3676 if (inst.reloc.exp.X_op != O_constant)
3677 {
3678 inst.error = _("Constant value required for number of registers");
3679 return;
3680 }
3681
3682 num_regs = inst.reloc.exp.X_add_number;
3683
3684 if (num_regs < 1 || num_regs > 4)
3685 {
3686 inst.error = _("number of registers must be in the range [1:4]");
3687 return;
3688 }
3689
3690 switch (num_regs)
3691 {
3692 case 1:
3693 inst.instruction |= CP_T_X;
3694 break;
3695 case 2:
3696 inst.instruction |= CP_T_Y;
3697 break;
3698 case 3:
3699 inst.instruction |= CP_T_Y | CP_T_X;
3700 break;
3701 case 4:
3702 break;
3703 default:
3704 abort ();
3705 }
3706
3707 if (flags)
3708 {
3709 int reg;
3710 int write_back;
3711 int offset;
3712
3713 /* The instruction specified "ea" or "fd", so we can only accept
3714 [Rn]{!}. The instruction does not really support stacking or
3715 unstacking, so we have to emulate these by setting appropriate
3716 bits and offsets. */
3717 if (skip_past_comma (&str) == FAIL
3718 || *str != '[')
3719 {
3720 if (! inst.error)
3721 inst.error = BAD_ARGS;
3722 return;
3723 }
3724
3725 str++;
3726 skip_whitespace (str);
3727
3728 if ((reg = reg_required_here (&str, 16)) == FAIL)
3729 return;
3730
3731 skip_whitespace (str);
3732
3733 if (*str != ']')
3734 {
3735 inst.error = BAD_ARGS;
3736 return;
3737 }
3738
3739 str++;
3740 if (*str == '!')
3741 {
3742 write_back = 1;
3743 str++;
3744 if (reg == REG_PC)
3745 {
3746 inst.error = _("R15 not allowed as base register with write-back");
3747 return;
3748 }
3749 }
3750 else
3751 write_back = 0;
3752
3753 if (flags & CP_T_Pre)
3754 {
3755 /* Pre-decrement */
3756 offset = 3 * num_regs;
3757 if (write_back)
3758 flags |= CP_T_WB;
3759 }
3760 else
3761 {
3762 /* Post-increment */
3763 if (write_back)
3764 {
3765 flags |= CP_T_WB;
3766 offset = 3 * num_regs;
3767 }
3768 else
3769 {
3770 /* No write-back, so convert this into a standard pre-increment
3771 instruction -- aesthetically more pleasing. */
3772 flags = CP_T_Pre | CP_T_UD;
3773 offset = 0;
3774 }
3775 }
3776
3777 inst.instruction |= flags | offset;
3778 }
3779 else if (skip_past_comma (&str) == FAIL
3780 || cp_address_required_here (&str) == FAIL)
3781 {
3782 if (! inst.error)
3783 inst.error = BAD_ARGS;
3784 return;
3785 }
3786
3787 end_of_line (str);
3788 }
3789
3790 static void
3791 do_fp_dyadic (str, flags)
3792 char * str;
3793 unsigned long flags;
3794 {
3795 skip_whitespace (str);
3796
3797 switch (inst.suffix)
3798 {
3799 case SUFF_S:
3800 break;
3801 case SUFF_D:
3802 inst.instruction |= 0x00000080;
3803 break;
3804 case SUFF_E:
3805 inst.instruction |= 0x00080000;
3806 break;
3807 default:
3808 abort ();
3809 }
3810
3811 if (fp_reg_required_here (&str, 12) == FAIL)
3812 {
3813 if (! inst.error)
3814 inst.error = BAD_ARGS;
3815 return;
3816 }
3817
3818 if (skip_past_comma (&str) == FAIL
3819 || fp_reg_required_here (&str, 16) == FAIL)
3820 {
3821 if (! inst.error)
3822 inst.error = BAD_ARGS;
3823 return;
3824 }
3825
3826 if (skip_past_comma (&str) == FAIL
3827 || fp_op2 (&str) == FAIL)
3828 {
3829 if (! inst.error)
3830 inst.error = BAD_ARGS;
3831 return;
3832 }
3833
3834 inst.instruction |= flags;
3835 end_of_line (str);
3836 return;
3837 }
3838
3839 static void
3840 do_fp_monadic (str, flags)
3841 char * str;
3842 unsigned long flags;
3843 {
3844 skip_whitespace (str);
3845
3846 switch (inst.suffix)
3847 {
3848 case SUFF_S:
3849 break;
3850 case SUFF_D:
3851 inst.instruction |= 0x00000080;
3852 break;
3853 case SUFF_E:
3854 inst.instruction |= 0x00080000;
3855 break;
3856 default:
3857 abort ();
3858 }
3859
3860 if (fp_reg_required_here (&str, 12) == FAIL)
3861 {
3862 if (! inst.error)
3863 inst.error = BAD_ARGS;
3864 return;
3865 }
3866
3867 if (skip_past_comma (&str) == FAIL
3868 || fp_op2 (&str) == FAIL)
3869 {
3870 if (! inst.error)
3871 inst.error = BAD_ARGS;
3872 return;
3873 }
3874
3875 inst.instruction |= flags;
3876 end_of_line (str);
3877 return;
3878 }
3879
3880 static void
3881 do_fp_cmp (str, flags)
3882 char * str;
3883 unsigned long flags;
3884 {
3885 skip_whitespace (str);
3886
3887 if (fp_reg_required_here (&str, 16) == FAIL)
3888 {
3889 if (! inst.error)
3890 inst.error = BAD_ARGS;
3891 return;
3892 }
3893
3894 if (skip_past_comma (&str) == FAIL
3895 || fp_op2 (&str) == FAIL)
3896 {
3897 if (! inst.error)
3898 inst.error = BAD_ARGS;
3899 return;
3900 }
3901
3902 inst.instruction |= flags;
3903 end_of_line (str);
3904 return;
3905 }
3906
3907 static void
3908 do_fp_from_reg (str, flags)
3909 char * str;
3910 unsigned long flags;
3911 {
3912 skip_whitespace (str);
3913
3914 switch (inst.suffix)
3915 {
3916 case SUFF_S:
3917 break;
3918 case SUFF_D:
3919 inst.instruction |= 0x00000080;
3920 break;
3921 case SUFF_E:
3922 inst.instruction |= 0x00080000;
3923 break;
3924 default:
3925 abort ();
3926 }
3927
3928 if (fp_reg_required_here (&str, 16) == FAIL)
3929 {
3930 if (! inst.error)
3931 inst.error = BAD_ARGS;
3932 return;
3933 }
3934
3935 if (skip_past_comma (&str) == FAIL
3936 || reg_required_here (&str, 12) == FAIL)
3937 {
3938 if (! inst.error)
3939 inst.error = BAD_ARGS;
3940 return;
3941 }
3942
3943 inst.instruction |= flags;
3944 end_of_line (str);
3945 return;
3946 }
3947
3948 static void
3949 do_fp_to_reg (str, flags)
3950 char * str;
3951 unsigned long flags;
3952 {
3953 skip_whitespace (str);
3954
3955 if (reg_required_here (&str, 12) == FAIL)
3956 return;
3957
3958 if (skip_past_comma (&str) == FAIL
3959 || fp_reg_required_here (&str, 0) == FAIL)
3960 {
3961 if (! inst.error)
3962 inst.error = BAD_ARGS;
3963 return;
3964 }
3965
3966 inst.instruction |= flags;
3967 end_of_line (str);
3968 return;
3969 }
3970
3971 /* Thumb specific routines */
3972
3973 /* Parse and validate that a register is of the right form, this saves
3974 repeated checking of this information in many similar cases.
3975 Unlike the 32-bit case we do not insert the register into the opcode
3976 here, since the position is often unknown until the full instruction
3977 has been parsed. */
3978 static int
3979 thumb_reg (strp, hi_lo)
3980 char ** strp;
3981 int hi_lo;
3982 {
3983 int reg;
3984
3985 if ((reg = reg_required_here (strp, -1)) == FAIL)
3986 return FAIL;
3987
3988 switch (hi_lo)
3989 {
3990 case THUMB_REG_LO:
3991 if (reg > 7)
3992 {
3993 inst.error = _("lo register required");
3994 return FAIL;
3995 }
3996 break;
3997
3998 case THUMB_REG_HI:
3999 if (reg < 8)
4000 {
4001 inst.error = _("hi register required");
4002 return FAIL;
4003 }
4004 break;
4005
4006 default:
4007 break;
4008 }
4009
4010 return reg;
4011 }
4012
4013 /* Parse an add or subtract instruction, SUBTRACT is non-zero if the opcode
4014 was SUB. */
4015 static void
4016 thumb_add_sub (str, subtract)
4017 char * str;
4018 int subtract;
4019 {
4020 int Rd, Rs, Rn = FAIL;
4021
4022 skip_whitespace (str);
4023
4024 if ((Rd = thumb_reg (&str, THUMB_REG_ANY)) == FAIL
4025 || skip_past_comma (&str) == FAIL)
4026 {
4027 if (! inst.error)
4028 inst.error = BAD_ARGS;
4029 return;
4030 }
4031
4032 if (is_immediate_prefix (*str))
4033 {
4034 Rs = Rd;
4035 str++;
4036 if (my_get_expression (&inst.reloc.exp, &str))
4037 return;
4038 }
4039 else
4040 {
4041 if ((Rs = thumb_reg (&str, THUMB_REG_ANY)) == FAIL)
4042 return;
4043
4044 if (skip_past_comma (&str) == FAIL)
4045 {
4046 /* Two operand format, shuffle the registers and pretend there
4047 are 3 */
4048 Rn = Rs;
4049 Rs = Rd;
4050 }
4051 else if (is_immediate_prefix (*str))
4052 {
4053 str++;
4054 if (my_get_expression (&inst.reloc.exp, &str))
4055 return;
4056 }
4057 else if ((Rn = thumb_reg (&str, THUMB_REG_ANY)) == FAIL)
4058 return;
4059 }
4060
4061 /* We now have Rd and Rs set to registers, and Rn set to a register or FAIL;
4062 for the latter case, EXPR contains the immediate that was found. */
4063 if (Rn != FAIL)
4064 {
4065 /* All register format. */
4066 if (Rd > 7 || Rs > 7 || Rn > 7)
4067 {
4068 if (Rs != Rd)
4069 {
4070 inst.error = _("dest and source1 must be the same register");
4071 return;
4072 }
4073
4074 /* Can't do this for SUB */
4075 if (subtract)
4076 {
4077 inst.error = _("subtract valid only on lo regs");
4078 return;
4079 }
4080
4081 inst.instruction = (T_OPCODE_ADD_HI
4082 | (Rd > 7 ? THUMB_H1 : 0)
4083 | (Rn > 7 ? THUMB_H2 : 0));
4084 inst.instruction |= (Rd & 7) | ((Rn & 7) << 3);
4085 }
4086 else
4087 {
4088 inst.instruction = subtract ? T_OPCODE_SUB_R3 : T_OPCODE_ADD_R3;
4089 inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
4090 }
4091 }
4092 else
4093 {
4094 /* Immediate expression, now things start to get nasty. */
4095
4096 /* First deal with HI regs, only very restricted cases allowed:
4097 Adjusting SP, and using PC or SP to get an address. */
4098 if ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP))
4099 || (Rs > 7 && Rs != REG_SP && Rs != REG_PC))
4100 {
4101 inst.error = _("invalid Hi register with immediate");
4102 return;
4103 }
4104
4105 if (inst.reloc.exp.X_op != O_constant)
4106 {
4107 /* Value isn't known yet, all we can do is store all the fragments
4108 we know about in the instruction and let the reloc hacking
4109 work it all out. */
4110 inst.instruction = (subtract ? 0x8000 : 0) | (Rd << 4) | Rs;
4111 inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
4112 }
4113 else
4114 {
4115 int offset = inst.reloc.exp.X_add_number;
4116
4117 if (subtract)
4118 offset = -offset;
4119
4120 if (offset < 0)
4121 {
4122 offset = -offset;
4123 subtract = 1;
4124
4125 /* Quick check, in case offset is MIN_INT */
4126 if (offset < 0)
4127 {
4128 inst.error = _("immediate value out of range");
4129 return;
4130 }
4131 }
4132 else
4133 subtract = 0;
4134
4135 if (Rd == REG_SP)
4136 {
4137 if (offset & ~0x1fc)
4138 {
4139 inst.error = _("invalid immediate value for stack adjust");
4140 return;
4141 }
4142 inst.instruction = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
4143 inst.instruction |= offset >> 2;
4144 }
4145 else if (Rs == REG_PC || Rs == REG_SP)
4146 {
4147 if (subtract
4148 || (offset & ~0x3fc))
4149 {
4150 inst.error = _("invalid immediate for address calculation");
4151 return;
4152 }
4153 inst.instruction = (Rs == REG_PC ? T_OPCODE_ADD_PC
4154 : T_OPCODE_ADD_SP);
4155 inst.instruction |= (Rd << 8) | (offset >> 2);
4156 }
4157 else if (Rs == Rd)
4158 {
4159 if (offset & ~0xff)
4160 {
4161 inst.error = _("immediate value out of range");
4162 return;
4163 }
4164 inst.instruction = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
4165 inst.instruction |= (Rd << 8) | offset;
4166 }
4167 else
4168 {
4169 if (offset & ~0x7)
4170 {
4171 inst.error = _("immediate value out of range");
4172 return;
4173 }
4174 inst.instruction = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
4175 inst.instruction |= Rd | (Rs << 3) | (offset << 6);
4176 }
4177 }
4178 }
4179
4180 end_of_line (str);
4181 }
4182
4183 static void
4184 thumb_shift (str, shift)
4185 char * str;
4186 int shift;
4187 {
4188 int Rd, Rs, Rn = FAIL;
4189
4190 skip_whitespace (str);
4191
4192 if ((Rd = thumb_reg (&str, THUMB_REG_LO)) == FAIL
4193 || skip_past_comma (&str) == FAIL)
4194 {
4195 if (! inst.error)
4196 inst.error = BAD_ARGS;
4197 return;
4198 }
4199
4200 if (is_immediate_prefix (*str))
4201 {
4202 /* Two operand immediate format, set Rs to Rd. */
4203 Rs = Rd;
4204 str ++;
4205 if (my_get_expression (&inst.reloc.exp, &str))
4206 return;
4207 }
4208 else
4209 {
4210 if ((Rs = thumb_reg (&str, THUMB_REG_LO)) == FAIL)
4211 return;
4212
4213 if (skip_past_comma (&str) == FAIL)
4214 {
4215 /* Two operand format, shuffle the registers and pretend there
4216 are 3 */
4217 Rn = Rs;
4218 Rs = Rd;
4219 }
4220 else if (is_immediate_prefix (*str))
4221 {
4222 str++;
4223 if (my_get_expression (&inst.reloc.exp, &str))
4224 return;
4225 }
4226 else if ((Rn = thumb_reg (&str, THUMB_REG_LO)) == FAIL)
4227 return;
4228 }
4229
4230 /* We now have Rd and Rs set to registers, and Rn set to a register or FAIL;
4231 for the latter case, EXPR contains the immediate that was found. */
4232
4233 if (Rn != FAIL)
4234 {
4235 if (Rs != Rd)
4236 {
4237 inst.error = _("source1 and dest must be same register");
4238 return;
4239 }
4240
4241 switch (shift)
4242 {
4243 case THUMB_ASR: inst.instruction = T_OPCODE_ASR_R; break;
4244 case THUMB_LSL: inst.instruction = T_OPCODE_LSL_R; break;
4245 case THUMB_LSR: inst.instruction = T_OPCODE_LSR_R; break;
4246 }
4247
4248 inst.instruction |= Rd | (Rn << 3);
4249 }
4250 else
4251 {
4252 switch (shift)
4253 {
4254 case THUMB_ASR: inst.instruction = T_OPCODE_ASR_I; break;
4255 case THUMB_LSL: inst.instruction = T_OPCODE_LSL_I; break;
4256 case THUMB_LSR: inst.instruction = T_OPCODE_LSR_I; break;
4257 }
4258
4259 if (inst.reloc.exp.X_op != O_constant)
4260 {
4261 /* Value isn't known yet, create a dummy reloc and let reloc
4262 hacking fix it up */
4263
4264 inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
4265 }
4266 else
4267 {
4268 unsigned shift_value = inst.reloc.exp.X_add_number;
4269
4270 if (shift_value > 32 || (shift_value == 32 && shift == THUMB_LSL))
4271 {
4272 inst.error = _("Invalid immediate for shift");
4273 return;
4274 }
4275
4276 /* Shifts of zero are handled by converting to LSL */
4277 if (shift_value == 0)
4278 inst.instruction = T_OPCODE_LSL_I;
4279
4280 /* Shifts of 32 are encoded as a shift of zero */
4281 if (shift_value == 32)
4282 shift_value = 0;
4283
4284 inst.instruction |= shift_value << 6;
4285 }
4286
4287 inst.instruction |= Rd | (Rs << 3);
4288 }
4289
4290 end_of_line (str);
4291 }
4292
4293 static void
4294 thumb_mov_compare (str, move)
4295 char * str;
4296 int move;
4297 {
4298 int Rd, Rs = FAIL;
4299
4300 skip_whitespace (str);
4301
4302 if ((Rd = thumb_reg (&str, THUMB_REG_ANY)) == FAIL
4303 || skip_past_comma (&str) == FAIL)
4304 {
4305 if (! inst.error)
4306 inst.error = BAD_ARGS;
4307 return;
4308 }
4309
4310 if (is_immediate_prefix (*str))
4311 {
4312 str++;
4313 if (my_get_expression (&inst.reloc.exp, &str))
4314 return;
4315 }
4316 else if ((Rs = thumb_reg (&str, THUMB_REG_ANY)) == FAIL)
4317 return;
4318
4319 if (Rs != FAIL)
4320 {
4321 if (Rs < 8 && Rd < 8)
4322 {
4323 if (move == THUMB_MOVE)
4324 /* A move of two lowregs is encoded as ADD Rd, Rs, #0
4325 since a MOV instruction produces unpredictable results */
4326 inst.instruction = T_OPCODE_ADD_I3;
4327 else
4328 inst.instruction = T_OPCODE_CMP_LR;
4329 inst.instruction |= Rd | (Rs << 3);
4330 }
4331 else
4332 {
4333 if (move == THUMB_MOVE)
4334 inst.instruction = T_OPCODE_MOV_HR;
4335 else
4336 inst.instruction = T_OPCODE_CMP_HR;
4337
4338 if (Rd > 7)
4339 inst.instruction |= THUMB_H1;
4340
4341 if (Rs > 7)
4342 inst.instruction |= THUMB_H2;
4343
4344 inst.instruction |= (Rd & 7) | ((Rs & 7) << 3);
4345 }
4346 }
4347 else
4348 {
4349 if (Rd > 7)
4350 {
4351 inst.error = _("only lo regs allowed with immediate");
4352 return;
4353 }
4354
4355 if (move == THUMB_MOVE)
4356 inst.instruction = T_OPCODE_MOV_I8;
4357 else
4358 inst.instruction = T_OPCODE_CMP_I8;
4359
4360 inst.instruction |= Rd << 8;
4361
4362 if (inst.reloc.exp.X_op != O_constant)
4363 inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
4364 else
4365 {
4366 unsigned value = inst.reloc.exp.X_add_number;
4367
4368 if (value > 255)
4369 {
4370 inst.error = _("invalid immediate");
4371 return;
4372 }
4373
4374 inst.instruction |= value;
4375 }
4376 }
4377
4378 end_of_line (str);
4379 }
4380
4381 static void
4382 thumb_load_store (str, load_store, size)
4383 char * str;
4384 int load_store;
4385 int size;
4386 {
4387 int Rd, Rb, Ro = FAIL;
4388
4389 skip_whitespace (str);
4390
4391 if ((Rd = thumb_reg (&str, THUMB_REG_LO)) == FAIL
4392 || skip_past_comma (&str) == FAIL)
4393 {
4394 if (! inst.error)
4395 inst.error = BAD_ARGS;
4396 return;
4397 }
4398
4399 if (*str == '[')
4400 {
4401 str++;
4402 if ((Rb = thumb_reg (&str, THUMB_REG_ANY)) == FAIL)
4403 return;
4404
4405 if (skip_past_comma (&str) != FAIL)
4406 {
4407 if (is_immediate_prefix (*str))
4408 {
4409 str++;
4410 if (my_get_expression (&inst.reloc.exp, &str))
4411 return;
4412 }
4413 else if ((Ro = thumb_reg (&str, THUMB_REG_LO)) == FAIL)
4414 return;
4415 }
4416 else
4417 {
4418 inst.reloc.exp.X_op = O_constant;
4419 inst.reloc.exp.X_add_number = 0;
4420 }
4421
4422 if (*str != ']')
4423 {
4424 inst.error = _("expected ']'");
4425 return;
4426 }
4427 str++;
4428 }
4429 else if (*str == '=')
4430 {
4431 /* Parse an "ldr Rd, =expr" instruction; this is another pseudo op */
4432 str++;
4433
4434 skip_whitespace (str);
4435
4436 if (my_get_expression (& inst.reloc.exp, & str))
4437 return;
4438
4439 end_of_line (str);
4440
4441 if ( inst.reloc.exp.X_op != O_constant
4442 && inst.reloc.exp.X_op != O_symbol)
4443 {
4444 inst.error = "Constant expression expected";
4445 return;
4446 }
4447
4448 if (inst.reloc.exp.X_op == O_constant
4449 && ((inst.reloc.exp.X_add_number & ~0xFF) == 0))
4450 {
4451 /* This can be done with a mov instruction */
4452
4453 inst.instruction = T_OPCODE_MOV_I8 | (Rd << 8);
4454 inst.instruction |= inst.reloc.exp.X_add_number;
4455 return;
4456 }
4457
4458 /* Insert into literal pool */
4459 if (add_to_lit_pool () == FAIL)
4460 {
4461 if (!inst.error)
4462 inst.error = "literal pool insertion failed";
4463 return;
4464 }
4465
4466 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
4467 inst.reloc.pc_rel = 1;
4468 inst.instruction = T_OPCODE_LDR_PC | (Rd << 8);
4469 inst.reloc.exp.X_add_number += 4; /* Adjust ARM pipeline offset to Thumb */
4470
4471 return;
4472 }
4473 else
4474 {
4475 if (my_get_expression (&inst.reloc.exp, &str))
4476 return;
4477
4478 inst.instruction = T_OPCODE_LDR_PC | (Rd << 8);
4479 inst.reloc.pc_rel = 1;
4480 inst.reloc.exp.X_add_number -= 4; /* Pipeline offset */
4481 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
4482 end_of_line (str);
4483 return;
4484 }
4485
4486 if (Rb == REG_PC || Rb == REG_SP)
4487 {
4488 if (size != THUMB_WORD)
4489 {
4490 inst.error = _("byte or halfword not valid for base register");
4491 return;
4492 }
4493 else if (Rb == REG_PC && load_store != THUMB_LOAD)
4494 {
4495 inst.error = _("R15 based store not allowed");
4496 return;
4497 }
4498 else if (Ro != FAIL)
4499 {
4500 inst.error = _("Invalid base register for register offset");
4501 return;
4502 }
4503
4504 if (Rb == REG_PC)
4505 inst.instruction = T_OPCODE_LDR_PC;
4506 else if (load_store == THUMB_LOAD)
4507 inst.instruction = T_OPCODE_LDR_SP;
4508 else
4509 inst.instruction = T_OPCODE_STR_SP;
4510
4511 inst.instruction |= Rd << 8;
4512 if (inst.reloc.exp.X_op == O_constant)
4513 {
4514 unsigned offset = inst.reloc.exp.X_add_number;
4515
4516 if (offset & ~0x3fc)
4517 {
4518 inst.error = _("invalid offset");
4519 return;
4520 }
4521
4522 inst.instruction |= offset >> 2;
4523 }
4524 else
4525 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
4526 }
4527 else if (Rb > 7)
4528 {
4529 inst.error = _("invalid base register in load/store");
4530 return;
4531 }
4532 else if (Ro == FAIL)
4533 {
4534 /* Immediate offset */
4535 if (size == THUMB_WORD)
4536 inst.instruction = (load_store == THUMB_LOAD
4537 ? T_OPCODE_LDR_IW : T_OPCODE_STR_IW);
4538 else if (size == THUMB_HALFWORD)
4539 inst.instruction = (load_store == THUMB_LOAD
4540 ? T_OPCODE_LDR_IH : T_OPCODE_STR_IH);
4541 else
4542 inst.instruction = (load_store == THUMB_LOAD
4543 ? T_OPCODE_LDR_IB : T_OPCODE_STR_IB);
4544
4545 inst.instruction |= Rd | (Rb << 3);
4546
4547 if (inst.reloc.exp.X_op == O_constant)
4548 {
4549 unsigned offset = inst.reloc.exp.X_add_number;
4550
4551 if (offset & ~(0x1f << size))
4552 {
4553 inst.error = _("Invalid offset");
4554 return;
4555 }
4556 inst.instruction |= (offset >> size) << 6;
4557 }
4558 else
4559 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
4560 }
4561 else
4562 {
4563 /* Register offset */
4564 if (size == THUMB_WORD)
4565 inst.instruction = (load_store == THUMB_LOAD
4566 ? T_OPCODE_LDR_RW : T_OPCODE_STR_RW);
4567 else if (size == THUMB_HALFWORD)
4568 inst.instruction = (load_store == THUMB_LOAD
4569 ? T_OPCODE_LDR_RH : T_OPCODE_STR_RH);
4570 else
4571 inst.instruction = (load_store == THUMB_LOAD
4572 ? T_OPCODE_LDR_RB : T_OPCODE_STR_RB);
4573
4574 inst.instruction |= Rd | (Rb << 3) | (Ro << 6);
4575 }
4576
4577 end_of_line (str);
4578 }
4579
4580 static void
4581 do_t_nop (str)
4582 char * str;
4583 {
4584 /* Do nothing */
4585 end_of_line (str);
4586 return;
4587 }
4588
4589 /* Handle the Format 4 instructions that do not have equivalents in other
4590 formats. That is, ADC, AND, EOR, SBC, ROR, TST, NEG, CMN, ORR, MUL,
4591 BIC and MVN. */
4592 static void
4593 do_t_arit (str)
4594 char * str;
4595 {
4596 int Rd, Rs, Rn;
4597
4598 skip_whitespace (str);
4599
4600 if ((Rd = thumb_reg (&str, THUMB_REG_LO)) == FAIL
4601 || skip_past_comma (&str) == FAIL
4602 || (Rs = thumb_reg (&str, THUMB_REG_LO)) == FAIL)
4603 {
4604 inst.error = BAD_ARGS;
4605 return;
4606 }
4607
4608 if (skip_past_comma (&str) != FAIL)
4609 {
4610 /* Three operand format not allowed for TST, CMN, NEG and MVN.
4611 (It isn't allowed for CMP either, but that isn't handled by this
4612 function.) */
4613 if (inst.instruction == T_OPCODE_TST
4614 || inst.instruction == T_OPCODE_CMN
4615 || inst.instruction == T_OPCODE_NEG
4616 || inst.instruction == T_OPCODE_MVN)
4617 {
4618 inst.error = BAD_ARGS;
4619 return;
4620 }
4621
4622 if ((Rn = thumb_reg (&str, THUMB_REG_LO)) == FAIL)
4623 return;
4624
4625 if (Rs != Rd)
4626 {
4627 inst.error = _("dest and source1 one must be the same register");
4628 return;
4629 }
4630 Rs = Rn;
4631 }
4632
4633 if (inst.instruction == T_OPCODE_MUL
4634 && Rs == Rd)
4635 as_tsktsk (_("Rs and Rd must be different in MUL"));
4636
4637 inst.instruction |= Rd | (Rs << 3);
4638 end_of_line (str);
4639 }
4640
4641 static void
4642 do_t_add (str)
4643 char * str;
4644 {
4645 thumb_add_sub (str, 0);
4646 }
4647
4648 static void
4649 do_t_asr (str)
4650 char * str;
4651 {
4652 thumb_shift (str, THUMB_ASR);
4653 }
4654
4655 static void
4656 do_t_branch9 (str)
4657 char * str;
4658 {
4659 if (my_get_expression (&inst.reloc.exp, &str))
4660 return;
4661 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH9;
4662 inst.reloc.pc_rel = 1;
4663 end_of_line (str);
4664 }
4665
4666 static void
4667 do_t_branch12 (str)
4668 char * str;
4669 {
4670 if (my_get_expression (&inst.reloc.exp, &str))
4671 return;
4672 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH12;
4673 inst.reloc.pc_rel = 1;
4674 end_of_line (str);
4675 }
4676
4677 /* Find the real, Thumb encoded start of a Thumb function. */
4678
4679 static symbolS *
4680 find_real_start (symbolP)
4681 symbolS * symbolP;
4682 {
4683 char * real_start;
4684 const char * name = S_GET_NAME (symbolP);
4685 symbolS * new_target;
4686
4687 /* This definiton must agree with the one in gcc/config/arm/thumb.c */
4688 #define STUB_NAME ".real_start_of"
4689
4690 if (name == NULL)
4691 abort();
4692
4693 /* Names that start with '.' are local labels, not function entry points.
4694 The compiler may generate BL instructions to these labels because it
4695 needs to perform a branch to a far away location. */
4696 if (name[0] == '.')
4697 return symbolP;
4698
4699 real_start = malloc (strlen (name) + strlen (STUB_NAME) + 1);
4700 sprintf (real_start, "%s%s", STUB_NAME, name);
4701
4702 new_target = symbol_find (real_start);
4703
4704 if (new_target == NULL)
4705 {
4706 as_warn ("Failed to find real start of function: %s\n", name);
4707 new_target = symbolP;
4708 }
4709
4710 free (real_start);
4711
4712 return new_target;
4713 }
4714
4715
4716 static void
4717 do_t_branch23 (str)
4718 char * str;
4719 {
4720 if (my_get_expression (& inst.reloc.exp, & str))
4721 return;
4722
4723 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH23;
4724 inst.reloc.pc_rel = 1;
4725 end_of_line (str);
4726
4727 /* If the destination of the branch is a defined symbol which does not have
4728 the THUMB_FUNC attribute, then we must be calling a function which has
4729 the (interfacearm) attribute. We look for the Thumb entry point to that
4730 function and change the branch to refer to that function instead. */
4731 if ( inst.reloc.exp.X_op == O_symbol
4732 && inst.reloc.exp.X_add_symbol != NULL
4733 && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
4734 && ! THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
4735 inst.reloc.exp.X_add_symbol = find_real_start (inst.reloc.exp.X_add_symbol);
4736 }
4737
4738 static void
4739 do_t_bx (str)
4740 char * str;
4741 {
4742 int reg;
4743
4744 skip_whitespace (str);
4745
4746 if ((reg = thumb_reg (&str, THUMB_REG_ANY)) == FAIL)
4747 return;
4748
4749 /* This sets THUMB_H2 from the top bit of reg. */
4750 inst.instruction |= reg << 3;
4751
4752 /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC. The reloc
4753 should cause the alignment to be checked once it is known. This is
4754 because BX PC only works if the instruction is word aligned. */
4755
4756 end_of_line (str);
4757 }
4758
4759 static void
4760 do_t_compare (str)
4761 char * str;
4762 {
4763 thumb_mov_compare (str, THUMB_COMPARE);
4764 }
4765
4766 static void
4767 do_t_ldmstm (str)
4768 char * str;
4769 {
4770 int Rb;
4771 long range;
4772
4773 skip_whitespace (str);
4774
4775 if ((Rb = thumb_reg (&str, THUMB_REG_LO)) == FAIL)
4776 return;
4777
4778 if (*str != '!')
4779 as_warn (_("Inserted missing '!': load/store multiple always writes back base register"));
4780 else
4781 str++;
4782
4783 if (skip_past_comma (&str) == FAIL
4784 || (range = reg_list (&str)) == FAIL)
4785 {
4786 if (! inst.error)
4787 inst.error = BAD_ARGS;
4788 return;
4789 }
4790
4791 if (inst.reloc.type != BFD_RELOC_NONE)
4792 {
4793 /* This really doesn't seem worth it. */
4794 inst.reloc.type = BFD_RELOC_NONE;
4795 inst.error = _("Expression too complex");
4796 return;
4797 }
4798
4799 if (range & ~0xff)
4800 {
4801 inst.error = _("only lo-regs valid in load/store multiple");
4802 return;
4803 }
4804
4805 inst.instruction |= (Rb << 8) | range;
4806 end_of_line (str);
4807 }
4808
4809 static void
4810 do_t_ldr (str)
4811 char * str;
4812 {
4813 thumb_load_store (str, THUMB_LOAD, THUMB_WORD);
4814 }
4815
4816 static void
4817 do_t_ldrb (str)
4818 char * str;
4819 {
4820 thumb_load_store (str, THUMB_LOAD, THUMB_BYTE);
4821 }
4822
4823 static void
4824 do_t_ldrh (str)
4825 char * str;
4826 {
4827 thumb_load_store (str, THUMB_LOAD, THUMB_HALFWORD);
4828 }
4829
4830 static void
4831 do_t_lds (str)
4832 char * str;
4833 {
4834 int Rd, Rb, Ro;
4835
4836 skip_whitespace (str);
4837
4838 if ((Rd = thumb_reg (&str, THUMB_REG_LO)) == FAIL
4839 || skip_past_comma (&str) == FAIL
4840 || *str++ != '['
4841 || (Rb = thumb_reg (&str, THUMB_REG_LO)) == FAIL
4842 || skip_past_comma (&str) == FAIL
4843 || (Ro = thumb_reg (&str, THUMB_REG_LO)) == FAIL
4844 || *str++ != ']')
4845 {
4846 if (! inst.error)
4847 inst.error = _("Syntax: ldrs[b] Rd, [Rb, Ro]");
4848 return;
4849 }
4850
4851 inst.instruction |= Rd | (Rb << 3) | (Ro << 6);
4852 end_of_line (str);
4853 }
4854
4855 static void
4856 do_t_lsl (str)
4857 char * str;
4858 {
4859 thumb_shift (str, THUMB_LSL);
4860 }
4861
4862 static void
4863 do_t_lsr (str)
4864 char * str;
4865 {
4866 thumb_shift (str, THUMB_LSR);
4867 }
4868
4869 static void
4870 do_t_mov (str)
4871 char * str;
4872 {
4873 thumb_mov_compare (str, THUMB_MOVE);
4874 }
4875
4876 static void
4877 do_t_push_pop (str)
4878 char * str;
4879 {
4880 long range;
4881
4882 skip_whitespace (str);
4883
4884 if ((range = reg_list (&str)) == FAIL)
4885 {
4886 if (! inst.error)
4887 inst.error = BAD_ARGS;
4888 return;
4889 }
4890
4891 if (inst.reloc.type != BFD_RELOC_NONE)
4892 {
4893 /* This really doesn't seem worth it. */
4894 inst.reloc.type = BFD_RELOC_NONE;
4895 inst.error = _("Expression too complex");
4896 return;
4897 }
4898
4899 if (range & ~0xff)
4900 {
4901 if ((inst.instruction == T_OPCODE_PUSH
4902 && (range & ~0xff) == 1 << REG_LR)
4903 || (inst.instruction == T_OPCODE_POP
4904 && (range & ~0xff) == 1 << REG_PC))
4905 {
4906 inst.instruction |= THUMB_PP_PC_LR;
4907 range &= 0xff;
4908 }
4909 else
4910 {
4911 inst.error = _("invalid register list to push/pop instruction");
4912 return;
4913 }
4914 }
4915
4916 inst.instruction |= range;
4917 end_of_line (str);
4918 }
4919
4920 static void
4921 do_t_str (str)
4922 char * str;
4923 {
4924 thumb_load_store (str, THUMB_STORE, THUMB_WORD);
4925 }
4926
4927 static void
4928 do_t_strb (str)
4929 char * str;
4930 {
4931 thumb_load_store (str, THUMB_STORE, THUMB_BYTE);
4932 }
4933
4934 static void
4935 do_t_strh (str)
4936 char * str;
4937 {
4938 thumb_load_store (str, THUMB_STORE, THUMB_HALFWORD);
4939 }
4940
4941 static void
4942 do_t_sub (str)
4943 char * str;
4944 {
4945 thumb_add_sub (str, 1);
4946 }
4947
4948 static void
4949 do_t_swi (str)
4950 char * str;
4951 {
4952 skip_whitespace (str);
4953
4954 if (my_get_expression (&inst.reloc.exp, &str))
4955 return;
4956
4957 inst.reloc.type = BFD_RELOC_ARM_SWI;
4958 end_of_line (str);
4959 return;
4960 }
4961
4962 static void
4963 do_t_adr (str)
4964 char * str;
4965 {
4966 int reg;
4967
4968 /* This is a pseudo-op of the form "adr rd, label" to be converted
4969 into a relative address of the form "add rd, pc, #label-.-4". */
4970 skip_whitespace (str);
4971
4972 /* Store Rd in temporary location inside instruction. */
4973 if ((reg = reg_required_here (&str, 4)) == FAIL
4974 || (reg > 7) /* For Thumb reg must be r0..r7. */
4975 || skip_past_comma (&str) == FAIL
4976 || my_get_expression (&inst.reloc.exp, &str))
4977 {
4978 if (!inst.error)
4979 inst.error = BAD_ARGS;
4980 return;
4981 }
4982
4983 inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
4984 inst.reloc.exp.X_add_number -= 4; /* PC relative adjust. */
4985 inst.reloc.pc_rel = 1;
4986 inst.instruction |= REG_PC; /* Rd is already placed into the instruction. */
4987
4988 end_of_line (str);
4989 }
4990
4991 static void
4992 insert_reg (entry)
4993 int entry;
4994 {
4995 int len = strlen (reg_table[entry].name) + 2;
4996 char * buf = (char *) xmalloc (len);
4997 char * buf2 = (char *) xmalloc (len);
4998 int i = 0;
4999
5000 #ifdef REGISTER_PREFIX
5001 buf[i++] = REGISTER_PREFIX;
5002 #endif
5003
5004 strcpy (buf + i, reg_table[entry].name);
5005
5006 for (i = 0; buf[i]; i++)
5007 buf2[i] = islower (buf[i]) ? toupper (buf[i]) : buf[i];
5008
5009 buf2[i] = '\0';
5010
5011 hash_insert (arm_reg_hsh, buf, (PTR) &reg_table[entry]);
5012 hash_insert (arm_reg_hsh, buf2, (PTR) &reg_table[entry]);
5013 }
5014
5015 static void
5016 insert_reg_alias (str, regnum)
5017 char *str;
5018 int regnum;
5019 {
5020 struct reg_entry *new =
5021 (struct reg_entry *)xmalloc (sizeof (struct reg_entry));
5022 char *name = xmalloc (strlen (str) + 1);
5023 strcpy (name, str);
5024
5025 new->name = name;
5026 new->number = regnum;
5027
5028 hash_insert (arm_reg_hsh, name, (PTR) new);
5029 }
5030
5031 static void
5032 set_constant_flonums ()
5033 {
5034 int i;
5035
5036 for (i = 0; i < NUM_FLOAT_VALS; i++)
5037 if (atof_ieee ((char *)fp_const[i], 'x', fp_values[i]) == NULL)
5038 abort ();
5039 }
5040
5041 void
5042 md_begin ()
5043 {
5044 unsigned mach;
5045 unsigned int i;
5046
5047 if ( (arm_ops_hsh = hash_new ()) == NULL
5048 || (arm_tops_hsh = hash_new ()) == NULL
5049 || (arm_cond_hsh = hash_new ()) == NULL
5050 || (arm_shift_hsh = hash_new ()) == NULL
5051 || (arm_reg_hsh = hash_new ()) == NULL
5052 || (arm_psr_hsh = hash_new ()) == NULL)
5053 as_fatal (_("Virtual memory exhausted"));
5054
5055 for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
5056 hash_insert (arm_ops_hsh, insns[i].template, (PTR) (insns + i));
5057 for (i = 0; i < sizeof (tinsns) / sizeof (struct thumb_opcode); i++)
5058 hash_insert (arm_tops_hsh, tinsns[i].template, (PTR) (tinsns + i));
5059 for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
5060 hash_insert (arm_cond_hsh, conds[i].template, (PTR) (conds + i));
5061 for (i = 0; i < sizeof (shift) / sizeof (struct asm_shift); i++)
5062 hash_insert (arm_shift_hsh, shift[i].template, (PTR) (shift + i));
5063 for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
5064 hash_insert (arm_psr_hsh, psrs[i].template, (PTR) (psrs + i));
5065
5066 for (i = 0; reg_table[i].name; i++)
5067 insert_reg (i);
5068
5069 set_constant_flonums ();
5070
5071 #if defined OBJ_COFF || defined OBJ_ELF
5072 {
5073 unsigned int flags = 0;
5074
5075 /* Set the flags in the private structure. */
5076 if (uses_apcs_26) flags |= F_APCS26;
5077 if (support_interwork) flags |= F_INTERWORK;
5078 if (uses_apcs_float) flags |= F_APCS_FLOAT;
5079 if (pic_code) flags |= F_PIC;
5080 if ((cpu_variant & FPU_ALL) == FPU_NONE) flags |= F_SOFT_FLOAT;
5081
5082 bfd_set_private_flags (stdoutput, flags);
5083 }
5084 #endif
5085
5086 /* Record the CPU type as well. */
5087 switch (cpu_variant & ARM_CPU_MASK)
5088 {
5089 case ARM_2:
5090 mach = bfd_mach_arm_2;
5091 break;
5092
5093 case ARM_3: /* Also ARM_250. */
5094 mach = bfd_mach_arm_2a;
5095 break;
5096
5097 default:
5098 case ARM_6 | ARM_3 | ARM_2: /* Actually no CPU type defined. */
5099 mach = bfd_mach_arm_4;
5100 break;
5101
5102 case ARM_7: /* Also ARM_6. */
5103 mach = bfd_mach_arm_3;
5104 break;
5105 }
5106
5107 /* Catch special cases. */
5108 if (cpu_variant != (FPU_DEFAULT | CPU_DEFAULT))
5109 {
5110 if (cpu_variant & (ARM_EXT_V5 & ARM_THUMB))
5111 mach = bfd_mach_arm_5T;
5112 else if (cpu_variant & ARM_EXT_V5)
5113 mach = bfd_mach_arm_5;
5114 else if (cpu_variant & ARM_THUMB)
5115 mach = bfd_mach_arm_4T;
5116 else if ((cpu_variant & ARM_ARCH_V4) == ARM_ARCH_V4)
5117 mach = bfd_mach_arm_4;
5118 else if (cpu_variant & ARM_LONGMUL)
5119 mach = bfd_mach_arm_3M;
5120 }
5121
5122 bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
5123 }
5124
5125 /* Turn an integer of n bytes (in val) into a stream of bytes appropriate
5126 for use in the a.out file, and stores them in the array pointed to by buf.
5127 This knows about the endian-ness of the target machine and does
5128 THE RIGHT THING, whatever it is. Possible values for n are 1 (byte)
5129 2 (short) and 4 (long) Floating numbers are put out as a series of
5130 LITTLENUMS (shorts, here at least). */
5131 void
5132 md_number_to_chars (buf, val, n)
5133 char * buf;
5134 valueT val;
5135 int n;
5136 {
5137 if (target_big_endian)
5138 number_to_chars_bigendian (buf, val, n);
5139 else
5140 number_to_chars_littleendian (buf, val, n);
5141 }
5142
5143 static valueT
5144 md_chars_to_number (buf, n)
5145 char * buf;
5146 int n;
5147 {
5148 valueT result = 0;
5149 unsigned char * where = (unsigned char *) buf;
5150
5151 if (target_big_endian)
5152 {
5153 while (n--)
5154 {
5155 result <<= 8;
5156 result |= (*where++ & 255);
5157 }
5158 }
5159 else
5160 {
5161 while (n--)
5162 {
5163 result <<= 8;
5164 result |= (where[n] & 255);
5165 }
5166 }
5167
5168 return result;
5169 }
5170
5171 /* Turn a string in input_line_pointer into a floating point constant
5172 of type TYPE, and store the appropriate bytes in *litP. The number
5173 of LITTLENUMS emitted is stored in *sizeP . An error message is
5174 returned, or NULL on OK.
5175
5176 Note that fp constants aren't represent in the normal way on the ARM.
5177 In big endian mode, things are as expected. However, in little endian
5178 mode fp constants are big-endian word-wise, and little-endian byte-wise
5179 within the words. For example, (double) 1.1 in big endian mode is
5180 the byte sequence 3f f1 99 99 99 99 99 9a, and in little endian mode is
5181 the byte sequence 99 99 f1 3f 9a 99 99 99.
5182
5183 ??? The format of 12 byte floats is uncertain according to gcc's arm.h. */
5184
5185 char *
5186 md_atof (type, litP, sizeP)
5187 char type;
5188 char * litP;
5189 int * sizeP;
5190 {
5191 int prec;
5192 LITTLENUM_TYPE words[MAX_LITTLENUMS];
5193 char *t;
5194 int i;
5195
5196 switch (type)
5197 {
5198 case 'f':
5199 case 'F':
5200 case 's':
5201 case 'S':
5202 prec = 2;
5203 break;
5204
5205 case 'd':
5206 case 'D':
5207 case 'r':
5208 case 'R':
5209 prec = 4;
5210 break;
5211
5212 case 'x':
5213 case 'X':
5214 prec = 6;
5215 break;
5216
5217 case 'p':
5218 case 'P':
5219 prec = 6;
5220 break;
5221
5222 default:
5223 *sizeP = 0;
5224 return _("Bad call to MD_ATOF()");
5225 }
5226
5227 t = atof_ieee (input_line_pointer, type, words);
5228 if (t)
5229 input_line_pointer = t;
5230 *sizeP = prec * 2;
5231
5232 if (target_big_endian)
5233 {
5234 for (i = 0; i < prec; i++)
5235 {
5236 md_number_to_chars (litP, (valueT) words[i], 2);
5237 litP += 2;
5238 }
5239 }
5240 else
5241 {
5242 /* For a 4 byte float the order of elements in `words' is 1 0. For an
5243 8 byte float the order is 1 0 3 2. */
5244 for (i = 0; i < prec; i += 2)
5245 {
5246 md_number_to_chars (litP, (valueT) words[i + 1], 2);
5247 md_number_to_chars (litP + 2, (valueT) words[i], 2);
5248 litP += 4;
5249 }
5250 }
5251
5252 return 0;
5253 }
5254
5255 /* The knowledge of the PC's pipeline offset is built into the insns themselves. */
5256 long
5257 md_pcrel_from (fixP)
5258 fixS * fixP;
5259 {
5260 if ( fixP->fx_addsy
5261 && S_GET_SEGMENT (fixP->fx_addsy) == undefined_section
5262 && fixP->fx_subsy == NULL)
5263 return 0;
5264
5265 if (fixP->fx_pcrel && (fixP->fx_r_type == BFD_RELOC_ARM_THUMB_ADD))
5266 {
5267 /* PC relative addressing on the Thumb is slightly odd
5268 as the bottom two bits of the PC are forced to zero
5269 for the calculation. */
5270 return (fixP->fx_where + fixP->fx_frag->fr_address) & ~3;
5271 }
5272
5273 #ifdef TE_WINCE
5274 /* The pattern was adjusted to accomodate CE's off-by-one fixups,
5275 so we un-adjust here to compensate for the accomodation. */
5276 return fixP->fx_where + fixP->fx_frag->fr_address + 8;
5277 #else
5278 return fixP->fx_where + fixP->fx_frag->fr_address;
5279 #endif
5280 }
5281
5282 /* Round up a section size to the appropriate boundary. */
5283 valueT
5284 md_section_align (segment, size)
5285 segT segment ATTRIBUTE_UNUSED;
5286 valueT size;
5287 {
5288 #ifdef OBJ_ELF
5289 return size;
5290 #else
5291 /* Round all sects to multiple of 4 */
5292 return (size + 3) & ~3;
5293 #endif
5294 }
5295
5296 /* Under ELF we need to default _GLOBAL_OFFSET_TABLE. Otherwise
5297 we have no need to default values of symbols. */
5298
5299 /* ARGSUSED */
5300 symbolS *
5301 md_undefined_symbol (name)
5302 char * name ATTRIBUTE_UNUSED;
5303 {
5304 #ifdef OBJ_ELF
5305 if (name[0] == '_' && name[1] == 'G'
5306 && streq (name, GLOBAL_OFFSET_TABLE_NAME))
5307 {
5308 if (!GOT_symbol)
5309 {
5310 if (symbol_find (name))
5311 as_bad ("GOT already in the symbol table");
5312
5313 GOT_symbol = symbol_new (name, undefined_section,
5314 (valueT)0, & zero_address_frag);
5315 }
5316
5317 return GOT_symbol;
5318 }
5319 #endif
5320
5321 return 0;
5322 }
5323
5324 /* arm_reg_parse () := if it looks like a register, return its token and
5325 advance the pointer. */
5326
5327 static int
5328 arm_reg_parse (ccp)
5329 register char ** ccp;
5330 {
5331 char * start = * ccp;
5332 char c;
5333 char * p;
5334 struct reg_entry * reg;
5335
5336 #ifdef REGISTER_PREFIX
5337 if (*start != REGISTER_PREFIX)
5338 return FAIL;
5339 p = start + 1;
5340 #else
5341 p = start;
5342 #ifdef OPTIONAL_REGISTER_PREFIX
5343 if (*p == OPTIONAL_REGISTER_PREFIX)
5344 p++, start++;
5345 #endif
5346 #endif
5347 if (!isalpha (*p) || !is_name_beginner (*p))
5348 return FAIL;
5349
5350 c = *p++;
5351 while (isalpha (c) || isdigit (c) || c == '_')
5352 c = *p++;
5353
5354 *--p = 0;
5355 reg = (struct reg_entry *) hash_find (arm_reg_hsh, start);
5356 *p = c;
5357
5358 if (reg)
5359 {
5360 *ccp = p;
5361 return reg->number;
5362 }
5363
5364 return FAIL;
5365 }
5366
5367 int
5368 md_apply_fix3 (fixP, val, seg)
5369 fixS * fixP;
5370 valueT * val;
5371 segT seg;
5372 {
5373 offsetT value = * val;
5374 offsetT newval;
5375 unsigned int newimm;
5376 unsigned long temp;
5377 int sign;
5378 char * buf = fixP->fx_where + fixP->fx_frag->fr_literal;
5379 arm_fix_data * arm_data = (arm_fix_data *) fixP->tc_fix_data;
5380
5381 assert (fixP->fx_r_type < BFD_RELOC_UNUSED);
5382
5383 /* Note whether this will delete the relocation. */
5384 #if 0 /* patch from REarnshaw to JDavis (disabled for the moment, since it doesn't work fully) */
5385 if ((fixP->fx_addsy == 0 || symbol_constant_p (fixP->fx_addsy))
5386 && !fixP->fx_pcrel)
5387 #else
5388 if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
5389 #endif
5390 fixP->fx_done = 1;
5391
5392 /* If this symbol is in a different section then we need to leave it for
5393 the linker to deal with. Unfortunately, md_pcrel_from can't tell,
5394 so we have to undo it's effects here. */
5395 if (fixP->fx_pcrel)
5396 {
5397 if (fixP->fx_addsy != NULL
5398 && S_IS_DEFINED (fixP->fx_addsy)
5399 && S_GET_SEGMENT (fixP->fx_addsy) != seg)
5400 {
5401 if (target_oabi
5402 && (fixP->fx_r_type == BFD_RELOC_ARM_PCREL_BRANCH
5403 || fixP->fx_r_type == BFD_RELOC_ARM_PCREL_BLX
5404 ))
5405 value = 0;
5406 else
5407 value += md_pcrel_from (fixP);
5408 }
5409 }
5410
5411 fixP->fx_addnumber = value; /* Remember value for emit_reloc. */
5412
5413 switch (fixP->fx_r_type)
5414 {
5415 case BFD_RELOC_ARM_IMMEDIATE:
5416 newimm = validate_immediate (value);
5417 temp = md_chars_to_number (buf, INSN_SIZE);
5418
5419 /* If the instruction will fail, see if we can fix things up by
5420 changing the opcode. */
5421 if (newimm == (unsigned int) FAIL
5422 && (newimm = negate_data_op (&temp, value)) == (unsigned int) FAIL)
5423 {
5424 as_bad_where (fixP->fx_file, fixP->fx_line,
5425 _("invalid constant (%lx) after fixup"),
5426 (unsigned long) value);
5427 break;
5428 }
5429
5430 newimm |= (temp & 0xfffff000);
5431 md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
5432 break;
5433
5434 case BFD_RELOC_ARM_ADRL_IMMEDIATE:
5435 {
5436 unsigned int highpart = 0;
5437 unsigned int newinsn = 0xe1a00000; /* nop */
5438 newimm = validate_immediate (value);
5439 temp = md_chars_to_number (buf, INSN_SIZE);
5440
5441 /* If the instruction will fail, see if we can fix things up by
5442 changing the opcode. */
5443 if (newimm == (unsigned int) FAIL
5444 && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
5445 {
5446 /* No ? OK - try using two ADD instructions to generate the value. */
5447 newimm = validate_immediate_twopart (value, & highpart);
5448
5449 /* Yes - then make sure that the second instruction is also an add. */
5450 if (newimm != (unsigned int) FAIL)
5451 newinsn = temp;
5452 /* Still No ? Try using a negated value. */
5453 else if (validate_immediate_twopart (- value, & highpart) != (unsigned int) FAIL)
5454 temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
5455 /* Otherwise - give up. */
5456 else
5457 {
5458 as_bad_where (fixP->fx_file, fixP->fx_line,
5459 _("Unable to compute ADRL instructions for PC offset of 0x%x"), value);
5460 break;
5461 }
5462
5463 /* Replace the first operand in the 2nd instruction (which is the PC)
5464 with the destination register. We have already added in the PC in the
5465 first instruction and we do not want to do it again. */
5466 newinsn &= ~ 0xf0000;
5467 newinsn |= ((newinsn & 0x0f000) << 4);
5468 }
5469
5470 newimm |= (temp & 0xfffff000);
5471 md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
5472
5473 highpart |= (newinsn & 0xfffff000);
5474 md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
5475 }
5476 break;
5477
5478 case BFD_RELOC_ARM_OFFSET_IMM:
5479 sign = value >= 0;
5480
5481 if (value < 0)
5482 value = - value;
5483
5484 if (validate_offset_imm (value, 0) == FAIL)
5485 {
5486 as_bad_where (fixP->fx_file, fixP->fx_line,
5487 _("bad immediate value for offset (%ld)"), (long) value);
5488 break;
5489 }
5490
5491 newval = md_chars_to_number (buf, INSN_SIZE);
5492 newval &= 0xff7ff000;
5493 newval |= value | (sign ? INDEX_UP : 0);
5494 md_number_to_chars (buf, newval, INSN_SIZE);
5495 break;
5496
5497 case BFD_RELOC_ARM_OFFSET_IMM8:
5498 case BFD_RELOC_ARM_HWLITERAL:
5499 sign = value >= 0;
5500
5501 if (value < 0)
5502 value = - value;
5503
5504 if (validate_offset_imm (value, 1) == FAIL)
5505 {
5506 if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
5507 as_bad_where (fixP->fx_file, fixP->fx_line,
5508 _("invalid literal constant: pool needs to be closer"));
5509 else
5510 as_bad (_("bad immediate value for half-word offset (%ld)"),
5511 (long) value);
5512 break;
5513 }
5514
5515 newval = md_chars_to_number (buf, INSN_SIZE);
5516 newval &= 0xff7ff0f0;
5517 newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
5518 md_number_to_chars (buf, newval, INSN_SIZE);
5519 break;
5520
5521 case BFD_RELOC_ARM_LITERAL:
5522 sign = value >= 0;
5523
5524 if (value < 0)
5525 value = - value;
5526
5527 if (validate_offset_imm (value, 0) == FAIL)
5528 {
5529 as_bad_where (fixP->fx_file, fixP->fx_line,
5530 _("invalid literal constant: pool needs to be closer"));
5531 break;
5532 }
5533
5534 newval = md_chars_to_number (buf, INSN_SIZE);
5535 newval &= 0xff7ff000;
5536 newval |= value | (sign ? INDEX_UP : 0);
5537 md_number_to_chars (buf, newval, INSN_SIZE);
5538 break;
5539
5540 case BFD_RELOC_ARM_SHIFT_IMM:
5541 newval = md_chars_to_number (buf, INSN_SIZE);
5542 if (((unsigned long) value) > 32
5543 || (value == 32
5544 && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
5545 {
5546 as_bad_where (fixP->fx_file, fixP->fx_line,
5547 _("shift expression is too large"));
5548 break;
5549 }
5550
5551 if (value == 0)
5552 newval &= ~0x60; /* Shifts of zero must be done as lsl */
5553 else if (value == 32)
5554 value = 0;
5555 newval &= 0xfffff07f;
5556 newval |= (value & 0x1f) << 7;
5557 md_number_to_chars (buf, newval , INSN_SIZE);
5558 break;
5559
5560 case BFD_RELOC_ARM_SWI:
5561 if (arm_data->thumb_mode)
5562 {
5563 if (((unsigned long) value) > 0xff)
5564 as_bad_where (fixP->fx_file, fixP->fx_line,
5565 _("Invalid swi expression"));
5566 newval = md_chars_to_number (buf, THUMB_SIZE) & 0xff00;
5567 newval |= value;
5568 md_number_to_chars (buf, newval, THUMB_SIZE);
5569 }
5570 else
5571 {
5572 if (((unsigned long) value) > 0x00ffffff)
5573 as_bad_where (fixP->fx_file, fixP->fx_line,
5574 _("Invalid swi expression"));
5575 newval = md_chars_to_number (buf, INSN_SIZE) & 0xff000000;
5576 newval |= value;
5577 md_number_to_chars (buf, newval , INSN_SIZE);
5578 }
5579 break;
5580
5581 case BFD_RELOC_ARM_MULTI:
5582 if (((unsigned long) value) > 0xffff)
5583 as_bad_where (fixP->fx_file, fixP->fx_line,
5584 _("Invalid expression in load/store multiple"));
5585 newval = value | md_chars_to_number (buf, INSN_SIZE);
5586 md_number_to_chars (buf, newval, INSN_SIZE);
5587 break;
5588
5589 case BFD_RELOC_ARM_PCREL_BRANCH:
5590 newval = md_chars_to_number (buf, INSN_SIZE);
5591
5592 /* Sign-extend a 24-bit number. */
5593 #define SEXT24(x) ((((x) & 0xffffff) ^ (~ 0x7fffff)) + 0x800000)
5594
5595 #ifdef OBJ_ELF
5596 if (! target_oabi)
5597 value = fixP->fx_offset;
5598 #endif
5599
5600 /* We are going to store value (shifted right by two) in the
5601 instruction, in a 24 bit, signed field. Thus we need to check
5602 that none of the top 8 bits of the shifted value (top 7 bits of
5603 the unshifted, unsigned value) are set, or that they are all set. */
5604 if ((value & ~ ((offsetT) 0x1ffffff)) != 0
5605 && ((value & ~ ((offsetT) 0x1ffffff)) != ~ ((offsetT) 0x1ffffff)))
5606 {
5607 #ifdef OBJ_ELF
5608 /* Normally we would be stuck at this point, since we cannot store
5609 the absolute address that is the destination of the branch in the
5610 24 bits of the branch instruction. If however, we happen to know
5611 that the destination of the branch is in the same section as the
5612 branch instruciton itself, then we can compute the relocation for
5613 ourselves and not have to bother the linker with it.
5614
5615 FIXME: The tests for OBJ_ELF and ! target_oabi are only here
5616 because I have not worked out how to do this for OBJ_COFF or
5617 target_oabi. */
5618 if (! target_oabi
5619 && fixP->fx_addsy != NULL
5620 && S_IS_DEFINED (fixP->fx_addsy)
5621 && S_GET_SEGMENT (fixP->fx_addsy) == seg)
5622 {
5623 /* Get pc relative value to go into the branch. */
5624 value = * val;
5625
5626 /* Permit a backward branch provided that enough bits are set.
5627 Allow a forwards branch, provided that enough bits are clear. */
5628 if ((value & ~ ((offsetT) 0x1ffffff)) == ~ ((offsetT) 0x1ffffff)
5629 || (value & ~ ((offsetT) 0x1ffffff)) == 0)
5630 fixP->fx_done = 1;
5631 }
5632
5633 if (! fixP->fx_done)
5634 #endif
5635 as_bad_where (fixP->fx_file, fixP->fx_line,
5636 _("gas can't handle same-section branch dest >= 0x04000000"));
5637 }
5638
5639 value >>= 2;
5640 value += SEXT24 (newval);
5641
5642 if ((value & ~ ((offsetT) 0xffffff)) != 0
5643 && ((value & ~ ((offsetT) 0xffffff)) != ~ ((offsetT) 0xffffff)))
5644 as_bad_where (fixP->fx_file, fixP->fx_line,
5645 _("out of range branch"));
5646
5647 newval = (value & 0x00ffffff) | (newval & 0xff000000);
5648 md_number_to_chars (buf, newval, INSN_SIZE);
5649 break;
5650
5651 case BFD_RELOC_ARM_PCREL_BLX:
5652 {
5653 offsetT hbit;
5654 newval = md_chars_to_number (buf, INSN_SIZE);
5655
5656 #ifdef OBJ_ELF
5657 if (! target_oabi)
5658 value = fixP->fx_offset;
5659 #endif
5660 hbit = (value >> 1) & 1;
5661 value = (value >> 2) & 0x00ffffff;
5662 value = (value + (newval & 0x00ffffff)) & 0x00ffffff;
5663 newval = value | (newval & 0xfe000000) | (hbit << 24);
5664 md_number_to_chars (buf, newval, INSN_SIZE);
5665 }
5666 break;
5667
5668 case BFD_RELOC_THUMB_PCREL_BRANCH9: /* conditional branch */
5669 newval = md_chars_to_number (buf, THUMB_SIZE);
5670 {
5671 addressT diff = (newval & 0xff) << 1;
5672 if (diff & 0x100)
5673 diff |= ~0xff;
5674
5675 value += diff;
5676 if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
5677 as_bad_where (fixP->fx_file, fixP->fx_line,
5678 _("Branch out of range"));
5679 newval = (newval & 0xff00) | ((value & 0x1ff) >> 1);
5680 }
5681 md_number_to_chars (buf, newval, THUMB_SIZE);
5682 break;
5683
5684 case BFD_RELOC_THUMB_PCREL_BRANCH12: /* unconditional branch */
5685 newval = md_chars_to_number (buf, THUMB_SIZE);
5686 {
5687 addressT diff = (newval & 0x7ff) << 1;
5688 if (diff & 0x800)
5689 diff |= ~0x7ff;
5690
5691 value += diff;
5692 if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
5693 as_bad_where (fixP->fx_file, fixP->fx_line,
5694 _("Branch out of range"));
5695 newval = (newval & 0xf800) | ((value & 0xfff) >> 1);
5696 }
5697 md_number_to_chars (buf, newval, THUMB_SIZE);
5698 break;
5699
5700 case BFD_RELOC_THUMB_PCREL_BLX:
5701 case BFD_RELOC_THUMB_PCREL_BRANCH23:
5702 {
5703 offsetT newval2;
5704 addressT diff;
5705
5706 newval = md_chars_to_number (buf, THUMB_SIZE);
5707 newval2 = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
5708 diff = ((newval & 0x7ff) << 12) | ((newval2 & 0x7ff) << 1);
5709 if (diff & 0x400000)
5710 diff |= ~0x3fffff;
5711 #ifdef OBJ_ELF
5712 value = fixP->fx_offset;
5713 #endif
5714 value += diff;
5715 if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
5716 as_bad_where (fixP->fx_file, fixP->fx_line,
5717 _("Branch with link out of range"));
5718
5719 newval = (newval & 0xf800) | ((value & 0x7fffff) >> 12);
5720 newval2 = (newval2 & 0xf800) | ((value & 0xfff) >> 1);
5721 md_number_to_chars (buf, newval, THUMB_SIZE);
5722 md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
5723 }
5724 break;
5725
5726 case BFD_RELOC_8:
5727 if (fixP->fx_done || fixP->fx_pcrel)
5728 md_number_to_chars (buf, value, 1);
5729 #ifdef OBJ_ELF
5730 else if (!target_oabi)
5731 {
5732 value = fixP->fx_offset;
5733 md_number_to_chars (buf, value, 1);
5734 }
5735 #endif
5736 break;
5737
5738 case BFD_RELOC_16:
5739 if (fixP->fx_done || fixP->fx_pcrel)
5740 md_number_to_chars (buf, value, 2);
5741 #ifdef OBJ_ELF
5742 else if (!target_oabi)
5743 {
5744 value = fixP->fx_offset;
5745 md_number_to_chars (buf, value, 2);
5746 }
5747 #endif
5748 break;
5749
5750 #ifdef OBJ_ELF
5751 case BFD_RELOC_ARM_GOT32:
5752 case BFD_RELOC_ARM_GOTOFF:
5753 md_number_to_chars (buf, 0, 4);
5754 break;
5755 #endif
5756
5757 case BFD_RELOC_RVA:
5758 case BFD_RELOC_32:
5759 if (fixP->fx_done || fixP->fx_pcrel)
5760 md_number_to_chars (buf, value, 4);
5761 #ifdef OBJ_ELF
5762 else if (!target_oabi)
5763 {
5764 value = fixP->fx_offset;
5765 md_number_to_chars (buf, value, 4);
5766 }
5767 #endif
5768 break;
5769
5770 #ifdef OBJ_ELF
5771 case BFD_RELOC_ARM_PLT32:
5772 /* It appears the instruction is fully prepared at this point. */
5773 break;
5774 #endif
5775
5776 case BFD_RELOC_ARM_GOTPC:
5777 md_number_to_chars (buf, value, 4);
5778 break;
5779
5780 case BFD_RELOC_ARM_CP_OFF_IMM:
5781 sign = value >= 0;
5782 if (value < -1023 || value > 1023 || (value & 3))
5783 as_bad_where (fixP->fx_file, fixP->fx_line,
5784 _("Illegal value for co-processor offset"));
5785 if (value < 0)
5786 value = -value;
5787 newval = md_chars_to_number (buf, INSN_SIZE) & 0xff7fff00;
5788 newval |= (value >> 2) | (sign ? INDEX_UP : 0);
5789 md_number_to_chars (buf, newval , INSN_SIZE);
5790 break;
5791
5792 case BFD_RELOC_ARM_THUMB_OFFSET:
5793 newval = md_chars_to_number (buf, THUMB_SIZE);
5794 /* Exactly what ranges, and where the offset is inserted depends on
5795 the type of instruction, we can establish this from the top 4 bits */
5796 switch (newval >> 12)
5797 {
5798 case 4: /* PC load */
5799 /* Thumb PC loads are somewhat odd, bit 1 of the PC is
5800 forced to zero for these loads, so we will need to round
5801 up the offset if the instruction address is not word
5802 aligned (since the final address produced must be, and
5803 we can only describe word-aligned immediate offsets). */
5804
5805 if ((fixP->fx_frag->fr_address + fixP->fx_where + value) & 3)
5806 as_bad_where (fixP->fx_file, fixP->fx_line,
5807 _("Invalid offset, target not word aligned (0x%08X)"),
5808 (unsigned int)(fixP->fx_frag->fr_address + fixP->fx_where + value));
5809
5810 if ((value + 2) & ~0x3fe)
5811 as_bad_where (fixP->fx_file, fixP->fx_line,
5812 _("Invalid offset, value too big (0x%08X)"), value);
5813
5814 /* Round up, since pc will be rounded down. */
5815 newval |= (value + 2) >> 2;
5816 break;
5817
5818 case 9: /* SP load/store */
5819 if (value & ~0x3fc)
5820 as_bad_where (fixP->fx_file, fixP->fx_line,
5821 _("Invalid offset, value too big (0x%08X)"), value);
5822 newval |= value >> 2;
5823 break;
5824
5825 case 6: /* Word load/store */
5826 if (value & ~0x7c)
5827 as_bad_where (fixP->fx_file, fixP->fx_line,
5828 _("Invalid offset, value too big (0x%08X)"), value);
5829 newval |= value << 4; /* 6 - 2 */
5830 break;
5831
5832 case 7: /* Byte load/store */
5833 if (value & ~0x1f)
5834 as_bad_where (fixP->fx_file, fixP->fx_line,
5835 _("Invalid offset, value too big (0x%08X)"), value);
5836 newval |= value << 6;
5837 break;
5838
5839 case 8: /* Halfword load/store */
5840 if (value & ~0x3e)
5841 as_bad_where (fixP->fx_file, fixP->fx_line,
5842 _("Invalid offset, value too big (0x%08X)"), value);
5843 newval |= value << 5; /* 6 - 1 */
5844 break;
5845
5846 default:
5847 as_bad_where (fixP->fx_file, fixP->fx_line,
5848 "Unable to process relocation for thumb opcode: %lx",
5849 (unsigned long) newval);
5850 break;
5851 }
5852 md_number_to_chars (buf, newval, THUMB_SIZE);
5853 break;
5854
5855 case BFD_RELOC_ARM_THUMB_ADD:
5856 /* This is a complicated relocation, since we use it for all of
5857 the following immediate relocations:
5858 3bit ADD/SUB
5859 8bit ADD/SUB
5860 9bit ADD/SUB SP word-aligned
5861 10bit ADD PC/SP word-aligned
5862
5863 The type of instruction being processed is encoded in the
5864 instruction field:
5865 0x8000 SUB
5866 0x00F0 Rd
5867 0x000F Rs
5868 */
5869 newval = md_chars_to_number (buf, THUMB_SIZE);
5870 {
5871 int rd = (newval >> 4) & 0xf;
5872 int rs = newval & 0xf;
5873 int subtract = newval & 0x8000;
5874
5875 if (rd == REG_SP)
5876 {
5877 if (value & ~0x1fc)
5878 as_bad_where (fixP->fx_file, fixP->fx_line,
5879 _("Invalid immediate for stack address calculation"));
5880 newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
5881 newval |= value >> 2;
5882 }
5883 else if (rs == REG_PC || rs == REG_SP)
5884 {
5885 if (subtract ||
5886 value & ~0x3fc)
5887 as_bad_where (fixP->fx_file, fixP->fx_line,
5888 _("Invalid immediate for address calculation (value = 0x%08lX)"),
5889 (unsigned long) value);
5890 newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
5891 newval |= rd << 8;
5892 newval |= value >> 2;
5893 }
5894 else if (rs == rd)
5895 {
5896 if (value & ~0xff)
5897 as_bad_where (fixP->fx_file, fixP->fx_line,
5898 _("Invalid 8bit immediate"));
5899 newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
5900 newval |= (rd << 8) | value;
5901 }
5902 else
5903 {
5904 if (value & ~0x7)
5905 as_bad_where (fixP->fx_file, fixP->fx_line,
5906 _("Invalid 3bit immediate"));
5907 newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
5908 newval |= rd | (rs << 3) | (value << 6);
5909 }
5910 }
5911 md_number_to_chars (buf, newval , THUMB_SIZE);
5912 break;
5913
5914 case BFD_RELOC_ARM_THUMB_IMM:
5915 newval = md_chars_to_number (buf, THUMB_SIZE);
5916 switch (newval >> 11)
5917 {
5918 case 0x04: /* 8bit immediate MOV */
5919 case 0x05: /* 8bit immediate CMP */
5920 if (value < 0 || value > 255)
5921 as_bad_where (fixP->fx_file, fixP->fx_line,
5922 _("Invalid immediate: %ld is too large"),
5923 (long) value);
5924 newval |= value;
5925 break;
5926
5927 default:
5928 abort ();
5929 }
5930 md_number_to_chars (buf, newval , THUMB_SIZE);
5931 break;
5932
5933 case BFD_RELOC_ARM_THUMB_SHIFT:
5934 /* 5bit shift value (0..31) */
5935 if (value < 0 || value > 31)
5936 as_bad_where (fixP->fx_file, fixP->fx_line,
5937 _("Illegal Thumb shift value: %ld"), (long) value);
5938 newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf03f;
5939 newval |= value << 6;
5940 md_number_to_chars (buf, newval , THUMB_SIZE);
5941 break;
5942
5943 case BFD_RELOC_VTABLE_INHERIT:
5944 case BFD_RELOC_VTABLE_ENTRY:
5945 fixP->fx_done = 0;
5946 return 1;
5947
5948 case BFD_RELOC_NONE:
5949 default:
5950 as_bad_where (fixP->fx_file, fixP->fx_line,
5951 _("Bad relocation fixup type (%d)"), fixP->fx_r_type);
5952 }
5953
5954 return 1;
5955 }
5956
5957 /* Translate internal representation of relocation info to BFD target
5958 format. */
5959 arelent *
5960 tc_gen_reloc (section, fixp)
5961 asection * section ATTRIBUTE_UNUSED;
5962 fixS * fixp;
5963 {
5964 arelent * reloc;
5965 bfd_reloc_code_real_type code;
5966
5967 reloc = (arelent *) xmalloc (sizeof (arelent));
5968
5969 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
5970 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
5971 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
5972
5973 /* @@ Why fx_addnumber sometimes and fx_offset other times? */
5974 #ifndef OBJ_ELF
5975 if (fixp->fx_pcrel == 0)
5976 reloc->addend = fixp->fx_offset;
5977 else
5978 reloc->addend = fixp->fx_offset = reloc->address;
5979 #else /* OBJ_ELF */
5980 reloc->addend = fixp->fx_offset;
5981 #endif
5982
5983 switch (fixp->fx_r_type)
5984 {
5985 case BFD_RELOC_8:
5986 if (fixp->fx_pcrel)
5987 {
5988 code = BFD_RELOC_8_PCREL;
5989 break;
5990 }
5991
5992 case BFD_RELOC_16:
5993 if (fixp->fx_pcrel)
5994 {
5995 code = BFD_RELOC_16_PCREL;
5996 break;
5997 }
5998
5999 case BFD_RELOC_32:
6000 if (fixp->fx_pcrel)
6001 {
6002 code = BFD_RELOC_32_PCREL;
6003 break;
6004 }
6005
6006 case BFD_RELOC_ARM_PCREL_BRANCH:
6007 case BFD_RELOC_ARM_PCREL_BLX:
6008 case BFD_RELOC_RVA:
6009 case BFD_RELOC_THUMB_PCREL_BRANCH9:
6010 case BFD_RELOC_THUMB_PCREL_BRANCH12:
6011 case BFD_RELOC_THUMB_PCREL_BRANCH23:
6012 case BFD_RELOC_THUMB_PCREL_BLX:
6013 case BFD_RELOC_VTABLE_ENTRY:
6014 case BFD_RELOC_VTABLE_INHERIT:
6015 code = fixp->fx_r_type;
6016 break;
6017
6018 case BFD_RELOC_ARM_LITERAL:
6019 case BFD_RELOC_ARM_HWLITERAL:
6020 /* If this is called then the a literal has been referenced across
6021 a section boundary - possibly due to an implicit dump */
6022 as_bad_where (fixp->fx_file, fixp->fx_line,
6023 _("Literal referenced across section boundary (Implicit dump?)"));
6024 return NULL;
6025
6026 #ifdef OBJ_ELF
6027 case BFD_RELOC_ARM_GOT32:
6028 case BFD_RELOC_ARM_GOTOFF:
6029 case BFD_RELOC_ARM_PLT32:
6030 code = fixp->fx_r_type;
6031 break;
6032 #endif
6033
6034 case BFD_RELOC_ARM_IMMEDIATE:
6035 as_bad_where (fixp->fx_file, fixp->fx_line,
6036 _("Internal_relocation (type %d) not fixed up (IMMEDIATE)"),
6037 fixp->fx_r_type);
6038 return NULL;
6039
6040 case BFD_RELOC_ARM_ADRL_IMMEDIATE:
6041 as_bad_where (fixp->fx_file, fixp->fx_line,
6042 _("ADRL used for a symbol not defined in the same file"),
6043 fixp->fx_r_type);
6044 return NULL;
6045
6046 case BFD_RELOC_ARM_OFFSET_IMM:
6047 as_bad_where (fixp->fx_file, fixp->fx_line,
6048 _("Internal_relocation (type %d) not fixed up (OFFSET_IMM)"),
6049 fixp->fx_r_type);
6050 return NULL;
6051
6052 default:
6053 {
6054 char * type;
6055 switch (fixp->fx_r_type)
6056 {
6057 case BFD_RELOC_ARM_IMMEDIATE: type = "IMMEDIATE"; break;
6058 case BFD_RELOC_ARM_OFFSET_IMM: type = "OFFSET_IMM"; break;
6059 case BFD_RELOC_ARM_OFFSET_IMM8: type = "OFFSET_IMM8"; break;
6060 case BFD_RELOC_ARM_SHIFT_IMM: type = "SHIFT_IMM"; break;
6061 case BFD_RELOC_ARM_SWI: type = "SWI"; break;
6062 case BFD_RELOC_ARM_MULTI: type = "MULTI"; break;
6063 case BFD_RELOC_ARM_CP_OFF_IMM: type = "CP_OFF_IMM"; break;
6064 case BFD_RELOC_ARM_THUMB_ADD: type = "THUMB_ADD"; break;
6065 case BFD_RELOC_ARM_THUMB_SHIFT: type = "THUMB_SHIFT"; break;
6066 case BFD_RELOC_ARM_THUMB_IMM: type = "THUMB_IMM"; break;
6067 case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
6068 default: type = _("<unknown>"); break;
6069 }
6070 as_bad_where (fixp->fx_file, fixp->fx_line,
6071 _("Can not represent %s relocation in this object file format (%d)"),
6072 type, fixp->fx_pcrel);
6073 return NULL;
6074 }
6075 }
6076
6077 #ifdef OBJ_ELF
6078 if (code == BFD_RELOC_32_PCREL
6079 && GOT_symbol
6080 && fixp->fx_addsy == GOT_symbol)
6081 {
6082 code = BFD_RELOC_ARM_GOTPC;
6083 reloc->addend = fixp->fx_offset = reloc->address;
6084 }
6085 #endif
6086
6087 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
6088
6089 if (reloc->howto == NULL)
6090 {
6091 as_bad_where (fixp->fx_file, fixp->fx_line,
6092 _("Can not represent %s relocation in this object file format"),
6093 bfd_get_reloc_code_name (code));
6094 return NULL;
6095 }
6096
6097 /* HACK: Since arm ELF uses Rel instead of Rela, encode the
6098 vtable entry to be used in the relocation's section offset. */
6099 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
6100 reloc->address = fixp->fx_offset;
6101
6102 return reloc;
6103 }
6104
6105 int
6106 md_estimate_size_before_relax (fragP, segtype)
6107 fragS * fragP ATTRIBUTE_UNUSED;
6108 segT segtype ATTRIBUTE_UNUSED;
6109 {
6110 as_fatal (_("md_estimate_size_before_relax\n"));
6111 return 1;
6112 }
6113
6114 static void
6115 output_inst PARAMS ((void))
6116 {
6117 char * to = NULL;
6118
6119 if (inst.error)
6120 {
6121 as_bad (inst.error);
6122 return;
6123 }
6124
6125 to = frag_more (inst.size);
6126
6127 if (thumb_mode && (inst.size > THUMB_SIZE))
6128 {
6129 assert (inst.size == (2 * THUMB_SIZE));
6130 md_number_to_chars (to, inst.instruction >> 16, THUMB_SIZE);
6131 md_number_to_chars (to + THUMB_SIZE, inst.instruction, THUMB_SIZE);
6132 }
6133 else if (inst.size > INSN_SIZE)
6134 {
6135 assert (inst.size == (2 * INSN_SIZE));
6136 md_number_to_chars (to, inst.instruction, INSN_SIZE);
6137 md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE);
6138 }
6139 else
6140 md_number_to_chars (to, inst.instruction, inst.size);
6141
6142 if (inst.reloc.type != BFD_RELOC_NONE)
6143 fix_new_arm (frag_now, to - frag_now->fr_literal,
6144 inst.size, & inst.reloc.exp, inst.reloc.pc_rel,
6145 inst.reloc.type);
6146
6147 return;
6148 }
6149
6150 void
6151 md_assemble (str)
6152 char * str;
6153 {
6154 char c;
6155 char * p;
6156 char * q;
6157 char * start;
6158
6159 /* Align the instruction.
6160 This may not be the right thing to do but ... */
6161 /* arm_align (2, 0); */
6162 listing_prev_line (); /* Defined in listing.h */
6163
6164 /* Align the previous label if needed. */
6165 if (last_label_seen != NULL)
6166 {
6167 symbol_set_frag (last_label_seen, frag_now);
6168 S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
6169 S_SET_SEGMENT (last_label_seen, now_seg);
6170 }
6171
6172 memset (&inst, '\0', sizeof (inst));
6173 inst.reloc.type = BFD_RELOC_NONE;
6174
6175 skip_whitespace (str);
6176
6177 /* Scan up to the end of the op-code, which must end in white space or
6178 end of string. */
6179 for (start = p = str; *p != '\0'; p++)
6180 if (*p == ' ')
6181 break;
6182
6183 if (p == str)
6184 {
6185 as_bad (_("No operator -- statement `%s'\n"), str);
6186 return;
6187 }
6188
6189 if (thumb_mode)
6190 {
6191 CONST struct thumb_opcode * opcode;
6192
6193 c = *p;
6194 *p = '\0';
6195 opcode = (CONST struct thumb_opcode *) hash_find (arm_tops_hsh, str);
6196 *p = c;
6197
6198 if (opcode)
6199 {
6200 /* Check that this instruction is supported for this CPU. */
6201 if (thumb_mode == 1 && (opcode->variants & cpu_variant) == 0)
6202 {
6203 as_bad (_("selected processor does not support this opcode"));
6204 return;
6205 }
6206
6207 inst.instruction = opcode->value;
6208 inst.size = opcode->size;
6209 (*opcode->parms)(p);
6210 output_inst ();
6211 return;
6212 }
6213 }
6214 else
6215 {
6216 CONST struct asm_opcode * opcode;
6217 unsigned long cond_code;
6218
6219 inst.size = INSN_SIZE;
6220 /* p now points to the end of the opcode, probably white space, but we
6221 have to break the opcode up in case it contains condionals and flags;
6222 keep trying with progressively smaller basic instructions until one
6223 matches, or we run out of opcode. */
6224 q = (p - str > LONGEST_INST) ? str + LONGEST_INST : p;
6225
6226 for (; q != str; q--)
6227 {
6228 c = *q;
6229 *q = '\0';
6230
6231 opcode = (CONST struct asm_opcode *) hash_find (arm_ops_hsh, str);
6232 *q = c;
6233
6234 if (opcode && opcode->template)
6235 {
6236 unsigned long flag_bits = 0;
6237 char * r;
6238
6239 /* Check that this instruction is supported for this CPU. */
6240 if ((opcode->variants & cpu_variant) == 0)
6241 goto try_shorter;
6242
6243 inst.instruction = opcode->value;
6244 if (q == p) /* Just a simple opcode. */
6245 {
6246 if (opcode->comp_suffix)
6247 {
6248 if (*opcode->comp_suffix != '\0')
6249 as_bad (_("Opcode `%s' must have suffix from list: <%s>"),
6250 str, opcode->comp_suffix);
6251 else
6252 /* Not a conditional instruction. */
6253 (*opcode->parms)(q, 0);
6254 }
6255 else
6256 {
6257 /* A conditional instruction with default condition. */
6258 inst.instruction |= COND_ALWAYS;
6259 (*opcode->parms)(q, 0);
6260 }
6261 output_inst ();
6262 return;
6263 }
6264
6265 /* Not just a simple opcode. Check if extra is a conditional. */
6266 r = q;
6267 if (p - r >= 2)
6268 {
6269 CONST struct asm_cond *cond;
6270 char d = *(r + 2);
6271
6272 *(r + 2) = '\0';
6273 cond = (CONST struct asm_cond *) hash_find (arm_cond_hsh, r);
6274 *(r + 2) = d;
6275 if (cond)
6276 {
6277 if (cond->value == 0xf0000000)
6278 as_tsktsk (
6279 _("Warning: Use of the 'nv' conditional is deprecated\n"));
6280
6281 cond_code = cond->value;
6282 r += 2;
6283 }
6284 else
6285 cond_code = COND_ALWAYS;
6286 }
6287 else
6288 cond_code = COND_ALWAYS;
6289
6290 /* Apply the conditional, or complain it's not allowed. */
6291 if (opcode->comp_suffix && *opcode->comp_suffix == '\0')
6292 {
6293 /* Instruction isn't conditional */
6294 if (cond_code != COND_ALWAYS)
6295 {
6296 as_bad (_("Opcode `%s' is unconditional\n"), str);
6297 return;
6298 }
6299 }
6300 else
6301 /* Instruction is conditional: set the condition into it. */
6302 inst.instruction |= cond_code;
6303
6304
6305 /* If there is a compulsory suffix, it should come here, before
6306 any optional flags. */
6307 if (opcode->comp_suffix && *opcode->comp_suffix != '\0')
6308 {
6309 CONST char *s = opcode->comp_suffix;
6310
6311 while (*s)
6312 {
6313 inst.suffix++;
6314 if (*r == *s)
6315 break;
6316 s++;
6317 }
6318
6319 if (*s == '\0')
6320 {
6321 as_bad (_("Opcode `%s' must have suffix from <%s>\n"), str,
6322 opcode->comp_suffix);
6323 return;
6324 }
6325
6326 r++;
6327 }
6328
6329 /* The remainder, if any should now be flags for the instruction;
6330 Scan these checking each one found with the opcode. */
6331 if (r != p)
6332 {
6333 char d;
6334 CONST struct asm_flg *flag = opcode->flags;
6335
6336 if (flag)
6337 {
6338 int flagno;
6339
6340 d = *p;
6341 *p = '\0';
6342
6343 for (flagno = 0; flag[flagno].template; flagno++)
6344 {
6345 if (streq (r, flag[flagno].template))
6346 {
6347 flag_bits |= flag[flagno].set_bits;
6348 break;
6349 }
6350 }
6351
6352 *p = d;
6353 if (! flag[flagno].template)
6354 goto try_shorter;
6355 }
6356 else
6357 goto try_shorter;
6358 }
6359
6360 (*opcode->parms) (p, flag_bits);
6361 output_inst ();
6362 return;
6363 }
6364
6365 try_shorter:
6366 ;
6367 }
6368 }
6369
6370 /* It wasn't an instruction, but it might be a register alias of the form
6371 alias .req reg */
6372 q = p;
6373 skip_whitespace (q);
6374
6375 c = *p;
6376 *p = '\0';
6377
6378 if (*q && !strncmp (q, ".req ", 4))
6379 {
6380 int reg;
6381 char * copy_of_str = str;
6382 char * r;
6383
6384 q += 4;
6385 skip_whitespace (q);
6386
6387 for (r = q; *r != '\0'; r++)
6388 if (*r == ' ')
6389 break;
6390
6391 if (r != q)
6392 {
6393 int regnum;
6394 char d = *r;
6395
6396 *r = '\0';
6397 regnum = arm_reg_parse (& q);
6398 *r = d;
6399
6400 reg = arm_reg_parse (& str);
6401
6402 if (reg == FAIL)
6403 {
6404 if (regnum != FAIL)
6405 insert_reg_alias (str, regnum);
6406 else
6407 as_warn (_("register '%s' does not exist\n"), q);
6408 }
6409 else if (regnum != FAIL)
6410 {
6411 if (reg != regnum)
6412 as_warn (_("ignoring redefinition of register alias '%s'"),
6413 copy_of_str );
6414
6415 /* Do not warn about redefinitions to the same alias. */
6416 }
6417 else
6418 as_warn (_("ignoring redefinition of register alias '%s' to non-existant register '%s'"),
6419 copy_of_str, q);
6420 }
6421 else
6422 as_warn (_("ignoring incomplete .req pseuso op"));
6423
6424 *p = c;
6425 return;
6426 }
6427
6428 *p = c;
6429 as_bad (_("bad instruction `%s'"), start);
6430 }
6431
6432 /*
6433 * md_parse_option
6434 * Invocation line includes a switch not recognized by the base assembler.
6435 * See if it's a processor-specific option. These are:
6436 * Cpu variants, the arm part is optional:
6437 * -m[arm]1 Currently not supported.
6438 * -m[arm]2, -m[arm]250 Arm 2 and Arm 250 processor
6439 * -m[arm]3 Arm 3 processor
6440 * -m[arm]6[xx], Arm 6 processors
6441 * -m[arm]7[xx][t][[d]m] Arm 7 processors
6442 * -m[arm]8[10] Arm 8 processors
6443 * -m[arm]9[20][tdmi] Arm 9 processors
6444 * -mstrongarm[110[0]] StrongARM processors
6445 * -m[arm]v[2345[t]] Arm architectures
6446 * -mall All (except the ARM1)
6447 * FP variants:
6448 * -mfpa10, -mfpa11 FPA10 and 11 co-processor instructions
6449 * -mfpe-old (No float load/store multiples)
6450 * -mno-fpu Disable all floating point instructions
6451 * Run-time endian selection:
6452 * -EB big endian cpu
6453 * -EL little endian cpu
6454 * ARM Procedure Calling Standard:
6455 * -mapcs-32 32 bit APCS
6456 * -mapcs-26 26 bit APCS
6457 * -mapcs-float Pass floats in float regs
6458 * -mapcs-reentrant Position independent code
6459 * -mthumb-interwork Code supports Arm/Thumb interworking
6460 * -moabi Old ELF ABI
6461 */
6462
6463 CONST char * md_shortopts = "m:k";
6464 struct option md_longopts[] =
6465 {
6466 #ifdef ARM_BI_ENDIAN
6467 #define OPTION_EB (OPTION_MD_BASE + 0)
6468 {"EB", no_argument, NULL, OPTION_EB},
6469 #define OPTION_EL (OPTION_MD_BASE + 1)
6470 {"EL", no_argument, NULL, OPTION_EL},
6471 #ifdef OBJ_ELF
6472 #define OPTION_OABI (OPTION_MD_BASE +2)
6473 {"oabi", no_argument, NULL, OPTION_OABI},
6474 #endif
6475 #endif
6476 {NULL, no_argument, NULL, 0}
6477 };
6478 size_t md_longopts_size = sizeof (md_longopts);
6479
6480 int
6481 md_parse_option (c, arg)
6482 int c;
6483 char * arg;
6484 {
6485 char * str = arg;
6486
6487 switch (c)
6488 {
6489 #ifdef ARM_BI_ENDIAN
6490 case OPTION_EB:
6491 target_big_endian = 1;
6492 break;
6493 case OPTION_EL:
6494 target_big_endian = 0;
6495 break;
6496 #endif
6497
6498 case 'm':
6499 switch (*str)
6500 {
6501 case 'f':
6502 if (streq (str, "fpa10"))
6503 cpu_variant = (cpu_variant & ~FPU_ALL) | FPU_FPA10;
6504 else if (streq (str, "fpa11"))
6505 cpu_variant = (cpu_variant & ~FPU_ALL) | FPU_FPA11;
6506 else if (streq (str, "fpe-old"))
6507 cpu_variant = (cpu_variant & ~FPU_ALL) | FPU_CORE;
6508 else
6509 goto bad;
6510 break;
6511
6512 case 'n':
6513 if (streq (str, "no-fpu"))
6514 cpu_variant &= ~FPU_ALL;
6515 break;
6516
6517 #ifdef OBJ_ELF
6518 case 'o':
6519 if (streq (str, "oabi"))
6520 target_oabi = true;
6521 break;
6522 #endif
6523
6524 case 't':
6525 /* Limit assembler to generating only Thumb instructions: */
6526 if (streq (str, "thumb"))
6527 {
6528 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_THUMB;
6529 cpu_variant = (cpu_variant & ~FPU_ALL) | FPU_NONE;
6530 thumb_mode = 1;
6531 }
6532 else if (streq (str, "thumb-interwork"))
6533 {
6534 if ((cpu_variant & ARM_THUMB) == 0)
6535 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_ARCH_V4T;
6536 #if defined OBJ_COFF || defined OBJ_ELF
6537 support_interwork = true;
6538 #endif
6539 }
6540 else
6541 goto bad;
6542 break;
6543
6544 default:
6545 if (streq (str, "all"))
6546 {
6547 cpu_variant = ARM_ALL | FPU_ALL;
6548 return 1;
6549 }
6550 #if defined OBJ_COFF || defined OBJ_ELF
6551 if (! strncmp (str, "apcs-", 5))
6552 {
6553 /* GCC passes on all command line options starting "-mapcs-..."
6554 to us, so we must parse them here. */
6555
6556 str += 5;
6557
6558 if (streq (str, "32"))
6559 {
6560 uses_apcs_26 = false;
6561 return 1;
6562 }
6563 else if (streq (str, "26"))
6564 {
6565 uses_apcs_26 = true;
6566 return 1;
6567 }
6568 else if (streq (str, "frame"))
6569 {
6570 /* Stack frames are being generated - does not affect
6571 linkage of code. */
6572 return 1;
6573 }
6574 else if (streq (str, "stack-check"))
6575 {
6576 /* Stack checking is being performed - does not affect
6577 linkage, but does require that the functions
6578 __rt_stkovf_split_small and __rt_stkovf_split_big be
6579 present in the final link. */
6580
6581 return 1;
6582 }
6583 else if (streq (str, "float"))
6584 {
6585 /* Floating point arguments are being passed in the floating
6586 point registers. This does affect linking, since this
6587 version of the APCS is incompatible with the version that
6588 passes floating points in the integer registers. */
6589
6590 uses_apcs_float = true;
6591 return 1;
6592 }
6593 else if (streq (str, "reentrant"))
6594 {
6595 /* Reentrant code has been generated. This does affect
6596 linking, since there is no point in linking reentrant/
6597 position independent code with absolute position code. */
6598 pic_code = true;
6599 return 1;
6600 }
6601
6602 as_bad (_("Unrecognised APCS switch -m%s"), arg);
6603 return 0;
6604 }
6605 #endif
6606 /* Strip off optional "arm" */
6607 if (! strncmp (str, "arm", 3))
6608 str += 3;
6609
6610 switch (*str)
6611 {
6612 case '1':
6613 if (streq (str, "1"))
6614 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_1;
6615 else
6616 goto bad;
6617 break;
6618
6619 case '2':
6620 if (streq (str, "2"))
6621 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_2;
6622 else if (streq (str, "250"))
6623 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_250;
6624 else
6625 goto bad;
6626 break;
6627
6628 case '3':
6629 if (streq (str, "3"))
6630 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_3;
6631 else
6632 goto bad;
6633 break;
6634
6635 case '6':
6636 switch (strtol (str, NULL, 10))
6637 {
6638 case 6:
6639 case 60:
6640 case 600:
6641 case 610:
6642 case 620:
6643 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_6;
6644 break;
6645 default:
6646 goto bad;
6647 }
6648 break;
6649
6650 case '7':
6651 switch (strtol (str, & str, 10)) /* Eat the processor name */
6652 {
6653 case 7:
6654 case 70:
6655 case 700:
6656 case 710:
6657 case 720:
6658 case 7100:
6659 case 7500:
6660 break;
6661 default:
6662 goto bad;
6663 }
6664 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_7;
6665 for (; *str; str++)
6666 {
6667 switch (* str)
6668 {
6669 case 't':
6670 cpu_variant |= (ARM_THUMB | ARM_ARCH_V4);
6671 break;
6672
6673 case 'm':
6674 cpu_variant |= ARM_LONGMUL;
6675 break;
6676
6677 case 'f': /* fe => fp enabled cpu. */
6678 if (str[1] == 'e')
6679 ++ str;
6680 else
6681 goto bad;
6682
6683 case 'c': /* Left over from 710c processor name. */
6684 case 'd': /* Debug */
6685 case 'i': /* Embedded ICE */
6686 /* Included for completeness in ARM processor naming. */
6687 break;
6688
6689 default:
6690 goto bad;
6691 }
6692 }
6693 break;
6694
6695 case '8':
6696 if (streq (str, "8") || streq (str, "810"))
6697 cpu_variant = (cpu_variant & ~ARM_ANY)
6698 | ARM_8 | ARM_ARCH_V4 | ARM_LONGMUL;
6699 else
6700 goto bad;
6701 break;
6702
6703 case '9':
6704 if (streq (str, "9"))
6705 cpu_variant = (cpu_variant & ~ARM_ANY)
6706 | ARM_9 | ARM_ARCH_V4 | ARM_LONGMUL | ARM_THUMB;
6707 else if (streq (str, "920"))
6708 cpu_variant = (cpu_variant & ~ARM_ANY)
6709 | ARM_9 | ARM_ARCH_V4 | ARM_LONGMUL;
6710 else if (streq (str, "920t"))
6711 cpu_variant = (cpu_variant & ~ARM_ANY)
6712 | ARM_9 | ARM_ARCH_V4 | ARM_LONGMUL | ARM_THUMB;
6713 else if (streq (str, "9tdmi"))
6714 cpu_variant = (cpu_variant & ~ARM_ANY)
6715 | ARM_9 | ARM_ARCH_V4 | ARM_LONGMUL | ARM_THUMB;
6716 else
6717 goto bad;
6718 break;
6719
6720
6721 case 's':
6722 if (streq (str, "strongarm")
6723 || streq (str, "strongarm110")
6724 || streq (str, "strongarm1100"))
6725 cpu_variant = (cpu_variant & ~ARM_ANY)
6726 | ARM_8 | ARM_ARCH_V4 | ARM_LONGMUL;
6727 else
6728 goto bad;
6729 break;
6730
6731 case 'v':
6732 /* Select variant based on architecture rather than processor. */
6733 switch (*++str)
6734 {
6735 case '2':
6736 switch (*++str)
6737 {
6738 case 'a':
6739 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_3;
6740 break;
6741 case 0:
6742 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_2;
6743 break;
6744 default:
6745 as_bad (_("Invalid architecture variant -m%s"), arg);
6746 break;
6747 }
6748 break;
6749
6750 case '3':
6751 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_7;
6752
6753 switch (*++str)
6754 {
6755 case 'm': cpu_variant |= ARM_LONGMUL; break;
6756 case 0: break;
6757 default:
6758 as_bad (_("Invalid architecture variant -m%s"), arg);
6759 break;
6760 }
6761 break;
6762
6763 case '4':
6764 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_ARCH_V4;
6765
6766 switch (*++str)
6767 {
6768 case 't': cpu_variant |= ARM_THUMB; break;
6769 case 0: break;
6770 default:
6771 as_bad (_("Invalid architecture variant -m%s"), arg);
6772 break;
6773 }
6774 break;
6775
6776 case '5':
6777 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_ARCH_V5;
6778 switch (*++str)
6779 {
6780 case 't': cpu_variant |= ARM_THUMB; break;
6781 case 0: break;
6782 default:
6783 as_bad (_("Invalid architecture variant -m%s"), arg);
6784 break;
6785 }
6786 break;
6787
6788 default:
6789 as_bad (_("Invalid architecture variant -m%s"), arg);
6790 break;
6791 }
6792 break;
6793
6794 default:
6795 bad:
6796 as_bad (_("Invalid processor variant -m%s"), arg);
6797 return 0;
6798 }
6799 }
6800 break;
6801
6802 #if defined OBJ_ELF || defined OBJ_COFF
6803 case 'k':
6804 pic_code = 1;
6805 break;
6806 #endif
6807
6808 default:
6809 return 0;
6810 }
6811
6812 return 1;
6813 }
6814
6815 void
6816 md_show_usage (fp)
6817 FILE * fp;
6818 {
6819 fprintf (fp, _("\
6820 ARM Specific Assembler Options:\n\
6821 -m[arm][<processor name>] select processor variant\n\
6822 -m[arm]v[2|2a|3|3m|4|4t|5[t][e]] select architecture variant\n\
6823 -mthumb only allow Thumb instructions\n\
6824 -mthumb-interwork mark the assembled code as supporting interworking\n\
6825 -mall allow any instruction\n\
6826 -mfpa10, -mfpa11 select floating point architecture\n\
6827 -mfpe-old don't allow floating-point multiple instructions\n\
6828 -mno-fpu don't allow any floating-point instructions.\n\
6829 -k generate PIC code.\n"));
6830 #if defined OBJ_COFF || defined OBJ_ELF
6831 fprintf (fp, _("\
6832 -mapcs-32, -mapcs-26 specify which ARM Procedure Calling Standard to use\n\
6833 -mapcs-float floating point args are passed in FP regs\n\
6834 -mapcs-reentrant the code is position independent/reentrant\n"));
6835 #endif
6836 #ifdef OBJ_ELF
6837 fprintf (fp, _("\
6838 -moabi support the old ELF ABI\n"));
6839 #endif
6840 #ifdef ARM_BI_ENDIAN
6841 fprintf (fp, _("\
6842 -EB assemble code for a big endian cpu\n\
6843 -EL assemble code for a little endian cpu\n"));
6844 #endif
6845 }
6846
6847 /* We need to be able to fix up arbitrary expressions in some statements.
6848 This is so that we can handle symbols that are an arbitrary distance from
6849 the pc. The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
6850 which returns part of an address in a form which will be valid for
6851 a data instruction. We do this by pushing the expression into a symbol
6852 in the expr_section, and creating a fix for that. */
6853
6854 static void
6855 fix_new_arm (frag, where, size, exp, pc_rel, reloc)
6856 fragS * frag;
6857 int where;
6858 short int size;
6859 expressionS * exp;
6860 int pc_rel;
6861 int reloc;
6862 {
6863 fixS * new_fix;
6864 arm_fix_data * arm_data;
6865
6866 switch (exp->X_op)
6867 {
6868 case O_constant:
6869 case O_symbol:
6870 case O_add:
6871 case O_subtract:
6872 new_fix = fix_new_exp (frag, where, size, exp, pc_rel, reloc);
6873 break;
6874
6875 default:
6876 new_fix = fix_new (frag, where, size, make_expr_symbol (exp), 0,
6877 pc_rel, reloc);
6878 break;
6879 }
6880
6881 /* Mark whether the fix is to a THUMB instruction, or an ARM instruction */
6882 arm_data = (arm_fix_data *) obstack_alloc (& notes, sizeof (arm_fix_data));
6883 new_fix->tc_fix_data = (PTR) arm_data;
6884 arm_data->thumb_mode = thumb_mode;
6885
6886 return;
6887 }
6888
6889
6890 /* This fix_new is called by cons via TC_CONS_FIX_NEW. */
6891 void
6892 cons_fix_new_arm (frag, where, size, exp)
6893 fragS * frag;
6894 int where;
6895 int size;
6896 expressionS * exp;
6897 {
6898 bfd_reloc_code_real_type type;
6899 int pcrel = 0;
6900
6901 /* Pick a reloc ...
6902 *
6903 * @@ Should look at CPU word size.
6904 */
6905 switch (size)
6906 {
6907 case 2:
6908 type = BFD_RELOC_16;
6909 break;
6910 case 4:
6911 default:
6912 type = BFD_RELOC_32;
6913 break;
6914 case 8:
6915 type = BFD_RELOC_64;
6916 break;
6917 }
6918
6919 fix_new_exp (frag, where, (int) size, exp, pcrel, type);
6920 }
6921
6922 /* A good place to do this, although this was probably not intended
6923 for this kind of use. We need to dump the literal pool before
6924 references are made to a null symbol pointer. */
6925 void
6926 arm_cleanup ()
6927 {
6928 if (current_poolP == NULL)
6929 return;
6930
6931 subseg_set (text_section, 0); /* Put it at the end of text section. */
6932 s_ltorg (0);
6933 listing_prev_line ();
6934 }
6935
6936 void
6937 arm_start_line_hook ()
6938 {
6939 last_label_seen = NULL;
6940 }
6941
6942 void
6943 arm_frob_label (sym)
6944 symbolS * sym;
6945 {
6946 last_label_seen = sym;
6947
6948 ARM_SET_THUMB (sym, thumb_mode);
6949
6950 #if defined OBJ_COFF || defined OBJ_ELF
6951 ARM_SET_INTERWORK (sym, support_interwork);
6952 #endif
6953
6954 if (label_is_thumb_function_name)
6955 {
6956 /* When the address of a Thumb function is taken the bottom
6957 bit of that address should be set. This will allow
6958 interworking between Arm and Thumb functions to work
6959 correctly. */
6960
6961 THUMB_SET_FUNC (sym, 1);
6962
6963 label_is_thumb_function_name = false;
6964 }
6965 }
6966
6967 /* Adjust the symbol table. This marks Thumb symbols as distinct from
6968 ARM ones. */
6969
6970 void
6971 arm_adjust_symtab ()
6972 {
6973 #ifdef OBJ_COFF
6974 symbolS * sym;
6975
6976 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
6977 {
6978 if (ARM_IS_THUMB (sym))
6979 {
6980 if (THUMB_IS_FUNC (sym))
6981 {
6982 /* Mark the symbol as a Thumb function. */
6983 if ( S_GET_STORAGE_CLASS (sym) == C_STAT
6984 || S_GET_STORAGE_CLASS (sym) == C_LABEL) /* This can happen! */
6985 S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
6986
6987 else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
6988 S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
6989 else
6990 as_bad (_("%s: unexpected function type: %d"),
6991 S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
6992 }
6993 else switch (S_GET_STORAGE_CLASS (sym))
6994 {
6995 case C_EXT:
6996 S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
6997 break;
6998 case C_STAT:
6999 S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
7000 break;
7001 case C_LABEL:
7002 S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
7003 break;
7004 default: /* do nothing */
7005 break;
7006 }
7007 }
7008
7009 if (ARM_IS_INTERWORK (sym))
7010 coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
7011 }
7012 #endif
7013 #ifdef OBJ_ELF
7014 symbolS * sym;
7015 char bind;
7016
7017 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
7018 {
7019 if (ARM_IS_THUMB (sym))
7020 {
7021 elf_symbol_type * elf_sym;
7022
7023 elf_sym = elf_symbol (symbol_get_bfdsym (sym));
7024 bind = ELF_ST_BIND (elf_sym);
7025
7026 /* If it's a .thumb_func, declare it as so,
7027 otherwise tag label as .code 16. */
7028 if (THUMB_IS_FUNC (sym))
7029 elf_sym->internal_elf_sym.st_info =
7030 ELF_ST_INFO (bind, STT_ARM_TFUNC);
7031 else
7032 elf_sym->internal_elf_sym.st_info =
7033 ELF_ST_INFO (bind, STT_ARM_16BIT);
7034 }
7035 }
7036 #endif
7037 }
7038
7039 int
7040 arm_data_in_code ()
7041 {
7042 if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
7043 {
7044 *input_line_pointer = '/';
7045 input_line_pointer += 5;
7046 *input_line_pointer = 0;
7047 return 1;
7048 }
7049
7050 return 0;
7051 }
7052
7053 char *
7054 arm_canonicalize_symbol_name (name)
7055 char * name;
7056 {
7057 int len;
7058
7059 if (thumb_mode && (len = strlen (name)) > 5
7060 && streq (name + len - 5, "/data"))
7061 *(name + len - 5) = 0;
7062
7063 return name;
7064 }
7065
7066 boolean
7067 arm_validate_fix (fixP)
7068 fixS * fixP;
7069 {
7070 /* If the destination of the branch is a defined symbol which does not have
7071 the THUMB_FUNC attribute, then we must be calling a function which has
7072 the (interfacearm) attribute. We look for the Thumb entry point to that
7073 function and change the branch to refer to that function instead. */
7074 if ( fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
7075 && fixP->fx_addsy != NULL
7076 && S_IS_DEFINED (fixP->fx_addsy)
7077 && ! THUMB_IS_FUNC (fixP->fx_addsy))
7078 {
7079 fixP->fx_addsy = find_real_start (fixP->fx_addsy);
7080 return true;
7081 }
7082
7083 return false;
7084 }
7085
7086 #ifdef OBJ_ELF
7087 /* Relocations against Thumb function names must be left unadjusted,
7088 so that the linker can use this information to correctly set the
7089 bottom bit of their addresses. The MIPS version of this function
7090 also prevents relocations that are mips-16 specific, but I do not
7091 know why it does this.
7092
7093 FIXME:
7094 There is one other problem that ought to be addressed here, but
7095 which currently is not: Taking the address of a label (rather
7096 than a function) and then later jumping to that address. Such
7097 addresses also ought to have their bottom bit set (assuming that
7098 they reside in Thumb code), but at the moment they will not. */
7099
7100 boolean
7101 arm_fix_adjustable (fixP)
7102 fixS * fixP;
7103 {
7104 if (fixP->fx_addsy == NULL)
7105 return 1;
7106
7107 /* Prevent all adjustments to global symbols. */
7108 if (S_IS_EXTERN (fixP->fx_addsy))
7109 return 0;
7110
7111 if (S_IS_WEAK (fixP->fx_addsy))
7112 return 0;
7113
7114 if (THUMB_IS_FUNC (fixP->fx_addsy)
7115 && fixP->fx_subsy == NULL)
7116 return 0;
7117
7118 /* We need the symbol name for the VTABLE entries */
7119 if ( fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
7120 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
7121 return 0;
7122
7123 return 1;
7124 }
7125
7126 const char *
7127 elf32_arm_target_format ()
7128 {
7129 if (target_big_endian)
7130 if (target_oabi)
7131 return "elf32-bigarm-oabi";
7132 else
7133 return "elf32-bigarm";
7134 else
7135 if (target_oabi)
7136 return "elf32-littlearm-oabi";
7137 else
7138 return "elf32-littlearm";
7139 }
7140
7141 void
7142 armelf_frob_symbol (symp, puntp)
7143 symbolS * symp;
7144 int * puntp;
7145 {
7146 elf_frob_symbol (symp, puntp);
7147 }
7148
7149 int
7150 arm_force_relocation (fixp)
7151 struct fix * fixp;
7152 {
7153 if ( fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
7154 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY
7155 || fixp->fx_r_type == BFD_RELOC_ARM_PCREL_BRANCH
7156 || fixp->fx_r_type == BFD_RELOC_ARM_PCREL_BLX
7157 || fixp->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX
7158 || fixp->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23)
7159 return 1;
7160
7161 return 0;
7162 }
7163
7164 static bfd_reloc_code_real_type
7165 arm_parse_reloc ()
7166 {
7167 char id[16];
7168 char * ip;
7169 unsigned int i;
7170 static struct
7171 {
7172 char * str;
7173 int len;
7174 bfd_reloc_code_real_type reloc;
7175 }
7176 reloc_map[] =
7177 {
7178 #define MAP(str,reloc) { str, sizeof (str)-1, reloc }
7179 MAP ("(got)", BFD_RELOC_ARM_GOT32),
7180 MAP ("(gotoff)", BFD_RELOC_ARM_GOTOFF),
7181 /* ScottB: Jan 30, 1998 */
7182 /* Added support for parsing "var(PLT)" branch instructions */
7183 /* generated by GCC for PLT relocs */
7184 MAP ("(plt)", BFD_RELOC_ARM_PLT32),
7185 { NULL, 0, BFD_RELOC_UNUSED }
7186 #undef MAP
7187 };
7188
7189 for (i = 0, ip = input_line_pointer;
7190 i < sizeof (id) && (isalnum (*ip) || ispunct (*ip));
7191 i++, ip++)
7192 id[i] = tolower (*ip);
7193
7194 for (i = 0; reloc_map[i].str; i++)
7195 if (strncmp (id, reloc_map[i].str, reloc_map[i].len) == 0)
7196 break;
7197
7198 input_line_pointer += reloc_map[i].len;
7199
7200 return reloc_map[i].reloc;
7201 }
7202
7203 static void
7204 s_arm_elf_cons (nbytes)
7205 int nbytes;
7206 {
7207 expressionS exp;
7208
7209 #ifdef md_flush_pending_output
7210 md_flush_pending_output ();
7211 #endif
7212
7213 if (is_it_end_of_statement ())
7214 {
7215 demand_empty_rest_of_line ();
7216 return;
7217 }
7218
7219 #ifdef md_cons_align
7220 md_cons_align (nbytes);
7221 #endif
7222
7223 do
7224 {
7225 bfd_reloc_code_real_type reloc;
7226
7227 expression (& exp);
7228
7229 if (exp.X_op == O_symbol
7230 && * input_line_pointer == '('
7231 && (reloc = arm_parse_reloc()) != BFD_RELOC_UNUSED)
7232 {
7233 reloc_howto_type * howto = bfd_reloc_type_lookup (stdoutput, reloc);
7234 int size = bfd_get_reloc_size (howto);
7235
7236 if (size > nbytes)
7237 as_bad ("%s relocations do not fit in %d bytes",
7238 howto->name, nbytes);
7239 else
7240 {
7241 register char * p = frag_more ((int) nbytes);
7242 int offset = nbytes - size;
7243
7244 fix_new_exp (frag_now, p - frag_now->fr_literal + offset, size,
7245 & exp, 0, reloc);
7246 }
7247 }
7248 else
7249 emit_expr (& exp, (unsigned int) nbytes);
7250 }
7251 while (*input_line_pointer++ == ',');
7252
7253 input_line_pointer--; /* Put terminator back into stream. */
7254 demand_empty_rest_of_line ();
7255 }
7256
7257 #endif /* OBJ_ELF */
This page took 0.214818 seconds and 4 git commands to generate.