1 /* tc-arm.c -- Assemble for the ARM
2 Copyright (C) 1994, 95, 96, 97, 98, 1999, 2000
3 Free Software Foundation, Inc.
4 Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
5 Modified by David Taylor (dtaylor@armltd.co.uk)
7 This file is part of GAS, the GNU Assembler.
9 GAS is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
14 GAS is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GAS; see the file COPYING. If not, write to the Free
21 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
29 /* Need TARGET_CPU. */
40 /* Types of processor to assemble for. */
41 #define ARM_1 0x00000001
42 #define ARM_2 0x00000002
43 #define ARM_3 0x00000004
45 #define ARM_6 0x00000008
46 #define ARM_7 ARM_6 /* Same core instruction set. */
47 #define ARM_8 ARM_6 /* Same core instruction set. */
48 #define ARM_9 ARM_6 /* Same core instruction set. */
49 #define ARM_CPU_MASK 0x0000000f
51 /* The following bitmasks control CPU extensions (ARM7 onwards): */
52 #define ARM_LONGMUL 0x00000010 /* Allow long multiplies. */
53 #define ARM_HALFWORD 0x00000020 /* Allow half word loads. */
54 #define ARM_THUMB 0x00000040 /* Allow BX instruction. */
55 #define ARM_EXT_V5 0x00000080 /* Allow CLZ, etc. */
57 /* Architectures are the sum of the base and extensions. */
58 #define ARM_ARCH_V4 (ARM_7 | ARM_LONGMUL | ARM_HALFWORD)
59 #define ARM_ARCH_V4T (ARM_ARCH_V4 | ARM_THUMB)
60 #define ARM_ARCH_V5 (ARM_ARCH_V4 | ARM_EXT_V5)
61 #define ARM_ARCH_V5T (ARM_ARCH_V5 | ARM_THUMB)
63 /* Some useful combinations: */
64 #define ARM_ANY 0x00ffffff
65 #define ARM_2UP (ARM_ANY - ARM_1)
66 #define ARM_ALL ARM_2UP /* Not arm1 only. */
67 #define ARM_3UP 0x00fffffc
68 #define ARM_6UP 0x00fffff8 /* Includes ARM7. */
70 #define FPU_CORE 0x80000000
71 #define FPU_FPA10 0x40000000
72 #define FPU_FPA11 0x40000000
75 /* Some useful combinations. */
76 #define FPU_ALL 0xff000000 /* Note this is ~ARM_ANY. */
77 #define FPU_MEMMULTI 0x7f000000 /* Not fpu_core. */
81 #define CPU_DEFAULT (ARM_ARCH_V4 | ARM_THUMB)
83 #define CPU_DEFAULT ARM_ALL
88 #define FPU_DEFAULT FPU_ALL
91 #define streq(a, b) (strcmp (a, b) == 0)
92 #define skip_whitespace(str) while (*(str) == ' ') ++(str)
94 static unsigned long cpu_variant = CPU_DEFAULT | FPU_DEFAULT;
95 static int target_oabi = 0;
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;
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[] = "@";
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[] = "#";
118 CONST char line_separator_chars[] = ";";
120 /* Chars that can be used to separate mant
121 from exp in floating point numbers. */
122 CONST char EXP_CHARS[] = "eE";
124 /* Chars that mean this number is a floating point constant. */
128 CONST char FLT_CHARS[] = "rRsSfFdDxXeEpP";
130 /* Prefix characters that indicate the start of an immediate
132 #define is_immediate_prefix(C) ((C) == '#' || (C) == '$')
135 /* Pre-defined "_GLOBAL_OFFSET_TABLE_" */
136 symbolS * GOT_symbol;
139 /* Size of relocation record. */
140 CONST int md_reloc_size = 8;
142 /* 0: assemble for ARM,
143 1: assemble for Thumb,
144 2: assemble for Thumb even though target CPU does not support thumb
146 static int thumb_mode = 0;
148 typedef struct arm_fix
156 unsigned long instruction;
161 bfd_reloc_code_real_type type;
171 CONST char * template;
175 static CONST struct asm_shift shift[] =
191 #define NO_SHIFT_RESTRICT 1
192 #define SHIFT_RESTRICT 0
194 #define NUM_FLOAT_VALS 8
196 CONST char * fp_const[] =
198 "0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0", 0
201 /* Number of littlenums required to hold an extended precision number. */
202 #define MAX_LITTLENUMS 6
204 LITTLENUM_TYPE fp_values[NUM_FLOAT_VALS][MAX_LITTLENUMS];
214 #define CP_T_X 0x00008000
215 #define CP_T_Y 0x00400000
216 #define CP_T_Pre 0x01000000
217 #define CP_T_UD 0x00800000
218 #define CP_T_WB 0x00200000
220 #define CONDS_BIT (0x00100000)
221 #define LOAD_BIT (0x00100000)
222 #define TRANS_BIT (0x00200000)
226 CONST char * template;
230 /* This is to save a hash look-up in the common case. */
231 #define COND_ALWAYS 0xe0000000
233 static CONST struct asm_cond conds[] =
237 {"cs", 0x20000000}, {"hs", 0x20000000},
238 {"cc", 0x30000000}, {"ul", 0x30000000}, {"lo", 0x30000000},
253 /* Warning: If the top bit of the set_bits is set, then the standard
254 instruction bitmask is ignored, and the new bitmask is taken from
258 CONST char * template; /* Basic flag string. */
259 unsigned long set_bits; /* Bits to set. */
262 static CONST struct asm_flg s_flag[] =
268 static CONST struct asm_flg ldr_flags[] =
272 {"bt", 0x00400000 | TRANS_BIT},
279 static CONST struct asm_flg str_flags[] =
283 {"bt", 0x00400000 | TRANS_BIT},
288 static CONST struct asm_flg byte_flag[] =
294 static CONST struct asm_flg cmp_flags[] =
301 static CONST struct asm_flg ldm_flags[] =
314 static CONST struct asm_flg stm_flags[] =
327 static CONST struct asm_flg lfm_flags[] =
334 static CONST struct asm_flg sfm_flags[] =
341 static CONST struct asm_flg round_flags[] =
349 /* The implementation of the FIX instruction is broken on some assemblers,
350 in that it accepts a precision specifier as well as a rounding specifier,
351 despite the fact that this is meaningless. To be more compatible, we
352 accept it as well, though of course it does not set any bits. */
353 static CONST struct asm_flg fix_flags[] =
370 static CONST struct asm_flg except_flag[] =
376 static CONST struct asm_flg cplong_flag[] =
384 CONST char * template;
389 /* The bit that distnguishes CPSR and SPSR. */
390 #define SPSR_BIT (1 << 22)
392 /* How many bits to shift the PSR_xxx bits up by. */
395 #define PSR_c (1 << 0)
396 #define PSR_x (1 << 1)
397 #define PSR_s (1 << 2)
398 #define PSR_f (1 << 3)
400 static CONST struct asm_psr psrs[] =
402 {"CPSR", true, PSR_c | PSR_f},
403 {"CPSR_all", true, PSR_c | PSR_f},
404 {"SPSR", false, PSR_c | PSR_f},
405 {"SPSR_all", false, PSR_c | PSR_f},
406 {"CPSR_flg", true, PSR_f},
407 {"CPSR_f", true, PSR_f},
408 {"SPSR_flg", false, PSR_f},
409 {"SPSR_f", false, PSR_f},
410 {"CPSR_c", true, PSR_c},
411 {"CPSR_ctl", true, PSR_c},
412 {"SPSR_c", false, PSR_c},
413 {"SPSR_ctl", false, PSR_c},
414 {"CPSR_x", true, PSR_x},
415 {"CPSR_s", true, PSR_s},
416 {"SPSR_x", false, PSR_x},
417 {"SPSR_s", false, PSR_s},
418 /* Combinations of flags. */
419 {"CPSR_fs", true, PSR_f | PSR_s},
420 {"CPSR_fx", true, PSR_f | PSR_x},
421 {"CPSR_fc", true, PSR_f | PSR_c},
422 {"CPSR_sf", true, PSR_s | PSR_f},
423 {"CPSR_sx", true, PSR_s | PSR_x},
424 {"CPSR_sc", true, PSR_s | PSR_c},
425 {"CPSR_xf", true, PSR_x | PSR_f},
426 {"CPSR_xs", true, PSR_x | PSR_s},
427 {"CPSR_xc", true, PSR_x | PSR_c},
428 {"CPSR_cf", true, PSR_c | PSR_f},
429 {"CPSR_cs", true, PSR_c | PSR_s},
430 {"CPSR_cx", true, PSR_c | PSR_x},
431 {"CPSR_fsx", true, PSR_f | PSR_s | PSR_x},
432 {"CPSR_fsc", true, PSR_f | PSR_s | PSR_c},
433 {"CPSR_fxs", true, PSR_f | PSR_x | PSR_s},
434 {"CPSR_fxc", true, PSR_f | PSR_x | PSR_c},
435 {"CPSR_fcs", true, PSR_f | PSR_c | PSR_s},
436 {"CPSR_fcx", true, PSR_f | PSR_c | PSR_x},
437 {"CPSR_sfx", true, PSR_s | PSR_f | PSR_x},
438 {"CPSR_sfc", true, PSR_s | PSR_f | PSR_c},
439 {"CPSR_sxf", true, PSR_s | PSR_x | PSR_f},
440 {"CPSR_sxc", true, PSR_s | PSR_x | PSR_c},
441 {"CPSR_scf", true, PSR_s | PSR_c | PSR_f},
442 {"CPSR_scx", true, PSR_s | PSR_c | PSR_x},
443 {"CPSR_xfs", true, PSR_x | PSR_f | PSR_s},
444 {"CPSR_xfc", true, PSR_x | PSR_f | PSR_c},
445 {"CPSR_xsf", true, PSR_x | PSR_s | PSR_f},
446 {"CPSR_xsc", true, PSR_x | PSR_s | PSR_c},
447 {"CPSR_xcf", true, PSR_x | PSR_c | PSR_f},
448 {"CPSR_xcs", true, PSR_x | PSR_c | PSR_s},
449 {"CPSR_cfs", true, PSR_c | PSR_f | PSR_s},
450 {"CPSR_cfx", true, PSR_c | PSR_f | PSR_x},
451 {"CPSR_csf", true, PSR_c | PSR_s | PSR_f},
452 {"CPSR_csx", true, PSR_c | PSR_s | PSR_x},
453 {"CPSR_cxf", true, PSR_c | PSR_x | PSR_f},
454 {"CPSR_cxs", true, PSR_c | PSR_x | PSR_s},
455 {"CPSR_fsxc", true, PSR_f | PSR_s | PSR_x | PSR_c},
456 {"CPSR_fscx", true, PSR_f | PSR_s | PSR_c | PSR_x},
457 {"CPSR_fxsc", true, PSR_f | PSR_x | PSR_s | PSR_c},
458 {"CPSR_fxcs", true, PSR_f | PSR_x | PSR_c | PSR_s},
459 {"CPSR_fcsx", true, PSR_f | PSR_c | PSR_s | PSR_x},
460 {"CPSR_fcxs", true, PSR_f | PSR_c | PSR_x | PSR_s},
461 {"CPSR_sfxc", true, PSR_s | PSR_f | PSR_x | PSR_c},
462 {"CPSR_sfcx", true, PSR_s | PSR_f | PSR_c | PSR_x},
463 {"CPSR_sxfc", true, PSR_s | PSR_x | PSR_f | PSR_c},
464 {"CPSR_sxcf", true, PSR_s | PSR_x | PSR_c | PSR_f},
465 {"CPSR_scfx", true, PSR_s | PSR_c | PSR_f | PSR_x},
466 {"CPSR_scxf", true, PSR_s | PSR_c | PSR_x | PSR_f},
467 {"CPSR_xfsc", true, PSR_x | PSR_f | PSR_s | PSR_c},
468 {"CPSR_xfcs", true, PSR_x | PSR_f | PSR_c | PSR_s},
469 {"CPSR_xsfc", true, PSR_x | PSR_s | PSR_f | PSR_c},
470 {"CPSR_xscf", true, PSR_x | PSR_s | PSR_c | PSR_f},
471 {"CPSR_xcfs", true, PSR_x | PSR_c | PSR_f | PSR_s},
472 {"CPSR_xcsf", true, PSR_x | PSR_c | PSR_s | PSR_f},
473 {"CPSR_cfsx", true, PSR_c | PSR_f | PSR_s | PSR_x},
474 {"CPSR_cfxs", true, PSR_c | PSR_f | PSR_x | PSR_s},
475 {"CPSR_csfx", true, PSR_c | PSR_s | PSR_f | PSR_x},
476 {"CPSR_csxf", true, PSR_c | PSR_s | PSR_x | PSR_f},
477 {"CPSR_cxfs", true, PSR_c | PSR_x | PSR_f | PSR_s},
478 {"CPSR_cxsf", true, PSR_c | PSR_x | PSR_s | PSR_f},
479 {"SPSR_fs", false, PSR_f | PSR_s},
480 {"SPSR_fx", false, PSR_f | PSR_x},
481 {"SPSR_fc", false, PSR_f | PSR_c},
482 {"SPSR_sf", false, PSR_s | PSR_f},
483 {"SPSR_sx", false, PSR_s | PSR_x},
484 {"SPSR_sc", false, PSR_s | PSR_c},
485 {"SPSR_xf", false, PSR_x | PSR_f},
486 {"SPSR_xs", false, PSR_x | PSR_s},
487 {"SPSR_xc", false, PSR_x | PSR_c},
488 {"SPSR_cf", false, PSR_c | PSR_f},
489 {"SPSR_cs", false, PSR_c | PSR_s},
490 {"SPSR_cx", false, PSR_c | PSR_x},
491 {"SPSR_fsx", false, PSR_f | PSR_s | PSR_x},
492 {"SPSR_fsc", false, PSR_f | PSR_s | PSR_c},
493 {"SPSR_fxs", false, PSR_f | PSR_x | PSR_s},
494 {"SPSR_fxc", false, PSR_f | PSR_x | PSR_c},
495 {"SPSR_fcs", false, PSR_f | PSR_c | PSR_s},
496 {"SPSR_fcx", false, PSR_f | PSR_c | PSR_x},
497 {"SPSR_sfx", false, PSR_s | PSR_f | PSR_x},
498 {"SPSR_sfc", false, PSR_s | PSR_f | PSR_c},
499 {"SPSR_sxf", false, PSR_s | PSR_x | PSR_f},
500 {"SPSR_sxc", false, PSR_s | PSR_x | PSR_c},
501 {"SPSR_scf", false, PSR_s | PSR_c | PSR_f},
502 {"SPSR_scx", false, PSR_s | PSR_c | PSR_x},
503 {"SPSR_xfs", false, PSR_x | PSR_f | PSR_s},
504 {"SPSR_xfc", false, PSR_x | PSR_f | PSR_c},
505 {"SPSR_xsf", false, PSR_x | PSR_s | PSR_f},
506 {"SPSR_xsc", false, PSR_x | PSR_s | PSR_c},
507 {"SPSR_xcf", false, PSR_x | PSR_c | PSR_f},
508 {"SPSR_xcs", false, PSR_x | PSR_c | PSR_s},
509 {"SPSR_cfs", false, PSR_c | PSR_f | PSR_s},
510 {"SPSR_cfx", false, PSR_c | PSR_f | PSR_x},
511 {"SPSR_csf", false, PSR_c | PSR_s | PSR_f},
512 {"SPSR_csx", false, PSR_c | PSR_s | PSR_x},
513 {"SPSR_cxf", false, PSR_c | PSR_x | PSR_f},
514 {"SPSR_cxs", false, PSR_c | PSR_x | PSR_s},
515 {"SPSR_fsxc", false, PSR_f | PSR_s | PSR_x | PSR_c},
516 {"SPSR_fscx", false, PSR_f | PSR_s | PSR_c | PSR_x},
517 {"SPSR_fxsc", false, PSR_f | PSR_x | PSR_s | PSR_c},
518 {"SPSR_fxcs", false, PSR_f | PSR_x | PSR_c | PSR_s},
519 {"SPSR_fcsx", false, PSR_f | PSR_c | PSR_s | PSR_x},
520 {"SPSR_fcxs", false, PSR_f | PSR_c | PSR_x | PSR_s},
521 {"SPSR_sfxc", false, PSR_s | PSR_f | PSR_x | PSR_c},
522 {"SPSR_sfcx", false, PSR_s | PSR_f | PSR_c | PSR_x},
523 {"SPSR_sxfc", false, PSR_s | PSR_x | PSR_f | PSR_c},
524 {"SPSR_sxcf", false, PSR_s | PSR_x | PSR_c | PSR_f},
525 {"SPSR_scfx", false, PSR_s | PSR_c | PSR_f | PSR_x},
526 {"SPSR_scxf", false, PSR_s | PSR_c | PSR_x | PSR_f},
527 {"SPSR_xfsc", false, PSR_x | PSR_f | PSR_s | PSR_c},
528 {"SPSR_xfcs", false, PSR_x | PSR_f | PSR_c | PSR_s},
529 {"SPSR_xsfc", false, PSR_x | PSR_s | PSR_f | PSR_c},
530 {"SPSR_xscf", false, PSR_x | PSR_s | PSR_c | PSR_f},
531 {"SPSR_xcfs", false, PSR_x | PSR_c | PSR_f | PSR_s},
532 {"SPSR_xcsf", false, PSR_x | PSR_c | PSR_s | PSR_f},
533 {"SPSR_cfsx", false, PSR_c | PSR_f | PSR_s | PSR_x},
534 {"SPSR_cfxs", false, PSR_c | PSR_f | PSR_x | PSR_s},
535 {"SPSR_csfx", false, PSR_c | PSR_s | PSR_f | PSR_x},
536 {"SPSR_csxf", false, PSR_c | PSR_s | PSR_x | PSR_f},
537 {"SPSR_cxfs", false, PSR_c | PSR_x | PSR_f | PSR_s},
538 {"SPSR_cxsf", false, PSR_c | PSR_x | PSR_s | PSR_f},
539 /* For backwards compatability with older toolchain we also
540 support lower case versions of some of these flags. */
541 {"cpsr", true, PSR_c | PSR_f},
542 {"cpsr_all", true, PSR_c | PSR_f},
543 {"spsr", false, PSR_c | PSR_f},
544 {"spsr_all", false, PSR_c | PSR_f},
545 {"cpsr_flg", true, PSR_f},
546 {"cpsr_f", true, PSR_f},
547 {"spsr_flg", false, PSR_f},
548 {"spsr_f", false, PSR_f},
549 {"cpsr_c", true, PSR_c},
550 {"cpsr_ctl", true, PSR_c},
551 {"spsr_c", false, PSR_c},
552 {"spsr_ctl", false, PSR_c}
555 /* Functions called by parser. */
556 /* ARM instructions. */
557 static void do_arit PARAMS ((char *, unsigned long));
558 static void do_cmp PARAMS ((char *, unsigned long));
559 static void do_mov PARAMS ((char *, unsigned long));
560 static void do_ldst PARAMS ((char *, unsigned long));
561 static void do_ldmstm PARAMS ((char *, unsigned long));
562 static void do_branch PARAMS ((char *, unsigned long));
563 static void do_swi PARAMS ((char *, unsigned long));
564 /* Pseudo Op codes. */
565 static void do_adr PARAMS ((char *, unsigned long));
566 static void do_adrl PARAMS ((char *, unsigned long));
567 static void do_nop PARAMS ((char *, unsigned long));
569 static void do_mul PARAMS ((char *, unsigned long));
570 static void do_mla PARAMS ((char *, unsigned long));
572 static void do_swap PARAMS ((char *, unsigned long));
574 static void do_msr PARAMS ((char *, unsigned long));
575 static void do_mrs PARAMS ((char *, unsigned long));
577 static void do_mull PARAMS ((char *, unsigned long));
579 static void do_bx PARAMS ((char *, unsigned long));
581 /* Coprocessor Instructions. */
582 static void do_cdp PARAMS ((char *, unsigned long));
583 static void do_lstc PARAMS ((char *, unsigned long));
584 static void do_co_reg PARAMS ((char *, unsigned long));
585 static void do_fp_ctrl PARAMS ((char *, unsigned long));
586 static void do_fp_ldst PARAMS ((char *, unsigned long));
587 static void do_fp_ldmstm PARAMS ((char *, unsigned long));
588 static void do_fp_dyadic PARAMS ((char *, unsigned long));
589 static void do_fp_monadic PARAMS ((char *, unsigned long));
590 static void do_fp_cmp PARAMS ((char *, unsigned long));
591 static void do_fp_from_reg PARAMS ((char *, unsigned long));
592 static void do_fp_to_reg PARAMS ((char *, unsigned long));
594 static void fix_new_arm PARAMS ((fragS *, int, short, expressionS *, int, int));
595 static int arm_reg_parse PARAMS ((char **));
596 static CONST struct asm_psr * arm_psr_parse PARAMS ((char **));
597 static void symbol_locate PARAMS ((symbolS *, CONST char *, segT, valueT, fragS *));
598 static int add_to_lit_pool PARAMS ((void));
599 static unsigned validate_immediate PARAMS ((unsigned));
600 static unsigned validate_immediate_twopart PARAMS ((unsigned int, unsigned int *));
601 static int validate_offset_imm PARAMS ((unsigned int, int));
602 static void opcode_select PARAMS ((int));
603 static void end_of_line PARAMS ((char *));
604 static int reg_required_here PARAMS ((char **, int));
605 static int psr_required_here PARAMS ((char **));
606 static int co_proc_number PARAMS ((char **));
607 static int cp_opc_expr PARAMS ((char **, int, int));
608 static int cp_reg_required_here PARAMS ((char **, int));
609 static int fp_reg_required_here PARAMS ((char **, int));
610 static int cp_address_offset PARAMS ((char **));
611 static int cp_address_required_here PARAMS ((char **));
612 static int my_get_float_expression PARAMS ((char **));
613 static int skip_past_comma PARAMS ((char **));
614 static int walk_no_bignums PARAMS ((symbolS *));
615 static int negate_data_op PARAMS ((unsigned long *, unsigned long));
616 static int data_op2 PARAMS ((char **));
617 static int fp_op2 PARAMS ((char **));
618 static long reg_list PARAMS ((char **));
619 static void thumb_load_store PARAMS ((char *, int, int));
620 static int decode_shift PARAMS ((char **, int));
621 static int ldst_extend PARAMS ((char **, int));
622 static void thumb_add_sub PARAMS ((char *, int));
623 static void insert_reg PARAMS ((int));
624 static void thumb_shift PARAMS ((char *, int));
625 static void thumb_mov_compare PARAMS ((char *, int));
626 static void set_constant_flonums PARAMS ((void));
627 static valueT md_chars_to_number PARAMS ((char *, int));
628 static void insert_reg_alias PARAMS ((char *, int));
629 static void output_inst PARAMS ((void));
631 static bfd_reloc_code_real_type arm_parse_reloc PARAMS ((void));
634 /* ARM instructions take 4bytes in the object file, Thumb instructions
638 /* LONGEST_INST is the longest basic instruction name without conditions or
639 flags. ARM7M has 4 of length 5. */
641 #define LONGEST_INST 5
645 /* Basic string to match. */
646 CONST char * template;
648 /* Basic instruction code. */
651 /* Compulsory suffix that must follow conds. If "", then the
652 instruction is not conditional and must have no suffix. */
653 CONST char * comp_suffix;
655 /* Bits to toggle if flag 'n' set. */
656 CONST struct asm_flg * flags;
658 /* Which CPU variants this exists for. */
659 unsigned long variants;
661 /* Function to call to parse args. */
662 void (* parms) PARAMS ((char *, unsigned long));
665 static CONST struct asm_opcode insns[] =
667 /* ARM Instructions. */
668 {"and", 0x00000000, NULL, s_flag, ARM_ANY, do_arit},
669 {"eor", 0x00200000, NULL, s_flag, ARM_ANY, do_arit},
670 {"sub", 0x00400000, NULL, s_flag, ARM_ANY, do_arit},
671 {"rsb", 0x00600000, NULL, s_flag, ARM_ANY, do_arit},
672 {"add", 0x00800000, NULL, s_flag, ARM_ANY, do_arit},
673 {"adc", 0x00a00000, NULL, s_flag, ARM_ANY, do_arit},
674 {"sbc", 0x00c00000, NULL, s_flag, ARM_ANY, do_arit},
675 {"rsc", 0x00e00000, NULL, s_flag, ARM_ANY, do_arit},
676 {"orr", 0x01800000, NULL, s_flag, ARM_ANY, do_arit},
677 {"bic", 0x01c00000, NULL, s_flag, ARM_ANY, do_arit},
678 {"tst", 0x01000000, NULL, cmp_flags, ARM_ANY, do_cmp},
679 {"teq", 0x01200000, NULL, cmp_flags, ARM_ANY, do_cmp},
680 {"cmp", 0x01400000, NULL, cmp_flags, ARM_ANY, do_cmp},
681 {"cmn", 0x01600000, NULL, cmp_flags, ARM_ANY, do_cmp},
682 {"mov", 0x01a00000, NULL, s_flag, ARM_ANY, do_mov},
683 {"mvn", 0x01e00000, NULL, s_flag, ARM_ANY, do_mov},
684 {"str", 0x04000000, NULL, str_flags, ARM_ANY, do_ldst},
685 {"ldr", 0x04100000, NULL, ldr_flags, ARM_ANY, do_ldst},
686 {"stm", 0x08000000, NULL, stm_flags, ARM_ANY, do_ldmstm},
687 {"ldm", 0x08100000, NULL, ldm_flags, ARM_ANY, do_ldmstm},
688 {"swi", 0x0f000000, NULL, NULL, ARM_ANY, do_swi},
690 {"bl", 0x0b000000, NULL, NULL, ARM_ANY, do_branch},
691 {"b", 0x0a000000, NULL, NULL, ARM_ANY, do_branch},
693 {"bl", 0x0bfffffe, NULL, NULL, ARM_ANY, do_branch},
694 {"b", 0x0afffffe, NULL, NULL, ARM_ANY, do_branch},
698 {"adr", 0x028f0000, NULL, NULL, ARM_ANY, do_adr},
699 {"adrl", 0x028f0000, NULL, NULL, ARM_ANY, do_adrl},
700 {"nop", 0x01a00000, NULL, NULL, ARM_ANY, do_nop},
702 /* ARM 2 multiplies. */
703 {"mul", 0x00000090, NULL, s_flag, ARM_2UP, do_mul},
704 {"mla", 0x00200090, NULL, s_flag, ARM_2UP, do_mla},
706 /* ARM 3 - swp instructions. */
707 {"swp", 0x01000090, NULL, byte_flag, ARM_3UP, do_swap},
709 /* ARM 6 Coprocessor instructions. */
710 {"mrs", 0x010f0000, NULL, NULL, ARM_6UP, do_mrs},
711 {"msr", 0x0120f000, NULL, NULL, ARM_6UP, do_msr},
712 /* ScottB: our code uses 0x0128f000 for msr.
713 NickC: but this is wrong because the bits 16 through 19 are
714 handled by the PSR_xxx defines above. */
716 /* ARM 7M long multiplies - need signed/unsigned flags! */
717 {"smull", 0x00c00090, NULL, s_flag, ARM_LONGMUL, do_mull},
718 {"umull", 0x00800090, NULL, s_flag, ARM_LONGMUL, do_mull},
719 {"smlal", 0x00e00090, NULL, s_flag, ARM_LONGMUL, do_mull},
720 {"umlal", 0x00a00090, NULL, s_flag, ARM_LONGMUL, do_mull},
722 /* ARM THUMB interworking. */
723 {"bx", 0x012fff10, NULL, NULL, ARM_THUMB, do_bx},
725 /* Floating point instructions. */
726 {"wfs", 0x0e200110, NULL, NULL, FPU_ALL, do_fp_ctrl},
727 {"rfs", 0x0e300110, NULL, NULL, FPU_ALL, do_fp_ctrl},
728 {"wfc", 0x0e400110, NULL, NULL, FPU_ALL, do_fp_ctrl},
729 {"rfc", 0x0e500110, NULL, NULL, FPU_ALL, do_fp_ctrl},
730 {"ldf", 0x0c100100, "sdep", NULL, FPU_ALL, do_fp_ldst},
731 {"stf", 0x0c000100, "sdep", NULL, FPU_ALL, do_fp_ldst},
732 {"lfm", 0x0c100200, NULL, lfm_flags, FPU_MEMMULTI, do_fp_ldmstm},
733 {"sfm", 0x0c000200, NULL, sfm_flags, FPU_MEMMULTI, do_fp_ldmstm},
734 {"mvf", 0x0e008100, "sde", round_flags, FPU_ALL, do_fp_monadic},
735 {"mnf", 0x0e108100, "sde", round_flags, FPU_ALL, do_fp_monadic},
736 {"abs", 0x0e208100, "sde", round_flags, FPU_ALL, do_fp_monadic},
737 {"rnd", 0x0e308100, "sde", round_flags, FPU_ALL, do_fp_monadic},
738 {"sqt", 0x0e408100, "sde", round_flags, FPU_ALL, do_fp_monadic},
739 {"log", 0x0e508100, "sde", round_flags, FPU_ALL, do_fp_monadic},
740 {"lgn", 0x0e608100, "sde", round_flags, FPU_ALL, do_fp_monadic},
741 {"exp", 0x0e708100, "sde", round_flags, FPU_ALL, do_fp_monadic},
742 {"sin", 0x0e808100, "sde", round_flags, FPU_ALL, do_fp_monadic},
743 {"cos", 0x0e908100, "sde", round_flags, FPU_ALL, do_fp_monadic},
744 {"tan", 0x0ea08100, "sde", round_flags, FPU_ALL, do_fp_monadic},
745 {"asn", 0x0eb08100, "sde", round_flags, FPU_ALL, do_fp_monadic},
746 {"acs", 0x0ec08100, "sde", round_flags, FPU_ALL, do_fp_monadic},
747 {"atn", 0x0ed08100, "sde", round_flags, FPU_ALL, do_fp_monadic},
748 {"urd", 0x0ee08100, "sde", round_flags, FPU_ALL, do_fp_monadic},
749 {"nrm", 0x0ef08100, "sde", round_flags, FPU_ALL, do_fp_monadic},
750 {"adf", 0x0e000100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
751 {"suf", 0x0e200100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
752 {"rsf", 0x0e300100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
753 {"muf", 0x0e100100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
754 {"dvf", 0x0e400100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
755 {"rdf", 0x0e500100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
756 {"pow", 0x0e600100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
757 {"rpw", 0x0e700100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
758 {"rmf", 0x0e800100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
759 {"fml", 0x0e900100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
760 {"fdv", 0x0ea00100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
761 {"frd", 0x0eb00100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
762 {"pol", 0x0ec00100, "sde", round_flags, FPU_ALL, do_fp_dyadic},
763 {"cmf", 0x0e90f110, NULL, except_flag, FPU_ALL, do_fp_cmp},
764 {"cnf", 0x0eb0f110, NULL, except_flag, FPU_ALL, do_fp_cmp},
765 /* The FPA10 data sheet suggests that the 'E' of cmfe/cnfe should not
766 be an optional suffix, but part of the instruction. To be compatible,
768 {"cmfe", 0x0ed0f110, NULL, NULL, FPU_ALL, do_fp_cmp},
769 {"cnfe", 0x0ef0f110, NULL, NULL, FPU_ALL, do_fp_cmp},
770 {"flt", 0x0e000110, "sde", round_flags, FPU_ALL, do_fp_from_reg},
771 {"fix", 0x0e100110, NULL, fix_flags, FPU_ALL, do_fp_to_reg},
773 /* Generic copressor instructions. */
774 {"cdp", 0x0e000000, NULL, NULL, ARM_2UP, do_cdp},
775 {"ldc", 0x0c100000, NULL, cplong_flag, ARM_2UP, do_lstc},
776 {"stc", 0x0c000000, NULL, cplong_flag, ARM_2UP, do_lstc},
777 {"mcr", 0x0e000010, NULL, NULL, ARM_2UP, do_co_reg},
778 {"mrc", 0x0e100010, NULL, NULL, ARM_2UP, do_co_reg},
781 /* Defines for various bits that we will want to toggle. */
782 #define INST_IMMEDIATE 0x02000000
783 #define OFFSET_REG 0x02000000
784 #define HWOFFSET_IMM 0x00400000
785 #define SHIFT_BY_REG 0x00000010
786 #define PRE_INDEX 0x01000000
787 #define INDEX_UP 0x00800000
788 #define WRITE_BACK 0x00200000
789 #define LDM_TYPE_2_OR_3 0x00400000
791 #define LITERAL_MASK 0xf000f000
792 #define COND_MASK 0xf0000000
793 #define OPCODE_MASK 0xfe1fffff
794 #define DATA_OP_SHIFT 21
796 /* Codes to distinguish the arithmetic instructions. */
807 #define OPCODE_CMP 10
808 #define OPCODE_CMN 11
809 #define OPCODE_ORR 12
810 #define OPCODE_MOV 13
811 #define OPCODE_BIC 14
812 #define OPCODE_MVN 15
814 static void do_t_nop PARAMS ((char *));
815 static void do_t_arit PARAMS ((char *));
816 static void do_t_add PARAMS ((char *));
817 static void do_t_asr PARAMS ((char *));
818 static void do_t_branch9 PARAMS ((char *));
819 static void do_t_branch12 PARAMS ((char *));
820 static void do_t_branch23 PARAMS ((char *));
821 static void do_t_bx PARAMS ((char *));
822 static void do_t_compare PARAMS ((char *));
823 static void do_t_ldmstm PARAMS ((char *));
824 static void do_t_ldr PARAMS ((char *));
825 static void do_t_ldrb PARAMS ((char *));
826 static void do_t_ldrh PARAMS ((char *));
827 static void do_t_lds PARAMS ((char *));
828 static void do_t_lsl PARAMS ((char *));
829 static void do_t_lsr PARAMS ((char *));
830 static void do_t_mov PARAMS ((char *));
831 static void do_t_push_pop PARAMS ((char *));
832 static void do_t_str PARAMS ((char *));
833 static void do_t_strb PARAMS ((char *));
834 static void do_t_strh PARAMS ((char *));
835 static void do_t_sub PARAMS ((char *));
836 static void do_t_swi PARAMS ((char *));
837 static void do_t_adr PARAMS ((char *));
839 #define T_OPCODE_MUL 0x4340
840 #define T_OPCODE_TST 0x4200
841 #define T_OPCODE_CMN 0x42c0
842 #define T_OPCODE_NEG 0x4240
843 #define T_OPCODE_MVN 0x43c0
845 #define T_OPCODE_ADD_R3 0x1800
846 #define T_OPCODE_SUB_R3 0x1a00
847 #define T_OPCODE_ADD_HI 0x4400
848 #define T_OPCODE_ADD_ST 0xb000
849 #define T_OPCODE_SUB_ST 0xb080
850 #define T_OPCODE_ADD_SP 0xa800
851 #define T_OPCODE_ADD_PC 0xa000
852 #define T_OPCODE_ADD_I8 0x3000
853 #define T_OPCODE_SUB_I8 0x3800
854 #define T_OPCODE_ADD_I3 0x1c00
855 #define T_OPCODE_SUB_I3 0x1e00
857 #define T_OPCODE_ASR_R 0x4100
858 #define T_OPCODE_LSL_R 0x4080
859 #define T_OPCODE_LSR_R 0x40c0
860 #define T_OPCODE_ASR_I 0x1000
861 #define T_OPCODE_LSL_I 0x0000
862 #define T_OPCODE_LSR_I 0x0800
864 #define T_OPCODE_MOV_I8 0x2000
865 #define T_OPCODE_CMP_I8 0x2800
866 #define T_OPCODE_CMP_LR 0x4280
867 #define T_OPCODE_MOV_HR 0x4600
868 #define T_OPCODE_CMP_HR 0x4500
870 #define T_OPCODE_LDR_PC 0x4800
871 #define T_OPCODE_LDR_SP 0x9800
872 #define T_OPCODE_STR_SP 0x9000
873 #define T_OPCODE_LDR_IW 0x6800
874 #define T_OPCODE_STR_IW 0x6000
875 #define T_OPCODE_LDR_IH 0x8800
876 #define T_OPCODE_STR_IH 0x8000
877 #define T_OPCODE_LDR_IB 0x7800
878 #define T_OPCODE_STR_IB 0x7000
879 #define T_OPCODE_LDR_RW 0x5800
880 #define T_OPCODE_STR_RW 0x5000
881 #define T_OPCODE_LDR_RH 0x5a00
882 #define T_OPCODE_STR_RH 0x5200
883 #define T_OPCODE_LDR_RB 0x5c00
884 #define T_OPCODE_STR_RB 0x5400
886 #define T_OPCODE_PUSH 0xb400
887 #define T_OPCODE_POP 0xbc00
889 #define T_OPCODE_BRANCH 0xe7fe
891 static int thumb_reg PARAMS ((char ** str, int hi_lo));
893 #define THUMB_SIZE 2 /* Size of thumb instruction. */
894 #define THUMB_REG_LO 0x1
895 #define THUMB_REG_HI 0x2
896 #define THUMB_REG_ANY 0x3
898 #define THUMB_H1 0x0080
899 #define THUMB_H2 0x0040
906 #define THUMB_COMPARE 1
909 #define THUMB_STORE 1
911 #define THUMB_PP_PC_LR 0x0100
913 /* These three are used for immediate shifts, do not alter. */
915 #define THUMB_HALFWORD 1
920 /* Basic string to match. */
921 CONST char * template;
923 /* Basic instruction code. */
928 /* Which CPU variants this exists for. */
929 unsigned long variants;
931 /* Function to call to parse args. */
932 void (* parms) PARAMS ((char *));
935 static CONST struct thumb_opcode tinsns[] =
937 {"adc", 0x4140, 2, ARM_THUMB, do_t_arit},
938 {"add", 0x0000, 2, ARM_THUMB, do_t_add},
939 {"and", 0x4000, 2, ARM_THUMB, do_t_arit},
940 {"asr", 0x0000, 2, ARM_THUMB, do_t_asr},
941 {"b", T_OPCODE_BRANCH, 2, ARM_THUMB, do_t_branch12},
942 {"beq", 0xd0fe, 2, ARM_THUMB, do_t_branch9},
943 {"bne", 0xd1fe, 2, ARM_THUMB, do_t_branch9},
944 {"bcs", 0xd2fe, 2, ARM_THUMB, do_t_branch9},
945 {"bhs", 0xd2fe, 2, ARM_THUMB, do_t_branch9},
946 {"bcc", 0xd3fe, 2, ARM_THUMB, do_t_branch9},
947 {"bul", 0xd3fe, 2, ARM_THUMB, do_t_branch9},
948 {"blo", 0xd3fe, 2, ARM_THUMB, do_t_branch9},
949 {"bmi", 0xd4fe, 2, ARM_THUMB, do_t_branch9},
950 {"bpl", 0xd5fe, 2, ARM_THUMB, do_t_branch9},
951 {"bvs", 0xd6fe, 2, ARM_THUMB, do_t_branch9},
952 {"bvc", 0xd7fe, 2, ARM_THUMB, do_t_branch9},
953 {"bhi", 0xd8fe, 2, ARM_THUMB, do_t_branch9},
954 {"bls", 0xd9fe, 2, ARM_THUMB, do_t_branch9},
955 {"bge", 0xdafe, 2, ARM_THUMB, do_t_branch9},
956 {"blt", 0xdbfe, 2, ARM_THUMB, do_t_branch9},
957 {"bgt", 0xdcfe, 2, ARM_THUMB, do_t_branch9},
958 {"ble", 0xddfe, 2, ARM_THUMB, do_t_branch9},
959 {"bal", 0xdefe, 2, ARM_THUMB, do_t_branch9},
960 {"bic", 0x4380, 2, ARM_THUMB, do_t_arit},
961 {"bl", 0xf7fffffe, 4, ARM_THUMB, do_t_branch23},
962 {"bx", 0x4700, 2, ARM_THUMB, do_t_bx},
963 {"cmn", T_OPCODE_CMN, 2, ARM_THUMB, do_t_arit},
964 {"cmp", 0x0000, 2, ARM_THUMB, do_t_compare},
965 {"eor", 0x4040, 2, ARM_THUMB, do_t_arit},
966 {"ldmia", 0xc800, 2, ARM_THUMB, do_t_ldmstm},
967 {"ldr", 0x0000, 2, ARM_THUMB, do_t_ldr},
968 {"ldrb", 0x0000, 2, ARM_THUMB, do_t_ldrb},
969 {"ldrh", 0x0000, 2, ARM_THUMB, do_t_ldrh},
970 {"ldrsb", 0x5600, 2, ARM_THUMB, do_t_lds},
971 {"ldrsh", 0x5e00, 2, ARM_THUMB, do_t_lds},
972 {"ldsb", 0x5600, 2, ARM_THUMB, do_t_lds},
973 {"ldsh", 0x5e00, 2, ARM_THUMB, do_t_lds},
974 {"lsl", 0x0000, 2, ARM_THUMB, do_t_lsl},
975 {"lsr", 0x0000, 2, ARM_THUMB, do_t_lsr},
976 {"mov", 0x0000, 2, ARM_THUMB, do_t_mov},
977 {"mul", T_OPCODE_MUL, 2, ARM_THUMB, do_t_arit},
978 {"mvn", T_OPCODE_MVN, 2, ARM_THUMB, do_t_arit},
979 {"neg", T_OPCODE_NEG, 2, ARM_THUMB, do_t_arit},
980 {"orr", 0x4300, 2, ARM_THUMB, do_t_arit},
981 {"pop", 0xbc00, 2, ARM_THUMB, do_t_push_pop},
982 {"push", 0xb400, 2, ARM_THUMB, do_t_push_pop},
983 {"ror", 0x41c0, 2, ARM_THUMB, do_t_arit},
984 {"sbc", 0x4180, 2, ARM_THUMB, do_t_arit},
985 {"stmia", 0xc000, 2, ARM_THUMB, do_t_ldmstm},
986 {"str", 0x0000, 2, ARM_THUMB, do_t_str},
987 {"strb", 0x0000, 2, ARM_THUMB, do_t_strb},
988 {"strh", 0x0000, 2, ARM_THUMB, do_t_strh},
989 {"swi", 0xdf00, 2, ARM_THUMB, do_t_swi},
990 {"sub", 0x0000, 2, ARM_THUMB, do_t_sub},
991 {"tst", T_OPCODE_TST, 2, ARM_THUMB, do_t_arit},
993 {"adr", 0x0000, 2, ARM_THUMB, do_t_adr},
994 {"nop", 0x46C0, 2, ARM_THUMB, do_t_nop}, /* mov r8,r8 */
1003 #define int_register(reg) ((reg) >= 0 && (reg) <= 15)
1004 #define cp_register(reg) ((reg) >= 32 && (reg) <= 47)
1005 #define fp_register(reg) ((reg) >= 16 && (reg) <= 23)
1011 /* These are the standard names. Users can add aliases with .req. */
1012 static CONST struct reg_entry reg_table[] =
1014 /* Processor Register Numbers. */
1015 {"r0", 0}, {"r1", 1}, {"r2", 2}, {"r3", 3},
1016 {"r4", 4}, {"r5", 5}, {"r6", 6}, {"r7", 7},
1017 {"r8", 8}, {"r9", 9}, {"r10", 10}, {"r11", 11},
1018 {"r12", 12}, {"r13", REG_SP},{"r14", REG_LR},{"r15", REG_PC},
1019 /* APCS conventions. */
1020 {"a1", 0}, {"a2", 1}, {"a3", 2}, {"a4", 3},
1021 {"v1", 4}, {"v2", 5}, {"v3", 6}, {"v4", 7}, {"v5", 8},
1022 {"v6", 9}, {"sb", 9}, {"v7", 10}, {"sl", 10},
1023 {"fp", 11}, {"ip", 12}, {"sp", REG_SP},{"lr", REG_LR},{"pc", REG_PC},
1024 /* ATPCS additions to APCS conventions. */
1025 {"wr", 7}, {"v8", 11},
1027 {"f0", 16}, {"f1", 17}, {"f2", 18}, {"f3", 19},
1028 {"f4", 20}, {"f5", 21}, {"f6", 22}, {"f7", 23},
1029 {"c0", 32}, {"c1", 33}, {"c2", 34}, {"c3", 35},
1030 {"c4", 36}, {"c5", 37}, {"c6", 38}, {"c7", 39},
1031 {"c8", 40}, {"c9", 41}, {"c10", 42}, {"c11", 43},
1032 {"c12", 44}, {"c13", 45}, {"c14", 46}, {"c15", 47},
1033 {"cr0", 32}, {"cr1", 33}, {"cr2", 34}, {"cr3", 35},
1034 {"cr4", 36}, {"cr5", 37}, {"cr6", 38}, {"cr7", 39},
1035 {"cr8", 40}, {"cr9", 41}, {"cr10", 42}, {"cr11", 43},
1036 {"cr12", 44}, {"cr13", 45}, {"cr14", 46}, {"cr15", 47},
1037 /* ATPCS additions to float register names. */
1038 {"s0",16}, {"s1",17}, {"s2",18}, {"s3",19},
1039 {"s4",20}, {"s5",21}, {"s6",22}, {"s7",23},
1040 {"d0",16}, {"d1",17}, {"d2",18}, {"d3",19},
1041 {"d4",20}, {"d5",21}, {"d6",22}, {"d7",23},
1042 /* FIXME: At some point we need to add VFP register names. */
1043 /* Array terminator. */
1047 #define BAD_ARGS _("Bad arguments to instruction")
1048 #define BAD_PC _("r15 not allowed here")
1049 #define BAD_FLAGS _("Instruction should not have flags")
1050 #define BAD_COND _("Instruction is not conditional")
1052 static struct hash_control * arm_ops_hsh = NULL;
1053 static struct hash_control * arm_tops_hsh = NULL;
1054 static struct hash_control * arm_cond_hsh = NULL;
1055 static struct hash_control * arm_shift_hsh = NULL;
1056 static struct hash_control * arm_reg_hsh = NULL;
1057 static struct hash_control * arm_psr_hsh = NULL;
1059 /* This table describes all the machine specific pseudo-ops the assembler
1060 has to support. The fields are:
1061 pseudo-op name without dot
1062 function to call to execute this pseudo-op
1063 Integer arg to pass to the function. */
1065 static void s_req PARAMS ((int));
1066 static void s_align PARAMS ((int));
1067 static void s_bss PARAMS ((int));
1068 static void s_even PARAMS ((int));
1069 static void s_ltorg PARAMS ((int));
1070 static void s_arm PARAMS ((int));
1071 static void s_thumb PARAMS ((int));
1072 static void s_code PARAMS ((int));
1073 static void s_force_thumb PARAMS ((int));
1074 static void s_thumb_func PARAMS ((int));
1075 static void s_thumb_set PARAMS ((int));
1076 static void arm_s_text PARAMS ((int));
1077 static void arm_s_data PARAMS ((int));
1079 static void arm_s_section PARAMS ((int));
1080 static void s_arm_elf_cons PARAMS ((int));
1083 static int my_get_expression PARAMS ((expressionS *, char **));
1085 CONST pseudo_typeS md_pseudo_table[] =
1087 /* Never called becasue '.req' does not start line. */
1088 { "req", s_req, 0 },
1089 { "bss", s_bss, 0 },
1090 { "align", s_align, 0 },
1091 { "arm", s_arm, 0 },
1092 { "thumb", s_thumb, 0 },
1093 { "code", s_code, 0 },
1094 { "force_thumb", s_force_thumb, 0 },
1095 { "thumb_func", s_thumb_func, 0 },
1096 { "thumb_set", s_thumb_set, 0 },
1097 { "even", s_even, 0 },
1098 { "ltorg", s_ltorg, 0 },
1099 { "pool", s_ltorg, 0 },
1100 /* Allow for the effect of section changes. */
1101 { "text", arm_s_text, 0 },
1102 { "data", arm_s_data, 0 },
1104 { "section", arm_s_section, 0 },
1105 { "section.s", arm_s_section, 0 },
1106 { "sect", arm_s_section, 0 },
1107 { "sect.s", arm_s_section, 0 },
1108 { "word", s_arm_elf_cons, 4 },
1109 { "long", s_arm_elf_cons, 4 },
1113 { "extend", float_cons, 'x' },
1114 { "ldouble", float_cons, 'x' },
1115 { "packed", float_cons, 'p' },
1119 /* Stuff needed to resolve the label ambiguity
1129 symbolS * last_label_seen;
1130 static int label_is_thumb_function_name = false;
1132 /* Literal stuff. */
1134 #define MAX_LITERAL_POOL_SIZE 1024
1136 typedef struct literalS
1138 struct expressionS exp;
1139 struct arm_it * inst;
1142 literalT literals[MAX_LITERAL_POOL_SIZE];
1144 /* Next free entry in the pool. */
1145 int next_literal_pool_place = 0;
1147 /* Next literal pool number. */
1148 int lit_pool_num = 1;
1150 symbolS * current_poolP = NULL;
1157 if (current_poolP == NULL)
1158 current_poolP = symbol_create (FAKE_LABEL_NAME, undefined_section,
1159 (valueT) 0, &zero_address_frag);
1161 /* Check if this literal value is already in the pool: */
1162 while (lit_count < next_literal_pool_place)
1164 if (literals[lit_count].exp.X_op == inst.reloc.exp.X_op
1165 && inst.reloc.exp.X_op == O_constant
1166 && (literals[lit_count].exp.X_add_number
1167 == inst.reloc.exp.X_add_number)
1168 && literals[lit_count].exp.X_unsigned == inst.reloc.exp.X_unsigned)
1173 if (lit_count == next_literal_pool_place) /* New entry. */
1175 if (next_literal_pool_place > MAX_LITERAL_POOL_SIZE)
1177 inst.error = _("Literal Pool Overflow");
1181 literals[next_literal_pool_place].exp = inst.reloc.exp;
1182 lit_count = next_literal_pool_place++;
1185 inst.reloc.exp.X_op = O_symbol;
1186 inst.reloc.exp.X_add_number = (lit_count) * 4 - 8;
1187 inst.reloc.exp.X_add_symbol = current_poolP;
1192 /* Can't use symbol_new here, so have to create a symbol and then at
1193 a later date assign it a value. Thats what these functions do. */
1196 symbol_locate (symbolP, name, segment, valu, frag)
1198 CONST char * name; /* It is copied, the caller can modify. */
1199 segT segment; /* Segment identifier (SEG_<something>). */
1200 valueT valu; /* Symbol value. */
1201 fragS * frag; /* Associated fragment. */
1203 unsigned int name_length;
1204 char * preserved_copy_of_name;
1206 name_length = strlen (name) + 1; /* +1 for \0. */
1207 obstack_grow (¬es, name, name_length);
1208 preserved_copy_of_name = obstack_finish (¬es);
1209 #ifdef STRIP_UNDERSCORE
1210 if (preserved_copy_of_name[0] == '_')
1211 preserved_copy_of_name++;
1214 #ifdef tc_canonicalize_symbol_name
1215 preserved_copy_of_name =
1216 tc_canonicalize_symbol_name (preserved_copy_of_name);
1219 S_SET_NAME (symbolP, preserved_copy_of_name);
1221 S_SET_SEGMENT (symbolP, segment);
1222 S_SET_VALUE (symbolP, valu);
1223 symbol_clear_list_pointers(symbolP);
1225 symbol_set_frag (symbolP, frag);
1227 /* Link to end of symbol chain. */
1229 extern int symbol_table_frozen;
1230 if (symbol_table_frozen)
1234 symbol_append (symbolP, symbol_lastP, & symbol_rootP, & symbol_lastP);
1236 obj_symbol_new_hook (symbolP);
1238 #ifdef tc_symbol_new_hook
1239 tc_symbol_new_hook (symbolP);
1243 verify_symbol_chain (symbol_rootP, symbol_lastP);
1244 #endif /* DEBUG_SYMS */
1247 /* Check that an immediate is valid.
1248 If so, convert it to the right format. */
1251 validate_immediate (val)
1257 #define rotate_left(v, n) (v << n | v >> (32 - n))
1259 for (i = 0; i < 32; i += 2)
1260 if ((a = rotate_left (val, i)) <= 0xff)
1261 return a | (i << 7); /* 12-bit pack: [shift-cnt,const]. */
1266 /* Check to see if an immediate can be computed as two seperate immediate
1267 values, added together. We already know that this value cannot be
1268 computed by just one ARM instruction. */
1271 validate_immediate_twopart (val, highpart)
1273 unsigned int * highpart;
1278 for (i = 0; i < 32; i += 2)
1279 if (((a = rotate_left (val, i)) & 0xff) != 0)
1285 * highpart = (a >> 8) | ((i + 24) << 7);
1287 else if (a & 0xff0000)
1291 * highpart = (a >> 16) | ((i + 16) << 7);
1295 assert (a & 0xff000000);
1296 * highpart = (a >> 24) | ((i + 8) << 7);
1299 return (a & 0xff) | (i << 7);
1306 validate_offset_imm (val, hwse)
1310 if ((hwse && val > 255) || val > 4095)
1317 int a ATTRIBUTE_UNUSED;
1319 as_bad (_("Invalid syntax for .req directive."));
1324 int ignore ATTRIBUTE_UNUSED;
1326 /* We don't support putting frags in the BSS segment, we fake it by
1327 marking in_bss, then looking at s_skip for clues. */
1328 subseg_set (bss_section, 0);
1329 demand_empty_rest_of_line ();
1334 int ignore ATTRIBUTE_UNUSED;
1336 /* Never make frag if expect extra pass. */
1338 frag_align (1, 0, 0);
1340 record_alignment (now_seg, 1);
1342 demand_empty_rest_of_line ();
1347 int ignored ATTRIBUTE_UNUSED;
1352 if (current_poolP == NULL)
1355 /* Align pool as you have word accesses.
1356 Only make a frag if we have to. */
1358 frag_align (2, 0, 0);
1360 record_alignment (now_seg, 2);
1362 sprintf (sym_name, "$$lit_\002%x", lit_pool_num++);
1364 symbol_locate (current_poolP, sym_name, now_seg,
1365 (valueT) frag_now_fix (), frag_now);
1366 symbol_table_insert (current_poolP);
1368 ARM_SET_THUMB (current_poolP, thumb_mode);
1370 #if defined OBJ_COFF || defined OBJ_ELF
1371 ARM_SET_INTERWORK (current_poolP, support_interwork);
1374 while (lit_count < next_literal_pool_place)
1375 /* First output the expression in the instruction to the pool. */
1376 emit_expr (&(literals[lit_count++].exp), 4); /* .word */
1378 next_literal_pool_place = 0;
1379 current_poolP = NULL;
1382 /* Same as s_align_ptwo but align 0 => align 2. */
1386 int unused ATTRIBUTE_UNUSED;
1389 register long temp_fill;
1390 long max_alignment = 15;
1392 temp = get_absolute_expression ();
1393 if (temp > max_alignment)
1394 as_bad (_("Alignment too large: %d. assumed."), temp = max_alignment);
1397 as_bad (_("Alignment negative. 0 assumed."));
1401 if (*input_line_pointer == ',')
1403 input_line_pointer++;
1404 temp_fill = get_absolute_expression ();
1412 /* Only make a frag if we HAVE to. */
1413 if (temp && !need_pass_2)
1414 frag_align (temp, (int) temp_fill, 0);
1415 demand_empty_rest_of_line ();
1417 record_alignment (now_seg, temp);
1421 s_force_thumb (ignore)
1422 int ignore ATTRIBUTE_UNUSED;
1424 /* If we are not already in thumb mode go into it, EVEN if
1425 the target processor does not support thumb instructions.
1426 This is used by gcc/config/arm/lib1funcs.asm for example
1427 to compile interworking support functions even if the
1428 target processor should not support interworking. */
1433 record_alignment (now_seg, 1);
1436 demand_empty_rest_of_line ();
1440 s_thumb_func (ignore)
1441 int ignore ATTRIBUTE_UNUSED;
1446 /* The following label is the name/address of the start of a Thumb function.
1447 We need to know this for the interworking support. */
1448 label_is_thumb_function_name = true;
1450 demand_empty_rest_of_line ();
1453 /* Perform a .set directive, but also mark the alias as
1454 being a thumb function. */
1460 /* XXX the following is a duplicate of the code for s_set() in read.c
1461 We cannot just call that code as we need to get at the symbol that
1463 register char * name;
1464 register char delim;
1465 register char * end_name;
1466 register symbolS * symbolP;
1468 /* Especial apologies for the random logic:
1469 This just grew, and could be parsed much more simply!
1471 name = input_line_pointer;
1472 delim = get_symbol_end ();
1473 end_name = input_line_pointer;
1478 if (*input_line_pointer != ',')
1481 as_bad (_("Expected comma after name \"%s\""), name);
1483 ignore_rest_of_line ();
1487 input_line_pointer++;
1490 if (name[0] == '.' && name[1] == '\0')
1492 /* XXX - this should not happen to .thumb_set. */
1496 if ((symbolP = symbol_find (name)) == NULL
1497 && (symbolP = md_undefined_symbol (name)) == NULL)
1500 /* When doing symbol listings, play games with dummy fragments living
1501 outside the normal fragment chain to record the file and line info
1503 if (listing & LISTING_SYMBOLS)
1505 extern struct list_info_struct * listing_tail;
1506 fragS * dummy_frag = (fragS *) xmalloc (sizeof (fragS));
1508 memset (dummy_frag, 0, sizeof (fragS));
1509 dummy_frag->fr_type = rs_fill;
1510 dummy_frag->line = listing_tail;
1511 symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
1512 dummy_frag->fr_symbol = symbolP;
1516 symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
1519 /* "set" symbols are local unless otherwise specified. */
1520 SF_SET_LOCAL (symbolP);
1521 #endif /* OBJ_COFF */
1522 } /* Make a new symbol. */
1524 symbol_table_insert (symbolP);
1529 && S_IS_DEFINED (symbolP)
1530 && S_GET_SEGMENT (symbolP) != reg_section)
1531 as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
1533 pseudo_set (symbolP);
1535 demand_empty_rest_of_line ();
1537 /* XXX Now we come to the Thumb specific bit of code. */
1539 THUMB_SET_FUNC (symbolP, 1);
1540 ARM_SET_THUMB (symbolP, 1);
1541 #if defined OBJ_ELF || defined OBJ_COFF
1542 ARM_SET_INTERWORK (symbolP, support_interwork);
1546 /* If we change section we must dump the literal pool first. */
1552 if (now_seg != text_section)
1556 obj_elf_text (ignore);
1566 if (flag_readonly_data_in_text)
1568 if (now_seg != text_section)
1571 else if (now_seg != data_section)
1575 obj_elf_data (ignore);
1583 arm_s_section (ignore)
1588 obj_elf_section (ignore);
1593 opcode_select (width)
1601 if (! (cpu_variant & ARM_THUMB))
1602 as_bad (_("selected processor does not support THUMB opcodes"));
1605 /* No need to force the alignment, since we will have been
1606 coming from ARM mode, which is word-aligned. */
1607 record_alignment (now_seg, 1);
1614 if ((cpu_variant & ARM_ANY) == ARM_THUMB)
1615 as_bad (_("selected processor does not support ARM opcodes"));
1620 frag_align (2, 0, 0);
1622 record_alignment (now_seg, 1);
1627 as_bad (_("invalid instruction size selected (%d)"), width);
1633 int ignore ATTRIBUTE_UNUSED;
1636 demand_empty_rest_of_line ();
1641 int ignore ATTRIBUTE_UNUSED;
1644 demand_empty_rest_of_line ();
1649 int unused ATTRIBUTE_UNUSED;
1653 temp = get_absolute_expression ();
1658 opcode_select (temp);
1662 as_bad (_("invalid operand to .code directive (%d) (expecting 16 or 32)"), temp);
1670 skip_whitespace (str);
1673 inst.error = _("Garbage following instruction");
1677 skip_past_comma (str)
1680 char * p = * str, c;
1683 while ((c = *p) == ' ' || c == ',')
1686 if (c == ',' && comma++)
1694 return comma ? SUCCESS : FAIL;
1697 /* A standard register must be given at this point.
1698 SHIFT is the place to put it in inst.instruction.
1699 Restores input start point on error.
1700 Returns the reg#, or FAIL. */
1703 reg_required_here (str, shift)
1707 static char buff [128]; /* XXX */
1709 char * start = * str;
1711 if ((reg = arm_reg_parse (str)) != FAIL && int_register (reg))
1714 inst.instruction |= reg << shift;
1718 /* Restore the start point, we may have got a reg of the wrong class. */
1721 /* In the few cases where we might be able to accept something else
1722 this error can be overridden. */
1723 sprintf (buff, _("Register expected, not '%.100s'"), start);
1729 static CONST struct asm_psr *
1731 register char ** ccp;
1733 char * start = * ccp;
1736 CONST struct asm_psr * psr;
1740 /* Skip to the end of the next word in the input stream. */
1745 while (isalpha (c) || c == '_');
1747 /* Terminate the word. */
1750 /* Now locate the word in the psr hash table. */
1751 psr = (CONST struct asm_psr *) hash_find (arm_psr_hsh, start);
1753 /* Restore the input stream. */
1756 /* If we found a valid match, advance the
1757 stream pointer past the end of the word. */
1763 /* Parse the input looking for a PSR flag. */
1766 psr_required_here (str)
1769 char * start = * str;
1770 CONST struct asm_psr * psr;
1772 psr = arm_psr_parse (str);
1776 /* If this is the SPSR that is being modified, set the R bit. */
1778 inst.instruction |= SPSR_BIT;
1780 /* Set the psr flags in the MSR instruction. */
1781 inst.instruction |= psr->field << PSR_SHIFT;
1786 /* In the few cases where we might be able to accept
1787 something else this error can be overridden. */
1788 inst.error = _("flag for {c}psr instruction expected");
1790 /* Restore the start point. */
1796 co_proc_number (str)
1799 int processor, pchar;
1801 skip_whitespace (* str);
1803 /* The data sheet seems to imply that just a number on its own is valid
1804 here, but the RISC iX assembler seems to accept a prefix 'p'. We will
1806 if (**str == 'p' || **str == 'P')
1810 if (pchar >= '0' && pchar <= '9')
1812 processor = pchar - '0';
1813 if (**str >= '0' && **str <= '9')
1815 processor = processor * 10 + *(*str)++ - '0';
1818 inst.error = _("Illegal co-processor number");
1825 inst.error = _("Bad or missing co-processor number");
1829 inst.instruction |= processor << 8;
1834 cp_opc_expr (str, where, length)
1841 skip_whitespace (* str);
1843 memset (&expr, '\0', sizeof (expr));
1845 if (my_get_expression (&expr, str))
1847 if (expr.X_op != O_constant)
1849 inst.error = _("bad or missing expression");
1853 if ((expr.X_add_number & ((1 << length) - 1)) != expr.X_add_number)
1855 inst.error = _("immediate co-processor expression too large");
1859 inst.instruction |= expr.X_add_number << where;
1864 cp_reg_required_here (str, where)
1869 char * start = *str;
1871 if ((reg = arm_reg_parse (str)) != FAIL && cp_register (reg))
1874 inst.instruction |= reg << where;
1878 /* In the few cases where we might be able to accept something else
1879 this error can be overridden. */
1880 inst.error = _("Co-processor register expected");
1882 /* Restore the start point. */
1888 fp_reg_required_here (str, where)
1893 char * start = * str;
1895 if ((reg = arm_reg_parse (str)) != FAIL && fp_register (reg))
1898 inst.instruction |= reg << where;
1902 /* In the few cases where we might be able to accept something else
1903 this error can be overridden. */
1904 inst.error = _("Floating point register expected");
1906 /* Restore the start point. */
1912 cp_address_offset (str)
1917 skip_whitespace (* str);
1919 if (! is_immediate_prefix (**str))
1921 inst.error = _("immediate expression expected");
1927 if (my_get_expression (& inst.reloc.exp, str))
1930 if (inst.reloc.exp.X_op == O_constant)
1932 offset = inst.reloc.exp.X_add_number;
1936 inst.error = _("co-processor address must be word aligned");
1940 if (offset > 1023 || offset < -1023)
1942 inst.error = _("offset too large");
1947 inst.instruction |= INDEX_UP;
1951 inst.instruction |= offset >> 2;
1954 inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
1960 cp_address_required_here (str)
1972 skip_whitespace (p);
1974 if ((reg = reg_required_here (& p, 16)) == FAIL)
1977 skip_whitespace (p);
1983 if (skip_past_comma (& p) == SUCCESS)
1986 write_back = WRITE_BACK;
1990 inst.error = _("pc may not be used in post-increment");
1994 if (cp_address_offset (& p) == FAIL)
1998 pre_inc = PRE_INDEX | INDEX_UP;
2002 /* '['Rn, #expr']'[!] */
2004 if (skip_past_comma (& p) == FAIL)
2006 inst.error = _("pre-indexed expression expected");
2010 pre_inc = PRE_INDEX;
2012 if (cp_address_offset (& p) == FAIL)
2015 skip_whitespace (p);
2019 inst.error = _("missing ]");
2023 skip_whitespace (p);
2029 inst.error = _("pc may not be used with write-back");
2034 write_back = WRITE_BACK;
2040 if (my_get_expression (&inst.reloc.exp, &p))
2043 inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
2044 inst.reloc.exp.X_add_number -= 8; /* PC rel adjust. */
2045 inst.reloc.pc_rel = 1;
2046 inst.instruction |= (REG_PC << 16);
2047 pre_inc = PRE_INDEX;
2050 inst.instruction |= write_back | pre_inc;
2058 unsigned long flags;
2060 /* Do nothing really. */
2061 inst.instruction |= flags; /* This is pointless. */
2069 unsigned long flags;
2073 /* Only one syntax. */
2074 skip_whitespace (str);
2076 if (reg_required_here (&str, 12) == FAIL)
2078 inst.error = BAD_ARGS;
2082 if (skip_past_comma (&str) == FAIL)
2084 inst.error = _("comma expected after register name");
2088 skip_whitespace (str);
2090 if ( strcmp (str, "CPSR") == 0
2091 || strcmp (str, "SPSR") == 0
2092 /* Lower case versions for backwards compatability. */
2093 || strcmp (str, "cpsr") == 0
2094 || strcmp (str, "spsr") == 0)
2097 /* This is for backwards compatability with older toolchains. */
2098 else if ( strcmp (str, "cpsr_all") == 0
2099 || strcmp (str, "spsr_all") == 0)
2103 inst.error = _("{C|S}PSR expected");
2107 if (* str == 's' || * str == 'S')
2108 inst.instruction |= SPSR_BIT;
2111 inst.instruction |= flags;
2115 /* Two possible forms:
2116 "{C|S}PSR_<field>, Rm",
2117 "{C|S}PSR_f, #expression". */
2122 unsigned long flags;
2124 skip_whitespace (str);
2126 if (psr_required_here (& str) == FAIL)
2129 if (skip_past_comma (& str) == FAIL)
2131 inst.error = _("comma missing after psr flags");
2135 skip_whitespace (str);
2137 if (reg_required_here (& str, 0) != FAIL)
2140 inst.instruction |= flags;
2145 if (! is_immediate_prefix (* str))
2148 _("only a register or immediate value can follow a psr flag");
2155 if (my_get_expression (& inst.reloc.exp, & str))
2158 _("only a register or immediate value can follow a psr flag");
2162 if (inst.instruction & ((PSR_c | PSR_x | PSR_s) << PSR_SHIFT))
2164 inst.error = _("can only set flag field with immediate value");
2168 flags |= INST_IMMEDIATE;
2170 if (inst.reloc.exp.X_add_symbol)
2172 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
2173 inst.reloc.pc_rel = 0;
2177 unsigned value = validate_immediate (inst.reloc.exp.X_add_number);
2179 if (value == (unsigned) FAIL)
2181 inst.error = _("Invalid constant");
2185 inst.instruction |= value;
2189 inst.instruction |= flags;
2193 /* Long Multiply Parser
2194 UMULL RdLo, RdHi, Rm, Rs
2195 SMULL RdLo, RdHi, Rm, Rs
2196 UMLAL RdLo, RdHi, Rm, Rs
2197 SMLAL RdLo, RdHi, Rm, Rs. */
2200 do_mull (str, flags)
2202 unsigned long flags;
2204 int rdlo, rdhi, rm, rs;
2206 /* Only one format "rdlo, rdhi, rm, rs". */
2207 skip_whitespace (str);
2209 if ((rdlo = reg_required_here (&str, 12)) == FAIL)
2211 inst.error = BAD_ARGS;
2215 if (skip_past_comma (&str) == FAIL
2216 || (rdhi = reg_required_here (&str, 16)) == FAIL)
2218 inst.error = BAD_ARGS;
2222 if (skip_past_comma (&str) == FAIL
2223 || (rm = reg_required_here (&str, 0)) == FAIL)
2225 inst.error = BAD_ARGS;
2229 /* rdhi, rdlo and rm must all be different. */
2230 if (rdlo == rdhi || rdlo == rm || rdhi == rm)
2231 as_tsktsk (_("rdhi, rdlo and rm must all be different"));
2233 if (skip_past_comma (&str) == FAIL
2234 || (rs = reg_required_here (&str, 8)) == FAIL)
2236 inst.error = BAD_ARGS;
2240 if (rdhi == REG_PC || rdhi == REG_PC || rdhi == REG_PC || rdhi == REG_PC)
2242 inst.error = BAD_PC;
2246 inst.instruction |= flags;
2254 unsigned long flags;
2258 /* Only one format "rd, rm, rs". */
2259 skip_whitespace (str);
2261 if ((rd = reg_required_here (&str, 16)) == FAIL)
2263 inst.error = BAD_ARGS;
2269 inst.error = BAD_PC;
2273 if (skip_past_comma (&str) == FAIL
2274 || (rm = reg_required_here (&str, 0)) == FAIL)
2276 inst.error = BAD_ARGS;
2282 inst.error = BAD_PC;
2287 as_tsktsk (_("rd and rm should be different in mul"));
2289 if (skip_past_comma (&str) == FAIL
2290 || (rm = reg_required_here (&str, 8)) == FAIL)
2292 inst.error = BAD_ARGS;
2298 inst.error = BAD_PC;
2302 inst.instruction |= flags;
2310 unsigned long flags;
2314 /* Only one format "rd, rm, rs, rn". */
2315 skip_whitespace (str);
2317 if ((rd = reg_required_here (&str, 16)) == FAIL)
2319 inst.error = BAD_ARGS;
2325 inst.error = BAD_PC;
2329 if (skip_past_comma (&str) == FAIL
2330 || (rm = reg_required_here (&str, 0)) == FAIL)
2332 inst.error = BAD_ARGS;
2338 inst.error = BAD_PC;
2343 as_tsktsk (_("rd and rm should be different in mla"));
2345 if (skip_past_comma (&str) == FAIL
2346 || (rd = reg_required_here (&str, 8)) == FAIL
2347 || skip_past_comma (&str) == FAIL
2348 || (rm = reg_required_here (&str, 12)) == FAIL)
2350 inst.error = BAD_ARGS;
2354 if (rd == REG_PC || rm == REG_PC)
2356 inst.error = BAD_PC;
2360 inst.instruction |= flags;
2365 /* Returns the index into fp_values of a floating point number,
2366 or -1 if not in the table. */
2369 my_get_float_expression (str)
2372 LITTLENUM_TYPE words[MAX_LITTLENUMS];
2378 memset (words, 0, MAX_LITTLENUMS * sizeof (LITTLENUM_TYPE));
2380 /* Look for a raw floating point number. */
2381 if ((save_in = atof_ieee (*str, 'x', words)) != NULL
2382 && is_end_of_line[(unsigned char) *save_in])
2384 for (i = 0; i < NUM_FLOAT_VALS; i++)
2386 for (j = 0; j < MAX_LITTLENUMS; j++)
2388 if (words[j] != fp_values[i][j])
2392 if (j == MAX_LITTLENUMS)
2400 /* Try and parse a more complex expression, this will probably fail
2401 unless the code uses a floating point prefix (eg "0f"). */
2402 save_in = input_line_pointer;
2403 input_line_pointer = *str;
2404 if (expression (&exp) == absolute_section
2405 && exp.X_op == O_big
2406 && exp.X_add_number < 0)
2408 /* FIXME: 5 = X_PRECISION, should be #define'd where we can use it.
2410 if (gen_to_words (words, 5, (long) 15) == 0)
2412 for (i = 0; i < NUM_FLOAT_VALS; i++)
2414 for (j = 0; j < MAX_LITTLENUMS; j++)
2416 if (words[j] != fp_values[i][j])
2420 if (j == MAX_LITTLENUMS)
2422 *str = input_line_pointer;
2423 input_line_pointer = save_in;
2430 *str = input_line_pointer;
2431 input_line_pointer = save_in;
2435 /* Return true if anything in the expression is a bignum. */
2438 walk_no_bignums (sp)
2441 if (symbol_get_value_expression (sp)->X_op == O_big)
2444 if (symbol_get_value_expression (sp)->X_add_symbol)
2446 return (walk_no_bignums (symbol_get_value_expression (sp)->X_add_symbol)
2447 || (symbol_get_value_expression (sp)->X_op_symbol
2448 && walk_no_bignums (symbol_get_value_expression (sp)->X_op_symbol)));
2455 my_get_expression (ep, str)
2462 save_in = input_line_pointer;
2463 input_line_pointer = *str;
2464 seg = expression (ep);
2467 if (seg != absolute_section
2468 && seg != text_section
2469 && seg != data_section
2470 && seg != bss_section
2471 && seg != undefined_section)
2473 inst.error = _("bad_segment");
2474 *str = input_line_pointer;
2475 input_line_pointer = save_in;
2480 /* Get rid of any bignums now, so that we don't generate an error for which
2481 we can't establish a line number later on. Big numbers are never valid
2482 in instructions, which is where this routine is always called. */
2483 if (ep->X_op == O_big
2484 || (ep->X_add_symbol
2485 && (walk_no_bignums (ep->X_add_symbol)
2487 && walk_no_bignums (ep->X_op_symbol)))))
2489 inst.error = _("Invalid constant");
2490 *str = input_line_pointer;
2491 input_line_pointer = save_in;
2495 *str = input_line_pointer;
2496 input_line_pointer = save_in;
2500 /* UNRESTRICT should be one if <shift> <register> is permitted for this
2504 decode_shift (str, unrestrict)
2508 struct asm_shift * shft;
2512 skip_whitespace (* str);
2514 for (p = * str; isalpha (* p); p ++)
2519 inst.error = _("Shift expression expected");
2525 shft = (struct asm_shift *) hash_find (arm_shift_hsh, * str);
2529 if ( ! strncmp (* str, "rrx", 3)
2530 || ! strncmp (* str, "RRX", 3))
2533 inst.instruction |= shft->value;
2537 skip_whitespace (p);
2539 if (unrestrict && reg_required_here (& p, 8) != FAIL)
2541 inst.instruction |= shft->value | SHIFT_BY_REG;
2545 else if (is_immediate_prefix (* p))
2550 if (my_get_expression (& inst.reloc.exp, & p))
2553 /* Validate some simple #expressions. */
2554 if (inst.reloc.exp.X_op == O_constant)
2556 unsigned num = inst.reloc.exp.X_add_number;
2558 /* Reject operations greater than 32, or lsl #32. */
2559 if (num > 32 || (num == 32 && shft->value == 0))
2561 inst.error = _("Invalid immediate shift");
2565 /* Shifts of zero should be converted to lsl
2573 /* Shifts of 32 are encoded as 0, for those shifts that
2578 inst.instruction |= (num << 7) | shft->value;
2583 inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
2584 inst.reloc.pc_rel = 0;
2585 inst.instruction |= shft->value;
2592 inst.error = (unrestrict
2593 ? _("shift requires register or #expression")
2594 : _("shift requires #expression"));
2600 inst.error = _("Shift expression expected");
2604 /* Do those data_ops which can take a negative immediate constant
2605 by altering the instuction. A bit of a hack really.
2609 by inverting the second operand, and
2612 by negating the second operand. */
2615 negate_data_op (instruction, value)
2616 unsigned long * instruction;
2617 unsigned long value;
2620 unsigned long negated, inverted;
2622 negated = validate_immediate (-value);
2623 inverted = validate_immediate (~value);
2625 op = (*instruction >> DATA_OP_SHIFT) & 0xf;
2628 /* First negates. */
2629 case OPCODE_SUB: /* ADD <-> SUB */
2630 new_inst = OPCODE_ADD;
2635 new_inst = OPCODE_SUB;
2639 case OPCODE_CMP: /* CMP <-> CMN */
2640 new_inst = OPCODE_CMN;
2645 new_inst = OPCODE_CMP;
2649 /* Now Inverted ops. */
2650 case OPCODE_MOV: /* MOV <-> MVN */
2651 new_inst = OPCODE_MVN;
2656 new_inst = OPCODE_MOV;
2660 case OPCODE_AND: /* AND <-> BIC */
2661 new_inst = OPCODE_BIC;
2666 new_inst = OPCODE_AND;
2670 case OPCODE_ADC: /* ADC <-> SBC */
2671 new_inst = OPCODE_SBC;
2676 new_inst = OPCODE_ADC;
2680 /* We cannot do anything. */
2685 if (value == (unsigned) FAIL)
2688 *instruction &= OPCODE_MASK;
2689 *instruction |= new_inst << DATA_OP_SHIFT;
2700 skip_whitespace (* str);
2702 if (reg_required_here (str, 0) != FAIL)
2704 if (skip_past_comma (str) == SUCCESS)
2705 /* Shift operation on register. */
2706 return decode_shift (str, NO_SHIFT_RESTRICT);
2712 /* Immediate expression. */
2713 if (is_immediate_prefix (**str))
2718 if (my_get_expression (&inst.reloc.exp, str))
2721 if (inst.reloc.exp.X_add_symbol)
2723 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
2724 inst.reloc.pc_rel = 0;
2728 if (skip_past_comma (str) == SUCCESS)
2730 /* #x, y -- ie explicit rotation by Y. */
2731 if (my_get_expression (&expr, str))
2734 if (expr.X_op != O_constant)
2736 inst.error = _("Constant expression expected");
2740 /* Rotate must be a multiple of 2. */
2741 if (((unsigned) expr.X_add_number) > 30
2742 || (expr.X_add_number & 1) != 0
2743 || ((unsigned) inst.reloc.exp.X_add_number) > 255)
2745 inst.error = _("Invalid constant");
2748 inst.instruction |= INST_IMMEDIATE;
2749 inst.instruction |= inst.reloc.exp.X_add_number;
2750 inst.instruction |= expr.X_add_number << 7;
2754 /* Implicit rotation, select a suitable one. */
2755 value = validate_immediate (inst.reloc.exp.X_add_number);
2759 /* Can't be done. Perhaps the code reads something like
2760 "add Rd, Rn, #-n", where "sub Rd, Rn, #n" would be OK. */
2761 if ((value = negate_data_op (&inst.instruction,
2762 inst.reloc.exp.X_add_number))
2765 inst.error = _("Invalid constant");
2770 inst.instruction |= value;
2773 inst.instruction |= INST_IMMEDIATE;
2778 inst.error = _("Register or shift expression expected");
2787 skip_whitespace (* str);
2789 if (fp_reg_required_here (str, 0) != FAIL)
2793 /* Immediate expression. */
2794 if (*((*str)++) == '#')
2800 skip_whitespace (* str);
2802 /* First try and match exact strings, this is to guarantee
2803 that some formats will work even for cross assembly. */
2805 for (i = 0; fp_const[i]; i++)
2807 if (strncmp (*str, fp_const[i], strlen (fp_const[i])) == 0)
2811 *str += strlen (fp_const[i]);
2812 if (is_end_of_line[(unsigned char) **str])
2814 inst.instruction |= i + 8;
2821 /* Just because we didn't get a match doesn't mean that the
2822 constant isn't valid, just that it is in a format that we
2823 don't automatically recognize. Try parsing it with
2824 the standard expression routines. */
2825 if ((i = my_get_float_expression (str)) >= 0)
2827 inst.instruction |= i + 8;
2831 inst.error = _("Invalid floating point immediate expression");
2835 _("Floating point register or immediate expression expected");
2841 do_arit (str, flags)
2843 unsigned long flags;
2845 skip_whitespace (str);
2847 if (reg_required_here (&str, 12) == FAIL
2848 || skip_past_comma (&str) == FAIL
2849 || reg_required_here (&str, 16) == FAIL
2850 || skip_past_comma (&str) == FAIL
2851 || data_op2 (&str) == FAIL)
2854 inst.error = BAD_ARGS;
2858 inst.instruction |= flags;
2866 unsigned long flags;
2868 /* This is a pseudo-op of the form "adr rd, label" to be converted
2869 into a relative address of the form "add rd, pc, #label-.-8". */
2870 skip_whitespace (str);
2872 if (reg_required_here (&str, 12) == FAIL
2873 || skip_past_comma (&str) == FAIL
2874 || my_get_expression (&inst.reloc.exp, &str))
2877 inst.error = BAD_ARGS;
2881 /* Frag hacking will turn this into a sub instruction if the offset turns
2882 out to be negative. */
2883 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
2884 inst.reloc.exp.X_add_number -= 8; /* PC relative adjust. */
2885 inst.reloc.pc_rel = 1;
2886 inst.instruction |= flags;
2892 do_adrl (str, flags)
2894 unsigned long flags;
2896 /* This is a pseudo-op of the form "adrl rd, label" to be converted
2897 into a relative address of the form:
2898 add rd, pc, #low(label-.-8)"
2899 add rd, rd, #high(label-.-8)" */
2901 skip_whitespace (str);
2903 if (reg_required_here (& str, 12) == FAIL
2904 || skip_past_comma (& str) == FAIL
2905 || my_get_expression (& inst.reloc.exp, & str))
2908 inst.error = BAD_ARGS;
2914 /* Frag hacking will turn this into a sub instruction if the offset turns
2915 out to be negative. */
2916 inst.reloc.type = BFD_RELOC_ARM_ADRL_IMMEDIATE;
2917 inst.reloc.exp.X_add_number -= 8; /* PC relative adjust */
2918 inst.reloc.pc_rel = 1;
2919 inst.instruction |= flags;
2920 inst.size = INSN_SIZE * 2;
2928 unsigned long flags;
2930 skip_whitespace (str);
2932 if (reg_required_here (&str, 16) == FAIL)
2935 inst.error = BAD_ARGS;
2939 if (skip_past_comma (&str) == FAIL
2940 || data_op2 (&str) == FAIL)
2943 inst.error = BAD_ARGS;
2947 inst.instruction |= flags;
2948 if ((flags & 0x0000f000) == 0)
2949 inst.instruction |= CONDS_BIT;
2958 unsigned long flags;
2960 skip_whitespace (str);
2962 if (reg_required_here (&str, 12) == FAIL)
2965 inst.error = BAD_ARGS;
2969 if (skip_past_comma (&str) == FAIL
2970 || data_op2 (&str) == FAIL)
2973 inst.error = BAD_ARGS;
2977 inst.instruction |= flags;
2983 ldst_extend (str, hwse)
2994 if (my_get_expression (& inst.reloc.exp, str))
2997 if (inst.reloc.exp.X_op == O_constant)
2999 int value = inst.reloc.exp.X_add_number;
3001 if ((hwse && (value < -255 || value > 255))
3002 || (value < -4095 || value > 4095))
3004 inst.error = _("address offset too large");
3014 /* Halfword and signextension instructions have the
3015 immediate value split across bits 11..8 and bits 3..0. */
3017 inst.instruction |= (add | HWOFFSET_IMM
3018 | ((value >> 4) << 8) | (value & 0xF));
3020 inst.instruction |= add | value;
3026 inst.instruction |= HWOFFSET_IMM;
3027 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
3030 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
3031 inst.reloc.pc_rel = 0;
3044 if (reg_required_here (str, 0) == FAIL)
3048 inst.instruction |= add;
3051 inst.instruction |= add | OFFSET_REG;
3052 if (skip_past_comma (str) == SUCCESS)
3053 return decode_shift (str, SHIFT_RESTRICT);
3061 do_ldst (str, flags)
3063 unsigned long flags;
3070 /* This is not ideal, but it is the simplest way of dealing with the
3071 ARM7T halfword instructions (since they use a different
3072 encoding, but the same mnemonic): */
3073 halfword = (flags & 0x80000000) != 0;
3076 /* This is actually a load/store of a halfword, or a
3077 signed-extension load. */
3078 if ((cpu_variant & ARM_HALFWORD) == 0)
3081 = _("Processor does not support halfwords or signed bytes");
3085 inst.instruction = ((inst.instruction & COND_MASK)
3086 | (flags & ~COND_MASK));
3091 skip_whitespace (str);
3093 if ((conflict_reg = reg_required_here (& str, 12)) == FAIL)
3096 inst.error = BAD_ARGS;
3100 if (skip_past_comma (& str) == FAIL)
3102 inst.error = _("Address expected");
3112 skip_whitespace (str);
3114 if ((reg = reg_required_here (&str, 16)) == FAIL)
3117 /* Conflicts can occur on stores as well as loads. */
3118 conflict_reg = (conflict_reg == reg);
3120 skip_whitespace (str);
3126 if (skip_past_comma (&str) == SUCCESS)
3128 /* [Rn],... (post inc) */
3129 if (ldst_extend (&str, halfword) == FAIL)
3132 as_warn (_("%s register same as write-back base"),
3133 ((inst.instruction & LOAD_BIT)
3134 ? _("destination") : _("source")));
3140 inst.instruction |= HWOFFSET_IMM;
3142 skip_whitespace (str);
3147 as_warn (_("%s register same as write-back base"),
3148 ((inst.instruction & LOAD_BIT)
3149 ? _("destination") : _("source")));
3151 inst.instruction |= WRITE_BACK;
3155 if (! (flags & TRANS_BIT))
3162 if (skip_past_comma (&str) == FAIL)
3164 inst.error = _("pre-indexed expression expected");
3169 if (ldst_extend (&str, halfword) == FAIL)
3172 skip_whitespace (str);
3176 inst.error = _("missing ]");
3180 skip_whitespace (str);
3185 as_warn (_("%s register same as write-back base"),
3186 ((inst.instruction & LOAD_BIT)
3187 ? _("destination") : _("source")));
3189 inst.instruction |= WRITE_BACK;
3193 else if (*str == '=')
3195 /* Parse an "ldr Rd, =expr" instruction; this is another pseudo op. */
3198 skip_whitespace (str);
3200 if (my_get_expression (&inst.reloc.exp, &str))
3203 if (inst.reloc.exp.X_op != O_constant
3204 && inst.reloc.exp.X_op != O_symbol)
3206 inst.error = _("Constant expression expected");
3210 if (inst.reloc.exp.X_op == O_constant
3211 && (value = validate_immediate (inst.reloc.exp.X_add_number)) != FAIL)
3213 /* This can be done with a mov instruction. */
3214 inst.instruction &= LITERAL_MASK;
3215 inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
3216 inst.instruction |= (flags & COND_MASK) | (value & 0xfff);
3222 /* Insert into literal pool. */
3223 if (add_to_lit_pool () == FAIL)
3226 inst.error = _("literal pool insertion failed");
3230 /* Change the instruction exp to point to the pool. */
3233 inst.instruction |= HWOFFSET_IMM;
3234 inst.reloc.type = BFD_RELOC_ARM_HWLITERAL;
3237 inst.reloc.type = BFD_RELOC_ARM_LITERAL;
3238 inst.reloc.pc_rel = 1;
3239 inst.instruction |= (REG_PC << 16);
3245 if (my_get_expression (&inst.reloc.exp, &str))
3250 inst.instruction |= HWOFFSET_IMM;
3251 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
3254 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
3256 /* PC rel adjust. */
3257 inst.reloc.exp.X_add_number -= 8;
3259 inst.reloc.pc_rel = 1;
3260 inst.instruction |= (REG_PC << 16);
3264 if (pre_inc && (flags & TRANS_BIT))
3265 inst.error = _("Pre-increment instruction with translate");
3267 inst.instruction |= flags | (pre_inc ? PRE_INDEX : 0);
3276 char * str = * strp;
3280 /* We come back here if we get ranges concatenated by '+' or '|'. */
3295 skip_whitespace (str);
3297 if ((reg = reg_required_here (& str, -1)) == FAIL)
3306 inst.error = _("Bad range in register list");
3310 for (i = cur_reg + 1; i < reg; i++)
3312 if (range & (1 << i))
3314 (_("Warning: Duplicated register (r%d) in register list"),
3322 if (range & (1 << reg))
3323 as_tsktsk (_("Warning: Duplicated register (r%d) in register list"),
3325 else if (reg <= cur_reg)
3326 as_tsktsk (_("Warning: Register range not in ascending order"));
3331 while (skip_past_comma (&str) != FAIL
3332 || (in_range = 1, *str++ == '-'));
3334 skip_whitespace (str);
3338 inst.error = _("Missing `}'");
3346 if (my_get_expression (&expr, &str))
3349 if (expr.X_op == O_constant)
3351 if (expr.X_add_number
3352 != (expr.X_add_number & 0x0000ffff))
3354 inst.error = _("invalid register mask");
3358 if ((range & expr.X_add_number) != 0)
3360 int regno = range & expr.X_add_number;
3363 regno = (1 << regno) - 1;
3365 (_("Warning: Duplicated register (r%d) in register list"),
3369 range |= expr.X_add_number;
3373 if (inst.reloc.type != 0)
3375 inst.error = _("expression too complex");
3379 memcpy (&inst.reloc.exp, &expr, sizeof (expressionS));
3380 inst.reloc.type = BFD_RELOC_ARM_MULTI;
3381 inst.reloc.pc_rel = 0;
3385 skip_whitespace (str);
3387 if (*str == '|' || *str == '+')
3393 while (another_range);
3400 do_ldmstm (str, flags)
3402 unsigned long flags;
3407 skip_whitespace (str);
3409 if ((base_reg = reg_required_here (&str, 16)) == FAIL)
3412 if (base_reg == REG_PC)
3414 inst.error = _("r15 not allowed as base register");
3418 skip_whitespace (str);
3422 flags |= WRITE_BACK;
3426 if (skip_past_comma (&str) == FAIL
3427 || (range = reg_list (&str)) == FAIL)
3430 inst.error = BAD_ARGS;
3437 flags |= LDM_TYPE_2_OR_3;
3440 inst.instruction |= flags | range;
3448 unsigned long flags;
3450 skip_whitespace (str);
3452 /* Allow optional leading '#'. */
3453 if (is_immediate_prefix (*str))
3456 if (my_get_expression (& inst.reloc.exp, & str))
3459 inst.reloc.type = BFD_RELOC_ARM_SWI;
3460 inst.reloc.pc_rel = 0;
3461 inst.instruction |= flags;
3469 do_swap (str, flags)
3471 unsigned long flags;
3475 skip_whitespace (str);
3477 if ((reg = reg_required_here (&str, 12)) == FAIL)
3482 inst.error = _("r15 not allowed in swap");
3486 if (skip_past_comma (&str) == FAIL
3487 || (reg = reg_required_here (&str, 0)) == FAIL)
3490 inst.error = BAD_ARGS;
3496 inst.error = _("r15 not allowed in swap");
3500 if (skip_past_comma (&str) == FAIL
3503 inst.error = BAD_ARGS;
3507 skip_whitespace (str);
3509 if ((reg = reg_required_here (&str, 16)) == FAIL)
3514 inst.error = BAD_PC;
3518 skip_whitespace (str);
3522 inst.error = _("missing ]");
3526 inst.instruction |= flags;
3532 do_branch (str, flags)
3534 unsigned long flags ATTRIBUTE_UNUSED;
3536 if (my_get_expression (&inst.reloc.exp, &str))
3543 /* ScottB: February 5, 1998 - Check to see of PLT32 reloc
3544 required for the instruction. */
3546 /* arm_parse_reloc () works on input_line_pointer.
3547 We actually want to parse the operands to the branch instruction
3548 passed in 'str'. Save the input pointer and restore it later. */
3549 save_in = input_line_pointer;
3550 input_line_pointer = str;
3551 if (inst.reloc.exp.X_op == O_symbol
3553 && arm_parse_reloc () == BFD_RELOC_ARM_PLT32)
3555 inst.reloc.type = BFD_RELOC_ARM_PLT32;
3556 inst.reloc.pc_rel = 0;
3557 /* Modify str to point to after parsed operands, otherwise
3558 end_of_line() will complain about the (PLT) left in str. */
3559 str = input_line_pointer;
3563 inst.reloc.type = BFD_RELOC_ARM_PCREL_BRANCH;
3564 inst.reloc.pc_rel = 1;
3566 input_line_pointer = save_in;
3569 inst.reloc.type = BFD_RELOC_ARM_PCREL_BRANCH;
3570 inst.reloc.pc_rel = 1;
3571 #endif /* OBJ_ELF */
3580 unsigned long flags ATTRIBUTE_UNUSED;
3584 skip_whitespace (str);
3586 if ((reg = reg_required_here (&str, 0)) == FAIL)
3588 inst.error = BAD_ARGS;
3592 /* Note - it is not illegal to do a "bx pc". Useless, but not illegal. */
3600 unsigned long flags ATTRIBUTE_UNUSED;
3602 /* Co-processor data operation.
3603 Format: CDP{cond} CP#,<expr>,CRd,CRn,CRm{,<expr>} */
3604 skip_whitespace (str);
3606 if (co_proc_number (&str) == FAIL)
3609 inst.error = BAD_ARGS;
3613 if (skip_past_comma (&str) == FAIL
3614 || cp_opc_expr (&str, 20,4) == FAIL)
3617 inst.error = BAD_ARGS;
3621 if (skip_past_comma (&str) == FAIL
3622 || cp_reg_required_here (&str, 12) == FAIL)
3625 inst.error = BAD_ARGS;
3629 if (skip_past_comma (&str) == FAIL
3630 || cp_reg_required_here (&str, 16) == FAIL)
3633 inst.error = BAD_ARGS;
3637 if (skip_past_comma (&str) == FAIL
3638 || cp_reg_required_here (&str, 0) == FAIL)
3641 inst.error = BAD_ARGS;
3645 if (skip_past_comma (&str) == SUCCESS)
3647 if (cp_opc_expr (&str, 5, 3) == FAIL)
3650 inst.error = BAD_ARGS;
3660 do_lstc (str, flags)
3662 unsigned long flags;
3664 /* Co-processor register load/store.
3665 Format: <LDC|STC{cond}[L] CP#,CRd,<address> */
3667 skip_whitespace (str);
3669 if (co_proc_number (&str) == FAIL)
3672 inst.error = BAD_ARGS;
3676 if (skip_past_comma (&str) == FAIL
3677 || cp_reg_required_here (&str, 12) == FAIL)
3680 inst.error = BAD_ARGS;
3684 if (skip_past_comma (&str) == FAIL
3685 || cp_address_required_here (&str) == FAIL)
3688 inst.error = BAD_ARGS;
3692 inst.instruction |= flags;
3698 do_co_reg (str, flags)
3700 unsigned long flags;
3702 /* Co-processor register transfer.
3703 Format: <MCR|MRC>{cond} CP#,<expr1>,Rd,CRn,CRm{,<expr2>} */
3705 skip_whitespace (str);
3707 if (co_proc_number (&str) == FAIL)
3710 inst.error = BAD_ARGS;
3714 if (skip_past_comma (&str) == FAIL
3715 || cp_opc_expr (&str, 21, 3) == FAIL)
3718 inst.error = BAD_ARGS;
3722 if (skip_past_comma (&str) == FAIL
3723 || reg_required_here (&str, 12) == FAIL)
3726 inst.error = BAD_ARGS;
3730 if (skip_past_comma (&str) == FAIL
3731 || cp_reg_required_here (&str, 16) == FAIL)
3734 inst.error = BAD_ARGS;
3738 if (skip_past_comma (&str) == FAIL
3739 || cp_reg_required_here (&str, 0) == FAIL)
3742 inst.error = BAD_ARGS;
3746 if (skip_past_comma (&str) == SUCCESS)
3748 if (cp_opc_expr (&str, 5, 3) == FAIL)
3751 inst.error = BAD_ARGS;
3757 inst.error = BAD_COND;
3765 do_fp_ctrl (str, flags)
3767 unsigned long flags ATTRIBUTE_UNUSED;
3769 /* FP control registers.
3770 Format: <WFS|RFS|WFC|RFC>{cond} Rn */
3772 skip_whitespace (str);
3774 if (reg_required_here (&str, 12) == FAIL)
3777 inst.error = BAD_ARGS;
3786 do_fp_ldst (str, flags)
3788 unsigned long flags ATTRIBUTE_UNUSED;
3790 skip_whitespace (str);
3792 switch (inst.suffix)
3797 inst.instruction |= CP_T_X;
3800 inst.instruction |= CP_T_Y;
3803 inst.instruction |= CP_T_X | CP_T_Y;
3809 if (fp_reg_required_here (&str, 12) == FAIL)
3812 inst.error = BAD_ARGS;
3816 if (skip_past_comma (&str) == FAIL
3817 || cp_address_required_here (&str) == FAIL)
3820 inst.error = BAD_ARGS;
3828 do_fp_ldmstm (str, flags)
3830 unsigned long flags;
3834 skip_whitespace (str);
3836 if (fp_reg_required_here (&str, 12) == FAIL)
3839 inst.error = BAD_ARGS;
3843 /* Get Number of registers to transfer. */
3844 if (skip_past_comma (&str) == FAIL
3845 || my_get_expression (&inst.reloc.exp, &str))
3848 inst.error = _("constant expression expected");
3852 if (inst.reloc.exp.X_op != O_constant)
3854 inst.error = _("Constant value required for number of registers");
3858 num_regs = inst.reloc.exp.X_add_number;
3860 if (num_regs < 1 || num_regs > 4)
3862 inst.error = _("number of registers must be in the range [1:4]");
3869 inst.instruction |= CP_T_X;
3872 inst.instruction |= CP_T_Y;
3875 inst.instruction |= CP_T_Y | CP_T_X;
3889 /* The instruction specified "ea" or "fd", so we can only accept
3890 [Rn]{!}. The instruction does not really support stacking or
3891 unstacking, so we have to emulate these by setting appropriate
3892 bits and offsets. */
3893 if (skip_past_comma (&str) == FAIL
3897 inst.error = BAD_ARGS;
3902 skip_whitespace (str);
3904 if ((reg = reg_required_here (&str, 16)) == FAIL)
3907 skip_whitespace (str);
3911 inst.error = BAD_ARGS;
3923 _("R15 not allowed as base register with write-back");
3930 if (flags & CP_T_Pre)
3932 /* Pre-decrement. */
3933 offset = 3 * num_regs;
3939 /* Post-increment. */
3943 offset = 3 * num_regs;
3947 /* No write-back, so convert this into a standard pre-increment
3948 instruction -- aesthetically more pleasing. */
3949 flags = CP_T_Pre | CP_T_UD;
3954 inst.instruction |= flags | offset;
3956 else if (skip_past_comma (&str) == FAIL
3957 || cp_address_required_here (&str) == FAIL)
3960 inst.error = BAD_ARGS;
3968 do_fp_dyadic (str, flags)
3970 unsigned long flags;
3972 skip_whitespace (str);
3974 switch (inst.suffix)
3979 inst.instruction |= 0x00000080;
3982 inst.instruction |= 0x00080000;
3988 if (fp_reg_required_here (&str, 12) == FAIL)
3991 inst.error = BAD_ARGS;
3995 if (skip_past_comma (&str) == FAIL
3996 || fp_reg_required_here (&str, 16) == FAIL)
3999 inst.error = BAD_ARGS;
4003 if (skip_past_comma (&str) == FAIL
4004 || fp_op2 (&str) == FAIL)
4007 inst.error = BAD_ARGS;
4011 inst.instruction |= flags;
4017 do_fp_monadic (str, flags)
4019 unsigned long flags;
4021 skip_whitespace (str);
4023 switch (inst.suffix)
4028 inst.instruction |= 0x00000080;
4031 inst.instruction |= 0x00080000;
4037 if (fp_reg_required_here (&str, 12) == FAIL)
4040 inst.error = BAD_ARGS;
4044 if (skip_past_comma (&str) == FAIL
4045 || fp_op2 (&str) == FAIL)
4048 inst.error = BAD_ARGS;
4052 inst.instruction |= flags;
4058 do_fp_cmp (str, flags)
4060 unsigned long flags;
4062 skip_whitespace (str);
4064 if (fp_reg_required_here (&str, 16) == FAIL)
4067 inst.error = BAD_ARGS;
4071 if (skip_past_comma (&str) == FAIL
4072 || fp_op2 (&str) == FAIL)
4075 inst.error = BAD_ARGS;
4079 inst.instruction |= flags;
4085 do_fp_from_reg (str, flags)
4087 unsigned long flags;
4089 skip_whitespace (str);
4091 switch (inst.suffix)
4096 inst.instruction |= 0x00000080;
4099 inst.instruction |= 0x00080000;
4105 if (fp_reg_required_here (&str, 16) == FAIL)
4108 inst.error = BAD_ARGS;
4112 if (skip_past_comma (&str) == FAIL
4113 || reg_required_here (&str, 12) == FAIL)
4116 inst.error = BAD_ARGS;
4120 inst.instruction |= flags;
4126 do_fp_to_reg (str, flags)
4128 unsigned long flags;
4130 skip_whitespace (str);
4132 if (reg_required_here (&str, 12) == FAIL)
4135 if (skip_past_comma (&str) == FAIL
4136 || fp_reg_required_here (&str, 0) == FAIL)
4139 inst.error = BAD_ARGS;
4143 inst.instruction |= flags;
4148 /* Thumb specific routines. */
4150 /* Parse and validate that a register is of the right form, this saves
4151 repeated checking of this information in many similar cases.
4152 Unlike the 32-bit case we do not insert the register into the opcode
4153 here, since the position is often unknown until the full instruction
4157 thumb_reg (strp, hi_lo)
4163 if ((reg = reg_required_here (strp, -1)) == FAIL)
4171 inst.error = _("lo register required");
4179 inst.error = _("hi register required");
4191 /* Parse an add or subtract instruction, SUBTRACT is non-zero if the opcode
4195 thumb_add_sub (str, subtract)
4199 int Rd, Rs, Rn = FAIL;
4201 skip_whitespace (str);
4203 if ((Rd = thumb_reg (&str, THUMB_REG_ANY)) == FAIL
4204 || skip_past_comma (&str) == FAIL)
4207 inst.error = BAD_ARGS;
4211 if (is_immediate_prefix (*str))
4215 if (my_get_expression (&inst.reloc.exp, &str))
4220 if ((Rs = thumb_reg (&str, THUMB_REG_ANY)) == FAIL)
4223 if (skip_past_comma (&str) == FAIL)
4225 /* Two operand format, shuffle the registers
4226 and pretend there are 3. */
4230 else if (is_immediate_prefix (*str))
4233 if (my_get_expression (&inst.reloc.exp, &str))
4236 else if ((Rn = thumb_reg (&str, THUMB_REG_ANY)) == FAIL)
4240 /* We now have Rd and Rs set to registers, and Rn set to a register or FAIL;
4241 for the latter case, EXPR contains the immediate that was found. */
4244 /* All register format. */
4245 if (Rd > 7 || Rs > 7 || Rn > 7)
4249 inst.error = _("dest and source1 must be the same register");
4253 /* Can't do this for SUB. */
4256 inst.error = _("subtract valid only on lo regs");
4260 inst.instruction = (T_OPCODE_ADD_HI
4261 | (Rd > 7 ? THUMB_H1 : 0)
4262 | (Rn > 7 ? THUMB_H2 : 0));
4263 inst.instruction |= (Rd & 7) | ((Rn & 7) << 3);
4267 inst.instruction = subtract ? T_OPCODE_SUB_R3 : T_OPCODE_ADD_R3;
4268 inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
4273 /* Immediate expression, now things start to get nasty. */
4275 /* First deal with HI regs, only very restricted cases allowed:
4276 Adjusting SP, and using PC or SP to get an address. */
4277 if ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP))
4278 || (Rs > 7 && Rs != REG_SP && Rs != REG_PC))
4280 inst.error = _("invalid Hi register with immediate");
4284 if (inst.reloc.exp.X_op != O_constant)
4286 /* Value isn't known yet, all we can do is store all the fragments
4287 we know about in the instruction and let the reloc hacking
4289 inst.instruction = (subtract ? 0x8000 : 0) | (Rd << 4) | Rs;
4290 inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
4294 int offset = inst.reloc.exp.X_add_number;
4304 /* Quick check, in case offset is MIN_INT. */
4307 inst.error = _("immediate value out of range");
4316 if (offset & ~0x1fc)
4318 inst.error = _("invalid immediate value for stack adjust");
4321 inst.instruction = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
4322 inst.instruction |= offset >> 2;
4324 else if (Rs == REG_PC || Rs == REG_SP)
4327 || (offset & ~0x3fc))
4329 inst.error = _("invalid immediate for address calculation");
4332 inst.instruction = (Rs == REG_PC ? T_OPCODE_ADD_PC
4334 inst.instruction |= (Rd << 8) | (offset >> 2);
4340 inst.error = _("immediate value out of range");
4343 inst.instruction = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
4344 inst.instruction |= (Rd << 8) | offset;
4350 inst.error = _("immediate value out of range");
4353 inst.instruction = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
4354 inst.instruction |= Rd | (Rs << 3) | (offset << 6);
4363 thumb_shift (str, shift)
4367 int Rd, Rs, Rn = FAIL;
4369 skip_whitespace (str);
4371 if ((Rd = thumb_reg (&str, THUMB_REG_LO)) == FAIL
4372 || skip_past_comma (&str) == FAIL)
4375 inst.error = BAD_ARGS;
4379 if (is_immediate_prefix (*str))
4381 /* Two operand immediate format, set Rs to Rd. */
4384 if (my_get_expression (&inst.reloc.exp, &str))
4389 if ((Rs = thumb_reg (&str, THUMB_REG_LO)) == FAIL)
4392 if (skip_past_comma (&str) == FAIL)
4394 /* Two operand format, shuffle the registers
4395 and pretend there are 3. */
4399 else if (is_immediate_prefix (*str))
4402 if (my_get_expression (&inst.reloc.exp, &str))
4405 else if ((Rn = thumb_reg (&str, THUMB_REG_LO)) == FAIL)
4409 /* We now have Rd and Rs set to registers, and Rn set to a register or FAIL;
4410 for the latter case, EXPR contains the immediate that was found. */
4416 inst.error = _("source1 and dest must be same register");
4422 case THUMB_ASR: inst.instruction = T_OPCODE_ASR_R; break;
4423 case THUMB_LSL: inst.instruction = T_OPCODE_LSL_R; break;
4424 case THUMB_LSR: inst.instruction = T_OPCODE_LSR_R; break;
4427 inst.instruction |= Rd | (Rn << 3);
4433 case THUMB_ASR: inst.instruction = T_OPCODE_ASR_I; break;
4434 case THUMB_LSL: inst.instruction = T_OPCODE_LSL_I; break;
4435 case THUMB_LSR: inst.instruction = T_OPCODE_LSR_I; break;
4438 if (inst.reloc.exp.X_op != O_constant)
4440 /* Value isn't known yet, create a dummy reloc and let reloc
4441 hacking fix it up. */
4442 inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
4446 unsigned shift_value = inst.reloc.exp.X_add_number;
4448 if (shift_value > 32 || (shift_value == 32 && shift == THUMB_LSL))
4450 inst.error = _("Invalid immediate for shift");
4454 /* Shifts of zero are handled by converting to LSL. */
4455 if (shift_value == 0)
4456 inst.instruction = T_OPCODE_LSL_I;
4458 /* Shifts of 32 are encoded as a shift of zero. */
4459 if (shift_value == 32)
4462 inst.instruction |= shift_value << 6;
4465 inst.instruction |= Rd | (Rs << 3);
4472 thumb_mov_compare (str, move)
4478 skip_whitespace (str);
4480 if ((Rd = thumb_reg (&str, THUMB_REG_ANY)) == FAIL
4481 || skip_past_comma (&str) == FAIL)
4484 inst.error = BAD_ARGS;
4488 if (is_immediate_prefix (*str))
4491 if (my_get_expression (&inst.reloc.exp, &str))
4494 else if ((Rs = thumb_reg (&str, THUMB_REG_ANY)) == FAIL)
4499 if (Rs < 8 && Rd < 8)
4501 if (move == THUMB_MOVE)
4502 /* A move of two lowregs is encoded as ADD Rd, Rs, #0
4503 since a MOV instruction produces unpredictable results. */
4504 inst.instruction = T_OPCODE_ADD_I3;
4506 inst.instruction = T_OPCODE_CMP_LR;
4507 inst.instruction |= Rd | (Rs << 3);
4511 if (move == THUMB_MOVE)
4512 inst.instruction = T_OPCODE_MOV_HR;
4514 inst.instruction = T_OPCODE_CMP_HR;
4517 inst.instruction |= THUMB_H1;
4520 inst.instruction |= THUMB_H2;
4522 inst.instruction |= (Rd & 7) | ((Rs & 7) << 3);
4529 inst.error = _("only lo regs allowed with immediate");
4533 if (move == THUMB_MOVE)
4534 inst.instruction = T_OPCODE_MOV_I8;
4536 inst.instruction = T_OPCODE_CMP_I8;
4538 inst.instruction |= Rd << 8;
4540 if (inst.reloc.exp.X_op != O_constant)
4541 inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
4544 unsigned value = inst.reloc.exp.X_add_number;
4548 inst.error = _("invalid immediate");
4552 inst.instruction |= value;
4560 thumb_load_store (str, load_store, size)
4565 int Rd, Rb, Ro = FAIL;
4567 skip_whitespace (str);
4569 if ((Rd = thumb_reg (&str, THUMB_REG_LO)) == FAIL
4570 || skip_past_comma (&str) == FAIL)
4573 inst.error = BAD_ARGS;
4580 if ((Rb = thumb_reg (&str, THUMB_REG_ANY)) == FAIL)
4583 if (skip_past_comma (&str) != FAIL)
4585 if (is_immediate_prefix (*str))
4588 if (my_get_expression (&inst.reloc.exp, &str))
4591 else if ((Ro = thumb_reg (&str, THUMB_REG_LO)) == FAIL)
4596 inst.reloc.exp.X_op = O_constant;
4597 inst.reloc.exp.X_add_number = 0;
4602 inst.error = _("expected ']'");
4607 else if (*str == '=')
4609 /* Parse an "ldr Rd, =expr" instruction; this is another pseudo op. */
4612 skip_whitespace (str);
4614 if (my_get_expression (& inst.reloc.exp, & str))
4619 if ( inst.reloc.exp.X_op != O_constant
4620 && inst.reloc.exp.X_op != O_symbol)
4622 inst.error = "Constant expression expected";
4626 if (inst.reloc.exp.X_op == O_constant
4627 && ((inst.reloc.exp.X_add_number & ~0xFF) == 0))
4629 /* This can be done with a mov instruction. */
4631 inst.instruction = T_OPCODE_MOV_I8 | (Rd << 8);
4632 inst.instruction |= inst.reloc.exp.X_add_number;
4636 /* Insert into literal pool. */
4637 if (add_to_lit_pool () == FAIL)
4640 inst.error = "literal pool insertion failed";
4644 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
4645 inst.reloc.pc_rel = 1;
4646 inst.instruction = T_OPCODE_LDR_PC | (Rd << 8);
4647 /* Adjust ARM pipeline offset to Thumb. */
4648 inst.reloc.exp.X_add_number += 4;
4654 if (my_get_expression (&inst.reloc.exp, &str))
4657 inst.instruction = T_OPCODE_LDR_PC | (Rd << 8);
4658 inst.reloc.pc_rel = 1;
4659 inst.reloc.exp.X_add_number -= 4; /* Pipeline offset. */
4660 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
4665 if (Rb == REG_PC || Rb == REG_SP)
4667 if (size != THUMB_WORD)
4669 inst.error = _("byte or halfword not valid for base register");
4672 else if (Rb == REG_PC && load_store != THUMB_LOAD)
4674 inst.error = _("R15 based store not allowed");
4677 else if (Ro != FAIL)
4679 inst.error = _("Invalid base register for register offset");
4684 inst.instruction = T_OPCODE_LDR_PC;
4685 else if (load_store == THUMB_LOAD)
4686 inst.instruction = T_OPCODE_LDR_SP;
4688 inst.instruction = T_OPCODE_STR_SP;
4690 inst.instruction |= Rd << 8;
4691 if (inst.reloc.exp.X_op == O_constant)
4693 unsigned offset = inst.reloc.exp.X_add_number;
4695 if (offset & ~0x3fc)
4697 inst.error = _("invalid offset");
4701 inst.instruction |= offset >> 2;
4704 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
4708 inst.error = _("invalid base register in load/store");
4711 else if (Ro == FAIL)
4713 /* Immediate offset. */
4714 if (size == THUMB_WORD)
4715 inst.instruction = (load_store == THUMB_LOAD
4716 ? T_OPCODE_LDR_IW : T_OPCODE_STR_IW);
4717 else if (size == THUMB_HALFWORD)
4718 inst.instruction = (load_store == THUMB_LOAD
4719 ? T_OPCODE_LDR_IH : T_OPCODE_STR_IH);
4721 inst.instruction = (load_store == THUMB_LOAD
4722 ? T_OPCODE_LDR_IB : T_OPCODE_STR_IB);
4724 inst.instruction |= Rd | (Rb << 3);
4726 if (inst.reloc.exp.X_op == O_constant)
4728 unsigned offset = inst.reloc.exp.X_add_number;
4730 if (offset & ~(0x1f << size))
4732 inst.error = _("Invalid offset");
4735 inst.instruction |= (offset >> size) << 6;
4738 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
4742 /* Register offset. */
4743 if (size == THUMB_WORD)
4744 inst.instruction = (load_store == THUMB_LOAD
4745 ? T_OPCODE_LDR_RW : T_OPCODE_STR_RW);
4746 else if (size == THUMB_HALFWORD)
4747 inst.instruction = (load_store == THUMB_LOAD
4748 ? T_OPCODE_LDR_RH : T_OPCODE_STR_RH);
4750 inst.instruction = (load_store == THUMB_LOAD
4751 ? T_OPCODE_LDR_RB : T_OPCODE_STR_RB);
4753 inst.instruction |= Rd | (Rb << 3) | (Ro << 6);
4768 /* Handle the Format 4 instructions that do not have equivalents in other
4769 formats. That is, ADC, AND, EOR, SBC, ROR, TST, NEG, CMN, ORR, MUL,
4778 skip_whitespace (str);
4780 if ((Rd = thumb_reg (&str, THUMB_REG_LO)) == FAIL
4781 || skip_past_comma (&str) == FAIL
4782 || (Rs = thumb_reg (&str, THUMB_REG_LO)) == FAIL)
4784 inst.error = BAD_ARGS;
4788 if (skip_past_comma (&str) != FAIL)
4790 /* Three operand format not allowed for TST, CMN, NEG and MVN.
4791 (It isn't allowed for CMP either, but that isn't handled by this
4793 if (inst.instruction == T_OPCODE_TST
4794 || inst.instruction == T_OPCODE_CMN
4795 || inst.instruction == T_OPCODE_NEG
4796 || inst.instruction == T_OPCODE_MVN)
4798 inst.error = BAD_ARGS;
4802 if ((Rn = thumb_reg (&str, THUMB_REG_LO)) == FAIL)
4807 inst.error = _("dest and source1 one must be the same register");
4813 if (inst.instruction == T_OPCODE_MUL
4815 as_tsktsk (_("Rs and Rd must be different in MUL"));
4817 inst.instruction |= Rd | (Rs << 3);
4825 thumb_add_sub (str, 0);
4832 thumb_shift (str, THUMB_ASR);
4839 if (my_get_expression (&inst.reloc.exp, &str))
4841 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH9;
4842 inst.reloc.pc_rel = 1;
4850 if (my_get_expression (&inst.reloc.exp, &str))
4852 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH12;
4853 inst.reloc.pc_rel = 1;
4857 /* Find the real, Thumb encoded start of a Thumb function. */
4860 find_real_start (symbolP)
4864 const char * name = S_GET_NAME (symbolP);
4865 symbolS * new_target;
4867 /* This definiton must agree with the one in gcc/config/arm/thumb.c. */
4868 #define STUB_NAME ".real_start_of"
4873 /* Names that start with '.' are local labels, not function entry points.
4874 The compiler may generate BL instructions to these labels because it
4875 needs to perform a branch to a far away location. */
4879 real_start = malloc (strlen (name) + strlen (STUB_NAME) + 1);
4880 sprintf (real_start, "%s%s", STUB_NAME, name);
4882 new_target = symbol_find (real_start);
4884 if (new_target == NULL)
4886 as_warn ("Failed to find real start of function: %s\n", name);
4887 new_target = symbolP;
4899 if (my_get_expression (& inst.reloc.exp, & str))
4902 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH23;
4903 inst.reloc.pc_rel = 1;
4906 /* If the destination of the branch is a defined symbol which does not have
4907 the THUMB_FUNC attribute, then we must be calling a function which has
4908 the (interfacearm) attribute. We look for the Thumb entry point to that
4909 function and change the branch to refer to that function instead. */
4910 if ( inst.reloc.exp.X_op == O_symbol
4911 && inst.reloc.exp.X_add_symbol != NULL
4912 && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
4913 && ! THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
4914 inst.reloc.exp.X_add_symbol =
4915 find_real_start (inst.reloc.exp.X_add_symbol);
4924 skip_whitespace (str);
4926 if ((reg = thumb_reg (&str, THUMB_REG_ANY)) == FAIL)
4929 /* This sets THUMB_H2 from the top bit of reg. */
4930 inst.instruction |= reg << 3;
4932 /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC. The reloc
4933 should cause the alignment to be checked once it is known. This is
4934 because BX PC only works if the instruction is word aligned. */
4943 thumb_mov_compare (str, THUMB_COMPARE);
4953 skip_whitespace (str);
4955 if ((Rb = thumb_reg (&str, THUMB_REG_LO)) == FAIL)
4959 as_warn (_("Inserted missing '!': load/store multiple always writes back base register"));
4963 if (skip_past_comma (&str) == FAIL
4964 || (range = reg_list (&str)) == FAIL)
4967 inst.error = BAD_ARGS;
4971 if (inst.reloc.type != BFD_RELOC_NONE)
4973 /* This really doesn't seem worth it. */
4974 inst.reloc.type = BFD_RELOC_NONE;
4975 inst.error = _("Expression too complex");
4981 inst.error = _("only lo-regs valid in load/store multiple");
4985 inst.instruction |= (Rb << 8) | range;
4993 thumb_load_store (str, THUMB_LOAD, THUMB_WORD);
5000 thumb_load_store (str, THUMB_LOAD, THUMB_BYTE);
5007 thumb_load_store (str, THUMB_LOAD, THUMB_HALFWORD);
5016 skip_whitespace (str);
5018 if ((Rd = thumb_reg (&str, THUMB_REG_LO)) == FAIL
5019 || skip_past_comma (&str) == FAIL
5021 || (Rb = thumb_reg (&str, THUMB_REG_LO)) == FAIL
5022 || skip_past_comma (&str) == FAIL
5023 || (Ro = thumb_reg (&str, THUMB_REG_LO)) == FAIL
5027 inst.error = _("Syntax: ldrs[b] Rd, [Rb, Ro]");
5031 inst.instruction |= Rd | (Rb << 3) | (Ro << 6);
5039 thumb_shift (str, THUMB_LSL);
5046 thumb_shift (str, THUMB_LSR);
5053 thumb_mov_compare (str, THUMB_MOVE);
5062 skip_whitespace (str);
5064 if ((range = reg_list (&str)) == FAIL)
5067 inst.error = BAD_ARGS;
5071 if (inst.reloc.type != BFD_RELOC_NONE)
5073 /* This really doesn't seem worth it. */
5074 inst.reloc.type = BFD_RELOC_NONE;
5075 inst.error = _("Expression too complex");
5081 if ((inst.instruction == T_OPCODE_PUSH
5082 && (range & ~0xff) == 1 << REG_LR)
5083 || (inst.instruction == T_OPCODE_POP
5084 && (range & ~0xff) == 1 << REG_PC))
5086 inst.instruction |= THUMB_PP_PC_LR;
5091 inst.error = _("invalid register list to push/pop instruction");
5096 inst.instruction |= range;
5104 thumb_load_store (str, THUMB_STORE, THUMB_WORD);
5111 thumb_load_store (str, THUMB_STORE, THUMB_BYTE);
5118 thumb_load_store (str, THUMB_STORE, THUMB_HALFWORD);
5125 thumb_add_sub (str, 1);
5132 skip_whitespace (str);
5134 if (my_get_expression (&inst.reloc.exp, &str))
5137 inst.reloc.type = BFD_RELOC_ARM_SWI;
5148 /* This is a pseudo-op of the form "adr rd, label" to be converted
5149 into a relative address of the form "add rd, pc, #label-.-4". */
5150 skip_whitespace (str);
5152 /* Store Rd in temporary location inside instruction. */
5153 if ((reg = reg_required_here (&str, 4)) == FAIL
5154 || (reg > 7) /* For Thumb reg must be r0..r7. */
5155 || skip_past_comma (&str) == FAIL
5156 || my_get_expression (&inst.reloc.exp, &str))
5159 inst.error = BAD_ARGS;
5163 inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
5164 inst.reloc.exp.X_add_number -= 4; /* PC relative adjust. */
5165 inst.reloc.pc_rel = 1;
5166 inst.instruction |= REG_PC; /* Rd is already placed into the instruction. */
5175 int len = strlen (reg_table[entry].name) + 2;
5176 char * buf = (char *) xmalloc (len);
5177 char * buf2 = (char *) xmalloc (len);
5180 #ifdef REGISTER_PREFIX
5181 buf[i++] = REGISTER_PREFIX;
5184 strcpy (buf + i, reg_table[entry].name);
5186 for (i = 0; buf[i]; i++)
5187 buf2[i] = islower (buf[i]) ? toupper (buf[i]) : buf[i];
5191 hash_insert (arm_reg_hsh, buf, (PTR) & reg_table[entry]);
5192 hash_insert (arm_reg_hsh, buf2, (PTR) & reg_table[entry]);
5196 insert_reg_alias (str, regnum)
5200 struct reg_entry *new =
5201 (struct reg_entry *) xmalloc (sizeof (struct reg_entry));
5202 char *name = xmalloc (strlen (str) + 1);
5206 new->number = regnum;
5208 hash_insert (arm_reg_hsh, name, (PTR) new);
5212 set_constant_flonums ()
5216 for (i = 0; i < NUM_FLOAT_VALS; i++)
5217 if (atof_ieee ((char *) fp_const[i], 'x', fp_values[i]) == NULL)
5227 if ( (arm_ops_hsh = hash_new ()) == NULL
5228 || (arm_tops_hsh = hash_new ()) == NULL
5229 || (arm_cond_hsh = hash_new ()) == NULL
5230 || (arm_shift_hsh = hash_new ()) == NULL
5231 || (arm_reg_hsh = hash_new ()) == NULL
5232 || (arm_psr_hsh = hash_new ()) == NULL)
5233 as_fatal (_("Virtual memory exhausted"));
5235 for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
5236 hash_insert (arm_ops_hsh, insns[i].template, (PTR) (insns + i));
5237 for (i = 0; i < sizeof (tinsns) / sizeof (struct thumb_opcode); i++)
5238 hash_insert (arm_tops_hsh, tinsns[i].template, (PTR) (tinsns + i));
5239 for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
5240 hash_insert (arm_cond_hsh, conds[i].template, (PTR) (conds + i));
5241 for (i = 0; i < sizeof (shift) / sizeof (struct asm_shift); i++)
5242 hash_insert (arm_shift_hsh, shift[i].template, (PTR) (shift + i));
5243 for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
5244 hash_insert (arm_psr_hsh, psrs[i].template, (PTR) (psrs + i));
5246 for (i = 0; reg_table[i].name; i++)
5249 set_constant_flonums ();
5251 #if defined OBJ_COFF || defined OBJ_ELF
5253 unsigned int flags = 0;
5255 /* Set the flags in the private structure. */
5256 if (uses_apcs_26) flags |= F_APCS26;
5257 if (support_interwork) flags |= F_INTERWORK;
5258 if (uses_apcs_float) flags |= F_APCS_FLOAT;
5259 if (pic_code) flags |= F_PIC;
5260 if ((cpu_variant & FPU_ALL) == FPU_NONE) flags |= F_SOFT_FLOAT;
5262 bfd_set_private_flags (stdoutput, flags);
5266 /* Record the CPU type as well. */
5267 switch (cpu_variant & ARM_CPU_MASK)
5270 mach = bfd_mach_arm_2;
5273 case ARM_3: /* Also ARM_250. */
5274 mach = bfd_mach_arm_2a;
5278 case ARM_6 | ARM_3 | ARM_2: /* Actually no CPU type defined. */
5279 mach = bfd_mach_arm_4;
5282 case ARM_7: /* Also ARM_6. */
5283 mach = bfd_mach_arm_3;
5287 /* Catch special cases. */
5288 if (cpu_variant != (FPU_DEFAULT | CPU_DEFAULT))
5290 if (cpu_variant & (ARM_EXT_V5 & ARM_THUMB))
5291 mach = bfd_mach_arm_5T;
5292 else if (cpu_variant & ARM_EXT_V5)
5293 mach = bfd_mach_arm_5;
5294 else if (cpu_variant & ARM_THUMB)
5295 mach = bfd_mach_arm_4T;
5296 else if ((cpu_variant & ARM_ARCH_V4) == ARM_ARCH_V4)
5297 mach = bfd_mach_arm_4;
5298 else if (cpu_variant & ARM_LONGMUL)
5299 mach = bfd_mach_arm_3M;
5302 bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
5305 /* Turn an integer of n bytes (in val) into a stream of bytes appropriate
5306 for use in the a.out file, and stores them in the array pointed to by buf.
5307 This knows about the endian-ness of the target machine and does
5308 THE RIGHT THING, whatever it is. Possible values for n are 1 (byte)
5309 2 (short) and 4 (long) Floating numbers are put out as a series of
5310 LITTLENUMS (shorts, here at least). */
5313 md_number_to_chars (buf, val, n)
5318 if (target_big_endian)
5319 number_to_chars_bigendian (buf, val, n);
5321 number_to_chars_littleendian (buf, val, n);
5325 md_chars_to_number (buf, n)
5330 unsigned char * where = (unsigned char *) buf;
5332 if (target_big_endian)
5337 result |= (*where++ & 255);
5345 result |= (where[n] & 255);
5352 /* Turn a string in input_line_pointer into a floating point constant
5353 of type TYPE, and store the appropriate bytes in *LITP. The number
5354 of LITTLENUMS emitted is stored in *SIZEP. An error message is
5355 returned, or NULL on OK.
5357 Note that fp constants aren't represent in the normal way on the ARM.
5358 In big endian mode, things are as expected. However, in little endian
5359 mode fp constants are big-endian word-wise, and little-endian byte-wise
5360 within the words. For example, (double) 1.1 in big endian mode is
5361 the byte sequence 3f f1 99 99 99 99 99 9a, and in little endian mode is
5362 the byte sequence 99 99 f1 3f 9a 99 99 99.
5364 ??? The format of 12 byte floats is uncertain according to gcc's arm.h. */
5367 md_atof (type, litP, sizeP)
5373 LITTLENUM_TYPE words[MAX_LITTLENUMS];
5405 return _("Bad call to MD_ATOF()");
5408 t = atof_ieee (input_line_pointer, type, words);
5410 input_line_pointer = t;
5413 if (target_big_endian)
5415 for (i = 0; i < prec; i++)
5417 md_number_to_chars (litP, (valueT) words[i], 2);
5423 /* For a 4 byte float the order of elements in `words' is 1 0. For an
5424 8 byte float the order is 1 0 3 2. */
5425 for (i = 0; i < prec; i += 2)
5427 md_number_to_chars (litP, (valueT) words[i + 1], 2);
5428 md_number_to_chars (litP + 2, (valueT) words[i], 2);
5436 /* The knowledge of the PC's pipeline offset is built into the insns
5440 md_pcrel_from (fixP)
5444 && S_GET_SEGMENT (fixP->fx_addsy) == undefined_section
5445 && fixP->fx_subsy == NULL)
5448 if (fixP->fx_pcrel && (fixP->fx_r_type == BFD_RELOC_ARM_THUMB_ADD))
5450 /* PC relative addressing on the Thumb is slightly odd
5451 as the bottom two bits of the PC are forced to zero
5452 for the calculation. */
5453 return (fixP->fx_where + fixP->fx_frag->fr_address) & ~3;
5457 /* The pattern was adjusted to accomodate CE's off-by-one fixups,
5458 so we un-adjust here to compensate for the accomodation. */
5459 return fixP->fx_where + fixP->fx_frag->fr_address + 8;
5461 return fixP->fx_where + fixP->fx_frag->fr_address;
5465 /* Round up a section size to the appropriate boundary. */
5468 md_section_align (segment, size)
5469 segT segment ATTRIBUTE_UNUSED;
5475 /* Round all sects to multiple of 4. */
5476 return (size + 3) & ~3;
5480 /* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
5481 Otherwise we have no need to default values of symbols. */
5484 md_undefined_symbol (name)
5485 char * name ATTRIBUTE_UNUSED;
5488 if (name[0] == '_' && name[1] == 'G'
5489 && streq (name, GLOBAL_OFFSET_TABLE_NAME))
5493 if (symbol_find (name))
5494 as_bad ("GOT already in the symbol table");
5496 GOT_symbol = symbol_new (name, undefined_section,
5497 (valueT) 0, & zero_address_frag);
5507 /* arm_reg_parse () := if it looks like a register, return its token and
5508 advance the pointer. */
5512 register char ** ccp;
5514 char * start = * ccp;
5517 struct reg_entry * reg;
5519 #ifdef REGISTER_PREFIX
5520 if (*start != REGISTER_PREFIX)
5525 #ifdef OPTIONAL_REGISTER_PREFIX
5526 if (*p == OPTIONAL_REGISTER_PREFIX)
5530 if (!isalpha (*p) || !is_name_beginner (*p))
5534 while (isalpha (c) || isdigit (c) || c == '_')
5538 reg = (struct reg_entry *) hash_find (arm_reg_hsh, start);
5551 md_apply_fix3 (fixP, val, seg)
5556 offsetT value = * val;
5558 unsigned int newimm;
5561 char * buf = fixP->fx_where + fixP->fx_frag->fr_literal;
5562 arm_fix_data * arm_data = (arm_fix_data *) fixP->tc_fix_data;
5564 assert (fixP->fx_r_type < BFD_RELOC_UNUSED);
5566 /* Note whether this will delete the relocation. */
5568 /* Patch from REarnshaw to JDavis (disabled for the moment, since it
5569 doesn't work fully.) */
5570 if ((fixP->fx_addsy == 0 || symbol_constant_p (fixP->fx_addsy))
5573 if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
5577 /* If this symbol is in a different section then we need to leave it for
5578 the linker to deal with. Unfortunately, md_pcrel_from can't tell,
5579 so we have to undo it's effects here. */
5582 if (fixP->fx_addsy != NULL
5583 && S_IS_DEFINED (fixP->fx_addsy)
5584 && S_GET_SEGMENT (fixP->fx_addsy) != seg)
5587 && (fixP->fx_r_type == BFD_RELOC_ARM_PCREL_BRANCH
5588 || fixP->fx_r_type == BFD_RELOC_ARM_PCREL_BLX
5592 value += md_pcrel_from (fixP);
5596 /* Remember value for emit_reloc. */
5597 fixP->fx_addnumber = value;
5599 switch (fixP->fx_r_type)
5601 case BFD_RELOC_ARM_IMMEDIATE:
5602 newimm = validate_immediate (value);
5603 temp = md_chars_to_number (buf, INSN_SIZE);
5605 /* If the instruction will fail, see if we can fix things up by
5606 changing the opcode. */
5607 if (newimm == (unsigned int) FAIL
5608 && (newimm = negate_data_op (&temp, value)) == (unsigned int) FAIL)
5610 as_bad_where (fixP->fx_file, fixP->fx_line,
5611 _("invalid constant (%lx) after fixup"),
5612 (unsigned long) value);
5616 newimm |= (temp & 0xfffff000);
5617 md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
5620 case BFD_RELOC_ARM_ADRL_IMMEDIATE:
5622 unsigned int highpart = 0;
5623 unsigned int newinsn = 0xe1a00000; /* nop. */
5624 newimm = validate_immediate (value);
5625 temp = md_chars_to_number (buf, INSN_SIZE);
5627 /* If the instruction will fail, see if we can fix things up by
5628 changing the opcode. */
5629 if (newimm == (unsigned int) FAIL
5630 && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
5632 /* No ? OK - try using two ADD instructions to generate
5634 newimm = validate_immediate_twopart (value, & highpart);
5636 /* Yes - then make sure that the second instruction is
5638 if (newimm != (unsigned int) FAIL)
5640 /* Still No ? Try using a negated value. */
5641 else if (validate_immediate_twopart (- value, & highpart) != (unsigned int) FAIL)
5642 temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
5643 /* Otherwise - give up. */
5646 as_bad_where (fixP->fx_file, fixP->fx_line,
5647 _("Unable to compute ADRL instructions for PC offset of 0x%x"),
5652 /* Replace the first operand in the 2nd instruction (which
5653 is the PC) with the destination register. We have
5654 already added in the PC in the first instruction and we
5655 do not want to do it again. */
5656 newinsn &= ~0xf0000;
5657 newinsn |= ((newinsn & 0x0f000) << 4);
5660 newimm |= (temp & 0xfffff000);
5661 md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
5663 highpart |= (newinsn & 0xfffff000);
5664 md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
5668 case BFD_RELOC_ARM_OFFSET_IMM:
5674 if (validate_offset_imm (value, 0) == FAIL)
5676 as_bad_where (fixP->fx_file, fixP->fx_line,
5677 _("bad immediate value for offset (%ld)"),
5682 newval = md_chars_to_number (buf, INSN_SIZE);
5683 newval &= 0xff7ff000;
5684 newval |= value | (sign ? INDEX_UP : 0);
5685 md_number_to_chars (buf, newval, INSN_SIZE);
5688 case BFD_RELOC_ARM_OFFSET_IMM8:
5689 case BFD_RELOC_ARM_HWLITERAL:
5695 if (validate_offset_imm (value, 1) == FAIL)
5697 if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
5698 as_bad_where (fixP->fx_file, fixP->fx_line,
5699 _("invalid literal constant: pool needs to be closer"));
5701 as_bad (_("bad immediate value for half-word offset (%ld)"),
5706 newval = md_chars_to_number (buf, INSN_SIZE);
5707 newval &= 0xff7ff0f0;
5708 newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
5709 md_number_to_chars (buf, newval, INSN_SIZE);
5712 case BFD_RELOC_ARM_LITERAL:
5718 if (validate_offset_imm (value, 0) == FAIL)
5720 as_bad_where (fixP->fx_file, fixP->fx_line,
5721 _("invalid literal constant: pool needs to be closer"));
5725 newval = md_chars_to_number (buf, INSN_SIZE);
5726 newval &= 0xff7ff000;
5727 newval |= value | (sign ? INDEX_UP : 0);
5728 md_number_to_chars (buf, newval, INSN_SIZE);
5731 case BFD_RELOC_ARM_SHIFT_IMM:
5732 newval = md_chars_to_number (buf, INSN_SIZE);
5733 if (((unsigned long) value) > 32
5735 && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
5737 as_bad_where (fixP->fx_file, fixP->fx_line,
5738 _("shift expression is too large"));
5743 /* Shifts of zero must be done as lsl. */
5745 else if (value == 32)
5747 newval &= 0xfffff07f;
5748 newval |= (value & 0x1f) << 7;
5749 md_number_to_chars (buf, newval, INSN_SIZE);
5752 case BFD_RELOC_ARM_SWI:
5753 if (arm_data->thumb_mode)
5755 if (((unsigned long) value) > 0xff)
5756 as_bad_where (fixP->fx_file, fixP->fx_line,
5757 _("Invalid swi expression"));
5758 newval = md_chars_to_number (buf, THUMB_SIZE) & 0xff00;
5760 md_number_to_chars (buf, newval, THUMB_SIZE);
5764 if (((unsigned long) value) > 0x00ffffff)
5765 as_bad_where (fixP->fx_file, fixP->fx_line,
5766 _("Invalid swi expression"));
5767 newval = md_chars_to_number (buf, INSN_SIZE) & 0xff000000;
5769 md_number_to_chars (buf, newval, INSN_SIZE);
5773 case BFD_RELOC_ARM_MULTI:
5774 if (((unsigned long) value) > 0xffff)
5775 as_bad_where (fixP->fx_file, fixP->fx_line,
5776 _("Invalid expression in load/store multiple"));
5777 newval = value | md_chars_to_number (buf, INSN_SIZE);
5778 md_number_to_chars (buf, newval, INSN_SIZE);
5781 case BFD_RELOC_ARM_PCREL_BRANCH:
5782 newval = md_chars_to_number (buf, INSN_SIZE);
5784 /* Sign-extend a 24-bit number. */
5785 #define SEXT24(x) ((((x) & 0xffffff) ^ (~ 0x7fffff)) + 0x800000)
5789 value = fixP->fx_offset;
5792 /* We are going to store value (shifted right by two) in the
5793 instruction, in a 24 bit, signed field. Thus we need to check
5794 that none of the top 8 bits of the shifted value (top 7 bits of
5795 the unshifted, unsigned value) are set, or that they are all set. */
5796 if ((value & ~ ((offsetT) 0x1ffffff)) != 0
5797 && ((value & ~ ((offsetT) 0x1ffffff)) != ~ ((offsetT) 0x1ffffff)))
5800 /* Normally we would be stuck at this point, since we cannot store
5801 the absolute address that is the destination of the branch in the
5802 24 bits of the branch instruction. If however, we happen to know
5803 that the destination of the branch is in the same section as the
5804 branch instruciton itself, then we can compute the relocation for
5805 ourselves and not have to bother the linker with it.
5807 FIXME: The tests for OBJ_ELF and ! target_oabi are only here
5808 because I have not worked out how to do this for OBJ_COFF or
5811 && fixP->fx_addsy != NULL
5812 && S_IS_DEFINED (fixP->fx_addsy)
5813 && S_GET_SEGMENT (fixP->fx_addsy) == seg)
5815 /* Get pc relative value to go into the branch. */
5818 /* Permit a backward branch provided that enough bits
5819 are set. Allow a forwards branch, provided that
5820 enough bits are clear. */
5821 if ( (value & ~ ((offsetT) 0x1ffffff)) == ~ ((offsetT) 0x1ffffff)
5822 || (value & ~ ((offsetT) 0x1ffffff)) == 0)
5826 if (! fixP->fx_done)
5828 as_bad_where (fixP->fx_file, fixP->fx_line,
5829 _("gas can't handle same-section branch dest >= 0x04000000"));
5833 value += SEXT24 (newval);
5835 if ( (value & ~ ((offsetT) 0xffffff)) != 0
5836 && ((value & ~ ((offsetT) 0xffffff)) != ~ ((offsetT) 0xffffff)))
5837 as_bad_where (fixP->fx_file, fixP->fx_line,
5838 _("out of range branch"));
5840 newval = (value & 0x00ffffff) | (newval & 0xff000000);
5841 md_number_to_chars (buf, newval, INSN_SIZE);
5844 case BFD_RELOC_ARM_PCREL_BLX:
5847 newval = md_chars_to_number (buf, INSN_SIZE);
5851 value = fixP->fx_offset;
5853 hbit = (value >> 1) & 1;
5854 value = (value >> 2) & 0x00ffffff;
5855 value = (value + (newval & 0x00ffffff)) & 0x00ffffff;
5856 newval = value | (newval & 0xfe000000) | (hbit << 24);
5857 md_number_to_chars (buf, newval, INSN_SIZE);
5861 case BFD_RELOC_THUMB_PCREL_BRANCH9: /* Conditional branch. */
5862 newval = md_chars_to_number (buf, THUMB_SIZE);
5864 addressT diff = (newval & 0xff) << 1;
5869 if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
5870 as_bad_where (fixP->fx_file, fixP->fx_line,
5871 _("Branch out of range"));
5872 newval = (newval & 0xff00) | ((value & 0x1ff) >> 1);
5874 md_number_to_chars (buf, newval, THUMB_SIZE);
5877 case BFD_RELOC_THUMB_PCREL_BRANCH12: /* Unconditional branch. */
5878 newval = md_chars_to_number (buf, THUMB_SIZE);
5880 addressT diff = (newval & 0x7ff) << 1;
5885 if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
5886 as_bad_where (fixP->fx_file, fixP->fx_line,
5887 _("Branch out of range"));
5888 newval = (newval & 0xf800) | ((value & 0xfff) >> 1);
5890 md_number_to_chars (buf, newval, THUMB_SIZE);
5893 case BFD_RELOC_THUMB_PCREL_BLX:
5894 case BFD_RELOC_THUMB_PCREL_BRANCH23:
5899 newval = md_chars_to_number (buf, THUMB_SIZE);
5900 newval2 = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
5901 diff = ((newval & 0x7ff) << 12) | ((newval2 & 0x7ff) << 1);
5902 if (diff & 0x400000)
5905 value = fixP->fx_offset;
5908 if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
5909 as_bad_where (fixP->fx_file, fixP->fx_line,
5910 _("Branch with link out of range"));
5912 newval = (newval & 0xf800) | ((value & 0x7fffff) >> 12);
5913 newval2 = (newval2 & 0xf800) | ((value & 0xfff) >> 1);
5914 md_number_to_chars (buf, newval, THUMB_SIZE);
5915 md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
5920 if (fixP->fx_done || fixP->fx_pcrel)
5921 md_number_to_chars (buf, value, 1);
5923 else if (!target_oabi)
5925 value = fixP->fx_offset;
5926 md_number_to_chars (buf, value, 1);
5932 if (fixP->fx_done || fixP->fx_pcrel)
5933 md_number_to_chars (buf, value, 2);
5935 else if (!target_oabi)
5937 value = fixP->fx_offset;
5938 md_number_to_chars (buf, value, 2);
5944 case BFD_RELOC_ARM_GOT32:
5945 case BFD_RELOC_ARM_GOTOFF:
5946 md_number_to_chars (buf, 0, 4);
5952 if (fixP->fx_done || fixP->fx_pcrel)
5953 md_number_to_chars (buf, value, 4);
5955 else if (!target_oabi)
5957 value = fixP->fx_offset;
5958 md_number_to_chars (buf, value, 4);
5964 case BFD_RELOC_ARM_PLT32:
5965 /* It appears the instruction is fully prepared at this point. */
5969 case BFD_RELOC_ARM_GOTPC:
5970 md_number_to_chars (buf, value, 4);
5973 case BFD_RELOC_ARM_CP_OFF_IMM:
5975 if (value < -1023 || value > 1023 || (value & 3))
5976 as_bad_where (fixP->fx_file, fixP->fx_line,
5977 _("Illegal value for co-processor offset"));
5980 newval = md_chars_to_number (buf, INSN_SIZE) & 0xff7fff00;
5981 newval |= (value >> 2) | (sign ? INDEX_UP : 0);
5982 md_number_to_chars (buf, newval, INSN_SIZE);
5985 case BFD_RELOC_ARM_THUMB_OFFSET:
5986 newval = md_chars_to_number (buf, THUMB_SIZE);
5987 /* Exactly what ranges, and where the offset is inserted depends
5988 on the type of instruction, we can establish this from the
5990 switch (newval >> 12)
5992 case 4: /* PC load. */
5993 /* Thumb PC loads are somewhat odd, bit 1 of the PC is
5994 forced to zero for these loads, so we will need to round
5995 up the offset if the instruction address is not word
5996 aligned (since the final address produced must be, and
5997 we can only describe word-aligned immediate offsets). */
5999 if ((fixP->fx_frag->fr_address + fixP->fx_where + value) & 3)
6000 as_bad_where (fixP->fx_file, fixP->fx_line,
6001 _("Invalid offset, target not word aligned (0x%08X)"),
6002 (unsigned int) (fixP->fx_frag->fr_address
6003 + fixP->fx_where + value));
6005 if ((value + 2) & ~0x3fe)
6006 as_bad_where (fixP->fx_file, fixP->fx_line,
6007 _("Invalid offset, value too big (0x%08X)"), value);
6009 /* Round up, since pc will be rounded down. */
6010 newval |= (value + 2) >> 2;
6013 case 9: /* SP load/store. */
6015 as_bad_where (fixP->fx_file, fixP->fx_line,
6016 _("Invalid offset, value too big (0x%08X)"), value);
6017 newval |= value >> 2;
6020 case 6: /* Word load/store. */
6022 as_bad_where (fixP->fx_file, fixP->fx_line,
6023 _("Invalid offset, value too big (0x%08X)"), value);
6024 newval |= value << 4; /* 6 - 2. */
6027 case 7: /* Byte load/store. */
6029 as_bad_where (fixP->fx_file, fixP->fx_line,
6030 _("Invalid offset, value too big (0x%08X)"), value);
6031 newval |= value << 6;
6034 case 8: /* Halfword load/store. */
6036 as_bad_where (fixP->fx_file, fixP->fx_line,
6037 _("Invalid offset, value too big (0x%08X)"), value);
6038 newval |= value << 5; /* 6 - 1. */
6042 as_bad_where (fixP->fx_file, fixP->fx_line,
6043 "Unable to process relocation for thumb opcode: %lx",
6044 (unsigned long) newval);
6047 md_number_to_chars (buf, newval, THUMB_SIZE);
6050 case BFD_RELOC_ARM_THUMB_ADD:
6051 /* This is a complicated relocation, since we use it for all of
6052 the following immediate relocations:
6056 9bit ADD/SUB SP word-aligned
6057 10bit ADD PC/SP word-aligned
6059 The type of instruction being processed is encoded in the
6066 newval = md_chars_to_number (buf, THUMB_SIZE);
6068 int rd = (newval >> 4) & 0xf;
6069 int rs = newval & 0xf;
6070 int subtract = newval & 0x8000;
6075 as_bad_where (fixP->fx_file, fixP->fx_line,
6076 _("Invalid immediate for stack address calculation"));
6077 newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
6078 newval |= value >> 2;
6080 else if (rs == REG_PC || rs == REG_SP)
6084 as_bad_where (fixP->fx_file, fixP->fx_line,
6085 _("Invalid immediate for address calculation (value = 0x%08lX)"),
6086 (unsigned long) value);
6087 newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
6089 newval |= value >> 2;
6094 as_bad_where (fixP->fx_file, fixP->fx_line,
6095 _("Invalid 8bit immediate"));
6096 newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
6097 newval |= (rd << 8) | value;
6102 as_bad_where (fixP->fx_file, fixP->fx_line,
6103 _("Invalid 3bit immediate"));
6104 newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
6105 newval |= rd | (rs << 3) | (value << 6);
6108 md_number_to_chars (buf, newval, THUMB_SIZE);
6111 case BFD_RELOC_ARM_THUMB_IMM:
6112 newval = md_chars_to_number (buf, THUMB_SIZE);
6113 switch (newval >> 11)
6115 case 0x04: /* 8bit immediate MOV. */
6116 case 0x05: /* 8bit immediate CMP. */
6117 if (value < 0 || value > 255)
6118 as_bad_where (fixP->fx_file, fixP->fx_line,
6119 _("Invalid immediate: %ld is too large"),
6127 md_number_to_chars (buf, newval, THUMB_SIZE);
6130 case BFD_RELOC_ARM_THUMB_SHIFT:
6131 /* 5bit shift value (0..31). */
6132 if (value < 0 || value > 31)
6133 as_bad_where (fixP->fx_file, fixP->fx_line,
6134 _("Illegal Thumb shift value: %ld"), (long) value);
6135 newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf03f;
6136 newval |= value << 6;
6137 md_number_to_chars (buf, newval, THUMB_SIZE);
6140 case BFD_RELOC_VTABLE_INHERIT:
6141 case BFD_RELOC_VTABLE_ENTRY:
6145 case BFD_RELOC_NONE:
6147 as_bad_where (fixP->fx_file, fixP->fx_line,
6148 _("Bad relocation fixup type (%d)"), fixP->fx_r_type);
6154 /* Translate internal representation of relocation info to BFD target
6158 tc_gen_reloc (section, fixp)
6159 asection * section ATTRIBUTE_UNUSED;
6163 bfd_reloc_code_real_type code;
6165 reloc = (arelent *) xmalloc (sizeof (arelent));
6167 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
6168 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
6169 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
6171 /* @@ Why fx_addnumber sometimes and fx_offset other times? */
6173 if (fixp->fx_pcrel == 0)
6174 reloc->addend = fixp->fx_offset;
6176 reloc->addend = fixp->fx_offset = reloc->address;
6178 reloc->addend = fixp->fx_offset;
6181 switch (fixp->fx_r_type)
6186 code = BFD_RELOC_8_PCREL;
6193 code = BFD_RELOC_16_PCREL;
6200 code = BFD_RELOC_32_PCREL;
6204 case BFD_RELOC_ARM_PCREL_BRANCH:
6205 case BFD_RELOC_ARM_PCREL_BLX:
6207 case BFD_RELOC_THUMB_PCREL_BRANCH9:
6208 case BFD_RELOC_THUMB_PCREL_BRANCH12:
6209 case BFD_RELOC_THUMB_PCREL_BRANCH23:
6210 case BFD_RELOC_THUMB_PCREL_BLX:
6211 case BFD_RELOC_VTABLE_ENTRY:
6212 case BFD_RELOC_VTABLE_INHERIT:
6213 code = fixp->fx_r_type;
6216 case BFD_RELOC_ARM_LITERAL:
6217 case BFD_RELOC_ARM_HWLITERAL:
6218 /* If this is called then the a literal has been referenced across
6219 a section boundary - possibly due to an implicit dump. */
6220 as_bad_where (fixp->fx_file, fixp->fx_line,
6221 _("Literal referenced across section boundary (Implicit dump?)"));
6225 case BFD_RELOC_ARM_GOT32:
6226 case BFD_RELOC_ARM_GOTOFF:
6227 case BFD_RELOC_ARM_PLT32:
6228 code = fixp->fx_r_type;
6232 case BFD_RELOC_ARM_IMMEDIATE:
6233 as_bad_where (fixp->fx_file, fixp->fx_line,
6234 _("Internal_relocation (type %d) not fixed up (IMMEDIATE)"),
6238 case BFD_RELOC_ARM_ADRL_IMMEDIATE:
6239 as_bad_where (fixp->fx_file, fixp->fx_line,
6240 _("ADRL used for a symbol not defined in the same file"),
6244 case BFD_RELOC_ARM_OFFSET_IMM:
6245 as_bad_where (fixp->fx_file, fixp->fx_line,
6246 _("Internal_relocation (type %d) not fixed up (OFFSET_IMM)"),
6254 switch (fixp->fx_r_type)
6256 case BFD_RELOC_ARM_IMMEDIATE: type = "IMMEDIATE"; break;
6257 case BFD_RELOC_ARM_OFFSET_IMM: type = "OFFSET_IMM"; break;
6258 case BFD_RELOC_ARM_OFFSET_IMM8: type = "OFFSET_IMM8"; break;
6259 case BFD_RELOC_ARM_SHIFT_IMM: type = "SHIFT_IMM"; break;
6260 case BFD_RELOC_ARM_SWI: type = "SWI"; break;
6261 case BFD_RELOC_ARM_MULTI: type = "MULTI"; break;
6262 case BFD_RELOC_ARM_CP_OFF_IMM: type = "CP_OFF_IMM"; break;
6263 case BFD_RELOC_ARM_THUMB_ADD: type = "THUMB_ADD"; break;
6264 case BFD_RELOC_ARM_THUMB_SHIFT: type = "THUMB_SHIFT"; break;
6265 case BFD_RELOC_ARM_THUMB_IMM: type = "THUMB_IMM"; break;
6266 case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
6267 default: type = _("<unknown>"); break;
6269 as_bad_where (fixp->fx_file, fixp->fx_line,
6270 _("Can not represent %s relocation in this object file format (%d)"),
6271 type, fixp->fx_pcrel);
6277 if (code == BFD_RELOC_32_PCREL
6279 && fixp->fx_addsy == GOT_symbol)
6281 code = BFD_RELOC_ARM_GOTPC;
6282 reloc->addend = fixp->fx_offset = reloc->address;
6286 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
6288 if (reloc->howto == NULL)
6290 as_bad_where (fixp->fx_file, fixp->fx_line,
6291 _("Can not represent %s relocation in this object file format"),
6292 bfd_get_reloc_code_name (code));
6296 /* HACK: Since arm ELF uses Rel instead of Rela, encode the
6297 vtable entry to be used in the relocation's section offset. */
6298 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
6299 reloc->address = fixp->fx_offset;
6305 md_estimate_size_before_relax (fragP, segtype)
6306 fragS * fragP ATTRIBUTE_UNUSED;
6307 segT segtype ATTRIBUTE_UNUSED;
6309 as_fatal (_("md_estimate_size_before_relax\n"));
6314 output_inst PARAMS ((void))
6320 as_bad (inst.error);
6324 to = frag_more (inst.size);
6326 if (thumb_mode && (inst.size > THUMB_SIZE))
6328 assert (inst.size == (2 * THUMB_SIZE));
6329 md_number_to_chars (to, inst.instruction >> 16, THUMB_SIZE);
6330 md_number_to_chars (to + THUMB_SIZE, inst.instruction, THUMB_SIZE);
6332 else if (inst.size > INSN_SIZE)
6334 assert (inst.size == (2 * INSN_SIZE));
6335 md_number_to_chars (to, inst.instruction, INSN_SIZE);
6336 md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE);
6339 md_number_to_chars (to, inst.instruction, inst.size);
6341 if (inst.reloc.type != BFD_RELOC_NONE)
6342 fix_new_arm (frag_now, to - frag_now->fr_literal,
6343 inst.size, & inst.reloc.exp, inst.reloc.pc_rel,
6358 /* Align the instruction.
6359 This may not be the right thing to do but ... */
6363 listing_prev_line (); /* Defined in listing.h. */
6365 /* Align the previous label if needed. */
6366 if (last_label_seen != NULL)
6368 symbol_set_frag (last_label_seen, frag_now);
6369 S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
6370 S_SET_SEGMENT (last_label_seen, now_seg);
6373 memset (&inst, '\0', sizeof (inst));
6374 inst.reloc.type = BFD_RELOC_NONE;
6376 skip_whitespace (str);
6378 /* Scan up to the end of the op-code, which must end in white space or
6380 for (start = p = str; *p != '\0'; p++)
6386 as_bad (_("No operator -- statement `%s'\n"), str);
6392 CONST struct thumb_opcode * opcode;
6396 opcode = (CONST struct thumb_opcode *) hash_find (arm_tops_hsh, str);
6401 /* Check that this instruction is supported for this CPU. */
6402 if (thumb_mode == 1 && (opcode->variants & cpu_variant) == 0)
6404 as_bad (_("selected processor does not support this opcode"));
6408 inst.instruction = opcode->value;
6409 inst.size = opcode->size;
6410 (*opcode->parms) (p);
6417 CONST struct asm_opcode * opcode;
6418 unsigned long cond_code;
6420 inst.size = INSN_SIZE;
6421 /* P now points to the end of the opcode, probably white space, but we
6422 have to break the opcode up in case it contains condionals and flags;
6423 keep trying with progressively smaller basic instructions until one
6424 matches, or we run out of opcode. */
6425 q = (p - str > LONGEST_INST) ? str + LONGEST_INST : p;
6427 for (; q != str; q--)
6432 opcode = (CONST struct asm_opcode *) hash_find (arm_ops_hsh, str);
6435 if (opcode && opcode->template)
6437 unsigned long flag_bits = 0;
6440 /* Check that this instruction is supported for this CPU. */
6441 if ((opcode->variants & cpu_variant) == 0)
6444 inst.instruction = opcode->value;
6445 if (q == p) /* Just a simple opcode. */
6447 if (opcode->comp_suffix)
6449 if (*opcode->comp_suffix != '\0')
6450 as_bad (_("Opcode `%s' must have suffix from list: <%s>"),
6451 str, opcode->comp_suffix);
6453 /* Not a conditional instruction. */
6454 (*opcode->parms) (q, 0);
6458 /* A conditional instruction with default condition. */
6459 inst.instruction |= COND_ALWAYS;
6460 (*opcode->parms) (q, 0);
6466 /* Not just a simple opcode. Check if extra is a
6471 CONST struct asm_cond *cond;
6475 cond = (CONST struct asm_cond *) hash_find (arm_cond_hsh, r);
6479 if (cond->value == 0xf0000000)
6481 _("Warning: Use of the 'nv' conditional is deprecated\n"));
6483 cond_code = cond->value;
6487 cond_code = COND_ALWAYS;
6490 cond_code = COND_ALWAYS;
6492 /* Apply the conditional, or complain it's not allowed. */
6493 if (opcode->comp_suffix && *opcode->comp_suffix == '\0')
6495 /* Instruction isn't conditional. */
6496 if (cond_code != COND_ALWAYS)
6498 as_bad (_("Opcode `%s' is unconditional\n"), str);
6503 /* Instruction is conditional: set the condition into it. */
6504 inst.instruction |= cond_code;
6506 /* If there is a compulsory suffix, it should come here
6507 before any optional flags. */
6508 if (opcode->comp_suffix && *opcode->comp_suffix != '\0')
6510 CONST char *s = opcode->comp_suffix;
6522 as_bad (_("Opcode `%s' must have suffix from <%s>\n"),
6523 str, opcode->comp_suffix);
6530 /* The remainder, if any should now be flags for the instruction;
6531 Scan these checking each one found with the opcode. */
6535 CONST struct asm_flg *flag = opcode->flags;
6544 for (flagno = 0; flag[flagno].template; flagno++)
6546 if (streq (r, flag[flagno].template))
6548 flag_bits |= flag[flagno].set_bits;
6554 if (! flag[flagno].template)
6561 (*opcode->parms) (p, flag_bits);
6571 /* It wasn't an instruction, but it might be a register alias of the form
6574 skip_whitespace (q);
6579 if (*q && !strncmp (q, ".req ", 4))
6582 char * copy_of_str = str;
6586 skip_whitespace (q);
6588 for (r = q; *r != '\0'; r++)
6598 regnum = arm_reg_parse (& q);
6601 reg = arm_reg_parse (& str);
6606 insert_reg_alias (str, regnum);
6608 as_warn (_("register '%s' does not exist\n"), q);
6610 else if (regnum != FAIL)
6613 as_warn (_("ignoring redefinition of register alias '%s'"),
6616 /* Do not warn about redefinitions to the same alias. */
6619 as_warn (_("ignoring redefinition of register alias '%s' to non-existant register '%s'"),
6623 as_warn (_("ignoring incomplete .req pseuso op"));
6630 as_bad (_("bad instruction `%s'"), start);
6634 Invocation line includes a switch not recognized by the base assembler.
6635 See if it's a processor-specific option. These are:
6636 Cpu variants, the arm part is optional:
6637 -m[arm]1 Currently not supported.
6638 -m[arm]2, -m[arm]250 Arm 2 and Arm 250 processor
6639 -m[arm]3 Arm 3 processor
6640 -m[arm]6[xx], Arm 6 processors
6641 -m[arm]7[xx][t][[d]m] Arm 7 processors
6642 -m[arm]8[10] Arm 8 processors
6643 -m[arm]9[20][tdmi] Arm 9 processors
6644 -mstrongarm[110[0]] StrongARM processors
6645 -m[arm]v[2345[t]] Arm architectures
6646 -mall All (except the ARM1)
6648 -mfpa10, -mfpa11 FPA10 and 11 co-processor instructions
6649 -mfpe-old (No float load/store multiples)
6650 -mno-fpu Disable all floating point instructions
6651 Run-time endian selection:
6653 -EL little endian cpu
6654 ARM Procedure Calling Standard:
6655 -mapcs-32 32 bit APCS
6656 -mapcs-26 26 bit APCS
6657 -mapcs-float Pass floats in float regs
6658 -mapcs-reentrant Position independent code
6659 -mthumb-interwork Code supports Arm/Thumb interworking
6660 -moabi Old ELF ABI */
6662 CONST char * md_shortopts = "m:k";
6664 struct option md_longopts[] =
6666 #ifdef ARM_BI_ENDIAN
6667 #define OPTION_EB (OPTION_MD_BASE + 0)
6668 {"EB", no_argument, NULL, OPTION_EB},
6669 #define OPTION_EL (OPTION_MD_BASE + 1)
6670 {"EL", no_argument, NULL, OPTION_EL},
6672 #define OPTION_OABI (OPTION_MD_BASE +2)
6673 {"oabi", no_argument, NULL, OPTION_OABI},
6676 {NULL, no_argument, NULL, 0}
6679 size_t md_longopts_size = sizeof (md_longopts);
6682 md_parse_option (c, arg)
6690 #ifdef ARM_BI_ENDIAN
6692 target_big_endian = 1;
6695 target_big_endian = 0;
6703 if (streq (str, "fpa10"))
6704 cpu_variant = (cpu_variant & ~FPU_ALL) | FPU_FPA10;
6705 else if (streq (str, "fpa11"))
6706 cpu_variant = (cpu_variant & ~FPU_ALL) | FPU_FPA11;
6707 else if (streq (str, "fpe-old"))
6708 cpu_variant = (cpu_variant & ~FPU_ALL) | FPU_CORE;
6714 if (streq (str, "no-fpu"))
6715 cpu_variant &= ~FPU_ALL;
6720 if (streq (str, "oabi"))
6726 /* Limit assembler to generating only Thumb instructions: */
6727 if (streq (str, "thumb"))
6729 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_THUMB;
6730 cpu_variant = (cpu_variant & ~FPU_ALL) | FPU_NONE;
6733 else if (streq (str, "thumb-interwork"))
6735 if ((cpu_variant & ARM_THUMB) == 0)
6736 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_ARCH_V4T;
6737 #if defined OBJ_COFF || defined OBJ_ELF
6738 support_interwork = true;
6746 if (streq (str, "all"))
6748 cpu_variant = ARM_ALL | FPU_ALL;
6751 #if defined OBJ_COFF || defined OBJ_ELF
6752 if (! strncmp (str, "apcs-", 5))
6754 /* GCC passes on all command line options starting "-mapcs-..."
6755 to us, so we must parse them here. */
6759 if (streq (str, "32"))
6761 uses_apcs_26 = false;
6764 else if (streq (str, "26"))
6766 uses_apcs_26 = true;
6769 else if (streq (str, "frame"))
6771 /* Stack frames are being generated - does not affect
6775 else if (streq (str, "stack-check"))
6777 /* Stack checking is being performed - does not affect
6778 linkage, but does require that the functions
6779 __rt_stkovf_split_small and __rt_stkovf_split_big be
6780 present in the final link. */
6784 else if (streq (str, "float"))
6786 /* Floating point arguments are being passed in the floating
6787 point registers. This does affect linking, since this
6788 version of the APCS is incompatible with the version that
6789 passes floating points in the integer registers. */
6791 uses_apcs_float = true;
6794 else if (streq (str, "reentrant"))
6796 /* Reentrant code has been generated. This does affect
6797 linking, since there is no point in linking reentrant/
6798 position independent code with absolute position code. */
6803 as_bad (_("Unrecognised APCS switch -m%s"), arg);
6807 /* Strip off optional "arm". */
6808 if (! strncmp (str, "arm", 3))
6814 if (streq (str, "1"))
6815 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_1;
6821 if (streq (str, "2"))
6822 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_2;
6823 else if (streq (str, "250"))
6824 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_250;
6830 if (streq (str, "3"))
6831 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_3;
6837 switch (strtol (str, NULL, 10))
6844 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_6;
6852 /* Eat the processor name. */
6853 switch (strtol (str, & str, 10))
6866 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_7;
6872 cpu_variant |= (ARM_THUMB | ARM_ARCH_V4);
6876 cpu_variant |= ARM_LONGMUL;
6879 case 'f': /* fe => fp enabled cpu. */
6885 case 'c': /* Left over from 710c processor name. */
6886 case 'd': /* Debug. */
6887 case 'i': /* Embedded ICE. */
6888 /* Included for completeness in ARM processor naming. */
6898 if (streq (str, "8") || streq (str, "810"))
6899 cpu_variant = (cpu_variant & ~ARM_ANY)
6900 | ARM_8 | ARM_ARCH_V4 | ARM_LONGMUL;
6906 if (streq (str, "9"))
6907 cpu_variant = (cpu_variant & ~ARM_ANY)
6908 | ARM_9 | ARM_ARCH_V4 | ARM_LONGMUL | ARM_THUMB;
6909 else if (streq (str, "920"))
6910 cpu_variant = (cpu_variant & ~ARM_ANY)
6911 | ARM_9 | ARM_ARCH_V4 | ARM_LONGMUL;
6912 else if (streq (str, "920t"))
6913 cpu_variant = (cpu_variant & ~ARM_ANY)
6914 | ARM_9 | ARM_ARCH_V4 | ARM_LONGMUL | ARM_THUMB;
6915 else if (streq (str, "9tdmi"))
6916 cpu_variant = (cpu_variant & ~ARM_ANY)
6917 | ARM_9 | ARM_ARCH_V4 | ARM_LONGMUL | ARM_THUMB;
6923 if (streq (str, "strongarm")
6924 || streq (str, "strongarm110")
6925 || streq (str, "strongarm1100"))
6926 cpu_variant = (cpu_variant & ~ARM_ANY)
6927 | ARM_8 | ARM_ARCH_V4 | ARM_LONGMUL;
6933 /* Select variant based on architecture rather than
6941 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_3;
6944 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_2;
6947 as_bad (_("Invalid architecture variant -m%s"), arg);
6953 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_7;
6957 case 'm': cpu_variant |= ARM_LONGMUL; break;
6960 as_bad (_("Invalid architecture variant -m%s"), arg);
6966 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_ARCH_V4;
6970 case 't': cpu_variant |= ARM_THUMB; break;
6973 as_bad (_("Invalid architecture variant -m%s"), arg);
6979 cpu_variant = (cpu_variant & ~ARM_ANY) | ARM_ARCH_V5;
6982 case 't': cpu_variant |= ARM_THUMB; break;
6985 as_bad (_("Invalid architecture variant -m%s"), arg);
6991 as_bad (_("Invalid architecture variant -m%s"), arg);
6998 as_bad (_("Invalid processor variant -m%s"), arg);
7004 #if defined OBJ_ELF || defined OBJ_COFF
7022 ARM Specific Assembler Options:\n\
7023 -m[arm][<processor name>] select processor variant\n\
7024 -m[arm]v[2|2a|3|3m|4|4t|5[t][e]] select architecture variant\n\
7025 -mthumb only allow Thumb instructions\n\
7026 -mthumb-interwork mark the assembled code as supporting interworking\n\
7027 -mall allow any instruction\n\
7028 -mfpa10, -mfpa11 select floating point architecture\n\
7029 -mfpe-old don't allow floating-point multiple instructions\n\
7030 -mno-fpu don't allow any floating-point instructions.\n\
7031 -k generate PIC code.\n"));
7032 #if defined OBJ_COFF || defined OBJ_ELF
7034 -mapcs-32, -mapcs-26 specify which ARM Procedure Calling Standard to use\n\
7035 -mapcs-float floating point args are passed in FP regs\n\
7036 -mapcs-reentrant the code is position independent/reentrant\n"));
7040 -moabi support the old ELF ABI\n"));
7042 #ifdef ARM_BI_ENDIAN
7044 -EB assemble code for a big endian cpu\n\
7045 -EL assemble code for a little endian cpu\n"));
7049 /* We need to be able to fix up arbitrary expressions in some statements.
7050 This is so that we can handle symbols that are an arbitrary distance from
7051 the pc. The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
7052 which returns part of an address in a form which will be valid for
7053 a data instruction. We do this by pushing the expression into a symbol
7054 in the expr_section, and creating a fix for that. */
7057 fix_new_arm (frag, where, size, exp, pc_rel, reloc)
7066 arm_fix_data * arm_data;
7074 new_fix = fix_new_exp (frag, where, size, exp, pc_rel, reloc);
7078 new_fix = fix_new (frag, where, size, make_expr_symbol (exp), 0,
7083 /* Mark whether the fix is to a THUMB instruction, or an ARM
7085 arm_data = (arm_fix_data *) obstack_alloc (& notes, sizeof (arm_fix_data));
7086 new_fix->tc_fix_data = (PTR) arm_data;
7087 arm_data->thumb_mode = thumb_mode;
7092 /* This fix_new is called by cons via TC_CONS_FIX_NEW. */
7095 cons_fix_new_arm (frag, where, size, exp)
7101 bfd_reloc_code_real_type type;
7105 FIXME: @@ Should look at CPU word size. */
7112 type = BFD_RELOC_16;
7116 type = BFD_RELOC_32;
7119 type = BFD_RELOC_64;
7123 fix_new_exp (frag, where, (int) size, exp, pcrel, type);
7126 /* A good place to do this, although this was probably not intended
7127 for this kind of use. We need to dump the literal pool before
7128 references are made to a null symbol pointer. */
7133 if (current_poolP == NULL)
7136 /* Put it at the end of text section. */
7137 subseg_set (text_section, 0);
7139 listing_prev_line ();
7143 arm_start_line_hook ()
7145 last_label_seen = NULL;
7149 arm_frob_label (sym)
7152 last_label_seen = sym;
7154 ARM_SET_THUMB (sym, thumb_mode);
7156 #if defined OBJ_COFF || defined OBJ_ELF
7157 ARM_SET_INTERWORK (sym, support_interwork);
7160 if (label_is_thumb_function_name)
7162 /* When the address of a Thumb function is taken the bottom
7163 bit of that address should be set. This will allow
7164 interworking between Arm and Thumb functions to work
7167 THUMB_SET_FUNC (sym, 1);
7169 label_is_thumb_function_name = false;
7173 /* Adjust the symbol table. This marks Thumb symbols as distinct from
7177 arm_adjust_symtab ()
7182 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
7184 if (ARM_IS_THUMB (sym))
7186 if (THUMB_IS_FUNC (sym))
7188 /* Mark the symbol as a Thumb function. */
7189 if ( S_GET_STORAGE_CLASS (sym) == C_STAT
7190 || S_GET_STORAGE_CLASS (sym) == C_LABEL) /* This can happen! */
7191 S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
7193 else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
7194 S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
7196 as_bad (_("%s: unexpected function type: %d"),
7197 S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
7199 else switch (S_GET_STORAGE_CLASS (sym))
7202 S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
7205 S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
7208 S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
7216 if (ARM_IS_INTERWORK (sym))
7217 coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
7224 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
7226 if (ARM_IS_THUMB (sym))
7228 elf_symbol_type *elf_sym;
7230 elf_sym = elf_symbol (symbol_get_bfdsym (sym));
7231 bind = ELF_ST_BIND (elf_sym);
7233 /* If it's a .thumb_func, declare it as so,
7234 otherwise tag label as .code 16. */
7235 if (THUMB_IS_FUNC (sym))
7236 elf_sym->internal_elf_sym.st_info =
7237 ELF_ST_INFO (bind, STT_ARM_TFUNC);
7239 elf_sym->internal_elf_sym.st_info =
7240 ELF_ST_INFO (bind, STT_ARM_16BIT);
7249 if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
7251 *input_line_pointer = '/';
7252 input_line_pointer += 5;
7253 *input_line_pointer = 0;
7261 arm_canonicalize_symbol_name (name)
7266 if (thumb_mode && (len = strlen (name)) > 5
7267 && streq (name + len - 5, "/data"))
7268 *(name + len - 5) = 0;
7274 arm_validate_fix (fixP)
7277 /* If the destination of the branch is a defined symbol which does not have
7278 the THUMB_FUNC attribute, then we must be calling a function which has
7279 the (interfacearm) attribute. We look for the Thumb entry point to that
7280 function and change the branch to refer to that function instead. */
7281 if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
7282 && fixP->fx_addsy != NULL
7283 && S_IS_DEFINED (fixP->fx_addsy)
7284 && ! THUMB_IS_FUNC (fixP->fx_addsy))
7286 fixP->fx_addsy = find_real_start (fixP->fx_addsy);
7294 /* Relocations against Thumb function names must be left unadjusted,
7295 so that the linker can use this information to correctly set the
7296 bottom bit of their addresses. The MIPS version of this function
7297 also prevents relocations that are mips-16 specific, but I do not
7298 know why it does this.
7301 There is one other problem that ought to be addressed here, but
7302 which currently is not: Taking the address of a label (rather
7303 than a function) and then later jumping to that address. Such
7304 addresses also ought to have their bottom bit set (assuming that
7305 they reside in Thumb code), but at the moment they will not. */
7308 arm_fix_adjustable (fixP)
7311 if (fixP->fx_addsy == NULL)
7314 /* Prevent all adjustments to global symbols. */
7315 if (S_IS_EXTERN (fixP->fx_addsy))
7318 if (S_IS_WEAK (fixP->fx_addsy))
7321 if (THUMB_IS_FUNC (fixP->fx_addsy)
7322 && fixP->fx_subsy == NULL)
7325 /* We need the symbol name for the VTABLE entries. */
7326 if ( fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
7327 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
7334 elf32_arm_target_format ()
7336 if (target_big_endian)
7339 return "elf32-bigarm-oabi";
7341 return "elf32-bigarm";
7346 return "elf32-littlearm-oabi";
7348 return "elf32-littlearm";
7353 armelf_frob_symbol (symp, puntp)
7357 elf_frob_symbol (symp, puntp);
7361 arm_force_relocation (fixp)
7364 if ( fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
7365 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY
7366 || fixp->fx_r_type == BFD_RELOC_ARM_PCREL_BRANCH
7367 || fixp->fx_r_type == BFD_RELOC_ARM_PCREL_BLX
7368 || fixp->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX
7369 || fixp->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23)
7375 static bfd_reloc_code_real_type
7385 bfd_reloc_code_real_type reloc;
7389 #define MAP(str,reloc) { str, sizeof (str)-1, reloc }
7390 MAP ("(got)", BFD_RELOC_ARM_GOT32),
7391 MAP ("(gotoff)", BFD_RELOC_ARM_GOTOFF),
7392 /* ScottB: Jan 30, 1998 - Added support for parsing "var(PLT)"
7393 branch instructions generated by GCC for PLT relocs. */
7394 MAP ("(plt)", BFD_RELOC_ARM_PLT32),
7395 { NULL, 0, BFD_RELOC_UNUSED }
7399 for (i = 0, ip = input_line_pointer;
7400 i < sizeof (id) && (isalnum (*ip) || ispunct (*ip));
7402 id[i] = tolower (*ip);
7404 for (i = 0; reloc_map[i].str; i++)
7405 if (strncmp (id, reloc_map[i].str, reloc_map[i].len) == 0)
7408 input_line_pointer += reloc_map[i].len;
7410 return reloc_map[i].reloc;
7414 s_arm_elf_cons (nbytes)
7419 #ifdef md_flush_pending_output
7420 md_flush_pending_output ();
7423 if (is_it_end_of_statement ())
7425 demand_empty_rest_of_line ();
7429 #ifdef md_cons_align
7430 md_cons_align (nbytes);
7435 bfd_reloc_code_real_type reloc;
7439 if (exp.X_op == O_symbol
7440 && *input_line_pointer == '('
7441 && (reloc = arm_parse_reloc ()) != BFD_RELOC_UNUSED)
7443 reloc_howto_type *howto = bfd_reloc_type_lookup (stdoutput, reloc);
7444 int size = bfd_get_reloc_size (howto);
7447 as_bad ("%s relocations do not fit in %d bytes",
7448 howto->name, nbytes);
7451 register char *p = frag_more ((int) nbytes);
7452 int offset = nbytes - size;
7454 fix_new_exp (frag_now, p - frag_now->fr_literal + offset, size,
7459 emit_expr (&exp, (unsigned int) nbytes);
7461 while (*input_line_pointer++ == ',');
7463 /* Put terminator back into stream. */
7464 input_line_pointer --;
7465 demand_empty_rest_of_line ();
7468 #endif /* OBJ_ELF */